@solidxai/core-ui 0.1.3 → 0.1.4-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/components/auth/SolidInitialLoginOtp.d.ts.map +1 -1
  2. package/dist/components/auth/SolidInitialLoginOtp.js +0 -5
  3. package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
  4. package/dist/components/auth/SolidInitialLoginOtp.tsx +0 -5
  5. package/dist/components/auth/SolidLogin.d.ts.map +1 -1
  6. package/dist/components/auth/SolidLogin.js +7 -5
  7. package/dist/components/auth/SolidLogin.js.map +1 -1
  8. package/dist/components/auth/SolidLogin.tsx +10 -8
  9. package/dist/components/common/GeneralSettings.d.ts.map +1 -1
  10. package/dist/components/common/GeneralSettings.js +48 -47
  11. package/dist/components/common/GeneralSettings.js.map +1 -1
  12. package/dist/components/common/GeneralSettings.tsx +41 -10
  13. package/dist/components/core/common/FilterComponent.js.map +1 -1
  14. package/dist/components/core/common/FilterComponent.tsx +1 -1
  15. package/dist/components/core/common/GroupingComponent.d.ts +54 -0
  16. package/dist/components/core/common/GroupingComponent.d.ts.map +1 -0
  17. package/dist/components/core/common/GroupingComponent.js +196 -0
  18. package/dist/components/core/common/GroupingComponent.js.map +1 -0
  19. package/dist/components/core/common/GroupingComponent.tsx +452 -0
  20. package/dist/components/core/common/SolidGlobalSearchElement.d.ts +18 -1
  21. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  22. package/dist/components/core/common/SolidGlobalSearchElement.js +152 -52
  23. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  24. package/dist/components/core/common/SolidGlobalSearchElement.tsx +212 -35
  25. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.d.ts +19 -0
  26. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.d.ts.map +1 -0
  27. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.js +90 -0
  28. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.js.map +1 -0
  29. package/dist/components/core/extension/solid-core/modelSequence/modelSequenceFormViewChangeHandler.tsx +59 -0
  30. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.d.ts.map +1 -1
  31. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js +17 -28
  32. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js.map +1 -1
  33. package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.tsx +71 -56
  34. package/dist/components/core/filter/SolidOneToManyFilterElement.d.ts +2 -0
  35. package/dist/components/core/filter/SolidOneToManyFilterElement.d.ts.map +1 -0
  36. package/dist/components/core/filter/SolidOneToManyFilterElement.js +86 -0
  37. package/dist/components/core/filter/SolidOneToManyFilterElement.js.map +1 -0
  38. package/dist/components/core/filter/SolidOneToManyFilterElement.tsx +62 -0
  39. package/dist/components/core/filter/SolidVarInputsFilterElement.d.ts +1 -0
  40. package/dist/components/core/filter/SolidVarInputsFilterElement.d.ts.map +1 -1
  41. package/dist/components/core/filter/SolidVarInputsFilterElement.js +4 -1
  42. package/dist/components/core/filter/SolidVarInputsFilterElement.js.map +1 -1
  43. package/dist/components/core/filter/SolidVarInputsFilterElement.tsx +10 -0
  44. package/dist/components/core/filter/fields/SolidRelationField.d.ts.map +1 -1
  45. package/dist/components/core/filter/fields/SolidRelationField.js +4 -2
  46. package/dist/components/core/filter/fields/SolidRelationField.js.map +1 -1
  47. package/dist/components/core/filter/fields/SolidRelationField.tsx +4 -2
  48. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.d.ts +4 -0
  49. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.d.ts.map +1 -0
  50. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.js +25 -0
  51. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.js.map +1 -0
  52. package/dist/components/core/filter/fields/relations/SolidRelationOneToManyField.tsx +60 -0
  53. package/dist/components/core/form/SolidFormFooter.js +4 -4
  54. package/dist/components/core/form/SolidFormFooter.js.map +1 -1
  55. package/dist/components/core/form/SolidFormFooter.tsx +4 -4
  56. package/dist/components/core/form/fields/SolidBooleanField.d.ts.map +1 -1
  57. package/dist/components/core/form/fields/SolidBooleanField.js +11 -8
  58. package/dist/components/core/form/fields/SolidBooleanField.js.map +1 -1
  59. package/dist/components/core/form/fields/SolidBooleanField.tsx +20 -8
  60. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts +40 -0
  61. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts.map +1 -1
  62. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +317 -157
  63. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
  64. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +463 -243
  65. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.d.ts.map +1 -1
  66. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js +46 -95
  67. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js.map +1 -1
  68. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.tsx +57 -113
  69. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts +15 -4
  70. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts.map +1 -1
  71. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js +220 -33
  72. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js.map +1 -1
  73. package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts +167 -36
  74. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  75. package/dist/components/core/kanban/SolidKanbanView.js +13 -12
  76. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  77. package/dist/components/core/kanban/SolidKanbanView.tsx +8 -7
  78. package/dist/components/core/list/SolidListView.d.ts +18 -10
  79. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  80. package/dist/components/core/list/SolidListView.js +176 -177
  81. package/dist/components/core/list/SolidListView.js.map +1 -1
  82. package/dist/components/core/list/SolidListView.tsx +130 -143
  83. package/dist/components/core/list/SolidListViewConfigure.d.ts +7 -0
  84. package/dist/components/core/list/SolidListViewConfigure.d.ts.map +1 -1
  85. package/dist/components/core/list/SolidListViewConfigure.js +6 -5
  86. package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
  87. package/dist/components/core/list/SolidListViewConfigure.tsx +21 -12
  88. package/dist/components/core/list/columns/SolidShortTextColumn.d.ts.map +1 -1
  89. package/dist/components/core/list/columns/SolidShortTextColumn.js +1 -37
  90. package/dist/components/core/list/columns/SolidShortTextColumn.js.map +1 -1
  91. package/dist/components/core/list/columns/SolidShortTextColumn.tsx +0 -41
  92. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.d.ts.map +1 -1
  93. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js +9 -5
  94. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js.map +1 -1
  95. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.tsx +14 -3
  96. package/dist/components/core/list/listViewRegistry.js.map +1 -1
  97. package/dist/components/core/list/listViewRegistry.ts +1 -2
  98. package/dist/components/core/tree/SolidTreeView.d.ts +38 -0
  99. package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -0
  100. package/dist/components/core/tree/SolidTreeView.js +1179 -0
  101. package/dist/components/core/tree/SolidTreeView.js.map +1 -0
  102. package/dist/components/core/tree/SolidTreeView.tsx +1637 -0
  103. package/dist/components/core/tree/treeViewRegistry.d.ts +7 -0
  104. package/dist/components/core/tree/treeViewRegistry.d.ts.map +1 -0
  105. package/dist/components/core/tree/treeViewRegistry.js +17 -0
  106. package/dist/components/core/tree/treeViewRegistry.js.map +1 -0
  107. package/dist/components/core/tree/treeViewRegistry.ts +23 -0
  108. package/dist/components/core/users/CreateUser.d.ts.map +1 -1
  109. package/dist/components/core/users/CreateUser.js +19 -6
  110. package/dist/components/core/users/CreateUser.js.map +1 -1
  111. package/dist/components/core/users/CreateUser.tsx +39 -0
  112. package/dist/helpers/helpers.d.ts +2 -0
  113. package/dist/helpers/helpers.d.ts.map +1 -1
  114. package/dist/helpers/helpers.js +3 -1
  115. package/dist/helpers/helpers.js.map +1 -1
  116. package/dist/helpers/helpers.ts +4 -1
  117. package/dist/helpers/registry.d.ts.map +1 -1
  118. package/dist/helpers/registry.js +5 -1
  119. package/dist/helpers/registry.js.map +1 -1
  120. package/dist/helpers/registry.ts +7 -2
  121. package/dist/index.d.ts +3 -1
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +2 -0
  124. package/dist/index.js.map +1 -1
  125. package/dist/index.ts +6 -1
  126. package/dist/resources/globals.css +32 -4
  127. package/dist/routes/pages/admin/core/ListPage.d.ts.map +1 -1
  128. package/dist/routes/pages/admin/core/ListPage.js +2 -2
  129. package/dist/routes/pages/admin/core/ListPage.js.map +1 -1
  130. package/dist/routes/pages/admin/core/ListPage.tsx +3 -2
  131. package/dist/routes/pages/admin/core/ModuleHomePage.d.ts.map +1 -1
  132. package/dist/routes/pages/admin/core/ModuleHomePage.js +4 -15
  133. package/dist/routes/pages/admin/core/ModuleHomePage.js.map +1 -1
  134. package/dist/routes/pages/admin/core/ModuleHomePage.tsx +4 -3
  135. package/dist/routes/pages/admin/core/TreePage.d.ts +2 -0
  136. package/dist/routes/pages/admin/core/TreePage.d.ts.map +1 -0
  137. package/dist/routes/pages/admin/core/TreePage.js +37 -0
  138. package/dist/routes/pages/admin/core/TreePage.js.map +1 -0
  139. package/dist/routes/pages/admin/core/TreePage.tsx +30 -0
  140. package/dist/routes/solidRoutes.d.ts.map +1 -1
  141. package/dist/routes/solidRoutes.js +2 -0
  142. package/dist/routes/solidRoutes.js.map +1 -1
  143. package/dist/routes/solidRoutes.tsx +3 -1
  144. package/dist/routes/types.d.ts +1 -1
  145. package/dist/routes/types.d.ts.map +1 -1
  146. package/dist/routes/types.js.map +1 -1
  147. package/dist/routes/types.ts +1 -0
  148. package/dist/types/index.d.ts +8 -2
  149. package/dist/types/solid-core.d.ts +40 -0
  150. package/package.json +1 -1
