@lobb-js/studio 0.47.0 → 0.49.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.
- package/dist/actions.d.ts +2 -28
- package/dist/actions.js +4 -60
- package/dist/components/detailView/detailView.svelte +12 -62
- package/dist/components/detailView/detailView.svelte.d.ts +1 -1
- package/dist/components/detailView/fieldInput.svelte +161 -288
- package/dist/components/detailView/fieldInput.svelte.d.ts +1 -1
- package/dist/components/detailView/fields/BoolField.svelte +42 -0
- package/dist/components/detailView/fields/BoolField.svelte.d.ts +13 -0
- package/dist/components/detailView/fields/CodeField.svelte +30 -0
- package/dist/components/detailView/fields/CodeField.svelte.d.ts +13 -0
- package/dist/components/detailView/fields/CustomInputField.svelte +50 -0
- package/dist/components/detailView/fields/CustomInputField.svelte.d.ts +18 -0
- package/dist/components/detailView/fields/DateField.svelte +47 -0
- package/dist/components/detailView/fields/DateField.svelte.d.ts +14 -0
- package/dist/components/detailView/fields/EmbeddedField.svelte +139 -0
- package/dist/components/detailView/fields/EmbeddedField.svelte.d.ts +13 -0
- package/dist/components/detailView/fields/EmbeddedPolymorphicField.svelte +197 -0
- package/dist/components/detailView/fields/EmbeddedPolymorphicField.svelte.d.ts +13 -0
- package/dist/components/detailView/fields/EnumField.svelte +70 -0
- package/dist/components/detailView/fields/EnumField.svelte.d.ts +17 -0
- package/dist/components/detailView/fields/FieldWrapper.svelte +68 -0
- package/dist/components/detailView/fields/FieldWrapper.svelte.d.ts +18 -0
- package/dist/components/detailView/fields/ForeignKeyField.svelte +78 -0
- package/dist/components/detailView/fields/ForeignKeyField.svelte.d.ts +17 -0
- package/dist/components/detailView/fields/IdField.svelte +21 -0
- package/dist/components/detailView/fields/IdField.svelte.d.ts +12 -0
- package/dist/components/detailView/fields/NumberField.svelte +38 -0
- package/dist/components/detailView/fields/NumberField.svelte.d.ts +16 -0
- package/dist/components/detailView/fields/PasswordField.svelte +29 -0
- package/dist/components/detailView/fields/PasswordField.svelte.d.ts +12 -0
- package/dist/components/detailView/fields/PolymorphicField.svelte +51 -0
- package/dist/components/detailView/fields/PolymorphicField.svelte.d.ts +16 -0
- package/dist/components/detailView/fields/RichTextField.svelte +30 -0
- package/dist/components/detailView/fields/RichTextField.svelte.d.ts +13 -0
- package/dist/components/detailView/fields/StringField.svelte +35 -0
- package/dist/components/detailView/fields/StringField.svelte.d.ts +14 -0
- package/dist/components/detailView/fields/TextField.svelte +35 -0
- package/dist/components/detailView/fields/TextField.svelte.d.ts +14 -0
- package/dist/components/foreingKeyInput.svelte +1 -1
- package/dist/components/polymorphicInput.svelte +1 -1
- package/dist/components/popup/popup.svelte +23 -4
- package/dist/components/popup/popup.svelte.d.ts +2 -0
- package/dist/extensions/extension.types.d.ts +5 -2
- package/dist/extensions/extensionUtils.js +4 -1
- package/dist/popup.d.ts +31 -0
- package/dist/popup.js +104 -0
- package/package.json +7 -6
- package/src/lib/actions.ts +5 -95
- package/src/lib/components/detailView/detailView.svelte +12 -62
- package/src/lib/components/detailView/fieldInput.svelte +161 -288
- package/src/lib/components/detailView/fields/BoolField.svelte +42 -0
- package/src/lib/components/detailView/fields/CodeField.svelte +30 -0
- package/src/lib/components/detailView/fields/CustomInputField.svelte +50 -0
- package/src/lib/components/detailView/fields/DateField.svelte +47 -0
- package/src/lib/components/detailView/fields/EmbeddedField.svelte +139 -0
- package/src/lib/components/detailView/fields/EmbeddedPolymorphicField.svelte +197 -0
- package/src/lib/components/detailView/fields/EnumField.svelte +70 -0
- package/src/lib/components/detailView/fields/FieldWrapper.svelte +68 -0
- package/src/lib/components/detailView/fields/ForeignKeyField.svelte +78 -0
- package/src/lib/components/detailView/fields/IdField.svelte +21 -0
- package/src/lib/components/detailView/fields/NumberField.svelte +38 -0
- package/src/lib/components/detailView/fields/PasswordField.svelte +29 -0
- package/src/lib/components/detailView/fields/PolymorphicField.svelte +51 -0
- package/src/lib/components/detailView/fields/RichTextField.svelte +30 -0
- package/src/lib/components/detailView/fields/StringField.svelte +35 -0
- package/src/lib/components/detailView/fields/TextField.svelte +35 -0
- package/src/lib/components/foreingKeyInput.svelte +1 -1
- package/src/lib/components/polymorphicInput.svelte +1 -1
- package/src/lib/components/popup/popup.svelte +23 -4
- package/src/lib/extensions/extension.types.ts +4 -2
- package/src/lib/extensions/extensionUtils.ts +4 -1
- package/src/lib/popup.ts +147 -0
package/dist/actions.d.ts
CHANGED
|
@@ -11,35 +11,9 @@ export interface OpenDataTableDrawerProps {
|
|
|
11
11
|
position?: "side" | "bottom";
|
|
12
12
|
tabs?: CollectionTab[];
|
|
13
13
|
}
|
|
14
|
-
export interface OpenPopupProps {
|
|
15
|
-
component: any;
|
|
16
|
-
componentProps?: Record<string, any>;
|
|
17
|
-
title?: string;
|
|
18
|
-
size?: "default" | "sm";
|
|
19
|
-
hideHeader?: boolean;
|
|
20
|
-
replaceLast?: boolean;
|
|
21
|
-
}
|
|
22
|
-
export interface OpenDataTablePopupProps {
|
|
23
|
-
collectionName: string;
|
|
24
|
-
filter?: Record<string, any>;
|
|
25
|
-
sort?: Record<string, "asc" | "desc">;
|
|
26
|
-
limit?: number;
|
|
27
|
-
title?: string;
|
|
28
|
-
showHeader?: boolean;
|
|
29
|
-
showFooter?: boolean;
|
|
30
|
-
showFilter?: boolean;
|
|
31
|
-
tabs?: CollectionTab[];
|
|
32
|
-
view?: {
|
|
33
|
-
id: string;
|
|
34
|
-
[key: string]: any;
|
|
35
|
-
};
|
|
36
|
-
replaceLast?: boolean;
|
|
37
|
-
size?: "default" | "sm";
|
|
38
|
-
hideHeader?: boolean;
|
|
39
|
-
}
|
|
40
14
|
export declare function showDialog(title: string, description: string): Promise<boolean>;
|
|
41
15
|
export declare function openCreateDetailView(studioContext: StudioContext, props: CreateDetailViewProp): void;
|
|
42
16
|
export declare function openUpdateDetailView(studioContext: StudioContext, props: UpdateDetailViewProp): Promise<void>;
|
|
43
17
|
export declare function openDataTableDrawer(studioContext: StudioContext, props: OpenDataTableDrawerProps): void;
|
|
44
|
-
export
|
|
45
|
-
export
|
|
18
|
+
export { openPopup, openDataTablePopup, goBackPopup } from "./popup";
|
|
19
|
+
export type { OpenPopupProps, OpenDataTablePopupProps } from "./popup";
|
package/dist/actions.js
CHANGED
|
@@ -3,18 +3,8 @@ import ConfirmationDialog from "./components/confirmationDialog/confirmationDial
|
|
|
3
3
|
import CreateDetailView from "./components/detailView/create/createDetailView.svelte";
|
|
4
4
|
import UpdateDetailView from "./components/detailView/update/updateDetailView.svelte";
|
|
5
5
|
import DataTableDrawer from "./components/dataTableDrawer/dataTableDrawer.svelte";
|
|
6
|
-
import DataTable from "./components/dataTable/dataTable.svelte";
|
|
7
|
-
import Popup from "./components/popup/popup.svelte";
|
|
8
6
|
import { createStudioContextMap } from "./context";
|
|
9
7
|
import { getCollectionParamsFields } from "./components/dataTable/utils";
|
|
10
|
-
let activePopup = null;
|
|
11
|
-
function closeActivePopupIfRequested(replaceLast) {
|
|
12
|
-
if (!replaceLast || !activePopup)
|
|
13
|
-
return;
|
|
14
|
-
const toUnmount = activePopup;
|
|
15
|
-
activePopup = null;
|
|
16
|
-
unmount(toUnmount, { outro: true });
|
|
17
|
-
}
|
|
18
8
|
export function showDialog(title, description) {
|
|
19
9
|
return new Promise((resolve) => {
|
|
20
10
|
const targetElement = document.querySelector("main");
|
|
@@ -90,53 +80,7 @@ export function openDataTableDrawer(studioContext, props) {
|
|
|
90
80
|
},
|
|
91
81
|
});
|
|
92
82
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
closeActivePopupIfRequested(props.replaceLast);
|
|
98
|
-
const mounted = mount(Popup, {
|
|
99
|
-
target: targetElement,
|
|
100
|
-
context: createStudioContextMap(studioContext),
|
|
101
|
-
props: {
|
|
102
|
-
component: props.component,
|
|
103
|
-
componentProps: props.componentProps,
|
|
104
|
-
title: props.title,
|
|
105
|
-
size: props.size,
|
|
106
|
-
hideHeader: props.hideHeader,
|
|
107
|
-
onClose: async () => {
|
|
108
|
-
if (activePopup === mounted)
|
|
109
|
-
activePopup = null;
|
|
110
|
-
await unmount(mounted, { outro: true });
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
});
|
|
114
|
-
activePopup = mounted;
|
|
115
|
-
}
|
|
116
|
-
export function openDataTablePopup(studioContext, props) {
|
|
117
|
-
// DataTable reads `searchParams` once during its initial $state setup,
|
|
118
|
-
// so sort/limit need to be folded into the searchParams object before
|
|
119
|
-
// we mount. Built here in plain TS — no Svelte reactivity to escape.
|
|
120
|
-
const searchParams = {};
|
|
121
|
-
if (props.sort)
|
|
122
|
-
searchParams.sort = props.sort;
|
|
123
|
-
if (props.limit != null)
|
|
124
|
-
searchParams.limit = String(props.limit);
|
|
125
|
-
openPopup(studioContext, {
|
|
126
|
-
component: DataTable,
|
|
127
|
-
componentProps: {
|
|
128
|
-
collectionName: props.collectionName,
|
|
129
|
-
filter: props.filter,
|
|
130
|
-
searchParams,
|
|
131
|
-
showHeader: props.showHeader,
|
|
132
|
-
showFooter: props.showFooter,
|
|
133
|
-
showFilter: props.showFilter ?? false,
|
|
134
|
-
tabs: props.tabs,
|
|
135
|
-
view: props.view,
|
|
136
|
-
},
|
|
137
|
-
title: props.title ?? props.collectionName,
|
|
138
|
-
size: props.size,
|
|
139
|
-
hideHeader: props.hideHeader,
|
|
140
|
-
replaceLast: props.replaceLast,
|
|
141
|
-
});
|
|
142
|
-
}
|
|
83
|
+
// Popup helpers (openPopup, openDataTablePopup, goBackPopup) live in
|
|
84
|
+
// `./popup` — they share enough state (active overlay, back-history)
|
|
85
|
+
// to warrant their own module.
|
|
86
|
+
export { openPopup, openDataTablePopup, goBackPopup } from "./popup";
|
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { CircleHelp } from "lucide-svelte";
|
|
3
|
-
import * as Tooltip from "../ui/tooltip";
|
|
4
2
|
import { getStudioContext } from "../../context";
|
|
5
|
-
import ExtensionsComponents from "../extensionsComponents.svelte";
|
|
6
|
-
import { getExtensionUtils } from "../../extensions/extensionUtils";
|
|
7
|
-
import { getField, getFieldIcon } from "../dataTable/utils";
|
|
8
3
|
import FieldInput from "./fieldInput.svelte";
|
|
9
|
-
import { getFieldTypeLabel } from "../../utils";
|
|
10
4
|
|
|
11
5
|
interface Props {
|
|
12
6
|
collectionName: string;
|
|
13
7
|
entry: Record<string, any>;
|
|
14
|
-
fieldsErrors?: Record<string,
|
|
8
|
+
fieldsErrors?: Record<string, any>;
|
|
15
9
|
changedFields?: string[];
|
|
16
10
|
}
|
|
17
11
|
|
|
@@ -22,9 +16,7 @@
|
|
|
22
16
|
changedFields = [],
|
|
23
17
|
}: Props = $props();
|
|
24
18
|
|
|
25
|
-
const {
|
|
26
|
-
// Singleton collections only ever have one row, and `id` is auto-
|
|
27
|
-
// generated for that row — there's no value to showing it in the form.
|
|
19
|
+
const { ctx } = getStudioContext();
|
|
28
20
|
const fieldNames = $derived(
|
|
29
21
|
Object.keys(ctx.meta.collections[collectionName].fields).filter(
|
|
30
22
|
(fieldName) =>
|
|
@@ -35,58 +27,16 @@
|
|
|
35
27
|
|
|
36
28
|
<div class="grid grid-cols-2 gap-4 p-4">
|
|
37
29
|
{#each fieldNames as fieldName}
|
|
38
|
-
{
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
name="detailView.field.label"
|
|
49
|
-
utils={getExtensionUtils(lobb, ctx)}
|
|
50
|
-
{collectionName}
|
|
51
|
-
{fieldName}
|
|
52
|
-
bind:value={entry[fieldName]}
|
|
53
|
-
>
|
|
54
|
-
<div class="flex items-center gap-1.5">
|
|
55
|
-
<div class="h-fit">{field.label}</div>
|
|
56
|
-
<div class="flex h-fit items-center gap-1 text-[0.7rem] text-muted-foreground">
|
|
57
|
-
<FieldIcon size="12" />
|
|
58
|
-
{getFieldTypeLabel(field.type)}
|
|
59
|
-
</div>
|
|
60
|
-
</div>
|
|
61
|
-
</ExtensionsComponents>
|
|
62
|
-
{#if description}
|
|
63
|
-
<Tooltip.Root>
|
|
64
|
-
<Tooltip.Trigger>
|
|
65
|
-
<CircleHelp size="12" class="text-muted-foreground" />
|
|
66
|
-
</Tooltip.Trigger>
|
|
67
|
-
<Tooltip.Content class="max-w-64 text-xs">
|
|
68
|
-
{description}
|
|
69
|
-
</Tooltip.Content>
|
|
70
|
-
</Tooltip.Root>
|
|
71
|
-
{/if}
|
|
72
|
-
</div>
|
|
73
|
-
<div>
|
|
74
|
-
<ExtensionsComponents
|
|
75
|
-
name="dvFields.topRight.{collectionName}.{fieldName}"
|
|
76
|
-
utils={getExtensionUtils(lobb, ctx)}
|
|
77
|
-
bind:value={entry[fieldName]}
|
|
78
|
-
/>
|
|
79
|
-
</div>
|
|
80
|
-
</div>
|
|
81
|
-
<FieldInput
|
|
82
|
-
{collectionName}
|
|
83
|
-
{fieldName}
|
|
84
|
-
bind:value={entry[fieldName]}
|
|
85
|
-
bind:entry
|
|
86
|
-
errorMessages={fieldsErrors[fieldName]}
|
|
87
|
-
changed={changedFields.includes(fieldName)}
|
|
88
|
-
/>
|
|
89
|
-
</div>
|
|
30
|
+
{@const fieldDef = ctx.meta.collections[collectionName].fields[fieldName]}
|
|
31
|
+
{#if !(fieldDef?.ui?.hidden) || (fieldDef as any)?.embedded}
|
|
32
|
+
<FieldInput
|
|
33
|
+
{collectionName}
|
|
34
|
+
{fieldName}
|
|
35
|
+
bind:value={entry[fieldName]}
|
|
36
|
+
bind:entry
|
|
37
|
+
errorMessages={fieldsErrors[fieldName]}
|
|
38
|
+
changed={changedFields.includes(fieldName)}
|
|
39
|
+
/>
|
|
90
40
|
{/if}
|
|
91
41
|
{/each}
|
|
92
42
|
</div>
|