firstly 0.0.1 → 0.0.3

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 (156) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +18 -0
  3. package/README.md +12 -0
  4. package/esm/KitBaseEnum.d.ts +35 -0
  5. package/esm/KitBaseEnum.js +32 -0
  6. package/esm/KitEntity.d.ts +2 -0
  7. package/esm/KitEntity.js +24 -0
  8. package/esm/KitFields.d.ts +10 -0
  9. package/esm/KitFields.js +196 -0
  10. package/esm/ROUTES.d.ts +88 -0
  11. package/esm/ROUTES.js +98 -0
  12. package/esm/SqlDatabase/LogToConsoleCustom.d.ts +1 -0
  13. package/esm/SqlDatabase/LogToConsoleCustom.js +102 -0
  14. package/esm/api/index.d.ts +42 -0
  15. package/esm/api/index.js +97 -0
  16. package/esm/auth/Adapter.d.ts +10 -0
  17. package/esm/auth/Adapter.js +54 -0
  18. package/esm/auth/AuthController.d.ts +59 -0
  19. package/esm/auth/AuthController.js +434 -0
  20. package/esm/auth/Entities.d.ts +39 -0
  21. package/esm/auth/Entities.js +154 -0
  22. package/esm/auth/RoleController.d.ts +14 -0
  23. package/esm/auth/RoleController.js +57 -0
  24. package/esm/auth/helper.d.ts +1 -0
  25. package/esm/auth/helper.js +7 -0
  26. package/esm/auth/index.d.ts +153 -0
  27. package/esm/auth/index.js +280 -0
  28. package/esm/auth/providers/github.d.ts +25 -0
  29. package/esm/auth/providers/github.js +51 -0
  30. package/esm/auth/providers/index.d.ts +3 -0
  31. package/esm/auth/providers/index.js +26 -0
  32. package/esm/auth/providers/strava.d.ts +25 -0
  33. package/esm/auth/providers/strava.js +51 -0
  34. package/esm/auth/static/assets/Page-BMFREPjF.d.ts +5 -0
  35. package/esm/auth/static/assets/Page-BMFREPjF.js +18 -0
  36. package/esm/auth/static/assets/Page-BMOLAIFx.d.ts +5 -0
  37. package/esm/auth/static/assets/Page-BMOLAIFx.js +1 -0
  38. package/esm/auth/static/assets/Page-BwHye0GW.d.ts +5 -0
  39. package/esm/auth/static/assets/Page-BwHye0GW.js +1 -0
  40. package/esm/auth/static/assets/Page-gV58jf2r.css +1 -0
  41. package/esm/auth/static/assets/index-CKmKKRRL.d.ts +53 -0
  42. package/esm/auth/static/assets/index-CKmKKRRL.js +2 -0
  43. package/esm/auth/static/assets/index-R27C_TlP.css +4 -0
  44. package/esm/auth/static/favicon.svg +79 -0
  45. package/esm/auth/static/index.html +14 -0
  46. package/esm/auth/types.d.ts +33 -0
  47. package/esm/auth/types.js +1 -0
  48. package/esm/bin/cmd.d.ts +1 -0
  49. package/esm/bin/cmd.js +418 -0
  50. package/esm/changeLog/index.d.ts +55 -0
  51. package/esm/changeLog/index.js +179 -0
  52. package/esm/cron/index.d.ts +60 -0
  53. package/esm/cron/index.js +102 -0
  54. package/esm/feedback/FeedbackController.d.ts +30 -0
  55. package/esm/feedback/FeedbackController.js +313 -0
  56. package/esm/feedback/index.d.ts +18 -0
  57. package/esm/feedback/index.js +14 -0
  58. package/esm/feedback/ui/DialogIssue.svelte +102 -0
  59. package/esm/feedback/ui/DialogIssue.svelte.d.ts +20 -0
  60. package/esm/feedback/ui/DialogIssues.svelte +91 -0
  61. package/esm/feedback/ui/DialogIssues.svelte.d.ts +20 -0
  62. package/esm/feedback/ui/DialogMilestones.svelte +38 -0
  63. package/esm/feedback/ui/DialogMilestones.svelte.d.ts +18 -0
  64. package/esm/feedback/ui/Feedback.svelte +12 -0
  65. package/esm/feedback/ui/Feedback.svelte.d.ts +16 -0
  66. package/esm/formats/dates.d.ts +18 -0
  67. package/esm/formats/dates.js +35 -0
  68. package/esm/formats/index.d.ts +4 -0
  69. package/esm/formats/index.js +3 -0
  70. package/esm/formats/numbers.d.ts +4 -0
  71. package/esm/formats/numbers.js +34 -0
  72. package/esm/formats/strings.d.ts +11 -0
  73. package/esm/formats/strings.js +109 -0
  74. package/esm/handle/index.d.ts +7 -0
  75. package/esm/handle/index.js +40 -0
  76. package/esm/helper.d.ts +50 -0
  77. package/esm/helper.js +118 -0
  78. package/esm/index.d.ts +103 -0
  79. package/esm/index.js +42 -0
  80. package/esm/kitCellsBuildor.d.ts +45 -0
  81. package/esm/kitCellsBuildor.js +105 -0
  82. package/esm/kitStoreItem.d.ts +28 -0
  83. package/esm/kitStoreItem.js +170 -0
  84. package/esm/kitStoreList.d.ts +33 -0
  85. package/esm/kitStoreList.js +98 -0
  86. package/esm/mail/index.d.ts +11 -0
  87. package/esm/mail/index.js +51 -0
  88. package/esm/theme.d.ts +4 -0
  89. package/esm/theme.js +4 -0
  90. package/esm/ui/Button.svelte +102 -0
  91. package/esm/ui/Button.svelte.d.ts +27 -0
  92. package/esm/ui/Clipboardable.svelte +19 -0
  93. package/esm/ui/Clipboardable.svelte.d.ts +25 -0
  94. package/esm/ui/Field.svelte +288 -0
  95. package/esm/ui/Field.svelte.d.ts +29 -0
  96. package/esm/ui/FieldGroup.svelte +91 -0
  97. package/esm/ui/FieldGroup.svelte.d.ts +30 -0
  98. package/esm/ui/Grid.svelte +246 -0
  99. package/esm/ui/Grid.svelte.d.ts +46 -0
  100. package/esm/ui/GridLoading.svelte +32 -0
  101. package/esm/ui/GridLoading.svelte.d.ts +20 -0
  102. package/esm/ui/GridPaginate.svelte +66 -0
  103. package/esm/ui/GridPaginate.svelte.d.ts +22 -0
  104. package/esm/ui/Icon.svelte +86 -0
  105. package/esm/ui/Icon.svelte.d.ts +46 -0
  106. package/esm/ui/LibIcon.d.ts +23 -0
  107. package/esm/ui/LibIcon.js +28 -0
  108. package/esm/ui/Loading.svelte +11 -0
  109. package/esm/ui/Loading.svelte.d.ts +20 -0
  110. package/esm/ui/Tooltip.svelte +42 -0
  111. package/esm/ui/Tooltip.svelte.d.ts +22 -0
  112. package/esm/ui/dialog/DialogForm.svelte +70 -0
  113. package/esm/ui/dialog/DialogForm.svelte.d.ts +19 -0
  114. package/esm/ui/dialog/DialogManagement.svelte +87 -0
  115. package/esm/ui/dialog/DialogManagement.svelte.d.ts +25 -0
  116. package/esm/ui/dialog/DialogPrimitive.svelte +89 -0
  117. package/esm/ui/dialog/DialogPrimitive.svelte.d.ts +28 -0
  118. package/esm/ui/dialog/FormEditAction.svelte +54 -0
  119. package/esm/ui/dialog/FormEditAction.svelte.d.ts +24 -0
  120. package/esm/ui/dialog/dialog.d.ts +51 -0
  121. package/esm/ui/dialog/dialog.js +98 -0
  122. package/esm/ui/index.d.ts +5 -0
  123. package/esm/ui/index.js +19 -0
  124. package/esm/ui/internals/FieldContainer.svelte +22 -0
  125. package/esm/ui/internals/FieldContainer.svelte.d.ts +30 -0
  126. package/esm/ui/internals/Input.svelte +98 -0
  127. package/esm/ui/internals/Input.svelte.d.ts +35 -0
  128. package/esm/ui/internals/Textarea.svelte +61 -0
  129. package/esm/ui/internals/Textarea.svelte.d.ts +30 -0
  130. package/esm/ui/internals/select/MultiSelectMelt.svelte +217 -0
  131. package/esm/ui/internals/select/MultiSelectMelt.svelte.d.ts +30 -0
  132. package/esm/ui/internals/select/SelectMelt.svelte +238 -0
  133. package/esm/ui/internals/select/SelectMelt.svelte.d.ts +35 -0
  134. package/esm/ui/internals/select/SelectRadio.svelte +37 -0
  135. package/esm/ui/internals/select/SelectRadio.svelte.d.ts +25 -0
  136. package/esm/ui/link/Link.svelte +28 -0
  137. package/esm/ui/link/Link.svelte.d.ts +25 -0
  138. package/esm/ui/link/LinkPlus.svelte +44 -0
  139. package/esm/ui/link/LinkPlus.svelte.d.ts +21 -0
  140. package/esm/utils/tailwind.d.ts +2 -0
  141. package/esm/utils/tailwind.js +3 -0
  142. package/esm/utils/transition.d.ts +10 -0
  143. package/esm/utils/transition.js +33 -0
  144. package/esm/utils/types.d.ts +17 -0
  145. package/esm/utils/types.js +17 -0
  146. package/esm/virtual/Customer.d.ts +4 -0
  147. package/esm/virtual/Customer.js +24 -0
  148. package/esm/virtual/FilterEntity.d.ts +7 -0
  149. package/esm/virtual/FilterEntity.js +34 -0
  150. package/esm/virtual/StateDemoEnum.d.ts +9 -0
  151. package/esm/virtual/StateDemoEnum.js +42 -0
  152. package/esm/virtual/UIEntity.d.ts +16 -0
  153. package/esm/virtual/UIEntity.js +84 -0
  154. package/esm/vite/index.d.ts +8 -0
  155. package/esm/vite/index.js +47 -0
  156. package/package.json +94 -10
