@wix/patterns-fields 1.28.0 → 1.30.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.
Files changed (217) hide show
  1. package/dist/cjs/assets/locale/messages_en.json +9 -9
  2. package/dist/cjs/components/address/input/address-input.st.css.js +3 -3
  3. package/dist/cjs/components/address/input/address-input.st.css.js.map +1 -1
  4. package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js +3 -3
  5. package/dist/cjs/components/audio/actions/actions-menu/actions-menu.st.css.js.map +1 -1
  6. package/dist/cjs/components/audio/audio-field/form-audio-field.st.css.js +4 -4
  7. package/dist/cjs/components/audio/audio-field/form-audio-field.st.css.js.map +1 -1
  8. package/dist/cjs/components/audio/audio-player/audio-player.st.css.js +2 -2
  9. package/dist/cjs/components/audio/audio-player/audio-player.st.css.js.map +1 -1
  10. package/dist/cjs/components/color-view/color-view.st.css.js +4 -4
  11. package/dist/cjs/components/color-view/color-view.st.css.js.map +1 -1
  12. package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js +3 -3
  13. package/dist/cjs/components/delete-dialog/delete-dialog.st.css.js.map +1 -1
  14. package/dist/cjs/components/document/cell-document-edit.js +302 -0
  15. package/dist/cjs/components/document/cell-document-edit.js.map +1 -0
  16. package/dist/cjs/components/document/cell-document-view.js +56 -0
  17. package/dist/cjs/components/document/cell-document-view.js.map +1 -0
  18. package/dist/cjs/components/document/form-document-field.st.css.js +7 -7
  19. package/dist/cjs/components/document/form-document-field.st.css.js.map +1 -1
  20. package/dist/cjs/components/document/index.js +12 -0
  21. package/dist/cjs/components/document/index.js.map +1 -1
  22. package/dist/cjs/components/document/utils.js +1 -0
  23. package/dist/cjs/components/document/utils.js.map +1 -1
  24. package/dist/cjs/components/exclamation/exclamation.st.css.js +5 -5
  25. package/dist/cjs/components/exclamation/exclamation.st.css.js.map +1 -1
  26. package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js +5 -5
  27. package/dist/cjs/components/highlighted-text/highlighted-text.st.css.js.map +1 -1
  28. package/dist/cjs/components/image/cell-image-edit.js +68 -168
  29. package/dist/cjs/components/image/cell-image-edit.js.map +1 -1
  30. package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js +3 -3
  31. package/dist/cjs/components/image/thumbnail-replace-overlay.st.css.js.map +1 -1
  32. package/dist/cjs/components/media-control/cell-media-edit-shell.js +101 -0
  33. package/dist/cjs/components/media-control/cell-media-edit-shell.js.map +1 -0
  34. package/dist/cjs/components/media-control/cell-media-edit-shell.st.css +4 -0
  35. package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js +22 -0
  36. package/dist/cjs/components/media-control/cell-media-edit-shell.st.css.js.map +1 -0
  37. package/dist/cjs/components/media-control/index.js +12 -0
  38. package/dist/cjs/components/media-control/index.js.map +1 -1
  39. package/dist/cjs/components/media-control/paste-url-button.st.css.js +4 -4
  40. package/dist/cjs/components/media-control/paste-url-button.st.css.js.map +1 -1
  41. package/dist/cjs/components/media-control/use-cell-media-edit.js +93 -0
  42. package/dist/cjs/components/media-control/use-cell-media-edit.js.map +1 -0
  43. package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js +10 -10
  44. package/dist/cjs/components/media-gallery/form-media-gallery-field.st.css.js.map +1 -1
  45. package/dist/cjs/components/media-image/media-image.st.css.js +4 -4
  46. package/dist/cjs/components/media-image/media-image.st.css.js.map +1 -1
  47. package/dist/cjs/components/media-image/overlays/overlay.st.css.js +4 -4
  48. package/dist/cjs/components/media-image/overlays/overlay.st.css.js.map +1 -1
  49. package/dist/cjs/components/media-loader/media-loader.st.css.js +3 -3
  50. package/dist/cjs/components/media-loader/media-loader.st.css.js.map +1 -1
  51. package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
  52. package/dist/cjs/components/media-tag/web-media-tag/media-tag.st.css.js.map +1 -1
  53. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js +5 -5
  54. package/dist/cjs/components/multi-document/multi-document-input/form-multi-document.st.css.js.map +1 -1
  55. package/dist/cjs/components/reference/cell-reference-input.st.css.js +3 -3
  56. package/dist/cjs/components/reference/cell-reference-input.st.css.js.map +1 -1
  57. package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +6 -6
  58. package/dist/cjs/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js.map +1 -1
  59. package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +5 -5
  60. package/dist/cjs/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js.map +1 -1
  61. package/dist/cjs/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
  62. 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
  63. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +3 -3
  64. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js.map +1 -1
  65. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +3 -3
  66. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js.map +1 -1
  67. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
  68. package/dist/cjs/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js.map +1 -1
  69. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +8 -8
  70. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js.map +1 -1
  71. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +4 -4
  72. package/dist/cjs/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js.map +1 -1
  73. package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +4 -4
  74. package/dist/cjs/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js.map +1 -1
  75. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +20 -20
  76. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js.map +1 -1
  77. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +4 -4
  78. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js.map +1 -1
  79. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +20 -20
  80. package/dist/cjs/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js.map +1 -1
  81. package/dist/cjs/components/text/text-view.st.css.js +3 -3
  82. package/dist/cjs/components/text/text-view.st.css.js.map +1 -1
  83. package/dist/cjs/styles.global.css +1 -1
  84. package/dist/esm/assets/locale/messages_en.json +9 -9
  85. package/dist/esm/components/address/input/address-input.st.css.js +2 -2
  86. package/dist/esm/components/audio/actions/actions-menu/actions-menu.st.css.js +2 -2
  87. package/dist/esm/components/audio/audio-field/form-audio-field.st.css.js +2 -2
  88. package/dist/esm/components/audio/audio-player/audio-player.st.css.js +2 -2
  89. package/dist/esm/components/color-view/color-view.st.css.js +2 -2
  90. package/dist/esm/components/delete-dialog/delete-dialog.st.css.js +2 -2
  91. package/dist/esm/components/delete-dialog/delete-dialog.st.css.js.map +1 -1
  92. package/dist/esm/components/document/cell-document-edit.js +60 -0
  93. package/dist/esm/components/document/cell-document-edit.js.map +1 -0
  94. package/dist/esm/components/document/cell-document-view.js +13 -0
  95. package/dist/esm/components/document/cell-document-view.js.map +1 -0
  96. package/dist/esm/components/document/form-document-field.st.css.js +2 -2
  97. package/dist/esm/components/document/index.js +2 -0
  98. package/dist/esm/components/document/index.js.map +1 -1
  99. package/dist/esm/components/document/utils.js +1 -0
  100. package/dist/esm/components/document/utils.js.map +1 -1
  101. package/dist/esm/components/exclamation/exclamation.st.css.js +2 -2
  102. package/dist/esm/components/highlighted-text/highlighted-text.st.css.js +3 -3
  103. package/dist/esm/components/image/cell-image-edit.js +46 -85
  104. package/dist/esm/components/image/cell-image-edit.js.map +1 -1
  105. package/dist/esm/components/image/thumbnail-replace-overlay.st.css.js +2 -2
  106. package/dist/esm/components/media-control/cell-media-edit-shell.js +23 -0
  107. package/dist/esm/components/media-control/cell-media-edit-shell.js.map +1 -0
  108. package/dist/esm/components/media-control/cell-media-edit-shell.st.css +4 -0
  109. package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js +15 -0
  110. package/dist/esm/components/media-control/cell-media-edit-shell.st.css.js.map +1 -0
  111. package/dist/esm/components/media-control/index.js +2 -0
  112. package/dist/esm/components/media-control/index.js.map +1 -1
  113. package/dist/esm/components/media-control/paste-url-button.st.css.js +2 -2
  114. package/dist/esm/components/media-control/paste-url-button.st.css.js.map +1 -1
  115. package/dist/esm/components/media-control/use-cell-media-edit.js +63 -0
  116. package/dist/esm/components/media-control/use-cell-media-edit.js.map +1 -0
  117. package/dist/esm/components/media-gallery/form-media-gallery-field.st.css.js +2 -2
  118. package/dist/esm/components/media-image/media-image.st.css.js +3 -3
  119. package/dist/esm/components/media-image/overlays/overlay.st.css.js +3 -3
  120. package/dist/esm/components/media-loader/media-loader.st.css.js +2 -2
  121. package/dist/esm/components/media-tag/web-media-tag/media-tag.st.css.js +2 -2
  122. package/dist/esm/components/multi-document/multi-document-input/form-multi-document.st.css.js +2 -2
  123. package/dist/esm/components/reference/cell-reference-input.st.css.js +2 -2
  124. package/dist/esm/components/reference/cell-reference-input.st.css.js.map +1 -1
  125. package/dist/esm/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.js +3 -3
  126. package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js +3 -3
  127. package/dist/esm/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.js.map +1 -1
  128. package/dist/esm/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.js +2 -2
  129. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js +2 -2
  130. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.js.map +1 -1
  131. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.js +2 -2
  132. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js +2 -2
  133. package/dist/esm/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.js.map +1 -1
  134. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.js +3 -3
  135. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js +2 -2
  136. package/dist/esm/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.js.map +1 -1
  137. package/dist/esm/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js +2 -2
  138. package/dist/esm/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.js.map +1 -1
  139. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js +3 -3
  140. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.js.map +1 -1
  141. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.js +2 -2
  142. package/dist/esm/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.js +3 -3
  143. package/dist/esm/components/text/text-view.st.css.js +2 -2
  144. package/dist/esm/styles.global.css +1 -1
  145. package/dist/types/components/delete-dialog/delete-dialog.st.css.d.ts.map +1 -1
  146. package/dist/types/components/document/cell-document-edit.d.ts +23 -0
  147. package/dist/types/components/document/cell-document-edit.d.ts.map +1 -0
  148. package/dist/types/components/document/cell-document-view.d.ts +12 -0
  149. package/dist/types/components/document/cell-document-view.d.ts.map +1 -0
  150. package/dist/types/components/document/index.d.ts +2 -0
  151. package/dist/types/components/document/index.d.ts.map +1 -1
  152. package/dist/types/components/document/utils.d.ts.map +1 -1
  153. package/dist/types/components/image/cell-image-edit.d.ts +1 -1
  154. package/dist/types/components/image/cell-image-edit.d.ts.map +1 -1
  155. package/dist/types/components/media-control/cell-media-edit-shell.d.ts +29 -0
  156. package/dist/types/components/media-control/cell-media-edit-shell.d.ts.map +1 -0
  157. package/dist/types/components/media-control/cell-media-edit-shell.st.css.d.ts +13 -0
  158. package/dist/types/components/media-control/cell-media-edit-shell.st.css.d.ts.map +1 -0
  159. package/dist/types/components/media-control/index.d.ts +2 -0
  160. package/dist/types/components/media-control/index.d.ts.map +1 -1
  161. package/dist/types/components/media-control/paste-url-button.st.css.d.ts.map +1 -1
  162. package/dist/types/components/media-control/use-cell-media-edit.d.ts +54 -0
  163. package/dist/types/components/media-control/use-cell-media-edit.d.ts.map +1 -0
  164. package/dist/types/components/reference/cell-reference-input.st.css.d.ts.map +1 -1
  165. package/dist/types/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.d.ts.map +1 -1
  166. package/dist/types/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.d.ts.map +1 -1
  167. package/dist/types/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.d.ts.map +1 -1
  168. package/dist/types/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.d.ts.map +1 -1
  169. package/dist/types/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.d.ts.map +1 -1
  170. package/dist/types/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.d.ts.map +1 -1
  171. package/package.json +3 -3
  172. package/src/__tests__/components/document/cell-document-edit.spec.tsx +101 -0
  173. package/src/__tests__/components/document/cell-document-view.spec.tsx +39 -0
  174. package/src/__tests__/components/document/utils.spec.ts +28 -0
  175. package/src/assets/locale/messages_en.json +9 -9
  176. package/src/components/address/input/address-input.st.css.ts +2 -2
  177. package/src/components/audio/actions/actions-menu/actions-menu.st.css.ts +2 -2
  178. package/src/components/audio/audio-field/form-audio-field.st.css.ts +2 -2
  179. package/src/components/audio/audio-player/audio-player.st.css.ts +2 -2
  180. package/src/components/color-view/color-view.st.css.ts +2 -2
  181. package/src/components/delete-dialog/delete-dialog.st.css.ts +2 -2
  182. package/src/components/document/cell-document-edit.tsx +196 -0
  183. package/src/components/document/cell-document-view.tsx +49 -0
  184. package/src/components/document/form-document-field.st.css.ts +2 -2
  185. package/src/components/document/index.ts +2 -0
  186. package/src/components/document/utils.ts +1 -0
  187. package/src/components/exclamation/exclamation.st.css.ts +2 -2
  188. package/src/components/highlighted-text/highlighted-text.st.css.ts +3 -3
  189. package/src/components/image/cell-image-edit.tsx +112 -196
  190. package/src/components/image/thumbnail-replace-overlay.st.css.ts +2 -2
  191. package/src/components/media-control/cell-media-edit-shell.st.css +4 -0
  192. package/src/components/media-control/cell-media-edit-shell.st.css.ts +25 -0
  193. package/src/components/media-control/cell-media-edit-shell.tsx +101 -0
  194. package/src/components/media-control/index.ts +2 -0
  195. package/src/components/media-control/paste-url-button.st.css.ts +2 -2
  196. package/src/components/media-control/use-cell-media-edit.ts +134 -0
  197. package/src/components/media-gallery/form-media-gallery-field.st.css.ts +2 -2
  198. package/src/components/media-image/media-image.st.css.ts +3 -3
  199. package/src/components/media-image/overlays/overlay.st.css.ts +3 -3
  200. package/src/components/media-loader/media-loader.st.css.ts +2 -2
  201. package/src/components/media-tag/web-media-tag/media-tag.st.css.ts +2 -2
  202. package/src/components/multi-document/multi-document-input/form-multi-document.st.css.ts +2 -2
  203. package/src/components/reference/cell-reference-input.st.css.ts +2 -2
  204. package/src/components/rich-content/rich-content-input/default-value-input/rich-content-default-value-input.st.css.ts +3 -3
  205. package/src/components/rich-content/rich-content-input/form-input/rich-content-form-input.st.css.ts +3 -3
  206. package/src/components/rich-content/rich-content-input/form-read-only-input/rich-content-form-read-only-input.st.css.ts +2 -2
  207. package/src/components/rich-content/rich-content-input/rich-content-common/fullscreen-modal/fullscreen-modal.st.css.ts +2 -2
  208. package/src/components/rich-content/rich-content-input/rich-content-common/publish-loader/publish-loader.st.css.ts +2 -2
  209. package/src/components/rich-content/rich-content-input/rich-content-common/toggle-fullscreen-button/toggle-fullscreen-button.st.css.ts +2 -2
  210. package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-editor.st.css.ts +3 -3
  211. package/src/components/rich-content/rich-content-input/rich-content-editor/rich-content-toolbar.st.css.ts +2 -2
  212. package/src/components/rich-content/rich-content-input/rich-content-viewer/rich-content-viewer.st.css.ts +2 -2
  213. package/src/components/rich-text/rich-text-input/rich-text-editor/rich-editor.st.css.ts +3 -3
  214. package/src/components/rich-text/rich-text-input/rich-text-editor/rich-text-editor.st.css.ts +2 -2
  215. package/src/components/rich-text/rich-text-input/rich-text-editor/toolbar/toolbar.st.css.ts +3 -3
  216. package/src/components/text/text-view.st.css.ts +2 -2
  217. package/src/styles.global.css +1 -1
