firstly 0.3.0 → 0.4.1

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 (177) hide show
  1. package/CHANGELOG.md +60 -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/FF_Allow.d.ts +55 -0
  6. package/esm/core/FF_Allow.js +54 -0
  7. package/esm/core/FF_Filter.d.ts +55 -0
  8. package/esm/core/FF_Filter.js +57 -0
  9. package/esm/core/helper.d.ts +2 -0
  10. package/esm/core/helper.js +3 -0
  11. package/esm/core/index.d.ts +0 -0
  12. package/esm/core/index.js +5 -0
  13. package/esm/core/tailwind.d.ts +21 -0
  14. package/esm/core/tailwind.js +22 -0
  15. package/esm/core/tryCatch.d.ts +44 -0
  16. package/esm/core/tryCatch.js +34 -0
  17. package/esm/cron/server/index.js +1 -1
  18. package/esm/feedback/FeedbackController.js +3 -2
  19. package/esm/feedback/index.d.ts +7 -2
  20. package/esm/feedback/index.js +1 -2
  21. package/esm/feedback/server/index.d.ts +0 -5
  22. package/esm/feedback/server/index.js +1 -1
  23. package/esm/formats/strings.js +2 -2
  24. package/esm/index.d.ts +18 -0
  25. package/esm/index.js +15 -0
  26. package/esm/sqlAdmin/Roles_SqlAdmin.d.ts +3 -0
  27. package/esm/sqlAdmin/Roles_SqlAdmin.js +3 -0
  28. package/esm/sqlAdmin/SqlAdminController.d.ts +9 -0
  29. package/esm/sqlAdmin/SqlAdminController.js +23 -0
  30. package/esm/sqlAdmin/index.d.ts +6 -0
  31. package/esm/sqlAdmin/index.js +6 -0
  32. package/esm/sqlAdmin/server/index.d.ts +40 -0
  33. package/esm/sqlAdmin/server/index.js +40 -0
  34. package/esm/sqlAdmin/ui/SqlAdmin.svelte +146 -0
  35. package/esm/sqlAdmin/ui/SqlAdmin.svelte.d.ts +3 -0
  36. package/esm/svelte/FF_Repo.svelte.d.ts +0 -2
  37. package/esm/svelte/FF_Repo.svelte.js +1 -17
  38. package/esm/svelte/helpers/debounce.js +1 -1
  39. package/esm/svelte/index.d.ts +2 -24
  40. package/esm/svelte/index.js +2 -22
  41. package/esm/{ui → svelte/ui}/Icon.svelte +1 -1
  42. package/esm/virtual/StateDemoEnum.d.ts +3 -3
  43. package/esm/virtual/StateDemoEnum.js +3 -3
  44. package/esm/virtual/UIEntity.js +1 -2
  45. package/package.json +15 -24
  46. package/esm/bin/cmd.d.ts +0 -1
  47. package/esm/bin/cmd.js +0 -638
  48. package/esm/feedback/ui/DialogIssue.svelte +0 -149
  49. package/esm/feedback/ui/DialogIssue.svelte.d.ts +0 -22
  50. package/esm/feedback/ui/DialogIssues.svelte +0 -114
  51. package/esm/feedback/ui/DialogIssues.svelte.d.ts +0 -22
  52. package/esm/feedback/ui/DialogMilestones.svelte +0 -43
  53. package/esm/feedback/ui/DialogMilestones.svelte.d.ts +0 -20
  54. package/esm/feedback/ui/Feedback.svelte +0 -16
  55. package/esm/feedback/ui/Feedback.svelte.d.ts +0 -18
  56. package/esm/internals/FF_Entity.d.ts +0 -2
  57. package/esm/internals/FF_Fields.d.ts +0 -11
  58. package/esm/internals/FF_Fields.js +0 -144
  59. package/esm/internals/cellsBuildor.d.ts +0 -47
  60. package/esm/internals/cellsBuildor.js +0 -141
  61. package/esm/internals/helper.d.ts +0 -49
  62. package/esm/internals/helper.js +0 -162
  63. package/esm/internals/index.d.ts +0 -78
  64. package/esm/internals/index.js +0 -45
  65. package/esm/internals/storeItem.d.ts +0 -19
  66. package/esm/internals/storeItem.js +0 -190
  67. package/esm/internals/storeList.d.ts +0 -34
  68. package/esm/internals/storeList.js +0 -108
  69. package/esm/internals/theme.d.ts +0 -4
  70. package/esm/internals/theme.js +0 -4
  71. package/esm/server/index.d.ts +0 -52
  72. package/esm/server/index.js +0 -87
  73. package/esm/svelte/FF_Cell.svelte +0 -103
  74. package/esm/svelte/FF_Cell.svelte.d.ts +0 -33
  75. package/esm/svelte/FF_Cell_Caption.svelte +0 -20
  76. package/esm/svelte/FF_Cell_Caption.svelte.d.ts +0 -31
  77. package/esm/svelte/FF_Cell_Display.svelte +0 -61
  78. package/esm/svelte/FF_Cell_Display.svelte.d.ts +0 -29
  79. package/esm/svelte/FF_Cell_Edit.svelte +0 -104
  80. package/esm/svelte/FF_Cell_Edit.svelte.d.ts +0 -32
  81. package/esm/svelte/FF_Cell_Error.svelte +0 -20
  82. package/esm/svelte/FF_Cell_Error.svelte.d.ts +0 -31
  83. package/esm/svelte/FF_Cell_Hint.svelte +0 -20
  84. package/esm/svelte/FF_Cell_Hint.svelte.d.ts +0 -31
  85. package/esm/svelte/FF_Config.svelte +0 -29
  86. package/esm/svelte/FF_Config.svelte.d.ts +0 -9
  87. package/esm/svelte/FF_Form.svelte +0 -155
  88. package/esm/svelte/FF_Form.svelte.d.ts +0 -37
  89. package/esm/svelte/FF_Grid.svelte +0 -257
  90. package/esm/svelte/FF_Grid.svelte.d.ts +0 -37
  91. package/esm/svelte/FF_Layout.svelte +0 -62
  92. package/esm/svelte/FF_Layout.svelte.d.ts +0 -31
  93. package/esm/svelte/actions/intersection.d.ts +0 -6
  94. package/esm/svelte/actions/intersection.js +0 -17
  95. package/esm/svelte/customField.d.ts +0 -69
  96. package/esm/svelte/customField.js +0 -4
  97. package/esm/svelte/dialog/DialogManagement.svelte +0 -98
  98. package/esm/svelte/dialog/DialogManagement.svelte.d.ts +0 -18
  99. package/esm/svelte/dialog/DialogPrimitive.svelte +0 -156
  100. package/esm/svelte/dialog/DialogPrimitive.svelte.d.ts +0 -38
  101. package/esm/svelte/dialog/dialog.d.ts +0 -58
  102. package/esm/svelte/dialog/dialog.js +0 -130
  103. package/esm/svelte/ff_Config.svelte.d.ts +0 -91
  104. package/esm/svelte/ff_Config.svelte.js +0 -111
  105. package/esm/svelte/firstly.css +0 -14
  106. package/esm/svelte/helpers.d.ts +0 -30
  107. package/esm/svelte/helpers.js +0 -38
  108. package/esm/svelte/tryCatch.d.ts +0 -12
  109. package/esm/svelte/tryCatch.js +0 -18
  110. package/esm/sveltekit/server/index.d.ts +0 -5
  111. package/esm/sveltekit/server/index.js +0 -24
  112. package/esm/ui/Button.svelte +0 -90
  113. package/esm/ui/Button.svelte.d.ts +0 -11
  114. package/esm/ui/Clipboardable.svelte +0 -25
  115. package/esm/ui/Clipboardable.svelte.d.ts +0 -12
  116. package/esm/ui/Field.svelte +0 -391
  117. package/esm/ui/Field.svelte.d.ts +0 -40
  118. package/esm/ui/FieldGroup.svelte +0 -117
  119. package/esm/ui/FieldGroup.svelte.d.ts +0 -44
  120. package/esm/ui/Grid.svelte +0 -262
  121. package/esm/ui/Grid.svelte.d.ts +0 -57
  122. package/esm/ui/Grid2.svelte +0 -290
  123. package/esm/ui/Grid2.svelte.d.ts +0 -57
  124. package/esm/ui/GridLoading.svelte +0 -58
  125. package/esm/ui/GridLoading.svelte.d.ts +0 -23
  126. package/esm/ui/GridPaginate.svelte +0 -69
  127. package/esm/ui/GridPaginate.svelte.d.ts +0 -23
  128. package/esm/ui/GridPaginate2.svelte +0 -25
  129. package/esm/ui/GridPaginate2.svelte.d.ts +0 -7
  130. package/esm/ui/Loading.svelte +0 -16
  131. package/esm/ui/Loading.svelte.d.ts +0 -31
  132. package/esm/ui/Tooltip.svelte +0 -45
  133. package/esm/ui/Tooltip.svelte.d.ts +0 -32
  134. package/esm/ui/dialog/DialogForm.svelte +0 -76
  135. package/esm/ui/dialog/DialogForm.svelte.d.ts +0 -21
  136. package/esm/ui/dialog/DialogManagement.svelte +0 -96
  137. package/esm/ui/dialog/DialogManagement.svelte.d.ts +0 -26
  138. package/esm/ui/dialog/DialogPrimitive.svelte +0 -90
  139. package/esm/ui/dialog/DialogPrimitive.svelte.d.ts +0 -38
  140. package/esm/ui/dialog/FormEditAction.svelte +0 -62
  141. package/esm/ui/dialog/FormEditAction.svelte.d.ts +0 -31
  142. package/esm/ui/dialog/dialog.d.ts +0 -60
  143. package/esm/ui/dialog/dialog.js +0 -100
  144. package/esm/ui/index.d.ts +0 -6
  145. package/esm/ui/index.js +0 -20
  146. package/esm/ui/internals/FieldContainer.svelte +0 -39
  147. package/esm/ui/internals/FieldContainer.svelte.d.ts +0 -18
  148. package/esm/ui/internals/Input.svelte +0 -143
  149. package/esm/ui/internals/Input.svelte.d.ts +0 -37
  150. package/esm/ui/internals/Textarea.svelte +0 -66
  151. package/esm/ui/internals/Textarea.svelte.d.ts +0 -33
  152. package/esm/ui/internals/select/MultiSelectMelt.svelte +0 -260
  153. package/esm/ui/internals/select/MultiSelectMelt.svelte.d.ts +0 -32
  154. package/esm/ui/internals/select/Select2.svelte +0 -88
  155. package/esm/ui/internals/select/Select2.svelte.d.ts +0 -12
  156. package/esm/ui/internals/select/SelectMelt.svelte +0 -289
  157. package/esm/ui/internals/select/SelectMelt.svelte.d.ts +0 -40
  158. package/esm/ui/internals/select/SelectRadio.svelte +0 -43
  159. package/esm/ui/internals/select/SelectRadio.svelte.d.ts +0 -27
  160. package/esm/ui/link/Link.svelte +0 -33
  161. package/esm/ui/link/Link.svelte.d.ts +0 -33
  162. package/esm/ui/link/LinkPlus.svelte +0 -63
  163. package/esm/ui/link/LinkPlus.svelte.d.ts +0 -9
  164. package/esm/utils/tailwind.d.ts +0 -2
  165. package/esm/utils/tailwind.js +0 -3
  166. package/esm/utils/transition.d.ts +0 -9
  167. package/esm/utils/transition.js +0 -33
  168. /package/esm/{internals → core}/BaseEnum.d.ts +0 -0
  169. /package/esm/{internals → core}/BaseEnum.js +0 -0
  170. /package/esm/{internals → core}/FF_Entity.js +0 -0
  171. /package/esm/{internals → core}/common.d.ts +0 -0
  172. /package/esm/{internals → core}/common.js +0 -0
  173. /package/esm/{utils → core}/types.d.ts +0 -0
  174. /package/esm/{utils → core}/types.js +0 -0
  175. /package/esm/{ui → svelte/ui}/Icon.svelte.d.ts +0 -0
  176. /package/esm/{ui → svelte/ui}/LibIcon.d.ts +0 -0
  177. /package/esm/{ui → svelte/ui}/LibIcon.js +0 -0
