dimsum-e2e-tests 3.70.0-next.7 → 3.70.0-next.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1079 -721
- package/ds-accordion/DSAccordion.visual.spec.js +6 -0
- package/ds-accordion/DSAccordionCO.js +15 -3
- package/ds-accordion/QA_NOTES.md +105 -0
- package/ds-accordion/controlled/DSAccordion.controlled.func.spec.js +23 -0
- package/ds-accordion/header-structure/DSAccordion.header-structure.func.spec.js +65 -0
- package/ds-accordion/input-inside/DSAccordion.input-inside.func.spec.js +19 -0
- package/ds-apppicker/DSAppPickerCO.js +101 -3
- package/ds-apppicker/aria-pattern/DSAppPicker.aria-pattern.func.spec.js +100 -0
- package/ds-apppicker/basic/DSAppPicker.basic.keyboard-nav.func.spec.js +18 -7
- package/ds-apppicker/closeAfterSelection/DSAppPicker.closeAfterSelection.func.spec.js +1 -1
- package/ds-apppicker/custom-trigger-focus/DSAppPicker.custom-trigger-focus.func.spec.js +82 -0
- package/ds-apppicker/label-expansion-dismissal/DSAppPicker.label-expansion-dismissal.visual.spec.js +108 -0
- package/ds-apppicker/reflow/DSAppPicker.reflow.func.spec.js +32 -0
- package/ds-apppicker/reflow/DSAppPicker.reflow.visual.spec.js +5 -6
- package/ds-apppicker/truncation/DSAppPicker.truncation.visual.spec.js +5 -9
- package/ds-autocomplete/DSAutocomplete.visual.spec.js +34 -0
- package/ds-autocomplete/DSAutocompleteCO.js +36 -1
- package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.axe-core.func.spec.js +50 -0
- package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.func.spec.js +122 -0
- package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.visual.spec.js +48 -0
- package/ds-autocomplete/slots/DSAutocomplete.slots.func.spec.js +6 -1
- package/ds-banner/DSBanner.text-resize.visual.spec.js +5 -2
- package/ds-banner/DSBannerCO.js +4 -0
- package/ds-button-v3/DSButtonV3.aria-disabled-attribute.func.spec.js +33 -0
- package/ds-button-v3/DSButtonV3CO.js +10 -0
- package/ds-button-v3/theme-font/DSButtonV3.theme-font.func.spec.js +30 -0
- package/ds-card/DSCard.cardv2_v1.func.spec.js +54 -0
- package/ds-card/DSCard.cardv2_v1.visual.spec.js +29 -0
- package/ds-card/DSCardCO.js +50 -0
- package/ds-card/detail-slots/DSCard.detail-slots.axe-core.func.spec.js +29 -0
- package/ds-card/detail-slots/DSCard.detail-slots.func.spec.js +72 -0
- package/ds-card/detail-slots/DSCard.detail-slots.visual.spec.js +19 -0
- package/ds-card-v3/DSCardV3CO.js +93 -1
- package/ds-card-v3/accordion/DSCardV3.accordion-aria-structure.func.spec.js +41 -0
- package/ds-card-v3/accordion/DSCardV3.accordion-aria.keyboard.func.spec.js +49 -0
- package/ds-card-v3/accordion/DSCardV3.accordion.axe-core.func.spec.js +28 -0
- package/ds-card-v3/accordion/DSCardV3.accordion.visual.spec.js +4 -6
- package/ds-card-v3/action/DSCardV3.action.axe-core.func.spec.js +24 -0
- package/ds-card-v3/action/DSCardV3.action.func.spec.js +53 -0
- package/ds-card-v3/action/DSCardV3.action.visual.spec.js +28 -0
- package/ds-card-v3/drag-n-drop/DSCardV3.DnD.axe-core.func.spec.js +42 -0
- package/ds-card-v3/drag-n-drop/DSCardV3.DnD.func.spec.js +129 -0
- package/ds-card-v3/drag-n-drop/DSCardV3.DnD.reorder.func.spec.js +73 -0
- package/ds-card-v3/drag-n-drop/DSCardV3.DnD.visual.spec.js +5 -12
- package/ds-card-v3/global-attributes/DSCardV3.global-attributes.axe-core.func.spec.js +33 -0
- package/ds-card-v3/global-attributes/DSCardV3.global-attributes.visual.spec.js +20 -0
- package/ds-card-v3/multi-select/DSCardV3.multi-select.aria-grouping.func.spec.js +24 -0
- package/ds-card-v3/multi-select/DSCardV3.multiselect.axe-core.func.spec.js +47 -0
- package/ds-card-v3/multi-select/DSCardV3.multiselect.keyboard.func.spec.js +65 -0
- package/ds-card-v3/multi-select/DSCardV3.multiselect.visual.spec.js +17 -0
- package/ds-card-v3/multiple-action/DSCardV3.multiple-action.axe-core.func.spec.js +35 -0
- package/ds-card-v3/multiple-action/DSCardV3.multiple-action.func.spec.js +53 -0
- package/ds-card-v3/multiple-action/DSCardV3.multiple-action.visual.spec.js +18 -0
- package/ds-card-v3/multiple-control/DSCardV3.multi-control.axe-core.func.spec.js +34 -0
- package/ds-card-v3/multiple-control/DSCardV3.multi-control.func.spec.js +26 -0
- package/ds-card-v3/multiple-control/DSCardV3.multi-control.visual.spec.js +29 -0
- package/ds-card-v3/no-action/DSCardV3.no-action.axe-core.func.spec.js +22 -0
- package/ds-card-v3/no-action/DSCardV3.no-action.func.spec.js +23 -0
- package/ds-card-v3/no-action/DSCardV3.no-action.visual.spec.js +15 -0
- package/ds-card-v3/notification-badges/DSCardV3.notification-badges.axe-core.func.spec.js +33 -0
- package/ds-card-v3/notification-badges/DSCardV3.notification-badges.func.spec.js +19 -0
- package/ds-card-v3/notification-badges/DSCardV3.notification-badges.visual.spec.js +28 -0
- package/ds-card-v3/reflow/DSCardV3.reflow.axe-core.func.spec.js +28 -0
- package/ds-card-v3/reflow/DSCardV3.reflow.func.spec.js +36 -0
- package/ds-card-v3/reflow/DSCardV3.reflow.visual.spec.js +3 -2
- package/ds-card-v3/single-select/DSCardV3.single-select.aria-grouping.func.spec.js +24 -0
- package/ds-card-v3/single-select/DSCardV3.single-select.axe-core.func.spec.js +37 -0
- package/ds-card-v3/single-select/DSCardV3.single-select.visual.spec.js +1 -2
- package/ds-card-v3/slots/DSCardV3.slots.visual.spec.js +1 -2
- package/ds-card-v3/variant-accented/DSCardV3.variant-accented.axe-core.func.spec.js +45 -0
- package/ds-card-v3/variant-accented/DSCardV3.variant-accented.func.spec.js +28 -0
- package/ds-card-v3/variant-accented/DSCardV3.variant-accented.visual.spec.js +35 -0
- package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.axe-core.func.spec.js +35 -0
- package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.func.spec.js +53 -0
- package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.visual.spec.js +28 -0
- package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.axe-core.func.spec.js +22 -0
- package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.func.spec.js +61 -0
- package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.visual.spec.js +20 -0
- package/ds-card-v3/variant-disabled/DSCardV3.variantDisabled-non-interactive.func.spec.js +25 -0
- package/ds-chat/DSChat.axe-core.func.spec.js +2 -2
- package/ds-chat/DSChat.visual.spec.js +4 -4
- package/ds-chat/DSChatCO.js +18 -24
- package/ds-chat/bubbles/slots/DSChatBubble.slots.axe-core.func.spec.js +24 -0
- package/ds-chat/bubbles/slots/DSChatBubble.slots.func.spec.js +49 -0
- package/ds-chat/bubbles/slots/DSChatBubble.slots.visual.spec.js +25 -0
- package/ds-chat/card/slots/DSChatCard.slots.axe-core.func.spec.js +24 -0
- package/ds-chat/card/slots/DSChatCard.slots.func.spec.js +47 -0
- package/ds-chat/card/slots/DSChatCard.slots.visual.spec.js +18 -0
- package/ds-chat/card/truncated-text/DSChatCard.truncated-text.func.spec.js +32 -0
- package/ds-chat/card/truncated-text/DSChatCard.truncated-text.visual.spec.js +26 -0
- package/ds-chat/card/with-notification-badges/DSChatCard.with-notification-badges.axe-core.func.spec.js +23 -0
- package/ds-chat/card/with-notification-badges/DSChatCard.with-notification-badges.visual.spec.js +17 -0
- package/ds-chat/components/BubbleCO.js +46 -3
- package/ds-chat/components/CardCO.js +75 -0
- package/ds-chat/components/ComposerCO.js +6 -6
- package/ds-chat/components/FloatingButtonCO.js +5 -3
- package/ds-chat/components/HeaderCO.js +2 -2
- package/ds-chat/components/TileCO.js +82 -0
- package/ds-chat/components/index.js +3 -2
- package/ds-chat/floatingbutton/DSChat-floating-button.visual.spec.js +1 -1
- package/ds-chat/loadmore/DSChat-loadmore.func.spec.js +1 -1
- package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.axe-core.func.spec.js +2 -2
- package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.func.spec.js +1 -1
- package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.visual.spec.js +2 -2
- package/{ds-chat-tile → ds-chat/tile}/aria-disabled/DSChat-tile.aria-disabled.axe-core.func.spec.js +2 -2
- package/{ds-chat-tile → ds-chat/tile}/aria-disabled/DSChat-tile.aria-disabled.visual.spec.js +1 -1
- package/ds-chat/tile/slots/DSChatTile.slots.func.spec.js +53 -0
- package/ds-chat/tile/slots/DSChatTile.slots.visual.spec.js +18 -0
- package/ds-chip/label-expansion-dismissal/DSChip.label-expansion-dismissal.visual.spec.js +84 -0
- package/ds-controlled-form/ds-combobox/creatable/DSCombobox.creatable-tooltip.func.spec.js +47 -0
- package/ds-controlled-form/ds-combobox/creatable/DSCombobox.creatable.visual.spec.js +12 -21
- package/ds-controlled-form/ds-combobox/disabled/DSCombobox.disabled.visual.spec.js +6 -1
- package/ds-controlled-form/ds-controlled-checkbox/Basic/DSControlledCheckbox.axe-core.basic.func.spec.js +4 -4
- package/ds-controlled-form/ds-controlled-checkbox/Basic/DSControlledCheckbox.basic.visual.spec.js +56 -0
- package/ds-controlled-form/ds-controlled-checkbox/DSControlledCheckboxCO.js +54 -1
- package/ds-controlled-form/ds-controlled-checkbox/Disabled/DSControlledCheckbox.axe-core.disabled.func.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/Disabled/DSControlledCheckbox.disabled.visual.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/HasError/DSControlledCheckbox.axe-core.hasError.func.spec.js +4 -4
- package/ds-controlled-form/ds-controlled-checkbox/HasError/DSControlledCheckbox.has-error.visual.spec.js +71 -1
- package/ds-controlled-form/ds-controlled-checkbox/Mixed/DSControlledCheckbox.axe-core.mixed.func.spec.js +4 -4
- package/ds-controlled-form/ds-controlled-checkbox/Mixed/DSControlledCheckbox.mixed.visual.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/ReadOnly/DSControlledCheckbox.axe-core.read-only.func.spec.js +3 -3
- package/ds-controlled-form/ds-controlled-checkbox/ReadOnly/DSControlledCheckbox.read-only.visual.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/WithTooltip/DSControlledCheckbox.axe-core.with-tooltip.func.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/WithTooltip/DSControlledCheckbox.with-tooltip.visual.spec.js +1 -3
- package/ds-controlled-form/ds-controlled-checkbox/WrapLabel/DSControlledCheckbox.axe-core.wrap-label.func.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/WrapLabel/DSControlledCheckbox.wrap-label.visual.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/aria-disabled/DSControlledCheckbox.aria-disabled.visual.spec.js +2 -6
- package/ds-controlled-form/ds-controlled-checkbox/aria-disabled/DSControlledCheckbox.axe-core.aria-disabled.func.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-checkbox/slots/DSControlledCheckbox.slots.func.spec.js +78 -0
- package/ds-controlled-form/ds-controlled-checkbox/theme-font/DSControlledCheckbox.theme-font.func.spec.js +30 -0
- package/ds-controlled-form/ds-controlled-checkbox-group/DSControlledCheckboxGroup.axe-core.func.spec.js +4 -4
- package/ds-controlled-form/ds-controlled-checkbox-group/DSControlledCheckboxGroup.visual.spec.js +1 -1
- package/ds-controlled-form/ds-controlled-radio/DSControlledRadioCO.js +50 -1
- package/ds-controlled-form/ds-controlled-radio/aria-disabled/DSControlledRadio.aria-disabled.axe-core.func.spec.js +16 -2
- package/ds-controlled-form/ds-controlled-radio/aria-disabled/DSControlledRadio.aria-disabled.func.spec.js +37 -0
- package/ds-controlled-form/ds-controlled-radio/slots/DSControlledRadio.slots.func.spec.js +78 -0
- package/ds-controlled-form/ds-controlled-radio/theme-font/DSControlledRadio.theme-font.func.spec.js +30 -0
- package/ds-controlled-form/react-hook-form/ReactHook.func.spec.js +1 -3
- package/ds-data-table-async/DSDataTableCO.js +187 -10
- package/ds-data-table-async/basic/DSDataTable.basic.visual.spec.js +1 -1
- package/ds-data-table-async/components/FilterBarCO.js +7 -0
- package/ds-data-table-async/components/FiltersCO.js +1 -1
- package/ds-data-table-async/components/HeaderCO.js +37 -1
- package/ds-data-table-async/dnd/DSDataTable.dnd-keyboard-scroll.func.spec.js +51 -0
- package/ds-data-table-async/filter-menu-close/DSDataTable.filter-menu-close.func.spec.js +77 -0
- package/ds-data-table-async/filter-popover-boundary/DSDataTable.filter-popover-boundary.func.spec.js +98 -0
- package/ds-data-table-async/filters/DSDataTable.filters-creatable-active-descendant.func.spec.js +51 -0
- package/ds-data-table-async/filters/DSDataTable.filters-creatable.func.spec.js +55 -0
- package/ds-data-table-async/filters/DSDataTable.filters.axe-core.func.spec.js +11 -9
- package/ds-data-table-async/filtersV2/DSDataTable.filtersV2-creatablemultiselect.keyboard.func.spec.js +2 -2
- package/ds-data-table-async/filtersV2/DSDataTable.filtersV2-creatableselect.keyboard.func.spec.js +2 -2
- package/ds-data-table-async/filtersV2/DSDataTable.filtersV2.axe-core.func.spec.js +45 -29
- package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.axe-core.func.spec.js +23 -0
- package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.func.spec.js +50 -0
- package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.visual.spec.js +21 -0
- package/ds-data-table-async/header-affordances/DSDataTable.header-affordances.func.spec.js +92 -0
- package/ds-data-table-async/helpers/getInputSelection.js +6 -0
- package/ds-data-table-async/helpers/index.js +1 -0
- package/ds-data-table-async/keyboard-scroll/DSDataTable.keyboard-scroll.func.spec.js +39 -0
- package/ds-data-table-async/menubutton/DSDataTable.MenuButton.keyboard.func.spec.js +8 -7
- package/ds-data-table-async/menubutton/DSDataTable.MenuButton.mouse.func.spec.js +6 -7
- package/ds-data-table-async/pagination/DSDataTable.pagination.func.spec.js +3 -2
- package/ds-data-table-async/resizable/DSDataTable.resize-min-clamp.func.spec.js +72 -0
- package/ds-data-table-async/resizable/DSDataTable.resizerA11y.axe-core.func.spec.js +42 -0
- package/ds-data-table-async/resizable/DSDataTable.resizerA11y.func.spec.js +98 -0
- package/ds-data-table-async/textwrapping/DSDataTable.header-wrap-alignment.axe-core.func.spec.js +23 -0
- package/ds-data-table-async/textwrapping/DSDataTable.header-wrap-alignment.visual.spec.js +106 -0
- package/ds-data-table-async/textwrapping/DSDataTable.text-wrap-toolbar.visual.spec.js +27 -0
- package/ds-data-table-async/toggle-cell-focus/DSDataTable.toggle-cell-enter-focus.func.spec.js +31 -0
- package/ds-data-table-async/vissibility/DSDataTable.vissibility.visual.spec.js +2 -0
- package/ds-dataviz/DSDataViz.axis.visual.spec.js +1 -2
- package/ds-dataviz/DSDataViz.ticks.visual.spec.js +1 -2
- package/ds-dataviz/DSDataVizCO.js +2 -0
- package/ds-dataviz/axecore/DSDataViz.axis.axe-core.func.spec.js +1 -1
- package/ds-floating-context/DSFloatingContextCO.js +10 -0
- package/ds-floating-context/placement/DSFloatingContext.placement.visual.spec.js +48 -0
- package/ds-form-combobox-multi/DSComboboxMultiCO.js +36 -9
- package/ds-form-combobox-multi/aria-busy-loading/DSComboboxMulti.aria-busy-loading.axe-core.func.spec.js +55 -0
- package/ds-form-combobox-multi/aria-busy-loading/DSComboboxMulti.aria-busy-loading.func.spec.js +57 -0
- package/ds-form-combobox-multi/aria-disabled/DSComboboxMulti.aria-disabled.visual.spec.js +19 -2
- package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.axe-core.func.spec.js +24 -0
- package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.mouse.func.spec.js +0 -2
- package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.visual.spec.js +22 -0
- package/ds-form-combobox-multi/grouped/DSComboboxMulti.grouped.visual.spec.js +42 -0
- package/ds-form-combobox-multi/inline/DSComboboxMulti.inline.visual.spec.js +21 -0
- package/ds-form-combobox-multi/pills/DSComboboxMulti.pills.func.spec.js +59 -0
- package/ds-form-combobox-multi/pills/DSComboboxMulti.pills.visual.spec.js +39 -0
- package/ds-form-combobox-multi/skeleton/DSComboboxMulti.skeleton.visual.spec.js +25 -0
- package/ds-form-combobox-multi/theme-font/DSComboboxMulti.theme-font.func.spec.js +38 -0
- package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.axe-core.func.spec.js +39 -0
- package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.func.spec.js +39 -0
- package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.visual.spec.js +29 -0
- package/ds-form-combobox-single/DSComboboxSingleCO.js +25 -9
- package/ds-form-combobox-single/aria-busy-loading/DSComboboxSingle.aria-busy-loading.axe-core.func.spec.js +49 -0
- package/ds-form-combobox-single/aria-busy-loading/DSComboboxSingle.aria-busy-loading.func.spec.js +54 -0
- package/ds-form-combobox-single/aria-disabled/DSComboboxSingle.aria-disabled.visual.spec.js +18 -0
- package/ds-form-combobox-single/creatable/DSComboboxSingle.creatable.visual.spec.js +30 -0
- package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.axe-core.func.spec.js +24 -0
- package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.mouse.func.spec.js +0 -2
- package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.visual.spec.js +22 -0
- package/ds-form-combobox-single/grouped/DSComboboxSingle.grouped.visual.spec.js +45 -0
- package/ds-form-combobox-single/inline/DSComboboxSingle.inline.visual.spec.js +23 -0
- package/ds-form-combobox-single/skeleton/DSComboboxSingle.skeleton.visual.spec.js +25 -0
- package/ds-form-combobox-single/theme-font/DSComboboxSingle.theme-font.func.spec.js +34 -0
- package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.axe-core.func.spec.js +39 -0
- package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.func.spec.js +39 -0
- package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.visual.spec.js +29 -0
- package/ds-form-date-range-picker/DateRangePicker.axe-core.spec.js +5 -0
- package/ds-form-date-range-picker/DateRangePicker.functional.spec.js +80 -18
- package/ds-form-date-range-picker/DateRangePickerCO.js +19 -0
- package/ds-form-date-range-picker/date-segment-aria-labels/DateRangePicker.date-segment-aria-labels.func.spec.js +66 -0
- package/ds-form-date-range-picker/grouped-field-error-announcement/DateRangePicker.grouped-field-error-announcement.func.spec.js +59 -0
- package/ds-form-date-range-picker/picker-callbacks/DateRangePicker.picker-callbacks.func.spec.js +36 -0
- package/ds-form-date-time-picker/DSControlledDateTimePickerCO.js +7 -0
- package/ds-form-date-time-picker/date-time-full/DateTimeFull.axe-core.func.spec.js +8 -1
- package/ds-form-date-time-picker/date-time-full/DateTimePicker.DateTimeFull.visual.spec.js +9 -0
- package/ds-form-date-time-picker/partial-date-open-focus/DateTimePicker.partial-date-open-focus.func.spec.js +45 -0
- package/ds-form-native-select/NativeSelect.axe-core.func.spec.js +39 -0
- package/ds-form-native-select/NativeSelect.visual.spec.js +33 -0
- package/ds-form-native-select/NativeSelectCO.js +6 -0
- package/ds-form-native-select/option-selection/NativeSelect.option-selection.func.spec.js +25 -0
- package/ds-form-toggle/DSToggle.func.spec.js +20 -23
- package/ds-form-toggle/DSToggleCO.js +11 -2
- package/ds-global-header/GlobalHeader.announcements.func.spec.js +27 -0
- package/ds-global-header/GlobalHeader.axe-core.func.spec.js +15 -15
- package/ds-global-header/GlobalHeader.func.spec.js +70 -1
- package/ds-global-header/GlobalHeaderCO.js +120 -2
- package/ds-global-header/app-picker-passthrough/GlobalHeader.app-picker-passthrough.func.spec.js +113 -0
- package/ds-global-header/popup-menu-focus/GlobalHeader.popup-menu-focus.func.spec.js +63 -0
- package/ds-global-header/popup-menu-slots/GlobalHeader.popup-menu-slots.func.spec.js +70 -0
- package/ds-global-header/search-toggle-slots/GlobalHeader.search-toggle-slots.func.spec.js +118 -0
- package/ds-global-header/toolbar-item-attributes/GlobalHeader.toolbar-item-attributes.func.spec.js +53 -0
- package/ds-grid/DSGridCO.js +20 -0
- package/ds-grid/layout-mode/DSGrid.layout-mode.func.spec.js +51 -0
- package/ds-grid/layout-mode/DSGrid.layout-mode.visual.spec.js +22 -0
- package/ds-hooks/DSHook.UseFontSizeMedia.visual.spec.js +5 -2
- package/ds-hooks/DSHook.usetree.func.spec.js +3 -2
- package/ds-hooks/DSHookCO.js +56 -23
- package/ds-hooks/useFocusStack/DSHook.useFocusStack.func.spec.js +83 -0
- package/ds-hooks/useFocusTrap/UseFocusTrapCO.js +2 -0
- package/ds-hooks/useFocusTrap/UseFocusTrapToggle.func.spec.js +48 -0
- package/ds-hooks/useMask/Number/UseNumberMask.axe-core.func.spec.js +48 -0
- package/ds-menu-button/DSMenuButtonCO.js +23 -0
- package/ds-menu-button/slots/DSMenuButton.slots.axe-core.func.spec.js +28 -0
- package/ds-menu-button/slots/DSMenuButton.slots.func.spec.js +59 -0
- package/ds-menu-button/slots/DSMenuButton.slots.visual.spec.js +26 -0
- package/ds-modal-slide/ModalSlideCO.js +7 -0
- package/ds-modal-slide/custom-header/ModalSlide.customHeader.focusRing.visual.spec.js +2 -1
- package/ds-modal-slide/heading-level/ModalSlide.headingLevel.axe-core.func.spec.js +25 -0
- package/ds-modal-slide/heading-level/ModalSlide.headingLevel.func.spec.js +25 -0
- package/ds-modal-slide/slots/ModalSlide.slots.func.spec.js +18 -0
- package/ds-notification-badge/DSNotificationBadge.visual.spec.js +17 -20
- package/ds-page-layout/PageLayoutCO.js +4 -4
- package/ds-pills-v2/DSPillsV2CO.js +12 -0
- package/ds-pills-v2/apply-aria-disabled/DSPills.applyAriaDisabled.func.spec.js +53 -0
- package/ds-pills-v2/apply-aria-disabled/DSPills.applyAriaDisabled.visual.spec.js +26 -0
- package/ds-pills-v2/disabled/DSPills.disabled.func.spec.js +53 -0
- package/ds-pills-v2/disabled/DSPills.disabled.visual.spec.js +33 -0
- package/ds-progress-indicator/DSProgressIndicator.axe-core.func.spec.js +2 -0
- package/ds-progress-indicator/DSProgressIndicatorCO.js +1 -1
- package/ds-query-builder/DSQueryBuilder.visual.spec.js +6 -6
- package/ds-shuttle-v2/DSShuttleV2CO.js +15 -1
- package/ds-shuttle-v2/breadcrumb-a11y/DSShuttleV2.breadcrumb-a11y.func.spec.js +43 -0
- package/ds-shuttle-v2/explicit-selection-ui/DSShuttleV2.explicit-selection-ui.func.spec.js +37 -0
- package/ds-shuttle-v2/explicit-selection-ui/DSShuttleV2.explicit-selection-ui.visual.spec.js +30 -0
- package/ds-shuttle-v2/extra/DSShuttleV2.extra.visual.spec.js +8 -3
- package/ds-shuttle-v2/items/DSShuttleV2.items.func.spec.js +4 -2
- package/ds-shuttle-v2/skipped/DSShuttleV2.extra.axe-core.skipped.js +1 -1
- package/ds-shuttle-v2/skipped/DSShuttleV2.filter.axe-core.skipped.js +1 -1
- package/ds-shuttle-v2/skipped/DSShuttleV2.globalcheckbox.axe-core.skipped.js +1 -1
- package/ds-shuttle-v2/skipped/DSShuttleV2.items.axe-core.skipped.js +3 -3
- package/ds-shuttle-v2/skipped/DSShuttleV2.skipped.js +5 -5
- package/ds-slider-v2/DSSliderV2.func.spec.js +36 -25
- package/ds-slider-v2/DSSliderV2CO.js +10 -0
- package/ds-slider-v2/min-range/DSSliderV2.min-range.func.spec.js +69 -0
- package/ds-tab-button/DSTabButton.func.spec.js +1 -1
- package/ds-tabs/DSTabsCO.js +4 -0
- package/ds-tabs/notification-badge/DSTabs.notification-badge.axe-core.func.spec.js +28 -0
- package/ds-tabs/notification-badge/DSTabs.notification-badge.func.spec.js +51 -0
- package/ds-tooltip-v3/DSTooltipV3CO.js +21 -0
- package/ds-tooltip-v3/aria-tooltip-pattern/DSTooltipV3.aria-tooltip-pattern.axe-core.func.spec.js +23 -0
- package/ds-tooltip-v3/aria-tooltip-pattern/DSTooltipV3.aria-tooltip-pattern.func.spec.js +29 -0
- package/ds-tooltip-v3/dialog/DSTooltipV3.dialog.func.spec.js +45 -0
- package/ds-tooltip-v3/dialog/DSTooltipV3.dialog.visual.spec.js +29 -0
- package/ds-treeview/DSTreeViewCO.js +23 -0
- package/ds-treeview/dragAndDrop/TreeView-dnd_keyboard.func.spec.js +96 -0
- package/ds-typography/DSTypographyCO.js +10 -0
- package/ds-typography/theme-font/DSTypography.theme-font.func.spec.js +30 -0
- package/package.json +150 -153
- package/paths.js +16 -6
- package/ds-card-v3/disabled/DSCardV3.disabled.visual.spec.js +0 -17
- package/ds-chat-tile/TileCO.js +0 -35
- package/ds-hooks/DSHook.func.spec.js +0 -60
- package/ds-hooks/useFocusStack/DSHook.useFocusStack.skipped.js +0 -57
- package/ds-treeview/dragAndDrop/TreeView-dnd_mouse.func.spec.js +0 -61
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads an input's native text-selection state. Used to prove the browser's own caret-placement
|
|
3
|
+
* and word-selection defaults survive on the filter combobox input (PUI-15851).
|
|
4
|
+
*/
|
|
5
|
+
export const getInputSelection = (element) =>
|
|
6
|
+
browser.execute((el) => ({ start: el.selectionStart, end: el.selectionEnd, value: el.value }), element);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import DSDataTableCO from '../DSDataTableCO';
|
|
2
|
+
|
|
3
|
+
// Tests for the fix introduced in PUI-18626 (focused row clipped behind the sticky header on
|
|
4
|
+
// upward keyboard navigation). The fix applies scroll-padding-top = header height to the scroll
|
|
5
|
+
// container, so the browser-native focus scroll lands the focused row below the sticky header.
|
|
6
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
7
|
+
describe('PUI-18709 - DSDataTable:: focused row visible below sticky header on ArrowUp nav - Func', () => {
|
|
8
|
+
before(async () => {
|
|
9
|
+
const errorOnGo = await DSDataTableCO.keyboardScrollIntoView.go();
|
|
10
|
+
if (errorOnGo) throw errorOnGo;
|
|
11
|
+
await DSDataTableCO.waitForDataTable();
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('01: focused row lands below sticky header after upward keyboard navigation', async () => {
|
|
15
|
+
// Place focus inside the table, then scroll well past the fold and navigate back up.
|
|
16
|
+
await (await DSDataTableCO.getFirstRow()).click();
|
|
17
|
+
await DSDataTableCO.pressArrow('down', 20);
|
|
18
|
+
await DSDataTableCO.pressArrow('up', 8);
|
|
19
|
+
|
|
20
|
+
const geometry = await DSDataTableCO.getUpwardNavGeometry();
|
|
21
|
+
// Focus must be on a row, and the row must clear the sticky header (not clipped behind it)
|
|
22
|
+
// while staying inside the scroll viewport.
|
|
23
|
+
await expect(geometry.hasRow).toBe(true);
|
|
24
|
+
await expect(geometry.rowTop).toBeGreaterThanOrEqual(geometry.headerBottom - 1);
|
|
25
|
+
await expect(geometry.rowTop).toBeGreaterThanOrEqual(geometry.containerTop - 1);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('02: first row fully visible below header when reached via upward nav', async () => {
|
|
29
|
+
// Continue upward past the top; extra presses at the first row are no-ops.
|
|
30
|
+
await DSDataTableCO.pressArrow('up', 30);
|
|
31
|
+
|
|
32
|
+
const geometry = await DSDataTableCO.getUpwardNavGeometry();
|
|
33
|
+
// The scroll container is at the very top, yet the focused first row still clears the header.
|
|
34
|
+
await expect(geometry.hasRow).toBe(true);
|
|
35
|
+
await expect(geometry.scrollTop).toBeLessThanOrEqual(1);
|
|
36
|
+
await expect(geometry.rowTop).toBeGreaterThanOrEqual(geometry.headerBottom - 1);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Key } from 'webdriverio';
|
|
2
2
|
import DSDataTableCO from '../DSDataTableCO';
|
|
3
3
|
import DSMenuButtonCO from '../../ds-menu-button/DSMenuButtonCO';
|
|
4
|
-
import { safeDismissAlert } from '../../helpers';
|
|
5
4
|
|
|
6
5
|
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
7
6
|
describe('PUI-16414 - DataTable, MenuButton (keyboard) - Functional Test', async () => {
|
|
@@ -29,12 +28,14 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
29
28
|
it('03: should trigger menuButton item with keyboard', async () => {
|
|
30
29
|
await browser.keys(Key.ArrowUp);
|
|
31
30
|
await browser.keys(Key.Return);
|
|
32
|
-
const
|
|
33
|
-
await
|
|
31
|
+
const result = await DSDataTableCO.getRowActionResult();
|
|
32
|
+
await result.waitForDisplayed();
|
|
33
|
+
await expect(result).toHaveText('item selected: log actions');
|
|
34
34
|
});
|
|
35
35
|
it('03: should expand menuButton submenu for datatable row with keyboard', async () => {
|
|
36
|
-
await safeDismissAlert();
|
|
37
36
|
await browser.keys(Key.Return);
|
|
37
|
+
const menuRoot = await DSMenuButtonCO.getMenuRoot();
|
|
38
|
+
await menuRoot.waitForDisplayed();
|
|
38
39
|
await browser.keys(Key.ArrowDown);
|
|
39
40
|
const menuItems = (await DSMenuButtonCO.getMenuItems()).length;
|
|
40
41
|
await expect(menuItems).toEqual(6);
|
|
@@ -42,11 +43,11 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
42
43
|
it('04: should trigger menuButton submenu item with keyboard', async () => {
|
|
43
44
|
await browser.keys(Key.ArrowRight);
|
|
44
45
|
await browser.keys(Key.Return);
|
|
45
|
-
const
|
|
46
|
-
await
|
|
46
|
+
const result = await DSDataTableCO.getRowActionResult();
|
|
47
|
+
await result.waitForDisplayed();
|
|
48
|
+
await expect(result).toHaveText('item selected: Realtor Phone - (424) 000-0000');
|
|
47
49
|
});
|
|
48
50
|
it('05: should close menuButton menu with keyboard', async () => {
|
|
49
|
-
await safeDismissAlert();
|
|
50
51
|
await browser.keys(Key.Return);
|
|
51
52
|
const menu = await DSMenuButtonCO.getMenuRoot();
|
|
52
53
|
await menu.waitForDisplayed();
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import DSDataTableCO from '../DSDataTableCO';
|
|
2
|
-
import { safeDismissAlert } from '../../helpers';
|
|
3
2
|
import CellCO from '../components/CellCO';
|
|
4
3
|
import DSMenuButtonCO from '../../ds-menu-button/DSMenuButtonCO';
|
|
5
4
|
|
|
@@ -21,11 +20,11 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
21
20
|
it('02: should trigger menuButton item', async () => {
|
|
22
21
|
const thirdItem = await DSMenuButtonCO.getMenuItemWrapper(2);
|
|
23
22
|
await thirdItem.click();
|
|
24
|
-
const
|
|
25
|
-
await
|
|
23
|
+
const result = await DSDataTableCO.getRowActionResult();
|
|
24
|
+
await result.waitForDisplayed();
|
|
25
|
+
await expect(result).toHaveText('item selected: sms');
|
|
26
26
|
});
|
|
27
27
|
it('03: should expand menuButton submenu for datatable row', async () => {
|
|
28
|
-
await safeDismissAlert();
|
|
29
28
|
const menuButtonTrigger = await DSDataTableCO.getButtons(2);
|
|
30
29
|
await menuButtonTrigger.click();
|
|
31
30
|
const submenuTriggerItem = await DSMenuButtonCO.getMenuItemWrapper(1);
|
|
@@ -39,11 +38,11 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
39
38
|
it('04: should trigger menuButton submenu item', async () => {
|
|
40
39
|
const submenuItem = await DSMenuButtonCO.getMenuItemWrapper(5);
|
|
41
40
|
await submenuItem.click();
|
|
42
|
-
const
|
|
43
|
-
await
|
|
41
|
+
const result = await DSDataTableCO.getRowActionResult();
|
|
42
|
+
await result.waitForDisplayed();
|
|
43
|
+
await expect(result).toHaveText('item selected: Realtor Phone - (424) 000-0000');
|
|
44
44
|
});
|
|
45
45
|
it('05: should close menuButton flyout clicking outside the menu (cell for example)', async () => {
|
|
46
|
-
await safeDismissAlert();
|
|
47
46
|
const menuButtonTrigger = await DSDataTableCO.getButtons(2);
|
|
48
47
|
await menuButtonTrigger.click();
|
|
49
48
|
const menu = await DSMenuButtonCO.getMenuRoot();
|
|
@@ -14,8 +14,9 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
14
14
|
});
|
|
15
15
|
it('01: should have the previous page button disabled', async () => {
|
|
16
16
|
const prevPageBt = await PaginationNavCO.getPrevPageBt();
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
// DSButtonV3 renders the native `disabled` attribute and intentionally omits aria-disabled
|
|
18
|
+
// (that is reserved for applyAriaDisabled/readOnly), so assert the native disabled state.
|
|
19
|
+
await expect(prevPageBt).toBeDisabled();
|
|
19
20
|
});
|
|
20
21
|
it('02: should expand the dropdown menu of the pages per component when clicking its button', async () => {
|
|
21
22
|
const elemsPerPage = await PaginationNavCO.getElemsPerPageMenu();
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Key } from 'webdriverio';
|
|
2
|
+
import { sendKeyRepeat } from '../../helpers';
|
|
3
|
+
import DSDataTableCO from '../DSDataTableCO';
|
|
4
|
+
import { HeaderCO } from '../components';
|
|
5
|
+
|
|
6
|
+
// Coverage for PUI-12696 (fixed): a keyboard double-delta commit in useHeaderResizer let the last
|
|
7
|
+
// column resize below its declared minWidth, so the resize handle overlapped the header title.
|
|
8
|
+
// The resizableWithConstrains story sets minWidth: 100 / maxWidth: 300 on all 7 columns, so the
|
|
9
|
+
// last column (dateRange, index 6) must clamp at 100 no matter how hard it is shrunk.
|
|
10
|
+
const LAST_COLUMN_INDEX = 6;
|
|
11
|
+
|
|
12
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
13
|
+
describe('PUI-18764 - DSDataTable:: last column resize clamps at minWidth - Func', () => {
|
|
14
|
+
before(async () => {
|
|
15
|
+
const errorOnGo = await DSDataTableCO.resizableWithConstrains.go();
|
|
16
|
+
if (errorOnGo) throw errorOnGo;
|
|
17
|
+
await DSDataTableCO.waitForDataTable();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('01: keyboard Shift+Alt+ArrowLeft should not shrink last column below minWidth', async () => {
|
|
21
|
+
// Focus the last column's resize handle: click its header, then Return focuses the handle
|
|
22
|
+
// directly (no drag/filter/sort child precedes it on this story) — same flow as PUI-11345.
|
|
23
|
+
const lastHeader = await HeaderCO.getHeaderCellByIndex(LAST_COLUMN_INDEX);
|
|
24
|
+
await lastHeader.click();
|
|
25
|
+
await browser.keys(Key.Return);
|
|
26
|
+
await expect(await HeaderCO.getLastResizeHandler()).toBeFocused();
|
|
27
|
+
|
|
28
|
+
// Each Shift+Alt+ArrowLeft is -50px; 6 presses drives well past the 100px floor.
|
|
29
|
+
await sendKeyRepeat([Key.Shift, Key.Alt, Key.ArrowLeft], 6);
|
|
30
|
+
|
|
31
|
+
await browser.waitUntil(
|
|
32
|
+
async () => {
|
|
33
|
+
const resizer = await HeaderCO.getLastResizeHandler();
|
|
34
|
+
const valueNow = Number(await resizer.getAttribute('aria-valuenow'));
|
|
35
|
+
const valueMin = Number(await resizer.getAttribute('aria-valuemin'));
|
|
36
|
+
return valueNow === valueMin;
|
|
37
|
+
},
|
|
38
|
+
{ timeout: 5000, timeoutMsg: 'last column did not clamp at minWidth after keyboard shrink' },
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const resizer = await HeaderCO.getLastResizeHandler();
|
|
42
|
+
const valueNow = Number(await resizer.getAttribute('aria-valuenow'));
|
|
43
|
+
const valueMin = Number(await resizer.getAttribute('aria-valuemin'));
|
|
44
|
+
// aria-valuenow mirrors the committed column width, so clamping at aria-valuemin (100) is the
|
|
45
|
+
// deterministic guard that the width was NOT reduced beyond its minimum limit (PUI-12696).
|
|
46
|
+
expect(valueNow).toBe(valueMin); // committed width clamped exactly at the floor
|
|
47
|
+
expect(valueNow).toBeGreaterThanOrEqual(100); // never below the declared minWidth
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('02: mouse drag should not shrink last column below minWidth', async () => {
|
|
51
|
+
// Widen first so the following shrink is a real reduction, then drag well past the floor.
|
|
52
|
+
await (await HeaderCO.getLastResizeHandler()).dragAndDrop({ x: 120, y: 0 });
|
|
53
|
+
await (await HeaderCO.getLastResizeHandler()).dragAndDrop({ x: -400, y: 0 });
|
|
54
|
+
|
|
55
|
+
await browser.waitUntil(
|
|
56
|
+
async () => {
|
|
57
|
+
const resizer = await HeaderCO.getLastResizeHandler();
|
|
58
|
+
const valueNow = Number(await resizer.getAttribute('aria-valuenow'));
|
|
59
|
+
const valueMin = Number(await resizer.getAttribute('aria-valuemin'));
|
|
60
|
+
return valueNow === valueMin;
|
|
61
|
+
},
|
|
62
|
+
{ timeout: 5000, timeoutMsg: 'last column did not clamp at minWidth after mouse shrink' },
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const resizer = await HeaderCO.getLastResizeHandler();
|
|
66
|
+
const valueNow = Number(await resizer.getAttribute('aria-valuenow'));
|
|
67
|
+
const valueMin = Number(await resizer.getAttribute('aria-valuemin'));
|
|
68
|
+
expect(valueNow).toBe(valueMin);
|
|
69
|
+
expect(valueNow).toBeGreaterThanOrEqual(100);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Key } from 'webdriverio';
|
|
2
|
+
import DSDataTableCO from '../DSDataTableCO';
|
|
3
|
+
import { HeaderCO } from '../components';
|
|
4
|
+
import { axeCoreCheck } from '../../helpers';
|
|
5
|
+
|
|
6
|
+
// Axe-core for the resizable-column a11y contract (final shape in PUI-18812, was PUI-17786 /
|
|
7
|
+
// PUI-17784). The resize handle is aria-hidden until its header is "entered" (child-navigation
|
|
8
|
+
// mode), so the test enters the header first to expose the resizer to the accessibility tree before
|
|
9
|
+
// scanning — an idle, aria-hidden handle would be skipped by axe and the scan would prove nothing.
|
|
10
|
+
// The scan is what guards the bounded aria-value* set: a native range input whose aria-valuenow
|
|
11
|
+
// fell outside aria-valuemin/aria-valuemax would trip aria-valid-attr-value.
|
|
12
|
+
// PUI-18812 removed the resizerA11yMode prop, so there is a single resizer shape to scan.
|
|
13
|
+
//
|
|
14
|
+
// PUI-18885: this describe was temporarily describe.skip'd. Making the handle a form element
|
|
15
|
+
// (PUI-18812) exposed it to axe's form rules, and naming it via aria-labelledby -> a display:none
|
|
16
|
+
// span left no labelText axe could resolve; with aria-describedby also present, that tripped
|
|
17
|
+
// label-title-only ("Form elements should have a visible label", serious / best-practice). The fix
|
|
18
|
+
// names the handle directly with aria-label, so the rule no longer applies and the scan is live
|
|
19
|
+
// again. It was never silenced via extraDisabledRules — that would have hidden the regression this
|
|
20
|
+
// scan exists to catch.
|
|
21
|
+
if (
|
|
22
|
+
(!browser.capabilities['ice:options'].isPhone &&
|
|
23
|
+
!browser.capabilities['ice:options'].isTablet &&
|
|
24
|
+
browser.capabilities.browserName === 'chrome') ||
|
|
25
|
+
browser.capabilities.browserName === 'Chrome'
|
|
26
|
+
) {
|
|
27
|
+
describe('PUI-18750 - DSDataTable:: resizer native range input a11y contract - Axe-Core', () => {
|
|
28
|
+
before(async () => {
|
|
29
|
+
const errorOnGo = await DSDataTableCO.resizerSeparatorMode.go();
|
|
30
|
+
if (errorOnGo) throw errorOnGo;
|
|
31
|
+
await DSDataTableCO.waitForDataTable();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('01: should have no accessibility violations with the resizer exposed', async () => {
|
|
35
|
+
const header = await HeaderCO.getHeaderCellByIndex(1);
|
|
36
|
+
await header.click();
|
|
37
|
+
await browser.keys(Key.Return);
|
|
38
|
+
const result = await axeCoreCheck();
|
|
39
|
+
expect(result.length).toBe(0);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Key } from 'webdriverio';
|
|
2
|
+
import DSDataTableCO from '../DSDataTableCO';
|
|
3
|
+
import { HeaderCO } from '../components';
|
|
4
|
+
|
|
5
|
+
// Tests for the resizable-column a11y contract, final shape landed in PUI-18812 (was PUI-17786 /
|
|
6
|
+
// PUI-17784). The "50" bug (PUI-15786): the resizer was an <input type="range"> whose *default*
|
|
7
|
+
// value (50) was announced next to the column name. PUI-18812 keeps the native range element — the
|
|
8
|
+
// a11y-approved semantics — but drives it through DSInputText with a bounded aria-value* set and an
|
|
9
|
+
// accessible name "Resize {Header} column", so no stray "50" is ever announced.
|
|
10
|
+
// PUI-18812 also removed the resizerA11yMode prop: there is no longer a separator/slider choice, so
|
|
11
|
+
// the ARIA contract below is the single shape for every resizer.
|
|
12
|
+
// PUI-18885 changed how that name is supplied — aria-label on the handle itself instead of
|
|
13
|
+
// aria-labelledby pointing at a display:none span — because the indirection through a hidden node
|
|
14
|
+
// gave axe no resolvable labelText and tripped label-title-only on the native range input.
|
|
15
|
+
if (
|
|
16
|
+
(!browser.capabilities['ice:options'].isPhone &&
|
|
17
|
+
!browser.capabilities['ice:options'].isTablet &&
|
|
18
|
+
browser.capabilities.browserName === 'chrome') ||
|
|
19
|
+
browser.capabilities.browserName === 'Chrome'
|
|
20
|
+
) {
|
|
21
|
+
describe('PUI-18748 - DSDataTable:: resizer native range input a11y contract - Func', () => {
|
|
22
|
+
before(async () => {
|
|
23
|
+
const errorOnGo = await DSDataTableCO.resizerSeparatorMode.go();
|
|
24
|
+
if (errorOnGo) throw errorOnGo;
|
|
25
|
+
await DSDataTableCO.waitForDataTable();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('01: should expose a native range input with bounded value and accessible name', async () => {
|
|
29
|
+
const resizer = await HeaderCO.getResizer(1);
|
|
30
|
+
await expect(resizer).toBeExisting();
|
|
31
|
+
|
|
32
|
+
// PUI-18812: the handle is a native <input type="range"> rendered through DSInputText. The
|
|
33
|
+
// data-testid lands on that inner input, so this element IS the range control. Native range
|
|
34
|
+
// semantics are relied on deliberately — no role override, which is why role must be absent
|
|
35
|
+
// (a hardcoded role here would shadow the native one).
|
|
36
|
+
expect((await resizer.getTagName()).toLowerCase()).toBe('input');
|
|
37
|
+
await expect(resizer).toHaveAttribute('type', 'range');
|
|
38
|
+
expect(await resizer.getAttribute('role')).toBe(null);
|
|
39
|
+
expect(await resizer.getAttribute('aria-roledescription')).toBe(null);
|
|
40
|
+
|
|
41
|
+
await expect(resizer).toHaveAttribute('aria-valuemin', '70');
|
|
42
|
+
await expect(resizer).toHaveAttribute('aria-valuemax', '600');
|
|
43
|
+
|
|
44
|
+
// Validate the value by SHAPE, not a fixed number: the width is not deterministic across
|
|
45
|
+
// layouts. The point is that it is a real, bounded width (the fix) and NOT the stray "50"
|
|
46
|
+
// the range input's *default* value announced before PUI-15786.
|
|
47
|
+
const valueNow = await resizer.getAttribute('aria-valuenow'); // current width as string, e.g. "150"
|
|
48
|
+
expect(/^\d+$/.test(valueNow)).toBe(true); // digits only: a real value, not empty/null/"150px"
|
|
49
|
+
expect(Number(valueNow)).toBeGreaterThanOrEqual(70); // >= aria-valuemin (70): the "50" guard
|
|
50
|
+
const valueText = await resizer.getAttribute('aria-valuetext'); // SR text, e.g. "150 pixels"
|
|
51
|
+
expect(/^\d+ pixels$/.test(valueText)).toBe(true); // must read "<width> pixels"
|
|
52
|
+
|
|
53
|
+
// PUI-18885: the name is supplied directly via aria-label. It used to be wired through
|
|
54
|
+
// aria-labelledby -> a display:none span, which left axe unable to resolve a labelText and
|
|
55
|
+
// tripped label-title-only on this form element (see the axe-core sibling spec). aria-labelledby
|
|
56
|
+
// must stay absent: reintroducing it would both shadow this name and bring the violation back.
|
|
57
|
+
// This asserts the attribute VALUE only; whether the browser computes a name from it is asserted
|
|
58
|
+
// in test 02, where the handle is exposed to the accessibility tree. It cannot be asserted here:
|
|
59
|
+
// at rest the handle is aria-hidden, so it has no computed name by design and a computed-name
|
|
60
|
+
// check would fail for the wrong reason.
|
|
61
|
+
expect(await resizer.getAttribute('aria-labelledby')).toBe(null);
|
|
62
|
+
await expect(resizer).toHaveAttribute('aria-label', 'Resize Name column');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('02: should update aria-valuenow when resizing with the keyboard', async () => {
|
|
66
|
+
const nameHeader = await HeaderCO.getHeaderCellByIndex(1);
|
|
67
|
+
await nameHeader.click();
|
|
68
|
+
// Enter on the header focuses its resize handle directly (no drag/filter/sort child to precede it).
|
|
69
|
+
await browser.keys(Key.Return);
|
|
70
|
+
const resizer = await HeaderCO.getResizer(1);
|
|
71
|
+
await expect(resizer).toBeFocused();
|
|
72
|
+
|
|
73
|
+
// Disclosure guard. At rest every handle is tabindex="-1" + aria-hidden="true" (isReachable
|
|
74
|
+
// false), so the ARIA contract test 01 asserts is correct but not yet perceivable — by design,
|
|
75
|
+
// to keep idle resizers out of the AT tree. Once focused the handle must be exposed: a focused
|
|
76
|
+
// element left aria-hidden is a real a11y defect, and toBeFocused() alone would still pass.
|
|
77
|
+
await expect(resizer).toHaveAttribute('tabindex', '0');
|
|
78
|
+
expect(await resizer.getAttribute('aria-hidden')).toBe(null);
|
|
79
|
+
|
|
80
|
+
// The accessible name the browser actually computes, now that the handle is in the
|
|
81
|
+
// accessibility tree. This is the assertion that matters: test 01 only proves the aria-label
|
|
82
|
+
// attribute is present with the right text, which would still pass if something else (a
|
|
83
|
+
// reintroduced aria-labelledby, a native label association) shadowed it in the accname
|
|
84
|
+
// algorithm. A focused control with no computed name is a WCAG 4.1.2 failure, so it is asserted
|
|
85
|
+
// against the browser's own computation via WebDriver's Get Computed Label, not re-derived from
|
|
86
|
+
// the DOM.
|
|
87
|
+
const computedName = await HeaderCO.getResizerComputedName(resizer);
|
|
88
|
+
expect(computedName).toContain('Resize Name column');
|
|
89
|
+
|
|
90
|
+
const before = Number(await resizer.getAttribute('aria-valuenow'));
|
|
91
|
+
await browser.keys(Key.ArrowRight);
|
|
92
|
+
await browser.waitUntil(async () => Number(await resizer.getAttribute('aria-valuenow')) > before, {
|
|
93
|
+
timeout: 5000,
|
|
94
|
+
timeoutMsg: 'aria-valuenow did not increase after ArrowRight',
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
package/ds-data-table-async/textwrapping/DSDataTable.header-wrap-alignment.axe-core.func.spec.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import DSDataTableCO from '../DSDataTableCO';
|
|
2
|
+
import { axeCoreCheck } from '../../helpers';
|
|
3
|
+
|
|
4
|
+
// Accessibility coverage for the PUI-17819 header wrap/alignment showcase.
|
|
5
|
+
if (
|
|
6
|
+
(!browser.capabilities['ice:options'].isPhone &&
|
|
7
|
+
!browser.capabilities['ice:options'].isTablet &&
|
|
8
|
+
browser.capabilities.browserName === 'Chrome') ||
|
|
9
|
+
browser.capabilities.browserName === 'chrome'
|
|
10
|
+
) {
|
|
11
|
+
describe('PUI-18681 - DSDataTable:: header text wrap rules and alignment - axe-core', () => {
|
|
12
|
+
before('loading page', async () => {
|
|
13
|
+
const errorOnGo = await DSDataTableCO.headerWrapAlignment.go();
|
|
14
|
+
if (errorOnGo) throw errorOnGo;
|
|
15
|
+
await DSDataTableCO.waitForDataTable();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('01: should have no accessibility violations', async () => {
|
|
19
|
+
const result = await axeCoreCheck();
|
|
20
|
+
await expect(result.length).toBe(0);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Key } from 'webdriverio';
|
|
2
|
+
import DSDataTableCO from '../DSDataTableCO';
|
|
3
|
+
import { HeaderCO, RowCO } from '../components';
|
|
4
|
+
|
|
5
|
+
// Column indices in the HeaderWrapAlignment story:
|
|
6
|
+
// 0=id, 1=name, 2=wrap ('wrap'), 3=wrapAll ('wrap-all'), 4=truncate ('truncate')
|
|
7
|
+
const WRAP_ALL_COL = 3;
|
|
8
|
+
// Filter buttons render only on searchable columns (wrap, wrapAll, truncate) → wrapAll is index 1
|
|
9
|
+
const WRAP_ALL_FILTER = 1;
|
|
10
|
+
|
|
11
|
+
// Header control focus order (Enter on the focused header → then Tab):
|
|
12
|
+
// 1. DnD handle 2. search/filter button 3. sort caret 4. resize handle
|
|
13
|
+
// Tests for PUI-17819 (header wrap rules + alignment fix). Unblocks PUI-17814 (name/search-icon overlap).
|
|
14
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
15
|
+
describe('PUI-18680 - DSDataTable:: header text wrap rules and alignment - visual', () => {
|
|
16
|
+
before('loading page', async () => {
|
|
17
|
+
const errorOnGo = await DSDataTableCO.headerWrapAlignment.go();
|
|
18
|
+
if (errorOnGo) throw errorOnGo;
|
|
19
|
+
await DSDataTableCO.waitForDataTable();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('01: should render wrap / wrap-all / truncate headers top-aligned', async () => {
|
|
23
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
24
|
+
await expect(snapshot).toEqual(0);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('02: should keep header title top-aligned with revealed icons on hover', async () => {
|
|
28
|
+
const wrapAllHeader = await HeaderCO.getHeaderCellByIndex(WRAP_ALL_COL);
|
|
29
|
+
await wrapAllHeader.moveTo();
|
|
30
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
31
|
+
await expect(snapshot).toEqual(0);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('03: should keep wrapped header aligned after clicking the column to sort it', async () => {
|
|
35
|
+
// sort by clicking the column header itself (not the sort caret) — the realistic interaction.
|
|
36
|
+
// The click also focuses the header, which sets up the focus walk in the next steps.
|
|
37
|
+
const wrapAllHeader = await HeaderCO.getHeaderCellByIndex(WRAP_ALL_COL);
|
|
38
|
+
await wrapAllHeader.click();
|
|
39
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
40
|
+
await expect(snapshot).toEqual(0);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('04: should focus the drag-and-drop handle first when entering the header', async () => {
|
|
44
|
+
// Enter activates the header tab stops and focuses the first control (the DnD handle)
|
|
45
|
+
await browser.keys(Key.Return);
|
|
46
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
47
|
+
await expect(snapshot).toEqual(0);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('05: should move focus to the search/filter button on Tab', async () => {
|
|
51
|
+
await browser.keys(Key.Tab);
|
|
52
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
53
|
+
await expect(snapshot).toEqual(0);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('06: should move focus to the sort caret on Tab', async () => {
|
|
57
|
+
await browser.keys(Key.Tab);
|
|
58
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
59
|
+
await expect(snapshot).toEqual(0);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('07: should move focus to the resize handle on Tab', async () => {
|
|
63
|
+
await browser.keys(Key.Tab);
|
|
64
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
65
|
+
await expect(snapshot).toEqual(0);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('08: should keep wrapped header aligned while the filter/search is open', async () => {
|
|
69
|
+
const filterBtn = await HeaderCO.getFilterBtnByIndex(WRAP_ALL_FILTER);
|
|
70
|
+
await filterBtn.click();
|
|
71
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
72
|
+
await expect(snapshot).toEqual(0);
|
|
73
|
+
await browser.keys(Key.Escape);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('09: should keep wrapped header aligned while the DnD handle is engaged', async () => {
|
|
77
|
+
const wrapAllHeader = await HeaderCO.getHeaderCellByIndex(WRAP_ALL_COL);
|
|
78
|
+
const dragHandle = await HeaderCO.getHeaderCellDragHandler(wrapAllHeader);
|
|
79
|
+
await dragHandle.click();
|
|
80
|
+
// keyboard pick-up renders a deterministic drag overlay (dnd-kit)
|
|
81
|
+
await browser.keys(Key.Space);
|
|
82
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
83
|
+
await expect(snapshot).toEqual(0);
|
|
84
|
+
await browser.keys(Key.Escape);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('10: should keep wrapped headers intact with a row toolbar menu open', async () => {
|
|
88
|
+
const toolbarTrigger = await RowCO.getRowToolbarTriggerByIndex(0);
|
|
89
|
+
await toolbarTrigger.click();
|
|
90
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
91
|
+
await expect(snapshot).toEqual(0);
|
|
92
|
+
await browser.keys(Key.Escape);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('11: should keep wrapped header aligned while a column is resized narrower', async () => {
|
|
96
|
+
// PUI-12696 (open): resizing a column below its min makes the resize handler overlap the
|
|
97
|
+
// header title. This captures current behavior; update the baseline when PUI-12696 lands.
|
|
98
|
+
// Kept last: the extra-tall header it produces would otherwise obscure the row toolbar
|
|
99
|
+
// trigger and break the coordinate-based click in the toolbar step.
|
|
100
|
+
const resizeHandler = await HeaderCO.getResizeHandler(WRAP_ALL_COL);
|
|
101
|
+
await resizeHandler.dragAndDrop({ x: -150, y: 0 });
|
|
102
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
103
|
+
await expect(snapshot).toEqual(0);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import DSDataTableCO from '../DSDataTableCO';
|
|
2
|
+
import { RowCO } from '../components';
|
|
3
|
+
|
|
4
|
+
// Global textWrap='wrap' together with a row-actions (toolbar) column — mirrors the
|
|
5
|
+
// Components/DataTable/Features/Text Wrapping > Text Wrap Global showcase.
|
|
6
|
+
// Tests for PUI-17819 (header wrap rules + alignment fix).
|
|
7
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
8
|
+
describe('PUI-18682 - DSDataTable:: text wrap with row toolbar column - visual', () => {
|
|
9
|
+
before('loading page', async () => {
|
|
10
|
+
const errorOnGo = await DSDataTableCO.textWrapGlobalWithToolbar.go();
|
|
11
|
+
if (errorOnGo) throw errorOnGo;
|
|
12
|
+
await DSDataTableCO.waitForDataTable();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('01: should wrap all columns with the row toolbar column present', async () => {
|
|
16
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
17
|
+
await expect(snapshot).toEqual(0);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('02: should keep cells wrapped while a row toolbar menu is open', async () => {
|
|
21
|
+
const toolbarTrigger = await RowCO.getRowToolbarTriggerByIndex(0);
|
|
22
|
+
await toolbarTrigger.click();
|
|
23
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
24
|
+
await expect(snapshot).toEqual(0);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
package/ds-data-table-async/toggle-cell-focus/DSDataTable.toggle-cell-enter-focus.func.spec.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Key } from 'webdriverio';
|
|
2
|
+
import DSDataTableCO from '../DSDataTableCO';
|
|
3
|
+
import { RowCO, CellCO } from '../components';
|
|
4
|
+
import DSToggleCO from '../../ds-form-toggle/DSToggleCO';
|
|
5
|
+
|
|
6
|
+
// Coverage for PUI-14730 (fixed): a toggle (DSControlledToggle) used as a custom cell did not
|
|
7
|
+
// receive focus on the first Enter — it dropped its ref (containerProps only reached the wrapper
|
|
8
|
+
// div; innerRef was discarded). Fixed in ds-form-toggle by forwarding innerRef to the underlying
|
|
9
|
+
// <button role="switch">. The story renders the toggle as the FIRST focusable cell, so Enter on a
|
|
10
|
+
// focused row must land focus on the toggle button (row.cells.find(c => c.ref.current).focus()).
|
|
11
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
12
|
+
describe('PUI-18783 - DSDataTable:: toggle custom cell focus on row Enter - Func', () => {
|
|
13
|
+
before(async () => {
|
|
14
|
+
const errorOnGo = await DSDataTableCO.toggleCellEnterFocus.go();
|
|
15
|
+
if (errorOnGo) throw errorOnGo;
|
|
16
|
+
await DSDataTableCO.waitForDataTable();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('01: pressing Enter on a focused row moves focus to the toggle custom cell', async () => {
|
|
20
|
+
// Focus the row by clicking its first cell (the focusable row-content, role="row", receives
|
|
21
|
+
// focus), then press Enter — matches the editable-cell Enter-to-first-cell pattern.
|
|
22
|
+
const row = await RowCO.getRowByIndex(0);
|
|
23
|
+
const firstCell = await CellCO.getRowCellByIndex(row, 0);
|
|
24
|
+
await firstCell.click();
|
|
25
|
+
await browser.keys(Key.Return);
|
|
26
|
+
|
|
27
|
+
const toggle = await DSToggleCO.getToggleFocuseableByIndex(0);
|
|
28
|
+
await expect(toggle).toBeFocused();
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
@@ -74,6 +74,8 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
74
74
|
await browser.keys(Key.Return);
|
|
75
75
|
await browser.keys(Key.ArrowDown);
|
|
76
76
|
await browser.keys(Key.Return);
|
|
77
|
+
await browser.keys(Key.ArrowDown);
|
|
78
|
+
await browser.keys(Key.Return);
|
|
77
79
|
await FiltersCO.openFilterPopperByColumnName('name', 0);
|
|
78
80
|
await browser.keys(Key.ArrowDown);
|
|
79
81
|
await browser.keys(Key.Return);
|
|
@@ -65,8 +65,7 @@ if (!browser.capabilities['ice:options'].isPhone) {
|
|
|
65
65
|
|
|
66
66
|
// fails on firefox due to fake-positive of infinte loop
|
|
67
67
|
if (browser.capabilities.browserName !== 'Firefox') {
|
|
68
|
-
|
|
69
|
-
describe.skip('PUI-9401 - DSDataViz, TimeLinear axis -Visual', () => {
|
|
68
|
+
describe('PUI-9401 - DSDataViz, TimeLinear axis -Visual', () => {
|
|
70
69
|
before('loading page', async () => {
|
|
71
70
|
const errorOnGo = await DSDataVizCO.timeLinearAxis.go();
|
|
72
71
|
if (errorOnGo) throw errorOnGo;
|
|
@@ -62,8 +62,7 @@ if (!browser.capabilities['ice:options'].isPhone) {
|
|
|
62
62
|
});
|
|
63
63
|
});
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
describe.skip('PUI-10321 - DSDataViz, Force ticks -Visual', () => {
|
|
65
|
+
describe('PUI-10321 - DSDataViz, Force ticks -Visual', () => {
|
|
67
66
|
before('loading page', async () => {
|
|
68
67
|
const errorOnGo = await DSDataVizCO.forceTicks.go();
|
|
69
68
|
if (errorOnGo) throw errorOnGo;
|
|
@@ -25,6 +25,8 @@ export default class DSDatePickerCO extends PageObject {
|
|
|
25
25
|
|
|
26
26
|
static timeLinearAxis = new Urlbuilder(PATH_E2E_DATAVIZ_AXIS, 'time-linear-axis-test');
|
|
27
27
|
|
|
28
|
+
static timeLinearAxisAxe = new Urlbuilder(PATH_E2E_DATAVIZ_AXIS, 'time-linear-axis-axe-test');
|
|
29
|
+
|
|
28
30
|
// area
|
|
29
31
|
|
|
30
32
|
static basicArea = new Urlbuilder(PATH_E2E_DATAVIZ_AREA, 'basic-area-test');
|
|
@@ -29,7 +29,7 @@ if (
|
|
|
29
29
|
|
|
30
30
|
describe('PUI-11371 - DSDataViz, TimeLinear axis -AxeCore', () => {
|
|
31
31
|
before('loading page', async () => {
|
|
32
|
-
const errorOnGo = await DSDataVizCO.
|
|
32
|
+
const errorOnGo = await DSDataVizCO.timeLinearAxisAxe.go();
|
|
33
33
|
if (errorOnGo) throw errorOnGo;
|
|
34
34
|
});
|
|
35
35
|
it('01: should display a chart with time-linear axis and pass axe-core scan', async () => {
|
|
@@ -10,6 +10,8 @@ export default class DSFloatingContextCO extends PageObject {
|
|
|
10
10
|
|
|
11
11
|
static slotsURL = new Urlbuilder(PATH_E2E_FLOATING_CONTEXT, 'slots-test');
|
|
12
12
|
|
|
13
|
+
static positionsTestURL = new Urlbuilder(PATH_E2E_FLOATING_CONTEXT, 'positions-test');
|
|
14
|
+
|
|
13
15
|
static async getFloatingContextWrapper() {
|
|
14
16
|
return $('[data-testid="ds-floating-wrapper-root"]');
|
|
15
17
|
}
|
|
@@ -18,6 +20,14 @@ export default class DSFloatingContextCO extends PageObject {
|
|
|
18
20
|
return $('[data-testid="ds-floatingwrapper-content"]');
|
|
19
21
|
}
|
|
20
22
|
|
|
23
|
+
static async getFloatingContextContents() {
|
|
24
|
+
return $$('[data-testid="ds-floatingwrapper-content"]');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
static async getHelpButtons() {
|
|
28
|
+
return $$('[aria-label="Help"]');
|
|
29
|
+
}
|
|
30
|
+
|
|
21
31
|
static async getFloatingContextArrowSlot() {
|
|
22
32
|
return $('[data-dimsum-slot="dsFloatingwrapperArrow"]');
|
|
23
33
|
}
|