diff --git a/packages/devextreme-angular/src/ui/autocomplete/nested/drop-down-options.ts b/packages/devextreme-angular/src/ui/autocomplete/nested/drop-down-options.ts index 28a77df9d620..e9e83d1e1dcf 100644 --- a/packages/devextreme-angular/src/ui/autocomplete/nested/drop-down-options.ts +++ b/packages/devextreme-angular/src/ui/autocomplete/nested/drop-down-options.ts @@ -380,6 +380,14 @@ export class DxoAutocompleteDropDownOptionsComponent extends NestedOption implem this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-angular/src/ui/color-box/nested/drop-down-options.ts b/packages/devextreme-angular/src/ui/color-box/nested/drop-down-options.ts index 905154b4a972..1885727cc9b0 100644 --- a/packages/devextreme-angular/src/ui/color-box/nested/drop-down-options.ts +++ b/packages/devextreme-angular/src/ui/color-box/nested/drop-down-options.ts @@ -380,6 +380,14 @@ export class DxoColorBoxDropDownOptionsComponent extends NestedOption implements this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-angular/src/ui/data-grid/nested/filter-builder-popup.ts b/packages/devextreme-angular/src/ui/data-grid/nested/filter-builder-popup.ts index 302a86d9cfd6..78d66d56c404 100644 --- a/packages/devextreme-angular/src/ui/data-grid/nested/filter-builder-popup.ts +++ b/packages/devextreme-angular/src/ui/data-grid/nested/filter-builder-popup.ts @@ -380,6 +380,14 @@ export class DxoDataGridFilterBuilderPopupComponent extends NestedOption impleme this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-angular/src/ui/data-grid/nested/popup.ts b/packages/devextreme-angular/src/ui/data-grid/nested/popup.ts index 70275245e815..7901866b23f2 100644 --- a/packages/devextreme-angular/src/ui/data-grid/nested/popup.ts +++ b/packages/devextreme-angular/src/ui/data-grid/nested/popup.ts @@ -380,6 +380,14 @@ export class DxoDataGridPopupComponent extends NestedOption implements OnDestroy this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-angular/src/ui/date-box/nested/drop-down-options.ts b/packages/devextreme-angular/src/ui/date-box/nested/drop-down-options.ts index 947c8dd40195..d8c4e05243ea 100644 --- a/packages/devextreme-angular/src/ui/date-box/nested/drop-down-options.ts +++ b/packages/devextreme-angular/src/ui/date-box/nested/drop-down-options.ts @@ -380,6 +380,14 @@ export class DxoDateBoxDropDownOptionsComponent extends NestedOption implements this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-angular/src/ui/date-range-box/nested/drop-down-options.ts b/packages/devextreme-angular/src/ui/date-range-box/nested/drop-down-options.ts index 3816595b5463..4ff8a44ba5ef 100644 --- a/packages/devextreme-angular/src/ui/date-range-box/nested/drop-down-options.ts +++ b/packages/devextreme-angular/src/ui/date-range-box/nested/drop-down-options.ts @@ -380,6 +380,14 @@ export class DxoDateRangeBoxDropDownOptionsComponent extends NestedOption implem this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-angular/src/ui/drop-down-box/nested/drop-down-options.ts b/packages/devextreme-angular/src/ui/drop-down-box/nested/drop-down-options.ts index ae02021ae604..5aadb85fd119 100644 --- a/packages/devextreme-angular/src/ui/drop-down-box/nested/drop-down-options.ts +++ b/packages/devextreme-angular/src/ui/drop-down-box/nested/drop-down-options.ts @@ -380,6 +380,14 @@ export class DxoDropDownBoxDropDownOptionsComponent extends NestedOption impleme this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-angular/src/ui/drop-down-button/nested/drop-down-options.ts b/packages/devextreme-angular/src/ui/drop-down-button/nested/drop-down-options.ts index 3670a9e5f83c..99956b235182 100644 --- a/packages/devextreme-angular/src/ui/drop-down-button/nested/drop-down-options.ts +++ b/packages/devextreme-angular/src/ui/drop-down-button/nested/drop-down-options.ts @@ -380,6 +380,14 @@ export class DxoDropDownButtonDropDownOptionsComponent extends NestedOption impl this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-angular/src/ui/lookup/nested/drop-down-options.ts b/packages/devextreme-angular/src/ui/lookup/nested/drop-down-options.ts index 442e222d44b6..2ef25123442e 100644 --- a/packages/devextreme-angular/src/ui/lookup/nested/drop-down-options.ts +++ b/packages/devextreme-angular/src/ui/lookup/nested/drop-down-options.ts @@ -305,6 +305,14 @@ export class DxoLookupDropDownOptionsComponent extends NestedOption implements O this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get target(): any | string | undefined { return this._getOption('target'); diff --git a/packages/devextreme-angular/src/ui/nested/base/popup-options.ts b/packages/devextreme-angular/src/ui/nested/base/popup-options.ts index bc31c24c8ad2..b779e987954c 100644 --- a/packages/devextreme-angular/src/ui/nested/base/popup-options.ts +++ b/packages/devextreme-angular/src/ui/nested/base/popup-options.ts @@ -302,6 +302,13 @@ export abstract class DxoPopupOptions extends NestedOption { this._setOption('showTitle', value); } + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + get tabIndex(): number { return this._getOption('tabIndex'); } diff --git a/packages/devextreme-angular/src/ui/nested/drop-down-options.ts b/packages/devextreme-angular/src/ui/nested/drop-down-options.ts index f7e64f96af5b..703f02fdbe06 100644 --- a/packages/devextreme-angular/src/ui/nested/drop-down-options.ts +++ b/packages/devextreme-angular/src/ui/nested/drop-down-options.ts @@ -81,6 +81,7 @@ import { 'shadingColor', 'showCloseButton', 'showTitle', + 'tabFocusLoopEnabled', 'tabIndex', 'title', 'titleTemplate', diff --git a/packages/devextreme-angular/src/ui/nested/filter-builder-popup.ts b/packages/devextreme-angular/src/ui/nested/filter-builder-popup.ts index 90edc01fdbfe..0313fcf42055 100644 --- a/packages/devextreme-angular/src/ui/nested/filter-builder-popup.ts +++ b/packages/devextreme-angular/src/ui/nested/filter-builder-popup.ts @@ -81,6 +81,7 @@ import { 'shadingColor', 'showCloseButton', 'showTitle', + 'tabFocusLoopEnabled', 'tabIndex', 'title', 'titleTemplate', diff --git a/packages/devextreme-angular/src/ui/nested/popup.ts b/packages/devextreme-angular/src/ui/nested/popup.ts index 6b75a8d5f380..efaf160ceba6 100644 --- a/packages/devextreme-angular/src/ui/nested/popup.ts +++ b/packages/devextreme-angular/src/ui/nested/popup.ts @@ -81,6 +81,7 @@ import { 'shadingColor', 'showCloseButton', 'showTitle', + 'tabFocusLoopEnabled', 'tabIndex', 'title', 'titleTemplate', diff --git a/packages/devextreme-angular/src/ui/popover/index.ts b/packages/devextreme-angular/src/ui/popover/index.ts index 54e628b53e4c..8b17fc05f9a6 100644 --- a/packages/devextreme-angular/src/ui/popover/index.ts +++ b/packages/devextreme-angular/src/ui/popover/index.ts @@ -400,6 +400,19 @@ export class DxPopoverComponent extends DxComponent implements OnDestroy, OnChan } + /** + * [descr:dxPopupOptions.tabFocusLoopEnabled] + + */ + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + + /** * [descr:dxPopoverOptions.target] @@ -723,6 +736,13 @@ export class DxPopoverComponent extends DxComponent implements OnDestroy, OnChan */ @Output() showTitleChange: EventEmitter; + /** + + * This member supports the internal infrastructure and is not intended to be used directly from your code. + + */ + @Output() tabFocusLoopEnabledChange: EventEmitter; + /** * This member supports the internal infrastructure and is not intended to be used directly from your code. @@ -817,6 +837,7 @@ export class DxPopoverComponent extends DxComponent implements OnDestroy, OnChan { emit: 'showCloseButtonChange' }, { emit: 'showEventChange' }, { emit: 'showTitleChange' }, + { emit: 'tabFocusLoopEnabledChange' }, { emit: 'targetChange' }, { emit: 'titleChange' }, { emit: 'titleTemplateChange' }, diff --git a/packages/devextreme-angular/src/ui/popup/component.ts b/packages/devextreme-angular/src/ui/popup/component.ts index 931a174c30c9..9e4716d61edd 100644 --- a/packages/devextreme-angular/src/ui/popup/component.ts +++ b/packages/devextreme-angular/src/ui/popup/component.ts @@ -474,6 +474,19 @@ export class DxPopupComponent extends DxComponent implements OnDestroy, OnChange } + /** + * [descr:dxPopupOptions.tabFocusLoopEnabled] + + */ + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + + /** * [descr:WidgetOptions.tabIndex] @@ -863,6 +876,13 @@ export class DxPopupComponent extends DxComponent implements OnDestroy, OnChange */ @Output() showTitleChange: EventEmitter; + /** + + * This member supports the internal infrastructure and is not intended to be used directly from your code. + + */ + @Output() tabFocusLoopEnabledChange: EventEmitter; + /** * This member supports the internal infrastructure and is not intended to be used directly from your code. @@ -966,6 +986,7 @@ export class DxPopupComponent extends DxComponent implements OnDestroy, OnChange { emit: 'shadingColorChange' }, { emit: 'showCloseButtonChange' }, { emit: 'showTitleChange' }, + { emit: 'tabFocusLoopEnabledChange' }, { emit: 'tabIndexChange' }, { emit: 'titleChange' }, { emit: 'titleTemplateChange' }, diff --git a/packages/devextreme-angular/src/ui/select-box/nested/drop-down-options.ts b/packages/devextreme-angular/src/ui/select-box/nested/drop-down-options.ts index f5cdeef93cb5..5553aded1ed2 100644 --- a/packages/devextreme-angular/src/ui/select-box/nested/drop-down-options.ts +++ b/packages/devextreme-angular/src/ui/select-box/nested/drop-down-options.ts @@ -380,6 +380,14 @@ export class DxoSelectBoxDropDownOptionsComponent extends NestedOption implement this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-angular/src/ui/tag-box/nested/drop-down-options.ts b/packages/devextreme-angular/src/ui/tag-box/nested/drop-down-options.ts index e5bf5e7d3194..ec598e260145 100644 --- a/packages/devextreme-angular/src/ui/tag-box/nested/drop-down-options.ts +++ b/packages/devextreme-angular/src/ui/tag-box/nested/drop-down-options.ts @@ -380,6 +380,14 @@ export class DxoTagBoxDropDownOptionsComponent extends NestedOption implements O this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-angular/src/ui/tooltip/index.ts b/packages/devextreme-angular/src/ui/tooltip/index.ts index 083e3d6d9a08..02d76793b9b8 100644 --- a/packages/devextreme-angular/src/ui/tooltip/index.ts +++ b/packages/devextreme-angular/src/ui/tooltip/index.ts @@ -343,6 +343,19 @@ export class DxTooltipComponent extends DxComponent implements OnDestroy { } + /** + * [descr:dxPopupOptions.tabFocusLoopEnabled] + + */ + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + + /** * [descr:dxPopoverOptions.target] @@ -598,6 +611,13 @@ export class DxTooltipComponent extends DxComponent implements OnDestroy { */ @Output() showEventChange: EventEmitter; + /** + + * This member supports the internal infrastructure and is not intended to be used directly from your code. + + */ + @Output() tabFocusLoopEnabledChange: EventEmitter; + /** * This member supports the internal infrastructure and is not intended to be used directly from your code. @@ -666,6 +686,7 @@ export class DxTooltipComponent extends DxComponent implements OnDestroy { { emit: 'shadingChange' }, { emit: 'shadingColorChange' }, { emit: 'showEventChange' }, + { emit: 'tabFocusLoopEnabledChange' }, { emit: 'targetChange' }, { emit: 'visibleChange' }, { emit: 'widthChange' }, diff --git a/packages/devextreme-angular/src/ui/tree-list/nested/filter-builder-popup.ts b/packages/devextreme-angular/src/ui/tree-list/nested/filter-builder-popup.ts index f2b46708f424..86cb8981b104 100644 --- a/packages/devextreme-angular/src/ui/tree-list/nested/filter-builder-popup.ts +++ b/packages/devextreme-angular/src/ui/tree-list/nested/filter-builder-popup.ts @@ -380,6 +380,14 @@ export class DxoTreeListFilterBuilderPopupComponent extends NestedOption impleme this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-angular/src/ui/tree-list/nested/popup.ts b/packages/devextreme-angular/src/ui/tree-list/nested/popup.ts index 0e530dc2896d..e00e8865f955 100644 --- a/packages/devextreme-angular/src/ui/tree-list/nested/popup.ts +++ b/packages/devextreme-angular/src/ui/tree-list/nested/popup.ts @@ -380,6 +380,14 @@ export class DxoTreeListPopupComponent extends NestedOption implements OnDestroy this._setOption('showTitle', value); } + @Input() + get tabFocusLoopEnabled(): boolean { + return this._getOption('tabFocusLoopEnabled'); + } + set tabFocusLoopEnabled(value: boolean) { + this._setOption('tabFocusLoopEnabled', value); + } + @Input() get tabIndex(): number { return this._getOption('tabIndex'); diff --git a/packages/devextreme-react/src/autocomplete.ts b/packages/devextreme-react/src/autocomplete.ts index 47e2f7e49c26..429e56578252 100644 --- a/packages/devextreme-react/src/autocomplete.ts +++ b/packages/devextreme-react/src/autocomplete.ts @@ -277,6 +277,7 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; diff --git a/packages/devextreme-react/src/color-box.ts b/packages/devextreme-react/src/color-box.ts index 1063c5c9b59b..b696bc08227b 100644 --- a/packages/devextreme-react/src/color-box.ts +++ b/packages/devextreme-react/src/color-box.ts @@ -268,6 +268,7 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; diff --git a/packages/devextreme-react/src/data-grid.ts b/packages/devextreme-react/src/data-grid.ts index f1773138c4c5..e5efdc3db829 100644 --- a/packages/devextreme-react/src/data-grid.ts +++ b/packages/devextreme-react/src/data-grid.ts @@ -1671,6 +1671,7 @@ type IFilterBuilderPopupProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; @@ -2863,6 +2864,7 @@ type IPopupProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; diff --git a/packages/devextreme-react/src/date-box.ts b/packages/devextreme-react/src/date-box.ts index 3ba0d33fd256..2ad7ce6de57c 100644 --- a/packages/devextreme-react/src/date-box.ts +++ b/packages/devextreme-react/src/date-box.ts @@ -361,6 +361,7 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; diff --git a/packages/devextreme-react/src/date-range-box.ts b/packages/devextreme-react/src/date-range-box.ts index aed0ca125d1d..734ed4f60eae 100644 --- a/packages/devextreme-react/src/date-range-box.ts +++ b/packages/devextreme-react/src/date-range-box.ts @@ -366,6 +366,7 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; diff --git a/packages/devextreme-react/src/drop-down-box.ts b/packages/devextreme-react/src/drop-down-box.ts index ce01022a167d..05222546cc2f 100644 --- a/packages/devextreme-react/src/drop-down-box.ts +++ b/packages/devextreme-react/src/drop-down-box.ts @@ -272,6 +272,7 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; diff --git a/packages/devextreme-react/src/drop-down-button.ts b/packages/devextreme-react/src/drop-down-button.ts index 2c06e7766b52..528e0d883b23 100644 --- a/packages/devextreme-react/src/drop-down-button.ts +++ b/packages/devextreme-react/src/drop-down-button.ts @@ -227,6 +227,7 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; diff --git a/packages/devextreme-react/src/lookup.ts b/packages/devextreme-react/src/lookup.ts index 25bb3d4c4066..e8e4ba676446 100644 --- a/packages/devextreme-react/src/lookup.ts +++ b/packages/devextreme-react/src/lookup.ts @@ -236,6 +236,7 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ name?: string | undefined; }; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; target?: any | string | undefined; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; diff --git a/packages/devextreme-react/src/select-box.ts b/packages/devextreme-react/src/select-box.ts index bff5f49f379e..9ba89de55cee 100644 --- a/packages/devextreme-react/src/select-box.ts +++ b/packages/devextreme-react/src/select-box.ts @@ -286,6 +286,7 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; diff --git a/packages/devextreme-react/src/tag-box.ts b/packages/devextreme-react/src/tag-box.ts index b58a368edac7..fd23233126c4 100644 --- a/packages/devextreme-react/src/tag-box.ts +++ b/packages/devextreme-react/src/tag-box.ts @@ -292,6 +292,7 @@ type IDropDownOptionsProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; diff --git a/packages/devextreme-react/src/tree-list.ts b/packages/devextreme-react/src/tree-list.ts index 6460444aa3e5..a618090fdfff 100644 --- a/packages/devextreme-react/src/tree-list.ts +++ b/packages/devextreme-react/src/tree-list.ts @@ -1440,6 +1440,7 @@ type IFilterBuilderPopupProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; @@ -2495,6 +2496,7 @@ type IPopupProps = React.PropsWithChildren<{ shadingColor?: string; showCloseButton?: boolean; showTitle?: boolean; + tabFocusLoopEnabled?: boolean; tabIndex?: number; title?: string; titleTemplate?: ((titleElement: any) => string | any) | template; diff --git a/packages/devextreme-vue/src/autocomplete.ts b/packages/devextreme-vue/src/autocomplete.ts index dade5b9a8a43..86376919ca72 100644 --- a/packages/devextreme-vue/src/autocomplete.ts +++ b/packages/devextreme-vue/src/autocomplete.ts @@ -499,6 +499,7 @@ const DxDropDownOptionsConfig = { "update:shadingColor": null, "update:showCloseButton": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:tabIndex": null, "update:title": null, "update:titleTemplate": null, @@ -549,6 +550,7 @@ const DxDropDownOptionsConfig = { shadingColor: String, showCloseButton: Boolean, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, tabIndex: Number, title: String, titleTemplate: {}, diff --git a/packages/devextreme-vue/src/color-box.ts b/packages/devextreme-vue/src/color-box.ts index ef1bc37b131a..084037610749 100644 --- a/packages/devextreme-vue/src/color-box.ts +++ b/packages/devextreme-vue/src/color-box.ts @@ -448,6 +448,7 @@ const DxDropDownOptionsConfig = { "update:shadingColor": null, "update:showCloseButton": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:tabIndex": null, "update:title": null, "update:titleTemplate": null, @@ -498,6 +499,7 @@ const DxDropDownOptionsConfig = { shadingColor: String, showCloseButton: Boolean, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, tabIndex: Number, title: String, titleTemplate: {}, diff --git a/packages/devextreme-vue/src/data-grid.ts b/packages/devextreme-vue/src/data-grid.ts index 909b4effa915..3015cf797c17 100644 --- a/packages/devextreme-vue/src/data-grid.ts +++ b/packages/devextreme-vue/src/data-grid.ts @@ -2261,6 +2261,7 @@ const DxFilterBuilderPopupConfig = { "update:shadingColor": null, "update:showCloseButton": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:tabIndex": null, "update:title": null, "update:titleTemplate": null, @@ -2311,6 +2312,7 @@ const DxFilterBuilderPopupConfig = { shadingColor: String, showCloseButton: Boolean, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, tabIndex: Number, title: String, titleTemplate: {}, @@ -3528,6 +3530,7 @@ const DxPopupConfig = { "update:shadingColor": null, "update:showCloseButton": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:tabIndex": null, "update:title": null, "update:titleTemplate": null, @@ -3578,6 +3581,7 @@ const DxPopupConfig = { shadingColor: String, showCloseButton: Boolean, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, tabIndex: Number, title: String, titleTemplate: {}, diff --git a/packages/devextreme-vue/src/date-box.ts b/packages/devextreme-vue/src/date-box.ts index a5957c5a99eb..a576e9be9fb8 100644 --- a/packages/devextreme-vue/src/date-box.ts +++ b/packages/devextreme-vue/src/date-box.ts @@ -637,6 +637,7 @@ const DxDropDownOptionsConfig = { "update:shadingColor": null, "update:showCloseButton": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:tabIndex": null, "update:title": null, "update:titleTemplate": null, @@ -687,6 +688,7 @@ const DxDropDownOptionsConfig = { shadingColor: String, showCloseButton: Boolean, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, tabIndex: Number, title: String, titleTemplate: {}, diff --git a/packages/devextreme-vue/src/date-range-box.ts b/packages/devextreme-vue/src/date-range-box.ts index ff5f88b085c1..af22436586c6 100644 --- a/packages/devextreme-vue/src/date-range-box.ts +++ b/packages/devextreme-vue/src/date-range-box.ts @@ -646,6 +646,7 @@ const DxDropDownOptionsConfig = { "update:shadingColor": null, "update:showCloseButton": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:tabIndex": null, "update:title": null, "update:titleTemplate": null, @@ -696,6 +697,7 @@ const DxDropDownOptionsConfig = { shadingColor: String, showCloseButton: Boolean, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, tabIndex: Number, title: String, titleTemplate: {}, diff --git a/packages/devextreme-vue/src/drop-down-box.ts b/packages/devextreme-vue/src/drop-down-box.ts index 9fcc93346eb6..e8c59f2d12ea 100644 --- a/packages/devextreme-vue/src/drop-down-box.ts +++ b/packages/devextreme-vue/src/drop-down-box.ts @@ -463,6 +463,7 @@ const DxDropDownOptionsConfig = { "update:shadingColor": null, "update:showCloseButton": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:tabIndex": null, "update:title": null, "update:titleTemplate": null, @@ -513,6 +514,7 @@ const DxDropDownOptionsConfig = { shadingColor: String, showCloseButton: Boolean, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, tabIndex: Number, title: String, titleTemplate: {}, diff --git a/packages/devextreme-vue/src/drop-down-button.ts b/packages/devextreme-vue/src/drop-down-button.ts index 86f556f124c6..e41d25fa9f4f 100644 --- a/packages/devextreme-vue/src/drop-down-button.ts +++ b/packages/devextreme-vue/src/drop-down-button.ts @@ -342,6 +342,7 @@ const DxDropDownOptionsConfig = { "update:shadingColor": null, "update:showCloseButton": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:tabIndex": null, "update:title": null, "update:titleTemplate": null, @@ -392,6 +393,7 @@ const DxDropDownOptionsConfig = { shadingColor: String, showCloseButton: Boolean, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, tabIndex: Number, title: String, titleTemplate: {}, diff --git a/packages/devextreme-vue/src/lookup.ts b/packages/devextreme-vue/src/lookup.ts index 2c98c0120be3..b18f6ecdf351 100644 --- a/packages/devextreme-vue/src/lookup.ts +++ b/packages/devextreme-vue/src/lookup.ts @@ -470,6 +470,7 @@ const DxDropDownOptionsConfig = { "update:showCloseButton": null, "update:showEvent": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:target": null, "update:title": null, "update:titleTemplate": null, @@ -511,6 +512,7 @@ const DxDropDownOptionsConfig = { showCloseButton: Boolean, showEvent: [Object, String] as PropType | string>, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, target: {}, title: String, titleTemplate: {}, diff --git a/packages/devextreme-vue/src/popover.ts b/packages/devextreme-vue/src/popover.ts index cd9c13bcfbbf..d60c1aa45090 100644 --- a/packages/devextreme-vue/src/popover.ts +++ b/packages/devextreme-vue/src/popover.ts @@ -76,6 +76,7 @@ type AccessibleOptions = Pick | string>, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, target: {}, title: String, titleTemplate: {}, @@ -166,6 +168,7 @@ const componentConfig = { "update:showCloseButton": null, "update:showEvent": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:target": null, "update:title": null, "update:titleTemplate": null, diff --git a/packages/devextreme-vue/src/popup.ts b/packages/devextreme-vue/src/popup.ts index 53be772451bd..b7cd83dcaa49 100644 --- a/packages/devextreme-vue/src/popup.ts +++ b/packages/devextreme-vue/src/popup.ts @@ -82,6 +82,7 @@ type AccessibleOptions = Pick | string>, + tabFocusLoopEnabled: Boolean, target: {}, visible: Boolean, width: [Number, String], @@ -137,6 +139,7 @@ const componentConfig = { "update:shading": null, "update:shadingColor": null, "update:showEvent": null, + "update:tabFocusLoopEnabled": null, "update:target": null, "update:visible": null, "update:width": null, diff --git a/packages/devextreme-vue/src/tree-list.ts b/packages/devextreme-vue/src/tree-list.ts index c684080c56d6..890d50a06aae 100644 --- a/packages/devextreme-vue/src/tree-list.ts +++ b/packages/devextreme-vue/src/tree-list.ts @@ -2038,6 +2038,7 @@ const DxFilterBuilderPopupConfig = { "update:shadingColor": null, "update:showCloseButton": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:tabIndex": null, "update:title": null, "update:titleTemplate": null, @@ -2088,6 +2089,7 @@ const DxFilterBuilderPopupConfig = { shadingColor: String, showCloseButton: Boolean, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, tabIndex: Number, title: String, titleTemplate: {}, @@ -3170,6 +3172,7 @@ const DxPopupConfig = { "update:shadingColor": null, "update:showCloseButton": null, "update:showTitle": null, + "update:tabFocusLoopEnabled": null, "update:tabIndex": null, "update:title": null, "update:titleTemplate": null, @@ -3220,6 +3223,7 @@ const DxPopupConfig = { shadingColor: String, showCloseButton: Boolean, showTitle: Boolean, + tabFocusLoopEnabled: Boolean, tabIndex: Number, title: String, titleTemplate: {}, diff --git a/packages/devextreme/js/__internal/grids/grid_core/column_chooser/m_column_chooser.ts b/packages/devextreme/js/__internal/grids/grid_core/column_chooser/m_column_chooser.ts index f12a6a54cf19..5d85ba5e8c1c 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/column_chooser/m_column_chooser.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/column_chooser/m_column_chooser.ts @@ -173,7 +173,7 @@ export class ColumnChooserView extends ColumnsView { height: columnChooserOptions.height, rtlEnabled: that.option('rtlEnabled'), container: columnChooserOptions.container, - _loopFocus: true, + tabFocusLoopEnabled: true, _ignoreCloseOnChildEscape: true, } as PopupProperties; diff --git a/packages/devextreme/js/__internal/grids/grid_core/header_filter/m_header_filter_core.ts b/packages/devextreme/js/__internal/grids/grid_core/header_filter/m_header_filter_core.ts index f094cd25c59a..224eb2dc6990 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/header_filter/m_header_filter_core.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/header_filter/m_header_filter_core.ts @@ -330,7 +330,7 @@ export class HeaderFilterView extends Modules.View { // T321243 component.option('animation', component._getDefaultOptions().animation); }, - _loopFocus: true, + tabFocusLoopEnabled: true, }; if (!isDefined(that._popupContainer)) { diff --git a/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/column_chooser.tsx b/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/column_chooser.tsx index 00fda99333a4..0b6afe219a20 100644 --- a/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/column_chooser.tsx +++ b/packages/devextreme/js/__internal/grids/new/grid_core/column_chooser/column_chooser.tsx @@ -87,8 +87,7 @@ export class ColumnChooser extends Component { dragEnabled={true} resizeEnabled={true} showCloseButton={true} - // @ts-expect-error - _loopFocus={true} + tabFocusLoopEnabled={true} toolbarItems={toolbarItems} wrapperAttr={{ class: this.getPopupWrapperClass() }} diff --git a/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts b/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts index 4214cf6750ec..325243d8c779 100644 --- a/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts +++ b/packages/devextreme/js/__internal/scheduler/m_compact_appointments_helper.ts @@ -59,7 +59,7 @@ export class CompactAppointmentsHelper { clickEvent: this._clickEvent(options.onAppointmentClick).bind(this), dragBehavior: options.allowDrag && this._createTooltipDragBehavior($appointmentCollector).bind(this), isButtonClick: true, - _loopFocus: true, + tabFocusLoopEnabled: true, }; } diff --git a/packages/devextreme/js/__internal/scheduler/tooltip_strategies/m_desktop_tooltip_strategy.ts b/packages/devextreme/js/__internal/scheduler/tooltip_strategies/m_desktop_tooltip_strategy.ts index 986748d6a455..fda27637da26 100644 --- a/packages/devextreme/js/__internal/scheduler/tooltip_strategies/m_desktop_tooltip_strategy.ts +++ b/packages/devextreme/js/__internal/scheduler/tooltip_strategies/m_desktop_tooltip_strategy.ts @@ -50,7 +50,7 @@ export class DesktopTooltipStrategy extends TooltipStrategyBase { onShown: this.onShown.bind(this), contentTemplate: this.getContentTemplate(dataList), wrapperAttr: { class: APPOINTMENT_TOOLTIP_WRAPPER_CLASS }, - _loopFocus: this.extraOptions._loopFocus, + tabFocusLoopEnabled: this.extraOptions.tabFocusLoopEnabled, }); tooltip.setAria({ diff --git a/packages/devextreme/js/__internal/ui/m_lookup.ts b/packages/devextreme/js/__internal/ui/m_lookup.ts index 2c78a4e9af79..ac3b400977a3 100644 --- a/packages/devextreme/js/__internal/ui/m_lookup.ts +++ b/packages/devextreme/js/__internal/ui/m_lookup.ts @@ -710,7 +710,7 @@ class Lookup extends DropDownList { shading: dropDownOptions.shading, // @ts-expect-error ts-error hideOnOutsideClick: dropDownOptions.hideOnOutsideClick, - _loopFocus: shouldLoopFocusInsidePopup, + tabFocusLoopEnabled: shouldLoopFocusInsidePopup, }); delete result.animation; diff --git a/packages/devextreme/js/__internal/ui/overlay/overlay.ts b/packages/devextreme/js/__internal/ui/overlay/overlay.ts index d03c6c326ed4..a452f5d48373 100644 --- a/packages/devextreme/js/__internal/ui/overlay/overlay.ts +++ b/packages/devextreme/js/__internal/ui/overlay/overlay.ts @@ -120,7 +120,7 @@ export interface OverlayProperties extends Properties { zIndex?: number; - _loopFocus?: boolean; + tabFocusLoopEnabled?: boolean; _ignorePreventScrollEventsDeprecation?: boolean; @@ -294,7 +294,7 @@ class Overlay< ignoreChildEvents: true, _checkParentVisibility: true, _fixWrapperPosition: false, - _loopFocus: false, + tabFocusLoopEnabled: false, _ignorePreventScrollEventsDeprecation: false, // NOTE: private option hideTopOverlayHandler: (): void => { @@ -939,12 +939,11 @@ class Overlay< } _toggleTabTerminator(enabled: boolean): void { - // eslint-disable-next-line @typescript-eslint/naming-convention - const { _loopFocus } = this.option(); + const { tabFocusLoopEnabled } = this.option(); // @ts-expect-error NAME has string | undefined type const eventName = addNamespace('keydown', this.NAME); - if (_loopFocus || enabled) { + if (tabFocusLoopEnabled || enabled) { eventsEngine.on(domAdapter.getDocument(), eventName, this._proxiedTabTerminatorHandler); } else { this._destroyTabTerminator(); @@ -1527,7 +1526,7 @@ class Overlay< switch (name) { case 'animation': break; - case '_loopFocus': + case 'tabFocusLoopEnabled': case 'shading': { this._toggleShading(this._isVisible()); this._toggleSafariScrolling(); diff --git a/packages/devextreme/js/__internal/ui/popover/m_popover.ts b/packages/devextreme/js/__internal/ui/popover/m_popover.ts index 908801798f29..8d47110907dd 100644 --- a/packages/devextreme/js/__internal/ui/popover/m_popover.ts +++ b/packages/devextreme/js/__internal/ui/popover/m_popover.ts @@ -191,6 +191,7 @@ class Popover< _initEscapeKeyHandler(): void { this._documentEscapeKeyHandler = (e: KeyboardEvent): void => { const { visible } = this.option(); + const overlayStack = this._overlayStack(); const isTopOverlay = overlayStack[overlayStack.length - 1] === this; diff --git a/packages/devextreme/js/__internal/ui/popup/m_popup.ts b/packages/devextreme/js/__internal/ui/popup/m_popup.ts index fac819c15fa2..e203ee762a41 100644 --- a/packages/devextreme/js/__internal/ui/popup/m_popup.ts +++ b/packages/devextreme/js/__internal/ui/popup/m_popup.ts @@ -267,6 +267,7 @@ class Popup< useDefaultToolbarButtons: false, useFlatToolbarButtons: false, autoResizeEnabled: true, + tabFocusLoopEnabled: false, _ignoreCloseOnChildEscape: false, }; } diff --git a/packages/devextreme/js/ui/popup.d.ts b/packages/devextreme/js/ui/popup.d.ts index c7f6507a4cc3..9dca815f9ae0 100644 --- a/packages/devextreme/js/ui/popup.d.ts +++ b/packages/devextreme/js/ui/popup.d.ts @@ -220,6 +220,12 @@ export interface dxPopupOptions extends dxOverlayOptions * @public */ showTitle?: boolean; + /** + * @docid + * @default false + * @public + */ + tabFocusLoopEnabled?: boolean; /** * @docid * @default "" diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/lookup.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/lookup.tests.js index 1f29b862072f..1d30b961026d 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/lookup.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/lookup.tests.js @@ -2192,7 +2192,7 @@ QUnit.module('popup options', { [true, false].forEach(dropDownCentered => { [true, false].forEach(_scrollToSelectedItemEnabled => { [true, false].forEach(usePopover => { - QUnit.test(`Popup should have correct _loopFocus option value if usePopover=${usePopover}, _scrollToSelectedItemEnabled=${_scrollToSelectedItemEnabled}, dropDownCentered=${dropDownCentered}`, function(assert) { + QUnit.test(`Popup should have correct tabFocusLoopEnabled option value if usePopover=${usePopover}, _scrollToSelectedItemEnabled=${_scrollToSelectedItemEnabled}, dropDownCentered=${dropDownCentered}`, function(assert) { const instance = $('#lookupOptions').dxLookup({ _scrollToSelectedItemEnabled, usePopover, @@ -2211,9 +2211,9 @@ QUnit.module('popup options', { ? dropDownCentered : !usePopover; - const { _loopFocus } = popup.option(); + const { tabFocusLoopEnabled } = popup.option(); - assert.strictEqual(_loopFocus, expectedValue, `_loopFocus: ${_loopFocus} is correct`); + assert.strictEqual(tabFocusLoopEnabled, expectedValue, `tabFocusLoopEnabled: ${tabFocusLoopEnabled} is correct`); }); }); }); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js index 0ba3be0092a0..4c5dc2891efc 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/overlay.tests.js @@ -3278,11 +3278,11 @@ testModule('focus policy', { assert.strictEqual(getActiveElement(), $firstTabbable.get(0), 'first item focused on press tab on last item (does not go under overlay)'); }); - test('focus in Overlay should be looped if _loopFocus: true and shading: false', function(assert) { + test('focus in Overlay should be looped if tabFocusLoopEnabled: true and shading: false', function(assert) { const overlay = new Overlay($('
').appendTo('#qunit-fixture'), { visible: true, shading: false, - _loopFocus: true, + tabFocusLoopEnabled: true, contentTemplate: $('#focusableTemplate') }); const $content = overlay.$content(); @@ -3300,7 +3300,7 @@ testModule('focus policy', { assert.strictEqual(getActiveElement(), lastFocusableElement, 'last item is focused'); }); - test('focus in Overlay should be looped if shading: false, _loopFocus gets true in runtime', function(assert) { + test('focus in Overlay should be looped if shading: false, tabFocusLoopEnabled gets true in runtime', function(assert) { const overlay = new Overlay($('
').appendTo('#qunit-fixture'), { visible: true, shading: false, @@ -3321,7 +3321,7 @@ testModule('focus policy', { assert.strictEqual(getActiveElement() !== lastFocusableElement, true, 'last item is not focused'); - overlay.option('_loopFocus', true); + overlay.option('tabFocusLoopEnabled', true); $(lastFocusableElement).focus(); $(lastFocusableElement).trigger(this.tabEvent); diff --git a/packages/devextreme/ts/dx.all.d.ts b/packages/devextreme/ts/dx.all.d.ts index 30d20a7ee466..e69e30db6bc2 100644 --- a/packages/devextreme/ts/dx.all.d.ts +++ b/packages/devextreme/ts/dx.all.d.ts @@ -25253,6 +25253,10 @@ declare module DevExpress.ui { * [descr:dxPopupOptions.showTitle] */ showTitle?: boolean; + /** + * [descr:dxPopupOptions.tabFocusLoopEnabled] + */ + tabFocusLoopEnabled?: boolean; /** * [descr:dxPopupOptions.title] */