@solidstarters/solid-core-ui 1.1.50 → 1.1.52

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 (35) hide show
  1. package/dist/components/core/common/SolidGlobalSearchElement.d.ts +2 -2
  2. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  3. package/dist/components/core/common/SolidGlobalSearchElement.js +50 -37
  4. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  5. package/dist/components/core/form/fields/SolidShortTextField.d.ts.map +1 -1
  6. package/dist/components/core/form/fields/SolidShortTextField.js +1 -1
  7. package/dist/components/core/form/fields/SolidShortTextField.js.map +1 -1
  8. package/dist/components/core/kanban/KanbanBoard.d.ts +1 -1
  9. package/dist/components/core/kanban/KanbanBoard.d.ts.map +1 -1
  10. package/dist/components/core/kanban/KanbanBoard.js +2 -2
  11. package/dist/components/core/kanban/KanbanBoard.js.map +1 -1
  12. package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
  13. package/dist/components/core/kanban/KanbanCard.js +6 -2
  14. package/dist/components/core/kanban/KanbanCard.js.map +1 -1
  15. package/dist/components/core/kanban/KanbanColumn.d.ts +1 -1
  16. package/dist/components/core/kanban/KanbanColumn.d.ts.map +1 -1
  17. package/dist/components/core/kanban/KanbanColumn.js +2 -2
  18. package/dist/components/core/kanban/KanbanColumn.js.map +1 -1
  19. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  20. package/dist/components/core/kanban/SolidKanbanView.js +19 -2
  21. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  22. package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts +2 -0
  23. package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts.map +1 -0
  24. package/dist/components/core/kanban/SolidKanbanViewConfigure.js +66 -0
  25. package/dist/components/core/kanban/SolidKanbanViewConfigure.js.map +1 -0
  26. package/dist/resources/globals.css +9 -1
  27. package/package.json +1 -1
  28. package/src/components/core/common/SolidGlobalSearchElement.tsx +102 -65
  29. package/src/components/core/form/fields/SolidShortTextField.tsx +0 -1
  30. package/src/components/core/kanban/KanbanBoard.tsx +2 -1
  31. package/src/components/core/kanban/KanbanCard.tsx +6 -1
  32. package/src/components/core/kanban/KanbanColumn.tsx +2 -2
  33. package/src/components/core/kanban/SolidKanbanView.tsx +46 -27
  34. package/src/components/core/kanban/SolidKanbanViewConfigure.tsx +145 -0
  35. package/src/resources/globals.css +9 -1
@@ -64,17 +64,17 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
64
64
 
65
65
 
66
66
 
67
- const pushFiltersToRouter = (filterQueryString: any) => {
68
- router.push(`?${filterQueryString}`, undefined, { shallow: true });
69
- };
70
-
71
- useEffect(() => {
72
- if (filterQueryString) {
73
- pushFiltersToRouter(filterQueryString);
74
- }
75
- }, [filterQueryString]);
76
-
77
-
67
+ const pushFiltersToRouter = (filterQueryString: any) => {
68
+ router.push(`?${filterQueryString}`, undefined, { shallow: true });
69
+ };
70
+
71
+ useEffect(() => {
72
+ if (filterQueryString) {
73
+ pushFiltersToRouter(filterQueryString);
74
+ }
75
+ }, [filterQueryString]);
76
+
77
+
78
78
 
79
79
  useEffect(() => {
80
80
  const fetchPermissions = async () => {
@@ -304,10 +304,10 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
304
304
  let queryString = qs.stringify(queryData, {
305
305
  encodeValuesOnly: true
306
306
  });
307
- if(searchParams) {
307
+ if (searchParams) {
308
308
  queryString = searchParams;
309
309
  setFilterQueryString(searchParams)
310
- }else{
310
+ } else {
311
311
  setFilterQueryString(queryString)
312
312
  }
313
313
  triggerGetSolidEntities(queryString);
@@ -649,6 +649,22 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
649
649
  // }
650
650
  }
651
651
 
652
+
653
+ useEffect(() => {
654
+ if (solidKanbanViewMetaData) {
655
+ 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";
656
+ const editActionUrl = solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.editAction && solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.editAction?.type === "custom" ? solidKanbanViewMetaData?.data?.solidView?.layout?.attrs?.editAction?.customComponent : "form";
657
+ 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 } });
658
+ setViewModes(viewModes);
659
+ if (createActionUrl) {
660
+ setCreateButtonUrl(createActionUrl)
661
+ }
662
+ if (editActionUrl) {
663
+ setEditButtonUrl(editActionUrl)
664
+ }
665
+ }
666
+ }, [solidKanbanViewMetaData])
667
+
652
668
  const kanbanViewTitle = solidKanbanViewMetaData?.data?.solidView?.displayName
653
669
 
