@solidstarters/solid-core-ui 1.1.72 → 1.1.74

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 (58) hide show
  1. package/dist/components/common/SolidBreadcrumb.d.ts.map +1 -1
  2. package/dist/components/common/SolidBreadcrumb.js +5 -3
  3. package/dist/components/common/SolidBreadcrumb.js.map +1 -1
  4. package/dist/components/common/SolidBreadcrumb.tsx +5 -3
  5. package/dist/components/core/common/SolidCreateButton.d.ts +1 -1
  6. package/dist/components/core/common/SolidCreateButton.d.ts.map +1 -1
  7. package/dist/components/core/common/SolidCreateButton.js +3 -4
  8. package/dist/components/core/common/SolidCreateButton.js.map +1 -1
  9. package/dist/components/core/common/SolidCreateButton.tsx +3 -6
  10. package/dist/components/core/form/SolidFormActionHeader.d.ts +2 -0
  11. package/dist/components/core/form/SolidFormActionHeader.d.ts.map +1 -0
  12. package/dist/components/core/form/SolidFormActionHeader.js +66 -0
  13. package/dist/components/core/form/SolidFormActionHeader.js.map +1 -0
  14. package/dist/components/core/form/SolidFormActionHeader.tsx +216 -0
  15. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  16. package/dist/components/core/form/SolidFormView.js +13 -76
  17. package/dist/components/core/form/SolidFormView.js.map +1 -1
  18. package/dist/components/core/form/SolidFormView.tsx +26 -249
  19. package/dist/components/core/list/SolidEmptyListViewPlaceholder.d.ts +2 -0
  20. package/dist/components/core/list/SolidEmptyListViewPlaceholder.d.ts.map +1 -0
  21. package/dist/components/core/list/SolidEmptyListViewPlaceholder.js +16 -0
  22. package/dist/components/core/list/SolidEmptyListViewPlaceholder.js.map +1 -0
  23. package/dist/components/core/list/SolidEmptyListViewPlaceholder.tsx +41 -0
  24. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  25. package/dist/components/core/list/SolidListView.js +15 -3
  26. package/dist/components/core/list/SolidListView.js.map +1 -1
  27. package/dist/components/core/list/SolidListView.tsx +24 -4
  28. package/dist/components/core/list/SolidListViewColumn.d.ts.map +1 -1
  29. package/dist/components/core/list/SolidListViewColumn.js +3 -0
  30. package/dist/components/core/list/SolidListViewColumn.js.map +1 -1
  31. package/dist/components/core/list/SolidListViewColumn.tsx +3 -0
  32. package/dist/components/core/list/SolidListViewShimmerLoading.d.ts +2 -0
  33. package/dist/components/core/list/SolidListViewShimmerLoading.d.ts.map +1 -0
  34. package/dist/components/core/list/SolidListViewShimmerLoading.js +7 -0
  35. package/dist/components/core/list/SolidListViewShimmerLoading.js.map +1 -0
  36. package/dist/components/core/list/SolidListViewShimmerLoading.tsx +77 -0
  37. package/dist/components/core/list/widgets/SolidShortTextAvatarWidget.d.ts.map +1 -1
  38. package/dist/components/core/list/widgets/SolidShortTextAvatarWidget.js +0 -1
  39. package/dist/components/core/list/widgets/SolidShortTextAvatarWidget.js.map +1 -1
  40. package/dist/components/core/list/widgets/SolidShortTextAvatarWidget.tsx +0 -1
  41. package/dist/components/layout/AppSidebar.js +1 -1
  42. package/dist/components/layout/AppSidebar.js.map +1 -1
  43. package/dist/components/layout/AppSidebar.tsx +2 -2
  44. package/dist/resources/globals.css +78 -1
  45. package/dist/resources/solid-primereact.css +1 -1
  46. package/package.json +1 -1
  47. package/src/components/common/SolidBreadcrumb.tsx +5 -3
  48. package/src/components/core/common/SolidCreateButton.tsx +3 -6
  49. package/src/components/core/form/SolidFormActionHeader.tsx +216 -0
  50. package/src/components/core/form/SolidFormView.tsx +26 -249
  51. package/src/components/core/list/SolidEmptyListViewPlaceholder.tsx +41 -0
  52. package/src/components/core/list/SolidListView.tsx +24 -4
  53. package/src/components/core/list/SolidListViewColumn.tsx +3 -0
  54. package/src/components/core/list/SolidListViewShimmerLoading.tsx +77 -0
  55. package/src/components/core/list/widgets/SolidShortTextAvatarWidget.tsx +0 -1
  56. package/src/components/layout/AppSidebar.tsx +2 -2
  57. package/src/resources/globals.css +78 -1
  58. package/src/resources/solid-primereact.css +1 -1
@@ -3112,7 +3112,84 @@ flex-shrink: 0; */
3112
3112
  }