@@ -0,0 +1,196 @@
1
+ import React from 'react';
2
+ import { Box, IconButton, PopoverMenu, Tag, Tooltip } from '@wix/design-system';
3
+ import {
4
+ Add,
5
+ Delete,
6
+ DocumentSmall,
7
+ Download,
8
+ ExternalLink,
9
+ Link,
10
+ LinkSmall,
11
+ MoreSmall,
12
+ Replace,
13
+ } from '@wix/wix-ui-icons-common';
14
+ import { getMediaTitle, MEDIA_TYPES } from '../../utils/media-utils';
15
+ import { getMediaURL } from '../../auto-field-types';
16
+ import { useTranslations } from '../../hooks';
17
+ import { useWixPatternsContainer } from '@wix/bex-core/react';
18
+ import {
19
+ useCellMediaEdit,
20
+ CellMediaEditShell,
21
+ MediaFieldType,
22
+ } from '../media-control';
23
+ import { openDocument } from './utils';
24
+
25
+ export interface CellDocumentEditProps {
26
+ value: string | null;
27
+ onChange: (value: string | null) => void;
28
+ onCommit: () => void;
29
+ onCancel?: () => void;
30
+ /**
31
+ * Called before opening external UI (media manager / paste-URL form) so the
32
+ * table can set isEditing=true and protect cell focus while the modal is open.
33
+ */
34
+ onStartEdit?: () => void;
35
+ inputRef?: React.MutableRefObject<{ focus: () => void } | null | undefined>;
36
+ dataHook?: string;
37
+ /**
38
+ * Stable DOM id for the Tag. WDS Tag requires `id` to be present; callers are
39
+ * responsible for ensuring uniqueness (e.g., derive from columnId).
40
+ */
41
+ fieldId: string;
42
+ }
43
+
44
+ export const CellDocumentEdit: React.FC<CellDocumentEditProps> = ({
45
+ value,
46
+ onChange,
47
+ onCommit,
48
+ onCancel,
49
+ onStartEdit,
50
+ inputRef,
51
+ dataHook,
52
+ fieldId,
53
+ }) => {
54
+ const { t } = useTranslations();
55
+ const msid = useWixPatternsContainer()?.environment?.msid;
56
+
57
+ const mediaEdit = useCellMediaEdit({
58
+ mediaType: MEDIA_TYPES.ALL_MEDIA,
59
+ value,
60
+ onChange,
61
+ onCommit,
62
+ onCancel,
63
+ onStartEdit,
64
+ inputRef,
65
+ });
66
+
67
+ const pasteUrlTitle = value
68
+ ? t('CMS.document.replaceWithUrl.title')
69
+ : t('CMS.document.pasteUrl.title');
70
+
71
+ const openPasteUrl = mediaEdit.startEditAndOpenPasteUrl({
72
+ title: pasteUrlTitle,
73
+ value: value ?? undefined,
74
+ });
75
+
76
+ const handleOpenDocument = () => {
77
+ if (!value) {
78
+ return;
79
+ }
80
+ openDocument(getMediaURL(value, msid));
81
+ };
82
+
83
+ const handleDownload = () => {
84
+ if (!value) {
85
+ return;
86
+ }
87
+ mediaEdit.downloadMedia(value);
88
+ };
89
+
90
+ return (
91
+ <CellMediaEditShell
92
+ dataHook={dataHook}
93
+ mediaEdit={mediaEdit}
94
+ value={value}
95
+ fieldType={MediaFieldType.document}
96
+ gap="SP1"
97
+ >
98
+ {value ? (
99
+ <Box minWidth="0" style={{ flex: '1 1 auto' }}>
100
+ <Tag
101
+ id={fieldId}
102
+ dataHook="document-edit-tag"
103
+ removable={false}
104
+ thumb={<DocumentSmall />}
105
+ size="small"
106
+ maxWidth="100%"
107
+ >
108
+ {getMediaTitle(value)}
109
+ </Tag>
110
+ </Box>
111
+ ) : (
112
+ <Tooltip content={t('CMS.document.add.button.text')} appendTo="window">
113
+ <IconButton
114
+ size="tiny"
115
+ priority="secondary"
116
+ dataHook="document-edit-add-button"
117
+ ariaLabel={t('CMS.document.add.button.text')}
118
+ onClick={mediaEdit.handleCallMedia}
119
+ >
120
+ <Add />
121
+ </IconButton>
122
+ </Tooltip>
123
+ )}
124
+
125
+ {value ? (
126
+ <PopoverMenu
127
+ textSize="small"
128
+ appendTo="window"
129
+ triggerElement={
130
+ <Tooltip
131
+ content={t('auto-patterns.fields.more_actions_tooltip')}
132
+ appendTo="window"
133
+ >
134
+ <IconButton
135
+ size="tiny"
136
+ priority="tertiary"
137
+ dataHook="document-edit-more-button"
138
+ ariaLabel={t('auto-patterns.fields.more_actions_tooltip')}
139
+ >
140
+ <MoreSmall />
141
+ </IconButton>
142
+ </Tooltip>
143
+ }
144
+ >
145
+ <PopoverMenu.MenuItem
146
+ dataHook="document-edit-action-replace"
147
+ text={t('CMS.document.action.replace')}
148
+ prefixIcon={<Replace />}
149
+ onClick={mediaEdit.handleCallMedia}
150
+ />
151
+ <PopoverMenu.MenuItem
152
+ dataHook="document-edit-action-replace-url"
153
+ text={t('CMS.document.action.replaceWithUrl')}
154
+ prefixIcon={<Link />}
155
+ onClick={openPasteUrl}
156
+ />
157
+ <PopoverMenu.Divider />
158
+ <PopoverMenu.MenuItem
159
+ dataHook="document-edit-action-open"
160
+ text={t('CMS.document.action.open')}
161
+ prefixIcon={<ExternalLink />}
162
+ onClick={handleOpenDocument}
163
+ />
164
+ <PopoverMenu.MenuItem
165
+ dataHook="document-edit-action-download"
166
+ text={t('CMS.document.action.download')}
167
+ prefixIcon={<Download />}
168
+ onClick={handleDownload}
169
+ />
170
+ <PopoverMenu.Divider />
171
+ <PopoverMenu.MenuItem
172
+ dataHook="document-edit-action-delete"
173
+ text={t('CMS.document.action.delete')}
174
+ skin="destructive"
175
+ prefixIcon={<Delete />}
176
+ onClick={mediaEdit.handleDelete}
177
+ />
178
+ </PopoverMenu>
179
+ ) : (
180
+ <Tooltip content={t('CMS.document.pasteUrl.button')} appendTo="window">
181
+ <IconButton
182
+ size="tiny"
183
+ priority="tertiary"
184
+ dataHook="document-edit-paste-url-button"
185
+ ariaLabel={t('CMS.document.pasteUrl.button')}
186
+ onClick={openPasteUrl}
187
+ >
188
+ <LinkSmall />
189
+ </IconButton>
190
+ </Tooltip>
191
+ )}
192
+ </CellMediaEditShell>
193
+ );
194
+ };
195
+
196
+ CellDocumentEdit.displayName = 'CellDocumentEdit';
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ import { Box, Tag } from '@wix/design-system';
3
+ import { DocumentSmall } from '@wix/wix-ui-icons-common';
4
+
5
+ import { getMediaTitle } from '../../utils/media-utils';
6
+
7
+ export interface CellDocumentViewProps {
8
+ value: string | null | undefined;
9
+ dataHook?: string;
10
+ /**
11
+ * Stable DOM id for the Tag. WDS Tag requires `id` to be present; callers are
12
+ * responsible for ensuring uniqueness (e.g., derive from columnId + rowKey).
13
+ */
14
+ fieldId: string;
15
+ }
16
+
17
+ export const CellDocumentView: React.FC<CellDocumentViewProps> = ({
18
+ value,
19
+ dataHook,
20
+ fieldId,
21
+ }) => {
22
+ if (!value) {
23
+ return null;
24
+ }
25
+
26
+ return (
27
+ <Box
28
+ dataHook={dataHook}
29
+ verticalAlign="middle"
30
+ padding="0 8px"
31
+ height="100%"
32
+ width="100%"
33
+ minWidth="0"
34
+ >
35
+ <Tag
36
+ id={fieldId}
37
+ dataHook="cell-document-tag"
38
+ removable={false}
39
+ thumb={<DocumentSmall />}
40
+ size="small"
41
+ maxWidth="100%"
42
+ >
43
+ {getMediaTitle(value)}
44
+ </Tag>
45
+ </Box>
46
+ );
47
+ };
48
+
49
+ CellDocumentView.displayName = 'CellDocumentView';
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "formdocumentfield2704345605";
8
+ var _namespace_ = "formdocumentfield3905880661";
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":"formdocumentfield2704345605__root","viewWrapper":"formdocumentfield2704345605__viewWrapper","textWidth":"formdocumentfield2704345605__textWidth","documentLoader":"formdocumentfield2704345605__documentLoader","addDocument":"formdocumentfield2704345605__addDocument","addItemWrapper":"formdocumentfield2704345605__addItemWrapper"};
16
+ export var classes = {"root":"formdocumentfield3905880661__root","viewWrapper":"formdocumentfield3905880661__viewWrapper","textWidth":"formdocumentfield3905880661__textWidth","documentLoader":"formdocumentfield3905880661__documentLoader","addDocument":"formdocumentfield3905880661__addDocument","addItemWrapper":"formdocumentfield3905880661__addItemWrapper"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};
@@ -1,4 +1,6 @@
1
1
  export * from './document-view';