654
670
  return (
@@ -675,25 +691,28 @@ export const SolidKanbanView = (params: SolidKanbanViewParams) => {
675
691
  className="small-button"
676
692
  severity="danger"
677
693
  />}
678
- {/* <SolidListViewConfigure
679
- setShowArchived={setShowArchived}
680
- showArchived={showArchived}
681
- viewData={solidKanbanViewMetaData}
682
- sizeOptions={sizeOptions}
683
- setSize={setSize}
684
- size={size}
685
- viewModes={viewModes}
686
- params={params}
687
- actionsAllowed={actionsAllowed}
688
- selectedRecords={selectedRecords}
689
- setDialogVisible={setDialogVisible}
690
- ></SolidListViewConfigure> */}
694
+ <Button
695
+ type="button"
696
+ size="small"
697
+ icon="pi pi-refresh"
698
+ severity="secondary"
699
+ outlined
700
+ onClick={() => {
701
+ window.location.reload()
702
+ }}
703
+ />
704
+ <SolidKanbanViewConfigure
705
+ solidKanbanViewMetaData={solidKanbanViewMetaData}
706
+ actionsAllowed={actionsAllowed}
707
+ viewModes={viewModes}
708
+ // setLayoutDialogVisible={setLayoutDialogVisible}
709
+ />
691
710
  {/* <SolidConfigureLayoutElement></SolidConfigureLayoutElement> */}
692
711
  </div>
693
712
  </div>
694
713
  <style>{`.p-datatable .p-datatable-loading-overlay {background-color: rgba(0, 0, 0, 0.0);}`}</style>
695
714
  {solidKanbanViewMetaData && kanbanViewData &&
696
- <KanbanBoard groupedView={groupedView} kanbanViewData={kanbanViewData} solidKanbanViewMetaData={solidKanbanViewMetaData?.data} setKanbanViewData={setKanbanViewData} handleLoadMore={handleLoadMore} onDragEnd={onDragEnd} handleSwimLinPagination={handleSwimLinPagination} setLightboxUrls={setLightboxUrls} setOpenLightbox={setOpenLightbox} ></KanbanBoard>
715
+ <KanbanBoard groupedView={groupedView} kanbanViewData={kanbanViewData} solidKanbanViewMetaData={solidKanbanViewMetaData?.data} setKanbanViewData={setKanbanViewData} handleLoadMore={handleLoadMore} onDragEnd={onDragEnd} handleSwimLinPagination={handleSwimLinPagination} setLightboxUrls={setLightboxUrls} setOpenLightbox={setOpenLightbox} editButtonUrl={editButtonUrl}></KanbanBoard>
697
716
  }
698
717
 
699
718
  <Dialog
@@ -0,0 +1,145 @@
1
+ "use client"
2
+ import { usePathname, useRouter } from 'next/navigation';
3
+ import { Accordion, AccordionTab } from 'primereact/accordion';
4
+ import { Button } from 'primereact/button';
5
+ import { Divider } from 'primereact/divider';
6
+ import { OverlayPanel } from 'primereact/overlaypanel';
7
+ import { RadioButton } from 'primereact/radiobutton';
8
+ import React, { useEffect, useRef, useState } from 'react'
9
+
10
+ export const SolidKanbanViewConfigure = ({ solidKanbanViewMetaData, actionsAllowed, viewModes }: any) => {
11
+ const op = useRef(null);
12
+ const customizeLayout = useRef<OverlayPanel | null>(null);
13
+ const pathname = usePathname();
14
+ const router = useRouter();
15
+ const [view, setView] = useState<string>("");
16
+
17
+ const handleViewChange = (newView: string) => {
18
+ if (view === newView) return; // Prevent unnecessary updates
19
+ const pathSegments = pathname.split('/').filter(Boolean);
20
+ pathSegments[pathSegments.length - 1] = newView; // Replace the last part with new view
21
+ const newPath = '/' + pathSegments.join('/');
22
+ router.push(newPath);
23
+ };
24
+
25
+ useEffect(() => {
26
+ if (typeof pathname === 'string') {
27
+ const pathSegments = pathname.split('/').filter(Boolean);
28
+ if (pathSegments.length > 0) {
29
+ setView(pathSegments[pathSegments.length - 1]);
30
+ }
31
+ }
32
+ }, [])
33
+
34
+
35
+ const [isOverlayOpen, setIsOverlayOpen] = useState(false);
36
+ useEffect(() => {
37
+ const handleClickOutside = (event: MouseEvent) => {
38
+ if (
39
+ customizeLayout.current &&
40
+ !customizeLayout.current.getElement()?.contains(event.target as Node)
41
+ ) {
42
+ setIsOverlayOpen(false);
43
+ }
44
+ };
45
+
46
+ if (isOverlayOpen) {
47
+ document.addEventListener("click", handleClickOutside);
48
+ } else {
49
+ document.removeEventListener("click", handleClickOutside);
50
+ }
51
+
52
+ return () => document.removeEventListener("click", handleClickOutside);
53
+ }, [isOverlayOpen])
54
+
55
+ return (
56
+ <div className="position-relative">
57
+ <Button
58
+ type="button"
59
+ size="small"
60
+ icon="pi pi-cog"
61
+ severity="secondary"
62
+ outlined
63
+ // @ts-ignore
64
+ onClick={(e) => op.current.toggle(e)}
65
+ />
66
+ <OverlayPanel ref={op}>
67
+ <div className="p-2">
68
+ <div className="flex flex-column">
69
+ <Button text icon='pi pi-download' label="Import" size="small" severity="secondary" className="text-left gap-2 text-base" />
70
+ <Button text icon='pi pi-upload' label="Export" size="small" severity="secondary" className="text-left gap-2 text-base" />
71
+ {/* <Button
72
+ text
73
+ type="button"
74
+ className="w-8rem text-left gap-2 purple-200"
75
+ label="Layout"
76
+ size="small"
77
+ iconPos="left"
78
+ severity="contrast"
79
+ icon={'pi pi-objects-column'}
80
+ onClick={() => setLayoutDialogVisible(true)}
81
+ /> */}
82
+ </div>
83
+ </div>
84
+ <Divider className="m-0" />
85
+ <div className="p-2 relative flex flex-column gap-1">
86
+ <Button
87
+ icon='pi pi-sliders-h'
88
+ label="Customize Layout"
89
+ severity={isOverlayOpen ? undefined : "secondary"}
90
+ size="small"
91
+ text={isOverlayOpen ? false : true}
92
+ className="text-left gap-2 w-full text-base"
93
+ // @ts-ignore
94
+ onClick={(e) => {
95
+ customizeLayout.current?.toggle(e);
96
+ setIsOverlayOpen((prev) => !prev); // ✅ Ensure state updates when toggled
97
+ }}
98
+ >
99
+ <i className="pi pi-chevron-right text-sm"></i>
100
+ </Button>
101
+ <OverlayPanel ref={customizeLayout} className="customize-layout-panel" style={{ minWidth: 250 }}
102
+ onShow={() => setIsOverlayOpen(true)}
103
+ onHide={() => {
104
+ console.log("Overlay closed");
105
+ setTimeout(() => setIsOverlayOpen(false), 50); // ✅ Ensure state updates
106
+ }}
107
+ >
108
+
109
+ <div className="solid-layout-accordion">
110
+ <Accordion expandIcon="pi pi-chevron-down" collapseIcon="pi pi-chevron-up" activeIndex={[0]}>
111
+ {viewModes && viewModes.length > 0 &&
112
+ <AccordionTab header="Switch Type">
113
+ <div className="flex flex-column gap-1 p-1">
114
+ {viewModes.map((option: any) => (
115
+ <div key={option.value} className={`flex align-items-center ${option.value === view ? 'solid-active-view' : 'solid-view'}`}>
116
+ <RadioButton
117
+ inputId={option.value}
118
+ name="views"
119
+ value={option.value}
120
+ // onChange={(e) => router}
121
+ onChange={() => handleViewChange(option.value)}
122
+ checked={option.value === view}
123
+ />
124
+ <label htmlFor={option.value} className="ml-2 flex align-items-center justify-content-between w-full">
125
+ {option.label}
126
+ {/* <Image
127
+ src={option.image}
128
+ alt={option.value}
129
+ fill
130
+ className='relative row-spacing-img'
131
+ /> */}
132
+ </label>
133
+ </div>
134
+ ))}
135
+ </div>
136
+ </AccordionTab>
137
+ }
138
+ </Accordion>
139
+ </div>
140
+ </OverlayPanel>
141
+ </div>
142
+ </OverlayPanel>
143
+ </div>
144
+ )
145
+ }
@@ -2484,6 +2484,7 @@ li.header-li-px {
2484
2484
 
2485
2485
  .custom-filter-chip-type {
2486
2486
  display: flex;
2487
+ align-items: center;
2487
2488
  padding: 0.25rem 0.5rem !important;
2488
2489
  color: var(--primary-color) !important;
2489
2490
  font-size: 0.875rem !important;
@@ -2494,11 +2495,12 @@ li.header-li-px {
2494
2495
 
2495
2496
  .search-filter-chip-type {
2496
2497
  display: flex;
2498
+ align-items: center;
2497
2499
  font-size: 0.875rem !important;
2498
2500
  background: #FBF5FF;
2499
2501
  border-radius: 0.375rem;
2500
2502
  padding: 0.417rem 0.5rem !important;
2501
- gap: 8px;
2503
+ gap: 4px;
2502
2504
  }
2503
2505
 
2504
2506
  .solid-global-search-element li {}
@@ -2995,6 +2997,12 @@ flex-shrink: 0; */
2995
2997
  width: 100%;
2996
2998
  border-radius: 8px;
2997
2999
  max-height: 120px;
3000
+ object-fit: contain;
3001
+ box-shadow: rgba(0, 0, 0, 0.05) 0px 1px 2px 0px;
3002
+ }
3003
+
3004
+ .kanban-image-preview:hover {
3005
+ box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.06) 0px 2px 4px -1px;
2998
3006
  }
2999
3007
 
3000
3008
  .solid-kanban-board-wrapper {