@solidstarters/solid-core-ui 1.1.60 → 1.1.62

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 (83) hide show
  1. package/dist/components/Svg/ExcelSvg.d.ts +6 -0
  2. package/dist/components/Svg/ExcelSvg.d.ts.map +1 -0
  3. package/dist/components/Svg/ExcelSvg.js +6 -0
  4. package/dist/components/Svg/ExcelSvg.js.map +1 -0
  5. package/dist/components/Svg/PDFSvg.d.ts +5 -1
  6. package/dist/components/Svg/PDFSvg.d.ts.map +1 -1
  7. package/dist/components/Svg/PDFSvg.js +3 -2
  8. package/dist/components/Svg/PDFSvg.js.map +1 -1
  9. package/dist/components/auth/GoogleAuthChecking.js +1 -1
  10. package/dist/components/auth/GoogleAuthChecking.js.map +1 -1
  11. package/dist/components/auth/SolidInitialLoginOtp.d.ts.map +1 -1
  12. package/dist/components/auth/SolidInitialLoginOtp.js +31 -18
  13. package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
  14. package/dist/components/auth/SolidOTPVerify.js +1 -1
  15. package/dist/components/auth/SolidOTPVerify.js.map +1 -1
  16. package/dist/components/common/CancelButton.d.ts.map +1 -1
  17. package/dist/components/common/CancelButton.js +8 -4
  18. package/dist/components/common/CancelButton.js.map +1 -1
  19. package/dist/components/common/SolidBreadcrumb.d.ts.map +1 -1
  20. package/dist/components/common/SolidBreadcrumb.js +32 -15
  21. package/dist/components/common/SolidBreadcrumb.js.map +1 -1
  22. package/dist/components/core/common/SolidGlobalSearchElement.d.ts +1 -0
  23. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  24. package/dist/components/core/common/SolidGlobalSearchElement.js +292 -56
  25. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  26. package/dist/components/core/common/SolidSaveCustomFilterForm.d.ts +9 -0
  27. package/dist/components/core/common/SolidSaveCustomFilterForm.d.ts.map +1 -0
  28. package/dist/components/core/common/SolidSaveCustomFilterForm.js +37 -0
  29. package/dist/components/core/common/SolidSaveCustomFilterForm.js.map +1 -0
  30. package/dist/components/core/filter/fields/SolidBooleanField.js +1 -1
  31. package/dist/components/core/filter/fields/SolidBooleanField.js.map +1 -1
  32. package/dist/components/core/kanban/KanbanBoard.d.ts.map +1 -1
  33. package/dist/components/core/kanban/KanbanBoard.js +1 -1
  34. package/dist/components/core/kanban/KanbanBoard.js.map +1 -1
  35. package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
  36. package/dist/components/core/kanban/KanbanCard.js +4 -1
  37. package/dist/components/core/kanban/KanbanCard.js.map +1 -1
  38. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  39. package/dist/components/core/kanban/SolidKanbanView.js +172 -110
  40. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  41. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.d.ts.map +1 -1
  42. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js +6 -2
  43. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js.map +1 -1
  44. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.d.ts.map +1 -1
  45. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js +3 -2
  46. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js.map +1 -1
  47. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  48. package/dist/components/core/list/SolidListView.js +3 -0
  49. package/dist/components/core/list/SolidListView.js.map +1 -1
  50. package/dist/components/core/model/CreateModel.js +3 -3
  51. package/dist/components/core/model/CreateModel.js.map +1 -1
  52. package/dist/components/core/model/FieldMetaDataForm.d.ts.map +1 -1
  53. package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
  54. package/dist/components/core/model/ModelMetaData.d.ts.map +1 -1
  55. package/dist/components/core/model/ModelMetaData.js +68 -15
  56. package/dist/components/core/model/ModelMetaData.js.map +1 -1
  57. package/dist/index.d.ts +1 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +1 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/resources/globals.css +22 -7
  62. package/package.json +1 -1
  63. package/src/components/Svg/ExcelSvg.tsx +15 -0
  64. package/src/components/Svg/PDFSvg.tsx +6 -3
  65. package/src/components/auth/GoogleAuthChecking.tsx +1 -1
  66. package/src/components/auth/SolidInitialLoginOtp.tsx +13 -2
  67. package/src/components/auth/SolidOTPVerify.tsx +1 -1
  68. package/src/components/common/CancelButton.tsx +12 -6
  69. package/src/components/common/SolidBreadcrumb.tsx +79 -60
  70. package/src/components/core/common/SolidGlobalSearchElement.tsx +425 -123
  71. package/src/components/core/common/SolidSaveCustomFilterForm.tsx +74 -0
  72. package/src/components/core/filter/fields/SolidBooleanField.tsx +1 -1
  73. package/src/components/core/kanban/KanbanBoard.tsx +3 -2
  74. package/src/components/core/kanban/KanbanCard.tsx +6 -3
  75. package/src/components/core/kanban/SolidKanbanView.tsx +219 -174
  76. package/src/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.tsx +14 -4
  77. package/src/components/core/kanban/kanban-fields/SolidShortTextKanbanField.tsx +4 -8
  78. package/src/components/core/list/SolidListView.tsx +4 -1
  79. package/src/components/core/model/CreateModel.tsx +2 -2
  80. package/src/components/core/model/FieldMetaDataForm.tsx +0 -2
  81. package/src/components/core/model/ModelMetaData.tsx +204 -121
  82. package/src/index.ts +1 -0
  83. package/src/resources/globals.css +22 -7
