@questpie/admin 3.2.3 → 3.2.5

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 (244) hide show
  1. package/dist/client/blocks/block-renderer.d.mts +2 -2
  2. package/dist/client/blocks/block-renderer.mjs +164 -339
  3. package/dist/client/components/actions/action-button.mjs +9 -9
  4. package/dist/client/components/actions/action-dialog.mjs +195 -493
  5. package/dist/client/components/actions/confirmation-dialog.mjs +44 -159
  6. package/dist/client/components/actions/header-actions.mjs +73 -165
  7. package/dist/client/components/admin-link.d.mts +2 -2
  8. package/dist/client/components/admin-link.mjs +40 -126
  9. package/dist/client/components/auth/auth-loading.mjs +9 -44
  10. package/dist/client/components/blocks/block-canvas.mjs +31 -95
  11. package/dist/client/components/blocks/block-editor-context.mjs +13 -57
  12. package/dist/client/components/blocks/block-editor-layout.mjs +72 -166
  13. package/dist/client/components/blocks/block-editor-provider.mjs +184 -245
  14. package/dist/client/components/blocks/block-fields-renderer.mjs +54 -229
  15. package/dist/client/components/blocks/block-insert-button.mjs +49 -165
  16. package/dist/client/components/blocks/block-item-menu.mjs +102 -301
  17. package/dist/client/components/blocks/block-item.mjs +136 -370
  18. package/dist/client/components/blocks/block-library-sidebar.mjs +106 -220
  19. package/dist/client/components/blocks/block-tree.mjs +12 -68
  20. package/dist/client/components/blocks/block-type-icon.mjs +14 -56
  21. package/dist/client/components/brand-logo.mjs +35 -149
  22. package/dist/client/components/component-renderer.mjs +42 -118
  23. package/dist/client/components/error-boundary.mjs +14 -58
  24. package/dist/client/components/fields/array-field.mjs +209 -521
  25. package/dist/client/components/fields/asset-preview-field.mjs +41 -141
  26. package/dist/client/components/fields/blocks-field/blocks-field.mjs +60 -156
  27. package/dist/client/components/fields/boolean-field.mjs +29 -59
  28. package/dist/client/components/fields/date-field.mjs +7 -37
  29. package/dist/client/components/fields/datetime-field.mjs +7 -38
  30. package/dist/client/components/fields/email-field.mjs +25 -54
  31. package/dist/client/components/fields/field-wrapper.mjs +30 -105
  32. package/dist/client/components/fields/json-field.mjs +107 -313
  33. package/dist/client/components/fields/locale-badge.mjs +6 -15
  34. package/dist/client/components/fields/number-field.mjs +27 -60
  35. package/dist/client/components/fields/object-array-field.mjs +283 -659
  36. package/dist/client/components/fields/object-field.mjs +165 -633
  37. package/dist/client/components/fields/relation/displays/cards-display.mjs +106 -220
  38. package/dist/client/components/fields/relation/displays/chips-display.mjs +78 -150
  39. package/dist/client/components/fields/relation/displays/grid-display.mjs +92 -186
  40. package/dist/client/components/fields/relation/displays/list-display.mjs +122 -239
  41. package/dist/client/components/fields/relation/displays/table-display.mjs +70 -244
  42. package/dist/client/components/fields/relation/relation-items-display.mjs +30 -126
  43. package/dist/client/components/fields/relation-field.mjs +10 -66
  44. package/dist/client/components/fields/relation-picker.mjs +18 -18
  45. package/dist/client/components/fields/relation-select.mjs +12 -12
  46. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +80 -182
  47. package/dist/client/components/fields/rich-text-editor/image-popover.mjs +8 -19
  48. package/dist/client/components/fields/rich-text-editor/image-upload.mjs +13 -29
  49. package/dist/client/components/fields/rich-text-editor/index.mjs +196 -530
  50. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +61 -111
  51. package/dist/client/components/fields/rich-text-editor/table-controls.mjs +105 -415
  52. package/dist/client/components/fields/rich-text-editor/toolbar.mjs +256 -511
  53. package/dist/client/components/fields/rich-text-field.mjs +14 -53
  54. package/dist/client/components/fields/select-field.mjs +39 -74
  55. package/dist/client/components/fields/text-field.mjs +26 -59
  56. package/dist/client/components/fields/textarea-field.mjs +26 -58
  57. package/dist/client/components/fields/time-field.mjs +7 -35
  58. package/dist/client/components/fields/upload-field.mjs +47 -165
  59. package/dist/client/components/filter-builder/columns-tab.mjs +80 -280
  60. package/dist/client/components/filter-builder/filter-builder-sheet.mjs +197 -540
  61. package/dist/client/components/filter-builder/filters-tab.mjs +96 -386
  62. package/dist/client/components/filter-builder/saved-views-tab.mjs +133 -351
  63. package/dist/client/components/history-sidebar.mjs +306 -611
  64. package/dist/client/components/layout/field-layout-renderer.mjs +106 -254
  65. package/dist/client/components/locale-switcher.mjs +106 -228
  66. package/dist/client/components/media/media-grid.mjs +84 -273
  67. package/dist/client/components/media/media-picker-dialog.mjs +177 -494
  68. package/dist/client/components/preview/live-preview-mode.mjs +240 -438
  69. package/dist/client/components/preview/preview-pane.mjs +22 -22
  70. package/dist/client/components/primitives/asset-preview.mjs +290 -666
  71. package/dist/client/components/primitives/checkbox-input.mjs +9 -35
  72. package/dist/client/components/primitives/date-input.mjs +109 -327
  73. package/dist/client/components/primitives/dropzone.mjs +209 -336
  74. package/dist/client/components/primitives/field-select-control.mjs +12 -80
  75. package/dist/client/components/primitives/number-input.mjs +4 -4
  76. package/dist/client/components/primitives/select-multi.mjs +200 -559
  77. package/dist/client/components/primitives/select-single.mjs +165 -499
  78. package/dist/client/components/primitives/time-input.mjs +43 -117
  79. package/dist/client/components/primitives/toggle-input.mjs +9 -29
  80. package/dist/client/components/sheets/resource-sheet.mjs +61 -70
  81. package/dist/client/components/ui/accordion.mjs +35 -155
  82. package/dist/client/components/ui/alert.mjs +13 -68
  83. package/dist/client/components/ui/badge.mjs +9 -51
  84. package/dist/client/components/ui/button.mjs +8 -54
  85. package/dist/client/components/ui/card.mjs +37 -193
  86. package/dist/client/components/ui/checkbox.mjs +12 -68
  87. package/dist/client/components/ui/command.mjs +48 -219
  88. package/dist/client/components/ui/dialog.mjs +50 -262
  89. package/dist/client/components/ui/drawer.mjs +55 -259
  90. package/dist/client/components/ui/dropdown-menu.mjs +86 -427
  91. package/dist/client/components/ui/empty-state.mjs +28 -98
  92. package/dist/client/components/ui/field.mjs +73 -309
  93. package/dist/client/components/ui/input-group.mjs +42 -167
  94. package/dist/client/components/ui/input.mjs +7 -37
  95. package/dist/client/components/ui/kbd.mjs +6 -36
  96. package/dist/client/components/ui/label.mjs +7 -37
  97. package/dist/client/components/ui/popover.mjs +34 -169
  98. package/dist/client/components/ui/responsive-dialog.mjs +67 -273
  99. package/dist/client/components/ui/scroll-fade.mjs +63 -158
  100. package/dist/client/components/ui/search-input.mjs +33 -100
  101. package/dist/client/components/ui/select.mjs +72 -393
  102. package/dist/client/components/ui/separator.mjs +7 -38
  103. package/dist/client/components/ui/sheet.mjs +49 -269
  104. package/dist/client/components/ui/sidebar.mjs +171 -690
  105. package/dist/client/components/ui/skeleton.mjs +7 -38
  106. package/dist/client/components/ui/sonner.mjs +11 -42
  107. package/dist/client/components/ui/switch.mjs +9 -45
  108. package/dist/client/components/ui/table.mjs +48 -266
  109. package/dist/client/components/ui/tabs.mjs +26 -139
  110. package/dist/client/components/ui/textarea.mjs +6 -32
  111. package/dist/client/components/ui/tooltip.mjs +27 -129
  112. package/dist/client/components/widgets/chart-widget.mjs +174 -522
  113. package/dist/client/components/widgets/progress-widget.mjs +66 -172
  114. package/dist/client/components/widgets/quick-actions-widget.mjs +102 -261
  115. package/dist/client/components/widgets/recent-items-widget.mjs +69 -195
  116. package/dist/client/components/widgets/stats-widget.mjs +41 -175
  117. package/dist/client/components/widgets/table-widget.mjs +9 -9
  118. package/dist/client/components/widgets/timeline-widget.mjs +86 -226
  119. package/dist/client/components/widgets/value-widget.mjs +74 -381
  120. package/dist/client/components/widgets/widget-empty-state.mjs +26 -76
  121. package/dist/client/components/widgets/widget-skeletons.mjs +138 -421
  122. package/dist/client/contexts/focus-context.d.mts +4 -0
  123. package/dist/client/contexts/focus-context.mjs +87 -150
  124. package/dist/client/hooks/typed-hooks.mjs +241 -701
  125. package/dist/client/hooks/use-action.mjs +62 -198
  126. package/dist/client/hooks/use-admin-config.mjs +5 -35
  127. package/dist/client/hooks/use-admin-preferences.mjs +16 -88
  128. package/dist/client/hooks/use-admin-routes.mjs +22 -56
  129. package/dist/client/hooks/use-audit-history.mjs +21 -69
  130. package/dist/client/hooks/use-brand.mjs +1 -9
  131. package/dist/client/hooks/use-collection-fields.mjs +17 -57
  132. package/dist/client/hooks/use-collection-meta.mjs +12 -44
  133. package/dist/client/hooks/use-collection-schema.mjs +10 -33
  134. package/dist/client/hooks/use-collection-validation.mjs +23 -53
  135. package/dist/client/hooks/use-collection.mjs +194 -614
  136. package/dist/client/hooks/use-current-user.mjs +0 -1
  137. package/dist/client/hooks/use-field-hooks.mjs +10 -10
  138. package/dist/client/hooks/use-field-options.mjs +61 -202
  139. package/dist/client/hooks/use-global-fields.mjs +14 -46
  140. package/dist/client/hooks/use-global-meta.mjs +9 -30
  141. package/dist/client/hooks/use-global-schema.mjs +9 -30
  142. package/dist/client/hooks/use-global.mjs +63 -219
  143. package/dist/client/hooks/use-locks.mjs +117 -325
  144. package/dist/client/hooks/use-media-query.mjs +16 -36
  145. package/dist/client/hooks/use-prefill-params.mjs +0 -1
  146. package/dist/client/hooks/use-questpie-query-options.mjs +12 -29
  147. package/dist/client/hooks/use-reactive-fields.mjs +1 -1
  148. package/dist/client/hooks/use-reactive-prop.mjs +65 -223
  149. package/dist/client/hooks/use-realtime-highlight.mjs +51 -114
  150. package/dist/client/hooks/use-saved-views.mjs +22 -103
  151. package/dist/client/hooks/use-search-param-toggle.mjs +28 -79
  152. package/dist/client/hooks/use-search.mjs +31 -143
  153. package/dist/client/hooks/use-server-actions.mjs +18 -50
  154. package/dist/client/hooks/use-server-validation.mjs +72 -166
  155. package/dist/client/hooks/use-server-widget-data.mjs +7 -33
  156. package/dist/client/hooks/use-setup-status.mjs +12 -25
  157. package/dist/client/hooks/use-sidebar-search-param.mjs +33 -78
  158. package/dist/client/hooks/use-transition-stage.mjs +8 -38
  159. package/dist/client/hooks/use-upload.mjs +54 -152
  160. package/dist/client/hooks/use-validation-error-map.mjs +6 -26
  161. package/dist/client/hooks/use-view-state.mjs +187 -437
  162. package/dist/client/i18n/hooks.mjs +65 -197
  163. package/dist/client/lib/render-profiler.mjs +14 -41
  164. package/dist/client/preview/block-scope-context.d.mts +2 -2
  165. package/dist/client/preview/block-scope-context.mjs +14 -36
  166. package/dist/client/preview/diff.mjs +110 -0
  167. package/dist/client/preview/preview-banner.mjs +42 -108
  168. package/dist/client/preview/preview-field.d.mts +4 -4
  169. package/dist/client/preview/preview-field.mjs +166 -409
  170. package/dist/client/preview/use-collection-preview.mjs +135 -201
  171. package/dist/client/runtime/content-locales-provider.mjs +31 -83
  172. package/dist/client/runtime/locale-scope.mjs +22 -63
  173. package/dist/client/runtime/provider.mjs +100 -255
  174. package/dist/client/runtime/translations-provider.mjs +41 -107
  175. package/dist/client/scope/picker.d.mts +2 -2
  176. package/dist/client/scope/picker.mjs +86 -321
  177. package/dist/client/scope/provider.d.mts +2 -2
  178. package/dist/client/scope/provider.mjs +8 -17
  179. package/dist/client/views/auth/accept-invite-form.d.mts +2 -2
  180. package/dist/client/views/auth/accept-invite-form.mjs +121 -412
  181. package/dist/client/views/auth/auth-layout.d.mts +3 -3
  182. package/dist/client/views/auth/auth-layout.mjs +104 -284
  183. package/dist/client/views/auth/forgot-password-form.d.mts +2 -2
  184. package/dist/client/views/auth/forgot-password-form.mjs +94 -325
  185. package/dist/client/views/auth/invite-form.mjs +107 -442
  186. package/dist/client/views/auth/login-form.d.mts +2 -2
  187. package/dist/client/views/auth/login-form.mjs +116 -337
  188. package/dist/client/views/auth/reset-password-form.mjs +128 -453
  189. package/dist/client/views/auth/setup-form.mjs +140 -478
  190. package/dist/client/views/collection/auto-form-fields.mjs +243 -615
  191. package/dist/client/views/collection/bulk-action-toolbar.mjs +212 -400
  192. package/dist/client/views/collection/cells/complex-cells.mjs +183 -611
  193. package/dist/client/views/collection/cells/primitive-cells.mjs +109 -363
  194. package/dist/client/views/collection/cells/relation-cells.mjs +86 -233
  195. package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +142 -371
  196. package/dist/client/views/collection/cells/shared/relation-chip.mjs +35 -131
  197. package/dist/client/views/collection/cells/upload-cells.mjs +60 -177
  198. package/dist/client/views/collection/columns/build-columns.mjs +8 -48
  199. package/dist/client/views/collection/field-renderer.mjs +11 -24
  200. package/dist/client/views/collection/form-view.mjs +288 -560
  201. package/dist/client/views/collection/table-view.mjs +239 -469
  202. package/dist/client/views/collection/view-skeletons.mjs +112 -237
  203. package/dist/client/views/common/global-search.mjs +241 -543
  204. package/dist/client/views/dashboard/dashboard-grid.mjs +256 -775
  205. package/dist/client/views/dashboard/dashboard-widget.mjs +38 -126
  206. package/dist/client/views/dashboard/widget-card.mjs +61 -269
  207. package/dist/client/views/globals/global-form-view.mjs +478 -1298
  208. package/dist/client/views/layout/admin-layout-provider.mjs +28 -88
  209. package/dist/client/views/layout/admin-layout.mjs +83 -246
  210. package/dist/client/views/layout/admin-router.mjs +457 -1289
  211. package/dist/client/views/layout/admin-sidebar.mjs +510 -1292
  212. package/dist/client/views/layout/admin-theme.mjs +30 -64
  213. package/dist/client/views/layout/admin-view-layout.mjs +40 -144
  214. package/dist/client/views/pages/accept-invite-page.mjs +95 -290
  215. package/dist/client/views/pages/dashboard-page.mjs +11 -57
  216. package/dist/client/views/pages/forgot-password-page.mjs +31 -83
  217. package/dist/client/views/pages/invite-page.mjs +35 -90
  218. package/dist/client/views/pages/login-page.mjs +41 -121
  219. package/dist/client/views/pages/reset-password-page.d.mts +2 -2
  220. package/dist/client/views/pages/reset-password-page.mjs +46 -173
  221. package/dist/client/views/pages/setup-page.d.mts +2 -2
  222. package/dist/client/views/pages/setup-page.mjs +33 -95
  223. package/dist/components/rich-text/rich-text-renderer.d.mts +2 -2
  224. package/dist/components/rich-text/rich-text-renderer.mjs +9 -33
  225. package/dist/server/modules/admin/collections/account.d.mts +50 -50
  226. package/dist/server/modules/admin/collections/admin-locks.d.mts +54 -54
  227. package/dist/server/modules/admin/collections/admin-preferences.d.mts +39 -39
  228. package/dist/server/modules/admin/collections/admin-saved-views.d.mts +47 -47
  229. package/dist/server/modules/admin/collections/apikey.d.mts +68 -68
  230. package/dist/server/modules/admin/collections/assets.d.mts +34 -34
  231. package/dist/server/modules/admin/collections/session.d.mts +42 -42
  232. package/dist/server/modules/admin/collections/user.d.mts +53 -53
  233. package/dist/server/modules/admin/collections/verification.d.mts +36 -36
  234. package/dist/server/modules/admin/index.d.mts +21 -20
  235. package/dist/server/modules/admin/routes/admin-config.d.mts +2 -2
  236. package/dist/server/modules/admin/routes/execute-action.d.mts +9 -9
  237. package/dist/server/modules/admin/routes/locales.d.mts +2 -2
  238. package/dist/server/modules/admin/routes/preview.d.mts +11 -11
  239. package/dist/server/modules/admin/routes/reactive.d.mts +9 -9
  240. package/dist/server/modules/admin/routes/setup.d.mts +7 -7
  241. package/dist/server/modules/admin/routes/translations.d.mts +4 -4
  242. package/dist/server/modules/admin/routes/widget-data.d.mts +5 -5
  243. package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +27 -27
  244. package/package.json +3 -5
