@duke333/builder-ui 0.2.2 → 0.2.4

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.
@@ -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 {
@@ -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-Bw741XbS.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-Bw741XbS.js';
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 '../runtime/index.js';
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,9 +93,11 @@ 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;
100
+ submitLabel: string;
99
101
  onClose(): void;
100
102
  };
101
103
  type RuntimeSubformNotifications = {
@@ -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 hasDraftRows = useMemo4(
262
- () => Object.values(draftSubforms).some((draft) => draft.rows.length > 0),
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 && hasDraftRows) {
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.filter((row) => row.values._delete !== true).map((row) => childRowPayload(row, false))
290
+ changedChildPayloads(draft.rows, false)
280
291
  ])
281
292
  )
282
293
  }
283
294
  });
284
- } else if (editing && hasDraftRows) {
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.map((row) => childRowPayload(row, true))
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,7 +411,9 @@ function RuntimeSubformEntryDialog({
398
411
  view,
399
412
  childField,
400
413
  parentValue: linkedParentValue,
414
+ parentValues,
401
415
  editing,
416
+ isDraft,
402
417
  isSaving,
403
418
  deps,
404
419
  onClose,
@@ -428,7 +443,9 @@ function RuntimeSubformEntryDialog({
428
443
  }
429
444
  });
430
445
  onClose();
431
- deps.notifications.success(editing ? "Section \u0445\u0430\u0434\u0433\u0430\u043B\u0430\u0433\u0434\u043B\u0430\u0430" : "Section \u043D\u044D\u043C\u044D\u0433\u0434\u043B\u044D\u044D");
446
+ if (!isDraft) {
447
+ deps.notifications.success(editing ? "Section \u0445\u0430\u0434\u0433\u0430\u043B\u0430\u0433\u0434\u043B\u0430\u0430" : "Section \u043D\u044D\u043C\u044D\u0433\u0434\u043B\u044D\u044D");
448
+ }
432
449
  } catch (error) {
433
450
  deps.notifications.error(
434
451
  deps.notifications.errorMessage(error, "Subform \u0445\u0430\u0434\u0433\u0430\u043B\u0430\u0445\u0430\u0434 \u0430\u043B\u0434\u0430\u0430 \u0433\u0430\u0440\u043B\u0430\u0430")
@@ -459,10 +476,18 @@ function RuntimeSubformEntryDialog({
459
476
  formId: view.form.id,
460
477
  viewId: view.id,
461
478
  schema: view.form.schema,
462
- namePrefix: "values"
479
+ namePrefix: "values",
480
+ parentValues
463
481
  }
464
482
  ) : null,
465
- /* @__PURE__ */ jsx5(deps.DialogActions, { isSaving, onClose })
483
+ /* @__PURE__ */ jsx5(
484
+ deps.DialogActions,
485
+ {
486
+ isSaving,
487
+ submitLabel: editing ? "\u0428\u0438\u043D\u044D\u0447\u043B\u044D\u0445" : "\u041D\u044D\u043C\u044D\u0445",
488
+ onClose
489
+ }
490
+ )
466
491
  ]
467
492
  }
468
493
  ) })
@@ -476,10 +501,13 @@ function createRuntimeSubformFieldComponent(deps) {
476
501
  draftRows = [],
477
502
  onDraftRowsChange
478
503
  }) {
504
+ const { control } = useFormContext();
505
+ const watchedParentValues = useWatch({ control, name: "values" });
479
506
  const [isEntryDialogOpen, setEntryDialogOpen] = useState3(false);
480
507
  const [editing, setEditing] = useState3(null);
481
- const initializedDraft = useRef(false);
508
+ const initializedDraft = useRef2(false);
482
509
  const linkedValue = parentValue(parentEntry, subform.parentField);
510
+ const parentValues = watchedParentValues && typeof watchedParentValues === "object" && !Array.isArray(watchedParentValues) ? watchedParentValues : void 0;
483
511
  const isDraftMode = Boolean(onDraftRowsChange);
484
512
  const canFetchBackendRows = Boolean(linkedValue);
485
513
  const canUseBackendRows = canFetchBackendRows && !isDraftMode;
@@ -569,7 +597,9 @@ function createRuntimeSubformFieldComponent(deps) {
569
597
  view,
570
598
  childField: subform.childField,
571
599
  parentValue: linkedValue,
600
+ parentValues,
572
601
  editing,
602
+ isDraft: isDraftMode,
573
603
  isSaving: canUseBackendRows ? save.isPending : false,
574
604
  deps,
575
605
  onClose: () => {