@@ -0,0 +1,74 @@
1
+ import { Button } from "primereact/button";
2
+ import { Checkbox } from "primereact/checkbox";
3
+ import { useState } from "react";
4
+
5
+ interface SolidSaveCustomFilterFormProps {
6
+ currentSavedFilterData: any,
7
+ handleSaveFilter: ({ }) => void;
8
+ closeDialog: any
9
+ }
10
+
11
+ export const SolidSaveCustomFilterForm: React.FC<SolidSaveCustomFilterFormProps> = ({ currentSavedFilterData, handleSaveFilter, closeDialog }) => {
12
+ const [formValues, setFormValues] = useState({ name: currentSavedFilterData ? currentSavedFilterData.name : "", isPrivate: currentSavedFilterData ? currentSavedFilterData.isPrivate : false });
13
+
14
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
15
+ const { name, value, type, checked } = e.target;
16
+ setFormValues((prev) => ({
17
+ ...prev,
18
+ [name]: type === "checkbox" ? checked : value,
19
+ }));
20
+ };
21
+
22
+ const handleSubmit = (e: React.FormEvent) => {
23
+ e.preventDefault();
24
+ const formData = {
25
+ id: currentSavedFilterData ? currentSavedFilterData.id : null,
26
+ name: formValues.name,
27
+ isPrivate: formValues.isPrivate === true ? true : "",
28
+ }
29
+ handleSaveFilter(formData);
30
+ };
31
+
32
+ return (
33
+ <form onSubmit={handleSubmit}>
34
+ <div className="flex flex-column gap-2">
35
+ <label htmlFor="name">Name:</label>
36
+ <input
37
+ type="text"
38
+ id="name"
39
+ name="name"
40
+ placeholder="Filter Title"
41
+ className="p-inputtext p-inputtext-sm p-component"
42
+ value={formValues.name}
43
+ onChange={handleChange}
44
+ readOnly={currentSavedFilterData}
45
+ />
46
+ </div>
47
+ <div className="mt-3 flex align-items-center ">
48
+ <Checkbox
49
+ inputId="isPrivate"
50
+ name="isPrivate"
51
+ checked={formValues.isPrivate}
52
+ onChange={(e: any) => handleChange(e)}
53
+ >
54
+ </Checkbox>
55
+ <label htmlFor="isPrivate" className="ml-2">Is Private</label>
56
+ </div>
57
+ <div className="mt-3 flex align-items-center gap-2">
58
+ <Button
59
+ type="submit"
60
+ label="Save"
61
+ size="small"
62
+ />
63
+ <Button
64
+ type="button"
65
+ label="Cancel"
66
+ size="small"
67
+ outlined
68
+ onClick={() => closeDialog()}
69
+ />
70
+ </div>
71
+ </form>
72
+ );
73
+ };
74
+
@@ -12,7 +12,7 @@ const SolidBooleanField = ({ fieldMetadata, onChange, index, rule }: SolidFilter
12
12
  { label: 'false', value: false },
13
13
  ];
14
14
  const filterMatchModeOptions = [
15
- { label: 'Equals', value: "$eqi" },
15
+ { label: 'Equals', value: "$eq" },
16
16
  ];
17
17
 
18
18
 
@@ -118,8 +118,9 @@ export const KanbanBoard = ({ groupedView, kanbanViewData, solidKanbanViewMetaDa
118
118
  );
119
119
  })}