@@ -0,0 +1,102 @@
1
+ <script>import { createTooltip } from "@melt-ui/svelte";
2
+ import { fade, fly } from "svelte/transition";
3
+ import { remult } from "remult";
4
+ import { KitBaseEnum, tw } from "../";
5
+ export let isLoading = false;
6
+ let className = void 0;
7
+ export { className as class };
8
+ export let permission = void 0;
9
+ let permissionDisabled = false;
10
+ $:
11
+ disabled = $$restProps.disabled || permissionDisabled || isLoading;
12
+ let triggerAnnimation = false;
13
+ $:
14
+ isLoading && setTimeout(() => {
15
+ if (isLoading) {
16
+ triggerAnnimation = true;
17
+ }
18
+ }, 200);
19
+ let updates = (param) => {
20
+ if (param && param.permission) {
21
+ permissionDisabled = !remult.isAllowed(
22
+ Array.isArray(param.permission) ? param.permission.map((c) => c.id) : param.permission.id
23
+ );
24
+ if (permissionDisabled) {
25
+ disabledWhy = `Vous n'avez pas la permission: ${Array.isArray(param.permission) ? param.permission.map((c) => `"${c.caption}"`).join(" ou ") : `"${param.permission.caption}"`}`;
26
+ } else {
27
+ disabledWhy = "";
28
+ }
29
+ } else {
30
+ permissionDisabled = false;
31
+ disabledWhy = "";
32
+ }
33
+ };
34
+ let disabledWhy = "";
35
+ const isAllowed = (node, param) => {
36
+ updates(param);
37
+ return {
38
+ update(param2) {
39
+ updates(param2);
40
+ },
41
+ destroy() {
42
+ }
43
+ };
44
+ };
45
+ const {
46
+ elements: { trigger, content, arrow },
47
+ states: { open }
48
+ } = createTooltip({
49
+ positioning: {
50
+ placement: "top"
51
+ },
52
+ openDelay: 0,
53
+ closeDelay: 0,
54
+ closeOnPointerDown: false,
55
+ forceVisible: true,
56
+ escapeBehavior: "close",
57
+ group: true
58
+ });
59
+ </script>
60
+
61
+ <button
62
+ {...$trigger}
63
+ use:trigger
64
+ use:isAllowed={{ permission }}
65
+ on:click
66
+ {...$$restProps}
67
+ class={tw(['btn text-white', disabled ? '' : 'btn-primary', className])}
68
+ {disabled}
69
+ >
70
+ <!-- btn-outline -->
71
+ <slot />
72
+ {#if triggerAnnimation && isLoading}
73
+ <div in:fly={{ x: -20 }}>
74
+ <span class="loading loading-spinner"></span>
75
+ </div>
76
+ {/if}
77
+ </button>
78
+
79
+ {#if $open && (disabledWhy || $$slots.tooltip)}
80
+ <div
81
+ {...$content}
82
+ use:content
83
+ transition:fade={{ duration: 100 }}
84
+ class="bg-base-300 z-30 rounded-lg ring-1 ring-black"
85
+ >
86
+ <div {...$arrow} use:arrow />
87
+ <div class="px-4 py-1">
88
+ {#if $$slots.tooltip}
89
+ <slot name="tooltip" />
90
+ {:else}
91
+ {disabledWhy}
92
+ {/if}
93
+ </div>
94
+ </div>
95
+ {/if}
96
+
97
+ <style>
98
+ .btn[disabled] {
99
+ pointer-events: all;
100
+ cursor: not-allowed;
101
+ }
102
+ </style>
@@ -0,0 +1,27 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import { KitBaseEnum } from '../';
3
+ declare const __propDef: {
4
+ props: {
5
+ [x: string]: any;
6
+ isLoading?: boolean | undefined;
7
+ class?: string | undefined | null;
8
+ permission?: KitBaseEnum[] | KitBaseEnum | undefined;
9
+ };
10
+ events: {
11
+ click: MouseEvent;
12
+ } & {
13
+ [evt: string]: CustomEvent<any>;
14
+ };
15
+ slots: {
16
+ default: {};
17
+ tooltip: {};
18
+ };
19
+ exports?: undefined;
20
+ bindings?: undefined;
21
+ };
22
+ export type ButtonProps = typeof __propDef.props;
23
+ export type ButtonEvents = typeof __propDef.events;
24
+ export type ButtonSlots = typeof __propDef.slots;
25
+ export default class Button extends SvelteComponent<ButtonProps, ButtonEvents, ButtonSlots> {
26
+ }
27
+ export {};
@@ -0,0 +1,19 @@
1
+ <script>export let value;
2
+ export { extraClass as class };
3
+ let extraClass = "";
4
+ function clip(_value) {
5
+ if (_value) {
6
+ navigator.clipboard.writeText(_value);
7
+ }
8
+ }
9
+ </script>
10
+
11
+ <span
12
+ role="button"
13
+ tabindex="0"
14
+ on:keyup={() => {}}
15
+ on:click={() => clip(value)}
16
+ class={`${value ? 'cursor-copy' : ''} ${extraClass}`}
17
+ >
18
+ <slot />
19
+ </span>
@@ -0,0 +1,25 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ /**
5
+ * @param value to set in the clipboard if not null.
6
+ *
7
+ * Don't put this on an input, if not, when a user will select the input via the mouse, this clipboard will be copied (usually you wanted to paste)!
8
+ */ value: string | null;
9
+ class?: string | undefined;
10
+ };
11
+ events: {
12
+ [evt: string]: CustomEvent<any>;
13
+ };
14
+ slots: {
15
+ default: {};
16
+ };
17
+ exports?: {} | undefined;
18
+ bindings?: string | undefined;
19
+ };
20
+ export type ClipboardableProps = typeof __propDef.props;
21
+ export type ClipboardableEvents = typeof __propDef.events;
22
+ export type ClipboardableSlots = typeof __propDef.slots;
23
+ export default class Clipboardable extends SvelteComponent<ClipboardableProps, ClipboardableEvents, ClipboardableSlots> {
24
+ }
25
+ export {};
@@ -0,0 +1,288 @@
1
+ <script generics="T extends Record<any, any>">import { createEventDispatcher } from "svelte";
2
+ import {} from "remult";
3
+ import {} from "../";
4
+ import { suffixWithS } from "../formats/strings";
5
+ import {
6
+ displayWithDefaultAndSuffix,
7
+ getEntityDisplayValue,
8
+ getFieldMetaType,
9
+ getFirstInterestingField
10
+ } from "../helper.js";
11
+ import { tw } from "../utils/tailwind";
12
+ import Clipboardable from "./Clipboardable.svelte";
13
+ import Icon from "./Icon.svelte";
14
+ import FieldContainer from "./internals/FieldContainer.svelte";
15
+ import Input from "./internals/Input.svelte";
16
+ import MultiSelectMelt from "./internals/select/MultiSelectMelt.svelte";
17
+ import SelectMelt from "./internals/select/SelectMelt.svelte";
18
+ import SelectRadio from "./internals/select/SelectRadio.svelte";
19
+ import Textarea from "./internals/Textarea.svelte";
20
+ export let cell;
21
+ export let value = void 0;
22
+ export let cellsValues = {};
23
+ export let withDedounce = false;
24
+ export let error = "";
25
+ export let mode = "edit";
26
+ export let focus = false;
27
+ export let clearable = void 0;
28
+ export let disabled = false;
29
+ const dispatch = createEventDispatcher();
30
+ function dispatchSelected(_data) {
31
+ value = _data;
32
+ dispatch("selected", _data);
33
+ }
34
+ $:
35
+ metaType = getFieldMetaType(cell.field);
36
+ const isViewMode = (_mode, _field) => {
37
+ return _mode === "view" || _field?.dbReadOnly || _field?.options.allowApiUpdate === false;
38
+ };
39
+ const common = (_field, isLight = false) => {
40
+ let toRet = {
41
+ id: _field?.key ?? "SOMETHING_AT_LEAST",
42
+ disabled: _field?.dbReadOnly || _field?.options.allowApiUpdate === false || disabled,
43
+ placeholder: _field?.options?.placeholder ?? void 0
44
+ };
45
+ if (isLight) {
46
+ return toRet;
47
+ }
48
+ return {
49
+ ...toRet,
50
+ step: _field?.options?.step ?? void 0,
51
+ name: _field?.key
52
+ // required: _field?.allowNull === false,
53
+ };
54
+ };
55
+ const toInput = (_metadata, _value) => {
56
+ try {
57
+ return _metadata?.valueConverter.toInput(_value, metaType.subKind);
58
+ } catch (error2) {
59
+ console.error(`error toInput w field '${_metadata?.key}'`, error2);
60
+ }
61
+ };
62
+ const fromInput = (_metadata, _value) => {
63
+ try {
64
+ if (metaType.subKind === "number" && _value === 0) {
65
+ return 0;
66
+ }
67
+ const val = _metadata?.valueConverter.fromInput(_value, metaType.subKind);
68
+ return val;
69
+ } catch (error2) {
70
+ console.error(`error fromInput w field '${_metadata.key}'`, error2);
71
+ }
72
+ };
73
+ const getId = () => {
74
+ return value?.id || value;
75
+ };
76
+ const getLoadOptions = async (cellsValues2, str) => {
77
+ if (metaType.kind !== "relation") {
78
+ return { items: [], totalCount: 0 };
79
+ }
80
+ const metaTypeObj = { ...metaType };
81
+ let findToUse = {};
82
+ if (metaTypeObj.repoTarget.metadata.options.searchableFind) {
83
+ findToUse = metaTypeObj.repoTarget.metadata.options.searchableFind(str);
84
+ } else {
85
+ if (str) {
86
+ const field = getFirstInterestingField(metaTypeObj.repoTarget);
87
+ findToUse = { where: { [field.key]: { $contains: str } } };
88
+ }
89
+ }
90
+ const foEdit = cell.field?.options.findOptionsForEdit;
91
+ const narrowFindEditWhere = typeof foEdit === "function" ? foEdit(cellsValues2).where ?? {} : typeof foEdit === "object" ? foEdit.where ?? {} : {};
92
+ const foCrud = cell.field?.options.findOptions;
93
+ const narrowFindCrudWhere = typeof foCrud === "function" ? foCrud().where ?? {} : typeof foCrud === "object" ? foCrud.where ?? {} : {};
94
+ findToUse = {
95
+ include: { ...findToUse.include ?? {} },
96
+ where: { $and: [findToUse.where, narrowFindEditWhere, narrowFindCrudWhere] }
97
+ };
98
+ let limit = cell.field?.options.findOptionsLimit ?? 24;
99
+ const arr = [];
100
+ arr.push(
101
+ ...await metaTypeObj.repoTarget.find({
102
+ ...findToUse,
103
+ limit
104
+ })
105
+ );
106
+ let totalCount = arr.length;
107
+ if (totalCount === limit) {
108
+ totalCount = await metaTypeObj.repoTarget.count(findToUse.where);
109
+ }
110
+ if (!cell.field?.options.multiSelect) {
111
+ if (str === "" && getId() && !arr.find((r) => String(r.id) === String(getId()))) {
112
+ arr.unshift(await metaTypeObj.repoTarget.findId(getId()));
113
+ }
114
+ }
115
+ return { items: arr.map((r) => getEntityDisplayValue(metaTypeObj.repoTarget, r)), totalCount };
116
+ };
117
+ const getMultiValues = (value2) => {
118
+ return (value2 ?? []).map((c) => c.id) || value2;
119
+ };
120
+ const calcSuffix = (value2) => {
121
+ if (cell.field?.options.suffixEdit) {
122
+ if (cell.field?.options.suffixEditWithS) {
123
+ return suffixWithS(value2, cell.field?.options.suffixEdit);
124
+ } else {
125
+ return cell.field?.options.suffixEdit;
126
+ }
127
+ }
128
+ if (cell.field?.options.suffix) {
129
+ if (cell.field?.options.suffixWithS) {
130
+ return suffixWithS(value2, cell.field?.options.suffix);
131
+ } else {
132
+ return cell.field?.options.suffix;
133
+ }
134
+ }
135
+ return "";
136
+ };
137
+ </script>
138
+
139
+ <FieldContainer
140
+ forId={cell.field?.key ?? ''}
141
+ label={cell?.header ?? cell.field?.caption ?? cell.field?.key}
142
+ required={!cell.field?.allowNull && mode === 'edit' && metaType.subKind !== 'checkbox'}
143
+ {error}
144
+ classes={{ slot: metaType.subKind === 'textarea' ? 'h-32 items-start' : '' }}
145
+ >
146
+ {@const clearableComputed =
147
+ cell.clearable || clearable || (mode === 'filtre' && clearable === undefined)}
148
+ {#if isViewMode(mode, cell.field)}
149
+ <span class="input-bordered flex items-center pl-2 pr-4">
150
+ {#if cell.field?.inputType === 'checkbox'}
151
+ <input
152
+ type="checkbox"
153
+ {...common(cell.field)}
154
+ class="checkbox ml-2"
155
+ disabled
156
+ checked={value}
157
+ />
158
+ {:else if metaType.kind === 'relation'}
159
+ {@const item = getEntityDisplayValue(metaType.repoTarget, value)}
160
+ <div class={tw('flex items-center gap-4', 'h-12', 'pl-2')}>
161
+ {#if item && item?.icon}
162
+ <Icon {...item.icon} />
163
+ {/if}
164
+ <span>{cell?.header ?? item?.caption ?? '-'}</span>
165
+ </div>
166
+ {:else if metaType.kind === 'enum'}
167
+ {@const v = displayWithDefaultAndSuffix(cell.field, value)}
168
+ <div class="ml-2 flex h-12 items-center gap-4">
169
+ {#if value?.icon}
170
+ <Icon {...value.icon} />
171
+ {/if}
172
+ <Clipboardable value={v}>{v}</Clipboardable>
173
+ </div>
174
+ {:else}
175
+ {@const v = displayWithDefaultAndSuffix(cell.field, value)}
176
+ <div
177
+ class="ml-2 flex h-12 w-full items-center {metaType.subKind === 'number'
178
+ ? 'justify-end'
179
+ : ''}"
180
+ >
181
+ <Clipboardable value={v}>{v}</Clipboardable>
182
+ </div>
183
+ {/if}
184
+ </span>
185
+ {:else if metaType.kind === 'relation'}
186
+ {#if metaType.field.options.multiSelect}
187
+ <MultiSelectMelt
188
+ {...common(cell.field, true)}
189
+ clearable={clearableComputed}
190
+ loadOptions={async (str) => await getLoadOptions(cellsValues, str)}
191
+ values={value}
192
+ on:selected={(e) => dispatchSelected(e.detail)}
193
+ />
194
+ {:else}
195
+ <!-- {items} -->
196
+ <SelectMelt
197
+ {focus}
198
+ {...common(cell.field, true)}
199
+ clearable={clearableComputed}
200
+ loadOptions={async (str) => await getLoadOptions(cellsValues, str)}
201
+ value={value?.id || value}
202
+ on:selected={(e) => dispatchSelected(e.detail)}
203
+ on:issue={(e) => {
204
+ error = e.detail
205
+ }}
206
+ createOptionWhenNoResult={cell.field?.options.createOptionWhenNoResult}
207
+ on:createRequest
208
+ />
209
+ {/if}
210
+ {:else if metaType.kind === 'enum'}
211
+ {#if metaType.field.options.multiSelect || metaType.subKind === 'multi'}
212
+ <MultiSelectMelt
213
+ {...common(cell.field, true)}
214
+ clearable={clearableComputed}
215
+ items={metaType.values}
216
+ values={getMultiValues(value)}
217
+ on:selected={(e) => {
218
+ dispatchSelected(e.detail)
219
+ }}
220
+ />
221
+ {:else if metaType.values.length <= (cell.field?.options.styleRadioUntil ?? 3) && !clearableComputed}
222
+ <SelectRadio
223
+ {...common(cell.field, true)}
224
+ items={metaType.values}
225
+ value={value?.id || value}
226
+ on:selected={(e) => dispatchSelected(e.detail)}
227
+ />
228
+ {:else}
229
+ <SelectMelt
230
+ {focus}
231
+ {...common(cell.field, true)}
232
+ clearable={clearableComputed}
233
+ items={metaType.values}
234
+ value={value?.id || value}
235
+ on:selected={(e) => dispatchSelected(e.detail)}
236
+ on:issue={(e) => {
237
+ error = e.detail
238
+ }}
239
+ />
240
+ {/if}
241
+ {:else if metaType.subKind === 'checkbox'}
242
+ <div class="grid content-center items-center pl-4">
243
+ <input
244
+ type="checkbox"
245
+ {...{ ...common(cell.field), required: undefined }}
246
+ class="checkbox"
247
+ bind:checked={value}
248
+ />
249
+ </div>
250
+ {:else if metaType.subKind === 'text' || metaType.subKind === 'email' || metaType.subKind === 'password' || metaType.subKind === 'dateOnly' || metaType.subKind === 'number'}
251
+ <div class="input input-bordered inline-flex w-full items-center pl-2">
252
+ <Input
253
+ {focus}
254
+ {...common(cell.field)}
255
+ autocomplete="off"
256
+ class={tw(
257
+ `join-item placeholder:text-base-content/30 w-full bg-transparent`,
258
+ metaType.subKind === 'number' && 'text-end',
259
+ )}
260
+ type={metaType.subKind.replaceAll('dateOnly', 'date')}
261
+ value={toInput(cell.field, value)}
262
+ {withDedounce}
263
+ on:input={(e) => {
264
+ // @ts-ignore
265
+ value = fromInput(cell.field, e.detail.value)
266
+ dispatchSelected(value)
267
+ }}
268
+ {...$$restProps}
269
+ />
270
+ {calcSuffix(value)}
271
+ </div>
272
+ {:else if metaType.subKind === 'textarea'}
273
+ <Textarea
274
+ {focus}
275
+ {...common(cell.field)}
276
+ value={toInput(cell.field, value)}
277
+ on:input={(e) => {
278
+ // @ts-ignore
279
+ value = fromInput(cell.field, e.detail.value)
280
+ }}
281
+ />
282
+ {:else}
283
+ <!-- This shoud NEVER be displayed -->
284
+ <span class="text-error flex items-center pl-2"
285
+ >Type "{cell.field?.inputType}" not managed!</span
286
+ >
287
+ {/if}
288
+ </FieldContainer>
@@ -0,0 +1,29 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import { type KitCell } from '../';
3
+ declare class __sveltets_Render<T extends Record<any, any>> {
4
+ props(): {
5
+ [x: string]: any;
6
+ cell: KitCell<T>;
7
+ value?: any;
8
+ cellsValues?: any;
9
+ withDedounce?: boolean | undefined;
10
+ error?: string | undefined;
11
+ mode?: "view" | "edit" | "filtre" | undefined;
12
+ focus?: boolean | undefined;
13
+ clearable?: boolean | undefined;
14
+ disabled?: boolean | undefined;
15
+ };
16
+ events(): {
17
+ createRequest: CustomEvent<any>;
18
+ selected: CustomEvent<any>;
19
+ } & {
20
+ [evt: string]: CustomEvent<any>;
21
+ };
22
+ slots(): {};
23
+ }
24
+ export type FieldProps<T extends Record<any, any>> = ReturnType<__sveltets_Render<T>['props']>;
25
+ export type FieldEvents<T extends Record<any, any>> = ReturnType<__sveltets_Render<T>['events']>;
26
+ export type FieldSlots<T extends Record<any, any>> = ReturnType<__sveltets_Render<T>['slots']>;
27
+ export default class Field<T extends Record<any, any>> extends SvelteComponent<FieldProps<T>, FieldEvents<T>, FieldSlots<T>> {
28
+ }
29
+ export {};
@@ -0,0 +1,91 @@
1
+ <script generics="T extends Record<any, any>">import { createEventDispatcher } from "svelte";
2
+ import { getRelationFieldInfo } from "remult/internals";
3
+ import { tw } from "..";
4
+ import Field from "./Field.svelte";
5
+ import FieldContainer from "./internals/FieldContainer.svelte";
6
+ import Loading from "./Loading.svelte";
7
+ export let mode = "edit";
8
+ export let cells;
9
+ export let store;
10
+ export let focusKey = null;
11
+ const getError = (errors, field) => {
12
+ const fo = getRelationFieldInfo(field);
13
+ const keyToUse = fo?.options?.field ?? field.key;
14
+ if (errors && errors[keyToUse]) {
15
+ return errors[keyToUse];
16
+ }
17
+ return void 0;
18
+ };
19
+ const shouldHide = (c, mode2) => {
20
+ if (mode2 === "edit" && c.modeEdit === "hide") {
21
+ return true;
22
+ }
23
+ if (mode2 === "view" && c.modeView === "hide") {
24
+ return true;
25
+ }
26
+ return false;
27
+ };
28
+ const modeToUse = (c, mode2) => {
29
+ if (mode2 === "edit" && c.modeEdit === "view") {
30
+ return "view";
31
+ }
32
+ if (mode2 === "view" && c.modeView === "edit") {
33
+ return "edit";
34
+ }
35
+ return mode2;
36
+ };
37
+ const dispatch = createEventDispatcher();
38
+ function dispatchChanged(_data) {
39
+ dispatch("changed", _data);
40
+ }
41
+ $:
42
+ dispatchChanged($store.item);
43
+ let size = ["", "w-1/2", "w-1/3", "w-1/4", "w-1/5", "w-1/6"];
44
+ function isToFocus(currentKey, focusKey2, i) {
45
+ if (focusKey2 === null || focusKey2 === void 0) {
46
+ if (i === 0) {
47
+ return true;
48
+ }
49
+ return false;
50
+ }
51
+ return focusKey2 === currentKey;
52
+ }
53
+ </script>
54
+
55
+ {#each cells as cell, i}
56
+ {@const focus = isToFocus(cell.field?.key, focusKey, i)}
57
+ {#if shouldHide(cell, mode)}
58
+ <!-- Do nothing -->
59
+ {:else}
60
+ <div class={cell.class}>
61
+ {#if cell.kind === 'header'}
62
+ <span>{cell.header}</span>
63
+ {:else if cell.field && (!$store || $store.loading)}
64
+ <!-- If the store is not ready mdiYeast, or in loading... -->
65
+ <FieldContainer label={cell.field.caption} forId={cell.field.key}>
66
+ <Loading
67
+ class={tw(
68
+ `mx-4 my-3 h-6`,
69
+ size[parseInt((((i + 1) * Math.random() * size.length) % size.length).toString())],
70
+ )}
71
+ />
72
+ </FieldContainer>
73
+ {:else if cell.kind === 'slot'}
74
+ <slot name="field" field={cell.field} {focus} />
75
+ {:else if cell.field && $store.item}
76
+ <Field
77
+ mode={modeToUse(cell, mode)}
78
+ {cell}
79
+ cellsValues={$store.item}
80
+ bind:value={$store.item[cell.field.key]}
81
+ error={getError($store.errors, cell.field)}
82
+ {focus}
83
+ on:createRequest
84
+ />
85
+ <!-- disabled={isDisableFieldDynamic(cell)} -->
86
+ {:else}
87
+ FieldGroup : Case not handled
88
+ {/if}
89
+ </div>
90
+ {/if}
91
+ {/each}
@@ -0,0 +1,30 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { FieldMetadata } from 'remult';
3
+ import { type KitStoreItem } from '..';
4
+ import type { KitCell } from '../kitCellsBuildor';
5
+ declare class __sveltets_Render<T extends Record<any, any>> {
6
+ props(): {
7
+ mode?: ("view" | "edit" | "filtre") | undefined;
8
+ cells: KitCell<T>[];
9
+ store: KitStoreItem<T>;
10
+ focusKey?: string | null | undefined;
11
+ };
12
+ events(): {
13
+ createRequest: CustomEvent<any>;
14
+ changed: CustomEvent<any>;
15
+ } & {
16
+ [evt: string]: CustomEvent<any>;
17
+ };
18
+ slots(): {
19
+ field: {
20
+ field: FieldMetadata<any, T> | undefined;
21
+ focus: typeof focus;
22
+ };
23
+ };
24
+ }
25
+ export type FieldGroupProps<T extends Record<any, any>> = ReturnType<__sveltets_Render<T>['props']>;
26
+ export type FieldGroupEvents<T extends Record<any, any>> = ReturnType<__sveltets_Render<T>['events']>;
27
+ export type FieldGroupSlots<T extends Record<any, any>> = ReturnType<__sveltets_Render<T>['slots']>;
28
+ export default class FieldGroup<T extends Record<any, any>> extends SvelteComponent<FieldGroupProps<T>, FieldGroupEvents<T>, FieldGroupSlots<T>> {
29
+ }
30
+ export {};