3113
3113
 
3114
3114
  .solid-global-search-element input {
3115
-
3116
3115
  min-width: 300px;
3116
+ }
3117
+
3118
+ .solid-empty-listview-placeholder-container {
3119
+ border-top: 1px solid var(--primary-light-color) !important;
3120
+ height: calc(100vh - 54px);
3121
+ background-color: var(--solid-list-view-placeholder);
3122
+ display: flex;
3123
+ flex-direction: column;
3124
+ align-items: center;
3125
+ justify-content: center;
3126
+ gap: 12px;
3127
+ }
3128
+
3129
+ .solid-list-skeleton-wrapper {
3130
+ height: calc(100vh - 60px);
3131
+ display: flex;
3132
+ flex-direction: column;
3133
+ justify-content: space-between;
3134
+ }
3135
+
3136
+ .solid-list-skeleton-col-1 {
3137
+ width: 50px;
3138
+ }
3139
+
3140
+ .solid-list-skeleton-col-2 {
3141
+ width: 120px;
3142
+ }
3143
+
3144
+ .solid-list-skeleton-col-8 {
3145
+ width: 50px;
3146
+ }
3147
+
3148
+ .solid-list-skeleton-col-3,
3149
+ .solid-list-skeleton-col-4,
3150
+ .solid-list-skeleton-col-5,
3151
+ .solid-list-skeleton-col-6 {
3152
+ width: auto;
3153
+ }
3154
+
3155
+ .solid-list-skeleton-header th {
3156
+ border-top: 1px solid #CED0D6;
3157
+ border-bottom: 1px solid #CED0D6;
3158
+ text-align: left;
3159
+ padding: 8px 15px;
3160
+ height: 45px;
3161
+ position: relative;
3162
+ }
3163
+
3164
+ .solid-list-skeleton-header th::after {
3165
+ content: '';
3166
+ position: absolute;
3167
+ right: 0;
3168
+ top: 50%;
3169
+ transform: translateY(-50%);
3170
+ height: 60%;
3171
+ width: 0.0625rem;
3172
+ background-color: #D8E2EA
3173
+ }
3174
+
3175
+ .solid-list-skeleton-row td {
3176
+ border-bottom: 1px solid rgba(216, 226, 234, 0.40);
3177
+ padding: 8px 15px;
3178
+ height: 45px;
3179
+ vertical-align: middle;
3180
+ }
3117
3181
 
3182
+ .solid-list-skeleton-row td .p-skeleton {
3183
+ height: 1rem;
3184
+ /* Set skeleton height to 0.75rem */
3185
+ }
3186
+
3187
+ .solid-list-skeleton-footer {
3188
+ border-top: 1px solid rgba(216, 226, 234, 0.40);
3189
+ padding: 20px;
3190
+ }
3191
+
3192
+ .solid-sidebar-menuitems-wrapper {
3193
+ height: calc(100vh - 64px);
3194
+ overflow-y: auto;
3118
3195
  }
@@ -1312,7 +1312,7 @@
1312
1312
  }
1313
1313
 
1314
1314
  .p-datatable .p-paginator-bottom {
1315
- border-width: 1px 0 1px 0;
1315
+ border-width: 1px 0 0 0;
1316
1316
  border-radius: 0;
1317
1317
  }