120
120
  {groupedView !== false &&
121
- <div className="kanban-load-more-folded">
122
- <Button className="kaban-load-more" size="small" text onClick={handleSwimLanePagination}>load More</Button></div>
121
+ <div>
122
+ <Button size="small" style={{ textWrap: 'nowrap' }} text onClick={handleSwimLanePagination}>Load More...</Button>
123
+ </div>
123
124
  }
124
125
  </div>
125
126
  </DragDropContext>
@@ -180,13 +180,16 @@ const KanbanCard: React.FC<KanbanCardProps> = ({ data, solidKanbanViewMetaData,
180
180
  style={{
181
181
  opacity: snapshot.isDragging ? 0.9 : 1,
182
182
  transform: snapshot.isDragging ? "rotate(-2deg)" : "",
183
- cursor:'pointer'
183
+ cursor: 'pointer'
184
184
  }}
185
185
  elevation={snapshot.isDragging ? 3 : 1}
186
186
  className={`${!groupedView ? 'solid-media-card' : 'solid-kanban-card'}`}
187
- onClick={() =>
187
+ onClick={() => {
188
+ if (typeof window !== "undefined") {
189
+ sessionStorage.setItem("fromView", "kanban");
190
+ }
188
191
  router.push(`${editButtonUrl}/${data?.id}`)
189
- }
192
+ }}
190
193
  >
191
194
  {renderFormDynamically(solidKanbanViewMetaData)}
192
195
 
@@ -29,6 +29,13 @@ import "yet-another-react-lightbox/plugins/counter.css";
29
29
  import { useRouter, useSearchParams } from "next/navigation";
30
30
  import { SolidKanbanViewConfigure } from "./SolidKanbanViewConfigure";
31
31
  import { KanbanUserViewLayout } from "./KanbanUserViewLayout";
32
+ import { useSelector } from "react-redux";
33
+ import { queryObjectToQueryString, queryStringToQueryObject } from "../list/SolidListView";
34
+
35
+
36
+ import { Toast } from "primereact/toast";
37
+ import { useSelector } from "react-redux";
38
+ import { queryObjectToQueryString, queryStringToQueryObject } from "../list/SolidListView";
32
39
 
33
40
 
34
41
 
@@ -40,6 +47,8 @@ type SolidKanbanViewParams = {
40
47
 
41
48
 
42
49
  export const SolidKanbanView = (params: SolidKanbanViewParams) => {
50
+ const { user } = useSelector((state: any) => state.auth);
51
+
43
52
  const solidGlobalSearchElementRef = useRef();
44
53
  const searchParams = useSearchParams().toString(); // Converts the query params to a string
45
54
  const router = useRouter();
@@ -64,8 +73,7 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
64
73
  const [lightboxUrls, setLightboxUrls] = useState({});
65
74
  const [filterQueryString, setFilterQueryString] = useState<any>();
66
75
  const [isLayoutDialogVisible, setLayoutDialogVisible] = useState(false);
67
-
68
-
76
+ const toast = useRef<Toast>(null);
69
77
 
70
78
  const pushFiltersToRouter = (filterQueryString: any) => {
71
79
  router.push(`?${filterQueryString}`, undefined, { shallow: true });
@@ -115,7 +123,8 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
115
123
  useLazyGetSolidKanbanEntitiesQuery,
116
124
  useLazyGetSolidEntityByIdQuery,
117
125
  usePrefetch,
118
- useUpdateSolidEntityMutation
126
+ useUpdateSolidEntityMutation,
127
+ usePatchUpdateSolidEntityMutation
119
128
  } = entityApi;
120
129
 
121
130
  // Get the kanban view layout & metadata first.
@@ -188,10 +197,13 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
188
197
  }
189
198
  }
190
199
  // setFilters(initialFilters);
191
- const rows = solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.recordsInSwimlane ? solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.recordsInSwimlane : 25;
200
+ const recordsInSwimlane = solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.recordsInSwimlane ? solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.recordsInSwimlane : 25;
192
201
  // setToPopulate(toPopulate);
193
202
  // setToPopulateMedia(toPopulateMedia);
194
- return { rows, toPopulate, toPopulateMedia }
203
+ setRecordsInSwimlane(recordsInSwimlane);
204
+ setToPopulate(toPopulate);
205
+ setToPopulateMedia(toPopulateMedia);
206
+ return { recordsInSwimlane, toPopulate, toPopulateMedia }
195
207
  }
196
208
 
197
209
 
@@ -200,10 +212,7 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
200
212
 
201
213
  if (solidKanbanViewMetaData) {
202
214
  setKanbanViewMetaData(solidKanbanViewMetaData);
203
- const { rows, toPopulate, toPopulateMedia } = initialFilterMethod()
204
- setRows(rows);
205
- setToPopulate(toPopulate);
206
- setToPopulateMedia(toPopulateMedia);
215
+ // initialFilterMethod();
207
216
  const viewModes = solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.allowedViews && solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.allowedViews.length > 0 && solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.allowedViews.map((view: any) => { return { label: capitalize(view), value: view } });
208
217
  setViewModes(viewModes);
209
218
  if (solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.grouped !== false) {
@@ -218,7 +227,7 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
218
227
  // All kanban view state.
219
228
  const [kanbanViewData, setKanbanViewData] = useState<any>([]);
220
229
  const [kanbanLoadMoreData, setKanbanLoadMoreData] = useState<any>({});
221
- const [rows, setRows] = useState(25);
230
+ const [recordsInSwimlane, setRecordsInSwimlane] = useState(25);
222
231
  const [selectedRecords, setSelectedRecords] = useState<any[]>([]);
223
232
  const [loading, setLoading] = useState<boolean>(true);
224
233
  const [isDialogVisible, setDialogVisible] = useState(false);
@@ -226,7 +235,18 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
226
235
  const [editButtonUrl, setEditButtonUrl] = useState<string>();
227
236
  const [columnsCount, setColumnsCount] = useState(5);
228
237
  const [swimLaneCurrentPageNumber, setSwimLaneCurrentPageNumber] = useState(1);
238
+ const [queryDataLoaded, setQueryDataLoaded] = useState(false);
239
+
229
240
 
241
+
242
+ const showToast = (severity: "success" | "error", summary: string, detail: string) => {
243
+ toast.current?.show({
244
+ severity,
245
+ summary,
246
+ detail,
247
+ life: 3000,
248
+ });
249
+ };
230
250
  // Get the kanban view data.
231
251
  // const [triggerGetSolidEntitiesForKanban, { data: solidEntityKanbanViewData, isLoading, error }] = useLazyGetSolidKanbanEntitiesQuery();
232
252
  const [triggerGetSolidEntities, { data: solidEntityKanbanViewData, isLoading, error }] = useLazyGetSolidEntitiesQuery();
@@ -242,7 +262,10 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
242
262
  data: DeletedSolidEntities,
243
263
  },
244
264
  ] = useDeleteMultipleSolidEntitiesMutation();
245
-
265
+ const [
266
+ patchKanbanView,
267
+ { isSuccess: isKanbanUpdateSuccessfull, isError: isKanbanUpdateError, error: kanbanUpdateError },
268
+ ] = usePatchUpdateSolidEntityMutation();
246
269
 
247
270
  // After data is fetched populate the kanban view state so as to be able to render the data.
248
271
  useEffect(() => {
@@ -266,109 +289,112 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
266
289
 
267
290
 
268
291
 
269
-
270
- // Fetch data after toPopulate has been populated...
271
292
  useEffect(() => {
272
-
273
293
  if (solidKanbanViewMetaData) {
274
294
  const createActionUrl = solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.createAction && solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.createAction?.type === "custom" ? solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.createAction?.customComponent : "form/new";
275
295
  const editActionUrl = solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.editAction && solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.editAction?.type === "custom" ? solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.editAction?.customComponent : "form";
276
- if (solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.swimlanesCount) {
277
- setColumnsCount(solidKanbanViewMetaData?.data.solidView?.layout?.attrs?.swimlanesCount)
278
- }
279
296
  if (createActionUrl) {
280
297
  setCreateButtonUrl(createActionUrl)
281
298
  }
282
299
  if (editActionUrl) {
283
300
  setEditButtonUrl(editActionUrl)
284
301
  }
285
-
286
-
287
- const columnsToLoadCount = solidKanbanViewMetaData?.data.solidView?.layout?.attrs?.swimlanesCount || 5;
288
- if (groupByFieldName && (toPopulate || toPopulateMedia)) {
289
-
290
- const queryData = {
291
- offset: 0,
292
- limit: columnsToLoadCount,
293
- fields: [`${groupByFieldName}`, `count(${groupByFieldName})`],
294
- groupBy: groupByFieldName,
295
- populateMedia: toPopulateMedia,
296
- populateGroup: true,
297
- groupFilter: {
298
- limit: kanbanViewMetaData?.data?.solidView?.layout?.attrs?.recordsInSwimlane || 10,
299
- offset: 0,
300
- filters: filters,
301
- populate: toPopulate,
302
- populateMedia: toPopulateMedia
303
- }
304
- // sort: [`id:desc`],
305
- };
306
- // fields=status&groupBy=status&fields=count(status)&populateGroup=true
307
- let queryString = qs.stringify(queryData, {
308
- encodeValuesOnly: true
309
- });
310
- if (searchParams) {
311
- queryString = searchParams;
312
- setFilterQueryString(searchParams)
313
- } else {
314
- setFilterQueryString(queryString)
315
- }
316
- triggerGetSolidEntities(queryString);
317
- setSelectedRecords([]);
318
- }
319
302
  }
320
- }, [isDeleteSolidEntitiesSucess, toPopulate, groupByFieldName, solidKanbanViewMetaData]);
321
-
322
-
303
+ }, [solidKanbanViewMetaData])
323
304
 
305
+ // Fetch data after toPopulate has been populated...
306
+ useEffect(() => {
324
307
 
325
- // clear Filter
308
+ if (solidKanbanViewMetaData) {
326
309
 
327
- // const clearFilter = async () => {
328
- // if (solidKanbanViewMetaData) {
329
- // // initialFilterMethod()
330
- // }
331
- // setFilters(null);
332
- // if (solidKanbanViewMetaData) {
333
- //
334
- // const columnsToLoadCount = solidKanbanViewMetaData?.data.solidView?.layout?.attrs?.swimlanesCount || 5;
310
+ const swimlanesCount = solidKanbanViewMetaData?.data.solidView?.layout?.attrs?.swimlanesCount || 5;
311
+ if (groupByFieldName && (toPopulate || toPopulateMedia)) {
335
312
 
336
- // if (toPopulate || toPopulateMedia) {
313
+ const queryObject = queryStringToQueryObject();
314
+ let queryString = "";
315
+ if (searchParams) {
337
316
 
338
- // const queryData = {
339
- // offset: 0,
340
- // limit: columnsToLoadCount,
341
- // fields: [`${groupByFieldName}`, `count(${groupByFieldName})`],
342
- // groupBy: groupByFieldName,
343
- // populate: toPopulate,
344
- // populateMedia: toPopulateMedia,
345
- // populateGroup: true,
346
- // groupFilter: {
347
- // limit: rows,
348
- // offset: 0,
317
+ // Get Object from Url
318
+ const queryObject = qs.parse(searchParams,
319
+ {
320
+ decoder: str => decodeURIComponent(str),
321
+ allowDots: true,
322
+ }
323
+ );
349
324
 
350
- // }
351
- // // sort: [`id:desc`],
352
- // };
353
- // // fields=status&groupBy=status&fields=count(status)&populateGroup=true
354
- // const queryString = qs.stringify(queryData, {
355
- // encodeValuesOnly: true
356
- // });
325
+ const filters = {
326
+ $and: []
327
+ }
328
+ if (queryObject.s_filter) {
329
+ filters.$and.push(queryObject.s_filter);
330
+ }
331
+ if (queryObject.c_filter) {
332
+ filters.$and.push(queryObject.c_filter);
333
+ }
357
334
 
358
- // const data: any = await triggerGetSolidEntities(queryString);
359
- // if (data && data?.data?.groupRecords.length > 0) {
360
- // const updatedData = [...data.data.groupRecords];
361
- // setKanbanViewData(updatedData);
362
- // }
363
- // setSelectedRecords([]);
364
- // }
365
- // }
335
+ const queryData = {
336
+ offset: 0,
337
+ limit: Number(queryObject.limit) + Number(queryObject.offset),
338
+ fields: queryObject.fields || [`${groupByFieldName}`, `count(${groupByFieldName})`],
339
+ groupBy: queryObject.groupBy || groupByFieldName,
340
+ populateMedia: queryObject.populateMedia || toPopulateMedia,
341
+ populateGroup: queryObject.populateGroup || true,
342
+ groupFilter: {
343
+ limit: Number(queryObject.groupFilter.limit) + Number(queryObject.groupFilter.offset) || kanbanViewMetaData?.data?.solidView?.layout?.attrs?.recordsInSwimlane,
344
+ offset: 0,
345
+ filters: filters,
346
+ populate: queryObject.groupFilter.populate || toPopulate,
347
+ populateMedia: queryObject.groupFilter.populateMedia || toPopulateMedia
348
+ }
349
+ // sort: [`id:desc`],
350
+ };
351
+
352
+ setRecordsInSwimlane(queryData.limit);
353
+ setToPopulate(queryData.populate);
354
+ setToPopulateMedia(queryData.populateMedia);
355
+ setFilters(filters);
356
+ setQueryDataLoaded(true);
357
+
358
+ queryString = qs.stringify(queryData, {
359
+ encodeValuesOnly: true
360
+ });
366
361
 
367
- // // @ts-ignore
368
- // solidGlobalSearchElementRef.current.clearFilter()
369
- // };
370
362
 
363
+ } else {
364
+ const { recordsInSwimlane, toPopulate, toPopulateMedia } = initialFilterMethod();
365
+ const queryData = {
366
+ offset: 0,
367
+ limit: swimlanesCount,
368
+ fields: [`${groupByFieldName}`, `count(${groupByFieldName})`],
369
+ groupBy: groupByFieldName,
370
+ populateMedia: toPopulateMedia,
371
+ populateGroup: true,
372
+ groupFilter: {
373
+ limit: kanbanViewMetaData?.data?.solidView?.layout?.attrs?.recordsInSwimlane || 10,
374
+ offset: 0,
375
+ filters: filters,
376
+ populate: toPopulate,
377
+ populateMedia: toPopulateMedia
378
+ }
379
+ // sort: [`id:desc`],
380
+ };
381
+ setRecordsInSwimlane(recordsInSwimlane);
382
+ setToPopulate(toPopulate);
383
+ setToPopulateMedia(toPopulateMedia);
384
+
385
+ // fields=status&groupBy=status&fields=count(status)&populateGroup=true
386
+ queryString = qs.stringify(queryData, {
387
+ encodeValuesOnly: true
388
+ });
389
+
390
+ setQueryDataLoaded(true)
391
+ }
371
392
 
393
+ triggerGetSolidEntities(queryString);
394
+ setSelectedRecords([]);
395
+ }
396
+ }
397
+ }, [isDeleteSolidEntitiesSucess, groupByFieldName, solidKanbanViewMetaData]);
372
398
 
373
399
 
374
400
  // clickable link allowing one to open the detail / form view.
@@ -401,18 +427,7 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
401
427
  const { offset, limit, records } = kanbanLoadMoreData[groupByField];
402
428
  const newLoadMoreData = kanbanLoadMoreData;
403
429
  kanbanLoadMoreData[groupByField].offset = offset + limit;
404
-
405
430
  try {
406
- // const queryData = {
407
- // offset: 0,
408
- // limit: 1,
409
- // fields: [`${groupByFieldName}`, `count(${groupByFieldName})`],
410
- // groupBy: groupByFieldName,
411
- // populate: toPopulate,
412
- // populateGroup: true,
413
- // sort: [`id:desc`],
414
- // };
415
-
416
431
  const queryData = {
417
432
  offset: offset + limit,
418
433
  limit: limit,
@@ -431,7 +446,7 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
431
446
  const queryString = qs.stringify(queryData, {
432
447
  encodeValuesOnly: true
433
448
  });
434
- setFilterQueryString(queryString);
449
+ // router.push(`?${queryString}`);
435
450
  const data: any = await triggerGetSolidEntities(queryString);
436
451
  const newRecords = data.data.records;
437
452
  const currentData = kanbanViewData;
@@ -461,8 +476,6 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
461
476
  groupData.meta.nextPage = groupData.meta.currentPage + 1
462
477
  }
463
478
  }
464
-
465
-
466
479
  return originalData;
467
480
  };