2
+ export * from './cell-document-view';
3
+ export * from './cell-document-edit';
2
4
 
3
5
  // NOTE: Heavy exports (FormDocumentField, DocumentControl, etc.) have been moved to './form' to prevent bundle bloat.
4
6
  // Import them explicitly: import { FormDocumentField } from '../fields/components/document/form';
@@ -2,6 +2,7 @@ export const openDocument = (url: string) => {
2
2
  const link = document.createElement('a');
3
3
  link.href = url;
4
4
  link.target = '_blank';
5
+ link.rel = 'noopener noreferrer';
5
6
  document.body.appendChild(link);
6
7
 
7
8
  link.click();
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "exclamation3211065829";
8
+ var _namespace_ = "exclamation3539476362";
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":"exclamation3211065829__root","exclamation":"exclamation3211065829__exclamation","actions":"exclamation3211065829__actions","action":"exclamation3211065829__action"};
16
+ export var classes = {"root":"exclamation3539476362__root","exclamation":"exclamation3539476362__exclamation","actions":"exclamation3539476362__actions","action":"exclamation3539476362__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_ = "highlightedtext1118078999";
8
+ var _namespace_ = "highlightedtext3677604336";
9
9
  var _style_ = classesRuntime.bind(null, _namespace_);
10
10
 
11
11
  export var cssStates = statesRuntime.bind(null, _namespace_);
@@ -13,8 +13,8 @@ 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":"highlightedtext1118078999__root","substring":"highlightedtext1118078999__substring"};
17
- export var keyframes = {"highlighted":"highlightedtext1118078999__highlighted","highlighted-match":"highlightedtext1118078999__highlighted-match"};
16
+ export var classes = {"root":"highlightedtext3677604336__root","substring":"highlightedtext3677604336__substring"};
17
+ export var keyframes = {"highlighted":"highlightedtext3677604336__highlighted","highlighted-match":"highlightedtext3677604336__highlighted-match"};
18
18
  export var layers = {};
19
19
  export var containers = {};
20
20
  export var stVars = {};
@@ -1,32 +1,25 @@
1
- import React, { useCallback, useRef } from 'react';
2
- import {
3
- Box,
4
- IconButton,
5
- Loader,
6
- PopoverMenu,
7
- Tooltip,
8
- } from '@wix/design-system';
1
+ import React from 'react';
2
+ import { Box, IconButton, PopoverMenu, Tooltip } from '@wix/design-system';
9
3
  import {
10
4
  Add,
5
+ Delete,
6
+ Link,
11
7
  LinkSmall,
12
8
  MoreSmall,
13
9
  Replace,
14
- Link,
15
- Delete,
16
10
  } from '@wix/wix-ui-icons-common';
17
11
  import { MEDIA_TYPES } from '../../utils/media-utils';
18
- import { useTranslations, useCellEditKeyboard } from '../../hooks';
12
+ import { useTranslations } from '../../hooks';
19
13
  import {
20
- useMediaControl,
21
- usePasteURLForm,
22
- PasteURLForm,
14
+ useCellMediaEdit,
15
+ CellMediaEditShell,
23
16
  MediaFieldType,
24
17
  } from '../media-control';
25
18
  import { ImageThumbnail } from './image-thumbnail';
26
19
  import { ThumbnailReplaceOverlay } from './thumbnail-replace-overlay';
27
20
 
28
21
  export interface CellImageEditProps {
29
- value: string | null | undefined;
22
+ value: string | null;
30
23
  onChange: (value: string | null) => void;
31
24
  onCommit: () => void;
32
25
  onCancel?: () => void;
@@ -49,200 +42,123 @@ export const CellImageEdit: React.FC<CellImageEditProps> = ({
49
42
  dataHook,
50
43
  }) => {
51
44
  const { t } = useTranslations();
52
- const containerRef = useRef<HTMLDivElement | null>(null);
53
-
54
- const onMediaChange = useCallback(
55
- (uri: string) => {
56
- onChange(uri);
57
- onCommit();
58
- },
59
- [onChange, onCommit],
60
- );
61
45
 
62
- const { callMedia, loading } = useMediaControl({
46
+ const mediaEdit = useCellMediaEdit({
63
47
  mediaType: MEDIA_TYPES.IMAGE,
64
- value: value ?? undefined,
65
- onChange: onMediaChange,
66
- });
67
-
68
- const handleCallMedia = useCallback(async () => {
69
- onStartEdit?.();
70
- const committed = await callMedia();
71
- if (!committed) {
72
- onCancel?.();
73
- }
74
- }, [onStartEdit, callMedia, onCancel]);
75
-
76
- const pasteUrlTitle = t('CMS.image.replaceWithUrl.title');
77
- const { isOpen, title, onOpen, onClose, onSave } = usePasteURLForm({
78
- onChange: onMediaChange,
79
- });
80
-
81
- // When the paste-URL form is dismissed without saving, cancel the in-progress
82
- // edit so isEditing returns to false and useClearFocusOnBlur works normally.
83
- const handleFormClose = useCallback(() => {
84
- onClose();
85
- onCancel?.();
86
- }, [onClose, onCancel]);
87
-
88
- const handleOpenPasteUrl = useCallback(
89
- (params: { title: string; value?: string }) => () => {
90
- onStartEdit?.();
91
- onOpen(params)();
92
- },
93
- [onStartEdit, onOpen],
94
- );
95
-
96
- const handleDelete = useCallback(() => {
97
- onChange(null);
98
- onCommit();
99
- }, [onChange, onCommit]);
100
-
101
- const { handleContainerFocus, handleContainerBlur } = useCellEditKeyboard({
102
- containerRef,
48
+ value,
49
+ onChange,
50
+ onCommit,
103
51
  onCancel,
52
+ onStartEdit,
104
53
  inputRef,
105
54
  });
106
55
 
107
- if (loading) {
108
- return (
109
- <Box
110
- dataHook={dataHook}
111
- verticalAlign="middle"
112
- width="100%"
113
- height="100%"
114
- padding="0 8px"
115
- >
116
- <Loader size="tiny" />
117
- </Box>
118
- );
119
- }
56
+ const openPasteUrl = mediaEdit.startEditAndOpenPasteUrl({
57
+ title: t('CMS.image.replaceWithUrl.title'),
58
+ value: value ?? undefined,
59
+ });
120
60
 
121
61
  return (
122
- <div
123
- ref={containerRef}
124
- data-hook={dataHook}
125
- style={{ width: '100%', height: '100%' }}
126
- onFocus={handleContainerFocus}
127
- onBlur={handleContainerBlur}
62
+ <CellMediaEditShell
63
+ dataHook={dataHook}
64
+ mediaEdit={mediaEdit}
65
+ value={value}
66
+ fieldType={MediaFieldType.image}
128
67
  >
129
- <Box
130
- align="space-between"
131
- verticalAlign="middle"
132
- height="100%"
133
- padding="0 8px"
134
- style={{ boxSizing: 'border-box' }}
135
- >
136
- {value ? (
137
- /* Has value: clickable thumbnail button with replace overlay */
138
- <Tooltip content={t('CMS.image.replace')} appendTo="window">
139
- <Box>
140
- <button
141
- type="button"
142
- data-hook="image-edit-thumbnail"
143
- onClick={handleCallMedia}
144
- style={{
145
- cursor: 'pointer',
146
- lineHeight: 0,
147
- position: 'relative',
148
- background: 'none',
149
- border: 'none',
150
- padding: 0,
151
- }}
152
- >
153
- <ImageThumbnail value={value} />
154
- <ThumbnailReplaceOverlay />
155
- </button>
156
- </Box>
157
- </Tooltip>
158
- ) : (
159
- /* Empty: icon button opens media manager */
160
- <Tooltip content={t('CMS.image.add')} appendTo="window">
161
- <IconButton
162
- size="tiny"
163
- priority="secondary"
164
- dataHook="image-edit-add-button"
165
- onClick={handleCallMedia}
68
+ {value ? (
69
+ /* Has value: clickable thumbnail button with replace overlay */
70
+ <Tooltip content={t('CMS.image.replace')} appendTo="window">
71
+ <Box>
72
+ <button
73
+ type="button"
74
+ data-hook="image-edit-thumbnail"
75
+ onClick={mediaEdit.handleCallMedia}
76
+ style={{
77
+ cursor: 'pointer',
78
+ lineHeight: 0,
79
+ position: 'relative',
80
+ background: 'none',
81
+ border: 'none',
82
+ padding: 0,
83
+ }}
166
84
  >
167
- <Add />
168
- </IconButton>
169
- </Tooltip>
170
- )}
85
+ <ImageThumbnail value={value} />
86
+ <ThumbnailReplaceOverlay />
87
+ </button>
88
+ </Box>
89
+ </Tooltip>
90
+ ) : (
91
+ /* Empty: icon button opens media manager */
92
+ <Tooltip content={t('CMS.image.add')} appendTo="window">
93
+ <IconButton
94
+ size="tiny"
95
+ priority="secondary"
96
+ dataHook="image-edit-add-button"
97
+ onClick={mediaEdit.handleCallMedia}
98
+ >
99
+ <Add />
100
+ </IconButton>
101
+ </Tooltip>
102
+ )}
171
103
 
172
- {value ? (
173
- /* Has value: "..." menu with Replace / Replace with URL / Delete */
174
- <PopoverMenu
175
- textSize="small"
176
- appendTo="window"
177
- triggerElement={
178
- <Tooltip
179
- content={t('auto-patterns.fields.more_actions_tooltip')}
180
- appendTo="window"
104
+ {value ? (
105
+ /* Has value: "..." menu with Replace / Replace with URL / Delete */
106
+ <PopoverMenu
107
+ textSize="small"
108
+ appendTo="window"
109
+ triggerElement={
110
+ <Tooltip
111
+ content={t('auto-patterns.fields.more_actions_tooltip')}
112
+ appendTo="window"
113
+ >
114
+ <IconButton
115
+ size="tiny"
116
+ priority="tertiary"
117
+ dataHook="image-edit-more-button"
181
118
  >
182
- <IconButton
183
- size="tiny"
184
- priority="tertiary"
185
- dataHook="image-edit-more-button"
186
- >
187
- <MoreSmall />
188
- </IconButton>
189
- </Tooltip>
190
- }
119
+ <MoreSmall />
120
+ </IconButton>
121
+ </Tooltip>
122
+ }
123
+ >
124
+ <PopoverMenu.MenuItem
125
+ dataHook="image-edit-action-replace"
126
+ text={t('CMS.image.replace')}
127
+ prefixIcon={<Replace />}
128
+ onClick={mediaEdit.handleCallMedia}
129
+ />
130
+ <PopoverMenu.MenuItem
131
+ dataHook="image-edit-action-replace-url"
132
+ text={t('CMS.image.replaceWithUrl.button')}
133
+ prefixIcon={<Link />}
134
+ onClick={openPasteUrl}
135
+ />
136
+ <PopoverMenu.Divider />
137
+ <PopoverMenu.MenuItem
138
+ dataHook="image-edit-action-delete"
139
+ text={t('CMS.image.clear')}
140
+ skin="destructive"
141
+ prefixIcon={<Delete />}
142
+ onClick={mediaEdit.handleDelete}
143
+ />
144
+ </PopoverMenu>
145
+ ) : (
146
+ /* Empty: icon button opens paste-URL form */
147
+ <Tooltip
148
+ content={t('CMS.image.replaceWithUrl.button')}
149
+ appendTo="window"
150
+ >
151
+ <IconButton
152
+ size="tiny"
153
+ priority="tertiary"
154
+ dataHook="image-edit-paste-url-button"
155
+ onClick={openPasteUrl}
191
156
  >
192
- <PopoverMenu.MenuItem
193
- dataHook="image-edit-action-replace"
194
- text={t('CMS.image.replace')}
195
- prefixIcon={<Replace />}
196
- onClick={handleCallMedia}
197
- />
198
- <PopoverMenu.MenuItem
199
- dataHook="image-edit-action-replace-url"
200
- text={t('CMS.image.replaceWithUrl.button')}
201
- prefixIcon={<Link />}
202
- onClick={handleOpenPasteUrl({
203
- title: pasteUrlTitle,
204
- value: value ?? undefined,
205
- })}
206
- />
207
- <PopoverMenu.Divider />
208
- <PopoverMenu.MenuItem
209
- dataHook="image-edit-action-delete"
210
- text={t('CMS.image.clear')}
211
- skin="destructive"
212
- prefixIcon={<Delete />}
213
- onClick={handleDelete}
214
- />
215
- </PopoverMenu>
216
- ) : (
217
- /* Empty: icon button opens paste-URL form */
218
- <Tooltip
219
- content={t('CMS.image.replaceWithUrl.button')}
220
- appendTo="window"
221
- >
222
- <IconButton
223
- size="tiny"
224
- priority="tertiary"
225
- dataHook="image-edit-paste-url-button"
226
- onClick={handleOpenPasteUrl({
227
- title: pasteUrlTitle,
228
- value: value ?? undefined,
229
- })}
230
- >
231
- <LinkSmall />
232
- </IconButton>
233
- </Tooltip>
234
- )}
235
- </Box>
236
-
237
- <PasteURLForm
238
- title={title}
239
- value={value ?? undefined}
240
- show={isOpen}
241
- closeModal={handleFormClose}
242
- onSave={onSave}
243
- fieldType={MediaFieldType.image}
244
- />
245
- </div>
157
+ <LinkSmall />
158
+ </IconButton>
159
+ </Tooltip>
160
+ )}
161
+ </CellMediaEditShell>
246
162
  );
247
163
  };
248
164
 
@@ -5,7 +5,7 @@ import { classesRuntime, statesRuntime } from "../../stylable-esm-runtime.js";
5
5
 
6
6
 
7
7
 
8
- var _namespace_ = "thumbnailreplaceoverlay2563000771";
8
+ var _namespace_ = "thumbnailreplaceoverlay4132621481";
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":"thumbnailreplaceoverlay2563000771__root","icon":"thumbnailreplaceoverlay2563000771__icon"};
16
+ export var classes = {"root":"thumbnailreplaceoverlay4132621481__root","icon":"thumbnailreplaceoverlay4132621481__icon"};
17
17
  export var keyframes = {};
18
18
  export var layers = {};
19
19
  export var containers = {};