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.
- package/CHANGELOG.md +15 -0
- package/LICENSE +18 -0
- package/README.md +12 -0
- package/esm/KitBaseEnum.d.ts +35 -0
- package/esm/KitBaseEnum.js +32 -0
- package/esm/KitEntity.d.ts +2 -0
- package/esm/KitEntity.js +24 -0
- package/esm/KitFields.d.ts +10 -0
- package/esm/KitFields.js +196 -0
- package/esm/ROUTES.d.ts +88 -0
- package/esm/ROUTES.js +98 -0
- package/esm/SqlDatabase/LogToConsoleCustom.d.ts +1 -0
- package/esm/SqlDatabase/LogToConsoleCustom.js +102 -0
- package/esm/api/index.d.ts +42 -0
- package/esm/api/index.js +97 -0
- package/esm/auth/Adapter.d.ts +10 -0
- package/esm/auth/Adapter.js +54 -0
- package/esm/auth/AuthController.d.ts +59 -0
- package/esm/auth/AuthController.js +434 -0
- package/esm/auth/Entities.d.ts +39 -0
- package/esm/auth/Entities.js +154 -0
- package/esm/auth/RoleController.d.ts +14 -0
- package/esm/auth/RoleController.js +57 -0
- package/esm/auth/helper.d.ts +1 -0
- package/esm/auth/helper.js +7 -0
- package/esm/auth/index.d.ts +153 -0
- package/esm/auth/index.js +280 -0
- package/esm/auth/providers/github.d.ts +25 -0
- package/esm/auth/providers/github.js +51 -0
- package/esm/auth/providers/index.d.ts +3 -0
- package/esm/auth/providers/index.js +26 -0
- package/esm/auth/providers/strava.d.ts +25 -0
- package/esm/auth/providers/strava.js +51 -0
- package/esm/auth/static/assets/Page-BMFREPjF.d.ts +5 -0
- package/esm/auth/static/assets/Page-BMFREPjF.js +18 -0
- package/esm/auth/static/assets/Page-BMOLAIFx.d.ts +5 -0
- package/esm/auth/static/assets/Page-BMOLAIFx.js +1 -0
- package/esm/auth/static/assets/Page-BwHye0GW.d.ts +5 -0
- package/esm/auth/static/assets/Page-BwHye0GW.js +1 -0
- package/esm/auth/static/assets/Page-gV58jf2r.css +1 -0
- package/esm/auth/static/assets/index-CKmKKRRL.d.ts +53 -0
- package/esm/auth/static/assets/index-CKmKKRRL.js +2 -0
- package/esm/auth/static/assets/index-R27C_TlP.css +4 -0
- package/esm/auth/static/favicon.svg +79 -0
- package/esm/auth/static/index.html +14 -0
- package/esm/auth/types.d.ts +33 -0
- package/esm/auth/types.js +1 -0
- package/esm/bin/cmd.d.ts +1 -0
- package/esm/bin/cmd.js +418 -0
- package/esm/changeLog/index.d.ts +55 -0
- package/esm/changeLog/index.js +179 -0
- package/esm/cron/index.d.ts +60 -0
- package/esm/cron/index.js +102 -0
- package/esm/feedback/FeedbackController.d.ts +30 -0
- package/esm/feedback/FeedbackController.js +313 -0
- package/esm/feedback/index.d.ts +18 -0
- package/esm/feedback/index.js +14 -0
- package/esm/feedback/ui/DialogIssue.svelte +102 -0
- package/esm/feedback/ui/DialogIssue.svelte.d.ts +20 -0
- package/esm/feedback/ui/DialogIssues.svelte +91 -0
- package/esm/feedback/ui/DialogIssues.svelte.d.ts +20 -0
- package/esm/feedback/ui/DialogMilestones.svelte +38 -0
- package/esm/feedback/ui/DialogMilestones.svelte.d.ts +18 -0
- package/esm/feedback/ui/Feedback.svelte +12 -0
- package/esm/feedback/ui/Feedback.svelte.d.ts +16 -0
- package/esm/formats/dates.d.ts +18 -0
- package/esm/formats/dates.js +35 -0
- package/esm/formats/index.d.ts +4 -0
- package/esm/formats/index.js +3 -0
- package/esm/formats/numbers.d.ts +4 -0
- package/esm/formats/numbers.js +34 -0
- package/esm/formats/strings.d.ts +11 -0
- package/esm/formats/strings.js +109 -0
- package/esm/handle/index.d.ts +7 -0
- package/esm/handle/index.js +40 -0
- package/esm/helper.d.ts +50 -0
- package/esm/helper.js +118 -0
- package/esm/index.d.ts +103 -0
- package/esm/index.js +42 -0
- package/esm/kitCellsBuildor.d.ts +45 -0
- package/esm/kitCellsBuildor.js +105 -0
- package/esm/kitStoreItem.d.ts +28 -0
- package/esm/kitStoreItem.js +170 -0
- package/esm/kitStoreList.d.ts +33 -0
- package/esm/kitStoreList.js +98 -0
- package/esm/mail/index.d.ts +11 -0
- package/esm/mail/index.js +51 -0
- package/esm/theme.d.ts +4 -0
- package/esm/theme.js +4 -0
- package/esm/ui/Button.svelte +102 -0
- package/esm/ui/Button.svelte.d.ts +27 -0
- package/esm/ui/Clipboardable.svelte +19 -0
- package/esm/ui/Clipboardable.svelte.d.ts +25 -0
- package/esm/ui/Field.svelte +288 -0
- package/esm/ui/Field.svelte.d.ts +29 -0
- package/esm/ui/FieldGroup.svelte +91 -0
- package/esm/ui/FieldGroup.svelte.d.ts +30 -0
- package/esm/ui/Grid.svelte +246 -0
- package/esm/ui/Grid.svelte.d.ts +46 -0
- package/esm/ui/GridLoading.svelte +32 -0
- package/esm/ui/GridLoading.svelte.d.ts +20 -0
- package/esm/ui/GridPaginate.svelte +66 -0
- package/esm/ui/GridPaginate.svelte.d.ts +22 -0
- package/esm/ui/Icon.svelte +86 -0
- package/esm/ui/Icon.svelte.d.ts +46 -0
- package/esm/ui/LibIcon.d.ts +23 -0
- package/esm/ui/LibIcon.js +28 -0
- package/esm/ui/Loading.svelte +11 -0
- package/esm/ui/Loading.svelte.d.ts +20 -0
- package/esm/ui/Tooltip.svelte +42 -0
- package/esm/ui/Tooltip.svelte.d.ts +22 -0
- package/esm/ui/dialog/DialogForm.svelte +70 -0
- package/esm/ui/dialog/DialogForm.svelte.d.ts +19 -0
- package/esm/ui/dialog/DialogManagement.svelte +87 -0
- package/esm/ui/dialog/DialogManagement.svelte.d.ts +25 -0
- package/esm/ui/dialog/DialogPrimitive.svelte +89 -0
- package/esm/ui/dialog/DialogPrimitive.svelte.d.ts +28 -0
- package/esm/ui/dialog/FormEditAction.svelte +54 -0
- package/esm/ui/dialog/FormEditAction.svelte.d.ts +24 -0
- package/esm/ui/dialog/dialog.d.ts +51 -0
- package/esm/ui/dialog/dialog.js +98 -0
- package/esm/ui/index.d.ts +5 -0
- package/esm/ui/index.js +19 -0
- package/esm/ui/internals/FieldContainer.svelte +22 -0
- package/esm/ui/internals/FieldContainer.svelte.d.ts +30 -0
- package/esm/ui/internals/Input.svelte +98 -0
- package/esm/ui/internals/Input.svelte.d.ts +35 -0
- package/esm/ui/internals/Textarea.svelte +61 -0
- package/esm/ui/internals/Textarea.svelte.d.ts +30 -0
- package/esm/ui/internals/select/MultiSelectMelt.svelte +217 -0
- package/esm/ui/internals/select/MultiSelectMelt.svelte.d.ts +30 -0
- package/esm/ui/internals/select/SelectMelt.svelte +238 -0
- package/esm/ui/internals/select/SelectMelt.svelte.d.ts +35 -0
- package/esm/ui/internals/select/SelectRadio.svelte +37 -0
- package/esm/ui/internals/select/SelectRadio.svelte.d.ts +25 -0
- package/esm/ui/link/Link.svelte +28 -0
- package/esm/ui/link/Link.svelte.d.ts +25 -0
- package/esm/ui/link/LinkPlus.svelte +44 -0
- package/esm/ui/link/LinkPlus.svelte.d.ts +21 -0
- package/esm/utils/tailwind.d.ts +2 -0
- package/esm/utils/tailwind.js +3 -0
- package/esm/utils/transition.d.ts +10 -0
- package/esm/utils/transition.js +33 -0
- package/esm/utils/types.d.ts +17 -0
- package/esm/utils/types.js +17 -0
- package/esm/virtual/Customer.d.ts +4 -0
- package/esm/virtual/Customer.js +24 -0
- package/esm/virtual/FilterEntity.d.ts +7 -0
- package/esm/virtual/FilterEntity.js +34 -0
- package/esm/virtual/StateDemoEnum.d.ts +9 -0
- package/esm/virtual/StateDemoEnum.js +42 -0
- package/esm/virtual/UIEntity.d.ts +16 -0
- package/esm/virtual/UIEntity.js +84 -0
- package/esm/vite/index.d.ts +8 -0
- package/esm/vite/index.js +47 -0
- 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 {};
|