@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.
- package/dist/components/Svg/ExcelSvg.d.ts +6 -0
- package/dist/components/Svg/ExcelSvg.d.ts.map +1 -0
- package/dist/components/Svg/ExcelSvg.js +6 -0
- package/dist/components/Svg/ExcelSvg.js.map +1 -0
- package/dist/components/Svg/PDFSvg.d.ts +5 -1
- package/dist/components/Svg/PDFSvg.d.ts.map +1 -1
- package/dist/components/Svg/PDFSvg.js +3 -2
- package/dist/components/Svg/PDFSvg.js.map +1 -1
- package/dist/components/auth/GoogleAuthChecking.js +1 -1
- package/dist/components/auth/GoogleAuthChecking.js.map +1 -1
- package/dist/components/auth/SolidInitialLoginOtp.d.ts.map +1 -1
- package/dist/components/auth/SolidInitialLoginOtp.js +31 -18
- package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
- package/dist/components/auth/SolidOTPVerify.js +1 -1
- package/dist/components/auth/SolidOTPVerify.js.map +1 -1
- package/dist/components/common/CancelButton.d.ts.map +1 -1
- package/dist/components/common/CancelButton.js +8 -4
- package/dist/components/common/CancelButton.js.map +1 -1
- package/dist/components/common/SolidBreadcrumb.d.ts.map +1 -1
- package/dist/components/common/SolidBreadcrumb.js +32 -15
- package/dist/components/common/SolidBreadcrumb.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts +1 -0
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js +292 -56
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidSaveCustomFilterForm.d.ts +9 -0
- package/dist/components/core/common/SolidSaveCustomFilterForm.d.ts.map +1 -0
- package/dist/components/core/common/SolidSaveCustomFilterForm.js +37 -0
- package/dist/components/core/common/SolidSaveCustomFilterForm.js.map +1 -0
- package/dist/components/core/filter/fields/SolidBooleanField.js +1 -1
- package/dist/components/core/filter/fields/SolidBooleanField.js.map +1 -1
- package/dist/components/core/kanban/KanbanBoard.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanBoard.js +1 -1
- package/dist/components/core/kanban/KanbanBoard.js.map +1 -1
- package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanCard.js +4 -1
- package/dist/components/core/kanban/KanbanCard.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.js +172 -110
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.d.ts.map +1 -1
- package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js +6 -2
- package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js.map +1 -1
- package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.d.ts.map +1 -1
- package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js +3 -2
- package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js.map +1 -1
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +3 -0
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/model/CreateModel.js +3 -3
- package/dist/components/core/model/CreateModel.js.map +1 -1
- package/dist/components/core/model/FieldMetaDataForm.d.ts.map +1 -1
- package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
- package/dist/components/core/model/ModelMetaData.d.ts.map +1 -1
- package/dist/components/core/model/ModelMetaData.js +68 -15
- package/dist/components/core/model/ModelMetaData.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/globals.css +22 -7
- package/package.json +1 -1
- package/src/components/Svg/ExcelSvg.tsx +15 -0
- package/src/components/Svg/PDFSvg.tsx +6 -3
- package/src/components/auth/GoogleAuthChecking.tsx +1 -1
- package/src/components/auth/SolidInitialLoginOtp.tsx +13 -2
- package/src/components/auth/SolidOTPVerify.tsx +1 -1
- package/src/components/common/CancelButton.tsx +12 -6
- package/src/components/common/SolidBreadcrumb.tsx +79 -60
- package/src/components/core/common/SolidGlobalSearchElement.tsx +425 -123
- package/src/components/core/common/SolidSaveCustomFilterForm.tsx +74 -0
- package/src/components/core/filter/fields/SolidBooleanField.tsx +1 -1
- package/src/components/core/kanban/KanbanBoard.tsx +3 -2
- package/src/components/core/kanban/KanbanCard.tsx +6 -3
- package/src/components/core/kanban/SolidKanbanView.tsx +219 -174
- package/src/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.tsx +14 -4
- package/src/components/core/kanban/kanban-fields/SolidShortTextKanbanField.tsx +4 -8
- package/src/components/core/list/SolidListView.tsx +4 -1
- package/src/components/core/model/CreateModel.tsx +2 -2
- package/src/components/core/model/FieldMetaDataForm.tsx +0 -2
- package/src/components/core/model/ModelMetaData.tsx +204 -121
- package/src/index.ts +1 -0
- 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
|
+
|
|
@@ -118,8 +118,9 @@ export const KanbanBoard = ({ groupedView, kanbanViewData, solidKanbanViewMetaDa
|
|
|
118
118
|
);
|
|
119
119
|
})}
|
|
120
120
|
{groupedView !== false &&
|
|
121
|
-
<div
|
|
122
|
-
<Button
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 [
|
|
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
|
-
}, [
|
|
321
|
-
|
|
322
|
-
|
|
303
|
+
}, [solidKanbanViewMetaData])
|
|
323
304
|
|
|
305
|
+
// Fetch data after toPopulate has been populated...
|
|
306
|
+
useEffect(() => {
|
|
324
307
|
|
|
325
|
-
|
|
308
|
+
if (solidKanbanViewMetaData) {
|
|
326
309
|
|
|
327
|
-
|
|
328
|
-
|
|
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
|
-
|
|
313
|
+
const queryObject = queryStringToQueryObject();
|
|
314
|
+
let queryString = "";
|
|
315
|
+
if (searchParams) {
|
|
337
316
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
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
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
-
|
|
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
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
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
|
|
590
|
+
// Handle SwimLane Pagination
|
|
591
|
+
const handleSwimLanePagination = async () => {
|
|
563
592
|
|
|
564
593
|
if (solidKanbanViewMetaData) {
|
|
565
594
|
|
|
566
|
-
const
|
|
595
|
+
const swimlanesCount = solidKanbanViewMetaData?.data.solidView?.layout?.attrs?.swimlanesCount || 5;
|
|
567
596
|
const queryData = {
|
|
568
|
-
offset: swimLaneCurrentPageNumber *
|
|
569
|
-
limit:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
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
|
-
|
|
614
|
-
|
|
615
|
-
|
|
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
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
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}
|
|
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
|