@donotdev/crud 0.0.9 → 0.0.10

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 (266) hide show
  1. package/dist/CrudService.d.ts +26 -8
  2. package/dist/CrudService.d.ts.map +1 -1
  3. package/dist/CrudService.js +1 -1
  4. package/dist/CrudStore.d.ts.map +1 -1
  5. package/dist/CrudStore.js +1 -1
  6. package/dist/FieldRegistry.js +1 -1
  7. package/dist/adapters/FirestoreAdapter.d.ts +1 -1
  8. package/dist/adapters/FirestoreAdapter.d.ts.map +1 -1
  9. package/dist/adapters/FirestoreAdapter.js +1 -1
  10. package/dist/adapters/FunctionsAdapter.d.ts +1 -1
  11. package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
  12. package/dist/adapters/FunctionsAdapter.js +1 -1
  13. package/dist/adapters/index.js +1 -1
  14. package/dist/builtinFieldTypes.d.ts +17 -4
  15. package/dist/builtinFieldTypes.d.ts.map +1 -1
  16. package/dist/builtinFieldTypes.js +1 -1
  17. package/dist/components/CrudButton.js +1 -1
  18. package/dist/components/DisplayFieldRenderer.d.ts +2 -0
  19. package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
  20. package/dist/components/DisplayFieldRenderer.js +1 -1
  21. package/dist/components/EntityDisplayRenderer.js +1 -1
  22. package/dist/components/EntityFilters.d.ts +19 -1
  23. package/dist/components/EntityFilters.d.ts.map +1 -1
  24. package/dist/components/EntityFilters.js +1 -1
  25. package/dist/components/EntityFormRenderer.js +1 -1
  26. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  27. package/dist/components/FormFieldRenderer.js +1 -1
  28. package/dist/components/FormLayout.js +1 -1
  29. package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
  30. package/dist/components/controlled/complex/ControlledDateField.js +1 -1
  31. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  32. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  33. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  34. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  35. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  36. package/dist/components/controlled/complex/index.js +1 -1
  37. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  38. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  39. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  40. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  41. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  42. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  43. package/dist/components/controlled/file/index.js +1 -1
  44. package/dist/components/controlled/index.js +1 -1
  45. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  46. package/dist/components/controlled/input/ControlledCurrencyField.d.ts +8 -0
  47. package/dist/components/controlled/input/ControlledCurrencyField.d.ts.map +1 -0
  48. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -0
  49. package/dist/components/controlled/input/ControlledGdprConsentField.d.ts.map +1 -1
  50. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
  51. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  52. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  53. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  54. package/dist/components/controlled/input/ControlledPriceField.d.ts +8 -0
  55. package/dist/components/controlled/input/ControlledPriceField.d.ts.map +1 -0
  56. package/dist/components/controlled/input/ControlledPriceField.js +1 -0
  57. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  58. package/dist/components/controlled/input/ControlledRatingField.d.ts +8 -0
  59. package/dist/components/controlled/input/ControlledRatingField.d.ts.map +1 -0
  60. package/dist/components/controlled/input/ControlledRatingField.js +1 -0
  61. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  62. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  63. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  64. package/dist/components/controlled/input/index.d.ts +3 -0
  65. package/dist/components/controlled/input/index.d.ts.map +1 -1
  66. package/dist/components/controlled/input/index.js +1 -1
  67. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  68. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  69. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  70. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  71. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  72. package/dist/components/controlled/select/index.js +1 -1
  73. package/dist/components/controlled/types.js +1 -1
  74. package/dist/components/fields/display/AvatarFieldDisplay.d.ts +23 -0
  75. package/dist/components/fields/display/AvatarFieldDisplay.d.ts.map +1 -0
  76. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -0
  77. package/dist/components/fields/display/BadgeFieldDisplay.d.ts +21 -0
  78. package/dist/components/fields/display/BadgeFieldDisplay.d.ts.map +1 -0
  79. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -0
  80. package/dist/components/fields/display/ButtonFieldDisplay.d.ts +29 -0
  81. package/dist/components/fields/display/ButtonFieldDisplay.d.ts.map +1 -0
  82. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -0
  83. package/dist/components/fields/display/CheckboxFieldDisplay.d.ts +21 -0
  84. package/dist/components/fields/display/CheckboxFieldDisplay.d.ts.map +1 -0
  85. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -0
  86. package/dist/components/fields/display/DateFieldDisplay.d.ts +24 -0
  87. package/dist/components/fields/display/DateFieldDisplay.d.ts.map +1 -0
  88. package/dist/components/fields/display/DateFieldDisplay.js +1 -0
  89. package/dist/components/fields/display/DropdownDisplay.d.ts +21 -0
  90. package/dist/components/fields/display/DropdownDisplay.d.ts.map +1 -0
  91. package/dist/components/fields/display/DropdownDisplay.js +1 -0
  92. package/dist/components/fields/display/FileFieldDisplay.d.ts +21 -0
  93. package/dist/components/fields/display/FileFieldDisplay.d.ts.map +1 -0
  94. package/dist/components/fields/display/FileFieldDisplay.js +1 -0
  95. package/dist/components/fields/display/GeoPointFieldDisplay.d.ts +25 -0
  96. package/dist/components/fields/display/GeoPointFieldDisplay.d.ts.map +1 -0
  97. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -0
  98. package/dist/components/fields/display/HiddenFieldDisplay.d.ts +30 -0
  99. package/dist/components/fields/display/HiddenFieldDisplay.d.ts.map +1 -0
  100. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -0
  101. package/dist/components/fields/display/ImageFieldDisplay.d.ts +24 -0
  102. package/dist/components/fields/display/ImageFieldDisplay.d.ts.map +1 -0
  103. package/dist/components/fields/display/ImageFieldDisplay.js +1 -0
  104. package/dist/components/fields/display/LinkFieldDisplay.d.ts +22 -0
  105. package/dist/components/fields/display/LinkFieldDisplay.d.ts.map +1 -0
  106. package/dist/components/fields/display/LinkFieldDisplay.js +1 -0
  107. package/dist/components/fields/display/MapFieldDisplay.d.ts +25 -0
  108. package/dist/components/fields/display/MapFieldDisplay.d.ts.map +1 -0
  109. package/dist/components/fields/display/MapFieldDisplay.js +1 -0
  110. package/dist/components/fields/display/MultiDropdownDisplay.d.ts +22 -0
  111. package/dist/components/fields/display/MultiDropdownDisplay.d.ts.map +1 -0
  112. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -0
  113. package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts +22 -0
  114. package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts.map +1 -0
  115. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -0
  116. package/dist/components/fields/display/NumberFieldDisplay.d.ts +24 -0
  117. package/dist/components/fields/display/NumberFieldDisplay.d.ts.map +1 -0
  118. package/dist/components/fields/display/NumberFieldDisplay.js +1 -0
  119. package/dist/components/fields/display/PasswordFieldDisplay.d.ts +24 -0
  120. package/dist/components/fields/display/PasswordFieldDisplay.d.ts.map +1 -0
  121. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -0
  122. package/dist/components/fields/display/PhoneNumberDisplay.d.ts +22 -0
  123. package/dist/components/fields/display/PhoneNumberDisplay.d.ts.map +1 -0
  124. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -0
  125. package/dist/components/fields/display/RadioFieldDisplay.d.ts +22 -0
  126. package/dist/components/fields/display/RadioFieldDisplay.d.ts.map +1 -0
  127. package/dist/components/fields/display/RadioFieldDisplay.js +1 -0
  128. package/dist/components/fields/display/RangeFieldDisplay.d.ts +22 -0
  129. package/dist/components/fields/display/RangeFieldDisplay.d.ts.map +1 -0
  130. package/dist/components/fields/display/RangeFieldDisplay.js +1 -0
  131. package/dist/components/fields/display/ReferenceFieldDisplay.d.ts +22 -0
  132. package/dist/components/fields/display/ReferenceFieldDisplay.d.ts.map +1 -0
  133. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -0
  134. package/dist/components/fields/display/RichTextDisplay.d.ts +25 -0
  135. package/dist/components/fields/display/RichTextDisplay.d.ts.map +1 -0
  136. package/dist/components/fields/display/RichTextDisplay.js +61 -0
  137. package/dist/components/fields/display/TextAreaDisplay.d.ts +22 -0
  138. package/dist/components/fields/display/TextAreaDisplay.d.ts.map +1 -0
  139. package/dist/components/fields/display/TextAreaDisplay.js +1 -0
  140. package/dist/components/fields/display/TextFieldDisplay.d.ts +42 -0
  141. package/dist/components/fields/display/TextFieldDisplay.d.ts.map +1 -0
  142. package/dist/components/fields/display/TextFieldDisplay.js +1 -0
  143. package/dist/components/fields/display/TimestampFieldDisplay.d.ts +22 -0
  144. package/dist/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -0
  145. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -0
  146. package/dist/components/fields/display/index.d.ts +32 -0
  147. package/dist/components/fields/display/index.d.ts.map +1 -0
  148. package/dist/components/fields/display/index.js +1 -0
  149. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  150. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  151. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  152. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  153. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  154. package/dist/components/form/fields/ComboboxComponent.d.ts +6 -0
  155. package/dist/components/form/fields/ComboboxComponent.d.ts.map +1 -1
  156. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  157. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  158. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  159. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  160. package/dist/components/form/fields/DropdownComponent.js +1 -1
  161. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  162. package/dist/components/form/fields/GdprConsentFieldComponent.d.ts +2 -2
  163. package/dist/components/form/fields/GdprConsentFieldComponent.d.ts.map +1 -1
  164. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
  165. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  166. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  167. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  168. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  169. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  170. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  171. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  172. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  173. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  174. package/dist/components/form/fields/PriceFieldComponent.d.ts +34 -0
  175. package/dist/components/form/fields/PriceFieldComponent.d.ts.map +1 -0
  176. package/dist/components/form/fields/PriceFieldComponent.js +1 -0
  177. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  178. package/dist/components/form/fields/RangeFieldComponent.js +1 -1
  179. package/dist/components/form/fields/RatingFieldComponent.d.ts +37 -0
  180. package/dist/components/form/fields/RatingFieldComponent.d.ts.map +1 -0
  181. package/dist/components/form/fields/RatingFieldComponent.js +1 -0
  182. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  183. package/dist/components/form/fields/RichTextComponent.js +1 -1
  184. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  185. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  186. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  187. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  188. package/dist/components/form/fields/index.d.ts +4 -0
  189. package/dist/components/form/fields/index.d.ts.map +1 -1
  190. package/dist/components/form/fields/index.js +1 -1
  191. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  192. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  193. package/dist/components/index.d.ts +3 -9
  194. package/dist/components/index.d.ts.map +1 -1
  195. package/dist/components/index.js +1 -1
  196. package/dist/contexts/UploadContext.js +1 -1
  197. package/dist/contexts/index.js +1 -1
  198. package/dist/fieldTypeRegistry.d.ts +92 -0
  199. package/dist/fieldTypeRegistry.d.ts.map +1 -0
  200. package/dist/fieldTypeRegistry.js +1 -0
  201. package/dist/forms/hooks/index.js +1 -1
  202. package/dist/forms/hooks/useController.js +1 -1
  203. package/dist/forms/hooks/useEntityField.js +1 -1
  204. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  205. package/dist/forms/hooks/useEntityForm.js +1 -1
  206. package/dist/forms/index.js +1 -1
  207. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  208. package/dist/forms/utils/index.js +1 -1
  209. package/dist/forms/utils/isFieldEditable.js +1 -1
  210. package/dist/forms/utils/translateFieldLabel.js +1 -1
  211. package/dist/forms/utils/validateEntity.js +1 -1
  212. package/dist/hooks/index.d.ts +5 -0
  213. package/dist/hooks/index.d.ts.map +1 -1
  214. package/dist/hooks/index.js +1 -1
  215. package/dist/hooks/useEntityFavorites.d.ts +53 -0
  216. package/dist/hooks/useEntityFavorites.d.ts.map +1 -0
  217. package/dist/hooks/useEntityFavorites.js +1 -0
  218. package/dist/hooks/useFileUpload.js +1 -1
  219. package/dist/hooks/useFormNavigationGuard.js +1 -1
  220. package/dist/hooks/useRelatedItems.d.ts +37 -0
  221. package/dist/hooks/useRelatedItems.d.ts.map +1 -0
  222. package/dist/hooks/useRelatedItems.js +1 -0
  223. package/dist/hooks/useUnsavedChangesWarning.js +1 -1
  224. package/dist/index.d.ts +4 -3
  225. package/dist/index.d.ts.map +1 -1
  226. package/dist/index.js +1 -1
  227. package/dist/registerBuiltinFieldTypes.d.ts +6 -0
  228. package/dist/registerBuiltinFieldTypes.d.ts.map +1 -0
  229. package/dist/registerBuiltinFieldTypes.js +1 -0
  230. package/dist/stores/FormStore.js +1 -1
  231. package/dist/stores/UploadStore.js +1 -1
  232. package/dist/stores/index.js +1 -1
  233. package/dist/tsconfig.tsbuildinfo +1 -1
  234. package/dist/types.d.ts +60 -25
  235. package/dist/types.d.ts.map +1 -1
  236. package/dist/useBaseCrudList.d.ts +53 -0
  237. package/dist/useBaseCrudList.d.ts.map +1 -0
  238. package/dist/useBaseCrudList.js +1 -0
  239. package/dist/useCrud.d.ts +3 -6
  240. package/dist/useCrud.d.ts.map +1 -1
  241. package/dist/useCrud.js +1 -1
  242. package/dist/useCrudCardList.d.ts +10 -4
  243. package/dist/useCrudCardList.d.ts.map +1 -1
  244. package/dist/useCrudCardList.js +1 -1
  245. package/dist/useCrudList.d.ts +12 -5
  246. package/dist/useCrudList.d.ts.map +1 -1
  247. package/dist/useCrudList.js +1 -1
  248. package/dist/utils/collections.js +1 -1
  249. package/dist/utils/fileStorage.js +1 -1
  250. package/dist/utils/imageProcessing.js +1 -1
  251. package/dist/utils/imageStorage.js +1 -1
  252. package/dist/utils/imageUtils.js +1 -1
  253. package/dist/utils/mergeWithOptimistic.d.ts +4 -5
  254. package/dist/utils/mergeWithOptimistic.d.ts.map +1 -1
  255. package/dist/utils/mergeWithOptimistic.js +1 -1
  256. package/dist/utils/scopeUtils.d.ts +38 -0
  257. package/dist/utils/scopeUtils.d.ts.map +1 -0
  258. package/dist/utils/scopeUtils.js +1 -0
  259. package/dist/utils/uploadValidation.js +1 -1
  260. package/package.json +15 -14
  261. package/dist/components/EntityCardList.d.ts +0 -29
  262. package/dist/components/EntityCardList.d.ts.map +0 -1
  263. package/dist/components/EntityCardList.js +0 -1
  264. package/dist/components/EntityList.d.ts +0 -30
  265. package/dist/components/EntityList.d.ts.map +0 -1
  266. package/dist/components/EntityList.js +0 -1
