@solidstarters/solid-core-ui 1.1.55 → 1.1.57

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 (105) hide show
  1. package/dist/components/Svg/PDFSvg.d.ts +2 -0
  2. package/dist/components/Svg/PDFSvg.d.ts.map +1 -0
  3. package/dist/components/Svg/PDFSvg.js +5 -0
  4. package/dist/components/Svg/PDFSvg.js.map +1 -0
  5. package/dist/components/common/SolidFormStepper.d.ts.map +1 -1
  6. package/dist/components/common/SolidFormStepper.js +0 -4
  7. package/dist/components/common/SolidFormStepper.js.map +1 -1
  8. package/dist/components/core/form/SolidFormUserViewLayout.d.ts +2 -0
  9. package/dist/components/core/form/SolidFormUserViewLayout.d.ts.map +1 -0
  10. package/dist/components/core/form/SolidFormUserViewLayout.js +112 -0
  11. package/dist/components/core/form/SolidFormUserViewLayout.js.map +1 -0
  12. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  13. package/dist/components/core/form/SolidFormView.js +29 -22
  14. package/dist/components/core/form/SolidFormView.js.map +1 -1
  15. package/dist/components/core/form/fields/SolidMediaMultipleField.d.ts.map +1 -1
  16. package/dist/components/core/form/fields/SolidMediaMultipleField.js +1 -1
  17. package/dist/components/core/form/fields/SolidMediaMultipleField.js.map +1 -1
  18. package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
  19. package/dist/components/core/form/fields/SolidMediaSingleField.js +1 -1
  20. package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
  21. package/dist/components/core/form/fields/SolidSelectionDynamicField.d.ts.map +1 -1
  22. package/dist/components/core/form/fields/SolidSelectionDynamicField.js +12 -1
  23. package/dist/components/core/form/fields/SolidSelectionDynamicField.js.map +1 -1
  24. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.d.ts.map +1 -1
  25. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js +4 -0
  26. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js.map +1 -1
  27. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.d.ts.map +1 -1
  28. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js +9 -7
  29. package/dist/components/core/form/fields/relations/SolidRelationOneToManyField.js.map +1 -1
  30. package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
  31. package/dist/components/core/kanban/KanbanCard.js +7 -6
  32. package/dist/components/core/kanban/KanbanCard.js.map +1 -1
  33. package/dist/components/core/kanban/KanbanColumn.d.ts.map +1 -1
  34. package/dist/components/core/kanban/KanbanColumn.js +2 -2
  35. package/dist/components/core/kanban/KanbanColumn.js.map +1 -1
  36. package/dist/components/core/kanban/KanbanUserViewLayout.d.ts +2 -0
  37. package/dist/components/core/kanban/KanbanUserViewLayout.d.ts.map +1 -0
  38. package/dist/components/core/kanban/KanbanUserViewLayout.js +112 -0
  39. package/dist/components/core/kanban/KanbanUserViewLayout.js.map +1 -0
  40. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  41. package/dist/components/core/kanban/SolidKanbanView.js +41 -35
  42. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  43. package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts +1 -1
  44. package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts.map +1 -1
  45. package/dist/components/core/kanban/SolidKanbanViewConfigure.js +2 -2
  46. package/dist/components/core/kanban/SolidKanbanViewConfigure.js.map +1 -1
  47. package/dist/components/core/kanban/SolidKanbanViewFields.d.ts +2 -1
  48. package/dist/components/core/kanban/SolidKanbanViewFields.d.ts.map +1 -1
  49. package/dist/components/core/kanban/SolidKanbanViewFields.js +3 -3
  50. package/dist/components/core/kanban/SolidKanbanViewFields.js.map +1 -1
  51. package/dist/components/core/kanban/kanban-fields/SolidIntKanbanField.d.ts.map +1 -1
  52. package/dist/components/core/kanban/kanban-fields/SolidIntKanbanField.js +10 -2
  53. package/dist/components/core/kanban/kanban-fields/SolidIntKanbanField.js.map +1 -1
  54. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js +2 -2
  55. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js.map +1 -1
  56. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.d.ts +1 -1
  57. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.d.ts.map +1 -1
  58. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js +26 -5
  59. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js.map +1 -1
  60. package/dist/components/core/list/SolidListColumnSelector.d.ts +2 -0
  61. package/dist/components/core/list/SolidListColumnSelector.d.ts.map +1 -0
  62. package/dist/components/core/list/SolidListColumnSelector.js +182 -0
  63. package/dist/components/core/list/SolidListColumnSelector.js.map +1 -0
  64. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  65. package/dist/components/core/list/SolidListView.js +48 -45
  66. package/dist/components/core/list/SolidListView.js.map +1 -1
  67. package/dist/components/core/list/SolidListViewConfigure.d.ts +1 -1
  68. package/dist/components/core/list/SolidListViewConfigure.d.ts.map +1 -1
  69. package/dist/components/core/list/SolidListViewConfigure.js +7 -49
  70. package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
  71. package/dist/redux/api/solidEntityApi.d.ts +1 -0
  72. package/dist/redux/api/solidEntityApi.d.ts.map +1 -1
  73. package/dist/redux/api/solidEntityApi.js +7 -0
  74. package/dist/redux/api/solidEntityApi.js.map +1 -1
  75. package/dist/resources/globals.css +52 -1
  76. package/dist/resources/images/fileTypes/File.png +0 -0
  77. package/dist/resources/images/fileTypes/Mp3.png +0 -0
  78. package/dist/resources/images/fileTypes/Mp4.png +0 -0
  79. package/package.json +1 -1
  80. package/src/components/Svg/PDFSvg.tsx +12 -0
  81. package/src/components/common/SolidFormStepper.tsx +0 -4
  82. package/src/components/core/form/SolidFormUserViewLayout.tsx +87 -0
  83. package/src/components/core/form/SolidFormView.tsx +30 -5
  84. package/src/components/core/form/fields/SolidMediaMultipleField.tsx +16 -14
  85. package/src/components/core/form/fields/SolidMediaSingleField.tsx +16 -14
  86. package/src/components/core/form/fields/SolidSelectionDynamicField.tsx +12 -4
  87. package/src/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +5 -2
  88. package/src/components/core/form/fields/relations/SolidRelationOneToManyField.tsx +4 -2
  89. package/src/components/core/kanban/KanbanCard.tsx +7 -6
  90. package/src/components/core/kanban/KanbanColumn.tsx +6 -8
  91. package/src/components/core/kanban/KanbanUserViewLayout.tsx +87 -0
  92. package/src/components/core/kanban/SolidKanbanView.tsx +18 -3
  93. package/src/components/core/kanban/SolidKanbanViewConfigure.tsx +3 -3
  94. package/src/components/core/kanban/SolidKanbanViewFields.tsx +23 -22
  95. package/src/components/core/kanban/kanban-fields/SolidIntKanbanField.tsx +10 -3
  96. package/src/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.tsx +6 -6
  97. package/src/components/core/kanban/kanban-fields/SolidShortTextKanbanField.tsx +102 -7
  98. package/src/components/core/list/SolidListColumnSelector.tsx +170 -0
  99. package/src/components/core/list/SolidListView.tsx +16 -12
  100. package/src/components/core/list/SolidListViewConfigure.tsx +2 -77
  101. package/src/redux/api/solidEntityApi.tsx +7 -0
  102. package/src/resources/globals.css +52 -1
  103. package/src/resources/images/fileTypes/File.png +0 -0
  104. package/src/resources/images/fileTypes/Mp3.png +0 -0
  105. package/src/resources/images/fileTypes/Mp4.png +0 -0