@@ -144,6 +144,47 @@ export class SolidRelationOneToManyField implements ISolidField {
144
144
  }
145
145
 
146
146
 
147
+
148
+ const buildRelationCustomFilter = ({
149
+ fieldContext,
150
+ fieldLayoutInfo,
151
+ }: {
152
+ fieldContext: any;
153
+ fieldLayoutInfo?: any;
154
+ }) => {
155
+ if (!fieldContext) {
156
+ return { id: { $eq: -1 } };
157
+ }
158
+ const relationFieldName =
159
+ fieldContext.fieldMetadata?.relationCoModelFieldName ??
160
+ fieldContext.modelName;
161
+
162
+ const parentId = fieldContext.data?.id ?? -1;
163
+
164
+
165
+ const baseFilter = {
166
+ [relationFieldName]: {
167
+ id: { $eq: parentId },
168
+ },
169
+ };
170
+
171
+ const whereClause = fieldLayoutInfo?.attrs?.whereClause;
172
+
173
+ if (!whereClause) return { $and: [baseFilter] };
174
+
175
+ try {
176
+ const parsedWhereClause = JSON.parse(whereClause);
177
+
178
+ return {
179
+ $and: [baseFilter, parsedWhereClause],
180
+ };
181
+ } catch (error) {
182
+ console.error("Failed to parse whereClause:", error);
183
+ return { $and: [baseFilter] };
184
+ }
185
+ };
186
+
187
+
147
188
  export const DefaultRelationOneToManyFormEditWidget = ({ formik, fieldContext }: SolidFormFieldWidgetProps) => {
148
189
  const fieldMetadata = fieldContext.fieldMetadata;
149
190
  const router = useRouter();
@@ -168,11 +209,11 @@ export const DefaultRelationOneToManyFormEditWidget = ({ formik, fieldContext }:
168
209
  const urlParams = new URLSearchParams(window.location.search);
169
210
  const childEntity = urlParams.get('childEntity');
170
211
  if (childEntity === fieldLayoutInfo.attrs.name && lastPathSegment !== "new") {
171
- handlePopupOpen('new');
212
+ handleAddOrEditClickForEmbeddedView('new');
172
213
  }
173
214
  }, [])
174
215
 