@@ -0,0 +1 @@
1
+ import{jsx as e}from"react/jsx-runtime";import{Text as l}from"@donotdev/components";const t=({config:i,value:a,t:m,className:s})=>a?e(l,{as:"div",level:"small",className:`whitespace-pre-wrap ${s||""}`,children:a}):e(l,{as:"span",variant:"muted",className:s,children:"-"});var r=t;export{t as TextAreaDisplay,r as default};
@@ -0,0 +1,42 @@
1
+ import type { EntityField } from '@donotdev/core';
2
+ import type { ComponentType } from 'react';
3
+ export interface TextFieldDisplayProps {
4
+ /** Field configuration */
5
+ config: EntityField<'text' | 'email' | 'month' | 'week' | 'time'>;
6
+ /** Value to display */
7
+ value: string;
8
+ /** Translation function */
9
+ t: (key: string, options?: Record<string, any>) => string;
10
+ /** Additional CSS classes */
11
+ className?: string;
12
+ /** Whether the field is loading */
13
+ loading?: boolean;
14
+ /** Show copy button */
15
+ showCopy?: boolean;
16
+ /** Show as badge */
17
+ asBadge?: boolean;
18
+ /** Truncate long text */
19
+ truncate?: boolean;
20
+ /** Maximum length before truncation */
21
+ maxLength?: number;
22
+ /** Show field label */
23
+ showLabel?: boolean;
24
+ }
25
+ /**
26
+ * Enhanced TextFieldDisplay with modern UX features
27
+ *
28
+ * Features:
29
+ * - Smart formatting based on field type
30
+ * - Copy to clipboard functionality
31
+ * - Truncation with tooltips
32
+ * - Badge display option
33
+ * - Loading states
34
+ * - Responsive design
35
+ *
36
+ * @version 0.0.1
37
+ * @since 0.0.1
38
+ * @author AMBROISE PARK Consulting
39
+ */
40
+ export declare const TextFieldDisplay: ComponentType<TextFieldDisplayProps>;
41
+ export default TextFieldDisplay;
42
+ //# sourceMappingURL=TextFieldDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextFieldDisplay.d.ts","sourceRoot":"","sources":["../../../../src/components/fields/display/TextFieldDisplay.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,WAAW,qBAAqB;IACpC,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;IAClE,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;IAC1D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,qBAAqB,CA8JjE,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as n}from"react/jsx-runtime";import{Mail as N,Calendar as k,Clock as L}from"lucide-react";import{useState as A}from"react";import{Skeleton as T,Badge as B,BADGE_VARIANT as E,Text as l,cn as f,CopyToClipboard as x,Stack as o}from"@donotdev/components";import{getWeekFromISOString as I}from"@donotdev/core";const b=({config:i,value:a,t:r,className:s,loading:C=!1,showCopy:u=!1,asBadge:w=!1,truncate:c=!1,maxLength:d=50,showLabel:p=!1})=>{const[V,g]=A(!1),j=async()=>{try{await navigator.clipboard.writeText(a),g(!0),setTimeout(()=>g(!1),2e3)}catch{}},h=()=>{switch(i.type){case"email":return e(N,{});case"month":case"week":return e(k,{});case"time":return e(L,{});default:return null}},v=t=>{if(!t)return null;switch(i.type){case"email":return n("a",{href:`mailto:${t}`,style:{display:"flex",alignItems:"center",gap:"var(--gap-sm)"},onMouseEnter:m=>m.currentTarget.style.textDecoration="underline",onMouseLeave:m=>m.currentTarget.style.textDecoration="none",children:[h(),t]});case"month":return new Date(t).toLocaleDateString("en-US",{year:"numeric",month:"long"});case"week":return I(t);case"time":return new Date(`2000-01-01T${t}`).toLocaleTimeString();default:return t}},S=t=>!c||t.length<=d?t:`${t.substring(0,d)}...`;if(C)return n(o,{gap:"tight",children:[p&&e(T,{style:{height:"1rem",width:"6rem"}}),e(T,{className:"dndev-w-full",style:{height:"1.5rem"}})]});if(!a)return n(o,{gap:"tight",children:[p&&e(l,{as:"span",variant:"muted",children:i.label||i.name}),e(l,{as:"span",variant:"muted",className:f(s),style:{fontStyle:"italic"},children:r("common.noValue",{defaultValue:"No value"})})]});const D=v(a),y=S(String(D));return w?n(o,{direction:"row",align:"center",gap:"tight",children:[h(),e(B,{variant:E.SECONDARY,className:s,children:y}),u&&e(x,{text:a,tooltipText:r("copyToClipboard")||"Copy to clipboard",copiedTooltipText:r("copied")||"Copied!",ariaLabel:r("copyToClipboard")||"Copy to clipboard"})]}):n(o,{gap:"tight",children:[p&&e(l,{as:"span",variant:"muted",children:i.label||i.name}),n(o,{direction:"row",align:"center",gap:"tight",children:[e("div",{className:f("dndev-flex-1",c&&"truncate",s),title:c&&a.length>d?a:void 0,children:e(l,{as:"span",children:y})}),u&&e(x,{text:a,tooltipText:r("copyToClipboard")||"Copy to clipboard",copiedTooltipText:r("copied")||"Copied!",ariaLabel:r("copyToClipboard")||"Copy to clipboard"})]})]})};var M=b;export{b as TextFieldDisplay,M as default};
@@ -0,0 +1,22 @@
1
+ import type { EntityField } from '@donotdev/core';
2
+ import type { ComponentType } from 'react';
3
+ export interface TimestampFieldDisplayProps {
4
+ /** Field configuration */
5
+ config: EntityField<'timestamp'>;
6
+ /** Value to display */
7
+ value: string | number;
8
+ /** Translation function */
9
+ t: (key: string, options?: Record<string, any>) => string;
10
+ /** Additional CSS classes */
11
+ className?: string;
12
+ }
13
+ /**
14
+ * TimestampFieldDisplay - Displays timestamp values in read-only mode
15
+ *
16
+ * @version 0.0.1
17
+ * @since 0.0.1
18
+ * @author AMBROISE PARK Consulting
19
+ */
20
+ export declare const TimestampFieldDisplay: ComponentType<TimestampFieldDisplayProps>;
21
+ export default TimestampFieldDisplay;
22
+ //# sourceMappingURL=TimestampFieldDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimestampFieldDisplay.d.ts","sourceRoot":"","sources":["../../../../src/components/fields/display/TimestampFieldDisplay.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,WAAW,0BAA0B;IACzC,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IACjC,uBAAuB;IACvB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,2BAA2B;IAC3B,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;IAC1D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAC/C,0BAA0B,CA8B3B,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1 @@
1
+ import{jsx as a,jsxs as c}from"react/jsx-runtime";import{Text as e}from"@donotdev/components";const n=({config:o,value:t,t:d,className:s})=>{if(!t)return a(e,{as:"span",variant:"muted",className:s,children:"-"});try{const r=new Date(t),i=r.toLocaleDateString(),l=r.toLocaleTimeString();return c("div",{className:s,children:[a(e,{as:"span",children:i}),a(e,{as:"span",variant:"muted",level:"small",children:l})]})}catch{return a(e,{as:"span",variant:"muted",className:s,children:"-"})}};var m=n;export{n as TimestampFieldDisplay,m as default};
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @fileoverview Display field components
3
+ * @description Read-only display components for CRUD operations
4
+ *
5
+ * @version 0.0.1
6
+ * @since 0.0.1
7
+ * @author AMBROISE PARK Consulting
8
+ */
9
+ export { default as TextFieldDisplay } from './TextFieldDisplay';
10
+ export { default as BadgeFieldDisplay } from './BadgeFieldDisplay';
11
+ export { default as AvatarFieldDisplay } from './AvatarFieldDisplay';
12
+ export { default as LinkFieldDisplay } from './LinkFieldDisplay';
13
+ export { default as DateFieldDisplay } from './DateFieldDisplay';
14
+ export { default as NumberFieldDisplay } from './NumberFieldDisplay';
15
+ export { default as PhoneNumberDisplay } from './PhoneNumberDisplay';
16
+ export { default as TextAreaDisplay } from './TextAreaDisplay';
17
+ export { default as RichTextDisplay } from './RichTextDisplay';
18
+ export { default as CheckboxFieldDisplay } from './CheckboxFieldDisplay';
19
+ export { default as DropdownDisplay } from './DropdownDisplay';
20
+ export { default as MultiDropdownDisplay } from './MultiDropdownDisplay';
21
+ export { default as MultiInputTextFieldDisplay } from './MultiInputTextFieldDisplay';
22
+ export { default as RadioFieldDisplay } from './RadioFieldDisplay';
23
+ export { default as RangeFieldDisplay } from './RangeFieldDisplay';
24
+ export { default as FileFieldDisplay } from './FileFieldDisplay';
25
+ export { default as ImageFieldDisplay } from './ImageFieldDisplay';
26
+ export { default as GeoPointFieldDisplay } from './GeoPointFieldDisplay';
27
+ export { default as MapFieldDisplay } from './MapFieldDisplay';
28
+ export { default as ReferenceFieldDisplay } from './ReferenceFieldDisplay';
29
+ export { default as TimestampFieldDisplay } from './TimestampFieldDisplay';
30
+ export { default as HiddenFieldDisplay } from './HiddenFieldDisplay';
31
+ export { default as ButtonFieldDisplay } from './ButtonFieldDisplay';
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/fields/display/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1 @@
1
+ import{default as a}from"./TextFieldDisplay";import{default as i}from"./BadgeFieldDisplay";import{default as s}from"./AvatarFieldDisplay";import{default as l}from"./LinkFieldDisplay";import{default as e}from"./DateFieldDisplay";import{default as t}from"./NumberFieldDisplay";import{default as o}from"./PhoneNumberDisplay";import{default as r}from"./TextAreaDisplay";import{default as p}from"./RichTextDisplay";import{default as m}from"./CheckboxFieldDisplay";import{default as d}from"./DropdownDisplay";import{default as f}from"./MultiDropdownDisplay";import{default as u}from"./MultiInputTextFieldDisplay";import{default as D}from"./RadioFieldDisplay";import{default as y}from"./RangeFieldDisplay";import{default as F}from"./FileFieldDisplay";import{default as n}from"./ImageFieldDisplay";import{default as x}from"./GeoPointFieldDisplay";import{default as T}from"./MapFieldDisplay";import{default as b}from"./ReferenceFieldDisplay";import{default as g}from"./TimestampFieldDisplay";import{default as M}from"./HiddenFieldDisplay";import{default as R}from"./ButtonFieldDisplay";export{s as AvatarFieldDisplay,i as BadgeFieldDisplay,R as ButtonFieldDisplay,m as CheckboxFieldDisplay,e as DateFieldDisplay,d as DropdownDisplay,F as FileFieldDisplay,x as GeoPointFieldDisplay,M as HiddenFieldDisplay,n as ImageFieldDisplay,l as LinkFieldDisplay,T as MapFieldDisplay,f as MultiDropdownDisplay,u as MultiInputTextFieldDisplay,t as NumberFieldDisplay,o as PhoneNumberDisplay,D as RadioFieldDisplay,y as RangeFieldDisplay,b as ReferenceFieldDisplay,p as RichTextDisplay,r as TextAreaDisplay,a as TextFieldDisplay,g as TimestampFieldDisplay};
@@ -1 +1 @@
1
- import{jsx as r,jsxs as f}from"react/jsx-runtime";import{MapPin as D}from"lucide-react";import{useState as S,useEffect as w,useRef as b,useMemo as F}from"react";import{Combobox as M,Stack as L}from"@donotdev/components";import{useTranslation as W,getPlatformEnvVar as Y}from"@donotdev/core";const $=({label:C,value:d,onChange:P,enableGoogleMaps:j=!1,extractDistrictCode:O,error:l,helperText:u,required:x})=>{const{t:n}=W("dndev"),[c,m]=S(d?.formatted_address||""),[g,v]=S([]),[I,p]=S(!1),h=b(null),_=b(null),i=b(null),y=Y("GOOGLE_MAPS_API_KEY")||"",s=j&&!!y,V=F(()=>g.map(e=>({value:e.place_id,label:e.description,description:e.structured_formatting?.secondary_text,content:f("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-sm)"},children:[r(D,{style:{width:"var(--size-icon-sm)",height:"var(--size-icon-sm)"}}),f("div",{children:[r("div",{children:e.description}),e.structured_formatting?.secondary_text&&r("div",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:e.structured_formatting.secondary_text})]})]})})),[g]),G=e=>{_.current&&(p(!0),_.current.getDetails({placeId:e,fields:["formatted_address","geometry","address_components"]},(t,o)=>{if(p(!1),o===window.google?.maps?.places?.PlacesServiceStatus.OK&&t){const a=t.formatted_address||"",k=t.geometry?.location?.lat(),q=t.geometry?.location?.lng(),A={formatted_address:a,latitude:k,longitude:q};if(O&&t.address_components){const E=t.address_components.find(U=>U.types.includes("postal_code"))?.long_name||"",T=E.startsWith("92")?92:parseInt(E.slice(-2),10)||null;A.district_code=T}m(a),P(A)}}))};w(()=>{d?.formatted_address&&m(d.formatted_address)},[d]),w(()=>{if(!s)return;const e=()=>{if(window.google?.maps?.places){t();return}if(document.querySelector("#google-maps-script")){const a=setInterval(()=>{window.google?.maps?.places&&(clearInterval(a),t())},100);return}const o=document.createElement("script");o.id="google-maps-script",o.src=`https://maps.googleapis.com/maps/api/js?key=${y}&libraries=places`,o.async=!0,o.defer=!0,o.onload=()=>t(),document.head.appendChild(o)},t=()=>{window.google?.maps?.places&&(h.current=new window.google.maps.places.AutocompleteService,_.current=new window.google.maps.places.PlacesService(document.createElement("div")))};e()},[s,y]),w(()=>{if(!s||!c||!h.current){v([]);return}return i.current&&clearTimeout(i.current),i.current=setTimeout(()=>{p(!0),h.current.getPlacePredictions({input:c,types:["geocode","establishment"]},(e,t)=>{p(!1),t===window.google?.maps?.places?.PlacesServiceStatus.OK&&e?v(e):v([])})},300),()=>{i.current&&clearTimeout(i.current)}},[s,c]);const K=e=>{m(e),P({formatted_address:e})},z=e=>{const t=Array.isArray(e)?e[0]||"":e;if(!s){K(t);return}g.some(a=>a.place_id===t)&&G(t)},R=e=>{s&&m(e)};return s?f(L,{gap:"tight",children:[r(M,{label:C,value:c,onValueChange:z,onSearchChange:R,placeholder:n("common.address_placeholder"),emptyMessage:n(I?"common.loading":"common.no_results"),options:V,required:x,variant:l?"destructive":void 0,isLoading:I,creatable:!0,createLabel:n("actions.use","Use")}),u&&r("p",{style:{fontSize:"var(--font-size-xs)",color:l?"var(--destructive-foreground)":"var(--muted-foreground)"},children:u})]}):f(L,{gap:"tight",children:[r(M,{label:C,value:c,onValueChange:z,placeholder:n("common.address_placeholder"),options:[],required:x,variant:l?"destructive":void 0,creatable:!0,createLabel:n("actions.use","Use")}),u&&r("p",{style:{fontSize:"var(--font-size-xs)",color:l?"var(--destructive-foreground)":"var(--muted-foreground)"},children:u})]})};var Z=$;export{Z as default};
1
+ import{jsx as a,jsxs as g}from"react/jsx-runtime";import{MapPin as R}from"lucide-react";import{useState as w,useEffect as S,useRef as b,useMemo as U}from"react";import{Combobox as M,Stack as T}from"@donotdev/components";import{useTranslation as W,getPlatformEnvVar as Y}from"@donotdev/core";const $=({label:x,value:i,onChange:z,enableGoogleMaps:q=!1,extractDistrictCode:L,error:d,helperText:l,required:P})=>{const{t:s}=W("dndev"),[n,m]=w(i?.formatted_address||""),[f,v]=w([]),[E,u]=w(!1),h=b(null),_=b(null),c=b(null),y=Y("GOOGLE_MAPS_API_KEY")||"",o=q&&!!y,G=U(()=>f.map(e=>({value:e.place_id,label:e.description,description:e.structured_formatting?.secondary_text,content:g("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-sm)"},children:[a(R,{style:{width:"var(--size-icon-sm)",height:"var(--size-icon-sm)"}}),g("div",{children:[a("div",{children:e.description}),e.structured_formatting?.secondary_text&&a("div",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:e.structured_formatting.secondary_text})]})]})})),[f]),K=e=>{_.current&&(u(!0),_.current.getDetails({placeId:e,fields:["formatted_address","geometry","address_components"]},(r,t)=>{if(u(!1),t===window.google?.maps?.places?.PlacesServiceStatus.OK&&r){const p=r.formatted_address||"",V=r.geometry?.location?.lat(),j=r.geometry?.location?.lng(),A={formatted_address:p,latitude:V,longitude:j};if(L&&r.address_components){const C=r.address_components.find(D=>D.types.includes("postal_code"))?.long_name||"",k=C.startsWith("92")?92:parseInt(C.slice(-2),10)||null;A.district_code=k}m(p),z(A)}}))};S(()=>{i?.formatted_address&&m(i.formatted_address)},[i]),S(()=>{if(!o)return;const e=()=>{if(window.google?.maps?.places){r();return}if(document.querySelector("#google-maps-script")){const p=setInterval(()=>{window.google?.maps?.places&&(clearInterval(p),r())},100);return}const t=document.createElement("script");t.id="google-maps-script",t.src=`https://maps.googleapis.com/maps/api/js?key=${y}&libraries=places`,t.async=!0,t.defer=!0,t.onload=()=>r(),document.head.appendChild(t)},r=()=>{window.google?.maps?.places&&(h.current=new window.google.maps.places.AutocompleteService,_.current=new window.google.maps.places.PlacesService(document.createElement("div")))};e()},[o,y]),S(()=>{if(!o||!n||!h.current){v([]);return}return c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{u(!0),h.current.getPlacePredictions({input:n,types:["geocode","establishment"]},(e,r)=>{u(!1),r===window.google?.maps?.places?.PlacesServiceStatus.OK&&e?v(e):v([])})},300),()=>{c.current&&clearTimeout(c.current)}},[o,n]);const O=e=>{m(e),z({formatted_address:e})},I=e=>{const r=Array.isArray(e)?e[0]||"":e;if(!o){O(r);return}f.some(t=>t.place_id===r)&&K(r)};return o?g(T,{gap:"tight",children:[a(M,{label:x,value:n,onValueChange:I,onSearchChange:e=>{o&&m(e)},placeholder:s("common.address_placeholder"),emptyMessage:s(E?"common.loading":"common.no_results"),options:G,required:P,variant:d?"destructive":void 0,isLoading:E,creatable:!0,createLabel:s("actions.use","Use")}),l&&a("p",{style:{fontSize:"var(--font-size-xs)",color:d?"var(--destructive-foreground)":"var(--muted-foreground)"},children:l})]}):g(T,{gap:"tight",children:[a(M,{label:x,value:n,onValueChange:I,placeholder:s("common.address_placeholder"),options:[],required:P,variant:d?"destructive":void 0,creatable:!0,createLabel:s("actions.use","Use")}),l&&a("p",{style:{fontSize:"var(--font-size-xs)",color:d?"var(--destructive-foreground)":"var(--muted-foreground)"},children:l})]})};var F=$;export{F as default};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as o}from"react/jsx-runtime";import{Avatar as u,Input as v,cn as h,Stack as n}from"@donotdev/components";const g=({config:t,value:a,onChange:s,error:f,helperText:l,t:i,className:c,...d})=>{const m=r=>r.split(" ").map(p=>p.charAt(0)).slice(0,2).join("").toUpperCase();return o(n,{gap:"medium",children:[o(n,{direction:"row",align:"center",gap:"medium",children:[e(u,{src:a,alt:t.label||"Avatar",fallback:m(t.label||"AV"),style:{height:"var(--touch-target)",width:"var(--touch-target)"}}),e("div",{className:"dndev-flex-1",children:e(v,{type:"url",className:h("dndev-w-full",c),placeholder:i("common.enterAvatarUrl"),value:a,onChange:r=>s(r.target.value),...d})})]}),l&&e("p",{style:{fontSize:"var(--font-size-sm)",color:"var(--muted-foreground)"},children:l})]})};var j=g;export{g as AvatarFieldComponent,j as default};
1
+ import{jsx as e,jsxs as o}from"react/jsx-runtime";import{Avatar as p,Input as u,cn as g,Stack as n}from"@donotdev/components";const s=({config:r,value:t,onChange:c,error:A,helperText:l,t:i,className:d,...m})=>{const v=a=>a.split(" ").map(h=>h.charAt(0)).slice(0,2).join("").toUpperCase();return o(n,{gap:"medium",children:[o(n,{direction:"row",align:"center",gap:"medium",children:[e(p,{src:t,alt:r.label||"Avatar",fallback:v(r.label||"AV"),style:{height:"var(--touch-target)",width:"var(--touch-target)"}}),e("div",{className:"dndev-flex-1",children:e(u,{type:"url",className:g("dndev-w-full",d),placeholder:i("common.enterAvatarUrl"),value:t,onChange:a=>c(a.target.value),...m})})]}),l&&e("p",{style:{fontSize:"var(--font-size-sm)",color:"var(--muted-foreground)"},children:l})]})};var f=s;export{s as AvatarFieldComponent,f as default};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import{Badge as s,Input as g,cn as f,Stack as a}from"@donotdev/components";const p=({config:u,value:r,onChange:d,error:v,helperText:n,t:o,variant:i="default",className:l,...m})=>t(a,{gap:"medium",children:[t(a,{direction:"row",align:"center",gap:"medium",children:[e(s,{variant:i,style:{minWidth:0},children:r||o("common.badgePreview")}),e("div",{className:"dndev-flex-1",children:e(g,{type:"text",className:f("dndev-w-full",l),placeholder:o("common.enterBadgeText"),value:r,onChange:c=>d(c.target.value),...m})})]}),n&&e("p",{style:{fontSize:"var(--font-size-sm)",color:"var(--muted-foreground)"},children:n})]});var j=p;export{p as BadgeFieldComponent,j as default};
1
+ import{jsx as e,jsxs as r}from"react/jsx-runtime";import{Badge as g,Input as v,cn as p,Stack as d}from"@donotdev/components";const l=({config:f,value:a,onChange:o,error:h,helperText:t,t:n,variant:s="default",className:i,...m})=>r(d,{gap:"medium",children:[r(d,{direction:"row",align:"center",gap:"medium",children:[e(g,{variant:s,style:{minWidth:0},children:a||n("common.badgePreview")}),e("div",{className:"dndev-flex-1",children:e(v,{type:"text",className:p("dndev-w-full",i),placeholder:n("common.enterBadgeText"),value:a,onChange:c=>o(c.target.value),...m})})]}),t&&e("p",{style:{fontSize:"var(--font-size-sm)",color:"var(--muted-foreground)"},children:t})]});var u=l;export{l as BadgeFieldComponent,u as default};
@@ -1 +1 @@
1
- import{jsx as i}from"react/jsx-runtime";import{Button as a}from"@donotdev/components";const l=({label:t,type:o,onClick:e,variant:n,disabled:r=!1})=>i(a,{type:o,onClick:e,variant:n,disabled:r,children:t});var m=l;export{m as default};
1
+ import{jsx as r}from"react/jsx-runtime";import{Button as e}from"@donotdev/components";const n=({label:a,type:t,onClick:i,variant:l,disabled:o=!1})=>r(e,{type:t,onClick:i,variant:l,disabled:o,children:a});var s=n;export{s as default};
@@ -1 +1 @@
1
- import{jsx as r,jsxs as c}from"react/jsx-runtime";import{Checkbox as h,Label as i,Stack as s}from"@donotdev/components";const d=({label:t,checked:n=!1,onChange:e,required:a})=>c(s,{direction:"row",align:"center",gap:"tight",children:[r(h,{checked:n,onCheckedChange:o=>{e&&e({target:{checked:o}})}}),r(i,{required:a,children:t})]});var C=d;export{C as default};
1
+ import{jsx as r,jsxs as h}from"react/jsx-runtime";import{Checkbox as i,Label as o,Stack as s}from"@donotdev/components";const n=({label:a,checked:c=!1,onChange:e,required:t})=>h(s,{direction:"row",align:"center",gap:"tight",children:[r(i,{checked:c,onCheckedChange:d=>{e&&e({target:{checked:d}})}}),r(o,{required:t,children:a})]});var l=n;export{l as default};
@@ -21,6 +21,12 @@ export interface ComboboxComponentProps {
21
21
  required?: boolean;
22
22
  /** Placeholder text */
23
23
  placeholder?: string;
24
+ /** Translation namespace for placeholder fallback (default: 'dndev') */
25
+ translationNamespace?: string;
26
+ /** Translation key for placeholder fallback (default: 'actions.select') */
27
+ placeholderKey?: string;
28
+ /** Default placeholder text if translation not found (default: 'Select') */
29
+ placeholderDefault?: string;
24
30
  /** Enable creating new values */
25
31
  creatable?: boolean;
26
32
  /** Label for create option */
@@ -1 +1 @@
1
- {"version":3,"file":"ComboboxComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/ComboboxComponent.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACpE,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,QAAA,MAAM,iBAAiB,EAAE,aAAa,CAAC,sBAAsB,CA6F5D,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"ComboboxComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/ComboboxComponent.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACpE,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iCAAiC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,QAAA,MAAM,iBAAiB,EAAE,aAAa,CAAC,sBAAsB,CAgG5D,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- import{jsx as a,jsxs as c}from"react/jsx-runtime";import{useMemo as A,useId as I}from"react";import{Combobox as O,Stack as d}from"@donotdev/components";import{useTranslation as E}from"@donotdev/core";const M=({label:u,value:n,options:s,error:f,helperText:o,onChange:l,onBlur:m,required:p,placeholder:g,creatable:h=!1,createLabel:b,emptyMessage:v})=>{const{t:r}=E("dndev"),i=I(),x=A(()=>s.map(e=>({value:String(e.value),label:e.label})),[s]),C=e=>{if(l){const z={target:{value:Array.isArray(e)?e[0]||"":e}};l(z)}},y=e=>{e||m?.()},t=!!f,S=`${i}-error`,j=`${i}-helper`;return c(d,{gap:"tight",children:[a(O,{label:u,value:n||"",onValueChange:C,onOpenChange:y,placeholder:g||r("actions.select","Select"),emptyMessage:v||r("messages.noResults","No results found"),creatable:h,createLabel:b||r("actions.create","Create"),options:x,required:p,variant:t?"destructive":void 0,clearable:!!n}),t&&c(d,{id:S,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[a("span",{children:"\u26A0"}),o]}),o&&!t&&a("p",{id:j,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:o})]})};var N=M;export{N as default};
1
+ import{jsx as o,jsxs as c}from"react/jsx-runtime";import{useMemo as q,useId as D}from"react";import{Combobox as I,Stack as d}from"@donotdev/components";import{useTranslation as L}from"@donotdev/core";const N=({label:u,value:l,options:s,error:p,helperText:a,onChange:n,onBlur:m,required:g,placeholder:h,translationNamespace:v="dndev",placeholderKey:f="actions.select",placeholderDefault:b="Select",creatable:x=!1,createLabel:y,emptyMessage:S})=>{const{t:r}=L(v),i=D(),z=q(()=>s.map(e=>({value:String(e.value),label:e.label})),[s]),C=e=>{if(n){const $={target:{value:Array.isArray(e)?e[0]||"":e}};n($)}},A=e=>{e||m?.()},t=!!p,M=`${i}-error`,j=`${i}-helper`;return c(d,{gap:"tight",children:[o(I,{label:u,value:l||"",onValueChange:C,onOpenChange:A,placeholder:h||r(f,b),emptyMessage:S||r("messages.noResults","No results found"),creatable:x,createLabel:y||r("actions.create","Create"),options:z,required:g,variant:t?"destructive":void 0,clearable:!!l}),t&&c(d,{id:M,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[o("span",{children:"\u26A0"}),a]}),a&&!t&&o("p",{id:j,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:a})]})};var O=N;export{O as default};
@@ -1 +1 @@
1
- import{jsx as n,jsxs as f}from"react/jsx-runtime";import{useState as N,useEffect as V,useId as j}from"react";import{Input as E,FloatingLabel as I,Stack as z}from"@donotdev/components";const L=({label:m,value:r,onChange:g,currency:a="EUR",locale:y,error:s,helperText:l,required:v=!1,disabled:i=!1,placeholder:h})=>{const c=j(),b=y||(typeof navigator<"u"?navigator.language:"en-US"),d=e=>e==null||isNaN(e)?"":(e/100).toFixed(2),x=e=>{if(!e||e.trim()==="")return null;const t=e.replace(/[^\d.,\-]/g,"").replace(",","."),o=parseFloat(t);return isNaN(o)?null:Math.round(o*100)},[S,u]=N(d(r));V(()=>{u(d(r))},[r]);const C=e=>{const t=e.target.value;u(t);const F={target:{value:x(t)}};g(F)},p=(()=>{try{return new Intl.NumberFormat(b,{style:"currency",currency:a,currencyDisplay:"symbol"}).formatToParts(0).find(e=>e.type==="currency")?.value||a}catch{return a}})();return f(z,{gap:"tight",children:[n(I,{htmlFor:c,label:m,disabled:i,required:v,children:f("div",{style:{position:"relative"},children:[n("span",{style:{position:"absolute",left:"var(--gap-md)",top:"50%",transform:"translateY(-50%)",color:"var(--muted-foreground)",pointerEvents:"none",zIndex:1},children:p}),n(E,{id:c,type:"text",inputMode:"decimal",value:S,onChange:C,disabled:i,placeholder:h||"0.00","data-variant":s?"destructive":void 0,style:{paddingLeft:`calc(var(--gap-md) + ${p.length*.6}em + var(--gap-sm))`}})]})}),l&&n("p",{style:{fontSize:"var(--font-size-xs)",color:s?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:l})]})};var k=L;export{k as default};
1
+ import{jsx as a,jsxs as v}from"react/jsx-runtime";import{useState as I,useEffect as S,useId as z}from"react";import{Input as E,FloatingLabel as j,Stack as C}from"@donotdev/components";const L=({label:g,value:n,onChange:m,currency:o="EUR",locale:f,error:l,helperText:s,required:y=!1,disabled:i=!1,placeholder:h})=>{const d=z(),b=f||(typeof navigator<"u"?navigator.language:"en-US"),u=e=>e==null||isNaN(e)?"":(e/100).toFixed(2),x=e=>{if(!e||e.trim()==="")return null;const r=e.replace(/[^\d.,\-]/g,"").replace(",","."),t=parseFloat(r);return isNaN(t)?null:Math.round(t*100)},[F,c]=I(u(n));S(()=>{c(u(n))},[n]);const N=e=>{const r=e.target.value;c(r);const t={target:{value:x(r)}};m(t)},p=(()=>{try{return new Intl.NumberFormat(b,{style:"currency",currency:o,currencyDisplay:"symbol"}).formatToParts(0).find(e=>e.type==="currency")?.value||o}catch{return o}})();return v(C,{gap:"tight",children:[a(j,{htmlFor:d,label:g,disabled:i,required:y,children:v("div",{style:{position:"relative"},children:[a("span",{style:{position:"absolute",left:"var(--gap-md)",top:"50%",transform:"translateY(-50%)",color:"var(--muted-foreground)",pointerEvents:"none",zIndex:1},children:p}),a(E,{id:d,type:"text",inputMode:"decimal",value:F,onChange:N,disabled:i,placeholder:h||"0.00","data-variant":l?"destructive":void 0,style:{paddingLeft:`calc(var(--gap-md) + ${p.length*.6}em + var(--gap-sm))`}})]})}),s&&a("p",{style:{fontSize:"var(--font-size-xs)",color:l?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:s})]})};var T=L;export{T as default};
@@ -1 +1 @@
1
- import{jsx as l,jsxs as S}from"react/jsx-runtime";import{Input as d,Stack as p}from"@donotdev/components";const m=({label:r,value:i,onChange:s,error:o,helperText:n,mode:e="date",required:g,...c})=>{const f=t=>{const u=t.target.value?new Date(t.target.value).toISOString():null;s(u)};let a="";if(i){const t=new Date(i);e==="date"?a=t.toISOString().split("T")[0]||"":e==="datetime-local"?a=t.toISOString().slice(0,16)||"":e==="month"?a=t.toISOString().slice(0,7):e==="time"?a=t.toISOString().slice(11,16):e==="week"&&(a=t.toISOString().split("T")[0]||"")}return S(p,{gap:"tight",children:[l(d,{label:r,type:e,value:a,onChange:f,required:g,className:"dndev-w-full",...c}),n&&l("p",{style:{fontSize:"var(--font-size-xs)",color:o?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:n})]})};var O=m;export{O as default};
1
+ import{jsx as l,jsxs as c}from"react/jsx-runtime";import{Input as m,Stack as p}from"@donotdev/components";const v=({label:n,value:a,onChange:i,error:s,helperText:o,mode:e="date",required:d,...g})=>{const u=t=>{const S=t.target.value?new Date(t.target.value).toISOString():null;i(S)};let r="";if(a){const t=new Date(a);e==="date"?r=t.toISOString().split("T")[0]||"":e==="datetime-local"?r=t.toISOString().slice(0,16)||"":e==="month"?r=t.toISOString().slice(0,7):e==="time"?r=t.toISOString().slice(11,16):e==="week"&&(r=t.toISOString().split("T")[0]||"")}return c(p,{gap:"tight",children:[l(m,{label:n,type:e,value:r,onChange:u,required:d,className:"dndev-w-full",...g}),o&&l("p",{style:{fontSize:"var(--font-size-xs)",color:s?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:o})]})};var f=v;export{f as default};
@@ -1 +1 @@
1
- "use client";import{jsx as n,jsxs as l,Fragment as ae}from"react/jsx-runtime";import{Upload as ie,X as se,FileText as P,FileSpreadsheet as le,File as de,Loader2 as ce,Eye as ue}from"lucide-react";import{useCallback as w,useState as M,useRef as F,useEffect as W,useImperativeHandle as pe,forwardRef as me}from"react";import{Button as G,BUTTON_VARIANT as V,Text as g,Stack as x,Progress as fe,Dialog as ge,DialogContent as ve,DialogHeader as he,DialogTitle as ye}from"@donotdev/components";import{handleError as D,useTranslation as we}from"@donotdev/core";import{useUploadContext as xe}from"../../../contexts/UploadContext";import{useUploadStore as Te}from"../../../stores/UploadStore";import{uploadFile as be,deleteFile as Pe,generateFileId as X,getFileIcon as Fe,formatFileSize as De,getDocumentAcceptString as Ne}from"../../../utils/fileStorage";function ke({type:f,className:c}){switch(f){case"pdf":return n(P,{className:c,style:{color:"var(--destructive)"}});case"doc":return n(P,{className:c,style:{color:"var(--primary)"}});case"xls":return n(le,{className:c,style:{color:"var(--success)"}});case"ppt":return n(P,{className:c,style:{color:"var(--warning)"}});case"text":case"html":return n(P,{className:c});default:return n(de,{className:c})}}const q=me(({name:f,label:c,value:v,onChange:N,error:k,helperText:R,multiple:p=!1,maxFiles:A=10,maxSize:C=25*1024*1024,storagePath:L="uploads/documents",required:K,enablePreview:H=!0},J)=>{const{t:Q}=we("dndev"),s=Q,h=xe(),I=Te(),O=!!h,[i,u]=M([]),[j,S]=M(!1),[U,_]=M(null),y=F(null),z=F(!1),T=F(void 0),Y=Ne(),b=w(e=>{const r=e.filter(t=>t.uploaded&&!t.error).map(t=>t.uploaded);N(p?r:r[0]||null)},[p,N]);W(()=>{if(z.current){z.current=!1;return}if(v){const e=[];(Array.isArray(v)?v:[v]).forEach(t=>{t.url&&e.push({id:X(),file:new File([],t.filename),uploadProgress:null,uploaded:t,error:null})}),u(e)}else u([])},[v]);const Z=w(async()=>{const e=i.filter(r=>!r.uploaded&&!r.error&&r.uploadProgress===null);if(e.length!==0){u(r=>r.map(t=>e.some(a=>a.id===t.id)?{...t,uploadProgress:0}:t));for(const r of e)try{const t=await be(r.file,{storagePath:L,onProgress:a=>{u(o=>o.map(d=>d.id===r.id?{...d,uploadProgress:a.progress}:d))}});u(a=>{const o=a.map(d=>d.id===r.id?{...d,uploaded:t,uploadProgress:100,error:null}:d);return queueMicrotask(()=>b(o)),o})}catch{u(a=>a.map(o=>o.id===r.id?{...o,error:"Upload failed",uploadProgress:null}:o))}}},[i,L,b]);T.current=Z,W(()=>{if(!(!h||!f))return I.registerUpload(h,f,async e=>{await T.current?.()}),()=>{I.unregisterUpload(h,f)}},[h,f,I]),pe(J,()=>({upload:async()=>{await T.current?.()},getDocuments:()=>B.current||[]}),[]);const B=F(i);B.current=i;const $=e=>{const r=[".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".txt",".md",".html",".csv"],t="."+e.name.split(".").pop()?.toLowerCase();return r.includes(t)},E=w(e=>{const t=(p?A:1)-i.length;if(t<=0){D(new Error("Maximum documents reached"),{userMessage:s("document.errors.maxFiles",{max:A}),severity:"warning",showNotification:!0});return}const a=e.slice(0,t),o=[],d=(C/(1024*1024)).toFixed(0);for(const m of a){if(!$(m)){D(new Error("Invalid document type"),{userMessage:s("document.errors.invalidType",{fileName:m.name}),severity:"warning",showNotification:!0});continue}if(m.size>C){D(new Error("Document too large"),{userMessage:s("document.errors.exceedsSize",{fileName:m.name,size:d}),severity:"warning",showNotification:!0});continue}o.push({id:X(),file:m,uploadProgress:null,uploaded:null,error:null})}o.length!==0&&(u(m=>p?[...m,...o]:o),O||setTimeout(()=>T.current?.(),0))},[i,p,A,C,s,O]),ee=e=>{const r=Array.from(e.target.files||[]);r.length>0&&E(r),y.current&&(y.current.value="")},re=w(e=>{e.preventDefault(),S(!1);const r=Array.from(e.dataTransfer.files);E(r)},[E]),te=w(async e=>{const r=i[e];if(r)try{r.uploaded&&await Pe(r.uploaded);const t=i.filter((a,o)=>o!==e);z.current=!0,u(t),setTimeout(()=>b(t),0)}catch(t){D(t,{userMessage:s("document.delete.failed"),severity:"error",showNotification:!0})}},[i,b,s]),ne=e=>{e.uploaded?.url&&e.uploaded.mimeType==="application/pdf"&&_(e.uploaded.url)},oe=p||i.length===0;return l(ae,{children:[l(x,{gap:"tight",children:[l(g,{level:"body",align:"start",children:[c,K?"*":""]}),oe&&l("div",{role:"button",tabIndex:0,"aria-label":s("document.upload.ariaLabel"),className:"dndev-surface","data-variant":k?"destructive":"default",style:{border:"var(--border-width) dashed",borderColor:j?"var(--primary)":k?"var(--destructive)":"var(--border)",borderRadius:"var(--radius-lg)",padding:"var(--gap-lg)",backgroundColor:j?"color-mix(in oklab, var(--primary) 5%, transparent)":"var(--surface)",transition:"border-color var(--dur-fast), background-color var(--dur-fast)",cursor:"pointer",outline:"none"},onDragOver:e=>{e.preventDefault(),S(!0)},onDragLeave:()=>S(!1),onDrop:re,onClick:()=>y.current?.click(),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),y.current?.click())},children:[n("input",{ref:y,type:"file",accept:Y,multiple:p,style:{display:"none"},onChange:ee}),l(x,{align:"center",justify:"center",gap:"medium",children:[n(ie,{className:"dndev-size-lg",style:{color:"var(--muted-foreground)"}}),n(g,{as:"p",variant:"muted",level:"small",align:"center",children:s("document.upload.hint")}),n(g,{as:"p",variant:"muted",level:"caption",align:"center",children:"PDF, Word, Excel, PowerPoint, TXT, Markdown, HTML"})]})]}),i.length>0&&n(x,{gap:"tight",children:i.map((e,r)=>{const t=Fe(e.uploaded?.mimeType||e.file.type,e.file.name),a=e.uploadProgress!==null&&e.uploadProgress<100,o=e.uploaded?.mimeType==="application/pdf"||e.file.name.toLowerCase().endsWith(".pdf");return l("div",{className:"dndev-surface","data-variant":"muted",style:{padding:"var(--gap-md)",borderRadius:"var(--radius-md)",display:"flex",alignItems:"center",gap:"var(--gap-md)"},children:[n(ke,{type:t,className:"dndev-size-md"}),l(x,{gap:"none",style:{flex:1,minWidth:0},children:[n(g,{level:"small",style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.file.name}),l(g,{level:"caption",variant:"muted",children:[De(e.uploaded?.size||e.file.size),e.error&&l("span",{style:{color:"var(--destructive)"},children:[" ","\xB7 ",e.error]})]}),a&&n(fe,{value:e.uploadProgress||0,max:100,style:{marginTop:"var(--gap-xs)"}})]}),l(x,{direction:"row",gap:"tight",children:[H&&o&&e.uploaded&&n(G,{variant:V.GHOST,onClick:()=>ne(e),"aria-label":s("document.preview.ariaLabel"),children:n(ue,{className:"dndev-size-sm"})}),a?n(ce,{className:"dndev-size-sm",style:{animation:"spin 1s linear infinite"}}):n(G,{variant:V.GHOST,onClick:()=>te(r),"aria-label":s("document.delete.ariaLabel"),children:n(se,{className:"dndev-size-sm"})})]})]},e.id)})}),R&&n(g,{level:"caption",variant:k?"destructive":"muted",style:{marginTop:"var(--gap-xs)"},children:R})]}),H&&U&&n(ge,{open:!!U,onOpenChange:()=>_(null),children:l(ve,{style:{maxWidth:"90vw",maxHeight:"90vh",width:"900px",height:"80vh"},children:[n(he,{children:n(ye,{children:s("document.preview.title")})}),n("iframe",{src:U,style:{width:"100%",height:"100%",border:"none",borderRadius:"var(--radius-md)"},title:"PDF Preview"})]})})]})});q.displayName="DocumentFieldComponent";var Re=q;export{Re as default};
1
+ "use client";import{jsx as a,jsxs as i,Fragment as le}from"react/jsx-runtime";import{Upload as se,X as oe,FileText as T,FileSpreadsheet as ne,File as ie,Loader2 as de,Eye as ce}from"lucide-react";import{useCallback as y,useState as I,useRef as N,useEffect as B,useImperativeHandle as ue,forwardRef as pe}from"react";import{Button as q,BUTTON_VARIANT as G,Text as g,Stack as w,Progress as me,Dialog as ge,DialogContent as fe,DialogHeader as ve,DialogTitle as he}from"@donotdev/components";import{handleError as P,useTranslation as ye}from"@donotdev/core";import{useUploadContext as we}from"../../../contexts/UploadContext";import{useUploadStore as xe}from"../../../stores/UploadStore";import{uploadFile as be,deleteFile as Te,generateFileId as X,getFileIcon as Ne,formatFileSize as Pe,getDocumentAcceptString as De}from"../../../utils/fileStorage";function Fe({type:m,className:c}){switch(m){case"pdf":return a(T,{className:c,style:{color:"var(--destructive)"}});case"doc":return a(T,{className:c,style:{color:"var(--primary)"}});case"xls":return a(ne,{className:c,style:{color:"var(--success)"}});case"ppt":return a(T,{className:c,style:{color:"var(--warning)"}});case"text":case"html":return a(T,{className:c});default:return a(ie,{className:c})}}const V=pe(({name:m,label:c,value:f,onChange:U,error:D,helperText:L,multiple:p=!1,maxFiles:F=10,maxSize:k=25*1024*1024,storagePath:O="uploads/documents",required:_,enablePreview:R=!0},K)=>{const{t:Q}=ye("dndev"),n=Q,v=we(),z=xe(),A=!!v,[o,u]=I([]),[H,C]=I(!1),[S,W]=I(null),h=N(null),E=N(!1),x=N(void 0),Y=De(),b=y(e=>{const r=e.filter(t=>t.uploaded&&!t.error).map(t=>t.uploaded);U(p?r:r[0]||null)},[p,U]);B(()=>{if(E.current){E.current=!1;return}if(f){const e=[];(Array.isArray(f)?f:[f]).forEach(r=>{r.url&&e.push({id:X(),file:new File([],r.filename),uploadProgress:null,uploaded:r,error:null})}),u(e)}else u([])},[f]);const Z=y(async()=>{const e=o.filter(r=>!r.uploaded&&!r.error&&r.uploadProgress===null);if(e.length!==0){u(r=>r.map(t=>e.some(l=>l.id===t.id)?{...t,uploadProgress:0}:t));for(const r of e)try{const t=await be(r.file,{storagePath:O,onProgress:l=>{u(d=>d.map(s=>s.id===r.id?{...s,uploadProgress:l.progress}:s))}});u(l=>{const d=l.map(s=>s.id===r.id?{...s,uploaded:t,uploadProgress:100,error:null}:s);return queueMicrotask(()=>b(d)),d})}catch{u(t=>t.map(l=>l.id===r.id?{...l,error:"Upload failed",uploadProgress:null}:l))}}},[o,O,b]);x.current=Z,B(()=>{if(!(!v||!m))return z.registerUpload(v,m,async e=>{await x.current?.()}),()=>{z.unregisterUpload(v,m)}},[v,m,z]),ue(K,()=>({upload:async()=>{await x.current?.()},getDocuments:()=>j.current||[]}),[]);const j=N(o);j.current=o;const $=e=>{const r=[".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".txt",".md",".html",".csv"],t="."+e.name.split(".").pop()?.toLowerCase();return r.includes(t)},M=y(e=>{const r=(p?F:1)-o.length;if(r<=0){P(new Error("Maximum documents reached"),{userMessage:n("document.errors.maxFiles",{max:F}),severity:"warning",showNotification:!0});return}const t=e.slice(0,r),l=[],d=(k/(1024*1024)).toFixed(0);for(const s of t){if(!$(s)){P(new Error("Invalid document type"),{userMessage:n("document.errors.invalidType",{fileName:s.name}),severity:"warning",showNotification:!0});continue}if(s.size>k){P(new Error("Document too large"),{userMessage:n("document.errors.exceedsSize",{fileName:s.name,size:d}),severity:"warning",showNotification:!0});continue}l.push({id:X(),file:s,uploadProgress:null,uploaded:null,error:null})}l.length!==0&&(u(s=>p?[...s,...l]:l),A||setTimeout(()=>x.current?.(),0))},[o,p,F,k,n,A]),J=e=>{const r=Array.from(e.target.files||[]);r.length>0&&M(r),h.current&&(h.current.value="")},ee=y(e=>{e.preventDefault(),C(!1);const r=Array.from(e.dataTransfer.files);M(r)},[M]),re=y(async e=>{const r=o[e];if(r)try{r.uploaded&&await Te(r.uploaded);const t=o.filter((l,d)=>d!==e);E.current=!0,u(t),setTimeout(()=>b(t),0)}catch(t){P(t,{userMessage:n("document.delete.failed"),severity:"error",showNotification:!0})}},[o,b,n]),ae=e=>{e.uploaded?.url&&e.uploaded.mimeType==="application/pdf"&&W(e.uploaded.url)},te=p||o.length===0;return i(le,{children:[i(w,{gap:"tight",children:[i(g,{level:"body",align:"start",children:[c,_?"*":""]}),te&&i("div",{role:"button",tabIndex:0,"aria-label":n("document.upload.ariaLabel"),className:"dndev-surface","data-variant":D?"destructive":"default",style:{border:"var(--border-width) dashed",borderColor:H?"var(--primary)":D?"var(--destructive)":"var(--border)",borderRadius:"var(--radius-lg)",padding:"var(--gap-lg)",backgroundColor:H?"color-mix(in oklab, var(--primary) 5%, transparent)":"var(--surface)",transition:"border-color var(--dur-fast), background-color var(--dur-fast)",cursor:"pointer",outline:"none"},onDragOver:e=>{e.preventDefault(),C(!0)},onDragLeave:()=>C(!1),onDrop:ee,onClick:()=>h.current?.click(),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),h.current?.click())},children:[a("input",{ref:h,type:"file",accept:Y,multiple:p,style:{display:"none"},onChange:J}),i(w,{align:"center",justify:"center",gap:"medium",children:[a(se,{className:"dndev-size-lg",style:{color:"var(--muted-foreground)"}}),a(g,{as:"p",variant:"muted",level:"small",align:"center",children:n("document.upload.hint")}),a(g,{as:"p",variant:"muted",level:"caption",align:"center",children:"PDF, Word, Excel, PowerPoint, TXT, Markdown, HTML"})]})]}),o.length>0&&a(w,{gap:"tight",children:o.map((e,r)=>{const t=Ne(e.uploaded?.mimeType||e.file.type,e.file.name),l=e.uploadProgress!==null&&e.uploadProgress<100,d=e.uploaded?.mimeType==="application/pdf"||e.file.name.toLowerCase().endsWith(".pdf");return i("div",{className:"dndev-surface","data-variant":"muted",style:{padding:"var(--gap-md)",borderRadius:"var(--radius-md)",display:"flex",alignItems:"center",gap:"var(--gap-md)"},children:[a(Fe,{type:t,className:"dndev-size-md"}),i(w,{gap:"none",style:{flex:1,minWidth:0},children:[a(g,{level:"small",style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.file.name}),i(g,{level:"caption",variant:"muted",children:[Pe(e.uploaded?.size||e.file.size),e.error&&i("span",{style:{color:"var(--destructive)"},children:[" ","\xB7 ",e.error]})]}),l&&a(me,{value:e.uploadProgress||0,max:100,style:{marginTop:"var(--gap-xs)"}})]}),i(w,{direction:"row",gap:"tight",children:[R&&d&&e.uploaded&&a(q,{variant:G.GHOST,onClick:()=>ae(e),"aria-label":n("document.preview.ariaLabel"),children:a(ce,{className:"dndev-size-sm"})}),l?a(de,{className:"dndev-size-sm",style:{animation:"spin 1s linear infinite"}}):a(q,{variant:G.GHOST,onClick:()=>re(r),"aria-label":n("document.delete.ariaLabel"),children:a(oe,{className:"dndev-size-sm"})})]})]},e.id)})}),L&&a(g,{level:"caption",variant:D?"destructive":"muted",style:{marginTop:"var(--gap-xs)"},children:L})]}),R&&S&&a(ge,{open:!!S,onOpenChange:()=>W(null),children:i(fe,{style:{maxWidth:"90vw",maxHeight:"90vh",width:"900px",height:"80vh"},children:[a(ve,{children:a(he,{children:n("document.preview.title")})}),a("iframe",{src:S,style:{width:"100%",height:"100%",border:"none",borderRadius:"var(--radius-md)"},title:"PDF Preview"})]})})]})});V.displayName="DocumentFieldComponent";var ke=V;export{ke as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as p}from"react/jsx-runtime";import{Select as g,Stack as m}from"@donotdev/components";import{useTranslation as f}from"@donotdev/core";const h=({label:r,value:n,options:s,error:l,helperText:t,onChange:a,onBlur:i,required:c})=>{const{t:d}=f("dndev"),u=n!=null?String(n):"";return p(m,{gap:"tight",children:[o(g,{label:r,value:u,onValueChange:e=>{a&&a({target:{value:e}})},onOpenChange:e=>!e&&i?.(),placeholder:d("actions.select","Select"),required:c,options:s.map(e=>({value:String(e.value),label:e.label}))}),t&&o("p",{style:{fontSize:"var(--font-size-xs)",color:l?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:t})]})};var C=h;export{C as default};
1
+ import{jsx as l,jsxs as g}from"react/jsx-runtime";import{Select as c,Stack as v}from"@donotdev/components";import{useTranslation as m}from"@donotdev/core";const f=({label:t,value:r,options:n,error:s,helperText:a,onChange:o,onBlur:i,required:u})=>{const{t:p}=m("dndev"),d=r!=null?String(r):"";return g(v,{gap:"tight",children:[l(c,{label:t,value:d,onValueChange:e=>{o&&o({target:{value:e}})},onOpenChange:e=>!e&&i?.(),placeholder:p("actions.select","Select"),required:u,options:n.map(e=>({value:String(e.value),label:e.label}))}),a&&l("p",{style:{fontSize:"var(--font-size-xs)",color:s?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:a})]})};var h=f;export{h as default};
@@ -1 +1 @@
1
- "use client";import{jsx as s,jsxs as p}from"react/jsx-runtime";import{Upload as Z,X as $,File as ee,Loader2 as re,FileText as C,FileSpreadsheet as oe,FileImage as se,FileVideo as ae,FileAudio as te,FileArchive as le,FileCode as ne}from"lucide-react";import{useCallback as y,useState as O,useRef as b,useEffect as _,useImperativeHandle as ie,forwardRef as de}from"react";import{Button as ue,BUTTON_VARIANT as ce,Text as F,Stack as P,Progress as pe}from"@donotdev/components";import{handleError as M,useTranslation as fe}from"@donotdev/core";import{useUploadContext as ge}from"../../../contexts/UploadContext";import{useUploadStore as me}from"../../../stores/UploadStore";import{uploadFile as ve,deleteFile as he,generateFileId as H,getFileIcon as ye,formatFileSize as Fe}from"../../../utils/fileStorage";function we({type:f,className:n}){switch(f){case"pdf":return s(C,{className:n,style:{color:"var(--destructive)"}});case"doc":return s(C,{className:n,style:{color:"var(--primary)"}});case"xls":return s(oe,{className:n,style:{color:"var(--success)"}});case"ppt":return s(C,{className:n,style:{color:"var(--warning)"}});case"image":return s(se,{className:n});case"video":return s(ae,{className:n});case"audio":return s(te,{className:n});case"archive":return s(le,{className:n});case"html":case"text":return s(ne,{className:n});default:return s(ee,{className:n})}}const D=de(({name:f,label:n,value:g,onChange:T,error:A,helperText:R,accept:V,multiple:d=!1,maxFiles:N=10,maxSize:k=50*1024*1024,storagePath:E="uploads/files",required:q},G)=>{const{t:K}=fe("dndev"),i=K,m=ge(),I=me(),j=!!m,[t,c]=O([]),[L,U]=O(!1),v=b(null),S=b(!1),w=b(void 0),x=y(e=>{const r=e.filter(o=>o.uploaded&&!o.error).map(o=>o.uploaded);T(d?r:r[0]||null)},[d,T]);_(()=>{if(S.current){S.current=!1;return}if(g){const e=[];(Array.isArray(g)?g:[g]).forEach(o=>{o.url&&e.push({id:H(),file:new File([],o.filename),uploadProgress:null,uploaded:o,error:null})}),c(e)}else c([])},[g]);const W=y(async()=>{const e=t.filter(r=>!r.uploaded&&!r.error&&r.uploadProgress===null);if(e.length!==0){c(r=>r.map(o=>e.some(l=>l.id===o.id)?{...o,uploadProgress:0}:o));for(const r of e)try{const o=await ve(r.file,{storagePath:E,onProgress:l=>{c(a=>a.map(u=>u.id===r.id?{...u,uploadProgress:l.progress}:u))}});c(l=>{const a=l.map(u=>u.id===r.id?{...u,uploaded:o,uploadProgress:100,error:null}:u);return queueMicrotask(()=>x(a)),a})}catch{c(l=>l.map(a=>a.id===r.id?{...a,error:"Upload failed",uploadProgress:null}:a))}}},[t,E,x]);w.current=W,_(()=>{if(!(!m||!f))return I.registerUpload(m,f,async e=>{await w.current?.()}),()=>{I.unregisterUpload(m,f)}},[m,f,I]),ie(G,()=>({upload:async()=>{await w.current?.()},getFiles:()=>B.current||[]}),[]);const B=b(t);B.current=t;const z=y(e=>{const o=(d?N:1)-t.length;if(o<=0){M(new Error("Maximum files reached"),{userMessage:i("file.errors.maxFiles",{max:N}),severity:"warning",showNotification:!0});return}const l=e.slice(0,o),a=[],u=(k/(1024*1024)).toFixed(0);for(const h of l){if(h.size>k){M(new Error("File too large"),{userMessage:i("file.errors.exceedsSize",{fileName:h.name,size:u}),severity:"warning",showNotification:!0});continue}a.push({id:H(),file:h,uploadProgress:null,uploaded:null,error:null})}a.length!==0&&(c(h=>d?[...h,...a]:a),j||setTimeout(()=>w.current?.(),0))},[t,d,N,k,i,j]),X=e=>{const r=Array.from(e.target.files||[]);r.length>0&&z(r),v.current&&(v.current.value="")},J=y(e=>{e.preventDefault(),U(!1);const r=Array.from(e.dataTransfer.files);z(r)},[z]),Q=y(async e=>{const r=t[e];if(r)try{r.uploaded&&await he(r.uploaded);const o=t.filter((l,a)=>a!==e);S.current=!0,c(o),setTimeout(()=>x(o),0)}catch(o){M(o,{userMessage:i("file.delete.failed"),severity:"error",showNotification:!0})}},[t,x,i]),Y=d||t.length===0,xe=t.some(e=>!e.uploaded&&!e.error&&e.uploadProgress===null);return p(P,{gap:"tight",children:[p(F,{level:"body",align:"start",children:[n,q?"*":""]}),Y&&p("div",{role:"button",tabIndex:0,"aria-label":i(d?"file.upload.ariaLabelMultiple":"file.upload.ariaLabelSingle"),className:"dndev-surface","data-variant":A?"destructive":"default",style:{border:"var(--border-width) dashed",borderColor:L?"var(--primary)":A?"var(--destructive)":"var(--border)",borderRadius:"var(--radius-lg)",padding:"var(--gap-lg)",backgroundColor:L?"color-mix(in oklab, var(--primary) 5%, transparent)":"var(--surface)",transition:"border-color var(--dur-fast), background-color var(--dur-fast)",cursor:"pointer",outline:"none"},onDragOver:e=>{e.preventDefault(),U(!0)},onDragLeave:()=>U(!1),onDrop:J,onClick:()=>v.current?.click(),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),v.current?.click())},children:[s("input",{ref:v,type:"file",accept:V,multiple:d,style:{display:"none"},onChange:X}),p(P,{align:"center",justify:"center",gap:"medium",children:[s(Z,{className:"dndev-size-lg",style:{color:"var(--muted-foreground)"}}),s(F,{as:"p",variant:"muted",level:"small",align:"center",children:i(d?"file.upload.dragDropMultiple":"file.upload.dragDropSingle")})]})]}),t.length>0&&s(P,{gap:"tight",children:t.map((e,r)=>{const o=ye(e.uploaded?.mimeType||e.file.type,e.file.name),l=e.uploadProgress!==null&&e.uploadProgress<100,a=e.uploaded&&!e.error;return p("div",{className:"dndev-surface","data-variant":"muted",style:{padding:"var(--gap-md)",borderRadius:"var(--radius-md)",display:"flex",alignItems:"center",gap:"var(--gap-md)"},children:[s(we,{type:o,className:"dndev-size-md"}),p(P,{gap:"none",style:{flex:1,minWidth:0},children:[s(F,{level:"small",style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.file.name}),p(F,{level:"caption",variant:"muted",children:[Fe(e.uploaded?.size||e.file.size),e.error&&p("span",{style:{color:"var(--destructive)"},children:[" ","\xB7 ",e.error]})]}),l&&s(pe,{value:e.uploadProgress||0,max:100,style:{marginTop:"var(--gap-xs)"}})]}),l?s(re,{className:"dndev-size-sm",style:{animation:"spin 1s linear infinite"}}):s(ue,{variant:ce.GHOST,onClick:()=>Q(r),"aria-label":i("file.delete.ariaLabel"),children:s($,{className:"dndev-size-sm"})})]},e.id)})}),R&&s(F,{level:"caption",variant:A?"destructive":"muted",style:{marginTop:"var(--gap-xs)"},children:R})]})});D.displayName="FileFieldComponent";var ze=D;export{ze as default};
1
+ "use client";import{jsx as l,jsxs as p}from"react/jsx-runtime";import{Upload as Y,X as Z,File as $,Loader2 as ee,FileText as D,FileSpreadsheet as re,FileImage as ae,FileVideo as le,FileAudio as se,FileArchive as te,FileCode as ie}from"lucide-react";import{useCallback as h,useState as j,useRef as F,useEffect as B,useImperativeHandle as oe,forwardRef as ne}from"react";import{Button as de,BUTTON_VARIANT as ce,Text as y,Stack as N,Progress as ue}from"@donotdev/components";import{handleError as I,useTranslation as pe}from"@donotdev/core";import{useUploadContext as me}from"../../../contexts/UploadContext";import{useUploadStore as fe}from"../../../stores/UploadStore";import{uploadFile as ge,deleteFile as ve,generateFileId as R,getFileIcon as he,formatFileSize as ye}from"../../../utils/fileStorage";function xe({type:m,className:o}){switch(m){case"pdf":return l(D,{className:o,style:{color:"var(--destructive)"}});case"doc":return l(D,{className:o,style:{color:"var(--primary)"}});case"xls":return l(re,{className:o,style:{color:"var(--success)"}});case"ppt":return l(D,{className:o,style:{color:"var(--warning)"}});case"image":return l(ae,{className:o});case"video":return l(le,{className:o});case"audio":return l(se,{className:o});case"archive":return l(te,{className:o});case"html":case"text":return l(ie,{className:o});default:return l($,{className:o})}}const H=ne(({name:m,label:o,value:f,onChange:M,error:b,helperText:U,accept:q,multiple:n=!1,maxFiles:P=10,maxSize:z=50*1024*1024,storagePath:A="uploads/files",required:K},V)=>{const{t:W}=pe("dndev"),c=W,g=me(),T=fe(),L=!!g,[t,u]=j([]),[E,S]=j(!1),v=F(null),C=F(!1),x=F(void 0),w=h(e=>{const r=e.filter(a=>a.uploaded&&!a.error).map(a=>a.uploaded);M(n?r:r[0]||null)},[n,M]);B(()=>{if(C.current){C.current=!1;return}if(f){const e=[];(Array.isArray(f)?f:[f]).forEach(r=>{r.url&&e.push({id:R(),file:new File([],r.filename),uploadProgress:null,uploaded:r,error:null})}),u(e)}else u([])},[f]);const X=h(async()=>{const e=t.filter(r=>!r.uploaded&&!r.error&&r.uploadProgress===null);if(e.length!==0){u(r=>r.map(a=>e.some(s=>s.id===a.id)?{...a,uploadProgress:0}:a));for(const r of e)try{const a=await ge(r.file,{storagePath:A,onProgress:s=>{u(d=>d.map(i=>i.id===r.id?{...i,uploadProgress:s.progress}:i))}});u(s=>{const d=s.map(i=>i.id===r.id?{...i,uploaded:a,uploadProgress:100,error:null}:i);return queueMicrotask(()=>w(d)),d})}catch{u(a=>a.map(s=>s.id===r.id?{...s,error:"Upload failed",uploadProgress:null}:s))}}},[t,A,w]);x.current=X,B(()=>{if(!(!g||!m))return T.registerUpload(g,m,async e=>{await x.current?.()}),()=>{T.unregisterUpload(g,m)}},[g,m,T]),oe(V,()=>({upload:async()=>{await x.current?.()},getFiles:()=>O.current||[]}),[]);const O=F(t);O.current=t;const k=h(e=>{const r=(n?P:1)-t.length;if(r<=0){I(new Error("Maximum files reached"),{userMessage:c("file.errors.maxFiles",{max:P}),severity:"warning",showNotification:!0});return}const a=e.slice(0,r),s=[],d=(z/(1024*1024)).toFixed(0);for(const i of a){if(i.size>z){I(new Error("File too large"),{userMessage:c("file.errors.exceedsSize",{fileName:i.name,size:d}),severity:"warning",showNotification:!0});continue}s.push({id:R(),file:i,uploadProgress:null,uploaded:null,error:null})}s.length!==0&&(u(i=>n?[...i,...s]:s),L||setTimeout(()=>x.current?.(),0))},[t,n,P,z,c,L]),_=e=>{const r=Array.from(e.target.files||[]);r.length>0&&k(r),v.current&&(v.current.value="")},G=h(e=>{e.preventDefault(),S(!1);const r=Array.from(e.dataTransfer.files);k(r)},[k]),J=h(async e=>{const r=t[e];if(r)try{r.uploaded&&await ve(r.uploaded);const a=t.filter((s,d)=>d!==e);C.current=!0,u(a),setTimeout(()=>w(a),0)}catch(a){I(a,{userMessage:c("file.delete.failed"),severity:"error",showNotification:!0})}},[t,w,c]),Q=n||t.length===0,Fe=t.some(e=>!e.uploaded&&!e.error&&e.uploadProgress===null);return p(N,{gap:"tight",children:[p(y,{level:"body",align:"start",children:[o,K?"*":""]}),Q&&p("div",{role:"button",tabIndex:0,"aria-label":c(n?"file.upload.ariaLabelMultiple":"file.upload.ariaLabelSingle"),className:"dndev-surface","data-variant":b?"destructive":"default",style:{border:"var(--border-width) dashed",borderColor:E?"var(--primary)":b?"var(--destructive)":"var(--border)",borderRadius:"var(--radius-lg)",padding:"var(--gap-lg)",backgroundColor:E?"color-mix(in oklab, var(--primary) 5%, transparent)":"var(--surface)",transition:"border-color var(--dur-fast), background-color var(--dur-fast)",cursor:"pointer",outline:"none"},onDragOver:e=>{e.preventDefault(),S(!0)},onDragLeave:()=>S(!1),onDrop:G,onClick:()=>v.current?.click(),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),v.current?.click())},children:[l("input",{ref:v,type:"file",accept:q,multiple:n,style:{display:"none"},onChange:_}),p(N,{align:"center",justify:"center",gap:"medium",children:[l(Y,{className:"dndev-size-lg",style:{color:"var(--muted-foreground)"}}),l(y,{as:"p",variant:"muted",level:"small",align:"center",children:c(n?"file.upload.dragDropMultiple":"file.upload.dragDropSingle")})]})]}),t.length>0&&l(N,{gap:"tight",children:t.map((e,r)=>{const a=he(e.uploaded?.mimeType||e.file.type,e.file.name),s=e.uploadProgress!==null&&e.uploadProgress<100,d=e.uploaded&&!e.error;return p("div",{className:"dndev-surface","data-variant":"muted",style:{padding:"var(--gap-md)",borderRadius:"var(--radius-md)",display:"flex",alignItems:"center",gap:"var(--gap-md)"},children:[l(xe,{type:a,className:"dndev-size-md"}),p(N,{gap:"none",style:{flex:1,minWidth:0},children:[l(y,{level:"small",style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.file.name}),p(y,{level:"caption",variant:"muted",children:[ye(e.uploaded?.size||e.file.size),e.error&&p("span",{style:{color:"var(--destructive)"},children:[" ","\xB7 ",e.error]})]}),s&&l(ue,{value:e.uploadProgress||0,max:100,style:{marginTop:"var(--gap-xs)"}})]}),s?l(ee,{className:"dndev-size-sm",style:{animation:"spin 1s linear infinite"}}):l(de,{variant:ce.GHOST,onClick:()=>J(r),"aria-label":c("file.delete.ariaLabel"),children:l(Z,{className:"dndev-size-sm"})})]},e.id)})}),U&&l(y,{level:"caption",variant:b?"destructive":"muted",style:{marginTop:"var(--gap-xs)"},children:U})]})});H.displayName="FileFieldComponent";var we=H;export{we as default};
@@ -13,9 +13,9 @@ export interface GdprConsentFieldComponentProps {
13
13
  }
14
14
  /**
15
15
  * GDPR Consent Field Component - Renders a consent checkbox with automatic label generation.
16
- * Automatically generates label with links to privacy policy and terms using native <a> tags.
16
+ * Opens privacy policy and terms in Sheet with iframe when links are clicked.
17
17
  *
18
- * @version 0.0.1
18
+ * @version 0.0.2
19
19
  * @since 0.0.1
20
20
  * @author AMBROISE PARK Consulting
21
21
  * @param props - GdprConsentFieldComponentProps
@@ -1 +1 @@
1
- {"version":3,"file":"GdprConsentFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/GdprConsentFieldComponent.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,8BAA8B;IAC7C,sCAAsC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC1D,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,QAAA,MAAM,yBAAyB,EAAE,aAAa,CAAC,8BAA8B,CA2E5E,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"GdprConsentFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/GdprConsentFieldComponent.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAc,MAAM,OAAO,CAAC;AAEpE,MAAM,WAAW,8BAA8B;IAC7C,sCAAsC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC1D,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,QAAA,MAAM,yBAAyB,EAAE,aAAa,CAC5C,8BAA8B,CA4I/B,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
@@ -1 +1 @@
1
- import{jsx as t,jsxs as s}from"react/jsx-runtime";import{useId as m}from"react";import{Checkbox as h,Label as x,Text as y}from"@donotdev/components";import{useTranslation as C}from"@donotdev/core";const k=({checked:n=!1,onChange:o,required:i,privacyPolicyPath:c="/legal/privacy",termsPath:p="/legal/terms"})=>{const a=m(),{t:r}=C("crud"),l=e=>{o&&o({target:{checked:e}})},d=r("gdprConsent.consent",{defaultValue:"I agree to the"}),u=r("gdprConsent.privacyPolicy",{defaultValue:"privacy policy"}),f=r("gdprConsent.terms",{defaultValue:"terms of use"}),g=r("gdprConsent.and",{defaultValue:"and consent to the processing of my personal data."});return s("label",{htmlFor:a,style:{display:"flex",flexDirection:"row",alignItems:"center",gap:"var(--gap-tight)",cursor:"pointer",userSelect:"none"},onClick:e=>{e.target.tagName!=="A"&&(e.target.closest('[data-type="checkbox"]')||l(!n))},children:[t(h,{id:a,checked:n,onCheckedChange:l}),t(x,{required:i,plain:!0,children:s(y,{level:"small",children:[d," ",t("a",{href:c,style:{color:"var(--primary)",textDecoration:"underline"},target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:u})," / ",t("a",{href:p,style:{color:"var(--primary)",textDecoration:"underline"},target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),children:f})," ",g]})})]})};var V=k;export{V as default};
1
+ import{jsx as t,jsxs as a,Fragment as b}from"react/jsx-runtime";import{useState as m}from"react";import{Checkbox as D,Label as H,Sheet as f,Stack as V,Text as P}from"@donotdev/components";import{useTranslation as j}from"@donotdev/core";const q=({checked:o=!1,onChange:l,required:u,privacyPolicyPath:s="/legal/privacy",termsPath:c="/legal/terms"})=>{const{t:r}=j("crud"),[y,d]=m(!1),[x,h]=m(!1),p=e=>{l&&l({target:{checked:e}})},v=e=>{e.target.tagName!=="A"&&(e.target.closest('[data-type="checkbox"]')||p(!o))},g=(e,w)=>{e.preventDefault(),w==="privacy"?d(!0):h(!0)},C=r("gdprConsent.consent",{defaultValue:"I agree to the"}),n=r("gdprConsent.privacyPolicy",{defaultValue:"privacy policy"}),i=r("gdprConsent.terms",{defaultValue:"terms of use"}),k=r("gdprConsent.and",{defaultValue:"and consent to the processing of my personal data."});return a(b,{children:[a(V,{direction:"row",align:"center",gap:"tight",children:[t(D,{checked:o,onCheckedChange:p}),t(H,{required:u,plain:!0,onClick:v,style:{cursor:"pointer"},children:a(P,{level:"small",children:[C," ",t("a",{href:s,onClick:e=>g(e,"privacy"),style:{textDecoration:"underline",cursor:"pointer"},children:n})," / ",t("a",{href:c,onClick:e=>g(e,"terms"),style:{textDecoration:"underline",cursor:"pointer"},children:i})," ",k]})})]}),t(f,{open:y,onOpenChange:d,side:"bottom",title:n,style:{width:"100%",height:"90%",maxHeight:"90dvh",display:"flex",flexDirection:"column",overflow:"hidden"},children:t("iframe",{src:s,style:{width:"100%",height:"100%",border:"none",flex:1,minHeight:0},title:n})}),t(f,{open:x,onOpenChange:h,side:"bottom",title:i,style:{width:"100%",height:"90%",maxHeight:"90dvh",display:"flex",flexDirection:"column",overflow:"hidden"},children:t("iframe",{src:c,style:{width:"100%",height:"100%",border:"none",flex:1,minHeight:0},title:i})})]})};var O=q;export{O as default};
@@ -1 +1 @@
1
- import{jsx as n,jsxs as c}from"react/jsx-runtime";import{Label as h,Input as g,Stack as u}from"@donotdev/components";const y=({label:m,value:e={lat:0,lng:0},onChange:l,error:a,helperText:r,disabled:d,required:f})=>{const v=i=>{const t=parseFloat(i.target.value)||0;if(t>=-90&&t<=90){const s={...e,lat:t},o={target:{value:JSON.stringify(s)}};l(o)}},p=i=>{const t=parseFloat(i.target.value)||0;if(t>=-180&&t<=180){const s={...e,lng:t},o={target:{value:JSON.stringify(s)}};l(o)}};return c(u,{gap:"tight",children:[n(h,{required:f,style:{display:"block",fontSize:"var(--font-size-sm)",fontWeight:500},children:m}),c(u,{direction:"row",gap:"medium",children:[n(g,{label:"Latitude",type:"number",value:e.lat,onChange:v,min:"-90",max:"90",step:"0.000001",disabled:d,"data-variant":a?"destructive":void 0,className:"dndev-w-full"}),n(g,{label:"Longitude",type:"number",value:e.lng,onChange:p,min:"-180",max:"180",step:"0.000001",disabled:d,"data-variant":a?"destructive":void 0,className:"dndev-w-full"})]}),r&&n("p",{style:{fontSize:"var(--font-size-xs)",color:a?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:r})]})};var L=y;export{L as default};
1
+ import{jsx as t,jsxs as u}from"react/jsx-runtime";import{Label as h,Input as v,Stack as g}from"@donotdev/components";const b=({label:c,value:a={lat:0,lng:0},onChange:i,error:r,helperText:o,disabled:d,required:m})=>{const p=n=>{const e=parseFloat(n.target.value)||0;if(e>=-90&&e<=90){const l={...a,lat:e},s={target:{value:JSON.stringify(l)}};i(s)}},f=n=>{const e=parseFloat(n.target.value)||0;if(e>=-180&&e<=180){const l={...a,lng:e},s={target:{value:JSON.stringify(l)}};i(s)}};return u(g,{gap:"tight",children:[t(h,{required:m,style:{display:"block",fontSize:"var(--font-size-sm)",fontWeight:500},children:c}),u(g,{direction:"row",gap:"medium",children:[t(v,{label:"Latitude",type:"number",value:a.lat,onChange:p,min:"-90",max:"90",step:"0.000001",disabled:d,"data-variant":r?"destructive":void 0,className:"dndev-w-full"}),t(v,{label:"Longitude",type:"number",value:a.lng,onChange:f,min:"-180",max:"180",step:"0.000001",disabled:d,"data-variant":r?"destructive":void 0,className:"dndev-w-full"})]}),o&&t("p",{style:{fontSize:"var(--font-size-xs)",color:r?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:o})]})};var y=b;export{y as default};
@@ -1 +1 @@
1
- import{jsx as t}from"react/jsx-runtime";const d=({name:e,value:n})=>t("input",{type:"hidden",name:e,value:n});var i=d;export{i as default};
1
+ import{jsx as t}from"react/jsx-runtime";const n=({name:a,value:e})=>t("input",{type:"hidden",name:a,value:e});var d=n;export{d as default};
@@ -1 +1 @@
1
- "use client";import{jsx as r,jsxs as l,Fragment as q}from"react/jsx-runtime";import{DndContext as J,closestCenter as Q,PointerSensor as Z,TouchSensor as ee,useSensor as j,useSensors as re}from"@dnd-kit/core";import{SortableContext as te,useSortable as oe,rectSortingStrategy as ne,arrayMove as ie}from"@dnd-kit/sortable";import{CSS as ae}from"@dnd-kit/utilities";import{Upload as se,X as A,Loader2 as le,GripVertical as de}from"lucide-react";import{forwardRef as ce,useCallback as V,useImperativeHandle as pe,useRef as ue,useState as L}from"react";import{Text as h,Stack as C,Progress as ge}from"@donotdev/components";import{useTranslation as me}from"@donotdev/core";import{useFileUpload as he}from"../../../hooks/useFileUpload";import{processImage as ve}from"../../../utils/imageProcessing";import{uploadImage as fe}from"../../../utils/imageStorage";import{ImageViewerDialog as be}from"../internal/ImageViewerDialog";const ye=["image/*"];function we(t){return{id:t.id,file:t.file,previewURL:t.previewURL,hash:"",rotation:0,uploadProgress:t.progress,uploaded:t.uploaded,error:t.error}}function xe({file:t,index:v,multiple:f,onImageClick:d,onRemove:b,t:u}){const{attributes:n,listeners:D,setNodeRef:S,transform:g,transition:R,isDragging:y}=oe({id:t.id}),w=t.progress!==null&&t.progress<100,s=f&&!w,a={transform:ae.Transform.toString(g),transition:R,position:"relative",width:100,height:100,borderRadius:"var(--radius-md)",border:"var(--border-width) solid var(--border)",overflow:"hidden",backgroundColor:"var(--surface)",opacity:y?.5:1,cursor:s?"grab":"pointer",userSelect:"none",touchAction:s?"none":"auto"};return r("div",{ref:S,style:a,...n,...s?D:{},onClick:()=>{y||d(v)},children:w?l(C,{align:"center",justify:"center",style:{width:"100%",height:"100%"},children:[r(le,{style:{animation:"spin 1s linear infinite"}}),r(ge,{value:t.progress||0,style:{width:"80%"}})]}):t.error?l(C,{align:"center",justify:"center",style:{width:"100%",height:"100%"},children:[r(A,{style:{color:"var(--destructive)"}}),r(h,{variant:"destructive",level:"small",children:t.error})]}):l(q,{children:[f&&r("div",{style:{position:"absolute",top:4,left:4,padding:2,background:"rgba(0,0,0,0.5)",borderRadius:"var(--radius-sm)",display:"flex",zIndex:2,pointerEvents:"none"},children:r(de,{style:{color:"white",width:14,height:14}})}),r("img",{src:t.previewURL,alt:u("image.alt.upload",{index:v+1}),draggable:!1,style:{width:"100%",height:"100%",objectFit:"cover",pointerEvents:"none",userSelect:"none"}}),r("button",{type:"button",onClick:c=>{c.stopPropagation(),b(t.id)},onPointerDown:c=>c.stopPropagation(),style:{position:"absolute",top:4,right:4,padding:4,background:"rgba(0,0,0,0.5)",border:"none",borderRadius:"var(--radius-sm)",cursor:"pointer",display:"flex",zIndex:2},children:r(A,{style:{color:"white",width:16,height:16}})}),!t.uploaded&&r("div",{style:{position:"absolute",bottom:0,left:0,right:0,padding:4,background:"rgba(0,0,0,0.7)",textAlign:"center",pointerEvents:"none"},children:r(h,{variant:"muted",level:"small",style:{color:"white"},children:u("image.upload.pending",{defaultValue:"Pending"})})})]})})}const z=ce(({name:t="image",label:v,value:f,onChange:d,error:b,helperText:u,multiple:n=!1,maxFiles:D=10,maxSize:S=10*1024*1024,storagePath:g="uploads/images",required:R,capture:y},w)=>{const{t:s}=me("crud"),a=ue(null),[E,c]=L(!1),[_,P]=L(0),M=re(j(Z,{activationConstraint:{distance:8}}),j(ee,{activationConstraint:{delay:200,tolerance:5}})),N=V(async(e,o)=>{const{fullBlob:m,thumbBlob:x}=await ve(e);return fe(m,x,e.name,{storagePath:g,onProgress:I=>o(I.progress)})},[g]),{files:i,addFiles:F,removeFile:T}=he({name:t,value:f,onChange:d,multiple:n,maxFiles:D,maxSize:S,accept:ye,storagePath:g,uploadFn:N}),O=e=>{const o=Array.from(e.target.files||[]);o.length>0&&F(o),a.current&&(a.current.value="")},B=V(e=>{e.preventDefault(),e.stopPropagation(),e.dataTransfer.files.length>0&&F(Array.from(e.dataTransfer.files))},[F]),G=V(e=>{const{active:o,over:m}=e;if(m&&o.id!==m.id){const x=i.findIndex(k=>k.id===o.id),I=i.findIndex(k=>k.id===m.id);if(x!==-1&&I!==-1){const U=ie(i,x,I).filter(p=>p.uploaded||p.previewURL).map(p=>p.uploaded||{fullUrl:p.previewURL,thumbUrl:p.previewURL});d(n?U.length>0?U:null:U[0]||null)}}},[i,n,d]),H=e=>{P(e),c(!0)},K=(e,o)=>{},W=e=>{const o=i[e];o&&T(o.id)},X=e=>{P(e)},Y=n||i.length===0;pe(w,()=>({upload:async()=>{},focus:()=>a.current?.focus()}),[]);const $=i.map(we);return l(C,{gap:"tight",children:[l(h,{level:"body",align:"start",children:[v,R&&"*"]}),Y&&l("div",{role:"button",tabIndex:0,onClick:()=>a.current?.click(),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&a.current?.click()},onDragOver:e=>e.preventDefault(),onDrop:B,style:{border:`var(--border-width) dashed ${b?"var(--destructive)":"var(--border)"}`,borderRadius:"var(--radius-lg)",padding:"var(--gap-lg)",backgroundColor:"var(--surface)",cursor:"pointer",textAlign:"center"},children:[r("input",{ref:a,type:"file",accept:"image/*",capture:y,multiple:n,style:{display:"none"},onChange:O}),l(C,{align:"center",gap:"medium",children:[r(se,{style:{color:"var(--muted-foreground)"}}),r(h,{variant:"muted",level:"small",children:n?s("image.upload.dropzoneMultiple",{defaultValue:"Drop images here or click to upload"}):s("image.upload.dropzoneSingle",{defaultValue:"Drop image here or click to upload"})})]})]}),i.length>0&&r(J,{sensors:M,collisionDetection:Q,onDragEnd:G,children:r(te,{items:i.map(e=>e.id),strategy:ne,children:r("div",{style:{display:"flex",flexWrap:"wrap",gap:"var(--gap-md)"},children:i.map((e,o)=>r(xe,{file:e,index:o,multiple:n,onImageClick:H,onRemove:T,t:s},e.id))})})}),u&&r(h,{variant:b?"destructive":"muted",level:"small",children:u}),r(be,{images:$,selectedIndex:_,open:E,onClose:()=>c(!1),onUpdate:K,onDelete:W,onNavigate:X,multiple:n})]})});z.displayName="ImageFieldComponent";var je=z;export{je as default};
1
+ "use client";import{jsx as r,jsxs as d,Fragment as J}from"react/jsx-runtime";import{DndContext as Q,closestCenter as Y,PointerSensor as Z,TouchSensor as _,useSensor as j,useSensors as ee}from"@dnd-kit/core";import{SortableContext as re,useSortable as ae,rectSortingStrategy as oe,arrayMove as te}from"@dnd-kit/sortable";import{CSS as ie}from"@dnd-kit/utilities";import{Upload as ne,X as z,Loader2 as le,GripVertical as se}from"lucide-react";import{forwardRef as de,useCallback as U,useImperativeHandle as ue,useRef as ce,useState as A}from"react";import{Text as f,Stack as k,Progress as pe}from"@donotdev/components";import{useTranslation as ge}from"@donotdev/core";import{useFileUpload as me}from"../../../hooks/useFileUpload";import{processImage as he}from"../../../utils/imageProcessing";import{uploadImage as fe}from"../../../utils/imageStorage";import{ImageViewerDialog as ve}from"../internal/ImageViewerDialog";const ye=["image/*"];function be(a){return{id:a.id,file:a.file,previewURL:a.previewURL,hash:"",rotation:0,uploadProgress:a.progress,uploaded:a.uploaded,error:a.error}}function xe({file:a,index:v,multiple:y,onImageClick:c,onRemove:b,t:p}){const{attributes:t,listeners:R,setNodeRef:D,transform:g,transition:I,isDragging:x}=ae({id:a.id}),w=a.progress!==null&&a.progress<100,l=y&&!w,n={transform:ie.Transform.toString(g),transition:I,position:"relative",width:100,height:100,borderRadius:"var(--radius-md)",border:"var(--border-width) solid var(--border)",overflow:"hidden",backgroundColor:"var(--surface)",opacity:x?.5:1,cursor:l?"grab":"pointer",userSelect:"none",touchAction:l?"none":"auto"};return r("div",{ref:D,style:n,...t,...l?R:{},onClick:()=>{x||c(v)},children:w?d(k,{align:"center",justify:"center",style:{width:"100%",height:"100%"},children:[r(le,{style:{animation:"spin 1s linear infinite"}}),r(pe,{value:a.progress||0,style:{width:"80%"}})]}):a.error?d(k,{align:"center",justify:"center",style:{width:"100%",height:"100%"},children:[r(z,{style:{color:"var(--destructive)"}}),r(f,{variant:"destructive",level:"small",children:a.error})]}):d(J,{children:[y&&r("div",{style:{position:"absolute",top:4,left:4,padding:2,background:"rgba(0,0,0,0.5)",borderRadius:"var(--radius-sm)",display:"flex",zIndex:2,pointerEvents:"none"},children:r(se,{style:{color:"white",width:14,height:14}})}),r("img",{src:a.previewURL,alt:p("image.alt.upload",{index:v+1}),draggable:!1,style:{width:"100%",height:"100%",objectFit:"cover",pointerEvents:"none",userSelect:"none"}}),r("button",{type:"button",onClick:m=>{m.stopPropagation(),b(a.id)},onPointerDown:m=>m.stopPropagation(),style:{position:"absolute",top:4,right:4,padding:4,background:"rgba(0,0,0,0.5)",border:"none",borderRadius:"var(--radius-sm)",cursor:"pointer",display:"flex",zIndex:2},children:r(z,{style:{color:"white",width:16,height:16}})}),!a.uploaded&&r("div",{style:{position:"absolute",bottom:0,left:0,right:0,padding:4,background:"rgba(0,0,0,0.7)",textAlign:"center",pointerEvents:"none"},children:r(f,{variant:"muted",level:"small",style:{color:"white"},children:p("image.upload.pending",{defaultValue:"Pending"})})})]})})}const E=de(({name:a="image",label:v,value:y,onChange:c,error:b,helperText:p,multiple:t=!1,maxFiles:R=10,maxSize:D=10*1024*1024,storagePath:g="uploads/images",required:I,capture:x},w)=>{const{t:l}=ge("crud"),n=ce(null),[m,F]=A(!1),[V,L]=A(0),N=ee(j(Z,{activationConstraint:{distance:8}}),j(_,{activationConstraint:{delay:200,tolerance:5}})),B=U(async(e,o)=>{const{fullBlob:h,thumbBlob:C}=await he(e);return fe(h,C,e.name,{storagePath:g,onProgress:S=>o(S.progress)})},[g]),{files:i,addFiles:P,removeFile:T}=me({name:a,value:y,onChange:c,multiple:t,maxFiles:R,maxSize:D,accept:ye,storagePath:g,uploadFn:B}),M=e=>{const o=Array.from(e.target.files||[]);o.length>0&&P(o),n.current&&(n.current.value="")},q=U(e=>{e.preventDefault(),e.stopPropagation(),e.dataTransfer.files.length>0&&P(Array.from(e.dataTransfer.files))},[P]),G=U(e=>{const{active:o,over:h}=e;if(h&&o.id!==h.id){const C=i.findIndex(s=>s.id===o.id),S=i.findIndex(s=>s.id===h.id);if(C!==-1&&S!==-1){const s=te(i,C,S).filter(u=>u.uploaded||u.previewURL).map(u=>u.uploaded||{fullUrl:u.previewURL,thumbUrl:u.previewURL});c(t?s.length>0?s:null:s[0]||null)}}},[i,t,c]),H=e=>{L(e),F(!0)},K=(e,o)=>{},O=e=>{const o=i[e];o&&T(o.id)},W=e=>{L(e)},X=t||i.length===0;ue(w,()=>({upload:async()=>{},focus:()=>n.current?.focus()}),[]);const $=i.map(be);return d(k,{gap:"tight",children:[d(f,{level:"body",align:"start",children:[v,I&&"*"]}),X&&d("div",{role:"button",tabIndex:0,onClick:()=>n.current?.click(),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&n.current?.click()},onDragOver:e=>e.preventDefault(),onDrop:q,style:{border:`var(--border-width) dashed ${b?"var(--destructive)":"var(--border)"}`,borderRadius:"var(--radius-lg)",padding:"var(--gap-lg)",backgroundColor:"var(--surface)",cursor:"pointer",textAlign:"center"},children:[r("input",{ref:n,type:"file",accept:"image/*",capture:x,multiple:t,style:{display:"none"},onChange:M}),d(k,{align:"center",gap:"medium",children:[r(ne,{style:{color:"var(--muted-foreground)"}}),r(f,{variant:"muted",level:"small",children:t?l("image.upload.dropzoneMultiple",{defaultValue:"Drop images here or click to upload"}):l("image.upload.dropzoneSingle",{defaultValue:"Drop image here or click to upload"})})]})]}),i.length>0&&r(Q,{sensors:N,collisionDetection:Y,onDragEnd:G,children:r(re,{items:i.map(e=>e.id),strategy:oe,children:r("div",{style:{display:"flex",flexWrap:"wrap",gap:"var(--gap-md)"},children:i.map((e,o)=>r(xe,{file:e,index:o,multiple:t,onImageClick:H,onRemove:T,t:l},e.id))})})}),p&&r(f,{variant:b?"destructive":"muted",level:"small",children:p}),r(ve,{images:$,selectedIndex:V,open:m,onClose:()=>F(!1),onUpdate:K,onDelete:O,onNavigate:W,multiple:t})]})});E.displayName="ImageFieldComponent";var we=E;export{we as default};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as n}from"react/jsx-runtime";import{Input as p,Stack as u}from"@donotdev/components";import{useTranslation as m}from"@donotdev/core";const f=({label:s,value:d={},onChange:a,error:t,helperText:r,required:i})=>{const{t:l}=m("dndev");return n(u,{gap:"tight",children:[n("div",{className:"dndev-surface","data-variant":t?"destructive":"default",style:{border:"1px solid",borderColor:t?"var(--destructive)":"var(--input)",borderRadius:"var(--radius-lg)",padding:"var(--gap-md)"},children:[e("p",{style:{fontSize:"var(--font-size-sm)",color:"var(--muted-foreground)",marginBottom:"var(--gap-md)"},children:"Map component placeholder"}),e(p,{label:s,type:"text",required:i,className:"dndev-w-full",placeholder:l("form.enterLocationData","Enter location data (JSON)"),value:JSON.stringify(d),onChange:c=>{try{const o=JSON.parse(c.target.value),v={target:{value:JSON.stringify(o)}};a(v)}catch{a({target:{value:"{}"}})}}})]}),r&&e("p",{style:{fontSize:"var(--font-size-xs)",color:t?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:r})]})};var x=f;export{x as default};
1
+ import{jsx as r,jsxs as o}from"react/jsx-runtime";import{Input as c,Stack as p}from"@donotdev/components";import{useTranslation as m}from"@donotdev/core";const g=({label:n,value:d={},onChange:a,error:e,helperText:t,required:s})=>{const{t:l}=m("dndev");return o(p,{gap:"tight",children:[o("div",{className:"dndev-surface","data-variant":e?"destructive":"default",style:{border:"1px solid",borderColor:e?"var(--destructive)":"var(--input)",borderRadius:"var(--radius-lg)",padding:"var(--gap-md)"},children:[r("p",{style:{fontSize:"var(--font-size-sm)",color:"var(--muted-foreground)",marginBottom:"var(--gap-md)"},children:"Map component placeholder"}),r(c,{label:n,type:"text",required:s,className:"dndev-w-full",placeholder:l("form.enterLocationData","Enter location data (JSON)"),value:JSON.stringify(d),onChange:i=>{try{const u=JSON.parse(i.target.value),v={target:{value:JSON.stringify(u)}};a(v)}catch{a({target:{value:"{}"}})}}})]}),t&&r("p",{style:{fontSize:"var(--font-size-xs)",color:e?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:t})]})};var f=g;export{f as default};
@@ -1 +1 @@
1
- import{jsx as t,jsxs as c}from"react/jsx-runtime";import{X as C}from"lucide-react";import{useMemo as z,useId as E}from"react";import{Combobox as I,Badge as V,BADGE_VARIANT as j,Button as w,BUTTON_VARIANT as B,Stack as d}from"@donotdev/components";import{useTranslation as R}from"@donotdev/core";const T=({label:g,value:o=[],options:s,error:h,helperText:a,onChange:u,onBlur:f,required:v,className:y})=>{const{t:m}=R("dndev"),p=E(),b=z(()=>s.map(e=>({value:String(e.value),label:e.label})),[s]),N=e=>{const n=Array.isArray(e)?e:[e],r={target:{value:JSON.stringify(n)}};u(r)},S=e=>{e||f?.()},A=e=>{const n=o.filter(l=>l!==e),r={target:{value:JSON.stringify(n)}};u(r)},i=!!h,O=`${p}-error`,x=`${p}-helper`;return c(d,{gap:"tight",className:y,children:[o.length>0&&t(d,{direction:"row",wrap:"wrap",gap:"medium",children:o.map((e,n)=>{const r=s.find(l=>String(l.value)===e)?.label||e;return c(V,{variant:j.SECONDARY,className:"dndev-gap-sm",children:[r,t(w,{type:"button",variant:B.GHOST,style:{padding:0,height:"auto"},onClick:()=>A(e),children:t(C,{className:"dndev-size-md"})})]},n)})}),t(I,{label:g,value:o,onValueChange:N,onOpenChange:S,placeholder:m("actions.selectOptions","Select options..."),emptyMessage:m("messages.noResults","No results found"),options:b,multiple:!0,required:v,variant:i?"destructive":void 0}),i&&c(d,{id:O,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[t("span",{children:"\u26A0"}),a]}),a&&!i&&t("p",{id:x,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:a})]})};var $=T;export{$ as default};
1
+ import{jsx as r,jsxs as d}from"react/jsx-runtime";import{X as T}from"lucide-react";import{useMemo as C,useId as z}from"react";import{Combobox as B,Badge as w,BADGE_VARIANT as R,Button as I,BUTTON_VARIANT as V,Stack as c}from"@donotdev/components";import{useTranslation as j}from"@donotdev/core";const E=({label:g,value:s=[],options:n,error:v,helperText:o,onChange:u,onBlur:h,required:f,className:N})=>{const{t:p}=j("dndev"),m=z(),S=C(()=>n.map(e=>({value:String(e.value),label:e.label})),[n]),A=e=>{const a=Array.isArray(e)?e:[e],t={target:{value:JSON.stringify(a)}};u(t)},b=e=>{e||h?.()},y=e=>{const a=s.filter(l=>l!==e),t={target:{value:JSON.stringify(a)}};u(t)},i=!!v,x=`${m}-error`,O=`${m}-helper`;return d(c,{gap:"tight",className:N,children:[s.length>0&&r(c,{direction:"row",wrap:"wrap",gap:"medium",children:s.map((e,a)=>{const t=n.find(l=>String(l.value)===e)?.label||e;return d(w,{variant:R.SECONDARY,className:"dndev-gap-sm",children:[t,r(I,{type:"button",variant:V.GHOST,style:{padding:0,height:"auto"},onClick:()=>y(e),children:r(T,{className:"dndev-size-md"})})]},a)})}),r(B,{label:g,value:s,onValueChange:A,onOpenChange:b,placeholder:p("actions.selectOptions","Select options..."),emptyMessage:p("messages.noResults","No results found"),options:S,multiple:!0,required:f,variant:i?"destructive":void 0}),i&&d(c,{id:x,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[r("span",{children:"\u26A0"}),o]}),o&&!i&&r("p",{id:O,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:o})]})};var $=E;export{$ as default};
@@ -1 +1 @@
1
- "use client";import{jsx as a,jsxs as d}from"react/jsx-runtime";import{useState as y}from"react";import{Input as h,Button as x,Stack as i}from"@donotdev/components";import{useTranslation as b}from"@donotdev/core";const w=({label:m,value:o=[],onChange:l,className:c,required:p})=>{const{t:s}=b("dndev"),[n,u]=y(""),g=()=>{if(n.trim()){const e=[...o,n.trim()],t={target:{value:JSON.stringify(e)}};l(t),u("")}},f=e=>{const t=o.filter((S,v)=>v!==e),r={target:{value:JSON.stringify(t)}};l(r)};return d(i,{gap:"medium",className:c,children:[d(i,{direction:"row",align:"end",gap:"medium",children:[a(h,{label:m,type:"text",value:n,onChange:e=>u(e.target.value),required:p,className:"dndev-flex-1",placeholder:s("form.typeAndPressAdd","Type and press Add...")}),a(x,{type:"button",onClick:g,disabled:!n.trim(),children:s("form.add","Add")})]}),a(i,{direction:"row",wrap:"wrap",gap:"medium",children:o.map((e,t)=>d("span",{className:"dndev-surface","data-variant":"muted",style:{display:"inline-flex",alignItems:"center",gap:"var(--gap-sm)",padding:"var(--gap-sm) var(--gap-md)",fontSize:"var(--font-size-sm)",fontWeight:500,borderRadius:"var(--radius-lg)"},children:[e,a("button",{type:"button",onClick:()=>f(t),style:{color:"var(--muted-foreground)",marginInlineStart:"var(--gap-sm)"},onMouseEnter:r=>{r.currentTarget.style.color="var(--foreground)"},onMouseLeave:r=>{r.currentTarget.style.color="var(--muted-foreground)"},"aria-label":`${s("form.remove","Remove")} ${e}`,children:"\xD7"})]},t))})]})};var j=w;export{j as default};
1
+ "use client";import{jsx as n,jsxs as d}from"react/jsx-runtime";import{useState as y}from"react";import{Input as h,Button as b,Stack as i}from"@donotdev/components";import{useTranslation as x}from"@donotdev/core";const S=({label:u,value:s=[],onChange:l,className:c,required:g})=>{const{t:o}=x("dndev"),[t,m]=y(""),p=()=>{if(t.trim()){const e=[...s,t.trim()],r={target:{value:JSON.stringify(e)}};l(r),m("")}},f=e=>{const r=s.filter((w,v)=>v!==e),a={target:{value:JSON.stringify(r)}};l(a)};return d(i,{gap:"medium",className:c,children:[d(i,{direction:"row",align:"end",gap:"medium",children:[n(h,{label:u,type:"text",value:t,onChange:e=>m(e.target.value),required:g,className:"dndev-flex-1",placeholder:o("form.typeAndPressAdd","Type and press Add...")}),n(b,{type:"button",onClick:p,disabled:!t.trim(),children:o("form.add","Add")})]}),n(i,{direction:"row",wrap:"wrap",gap:"medium",children:s.map((e,r)=>d("span",{className:"dndev-surface","data-variant":"muted",style:{display:"inline-flex",alignItems:"center",gap:"var(--gap-sm)",padding:"var(--gap-sm) var(--gap-md)",fontSize:"var(--font-size-sm)",fontWeight:500,borderRadius:"var(--radius-lg)"},children:[e,n("button",{type:"button",onClick:()=>f(r),style:{color:"var(--muted-foreground)",marginInlineStart:"var(--gap-sm)"},onMouseEnter:a=>{a.currentTarget.style.color="var(--foreground)"},onMouseLeave:a=>{a.currentTarget.style.color="var(--muted-foreground)"},"aria-label":`${o("form.remove","Remove")} ${e}`,children:"\xD7"})]},r))})]})};var N=S;export{N as default};
@@ -1 +1 @@
1
- import{jsx as g,jsxs as z}from"react/jsx-runtime";import{useState as C,useEffect as E,useCallback as y}from"react";import{Input as I,cn as M,Stack as T}from"@donotdev/components";import{useTranslation as _}from"@donotdev/core";const q=({label:S,value:u,onChange:i,error:d,helperText:m,min:b,max:x,step:N,disabled:l,required:F,className:V,mask:r="number",...h})=>{const{i18n:j}=_(),a=j?.language||(typeof navigator<"u"?navigator.language:"en-US"),s=y(e=>e==null||isNaN(e)?"":r==="currency"?e.toLocaleString(a,{minimumFractionDigits:2,maximumFractionDigits:2}):r==="mileage"?Math.round(e).toLocaleString(a):e.toString(),[r,a]),v=y(e=>{if(!e||e.trim()==="")return null;const t=new Intl.NumberFormat(a).formatToParts(1234.56),D=t.find(c=>c.type==="group")?.value||",",L=t.find(c=>c.type==="decimal")?.value||".";let o=e.replace(new RegExp(`\\${D}`,"g"),"");o=o.replace(L,"."),o=o.replace(/[^\d.\-]/g,"");const p=parseFloat(o);return isNaN(p)?null:p},[a]),[w,f]=C(()=>s(u));return E(()=>{f(s(u))},[u,s]),z(T,{gap:"tight",children:[g(I,{type:r==="number"?"number":"text",inputMode:r==="number"?void 0:"decimal",label:S,value:w,onChange:e=>{const n=e.target.value;if(f(n),r==="number"){const t=parseFloat(n);isNaN(t)?i(e):i({...e,target:{...e.target,value:t.toString()}})}else{const t=v(n);t!==null?i({...e,target:{...e.target,value:t.toString()}}):n===""&&i({...e,target:{...e.target,value:""}})}},min:b,max:x,step:N,disabled:l,required:F,className:M("dndev-w-full",V),"data-variant":d?"destructive":void 0,style:{opacity:l?"var(--opacity-muted)":void 0,cursor:l?"not-allowed":void 0},...h}),m&&g("p",{style:{fontSize:"var(--font-size-xs)",color:d?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:m})]})};var G=q;export{G as default};
1
+ import{jsx as v,jsxs as k}from"react/jsx-runtime";import{useState as q,useEffect as z,useCallback as f}from"react";import{Input as D,cn as E,Stack as I}from"@donotdev/components";import{useTranslation as L}from"@donotdev/core";const M=({label:b,value:s,onChange:i,error:g,helperText:c,min:x,max:y,step:N,disabled:l,required:S,className:h,mask:r="number",...w})=>{const{i18n:F}=L(),n=F?.language||(typeof navigator<"u"?navigator.language:"en-US"),u=f(a=>a==null||isNaN(a)?"":r==="currency"?a.toLocaleString(n,{minimumFractionDigits:2,maximumFractionDigits:2}):r==="mileage"?Math.round(a).toLocaleString(n):a.toString(),[r,n]),T=f(a=>{if(!a||a.trim()==="")return null;const t=new Intl.NumberFormat(n).formatToParts(1234.56),e=t.find(m=>m.type==="group")?.value||",",j=t.find(m=>m.type==="decimal")?.value||".";let o=a.replace(new RegExp(`\\${e}`,"g"),"");o=o.replace(j,"."),o=o.replace(/[^\d.\-]/g,"");const p=parseFloat(o);return isNaN(p)?null:p},[n]),[C,d]=q(()=>u(s));return z(()=>{d(u(s))},[s,u]),k(I,{gap:"tight",children:[v(D,{type:r==="number"?"number":"text",inputMode:r==="number"?void 0:"decimal",label:b,value:C,onChange:a=>{const t=a.target.value;if(d(t),r==="number"){const e=parseFloat(t);isNaN(e)?i(a):i({...a,target:{...a.target,value:e.toString()}})}else{const e=T(t);e!==null?i({...a,target:{...a.target,value:e.toString()}}):t===""&&i({...a,target:{...a.target,value:""}})}},min:x,max:y,step:N,disabled:l,required:S,className:E("dndev-w-full",h),"data-variant":g?"destructive":void 0,style:{opacity:l?"var(--opacity-muted)":void 0,cursor:l?"not-allowed":void 0},...w}),c&&v("p",{style:{fontSize:"var(--font-size-xs)",color:g?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:c})]})};var G=M;export{G as default};
@@ -1 +1 @@
1
- "use client";import{jsx as o,jsxs as i}from"react/jsx-runtime";import{useId as l}from"react";import{PasswordInput as u,Stack as m}from"@donotdev/components";const c=({label:s,value:a,onChange:t,error:n,helperText:r,...e})=>{const d=l();return i(m,{gap:"tight",children:[o(u,{id:d,value:a??"",onChange:t,label:s,className:"dndev-w-full",required:e.required,...e}),r&&o("p",{style:{fontSize:"var(--font-size-xs)",color:n?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:r})]})};var j=c;export{j as default};
1
+ "use client";import{jsx as a,jsxs as d}from"react/jsx-runtime";import{useId as i}from"react";import{PasswordInput as u,Stack as m}from"@donotdev/components";const c=({label:o,value:s,onChange:t,error:l,helperText:e,...r})=>{const n=i();return d(m,{gap:"tight",children:[a(u,{id:n,value:s??"",onChange:t,label:o,className:"dndev-w-full",required:r.required,...r}),e&&a("p",{style:{fontSize:"var(--font-size-xs)",color:l?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:e})]})};var p=c;export{p as default};