@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,38 @@
1
+ import type { ScopeConfig } from '@donotdev/core';
2
+ import type { QueryOptions } from '../CrudService';
3
+ /**
4
+ * Injects scope value into data object for create/update operations
5
+ *
6
+ * @param data - Original data
7
+ * @param scope - Scope configuration from entity
8
+ * @returns Data with scope value injected
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const scopedData = injectScope({ name: 'Acme' }, scope);
13
+ * // Result: { name: 'Acme', companyId: 'abc123' }
14
+ * ```
15
+ */
16
+ export declare function injectScope<T>(data: T, scope: ScopeConfig | undefined): T;
17
+ /**
18
+ * Injects scope filter into query options for list/query operations
19
+ *
20
+ * @param queryOptions - Original query options
21
+ * @param scope - Scope configuration from entity
22
+ * @returns Query options with scope filter added
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const scopedOptions = injectScopeFilter({ orderBy: [{ field: 'name' }] }, scope);
27
+ * // Result: { orderBy: [...], where: [{ field: 'companyId', operator: '==', value: 'abc123' }] }
28
+ * ```
29
+ */
30
+ export declare function injectScopeFilter(queryOptions: QueryOptions | undefined, scope: ScopeConfig | undefined): QueryOptions;
31
+ /**
32
+ * Gets current scope value for cache key generation
33
+ *
34
+ * @param scope - Scope configuration from entity
35
+ * @returns Scope value or null
36
+ */
37
+ export declare function getCurrentScopeValue(scope: ScopeConfig | undefined): string | null;
38
+ //# sourceMappingURL=scopeUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopeUtils.d.ts","sourceRoot":"","sources":["../../src/utils/scopeUtils.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,CAAC,CAkBzE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,KAAK,EAAE,WAAW,GAAG,SAAS,GAC7B,YAAY,CA4Bd;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,GAAG,SAAS,GAC7B,MAAM,GAAG,IAAI,CAGf"}
@@ -0,0 +1 @@
1
+ import{getScopeValue as n}from"@donotdev/core";function u(r,t){if(!t)return r;const e=n(t.provider);return e?{...r,[t.field]:e}:r}function c(r,t){const e=r??{};if(!t)return e;const i=n(t.provider);if(!i)return e;const o={field:t.field,operator:"==",value:i};return{...e,where:e.where?[...e.where,o]:[o]}}function f(r){return r?n(r.provider):null}export{f as getCurrentScopeValue,u as injectScope,c as injectScopeFilter};
@@ -1 +1 @@
1
- "use client";function l(r){return!r||typeof r!="string"?!1:r.startsWith("https://")&&!r.startsWith("blob:")}function i(r){return!r||typeof r!="object"?!1:l(r.fullUrl)&&l(r.thumbUrl)}function f(r,n=""){const e=[];if(r==null)return e;if(typeof r=="string")return r.startsWith("blob:")&&e.push(n||"root"),e;if(typeof r!="object")return e;if(Array.isArray(r))r.forEach((t,o)=>{const s=n?`${n}[${o}]`:`[${o}]`;e.push(...f(t,s))});else if(r.fullUrl!==void 0&&r.thumbUrl!==void 0){if(!l(r.fullUrl)||!l(r.thumbUrl)){const t=n||"root";e.push(`${t}.fullUrl or ${t}.thumbUrl contains blob URL`)}}else Object.entries(r).forEach(([t,o])=>{const s=n?`${n}.${t}`:t;e.push(...f(o,s))});return e}function u(r){return f(r).length>0}export{f as checkForBlobUrls,u as hasBlobUrls,l as isStorageUrl,i as validatePicture};
1
+ "use client";function e(t){return!t||typeof t!="string"?!1:t.startsWith("https://")&&!t.startsWith("blob:")}function n(t){return!t||typeof t!="object"?!1:e(t.fullUrl)&&e(t.thumbUrl)}function u(t,o=""){const s=[];if(t==null)return s;if(typeof t=="string")return t.startsWith("blob:")&&s.push(o||"root"),s;if(typeof t!="object")return s;if(Array.isArray(t))t.forEach((l,r)=>{const i=o?`${o}[${r}]`:`[${r}]`;s.push(...u(l,i))});else if(t.fullUrl!==void 0&&t.thumbUrl!==void 0){if(!e(t.fullUrl)||!e(t.thumbUrl)){const l=o||"root";s.push(`${l}.fullUrl or ${l}.thumbUrl contains blob URL`)}}else Object.entries(t).forEach(([l,r])=>{const i=o?`${o}.${l}`:l;s.push(...u(r,i))});return s}function f(t){return u(t).length>0}export{u as checkForBlobUrls,f as hasBlobUrls,e as isStorageUrl,n as validatePicture};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/crud",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -15,7 +15,8 @@
15
15
  }