@@ -1,262 +0,0 @@
1
- <script lang="ts" generics="T extends Record<any, any>">
2
- import { createEventDispatcher } from 'svelte'
3
-
4
- import type { EntityOrderBy } from 'remult'
5
-
6
- import type { Cell } from '../internals/cellsBuildor.js'
7
- import {
8
- displayWithDefaultAndSuffix,
9
- getEntityDisplayValue,
10
- getEntityDisplayValueFromField,
11
- getFieldLinkDisplayValue,
12
- getFieldMetaType,
13
- } from '../internals/helper.js'
14
- import { LibIcon_Delete, LibIcon_Edit, type StoreList } from '../internals/index.js'
15
- import Button from './Button.svelte'
16
- import Clipboardable from './Clipboardable.svelte'
17
- import GridLoading from './GridLoading.svelte'
18
- import Icon from './Icon.svelte'
19
- import { align, baseTable, getAligns } from './index.js'
20
- import {
21
- LibIcon_Add,
22
- LibIcon_Settings,
23
- LibIcon_Sort,
24
- LibIcon_SortAsc,
25
- LibIcon_SortDesc,
26
- } from './LibIcon.js'
27
- import LinkPlus from './link/LinkPlus.svelte'
28
-
29
- export let cells: Cell<T>[]
30
- export let store: StoreList<T>
31
-
32
- export let withAdd = false
33
- export let withEdit = false
34
- export let withDelete = false
35
-
36
- export let loadingRows = 5
37
-
38
- export let classes = {
39
- // table: 'table-pin-rows table-pin-cols',
40
- table: '',
41
- }
42
- export let orderBy: EntityOrderBy<T> | undefined = undefined
43
- export let orderByCols: (keyof T)[] | true | undefined = undefined
44
-
45
- export let dicoNoResult = 'Aucun résultat !'
46
-
47
- const dispatch = createEventDispatcher()
48
-
49
- const sorting = (toSort: boolean, b: Cell<T>) => {
50
- if (!toSort) {
51
- return
52
- }
53
- if (orderBy === undefined) {
54
- // @ts-ignore
55
- orderBy = { [b.field.key]: 'asc' }
56
- // @ts-ignore
57
- } else if (orderBy[b.field.key] === 'asc') {
58
- // @ts-ignore
59
- orderBy = { [b.field.key]: 'desc' }
60
- // @ts-ignore
61
- } else if (orderBy[b.field.key] === undefined) {
62
- // @ts-ignore
63
- orderBy = { [b.field.key]: 'asc' }
64
- } else {
65
- orderBy = undefined
66
- }
67
- }
68
-
69
- const sortingIcon = (toSort: boolean, b: Cell<T>, _orderBy: EntityOrderBy<T> | undefined) => {
70
- if (!toSort) {
71
- return
72
- }
73
- // @ts-ignore
74
- if (_orderBy && _orderBy[b.field.key] === 'asc') {
75
- return { data: LibIcon_SortAsc, class: 'text-primary' }
76
- }
77
- // @ts-ignore
78
- if (_orderBy && _orderBy[b.field.key] === 'desc') {
79
- return { data: LibIcon_SortDesc, class: 'text-primary' }
80
- }
81
- return { data: LibIcon_Sort }
82
- }
83
-
84
- const cellsToTake = (cells: Cell<T>[]) => {
85
- return cells.filter((c) => c.modeView !== 'hide')
86
- }
87
- </script>
88
-
89
- <div class="overflow-x-auto">
90
- <table class="table {classes.table} {baseTable}">
91
- <thead>
92
- <tr>
93
- {#each cellsToTake(cells) as b, i}
94
- {@const al = align(b.field, b.kind === 'slot')}
95
- <th class={al}>
96
- {#if b.headerSlot}
97
- <slot name="header" field={b.field} />
98
- {:else}
99
- {@const toSort = orderByCols === true || (orderByCols && orderByCols.includes(b.field?.key))}
100
- {#if toSort}
101
- <button
102
- class="flex items-center justify-between gap-2"
103
- disabled={!toSort}
104
- on:click={() => sorting(toSort ?? false, b)}
105
- >
106
- {b.header ?? b.field?.caption}
107
- {#if toSort}
108
- <Icon {...sortingIcon(toSort ?? false, b, orderBy)}></Icon>
109
- {/if}
110
- </button>
111
- {:else}
112
- {b.header ?? b.field?.caption}
113
- {/if}
114
- {/if}
115
- </th>
116
- {/each}
117
-
118
- {#if withEdit || withDelete || withAdd}
119
- <th class="">
120
- <div class="flex justify-end">
121
- {#if withAdd}
122
- <Button
123
- disabled={!store.getRepo().metadata.apiInsertAllowed()}
124
- class="btn btn-square btn-ghost btn-xs"
125
- onclick={() => dispatch('add', {})}
126
- >
127
- <Icon data={LibIcon_Add} />
128
- </Button>
129
- {:else}
130
- <Icon data={LibIcon_Settings}></Icon>
131
- {/if}
132
- </div>
133
- </th>
134
- {/if}
135
- </tr>
136
- </thead>
137
- <tbody>
138
- <!-- Show loading only if there is no items and loading is true, like this on an update, there will be no jump -->
139
- {#if $store.items.length === 0 && $store.loading && store.getRepo().metadata.apiReadAllowed}
140
- <GridLoading columns={getAligns(cells, withEdit || withDelete)} {loadingRows} />
141
- {:else}
142
- {#each $store.items as row}
143
- <tr on:click={() => dispatch('rowclick', row)} class="hover:bg-base-content/20">
144
- {#each cellsToTake(cells) as b}
145
- {@const metaType = getFieldMetaType(b.field)}
146
- <td class={align(b.field, b.kind === 'slot')}>
147
- {#if metaType.kind === 'slot' || b.kind === 'slot'}
148
- <slot name="cell" {row} field={b.field} cell={b} />
149
- {:else if b.kind === 'component'}
150
- {#if b.component}
151
- <div class={b.class}>
152
- <svelte:component
153
- this={b.component}
154
- {...b.props}
155
- {...b.rowToProps ? b.rowToProps(row) : {}}
156
- on:refresh
157
- ></svelte:component>
158
- </div>
159
- {:else}
160
- <pre>Col: {b.col}</pre>
161
- <pre class="bg-error">Component prop needed !</pre>
162
- {/if}
163
- {:else if metaType.kind === 'relation'}
164
- {@const item = getEntityDisplayValue(metaType.repoTarget, row[metaType.field.key])}
165
- <LinkPlus
166
- item={{
167
- ...item,
168
- href: b.field?.options?.href ? b.field?.options.href(row) : item?.href,
169
- }}
170
- />
171
- {:else if b.kind === 'baseItem'}
172
- <LinkPlus item={row[metaType.field.key]} />
173
- {:else if b.kind === 'field_link'}
174
- {@const item = getFieldLinkDisplayValue(metaType.field, row)}
175
- <LinkPlus {item} />
176
- {:else if b.kind === 'entity_link'}
177
- {@const item = getEntityDisplayValueFromField(metaType.field, row)}
178
- <LinkPlus {item} />
179
- {:else if metaType.kind === 'enum'}
180
- {#if metaType.subKind === 'single'}
181
- <LinkPlus item={row[metaType.field.key]}></LinkPlus>
182
- {:else if metaType.subKind === 'multi'}
183
- <!-- {@const t = metaType.field.displayValue(row)} -->
184
- {#each row[metaType.field.key] as enumVal}
185
- <div>
186
- {enumVal.caption}
187
- </div>
188
- {/each}
189
- {/if}
190
- {:else if metaType.subKind === 'checkbox'}
191
- {@const t = metaType.field.displayValue(row)}
192
- {#if t === 'true'}
193
- Oui
194
- {:else if t === 'false'}
195
- Non
196
- {:else}
197
- {t}
198
- {/if}
199
- {:else}
200
- {@const t = displayWithDefaultAndSuffix(metaType.field, row[metaType.field.key])}
201
- {#if b.clipboardable}
202
- <Clipboardable value={t}>
203
- <!-- 20 is a cool value ! -->
204
- <span class={t.length < 20 ? 'text-nowrap' : ''}>
205
- {@html t}
206
- </span>
207
- </Clipboardable>
208
- {:else}
209
- <!-- 20 is a cool value ! -->
210
- <span class={t.length < 20 ? 'text-nowrap' : ''}>
211
- {@html t}
212
- </span>
213
- {/if}
214
- {/if}
215
- </td>
216
- {/each}
217
-
218
- {#if withEdit || withDelete}
219
- <td class="text-right">
220
- <div class="flex justify-end gap-2">
221
- {#if withEdit}
222
- <Button
223
- disabled={!store.getRepo().metadata.apiUpdateAllowed()}
224
- class="btn btn-square btn-ghost btn-xs"
225
- onclick={() => dispatch('edit', row)}
226
- >
227
- <Icon data={LibIcon_Edit} />
228
- </Button>
229
- {/if}
230
- {#if withDelete}
231
- <Button
232
- disabled={!store.getRepo().metadata.apiDeleteAllowed()}
233
- class="btn btn-square btn-ghost btn-xs"
234
- onclick={() => dispatch('delete', row)}
235
- >
236
- <Icon data={LibIcon_Delete} />
237
- </Button>
238
- {/if}
239
- </div>
240
- </td>
241
- {/if}
242
- </tr>
243
- {:else}
244
- {#if !store.getRepo().metadata.apiReadAllowed}
245
- <tr>
246
- <td colspan={getAligns(cells, withEdit || withDelete).length} class="text-center py-12">
247
- Vous n'avez pas la permission pour ces données!
248
- </td>
249
- </tr>
250
- {:else if dicoNoResult}
251
- <tr>
252
- <td colspan={getAligns(cells, withEdit || withDelete).length} class="text-center py-12">
253
- {dicoNoResult}
254
- </td>
255
- </tr>
256
- {/if}
257
- {/each}
258
- <slot name="extra" />
259
- {/if}
260
- </tbody>
261
- </table>
262
- </div>
@@ -1,57 +0,0 @@
1
- import type { EntityOrderBy } from 'remult';
2
- import type { Cell } from '../internals/cellsBuildor.js';
3
- import { type StoreList } from '../internals/index.js';
4
- declare class __sveltets_Render<T extends Record<any, any>> {
5
- props(): {
6
- cells: Cell<T>[];
7
- store: StoreList<T>;
8
- withAdd?: boolean;
9
- withEdit?: boolean;
10
- withDelete?: boolean;
11
- loadingRows?: number;
12
- classes?: {
13
- table: string;
14
- } | undefined;
15
- orderBy?: EntityOrderBy<T> | undefined;
16
- orderByCols?: true | (keyof T)[] | undefined;
17
- dicoNoResult?: string;
18
- };
19
- events(): {
20
- refresh: any;
21
- add: CustomEvent<any>;
22
- rowclick: CustomEvent<any>;
23
- edit: CustomEvent<any>;
24
- delete: CustomEvent<any>;
25
- } & {
26
- [evt: string]: CustomEvent<any>;
27
- };
28
- slots(): {
29
- header: {
30
- field: import("remult").FieldMetadata<any, T> | undefined;
31
- };
32
- cell: {
33
- row: T;
34
- field: import("remult").FieldMetadata<any, T> | undefined;
35
- cell: Cell<T>;
36
- };
37
- extra: {};
38
- };
39
- bindings(): string;
40
- exports(): {};
41
- }
42
- interface $$IsomorphicComponent {
43
- new <T extends Record<any, any>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']> & {
44
- children?: any;
45
- }>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
46
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
47
- } & ReturnType<__sveltets_Render<T>['exports']>;
48
- <T extends Record<any, any>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {
49
- $$events?: ReturnType<__sveltets_Render<T>['events']>;
50
- $$slots?: ReturnType<__sveltets_Render<T>['slots']>;
51
- children?: any;
52
- }): ReturnType<__sveltets_Render<T>['exports']>;
53
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
54
- }
55
- declare const Grid: $$IsomorphicComponent;
56
- type Grid<T extends Record<any, any>> = InstanceType<typeof Grid<T>>;
57
- export default Grid;
@@ -1,290 +0,0 @@
1
- <script lang="ts" generics="T extends Record<any, any>">
2
- import { createEventDispatcher } from 'svelte'
3
-
4
- import type { EntityOrderBy } from 'remult'
5
-
6
- import type { Cell } from '../internals/cellsBuildor.js'
7
- import {
8
- displayWithDefaultAndSuffix,
9
- getEntityDisplayValue,
10
- getEntityDisplayValueFromField,
11
- getFieldLinkDisplayValue,
12
- getFieldMetaType,
13
- } from '../internals/helper.js'
14
- import { LibIcon_Delete, LibIcon_Edit } from '../internals/index.js'
15
- import { intersection } from '../svelte/actions/intersection.js'
16
- import type { FF_Repo } from '../svelte/FF_Repo.svelte.js'
17
- import Button from './Button.svelte'
18
- import Clipboardable from './Clipboardable.svelte'
19
- import GridLoading from './GridLoading.svelte'
20
- import Icon from './Icon.svelte'
21
- import { align, baseTable, getAligns } from './index.js'
22
- import {
23
- LibIcon_Add,
24
- LibIcon_Settings,
25
- LibIcon_Sort,
26
- LibIcon_SortAsc,
27
- LibIcon_SortDesc,
28
- } from './LibIcon.js'
29
- import LinkPlus from './link/LinkPlus.svelte'
30
-
31
- export let cells: Cell<T>[]
32
- export let r: FF_Repo<any>
33
-
34
- export let withAdd = false
35
- export let withEdit = false
36
- export let withDelete = false
37
-
38
- export let loadingRows = 5
39
-
40
- export let classes = {
41
- // table: 'table-pin-rows table-pin-cols',
42
- table: '',
43
- }
44
- export let orderBy: EntityOrderBy<T> | undefined = undefined
45
- export let orderByCols: (keyof T)[] | true | undefined = undefined
46
-
47
- export let dicoNoResult = 'Aucun résultat !'
48
-
49
- const dispatch = createEventDispatcher()
50
-
51
- const sorting = (toSort: boolean, b: Cell<T>) => {
52
- if (!toSort) {
53
- return
54
- }
55
- if (orderBy === undefined) {
56
- // @ts-ignore
57
- orderBy = { [b.field.key]: 'asc' }
58
- // @ts-ignore
59
- } else if (orderBy[b.field.key] === 'asc') {
60
- // @ts-ignore
61
- orderBy = { [b.field.key]: 'desc' }
62
- // @ts-ignore
63
- } else if (orderBy[b.field.key] === undefined) {
64
- // @ts-ignore
65
- orderBy = { [b.field.key]: 'asc' }
66
- } else {
67
- orderBy = undefined
68
- }
69
- }
70
-
71
- const sortingIcon = (toSort: boolean, b: Cell<T>, _orderBy: EntityOrderBy<T> | undefined) => {
72
- if (!toSort) {
73
- return
74
- }
75
- // @ts-ignore
76
- if (_orderBy && _orderBy[b.field.key] === 'asc') {
77
- return { data: LibIcon_SortAsc, class: 'text-primary' }
78
- }
79
- // @ts-ignore
80
- if (_orderBy && _orderBy[b.field.key] === 'desc') {
81
- return { data: LibIcon_SortDesc, class: 'text-primary' }
82
- }
83
- return { data: LibIcon_Sort }
84
- }
85
-
86
- const cellsToTake = (cells: Cell<T>[]) => {
87
- return cells.filter((c) => c.modeView !== 'hide')
88
- }
89
- </script>
90
-
91
- <div class="overflow-x-auto">
92
- <table class="table {classes.table} {baseTable}">
93
- <thead class="">
94
- <tr class="">
95
- {#each cellsToTake(cells) as b, i}
96
- {@const al = align(b.field, b.kind === 'slot')}
97
- <th class={al}>
98
- {#if b.headerSlot}
99
- <slot name="header" field={b.field} />
100
- {:else}
101
- {@const toSort = orderByCols === true || (orderByCols && orderByCols.includes(b.field?.key))}
102
- {#if toSort}
103
- <button
104
- class="flex items-center justify-between gap-2"
105
- disabled={!toSort}
106
- onclick={() => sorting(toSort ?? false, b)}
107
- >
108
- {b.header ?? b.field?.caption}
109
- {#if toSort}
110
- <Icon {...sortingIcon(toSort ?? false, b, orderBy)}></Icon>
111
- {/if}
112
- </button>
113
- {:else}
114
- {b.header ?? b.field?.caption}
115
- {/if}
116
- {/if}
117
- </th>
118
- {/each}
119
-
120
- {#if withEdit || withDelete || withAdd}
121
- <th class="">
122
- <div class="flex justify-end">
123
- {#if withAdd}
124
- <Button
125
- disabled={!r.metadata.apiInsertAllowed()}
126
- class="btn btn-square btn-ghost btn-xs"
127
- onclick={() => dispatch('add', {})}
128
- >
129
- <Icon data={LibIcon_Add} />
130
- </Button>
131
- {:else}
132
- <Icon data={LibIcon_Settings}></Icon>
133
- {/if}
134
- </div>
135
- </th>
136
- {/if}
137
- </tr>
138
- </thead>
139
- <tbody class="">
140
- {#if r.loading.init && r.metadata.apiReadAllowed}
141
- <GridLoading columns={getAligns(cells, withEdit || withDelete)} {loadingRows} />
142
- {:else}
143
- {#each r.items ?? [] as row}
144
- <tr onclick={() => dispatch('rowclick', row)} class="hover:bg-base-content/20">
145
- {#each cellsToTake(cells) as b}
146
- {@const metaType = getFieldMetaType(b.field)}
147
- <td class={align(b.field, b.kind === 'slot')}>
148
- {#if metaType.kind === 'slot' || b.kind === 'slot'}
149
- <slot name="cell" {row} field={b.field} cell={b} />
150
- {:else if b.kind === 'component'}
151
- {#if b.component}
152
- <div class={b.class}>
153
- <svelte:component
154
- this={b.component}
155
- {...b.props}
156
- {...b.rowToProps ? b.rowToProps(row) : {}}
157
- on:refresh
158
- ></svelte:component>
159
- </div>
160
- {:else if b.componentS5}
161
- {@const Comp = b.componentS5}
162
- <!-- NOT TESTED YET! -->
163
- <div class={b.class}>
164
- <Comp
165
- {...b.props}
166
- {...b.rowToProps ? b.rowToProps(row) : {}}
167
- onrefresh={() => dispatch('refresh')}
168
- />
169
- </div>
170
- {:else}
171
- <pre>Col: {b.col}</pre>
172
- <pre class="bg-error">Component prop needed !</pre>
173
- {/if}
174
- {:else if metaType.kind === 'relation'}
175
- {@const item = getEntityDisplayValue(metaType.repoTarget, row[metaType.field.key])}
176
- <LinkPlus
177
- item={{
178
- ...item,
179
- href: b.field?.options?.href ? b.field?.options.href(row) : item?.href,
180
- }}
181
- />
182
- {:else if b.kind === 'baseItem'}
183
- <LinkPlus item={row[metaType.field.key]} />
184
- {:else if b.kind === 'field_link'}
185
- {@const item = getFieldLinkDisplayValue(metaType.field, row)}
186
- <LinkPlus {item} />
187
- {:else if b.kind === 'entity_link'}
188
- {@const item = getEntityDisplayValueFromField(metaType.field, row)}
189
- <LinkPlus {item} />
190
- {:else if metaType.kind === 'enum'}
191
- {#if metaType.subKind === 'single'}
192
- <LinkPlus item={row[metaType.field.key]}></LinkPlus>
193
- {:else if metaType.subKind === 'multi'}
194
- <!-- {@const t = metaType.field.displayValue(row)} -->
195
- {#each row[metaType.field.key] as enumVal}
196
- <div>
197
- {enumVal.caption}
198
- </div>
199
- {/each}
200
- {/if}
201
- {:else if metaType.subKind === 'checkbox'}
202
- {@const t = metaType.field.displayValue(row)}
203
- {t === 'true' ? 'Oui' : 'Non'}
204
- {:else}
205
- {@const t = displayWithDefaultAndSuffix(metaType.field, row[metaType.field.key])}
206
- {#if b.clipboardable}
207
- <Clipboardable value={t}>
208
- <!-- 20 is a cool value ! -->
209
- <span class={t.length < 20 ? 'text-nowrap' : ''}>
210
- {t}
211
- </span>
212
- </Clipboardable>
213
- {:else}
214
- <!-- 20 is a cool value ! -->
215
- <span class={t.length < 20 ? 'text-nowrap' : ''}>
216
- {t}
217
- </span>
218
- {/if}
219
- {/if}
220
- </td>
221
- {/each}
222
-
223
- {#if withEdit || withDelete}
224
- <td class="text-right">
225
- <div class="flex justify-end gap-2">
226
- {#if withEdit}
227
- <Button
228
- disabled={!r.metadata.apiUpdateAllowed(row)}
229
- class="btn btn-square btn-ghost btn-xs"
230
- onclick={() => dispatch('edit', row)}
231
- >
232
- <Icon data={LibIcon_Edit} />
233
- </Button>
234
- {/if}
235
- {#if withDelete}
236
- <Button
237
- disabled={!r.metadata.apiDeleteAllowed()}
238
- class="btn btn-square btn-ghost btn-xs"
239
- onclick={() => dispatch('delete', row)}
240
- >
241
- <Icon data={LibIcon_Delete} />
242
- </Button>
243
- {/if}
244
- </div>
245
- </td>
246
- {/if}
247
- </tr>
248
- {:else}
249
- {#if !r.metadata.apiReadAllowed}
250
- <tr>
251
- <td colspan={getAligns(cells, withEdit || withDelete).length} class="text-center py-12">
252
- Vous n'avez pas la permission pour ces données!
253
- </td>
254
- </tr>
255
- {:else if dicoNoResult}
256
- <tr>
257
- <td colspan={getAligns(cells, withEdit || withDelete).length} class="text-center py-12">
258
- {dicoNoResult}
259
- </td>
260
- </tr>
261
- {/if}
262
- {/each}
263
- {#if r.loading.more}
264
- <GridLoading columns={getAligns(cells, withEdit || withDelete)} {loadingRows} />
265
- {/if}
266
- <slot name="extra" />
267
- {/if}
268
- </tbody>
269
- </table>
270
-
271
- {#if r.hasNextPage}
272
- <div
273
- use:intersection={{ rootMargin: '177px' }}
274
- onintersecting={() => {
275
- // console.info('intersecting')
276
- // if (r.hasNextPage) {
277
- // r.queryMore()
278
- // }
279
- }}
280
- class="mt-2 flex justify-end"
281
- >
282
- <Button
283
- class={r.loading.more ? 'btn-disabled' : 'btn-primary'}
284
- onclick={() => {
285
- r.queryMore()
286
- }}>Plus</Button
287
- >
288
- </div>
289
- {/if}
290
- </div>
@@ -1,57 +0,0 @@
1
- import type { EntityOrderBy } from 'remult';
2
- import type { Cell } from '../internals/cellsBuildor.js';
3
- import type { FF_Repo } from '../svelte/FF_Repo.svelte.js';
4
- declare class __sveltets_Render<T extends Record<any, any>> {
5
- props(): {
6
- cells: Cell<T>[];
7
- r: FF_Repo<any>;
8
- withAdd?: boolean;
9
- withEdit?: boolean;
10
- withDelete?: boolean;
11
- loadingRows?: number;
12
- classes?: {
13
- table: string;
14
- } | undefined;
15
- orderBy?: EntityOrderBy<T> | undefined;
16
- orderByCols?: true | (keyof T)[] | undefined;
17
- dicoNoResult?: string;
18
- };
19
- events(): {
20
- refresh: CustomEvent<any>;
21
- add: CustomEvent<any>;
22
- rowclick: CustomEvent<any>;
23
- edit: CustomEvent<any>;
24
- delete: CustomEvent<any>;
25
- } & {
26
- [evt: string]: CustomEvent<any>;
27
- };
28
- slots(): {
29
- header: {
30
- field: import("remult").FieldMetadata<any, T> | undefined;
31
- };
32
- cell: {
33
- row: any;
34
- field: import("remult").FieldMetadata<any, T> | undefined;
35
- cell: Cell<T>;
36
- };
37
- extra: {};
38
- };
39
- bindings(): string;
40
- exports(): {};
41
- }
42
- interface $$IsomorphicComponent {
43
- new <T extends Record<any, any>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']> & {
44
- children?: any;
45
- }>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
46
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
47
- } & ReturnType<__sveltets_Render<T>['exports']>;
48
- <T extends Record<any, any>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {
49
- $$events?: ReturnType<__sveltets_Render<T>['events']>;
50
- $$slots?: ReturnType<__sveltets_Render<T>['slots']>;
51
- children?: any;
52
- }): ReturnType<__sveltets_Render<T>['exports']>;
53
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
54
- }
55
- declare const Grid2: $$IsomorphicComponent;
56
- type Grid2<T extends Record<any, any>> = InstanceType<typeof Grid2<T>>;
57
- export default Grid2;