firstly 0.3.0 → 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 (163) hide show
  1. package/CHANGELOG.md +52 -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 -5
  5. package/esm/core/helper.d.ts +2 -0
  6. package/esm/core/helper.js +3 -0
  7. package/esm/core/index.d.ts +0 -0
  8. package/esm/core/index.js +5 -0
  9. package/esm/core/tailwind.d.ts +21 -0
  10. package/esm/core/tailwind.js +22 -0
  11. package/esm/core/tryCatch.d.ts +44 -0
  12. package/esm/core/tryCatch.js +34 -0
  13. package/esm/cron/server/index.js +1 -1
  14. package/esm/feedback/FeedbackController.js +3 -2
  15. package/esm/feedback/index.d.ts +7 -2
  16. package/esm/feedback/index.js +1 -2
  17. package/esm/feedback/server/index.d.ts +0 -5
  18. package/esm/feedback/server/index.js +1 -1
  19. package/esm/formats/strings.js +2 -2
  20. package/esm/index.d.ts +16 -0
  21. package/esm/index.js +13 -0
  22. package/esm/svelte/FF_Repo.svelte.d.ts +0 -2
  23. package/esm/svelte/FF_Repo.svelte.js +1 -17
  24. package/esm/svelte/helpers/debounce.js +1 -1
  25. package/esm/svelte/index.d.ts +2 -24
  26. package/esm/svelte/index.js +2 -22
  27. package/esm/{ui → svelte/ui}/Icon.svelte +1 -1
  28. package/esm/virtual/StateDemoEnum.d.ts +3 -3
  29. package/esm/virtual/StateDemoEnum.js +3 -3
  30. package/esm/virtual/UIEntity.js +1 -2
  31. package/package.json +6 -24
  32. package/esm/bin/cmd.d.ts +0 -1
  33. package/esm/bin/cmd.js +0 -638
  34. package/esm/feedback/ui/DialogIssue.svelte +0 -149
  35. package/esm/feedback/ui/DialogIssue.svelte.d.ts +0 -22
  36. package/esm/feedback/ui/DialogIssues.svelte +0 -114
  37. package/esm/feedback/ui/DialogIssues.svelte.d.ts +0 -22
  38. package/esm/feedback/ui/DialogMilestones.svelte +0 -43
  39. package/esm/feedback/ui/DialogMilestones.svelte.d.ts +0 -20
  40. package/esm/feedback/ui/Feedback.svelte +0 -16
  41. package/esm/feedback/ui/Feedback.svelte.d.ts +0 -18
  42. package/esm/internals/FF_Entity.d.ts +0 -2
  43. package/esm/internals/FF_Fields.d.ts +0 -11
  44. package/esm/internals/FF_Fields.js +0 -144
  45. package/esm/internals/cellsBuildor.d.ts +0 -47
  46. package/esm/internals/cellsBuildor.js +0 -141
  47. package/esm/internals/helper.d.ts +0 -49
  48. package/esm/internals/helper.js +0 -162
  49. package/esm/internals/index.d.ts +0 -78
  50. package/esm/internals/index.js +0 -45
  51. package/esm/internals/storeItem.d.ts +0 -19
  52. package/esm/internals/storeItem.js +0 -190
  53. package/esm/internals/storeList.d.ts +0 -34
  54. package/esm/internals/storeList.js +0 -108
  55. package/esm/internals/theme.d.ts +0 -4
  56. package/esm/internals/theme.js +0 -4
  57. package/esm/server/index.d.ts +0 -52
  58. package/esm/server/index.js +0 -87
  59. package/esm/svelte/FF_Cell.svelte +0 -103
  60. package/esm/svelte/FF_Cell.svelte.d.ts +0 -33
  61. package/esm/svelte/FF_Cell_Caption.svelte +0 -20
  62. package/esm/svelte/FF_Cell_Caption.svelte.d.ts +0 -31
  63. package/esm/svelte/FF_Cell_Display.svelte +0 -61
  64. package/esm/svelte/FF_Cell_Display.svelte.d.ts +0 -29
  65. package/esm/svelte/FF_Cell_Edit.svelte +0 -104
  66. package/esm/svelte/FF_Cell_Edit.svelte.d.ts +0 -32
  67. package/esm/svelte/FF_Cell_Error.svelte +0 -20
  68. package/esm/svelte/FF_Cell_Error.svelte.d.ts +0 -31
  69. package/esm/svelte/FF_Cell_Hint.svelte +0 -20
  70. package/esm/svelte/FF_Cell_Hint.svelte.d.ts +0 -31
  71. package/esm/svelte/FF_Config.svelte +0 -29
  72. package/esm/svelte/FF_Config.svelte.d.ts +0 -9
  73. package/esm/svelte/FF_Form.svelte +0 -155
  74. package/esm/svelte/FF_Form.svelte.d.ts +0 -37
  75. package/esm/svelte/FF_Grid.svelte +0 -257
  76. package/esm/svelte/FF_Grid.svelte.d.ts +0 -37
  77. package/esm/svelte/FF_Layout.svelte +0 -62
  78. package/esm/svelte/FF_Layout.svelte.d.ts +0 -31
  79. package/esm/svelte/actions/intersection.d.ts +0 -6
  80. package/esm/svelte/actions/intersection.js +0 -17
  81. package/esm/svelte/customField.d.ts +0 -69
  82. package/esm/svelte/customField.js +0 -4
  83. package/esm/svelte/dialog/DialogManagement.svelte +0 -98
  84. package/esm/svelte/dialog/DialogManagement.svelte.d.ts +0 -18
  85. package/esm/svelte/dialog/DialogPrimitive.svelte +0 -156
  86. package/esm/svelte/dialog/DialogPrimitive.svelte.d.ts +0 -38
  87. package/esm/svelte/dialog/dialog.d.ts +0 -58
  88. package/esm/svelte/dialog/dialog.js +0 -130
  89. package/esm/svelte/ff_Config.svelte.d.ts +0 -91
  90. package/esm/svelte/ff_Config.svelte.js +0 -111
  91. package/esm/svelte/firstly.css +0 -14
  92. package/esm/svelte/helpers.d.ts +0 -30
  93. package/esm/svelte/helpers.js +0 -38
  94. package/esm/svelte/tryCatch.d.ts +0 -12
  95. package/esm/svelte/tryCatch.js +0 -18
  96. package/esm/sveltekit/server/index.d.ts +0 -5
  97. package/esm/sveltekit/server/index.js +0 -24
  98. package/esm/ui/Button.svelte +0 -90
  99. package/esm/ui/Button.svelte.d.ts +0 -11
  100. package/esm/ui/Clipboardable.svelte +0 -25
  101. package/esm/ui/Clipboardable.svelte.d.ts +0 -12
  102. package/esm/ui/Field.svelte +0 -391
  103. package/esm/ui/Field.svelte.d.ts +0 -40
  104. package/esm/ui/FieldGroup.svelte +0 -117
  105. package/esm/ui/FieldGroup.svelte.d.ts +0 -44
  106. package/esm/ui/Grid.svelte +0 -262
  107. package/esm/ui/Grid.svelte.d.ts +0 -57
  108. package/esm/ui/Grid2.svelte +0 -290
  109. package/esm/ui/Grid2.svelte.d.ts +0 -57
  110. package/esm/ui/GridLoading.svelte +0 -58
  111. package/esm/ui/GridLoading.svelte.d.ts +0 -23
  112. package/esm/ui/GridPaginate.svelte +0 -69
  113. package/esm/ui/GridPaginate.svelte.d.ts +0 -23
  114. package/esm/ui/GridPaginate2.svelte +0 -25
  115. package/esm/ui/GridPaginate2.svelte.d.ts +0 -7
  116. package/esm/ui/Loading.svelte +0 -16
  117. package/esm/ui/Loading.svelte.d.ts +0 -31
  118. package/esm/ui/Tooltip.svelte +0 -45
  119. package/esm/ui/Tooltip.svelte.d.ts +0 -32
  120. package/esm/ui/dialog/DialogForm.svelte +0 -76
  121. package/esm/ui/dialog/DialogForm.svelte.d.ts +0 -21
  122. package/esm/ui/dialog/DialogManagement.svelte +0 -96
  123. package/esm/ui/dialog/DialogManagement.svelte.d.ts +0 -26
  124. package/esm/ui/dialog/DialogPrimitive.svelte +0 -90
  125. package/esm/ui/dialog/DialogPrimitive.svelte.d.ts +0 -38
  126. package/esm/ui/dialog/FormEditAction.svelte +0 -62
  127. package/esm/ui/dialog/FormEditAction.svelte.d.ts +0 -31
  128. package/esm/ui/dialog/dialog.d.ts +0 -60
  129. package/esm/ui/dialog/dialog.js +0 -100
  130. package/esm/ui/index.d.ts +0 -6
  131. package/esm/ui/index.js +0 -20
  132. package/esm/ui/internals/FieldContainer.svelte +0 -39
  133. package/esm/ui/internals/FieldContainer.svelte.d.ts +0 -18
  134. package/esm/ui/internals/Input.svelte +0 -143
  135. package/esm/ui/internals/Input.svelte.d.ts +0 -37
  136. package/esm/ui/internals/Textarea.svelte +0 -66
  137. package/esm/ui/internals/Textarea.svelte.d.ts +0 -33
  138. package/esm/ui/internals/select/MultiSelectMelt.svelte +0 -260
  139. package/esm/ui/internals/select/MultiSelectMelt.svelte.d.ts +0 -32
  140. package/esm/ui/internals/select/Select2.svelte +0 -88
  141. package/esm/ui/internals/select/Select2.svelte.d.ts +0 -12
  142. package/esm/ui/internals/select/SelectMelt.svelte +0 -289
  143. package/esm/ui/internals/select/SelectMelt.svelte.d.ts +0 -40
  144. package/esm/ui/internals/select/SelectRadio.svelte +0 -43
  145. package/esm/ui/internals/select/SelectRadio.svelte.d.ts +0 -27
  146. package/esm/ui/link/Link.svelte +0 -33
  147. package/esm/ui/link/Link.svelte.d.ts +0 -33
  148. package/esm/ui/link/LinkPlus.svelte +0 -63
  149. package/esm/ui/link/LinkPlus.svelte.d.ts +0 -9
  150. package/esm/utils/tailwind.d.ts +0 -2
  151. package/esm/utils/tailwind.js +0 -3
  152. package/esm/utils/transition.d.ts +0 -9
  153. package/esm/utils/transition.js +0 -33
  154. /package/esm/{internals → core}/BaseEnum.d.ts +0 -0
  155. /package/esm/{internals → core}/BaseEnum.js +0 -0
  156. /package/esm/{internals → core}/FF_Entity.js +0 -0
  157. /package/esm/{internals → core}/common.d.ts +0 -0
  158. /package/esm/{internals → core}/common.js +0 -0
  159. /package/esm/{utils → core}/types.d.ts +0 -0
  160. /package/esm/{utils → core}/types.js +0 -0
  161. /package/esm/{ui → svelte/ui}/Icon.svelte.d.ts +0 -0
  162. /package/esm/{ui → svelte/ui}/LibIcon.d.ts +0 -0
  163. /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;