@@ -90,26 +90,26 @@ function RelationPicker({ name, value, onChange, targetCollection, label, filter
90
90
  const options = { limit: 50 };
91
91
  if (search) options.search = search;
92
92
  if (filter) options.where = filter;
93
- const response_0 = await client.collections[targetCollection].find(options);
93
+ const response = await client.collections[targetCollection].find(options);
94
94
  let docs;
95
- if (response_0) if (response_0.docs) docs = response_0.docs;
95
+ if (response) if (response.docs) docs = response.docs;
96
96
  else docs = [];
97
97
  else docs = [];
98
98
  const selectedIdSet = new Set(selectedIds);
99
99
  return docs.filter((opt) => !selectedIdSet.has(opt.id)).map((item) => {
100
- let label_0;
101
- if (renderOption) label_0 = String(renderOption(item));
102
- else if (item._title) label_0 = item._title;
103
- else if (item.id) label_0 = item.id;
104
- else label_0 = "";
100
+ let label$1;
101
+ if (renderOption) label$1 = String(renderOption(item));
102
+ else if (item._title) label$1 = item._title;
103
+ else if (item.id) label$1 = item.id;
104
+ else label$1 = "";
105
105
  return {
106
106
  value: item.id,
107
- label: label_0,
107
+ label: label$1,
108
108
  icon: resolveIconElement(collectionIconRef, { className: "size-3.5 text-muted-foreground" })
109
109
  };
110
110
  });
111
- } catch (error_0) {
112
- console.error("Failed to load relation options:", error_0);
111
+ } catch (error$1) {
112
+ console.error("Failed to load relation options:", error$1);
113
113
  toast.error(t("error.failedToLoadOptions"));
114
114
  return [];
115
115
  }
@@ -154,15 +154,15 @@ function RelationPicker({ name, value, onChange, targetCollection, label, filter
154
154
  maxItems,
155
155
  onChange
156
156
  ]);
157
- const handleRemove = React.useCallback((itemId_0) => {
158
- onChange(selectedIds.filter((id_0) => id_0 !== itemId_0));
157
+ const handleRemove = React.useCallback((itemId) => {
158
+ onChange(selectedIds.filter((id) => id !== itemId));
159
159
  }, [selectedIds, onChange]);
160
160
  const handleOpenCreate = React.useCallback(() => {
161
161
  setEditingItemId(void 0);
162
162
  setIsSheetOpen(true);
163
163
  }, []);
164
- const handleOpenEdit = React.useCallback((itemId_1) => {
165
- setEditingItemId(itemId_1);
164
+ const handleOpenEdit = React.useCallback((itemId) => {
165
+ setEditingItemId(itemId);
166
166
  setIsSheetOpen(true);
167
167
  }, []);
168
168
  const handleSheetSave = React.useCallback(async (result) => {
@@ -176,8 +176,8 @@ function RelationPicker({ name, value, onChange, targetCollection, label, filter
176
176
  ]);
177
177
  const canAddMore = !maxItems || selectedIds.length < maxItems;
178
178
  const displayActions = React.useMemo(() => ({
179
- onEdit: !readOnly ? (item_0) => handleOpenEdit(item_0.id) : void 0,
180
- onRemove: !readOnly && (!required || selectedIds.length > 1) ? (item_1) => handleRemove(item_1.id) : void 0
179
+ onEdit: !readOnly ? (item) => handleOpenEdit(item.id) : void 0,
180
+ onRemove: !readOnly && (!required || selectedIds.length > 1) ? (item) => handleRemove(item.id) : void 0
181
181
  }), [
182
182
  readOnly,
183
183
  required,
@@ -237,13 +237,13 @@ function RelationPicker({ name, value, onChange, targetCollection, label, filter
237
237
  value: null,
238
238
  onChange: handleAdd,
239
239
  loadOptions,
240
- queryKey: (search_0) => queryOpts.key([
240
+ queryKey: (search) => queryOpts.key([
241
241
  "collections",
242
242
  targetCollection,
243
243
  "find",
244
244
  {
245
245
  limit: 50,
246
- search: search_0,
246
+ search,
247
247
  where: filter ?? void 0,
248
248
  selectedIds
249
249
  }
@@ -56,19 +56,19 @@ function RelationSelect({ name, value, onChange, targetCollection, label, filter
56
56
  else docs = [];
57
57
  else docs = [];
58
58
  return docs.map((item) => {
59
- let label_0;
60
- if (renderOption) label_0 = String(renderOption(item));
61
- else if (item._title) label_0 = item._title;
62
- else if (item.id) label_0 = item.id;
63
- else label_0 = "";
59
+ let label$1;
60
+ if (renderOption) label$1 = String(renderOption(item));
61
+ else if (item._title) label$1 = item._title;
62
+ else if (item.id) label$1 = item.id;
63
+ else label$1 = "";
64
64
  return {
65
65
  value: item.id,
66
- label: label_0,
66
+ label: label$1,
67
67
  icon: resolveIconElement(collectionIconRef, { className: "size-3.5 text-muted-foreground" })
68
68
  };
69
69
  });
70
- } catch (error_0) {
71
- console.error("Failed to load relation options:", error_0);
70
+ } catch (error$1) {
71
+ console.error("Failed to load relation options:", error$1);
72
72
  toast.error(t("error.failedToLoadOptions"));
73
73
  return [];
74
74
  }
@@ -160,14 +160,14 @@ function RelationSelect({ name, value, onChange, targetCollection, label, filter
160
160
  onChange: handleValueChange,
161
161
  options: selectedOptions,
162
162
  loadOptions,
163
- queryKey: (search_0) => queryOpts.key([
163
+ queryKey: (search) => queryOpts.key([
164
164
  "collections",
165
165
  targetCollection,
166
166
  "find",
167
167
  {
168
168
  limit: 50,
169
169
  locale,
170
- search: search_0,
170
+ search,
171
171
  where: filter ?? void 0
172
172
  }
173
173
  ]),
@@ -214,14 +214,14 @@ function RelationSelect({ name, value, onChange, targetCollection, label, filter
214
214
  onChange: handleValueChange,
215
215
  options: selectedOptions,
216
216
  loadOptions,
217
- queryKey: (search_1) => queryOpts.key([
217
+ queryKey: (search) => queryOpts.key([
218
218
  "collections",
219
219
  targetCollection,
220
220
  "find",
221
221
  {
222
222
  limit: 50,
223
223
  locale,
224
- search: search_1,
224
+ search,
225
225
  where: filter ?? void 0
226
226
  }
227
227
  ]),
@@ -4,7 +4,6 @@ import { Input } from "../../ui/input.mjs";
4
4
  import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue } from "../../ui/select.mjs";
5
5
  import { createLinkAttributes } from "./link-utils.mjs";
6
6
  import { EDITOR_ICONS, ToolbarButton } from "./toolbar.mjs";
7
- import { c } from "react/compiler-runtime";
8
7
  import { Icon } from "@iconify/react";
9
8
  import * as React from "react";
10
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -87,156 +86,90 @@ function setCurrentBlockValue(editor, value) {
87
86
  /**
88
87
  * Bubble menu that appears on text selection
89
88
  */
90
- function RichTextBubbleMenu(t0) {
91
- const $ = c(45);
92
- const { editor, features, disabled, linkOpen, onImageClick, onLinkOpenChange, showFormatting: t1 } = t0;
93
- const showFormatting = t1 === void 0 ? true : t1;
89
+ function RichTextBubbleMenu({ editor, features, disabled, linkOpen, onImageClick, onLinkOpenChange, showFormatting = true }) {
94
90
  const { t } = useTranslation();
95
91
  const [linkUrl, setLinkUrl] = React.useState("");
96
92
  const linkInputRef = React.useRef(null);
97
93
  const isEditable = !disabled;
98
- let currentBlockValue;
99
- let t2;
100
- if ($[0] !== editor || $[1] !== t) {
101
- currentBlockValue = getCurrentBlockValue(editor);
102
- t2 = BLOCK_OPTIONS.find((option) => option.value === currentBlockValue)?.value ? getBlockOptionLabel(currentBlockValue, t) : t("editor.paragraph");
103
- $[0] = editor;
104
- $[1] = t;
105
- $[2] = currentBlockValue;
106
- $[3] = t2;
107
- } else {
108
- currentBlockValue = $[2];
109
- t2 = $[3];
110
- }
111
- const currentBlockLabel = t2;
112
- let t3;
113
- if ($[4] !== isEditable || $[5] !== linkOpen || $[6] !== showFormatting) {
114
- t3 = (t4$1) => {
115
- const { editor: currentEditor, from, to } = t4$1;
116
- if (!isEditable) return false;
117
- if (linkOpen) return true;
118
- if (!showFormatting) return false;
119
- if (from === to) return false;
120
- return !currentEditor.isActive("image");
121
- };
122
- $[4] = isEditable;
123
- $[5] = linkOpen;
124
- $[6] = showFormatting;
125
- $[7] = t3;
126
- } else t3 = $[7];
127
- const shouldShow = t3;
128
- let t4;
129
- if ($[8] !== editor || $[9] !== onLinkOpenChange) {
130
- t4 = () => {
131
- const currentLink = editor.getAttributes("link").href;
132
- setLinkUrl(currentLink || "");
133
- onLinkOpenChange(true);
134
- };
135
- $[8] = editor;
136
- $[9] = onLinkOpenChange;
137
- $[10] = t4;
138
- } else t4 = $[10];
139
- const openLinkMode = t4;
140
- let t5;
141
- if ($[11] !== editor || $[12] !== onLinkOpenChange) {
142
- t5 = () => {
143
- onLinkOpenChange(false);
144
- setLinkUrl("");
145
- editor.chain().focus().run();
146
- };
147
- $[11] = editor;
148
- $[12] = onLinkOpenChange;
149
- $[13] = t5;
150
- } else t5 = $[13];
151
- const closeLinkMode = t5;
152
- let t6;
153
- if ($[14] !== closeLinkMode || $[15] !== editor || $[16] !== linkUrl) {
154
- t6 = () => {
155
- const trimmedUrl = linkUrl.trim();
156
- if (!trimmedUrl) {
157
- editor.chain().focus().extendMarkRange("link").unsetLink().run();
158
- closeLinkMode();
159
- return;
160
- }
161
- const attrs = createLinkAttributes(trimmedUrl);
162
- if (editor.state.selection.empty && !editor.isActive("link")) editor.chain().focus().insertContent({
163
- type: "text",
164
- text: attrs.href,
165
- marks: [{
166
- type: "link",
167
- attrs
168
- }]
169
- }).run();
170
- else editor.chain().focus().extendMarkRange("link").setLink(attrs).run();
171
- closeLinkMode();
172
- };
173
- $[14] = closeLinkMode;
174
- $[15] = editor;
175
- $[16] = linkUrl;
176
- $[17] = t6;
177
- } else t6 = $[17];
178
- const applyLink = t6;
179
- let t7;
180
- if ($[18] !== closeLinkMode || $[19] !== editor) {
181
- t7 = () => {
94
+ const currentBlockValue = getCurrentBlockValue(editor);
95
+ const currentBlockLabel = BLOCK_OPTIONS.find((option) => option.value === currentBlockValue)?.value ? getBlockOptionLabel(currentBlockValue, t) : t("editor.paragraph");
96
+ const shouldShow = React.useCallback(({ editor: currentEditor, from, to }) => {
97
+ if (!isEditable) return false;
98
+ if (linkOpen) return true;
99
+ if (!showFormatting) return false;
100
+ if (from === to) return false;
101
+ return !currentEditor.isActive("image");
102
+ }, [
103
+ isEditable,
104
+ linkOpen,
105
+ showFormatting
106
+ ]);
107
+ const openLinkMode = React.useCallback(() => {
108
+ const currentLink = editor.getAttributes("link").href;
109
+ setLinkUrl(currentLink || "");
110
+ onLinkOpenChange(true);
111
+ }, [editor, onLinkOpenChange]);
112
+ const closeLinkMode = React.useCallback(() => {
113
+ onLinkOpenChange(false);
114
+ setLinkUrl("");
115
+ editor.chain().focus().run();
116
+ }, [editor, onLinkOpenChange]);
117
+ const applyLink = React.useCallback(() => {
118
+ const trimmedUrl = linkUrl.trim();
119
+ if (!trimmedUrl) {
182
120
  editor.chain().focus().extendMarkRange("link").unsetLink().run();
183
121
  closeLinkMode();
184
- };
185
- $[18] = closeLinkMode;
186
- $[19] = editor;
187
- $[20] = t7;
188
- } else t7 = $[20];
189
- const removeLink = t7;
190
- let t8;
191
- let t9;
192
- if ($[21] !== editor || $[22] !== linkOpen) {
193
- t8 = () => {
194
- if (!linkOpen) return;
195
- const currentLink_0 = editor.getAttributes("link").href;
196
- setLinkUrl(currentLink_0 || "");
197
- window.requestAnimationFrame(() => {
198
- linkInputRef.current?.focus();
199
- linkInputRef.current?.select();
200
- });
201
- };
202
- t9 = [editor, linkOpen];
203
- $[21] = editor;
204
- $[22] = linkOpen;
205
- $[23] = t8;
206
- $[24] = t9;
207
- } else {
208
- t8 = $[23];
209
- t9 = $[24];
210
- }
211
- React.useEffect(t8, t9);
212
- let t10;
213
- if ($[25] === Symbol.for("react.memo_cache_sentinel")) {
214
- t10 = [120, 90];
215
- $[25] = t10;
216
- } else t10 = $[25];
217
- let t11;
218
- if ($[26] === Symbol.for("react.memo_cache_sentinel")) {
219
- t11 = {
220
- duration: t10,
122
+ return;
123
+ }
124
+ const attrs = createLinkAttributes(trimmedUrl);
125
+ if (editor.state.selection.empty && !editor.isActive("link")) editor.chain().focus().insertContent({
126
+ type: "text",
127
+ text: attrs.href,
128
+ marks: [{
129
+ type: "link",
130
+ attrs
131
+ }]
132
+ }).run();
133
+ else editor.chain().focus().extendMarkRange("link").setLink(attrs).run();
134
+ closeLinkMode();
135
+ }, [
136
+ closeLinkMode,
137
+ editor,
138
+ linkUrl
139
+ ]);
140
+ const removeLink = React.useCallback(() => {
141
+ editor.chain().focus().extendMarkRange("link").unsetLink().run();
142
+ closeLinkMode();
143
+ }, [closeLinkMode, editor]);
144
+ React.useEffect(() => {
145
+ if (!linkOpen) return;
146
+ const frame = window.requestAnimationFrame(() => {
147
+ linkInputRef.current?.focus();
148
+ linkInputRef.current?.select();
149
+ });
150
+ return () => window.cancelAnimationFrame(frame);
151
+ }, [linkOpen]);
152
+ return /* @__PURE__ */ jsx(BubbleMenu, {
153
+ editor,
154
+ shouldShow,
155
+ tippyOptions: {
156
+ duration: [120, 90],
221
157
  interactive: true,
222
158
  maxWidth: "none",
223
159
  offset: [0, 8],
224
160
  placement: "top"
225
- };
226
- $[26] = t11;
227
- } else t11 = $[26];
228
- let t12;
229
- if ($[27] !== applyLink || $[28] !== closeLinkMode || $[29] !== currentBlockLabel || $[30] !== currentBlockValue || $[31] !== editor || $[32] !== features || $[33] !== isEditable || $[34] !== linkOpen || $[35] !== linkUrl || $[36] !== onImageClick || $[37] !== openLinkMode || $[38] !== removeLink || $[39] !== t) {
230
- t12 = linkOpen ? /* @__PURE__ */ jsxs("form", {
161
+ },
162
+ className: "qp-rich-text-editor__bubble floating-surface text-popover-foreground",
163
+ children: linkOpen ? /* @__PURE__ */ jsxs("form", {
231
164
  className: "qp-rich-text-editor__link-form",
232
165
  onSubmit: (event) => {
233
166
  event.preventDefault();
234
167
  applyLink();
235
168
  },
236
- onKeyDown: (event_0) => {
237
- event_0.stopPropagation();
238
- if (event_0.key === "Escape") {
239
- event_0.preventDefault();
169
+ onKeyDown: (event) => {
170
+ event.stopPropagation();
171
+ if (event.key === "Escape") {
172
+ event.preventDefault();
240
173
  closeLinkMode();
241
174
  }
242
175
  },
@@ -258,7 +191,7 @@ function RichTextBubbleMenu(t0) {
258
191
  placeholder: t("editor.pasteOrTypeLink"),
259
192
  type: "text",
260
193
  value: linkUrl,
261
- onChange: (event_1) => setLinkUrl(event_1.target.value),
194
+ onChange: (event) => setLinkUrl(event.target.value),
262
195
  disabled: !isEditable
263
196
  }),
264
197
  /* @__PURE__ */ jsx(Button, {
@@ -305,15 +238,15 @@ function RichTextBubbleMenu(t0) {
305
238
  children: t("editor.paragraph")
306
239
  })] }),
307
240
  /* @__PURE__ */ jsx(SelectSeparator, {}),
308
- /* @__PURE__ */ jsxs(SelectGroup, { children: [/* @__PURE__ */ jsx(SelectLabel, { children: t("editor.headings") }), BLOCK_OPTIONS.filter(_temp).map((option_1) => /* @__PURE__ */ jsx(SelectItem, {
309
- value: option_1.value,
310
- children: getBlockOptionLabel(option_1.value, t)
311
- }, option_1.value))] }),
241
+ /* @__PURE__ */ jsxs(SelectGroup, { children: [/* @__PURE__ */ jsx(SelectLabel, { children: t("editor.headings") }), BLOCK_OPTIONS.filter((option) => option.group === "heading").map((option) => /* @__PURE__ */ jsx(SelectItem, {
242
+ value: option.value,
243
+ children: getBlockOptionLabel(option.value, t)
244
+ }, option.value))] }),
312
245
  /* @__PURE__ */ jsx(SelectSeparator, {}),
313
- /* @__PURE__ */ jsxs(SelectGroup, { children: [/* @__PURE__ */ jsx(SelectLabel, { children: t("editor.list") }), BLOCK_OPTIONS.filter(_temp2).map((option_3) => /* @__PURE__ */ jsx(SelectItem, {
314
- value: option_3.value,
315
- children: getBlockOptionLabel(option_3.value, t)
316
- }, option_3.value))] }),
246
+ /* @__PURE__ */ jsxs(SelectGroup, { children: [/* @__PURE__ */ jsx(SelectLabel, { children: t("editor.list") }), BLOCK_OPTIONS.filter((option) => option.group === "list").map((option) => /* @__PURE__ */ jsx(SelectItem, {
247
+ value: option.value,
248
+ children: getBlockOptionLabel(option.value, t)
249
+ }, option.value))] }),
317
250
  /* @__PURE__ */ jsx(SelectSeparator, {}),
318
251
  /* @__PURE__ */ jsxs(SelectGroup, { children: [/* @__PURE__ */ jsx(SelectLabel, { children: t("editor.blocks") }), /* @__PURE__ */ jsx(SelectItem, {
319
252
  value: "blockquote",
@@ -372,43 +305,8 @@ function RichTextBubbleMenu(t0) {
372
305
  title: t("editor.image"),
373
306
  onClick: onImageClick
374
307
  })
375
- ] });
376
- $[27] = applyLink;
377
- $[28] = closeLinkMode;
378
- $[29] = currentBlockLabel;
379
- $[30] = currentBlockValue;
380
- $[31] = editor;
381
- $[32] = features;
382
- $[33] = isEditable;
383
- $[34] = linkOpen;
384
- $[35] = linkUrl;
385
- $[36] = onImageClick;
386
- $[37] = openLinkMode;
387
- $[38] = removeLink;
388
- $[39] = t;
389
- $[40] = t12;
390
- } else t12 = $[40];
391
- let t13;
392
- if ($[41] !== editor || $[42] !== shouldShow || $[43] !== t12) {
393
- t13 = /* @__PURE__ */ jsx(BubbleMenu, {
394
- editor,
395
- shouldShow,
396
- tippyOptions: t11,
397
- className: "qp-rich-text-editor__bubble floating-surface text-popover-foreground",
398
- children: t12
399
- });
400
- $[41] = editor;
401
- $[42] = shouldShow;
402
- $[43] = t12;
403
- $[44] = t13;
404
- } else t13 = $[44];
405
- return t13;
406
- }
407
- function _temp2(option_2) {
408
- return option_2.group === "list";
409
- }
410
- function _temp(option_0) {
411
- return option_0.group === "heading";
308
+ ] })
309
+ });
412
310
  }
413
311
 
414
312
  //#endregion
@@ -2,7 +2,6 @@ import { useTranslation } from "../../../i18n/hooks.mjs";
2
2
  import { Button } from "../../ui/button.mjs";
3
3
  import { Input } from "../../ui/input.mjs";
4
4
  import { Popover, PopoverContent, PopoverHeader, PopoverTitle, PopoverTrigger } from "../../ui/popover.mjs";
5
- import { useCollectionItem } from "../../../hooks/use-collection.mjs";
6
5
  import { MediaPickerDialog } from "../../media/media-picker-dialog.mjs";
7
6
  import { useRichTextImageUpload } from "./image-upload.mjs";
8
7
  import * as React from "react";
@@ -21,13 +20,11 @@ function ImagePopover({ editor, open, onOpenChange, disabled, onImageUpload, ima
21
20
  const [uploadingImage, setUploadingImage] = React.useState(false);
22
21
  const fileInputRef = React.useRef(null);
23
22
  const [isPickerOpen, setIsPickerOpen] = React.useState(false);
24
- const [selectedAssetId, setSelectedAssetId] = React.useState(null);
25
23
  const { collection, uploadImageFile } = useRichTextImageUpload({
26
24
  imageCollection,
27
25
  onImageUpload
28
26
  });
29
27
  const showMediaLibrary = enableMediaLibrary ?? true;
30
- const { data: selectedAsset } = useCollectionItem(collection || "", selectedAssetId || "", void 0, { enabled: !!collection && !!selectedAssetId });
31
28
  const handleInsertImageUrl = React.useCallback(() => {
32
29
  if (!editor || !imageUrl) return;
33
30
  editor.chain().focus().setImage({
@@ -73,34 +70,26 @@ function ImagePopover({ editor, open, onOpenChange, disabled, onImageUpload, ima
73
70
  t,
74
71
  uploadImageFile
75
72
  ]);
76
- React.useEffect(() => {
77
- if (!selectedAssetId || !selectedAsset || !editor) return;
78
- const assetUrl = selectedAsset?.url;
79
- if (!assetUrl) {
73
+ const insertAssetImage = React.useCallback((asset) => {
74
+ if (!editor || !asset?.url) {
80
75
  toast.error(t("upload.error"));
81
- setSelectedAssetId(null);
82
76
  return;
83
77
  }
84
78
  editor.chain().focus().setImage({
85
- src: assetUrl,
86
- alt: imageAlt || selectedAsset?.alt || void 0
79
+ src: asset.url,
80
+ alt: imageAlt || asset.alt || void 0
87
81
  }).run();
88
82
  setImageUrl("");
89
83
  setImageAlt("");
90
- setSelectedAssetId(null);
91
84
  onOpenChange(false);
92
85
  }, [
93
86
  editor,
94
87
  imageAlt,
95
88
  onOpenChange,
96
- selectedAsset,
97
- selectedAssetId,
98
89
  t
99
90
  ]);
100
- const handlePickerSelect = (ids) => {
101
- const selectedId = Array.isArray(ids) ? ids[0] : ids;
102
- if (!selectedId) return;
103
- setSelectedAssetId(selectedId);
91
+ const handlePickerSelect = (_ids, selectedAssets) => {
92
+ insertAssetImage(Array.isArray(selectedAssets) ? selectedAssets[0] : selectedAssets);
104
93
  setIsPickerOpen(false);
105
94
  };
106
95
  return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Popover, {
@@ -121,7 +110,7 @@ function ImagePopover({ editor, open, onOpenChange, disabled, onImageUpload, ima
121
110
  type: "url",
122
111
  value: imageUrl,
123
112
  placeholder: "https://example.com/image.jpg…",
124
- onChange: (event_0) => setImageUrl(event_0.target.value),
113
+ onChange: (event) => setImageUrl(event.target.value),
125
114
  disabled
126
115
  }),
127
116
  /* @__PURE__ */ jsx(Input, {
@@ -130,7 +119,7 @@ function ImagePopover({ editor, open, onOpenChange, disabled, onImageUpload, ima
130
119
  name: "rich-text-image-alt",
131
120
  value: imageAlt,
132
121
  placeholder: `${t("editor.altText")}…`,
133
- onChange: (event_1) => setImageAlt(event_1.target.value),
122
+ onChange: (event) => setImageAlt(event.target.value),
134
123
  disabled
135
124
  }),
136
125
  /* @__PURE__ */ jsx("div", {
@@ -2,7 +2,7 @@ import { useTranslation } from "../../../i18n/hooks.mjs";
2
2
  import { sanitizeFilename } from "../field-utils.mjs";
3
3
  import { useUploadCollection } from "../../../hooks/use-upload-collection.mjs";
4
4
  import { useUpload } from "../../../hooks/use-upload.mjs";
5
- import { c } from "react/compiler-runtime";
5
+ import * as React from "react";
6
6
 
7
7
  //#region src/client/components/fields/rich-text-editor/image-upload.ts
8
8
  function getImageFilesFromDataTransfer(dataTransfer) {
@@ -13,15 +13,15 @@ function getImageAltFromFile(file) {
13
13
  if (!cleanName) return void 0;
14
14
  return cleanName.replace(/\.[^.]+$/, "") || cleanName;
15
15
  }
16
- function useRichTextImageUpload(t0) {
17
- const $ = c(11);
18
- const { imageCollection, onImageUpload } = t0;
16
+ function useRichTextImageUpload({ imageCollection, onImageUpload }) {
19
17
  const { t } = useTranslation();
20
18
  const { upload, isUploading } = useUpload();
21
19
  const { collection, collections } = useUploadCollection(imageCollection);
22
- let t1;
23
- if ($[0] !== collection || $[1] !== collections || $[2] !== onImageUpload || $[3] !== t || $[4] !== upload) {
24
- t1 = async (file) => {
20
+ return {
21
+ collection,
22
+ collections,
23
+ isUploading,
24
+ uploadImageFile: React.useCallback(async (file) => {
25
25
  if (!file.type.startsWith("image/")) throw new Error(`"${file.name}" is not an image file.`);
26
26
  if (onImageUpload) {
27
27
  const url = await onImageUpload(file);
@@ -36,30 +36,14 @@ function useRichTextImageUpload(t0) {
36
36
  const uploadedAsset = await upload(sanitizedName === file.name ? file : new File([file], sanitizedName, { type: file.type }), { to: collection });
37
37
  if (!uploadedAsset?.url) throw new Error(t("upload.error"));
38
38
  return uploadedAsset.url;
39
- };
40
- $[0] = collection;
41
- $[1] = collections;
42
- $[2] = onImageUpload;
43
- $[3] = t;
44
- $[4] = upload;
45
- $[5] = t1;
46
- } else t1 = $[5];
47
- const uploadImageFile = t1;
48
- let t2;
49
- if ($[6] !== collection || $[7] !== collections || $[8] !== isUploading || $[9] !== uploadImageFile) {
50
- t2 = {
39
+ }, [
51
40
  collection,
52
41
  collections,
53
- isUploading,
54
- uploadImageFile
55
- };
56
- $[6] = collection;
57
- $[7] = collections;
58
- $[8] = isUploading;
59
- $[9] = uploadImageFile;
60
- $[10] = t2;
61
- } else t2 = $[10];
62
- return t2;
42
+ onImageUpload,
43
+ t,
44
+ upload
45
+ ])
46
+ };
63
47
  }
64
48
 
65
49
  //#endregion