@@ -64,6 +64,7 @@ export class SolidSelectionDynamicField implements ISolidField {
64
64
 
65
65
  const formDisabled = solidFormViewMetaData.data.solidView?.layout?.attrs?.disabled;
66
66
  const formReadonly = solidFormViewMetaData.data.solidView?.layout?.attrs?.readonly;
67
+ const whereClause = fieldLayoutInfo.attrs.whereClause;
67
68
 
68
69
  // selection dynamic specific code.
69
70
  const [triggerGetSelectionDynamicValues] = useLazyGetSelectionDynamicValuesQuery();
@@ -77,11 +78,18 @@ export class SolidSelectionDynamicField implements ISolidField {
77
78
  query: event.query,
78
79
  fieldId: fieldMetadata.id
79
80
  };
80
-
81
- const sdQs = qs.stringify(queryData, {
81
+ if (whereClause) {
82
+ queryData.query = whereClause;
83
+ }
84
+ let sdQs = qs.stringify(queryData, {
82
85
  encodeValuesOnly: true,
86
+ encoder: (str, defaultEncoder, charset, type) => {
87
+ if (type === 'key' || type === 'value') {
88
+ if (str === queryData.query) return str;
89
+ }
90
+ return defaultEncoder(str);
91
+ }
83
92
  });
84
-
85
93
  // TODO: do error handling here, possible errors like modelname is incorrect etc...
86
94
  const sdResponse = await triggerGetSelectionDynamicValues(sdQs);
87
95
 
@@ -98,7 +106,7 @@ export class SolidSelectionDynamicField implements ISolidField {
98
106
  let DynamicWidget = getExtensionComponent("SolidFormFieldViewModeWidget");
99
107
  const widgetProps = {
100
108
  label: fieldLabel,
101
- value: formik.values[fieldLayoutInfo.attrs.name],
109
+ value: formik.values[fieldLayoutInfo.attrs.name] && formik.values[fieldLayoutInfo.attrs.name].value,
102
110
  }
103
111
  return (
104
112
  <>
@@ -78,6 +78,7 @@ export class SolidRelationManyToOneField implements ISolidField {
78
78
 
79
79
  const formDisabled = solidFormViewMetaData.data.solidView?.layout?.attrs?.disabled;
80
80
  const formReadonly = solidFormViewMetaData.data.solidView?.layout?.attrs?.readonly;
81
+ const whereClause = fieldLayoutInfo.attrs.whereClause;
81
82
 
82
83
  const [autoCompleteItems, setAutoCompleteItems] = useState([]);
83
84
  const autoCompleteSearch = async (event: AutoCompleteCompleteEvent) => {
@@ -93,10 +94,12 @@ export class SolidRelationManyToOneField implements ISolidField {
93
94
  }
94
95
  };
95
96
 
96
- const autocompleteQs = qs.stringify(queryData, {
97
+ let autocompleteQs = qs.stringify(queryData, {
97
98
  encodeValuesOnly: true,
98
99
  });
99
-
100
+ if (whereClause) {
101
+ autocompleteQs = `${autocompleteQs}&${whereClause}`;
102
+ }
100
103
  // TODO: do error handling here, possible errors like modelname is incorrect etc...
101
104
  const autocompleteResponse = await triggerGetSolidEntities(autocompleteQs);
102
105
 
@@ -93,6 +93,7 @@ export class SolidRelationOneToManyField implements ISolidField {
93
93
  inlineCreate: readOnlyPermission === false ? true : false,
94
94
  customLayout: fieldLayoutInfo?.attrs?.inlineListLayout,
95
95
  embeded: true,
96
+ id: this.fieldContext.data ? this?.fieldContext?.data?.id : 'new',
96
97
  customFilter: {
97
98
  [customFilter]: {
98
99
  id: {
@@ -113,6 +114,7 @@ export class SolidRelationOneToManyField implements ISolidField {
113
114
  inlineCreate: readOnlyPermission === false ? true : false,
114
115
  customLayout: fieldLayoutInfo?.attrs?.inlineListLayout,
115
116
  embeded: true,
117
+ id: this.fieldContext.data ? this?.fieldContext?.data?.id : 'new',
116
118
  customFilter: {
117
119
  [customFilter]: {
118
120
  id: {
@@ -128,11 +130,11 @@ export class SolidRelationOneToManyField implements ISolidField {
128
130
  embeded: true,
129
131
  isCustomCreate: false,
130
132
  customLayout: fieldLayoutInfo?.attrs?.inlineCreateLayout,
131
- modelName: camelCase(this.fieldContext.fieldMetadata.relationCoModelSingularName)
133
+ modelName: camelCase(this.fieldContext.fieldMetadata.relationCoModelSingularName),
132
134
  }
133
135
  setformViewParams(formviewparams)
134
136
 
135
- }, [])
137
+ }, [readOnlyPermission])
136
138
 
137
139
  const fieldDisabled = fieldLayoutInfo.attrs?.disabled;
138
140
  const fieldReadonly = fieldLayoutInfo.attrs?.readonly;
@@ -21,7 +21,7 @@ interface KanbanCardProps {
21
21
  }
22
22
 
23
23
  // Render columns dynamically based on metadata
24
- const renderFieldsDynamically = (field: any, data: any, solidKanbanViewMetaData: any, setLightboxUrls?: any, setOpenLightbox?: any) => {
24
+ const renderFieldsDynamically = (field: any, data: any, solidKanbanViewMetaData: any, setLightboxUrls?: any, setOpenLightbox?: any, groupedView: boolean) => {
25
25
  if (!solidKanbanViewMetaData) {
26
26
  return;
27
27
  }
@@ -33,7 +33,7 @@ const renderFieldsDynamically = (field: any, data: any, solidKanbanViewMetaData:
33
33
  }
34
34
  const fieldMetadata = solidFieldsMetadata[field.attrs.name];
35
35
  const fieldLayout = field;
36
- return SolidKanbanViewFields({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data, setLightboxUrls, setOpenLightbox });
36
+ return SolidKanbanViewFields({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data, setLightboxUrls, setOpenLightbox, groupedView });
37
37
  // return solidView.layout.children?.map((column: any) => {
38
38
  // const fieldMetadata = solidFieldsMetadata[column.attrs.name];
39
39
  // if (!fieldMetadata) {
@@ -45,7 +45,7 @@ const renderFieldsDynamically = (field: any, data: any, solidKanbanViewMetaData:
45
45
  // });
46
46
  };
47
47
 
48
- const KanbanCard: React.FC<KanbanCardProps> = ({ data, solidKanbanViewMetaData, index, setLightboxUrls, setOpenLightbox, editButtonUrl }) => {
48
+ const KanbanCard: React.FC<KanbanCardProps> = ({ data, solidKanbanViewMetaData, index, setLightboxUrls, setOpenLightbox, editButtonUrl, groupedView }) => {
49
49
  const router = useRouter()
50
50
 
51
51
  const SolidRow = ({ children, attrs }: any) => {
@@ -104,7 +104,7 @@ const KanbanCard: React.FC<KanbanCardProps> = ({ data, solidKanbanViewMetaData,
104
104
 
105
105
  const SolidField = ({ field, data, solidKanbanViewMetaData }: any) => {
106
106
 
107
- return renderFieldsDynamically(field, data, solidKanbanViewMetaData, setLightboxUrls, setOpenLightbox)
107
+ return renderFieldsDynamically(field, data, solidKanbanViewMetaData, setLightboxUrls, setOpenLightbox, groupedView)
108
108
  // switch (solidKanbanViewMetaData[field.attrs.name].type) {
109
109
  // case "mediaSingle":
110
110
  // return <img src=""></img>
@@ -164,7 +164,7 @@ const KanbanCard: React.FC<KanbanCardProps> = ({ data, solidKanbanViewMetaData,
164
164
 
165
165
 
166
166
  return (
167
- <Draggable draggableId={String(data.id)} index={index}>
167
+ <Draggable draggableId={String(data.id)} index={index} isDragDisabled={!groupedView}>
168
168
  {(provided: DraggableProvided, snapshot) => (
169
169
  <div
170
170
  className=""
@@ -180,9 +180,10 @@ 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
184
  }}
184
185
  elevation={snapshot.isDragging ? 3 : 1}
185
- className="solid-kanban-card"
186
+ className={`${!groupedView ? 'solid-media-card' : 'solid-kanban-card'}`}
186
187
  onClick={() =>
187
188
  router.push(`${editButtonUrl}/${data?.id}`)
188
189
  }
@@ -60,7 +60,7 @@ const KanbanColumn = ({ groupedView, groupByField, solidKanbanViewMetaData, grou
60
60
  </div>
61
61
  }
62
62
  {!group.folded &&
63
- <Button
63
+ <Button
64
64
  onClick={(e: any) => op?.current?.toggle(e)}
65
65
  icon='pi pi-cog'
66
66
  text
@@ -110,7 +110,7 @@ const KanbanColumn = ({ groupedView, groupByField, solidKanbanViewMetaData, grou
110
110
  </div>
111
111
  }
112
112
  {!group.folded && (
113
- <Droppable droppableId={groupByField}>
113
+ <Droppable droppableId={groupByField} isDropDisable={!groupedView}>
114
114
  {(provided: DroppableProvided) => (
115
115
  <div
116
116
  ref={provided.innerRef}
@@ -119,16 +119,14 @@ const KanbanColumn = ({ groupedView, groupByField, solidKanbanViewMetaData, grou
119
119
  className={groupedView === false && "kanban-ungrouped-column-content"}
120
120
  >
121
121
  {groupData.map((data, index) => (
122
- <KanbanCard key={data.id} data={data} solidKanbanViewMetaData={solidKanbanViewMetaData} index={index} setLightboxUrls={setLightboxUrls} setOpenLightbox={setOpenLightbox} editButtonUrl={editButtonUrl}/>
122
+ <KanbanCard groupedView={groupedView} key={data.id} data={data} solidKanbanViewMetaData={solidKanbanViewMetaData} index={index} setLightboxUrls={setLightboxUrls} setOpenLightbox={setOpenLightbox} editButtonUrl={editButtonUrl} />
123
123
  ))}
124
124
  {provided.placeholder}
125
125
  {group.count > 0 && (group.count > (group.limit * group.currentPage)) &&
126
- <a
127
- className="load-more-button"
126
+ <Button text className="kaban-load-more" size="small"
128
127
  onClick={() => handleLoadMore(groupByField)}
129
- >
130
- Load more data... ({group.count - (group.limit * group.currentPage)} remaining)
131
- </a>
128
+ label={`Load more data... ( ${group.count - (group.limit * group.currentPage)} remaining)`}
129
+ />
132
130
  }
133
131
  </div>
134
132
  )}
@@ -0,0 +1,87 @@
1
+ "use client";
2
+ import { useFormik } from "formik";
3
+ import { Button } from "primereact/button";
4
+ import { useSelector } from "react-redux";
5
+ import React, { useRef } from "react";
6
+ import { createSolidEntityApi } from "@/redux/api/solidEntityApi";
7
+ import { javascript } from "@codemirror/lang-javascript";
8
+ import { oneDark } from "@codemirror/theme-one-dark";
9
+ import CodeMirror, { EditorView } from "@uiw/react-codemirror";
10
+ import { Toast } from "primereact/toast";
11
+
12
+ export const KanbanUserViewLayout = ({ solidKanbanViewMetaData, setLayoutDialogVisible }: any) => {
13
+ const toast = useRef<Toast>(null);
14
+ const { user } = useSelector((state: any) => state.auth);
15
+ const entityApi = createSolidEntityApi("userViewMetadata");
16
+ const { useUpsertSolidEntityMutation } = entityApi;
17
+ const [upsertUserView] = useUpsertSolidEntityMutation();
18
+
19
+ if (!solidKanbanViewMetaData?.data?.solidView) return null;
20
+
21
+ const solidView = solidKanbanViewMetaData.data.solidView;
22
+
23
+ const showToast = (severity: "success" | "error", summary: string, detail: string) => {
24
+ toast.current?.show({
25
+ severity,
26
+ summary,
27
+ detail,
28
+ life: 3000,
29
+ });
30
+ };
31
+
32
+ const formik = useFormik({
33
+ initialValues: {
34
+ layoutString: JSON.stringify(solidView.layout, null, 2),
35
+ },
36
+ onSubmit: async (values) => {
37
+ const parsedLayout = JSON.parse(values.layoutString);
38
+ console.log("updatedLayout", parsedLayout);
39
+
40
+ try {
41
+ if (solidView.id) {
42
+ const response = await upsertUserView({
43
+ userId: user?.user?.id,
44
+ viewMetadataId: solidView.id,
45
+ layout: JSON.stringify(parsedLayout),
46
+ }).unwrap();
47
+ console.log("Response", response);
48
+ if (response.statusCode === 200) {
49
+ showToast("success", "Layout", "Form Layout Updated successfully!");
50
+ setLayoutDialogVisible(false);
51
+ window.location.reload();
52
+ }
53
+ }
54
+ } catch (error) {
55
+ console.error("Update failed:", error);
56
+ }
57
+ },
58
+ });
59
+
60
+ return (
61
+ <>
62
+ <Toast ref={toast} />
63
+ <form onSubmit={formik.handleSubmit}>
64
+ <CodeMirror
65
+ value={formik.values.layoutString}
66
+ height="500px"
67
+ theme={oneDark}
68
+ style={{ fontSize: '10px' }}
69
+ extensions={[javascript(), EditorView.lineWrapping]}
70
+ onChange={(value) => {
71
+ formik.setFieldValue("layoutString", value);
72
+ }}
73
+ />
74
+ <div className="pt-3 flex gap-2">
75
+ <Button type="submit" label="Apply" size="small" />
76
+ <Button
77
+ type="button"
78
+ outlined
79
+ label="Cancel"
80
+ size="small"
81
+ onClick={() => setLayoutDialogVisible(false)}
82
+ />
83
+ </div>
84
+ </form>
85
+ </>
86
+ );
87
+ };
@@ -28,6 +28,8 @@ import "yet-another-react-lightbox/styles.css";
28
28
  import "yet-another-react-lightbox/plugins/counter.css";
29
29
  import { useRouter, useSearchParams } from "next/navigation";
30
30
  import { SolidKanbanViewConfigure } from "./SolidKanbanViewConfigure";
31
+ import { KanbanUserViewLayout } from "./KanbanUserViewLayout";
32
+ import { useSelector } from "react-redux";
31
33
 
32
34
 
33
35
 
@@ -39,6 +41,7 @@ type SolidKanbanViewParams = {
39
41
 
40
42
 
41
43
  export const SolidKanbanView = (params: SolidKanbanViewParams) => {
44
+ const { user } = useSelector((state: any) => state.auth);
42
45
  const solidGlobalSearchElementRef = useRef();
43
46
  const searchParams = useSearchParams().toString(); // Converts the query params to a string
44
47
  const router = useRouter();
@@ -62,6 +65,7 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
62
65
  const [openLightbox, setOpenLightbox] = useState(false);
63
66
  const [lightboxUrls, setLightboxUrls] = useState({});
64
67
  const [filterQueryString, setFilterQueryString] = useState<any>();
68
+ const [isLayoutDialogVisible, setLayoutDialogVisible] = useState(false);
65
69
 
66
70
 
67
71
 
@@ -117,7 +121,7 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
117
121
  } = entityApi;
118
122
 
119
123
  // Get the kanban view layout & metadata first.
120
- const kanbanViewMetaDataQs = qs.stringify({ ...params, viewType: 'kanban' }, {
124
+ const kanbanViewMetaDataQs = qs.stringify({ ...params, viewType: 'kanban', userId: user?.user?.id }, {
121
125
  encodeValuesOnly: true,
122
126
  });
123
127
  const [kanbanViewMetaData, setKanbanViewMetaData] = useState<any>({});
@@ -706,14 +710,14 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
706
710
  solidKanbanViewMetaData={solidKanbanViewMetaData}
707
711
  actionsAllowed={actionsAllowed}
708
712
  viewModes={viewModes}
709
- // setLayoutDialogVisible={setLayoutDialogVisible}
713
+ setLayoutDialogVisible={setLayoutDialogVisible}
710
714
  />
711
715
  {/* <SolidConfigureLayoutElement></SolidConfigureLayoutElement> */}
712
716
  </div>
713
717
  </div>
714
718
  <style>{`.p-datatable .p-datatable-loading-overlay {background-color: rgba(0, 0, 0, 0.0);}`}</style>
715
719
  {solidKanbanViewMetaData && kanbanViewData &&
716
- <KanbanBoard groupedView={groupedView} kanbanViewData={kanbanViewData} solidKanbanViewMetaData={solidKanbanViewMetaData?.data} setKanbanViewData={setKanbanViewData} handleLoadMore={handleLoadMore} onDragEnd={onDragEnd} handleSwimLinPagination={handleSwimLinPagination} setLightboxUrls={setLightboxUrls} setOpenLightbox={setOpenLightbox} editButtonUrl={editButtonUrl}></KanbanBoard>
720
+ <KanbanBoard groupedView={groupedView} kanbanViewData={kanbanViewData} solidKanbanViewMetaData={solidKanbanViewMetaData?.data} setKanbanViewData={setKanbanViewData} handleLoadMore={handleLoadMore} onDragEnd={onDragEnd} handleSwimLinPagination={handleSwimLinPagination} setLightboxUrls={setLightboxUrls} setOpenLightbox={setOpenLightbox} editButtonUrl={editButtonUrl}></KanbanBoard>
717
721
  }
718
722
 
719
723
  <Dialog
@@ -738,6 +742,17 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
738
742
  slides={lightboxUrls}
739
743
  />
740
744
  }
745
+ <Dialog
746
+ visible={isLayoutDialogVisible}
747
+ header="Change Kanban Layout"
748
+ modal
749
+ onHide={() => setLayoutDialogVisible(false)}
750
+ contentStyle={{
751
+ width: 800
752
+ }}
753
+ >
754
+ <KanbanUserViewLayout solidKanbanViewMetaData={solidKanbanViewMetaData} setLayoutDialogVisible={setLayoutDialogVisible} />
755
+ </Dialog>
741
756
  </div>
742
757
  );
743
758
  };
@@ -7,7 +7,7 @@ import { OverlayPanel } from 'primereact/overlaypanel';
7
7
  import { RadioButton } from 'primereact/radiobutton';
8
8
  import React, { useEffect, useRef, useState } from 'react'
9
9
 
10
- export const SolidKanbanViewConfigure = ({ solidKanbanViewMetaData, actionsAllowed, viewModes }: any) => {
10
+ export const SolidKanbanViewConfigure = ({ solidKanbanViewMetaData, actionsAllowed, setLayoutDialogVisible, viewModes }: any) => {
11
11
  const op = useRef(null);
12
12
  const customizeLayout = useRef<OverlayPanel | null>(null);
13
13
  const pathname = usePathname();
@@ -68,7 +68,7 @@ export const SolidKanbanViewConfigure = ({ solidKanbanViewMetaData, actionsAllow
68
68
  <div className="flex flex-column">
69
69
  <Button text icon='pi pi-download' label="Import" size="small" severity="secondary" className="text-left gap-2 text-base" />
70
70
  <Button text icon='pi pi-upload' label="Export" size="small" severity="secondary" className="text-left gap-2 text-base" />
71
- {/* <Button
71
+ <Button
72
72
  text
73
73
  type="button"
74
74
  className="w-8rem text-left gap-2 purple-200"
@@ -78,7 +78,7 @@ export const SolidKanbanViewConfigure = ({ solidKanbanViewMetaData, actionsAllow
78
78
  severity="contrast"
79
79
  icon={'pi pi-objects-column'}
80
80
  onClick={() => setLayoutDialogVisible(true)}
81
- /> */}
81
+ />
82
82
  </div>
83
83
  </div>
84
84
  <Divider className="m-0" />
@@ -25,7 +25,8 @@ export type SolidKanbanViewFieldsParams = {
25
25
  fieldLayout: any,
26
26
  data: any,
27
27
  setLightboxUrls?: any,
28
- setOpenLightbox?:any
28
+ setOpenLightbox?: any,
29
+ groupedView?: boolean
29
30
  };
30
31
 
31
32
  export const getNumberOfInputs = (matchMode: any): number | null => {
@@ -73,69 +74,69 @@ export const getNumberOfInputs = (matchMode: any): number | null => {
73
74
  // }
74
75
  // };
75
76
 
76
- export const SolidKanbanViewFields = ({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data, setLightboxUrls, setOpenLightbox }: SolidKanbanViewFieldsParams) => {
77
+ export const SolidKanbanViewFields = ({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data, setLightboxUrls, setOpenLightbox, groupedView }: SolidKanbanViewFieldsParams) => {
77
78
 
78
79
  // And finally we can implement additional switching logic based on certain special fields.
79
80
  if (fieldMetadata.name === 'id') {
80
- return SolidIntKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
81
+ return SolidIntKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
81
82
  }
82
83
 
83
84
  if (fieldMetadata.type === 'int') {
84
- return SolidIntKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
85
+ return SolidIntKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
85
86
  }
86
87
  if (fieldMetadata.type === 'bigint') {
87
- return SolidBigintKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
88
+ return SolidBigintKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
88
89
  }
89
90
  if (fieldMetadata.type === 'float') {
90
- return SolidFloatKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
91
+ return SolidFloatKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
91
92
  }
92
93
  if (fieldMetadata.type === 'decimal') {
93
- return SolidDecimalKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
94
+ return SolidDecimalKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
94
95
  }
95
96
  if (fieldMetadata.type === 'shortText') {
96
- return SolidShortTextKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data,setLightboxUrls, setOpenLightbox });
97
+ return SolidShortTextKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data, setLightboxUrls, setOpenLightbox, groupedView });
97
98
  }
98
99
  if (fieldMetadata.type === 'longText') {
99
- return SolidLongTextKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
100
+ return SolidLongTextKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data, groupedView });
100
101
  }
101
102
  if (fieldMetadata.type === 'richText') {
102
- return SolidRichTextKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
103
+ return SolidRichTextKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
103
104
  }
104
105
  if (fieldMetadata.type === 'boolean') {
105
- return SolidBooleanKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
106
+ return SolidBooleanKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
106
107
  }
107
108
  if (fieldMetadata.type === 'date') {
108
- return SolidDateKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
109
+ return SolidDateKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
109
110
  }
110
111
  if (fieldMetadata.type === 'datetime') {
111
- return SolidDatetimeKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
112
+ return SolidDatetimeKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
112
113
  }
113
114
  if (fieldMetadata.type === 'time') {
114
- return SolidTimeKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
115
+ return SolidTimeKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
115
116
  }
116
117
  if (fieldMetadata.type === 'relation') {
117
- return SolidRelationKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
118
+ return SolidRelationKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
118
119
  }
119
120
  if (fieldMetadata.type === 'mediaSingle') {
120
- return SolidMediaSingleKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data ,setLightboxUrls, setOpenLightbox});
121
+ return SolidMediaSingleKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data, setLightboxUrls, setOpenLightbox });
121
122
  }
122
123
  if (fieldMetadata.type === 'mediaMultiple') {
123
- return SolidMediaMultipleKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data,setLightboxUrls, setOpenLightbox });
124
+ return SolidMediaMultipleKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data, setLightboxUrls, setOpenLightbox });
124
125
  }
125
126
  if (fieldMetadata.type === 'selectionStatic') {
126
- return SolidSelectionStaticKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
127
+ return SolidSelectionStaticKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
127
128
  }
128
129
  if (fieldMetadata.type === 'selectionDynamic') {
129
- return SolidSelectionDynamicKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
130
+ return SolidSelectionDynamicKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
130
131
  }
131
132
  if (fieldMetadata.type === 'computed') {
132
- return SolidComputedKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
133
+ return SolidComputedKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
133
134
  }
134
135
  if (fieldMetadata.type === 'externalId') {
135
- return SolidExternalIdKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
136
+ return SolidExternalIdKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
136
137
  }
137
138
  if (fieldMetadata.type === 'uuid') {
138
- return SolidUuidKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data });
139
+ return SolidUuidKanbanField({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data });
139
140
  }
140
141
  // // Load everything else based on type and dynamically.
141
142
  // else {
@@ -2,10 +2,17 @@
2
2
  import { SolidKanbanViewFieldsParams } from '../SolidKanbanViewFields';
3
3
  import { InputText } from 'primereact/inputtext';
4
4
 
5
- const SolidIntKanbanField = ({ solidKanbanViewMetaData, fieldMetadata, fieldLayout,data }: SolidKanbanViewFieldsParams) => {
6
-
5
+ const SolidIntKanbanField = ({ solidKanbanViewMetaData, fieldMetadata, fieldLayout, data }: SolidKanbanViewFieldsParams) => {
6
+ const formatFileSize = (size: number) => {
7
+ return size >= 1024 * 1024
8
+ ? `${(size / (1024 * 1024)).toFixed(1)} MB`
9
+ : `${(size / 1024).toFixed(1)} KB`;
10
+ };
7
11
  return (
8
- <p className='m-0'>{data && data[fieldMetadata.name] ? `${data[fieldMetadata.name]}`: ""}</p>
12
+ fieldMetadata?.name === "fileSize" ?
13
+ <p className='m-0 text-sm'>Size : {data && data[fieldMetadata.name] ? `${formatFileSize(data[fieldMetadata.name])}` : ""}</p>
14
+ :
15
+ <p className='m-0'>{data && data[fieldMetadata.name] ? `${data[fieldMetadata.name]}` : ""}</p>
9
16
  );
10
17
 
11
18
  };
@@ -49,25 +49,25 @@ const SolidMediaSingleKanbanField = ({ solidKanbanViewMetaData, fieldMetadata, f
49
49
  }
50
50
  {/* Render PDF - Open Lightbox on Click */}
51
51
  {mimeType && mimeType.includes("pdf") && (
52
- <>
52
+ <div onClick={(e) => e.stopPropagation()}>
53
53
  <div className='flex align-items-end gap-2 my-2'>
54
54
  <div onClick={() => setVisible(true)} style={{ cursor: 'pointer' }}>
55
55
  <svg width="36px" height="36px" viewBox="-4 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="#000000" stroke-width="0.0004"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"> <path d="M25.6686 26.0962C25.1812 26.2401 24.4656 26.2563 23.6984 26.145C22.875 26.0256 22.0351 25.7739 21.2096 25.403C22.6817 25.1888 23.8237 25.2548 24.8005 25.6009C25.0319 25.6829 25.412 25.9021 25.6686 26.0962ZM17.4552 24.7459C17.3953 24.7622 17.3363 24.7776 17.2776 24.7939C16.8815 24.9017 16.4961 25.0069 16.1247 25.1005L15.6239 25.2275C14.6165 25.4824 13.5865 25.7428 12.5692 26.0529C12.9558 25.1206 13.315 24.178 13.6667 23.2564C13.9271 22.5742 14.193 21.8773 14.468 21.1894C14.6075 21.4198 14.7531 21.6503 14.9046 21.8814C15.5948 22.9326 16.4624 23.9045 17.4552 24.7459ZM14.8927 14.2326C14.958 15.383 14.7098 16.4897 14.3457 17.5514C13.8972 16.2386 13.6882 14.7889 14.2489 13.6185C14.3927 13.3185 14.5105 13.1581 14.5869 13.0744C14.7049 13.2566 14.8601 13.6642 14.8927 14.2326ZM9.63347 28.8054C9.38148 29.2562 9.12426 29.6782 8.86063 30.0767C8.22442 31.0355 7.18393 32.0621 6.64941 32.0621C6.59681 32.0621 6.53316 32.0536 6.44015 31.9554C6.38028 31.8926 6.37069 31.8476 6.37359 31.7862C6.39161 31.4337 6.85867 30.8059 7.53527 30.2238C8.14939 29.6957 8.84352 29.2262 9.63347 28.8054ZM27.3706 26.1461C27.2889 24.9719 25.3123 24.2186 25.2928 24.2116C24.5287 23.9407 23.6986 23.8091 22.7552 23.8091C21.7453 23.8091 20.6565 23.9552 19.2582 24.2819C18.014 23.3999 16.9392 22.2957 16.1362 21.0733C15.7816 20.5332 15.4628 19.9941 15.1849 19.4675C15.8633 17.8454 16.4742 16.1013 16.3632 14.1479C16.2737 12.5816 15.5674 11.5295 14.6069 11.5295C13.948 11.5295 13.3807 12.0175 12.9194 12.9813C12.0965 14.6987 12.3128 16.8962 13.562 19.5184C13.1121 20.5751 12.6941 21.6706 12.2895 22.7311C11.7861 24.0498 11.2674 25.4103 10.6828 26.7045C9.04334 27.3532 7.69648 28.1399 6.57402 29.1057C5.8387 29.7373 4.95223 30.7028 4.90163 31.7107C4.87693 32.1854 5.03969 32.6207 5.37044 32.9695C5.72183 33.3398 6.16329 33.5348 6.6487 33.5354C8.25189 33.5354 9.79489 31.3327 10.0876 30.8909C10.6767 30.0029 11.2281 29.0124 11.7684 27.8699C13.1292 27.3781 14.5794 27.011 15.985 26.6562L16.4884 26.5283C16.8668 26.4321 17.2601 26.3257 17.6635 26.2153C18.0904 26.0999 18.5296 25.9802 18.976 25.8665C20.4193 26.7844 21.9714 27.3831 23.4851 27.6028C24.7601 27.7883 25.8924 27.6807 26.6589 27.2811C27.3486 26.9219 27.3866 26.3676 27.3706 26.1461ZM30.4755 36.2428C30.4755 38.3932 28.5802 38.5258 28.1978 38.5301H3.74486C1.60224 38.5301 1.47322 36.6218 1.46913 36.2428L1.46884 3.75642C1.46884 1.6039 3.36763 1.4734 3.74457 1.46908H20.263L20.2718 1.4778V7.92396C20.2718 9.21763 21.0539 11.6669 24.0158 11.6669H30.4203L30.4753 11.7218L30.4755 36.2428ZM28.9572 10.1976H24.0169C21.8749 10.1976 21.7453 8.29969 21.7424 7.92417V2.95307L28.9572 10.1976ZM31.9447 36.2428V11.1157L21.7424 0.871022V0.823357H21.6936L20.8742 0H3.74491C2.44954 0 0 0.785336 0 3.75711V36.2435C0 37.5427 0.782956 40 3.74491 40H28.2001C29.4952 39.9997 31.9447 39.2143 31.9447 36.2428Z" fill="#EB5757"></path> </g></svg>
56
56
  </div>
57
- <p className="text-sm" style={{ maxWidth: '70%', wordWrap: 'break-word', overflowWrap: 'break-word' }} onClick={() => setVisible(true)}>
57
+ <p className="text-sm" style={{ cursor: 'pointer', maxWidth: '70%', wordWrap: 'break-word', overflowWrap: 'break-word' }} onClick={() => setVisible(true)}>
58
58
  {fileName}
59
59
  </p>
60
60
  </div>
61
- <Dialog header="PDF Preview" visible={visible} style={{ width: "" }} onHide={() => setVisible(false)} modal>
61
+ <Dialog header={fileName} visible={visible} style={{ width: "" }} onHide={() => setVisible(false)} modal>
62
62
  <Document file={url}>
63
63
  <Page pageNumber={1} />
64
64
  </Document>
65
65
  </Dialog>
66
- </>
66
+ </div>
67
67
  )}
68
68
  {/* Excel or Other Files - Show Download Icon */}
69
69
  {mimeType && (mimeType.includes("excel") || mimeType.includes("spreadsheet")) && (
70
- <div className='flex align-items-end gap-2 my-2'>
70
+ <div className='flex align-items-end gap-2 my-2' onClick={(e) => e.stopPropagation()}>
71
71
  <a href={url} download target="_blank" rel="noopener noreferrer">
72
72
  <svg fill="#45B058" height="36px" width="36px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"> <g> <g> <g> <path d="M447.168,134.56c-0.535-1.288-1.318-2.459-2.304-3.445l-128-128c-2.003-1.988-4.709-3.107-7.531-3.115H74.667 C68.776,0,64,4.776,64,10.667v490.667C64,507.224,68.776,512,74.667,512h362.667c5.891,0,10.667-4.776,10.667-10.667V138.667 C447.997,137.256,447.714,135.86,447.168,134.56z M320,36.416L411.584,128H320V36.416z M426.667,490.667H85.333V21.333h213.333 v117.333c0,5.891,4.776,10.667,10.667,10.667h117.333V490.667z"></path> <path d="M128,181.333v256c0,5.891,4.776,10.667,10.667,10.667h234.667c5.891,0,10.667-4.776,10.667-10.667v-256 c0-5.891-4.776-10.667-10.667-10.667H138.667C132.776,170.667,128,175.442,128,181.333z M320,192h42.667v42.667H320V192z M320,256h42.667v42.667H320V256z M320,320h42.667v42.667H320V320z M320,384h42.667v42.667H320V384z M213.333,192h85.333v42.667 h-85.333V192z M213.333,256h85.333v42.667h-85.333V256z M213.333,320h85.333v42.667h-85.333V320z M213.333,384h85.333v42.667 h-85.333V384z M149.333,192H192v42.667h-42.667V192z M149.333,256H192v42.667h-42.667V256z M149.333,320H192v42.667h-42.667V320z M149.333,384H192v42.667h-42.667V384z"></path> </g> </g> </g> </g></svg>
73
73
  </a>
@@ -84,7 +84,7 @@ const SolidMediaSingleKanbanField = ({ solidKanbanViewMetaData, fieldMetadata, f
84
84
  !mimeType.includes("pdf") &&
85
85
  !mimeType.includes("excel") &&
86
86
  !mimeType.includes("spreadsheet") && (
87
- <div className='flex align-items-end gap-2 my-2'>
87
+ <div className='flex align-items-end gap-2 my-2' onClick={(e) => e.stopPropagation()}>
88
88
  <a href={url} download target="_blank" rel="noopener noreferrer">
89
89
  <svg width="36px" height="36px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#722ED1" stroke="#722ED1" stroke-width="0.00024000000000000003"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"><path d="M3 23h18V6.709L15.29 1H3zM15 2h.2L20 6.8V7h-5zM4 2h10v6h6v14H4z"></path><path fill="none" d="M0 0h24v24H0z"></path></g></svg>
90
90
  </a>