468
481
 
@@ -544,34 +557,51 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
544
557
  destinationGroup.groupData.records = destinationRecords;
545
558
 
546
559
  // Update the kanbanViewData state
547
- setKanbanViewData((prevData: typeof kanbanViewData) =>
548
- prevData.map((group: any) => {
549
- if (group.groupName === sourceGroupName) {
550
- return sourceGroup;
551
- }
552
- if (group.groupName === destinationGroupName) {
553
- return destinationGroup;
554
- }
555
- return group;
556
- })
557
- );
560
+ try {
561
+ const formData = new FormData();
562
+ formData.append(groupByFieldName, destinationGroupName);
563
+ const kanbanUpdateResponse = await patchKanbanView({ id: +movedItem.id, data: formData }).unwrap();
564
+
565
+ if (kanbanUpdateResponse?.statusCode === 200) {
566
+ showToast("success", "Success", "Kanban View Updated!");
567
+ // Update the kanbanViewData state
568
+ setKanbanViewData((prevData: typeof kanbanViewData) =>
569
+ prevData.map((group: any) => {
570
+ if (group.groupName === sourceGroupName) {
571
+ return sourceGroup;
572
+ }
573
+ if (group.groupName === destinationGroupName) {
574
+ return destinationGroup;
575
+ }
576
+ return group;
577
+ })
578
+ );
579
+ } else {
580
+ showToast("error", "Duplicate Key", kanbanUpdateResponse?.error);
581
+ }
582
+ } catch (error: any) {
583
+ // 6. Handle 500 or network errors
584
+ console.error("API error:", error);
585
+ showToast("error", "Something went wrong", error?.data?.message || "Something went wrong");
586
+ }
558
587
  };