16
16
  },
17
17
  "sideEffects": [
18
- "./src/builtinFieldTypes.tsx"
18
+ "./src/builtinFieldTypes.tsx",
19
+ "./src/registerBuiltinFieldTypes.tsx"
19
20
  ],
20
21
  "files": [
21
22
  "dist",
@@ -52,22 +53,22 @@
52
53
  "@dnd-kit/core": "^6.3.1",
53
54
  "@dnd-kit/sortable": "^10.0.0",
54
55
  "@dnd-kit/utilities": "^3.2.2",
55
- "@donotdev/components": "^0.0.14",
56
- "@donotdev/core": "^0.0.18",
56
+ "@donotdev/components": "^0.0.15",
57
+ "@donotdev/core": "^0.0.19",
57
58
  "@hookform/resolvers": "^5.2.2",
58
59
  "react-easy-crop": "^5.5.6"
59
60
  },
60
61
  "peerDependencies": {
61
- "@donotdev/firebase": "^0.0.6",
62
- "@tiptap/extension-placeholder": "^3.16.0",
63
- "@tiptap/pm": "^3.16.0",
64
- "@tiptap/react": "^3.16.0",
65
- "@tiptap/starter-kit": "^3.16.0",
66
- "firebase": "^12.5.0",
67
- "lucide-react": "^0.562.0",
68
- "react": "^19.2.3",
69
- "react-dom": "^19.2.3",
70
- "react-hook-form": "^7.71.0",
62
+ "@donotdev/firebase": "^0.0.8",
63
+ "@tiptap/extension-placeholder": "^3.19.0",
64
+ "@tiptap/pm": "^3.19.0",
65
+ "@tiptap/react": "^3.19.0",
66
+ "@tiptap/starter-kit": "^3.19.0",
67
+ "firebase": "^12.8.0",
68
+ "lucide-react": "^0.563.0",
69
+ "react": "^19.2.4",
70
+ "react-dom": "^19.2.4",
71
+ "react-hook-form": "^7.71.1",
71
72
  "valibot": "^1.2.0"
72
73
  },