1318
1318
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidstarters/solid-core-ui",
3
- "version": "1.1.72",
3
+ "version": "1.1.74",
4
4
  "scripts": {
5
5
  "prebuild": "npm run copy-resources && npm run copy-styles",
6
6
  "build": "tsc && tsc-alias",
@@ -36,8 +36,10 @@ export const SolidBreadcrumb = (props: Props) => {
36
36
 
37
37
  useEffect(() => {
38
38
  if (segments.length === 6 && segments[4] === "form" && userKeyFieldValue && !queryUserKeyField) {
39
- const newUrl = `${pathname}?userKeyField=${encodeURIComponent(userKeyFieldValue)}`;
40
- router.replace(newUrl, { scroll: false });
39
+ const params = new URLSearchParams(searchParams.toString());
40
+ params.set("userKeyField", userKeyFieldValue);
41
+ const newUrl = `${pathname}?${params.toString()}`;
42
+ router.push(newUrl, { scroll: false });
41
43
  }
42
44
  }, [pathname, userKeyFieldValue, queryUserKeyField, router]);
43
45
 
@@ -81,7 +83,7 @@ export const SolidBreadcrumb = (props: Props) => {
81
83
 
82
84
  if (segments.length === 6 && segments[4] === "form") {
83
85
  breadcrumbItems.push({
84
- label: queryUserKeyField || segments[5],
86
+ label: queryUserKeyField ? decodeURIComponent(queryUserKeyField) : segments[5],
85
87
  });
86
88
  }
87
89
  }
@@ -1,19 +1,16 @@
1
1
  'use client';
2
2
  import Link from 'next/link';
3
- import { usePathname, useRouter } from 'next/navigation';
3
+ import { usePathname } from 'next/navigation';
4
4
  import { Button } from 'primereact/button';
5
5
 
6
- export const SolidCreateButton = ({ url }: any) => {
7
- const router = useRouter();
6
+ export const SolidCreateButton = ({ url, title }: any) => {
8
7
  const pathName = usePathname();
9
-
10
8
  const createPath = url ? url : pathName.split('/').slice(0, -1).join('/') + '/form/new';
11
9
 
12
-
13
10
  return (
14
11
  <div>
15
12
  <Link href={createPath}>
16
- <Button type="button" icon="pi pi-plus" label="Add" size='small'></Button>
13
+ <Button type="button" icon="pi pi-plus" label={`Add ${title ? title : ''}`} size='small'></Button>
17
14
  </Link>
18
15
  </div>
19
16
  )
@@ -0,0 +1,216 @@
1
+ import { BackButton } from "@/components/common/BackButton";
2
+ import { SolidCancelButton } from "@/components/common/CancelButton";
3
+ import { SolidFormHeader } from "@/components/common/SolidFormHeader";
4
+ import { createPermission, deletePermission, updatePermission } from "@/helpers/permissions";
5
+ import { usePathname, useRouter, useSearchParams } from "next/navigation";
6
+ import { Button } from "primereact/button";
7
+ import { OverlayPanel } from "primereact/overlaypanel";
8
+ import { useRef } from "react";
9
+
10
+ export const SolidFormActionHeader = ({ formik, params, actionsAllowed, formViewLayout, solidView, solidFormViewMetaData, initialEntityData, setDeleteDialogVisible, setLayoutDialogVisible, setRedirectToList, viewMode, setViewMode }: any) => {
11
+ const router = useRouter();
12
+ const pathname = usePathname();
13
+ const searchParams = useSearchParams();
14
+ const op = useRef(null);
15
+
16
+ const createHeaderTitle = `Create ${solidView.model.displayName}`;
17
+ const editHeaderTitle = `Edit ${solidView.model.displayName}`;
18
+
19
+ const updateViewMode = (newMode: "view" | "edit") => {
20
+ setViewMode(newMode);
21
+ const params = new URLSearchParams(searchParams.toString());
22
+ params.set("viewMode", newMode);
23
+ router.push(`${pathname}?${params.toString()}`, { scroll: false });
24
+ };
25
+ const FormActionDropdown = () => {
26
+ return (
27
+ <div>
28
+ <Button
29
+ outlined
30
+ severity="secondary"
31
+ type="button"
32
+ icon={'pi pi-cog'}
33
+ size="small"
34
+ className="surface-card p-0"
35
+ style={{
36
+ height: 33.06,
37
+ width: 33.06
38
+ }}
39
+ onClick={(e) =>
40
+ // @ts-ignore
41
+ op.current.toggle(e)
42
+ }
43
+ />
44
+ <OverlayPanel ref={op} className="solid-custom-overlay">
45
+ <div className="flex flex-column gap-1 p-1">
46
+ {/* <Button
47
+ text
48
+ type="button"
49
+ className="w-8rem text-left gap-2 text-color"
50
+ label="Duplicate"
51
+ size="small"
52
+ iconPos="left"
53
+ icon={<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
54
+ <path d="M6 11.9997C5.63333 11.9997 5.31944 11.8691 5.05833 11.608C4.79722 11.3469 4.66667 11.033 4.66667 10.6663V2.66634C4.66667 2.29967 4.79722 1.98579 5.05833 1.72467C5.31944 1.46356 5.63333 1.33301 6 1.33301H12C12.3667 1.33301 12.6806 1.46356 12.9417 1.72467C13.2028 1.98579 13.3333 2.29967 13.3333 2.66634V10.6663C13.3333 11.033 13.2028 11.3469 12.9417 11.608C12.6806 11.8691 12.3667 11.9997 12 11.9997H6ZM6 10.6663H12V2.66634H6V10.6663ZM3.33333 14.6663C2.96667 14.6663 2.65278 14.5358 2.39167 14.2747C2.13056 14.0136 2 13.6997 2 13.333V3.99967H3.33333V13.333H10.6667V14.6663H3.33333Z" fill="black" fill-opacity="0.88" />
55
+ </svg>}
56
+ /> */}
57
+ {params.embeded !== true &&
58
+ params.id !== "new" &&
59
+ actionsAllowed.includes(`${deletePermission(params.modelName)}`) &&
60
+ !formViewLayout.attrs.readonly &&
61
+ <Button
62
+ text
63
+ type="button"
64
+ className="w-8rem text-left gap-2"
65
+ label="Delete"
66
+ size="small"
67
+ iconPos="left"
68
+ severity="danger"
69
+ icon={'pi pi-trash'}
70
+ onClick={() => setDeleteDialogVisible(true)}
71
+ />
72
+ }
73
+ <Button
74
+ text
75
+ type="button"
76
+ className="w-8rem text-left gap-2 purple-200"
77
+ label="Layout"
78
+ size="small"
79
+ iconPos="left"
80
+ severity="contrast"
81
+ icon={'pi pi-objects-column'}
82
+ onClick={() => setLayoutDialogVisible(true)}
83
+ />
84
+ </div>
85
+ </OverlayPanel>
86
+ </div>
87
+ )
88
+ }
89
+
90
+ return (
91
+ <>
92
+ <div className="solid-form-header">
93
+ {params.id === "new" ? (
94
+ <>
95
+ <div className="flex align-items-center gap-3">
96
+ {params.embeded !== true && <BackButton />}
97
+ <div className="form-wrapper-title"> {createHeaderTitle}</div>
98
+ </div>
99
+ <div className="gap-3 flex">
100
+ {params.embeded !== true &&
101
+ actionsAllowed.includes(`${createPermission(params.modelName)}`) &&
102
+ !formViewLayout.attrs.readonly &&
103
+ formik.dirty &&
104
+ <div>
105
+ <Button
106
+ label="Save"
107
+ size="small"
108
+ type="submit"
109
+ />
110
+ </div>
111
+ }
112
+ {params.embeded == true &&
113
+ actionsAllowed.includes(`${createPermission(params.modelName)}`) &&
114
+ !formViewLayout.attrs.readonly &&
115
+ formik.dirty &&
116
+ <div>
117
+ <Button
118
+ label="Save"
119
+ size="small"
120
+ onClick={() => {
121
+ setRedirectToList(false);
122
+ }}
123
+ type="submit"
124
+ />
125
+ </div>
126
+ }
127
+ {params.embeded == true &&
128
+ <Button outlined size="small" type="button" label="Close" onClick={() => params.handlePopupClose()} className='bg-primary-reverse' />
129
+
130
+ }
131
+ {params.embeded !== true &&
132
+ <SolidCancelButton />
133
+ }
134
+ <FormActionDropdown />
135
+ </div>
136
+ </>
137
+ ) : (
138
+ <>
139
+ <div className="flex align-items-center gap-3">
140
+ {params.embeded !== true && <BackButton />}
141
+ <div className="form-wrapper-title"> {editHeaderTitle}</div>
142
+ </div>
143
+ <div className="gap-3 flex">
144
+ {params.embeded !== true && viewMode === "view" &&
145
+ <div>
146
+ <Button
147
+ label="Edit"
148
+ size="small"
149
+ onClick={() => updateViewMode("edit")}
150
+ type="button"
151
+ />
152
+ </div>
153
+ }
154
+
155
+ {params.embeded !== true &&
156
+ actionsAllowed.includes(`${updatePermission(params.modelName)}`) &&
157
+ !formViewLayout.attrs.readonly &&
158
+ formik.dirty &&
159
+ <div>
160
+ <Button
161
+ label="Save"
162
+ size="small"
163
+ type="submit"
164
+ />
165
+ </div>
166
+ }
167
+
168
+ {/* Inline */}
169
+ {params.embeded == true &&
170
+ actionsAllowed.includes(`${updatePermission(params.modelName)}`) &&
171
+ !formViewLayout.attrs.readonly &&
172
+ formik.dirty &&
173
+ <div>
174
+ <Button
175
+ label="Save"
176
+ size="small"
177
+ type="submit"
178
+ />
179
+ </div>
180
+ }
181
+ {params.embeded == true &&
182
+ actionsAllowed.includes(`${deletePermission(params.modelName)}`) &&
183
+ !formViewLayout.attrs.readonly &&
184
+ <div>
185
+ <Button
186
+ size="small"
187
+ type="button"
188
+ label="Delete"
189
+ severity="danger"
190
+ onClick={() => setDeleteDialogVisible(true)}
191
+ />
192
+ </div>
193
+ }
194
+ {params.embeded == true &&
195
+ <Button outlined size="small" type="button" label="Close" onClick={() => params.handlePopupClose()} className='bg-primary-reverse' />
196
+
197
+ }
198
+ {params.embeded !== true &&
199
+ <SolidCancelButton />
200
+ }
201
+ <FormActionDropdown />
202
+ </div>
203
+ </>
204
+ )}
205
+ </div>
206
+ {params.embeded !== true &&
207
+ <SolidFormHeader
208
+ solidFormViewMetaData={solidFormViewMetaData}
209
+ initialEntityData={initialEntityData}
210
+ modelName={params.modelName}
211
+ id={params.id}
212
+ />
213
+ }
214
+ </>
215
+ )
216
+ }