559
588
 
560
589
 
561
-
562
- const handleSwimLinPagination = async () => {
590
+ // Handle SwimLane Pagination
591
+ const handleSwimLanePagination = async () => {
563
592
 
564
593
  if (solidKanbanViewMetaData) {
565
594
 
566
- const columnsToLoadCount = solidKanbanViewMetaData?.data.solidView?.layout?.attrs?.swimlanesCount || 5;
595
+ const swimlanesCount = solidKanbanViewMetaData?.data.solidView?.layout?.attrs?.swimlanesCount || 5;
567
596
  const queryData = {
568
- offset: swimLaneCurrentPageNumber * columnsToLoadCount,
569
- limit: columnsToLoadCount,
597
+ offset: swimLaneCurrentPageNumber * swimlanesCount,
598
+ limit: swimlanesCount,
570
599
  fields: [`${groupByFieldName}`, `count(${groupByFieldName})`],
571
600
  groupBy: groupByFieldName,
601
+ populateMedia: toPopulateMedia,
572
602
  populateGroup: true,
573
603
  groupFilter: {
574
- limit: rows,
604
+ limit: recordsInSwimlane,
575
605
  offset: 0,
576
606
  filters: filters,
577
607
  populate: toPopulate,
@@ -584,7 +614,11 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
584
614
  const queryString = qs.stringify(queryData, {
585
615
  encodeValuesOnly: true
586
616
  });
587
- setFilterQueryString(queryString);
617
+
618
+ //Push to Router
619
+ router.push(`?${queryString}`);
620
+
621
+
588
622
  const data: any = await triggerGetSolidEntities(queryString);
589
623
  if (data && data?.data?.groupRecords.length > 0) {
590
624
  const updatedData = [...kanbanViewData, ...data.data.groupRecords];
@@ -594,64 +628,74 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
594
628
  }
595
629
  }
596
630
 
597
- const handleApplyCustomFilter = async (filters: any) => {
598
631
 
632
+ // Handle the custom filter and Search Filter
633
+ const handleApplyCustomFilter = async (transformedFilter: any) => {
634
+
635
+ if (solidKanbanViewMetaData) {
599
636
 
600
- const columnsToLoadCount = solidKanbanViewMetaData?.data.solidView?.layout?.attrs?.swimlanesCount || 5;
601
- setFilters(filters)
602
637
 
603
- if (toPopulate) {
604
- const queryData = {
605
- offset: 0,
606
- limit: columnsToLoadCount,
607
- fields: [`${groupByFieldName}`, `count(${groupByFieldName})`],
608
- groupBy: groupByFieldName,
609
- populateGroup: true,
610
- groupFilter: {
611
- limit: rows,
638
+ const queryfilter = {
639
+ $and: [
640
+ ]
641
+ }
642
+ if (transformedFilter.s_filter) {
643
+ queryfilter.$and.push(transformedFilter.s_filter)
644
+ }
645
+ if (transformedFilter.c_filter) {
646
+ queryfilter.$and.push(transformedFilter.c_filter)
647
+ }
648
+
649
+ const customFilter = transformedFilter;
650
+ const updatedFilter = { ...(filters || {}), ...(queryfilter || {}) };
651
+ setFilters((prevFilters) => ({ ...(prevFilters || {}), ...(queryfilter || {}) }));
652
+
653
+ const swimlanesCount = solidKanbanViewMetaData?.data.solidView?.layout?.attrs?.swimlanesCount || 5;
654
+
655
+ if (toPopulate) {
656
+ const queryData = {
612
657
  offset: 0,
613
- filters: filters,
614
- populate: toPopulate,
615
- populateMedia: toPopulateMedia
658
+ limit: swimlanesCount,
659
+ fields: [`${groupByFieldName}`, `count(${groupByFieldName})`],
660
+ groupBy: groupByFieldName,
661
+ populateGroup: true,
662
+ groupFilter: {
663
+ limit: recordsInSwimlane,
664
+ offset: 0,
665
+ filters: updatedFilter,
666
+ populate: toPopulate,
667
+ populateMedia: toPopulateMedia
668
+ }
669
+ };
670
+ const queryString = qs.stringify(queryData, {
671
+ encodeValuesOnly: true
672
+ });
616
673
 
674
+ // s_filter and c_filter format that needs to be passed to the router
675
+ // only present if handleCustomFilter is applied
676
+ if (customFilter) {
677
+ let url
678
+ const urlData = queryData;
679
+ delete urlData.filters;
680
+ urlData.s_filter = customFilter.s_filter || {};
681
+ urlData.c_filter = customFilter.c_filter || {};
682
+ queryObjectToQueryString(urlData);
617
683
  }
618
- // sort: [`id:desc`],
619
- };
620
- // fields=status&groupBy=status&fields=count(status)&populateGroup=true
621
- const queryString = qs.stringify(queryData, {
622
- encodeValuesOnly: true
623
- });
624
684
 
625
- // triggerGetSolidEntities(queryString);
626
- setFilterQueryString(queryString);
627
- const data: any = await triggerGetSolidEntities(queryString);
628
- if (data && data?.data?.groupRecords.length > 0) {
629
- const updatedData = [...data.data.groupRecords];
630
- setKanbanViewData(updatedData);
685
+
686
+ const data: any = await triggerGetSolidEntities(queryString);
687
+
688
+ // Update the kanban view data with the new data based on filter
689
+ if (data && data?.data?.groupRecords.length > 0) {
690
+ const updatedData = [...data.data.groupRecords];
691
+ setKanbanViewData(updatedData);
692
+ }
693
+ setSelectedRecords([]);
694
+
631
695
  }
632
- setSelectedRecords([]);
633
696
  }
634
- // if (toPopulate) {
635
- // const queryData = {
636
- // offset: 0,
637
- // limit: 25,
638
- // populate: toPopulate,
639
- // sort: [`id:desc`],
640
- // filters: { ...transformedFilter.filters }
641
- // };
642
- // if (params.embeded) {
643
-
644
- // }
645
- // const queryString = qs.stringify(queryData, {
646
- // encodeValuesOnly: true
647
- // });
648
-
649
- // triggerGetSolidEntities(queryString);
650
- // // setShowGlobalSearchElement(false)
651
- // setSelectedRecords([]);
652
- // }
653
- }
654
697
 
698
+ }
655
699
 
656
700
  useEffect(() => {
657
701
  if (solidKanbanViewMetaData) {
@@ -672,6 +716,7 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
672
716
 
673
717
  return (
674
718
  <div className="page-parent-wrapper">
719
+ <Toast ref={toast} />
675
720
  <div className="page-header">
676
721
  <div className="flex gap-3 align-items-center">
677
722
  <p className="m-0 view-title">{kanbanViewTitle}</p>
@@ -715,7 +760,7 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
715
760
  </div>
716
761
  <style>{`.p-datatable .p-datatable-loading-overlay {background-color: rgba(0, 0, 0, 0.0);}`}</style>
717
762
  {solidKanbanViewMetaData && kanbanViewData &&
718
- <KanbanBoard groupedView={groupedView} kanbanViewData={kanbanViewData} solidKanbanViewMetaData={solidKanbanViewMetaData?.data} setKanbanViewData={setKanbanViewData} handleLoadMore={handleLoadMore} onDragEnd={onDragEnd} handleSwimLinPagination={handleSwimLinPagination} setLightboxUrls={setLightboxUrls} setOpenLightbox={setOpenLightbox} editButtonUrl={editButtonUrl}></KanbanBoard>
763
+ <KanbanBoard groupedView={groupedView} kanbanViewData={kanbanViewData} solidKanbanViewMetaData={solidKanbanViewMetaData?.data} setKanbanViewData={setKanbanViewData} handleLoadMore={handleLoadMore} onDragEnd={onDragEnd} handleSwimLanePagination={handleSwimLanePagination} setLightboxUrls={setLightboxUrls} setOpenLightbox={setOpenLightbox} editButtonUrl={editButtonUrl}></KanbanBoard>
719
764
  }
720
765
 
721
766
  <Dialog