73
74
  "peerDependenciesMeta": {
@@ -1,29 +0,0 @@
1
- import type { Entity } from '@donotdev/core';
2
- export interface EntityCardListProps {
3
- /** The entity definition */
4
- entity: Entity;
5
- /** View handler - called when card is clicked */
6
- onView: (id: string) => void;
7
- /** Grid columns (responsive) - defaults to [1, 2, 3, 4] */
8
- cols?: number | [number, number, number, number];
9
- /** Cache stale time is ms - defaults to 30 mins */
10
- staleTime?: number;
11
- /** Optional filter function to filter items client-side */
12
- filter?: (item: any) => boolean;
13
- /** Hide filters section (default: false) */
14
- hideFilters?: boolean;
15
- }
16
- /**
17
- * Entity Card List Component - Card grid view for public/user-facing browsing
18
- *
19
- * Features:
20
- * - Responsive card grid layout
21
- * - Image + key fields display
22
- * - Click card to navigate to detail
23
- * - Simple formatted text display (no boxes, just labels + values)
24
- * - Empty state handling
25
- * - Default routing: `/${entity.collection}/${id}` for view
26
- */
27
- export declare function EntityCardList({ entity, onView, cols, staleTime, // 30 minutes default cache
28
- filter, hideFilters, }: EntityCardListProps): import("react/jsx-runtime").JSX.Element;
29
- //# sourceMappingURL=EntityCardList.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EntityCardList.d.ts","sourceRoot":"","sources":["../../src/components/EntityCardList.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC;IAChC,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,MAAM,EACN,IAAmB,EACnB,SAA0B,EAAE,2BAA2B;AACvD,MAAM,EACN,WAAmB,GACpB,EAAE,mBAAmB,2CAkOrB"}
@@ -1 +0,0 @@
1
- "use client";import{jsx as r,jsxs as f,Fragment as _}from"react/jsx-runtime";import{useMemo as m,useCallback as k,useState as D}from"react";import{Grid as E,Card as R,Stack as v,Text as g,Section as w}from"@donotdev/components";import{useTranslation as y}from"@donotdev/core";import{translateFieldLabel as B}from"../forms/utils";import{useCrudCardList as G}from"../useCrudCardList";import{formatValue as M}from"./DisplayFieldRenderer";import{EntityFilters as q,matchesFilter as z}from"./EntityFilters";function N({entity:t,onView:j,cols:L=[1,2,3,4],staleTime:O=1e3*60*30,filter:h,hideFilters:T=!1}){const{data:$,loading:A}=G(t,{staleTime:O}),p=$?.items||[],[d,I]=D({}),V=k(e=>Object.keys(d).length===0?!0:Object.entries(d).every(([l,s])=>{const i=e[l],a=t.fields[l]?.type||"text";return z(i,s,a)}),[d,t.fields]),n=m(()=>{let e=p;return e=e.filter(V),h&&(e=e.filter(h)),e},[p,V,h]),{t:F}=y(t.namespace),{t:o}=y("crud"),U=k(e=>{j(e)},[j]),c=m(()=>{const e=t.listCardFields??t.listFields;return e&&e.length>0?e:Object.keys(t.fields).slice(0,4)},[t.listCardFields,t.listFields,t.fields]),u=m(()=>{const e=c.filter(s=>{const i=t.fields[s];return i?.type==="image"||i?.type==="images"});return e.length>0?e[0]:Object.keys(t.fields).filter(s=>{const i=t.fields[s];return i?.type==="image"||i?.type==="images"})[0]||null},[c,t.fields]),x=m(()=>c.filter(e=>e!==u),[c,u]),S=F("name",{defaultValue:t.name});return f(_,{children:[!T&&r(w,{title:o("filters.title",{entity:S,defaultValue:`Browse ${S} - Filters`}),collapsible:!0,defaultOpen:!0,children:r(q,{entity:t,data:p,filters:d,onFiltersChange:I,fieldsToFilter:t.listCardFields})}),r(w,{title:A?o("results.title.fetching",{defaultValue:"Fetching..."}):o("results.title.count",{count:n.length,defaultValue:n.length===1?"Found 1 occurrence":`Found ${n.length} occurrences`}),collapsible:!0,defaultOpen:!0,children:n.length===0?f(v,{align:"center",justify:"center",gap:"medium",style:{padding:"var(--gap-3xl)",textAlign:"center"},children:[r(g,{level:"h3",style:{color:"var(--muted-foreground)"},children:o("emptyState.title",{defaultValue:`No ${t.name.toLowerCase()} found`})}),r(g,{style:{color:"var(--muted-foreground)"},children:o("emptyState.description",{defaultValue:`No ${t.name.toLowerCase()} available at this time.`})})]}):r(E,{cols:L,gap:"medium",children:n.map(e=>{const l=u?e[u]:null,s=l?typeof l=="string"?l:l?.url||l?.thumbUrl||Array.isArray(l)&&l[0]?.url||l[0]?.thumbUrl||l[0]:null,i=x[0],C=i?e[i]:e.id;return r(R,{title:String(C||""),clickable:!0,onClick:()=>U(e.id),elevated:!0,children:f(v,{direction:"column",gap:"medium",children:[s&&r("div",{style:{width:"100%",aspectRatio:"16/9",borderRadius:"var(--radius-md)",overflow:"hidden",backgroundColor:"var(--muted)"},children:r("img",{src:s,alt:String(C||""),style:{width:"100%",height:"100%",objectFit:"cover"}})}),r(v,{direction:"column",gap:"tight",children:x.slice(1,4).map(a=>{const b=t.fields[a];return b?f("div",{children:[r(g,{level:"small",variant:"muted",children:B(a,b,F)}),r(g,{children:M(e[a],b,F,{compact:!0})})]},a):null})})]})},e.id)})})})]})}export{N as EntityCardList};
@@ -1,30 +0,0 @@
1
- import type { Entity } from '@donotdev/core';
2
- export interface EntityListProps {
3
- /** The entity definition */
4
- entity: Entity;
5
- /** Current user role (for UI toggle only - backend enforces security) */
6
- userRole?: string;
7
- /** Edit handler - called when edit button is clicked */
8
- onEdit: (id: string) => void;
9
- /** View handler (row click) - called when row is clicked */
10
- onView?: (id: string) => void;
11
- /** Create handler - called when "Add New" button is clicked */
12
- onCreate?: () => void;
13
- /** Hide filters section (default: false) */
14
- hideFilters?: boolean;
15
- /** Pagination mode: 'client' (default) or 'server' for massive datasets */
16
- pagination?: 'client' | 'server';
17
- /** Default page size (default: 10) */
18
- defaultPageSize?: number;
19
- }
20
- /**
21
- * Entity List Component - Table view for admin/internal operations
22
- *
23
- * Features:
24
- * - Filters section (collapsible) with actions and filter inputs
25
- * - Results section (collapsible) with DataTable
26
- * - Excel-like table display with formatted values
27
- * - Edit and Delete actions (admin only)
28
- */
29
- export declare function EntityList({ entity, userRole, onEdit, onView, onCreate, hideFilters, pagination, defaultPageSize, }: EntityListProps): import("react/jsx-runtime").JSX.Element;
30
- //# sourceMappingURL=EntityList.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EntityList.d.ts","sourceRoot":"","sources":["../../src/components/EntityList.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAU7C,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,QAAkB,EAClB,MAAM,EACN,MAAM,EACN,QAAQ,EACR,WAAmB,EACnB,UAAqB,EACrB,eAAoB,GACrB,EAAE,eAAe,2CAqSjB"}
@@ -1 +0,0 @@
1
- "use client";import{jsx as n,jsxs as f,Fragment as J}from"react/jsx-runtime";import{RefreshCw as K,Plus as U,Trash2 as W,Edit as X,Search as Y}from"lucide-react";import{useMemo as N,useCallback as o,useState as m}from"react";import{DataTable as Z,Button as V,Stack as y,ActionButton as ee,Section as R,Input as te}from"@donotdev/components";import{useTranslation as _}from"@donotdev/core";import{translateFieldLabel as ae}from"../forms/utils";import{useCrud as le}from"../useCrud";import{useCrudList as re}from"../useCrudList";import{formatValue as ne}from"./DisplayFieldRenderer";import{EntityFilters as ie,matchesFilter as se}from"./EntityFilters";function Fe({entity:l,userRole:oe="guest",onEdit:F,onView:g,onCreate:x,hideFilters:A=!1,pagination:h="client",defaultPageSize:B=10}){const[P,E]=m(1),[v,ue]=m(B),{data:S,loading:p,mutate:T}=re(l,{pagination:h,...h==="server"&&{page:P,pageSize:v}}),{delete:k}=le(l),{t:e}=_("crud"),b=S?.items||[],{t:u}=_(l.namespace),[c,z]=m({}),[d,Q]=m(""),$=o(async()=>{await T()},[T]),L=o(t=>{F(t)},[F]),M=o(t=>{g&&g(t)},[g]),j=o(async t=>{await k(t)},[k]),q=o(t=>{z(t)},[]),D=N(()=>{let t=b;if(d){const i=d.toLowerCase();t=t.filter(r=>Object.values(r).some(a=>a==null?!1:String(a).toLowerCase().includes(i)))}return Object.keys(c).length>0&&(t=t.filter(i=>Object.entries(c).every(([r,a])=>{const s=i[r],O=l.fields[r]?.type||"text";return se(s,a,O)}))),t},[b,d,c,l.fields]),G=N(()=>{const i=(l.listFields||Object.keys(l.fields)).map(r=>{const a=l.fields[r];if(!a)return null;const s=ae(r,a,u),C=a.type||"text";return{key:r,title:s,dataIndex:r,sortable:!0,filterable:!0,align:C==="number"||C==="range"?"end":"start",render:(H,de)=>ne(H,a,u,{compact:!0})}}).filter(Boolean);return i.unshift({key:"_actions",title:e("actions.label",{defaultValue:"Actions"}),dataIndex:void 0,sortable:!1,width:120,align:"center",render:(r,a)=>f(y,{direction:"row",gap:"tight",align:"center",justify:"center",children:[n(V,{variant:"outline",icon:X,onClick:s=>{s.stopPropagation(),L(a.id)},"aria-label":e("edit",{defaultValue:"Edit"})}),n(ee,{action:async()=>{await j(a.id)},confirmText:e("delete.confirm",{defaultValue:"Are you sure you want to delete this item?"}),confirmTitle:e("delete.title",{defaultValue:"Delete Item"}),loadingText:e("delete.loading",{defaultValue:"Deleting..."}),variant:"destructive",icon:W,"aria-label":e("delete",{defaultValue:"Delete"}),children:e("delete",{defaultValue:"Delete"})})]})}),i},[l,u,e,L,j]),I=u("name",{defaultValue:l.name}),w=D.length;return f(J,{children:[n(R,{title:e("filters.title",{entity:I,defaultValue:`Browse ${I} - Filters`}),collapsible:!0,defaultOpen:!0,children:f(y,{gap:"medium",children:[f(y,{direction:"row",gap:"tight",align:"center",className:"dndev-w-full",style:{display:"grid",gridTemplateColumns:"1fr auto auto"},children:[n(te,{placeholder:e("search.placeholder",{defaultValue:"Search..."}),value:d,onChange:t=>Q(t.target.value),icon:Y,className:"dndev-w-full"}),n(V,{icon:K,variant:"outline",onClick:$,disabled:p,display:"compact","aria-label":e("refresh",{defaultValue:"Refresh"})}),x&&n(V,{icon:U,onClick:x,display:"compact",children:e("addNew",{defaultValue:"Add New"})})]}),!A&&n(ie,{entity:l,data:b,filters:c,onFiltersChange:q,fieldsToFilter:l.listFields})]})}),n(R,{title:p?e("results.title.fetching",{defaultValue:"Fetching..."}):e("results.title.count",{count:w,defaultValue:w===1?"Found 1 occurrence":`Found ${w} occurrences`}),collapsible:!0,defaultOpen:!0,children:n(Z,{data:D,columns:G,sortable:!0,searchable:!1,pagination:!0,loading:p,onRowClick:t=>M(t.id),showingLabel:e("pagination.showing",{defaultValue:"Showing {{from}} to {{to}} of {{total}} entries"}),paginationPreviousLabel:e("pagination.previous",{defaultValue:"Previous"}),paginationNextLabel:e("pagination.next",{defaultValue:"Next"}),paginationItemsPerPagePlaceholder:e("pagination.itemsPerPagePlaceholder",{defaultValue:"Items per page"}),...h==="server"&&{currentPage:P,pageSize:v,total:S?.total,onPageChange:E}})})]})}export{Fe as EntityList};