175
- const handlePopupOpen = (id: any) => {
216
+ const handleAddOrEditClickForEmbeddedView = (id: any) => {
176
217
  if (lastPathSegment === "new") {
177
218
  setShowSaveParentEntityConfirmationPopup(true);
178
219
  } else {
@@ -208,51 +249,14 @@ export const DefaultRelationOneToManyFormEditWidget = ({ formik, fieldContext }:
208
249
  customLayout: fieldLayoutInfo?.attrs?.inlineListLayout,
209
250
  embeded: true,
210
251
  id: fieldContext.data ? fieldContext?.data?.id : 'new',
211
- customFilter: {
212
- [customFilter]: {
213
- id: {
214
- $eq: fieldContext.data && fieldContext.data.id !== undefined ? fieldContext.data.id : -1
215
- }
216
- }
217
- }
252
+ customFilter: buildRelationCustomFilter({
253
+ fieldContext,
254
+ fieldLayoutInfo,
255
+ })
218
256
  }
219
257
  setListViewParams(lisviewparams)
220
258
  }
221
259
 
222
-
223
-
224
- const buildCustomFilter = (customFilterKey: any, fieldContext: any, fieldLayoutInfo: any) => {
225
- const baseFilter = {
226
- [customFilterKey]: {
227
- id: {
228
- $eq: fieldContext.data && fieldContext.data.id !== undefined
229
- ? fieldContext.data.id
230
- : -1
231
- }
232
- }
233
- };
234
-
235
- const whereClause = fieldLayoutInfo?.attrs?.whereClause;
236
-
237
- if (whereClause) {
238
- try {
239
- const parsedWhereClause = JSON.parse(whereClause);
240
- return {
241
- [customFilterKey]: {
242
- ...baseFilter[customFilterKey],
243
- ...parsedWhereClause
244
- }
245
- };
246
- } catch (error) {
247
- console.error('Failed to parse whereClause:', error);
248
- return baseFilter;
249
- }
250
- }
251
-
252
- return baseFilter;
253
- };
254
-
255
-
256
260
  //Intial Params
257
261
  useEffect(() => {
258
262
 
@@ -265,15 +269,11 @@ export const DefaultRelationOneToManyFormEditWidget = ({ formik, fieldContext }:
265
269
  customLayout: fieldLayoutInfo?.attrs?.inlineListLayout,
266
270
  embeded: true,
267
271
  id: fieldContext.data ? fieldContext?.data?.id : 'new',
268
- customFilter: buildCustomFilter(customFilter, fieldContext, fieldLayoutInfo)
269
-
270
- // customFilter: {
271
- // [customFilter]: {
272
- // id: {
273
- // $eq: fieldContext.data && fieldContext.data.id !== undefined ? fieldContext.data.id : -1
274
- // }
275
- // }
276
- // }
272
+ customFilter: buildRelationCustomFilter({
273
+ fieldContext,
274
+ fieldLayoutInfo,
275
+ })
276
+
277
277
  }
278
278
  setListViewParams(listviewparams);
279
279
  const formviewparams: FormViewParams = {
@@ -332,7 +332,7 @@ export const DefaultRelationOneToManyFormEditWidget = ({ formik, fieldContext }:
332
332
 
333
333
  {/* {lastPathSegment === 'new' && <p>Please save the {solidFormViewMetaData.data.solidView.model.displayName} to be able to save {fieldMetadata.displayName}</p>} */}
334
334
  {listViewParams &&
335
- <SolidListView key={refreshList.toString()} {...listViewParams} handlePopUpOpen={handlePopupOpen} />
335
+ <SolidListView key={refreshList.toString()} {...listViewParams} handleAddClickForEmbeddedView={handleAddOrEditClickForEmbeddedView} handleEditClickForEmbeddedView={handleAddOrEditClickForEmbeddedView} />
336
336
  }
337
337
  {readOnlyPermission !== true && formViewParams &&
338
338
  <RenderSolidFormEmbededView formik={formik} fieldContext={fieldContext} visibleCreateRelationEntity={visibleCreateRelationEntity} setvisibleCreateRelationEntity={setvisibleCreateRelationEntity} formViewParams={formViewParams} handlePopupClose={handlePopupClose}></RenderSolidFormEmbededView>
@@ -374,48 +374,8 @@ export const DefaultRelationOneToManyFormViewWidget = ({ formik, fieldContext }:
374
374
  const lastPathSegment = pathname.split('/').pop();
375
375
  const userKeyField: any = Object.entries(fieldContext.solidFormViewMetaData.data.solidFieldsMetadata).find(([_, value]: any) => value.isUserKey)?.[0];
376
376
 
377
- const buildRelationCustomFilter = ({
378
- fieldContext,
379
- fieldLayoutInfo,
380
- }: {
381
- fieldContext: any;
382
- fieldLayoutInfo?: any;
383
- }) => {
384
- if (!fieldContext) {
385
- return { id: { $eq: -1 } };
386
- }
387
-
388
- const relationFieldName =
389
- fieldContext.fieldMetadata?.relationCoModelFieldName ??
390
- fieldContext.modelName;
391
-
392
- const parentId = fieldContext.data?.id ?? -1;
393
-
394
- const baseFilter = {
395
- [relationFieldName]: {
396
- id: { $eq: parentId },
397
- },
398
- };
399
-
400
- const whereClause = fieldLayoutInfo?.attrs?.whereClause;
401
-
402
- if (!whereClause) return { $and: [baseFilter] };
403
377
 
404
- try {
405
- const parsedWhereClause = JSON.parse(whereClause);
406
-
407
- return {
408
- $and: [baseFilter, parsedWhereClause],
409
- };
410
- } catch (error) {
411
- console.error("Failed to parse whereClause:", error);
412
- return { $and: [baseFilter] };
413
- }
414
- };
415
-
416
-
417
-
418
- const handlePopupOpen = (id: any) => {
378
+ const handleAddOrEditClickForEmbeddedView = (id: any) => {
419
379
 
420
380
  const formviewparams: FormViewParams = {
421
381
  moduleName: fieldContext.fieldMetadata.relationModelModuleName,
@@ -451,13 +411,6 @@ export const DefaultRelationOneToManyFormViewWidget = ({ formik, fieldContext }:
451
411
  fieldContext,
452
412
  fieldLayoutInfo,
453
413
  })
454
- // customFilter: {
455
- // [customFilter]: {
456
- // id: {
457
- // $eq: fieldContext.data ? fieldContext?.data?.id : -1
458
- // }
459
- // }
460
- // }
461
414
  }
462
415
  setListViewParams(lisviewparams)
463
416
  }
@@ -476,15 +429,6 @@ export const DefaultRelationOneToManyFormViewWidget = ({ formik, fieldContext }:
476
429
  fieldContext,
477
430
  fieldLayoutInfo,
478
431
  })
479
-
480
-
481
- // customFilter: {
482
- // [customFilter]: {
483
- // id: {
484
- // $eq: fieldContext?.data?.id !== undefined ? fieldContext?.data?.id : -1
485
- // }
486
- // }
487
- // }
488
432
  }
489
433
  setListViewParams(listviewparams);
490
434
  const formviewparams: FormViewParams = {
@@ -523,7 +467,7 @@ export const DefaultRelationOneToManyFormViewWidget = ({ formik, fieldContext }:
523
467
 
524
468
  {/* {lastPathSegment === 'new' && <p>Please save the {solidFormViewMetaData.data.solidView.model.displayName} to be able to save {fieldMetadata.displayName}</p>} */}
525
469
  {listViewParams &&
526
- <SolidListView key={refreshList.toString()} {...listViewParams} handlePopUpOpen={handlePopupOpen} />
470
+ <SolidListView key={refreshList.toString()} {...listViewParams} handleAddClickForEmbeddedView={handleAddOrEditClickForEmbeddedView} handleEditClickForEmbeddedView={handleAddOrEditClickForEmbeddedView} />
527
471
  }
528
472
  {readOnlyPermission !== true && formViewParams &&
529
473
  <RenderSolidFormEmbededView fieldLayoutInfo={fieldLayoutInfo} visibleCreateRelationEntity={visibleCreateRelationEntity} setvisibleCreateRelationEntity={setvisibleCreateRelationEntity} formViewParams={formViewParams} handlePopupClose={handlePopupClose}></RenderSolidFormEmbededView>
@@ -648,7 +592,7 @@ export const PseudoRelationOneToManyFormWidget = ({ formData, field, fieldsMetad
648
592
 
649
593
 
650
594
 
651
- const handlePopupOpen = (id: any) => {
595
+ const handleAddOrEditClickForEmbeddedView = (id: any) => {
652
596
 
653
597
  const formviewparams: FormViewParams = {
654
598
  moduleName: childModuleName,
@@ -736,7 +680,7 @@ export const PseudoRelationOneToManyFormWidget = ({ formData, field, fieldsMetad
736
680
 
737
681
  {/* {lastPathSegment === 'new' && <p>Please save the {solidFormViewMetaData.data.solidView.model.displayName} to be able to save {fieldMetadata.displayName}</p>} */}
738
682
  {listViewParams &&
739
- <SolidListView key={refreshList.toString()} {...listViewParams} handlePopUpOpen={handlePopupOpen} />
683
+ <SolidListView key={refreshList.toString()} {...listViewParams} handleAddClickForEmbeddedView={handleAddOrEditClickForEmbeddedView} handleEditClickForEmbeddedView={handleAddOrEditClickForEmbeddedView} />
740
684
  }
741
685
  {readOnlyPermission !== true && formViewParams &&
742
686
  <RenderSolidFormEmbededView fieldLayoutInfo={fieldLayoutInfo} visibleCreateRelationEntity={visibleCreateRelationEntity} setvisibleCreateRelationEntity={setvisibleCreateRelationEntity} formViewParams={formViewParams} handlePopupClose={handlePopupClose}></RenderSolidFormEmbededView>
@@ -1,6 +1,17 @@
1
- export declare const useRelationEntityHandler: ({ fieldContext, formik, autoCompleteLimit }: any) => {
2
- autoCompleteItems: never[];
3
- fetchRelationEntities: (autocompleteQs?: string, limit?: any) => Promise<void>;
4
- addNewRelation: (values: any) => void;
1
+ export type RelationItem = {
2
+ label: string;
3
+ value: any;
4
+ original?: any;
5
+ };
6
+ export declare const useRelationEntityHandler: ({ fieldContext, autoCompleteLimit }: any) => {
7
+ currentValues: RelationItem[];
8
+ allOptions: RelationItem[];
9
+ suggestions: RelationItem[];
10
+ fetchCurrentValues: () => Promise<void>;
11
+ linkItem: (item: RelationItem) => Promise<void>;
12
+ unlinkItem: (item: RelationItem) => Promise<void>;
13
+ fetchSuggestions: (autocompleteQs?: string) => Promise<void>;
14
+ fetchAllOptions: (autocompleteQs?: string) => Promise<void>;
15
+ addNewRelation: (values: any) => Promise<void>;
5
16
  };
6
17
  //# sourceMappingURL=useRelationEntityHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useRelationEntityHandler.d.ts","sourceRoot":"","sources":["../../../../../../../../src/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,wBAAwB,gDAAwD,GAAG;;;6BAoC9D,GAAG;CAuBpC,CAAC"}
1
+ {"version":3,"file":"useRelationEntityHandler.d.ts","sourceRoot":"","sources":["../../../../../../../../src/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,wBAAwB,wCAAgD,GAAG;;;;;qBAoFxD,YAAY;uBAeV,YAAY;;;6BAqDN,GAAG;CAgC1C,CAAC"}
@@ -44,62 +44,249 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
44
44
  return to.concat(ar || Array.prototype.slice.call(from));
45
45
  };
46
46
  import { useState } from "react";
47
+ import qs from "qs";
47
48
  import { createSolidEntityApi } from "../../../../../../../redux/api/solidEntityApi";
48
49
  export var useRelationEntityHandler = function (_a) {
49
- var fieldContext = _a.fieldContext, formik = _a.formik, _b = _a.autoCompleteLimit, autoCompleteLimit = _b === void 0 ? 1000 : _b;
50
+ var fieldContext = _a.fieldContext, _b = _a.autoCompleteLimit, autoCompleteLimit = _b === void 0 ? 1000 : _b;
50
51
  var fieldMetadata = fieldContext.fieldMetadata;
51
52
  var fieldLayoutInfo = fieldContext.field;
52
53
  var entityApi = createSolidEntityApi(fieldMetadata.relationCoModelSingularName);
53
54
  var useLazyGetSolidEntitiesQuery = entityApi.useLazyGetSolidEntitiesQuery;
54
55
  var triggerGetSolidEntities = useLazyGetSolidEntitiesQuery()[0];
55
- var _c = useState([]), autoCompleteItems = _c[0], setAutoCompleteItems = _c[1];
56
- var fetchRelationEntities = function (autocompleteQs, limit) {
56
+ var parentEntityApi = createSolidEntityApi(fieldContext.modelName);
57
+ var usePatchUpdateSolidEntityMutation = parentEntityApi.usePatchUpdateSolidEntityMutation, useUpdateSolidEntityMutation = parentEntityApi.useUpdateSolidEntityMutation;
58
+ var updateSolidEntity = usePatchUpdateSolidEntityMutation()[0];
59
+ /**
60
+ * AUTOCOMPLETE & CHECKBOX:
61
+ * The currently linked items — drives what chips are shown in the autocomplete
62
+ * and which checkboxes are checked.
63
+ */
64
+ var _c = useState([]), currentValues = _c[0], setCurrentValues = _c[1];
65
+ /**
66
+ * CHECKBOX ONLY:
67
+ * All possible options to render as checkboxes.
68
+ * For autocomplete this is not needed — options are fetched on user search input.
69
+ */
70
+ var _d = useState([]), allOptions = _d[0], setAllOptions = _d[1];
71
+ /**
72
+ * AUTOCOMPLETE ONLY:
73
+ * The live suggestion list shown in the dropdown while the user is typing.
74
+ * Populated by `fetchSuggestions` on each keystroke.
75
+ */
76
+ var _e = useState([]), suggestions = _e[0], setSuggestions = _e[1];
77
+ // ─── Internal ────────────────────────────────────────────────────────────────
78
+ var sendLinkCommand = function (item, command) { return __awaiter(void 0, void 0, void 0, function () {
79
+ var parentId, fieldName, formData;
80
+ var _a;
81
+ return __generator(this, function (_b) {
82
+ switch (_b.label) {
83
+ case 0:
84
+ parentId = (_a = fieldContext.data) === null || _a === void 0 ? void 0 : _a.id;
85
+ fieldName = fieldLayoutInfo.attrs.name;
86
+ if (!parentId || parentId === "new")
87
+ return [2 /*return*/];
88
+ formData = new FormData();
89
+ formData.append("".concat(fieldName, "Ids[0]"), item.value);
90
+ formData.append("".concat(fieldName, "Command"), command);
91
+ return [4 /*yield*/, updateSolidEntity({ id: parentId, data: formData }).unwrap()];
92
+ case 1:
93
+ _b.sent();
94
+ return [2 /*return*/];
95
+ }
96
+ });
97
+ }); };
98
+ // ─── Shared ──────────────────────────────────────────────────────────────────
99
+ /**
100
+ * Fetch currently linked items and populate `currentValues`.
101
+ * Call on mount for both autocomplete and checkbox widgets.
102
+ */
103
+ var fetchCurrentValues = function () { return __awaiter(void 0, void 0, void 0, function () {
104
+ var relationFieldName, parentId, queryData, response, mapped;
105
+ var _a;
106
+ var _b, _c, _d, _e;
107
+ return __generator(this, function (_f) {
108
+ switch (_f.label) {
109
+ case 0:
110
+ relationFieldName = (_c = (_b = fieldContext.fieldMetadata) === null || _b === void 0 ? void 0 : _b.relationCoModelFieldName) !== null && _c !== void 0 ? _c : fieldContext.modelName;
111
+ parentId = (_e = (_d = fieldContext.data) === null || _d === void 0 ? void 0 : _d.id) !== null && _e !== void 0 ? _e : -1;
112
+ queryData = {
113
+ offset: 0,
114
+ limit: autoCompleteLimit,
115
+ filters: {
116
+ $and: [(_a = {}, _a[relationFieldName] = { id: { $eq: parentId } }, _a)],
117
+ },
118
+ };
119
+ return [4 /*yield*/, triggerGetSolidEntities(qs.stringify(queryData, { encodeValuesOnly: true }))];
120
+ case 1:
121
+ response = _f.sent();
122
+ if (!response.data)
123
+ return [2 /*return*/];
124
+ mapped = response.data.records.map(function (item) {
125
+ var _a, _b;
126
+ return ({
127
+ label: item[(_b = (_a = fieldMetadata === null || fieldMetadata === void 0 ? void 0 : fieldMetadata.relationModel) === null || _a === void 0 ? void 0 : _a.userKeyField) === null || _b === void 0 ? void 0 : _b.name],
128
+ value: item.id,
129
+ original: item,
130
+ });
131
+ });
132
+ setCurrentValues(mapped);
133
+ return [2 /*return*/];
134
+ }
135
+ });
136
+ }); };
137
+ /**
138
+ * Link an item: fire the API call, and on success update `currentValues`.
139
+ * Used by both autocomplete (onSelect) and checkbox (onChange when unchecked).
140
+ */
141
+ var linkItem = function (item) { return __awaiter(void 0, void 0, void 0, function () {
142
+ var error_1;
143
+ var _a;
144
+ return __generator(this, function (_b) {
145
+ switch (_b.label) {
146
+ case 0:
147
+ _b.trys.push([0, 2, , 3]);
148
+ return [4 /*yield*/, sendLinkCommand(item, "link")];
149
+ case 1:
150
+ _b.sent();
151
+ setCurrentValues(function (prev) {
152
+ return prev.some(function (s) { return s.value === item.value; }) ? prev : __spreadArray(__spreadArray([], prev, true), [item], false);
153
+ });
154
+ return [3 /*break*/, 3];
155
+ case 2:
156
+ error_1 = _b.sent();
157
+ console.error(((_a = error_1 === null || error_1 === void 0 ? void 0 : error_1.data) === null || _a === void 0 ? void 0 : _a.message) || (error_1 === null || error_1 === void 0 ? void 0 : error_1.message) || "Failed to link ".concat(fieldMetadata.displayName));
158
+ return [3 /*break*/, 3];
159
+ case 3: return [2 /*return*/];
160
+ }
161
+ });
162
+ }); };
163
+ /**
164
+ * Unlink an item: fire the API call, and on success update `currentValues`.
165
+ * Used by both autocomplete (onUnselect) and checkbox (onChange when checked).
166
+ */
167
+ var unlinkItem = function (item) { return __awaiter(void 0, void 0, void 0, function () {
168
+ var error_2;
169
+ var _a;
170
+ return __generator(this, function (_b) {
171
+ switch (_b.label) {
172
+ case 0:
173
+ _b.trys.push([0, 2, , 3]);
174
+ return [4 /*yield*/, sendLinkCommand(item, "unlink")];
175
+ case 1:
176
+ _b.sent();
177
+ setCurrentValues(function (prev) { return prev.filter(function (s) { return s.value !== item.value; }); });
178
+ return [3 /*break*/, 3];
179
+ case 2:
180
+ error_2 = _b.sent();
181
+ console.error(((_a = error_2 === null || error_2 === void 0 ? void 0 : error_2.data) === null || _a === void 0 ? void 0 : _a.message) || (error_2 === null || error_2 === void 0 ? void 0 : error_2.message) || "Failed to unlink ".concat(fieldMetadata.displayName));
182
+ return [3 /*break*/, 3];
183
+ case 3: return [2 /*return*/];
184
+ }
185
+ });
186
+ }); };
187
+ // ─── Autocomplete-specific ───────────────────────────────────────────────────
188
+ /**
189
+ * Fetch suggestions for the autocomplete dropdown based on the user's search query.
190
+ * Call this inside `completeMethod` of the AutoComplete component.
191
+ */
192
+ var fetchSuggestions = function (autocompleteQs) {
57
193
  if (autocompleteQs === void 0) { autocompleteQs = ""; }
58
- if (limit === void 0) { limit = autoCompleteLimit; }
59
194
  return __awaiter(void 0, void 0, void 0, function () {
60
- var response, data, mappedItems;
195
+ var response, mapped;
61
196
  return __generator(this, function (_a) {
62
197
  switch (_a.label) {
63
198
  case 0: return [4 /*yield*/, triggerGetSolidEntities(autocompleteQs)];
64
199
  case 1:
65
200
  response = _a.sent();
66
- data = response.data;
67
- if (data) {
68
- mappedItems = data.records.map(function (item) {
69
- var _a, _b;
70
- return ({
71
- label: item[(_b = (_a = fieldMetadata === null || fieldMetadata === void 0 ? void 0 : fieldMetadata.relationModel) === null || _a === void 0 ? void 0 : _a.userKeyField) === null || _b === void 0 ? void 0 : _b.name],
72
- value: item['id'],
73
- original: item
74
- });
201
+ if (!response.data)
202
+ return [2 /*return*/];
203
+ mapped = response.data.records.map(function (item) {
204
+ var _a, _b;
205
+ return ({
206
+ label: item[(_b = (_a = fieldMetadata === null || fieldMetadata === void 0 ? void 0 : fieldMetadata.relationModel) === null || _a === void 0 ? void 0 : _a.userKeyField) === null || _b === void 0 ? void 0 : _b.name],
207
+ value: item["id"],
208
+ original: item,
75
209
  });
76
- setAutoCompleteItems(mappedItems);
77
- }
210
+ });
211
+ setSuggestions(mapped);
78
212
  return [2 /*return*/];
79
213
  }
80
214
  });
81
215
  });
82
216
  };
83
- var addNewRelation = function (values) {
84
- var _a, _b;
85
- var currentData = formik.values[fieldLayoutInfo.attrs.name] || [];
86
- var jsonValues = Object.fromEntries(values.entries());
87
- var newItem = {
88
- label: jsonValues[(_b = (_a = fieldMetadata === null || fieldMetadata === void 0 ? void 0 : fieldMetadata.relationModel) === null || _a === void 0 ? void 0 : _a.userKeyField) === null || _b === void 0 ? void 0 : _b.name],
89
- value: "new",
90
- original: jsonValues,
91
- };
92
- formik.setFieldValue(fieldLayoutInfo.attrs.name, __spreadArray(__spreadArray([], currentData, true), [newItem], false));
93
- // Optionally add to autocomplete list
94
- setAutoCompleteItems(function (prev) {
95
- var exists = prev.some(function (item) { return item.label === newItem.label; });
96
- return exists ? prev : __spreadArray(__spreadArray([], prev, true), [newItem], false);
217
+ // ─── Checkbox-specific ───────────────────────────────────────────────────────
218
+ /**
219
+ * Fetch all possible options for the checkbox list.
220
+ * Call this on mount for the checkbox widget.
221
+ */
222
+ var fetchAllOptions = function (autocompleteQs) {
223
+ if (autocompleteQs === void 0) { autocompleteQs = ""; }
224
+ return __awaiter(void 0, void 0, void 0, function () {
225
+ var response, mapped;
226
+ return __generator(this, function (_a) {
227
+ switch (_a.label) {
228
+ case 0: return [4 /*yield*/, triggerGetSolidEntities(autocompleteQs)];
229
+ case 1:
230
+ response = _a.sent();
231
+ if (!response.data)
232
+ return [2 /*return*/];
233
+ mapped = response.data.records.map(function (item) {
234
+ var _a, _b;
235
+ return ({
236
+ label: item[(_b = (_a = fieldMetadata === null || fieldMetadata === void 0 ? void 0 : fieldMetadata.relationModel) === null || _a === void 0 ? void 0 : _a.userKeyField) === null || _b === void 0 ? void 0 : _b.name],
237
+ value: item["id"],
238
+ original: item,
239
+ });
240
+ });
241
+ setAllOptions(mapped);
242
+ return [2 /*return*/];
243
+ }
244
+ });
97
245
  });
98
246
  };
247
+ // ─── Inline create ───────────────────────────────────────────────────────────
248
+ /**
249
+ * Handle an inline-created entity: link it and add to both `currentValues`
250
+ * and `allOptions` (so it shows up in the checkbox list immediately).
251
+ */
252
+ var addNewRelation = function (values) { return __awaiter(void 0, void 0, void 0, function () {
253
+ var jsonValues, newItem;
254
+ var _a, _b;
255
+ return __generator(this, function (_c) {
256
+ switch (_c.label) {
257
+ case 0:
258
+ jsonValues = Object.fromEntries(values.entries());
259
+ newItem = {
260
+ label: jsonValues[(_b = (_a = fieldMetadata === null || fieldMetadata === void 0 ? void 0 : fieldMetadata.relationModel) === null || _a === void 0 ? void 0 : _a.userKeyField) === null || _b === void 0 ? void 0 : _b.name],
261
+ value: "new",
262
+ original: jsonValues,
263
+ };
264
+ return [4 /*yield*/, linkItem(newItem)];
265
+ case 1:
266
+ _c.sent();
267
+ // Also add to allOptions so checkbox widget shows the new item
268
+ setAllOptions(function (prev) {
269
+ return prev.some(function (s) { return s.value === newItem.value; }) ? prev : __spreadArray(__spreadArray([], prev, true), [newItem], false);
270
+ });
271
+ return [2 /*return*/];
272
+ }
273
+ });
274
+ }); };
99
275
  return {
100
- autoCompleteItems: autoCompleteItems,
101
- fetchRelationEntities: fetchRelationEntities,
102
- addNewRelation: addNewRelation
276
+ // State
277
+ currentValues: currentValues,
278
+ allOptions: allOptions,
279
+ suggestions: suggestions,
280
+ // Shared
281
+ fetchCurrentValues: fetchCurrentValues,
282
+ linkItem: linkItem,
283
+ unlinkItem: unlinkItem,
284
+ // Autocomplete-specific
285
+ fetchSuggestions: fetchSuggestions,
286
+ // Checkbox-specific
287
+ fetchAllOptions: fetchAllOptions,
288
+ // Inline create
289
+ addNewRelation: addNewRelation,
103
290
  };
104
291
  };
105
292
  //# sourceMappingURL=useRelationEntityHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useRelationEntityHandler.js","sourceRoot":"","sources":["../../../../../../../../src/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAErF,MAAM,CAAC,IAAM,wBAAwB,GAAG,UAAC,EAAuD;QAArD,YAAY,kBAAA,EAAE,MAAM,YAAA,EAAE,yBAAwB,EAAxB,iBAAiB,mBAAG,IAAI,KAAA;IACvF,IAAM,aAAa,GAAG,YAAY,CAAC,aAAa,CAAC;IACjD,IAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC;IAE3C,IAAM,SAAS,GAAG,oBAAoB,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC;IAC1E,IAAA,4BAA4B,GAAK,SAAS,6BAAd,CAAe;IAC5C,IAAA,uBAAuB,GAAI,4BAA4B,EAAE,GAAlC,CAAmC;IAE3D,IAAA,KAA4C,QAAQ,CAAC,EAAE,CAAC,EAAvD,iBAAiB,QAAA,EAAE,oBAAoB,QAAgB,CAAC;IAE/D,IAAM,qBAAqB,GAAG,UAAO,cAAmB,EAAE,KAAyB;QAA9C,+BAAA,EAAA,mBAAmB;QAAE,sBAAA,EAAA,yBAAyB;;;;;4BAahE,qBAAM,uBAAuB,CAAC,cAAc,CAAC,EAAA;;wBAAxD,QAAQ,GAAG,SAA6C;wBACxD,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;wBAE3B,IAAI,IAAI,EAAE;4BACF,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAC,IAAS;;gCAAK,OAAA,CAAC;oCACnD,KAAK,EAAE,IAAI,CAAC,MAAA,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,aAAa,0CAAE,YAAY,0CAAE,IAAI,CAAC;oCAC7D,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;oCACjB,QAAQ,EAAE,IAAI;iCACf,CAAC,CAAA;6BAAA,CAAC,CAAC;4BACJ,oBAAoB,CAAC,WAAW,CAAC,CAAC;yBACnC;;;;;KACF,CAAC;IAEF,IAAM,cAAc,GAAG,UAAC,MAAW;;QACjC,IAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpE,IAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,IAAM,OAAO,GAAG;YACd,KAAK,EAAE,UAAU,CAAC,MAAA,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,aAAa,0CAAE,YAAY,0CAAE,IAAI,CAAC;YACnE,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,UAAU;SACrB,CAAC;QAEF,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,kCAAM,WAAW,UAAE,OAAO,UAAE,CAAC;QAE5E,sCAAsC;QACtC,oBAAoB,CAAC,UAAC,IAAS;YAC7B,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAC,IAAS,IAAK,OAAA,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,EAA5B,CAA4B,CAAC,CAAC;YACtE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,iCAAK,IAAI,UAAE,OAAO,SAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,iBAAiB,mBAAA;QACjB,qBAAqB,uBAAA;QACrB,cAAc,gBAAA;KACf,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { useState } from \"react\";\nimport qs from \"qs\";\nimport { createSolidEntityApi } from \"../../../../../../../redux/api/solidEntityApi\";\n\nexport const useRelationEntityHandler = ({ fieldContext, formik, autoCompleteLimit = 1000 }: any) => {\n const fieldMetadata = fieldContext.fieldMetadata;\n const fieldLayoutInfo = fieldContext.field;\n\n const entityApi = createSolidEntityApi(fieldMetadata.relationCoModelSingularName);\n const { useLazyGetSolidEntitiesQuery } = entityApi;\n const [triggerGetSolidEntities] = useLazyGetSolidEntitiesQuery();\n\n const [autoCompleteItems, setAutoCompleteItems] = useState([]);\n\n const fetchRelationEntities = async (autocompleteQs = \"\", limit = autoCompleteLimit) => {\n // const queryData = {\n // offset: 0,\n // limit: limit,\n // filters: {\n // [fieldMetadata?.relationModel?.userKeyField?.name]: {\n // '$containsi': query\n // }\n // }\n // };\n\n // const autocompleteQs = qs.stringify(queryData, { encodeValuesOnly: true });\n\n const response = await triggerGetSolidEntities(autocompleteQs);\n const data = response.data;\n\n if (data) {\n const mappedItems = data.records.map((item: any) => ({\n label: item[fieldMetadata?.relationModel?.userKeyField?.name],\n value: item['id'],\n original: item\n }));\n setAutoCompleteItems(mappedItems);\n }\n };\n\n const addNewRelation = (values: any) => {\n const currentData = formik.values[fieldLayoutInfo.attrs.name] || [];\n const jsonValues = Object.fromEntries(values.entries());\n const newItem = {\n label: jsonValues[fieldMetadata?.relationModel?.userKeyField?.name],\n value: \"new\",\n original: jsonValues,\n };\n\n formik.setFieldValue(fieldLayoutInfo.attrs.name, [...currentData, newItem]);\n\n // Optionally add to autocomplete list\n setAutoCompleteItems((prev: any) => {\n const exists = prev.some((item: any) => item.label === newItem.label);\n return exists ? prev : [...prev, newItem];\n });\n };\n\n return {\n autoCompleteItems,\n fetchRelationEntities,\n addNewRelation\n };\n};\n"]}
1
+ {"version":3,"file":"useRelationEntityHandler.js","sourceRoot":"","sources":["../../../../../../../../src/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState } from \"react\";\nimport qs from \"qs\";\nimport { createSolidEntityApi } from \"../../../../../../../redux/api/solidEntityApi\";\n\nexport type RelationItem = {\n label: string;\n value: any;\n original?: any;\n};\n\nexport const useRelationEntityHandler = ({ fieldContext, autoCompleteLimit = 1000 }: any) => {\n const fieldMetadata = fieldContext.fieldMetadata;\n const fieldLayoutInfo = fieldContext.field;\n\n const entityApi = createSolidEntityApi(fieldMetadata.relationCoModelSingularName);\n const { useLazyGetSolidEntitiesQuery } = entityApi;\n const [triggerGetSolidEntities] = useLazyGetSolidEntitiesQuery();\n\n const parentEntityApi = createSolidEntityApi(fieldContext.modelName);\n const { usePatchUpdateSolidEntityMutation, useUpdateSolidEntityMutation } = parentEntityApi;\n const [updateSolidEntity] = usePatchUpdateSolidEntityMutation();\n\n /**\n * AUTOCOMPLETE & CHECKBOX:\n * The currently linked items — drives what chips are shown in the autocomplete\n * and which checkboxes are checked.\n */\n const [currentValues, setCurrentValues] = useState<RelationItem[]>([]);\n\n /**\n * CHECKBOX ONLY:\n * All possible options to render as checkboxes.\n * For autocomplete this is not needed — options are fetched on user search input.\n */\n const [allOptions, setAllOptions] = useState<RelationItem[]>([]);\n\n /**\n * AUTOCOMPLETE ONLY:\n * The live suggestion list shown in the dropdown while the user is typing.\n * Populated by `fetchSuggestions` on each keystroke.\n */\n const [suggestions, setSuggestions] = useState<RelationItem[]>([]);\n\n // ─── Internal ────────────────────────────────────────────────────────────────\n\n const sendLinkCommand = async (item: RelationItem, command: \"link\" | \"unlink\") => {\n const parentId = fieldContext.data?.id;\n const fieldName = fieldLayoutInfo.attrs.name;\n\n if (!parentId || parentId === \"new\") return;\n\n const formData = new FormData();\n formData.append(`${fieldName}Ids[0]`, item.value);\n formData.append(`${fieldName}Command`, command);\n\n await updateSolidEntity({ id: parentId, data: formData }).unwrap();\n };\n\n // ─── Shared ──────────────────────────────────────────────────────────────────\n\n /**\n * Fetch currently linked items and populate `currentValues`.\n * Call on mount for both autocomplete and checkbox widgets.\n */\n const fetchCurrentValues = async () => {\n const relationFieldName =\n fieldContext.fieldMetadata?.relationCoModelFieldName ?? fieldContext.modelName;\n\n const parentId = fieldContext.data?.id ?? -1;\n\n const queryData = {\n offset: 0,\n limit: autoCompleteLimit,\n filters: {\n $and: [{ [relationFieldName]: { id: { $eq: parentId } } }],\n },\n };\n\n const response = await triggerGetSolidEntities(qs.stringify(queryData, { encodeValuesOnly: true }));\n if (!response.data) return;\n\n const mapped: RelationItem[] = response.data.records.map((item: any) => ({\n label: item[fieldMetadata?.relationModel?.userKeyField?.name],\n value: item.id,\n original: item,\n }));\n\n setCurrentValues(mapped);\n };\n\n /**\n * Link an item: fire the API call, and on success update `currentValues`.\n * Used by both autocomplete (onSelect) and checkbox (onChange when unchecked).\n */\n const linkItem = async (item: RelationItem) => {\n try {\n await sendLinkCommand(item, \"link\");\n setCurrentValues((prev) =>\n prev.some((s) => s.value === item.value) ? prev : [...prev, item]\n );\n } catch (error: any) {\n console.error(error?.data?.message || error?.message || `Failed to link ${fieldMetadata.displayName}`);\n }\n };\n\n /**\n * Unlink an item: fire the API call, and on success update `currentValues`.\n * Used by both autocomplete (onUnselect) and checkbox (onChange when checked).\n */\n const unlinkItem = async (item: RelationItem) => {\n try {\n await sendLinkCommand(item, \"unlink\");\n setCurrentValues((prev) => prev.filter((s) => s.value !== item.value));\n } catch (error: any) {\n console.error(error?.data?.message || error?.message || `Failed to unlink ${fieldMetadata.displayName}`);\n }\n };\n\n // ─── Autocomplete-specific ───────────────────────────────────────────────────\n\n /**\n * Fetch suggestions for the autocomplete dropdown based on the user's search query.\n * Call this inside `completeMethod` of the AutoComplete component.\n */\n const fetchSuggestions = async (autocompleteQs = \"\") => {\n const response = await triggerGetSolidEntities(autocompleteQs);\n if (!response.data) return;\n\n const mapped: RelationItem[] = response.data.records.map((item: any) => ({\n label: item[fieldMetadata?.relationModel?.userKeyField?.name],\n value: item[\"id\"],\n original: item,\n }));\n\n setSuggestions(mapped);\n };\n\n // ─── Checkbox-specific ───────────────────────────────────────────────────────\n\n /**\n * Fetch all possible options for the checkbox list.\n * Call this on mount for the checkbox widget.\n */\n const fetchAllOptions = async (autocompleteQs = \"\") => {\n const response = await triggerGetSolidEntities(autocompleteQs);\n if (!response.data) return;\n\n const mapped: RelationItem[] = response.data.records.map((item: any) => ({\n label: item[fieldMetadata?.relationModel?.userKeyField?.name],\n value: item[\"id\"],\n original: item,\n }));\n\n setAllOptions(mapped);\n };\n\n // ─── Inline create ───────────────────────────────────────────────────────────\n\n /**\n * Handle an inline-created entity: link it and add to both `currentValues`\n * and `allOptions` (so it shows up in the checkbox list immediately).\n */\n const addNewRelation = async (values: any) => {\n const jsonValues = Object.fromEntries(values.entries());\n const newItem: RelationItem = {\n label: jsonValues[fieldMetadata?.relationModel?.userKeyField?.name],\n value: \"new\",\n original: jsonValues,\n };\n\n await linkItem(newItem);\n\n // Also add to allOptions so checkbox widget shows the new item\n setAllOptions((prev) =>\n prev.some((s) => s.value === newItem.value) ? prev : [...prev, newItem]\n );\n };\n\n return {\n // State\n currentValues,\n allOptions,\n suggestions,\n // Shared\n fetchCurrentValues,\n linkItem,\n unlinkItem,\n // Autocomplete-specific\n fetchSuggestions,\n // Checkbox-specific\n fetchAllOptions,\n // Inline create\n addNewRelation,\n };\n};"]}