@wix/patterns-fields 1.108.0 → 1.110.0
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/dist/cjs/components/address/input/address-input.st.css.js +3 -3
- package/dist/cjs/components/address/input/address-input.st.css.js.map +1 -1
- package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js +3 -3
- package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js.map +1 -1
- package/dist/cjs/components/audio/audio-field/form-audio-field.st.css.js +4 -4
- package/dist/cjs/components/audio/audio-field/form-audio-field.st.css.js.map +1 -1
- package/dist/cjs/components/audio/audio-player/audio-player.st.css.js +2 -2
- package/dist/cjs/components/audio/audio-player/audio-player.st.css.js.map +1 -1
- package/dist/cjs/components/boolean/cell-checkbox.js +15 -6
- package/dist/cjs/components/boolean/cell-checkbox.js.map +1 -1
- package/dist/cjs/components/color-view/cell-color-view.st.css.js +3 -3
- package/dist/cjs/components/color-view/cell-color-view.st.css.js.map +1 -1
- package/dist/cjs/components/color-view/color-view.st.css.js +4 -4
- package/dist/cjs/components/color-view/color-view.st.css.js.map +1 -1
- package/dist/cjs/components/date-input/cell-date-input.js +21 -2
- package/dist/cjs/components/date-input/cell-date-input.js.map +1 -1
- package/dist/cjs/components/date-input/date-picker-internals.js +93 -3
- package/dist/cjs/components/date-input/date-picker-internals.js.map +1 -1
- package/dist/cjs/components/date-input/form-date-input.driver.js +2 -0
- package/dist/cjs/components/date-input/form-date-input.driver.js.map +1 -1
- package/dist/cjs/components/date-input/form-date-input.js +23 -6
- package/dist/cjs/components/date-input/form-date-input.js.map +1 -1
- package/dist/cjs/components/date-input/use-field-value-replacement.js +48 -0
- package/dist/cjs/components/date-input/use-field-value-replacement.js.map +1 -0
- package/dist/cjs/components/datetime-input/form-date-time.driver.js +3 -0
- package/dist/cjs/components/datetime-input/form-date-time.driver.js.map +1 -1
- package/dist/cjs/components/datetime-input/form-date-time.js +61 -24
- package/dist/cjs/components/datetime-input/form-date-time.js.map +1 -1
- package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js +3 -3
- package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js.map +1 -1
- package/dist/cjs/components/document/form-document-field.st.css.js +7 -7
- package/dist/cjs/components/document/form-document-field.st.css.js.map +1 -1
- package/dist/cjs/components/exclamation/exclamation.st.css.js +5 -5
- package/dist/cjs/components/exclamation/exclamation.st.css.js.map +1 -1
- package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js +5 -5
- package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js.map +1 -1
- package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js +3 -3
- package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js.map +1 -1
- package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js +2 -2
- package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js.map +1 -1
- package/dist/cjs/components/media-control/paste-url-button.st.css.js +4 -4
- package/dist/cjs/components/media-control/paste-url-button.st.css.js.map +1 -1
- package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js +10 -10
- package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js.map +1 -1
- package/dist/cjs/components/media-image/media-image.st.css.js +4 -4
- package/dist/cjs/components/media-image/media-image.st.css.js.map +1 -1
- package/dist/cjs/components/media-image/overlays/overlay.st.css.js +3 -3
- package/dist/cjs/components/media-image/overlays/overlay.st.css.js.map +1 -1
- package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
- package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js.map +1 -1
- package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js +3 -3
- package/dist/cjs/components/multi-document/cell-multi-document-edit.st.css.js.map +1 -1
- package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js +5 -5
- package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js.map +1 -1
- package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js +2 -2
- package/dist/cjs/components/reference/cell-multi-reference-input.st.css.js.map +1 -1
- package/dist/cjs/components/reference/cell-reference-input.st.css.js +3 -3
- package/dist/cjs/components/reference/cell-reference-input.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/cell-rich-content-input.js +12 -9
- package/dist/cjs/components/rich-content/cell-rich-content-input.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +4 -4
- package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +3 -3
- package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
- package/dist/cjs/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +3 -3
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +3 -3
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.js +23 -17
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +7 -7
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +5 -5
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js.map +1 -1
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +4 -4
- package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js.map +1 -1
- package/dist/cjs/components/rich-text/cell-rich-text-editor.js +21 -5
- package/dist/cjs/components/rich-text/cell-rich-text-editor.js.map +1 -1
- package/dist/cjs/components/rich-text/cell-rich-text-input.js +15 -7
- package/dist/cjs/components/rich-text/cell-rich-text-input.js.map +1 -1
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +18 -18
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js.map +1 -1
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +4 -4
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js.map +1 -1
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +18 -18
- package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js.map +1 -1
- package/dist/cjs/components/text/form-short-text.js +1 -1
- package/dist/cjs/components/text/form-short-text.js.map +1 -1
- package/dist/cjs/components/text/text-view.st.css.js +3 -3
- package/dist/cjs/components/text/text-view.st.css.js.map +1 -1
- package/dist/cjs/styles.global.css +1 -1
- package/dist/cjs/utils/keyboard.js +12 -0
- package/dist/cjs/utils/keyboard.js.map +1 -0
- package/dist/esm/components/address/input/address-input.st.css.js +2 -2
- package/dist/esm/components/address/input/address-input.st.css.js.map +1 -1
- package/dist/esm/components/audio/actions/actions-menu/actions-menu.st.css.js +2 -2
- package/dist/esm/components/audio/audio-field/form-audio-field.st.css.js +2 -2
- package/dist/esm/components/audio/audio-player/audio-player.st.css.js +2 -2
- package/dist/esm/components/boolean/cell-checkbox.js +10 -4
- package/dist/esm/components/boolean/cell-checkbox.js.map +1 -1
- package/dist/esm/components/color-view/cell-color-view.st.css.js +2 -2
- package/dist/esm/components/color-view/color-view.st.css.js +2 -2
- package/dist/esm/components/date-input/cell-date-input.js +21 -2
- package/dist/esm/components/date-input/cell-date-input.js.map +1 -1
- package/dist/esm/components/date-input/date-picker-internals.js +67 -0
- package/dist/esm/components/date-input/date-picker-internals.js.map +1 -1
- package/dist/esm/components/date-input/form-date-input.driver.js +2 -0
- package/dist/esm/components/date-input/form-date-input.driver.js.map +1 -1
- package/dist/esm/components/date-input/form-date-input.js +25 -4
- package/dist/esm/components/date-input/form-date-input.js.map +1 -1
- package/dist/esm/components/date-input/use-field-value-replacement.js +48 -0
- package/dist/esm/components/date-input/use-field-value-replacement.js.map +1 -0
- package/dist/esm/components/datetime-input/form-date-time.driver.js +3 -0
- package/dist/esm/components/datetime-input/form-date-time.driver.js.map +1 -1
- package/dist/esm/components/datetime-input/form-date-time.js +51 -21
- package/dist/esm/components/datetime-input/form-date-time.js.map +1 -1
- package/dist/esm/components/delete-dialog/delete-dialog.st.css.js +2 -2
- package/dist/esm/components/delete-dialog/delete-dialog.st.css.js.map +1 -1
- package/dist/esm/components/document/form-document-field.st.css.js +2 -2
- package/dist/esm/components/exclamation/exclamation.st.css.js +2 -2
- package/dist/esm/components/highlighted-text/highlighted-text.st.css.js +3 -3
- package/dist/esm/components/highlighted-text/highlighted-text.st.css.js.map +1 -1
- package/dist/esm/components/image/thumbnail-replace-overlay.st.css.js +2 -2
- package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js +2 -2
- package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js.map +1 -1
- package/dist/esm/components/media-control/paste-url-button.st.css.js +2 -2
- package/dist/esm/components/media-control/paste-url-button.st.css.js.map +1 -1
- package/dist/esm/components/media-gallery/form-media-gallery-field.st.css.js +2 -2
- package/dist/esm/components/media-gallery/form-media-gallery-field.st.css.js.map +1 -1
- package/dist/esm/components/media-image/media-image.st.css.js +3 -3
- package/dist/esm/components/media-image/media-image.st.css.js.map +1 -1
- package/dist/esm/components/media-image/overlays/overlay.st.css.js +2 -2
- package/dist/esm/components/media-image/overlays/overlay.st.css.js.map +1 -1
- package/dist/esm/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
- package/dist/esm/components/multi-document/cell-multi-document-edit.st.css.js +2 -2
- package/dist/esm/components/multi-document/multi-document-input/form-multi-document.st.css.js +2 -2
- package/dist/esm/components/reference/cell-multi-reference-input.st.css.js +2 -2
- package/dist/esm/components/reference/cell-reference-input.st.css.js +2 -2
- package/dist/esm/components/reference/cell-reference-input.st.css.js.map +1 -1
- package/dist/esm/components/rich-content/cell-rich-content-input.js +11 -9
- package/dist/esm/components/rich-content/cell-rich-content-input.js.map +1 -1
- package/dist/esm/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js.map +1 -1
- package/dist/esm/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js.map +1 -1
- package/dist/esm/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.js +8 -2
- package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.js.map +1 -1
- package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +2 -2
- package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js.map +1 -1
- package/dist/esm/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +2 -2
- package/dist/esm/components/rich-text/cell-rich-text-editor.js +16 -1
- package/dist/esm/components/rich-text/cell-rich-text-editor.js.map +1 -1
- package/dist/esm/components/rich-text/cell-rich-text-input.js +8 -0
- package/dist/esm/components/rich-text/cell-rich-text-input.js.map +1 -1
- package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +2 -2
- package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +2 -2
- package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +2 -2
- package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js.map +1 -1
- package/dist/esm/components/text/form-short-text.js +1 -1
- package/dist/esm/components/text/form-short-text.js.map +1 -1
- package/dist/esm/components/text/text-view.st.css.js +2 -2
- package/dist/esm/components/text/text-view.st.css.js.map +1 -1
- package/dist/esm/styles.global.css +1 -1
- package/dist/esm/utils/keyboard.js +7 -0
- package/dist/esm/utils/keyboard.js.map +1 -0
- package/dist/types/components/address/input/address-input.st.css.d.ts.map +1 -1
- package/dist/types/components/boolean/cell-checkbox.d.ts +4 -1
- package/dist/types/components/boolean/cell-checkbox.d.ts.map +1 -1
- package/dist/types/components/date-input/cell-date-input.d.ts +4 -0
- package/dist/types/components/date-input/cell-date-input.d.ts.map +1 -1
- package/dist/types/components/date-input/date-picker-internals.d.ts +11 -1
- package/dist/types/components/date-input/date-picker-internals.d.ts.map +1 -1
- package/dist/types/components/date-input/form-date-input.d.ts.map +1 -1
- package/dist/types/components/date-input/form-date-input.driver.d.ts +2 -0
- package/dist/types/components/date-input/form-date-input.driver.d.ts.map +1 -1
- package/dist/types/components/date-input/use-field-value-replacement.d.ts +3 -0
- package/dist/types/components/date-input/use-field-value-replacement.d.ts.map +1 -0
- package/dist/types/components/datetime-input/form-date-time.d.ts.map +1 -1
- package/dist/types/components/datetime-input/form-date-time.driver.d.ts +3 -0
- package/dist/types/components/datetime-input/form-date-time.driver.d.ts.map +1 -1
- package/dist/types/components/delete-dialog/delete-dialog.st.css.d.ts.map +1 -1
- package/dist/types/components/highlighted-text/highlighted-text.st.css.d.ts.map +1 -1
- package/dist/types/components/media-control/cell-media-edit-shell.st.css.d.ts.map +1 -1
- package/dist/types/components/media-control/paste-url-button.st.css.d.ts.map +1 -1
- package/dist/types/components/media-gallery/form-media-gallery-field.st.css.d.ts.map +1 -1
- package/dist/types/components/media-image/media-image.st.css.d.ts.map +1 -1
- package/dist/types/components/media-image/overlays/overlay.st.css.d.ts.map +1 -1
- package/dist/types/components/reference/cell-reference-input.st.css.d.ts.map +1 -1
- package/dist/types/components/rich-content/cell-rich-content-input.d.ts +2 -1
- package/dist/types/components/rich-content/cell-rich-content-input.d.ts.map +1 -1
- package/dist/types/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.d.ts.map +1 -1
- package/dist/types/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.d.ts.map +1 -1
- package/dist/types/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.d.ts +2 -0
- package/dist/types/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.d.ts.map +1 -1
- package/dist/types/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.d.ts.map +1 -1
- package/dist/types/components/rich-text/cell-rich-text-editor.d.ts.map +1 -1
- package/dist/types/components/rich-text/cell-rich-text-input.d.ts +1 -1
- package/dist/types/components/rich-text/cell-rich-text-input.d.ts.map +1 -1
- package/dist/types/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.d.ts.map +1 -1
- package/dist/types/components/text/text-view.st.css.d.ts.map +1 -1
- package/dist/types/utils/keyboard.d.ts +4 -0
- package/dist/types/utils/keyboard.d.ts.map +1 -0
- package/package.json +5 -5
- package/src/__tests__/components/cell-rich-content-input.spec.tsx +73 -0
- package/src/__tests__/components/cell-rich-text-editor.spec.tsx +64 -0
- package/src/__tests__/components/cell-rich-text-input.spec.tsx +39 -0
- package/src/__tests__/components/date-input/cell-date-input.spec.tsx +100 -0
- package/src/__tests__/components/date-input/date-picker-internals.spec.tsx +69 -0
- package/src/__tests__/components/date-input/form-date-input.spec.tsx +141 -0
- package/src/__tests__/components/datetime-input/form-date-time.spec.tsx +194 -0
- package/src/__tests__/components/rich-content-editor.spec.tsx +53 -0
- package/src/__tests__/components/text/form-short-text.spec.tsx +27 -0
- package/src/__tests__/form-field.driver.tsx +31 -3
- package/src/__tests__/hooks/use-field-value-replacement.spec.tsx +68 -0
- package/src/__tests__/utils/keyboard.spec.ts +45 -0
- package/src/components/address/input/address-input.st.css.ts +2 -2
- package/src/components/audio/actions/actions-menu/actions-menu.st.css.ts +2 -2
- package/src/components/audio/audio-field/form-audio-field.st.css.ts +2 -2
- package/src/components/audio/audio-player/audio-player.st.css.ts +2 -2
- package/src/components/boolean/cell-checkbox.tsx +33 -11
- package/src/components/color-view/cell-color-view.st.css.ts +2 -2
- package/src/components/color-view/color-view.st.css.ts +2 -2
- package/src/components/date-input/cell-date-input.tsx +28 -0
- package/src/components/date-input/date-picker-internals.ts +104 -3
- package/src/components/date-input/form-date-input.driver.ts +2 -0
- package/src/components/date-input/form-date-input.tsx +25 -3
- package/src/components/date-input/use-field-value-replacement.ts +63 -0
- package/src/components/datetime-input/form-date-time.driver.ts +3 -0
- package/src/components/datetime-input/form-date-time.tsx +55 -33
- package/src/components/delete-dialog/delete-dialog.st.css.ts +2 -2
- package/src/components/document/form-document-field.st.css.ts +2 -2
- package/src/components/exclamation/exclamation.st.css.ts +2 -2
- package/src/components/highlighted-text/highlighted-text.st.css.ts +3 -3
- package/src/components/image/thumbnail-replace-overlay.st.css.ts +2 -2
- package/src/components/media-control/cell-media-edit-shell.st.css.ts +2 -2
- package/src/components/media-control/paste-url-button.st.css.ts +2 -2
- package/src/components/media-gallery/form-media-gallery-field.st.css.ts +2 -2
- package/src/components/media-image/media-image.st.css.ts +3 -3
- package/src/components/media-image/overlays/overlay.st.css.ts +2 -2
- package/src/components/media-tag/web-media-tag/media-tag.st.css.ts +2 -2
- package/src/components/multi-document/cell-multi-document-edit.st.css.ts +2 -2
- package/src/components/multi-document/multi-document-input/form-multi-document.st.css.ts +2 -2
- package/src/components/reference/cell-multi-reference-input.st.css.ts +2 -2
- package/src/components/reference/cell-reference-input.st.css.ts +2 -2
- package/src/components/rich-content/cell-rich-content-input.tsx +12 -13
- package/src/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.tsx +9 -1
- package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.ts +2 -2
- package/src/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.ts +2 -2
- package/src/components/rich-text/cell-rich-text-editor.tsx +30 -1
- package/src/components/rich-text/cell-rich-text-input.tsx +9 -1
- package/src/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.ts +2 -2
- package/src/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.ts +2 -2
- package/src/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.ts +2 -2
- package/src/components/text/form-short-text.tsx +1 -1
- package/src/components/text/text-view.st.css.ts +2 -2
- package/src/styles.global.css +1 -1
- package/src/utils/keyboard.ts +7 -0
|
@@ -22,6 +22,200 @@ const setup = (
|
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
describe('FormDateTime field', () => {
|
|
25
|
+
it.each(['reset', 'setValue'] as const)(
|
|
26
|
+
'clears stale errors on %s, even when restoring the same value',
|
|
27
|
+
async (method) => {
|
|
28
|
+
const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
|
|
29
|
+
const initialText = await driver.tk.getDateText();
|
|
30
|
+
await driver.tk.enterTimeText('not-a-time');
|
|
31
|
+
await driver.tk.blurTime();
|
|
32
|
+
await driver.tk.enterDateText('not-a-date');
|
|
33
|
+
await driver.tk.blurDate();
|
|
34
|
+
await driver.submit();
|
|
35
|
+
expect(driver.onSubmit).not.toHaveBeenCalled();
|
|
36
|
+
|
|
37
|
+
await driver[method]('2026-09-16T12:00:00.000Z');
|
|
38
|
+
expect(await driver.tk.getDateText()).toBe(initialText);
|
|
39
|
+
expect(await driver.tk.dateHasError()).toBe(false);
|
|
40
|
+
expect(await driver.tk.timeHasError()).toBe(false);
|
|
41
|
+
await driver.submit();
|
|
42
|
+
expect(driver.onSubmit).toHaveBeenCalledTimes(1);
|
|
43
|
+
expect(driver.onSubmit.mock.calls[0][0][driver.field.id]).toBe(
|
|
44
|
+
'2026-09-16T12:00:00.000Z',
|
|
45
|
+
);
|
|
46
|
+
},
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
it.each(['reset', 'setValue'] as const)(
|
|
50
|
+
'shows and submits an externally replaced date via %s',
|
|
51
|
+
async (method) => {
|
|
52
|
+
const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
|
|
53
|
+
const initialText = await driver.tk.getDateText();
|
|
54
|
+
await driver.tk.enterTimeText('not-a-time');
|
|
55
|
+
await driver.tk.blurTime();
|
|
56
|
+
await driver.tk.enterDateText('not-a-date');
|
|
57
|
+
await driver.tk.blurDate();
|
|
58
|
+
|
|
59
|
+
await driver[method]('2026-09-18T12:00:00.000Z');
|
|
60
|
+
expect(await driver.tk.getDateText()).not.toBe(initialText);
|
|
61
|
+
expect(await driver.tk.getDateText()).not.toBe('not-a-date');
|
|
62
|
+
expect(await driver.tk.dateHasError()).toBe(false);
|
|
63
|
+
expect(await driver.tk.timeHasError()).toBe(false);
|
|
64
|
+
await driver.submit();
|
|
65
|
+
expect(driver.onSubmit.mock.calls[0][0][driver.field.id]).toBe(
|
|
66
|
+
'2026-09-18T12:00:00.000Z',
|
|
67
|
+
);
|
|
68
|
+
},
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
it('keeps the error when another field is replaced or removed', async () => {
|
|
72
|
+
const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
|
|
73
|
+
await driver.tk.enterDateText('not-a-date');
|
|
74
|
+
await driver.tk.blurDate();
|
|
75
|
+
await driver.setValue('2026-09-18T12:00:00.000Z', 'anotherField');
|
|
76
|
+
await driver.unregister('anotherField');
|
|
77
|
+
await driver.submit();
|
|
78
|
+
expect(driver.onSubmit).not.toHaveBeenCalled();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it.each([false, true])(
|
|
82
|
+
'resets invalid input to an empty value (required=%s)',
|
|
83
|
+
async (required) => {
|
|
84
|
+
const driver = setup({
|
|
85
|
+
field: makeField({ type: 'DATETIME', validation: { required } }),
|
|
86
|
+
});
|
|
87
|
+
await driver.tk.enterDateText('not-a-date');
|
|
88
|
+
await driver.tk.blurDate();
|
|
89
|
+
await driver.reset(null);
|
|
90
|
+
expect(await driver.tk.getDateText()).toBe('');
|
|
91
|
+
await driver.submit();
|
|
92
|
+
expect(driver.onSubmit).toHaveBeenCalledTimes(required ? 0 : 1);
|
|
93
|
+
if (!required) {
|
|
94
|
+
expect(driver.onSubmit.mock.calls[0][0][driver.field.id]).toBeNull();
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
it.each([false, true])(
|
|
100
|
+
'blocks submit for an invalid date (required=%s)',
|
|
101
|
+
async (required) => {
|
|
102
|
+
const driver = setup({
|
|
103
|
+
field: makeField({ type: 'DATETIME', validation: { required } }),
|
|
104
|
+
initialValue: '2026-09-16T12:00:00.000Z',
|
|
105
|
+
});
|
|
106
|
+
await driver.tk.enterDateText('not-a-date');
|
|
107
|
+
await driver.tk.blurDate();
|
|
108
|
+
expect(await driver.tk.dateHasError()).toBe(true);
|
|
109
|
+
expect(await driver.tk.timeHasError()).toBe(false);
|
|
110
|
+
|
|
111
|
+
await driver.submit();
|
|
112
|
+
|
|
113
|
+
expect(driver.onSubmit).not.toHaveBeenCalled();
|
|
114
|
+
expect(await driver.tk.timeHasError()).toBe(false);
|
|
115
|
+
},
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
it('allows submit after correcting an invalid date', async () => {
|
|
119
|
+
const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
|
|
120
|
+
await driver.tk.enterDateText('not-a-date');
|
|
121
|
+
await driver.tk.blurDate();
|
|
122
|
+
await driver.submit();
|
|
123
|
+
expect(driver.onSubmit).not.toHaveBeenCalled();
|
|
124
|
+
|
|
125
|
+
await driver.tk.enterDateText('09/17/2026');
|
|
126
|
+
await driver.tk.blurDate();
|
|
127
|
+
await driver.submit();
|
|
128
|
+
|
|
129
|
+
expect(await driver.tk.dateHasError()).toBe(false);
|
|
130
|
+
expect(driver.onSubmit).toHaveBeenCalledTimes(1);
|
|
131
|
+
expect(
|
|
132
|
+
new Date(driver.onSubmit.mock.calls[0][0][driver.field.id]).getDate(),
|
|
133
|
+
).toBe(17);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('blocks an invalid time and allows submit after correcting it', async () => {
|
|
137
|
+
const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
|
|
138
|
+
await driver.tk.enterTimeText('not-a-time');
|
|
139
|
+
await driver.tk.blurTime();
|
|
140
|
+
expect(await driver.tk.timeHasError()).toBe(true);
|
|
141
|
+
expect(await driver.tk.dateHasError()).toBe(false);
|
|
142
|
+
await driver.submit();
|
|
143
|
+
expect(driver.onSubmit).not.toHaveBeenCalled();
|
|
144
|
+
expect(await driver.tk.dateHasError()).toBe(false);
|
|
145
|
+
|
|
146
|
+
await driver.tk.enterTimeText('14:30');
|
|
147
|
+
await driver.tk.blurTime();
|
|
148
|
+
await driver.submit();
|
|
149
|
+
|
|
150
|
+
expect(await driver.tk.timeHasError()).toBe(false);
|
|
151
|
+
expect(driver.onSubmit).toHaveBeenCalledTimes(1);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('does not clear an invalid date when the time changes', async () => {
|
|
155
|
+
const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
|
|
156
|
+
await driver.tk.enterDateText('not-a-date');
|
|
157
|
+
await driver.tk.blurDate();
|
|
158
|
+
await driver.tk.enterTimeText('14:30');
|
|
159
|
+
await driver.tk.blurTime();
|
|
160
|
+
|
|
161
|
+
expect(await driver.tk.dateHasError()).toBe(true);
|
|
162
|
+
await driver.submit();
|
|
163
|
+
expect(driver.onSubmit).not.toHaveBeenCalled();
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('shows each input’s own message when both inputs are invalid', async () => {
|
|
167
|
+
const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
|
|
168
|
+
await driver.tk.enterDateText('not-a-date');
|
|
169
|
+
await driver.tk.blurDate();
|
|
170
|
+
await driver.tk.enterTimeText('not-a-time');
|
|
171
|
+
await driver.tk.blurTime();
|
|
172
|
+
await driver.submit();
|
|
173
|
+
|
|
174
|
+
expect(driver.onSubmit).not.toHaveBeenCalled();
|
|
175
|
+
expect(await driver.tk.getDateErrorMessage()).toContain(
|
|
176
|
+
'cairo.customFields.fieldType.date.invalid.value',
|
|
177
|
+
);
|
|
178
|
+
expect(await driver.tk.getTimeErrorMessage()).toBe(
|
|
179
|
+
'CMS.formTime.invalidMessage',
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('does not clear an invalid time when the date changes', async () => {
|
|
184
|
+
const driver = setup({ initialValue: '2026-09-16T12:00:00.000Z' });
|
|
185
|
+
await driver.tk.enterTimeText('not-a-time');
|
|
186
|
+
await driver.tk.blurTime();
|
|
187
|
+
await driver.tk.enterDateText('09/17/2026');
|
|
188
|
+
await driver.tk.blurDate();
|
|
189
|
+
|
|
190
|
+
expect(await driver.tk.timeHasError()).toBe(true);
|
|
191
|
+
await driver.submit();
|
|
192
|
+
expect(driver.onSubmit).not.toHaveBeenCalled();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it.each([false, true])(
|
|
196
|
+
'handles clearing an invalid date and time (required=%s)',
|
|
197
|
+
async (required) => {
|
|
198
|
+
const driver = setup({
|
|
199
|
+
field: makeField({ type: 'DATETIME', validation: { required } }),
|
|
200
|
+
initialValue: '2026-09-16T12:00:00.000Z',
|
|
201
|
+
});
|
|
202
|
+
await driver.tk.enterDateText('not-a-date');
|
|
203
|
+
await driver.tk.blurDate();
|
|
204
|
+
await driver.tk.enterTimeText('');
|
|
205
|
+
await driver.tk.blurTime();
|
|
206
|
+
await driver.tk.enterDateText('');
|
|
207
|
+
await driver.tk.blurDate();
|
|
208
|
+
await driver.submit();
|
|
209
|
+
|
|
210
|
+
expect(driver.onSubmit).toHaveBeenCalledTimes(required ? 0 : 1);
|
|
211
|
+
if (!required) {
|
|
212
|
+
expect(driver.onSubmit.mock.calls[0][0][driver.field.id]).toBeNull();
|
|
213
|
+
expect(await driver.tk.dateHasError()).toBe(false);
|
|
214
|
+
expect(await driver.tk.timeHasError()).toBe(false);
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
);
|
|
218
|
+
|
|
25
219
|
it('renders the field displayName as the label', async () => {
|
|
26
220
|
const driver = setup();
|
|
27
221
|
|
|
@@ -412,6 +412,59 @@ describe('<RichContentEditor/>', () => {
|
|
|
412
412
|
});
|
|
413
413
|
});
|
|
414
414
|
|
|
415
|
+
describe('Enter key', () => {
|
|
416
|
+
const pressEnterInText = (opts: { shiftKey?: boolean } = {}) => {
|
|
417
|
+
const text = document.createElement('div');
|
|
418
|
+
text.setAttribute('contenteditable', 'true');
|
|
419
|
+
document.body.appendChild(text);
|
|
420
|
+
fireEvent.keyDown(text, { key: 'Enter', bubbles: true, ...opts });
|
|
421
|
+
text.remove();
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
it('closes fullscreen on Enter in the text when closeOnEnter is set', async () => {
|
|
425
|
+
renderWithProps({
|
|
426
|
+
fullScreenOnly: true,
|
|
427
|
+
closeOnEnter: true,
|
|
428
|
+
onExitFullScreen,
|
|
429
|
+
});
|
|
430
|
+
await waitFor(() =>
|
|
431
|
+
expect(screen.getByTestId('fullscreen-modal')).toBeInTheDocument(),
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
pressEnterInText();
|
|
435
|
+
|
|
436
|
+
await waitFor(() => expect(onExitFullScreen).toHaveBeenCalled());
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
it('does not close on Shift+Enter', async () => {
|
|
440
|
+
renderWithProps({
|
|
441
|
+
fullScreenOnly: true,
|
|
442
|
+
closeOnEnter: true,
|
|
443
|
+
onExitFullScreen,
|
|
444
|
+
});
|
|
445
|
+
await waitFor(() =>
|
|
446
|
+
expect(screen.getByTestId('fullscreen-modal')).toBeInTheDocument(),
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
pressEnterInText({ shiftKey: true });
|
|
450
|
+
|
|
451
|
+
await nextRender();
|
|
452
|
+
expect(onExitFullScreen).not.toHaveBeenCalled();
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
it('does not close on Enter without closeOnEnter', async () => {
|
|
456
|
+
renderWithProps({ fullScreenOnly: true, onExitFullScreen });
|
|
457
|
+
await waitFor(() =>
|
|
458
|
+
expect(screen.getByTestId('fullscreen-modal')).toBeInTheDocument(),
|
|
459
|
+
);
|
|
460
|
+
|
|
461
|
+
pressEnterInText();
|
|
462
|
+
|
|
463
|
+
await nextRender();
|
|
464
|
+
expect(onExitFullScreen).not.toHaveBeenCalled();
|
|
465
|
+
});
|
|
466
|
+
});
|
|
467
|
+
|
|
415
468
|
describe('fullscreen mode', () => {
|
|
416
469
|
it('should open fullscreen modal when toggle button is clicked', async () => {
|
|
417
470
|
renderWithProps({
|
|
@@ -61,6 +61,33 @@ describe('FormShortText field', () => {
|
|
|
61
61
|
expect(await driver.tk.getCharCountLeft()).toBe(7);
|
|
62
62
|
});
|
|
63
63
|
|
|
64
|
+
it.each([undefined, null])(
|
|
65
|
+
'shows the full character allowance when the initial value is %p',
|
|
66
|
+
async (initialValue) => {
|
|
67
|
+
const driver = new FormFieldDriver({
|
|
68
|
+
Component: FormShortText,
|
|
69
|
+
UniDriverFactory: FormShortTextDriver,
|
|
70
|
+
dataHook: (f) => `short-text-field-${f.id}`,
|
|
71
|
+
field: makeField({
|
|
72
|
+
validation: { required: true, stringLengthRange: { maxLength: 10 } },
|
|
73
|
+
}),
|
|
74
|
+
initialValue: initialValue as unknown as string,
|
|
75
|
+
});
|
|
76
|
+
driver.render();
|
|
77
|
+
|
|
78
|
+
expect(await driver.tk.getValue()).toBe('');
|
|
79
|
+
expect(await driver.tk.getCharCountLeft()).toBe(10);
|
|
80
|
+
|
|
81
|
+
await driver.tk.enterText('abc');
|
|
82
|
+
|
|
83
|
+
expect(await driver.tk.getCharCountLeft()).toBe(7);
|
|
84
|
+
|
|
85
|
+
await driver.tk.enterText('');
|
|
86
|
+
|
|
87
|
+
expect(await driver.tk.getCharCountLeft()).toBe(10);
|
|
88
|
+
},
|
|
89
|
+
);
|
|
90
|
+
|
|
64
91
|
it('marks the field as required when validation.required is true', async () => {
|
|
65
92
|
const driver = setup({
|
|
66
93
|
field: makeField({ validation: { required: true } }),
|
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import { act, fireEvent, render, RenderResult } from '@testing-library/react';
|
|
3
3
|
import Chance from 'chance';
|
|
4
4
|
import { useForm } from '@wix/bex-core/form';
|
|
5
|
-
import type { Control, FieldValues } from '@wix/bex-core/form';
|
|
5
|
+
import type { Control, FieldValues, UseFormReturn } from '@wix/bex-core/form';
|
|
6
6
|
import type { Field } from '@wix/bex-core';
|
|
7
7
|
import { UniDriver } from '@wix/wix-ui-test-utils/unidriver';
|
|
8
8
|
import type { BaseUniDriver } from '@wix/wix-ui-test-utils/base-driver';
|
|
@@ -12,7 +12,6 @@ import { PatternsFieldsTestProvider } from '../testkit/patterns-fields-test-prov
|
|
|
12
12
|
import type { BaseInputProps } from '../types/base-input';
|
|
13
13
|
|
|
14
14
|
const chance = new Chance();
|
|
15
|
-
const noop = () => {};
|
|
16
15
|
const SUBMIT_HOOK = 'form-field-driver-submit';
|
|
17
16
|
|
|
18
17
|
type UniDriverFactory<U> = (
|
|
@@ -31,9 +30,11 @@ export interface FormFieldDriverOptions<U extends BaseUniDriver, T> {
|
|
|
31
30
|
|
|
32
31
|
export class FormFieldDriver<U extends BaseUniDriver, T> {
|
|
33
32
|
private _renderResult?: RenderResult;
|
|
33
|
+
private form?: UseFormReturn<FieldValues>;
|
|
34
34
|
readonly field: Field;
|
|
35
35
|
readonly initialValue: T;
|
|
36
36
|
readonly onChange = jest.fn<void, [T]>();
|
|
37
|
+
readonly onSubmit = jest.fn<void, [FieldValues]>();
|
|
37
38
|
private readonly opts: FormFieldDriverOptions<U, T>;
|
|
38
39
|
private readonly _dataHook: string;
|
|
39
40
|
|
|
@@ -67,6 +68,24 @@ export class FormFieldDriver<U extends BaseUniDriver, T> {
|
|
|
67
68
|
});
|
|
68
69
|
}
|
|
69
70
|
|
|
71
|
+
async reset(value: T): Promise<void> {
|
|
72
|
+
await act(async () => {
|
|
73
|
+
this.form!.reset({ [this.field.id]: value });
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async setValue(value: T, name = this.field.id): Promise<void> {
|
|
78
|
+
await act(async () => {
|
|
79
|
+
this.form!.setValue(name, value, { shouldValidate: true });
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async unregister(name: string): Promise<void> {
|
|
84
|
+
await act(async () => {
|
|
85
|
+
this.form!.unregister(name);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
70
89
|
render() {
|
|
71
90
|
const { Component } = this.opts;
|
|
72
91
|
const { field, initialValue, _dataHook: dataHook, onChange } = this;
|
|
@@ -74,6 +93,10 @@ export class FormFieldDriver<U extends BaseUniDriver, T> {
|
|
|
74
93
|
<TestForm
|
|
75
94
|
field={field}
|
|
76
95
|
initialValue={initialValue}
|
|
96
|
+
onSubmit={this.onSubmit}
|
|
97
|
+
onFormReady={(form) => {
|
|
98
|
+
this.form = form;
|
|
99
|
+
}}
|
|
77
100
|
renderField={(control) => (
|
|
78
101
|
<Component
|
|
79
102
|
field={field}
|
|
@@ -93,20 +116,25 @@ export class FormFieldDriver<U extends BaseUniDriver, T> {
|
|
|
93
116
|
interface TestFormProps<T> {
|
|
94
117
|
field: Field;
|
|
95
118
|
initialValue: T;
|
|
119
|
+
onSubmit: (values: FieldValues) => void;
|
|
120
|
+
onFormReady: (form: UseFormReturn<FieldValues>) => void;
|
|
96
121
|
renderField: (control: Control<FieldValues>) => React.ReactElement;
|
|
97
122
|
}
|
|
98
123
|
|
|
99
124
|
const TestForm = <T,>({
|
|
100
125
|
field,
|
|
101
126
|
initialValue,
|
|
127
|
+
onSubmit,
|
|
128
|
+
onFormReady,
|
|
102
129
|
renderField,
|
|
103
130
|
}: TestFormProps<T>) => {
|
|
104
131
|
const methods = useForm<FieldValues>({
|
|
105
132
|
mode: 'onChange',
|
|
106
133
|
defaultValues: { [field.id]: initialValue },
|
|
107
134
|
});
|
|
135
|
+
onFormReady(methods);
|
|
108
136
|
return (
|
|
109
|
-
<form onSubmit={methods.handleSubmit(
|
|
137
|
+
<form onSubmit={methods.handleSubmit(onSubmit)}>
|
|
110
138
|
{renderField(methods.control)}
|
|
111
139
|
<button type="submit" data-hook={SUBMIT_HOOK} />
|
|
112
140
|
</form>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import '../../testkit/test-polyfills';
|
|
2
|
+
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
|
+
import { render } from '@testing-library/react';
|
|
5
|
+
import { useForm } from '@wix/bex-core/form';
|
|
6
|
+
import type { Control } from '@wix/bex-core/form';
|
|
7
|
+
|
|
8
|
+
import { FormDateInput } from '../../components/date-input/form-date-input';
|
|
9
|
+
import { FormDateTime } from '../../components/datetime-input/form-date-time';
|
|
10
|
+
import { useFieldValueReplacement } from '../../components/date-input/use-field-value-replacement';
|
|
11
|
+
import { PatternsFieldsTestProvider } from '../../testkit/patterns-fields-test-provider';
|
|
12
|
+
import { makeField } from '../form-field.driver';
|
|
13
|
+
|
|
14
|
+
describe('useFieldValueReplacement compatibility', () => {
|
|
15
|
+
it.each([
|
|
16
|
+
['Date', FormDateInput, 'DATE'],
|
|
17
|
+
['DateTime', FormDateTime, 'DATETIME'],
|
|
18
|
+
] as const)(
|
|
19
|
+
'renders %s without exposed subjects',
|
|
20
|
+
(_name, Component, type) => {
|
|
21
|
+
const field = makeField({ type });
|
|
22
|
+
const Example = () => {
|
|
23
|
+
const form = useForm();
|
|
24
|
+
const control = useMemo(() => {
|
|
25
|
+
const { _subjects, ...rest } = form.control;
|
|
26
|
+
return rest as Control;
|
|
27
|
+
}, [form.control]);
|
|
28
|
+
return (
|
|
29
|
+
<Component
|
|
30
|
+
field={field}
|
|
31
|
+
value={null}
|
|
32
|
+
onChange={() => {}}
|
|
33
|
+
data={{}}
|
|
34
|
+
formControl={control}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const result = render(<Example />, {
|
|
40
|
+
wrapper: PatternsFieldsTestProvider,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
expect(result.getByText(field.displayName)).toBeTruthy();
|
|
44
|
+
result.unmount();
|
|
45
|
+
},
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
it.each([
|
|
49
|
+
undefined,
|
|
50
|
+
{},
|
|
51
|
+
{ state: {}, array: {} },
|
|
52
|
+
{ state: { subscribe: jest.fn() } },
|
|
53
|
+
{ array: { subscribe: jest.fn() } },
|
|
54
|
+
])('skips cleanup for an unsupported subject shape: %p', (subjects) => {
|
|
55
|
+
const onReplace = jest.fn();
|
|
56
|
+
const control = { _subjects: subjects } as unknown as Control;
|
|
57
|
+
const Example = () => {
|
|
58
|
+
const revision = useFieldValueReplacement(control, 'date', onReplace);
|
|
59
|
+
return <span>{revision}</span>;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const result = render(<Example />);
|
|
63
|
+
|
|
64
|
+
expect(result.getByText('0')).toBeTruthy();
|
|
65
|
+
expect(onReplace).not.toHaveBeenCalled();
|
|
66
|
+
result.unmount();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { isEnterInEditableText } from '../../utils/keyboard';
|
|
2
|
+
|
|
3
|
+
const press = (target: HTMLElement, init: KeyboardEventInit = {}) => {
|
|
4
|
+
let result: boolean | undefined;
|
|
5
|
+
target.addEventListener('keydown', (e) => {
|
|
6
|
+
result = isEnterInEditableText(e);
|
|
7
|
+
});
|
|
8
|
+
target.dispatchEvent(
|
|
9
|
+
new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, ...init }),
|
|
10
|
+
);
|
|
11
|
+
return result;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
describe('isEnterInEditableText', () => {
|
|
15
|
+
const editable = () => {
|
|
16
|
+
const outer = document.createElement('div');
|
|
17
|
+
outer.setAttribute('contenteditable', 'true');
|
|
18
|
+
const inner = document.createElement('span');
|
|
19
|
+
outer.appendChild(inner);
|
|
20
|
+
document.body.appendChild(outer);
|
|
21
|
+
return inner;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
it('is true for Enter inside editable text', () => {
|
|
25
|
+
expect(press(editable())).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('is false for Shift+Enter', () => {
|
|
29
|
+
expect(press(editable(), { shiftKey: true })).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('is false while composing (IME)', () => {
|
|
33
|
+
expect(press(editable(), { isComposing: true })).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('is false outside editable text (e.g. a toolbar input)', () => {
|
|
37
|
+
const input = document.createElement('input');
|
|
38
|
+
document.body.appendChild(input);
|
|
39
|
+
expect(press(input)).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('is false for other keys', () => {
|
|
43
|
+
expect(press(editable(), { key: 'a' })).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../stylable-esm-runtime.js"
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var _namespace_ = "
|
|
8
|
+
var _namespace_ = "addressinput840205872";
|
|
9
9
|
var _style_ = classesRuntime.bind(null, _namespace_);
|
|
10
10
|
|
|
11
11
|
export var cssStates = statesRuntime.bind(null, _namespace_);
|
|
@@ -13,7 +13,7 @@ export var style: import("@stylable/runtime").STFunction = _style_;
|
|
|
13
13
|
export var st: import("@stylable/runtime").STFunction = _style_;
|
|
14
14
|
|
|
15
15
|
export var namespace = _namespace_;
|
|
16
|
-
export var classes = {"root":"
|
|
16
|
+
export var classes = {"root":"addressinput840205872__root","tableAddressInput":"addressinput840205872__tableAddressInput"};
|
|
17
17
|
export var keyframes = {};
|
|
18
18
|
export var layers = {};
|
|
19
19
|
export var containers = {};
|
|
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../../stylable-esm-runtime.
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var _namespace_ = "
|
|
8
|
+
var _namespace_ = "actionsmenu994746356";
|
|
9
9
|
var _style_ = classesRuntime.bind(null, _namespace_);
|
|
10
10
|
|
|
11
11
|
export var cssStates = statesRuntime.bind(null, _namespace_);
|
|
@@ -13,7 +13,7 @@ export var style: import("@stylable/runtime").STFunction = _style_;
|
|
|
13
13
|
export var st: import("@stylable/runtime").STFunction = _style_;
|
|
14
14
|
|
|
15
15
|
export var namespace = _namespace_;
|
|
16
|
-
export var classes = {"root":"
|
|
16
|
+
export var classes = {"root":"actionsmenu994746356__root","action":"actionsmenu994746356__action"};
|
|
17
17
|
export var keyframes = {};
|
|
18
18
|
export var layers = {};
|
|
19
19
|
export var containers = {};
|
|
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../stylable-esm-runtime.js"
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var _namespace_ = "
|
|
8
|
+
var _namespace_ = "formaudiofield1744934343";
|
|
9
9
|
var _style_ = classesRuntime.bind(null, _namespace_);
|
|
10
10
|
|
|
11
11
|
export var cssStates = statesRuntime.bind(null, _namespace_);
|
|
@@ -13,7 +13,7 @@ export var style: import("@stylable/runtime").STFunction = _style_;
|
|
|
13
13
|
export var st: import("@stylable/runtime").STFunction = _style_;
|
|
14
14
|
|
|
15
15
|
export var namespace = _namespace_;
|
|
16
|
-
export var classes = {"root":"
|
|
16
|
+
export var classes = {"root":"formaudiofield1744934343__root","addItem":"formaudiofield1744934343__addItem","mediaTitle":"formaudiofield1744934343__mediaTitle"};
|
|
17
17
|
export var keyframes = {};
|
|
18
18
|
export var layers = {};
|
|
19
19
|
export var containers = {};
|
|
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../../stylable-esm-runtime.js"
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var _namespace_ = "
|
|
8
|
+
var _namespace_ = "audioplayer2787508242";
|
|
9
9
|
var _style_ = classesRuntime.bind(null, _namespace_);
|
|
10
10
|
|
|
11
11
|
export var cssStates = statesRuntime.bind(null, _namespace_);
|
|
@@ -13,7 +13,7 @@ export var style: import("@stylable/runtime").STFunction = _style_;
|
|
|
13
13
|
export var st: import("@stylable/runtime").STFunction = _style_;
|
|
14
14
|
|
|
15
15
|
export var namespace = _namespace_;
|
|
16
|
-
export var classes = {"root":"
|
|
16
|
+
export var classes = {"root":"audioplayer2787508242__root"};
|
|
17
17
|
export var keyframes = {};
|
|
18
18
|
export var layers = {};
|
|
19
19
|
export var containers = {};
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, {
|
|
2
|
+
forwardRef,
|
|
3
|
+
useCallback,
|
|
4
|
+
useImperativeHandle,
|
|
5
|
+
useRef,
|
|
6
|
+
} from 'react';
|
|
2
7
|
import type { CheckboxProps } from '@wix/design-system';
|
|
3
8
|
import { Checkbox } from '@wix/design-system';
|
|
4
9
|
|
|
@@ -8,20 +13,37 @@ export interface CellCheckboxProps
|
|
|
8
13
|
onChange?(checked: boolean): void;
|
|
9
14
|
}
|
|
10
15
|
|
|
16
|
+
export interface CellCheckboxHandle {
|
|
17
|
+
focus(): void;
|
|
18
|
+
}
|
|
19
|
+
|
|
11
20
|
/**
|
|
12
21
|
* Cell-layer Checkbox — fires onChange on toggle. Thin wrapper around
|
|
13
22
|
* WDS Checkbox with cell-friendly prop types (boolean instead of event).
|
|
14
23
|
*/
|
|
15
|
-
export const CellCheckbox
|
|
16
|
-
checked,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
export const CellCheckbox = forwardRef<CellCheckboxHandle, CellCheckboxProps>(
|
|
25
|
+
({ checked, onChange, ...props }, ref) => {
|
|
26
|
+
// WDS types this ref as an element, but it resolves to the Checkbox,
|
|
27
|
+
// whose focus() focuses the input and shows the keyboard focus ring.
|
|
28
|
+
const checkboxRef = useRef<HTMLDivElement>(null);
|
|
29
|
+
|
|
30
|
+
useImperativeHandle(ref, () => ({
|
|
31
|
+
focus: () => checkboxRef.current?.focus(),
|
|
32
|
+
}));
|
|
33
|
+
|
|
34
|
+
const handleChange = useCallback(() => {
|
|
35
|
+
onChange?.(!checked);
|
|
36
|
+
}, [checked, onChange]);
|
|
23
37
|
|
|
24
|
-
|
|
25
|
-
|
|
38
|
+
return (
|
|
39
|
+
<Checkbox
|
|
40
|
+
{...props}
|
|
41
|
+
ref={checkboxRef}
|
|
42
|
+
checked={checked}
|
|
43
|
+
onChange={handleChange}
|
|
44
|
+
/>
|
|
45
|
+
);
|
|
46
|
+
},
|
|
47
|
+
);
|
|
26
48
|
|
|
27
49
|
CellCheckbox.displayName = 'CellCheckbox';
|
|
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var _namespace_ = "
|
|
8
|
+
var _namespace_ = "cellcolorview1285518022";
|
|
9
9
|
var _style_ = classesRuntime.bind(null, _namespace_);
|
|
10
10
|
|
|
11
11
|
export var cssStates = statesRuntime.bind(null, _namespace_);
|
|
@@ -13,7 +13,7 @@ export var style: import("@stylable/runtime").STFunction = _style_;
|
|
|
13
13
|
export var st: import("@stylable/runtime").STFunction = _style_;
|
|
14
14
|
|
|
15
15
|
export var namespace = _namespace_;
|
|
16
|
-
export var classes = {"root":"
|
|
16
|
+
export var classes = {"root":"cellcolorview1285518022__root","hashPrefix":"cellcolorview1285518022__hashPrefix"};
|
|
17
17
|
export var keyframes = {};
|
|
18
18
|
export var layers = {};
|
|
19
19
|
export var containers = {};
|
|
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var _namespace_ = "
|
|
8
|
+
var _namespace_ = "colorview1355180041";
|
|
9
9
|
var _style_ = classesRuntime.bind(null, _namespace_);
|
|
10
10
|
|
|
11
11
|
export var cssStates = statesRuntime.bind(null, _namespace_);
|
|
@@ -13,7 +13,7 @@ export var style: import("@stylable/runtime").STFunction = _style_;
|
|
|
13
13
|
export var st: import("@stylable/runtime").STFunction = _style_;
|
|
14
14
|
|
|
15
15
|
export var namespace = _namespace_;
|
|
16
|
-
export var classes = {"root":"
|
|
16
|
+
export var classes = {"root":"colorview1355180041__root","view":"colorview1355180041__view","fillPreview":"colorview1355180041__fillPreview"};
|
|
17
17
|
export var keyframes = {};
|
|
18
18
|
export var layers = {};
|
|
19
19
|
export var containers = {};
|