@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.
Files changed (72) hide show
  1. package/dist/actions.d.ts +2 -28
  2. package/dist/actions.js +4 -60
  3. package/dist/components/detailView/detailView.svelte +12 -62
  4. package/dist/components/detailView/detailView.svelte.d.ts +1 -1
  5. package/dist/components/detailView/fieldInput.svelte +161 -288
  6. package/dist/components/detailView/fieldInput.svelte.d.ts +1 -1
  7. package/dist/components/detailView/fields/BoolField.svelte +42 -0
  8. package/dist/components/detailView/fields/BoolField.svelte.d.ts +13 -0
  9. package/dist/components/detailView/fields/CodeField.svelte +30 -0
  10. package/dist/components/detailView/fields/CodeField.svelte.d.ts +13 -0
  11. package/dist/components/detailView/fields/CustomInputField.svelte +50 -0
  12. package/dist/components/detailView/fields/CustomInputField.svelte.d.ts +18 -0
  13. package/dist/components/detailView/fields/DateField.svelte +47 -0
  14. package/dist/components/detailView/fields/DateField.svelte.d.ts +14 -0
  15. package/dist/components/detailView/fields/EmbeddedField.svelte +139 -0
  16. package/dist/components/detailView/fields/EmbeddedField.svelte.d.ts +13 -0
  17. package/dist/components/detailView/fields/EmbeddedPolymorphicField.svelte +197 -0
  18. package/dist/components/detailView/fields/EmbeddedPolymorphicField.svelte.d.ts +13 -0
  19. package/dist/components/detailView/fields/EnumField.svelte +70 -0
  20. package/dist/components/detailView/fields/EnumField.svelte.d.ts +17 -0
  21. package/dist/components/detailView/fields/FieldWrapper.svelte +68 -0
  22. package/dist/components/detailView/fields/FieldWrapper.svelte.d.ts +18 -0
  23. package/dist/components/detailView/fields/ForeignKeyField.svelte +78 -0
  24. package/dist/components/detailView/fields/ForeignKeyField.svelte.d.ts +17 -0
  25. package/dist/components/detailView/fields/IdField.svelte +21 -0
  26. package/dist/components/detailView/fields/IdField.svelte.d.ts +12 -0
  27. package/dist/components/detailView/fields/NumberField.svelte +38 -0
  28. package/dist/components/detailView/fields/NumberField.svelte.d.ts +16 -0
  29. package/dist/components/detailView/fields/PasswordField.svelte +29 -0
  30. package/dist/components/detailView/fields/PasswordField.svelte.d.ts +12 -0
  31. package/dist/components/detailView/fields/PolymorphicField.svelte +51 -0
  32. package/dist/components/detailView/fields/PolymorphicField.svelte.d.ts +16 -0
  33. package/dist/components/detailView/fields/RichTextField.svelte +30 -0
  34. package/dist/components/detailView/fields/RichTextField.svelte.d.ts +13 -0
  35. package/dist/components/detailView/fields/StringField.svelte +35 -0
  36. package/dist/components/detailView/fields/StringField.svelte.d.ts +14 -0
  37. package/dist/components/detailView/fields/TextField.svelte +35 -0
  38. package/dist/components/detailView/fields/TextField.svelte.d.ts +14 -0
  39. package/dist/components/foreingKeyInput.svelte +1 -1
  40. package/dist/components/polymorphicInput.svelte +1 -1
  41. package/dist/components/popup/popup.svelte +23 -4
  42. package/dist/components/popup/popup.svelte.d.ts +2 -0
  43. package/dist/extensions/extension.types.d.ts +5 -2
  44. package/dist/extensions/extensionUtils.js +4 -1
  45. package/dist/popup.d.ts +31 -0
  46. package/dist/popup.js +104 -0
  47. package/package.json +7 -6
  48. package/src/lib/actions.ts +5 -95
  49. package/src/lib/components/detailView/detailView.svelte +12 -62
  50. package/src/lib/components/detailView/fieldInput.svelte +161 -288
  51. package/src/lib/components/detailView/fields/BoolField.svelte +42 -0
  52. package/src/lib/components/detailView/fields/CodeField.svelte +30 -0
  53. package/src/lib/components/detailView/fields/CustomInputField.svelte +50 -0
  54. package/src/lib/components/detailView/fields/DateField.svelte +47 -0
  55. package/src/lib/components/detailView/fields/EmbeddedField.svelte +139 -0
  56. package/src/lib/components/detailView/fields/EmbeddedPolymorphicField.svelte +197 -0
  57. package/src/lib/components/detailView/fields/EnumField.svelte +70 -0
  58. package/src/lib/components/detailView/fields/FieldWrapper.svelte +68 -0
  59. package/src/lib/components/detailView/fields/ForeignKeyField.svelte +78 -0
  60. package/src/lib/components/detailView/fields/IdField.svelte +21 -0
  61. package/src/lib/components/detailView/fields/NumberField.svelte +38 -0
  62. package/src/lib/components/detailView/fields/PasswordField.svelte +29 -0
  63. package/src/lib/components/detailView/fields/PolymorphicField.svelte +51 -0
  64. package/src/lib/components/detailView/fields/RichTextField.svelte +30 -0
  65. package/src/lib/components/detailView/fields/StringField.svelte +35 -0
  66. package/src/lib/components/detailView/fields/TextField.svelte +35 -0
  67. package/src/lib/components/foreingKeyInput.svelte +1 -1
  68. package/src/lib/components/polymorphicInput.svelte +1 -1
  69. package/src/lib/components/popup/popup.svelte +23 -4
  70. package/src/lib/extensions/extension.types.ts +4 -2
  71. package/src/lib/extensions/extensionUtils.ts +4 -1
  72. 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 declare function openPopup(studioContext: StudioContext, props: OpenPopupProps): void;
45
- export declare function openDataTablePopup(studioContext: StudioContext, props: OpenDataTablePopupProps): void;
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
- export function openPopup(studioContext, props) {
94
- const targetElement = document.querySelector("main");
95
- if (!targetElement)
96
- throw new Error("main html element doesn't exist");
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, 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 { lobb, ctx } = getStudioContext();
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
- {#if !ctx.meta.collections[collectionName].fields[fieldName]?.ui?.hidden}
39
- {@const field = getField(ctx, fieldName, collectionName)}
40
- {@const FieldIcon = getFieldIcon(ctx, fieldName, collectionName)}
41
- {@const description = ctx.meta.collections[collectionName].fields[fieldName]?.description}
42
- {@const fieldDef = ctx.meta.collections[collectionName].fields[fieldName]}
43
- {@const isFullWidth = field.type === "text" || field.type === "polymorphic" || fieldDef?.ui?.input?.type === "richtext" || fieldDef?.ui?.span === 2}
44
- <div class="flex flex-col gap-2 {isFullWidth ? 'col-span-2' : 'col-span-1'}">
45
- <div class="flex flex-1 items-end justify-between gap-2 text-xs">
46
- <div class="flex items-center gap-1.5">
47
- <ExtensionsComponents
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>
@@ -1,7 +1,7 @@
1
1
  interface Props {
2
2
  collectionName: string;
3
3
  entry: Record<string, any>;
4
- fieldsErrors?: Record<string, string[]>;
4
+ fieldsErrors?: Record<string, any>;
5
5
  changedFields?: string[];
6
6
  }
7
7
  declare const DetailView: import("svelte").Component<Props, {}, "entry">;