@solidxai/core-ui 0.1.4-beta.0 → 0.1.4-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.d.ts.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.js +8 -0
- package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.js.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.tsx +8 -0
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.d.ts +2 -0
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.d.ts.map +1 -0
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js +34 -0
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js.map +1 -0
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.tsx +83 -0
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js +6 -8
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +21 -21
- package/dist/components/core/dashboard/SolidDashboard.d.ts +1 -1
- package/dist/components/core/dashboard/SolidDashboard.d.ts.map +1 -1
- package/dist/components/core/dashboard/SolidDashboard.js.map +1 -1
- package/dist/components/core/dashboard/SolidDashboard.tsx +1 -1
- package/dist/components/core/dashboard/SolidDashboardVariable.js +1 -1
- package/dist/components/core/dashboard/SolidDashboardVariable.js.map +1 -1
- package/dist/components/core/dashboard/SolidDashboardVariable.tsx +1 -1
- package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js +15 -30
- package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.js.map +1 -1
- package/dist/components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget.tsx +46 -36
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts +40 -0
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +315 -160
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +459 -249
- package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.d.ts.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js +46 -95
- package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.tsx +57 -113
- package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts +15 -5
- package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts.map +1 -1
- package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js +203 -67
- package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js.map +1 -1
- package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.ts +147 -67
- package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.js +8 -7
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.tsx +3 -2
- package/dist/components/core/list/SolidListView.d.ts +8 -5
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +95 -84
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +55 -62
- package/dist/components/core/list/SolidListViewConfigure.d.ts +7 -0
- package/dist/components/core/list/SolidListViewConfigure.d.ts.map +1 -1
- package/dist/components/core/list/SolidListViewConfigure.js +6 -5
- package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
- package/dist/components/core/list/SolidListViewConfigure.tsx +21 -12
- package/dist/components/core/list/columns/SolidBooleanColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidBooleanColumn.js +1 -24
- package/dist/components/core/list/columns/SolidBooleanColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidBooleanColumn.tsx +1 -35
- package/dist/components/core/list/columns/SolidDateColumn.d.ts +0 -5
- package/dist/components/core/list/columns/SolidDateColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidDateColumn.js +1 -31
- package/dist/components/core/list/columns/SolidDateColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidDateColumn.tsx +2 -49
- package/dist/components/core/list/columns/SolidDatetimeColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidDatetimeColumn.js +1 -20
- package/dist/components/core/list/columns/SolidDatetimeColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidDatetimeColumn.tsx +2 -37
- package/dist/components/core/list/columns/SolidExternalIdColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidExternalIdColumn.js +1 -21
- package/dist/components/core/list/columns/SolidExternalIdColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidExternalIdColumn.tsx +1 -38
- package/dist/components/core/list/columns/SolidIdColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidIdColumn.js +1 -21
- package/dist/components/core/list/columns/SolidIdColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidIdColumn.tsx +1 -36
- package/dist/components/core/list/columns/SolidIntColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidIntColumn.js +1 -30
- package/dist/components/core/list/columns/SolidIntColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidIntColumn.tsx +2 -46
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +1 -5
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +0 -7
- package/dist/components/core/list/columns/SolidMediaSingleColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidMediaSingleColumn.js +1 -1
- package/dist/components/core/list/columns/SolidMediaSingleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +0 -1
- package/dist/components/core/list/columns/SolidSelectionDynamicColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidSelectionDynamicColumn.js +1 -21
- package/dist/components/core/list/columns/SolidSelectionDynamicColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidSelectionDynamicColumn.tsx +1 -37
- package/dist/components/core/list/columns/SolidSelectionStaticColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidSelectionStaticColumn.js +1 -21
- package/dist/components/core/list/columns/SolidSelectionStaticColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidSelectionStaticColumn.tsx +1 -38
- package/dist/components/core/list/columns/SolidShortTextColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidShortTextColumn.js +2 -66
- package/dist/components/core/list/columns/SolidShortTextColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidShortTextColumn.tsx +3 -86
- package/dist/components/core/list/columns/SolidTimeColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidTimeColumn.js +1 -20
- package/dist/components/core/list/columns/SolidTimeColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidTimeColumn.tsx +2 -37
- package/dist/components/core/list/columns/SolidUuidColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidUuidColumn.js +1 -21
- package/dist/components/core/list/columns/SolidUuidColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidUuidColumn.tsx +1 -37
- package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.js +1 -17
- package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.js.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.tsx +2 -35
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js +10 -20
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.tsx +15 -36
- package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.js +1 -15
- package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.js.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.tsx +1 -31
- package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
- package/dist/components/core/tree/SolidTreeView.js +23 -14
- package/dist/components/core/tree/SolidTreeView.js.map +1 -1
- package/dist/components/core/tree/SolidTreeView.tsx +50 -16
- package/dist/helpers/registry.js +3 -1
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/registry.ts +4 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/index.ts +5 -2
- package/dist/redux/api/fetchBaseQuery.js +4 -5
- package/dist/redux/api/fetchBaseQuery.js.map +1 -1
- package/dist/redux/api/fetchBaseQuery.tsx +4 -4
- package/dist/redux/api/solidSettingsApi.d.ts +2 -1
- package/dist/redux/api/solidSettingsApi.d.ts.map +1 -1
- package/dist/redux/api/solidSettingsApi.js +4 -1
- package/dist/redux/api/solidSettingsApi.js.map +1 -1
- package/dist/redux/api/solidSettingsApi.tsx +6 -1
- package/dist/redux/store/defaultStoreConfig.d.ts +1 -0
- package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
- package/dist/resources/globals.css +14 -0
- package/dist/routes/pages/admin/core/DashboardPage.d.ts +2 -0
- package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/DashboardPage.js +14 -0
- package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -0
- package/dist/routes/pages/admin/core/DashboardPage.tsx +17 -0
- package/dist/routes/pages/admin/core/ListPage.js +1 -1
- package/dist/routes/pages/admin/core/ListPage.js.map +1 -1
- package/dist/routes/pages/admin/core/ListPage.tsx +1 -1
- package/dist/routes/pages/admin/core/ModuleHomePage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/ModuleHomePage.js +4 -15
- package/dist/routes/pages/admin/core/ModuleHomePage.js.map +1 -1
- package/dist/routes/pages/admin/core/ModuleHomePage.tsx +4 -3
- package/dist/routes/solidRoutes.d.ts.map +1 -1
- package/dist/routes/solidRoutes.js +2 -0
- package/dist/routes/solidRoutes.js.map +1 -1
- package/dist/routes/solidRoutes.tsx +2 -0
- package/dist/routes/types.d.ts +1 -1
- package/dist/routes/types.d.ts.map +1 -1
- package/dist/routes/types.js.map +1 -1
- package/dist/routes/types.ts +1 -0
- package/dist/types/solid-core.d.ts +1 -1
- 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
|
-
|
|
212
|
+
handleAddOrEditClickForEmbeddedView('new');
|
|
172
213
|
}
|
|
173
214
|
}, [])
|
|
174
215
|
|
|
175
|
-
const
|
|
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
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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:
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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}
|
|
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
|
-
|
|
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}
|
|
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
|
|
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}
|
|
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>
|
package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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>;
|
|
6
16
|
};
|
|
7
17
|
//# sourceMappingURL=useRelationEntityHandler.d.ts.map
|
package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js
CHANGED
|
@@ -47,42 +47,61 @@ import { useState } from "react";
|
|
|
47
47
|
import qs from "qs";
|
|
48
48
|
import { createSolidEntityApi } from "../../../../../../../redux/api/solidEntityApi";
|
|
49
49
|
export var useRelationEntityHandler = function (_a) {
|
|
50
|
-
var fieldContext = _a.fieldContext,
|
|
50
|
+
var fieldContext = _a.fieldContext, _b = _a.autoCompleteLimit, autoCompleteLimit = _b === void 0 ? 1000 : _b;
|
|
51
51
|
var fieldMetadata = fieldContext.fieldMetadata;
|
|
52
52
|
var fieldLayoutInfo = fieldContext.field;
|
|
53
53
|
var entityApi = createSolidEntityApi(fieldMetadata.relationCoModelSingularName);
|
|
54
54
|
var useLazyGetSolidEntitiesQuery = entityApi.useLazyGetSolidEntitiesQuery;
|
|
55
55
|
var triggerGetSolidEntities = useLazyGetSolidEntitiesQuery()[0];
|
|
56
|
-
var
|
|
57
|
-
var
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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")
|
|
79
87
|
return [2 /*return*/];
|
|
80
|
-
|
|
81
|
-
|
|
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
|
+
}
|
|
82
96
|
});
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
|
|
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;
|
|
86
105
|
var _a;
|
|
87
106
|
var _b, _c, _d, _e;
|
|
88
107
|
return __generator(this, function (_f) {
|
|
@@ -94,25 +113,15 @@ export var useRelationEntityHandler = function (_a) {
|
|
|
94
113
|
offset: 0,
|
|
95
114
|
limit: autoCompleteLimit,
|
|
96
115
|
filters: {
|
|
97
|
-
$and: [
|
|
98
|
-
(_a = {},
|
|
99
|
-
_a[relationFieldName] = {
|
|
100
|
-
id: { $eq: parentId },
|
|
101
|
-
},
|
|
102
|
-
_a),
|
|
103
|
-
],
|
|
116
|
+
$and: [(_a = {}, _a[relationFieldName] = { id: { $eq: parentId } }, _a)],
|
|
104
117
|
},
|
|
105
118
|
};
|
|
106
|
-
|
|
107
|
-
encodeValuesOnly: true,
|
|
108
|
-
});
|
|
109
|
-
return [4 /*yield*/, triggerGetSolidEntities(qsString)];
|
|
119
|
+
return [4 /*yield*/, triggerGetSolidEntities(qs.stringify(queryData, { encodeValuesOnly: true }))];
|
|
110
120
|
case 1:
|
|
111
121
|
response = _f.sent();
|
|
112
|
-
|
|
113
|
-
if (!data)
|
|
122
|
+
if (!response.data)
|
|
114
123
|
return [2 /*return*/];
|
|
115
|
-
|
|
124
|
+
mapped = response.data.records.map(function (item) {
|
|
116
125
|
var _a, _b;
|
|
117
126
|
return ({
|
|
118
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],
|
|
@@ -120,37 +129,164 @@ export var useRelationEntityHandler = function (_a) {
|
|
|
120
129
|
original: item,
|
|
121
130
|
});
|
|
122
131
|
});
|
|
123
|
-
|
|
124
|
-
* IMPORTANT:
|
|
125
|
-
* 1. Set checkbox options
|
|
126
|
-
* 2. Set formik selected values (checked state)
|
|
127
|
-
*/
|
|
128
|
-
formik.setFieldValue(fieldLayoutInfo.attrs.name, mappedItems);
|
|
132
|
+
setCurrentValues(mapped);
|
|
129
133
|
return [2 /*return*/];
|
|
130
134
|
}
|
|
131
135
|
});
|
|
132
136
|
}); };
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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) {
|
|
193
|
+
if (autocompleteQs === void 0) { autocompleteQs = ""; }
|
|
194
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
195
|
+
var response, mapped;
|
|
196
|
+
return __generator(this, function (_a) {
|
|
197
|
+
switch (_a.label) {
|
|
198
|
+
case 0: return [4 /*yield*/, triggerGetSolidEntities(autocompleteQs)];
|
|
199
|
+
case 1:
|
|
200
|
+
response = _a.sent();
|
|
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,
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
setSuggestions(mapped);
|
|
212
|
+
return [2 /*return*/];
|
|
213
|
+
}
|
|
214
|
+
});
|
|
147
215
|
});
|
|
148
216
|
};
|
|
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
|
+
});
|
|
245
|
+
});
|
|
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
|
+
}); };
|
|
149
275
|
return {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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,
|
|
154
290
|
};
|
|
155
291
|
};
|
|
156
292
|
//# sourceMappingURL=useRelationEntityHandler.js.map
|
package/dist/components/core/form/fields/relations/widgets/helpers/useRelationEntityHandler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 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 populateFormikWithRelatedEntities = async () => {\n\n /**\n * Example:\n * permissions filtered by roles.id = current role id\n */\n\n const relationFieldName =\n fieldContext.fieldMetadata?.relationCoModelFieldName ??\n fieldContext.modelName;\n\n const parentId = fieldContext.data?.id ?? -1;\n\n const queryData = {\n offset: 0,\n limit: autoCompleteLimit,\n filters: {\n $and: [\n {\n [relationFieldName]: {\n id: { $eq: parentId },\n },\n },\n ],\n },\n };\n\n const qsString = qs.stringify(queryData, {\n encodeValuesOnly: true,\n });\n\n const response = await triggerGetSolidEntities(qsString);\n const data = response.data;\n\n if (!data) return;\n\n const mappedItems = data.records.map((item: any) => ({\n label: item[fieldMetadata?.relationModel?.userKeyField?.name],\n value: item.id,\n original: item,\n }));\n\n /**\n * IMPORTANT:\n * 1. Set checkbox options\n * 2. Set formik selected values (checked state)\n */\n formik.setFieldValue(fieldLayoutInfo.attrs.name, mappedItems);\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 populateFormikWithRelatedEntities,\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAQrF,MAAM,CAAC,IAAM,wBAAwB,GAAG,UAAC,EAA+C;QAA7C,YAAY,kBAAA,EAAE,yBAAwB,EAAxB,iBAAiB,mBAAG,IAAI,KAAA;IAC/E,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;IAEjE,IAAM,eAAe,GAAG,oBAAoB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAA,iCAAiC,GAAmC,eAAe,kCAAlD,EAAE,4BAA4B,GAAK,eAAe,6BAApB,CAAqB;IACrF,IAAA,iBAAiB,GAAI,iCAAiC,EAAE,GAAvC,CAAwC;IAEhE;;;;OAIG;IACG,IAAA,KAAoC,QAAQ,CAAiB,EAAE,CAAC,EAA/D,aAAa,QAAA,EAAE,gBAAgB,QAAgC,CAAC;IAEvE;;;;OAIG;IACG,IAAA,KAA8B,QAAQ,CAAiB,EAAE,CAAC,EAAzD,UAAU,QAAA,EAAE,aAAa,QAAgC,CAAC;IAEjE;;;;OAIG;IACG,IAAA,KAAgC,QAAQ,CAAiB,EAAE,CAAC,EAA3D,WAAW,QAAA,EAAE,cAAc,QAAgC,CAAC;IAEnE,gFAAgF;IAEhF,IAAM,eAAe,GAAG,UAAO,IAAkB,EAAE,OAA0B;;;;;;oBACrE,QAAQ,GAAG,MAAA,YAAY,CAAC,IAAI,0CAAE,EAAE,CAAC;oBACjC,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;oBAE7C,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,KAAK;wBAAE,sBAAO;oBAEtC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;oBAChC,QAAQ,CAAC,MAAM,CAAC,UAAG,SAAS,WAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBAClD,QAAQ,CAAC,MAAM,CAAC,UAAG,SAAS,YAAS,EAAE,OAAO,CAAC,CAAC;oBAEhD,qBAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAA;;oBAAlE,SAAkE,CAAC;;;;SACpE,CAAC;IAEF,gFAAgF;IAEhF;;;OAGG;IACH,IAAM,kBAAkB,GAAG;;;;;;;oBACnB,iBAAiB,GACrB,MAAA,MAAA,YAAY,CAAC,aAAa,0CAAE,wBAAwB,mCAAI,YAAY,CAAC,SAAS,CAAC;oBAE3E,QAAQ,GAAG,MAAA,MAAA,YAAY,CAAC,IAAI,0CAAE,EAAE,mCAAI,CAAC,CAAC,CAAC;oBAEvC,SAAS,GAAG;wBAChB,MAAM,EAAE,CAAC;wBACT,KAAK,EAAE,iBAAiB;wBACxB,OAAO,EAAE;4BACP,IAAI,EAAE,WAAG,GAAC,iBAAiB,IAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,MAAG;yBAC3D;qBACF,CAAC;oBAEe,qBAAM,uBAAuB,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAA;;oBAA7F,QAAQ,GAAG,SAAkF;oBACnG,IAAI,CAAC,QAAQ,CAAC,IAAI;wBAAE,sBAAO;oBAErB,MAAM,GAAmB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAC,IAAS;;wBAAK,OAAA,CAAC;4BACvE,KAAK,EAAE,IAAI,CAAC,MAAA,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,aAAa,0CAAE,YAAY,0CAAE,IAAI,CAAC;4BAC7D,KAAK,EAAE,IAAI,CAAC,EAAE;4BACd,QAAQ,EAAE,IAAI;yBACf,CAAC,CAAA;qBAAA,CAAC,CAAC;oBAEJ,gBAAgB,CAAC,MAAM,CAAC,CAAC;;;;SAC1B,CAAC;IAEF;;;OAGG;IACH,IAAM,QAAQ,GAAG,UAAO,IAAkB;;;;;;;oBAEtC,qBAAM,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,EAAA;;oBAAnC,SAAmC,CAAC;oBACpC,gBAAgB,CAAC,UAAC,IAAI;wBACpB,OAAA,IAAI,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAtB,CAAsB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,iCAAK,IAAI,UAAE,IAAI,SAAC;oBAAjE,CAAiE,CAClE,CAAC;;;;oBAEF,OAAO,CAAC,KAAK,CAAC,CAAA,MAAA,OAAK,aAAL,OAAK,uBAAL,OAAK,CAAE,IAAI,0CAAE,OAAO,MAAI,OAAK,aAAL,OAAK,uBAAL,OAAK,CAAE,OAAO,CAAA,IAAI,yBAAkB,aAAa,CAAC,WAAW,CAAE,CAAC,CAAC;;;;;SAE1G,CAAC;IAEF;;;OAGG;IACH,IAAM,UAAU,GAAG,UAAO,IAAkB;;;;;;;oBAExC,qBAAM,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAA;;oBAArC,SAAqC,CAAC;oBACtC,gBAAgB,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAtB,CAAsB,CAAC,EAA1C,CAA0C,CAAC,CAAC;;;;oBAEvE,OAAO,CAAC,KAAK,CAAC,CAAA,MAAA,OAAK,aAAL,OAAK,uBAAL,OAAK,CAAE,IAAI,0CAAE,OAAO,MAAI,OAAK,aAAL,OAAK,uBAAL,OAAK,CAAE,OAAO,CAAA,IAAI,2BAAoB,aAAa,CAAC,WAAW,CAAE,CAAC,CAAC;;;;;SAE5G,CAAC;IAEF,gFAAgF;IAEhF;;;OAGG;IACH,IAAM,gBAAgB,GAAG,UAAO,cAAmB;QAAnB,+BAAA,EAAA,mBAAmB;;;;;4BAChC,qBAAM,uBAAuB,CAAC,cAAc,CAAC,EAAA;;wBAAxD,QAAQ,GAAG,SAA6C;wBAC9D,IAAI,CAAC,QAAQ,CAAC,IAAI;4BAAE,sBAAO;wBAErB,MAAM,GAAmB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAC,IAAS;;4BAAK,OAAA,CAAC;gCACvE,KAAK,EAAE,IAAI,CAAC,MAAA,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,aAAa,0CAAE,YAAY,0CAAE,IAAI,CAAC;gCAC7D,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;gCACjB,QAAQ,EAAE,IAAI;6BACf,CAAC,CAAA;yBAAA,CAAC,CAAC;wBAEJ,cAAc,CAAC,MAAM,CAAC,CAAC;;;;;KACxB,CAAC;IAEF,gFAAgF;IAEhF;;;OAGG;IACH,IAAM,eAAe,GAAG,UAAO,cAAmB;QAAnB,+BAAA,EAAA,mBAAmB;;;;;4BAC/B,qBAAM,uBAAuB,CAAC,cAAc,CAAC,EAAA;;wBAAxD,QAAQ,GAAG,SAA6C;wBAC9D,IAAI,CAAC,QAAQ,CAAC,IAAI;4BAAE,sBAAO;wBAErB,MAAM,GAAmB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAC,IAAS;;4BAAK,OAAA,CAAC;gCACvE,KAAK,EAAE,IAAI,CAAC,MAAA,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,aAAa,0CAAE,YAAY,0CAAE,IAAI,CAAC;gCAC7D,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;gCACjB,QAAQ,EAAE,IAAI;6BACf,CAAC,CAAA;yBAAA,CAAC,CAAC;wBAEJ,aAAa,CAAC,MAAM,CAAC,CAAC;;;;;KACvB,CAAC;IAEF,gFAAgF;IAEhF;;;OAGG;IACH,IAAM,cAAc,GAAG,UAAO,MAAW;;;;;;oBACjC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;oBAClD,OAAO,GAAiB;wBAC5B,KAAK,EAAE,UAAU,CAAC,MAAA,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,aAAa,0CAAE,YAAY,0CAAE,IAAI,CAAC;wBACnE,KAAK,EAAE,KAAK;wBACZ,QAAQ,EAAE,UAAU;qBACrB,CAAC;oBAEF,qBAAM,QAAQ,CAAC,OAAO,CAAC,EAAA;;oBAAvB,SAAuB,CAAC;oBAExB,+DAA+D;oBAC/D,aAAa,CAAC,UAAC,IAAI;wBACjB,OAAA,IAAI,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,EAAzB,CAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,iCAAK,IAAI,UAAE,OAAO,SAAC;oBAAvE,CAAuE,CACxE,CAAC;;;;SACH,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,aAAa,eAAA;QACb,UAAU,YAAA;QACV,WAAW,aAAA;QACX,SAAS;QACT,kBAAkB,oBAAA;QAClB,QAAQ,UAAA;QACR,UAAU,YAAA;QACV,wBAAwB;QACxB,gBAAgB,kBAAA;QAChB,oBAAoB;QACpB,eAAe,iBAAA;QACf,gBAAgB;QAChB,cAAc,gBAAA;KACf,CAAC;AACJ,CAAC,CAAC","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};"]}
|