firstly 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/esm/SqlDatabase/FF_LogToConsole.js +9 -14
  3. package/esm/carbone/CarboneController.js +2 -1
  4. package/esm/changeLog/index.d.ts +0 -10
  5. package/esm/{internals → core}/BaseEnum.d.ts +1 -1
  6. package/esm/core/FF_Entity.js +5 -0
  7. package/esm/core/helper.d.ts +2 -0
  8. package/esm/core/helper.js +3 -0
  9. package/esm/core/index.d.ts +0 -0
  10. package/esm/core/index.js +5 -0
  11. package/esm/core/tailwind.d.ts +21 -0
  12. package/esm/core/tailwind.js +22 -0
  13. package/esm/core/tryCatch.d.ts +44 -0
  14. package/esm/core/tryCatch.js +34 -0
  15. package/esm/cron/server/index.js +1 -1
  16. package/esm/feedback/FeedbackController.js +3 -2
  17. package/esm/feedback/index.d.ts +7 -2
  18. package/esm/feedback/index.js +1 -2
  19. package/esm/feedback/server/index.d.ts +0 -5
  20. package/esm/feedback/server/index.js +1 -1
  21. package/esm/formats/strings.js +2 -2
  22. package/esm/index.d.ts +16 -0
  23. package/esm/index.js +13 -0
  24. package/esm/svelte/FF_Repo.svelte.d.ts +9 -2
  25. package/esm/svelte/FF_Repo.svelte.js +40 -17
  26. package/esm/svelte/class/SP.svelte.js +14 -2
  27. package/esm/svelte/helpers/debounce.js +1 -1
  28. package/esm/svelte/index.d.ts +2 -24
  29. package/esm/svelte/index.js +2 -22
  30. package/esm/{ui → svelte/ui}/Icon.svelte +1 -1
  31. package/esm/virtual/StateDemoEnum.d.ts +3 -3
  32. package/esm/virtual/StateDemoEnum.js +3 -3
  33. package/esm/virtual/UIEntity.js +1 -2
  34. package/package.json +8 -39
  35. package/esm/auth/AuthController.d.ts +0 -58
  36. package/esm/auth/AuthController.js +0 -114
  37. package/esm/auth/Entities.d.ts +0 -47
  38. package/esm/auth/Entities.js +0 -182
  39. package/esm/auth/README.md +0 -3
  40. package/esm/auth/index.d.ts +0 -5
  41. package/esm/auth/index.js +0 -5
  42. package/esm/auth/server/AuthController.server.d.ts +0 -58
  43. package/esm/auth/server/AuthController.server.js +0 -518
  44. package/esm/auth/server/handleAuth.d.ts +0 -4
  45. package/esm/auth/server/handleAuth.js +0 -142
  46. package/esm/auth/server/handleGuard.d.ts +0 -22
  47. package/esm/auth/server/handleGuard.js +0 -34
  48. package/esm/auth/server/helperDb.d.ts +0 -10
  49. package/esm/auth/server/helperDb.js +0 -56
  50. package/esm/auth/server/helperFirstly.d.ts +0 -1
  51. package/esm/auth/server/helperFirstly.js +0 -9
  52. package/esm/auth/server/helperOslo.d.ts +0 -7
  53. package/esm/auth/server/helperOslo.js +0 -24
  54. package/esm/auth/server/helperRemultServer.d.ts +0 -5
  55. package/esm/auth/server/helperRemultServer.js +0 -44
  56. package/esm/auth/server/helperRole.d.ts +0 -19
  57. package/esm/auth/server/helperRole.js +0 -57
  58. package/esm/auth/server/index.d.ts +0 -8
  59. package/esm/auth/server/index.js +0 -8
  60. package/esm/auth/server/module.d.ts +0 -300
  61. package/esm/auth/server/module.js +0 -230
  62. package/esm/auth/server/providers/github.d.ts +0 -33
  63. package/esm/auth/server/providers/github.js +0 -87
  64. package/esm/auth/server/providers/helperProvider.d.ts +0 -1
  65. package/esm/auth/server/providers/helperProvider.js +0 -25
  66. package/esm/auth/static/assets/Page-BHW08QWz.css +0 -1
  67. package/esm/auth/static/assets/Page-BRNWcY5Z.d.ts +0 -2
  68. package/esm/auth/static/assets/Page-BRNWcY5Z.js +0 -1
  69. package/esm/auth/static/assets/Page-CFcEsGK8.d.ts +0 -2
  70. package/esm/auth/static/assets/Page-CFcEsGK8.js +0 -7
  71. package/esm/auth/static/assets/Page-tLVs5slF.d.ts +0 -2
  72. package/esm/auth/static/assets/Page-tLVs5slF.js +0 -1
  73. package/esm/auth/static/assets/index-D38rqu4x.d.ts +0 -201
  74. package/esm/auth/static/assets/index-D38rqu4x.js +0 -2
  75. package/esm/auth/static/assets/index-DKWpA6v7.css +0 -4
  76. package/esm/auth/static/favicon.svg +0 -79
  77. package/esm/auth/static/index.html +0 -13
  78. package/esm/auth/types.d.ts +0 -73
  79. package/esm/bin/cmd.d.ts +0 -1
  80. package/esm/bin/cmd.js +0 -793
  81. package/esm/feedback/ui/DialogIssue.svelte +0 -149
  82. package/esm/feedback/ui/DialogIssue.svelte.d.ts +0 -22
  83. package/esm/feedback/ui/DialogIssues.svelte +0 -114
  84. package/esm/feedback/ui/DialogIssues.svelte.d.ts +0 -22
  85. package/esm/feedback/ui/DialogMilestones.svelte +0 -43
  86. package/esm/feedback/ui/DialogMilestones.svelte.d.ts +0 -20
  87. package/esm/feedback/ui/Feedback.svelte +0 -16
  88. package/esm/feedback/ui/Feedback.svelte.d.ts +0 -18
  89. package/esm/internals/FF_Entity.d.ts +0 -2
  90. package/esm/internals/FF_Entity.js +0 -21
  91. package/esm/internals/FF_Fields.d.ts +0 -11
  92. package/esm/internals/FF_Fields.js +0 -144
  93. package/esm/internals/cellsBuildor.d.ts +0 -47
  94. package/esm/internals/cellsBuildor.js +0 -140
  95. package/esm/internals/helper.d.ts +0 -49
  96. package/esm/internals/helper.js +0 -162
  97. package/esm/internals/index.d.ts +0 -82
  98. package/esm/internals/index.js +0 -45
  99. package/esm/internals/storeItem.d.ts +0 -28
  100. package/esm/internals/storeItem.js +0 -176
  101. package/esm/internals/storeList.d.ts +0 -34
  102. package/esm/internals/storeList.js +0 -108
  103. package/esm/internals/theme.d.ts +0 -4
  104. package/esm/internals/theme.js +0 -4
  105. package/esm/server/index.d.ts +0 -52
  106. package/esm/server/index.js +0 -87
  107. package/esm/svelte/FF_Cell.svelte +0 -103
  108. package/esm/svelte/FF_Cell.svelte.d.ts +0 -33
  109. package/esm/svelte/FF_Cell_Caption.svelte +0 -20
  110. package/esm/svelte/FF_Cell_Caption.svelte.d.ts +0 -31
  111. package/esm/svelte/FF_Cell_Display.svelte +0 -61
  112. package/esm/svelte/FF_Cell_Display.svelte.d.ts +0 -29
  113. package/esm/svelte/FF_Cell_Edit.svelte +0 -104
  114. package/esm/svelte/FF_Cell_Edit.svelte.d.ts +0 -32
  115. package/esm/svelte/FF_Cell_Error.svelte +0 -20
  116. package/esm/svelte/FF_Cell_Error.svelte.d.ts +0 -31
  117. package/esm/svelte/FF_Cell_Hint.svelte +0 -20
  118. package/esm/svelte/FF_Cell_Hint.svelte.d.ts +0 -31
  119. package/esm/svelte/FF_Config.svelte +0 -29
  120. package/esm/svelte/FF_Config.svelte.d.ts +0 -9
  121. package/esm/svelte/FF_Form.svelte +0 -155
  122. package/esm/svelte/FF_Form.svelte.d.ts +0 -37
  123. package/esm/svelte/FF_Grid.svelte +0 -257
  124. package/esm/svelte/FF_Grid.svelte.d.ts +0 -37
  125. package/esm/svelte/FF_Layout.svelte +0 -62
  126. package/esm/svelte/FF_Layout.svelte.d.ts +0 -31
  127. package/esm/svelte/actions/intersection.d.ts +0 -6
  128. package/esm/svelte/actions/intersection.js +0 -17
  129. package/esm/svelte/customField.d.ts +0 -69
  130. package/esm/svelte/customField.js +0 -4
  131. package/esm/svelte/dialog/DialogManagement.svelte +0 -98
  132. package/esm/svelte/dialog/DialogManagement.svelte.d.ts +0 -18
  133. package/esm/svelte/dialog/DialogPrimitive.svelte +0 -156
  134. package/esm/svelte/dialog/DialogPrimitive.svelte.d.ts +0 -38
  135. package/esm/svelte/dialog/dialog.d.ts +0 -58
  136. package/esm/svelte/dialog/dialog.js +0 -130
  137. package/esm/svelte/ff_Config.svelte.d.ts +0 -91
  138. package/esm/svelte/ff_Config.svelte.js +0 -111
  139. package/esm/svelte/firstly.css +0 -14
  140. package/esm/svelte/helpers.d.ts +0 -30
  141. package/esm/svelte/helpers.js +0 -38
  142. package/esm/svelte/tryCatch.d.ts +0 -12
  143. package/esm/svelte/tryCatch.js +0 -18
  144. package/esm/sveltekit/server/index.d.ts +0 -5
  145. package/esm/sveltekit/server/index.js +0 -24
  146. package/esm/ui/Button.svelte +0 -138
  147. package/esm/ui/Button.svelte.d.ts +0 -13
  148. package/esm/ui/Clipboardable.svelte +0 -25
  149. package/esm/ui/Clipboardable.svelte.d.ts +0 -12
  150. package/esm/ui/Field.svelte +0 -382
  151. package/esm/ui/Field.svelte.d.ts +0 -40
  152. package/esm/ui/FieldGroup.svelte +0 -117
  153. package/esm/ui/FieldGroup.svelte.d.ts +0 -44
  154. package/esm/ui/Grid.svelte +0 -265
  155. package/esm/ui/Grid.svelte.d.ts +0 -57
  156. package/esm/ui/Grid2.svelte +0 -293
  157. package/esm/ui/Grid2.svelte.d.ts +0 -57
  158. package/esm/ui/GridLoading.svelte +0 -58
  159. package/esm/ui/GridLoading.svelte.d.ts +0 -23
  160. package/esm/ui/GridPaginate.svelte +0 -69
  161. package/esm/ui/GridPaginate.svelte.d.ts +0 -23
  162. package/esm/ui/GridPaginate2.svelte +0 -25
  163. package/esm/ui/GridPaginate2.svelte.d.ts +0 -7
  164. package/esm/ui/Loading.svelte +0 -16
  165. package/esm/ui/Loading.svelte.d.ts +0 -31
  166. package/esm/ui/Tooltip.svelte +0 -45
  167. package/esm/ui/Tooltip.svelte.d.ts +0 -32
  168. package/esm/ui/dialog/DialogForm.svelte +0 -76
  169. package/esm/ui/dialog/DialogForm.svelte.d.ts +0 -21
  170. package/esm/ui/dialog/DialogManagement.svelte +0 -96
  171. package/esm/ui/dialog/DialogManagement.svelte.d.ts +0 -26
  172. package/esm/ui/dialog/DialogPrimitive.svelte +0 -90
  173. package/esm/ui/dialog/DialogPrimitive.svelte.d.ts +0 -38
  174. package/esm/ui/dialog/FormEditAction.svelte +0 -62
  175. package/esm/ui/dialog/FormEditAction.svelte.d.ts +0 -31
  176. package/esm/ui/dialog/dialog.d.ts +0 -60
  177. package/esm/ui/dialog/dialog.js +0 -100
  178. package/esm/ui/index.d.ts +0 -6
  179. package/esm/ui/index.js +0 -20
  180. package/esm/ui/internals/FieldContainer.svelte +0 -39
  181. package/esm/ui/internals/FieldContainer.svelte.d.ts +0 -18
  182. package/esm/ui/internals/Input.svelte +0 -143
  183. package/esm/ui/internals/Input.svelte.d.ts +0 -37
  184. package/esm/ui/internals/Textarea.svelte +0 -66
  185. package/esm/ui/internals/Textarea.svelte.d.ts +0 -33
  186. package/esm/ui/internals/select/MultiSelectMelt.svelte +0 -260
  187. package/esm/ui/internals/select/MultiSelectMelt.svelte.d.ts +0 -32
  188. package/esm/ui/internals/select/Select2.svelte +0 -88
  189. package/esm/ui/internals/select/Select2.svelte.d.ts +0 -12
  190. package/esm/ui/internals/select/SelectMelt.svelte +0 -280
  191. package/esm/ui/internals/select/SelectMelt.svelte.d.ts +0 -40
  192. package/esm/ui/internals/select/SelectRadio.svelte +0 -43
  193. package/esm/ui/internals/select/SelectRadio.svelte.d.ts +0 -27
  194. package/esm/ui/link/Link.svelte +0 -33
  195. package/esm/ui/link/Link.svelte.d.ts +0 -33
  196. package/esm/ui/link/LinkPlus.svelte +0 -63
  197. package/esm/ui/link/LinkPlus.svelte.d.ts +0 -9
  198. package/esm/utils/tailwind.d.ts +0 -2
  199. package/esm/utils/tailwind.js +0 -3
  200. package/esm/utils/transition.d.ts +0 -9
  201. package/esm/utils/transition.js +0 -33
  202. package/esm/utils/types.js +0 -1
  203. /package/esm/{internals → core}/BaseEnum.js +0 -0
  204. /package/esm/{internals → core}/common.d.ts +0 -0
  205. /package/esm/{internals → core}/common.js +0 -0
  206. /package/esm/{utils → core}/types.d.ts +0 -0
  207. /package/esm/{auth → core}/types.js +0 -0
  208. /package/esm/{ui → svelte/ui}/Icon.svelte.d.ts +0 -0
  209. /package/esm/{ui → svelte/ui}/LibIcon.d.ts +0 -0
  210. /package/esm/{ui → svelte/ui}/LibIcon.js +0 -0
