@duke333/builder-ui 0.2.3 → 0.2.5
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/README.md +18 -0
- package/dist/{BuilderAdminPages-DrOrFyIX.d.ts → BuilderAdminPages-bV-lwDOp.d.ts} +15 -0
- package/dist/{RuntimeEntryDialog-Bw741XbS.d.ts → RuntimeEntryDialog-B4TbF8os.d.ts} +1 -1
- package/dist/admin/index.d.ts +2 -2
- package/dist/admin/index.js +55 -4
- package/dist/admin/index.js.map +1 -1
- package/dist/api/index.d.ts +14 -0
- package/dist/api/index.js +19 -2
- package/dist/api/index.js.map +1 -1
- package/dist/components/index.d.ts +4 -3
- package/dist/components/index.js +31 -12
- package/dist/components/index.js.map +1 -1
- package/dist/hooks/index.js +30 -3
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.d.ts +157 -22
- package/dist/index.js +1054 -536
- package/dist/index.js.map +1 -1
- package/dist/integration/index.d.ts +1 -1
- package/dist/integration/index.js +104 -9
- package/dist/integration/index.js.map +1 -1
- package/dist/runtime/index.d.ts +16 -26
- package/dist/runtime/index.js +41 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtimeUtils-CCtLyIf1.d.ts +33 -0
- package/dist/styles.css +198 -0
- package/dist/styles.css.map +1 -1
- package/package.json +5 -2
package/dist/api/index.d.ts
CHANGED
|
@@ -13,6 +13,9 @@ type BuilderApiTransport = {
|
|
|
13
13
|
delete<T>(path: string, options?: {
|
|
14
14
|
query?: BuilderApiQuery;
|
|
15
15
|
}): Promise<T>;
|
|
16
|
+
upload?<T>(path: string, body: Blob, options?: {
|
|
17
|
+
contentType: string;
|
|
18
|
+
}): Promise<T>;
|
|
16
19
|
};
|
|
17
20
|
type BuilderFieldOptionsQuery = {
|
|
18
21
|
search?: string;
|
|
@@ -59,6 +62,9 @@ type BuilderApiContracts = {
|
|
|
59
62
|
BuilderFieldTriggerResponse: unknown;
|
|
60
63
|
ListBuilderViewEntriesQuery: object;
|
|
61
64
|
ListBuilderViewEntriesResponse: unknown;
|
|
65
|
+
BuilderFileUploadRequest: unknown;
|
|
66
|
+
BuilderFileUploadResponse: unknown;
|
|
67
|
+
BuilderFilePresignResponse: unknown;
|
|
62
68
|
};
|
|
63
69
|
declare function createBuilderApiClient<C extends BuilderApiContracts>(rootTransport: BuilderApiTransport, options?: BuilderApiClientOptions): {
|
|
64
70
|
listBuilderForms: (query: C["ListBuilderFormsQuery"]) => Promise<C["ListBuilderFormsResponse"]>;
|
|
@@ -96,6 +102,14 @@ declare function createBuilderApiClient<C extends BuilderApiContracts>(rootTrans
|
|
|
96
102
|
updateCompositeBuilderViewEntry: (viewId: string, id: string, input: C["UpdateCompositeBuilderViewEntryInput"]) => Promise<C["BuilderViewEntry"]>;
|
|
97
103
|
updateBuilderViewEntry: (viewId: string, id: string, input: C["UpdateBuilderViewEntryInput"]) => Promise<C["BuilderViewEntry"]>;
|
|
98
104
|
deleteBuilderViewEntry: (viewId: string, id: string) => Promise<void>;
|
|
105
|
+
presignRuntimeBuilderFile: (context: {
|
|
106
|
+
formId?: string;
|
|
107
|
+
viewId?: string;
|
|
108
|
+
}, fieldKey: string, input: C["BuilderFileUploadRequest"]) => Promise<C["BuilderFilePresignResponse"]>;
|
|
109
|
+
uploadRuntimeBuilderFile: (context: {
|
|
110
|
+
formId?: string;
|
|
111
|
+
viewId?: string;
|
|
112
|
+
}, fieldKey: string, file: Blob) => Promise<C["BuilderFileUploadResponse"]>;
|
|
99
113
|
};
|
|
100
114
|
type BuilderApiClient<C extends BuilderApiContracts> = ReturnType<typeof createBuilderApiClient<C>>;
|
|
101
115
|
|
package/dist/api/index.js
CHANGED
|
@@ -16,7 +16,8 @@ function createBuilderApiClient(rootTransport, options = {}) {
|
|
|
16
16
|
get: (value, requestOptions) => rootTransport.get(path(value), requestOptions),
|
|
17
17
|
post: (value, body, requestOptions) => rootTransport.post(path(value), body, requestOptions),
|
|
18
18
|
patch: (value, body, requestOptions) => rootTransport.patch(path(value), body, requestOptions),
|
|
19
|
-
delete: (value, requestOptions) => rootTransport.delete(path(value), requestOptions)
|
|
19
|
+
delete: (value, requestOptions) => rootTransport.delete(path(value), requestOptions),
|
|
20
|
+
upload: rootTransport.upload ? (value, body, requestOptions) => rootTransport.upload(path(value), body, requestOptions) : void 0
|
|
20
21
|
};
|
|
21
22
|
return {
|
|
22
23
|
listBuilderForms: (query) => transport.get("/builder/forms", {
|
|
@@ -91,7 +92,23 @@ function createBuilderApiClient(rootTransport, options = {}) {
|
|
|
91
92
|
),
|
|
92
93
|
deleteBuilderViewEntry: (viewId, id) => transport.delete(
|
|
93
94
|
`/builder/runtime/views/${encodeURIComponent(viewId)}/entries/${encodeURIComponent(id)}`
|
|
94
|
-
)
|
|
95
|
+
),
|
|
96
|
+
presignRuntimeBuilderFile: (context, fieldKey, input) => {
|
|
97
|
+
const owner = context.viewId ? `views/${encodeURIComponent(context.viewId)}` : `forms/${encodeURIComponent(context.formId ?? "")}`;
|
|
98
|
+
return transport.post(
|
|
99
|
+
`/builder/runtime/${owner}/fields/${encodeURIComponent(fieldKey)}/files/presign`,
|
|
100
|
+
input
|
|
101
|
+
);
|
|
102
|
+
},
|
|
103
|
+
uploadRuntimeBuilderFile: (context, fieldKey, file) => {
|
|
104
|
+
if (!transport.upload) throw new Error("Builder transport server file upload \u0434\u044D\u043C\u0436\u0438\u0445\u0433\u04AF\u0439 \u0431\u0430\u0439\u043D\u0430");
|
|
105
|
+
const owner = context.viewId ? `views/${encodeURIComponent(context.viewId)}` : `forms/${encodeURIComponent(context.formId ?? "")}`;
|
|
106
|
+
return transport.upload(
|
|
107
|
+
`/builder/runtime/${owner}/fields/${encodeURIComponent(fieldKey)}/files/upload`,
|
|
108
|
+
file,
|
|
109
|
+
{ contentType: file.type }
|
|
110
|
+
);
|
|
111
|
+
}
|
|
95
112
|
};
|
|
96
113
|
}
|
|
97
114
|
export {
|
package/dist/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api/createBuilderApiClient.ts"],"sourcesContent":["export type BuilderApiQueryValue = string | number | boolean | null | undefined;\nexport type BuilderApiQuery = Record<string, BuilderApiQueryValue>;\n\nexport type BuilderApiTransport = {\n get<T>(path: string, options?: { query?: BuilderApiQuery }): Promise<T>;\n post<T>(path: string, body?: unknown, options?: { query?: BuilderApiQuery }): Promise<T>;\n patch<T>(path: string, body?: unknown, options?: { query?: BuilderApiQuery }): Promise<T>;\n delete<T>(path: string, options?: { query?: BuilderApiQuery }): Promise<T>;\n};\n\nexport type BuilderFieldOptionsQuery = {\n search?: string;\n depends?: Record<string, string | undefined>;\n};\n\nexport type BuilderApiClientOptions = {\n apiBasePath?: string;\n};\n\nexport type BuilderApiContracts = {\n BuilderDbTable: unknown;\n BuilderForm: { id: string };\n BuilderList: { id: string };\n BuilderView: { id: string };\n BuilderViewEntry: { id: string };\n ListBuilderFormsQuery: object;\n ListBuilderFormsResponse: unknown;\n CreateBuilderFormInput: unknown;\n UpdateBuilderFormInput: unknown;\n ListBuilderListsQuery: object;\n ListBuilderListsResponse: unknown;\n CreateBuilderListInput: unknown;\n UpdateBuilderListInput: unknown;\n ListBuilderViewsQuery: object;\n ListBuilderViewsResponse: unknown;\n CreateBuilderViewInput: unknown;\n UpdateBuilderViewInput: unknown;\n ReplicateBuilderEntityInput: unknown;\n CreateBuilderViewEntryInput: unknown;\n CreateCompositeBuilderViewEntryInput: unknown;\n UpdateCompositeBuilderViewEntryInput: unknown;\n UpdateBuilderViewEntryInput: unknown;\n ListBuilderFieldOptionsQuery: BuilderFieldOptionsQuery;\n ListBuilderFieldOptionsResponse: unknown;\n RunBuilderFieldTriggerInput: unknown;\n BuilderFieldTriggerEvent: string;\n BuilderFieldTriggerResponse: unknown;\n ListBuilderViewEntriesQuery: object;\n ListBuilderViewEntriesResponse: unknown;\n};\n\nfunction queryParams(query: object): BuilderApiQuery {\n return { ...query } as BuilderApiQuery;\n}\n\nfunction fieldOptionsQueryParams(query: BuilderFieldOptionsQuery): BuilderApiQuery {\n const flatQuery: BuilderApiQuery = { search: query.search };\n for (const [key, value] of Object.entries(query.depends ?? {})) {\n flatQuery[`depends.${key}`] = value;\n }\n return flatQuery;\n}\n\nexport function createBuilderApiClient<C extends BuilderApiContracts>(\n rootTransport: BuilderApiTransport,\n options: BuilderApiClientOptions = {},\n) {\n const basePath = options.apiBasePath?.trim().replace(/\\/+$/g, \"\") ?? \"\";\n const path = (value: string) => `${basePath}${value}`;\n const transport: BuilderApiTransport = {\n get: (value, requestOptions) => rootTransport.get(path(value), requestOptions),\n post: (value, body, requestOptions) => rootTransport.post(path(value), body, requestOptions),\n patch: (value, body, requestOptions) => rootTransport.patch(path(value), body, requestOptions),\n delete: (value, requestOptions) => rootTransport.delete(path(value), requestOptions),\n };\n\n return {\n listBuilderForms: (query: C[\"ListBuilderFormsQuery\"]) =>\n transport.get<C[\"ListBuilderFormsResponse\"]>(\"/builder/forms\", {\n query: queryParams(query),\n }),\n\n listBuilderDbTables: () =>\n transport.get<C[\"BuilderDbTable\"][]>(\"/builder/datasources/tables\"),\n\n listBuilderFormOptions: () =>\n transport.get<C[\"BuilderForm\"][]>(\"/builder/forms/options\"),\n\n getBuilderForm: (id: string) =>\n transport.get<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}`),\n\n createBuilderForm: (input: C[\"CreateBuilderFormInput\"]) =>\n transport.post<C[\"BuilderForm\"]>(\"/builder/forms\", input),\n\n updateBuilderForm: (id: string, input: C[\"UpdateBuilderFormInput\"]) =>\n transport.patch<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}`, input),\n\n replicateBuilderForm: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderForm: (id: string) =>\n transport.delete<void>(`/builder/forms/${encodeURIComponent(id)}`),\n\n listBuilderLists: (query: C[\"ListBuilderListsQuery\"]) =>\n transport.get<C[\"ListBuilderListsResponse\"]>(\"/builder/lists\", {\n query: queryParams(query),\n }),\n\n listBuilderListOptions: () => transport.get<C[\"BuilderList\"][]>(\"/builder/lists/options\"),\n\n getBuilderList: (id: string) =>\n transport.get<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}`),\n\n createBuilderList: (input: C[\"CreateBuilderListInput\"]) =>\n transport.post<C[\"BuilderList\"]>(\"/builder/lists\", input),\n\n updateBuilderList: (id: string, input: C[\"UpdateBuilderListInput\"]) =>\n transport.patch<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}`, input),\n\n replicateBuilderList: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderList: (id: string) =>\n transport.delete<void>(`/builder/lists/${encodeURIComponent(id)}`),\n\n listBuilderViews: (query: C[\"ListBuilderViewsQuery\"]) =>\n transport.get<C[\"ListBuilderViewsResponse\"]>(\"/builder/views\", {\n query: queryParams(query),\n }),\n\n getBuilderView: (id: string) =>\n transport.get<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}`),\n\n createBuilderView: (input: C[\"CreateBuilderViewInput\"]) =>\n transport.post<C[\"BuilderView\"]>(\"/builder/views\", input),\n\n updateBuilderView: (id: string, input: C[\"UpdateBuilderViewInput\"]) =>\n transport.patch<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}`, input),\n\n replicateBuilderView: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderView: (id: string) =>\n transport.delete<void>(`/builder/views/${encodeURIComponent(id)}`),\n\n getRuntimeBuilderForm: (id: string) =>\n transport.get<C[\"BuilderForm\"]>(`/builder/runtime/forms/${encodeURIComponent(id)}`),\n\n createRuntimeBuilderFormEntry: (formId: string, input: C[\"CreateBuilderViewEntryInput\"]) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/entries`,\n input,\n ),\n\n listRuntimeBuilderFormFieldOptions: (\n formId: string,\n fieldKey: string,\n query: C[\"ListBuilderFieldOptionsQuery\"],\n ) =>\n transport.get<C[\"ListBuilderFieldOptionsResponse\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/fields/${encodeURIComponent(fieldKey)}/options`,\n { query: fieldOptionsQueryParams(query) },\n ),\n\n runRuntimeBuilderFormFieldTrigger: (\n formId: string,\n fieldKey: string,\n event: C[\"BuilderFieldTriggerEvent\"],\n input: C[\"RunBuilderFieldTriggerInput\"],\n ) =>\n transport.post<C[\"BuilderFieldTriggerResponse\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/fields/${encodeURIComponent(fieldKey)}/triggers/${encodeURIComponent(event)}`,\n input,\n ),\n\n getRuntimeBuilderList: (id: string) =>\n transport.get<C[\"BuilderList\"]>(`/builder/runtime/lists/${encodeURIComponent(id)}`),\n\n listRuntimeBuilderListEntries: (listId: string, query: C[\"ListBuilderViewEntriesQuery\"]) =>\n transport.get<C[\"ListBuilderViewEntriesResponse\"]>(\n `/builder/runtime/lists/${encodeURIComponent(listId)}/entries`,\n { query: queryParams(query) },\n ),\n\n getRuntimeBuilderView: (id: string) =>\n transport.get<C[\"BuilderView\"]>(`/builder/runtime/views/${encodeURIComponent(id)}`),\n\n runRuntimeBuilderViewFieldTrigger: (\n viewId: string,\n fieldKey: string,\n event: C[\"BuilderFieldTriggerEvent\"],\n input: C[\"RunBuilderFieldTriggerInput\"],\n ) =>\n transport.post<C[\"BuilderFieldTriggerResponse\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/fields/${encodeURIComponent(fieldKey)}/triggers/${encodeURIComponent(event)}`,\n input,\n ),\n\n listBuilderViewEntries: (viewId: string, query: C[\"ListBuilderViewEntriesQuery\"]) =>\n transport.get<C[\"ListBuilderViewEntriesResponse\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries`,\n { query: queryParams(query) },\n ),\n\n createBuilderViewEntry: (viewId: string, input: C[\"CreateBuilderViewEntryInput\"]) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries`,\n input,\n ),\n\n createCompositeBuilderViewEntry: (\n viewId: string,\n input: C[\"CreateCompositeBuilderViewEntryInput\"],\n ) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/composite-entries`,\n input,\n ),\n\n updateCompositeBuilderViewEntry: (\n viewId: string,\n id: string,\n input: C[\"UpdateCompositeBuilderViewEntryInput\"],\n ) =>\n transport.patch<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/composite-entries/${encodeURIComponent(id)}`,\n input,\n ),\n\n updateBuilderViewEntry: (viewId: string, id: string, input: C[\"UpdateBuilderViewEntryInput\"]) =>\n transport.patch<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries/${encodeURIComponent(id)}`,\n input,\n ),\n\n deleteBuilderViewEntry: (viewId: string, id: string) =>\n transport.delete<void>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries/${encodeURIComponent(id)}`,\n ),\n };\n}\n\nexport type BuilderApiClient<C extends BuilderApiContracts> = ReturnType<\n typeof createBuilderApiClient<C>\n>;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/api/createBuilderApiClient.ts"],"sourcesContent":["export type BuilderApiQueryValue = string | number | boolean | null | undefined;\nexport type BuilderApiQuery = Record<string, BuilderApiQueryValue>;\n\nexport type BuilderApiTransport = {\n get<T>(path: string, options?: { query?: BuilderApiQuery }): Promise<T>;\n post<T>(path: string, body?: unknown, options?: { query?: BuilderApiQuery }): Promise<T>;\n patch<T>(path: string, body?: unknown, options?: { query?: BuilderApiQuery }): Promise<T>;\n delete<T>(path: string, options?: { query?: BuilderApiQuery }): Promise<T>;\n upload?<T>(path: string, body: Blob, options?: { contentType: string }): Promise<T>;\n};\n\nexport type BuilderFieldOptionsQuery = {\n search?: string;\n depends?: Record<string, string | undefined>;\n};\n\nexport type BuilderApiClientOptions = {\n apiBasePath?: string;\n};\n\nexport type BuilderApiContracts = {\n BuilderDbTable: unknown;\n BuilderForm: { id: string };\n BuilderList: { id: string };\n BuilderView: { id: string };\n BuilderViewEntry: { id: string };\n ListBuilderFormsQuery: object;\n ListBuilderFormsResponse: unknown;\n CreateBuilderFormInput: unknown;\n UpdateBuilderFormInput: unknown;\n ListBuilderListsQuery: object;\n ListBuilderListsResponse: unknown;\n CreateBuilderListInput: unknown;\n UpdateBuilderListInput: unknown;\n ListBuilderViewsQuery: object;\n ListBuilderViewsResponse: unknown;\n CreateBuilderViewInput: unknown;\n UpdateBuilderViewInput: unknown;\n ReplicateBuilderEntityInput: unknown;\n CreateBuilderViewEntryInput: unknown;\n CreateCompositeBuilderViewEntryInput: unknown;\n UpdateCompositeBuilderViewEntryInput: unknown;\n UpdateBuilderViewEntryInput: unknown;\n ListBuilderFieldOptionsQuery: BuilderFieldOptionsQuery;\n ListBuilderFieldOptionsResponse: unknown;\n RunBuilderFieldTriggerInput: unknown;\n BuilderFieldTriggerEvent: string;\n BuilderFieldTriggerResponse: unknown;\n ListBuilderViewEntriesQuery: object;\n ListBuilderViewEntriesResponse: unknown;\n BuilderFileUploadRequest: unknown;\n BuilderFileUploadResponse: unknown;\n BuilderFilePresignResponse: unknown;\n};\n\nfunction queryParams(query: object): BuilderApiQuery {\n return { ...query } as BuilderApiQuery;\n}\n\nfunction fieldOptionsQueryParams(query: BuilderFieldOptionsQuery): BuilderApiQuery {\n const flatQuery: BuilderApiQuery = { search: query.search };\n for (const [key, value] of Object.entries(query.depends ?? {})) {\n flatQuery[`depends.${key}`] = value;\n }\n return flatQuery;\n}\n\nexport function createBuilderApiClient<C extends BuilderApiContracts>(\n rootTransport: BuilderApiTransport,\n options: BuilderApiClientOptions = {},\n) {\n const basePath = options.apiBasePath?.trim().replace(/\\/+$/g, \"\") ?? \"\";\n const path = (value: string) => `${basePath}${value}`;\n const transport: BuilderApiTransport = {\n get: (value, requestOptions) => rootTransport.get(path(value), requestOptions),\n post: (value, body, requestOptions) => rootTransport.post(path(value), body, requestOptions),\n patch: (value, body, requestOptions) => rootTransport.patch(path(value), body, requestOptions),\n delete: (value, requestOptions) => rootTransport.delete(path(value), requestOptions),\n upload: rootTransport.upload\n ? (value, body, requestOptions) => rootTransport.upload!(path(value), body, requestOptions)\n : undefined,\n };\n\n return {\n listBuilderForms: (query: C[\"ListBuilderFormsQuery\"]) =>\n transport.get<C[\"ListBuilderFormsResponse\"]>(\"/builder/forms\", {\n query: queryParams(query),\n }),\n\n listBuilderDbTables: () =>\n transport.get<C[\"BuilderDbTable\"][]>(\"/builder/datasources/tables\"),\n\n listBuilderFormOptions: () =>\n transport.get<C[\"BuilderForm\"][]>(\"/builder/forms/options\"),\n\n getBuilderForm: (id: string) =>\n transport.get<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}`),\n\n createBuilderForm: (input: C[\"CreateBuilderFormInput\"]) =>\n transport.post<C[\"BuilderForm\"]>(\"/builder/forms\", input),\n\n updateBuilderForm: (id: string, input: C[\"UpdateBuilderFormInput\"]) =>\n transport.patch<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}`, input),\n\n replicateBuilderForm: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderForm: (id: string) =>\n transport.delete<void>(`/builder/forms/${encodeURIComponent(id)}`),\n\n listBuilderLists: (query: C[\"ListBuilderListsQuery\"]) =>\n transport.get<C[\"ListBuilderListsResponse\"]>(\"/builder/lists\", {\n query: queryParams(query),\n }),\n\n listBuilderListOptions: () => transport.get<C[\"BuilderList\"][]>(\"/builder/lists/options\"),\n\n getBuilderList: (id: string) =>\n transport.get<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}`),\n\n createBuilderList: (input: C[\"CreateBuilderListInput\"]) =>\n transport.post<C[\"BuilderList\"]>(\"/builder/lists\", input),\n\n updateBuilderList: (id: string, input: C[\"UpdateBuilderListInput\"]) =>\n transport.patch<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}`, input),\n\n replicateBuilderList: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderList: (id: string) =>\n transport.delete<void>(`/builder/lists/${encodeURIComponent(id)}`),\n\n listBuilderViews: (query: C[\"ListBuilderViewsQuery\"]) =>\n transport.get<C[\"ListBuilderViewsResponse\"]>(\"/builder/views\", {\n query: queryParams(query),\n }),\n\n getBuilderView: (id: string) =>\n transport.get<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}`),\n\n createBuilderView: (input: C[\"CreateBuilderViewInput\"]) =>\n transport.post<C[\"BuilderView\"]>(\"/builder/views\", input),\n\n updateBuilderView: (id: string, input: C[\"UpdateBuilderViewInput\"]) =>\n transport.patch<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}`, input),\n\n replicateBuilderView: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderView: (id: string) =>\n transport.delete<void>(`/builder/views/${encodeURIComponent(id)}`),\n\n getRuntimeBuilderForm: (id: string) =>\n transport.get<C[\"BuilderForm\"]>(`/builder/runtime/forms/${encodeURIComponent(id)}`),\n\n createRuntimeBuilderFormEntry: (formId: string, input: C[\"CreateBuilderViewEntryInput\"]) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/entries`,\n input,\n ),\n\n listRuntimeBuilderFormFieldOptions: (\n formId: string,\n fieldKey: string,\n query: C[\"ListBuilderFieldOptionsQuery\"],\n ) =>\n transport.get<C[\"ListBuilderFieldOptionsResponse\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/fields/${encodeURIComponent(fieldKey)}/options`,\n { query: fieldOptionsQueryParams(query) },\n ),\n\n runRuntimeBuilderFormFieldTrigger: (\n formId: string,\n fieldKey: string,\n event: C[\"BuilderFieldTriggerEvent\"],\n input: C[\"RunBuilderFieldTriggerInput\"],\n ) =>\n transport.post<C[\"BuilderFieldTriggerResponse\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/fields/${encodeURIComponent(fieldKey)}/triggers/${encodeURIComponent(event)}`,\n input,\n ),\n\n getRuntimeBuilderList: (id: string) =>\n transport.get<C[\"BuilderList\"]>(`/builder/runtime/lists/${encodeURIComponent(id)}`),\n\n listRuntimeBuilderListEntries: (listId: string, query: C[\"ListBuilderViewEntriesQuery\"]) =>\n transport.get<C[\"ListBuilderViewEntriesResponse\"]>(\n `/builder/runtime/lists/${encodeURIComponent(listId)}/entries`,\n { query: queryParams(query) },\n ),\n\n getRuntimeBuilderView: (id: string) =>\n transport.get<C[\"BuilderView\"]>(`/builder/runtime/views/${encodeURIComponent(id)}`),\n\n runRuntimeBuilderViewFieldTrigger: (\n viewId: string,\n fieldKey: string,\n event: C[\"BuilderFieldTriggerEvent\"],\n input: C[\"RunBuilderFieldTriggerInput\"],\n ) =>\n transport.post<C[\"BuilderFieldTriggerResponse\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/fields/${encodeURIComponent(fieldKey)}/triggers/${encodeURIComponent(event)}`,\n input,\n ),\n\n listBuilderViewEntries: (viewId: string, query: C[\"ListBuilderViewEntriesQuery\"]) =>\n transport.get<C[\"ListBuilderViewEntriesResponse\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries`,\n { query: queryParams(query) },\n ),\n\n createBuilderViewEntry: (viewId: string, input: C[\"CreateBuilderViewEntryInput\"]) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries`,\n input,\n ),\n\n createCompositeBuilderViewEntry: (\n viewId: string,\n input: C[\"CreateCompositeBuilderViewEntryInput\"],\n ) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/composite-entries`,\n input,\n ),\n\n updateCompositeBuilderViewEntry: (\n viewId: string,\n id: string,\n input: C[\"UpdateCompositeBuilderViewEntryInput\"],\n ) =>\n transport.patch<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/composite-entries/${encodeURIComponent(id)}`,\n input,\n ),\n\n updateBuilderViewEntry: (viewId: string, id: string, input: C[\"UpdateBuilderViewEntryInput\"]) =>\n transport.patch<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries/${encodeURIComponent(id)}`,\n input,\n ),\n\n deleteBuilderViewEntry: (viewId: string, id: string) =>\n transport.delete<void>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries/${encodeURIComponent(id)}`,\n ),\n\n presignRuntimeBuilderFile: (\n context: { formId?: string; viewId?: string },\n fieldKey: string,\n input: C[\"BuilderFileUploadRequest\"],\n ) => {\n const owner = context.viewId ? `views/${encodeURIComponent(context.viewId)}` : `forms/${encodeURIComponent(context.formId ?? \"\")}`;\n return transport.post<C[\"BuilderFilePresignResponse\"]>(\n `/builder/runtime/${owner}/fields/${encodeURIComponent(fieldKey)}/files/presign`,\n input,\n );\n },\n\n uploadRuntimeBuilderFile: (\n context: { formId?: string; viewId?: string },\n fieldKey: string,\n file: Blob,\n ) => {\n if (!transport.upload) throw new Error(\"Builder transport server file upload дэмжихгүй байна\");\n const owner = context.viewId ? `views/${encodeURIComponent(context.viewId)}` : `forms/${encodeURIComponent(context.formId ?? \"\")}`;\n return transport.upload<C[\"BuilderFileUploadResponse\"]>(\n `/builder/runtime/${owner}/fields/${encodeURIComponent(fieldKey)}/files/upload`,\n file,\n { contentType: file.type },\n );\n },\n };\n}\n\nexport type BuilderApiClient<C extends BuilderApiContracts> = ReturnType<\n typeof createBuilderApiClient<C>\n>;\n"],"mappings":"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","names":[]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { R as RuntimeEntryDialogDraftRowsChange } from '../RuntimeEntryDialog-
|
|
2
|
-
export { D as DynamicFormContracts, a as DynamicFormDependencies, b as DynamicFormErrorStateProps, c as DynamicFormFieldsProps, d as DynamicFormNotifications, e as DynamicFormProps, f as DynamicFormShellProps, g as DynamicFormSubmitProps, h as DynamicListContracts, i as DynamicListDataGridProps, j as DynamicListDependencies, k as DynamicListErrorStateProps, l as DynamicListProps, m as DynamicViewAddButtonProps, n as DynamicViewColumnActions, o as DynamicViewContracts, p as DynamicViewDataGridProps, q as DynamicViewDeleteDialogProps, r as DynamicViewDependencies, s as DynamicViewEntryDialogProps, t as DynamicViewErrorStateProps, u as DynamicViewInteractionEvent, v as DynamicViewProps, w as RuntimeEntryDialogActionsProps, x as RuntimeEntryDialogDependencies, y as RuntimeEntryDialogFieldsProps, z as RuntimeEntryDialogNotifications, A as RuntimeEntryDialogProps, B as RuntimeEntryDialogSaveArgs, C as RuntimeEntryDialogShellProps, E as RuntimeEntryDialogViewLike, F as createDynamicFormComponent, G as createDynamicListComponent, H as createDynamicViewComponent, I as createRuntimeEntryDialogComponent, J as shouldHandleDynamicViewRowClick } from '../RuntimeEntryDialog-
|
|
1
|
+
import { R as RuntimeEntryDialogDraftRowsChange } from '../RuntimeEntryDialog-B4TbF8os.js';
|
|
2
|
+
export { D as DynamicFormContracts, a as DynamicFormDependencies, b as DynamicFormErrorStateProps, c as DynamicFormFieldsProps, d as DynamicFormNotifications, e as DynamicFormProps, f as DynamicFormShellProps, g as DynamicFormSubmitProps, h as DynamicListContracts, i as DynamicListDataGridProps, j as DynamicListDependencies, k as DynamicListErrorStateProps, l as DynamicListProps, m as DynamicViewAddButtonProps, n as DynamicViewColumnActions, o as DynamicViewContracts, p as DynamicViewDataGridProps, q as DynamicViewDeleteDialogProps, r as DynamicViewDependencies, s as DynamicViewEntryDialogProps, t as DynamicViewErrorStateProps, u as DynamicViewInteractionEvent, v as DynamicViewProps, w as RuntimeEntryDialogActionsProps, x as RuntimeEntryDialogDependencies, y as RuntimeEntryDialogFieldsProps, z as RuntimeEntryDialogNotifications, A as RuntimeEntryDialogProps, B as RuntimeEntryDialogSaveArgs, C as RuntimeEntryDialogShellProps, E as RuntimeEntryDialogViewLike, F as createDynamicFormComponent, G as createDynamicListComponent, H as createDynamicViewComponent, I as createRuntimeEntryDialogComponent, J as shouldHandleDynamicViewRowClick } from '../RuntimeEntryDialog-B4TbF8os.js';
|
|
3
3
|
import * as react from 'react';
|
|
4
4
|
import { ReactNode, ComponentType } from 'react';
|
|
5
5
|
import { BuilderApiContracts } from '../api/index.js';
|
|
6
6
|
import { BuilderHooks } from '../hooks/index.js';
|
|
7
|
-
import { BuilderRuntimePresentation, BuilderRuntimeFormSchemaLike, BuilderRuntimeEntryLike, BuilderRuntimeEntryValues } from '../
|
|
7
|
+
import { B as BuilderRuntimePresentation, a as BuilderRuntimeFormSchemaLike, b as BuilderRuntimeEntryLike, c as BuilderRuntimeEntryValues } from '../runtimeUtils-CCtLyIf1.js';
|
|
8
8
|
import '@tanstack/react-query';
|
|
9
9
|
|
|
10
10
|
type RuntimeDatasourceLike = {
|
|
@@ -93,6 +93,7 @@ type RuntimeSubformDialogFieldsProps<TSchema> = {
|
|
|
93
93
|
viewId: string;
|
|
94
94
|
schema: TSchema;
|
|
95
95
|
namePrefix: "values";
|
|
96
|
+
parentValues?: Record<string, unknown>;
|
|
96
97
|
};
|
|
97
98
|
type RuntimeSubformDialogActionsProps = {
|
|
98
99
|
isSaving: boolean;
|
package/dist/components/index.js
CHANGED
|
@@ -6,6 +6,8 @@ import { FormProvider, useForm } from "react-hook-form";
|
|
|
6
6
|
|
|
7
7
|
// src/runtime/runtimeUtils.ts
|
|
8
8
|
function emptyFieldValue(field) {
|
|
9
|
+
if (field.defaultValue !== void 0) return field.defaultValue;
|
|
10
|
+
if (field.type === "file" && field.multiple) return [];
|
|
9
11
|
return field.type === "checkbox" ? false : "";
|
|
10
12
|
}
|
|
11
13
|
function createBuilderFormDefaultValues(schema) {
|
|
@@ -215,7 +217,7 @@ function createDynamicViewComponent(deps) {
|
|
|
215
217
|
}
|
|
216
218
|
|
|
217
219
|
// src/components/RuntimeEntryDialog.tsx
|
|
218
|
-
import { useEffect, useMemo as useMemo4, useState as useState2 } from "react";
|
|
220
|
+
import { useEffect, useMemo as useMemo4, useRef, useState as useState2 } from "react";
|
|
219
221
|
import { FormProvider as FormProvider2, useForm as useForm2 } from "react-hook-form";
|
|
220
222
|
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
221
223
|
function isDbTableSource(source) {
|
|
@@ -241,6 +243,12 @@ function childRowPayload(row, includeIdentity) {
|
|
|
241
243
|
...values
|
|
242
244
|
};
|
|
243
245
|
}
|
|
246
|
+
function hasDraftChange(row) {
|
|
247
|
+
return row.values._delete === true || row.values._draftNew === true || row.values._draftDirty === true;
|
|
248
|
+
}
|
|
249
|
+
function changedChildPayloads(rows, includeIdentity) {
|
|
250
|
+
return rows.filter(hasDraftChange).filter((row) => includeIdentity || row.values._delete !== true).map((row) => childRowPayload(row, includeIdentity));
|
|
251
|
+
}
|
|
244
252
|
function createRuntimeEntryDialogComponent(deps) {
|
|
245
253
|
return function RuntimeEntryDialog({
|
|
246
254
|
open,
|
|
@@ -251,6 +259,7 @@ function createRuntimeEntryDialogComponent(deps) {
|
|
|
251
259
|
isSaving
|
|
252
260
|
}) {
|
|
253
261
|
const [draftSubforms, setDraftSubforms] = useState2({});
|
|
262
|
+
const isSubmittingRef = useRef(false);
|
|
254
263
|
const compositeCreate = deps.useCreateCompositeEntry?.(view.id);
|
|
255
264
|
const compositeUpdate = deps.useUpdateCompositeEntry?.(view.id);
|
|
256
265
|
const form = useForm2({
|
|
@@ -258,16 +267,18 @@ function createRuntimeEntryDialogComponent(deps) {
|
|
|
258
267
|
values: open ? createBuilderEntryDefaultValues(view, editing) : void 0
|
|
259
268
|
});
|
|
260
269
|
const mainTableName = runtimeViewTableName(view);
|
|
261
|
-
const
|
|
262
|
-
() => Object.values(draftSubforms).some((draft) => draft.rows.
|
|
270
|
+
const hasDraftChanges = useMemo4(
|
|
271
|
+
() => Object.values(draftSubforms).some((draft) => draft.rows.some(hasDraftChange)),
|
|
263
272
|
[draftSubforms]
|
|
264
273
|
);
|
|
265
274
|
useEffect(() => {
|
|
266
275
|
if (open) setDraftSubforms({});
|
|
267
276
|
}, [open]);
|
|
268
277
|
const onSubmit = form.handleSubmit(async (values) => {
|
|
278
|
+
if (isSubmittingRef.current) return;
|
|
279
|
+
isSubmittingRef.current = true;
|
|
269
280
|
try {
|
|
270
|
-
if (!editing &&
|
|
281
|
+
if (!editing && hasDraftChanges) {
|
|
271
282
|
if (!mainTableName) throw new Error("Main form datasource table \u043E\u043B\u0434\u0441\u043E\u043D\u0433\u04AF\u0439");
|
|
272
283
|
if (!compositeCreate) throw new Error("Composite create handler \u0442\u043E\u0445\u0438\u0440\u0443\u0443\u043B\u0430\u0433\u0434\u0430\u0430\u0433\u04AF\u0439 \u0431\u0430\u0439\u043D\u0430");
|
|
273
284
|
await compositeCreate.mutateAsync({
|
|
@@ -276,12 +287,12 @@ function createRuntimeEntryDialogComponent(deps) {
|
|
|
276
287
|
...Object.fromEntries(
|
|
277
288
|
Object.values(draftSubforms).map((draft) => [
|
|
278
289
|
draft.dataKey,
|
|
279
|
-
draft.rows
|
|
290
|
+
changedChildPayloads(draft.rows, false)
|
|
280
291
|
])
|
|
281
292
|
)
|
|
282
293
|
}
|
|
283
294
|
});
|
|
284
|
-
} else if (editing &&
|
|
295
|
+
} else if (editing && hasDraftChanges) {
|
|
285
296
|
if (!mainTableName) throw new Error("Main form datasource table \u043E\u043B\u0434\u0441\u043E\u043D\u0433\u04AF\u0439");
|
|
286
297
|
if (!compositeUpdate) throw new Error("Composite update handler \u0442\u043E\u0445\u0438\u0440\u0443\u0443\u043B\u0430\u0433\u0434\u0430\u0430\u0433\u04AF\u0439 \u0431\u0430\u0439\u043D\u0430");
|
|
287
298
|
await compositeUpdate.mutateAsync({
|
|
@@ -296,7 +307,7 @@ function createRuntimeEntryDialogComponent(deps) {
|
|
|
296
307
|
...Object.fromEntries(
|
|
297
308
|
Object.values(draftSubforms).map((draft) => [
|
|
298
309
|
draft.dataKey,
|
|
299
|
-
draft.rows
|
|
310
|
+
changedChildPayloads(draft.rows, true)
|
|
300
311
|
])
|
|
301
312
|
)
|
|
302
313
|
}
|
|
@@ -309,6 +320,8 @@ function createRuntimeEntryDialogComponent(deps) {
|
|
|
309
320
|
deps.notifications.success(editing ? "\u041C\u04E9\u0440 \u0445\u0430\u0434\u0433\u0430\u043B\u0430\u0433\u0434\u043B\u0430\u0430" : "\u041C\u04E9\u0440 \u043D\u044D\u043C\u044D\u0433\u0434\u043B\u044D\u044D");
|
|
310
321
|
} catch (error) {
|
|
311
322
|
deps.notifications.error(deps.notifications.errorMessage(error, "\u0425\u0430\u0434\u0433\u0430\u043B\u0430\u0445\u0430\u0434 \u0430\u043B\u0434\u0430\u0430 \u0433\u0430\u0440\u043B\u0430\u0430"));
|
|
323
|
+
} finally {
|
|
324
|
+
isSubmittingRef.current = false;
|
|
312
325
|
}
|
|
313
326
|
});
|
|
314
327
|
const saving = isSaving || Boolean(compositeCreate?.isPending || compositeUpdate?.isPending);
|
|
@@ -357,8 +370,8 @@ function createRuntimeEntryDialogComponent(deps) {
|
|
|
357
370
|
}
|
|
358
371
|
|
|
359
372
|
// src/components/RuntimeSubformField.tsx
|
|
360
|
-
import { useEffect as useEffect2, useMemo as useMemo5, useRef, useState as useState3 } from "react";
|
|
361
|
-
import { FormProvider as FormProvider3, useForm as useForm3 } from "react-hook-form";
|
|
373
|
+
import { useEffect as useEffect2, useMemo as useMemo5, useRef as useRef2, useState as useState3 } from "react";
|
|
374
|
+
import { FormProvider as FormProvider3, useForm as useForm3, useFormContext, useWatch } from "react-hook-form";
|
|
362
375
|
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
363
376
|
function subformButtonLabel(subform) {
|
|
364
377
|
return subform.buttonLabel?.trim() || subform.label;
|
|
@@ -385,7 +398,7 @@ function draftEntry(values, editing) {
|
|
|
385
398
|
return {
|
|
386
399
|
id: editing?.id ?? crypto.randomUUID(),
|
|
387
400
|
viewId: editing?.viewId ?? "",
|
|
388
|
-
values: editing ? values.values : { ...values.values, _draftNew: true },
|
|
401
|
+
values: editing ? { ...values.values, _draftDirty: true } : { ...values.values, _draftNew: true },
|
|
389
402
|
version: editing?.version ?? 0,
|
|
390
403
|
createdAt: editing?.createdAt ?? now,
|
|
391
404
|
updatedAt: now
|
|
@@ -398,6 +411,7 @@ function RuntimeSubformEntryDialog({
|
|
|
398
411
|
view,
|
|
399
412
|
childField,
|
|
400
413
|
parentValue: linkedParentValue,
|
|
414
|
+
parentValues,
|
|
401
415
|
editing,
|
|
402
416
|
isDraft,
|
|
403
417
|
isSaving,
|
|
@@ -462,7 +476,8 @@ function RuntimeSubformEntryDialog({
|
|
|
462
476
|
formId: view.form.id,
|
|
463
477
|
viewId: view.id,
|
|
464
478
|
schema: view.form.schema,
|
|
465
|
-
namePrefix: "values"
|
|
479
|
+
namePrefix: "values",
|
|
480
|
+
parentValues
|
|
466
481
|
}
|
|
467
482
|
) : null,
|
|
468
483
|
/* @__PURE__ */ jsx5(
|
|
@@ -486,10 +501,13 @@ function createRuntimeSubformFieldComponent(deps) {
|
|
|
486
501
|
draftRows = [],
|
|
487
502
|
onDraftRowsChange
|
|
488
503
|
}) {
|
|
504
|
+
const { control } = useFormContext();
|
|
505
|
+
const watchedParentValues = useWatch({ control, name: "values" });
|
|
489
506
|
const [isEntryDialogOpen, setEntryDialogOpen] = useState3(false);
|
|
490
507
|
const [editing, setEditing] = useState3(null);
|
|
491
|
-
const initializedDraft =
|
|
508
|
+
const initializedDraft = useRef2(false);
|
|
492
509
|
const linkedValue = parentValue(parentEntry, subform.parentField);
|
|
510
|
+
const parentValues = watchedParentValues && typeof watchedParentValues === "object" && !Array.isArray(watchedParentValues) ? watchedParentValues : void 0;
|
|
493
511
|
const isDraftMode = Boolean(onDraftRowsChange);
|
|
494
512
|
const canFetchBackendRows = Boolean(linkedValue);
|
|
495
513
|
const canUseBackendRows = canFetchBackendRows && !isDraftMode;
|
|
@@ -579,6 +597,7 @@ function createRuntimeSubformFieldComponent(deps) {
|
|
|
579
597
|
view,
|
|
580
598
|
childField: subform.childField,
|
|
581
599
|
parentValue: linkedValue,
|
|
600
|
+
parentValues,
|
|
582
601
|
editing,
|
|
583
602
|
isDraft: isDraftMode,
|
|
584
603
|
isSaving: canUseBackendRows ? save.isPending : false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/DynamicForm.tsx","../../src/runtime/runtimeUtils.ts","../../src/components/DynamicList.tsx","../../src/components/DynamicView.tsx","../../src/components/RuntimeEntryDialog.tsx","../../src/components/RuntimeSubformField.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport {\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimeFormValues,\n createBuilderFormDefaultValues,\n} from \"../runtime\";\n\nexport type DynamicFormContracts = BuilderApiContracts & {\n BuilderForm: {\n id: string;\n title: string;\n schema: BuilderRuntimeFormSchemaLike;\n };\n CreateBuilderViewEntryInput: BuilderRuntimeFormValues;\n};\n\nexport type DynamicFormProps = {\n formId: string;\n};\n\nexport type DynamicFormShellProps = {\n title: string;\n children: ReactNode;\n};\n\nexport type DynamicFormFieldsProps<TSchema> = {\n formId: string;\n schema: TSchema;\n namePrefix: \"values\";\n};\n\nexport type DynamicFormSubmitProps = {\n isSaving: boolean;\n};\n\nexport type DynamicFormErrorStateProps = {\n title: string;\n description: string;\n};\n\nexport type DynamicFormNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type DynamicFormDependencies<C extends DynamicFormContracts> = {\n hooks: Pick<BuilderHooks<C>, \"useRuntimeBuilderForm\" | \"useSaveRuntimeBuilderFormEntry\">;\n FormShell: ComponentType<DynamicFormShellProps>;\n FormFields: ComponentType<DynamicFormFieldsProps<C[\"BuilderForm\"][\"schema\"]>>;\n SubmitButton: ComponentType<DynamicFormSubmitProps>;\n ErrorState: ComponentType<DynamicFormErrorStateProps>;\n notifications: DynamicFormNotifications;\n};\n\nexport function createDynamicFormComponent<C extends DynamicFormContracts>(\n deps: DynamicFormDependencies<C>,\n) {\n return function DynamicForm({ formId }: DynamicFormProps) {\n const query = deps.hooks.useRuntimeBuilderForm(formId);\n const save = deps.hooks.useSaveRuntimeBuilderFormEntry(formId);\n const formValues = useMemo(\n () => (query.data ? createBuilderFormDefaultValues(query.data.schema) : undefined),\n [query.data],\n );\n const form = useForm<BuilderRuntimeFormValues>({\n defaultValues: createBuilderFormDefaultValues(query.data?.schema),\n values: formValues,\n });\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await save.mutateAsync(values as C[\"CreateBuilderViewEntryInput\"]);\n form.reset(createBuilderFormDefaultValues(query.data?.schema));\n deps.notifications.success(\"Form хадгалагдлаа\");\n } catch (error) {\n deps.notifications.error(deps.notifications.errorMessage(error, \"Хадгалахад алдаа гарлаа\"));\n }\n });\n\n if (query.isError) {\n return (\n <deps.ErrorState\n title=\"Form нээгдсэнгүй\"\n description={`«${formId}» id-тай form олдсонгүй.`}\n />\n );\n }\n\n if (!query.data) return null;\n\n return (\n <deps.FormShell title={query.data.title}>\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className=\"space-y-6\">\n <deps.FormFields formId={formId} schema={query.data.schema} namePrefix=\"values\" />\n <deps.SubmitButton isSaving={save.isPending} />\n </form>\n </FormProvider>\n </deps.FormShell>\n );\n };\n}\n","export type BuilderRuntimeFieldLike = {\n key: string;\n type: string;\n};\n\nexport type BuilderRuntimePresentation = \"dialog\" | \"drawer\";\n\nexport type BuilderRuntimeFormSchemaLike = {\n presentation?: BuilderRuntimePresentation;\n fields: readonly BuilderRuntimeFieldLike[];\n};\n\nexport type BuilderRuntimeViewLike = {\n form?: {\n schema: BuilderRuntimeFormSchemaLike;\n } | null;\n};\n\nexport type BuilderRuntimeEntryLike = {\n id: string;\n values: Record<string, unknown>;\n version: number;\n};\n\nexport type BuilderRuntimeFormValues = {\n values: Record<string, unknown>;\n};\n\nexport type BuilderRuntimeEntryValues = BuilderRuntimeFormValues & {\n version: number;\n};\n\nfunction emptyFieldValue(field: BuilderRuntimeFieldLike) {\n return field.type === \"checkbox\" ? false : \"\";\n}\n\nexport function createBuilderFormDefaultValues(\n schema?: BuilderRuntimeFormSchemaLike,\n): BuilderRuntimeFormValues {\n const values: Record<string, unknown> = {};\n for (const field of schema?.fields ?? []) {\n values[field.key] = emptyFieldValue(field);\n }\n return { values };\n}\n\nexport function createBuilderEntryDefaultValues(\n view: BuilderRuntimeViewLike,\n editing: BuilderRuntimeEntryLike | null,\n): BuilderRuntimeEntryValues {\n const values: Record<string, unknown> = {};\n for (const field of view.form?.schema.fields ?? []) {\n const existing = editing?.values[field.key];\n values[field.key] = existing === undefined ? emptyFieldValue(field) : existing;\n }\n return { values, version: editing?.version ?? 0 };\n}\n\nexport function formatBuilderRuntimeValue(value: unknown, locale = \"mn-MN\") {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (typeof value === \"boolean\") return value ? \"Тийм\" : \"Үгүй\";\n if (typeof value === \"number\") return new Intl.NumberFormat(locale).format(value);\n return String(value);\n}\n","\"use client\";\n\nimport type { ComponentType } from \"react\";\nimport { useMemo } from \"react\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\n\nexport type DynamicListContracts = BuilderApiContracts & {\n BuilderList: {\n id: string;\n title: string;\n description?: string | null;\n };\n BuilderViewEntry: {\n id: string;\n };\n ListBuilderViewEntriesResponse: {\n items: Array<BuilderApiContracts[\"BuilderViewEntry\"]>;\n total: number;\n };\n};\n\nexport type DynamicListProps = {\n listId: string;\n};\n\nexport type DynamicListDataGridProps<TController> = {\n title?: string;\n description?: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n};\n\nexport type DynamicListErrorStateProps = {\n title: string;\n description: string;\n};\n\nexport type DynamicListDependencies<\n C extends DynamicListContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n> = {\n hooks: Pick<BuilderHooks<C>, \"useRuntimeBuilderList\" | \"useRuntimeBuilderListEntries\">;\n buildColumns(list: C[\"BuilderList\"]): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n DataGrid: ComponentType<DynamicListDataGridProps<TController>>;\n ErrorState: ComponentType<DynamicListErrorStateProps>;\n};\n\nexport function createDynamicListComponent<\n C extends DynamicListContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n>(deps: DynamicListDependencies<C, TColumn, TState, TController>) {\n return function DynamicList({ listId }: DynamicListProps) {\n const query = deps.hooks.useRuntimeBuilderList(listId);\n const state = deps.useDataTableState({ pageSize: 20 });\n const entriesQuery = deps.hooks.useRuntimeBuilderListEntries(listId, state.query);\n const columns = useMemo(() => (query.data ? deps.buildColumns(query.data) : []), [query.data]);\n const entries = entriesQuery.data?.items ?? [];\n const controller = deps.useDataTable({\n columns,\n data: entries as C[\"BuilderViewEntry\"][],\n rowCount: entriesQuery.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n if (query.isError) {\n return (\n <deps.ErrorState\n title=\"List нээгдсэнгүй\"\n description={`«${listId}» id-тай list олдсонгүй.`}\n />\n );\n }\n\n return (\n <deps.DataGrid\n title={query.data?.title ?? \"Dynamic List\"}\n description={query.data?.description ?? `/winu/list?id=${listId}`}\n controller={controller}\n isLoading={query.isPending || entriesQuery.isPending}\n searchPlaceholder=\"Мөр хайх...\"\n emptyTitle=\"Мөр алга\"\n emptyDescription=\"Энэ list-ийн datasource дээр мөр алга.\"\n />\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport type { BuilderRuntimeEntryLike } from \"../runtime\";\n\nexport type DynamicViewContracts = BuilderApiContracts & {\n BuilderView: {\n id: string;\n title: string;\n description?: string | null;\n form?: unknown | null;\n };\n BuilderViewEntry: BuilderRuntimeEntryLike;\n ListBuilderViewEntriesResponse: {\n items: Array<BuilderApiContracts[\"BuilderViewEntry\"]>;\n total: number;\n };\n};\n\nexport type DynamicViewProps = {\n viewId: string;\n};\n\nexport type DynamicViewInteractionEvent = {\n defaultPrevented?: boolean;\n target?: unknown;\n stopPropagation?(): void;\n};\n\nexport type DynamicViewColumnActions<TEntry> = {\n onEdit(entry: TEntry, event?: DynamicViewInteractionEvent): void;\n onDelete(entry: TEntry, event?: DynamicViewInteractionEvent): void;\n};\n\nexport type DynamicViewDataGridProps<TController> = {\n title?: string;\n description?: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n onRowClick?: (row: unknown, event?: DynamicViewInteractionEvent) => void;\n toolbarExtra?: ReactNode;\n};\n\nexport type DynamicViewAddButtonProps = {\n disabled: boolean;\n onAdd(): void;\n};\n\nexport type DynamicViewEntryDialogProps<TView, TEntry, TInput> = {\n open: boolean;\n view: TView;\n editing: TEntry | null;\n onClose(): void;\n onSave(args: { id?: string; input: TInput }): Promise<unknown>;\n isSaving: boolean;\n};\n\nexport type DynamicViewDeleteDialogProps<TEntry> = {\n entry: TEntry | null;\n isDeleting: boolean;\n onClose(): void;\n onConfirm(): Promise<void>;\n};\n\nexport type DynamicViewErrorStateProps = {\n title: string;\n description: string;\n};\n\ntype ClosestTarget = {\n closest(selector: string): unknown;\n};\n\nconst interactiveRowTargetSelector =\n \"button,a,input,select,textarea,[role='button'],[role='menuitem'],[data-builder-row-action]\";\n\nfunction hasClosest(target: unknown): target is ClosestTarget {\n return (\n typeof target === \"object\" &&\n target !== null &&\n \"closest\" in target &&\n typeof target.closest === \"function\"\n );\n}\n\nexport function shouldHandleDynamicViewRowClick(event?: DynamicViewInteractionEvent) {\n if (!event) return true;\n if (event.defaultPrevented) return false;\n return !hasClosest(event.target) || !event.target.closest(interactiveRowTargetSelector);\n}\n\nexport type DynamicViewDependencies<\n C extends DynamicViewContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n> = {\n hooks: Pick<\n BuilderHooks<C>,\n | \"useBuilderViewEntries\"\n | \"useDeleteBuilderViewEntry\"\n | \"useRuntimeBuilderView\"\n | \"useSaveBuilderViewEntry\"\n >;\n buildColumns(\n view: C[\"BuilderView\"],\n actions: DynamicViewColumnActions<C[\"BuilderViewEntry\"]>,\n ): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n DataGrid: ComponentType<DynamicViewDataGridProps<TController>>;\n AddButton: ComponentType<DynamicViewAddButtonProps>;\n EntryDialog: ComponentType<\n DynamicViewEntryDialogProps<\n C[\"BuilderView\"],\n C[\"BuilderViewEntry\"],\n C[\"UpdateBuilderViewEntryInput\"]\n >\n >;\n DeleteDialog: ComponentType<DynamicViewDeleteDialogProps<C[\"BuilderViewEntry\"]>>;\n ErrorState: ComponentType<DynamicViewErrorStateProps>;\n};\n\nexport function createDynamicViewComponent<\n C extends DynamicViewContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n>(deps: DynamicViewDependencies<C, TColumn, TState, TController>) {\n return function DynamicView({ viewId }: DynamicViewProps) {\n const [editing, setEditing] = useState<C[\"BuilderViewEntry\"] | null>(null);\n const [isDialogOpen, setDialogOpen] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<C[\"BuilderViewEntry\"] | null>(null);\n\n const viewQuery = deps.hooks.useRuntimeBuilderView(viewId);\n const state = deps.useDataTableState({ pageSize: 20 });\n const entriesQuery = deps.hooks.useBuilderViewEntries(viewId, state.query);\n const save = deps.hooks.useSaveBuilderViewEntry(viewId);\n const remove = deps.hooks.useDeleteBuilderViewEntry(viewId);\n const view = viewQuery.data;\n\n const columns = useMemo(\n () =>\n view\n ? deps.buildColumns(view, {\n onEdit: (entry, event) => {\n event?.stopPropagation?.();\n setEditing(entry);\n setDialogOpen(true);\n },\n onDelete: (entry, event) => {\n event?.stopPropagation?.();\n setPendingDelete(entry);\n },\n })\n : [],\n [view],\n );\n\n const controller = deps.useDataTable({\n columns,\n data: (entriesQuery.data?.items ?? []) as C[\"BuilderViewEntry\"][],\n rowCount: entriesQuery.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n if (viewQuery.isError) {\n return (\n <deps.ErrorState\n title=\"View нээгдсэнгүй\"\n description={`«${viewId}» id-тай view олдсонгүй.`}\n />\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <deps.DataGrid\n title={view?.title ?? \"Dynamic View\"}\n description={view?.description ?? `/winu/view?id=${viewId}`}\n controller={controller}\n isLoading={viewQuery.isPending || entriesQuery.isPending}\n searchPlaceholder=\"Мөр хайх...\"\n emptyTitle=\"Мөр алга\"\n emptyDescription=\"Энэ view дээр эхний мөрөө нэмээрэй.\"\n onRowClick={(entry, event) => {\n if (!shouldHandleDynamicViewRowClick(event)) return;\n setEditing(entry as C[\"BuilderViewEntry\"]);\n setDialogOpen(true);\n }}\n toolbarExtra={\n <deps.AddButton\n disabled={!view?.form}\n onAdd={() => {\n setEditing(null);\n setDialogOpen(true);\n }}\n />\n }\n />\n\n {view ? (\n <deps.EntryDialog\n open={isDialogOpen}\n view={view}\n editing={editing}\n onClose={() => setDialogOpen(false)}\n onSave={save.mutateAsync}\n isSaving={save.isPending}\n />\n ) : null}\n\n <deps.DeleteDialog\n entry={pendingDelete}\n isDeleting={remove.isPending}\n onClose={() => setPendingDelete(null)}\n onConfirm={async () => {\n if (!pendingDelete) return;\n await remove.mutateAsync(pendingDelete.id);\n setPendingDelete(null);\n }}\n />\n </div>\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport {\n type BuilderRuntimeEntryLike,\n type BuilderRuntimeEntryValues,\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimePresentation,\n type BuilderRuntimeViewLike,\n createBuilderEntryDefaultValues,\n} from \"../runtime\";\n\ntype BuilderRuntimeDatasourceLike =\n | {\n type: \"dbTable\";\n tableName: string;\n }\n | {\n type: string;\n }\n | null;\n\nexport type RuntimeEntryDialogSubformLike = {\n key: string;\n};\n\nexport type RuntimeEntryDialogViewLike = BuilderRuntimeViewLike & {\n id: string;\n title: string;\n list?: {\n source?: BuilderRuntimeDatasourceLike;\n } | null;\n form?: {\n id: string;\n source?: BuilderRuntimeDatasourceLike;\n schema: BuilderRuntimeFormSchemaLike & {\n subforms?: readonly RuntimeEntryDialogSubformLike[];\n };\n } | null;\n};\n\nexport type RuntimeEntryDialogSaveArgs<TInput> = {\n id?: string;\n input: TInput;\n};\n\nexport type RuntimeEntryDialogProps<TView, TEntry, TInput> = {\n open: boolean;\n view: TView;\n editing: TEntry | null;\n onClose: () => void;\n onSave: (args: RuntimeEntryDialogSaveArgs<TInput>) => Promise<unknown>;\n isSaving: boolean;\n};\n\nexport type RuntimeEntryDialogShellProps = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n description: string;\n onClose: () => void;\n children: ReactNode;\n};\n\nexport type RuntimeEntryDialogExtraItem = {\n key: string;\n render: () => ReactNode;\n};\n\nexport type RuntimeEntryDialogFieldsProps<TSchema> = {\n formId: string;\n viewId: string;\n entry?: BuilderRuntimeEntryLike | null;\n schema: TSchema;\n namePrefix: \"values\";\n extraItems?: RuntimeEntryDialogExtraItem[];\n};\n\nexport type RuntimeEntryDialogActionsProps = {\n isSaving: boolean;\n onClose: () => void;\n};\n\nexport type RuntimeEntryDialogNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type RuntimeEntryDialogDraftRowsChange<TEntry> = {\n subformKey: string;\n dataKey: string;\n rows: TEntry[];\n};\n\nexport type RuntimeEntryDialogSubformFieldProps<TSubform, TEntry> = {\n subform: TSubform;\n parentEntry?: TEntry | null;\n draftRows?: TEntry[];\n onDraftRowsChange?(args: RuntimeEntryDialogDraftRowsChange<TEntry>): void;\n};\n\ntype RuntimeEntryDialogDraftSubform<TEntry> = {\n dataKey: string;\n rows: TEntry[];\n};\n\ntype RuntimeCompositeData = Record<\n string,\n Record<string, unknown> | Array<Record<string, unknown>>\n>;\n\ntype RuntimeCompositeCreateInput = {\n data: RuntimeCompositeData;\n};\n\ntype RuntimeCompositeUpdateInput = {\n data: RuntimeCompositeData;\n};\n\ntype RuntimeMutation<TInput> = {\n mutateAsync(input: TInput): Promise<unknown>;\n isPending: boolean;\n};\n\nexport type RuntimeEntryDialogDependencies<\n TView extends RuntimeEntryDialogViewLike,\n TEntry extends BuilderRuntimeEntryLike = BuilderRuntimeEntryLike,\n> = {\n DialogShell: ComponentType<RuntimeEntryDialogShellProps>;\n FormFields: ComponentType<RuntimeEntryDialogFieldsProps<NonNullable<TView[\"form\"]>[\"schema\"]>>;\n Actions: ComponentType<RuntimeEntryDialogActionsProps>;\n formClassName?: string;\n SubformField?: ComponentType<\n RuntimeEntryDialogSubformFieldProps<\n NonNullable<NonNullable<TView[\"form\"]>[\"schema\"][\"subforms\"]>[number],\n TEntry\n >\n >;\n useCreateCompositeEntry?(viewId: string): RuntimeMutation<RuntimeCompositeCreateInput>;\n useUpdateCompositeEntry?(\n viewId: string,\n ): RuntimeMutation<{ id: string; input: RuntimeCompositeUpdateInput }>;\n notifications: RuntimeEntryDialogNotifications;\n};\n\nfunction isDbTableSource(\n source: BuilderRuntimeDatasourceLike | undefined,\n): source is { type: \"dbTable\"; tableName: string } {\n return source?.type === \"dbTable\" && \"tableName\" in source;\n}\n\nfunction runtimeViewTableName(view: RuntimeEntryDialogViewLike) {\n const listSource = view.list?.source;\n if (isDbTableSource(listSource)) return listSource.tableName;\n const formSource = view.form?.source;\n return isDbTableSource(formSource) ? formSource.tableName : undefined;\n}\n\nfunction cleanRowValues(values: Record<string, unknown>) {\n return Object.fromEntries(\n Object.entries(values).filter(([key]) => key === \"_delete\" || !key.startsWith(\"_\")),\n );\n}\n\nfunction childRowPayload(row: BuilderRuntimeEntryLike, includeIdentity: boolean) {\n const values = cleanRowValues(row.values);\n if (!includeIdentity || row.values._draftNew === true) return values;\n return {\n id: row.id,\n version: row.version,\n ...values,\n };\n}\n\nexport function createRuntimeEntryDialogComponent<\n TView extends RuntimeEntryDialogViewLike,\n TEntry extends BuilderRuntimeEntryLike,\n TInput extends BuilderRuntimeEntryValues,\n>(deps: RuntimeEntryDialogDependencies<TView, TEntry>) {\n return function RuntimeEntryDialog({\n open,\n view,\n editing,\n onClose,\n onSave,\n isSaving,\n }: RuntimeEntryDialogProps<TView, TEntry, TInput>) {\n const [draftSubforms, setDraftSubforms] = useState<\n Record<string, RuntimeEntryDialogDraftSubform<TEntry>>\n >({});\n const compositeCreate = deps.useCreateCompositeEntry?.(view.id);\n const compositeUpdate = deps.useUpdateCompositeEntry?.(view.id);\n const form = useForm<BuilderRuntimeEntryValues>({\n defaultValues: createBuilderEntryDefaultValues(view, editing),\n values: open ? createBuilderEntryDefaultValues(view, editing) : undefined,\n });\n const mainTableName = runtimeViewTableName(view);\n const hasDraftRows = useMemo(\n () => Object.values(draftSubforms).some((draft) => draft.rows.length > 0),\n [draftSubforms],\n );\n\n useEffect(() => {\n if (open) setDraftSubforms({});\n }, [open]);\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n if (!editing && hasDraftRows) {\n if (!mainTableName) throw new Error(\"Main form datasource table олдсонгүй\");\n if (!compositeCreate) throw new Error(\"Composite create handler тохируулагдаагүй байна\");\n await compositeCreate.mutateAsync({\n data: {\n [mainTableName]: values.values,\n ...Object.fromEntries(\n Object.values(draftSubforms).map((draft) => [\n draft.dataKey,\n draft.rows\n .filter((row) => row.values._delete !== true)\n .map((row) => childRowPayload(row, false)),\n ]),\n ),\n },\n });\n } else if (editing && hasDraftRows) {\n if (!mainTableName) throw new Error(\"Main form datasource table олдсонгүй\");\n if (!compositeUpdate) throw new Error(\"Composite update handler тохируулагдаагүй байна\");\n await compositeUpdate.mutateAsync({\n id: editing.id,\n input: {\n data: {\n [mainTableName]: {\n id: editing.id,\n version: values.version,\n ...values.values,\n },\n ...Object.fromEntries(\n Object.values(draftSubforms).map((draft) => [\n draft.dataKey,\n draft.rows.map((row) => childRowPayload(row, true)),\n ]),\n ),\n },\n },\n });\n } else {\n await onSave({ id: editing?.id, input: values as TInput });\n }\n onClose();\n deps.notifications.success(editing ? \"Мөр хадгалагдлаа\" : \"Мөр нэмэгдлээ\");\n } catch (error) {\n deps.notifications.error(deps.notifications.errorMessage(error, \"Хадгалахад алдаа гарлаа\"));\n }\n });\n\n const saving = isSaving || Boolean(compositeCreate?.isPending || compositeUpdate?.isPending);\n const extraItems: RuntimeEntryDialogExtraItem[] | undefined =\n deps.SubformField && view.form?.schema.subforms?.length\n ? view.form.schema.subforms.map((subform) => ({\n key: subform.key,\n render: () =>\n deps.SubformField ? (\n <deps.SubformField\n subform={subform}\n parentEntry={editing}\n draftRows={draftSubforms[subform.key]?.rows ?? []}\n onDraftRowsChange={({ subformKey, dataKey, rows }) => {\n setDraftSubforms((current) => ({\n ...current,\n [subformKey]: { dataKey, rows: rows as TEntry[] },\n }));\n }}\n />\n ) : null,\n }))\n : undefined;\n\n return (\n <deps.DialogShell\n open={open}\n presentation={view.form?.schema.presentation ?? \"dialog\"}\n title={editing ? \"Мөр засах\" : \"Мөр нэмэх\"}\n description={view.title}\n onClose={onClose}\n >\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className={deps.formClassName}>\n {view.form ? (\n <deps.FormFields\n formId={view.form.id}\n viewId={view.id}\n entry={editing}\n schema={view.form.schema}\n namePrefix=\"values\"\n extraItems={extraItems}\n />\n ) : null}\n <deps.Actions isSaving={saving} onClose={onClose} />\n </form>\n </FormProvider>\n </deps.DialogShell>\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport {\n type BuilderRuntimeEntryLike,\n type BuilderRuntimeEntryValues,\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimePresentation,\n createBuilderEntryDefaultValues,\n} from \"../runtime\";\nimport type { RuntimeEntryDialogDraftRowsChange } from \"./RuntimeEntryDialog\";\n\ntype RuntimeDatasourceLike =\n | {\n type: \"dbTable\";\n tableName: string;\n }\n | {\n type: string;\n }\n | null;\n\nexport type RuntimeSubformLike = {\n key: string;\n label: string;\n viewId: string;\n parentField: string;\n childField: string;\n buttonLabel?: string;\n presentation?: BuilderRuntimePresentation;\n};\n\nexport type RuntimeSubformViewLike = {\n id: string;\n title: string;\n form?: {\n id: string;\n schema: BuilderRuntimeFormSchemaLike;\n } | null;\n list?: {\n source?: RuntimeDatasourceLike;\n schema: {\n columns: readonly {\n key: string;\n label: string;\n sortable: boolean;\n align: \"left\" | \"right\";\n }[];\n };\n } | null;\n};\n\nexport type RuntimeSubformEntryLike = BuilderRuntimeEntryLike & {\n viewId: string;\n createdAt: string;\n updatedAt: string;\n};\n\ntype RuntimeSubformContracts = BuilderApiContracts & {\n BuilderView: RuntimeSubformViewLike;\n BuilderViewEntry: RuntimeSubformEntryLike;\n ListBuilderViewEntriesResponse: {\n items: RuntimeSubformEntryLike[];\n total: number;\n };\n UpdateBuilderViewEntryInput: BuilderRuntimeEntryValues;\n};\n\ntype ParentEntryLike = {\n id: string;\n values: Record<string, unknown>;\n};\n\nexport type RuntimeSubformFieldProps<TSubform, TEntry> = {\n subform: TSubform;\n parentEntry?: ParentEntryLike | null;\n draftRows?: TEntry[];\n onDraftRowsChange?(args: RuntimeEntryDialogDraftRowsChange<TEntry>): void;\n};\n\nexport type RuntimeSubformShellProps = {\n label: string;\n buttonLabel: string;\n canOpen: boolean;\n missingParentDescription?: ReactNode;\n onAdd(): void;\n children: ReactNode;\n};\n\nexport type RuntimeSubformDataPanelProps<TController, TEntry> = {\n controller: TController;\n isLoading: boolean;\n showDraftDelete: boolean;\n onRowClick(entry: TEntry): void;\n onDeleteSelected(): void;\n};\n\nexport type RuntimeSubformDialogShellProps = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n description: string;\n onClose(): void;\n children: ReactNode;\n};\n\nexport type RuntimeSubformDialogFieldsProps<TSchema> = {\n formId: string;\n viewId: string;\n schema: TSchema;\n namePrefix: \"values\";\n};\n\nexport type RuntimeSubformDialogActionsProps = {\n isSaving: boolean;\n submitLabel: string;\n onClose(): void;\n};\n\nexport type RuntimeSubformNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type RuntimeSubformFieldDependencies<\n C extends RuntimeSubformContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController extends { selectedIds: string[]; clearSelection(): void },\n> = {\n hooks: Pick<\n BuilderHooks<C>,\n \"useBuilderViewEntries\" | \"useRuntimeBuilderView\" | \"useSaveBuilderViewEntry\"\n >;\n buildColumns(view: C[\"BuilderView\"]): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n Shell: ComponentType<RuntimeSubformShellProps>;\n DataPanel: ComponentType<RuntimeSubformDataPanelProps<TController, C[\"BuilderViewEntry\"]>>;\n DialogShell: ComponentType<RuntimeSubformDialogShellProps>;\n DialogFields: ComponentType<\n RuntimeSubformDialogFieldsProps<NonNullable<C[\"BuilderView\"][\"form\"]>[\"schema\"]>\n >;\n DialogActions: ComponentType<RuntimeSubformDialogActionsProps>;\n dialogFormClassName?: string;\n notifications: RuntimeSubformNotifications;\n};\n\nfunction subformButtonLabel(subform: RuntimeSubformLike) {\n return subform.buttonLabel?.trim() || subform.label;\n}\n\nfunction parentValue(entry: ParentEntryLike | null | undefined, field: string) {\n if (!entry) return undefined;\n const value = field === \"id\" ? entry.id : entry.values[field];\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return undefined;\n}\n\nfunction isDbTableSource(\n source: RuntimeDatasourceLike | undefined,\n): source is { type: \"dbTable\"; tableName: string } {\n return source?.type === \"dbTable\" && \"tableName\" in source;\n}\n\nfunction subformFallbackKey(view: RuntimeSubformViewLike) {\n return view.id;\n}\n\nfunction viewTableName(view: RuntimeSubformViewLike) {\n const source = view.list?.source;\n return isDbTableSource(source) ? source.tableName : subformFallbackKey(view);\n}\n\nfunction draftEntry<TEntry extends RuntimeSubformEntryLike>(\n values: BuilderRuntimeEntryValues,\n editing: TEntry | null,\n) {\n const now = new Date().toISOString();\n return {\n id: editing?.id ?? crypto.randomUUID(),\n viewId: editing?.viewId ?? \"\",\n values: editing ? values.values : { ...values.values, _draftNew: true },\n version: editing?.version ?? 0,\n createdAt: editing?.createdAt ?? now,\n updatedAt: now,\n } satisfies RuntimeSubformEntryLike;\n}\n\ntype RuntimeSubformEntryDialogProps<C extends RuntimeSubformContracts> = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n view: C[\"BuilderView\"];\n childField: string;\n parentValue?: string;\n editing: C[\"BuilderViewEntry\"] | null;\n isDraft: boolean;\n isSaving: boolean;\n deps: Pick<\n RuntimeSubformFieldDependencies<\n C,\n unknown,\n { query: C[\"ListBuilderViewEntriesQuery\"] },\n { selectedIds: string[]; clearSelection(): void }\n >,\n \"DialogActions\" | \"DialogFields\" | \"DialogShell\" | \"dialogFormClassName\" | \"notifications\"\n >;\n onClose(): void;\n onSave(args: { id?: string; input: C[\"UpdateBuilderViewEntryInput\"] }): Promise<unknown>;\n};\n\nfunction RuntimeSubformEntryDialog<C extends RuntimeSubformContracts>({\n open,\n presentation,\n title,\n view,\n childField,\n parentValue: linkedParentValue,\n editing,\n isDraft,\n isSaving,\n deps,\n onClose,\n onSave,\n}: RuntimeSubformEntryDialogProps<C>) {\n const defaultValues = useMemo(() => {\n const values = createBuilderEntryDefaultValues(view, editing);\n if (linkedParentValue) {\n values.values[childField] = editing?.values[childField] ?? linkedParentValue;\n }\n return values;\n }, [childField, editing, linkedParentValue, view]);\n const form = useForm<BuilderRuntimeEntryValues>({\n defaultValues,\n values: open ? defaultValues : undefined,\n });\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await onSave({\n id: editing?.id,\n input: {\n ...values,\n values: {\n ...values.values,\n ...(linkedParentValue ? { [childField]: linkedParentValue } : {}),\n },\n } as C[\"UpdateBuilderViewEntryInput\"],\n });\n onClose();\n if (!isDraft) {\n deps.notifications.success(editing ? \"Section хадгалагдлаа\" : \"Section нэмэгдлээ\");\n }\n } catch (error) {\n deps.notifications.error(\n deps.notifications.errorMessage(error, \"Subform хадгалахад алдаа гарлаа\"),\n );\n }\n });\n\n return (\n <deps.DialogShell\n open={open}\n presentation={presentation}\n title={title}\n description={view.title}\n onClose={onClose}\n >\n <FormProvider {...form}>\n <form\n className={deps.dialogFormClassName}\n onSubmit={(event) => {\n event.stopPropagation();\n void onSubmit(event);\n }}\n noValidate\n >\n {view.form ? (\n <deps.DialogFields\n formId={view.form.id}\n viewId={view.id}\n schema={view.form.schema}\n namePrefix=\"values\"\n />\n ) : null}\n <deps.DialogActions\n isSaving={isSaving}\n submitLabel={editing ? \"Шинэчлэх\" : \"Нэмэх\"}\n onClose={onClose}\n />\n </form>\n </FormProvider>\n </deps.DialogShell>\n );\n}\n\nexport function createRuntimeSubformFieldComponent<\n C extends RuntimeSubformContracts,\n TSubform extends RuntimeSubformLike,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController extends { selectedIds: string[]; clearSelection(): void },\n>(deps: RuntimeSubformFieldDependencies<C, TColumn, TState, TController>) {\n return function RuntimeSubformField({\n subform,\n parentEntry,\n draftRows = [],\n onDraftRowsChange,\n }: RuntimeSubformFieldProps<TSubform, C[\"BuilderViewEntry\"]>) {\n const [isEntryDialogOpen, setEntryDialogOpen] = useState(false);\n const [editing, setEditing] = useState<C[\"BuilderViewEntry\"] | null>(null);\n const initializedDraft = useRef(false);\n const linkedValue = parentValue(parentEntry, subform.parentField);\n const isDraftMode = Boolean(onDraftRowsChange);\n const canFetchBackendRows = Boolean(linkedValue);\n const canUseBackendRows = canFetchBackendRows && !isDraftMode;\n const isReady = Boolean(\n subform.viewId && subform.childField && (linkedValue || onDraftRowsChange),\n );\n const tableState = deps.useDataTableState({ pageSize: 5 });\n const query = useMemo<C[\"ListBuilderViewEntriesQuery\"]>(\n () =>\n ({\n ...tableState.query,\n filterField: subform.childField,\n filterValue: linkedValue ?? \"\",\n }) as C[\"ListBuilderViewEntriesQuery\"],\n [linkedValue, subform.childField, tableState.query],\n );\n const viewQuery = deps.hooks.useRuntimeBuilderView(subform.viewId, Boolean(subform.viewId));\n const entriesQuery = deps.hooks.useBuilderViewEntries(\n subform.viewId,\n query,\n isReady && (canUseBackendRows || (isDraftMode && canFetchBackendRows)),\n );\n const save = deps.hooks.useSaveBuilderViewEntry(subform.viewId);\n const view = viewQuery.data as C[\"BuilderView\"] | undefined;\n const columns = useMemo(() => (view ? deps.buildColumns(view) : []), [view]);\n const rows = (canUseBackendRows ? (entriesQuery.data?.items ?? []) : draftRows).filter(\n (row) => row.values._delete !== true,\n );\n const table = deps.useDataTable({\n columns,\n data: rows,\n rowCount: canUseBackendRows ? (entriesQuery.data?.total ?? 0) : rows.length,\n state: tableState,\n getRowId: (row) => row.id,\n });\n const canOpen = isReady && Boolean(view?.form) && !viewQuery.isPending;\n const selectedIds = new Set(table.selectedIds);\n\n useEffect(() => {\n if (!isDraftMode || !view || initializedDraft.current || !entriesQuery.data) return;\n initializedDraft.current = true;\n onDraftRowsChange?.({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: entriesQuery.data.items,\n });\n }, [entriesQuery.data, isDraftMode, onDraftRowsChange, subform.key, view]);\n\n return (\n <deps.Shell\n label={subform.label}\n buttonLabel={subformButtonLabel(subform)}\n canOpen={canOpen}\n missingParentDescription={\n !linkedValue && !onDraftRowsChange\n ? `Эхлээд parent мөрийг хадгална, эсвэл ${subform.parentField} талбарын утгыг бөглөнө.`\n : undefined\n }\n onAdd={() => {\n setEditing(null);\n setEntryDialogOpen(true);\n }}\n >\n {view?.list && (linkedValue || draftRows.length > 0) ? (\n <deps.DataPanel\n controller={table}\n isLoading={viewQuery.isPending || (canUseBackendRows && entriesQuery.isPending)}\n showDraftDelete={isDraftMode && table.selectedIds.length > 0}\n onRowClick={(entry) => {\n setEditing(entry);\n setEntryDialogOpen(true);\n }}\n onDeleteSelected={() => {\n if (!view) return;\n onDraftRowsChange?.({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: draftRows\n .filter((row) => !(selectedIds.has(row.id) && row.values._draftNew === true))\n .map((row) =>\n selectedIds.has(row.id)\n ? { ...row, values: { ...row.values, _delete: true } }\n : row,\n ),\n });\n table.clearSelection();\n }}\n />\n ) : null}\n\n {view ? (\n <RuntimeSubformEntryDialog<C>\n open={isEntryDialogOpen}\n presentation={subform.presentation ?? \"dialog\"}\n title={subform.label}\n view={view}\n childField={subform.childField}\n parentValue={linkedValue}\n editing={editing}\n isDraft={isDraftMode}\n isSaving={canUseBackendRows ? save.isPending : false}\n deps={deps}\n onClose={() => {\n setEntryDialogOpen(false);\n setEditing(null);\n }}\n onSave={async (args) => {\n if (!isDraftMode && canUseBackendRows) {\n await save.mutateAsync(args);\n await entriesQuery.refetch();\n return;\n }\n if (!onDraftRowsChange) return;\n const nextEntry = {\n ...draftEntry(args.input, editing),\n viewId: view.id,\n } as C[\"BuilderViewEntry\"];\n onDraftRowsChange({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: editing\n ? draftRows.map((row) => (row.id === editing.id ? nextEntry : row))\n : [...draftRows, nextEntry],\n });\n }}\n />\n ) : null}\n </deps.Shell>\n );\n };\n}\n"],"mappings":"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","names":["useMemo","jsx","useMemo","jsx","jsxs","useMemo","useState","FormProvider","useForm","jsx","jsxs","useState","useForm","useMemo","FormProvider","useEffect","useMemo","useState","FormProvider","useForm","jsx","jsxs","isDbTableSource","useMemo","useForm","FormProvider","useState","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/DynamicForm.tsx","../../src/runtime/runtimeUtils.ts","../../src/components/DynamicList.tsx","../../src/components/DynamicView.tsx","../../src/components/RuntimeEntryDialog.tsx","../../src/components/RuntimeSubformField.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport {\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimeFormValues,\n createBuilderFormDefaultValues,\n} from \"../runtime\";\n\nexport type DynamicFormContracts = BuilderApiContracts & {\n BuilderForm: {\n id: string;\n title: string;\n schema: BuilderRuntimeFormSchemaLike;\n };\n CreateBuilderViewEntryInput: BuilderRuntimeFormValues;\n};\n\nexport type DynamicFormProps = {\n formId: string;\n};\n\nexport type DynamicFormShellProps = {\n title: string;\n children: ReactNode;\n};\n\nexport type DynamicFormFieldsProps<TSchema> = {\n formId: string;\n schema: TSchema;\n namePrefix: \"values\";\n};\n\nexport type DynamicFormSubmitProps = {\n isSaving: boolean;\n};\n\nexport type DynamicFormErrorStateProps = {\n title: string;\n description: string;\n};\n\nexport type DynamicFormNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type DynamicFormDependencies<C extends DynamicFormContracts> = {\n hooks: Pick<BuilderHooks<C>, \"useRuntimeBuilderForm\" | \"useSaveRuntimeBuilderFormEntry\">;\n FormShell: ComponentType<DynamicFormShellProps>;\n FormFields: ComponentType<DynamicFormFieldsProps<C[\"BuilderForm\"][\"schema\"]>>;\n SubmitButton: ComponentType<DynamicFormSubmitProps>;\n ErrorState: ComponentType<DynamicFormErrorStateProps>;\n notifications: DynamicFormNotifications;\n};\n\nexport function createDynamicFormComponent<C extends DynamicFormContracts>(\n deps: DynamicFormDependencies<C>,\n) {\n return function DynamicForm({ formId }: DynamicFormProps) {\n const query = deps.hooks.useRuntimeBuilderForm(formId);\n const save = deps.hooks.useSaveRuntimeBuilderFormEntry(formId);\n const formValues = useMemo(\n () => (query.data ? createBuilderFormDefaultValues(query.data.schema) : undefined),\n [query.data],\n );\n const form = useForm<BuilderRuntimeFormValues>({\n defaultValues: createBuilderFormDefaultValues(query.data?.schema),\n values: formValues,\n });\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await save.mutateAsync(values as C[\"CreateBuilderViewEntryInput\"]);\n form.reset(createBuilderFormDefaultValues(query.data?.schema));\n deps.notifications.success(\"Form хадгалагдлаа\");\n } catch (error) {\n deps.notifications.error(deps.notifications.errorMessage(error, \"Хадгалахад алдаа гарлаа\"));\n }\n });\n\n if (query.isError) {\n return (\n <deps.ErrorState\n title=\"Form нээгдсэнгүй\"\n description={`«${formId}» id-тай form олдсонгүй.`}\n />\n );\n }\n\n if (!query.data) return null;\n\n return (\n <deps.FormShell title={query.data.title}>\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className=\"space-y-6\">\n <deps.FormFields formId={formId} schema={query.data.schema} namePrefix=\"values\" />\n <deps.SubmitButton isSaving={save.isPending} />\n </form>\n </FormProvider>\n </deps.FormShell>\n );\n };\n}\n","export type BuilderRuntimeFieldLike = {\n key: string;\n type: string;\n multiple?: boolean;\n defaultValue?: string | number | boolean;\n};\n\nexport { richTextToPlainText, toRichTextDocument } from \"../richText\";\n\nexport type BuilderRuntimePresentation = \"dialog\" | \"drawer\";\n\nexport type BuilderRuntimeFormSchemaLike = {\n presentation?: BuilderRuntimePresentation;\n fields: readonly BuilderRuntimeFieldLike[];\n};\n\nexport type BuilderRuntimeViewLike = {\n form?: {\n schema: BuilderRuntimeFormSchemaLike;\n } | null;\n};\n\nexport type BuilderRuntimeEntryLike = {\n id: string;\n values: Record<string, unknown>;\n version: number;\n};\n\nexport type BuilderRuntimeFormValues = {\n values: Record<string, unknown>;\n};\n\nexport type BuilderRuntimeEntryValues = BuilderRuntimeFormValues & {\n version: number;\n};\n\nfunction emptyFieldValue(field: BuilderRuntimeFieldLike) {\n if (field.defaultValue !== undefined) return field.defaultValue;\n if (field.type === \"file\" && field.multiple) return [];\n return field.type === \"checkbox\" ? false : \"\";\n}\n\nexport function createBuilderFormDefaultValues(\n schema?: BuilderRuntimeFormSchemaLike,\n): BuilderRuntimeFormValues {\n const values: Record<string, unknown> = {};\n for (const field of schema?.fields ?? []) {\n values[field.key] = emptyFieldValue(field);\n }\n return { values };\n}\n\nexport function createBuilderEntryDefaultValues(\n view: BuilderRuntimeViewLike,\n editing: BuilderRuntimeEntryLike | null,\n): BuilderRuntimeEntryValues {\n const values: Record<string, unknown> = {};\n for (const field of view.form?.schema.fields ?? []) {\n const existing = editing?.values[field.key];\n values[field.key] = existing === undefined ? emptyFieldValue(field) : existing;\n }\n return { values, version: editing?.version ?? 0 };\n}\n\nexport function formatBuilderRuntimeValue(value: unknown, locale = \"mn-MN\") {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (typeof value === \"boolean\") return value ? \"Тийм\" : \"Үгүй\";\n if (typeof value === \"number\") return new Intl.NumberFormat(locale).format(value);\n return String(value);\n}\n","\"use client\";\n\nimport type { ComponentType } from \"react\";\nimport { useMemo } from \"react\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\n\nexport type DynamicListContracts = BuilderApiContracts & {\n BuilderList: {\n id: string;\n title: string;\n description?: string | null;\n };\n BuilderViewEntry: {\n id: string;\n };\n ListBuilderViewEntriesResponse: {\n items: Array<BuilderApiContracts[\"BuilderViewEntry\"]>;\n total: number;\n };\n};\n\nexport type DynamicListProps = {\n listId: string;\n};\n\nexport type DynamicListDataGridProps<TController> = {\n title?: string;\n description?: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n};\n\nexport type DynamicListErrorStateProps = {\n title: string;\n description: string;\n};\n\nexport type DynamicListDependencies<\n C extends DynamicListContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n> = {\n hooks: Pick<BuilderHooks<C>, \"useRuntimeBuilderList\" | \"useRuntimeBuilderListEntries\">;\n buildColumns(list: C[\"BuilderList\"]): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n DataGrid: ComponentType<DynamicListDataGridProps<TController>>;\n ErrorState: ComponentType<DynamicListErrorStateProps>;\n};\n\nexport function createDynamicListComponent<\n C extends DynamicListContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n>(deps: DynamicListDependencies<C, TColumn, TState, TController>) {\n return function DynamicList({ listId }: DynamicListProps) {\n const query = deps.hooks.useRuntimeBuilderList(listId);\n const state = deps.useDataTableState({ pageSize: 20 });\n const entriesQuery = deps.hooks.useRuntimeBuilderListEntries(listId, state.query);\n const columns = useMemo(() => (query.data ? deps.buildColumns(query.data) : []), [query.data]);\n const entries = entriesQuery.data?.items ?? [];\n const controller = deps.useDataTable({\n columns,\n data: entries as C[\"BuilderViewEntry\"][],\n rowCount: entriesQuery.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n if (query.isError) {\n return (\n <deps.ErrorState\n title=\"List нээгдсэнгүй\"\n description={`«${listId}» id-тай list олдсонгүй.`}\n />\n );\n }\n\n return (\n <deps.DataGrid\n title={query.data?.title ?? \"Dynamic List\"}\n description={query.data?.description ?? `/winu/list?id=${listId}`}\n controller={controller}\n isLoading={query.isPending || entriesQuery.isPending}\n searchPlaceholder=\"Мөр хайх...\"\n emptyTitle=\"Мөр алга\"\n emptyDescription=\"Энэ list-ийн datasource дээр мөр алга.\"\n />\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport type { BuilderRuntimeEntryLike } from \"../runtime\";\n\nexport type DynamicViewContracts = BuilderApiContracts & {\n BuilderView: {\n id: string;\n title: string;\n description?: string | null;\n form?: unknown | null;\n };\n BuilderViewEntry: BuilderRuntimeEntryLike;\n ListBuilderViewEntriesResponse: {\n items: Array<BuilderApiContracts[\"BuilderViewEntry\"]>;\n total: number;\n };\n};\n\nexport type DynamicViewProps = {\n viewId: string;\n};\n\nexport type DynamicViewInteractionEvent = {\n defaultPrevented?: boolean;\n target?: unknown;\n stopPropagation?(): void;\n};\n\nexport type DynamicViewColumnActions<TEntry> = {\n onEdit(entry: TEntry, event?: DynamicViewInteractionEvent): void;\n onDelete(entry: TEntry, event?: DynamicViewInteractionEvent): void;\n};\n\nexport type DynamicViewDataGridProps<TController> = {\n title?: string;\n description?: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n onRowClick?: (row: unknown, event?: DynamicViewInteractionEvent) => void;\n toolbarExtra?: ReactNode;\n};\n\nexport type DynamicViewAddButtonProps = {\n disabled: boolean;\n onAdd(): void;\n};\n\nexport type DynamicViewEntryDialogProps<TView, TEntry, TInput> = {\n open: boolean;\n view: TView;\n editing: TEntry | null;\n onClose(): void;\n onSave(args: { id?: string; input: TInput }): Promise<unknown>;\n isSaving: boolean;\n};\n\nexport type DynamicViewDeleteDialogProps<TEntry> = {\n entry: TEntry | null;\n isDeleting: boolean;\n onClose(): void;\n onConfirm(): Promise<void>;\n};\n\nexport type DynamicViewErrorStateProps = {\n title: string;\n description: string;\n};\n\ntype ClosestTarget = {\n closest(selector: string): unknown;\n};\n\nconst interactiveRowTargetSelector =\n \"button,a,input,select,textarea,[role='button'],[role='menuitem'],[data-builder-row-action]\";\n\nfunction hasClosest(target: unknown): target is ClosestTarget {\n return (\n typeof target === \"object\" &&\n target !== null &&\n \"closest\" in target &&\n typeof target.closest === \"function\"\n );\n}\n\nexport function shouldHandleDynamicViewRowClick(event?: DynamicViewInteractionEvent) {\n if (!event) return true;\n if (event.defaultPrevented) return false;\n return !hasClosest(event.target) || !event.target.closest(interactiveRowTargetSelector);\n}\n\nexport type DynamicViewDependencies<\n C extends DynamicViewContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n> = {\n hooks: Pick<\n BuilderHooks<C>,\n | \"useBuilderViewEntries\"\n | \"useDeleteBuilderViewEntry\"\n | \"useRuntimeBuilderView\"\n | \"useSaveBuilderViewEntry\"\n >;\n buildColumns(\n view: C[\"BuilderView\"],\n actions: DynamicViewColumnActions<C[\"BuilderViewEntry\"]>,\n ): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n DataGrid: ComponentType<DynamicViewDataGridProps<TController>>;\n AddButton: ComponentType<DynamicViewAddButtonProps>;\n EntryDialog: ComponentType<\n DynamicViewEntryDialogProps<\n C[\"BuilderView\"],\n C[\"BuilderViewEntry\"],\n C[\"UpdateBuilderViewEntryInput\"]\n >\n >;\n DeleteDialog: ComponentType<DynamicViewDeleteDialogProps<C[\"BuilderViewEntry\"]>>;\n ErrorState: ComponentType<DynamicViewErrorStateProps>;\n};\n\nexport function createDynamicViewComponent<\n C extends DynamicViewContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n>(deps: DynamicViewDependencies<C, TColumn, TState, TController>) {\n return function DynamicView({ viewId }: DynamicViewProps) {\n const [editing, setEditing] = useState<C[\"BuilderViewEntry\"] | null>(null);\n const [isDialogOpen, setDialogOpen] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<C[\"BuilderViewEntry\"] | null>(null);\n\n const viewQuery = deps.hooks.useRuntimeBuilderView(viewId);\n const state = deps.useDataTableState({ pageSize: 20 });\n const entriesQuery = deps.hooks.useBuilderViewEntries(viewId, state.query);\n const save = deps.hooks.useSaveBuilderViewEntry(viewId);\n const remove = deps.hooks.useDeleteBuilderViewEntry(viewId);\n const view = viewQuery.data;\n\n const columns = useMemo(\n () =>\n view\n ? deps.buildColumns(view, {\n onEdit: (entry, event) => {\n event?.stopPropagation?.();\n setEditing(entry);\n setDialogOpen(true);\n },\n onDelete: (entry, event) => {\n event?.stopPropagation?.();\n setPendingDelete(entry);\n },\n })\n : [],\n [view],\n );\n\n const controller = deps.useDataTable({\n columns,\n data: (entriesQuery.data?.items ?? []) as C[\"BuilderViewEntry\"][],\n rowCount: entriesQuery.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n if (viewQuery.isError) {\n return (\n <deps.ErrorState\n title=\"View нээгдсэнгүй\"\n description={`«${viewId}» id-тай view олдсонгүй.`}\n />\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <deps.DataGrid\n title={view?.title ?? \"Dynamic View\"}\n description={view?.description ?? `/winu/view?id=${viewId}`}\n controller={controller}\n isLoading={viewQuery.isPending || entriesQuery.isPending}\n searchPlaceholder=\"Мөр хайх...\"\n emptyTitle=\"Мөр алга\"\n emptyDescription=\"Энэ view дээр эхний мөрөө нэмээрэй.\"\n onRowClick={(entry, event) => {\n if (!shouldHandleDynamicViewRowClick(event)) return;\n setEditing(entry as C[\"BuilderViewEntry\"]);\n setDialogOpen(true);\n }}\n toolbarExtra={\n <deps.AddButton\n disabled={!view?.form}\n onAdd={() => {\n setEditing(null);\n setDialogOpen(true);\n }}\n />\n }\n />\n\n {view ? (\n <deps.EntryDialog\n open={isDialogOpen}\n view={view}\n editing={editing}\n onClose={() => setDialogOpen(false)}\n onSave={save.mutateAsync}\n isSaving={save.isPending}\n />\n ) : null}\n\n <deps.DeleteDialog\n entry={pendingDelete}\n isDeleting={remove.isPending}\n onClose={() => setPendingDelete(null)}\n onConfirm={async () => {\n if (!pendingDelete) return;\n await remove.mutateAsync(pendingDelete.id);\n setPendingDelete(null);\n }}\n />\n </div>\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport {\n type BuilderRuntimeEntryLike,\n type BuilderRuntimeEntryValues,\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimePresentation,\n type BuilderRuntimeViewLike,\n createBuilderEntryDefaultValues,\n} from \"../runtime\";\n\ntype BuilderRuntimeDatasourceLike =\n | {\n type: \"dbTable\";\n tableName: string;\n }\n | {\n type: string;\n }\n | null;\n\nexport type RuntimeEntryDialogSubformLike = {\n key: string;\n};\n\nexport type RuntimeEntryDialogViewLike = BuilderRuntimeViewLike & {\n id: string;\n title: string;\n list?: {\n source?: BuilderRuntimeDatasourceLike;\n } | null;\n form?: {\n id: string;\n source?: BuilderRuntimeDatasourceLike;\n schema: BuilderRuntimeFormSchemaLike & {\n subforms?: readonly RuntimeEntryDialogSubformLike[];\n };\n } | null;\n};\n\nexport type RuntimeEntryDialogSaveArgs<TInput> = {\n id?: string;\n input: TInput;\n};\n\nexport type RuntimeEntryDialogProps<TView, TEntry, TInput> = {\n open: boolean;\n view: TView;\n editing: TEntry | null;\n onClose: () => void;\n onSave: (args: RuntimeEntryDialogSaveArgs<TInput>) => Promise<unknown>;\n isSaving: boolean;\n};\n\nexport type RuntimeEntryDialogShellProps = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n description: string;\n onClose: () => void;\n children: ReactNode;\n};\n\nexport type RuntimeEntryDialogExtraItem = {\n key: string;\n render: () => ReactNode;\n};\n\nexport type RuntimeEntryDialogFieldsProps<TSchema> = {\n formId: string;\n viewId: string;\n entry?: BuilderRuntimeEntryLike | null;\n schema: TSchema;\n namePrefix: \"values\";\n extraItems?: RuntimeEntryDialogExtraItem[];\n};\n\nexport type RuntimeEntryDialogActionsProps = {\n isSaving: boolean;\n onClose: () => void;\n};\n\nexport type RuntimeEntryDialogNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type RuntimeEntryDialogDraftRowsChange<TEntry> = {\n subformKey: string;\n dataKey: string;\n rows: TEntry[];\n};\n\nexport type RuntimeEntryDialogSubformFieldProps<TSubform, TEntry> = {\n subform: TSubform;\n parentEntry?: TEntry | null;\n draftRows?: TEntry[];\n onDraftRowsChange?(args: RuntimeEntryDialogDraftRowsChange<TEntry>): void;\n};\n\ntype RuntimeEntryDialogDraftSubform<TEntry> = {\n dataKey: string;\n rows: TEntry[];\n};\n\ntype RuntimeCompositeData = Record<\n string,\n Record<string, unknown> | Array<Record<string, unknown>>\n>;\n\ntype RuntimeCompositeCreateInput = {\n data: RuntimeCompositeData;\n};\n\ntype RuntimeCompositeUpdateInput = {\n data: RuntimeCompositeData;\n};\n\ntype RuntimeMutation<TInput> = {\n mutateAsync(input: TInput): Promise<unknown>;\n isPending: boolean;\n};\n\nexport type RuntimeEntryDialogDependencies<\n TView extends RuntimeEntryDialogViewLike,\n TEntry extends BuilderRuntimeEntryLike = BuilderRuntimeEntryLike,\n> = {\n DialogShell: ComponentType<RuntimeEntryDialogShellProps>;\n FormFields: ComponentType<RuntimeEntryDialogFieldsProps<NonNullable<TView[\"form\"]>[\"schema\"]>>;\n Actions: ComponentType<RuntimeEntryDialogActionsProps>;\n formClassName?: string;\n SubformField?: ComponentType<\n RuntimeEntryDialogSubformFieldProps<\n NonNullable<NonNullable<TView[\"form\"]>[\"schema\"][\"subforms\"]>[number],\n TEntry\n >\n >;\n useCreateCompositeEntry?(viewId: string): RuntimeMutation<RuntimeCompositeCreateInput>;\n useUpdateCompositeEntry?(\n viewId: string,\n ): RuntimeMutation<{ id: string; input: RuntimeCompositeUpdateInput }>;\n notifications: RuntimeEntryDialogNotifications;\n};\n\nfunction isDbTableSource(\n source: BuilderRuntimeDatasourceLike | undefined,\n): source is { type: \"dbTable\"; tableName: string } {\n return source?.type === \"dbTable\" && \"tableName\" in source;\n}\n\nfunction runtimeViewTableName(view: RuntimeEntryDialogViewLike) {\n const listSource = view.list?.source;\n if (isDbTableSource(listSource)) return listSource.tableName;\n const formSource = view.form?.source;\n return isDbTableSource(formSource) ? formSource.tableName : undefined;\n}\n\nfunction cleanRowValues(values: Record<string, unknown>) {\n return Object.fromEntries(\n Object.entries(values).filter(([key]) => key === \"_delete\" || !key.startsWith(\"_\")),\n );\n}\n\nfunction childRowPayload(row: BuilderRuntimeEntryLike, includeIdentity: boolean) {\n const values = cleanRowValues(row.values);\n if (!includeIdentity || row.values._draftNew === true) return values;\n return {\n id: row.id,\n version: row.version,\n ...values,\n };\n}\n\nfunction hasDraftChange(row: BuilderRuntimeEntryLike) {\n return (\n row.values._delete === true ||\n row.values._draftNew === true ||\n row.values._draftDirty === true\n );\n}\n\nfunction changedChildPayloads(rows: BuilderRuntimeEntryLike[], includeIdentity: boolean) {\n return rows\n .filter(hasDraftChange)\n .filter((row) => includeIdentity || row.values._delete !== true)\n .map((row) => childRowPayload(row, includeIdentity));\n}\n\nexport function createRuntimeEntryDialogComponent<\n TView extends RuntimeEntryDialogViewLike,\n TEntry extends BuilderRuntimeEntryLike,\n TInput extends BuilderRuntimeEntryValues,\n>(deps: RuntimeEntryDialogDependencies<TView, TEntry>) {\n return function RuntimeEntryDialog({\n open,\n view,\n editing,\n onClose,\n onSave,\n isSaving,\n }: RuntimeEntryDialogProps<TView, TEntry, TInput>) {\n const [draftSubforms, setDraftSubforms] = useState<\n Record<string, RuntimeEntryDialogDraftSubform<TEntry>>\n >({});\n const isSubmittingRef = useRef(false);\n const compositeCreate = deps.useCreateCompositeEntry?.(view.id);\n const compositeUpdate = deps.useUpdateCompositeEntry?.(view.id);\n const form = useForm<BuilderRuntimeEntryValues>({\n defaultValues: createBuilderEntryDefaultValues(view, editing),\n values: open ? createBuilderEntryDefaultValues(view, editing) : undefined,\n });\n const mainTableName = runtimeViewTableName(view);\n const hasDraftChanges = useMemo(\n () => Object.values(draftSubforms).some((draft) => draft.rows.some(hasDraftChange)),\n [draftSubforms],\n );\n\n useEffect(() => {\n if (open) setDraftSubforms({});\n }, [open]);\n\n const onSubmit = form.handleSubmit(async (values) => {\n if (isSubmittingRef.current) return;\n isSubmittingRef.current = true;\n try {\n if (!editing && hasDraftChanges) {\n if (!mainTableName) throw new Error(\"Main form datasource table олдсонгүй\");\n if (!compositeCreate) throw new Error(\"Composite create handler тохируулагдаагүй байна\");\n await compositeCreate.mutateAsync({\n data: {\n [mainTableName]: values.values,\n ...Object.fromEntries(\n Object.values(draftSubforms).map((draft) => [\n draft.dataKey,\n changedChildPayloads(draft.rows, false),\n ]),\n ),\n },\n });\n } else if (editing && hasDraftChanges) {\n if (!mainTableName) throw new Error(\"Main form datasource table олдсонгүй\");\n if (!compositeUpdate) throw new Error(\"Composite update handler тохируулагдаагүй байна\");\n await compositeUpdate.mutateAsync({\n id: editing.id,\n input: {\n data: {\n [mainTableName]: {\n id: editing.id,\n version: values.version,\n ...values.values,\n },\n ...Object.fromEntries(\n Object.values(draftSubforms).map((draft) => [\n draft.dataKey,\n changedChildPayloads(draft.rows, true),\n ]),\n ),\n },\n },\n });\n } else {\n await onSave({ id: editing?.id, input: values as TInput });\n }\n onClose();\n deps.notifications.success(editing ? \"Мөр хадгалагдлаа\" : \"Мөр нэмэгдлээ\");\n } catch (error) {\n deps.notifications.error(deps.notifications.errorMessage(error, \"Хадгалахад алдаа гарлаа\"));\n } finally {\n isSubmittingRef.current = false;\n }\n });\n\n const saving = isSaving || Boolean(compositeCreate?.isPending || compositeUpdate?.isPending);\n const extraItems: RuntimeEntryDialogExtraItem[] | undefined =\n deps.SubformField && view.form?.schema.subforms?.length\n ? view.form.schema.subforms.map((subform) => ({\n key: subform.key,\n render: () =>\n deps.SubformField ? (\n <deps.SubformField\n subform={subform}\n parentEntry={editing}\n draftRows={draftSubforms[subform.key]?.rows ?? []}\n onDraftRowsChange={({ subformKey, dataKey, rows }) => {\n setDraftSubforms((current) => ({\n ...current,\n [subformKey]: { dataKey, rows: rows as TEntry[] },\n }));\n }}\n />\n ) : null,\n }))\n : undefined;\n\n return (\n <deps.DialogShell\n open={open}\n presentation={view.form?.schema.presentation ?? \"dialog\"}\n title={editing ? \"Мөр засах\" : \"Мөр нэмэх\"}\n description={view.title}\n onClose={onClose}\n >\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className={deps.formClassName}>\n {view.form ? (\n <deps.FormFields\n formId={view.form.id}\n viewId={view.id}\n entry={editing}\n schema={view.form.schema}\n namePrefix=\"values\"\n extraItems={extraItems}\n />\n ) : null}\n <deps.Actions isSaving={saving} onClose={onClose} />\n </form>\n </FormProvider>\n </deps.DialogShell>\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { FormProvider, useForm, useFormContext, useWatch } from \"react-hook-form\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport {\n type BuilderRuntimeEntryLike,\n type BuilderRuntimeEntryValues,\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimePresentation,\n createBuilderEntryDefaultValues,\n} from \"../runtime\";\nimport type { RuntimeEntryDialogDraftRowsChange } from \"./RuntimeEntryDialog\";\n\ntype RuntimeDatasourceLike =\n | {\n type: \"dbTable\";\n tableName: string;\n }\n | {\n type: string;\n }\n | null;\n\nexport type RuntimeSubformLike = {\n key: string;\n label: string;\n viewId: string;\n parentField: string;\n childField: string;\n buttonLabel?: string;\n presentation?: BuilderRuntimePresentation;\n};\n\nexport type RuntimeSubformViewLike = {\n id: string;\n title: string;\n form?: {\n id: string;\n schema: BuilderRuntimeFormSchemaLike;\n } | null;\n list?: {\n source?: RuntimeDatasourceLike;\n schema: {\n columns: readonly {\n key: string;\n label: string;\n sortable: boolean;\n align: \"left\" | \"right\";\n }[];\n };\n } | null;\n};\n\nexport type RuntimeSubformEntryLike = BuilderRuntimeEntryLike & {\n viewId: string;\n createdAt: string;\n updatedAt: string;\n};\n\ntype RuntimeSubformContracts = BuilderApiContracts & {\n BuilderView: RuntimeSubformViewLike;\n BuilderViewEntry: RuntimeSubformEntryLike;\n ListBuilderViewEntriesResponse: {\n items: RuntimeSubformEntryLike[];\n total: number;\n };\n UpdateBuilderViewEntryInput: BuilderRuntimeEntryValues;\n};\n\ntype ParentEntryLike = {\n id: string;\n values: Record<string, unknown>;\n};\n\nexport type RuntimeSubformFieldProps<TSubform, TEntry> = {\n subform: TSubform;\n parentEntry?: ParentEntryLike | null;\n draftRows?: TEntry[];\n onDraftRowsChange?(args: RuntimeEntryDialogDraftRowsChange<TEntry>): void;\n};\n\nexport type RuntimeSubformShellProps = {\n label: string;\n buttonLabel: string;\n canOpen: boolean;\n missingParentDescription?: ReactNode;\n onAdd(): void;\n children: ReactNode;\n};\n\nexport type RuntimeSubformDataPanelProps<TController, TEntry> = {\n controller: TController;\n isLoading: boolean;\n showDraftDelete: boolean;\n onRowClick(entry: TEntry): void;\n onDeleteSelected(): void;\n};\n\nexport type RuntimeSubformDialogShellProps = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n description: string;\n onClose(): void;\n children: ReactNode;\n};\n\nexport type RuntimeSubformDialogFieldsProps<TSchema> = {\n formId: string;\n viewId: string;\n schema: TSchema;\n namePrefix: \"values\";\n parentValues?: Record<string, unknown>;\n};\n\nexport type RuntimeSubformDialogActionsProps = {\n isSaving: boolean;\n submitLabel: string;\n onClose(): void;\n};\n\nexport type RuntimeSubformNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type RuntimeSubformFieldDependencies<\n C extends RuntimeSubformContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController extends { selectedIds: string[]; clearSelection(): void },\n> = {\n hooks: Pick<\n BuilderHooks<C>,\n \"useBuilderViewEntries\" | \"useRuntimeBuilderView\" | \"useSaveBuilderViewEntry\"\n >;\n buildColumns(view: C[\"BuilderView\"]): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n Shell: ComponentType<RuntimeSubformShellProps>;\n DataPanel: ComponentType<RuntimeSubformDataPanelProps<TController, C[\"BuilderViewEntry\"]>>;\n DialogShell: ComponentType<RuntimeSubformDialogShellProps>;\n DialogFields: ComponentType<\n RuntimeSubformDialogFieldsProps<NonNullable<C[\"BuilderView\"][\"form\"]>[\"schema\"]>\n >;\n DialogActions: ComponentType<RuntimeSubformDialogActionsProps>;\n dialogFormClassName?: string;\n notifications: RuntimeSubformNotifications;\n};\n\nfunction subformButtonLabel(subform: RuntimeSubformLike) {\n return subform.buttonLabel?.trim() || subform.label;\n}\n\nfunction parentValue(entry: ParentEntryLike | null | undefined, field: string) {\n if (!entry) return undefined;\n const value = field === \"id\" ? entry.id : entry.values[field];\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return undefined;\n}\n\nfunction isDbTableSource(\n source: RuntimeDatasourceLike | undefined,\n): source is { type: \"dbTable\"; tableName: string } {\n return source?.type === \"dbTable\" && \"tableName\" in source;\n}\n\nfunction subformFallbackKey(view: RuntimeSubformViewLike) {\n return view.id;\n}\n\nfunction viewTableName(view: RuntimeSubformViewLike) {\n const source = view.list?.source;\n return isDbTableSource(source) ? source.tableName : subformFallbackKey(view);\n}\n\nfunction draftEntry<TEntry extends RuntimeSubformEntryLike>(\n values: BuilderRuntimeEntryValues,\n editing: TEntry | null,\n) {\n const now = new Date().toISOString();\n return {\n id: editing?.id ?? crypto.randomUUID(),\n viewId: editing?.viewId ?? \"\",\n values: editing\n ? { ...values.values, _draftDirty: true }\n : { ...values.values, _draftNew: true },\n version: editing?.version ?? 0,\n createdAt: editing?.createdAt ?? now,\n updatedAt: now,\n } satisfies RuntimeSubformEntryLike;\n}\n\ntype RuntimeSubformEntryDialogProps<C extends RuntimeSubformContracts> = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n view: C[\"BuilderView\"];\n childField: string;\n parentValue?: string;\n parentValues?: Record<string, unknown>;\n editing: C[\"BuilderViewEntry\"] | null;\n isDraft: boolean;\n isSaving: boolean;\n deps: Pick<\n RuntimeSubformFieldDependencies<\n C,\n unknown,\n { query: C[\"ListBuilderViewEntriesQuery\"] },\n { selectedIds: string[]; clearSelection(): void }\n >,\n \"DialogActions\" | \"DialogFields\" | \"DialogShell\" | \"dialogFormClassName\" | \"notifications\"\n >;\n onClose(): void;\n onSave(args: { id?: string; input: C[\"UpdateBuilderViewEntryInput\"] }): Promise<unknown>;\n};\n\nfunction RuntimeSubformEntryDialog<C extends RuntimeSubformContracts>({\n open,\n presentation,\n title,\n view,\n childField,\n parentValue: linkedParentValue,\n parentValues,\n editing,\n isDraft,\n isSaving,\n deps,\n onClose,\n onSave,\n}: RuntimeSubformEntryDialogProps<C>) {\n const defaultValues = useMemo(() => {\n const values = createBuilderEntryDefaultValues(view, editing);\n if (linkedParentValue) {\n values.values[childField] = editing?.values[childField] ?? linkedParentValue;\n }\n return values;\n }, [childField, editing, linkedParentValue, view]);\n const form = useForm<BuilderRuntimeEntryValues>({\n defaultValues,\n values: open ? defaultValues : undefined,\n });\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await onSave({\n id: editing?.id,\n input: {\n ...values,\n values: {\n ...values.values,\n ...(linkedParentValue ? { [childField]: linkedParentValue } : {}),\n },\n } as C[\"UpdateBuilderViewEntryInput\"],\n });\n onClose();\n if (!isDraft) {\n deps.notifications.success(editing ? \"Section хадгалагдлаа\" : \"Section нэмэгдлээ\");\n }\n } catch (error) {\n deps.notifications.error(\n deps.notifications.errorMessage(error, \"Subform хадгалахад алдаа гарлаа\"),\n );\n }\n });\n\n return (\n <deps.DialogShell\n open={open}\n presentation={presentation}\n title={title}\n description={view.title}\n onClose={onClose}\n >\n <FormProvider {...form}>\n <form\n className={deps.dialogFormClassName}\n onSubmit={(event) => {\n event.stopPropagation();\n void onSubmit(event);\n }}\n noValidate\n >\n {view.form ? (\n <deps.DialogFields\n formId={view.form.id}\n viewId={view.id}\n schema={view.form.schema}\n namePrefix=\"values\"\n parentValues={parentValues}\n />\n ) : null}\n <deps.DialogActions\n isSaving={isSaving}\n submitLabel={editing ? \"Шинэчлэх\" : \"Нэмэх\"}\n onClose={onClose}\n />\n </form>\n </FormProvider>\n </deps.DialogShell>\n );\n}\n\nexport function createRuntimeSubformFieldComponent<\n C extends RuntimeSubformContracts,\n TSubform extends RuntimeSubformLike,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController extends { selectedIds: string[]; clearSelection(): void },\n>(deps: RuntimeSubformFieldDependencies<C, TColumn, TState, TController>) {\n return function RuntimeSubformField({\n subform,\n parentEntry,\n draftRows = [],\n onDraftRowsChange,\n }: RuntimeSubformFieldProps<TSubform, C[\"BuilderViewEntry\"]>) {\n const { control } = useFormContext<BuilderRuntimeEntryValues>();\n const watchedParentValues = useWatch({ control, name: \"values\" });\n const [isEntryDialogOpen, setEntryDialogOpen] = useState(false);\n const [editing, setEditing] = useState<C[\"BuilderViewEntry\"] | null>(null);\n const initializedDraft = useRef(false);\n const linkedValue = parentValue(parentEntry, subform.parentField);\n const parentValues =\n watchedParentValues &&\n typeof watchedParentValues === \"object\" &&\n !Array.isArray(watchedParentValues)\n ? watchedParentValues\n : undefined;\n const isDraftMode = Boolean(onDraftRowsChange);\n const canFetchBackendRows = Boolean(linkedValue);\n const canUseBackendRows = canFetchBackendRows && !isDraftMode;\n const isReady = Boolean(\n subform.viewId && subform.childField && (linkedValue || onDraftRowsChange),\n );\n const tableState = deps.useDataTableState({ pageSize: 5 });\n const query = useMemo<C[\"ListBuilderViewEntriesQuery\"]>(\n () =>\n ({\n ...tableState.query,\n filterField: subform.childField,\n filterValue: linkedValue ?? \"\",\n }) as C[\"ListBuilderViewEntriesQuery\"],\n [linkedValue, subform.childField, tableState.query],\n );\n const viewQuery = deps.hooks.useRuntimeBuilderView(subform.viewId, Boolean(subform.viewId));\n const entriesQuery = deps.hooks.useBuilderViewEntries(\n subform.viewId,\n query,\n isReady && (canUseBackendRows || (isDraftMode && canFetchBackendRows)),\n );\n const save = deps.hooks.useSaveBuilderViewEntry(subform.viewId);\n const view = viewQuery.data as C[\"BuilderView\"] | undefined;\n const columns = useMemo(() => (view ? deps.buildColumns(view) : []), [view]);\n const rows = (canUseBackendRows ? (entriesQuery.data?.items ?? []) : draftRows).filter(\n (row) => row.values._delete !== true,\n );\n const table = deps.useDataTable({\n columns,\n data: rows,\n rowCount: canUseBackendRows ? (entriesQuery.data?.total ?? 0) : rows.length,\n state: tableState,\n getRowId: (row) => row.id,\n });\n const canOpen = isReady && Boolean(view?.form) && !viewQuery.isPending;\n const selectedIds = new Set(table.selectedIds);\n\n useEffect(() => {\n if (!isDraftMode || !view || initializedDraft.current || !entriesQuery.data) return;\n initializedDraft.current = true;\n onDraftRowsChange?.({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: entriesQuery.data.items,\n });\n }, [entriesQuery.data, isDraftMode, onDraftRowsChange, subform.key, view]);\n\n return (\n <deps.Shell\n label={subform.label}\n buttonLabel={subformButtonLabel(subform)}\n canOpen={canOpen}\n missingParentDescription={\n !linkedValue && !onDraftRowsChange\n ? `Эхлээд parent мөрийг хадгална, эсвэл ${subform.parentField} талбарын утгыг бөглөнө.`\n : undefined\n }\n onAdd={() => {\n setEditing(null);\n setEntryDialogOpen(true);\n }}\n >\n {view?.list && (linkedValue || draftRows.length > 0) ? (\n <deps.DataPanel\n controller={table}\n isLoading={viewQuery.isPending || (canUseBackendRows && entriesQuery.isPending)}\n showDraftDelete={isDraftMode && table.selectedIds.length > 0}\n onRowClick={(entry) => {\n setEditing(entry);\n setEntryDialogOpen(true);\n }}\n onDeleteSelected={() => {\n if (!view) return;\n onDraftRowsChange?.({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: draftRows\n .filter((row) => !(selectedIds.has(row.id) && row.values._draftNew === true))\n .map((row) =>\n selectedIds.has(row.id)\n ? { ...row, values: { ...row.values, _delete: true } }\n : row,\n ),\n });\n table.clearSelection();\n }}\n />\n ) : null}\n\n {view ? (\n <RuntimeSubformEntryDialog<C>\n open={isEntryDialogOpen}\n presentation={subform.presentation ?? \"dialog\"}\n title={subform.label}\n view={view}\n childField={subform.childField}\n parentValue={linkedValue}\n parentValues={parentValues}\n editing={editing}\n isDraft={isDraftMode}\n isSaving={canUseBackendRows ? save.isPending : false}\n deps={deps}\n onClose={() => {\n setEntryDialogOpen(false);\n setEditing(null);\n }}\n onSave={async (args) => {\n if (!isDraftMode && canUseBackendRows) {\n await save.mutateAsync(args);\n await entriesQuery.refetch();\n return;\n }\n if (!onDraftRowsChange) return;\n const nextEntry = {\n ...draftEntry(args.input, editing),\n viewId: view.id,\n } as C[\"BuilderViewEntry\"];\n onDraftRowsChange({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: editing\n ? draftRows.map((row) => (row.id === editing.id ? nextEntry : row))\n : [...draftRows, nextEntry],\n });\n }}\n />\n ) : null}\n </deps.Shell>\n );\n };\n}\n"],"mappings":"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","names":["useMemo","jsx","useMemo","jsx","jsxs","useMemo","useState","FormProvider","useForm","jsx","jsxs","useState","useForm","useMemo","FormProvider","useEffect","useMemo","useRef","useState","FormProvider","useForm","jsx","jsxs","isDbTableSource","useMemo","useForm","FormProvider","useState","useRef","useEffect"]}
|