@@ -1,32 +0,0 @@
1
- import { type FieldMetadata } from 'remult';
2
- import type { EditTheme } from '.';
3
- declare function $$render<valueType = unknown, entityType = unknown>(): {
4
- props: {
5
- uid?: string;
6
- field: FieldMetadata<valueType, entityType>;
7
- value: valueType;
8
- error?: string;
9
- classes?: EditTheme;
10
- };
11
- exports: {};
12
- bindings: "value";
13
- slots: {};
14
- events: {};
15
- };
16
- declare class __sveltets_Render<valueType = unknown, entityType = unknown> {
17
- props(): ReturnType<typeof $$render<valueType, entityType>>['props'];
18
- events(): ReturnType<typeof $$render<valueType, entityType>>['events'];
19
- slots(): ReturnType<typeof $$render<valueType, entityType>>['slots'];
20
- bindings(): "value";
21
- exports(): {};
22
- }
23
- interface $$IsomorphicComponent {
24
- new <valueType = unknown, entityType = unknown>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<valueType, entityType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<valueType, entityType>['props']>, ReturnType<__sveltets_Render<valueType, entityType>['events']>, ReturnType<__sveltets_Render<valueType, entityType>['slots']>> & {
25
- $$bindings?: ReturnType<__sveltets_Render<valueType, entityType>['bindings']>;
26
- } & ReturnType<__sveltets_Render<valueType, entityType>['exports']>;
27
- <valueType = unknown, entityType = unknown>(internal: unknown, props: ReturnType<__sveltets_Render<valueType, entityType>['props']> & {}): ReturnType<__sveltets_Render<valueType, entityType>['exports']>;
28
- z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
29
- }
30
- declare const FfCellEdit: $$IsomorphicComponent;
31
- type FfCellEdit<valueType = unknown, entityType = unknown> = InstanceType<typeof FfCellEdit<valueType, entityType>>;
32
- export default FfCellEdit;
@@ -1,20 +0,0 @@
1
- <script lang="ts" generics="valueType = unknown, entityType = unknown">
2
- import type { CellMetadata } from './customField'
3
-
4
- interface Props<valueType = unknown, entityType = unknown> {
5
- key: string
6
- ui: CellMetadata<valueType, entityType>['ui']
7
- error?: string
8
- class?: string
9
- }
10
-
11
- let { ui, key, class: localClass, error }: Props<valueType, entityType> = $props()
12
- </script>
13
-
14
- {#if ui?.component?.error === undefined || ui?.component?.error === 'show'}
15
- <label data-ff-cell-error for={key} class={localClass}>{@html error}</label>
16
- {:else if ui?.component?.error === 'remove'}
17
- <!-- Nothing -->
18
- {:else if ui?.component?.error === 'hide'}
19
- <span data-ff-cell-error class={localClass}></span>
20
- {/if}
@@ -1,31 +0,0 @@
1
- import type { CellMetadata } from './customField';
2
- interface Props<valueType = unknown, entityType = unknown> {
3
- key: string;
4
- ui: CellMetadata<valueType, entityType>['ui'];
5
- error?: string;
6
- class?: string;
7
- }
8
- declare function $$render<valueType = unknown, entityType = unknown>(): {
9
- props: Props<valueType, entityType>;
10
- exports: {};
11
- bindings: "";
12
- slots: {};
13
- events: {};
14
- };
15
- declare class __sveltets_Render<valueType = unknown, entityType = unknown> {
16
- props(): ReturnType<typeof $$render<valueType, entityType>>['props'];
17
- events(): ReturnType<typeof $$render<valueType, entityType>>['events'];
18
- slots(): ReturnType<typeof $$render<valueType, entityType>>['slots'];
19
- bindings(): "";
20
- exports(): {};
21
- }
22
- interface $$IsomorphicComponent {
23
- new <valueType = unknown, entityType = unknown>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<valueType, entityType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<valueType, entityType>['props']>, ReturnType<__sveltets_Render<valueType, entityType>['events']>, ReturnType<__sveltets_Render<valueType, entityType>['slots']>> & {
24
- $$bindings?: ReturnType<__sveltets_Render<valueType, entityType>['bindings']>;
25
- } & ReturnType<__sveltets_Render<valueType, entityType>['exports']>;
26
- <valueType = unknown, entityType = unknown>(internal: unknown, props: ReturnType<__sveltets_Render<valueType, entityType>['props']> & {}): ReturnType<__sveltets_Render<valueType, entityType>['exports']>;
27
- z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
28
- }
29
- declare const FfCellError: $$IsomorphicComponent;
30
- type FfCellError<valueType = unknown, entityType = unknown> = InstanceType<typeof FfCellError<valueType, entityType>>;
31
- export default FfCellError;
@@ -1,20 +0,0 @@
1
- <script lang="ts" generics="valueType = unknown, entityType = unknown">
2
- import type { CellMetadata } from './customField'
3
-
4
- interface Props<valueType = unknown, entityType = unknown> {
5
- key: string
6
- ui: CellMetadata<valueType, entityType>['ui']
7
- hint?: string
8
- class?: string
9
- }
10
-
11
- let { ui, key, class: localClass, hint }: Props<valueType, entityType> = $props()
12
- </script>
13
-
14
- {#if ui?.component?.hint === undefined || ui?.component?.hint === 'show'}
15
- <label data-ff-cell-hint for={key} class={localClass}>{@html hint}</label>
16
- {:else if ui?.component?.hint === 'remove'}
17
- <!-- Nothing -->
18
- {:else if ui?.component?.hint === 'hide'}
19
- <span data-ff-cell-hint class={localClass}></span>
20
- {/if}
@@ -1,31 +0,0 @@
1
- import type { CellMetadata } from './customField';
2
- interface Props<valueType = unknown, entityType = unknown> {
3
- key: string;
4
- ui: CellMetadata<valueType, entityType>['ui'];
5
- hint?: string;
6
- class?: string;
7
- }
8
- declare function $$render<valueType = unknown, entityType = unknown>(): {
9
- props: Props<valueType, entityType>;
10
- exports: {};
11
- bindings: "";
12
- slots: {};
13
- events: {};
14
- };
15
- declare class __sveltets_Render<valueType = unknown, entityType = unknown> {
16
- props(): ReturnType<typeof $$render<valueType, entityType>>['props'];
17
- events(): ReturnType<typeof $$render<valueType, entityType>>['events'];
18
- slots(): ReturnType<typeof $$render<valueType, entityType>>['slots'];
19
- bindings(): "";
20
- exports(): {};
21
- }
22
- interface $$IsomorphicComponent {
23
- new <valueType = unknown, entityType = unknown>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<valueType, entityType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<valueType, entityType>['props']>, ReturnType<__sveltets_Render<valueType, entityType>['events']>, ReturnType<__sveltets_Render<valueType, entityType>['slots']>> & {
24
- $$bindings?: ReturnType<__sveltets_Render<valueType, entityType>['bindings']>;
25
- } & ReturnType<__sveltets_Render<valueType, entityType>['exports']>;
26
- <valueType = unknown, entityType = unknown>(internal: unknown, props: ReturnType<__sveltets_Render<valueType, entityType>['props']> & {}): ReturnType<__sveltets_Render<valueType, entityType>['exports']>;
27
- z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
28
- }
29
- declare const FfCellHint: $$IsomorphicComponent;
30
- type FfCellHint<valueType = unknown, entityType = unknown> = InstanceType<typeof FfCellHint<valueType, entityType>>;
31
- export default FfCellHint;
@@ -1,29 +0,0 @@
1
- <script lang="ts">
2
- import { FF_Theme, setDynamicCustomField } from './'
3
- import type { DynamicCustomField, Theme } from './'
4
- import DialogManagement from './dialog/DialogManagement.svelte'
5
-
6
- interface Props {
7
- theme: Theme
8
- dynamicCustomField?: DynamicCustomField
9
- children?: import('svelte').Snippet
10
- }
11
-
12
- const { theme, dynamicCustomField, children }: Props = $props()
13
-
14
- // Create a reactive theme instance
15
- const themeManager = $state(new FF_Theme(theme))
16
-
17
- // Update theme when prop changes
18
- $effect(() => {
19
- themeManager.setTheme(theme)
20
- })
21
-
22
- if (dynamicCustomField) {
23
- setDynamicCustomField(dynamicCustomField)
24
- }
25
- </script>
26
-
27
- <DialogManagement />
28
-
29
- {@render children?.()}
@@ -1,9 +0,0 @@
1
- import type { DynamicCustomField, Theme } from './';
2
- interface Props {
3
- theme: Theme;
4
- dynamicCustomField?: DynamicCustomField;
5
- children?: import('svelte').Snippet;
6
- }
7
- declare const FfConfig: import("svelte").Component<Props, {}, "">;
8
- type FfConfig = ReturnType<typeof FfConfig>;
9
- export default FfConfig;
@@ -1,155 +0,0 @@
1
- <script lang="ts" generics="entityType = unknown">
2
- import { EntityError, getEntityRef } from 'remult'
3
-
4
- import { FF_Cell, getClasses } from './'
5
- import type { FF_Repo, FieldGroup, FormTheme } from './'
6
-
7
- const default_uid = $props.id()
8
-
9
- interface Props<entityType> {
10
- uid_prefix?: string
11
- uid?: string
12
- r: FF_Repo<entityType>
13
- groups?: FieldGroup<entityType>[]
14
- defaults?: Partial<entityType>
15
- classes?: FormTheme
16
- show?: {
17
- title?: boolean
18
- }
19
- onSaved?: (item: entityType) => void
20
- }
21
-
22
- let {
23
- uid_prefix = '',
24
- uid = default_uid,
25
- r,
26
- groups,
27
- defaults,
28
- show = {
29
- title: true,
30
- },
31
- classes: localClasses = {},
32
- onSaved,
33
- }: Props<entityType> = $props()
34
-
35
- const ToUse = uid_prefix ? `${uid_prefix}-${uid}` : uid
36
-
37
- let classes = $derived(getClasses('form', localClasses))
38
-
39
- let errors = $state<Record<string, string>>({})
40
- let globalError = $state<string | undefined>(undefined)
41
-
42
- let valuesToUse = $state(r.item ? r.item : r.create(defaults))
43
- let ref = $derived(getEntityRef(valuesToUse))
44
- const groupsToUse: FieldGroup<entityType>[] = $derived(groups ?? r.getLayout()?.groups ?? [])
45
-
46
- const onsubmit = async (e: Event) => {
47
- e.preventDefault()
48
- // r.loading.saving = true
49
- // FF_Form.svelte:48 [svelte] ownership_invalid_mutation
50
- // src/lib/svelte/FF_Form.svelte mutated a value owned by src/routes/demo/FF_Simple/+page.svelte. This is strongly discouraged. Consider passing values to child components with `bind:`, or use a callback instead
51
- // https://svelte.dev/e/ownership_invalid_mutation
52
- globalError = undefined
53
- try {
54
- if (ref.isNew()) {
55
- const itemSaved = await ref.save()
56
- r.items?.unshift(itemSaved)
57
- if (r.aggregates && r.aggregates.$count !== undefined) {
58
- r.aggregates.$count = r.aggregates.$count + 1
59
- }
60
- valuesToUse = r.create()
61
- onSaved?.(itemSaved)
62
- } else {
63
- const itemSaved = await ref.save()
64
- onSaved?.(itemSaved)
65
- }
66
- errors = {}
67
- } catch (error) {
68
- if (error instanceof EntityError) {
69
- errors = error.modelState as Record<string, string>
70
- } else {
71
- // @ts-ignore
72
- globalError = error.message
73
- }
74
- }
75
- // r.loading.saving = false
76
- }
77
- </script>
78
-
79
- <form data-ff-form class="{classes?.root} {r.metadata.key}" {onsubmit}>
80
- <div data-ff-form-groups class={classes?.groups}>
81
- {#each groupsToUse ?? [] as group (group.key)}
82
- <div data-ff-form-group>
83
- {#if show?.title}
84
- <div data-ff-form-title>
85
- <!-- {ref.isNew() ? 'Add' : 'Save'} -->
86
- {group?.caption ?? r.metadata.caption}
87
- </div>
88
- {/if}
89
- {#if group?.hint}
90
- <div data-ff-form-hint>{@html group?.hint}</div>
91
- {/if}
92
- <div data-ff-form-fields class="{classes?.fields} {group.class}">
93
- {#each group.fields as field}
94
- <FF_Cell
95
- cell={{ field, mode: 'edit' }}
96
- bind:value={valuesToUse[field.key as keyof entityType]}
97
- error={errors[field.key ?? '']}
98
- />
99
- {/each}
100
- </div>
101
- </div>
102
- {/each}
103
- </div>
104
-
105
- <div data-ff-form-actions class={classes?.actions}>
106
- <button
107
- data-ff-form-button
108
- class={classes?.submitButton}
109
- disabled={!r.metadata.apiInsertAllowed() || r.loading.saving}
110
- >
111
- {ref.isNew() ? 'Add' : 'Save'}{r.loading.saving ? '...' : ''}
112
- </button>
113
- {globalError}
114
- </div>
115
- {globalError}
116
- <!-- TODO: display errors of field not in the form -->
117
- </form>
118
-
119
- <style>
120
- [data-ff-form-title] {
121
- width: 100%;
122
- display: flex;
123
- flex-wrap: wrap;
124
- padding: var(--ff-spacing);
125
- }
126
-
127
- [data-ff-form-hint] {
128
- width: 100%;
129
- display: flex;
130
- flex-wrap: wrap;
131
- padding: var(--ff-spacing);
132
- }
133
-
134
- [data-ff-form-fields] {
135
- width: 100%;
136
- display: flex;
137
- flex-wrap: wrap;
138
- }
139
-
140
- /* To distribute as default css ? */
141
- .ff-form-actions {
142
- display: flex;
143
- justify-content: flex-end;
144
- margin: 1rem;
145
-
146
- button {
147
- border-radius: 0.5rem;
148
- padding: 0.5rem 1rem;
149
- background-color: green;
150
- color: #fff;
151
- border: none;
152
- cursor: pointer;
153
- }
154
- }
155
- </style>
@@ -1,37 +0,0 @@
1
- import type { FF_Repo, FieldGroup, FormTheme } from './';
2
- interface Props<entityType> {
3
- uid_prefix?: string;
4
- uid?: string;
5
- r: FF_Repo<entityType>;
6
- groups?: FieldGroup<entityType>[];
7
- defaults?: Partial<entityType>;
8
- classes?: FormTheme;
9
- show?: {
10
- title?: boolean;
11
- };
12
- onSaved?: (item: entityType) => void;
13
- }
14
- declare function $$render<entityType = unknown>(): {
15
- props: Props<entityType>;
16
- exports: {};
17
- bindings: "";
18
- slots: {};
19
- events: {};
20
- };
21
- declare class __sveltets_Render<entityType = unknown> {
22
- props(): ReturnType<typeof $$render<entityType>>['props'];
23
- events(): ReturnType<typeof $$render<entityType>>['events'];
24
- slots(): ReturnType<typeof $$render<entityType>>['slots'];
25
- bindings(): "";
26
- exports(): {};
27
- }
28
- interface $$IsomorphicComponent {
29
- new <entityType = unknown>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<entityType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<entityType>['props']>, ReturnType<__sveltets_Render<entityType>['events']>, ReturnType<__sveltets_Render<entityType>['slots']>> & {
30
- $$bindings?: ReturnType<__sveltets_Render<entityType>['bindings']>;
31
- } & ReturnType<__sveltets_Render<entityType>['exports']>;
32
- <entityType = unknown>(internal: unknown, props: ReturnType<__sveltets_Render<entityType>['props']> & {}): ReturnType<__sveltets_Render<entityType>['exports']>;
33
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
34
- }
35
- declare const FfForm: $$IsomorphicComponent;
36
- type FfForm<entityType = unknown> = InstanceType<typeof FfForm<entityType>>;
37
- export default FfForm;
@@ -1,257 +0,0 @@
1
- <script lang="ts" generics="entityType = unknown">
2
- import { getEntityRef, type FieldMetadata } from 'remult'
3
-
4
- import Icon from '../ui/Icon.svelte'
5
- import { LibIcon_Add, LibIcon_Delete, LibIcon_Edit } from '../ui/LibIcon'
6
- import { dialog, FF_Cell_Display, FF_Repo, getClasses, type GridTheme } from './'
7
-
8
- interface Props<entityType> {
9
- // uid?: string
10
- r: FF_Repo<entityType>
11
- fields?: FieldMetadata<unknown, entityType>[]
12
- showCreate?: boolean
13
- showEdit?: boolean
14
- showDelete?: boolean
15
- oncreate?: () => void
16
- onedit?: (item: entityType) => void
17
- ondelete?: (item: entityType) => void
18
-
19
- classes?: GridTheme
20
- }
21
-
22
- let {
23
- r,
24
- fields = r.getLayout()?.groups?.[0]?.fields ?? [],
25
- showCreate = true,
26
- showEdit = true,
27
- showDelete = true,
28
- oncreate,
29
- onedit,
30
- ondelete,
31
- classes: localClasses = {},
32
- }: Props<entityType> = $props()
33
-
34
- let classes = $derived(getClasses('grid', localClasses))
35
-
36
- const showActions = $derived(showEdit || showDelete)
37
- </script>
38
-
39
- <div class="flex justify-end gap-2">
40
- {#if r.aggregates?.$count}
41
- Total: {r.aggregates?.$count}
42
- {/if}
43
-
44
- {#if showCreate}
45
- <button
46
- disabled={!r.metadata.apiInsertAllowed()}
47
- class="create-button"
48
- data-ff-grid-action-create
49
- onclick={async () => {
50
- if (oncreate) {
51
- oncreate()
52
- } else {
53
- const res = await dialog.fform(r, { defaults: {} })
54
- // Done already in FF_Form
55
- // if (res.success && r.items) {
56
- // r.items.unshift(res.item)
57
- // }
58
- }
59
- }}
60
- >
61
- <Icon data={LibIcon_Add} />
62
- </button>
63
- {/if}
64
- </div>
65
-
66
- <table data-ff-grid class={classes?.root}>
67
- <thead>
68
- <tr data-ff-grid-header class={classes?.header}>
69
- {#each fields ?? [] as item (item.key)}
70
- <th data-ff-grid-header-cell class="{classes?.headerCell} th-{item.inputType}"
71
- >{item.caption}</th
72
- >
73
- {/each}
74
- {#if showActions}
75
- <th data-ff-grid-header-cell class={classes?.actionsHeader} style="width: 1rem;"> Actions </th>
76
- {/if}
77
- </tr>
78
- </thead>
79
- <tbody>
80
- {#if r.loading.init}
81
- {#each Array(10) as _}
82
- <tr>
83
- {#each fields ?? [] as item (item.key)}
84
- <td class="cell-loading"></td>
85
- {/each}
86
- {#if showActions}
87
- <td class="cell-loading"></td>
88
- {/if}
89
- </tr>
90
- {/each}
91
- {/if}
92
- {#if r.globalError}
93
- <tr>
94
- <td colspan={showActions ? fields.length + 1 : fields.length} class="text-danger"
95
- >{r.globalError}</td
96
- >
97
- </tr>
98
- {/if}
99
- {#each r.items ?? [] as item (r.metadata.idMetadata.getId(item))}
100
- <tr data-ff-grid-row class={classes?.row}>
101
- {#each fields as f (f.key)}
102
- <td data-ff-grid-row-cell class="{classes?.rowCell} td-{f.inputType}">
103
- <FF_Cell_Display field={f} value={item[f.key as keyof entityType]}></FF_Cell_Display>
104
- </td>
105
- {/each}
106
- {#if showActions}
107
- <td data-ff-grid-actions-cell class={classes?.actionsColumn}>
108
- <div class={classes?.actions}>
109
- {#if showEdit}
110
- <button
111
- disabled={!r.metadata.apiUpdateAllowed(item)}
112
- class={classes?.actionButton}
113
- data-ff-grid-action-edit
114
- onclick={async () => {
115
- if (onedit) {
116
- onedit?.(item)
117
- } else {
118
- const ref = getEntityRef(item)
119
- const newR = new FF_Repo(r.ent, { item: ref.clone() })
120
- const res = await dialog.fform(newR, {})
121
- if (res.success) {
122
- if (r.items) {
123
- r.items[
124
- r.items.findIndex(
125
- (i) => r.metadata.idMetadata.getId(i) === r.metadata.idMetadata.getId(res.item),
126
- )
127
- ] = res.item
128
- }
129
- }
130
- }
131
- }}
132
- >
133
- <Icon data={LibIcon_Edit} />
134
- </button>
135
- {/if}
136
- {#if showDelete}
137
- <button
138
- disabled={!r.metadata.apiDeleteAllowed(item)}
139
- class={classes?.actionButton}
140
- data-ff-grid-action-delete
141
- onclick={async () => {
142
- if (ondelete) {
143
- ondelete?.(item)
144
- } else {
145
- const res = await dialog.confirmDelete('')
146
- if (res.success) {
147
- await r.delete(item)
148
- }
149
- }
150
- }}
151
- >
152
- <Icon data={LibIcon_Delete} />
153
- </button>
154
- {/if}
155
- </div>
156
- </td>
157
- {/if}
158
- </tr>
159
- {/each}
160
- </tbody>
161
- </table>
162
- {#if r.hasNextPage}
163
- <div class="text-right">
164
- <button class={classes?.loadMoreButton} onclick={() => r.queryMore()}>Load More</button>
165
- </div>
166
- {/if}
167
-
168
- <style>
169
- .text-danger {
170
- color: red;
171
- text-align: center;
172
- padding-top: 2rem;
173
- }
174
- .cell-loading {
175
- width: 100%;
176
- height: 1.5rem;
177
- position: relative;
178
- overflow: hidden;
179
- }
180
-
181
- .cell-loading::after {
182
- content: '';
183
- position: absolute;
184
- top: 0;
185
- right: 0;
186
- bottom: 0;
187
- left: 0;
188
- transform: translateX(-100%);
189
- background-image: linear-gradient(
190
- 90deg,
191
- rgba(255, 255, 255, 0) 0,
192
- rgba(255, 255, 255, 0.2) 20%,
193
- rgba(255, 255, 255, 0.5) 60%,
194
- rgba(255, 255, 255, 0)
195
- );
196
- animation: shimmer 2s infinite;
197
- }
198
-
199
- @keyframes shimmer {
200
- 100% {
201
- transform: translateX(100%);
202
- }
203
- }
204
-
205
- [data-ff-grid-action-create] {
206
- opacity: 1;
207
- color: inherit;
208
- }
209
-
210
- [data-ff-grid-action-create]:disabled {
211
- opacity: 0.5;
212
- }
213
-
214
- [data-ff-grid-action-edit] {
215
- opacity: 1;
216
- color: inherit;
217
- }
218
-
219
- [data-ff-grid-action-edit]:disabled {
220
- opacity: 0.5;
221
- }
222
-
223
- [data-ff-grid-action-delete] {
224
- opacity: 1;
225
- color: inherit;
226
- }
227
-
228
- [data-ff-grid-action-delete]:disabled {
229
- opacity: 0.5;
230
- }
231
-
232
- :global {
233
- [data-ff-grid-header-cell] {
234
- &.th-checkbox {
235
- text-align: center;
236
- }
237
- }
238
-
239
- [data-ff-grid-row-cell] {
240
- &.td-checkbox {
241
- text-align: center;
242
- }
243
- }
244
-
245
- [data-ff-grid-header-cell] {
246
- &.th-number {
247
- text-align: right;
248
- }
249
- }
250
-
251
- [data-ff-grid-row-cell] {
252
- &.td-number {
253
- text-align: right;
254
- }
255
- }
256
- }
257
- </style>
@@ -1,37 +0,0 @@
1
- import { type FieldMetadata } from 'remult';
2
- import { FF_Repo, type GridTheme } from './';
3
- interface Props<entityType> {
4
- r: FF_Repo<entityType>;
5
- fields?: FieldMetadata<unknown, entityType>[];
6
- showCreate?: boolean;
7
- showEdit?: boolean;
8
- showDelete?: boolean;
9
- oncreate?: () => void;
10
- onedit?: (item: entityType) => void;
11
- ondelete?: (item: entityType) => void;
12
- classes?: GridTheme;
13
- }
14
- declare function $$render<entityType = unknown>(): {
15
- props: Props<entityType>;
16
- exports: {};
17
- bindings: "";
18
- slots: {};
19
- events: {};
20
- };
21
- declare class __sveltets_Render<entityType = unknown> {
22
- props(): ReturnType<typeof $$render<entityType>>['props'];
23
- events(): ReturnType<typeof $$render<entityType>>['events'];
24
- slots(): ReturnType<typeof $$render<entityType>>['slots'];
25
- bindings(): "";
26
- exports(): {};
27
- }
28
- interface $$IsomorphicComponent {
29
- new <entityType = unknown>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<entityType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<entityType>['props']>, ReturnType<__sveltets_Render<entityType>['events']>, ReturnType<__sveltets_Render<entityType>['slots']>> & {
30
- $$bindings?: ReturnType<__sveltets_Render<entityType>['bindings']>;
31
- } & ReturnType<__sveltets_Render<entityType>['exports']>;
32
- <entityType = unknown>(internal: unknown, props: ReturnType<__sveltets_Render<entityType>['props']> & {}): ReturnType<__sveltets_Render<entityType>['exports']>;
33
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
34
- }
35
- declare const FfGrid: $$IsomorphicComponent;
36
- type FfGrid<entityType = unknown> = InstanceType<typeof FfGrid<entityType>>;
37
- export default FfGrid;