@solidxai/core-ui 0.1.14-beta.4 → 0.1.14-beta.9

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 (176) hide show
  1. package/dist/components/auth/AuthLayout.js +1 -1
  2. package/dist/components/auth/AuthLayout.js.map +1 -1
  3. package/dist/components/auth/AuthLayout.tsx +2 -2
  4. package/dist/components/common/SettingsComponent.module.css +4 -1
  5. package/dist/components/common/SolidFieldTooltip.d.ts.map +1 -1
  6. package/dist/components/common/SolidFieldTooltip.js +1 -1
  7. package/dist/components/common/SolidFieldTooltip.js.map +1 -1
  8. package/dist/components/common/SolidFieldTooltip.tsx +1 -0
  9. package/dist/components/common/SolidFormStepper.d.ts.map +1 -1
  10. package/dist/components/common/SolidFormStepper.js +7 -6
  11. package/dist/components/common/SolidFormStepper.js.map +1 -1
  12. package/dist/components/common/SolidFormStepper.tsx +7 -1
  13. package/dist/components/common/SolidThemeProvider.d.ts.map +1 -1
  14. package/dist/components/common/SolidThemeProvider.js +127 -11
  15. package/dist/components/common/SolidThemeProvider.js.map +1 -1
  16. package/dist/components/common/SolidThemeProvider.tsx +104 -22
  17. package/dist/components/core/card/CardGrid.d.ts +1 -1
  18. package/dist/components/core/card/CardGrid.d.ts.map +1 -1
  19. package/dist/components/core/card/CardGrid.js +2 -2
  20. package/dist/components/core/card/CardGrid.js.map +1 -1
  21. package/dist/components/core/card/CardGrid.tsx +4 -0
  22. package/dist/components/core/card/CardItem.d.ts +2 -0
  23. package/dist/components/core/card/CardItem.d.ts.map +1 -1
  24. package/dist/components/core/card/CardItem.js +4 -3
  25. package/dist/components/core/card/CardItem.js.map +1 -1
  26. package/dist/components/core/card/CardItem.tsx +15 -0
  27. package/dist/components/core/card/SolidCardView.d.ts +28 -1
  28. package/dist/components/core/card/SolidCardView.d.ts.map +1 -1
  29. package/dist/components/core/card/SolidCardView.js +99 -44
  30. package/dist/components/core/card/SolidCardView.js.map +1 -1
  31. package/dist/components/core/card/SolidCardView.tsx +124 -7
  32. package/dist/components/core/card/SolidCardViewConfigure.d.ts +1 -1
  33. package/dist/components/core/card/SolidCardViewConfigure.d.ts.map +1 -1
  34. package/dist/components/core/card/SolidCardViewConfigure.js +15 -6
  35. package/dist/components/core/card/SolidCardViewConfigure.js.map +1 -1
  36. package/dist/components/core/card/SolidCardViewConfigure.tsx +34 -0
  37. package/dist/components/core/card/cardViewRegistry.d.ts +7 -0
  38. package/dist/components/core/card/cardViewRegistry.d.ts.map +1 -0
  39. package/dist/components/core/card/cardViewRegistry.js +17 -0
  40. package/dist/components/core/card/cardViewRegistry.js.map +1 -0
  41. package/dist/components/core/card/cardViewRegistry.ts +23 -0
  42. package/dist/components/core/common/PDFViewer.d.ts +9 -5
  43. package/dist/components/core/common/PDFViewer.d.ts.map +1 -1
  44. package/dist/components/core/common/PDFViewer.js +10 -102
  45. package/dist/components/core/common/PDFViewer.js.map +1 -1
  46. package/dist/components/core/common/PDFViewer.tsx +29 -88
  47. package/dist/components/core/common/SolidCollectionRowActionMenuItems.d.ts +12 -0
  48. package/dist/components/core/common/SolidCollectionRowActionMenuItems.d.ts.map +1 -0
  49. package/dist/components/core/common/SolidCollectionRowActionMenuItems.js +50 -0
  50. package/dist/components/core/common/SolidCollectionRowActionMenuItems.js.map +1 -0
  51. package/dist/components/core/common/SolidCollectionRowActionMenuItems.tsx +91 -0
  52. package/dist/components/core/common/SolidCreateButton.d.ts.map +1 -1
  53. package/dist/components/core/common/SolidCreateButton.js +2 -2
  54. package/dist/components/core/common/SolidCreateButton.js.map +1 -1
  55. package/dist/components/core/common/SolidCreateButton.tsx +22 -2
  56. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  57. package/dist/components/core/common/SolidGlobalSearchElement.js +137 -134
  58. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  59. package/dist/components/core/common/SolidGlobalSearchElement.tsx +127 -119
  60. package/dist/components/core/form/SolidFormActionHeader.d.ts.map +1 -1
  61. package/dist/components/core/form/SolidFormActionHeader.js +21 -21
  62. package/dist/components/core/form/SolidFormActionHeader.js.map +1 -1
  63. package/dist/components/core/form/SolidFormActionHeader.tsx +62 -53
  64. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  65. package/dist/components/core/form/SolidFormView.js +5 -2
  66. package/dist/components/core/form/SolidFormView.js.map +1 -1
  67. package/dist/components/core/form/SolidFormView.tsx +7 -2
  68. package/dist/components/core/kanban/KanbanBoard.d.ts +1 -1
  69. package/dist/components/core/kanban/KanbanBoard.d.ts.map +1 -1
  70. package/dist/components/core/kanban/KanbanBoard.js +2 -2
  71. package/dist/components/core/kanban/KanbanBoard.js.map +1 -1
  72. package/dist/components/core/kanban/KanbanBoard.tsx +3 -1
  73. package/dist/components/core/kanban/KanbanCard.d.ts +2 -0
  74. package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
  75. package/dist/components/core/kanban/KanbanCard.js +4 -2
  76. package/dist/components/core/kanban/KanbanCard.js.map +1 -1
  77. package/dist/components/core/kanban/KanbanCard.tsx +14 -1
  78. package/dist/components/core/kanban/KanbanColumn.d.ts +3 -1
  79. package/dist/components/core/kanban/KanbanColumn.d.ts.map +1 -1
  80. package/dist/components/core/kanban/KanbanColumn.js +2 -2
  81. package/dist/components/core/kanban/KanbanColumn.js.map +1 -1
  82. package/dist/components/core/kanban/KanbanColumn.tsx +4 -2
  83. package/dist/components/core/kanban/SolidKanbanView.d.ts +25 -1
  84. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  85. package/dist/components/core/kanban/SolidKanbanView.js +89 -50
  86. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  87. package/dist/components/core/kanban/SolidKanbanView.tsx +82 -9
  88. package/dist/components/core/kanban/kanbanViewRegistry.d.ts +7 -0
  89. package/dist/components/core/kanban/kanbanViewRegistry.d.ts.map +1 -0
  90. package/dist/components/core/kanban/kanbanViewRegistry.js +17 -0
  91. package/dist/components/core/kanban/kanbanViewRegistry.js.map +1 -0
  92. package/dist/components/core/kanban/kanbanViewRegistry.ts +23 -0
  93. package/dist/components/core/list/PLAN.md +1 -1
  94. package/dist/components/core/list/SolidListView.d.ts +11 -0
  95. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  96. package/dist/components/core/list/SolidListView.js +11 -6
  97. package/dist/components/core/list/SolidListView.js.map +1 -1
  98. package/dist/components/core/list/SolidListView.tsx +88 -45
  99. package/dist/components/core/list/SolidListViewConfigure.js +1 -1
  100. package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
  101. package/dist/components/core/list/SolidListViewConfigure.tsx +1 -1
  102. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.d.ts.map +1 -1
  103. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js +2 -1
  104. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js.map +1 -1
  105. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.tsx +2 -1
  106. package/dist/components/core/model/CreateModel.d.ts.map +1 -1
  107. package/dist/components/core/model/CreateModel.js +2 -1
  108. package/dist/components/core/model/CreateModel.js.map +1 -1
  109. package/dist/components/core/model/CreateModel.tsx +2 -0
  110. package/dist/components/core/model/FieldMetaData.d.ts +1 -1
  111. package/dist/components/core/model/FieldMetaData.d.ts.map +1 -1
  112. package/dist/components/core/model/FieldMetaData.js +8 -8
  113. package/dist/components/core/model/FieldMetaData.js.map +1 -1
  114. package/dist/components/core/model/FieldMetaData.tsx +2 -2
  115. package/dist/components/core/model/FieldMetaDataForm.css +119 -0
  116. package/dist/components/core/model/FieldMetaDataForm.js +1 -1
  117. package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
  118. package/dist/components/core/model/FieldMetaDataForm.tsx +1 -1
  119. package/dist/components/core/module/ModuleMetadataExplorer.css +64 -0
  120. package/dist/components/core/module/ModulePackageDialog.css +117 -12
  121. package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
  122. package/dist/components/core/tree/SolidTreeView.js +6 -3
  123. package/dist/components/core/tree/SolidTreeView.js.map +1 -1
  124. package/dist/components/core/tree/SolidTreeView.tsx +35 -13
  125. package/dist/components/layout/AdminHeaderActions.d.ts.map +1 -1
  126. package/dist/components/layout/AdminHeaderActions.js +15 -10
  127. package/dist/components/layout/AdminHeaderActions.js.map +1 -1
  128. package/dist/components/layout/AdminHeaderActions.tsx +15 -8
  129. package/dist/components/layout/AdminTopHeader.d.ts.map +1 -1
  130. package/dist/components/layout/AdminTopHeader.js +1 -18
  131. package/dist/components/layout/AdminTopHeader.js.map +1 -1
  132. package/dist/components/layout/AdminTopHeader.tsx +3 -21
  133. package/dist/helpers/resolveActiveUserId.d.ts +13 -0
  134. package/dist/helpers/resolveActiveUserId.d.ts.map +1 -0
  135. package/dist/helpers/resolveActiveUserId.js +86 -0
  136. package/dist/helpers/resolveActiveUserId.js.map +1 -0
  137. package/dist/helpers/resolveActiveUserId.ts +90 -0
  138. package/dist/index.d.ts +5 -0
  139. package/dist/index.d.ts.map +1 -1
  140. package/dist/index.js +3 -0
  141. package/dist/index.js.map +1 -1
  142. package/dist/index.ts +5 -0
  143. package/dist/resources/globals.css +15 -0
  144. package/dist/resources/solid-custom.css +18 -1
  145. package/dist/resources/solid-tailwind-generated.css +1 -1
  146. package/dist/resources/themes/solid-dark-enterprise/theme-variables.css +28 -0
  147. package/dist/resources/themes/solid-dark-enterprise/theme.css +926 -0
  148. package/dist/resources/themes/solid-dark-modern/theme-variables.css +27 -0
  149. package/dist/resources/themes/solid-dark-modern/theme.css +600 -0
  150. package/dist/resources/themes/solid-light-enterprise/theme-variables.css +28 -0
  151. package/dist/resources/themes/solid-light-enterprise/theme.css +930 -0
  152. package/dist/resources/themes/solid-light-modern/theme-variables.css +31 -0
  153. package/dist/resources/themes/solid-light-modern/theme.css +1041 -0
  154. package/dist/routes/pages/admin/core/CardPage.d.ts.map +1 -1
  155. package/dist/routes/pages/admin/core/CardPage.js +15 -2
  156. package/dist/routes/pages/admin/core/CardPage.js.map +1 -1
  157. package/dist/routes/pages/admin/core/CardPage.tsx +17 -2
  158. package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
  159. package/dist/routes/pages/admin/core/DashboardPage.js +31 -3
  160. package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
  161. package/dist/routes/pages/admin/core/DashboardPage.tsx +39 -11
  162. package/dist/routes/pages/admin/core/KanbanPage.d.ts.map +1 -1
  163. package/dist/routes/pages/admin/core/KanbanPage.js +15 -2
  164. package/dist/routes/pages/admin/core/KanbanPage.js.map +1 -1
  165. package/dist/routes/pages/admin/core/KanbanPage.tsx +17 -2
  166. package/dist/routes/pages/admin/core/ListPage.d.ts.map +1 -1
  167. package/dist/routes/pages/admin/core/ListPage.js +5 -13
  168. package/dist/routes/pages/admin/core/ListPage.js.map +1 -1
  169. package/dist/routes/pages/admin/core/ListPage.tsx +5 -15
  170. package/dist/theme/theme-registry.d.ts +6 -0
  171. package/dist/theme/theme-registry.d.ts.map +1 -0
  172. package/dist/theme/theme-registry.js +65 -0
  173. package/dist/theme/theme-registry.js.map +1 -0
  174. package/dist/theme/theme-registry.ts +78 -0
  175. package/dist/types/solid-core.d.ts +8 -0
  176. package/package.json +1 -1
@@ -1,114 +1,22 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- var __generator = (this && this.__generator) || function (thisArg, body) {
11
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
- function verb(n) { return function (v) { return step([n, v]); }; }
14
- function step(op) {
15
- if (f) throw new TypeError("Generator is already executing.");
16
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
- if (y = 0, t) op = [op[0] & 2, t.value];
19
- switch (op[0]) {
20
- case 0: case 1: t = op; break;
21
- case 4: _.label++; return { value: op[1], done: false };
22
- case 5: _.label++; y = op[1]; op = [0]; continue;
23
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
- default:
25
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
- if (t[2]) _.ops.pop();
30
- _.trys.pop(); continue;
31
- }
32
- op = body.call(thisArg, _);
33
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
- }
36
- };
37
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
38
- import { useEffect, useRef, useState } from 'react';
39
- import { SolidButton } from '../../shad-cn-ui/SolidButton';
40
- import { SolidIcon } from '../../shad-cn-ui/SolidIcon';
41
2
  /**
42
3
  * Renders a PDF using the browser's built-in PDF viewer.
43
4
  *
44
- * The signed URL is fetched into a blob first, which both keeps any auth on the
45
- * request and guarantees inline rendering regardless of the `Content-Disposition`
46
- * the storage provider sends back. Everything else — zoom, rotation, page
47
- * navigation, text search/selection, print, download — is handled natively by
48
- * the browser, so there is no pdf.js worker to configure or version-match.
5
+ * The signed URL is handed straight to the iframe instead of being fetched into a
6
+ * blob first. `fetch` is subject to CORS, so a blob-based viewer only works where
7
+ * the storage bucket explicitly allows the app's origin — which differs per
8
+ * environment and silently breaks on any bucket that hasn't been configured.
9
+ * Iframes are not subject to CORS, so this renders identically everywhere.
10
+ *
11
+ * Zoom, rotation, page navigation, text search/selection, print and download all
12
+ * come from the browser's native viewer, so there is no pdf.js worker to
13
+ * configure or version-match.
49
14
  */
50
15
  export default function PDFViewer(_a) {
51
- var _this = this;
52
16
  var url = _a.url, _b = _a.height, height = _b === void 0 ? '70vh' : _b;
53
- var _c = useState(null), blobUrl = _c[0], setBlobUrl = _c[1];
54
- var _d = useState(null), error = _d[0], setError = _d[1];
55
- var _e = useState(0), reloadToken = _e[0], setReloadToken = _e[1];
56
- var blobUrlRef = useRef(null);
57
- useEffect(function () {
58
- if (!url)
59
- return;
60
- var controller = new AbortController();
61
- setError(null);
62
- setBlobUrl(null);
63
- fetch(url, { signal: controller.signal })
64
- .then(function (res) { return __awaiter(_this, void 0, void 0, function () {
65
- var contentType, blob, nextBlobUrl;
66
- var _a;
67
- return __generator(this, function (_b) {
68
- switch (_b.label) {
69
- case 0:
70
- if (!res.ok)
71
- throw new Error("Request failed with ".concat(res.status));
72
- contentType = (_a = res.headers.get('content-type')) !== null && _a !== void 0 ? _a : '';
73
- if (contentType && !contentType.includes('pdf') && !contentType.includes('octet-stream')) {
74
- throw new Error("Unexpected content type: ".concat(contentType));
75
- }
76
- return [4 /*yield*/, res.blob()];
77
- case 1:
78
- blob = _b.sent();
79
- nextBlobUrl = URL.createObjectURL(blob);
80
- // Revoke the URL this one replaces so repeated previews don't leak.
81
- if (blobUrlRef.current)
82
- URL.revokeObjectURL(blobUrlRef.current);
83
- blobUrlRef.current = nextBlobUrl;
84
- setBlobUrl(nextBlobUrl);
85
- return [2 /*return*/];
86
- }
87
- });
88
- }); })
89
- .catch(function (err) {
90
- if (controller.signal.aborted)
91
- return;
92
- console.error('PDF load error:', err);
93
- setError('Failed to load PDF');
94
- });
95
- return function () { return controller.abort(); };
96
- }, [url, reloadToken]);
97
- useEffect(function () {
98
- return function () {
99
- if (blobUrlRef.current)
100
- URL.revokeObjectURL(blobUrlRef.current);
101
- };
102
- }, []);
103
17
  if (!url) {
104
18
  return (_jsx("div", { className: "flex min-h-0 items-center justify-center rounded-lg bg-[var(--solid-surface-pane)]", style: { height: height }, children: _jsx("p", { className: "text-[var(--solid-text-muted)]", children: "No PDF URL provided" }) }));
105
19
  }
106
- if (error) {
107
- return (_jsxs("div", { className: "flex min-h-0 flex-col items-center justify-center gap-4 rounded-lg bg-[var(--solid-danger-soft)]", style: { height: height }, children: [_jsx("p", { className: "text-[var(--solid-danger)]", children: error }), _jsx(SolidButton, { onClick: function () { return setReloadToken(function (t) { return t + 1; }); }, leftIcon: _jsx(SolidIcon, { name: "si-refresh", size: 16, "aria-hidden": true }), children: "Retry" })] }));
108
- }
109
- if (!blobUrl) {
110
- return (_jsx("div", { className: "flex min-h-0 items-center justify-center rounded-lg bg-[var(--solid-surface-pane)]", style: { height: height }, children: _jsx("p", { className: "text-[var(--solid-text-secondary)]", children: "Loading PDF..." }) }));
111
- }
112
- return (_jsx("iframe", { src: blobUrl, title: "PDF preview", className: "block min-h-0 w-full rounded-lg border border-[var(--solid-border-default)] bg-[var(--solid-surface-pane)]", style: { height: height } }));
20
+ return (_jsxs("div", { className: "flex min-h-0 flex-col gap-2", style: { height: height }, children: [_jsx("iframe", { src: url, title: "PDF preview", className: "block min-h-0 w-full flex-1 rounded-lg border border-[var(--solid-border-default)] bg-[var(--solid-surface-pane)]" }), _jsx("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: "shrink-0 text-center text-xs text-[var(--solid-text-muted)] underline", children: "Not rendering? Open in a new tab" })] }));
113
21
  }
114
22
  //# sourceMappingURL=PDFViewer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PDFViewer.js","sourceRoot":"","sources":["../../../../src/components/core/common/PDFViewer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { SolidButton } from '../../shad-cn-ui/SolidButton';\nimport { SolidIcon } from '../../shad-cn-ui/SolidIcon';\n\nexport interface PDFViewerProps {\n url?: string | null;\n /** Height of the viewport the PDF renders into. */\n height?: string;\n}\n\n/**\n * Renders a PDF using the browser's built-in PDF viewer.\n *\n * The signed URL is fetched into a blob first, which both keeps any auth on the\n * request and guarantees inline rendering regardless of the `Content-Disposition`\n * the storage provider sends back. Everything else — zoom, rotation, page\n * navigation, text search/selection, print, download — is handled natively by\n * the browser, so there is no pdf.js worker to configure or version-match.\n */\nexport default function PDFViewer({ url, height = '70vh' }: PDFViewerProps) {\n const [blobUrl, setBlobUrl] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [reloadToken, setReloadToken] = useState(0);\n const blobUrlRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!url) return;\n\n const controller = new AbortController();\n setError(null);\n setBlobUrl(null);\n\n fetch(url, { signal: controller.signal })\n .then(async (res) => {\n if (!res.ok) throw new Error(`Request failed with ${res.status}`);\n\n const contentType = res.headers.get('content-type') ?? '';\n if (contentType && !contentType.includes('pdf') && !contentType.includes('octet-stream')) {\n throw new Error(`Unexpected content type: ${contentType}`);\n }\n\n const blob = await res.blob();\n const nextBlobUrl = URL.createObjectURL(blob);\n\n // Revoke the URL this one replaces so repeated previews don't leak.\n if (blobUrlRef.current) URL.revokeObjectURL(blobUrlRef.current);\n blobUrlRef.current = nextBlobUrl;\n\n setBlobUrl(nextBlobUrl);\n })\n .catch((err) => {\n if (controller.signal.aborted) return;\n console.error('PDF load error:', err);\n setError('Failed to load PDF');\n });\n\n return () => controller.abort();\n }, [url, reloadToken]);\n\n useEffect(() => {\n return () => {\n if (blobUrlRef.current) URL.revokeObjectURL(blobUrlRef.current);\n };\n }, []);\n\n if (!url) {\n return (\n <div\n className=\"flex min-h-0 items-center justify-center rounded-lg bg-[var(--solid-surface-pane)]\"\n style={{ height }}\n >\n <p className=\"text-[var(--solid-text-muted)]\">No PDF URL provided</p>\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n className=\"flex min-h-0 flex-col items-center justify-center gap-4 rounded-lg bg-[var(--solid-danger-soft)]\"\n style={{ height }}\n >\n <p className=\"text-[var(--solid-danger)]\">{error}</p>\n <SolidButton\n onClick={() => setReloadToken((t) => t + 1)}\n leftIcon={<SolidIcon name=\"si-refresh\" size={16} aria-hidden />}\n >\n Retry\n </SolidButton>\n </div>\n );\n }\n\n if (!blobUrl) {\n return (\n <div\n className=\"flex min-h-0 items-center justify-center rounded-lg bg-[var(--solid-surface-pane)]\"\n style={{ height }}\n >\n <p className=\"text-[var(--solid-text-secondary)]\">Loading PDF...</p>\n </div>\n );\n }\n\n return (\n <iframe\n src={blobUrl}\n title=\"PDF preview\"\n className=\"block min-h-0 w-full rounded-lg border border-[var(--solid-border-default)] bg-[var(--solid-surface-pane)]\"\n style={{ height }}\n />\n );\n}\n"]}
1
+ {"version":3,"file":"PDFViewer.js","sourceRoot":"","sources":["../../../../src/components/core/common/PDFViewer.tsx"],"names":[],"mappings":";AAMA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAwC;QAAtC,GAAG,SAAA,EAAE,cAAe,EAAf,MAAM,mBAAG,MAAM,KAAA;IACpD,IAAI,CAAC,GAAG,EAAE;QACN,OAAO,CACH,cACI,SAAS,EAAC,oFAAoF,EAC9F,KAAK,EAAE,EAAE,MAAM,QAAA,EAAE,YAEjB,YAAG,SAAS,EAAC,gCAAgC,oCAAwB,GACnE,CACT,CAAC;KACL;IAED,OAAO,CACH,eAAK,SAAS,EAAC,6BAA6B,EAAC,KAAK,EAAE,EAAE,MAAM,QAAA,EAAE,aAC1D,iBACI,GAAG,EAAE,GAAG,EACR,KAAK,EAAC,aAAa,EACnB,SAAS,EAAC,mHAAmH,GAC/H,EAMF,YACI,IAAI,EAAE,GAAG,EACT,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,uEAAuE,iDAGjF,IACF,CACT,CAAC;AACN,CAAC","sourcesContent":["export interface PDFViewerProps {\n url?: string | null;\n /** Height of the viewport the PDF renders into. */\n height?: string;\n}\n\n/**\n * Renders a PDF using the browser's built-in PDF viewer.\n *\n * The signed URL is handed straight to the iframe instead of being fetched into a\n * blob first. `fetch` is subject to CORS, so a blob-based viewer only works where\n * the storage bucket explicitly allows the app's origin — which differs per\n * environment and silently breaks on any bucket that hasn't been configured.\n * Iframes are not subject to CORS, so this renders identically everywhere.\n *\n * Zoom, rotation, page navigation, text search/selection, print and download all\n * come from the browser's native viewer, so there is no pdf.js worker to\n * configure or version-match.\n */\nexport default function PDFViewer({ url, height = '70vh' }: PDFViewerProps) {\n if (!url) {\n return (\n <div\n className=\"flex min-h-0 items-center justify-center rounded-lg bg-[var(--solid-surface-pane)]\"\n style={{ height }}\n >\n <p className=\"text-[var(--solid-text-muted)]\">No PDF URL provided</p>\n </div>\n );\n }\n\n return (\n <div className=\"flex min-h-0 flex-col gap-2\" style={{ height }}>\n <iframe\n src={url}\n title=\"PDF preview\"\n className=\"block min-h-0 w-full flex-1 rounded-lg border border-[var(--solid-border-default)] bg-[var(--solid-surface-pane)]\"\n />\n {/*\n Escape hatch: a browser that won't render PDFs inline (iOS Safari, or\n an object stored with a non-PDF content type) shows a blank frame with\n no error event to hook. This keeps the document reachable in that case.\n */}\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"shrink-0 text-center text-xs text-[var(--solid-text-muted)] underline\"\n >\n Not rendering? Open in a new tab\n </a>\n </div>\n );\n}\n"]}
@@ -1,7 +1,3 @@
1
- import { useEffect, useRef, useState } from 'react';
2
- import { SolidButton } from '../../shad-cn-ui/SolidButton';
3
- import { SolidIcon } from '../../shad-cn-ui/SolidIcon';
4
-
5
1
  export interface PDFViewerProps {
6
2
  url?: string | null;
7
3
  /** Height of the viewport the PDF renders into. */
@@ -11,58 +7,17 @@ export interface PDFViewerProps {
11
7
  /**
12
8
  * Renders a PDF using the browser's built-in PDF viewer.
13
9
  *
14
- * The signed URL is fetched into a blob first, which both keeps any auth on the
15
- * request and guarantees inline rendering regardless of the `Content-Disposition`
16
- * the storage provider sends back. Everything else — zoom, rotation, page
17
- * navigation, text search/selection, print, download — is handled natively by
18
- * the browser, so there is no pdf.js worker to configure or version-match.
10
+ * The signed URL is handed straight to the iframe instead of being fetched into a
11
+ * blob first. `fetch` is subject to CORS, so a blob-based viewer only works where
12
+ * the storage bucket explicitly allows the app's origin — which differs per
13
+ * environment and silently breaks on any bucket that hasn't been configured.
14
+ * Iframes are not subject to CORS, so this renders identically everywhere.
15
+ *
16
+ * Zoom, rotation, page navigation, text search/selection, print and download all
17
+ * come from the browser's native viewer, so there is no pdf.js worker to
18
+ * configure or version-match.
19
19
  */
20
20
  export default function PDFViewer({ url, height = '70vh' }: PDFViewerProps) {
21
- const [blobUrl, setBlobUrl] = useState<string | null>(null);
22
- const [error, setError] = useState<string | null>(null);
23
- const [reloadToken, setReloadToken] = useState(0);
24
- const blobUrlRef = useRef<string | null>(null);
25
-
26
- useEffect(() => {
27
- if (!url) return;
28
-
29
- const controller = new AbortController();
30
- setError(null);
31
- setBlobUrl(null);
32
-
33
- fetch(url, { signal: controller.signal })
34
- .then(async (res) => {
35
- if (!res.ok) throw new Error(`Request failed with ${res.status}`);
36
-
37
- const contentType = res.headers.get('content-type') ?? '';
38
- if (contentType && !contentType.includes('pdf') && !contentType.includes('octet-stream')) {
39
- throw new Error(`Unexpected content type: ${contentType}`);
40
- }
41
-
42
- const blob = await res.blob();
43
- const nextBlobUrl = URL.createObjectURL(blob);
44
-
45
- // Revoke the URL this one replaces so repeated previews don't leak.
46
- if (blobUrlRef.current) URL.revokeObjectURL(blobUrlRef.current);
47
- blobUrlRef.current = nextBlobUrl;
48
-
49
- setBlobUrl(nextBlobUrl);
50
- })
51
- .catch((err) => {
52
- if (controller.signal.aborted) return;
53
- console.error('PDF load error:', err);
54
- setError('Failed to load PDF');
55
- });
56
-
57
- return () => controller.abort();
58
- }, [url, reloadToken]);
59
-
60
- useEffect(() => {
61
- return () => {
62
- if (blobUrlRef.current) URL.revokeObjectURL(blobUrlRef.current);
63
- };
64
- }, []);
65
-
66
21
  if (!url) {
67
22
  return (
68
23
  <div
@@ -74,40 +29,26 @@ export default function PDFViewer({ url, height = '70vh' }: PDFViewerProps) {
74
29
  );
75
30
  }
76
31
 
77
- if (error) {
78
- return (
79
- <div
80
- className="flex min-h-0 flex-col items-center justify-center gap-4 rounded-lg bg-[var(--solid-danger-soft)]"
81
- style={{ height }}
82
- >
83
- <p className="text-[var(--solid-danger)]">{error}</p>
84
- <SolidButton
85
- onClick={() => setReloadToken((t) => t + 1)}
86
- leftIcon={<SolidIcon name="si-refresh" size={16} aria-hidden />}
87
- >
88
- Retry
89
- </SolidButton>
90
- </div>
91
- );
92
- }
93
-
94
- if (!blobUrl) {
95
- return (
96
- <div
97
- className="flex min-h-0 items-center justify-center rounded-lg bg-[var(--solid-surface-pane)]"
98
- style={{ height }}
99
- >
100
- <p className="text-[var(--solid-text-secondary)]">Loading PDF...</p>
101
- </div>
102
- );
103
- }
104
-
105
32
  return (
106
- <iframe
107
- src={blobUrl}
108
- title="PDF preview"
109
- className="block min-h-0 w-full rounded-lg border border-[var(--solid-border-default)] bg-[var(--solid-surface-pane)]"
110
- style={{ height }}
111
- />
33
+ <div className="flex min-h-0 flex-col gap-2" style={{ height }}>
34
+ <iframe
35
+ src={url}
36
+ title="PDF preview"
37
+ className="block min-h-0 w-full flex-1 rounded-lg border border-[var(--solid-border-default)] bg-[var(--solid-surface-pane)]"
38
+ />
39
+ {/*
40
+ Escape hatch: a browser that won't render PDFs inline (iOS Safari, or
41
+ an object stored with a non-PDF content type) shows a blank frame with
42
+ no error event to hook. This keeps the document reachable in that case.
43
+ */}
44
+ <a
45
+ href={url}
46
+ target="_blank"
47
+ rel="noopener noreferrer"
48
+ className="shrink-0 text-center text-xs text-[var(--solid-text-muted)] underline"
49
+ >
50
+ Not rendering? Open in a new tab
51
+ </a>
52
+ </div>
112
53
  );
113
54
  }
@@ -0,0 +1,12 @@
1
+ type SolidCollectionRowActionMenuItemsProps = {
2
+ buttons?: any[];
3
+ params: any;
4
+ rowData: any;
5
+ solidViewMetaData: any;
6
+ handleCustomButtonClick: (buttonAttrs: any, event: any) => void;
7
+ showSeparator?: boolean;
8
+ onActionComplete?: () => void;
9
+ };
10
+ export declare function SolidCollectionRowActionMenuItems({ buttons, params, rowData, solidViewMetaData, handleCustomButtonClick, showSeparator, onActionComplete, }: SolidCollectionRowActionMenuItemsProps): import("react/jsx-runtime").JSX.Element | null;
11
+ export {};
12
+ //# sourceMappingURL=SolidCollectionRowActionMenuItems.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SolidCollectionRowActionMenuItems.d.ts","sourceRoot":"","sources":["../../../../src/components/core/common/SolidCollectionRowActionMenuItems.tsx"],"names":[],"mappings":"AAWA,KAAK,sCAAsC,GAAG;IAC5C,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;IACb,iBAAiB,EAAE,GAAG,CAAC;IACvB,uBAAuB,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAChE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B,CAAC;AAEF,wBAAgB,iCAAiC,CAAC,EAChD,OAAY,EACZ,MAAM,EACN,OAAO,EACP,iBAAiB,EACjB,uBAAuB,EACvB,aAAqB,EACrB,gBAAgB,GACjB,EAAE,sCAAsC,kDA6DxC"}
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { isButtonVisibleInCurrentEnv } from "../../../helpers/buttonEnvironment";
3
+ import { resolveButtonPresentation } from "../../../helpers/buttonPresentation";
4
+ import { hasAnyRole } from "../../../helpers/rolesHelper";
5
+ import { useSession } from "../../../hooks/useSession";
6
+ import { SolidDropdownMenuItem, SolidDropdownMenuSeparator, SolidIcon, parseSolidIconMeta, } from "../../shad-cn-ui";
7
+ export function SolidCollectionRowActionMenuItems(_a) {
8
+ var _b = _a.buttons, buttons = _b === void 0 ? [] : _b, params = _a.params, rowData = _a.rowData, solidViewMetaData = _a.solidViewMetaData, handleCustomButtonClick = _a.handleCustomButtonClick, _c = _a.showSeparator, showSeparator = _c === void 0 ? false : _c, onActionComplete = _a.onActionComplete;
9
+ var session = useSession().data;
10
+ var user = session === null || session === void 0 ? void 0 : session.user;
11
+ var visibleButtons = buttons.filter(function (button) {
12
+ var _a;
13
+ var attrs = button === null || button === void 0 ? void 0 : button.attrs;
14
+ var roles = (_a = attrs === null || attrs === void 0 ? void 0 : attrs.roles) !== null && _a !== void 0 ? _a : [];
15
+ var presentation = resolveButtonPresentation(attrs);
16
+ return ((attrs === null || attrs === void 0 ? void 0 : attrs.actionInContextMenu) === true &&
17
+ (attrs === null || attrs === void 0 ? void 0 : attrs.visible) !== false &&
18
+ isButtonVisibleInCurrentEnv(attrs) &&
19
+ (roles.length === 0 || hasAnyRole(user === null || user === void 0 ? void 0 : user.roles, roles)) &&
20
+ (presentation.showIcon || presentation.showLabel));
21
+ });
22
+ if (visibleButtons.length === 0)
23
+ return null;
24
+ return (_jsxs(_Fragment, { children: [showSeparator ? _jsx(SolidDropdownMenuSeparator, {}) : null, visibleButtons.map(function (button, index) {
25
+ var _a, _b, _c, _d, _e, _f, _g;
26
+ var presentation = resolveButtonPresentation(button.attrs);
27
+ var iconMeta = presentation.showIcon
28
+ ? parseSolidIconMeta(presentation.icon)
29
+ : undefined;
30
+ var iconNode = presentation.showIcon
31
+ ? iconMeta
32
+ ? _jsx(SolidIcon, { name: iconMeta.name, spin: iconMeta.spin, className: "solid-header-action-button-icon", "aria-hidden": true })
33
+ : _jsx("i", { className: "".concat(presentation.icon, " solid-header-action-button-icon"), "aria-hidden": "true" })
34
+ : null;
35
+ return (_jsxs(SolidDropdownMenuItem, { className: "solid-header-dropdown-item ".concat((_a = presentation.buttonClassName) !== null && _a !== void 0 ? _a : ""), title: presentation.tooltip, "aria-label": presentation.isIconOnly
36
+ ? ((_d = (_b = presentation.tooltip) !== null && _b !== void 0 ? _b : (_c = button === null || button === void 0 ? void 0 : button.attrs) === null || _c === void 0 ? void 0 : _c.action) !== null && _d !== void 0 ? _d : "Action")
37
+ : undefined, onSelect: function () {
38
+ var _a;
39
+ handleCustomButtonClick(button.attrs, {
40
+ params: params,
41
+ rowData: rowData,
42
+ solidListViewMetaData: (_a = solidViewMetaData === null || solidViewMetaData === void 0 ? void 0 : solidViewMetaData.data) !== null && _a !== void 0 ? _a : solidViewMetaData,
43
+ });
44
+ onActionComplete === null || onActionComplete === void 0 ? void 0 : onActionComplete();
45
+ }, children: [presentation.iconPos === "left" ? iconNode : null, presentation.showLabel
46
+ ? _jsx("span", { className: "solid-header-action-button-label", children: presentation.label })
47
+ : null, presentation.iconPos === "right" ? iconNode : null] }, "".concat((_e = rowData === null || rowData === void 0 ? void 0 : rowData.id) !== null && _e !== void 0 ? _e : "row", "-").concat((_g = (_f = button === null || button === void 0 ? void 0 : button.attrs) === null || _f === void 0 ? void 0 : _f.action) !== null && _g !== void 0 ? _g : index)));
48
+ })] }));
49
+ }
50
+ //# sourceMappingURL=SolidCollectionRowActionMenuItems.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SolidCollectionRowActionMenuItems.js","sourceRoot":"","sources":["../../../../src/components/core/common/SolidCollectionRowActionMenuItems.tsx"],"names":[],"mappings":"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","sourcesContent":["import { isButtonVisibleInCurrentEnv } from \"../../../helpers/buttonEnvironment\";\nimport { resolveButtonPresentation } from \"../../../helpers/buttonPresentation\";\nimport { hasAnyRole } from \"../../../helpers/rolesHelper\";\nimport { useSession } from \"../../../hooks/useSession\";\nimport {\n SolidDropdownMenuItem,\n SolidDropdownMenuSeparator,\n SolidIcon,\n parseSolidIconMeta,\n} from \"../../shad-cn-ui\";\n\ntype SolidCollectionRowActionMenuItemsProps = {\n buttons?: any[];\n params: any;\n rowData: any;\n solidViewMetaData: any;\n handleCustomButtonClick: (buttonAttrs: any, event: any) => void;\n showSeparator?: boolean;\n onActionComplete?: () => void;\n};\n\nexport function SolidCollectionRowActionMenuItems({\n buttons = [],\n params,\n rowData,\n solidViewMetaData,\n handleCustomButtonClick,\n showSeparator = false,\n onActionComplete,\n}: SolidCollectionRowActionMenuItemsProps) {\n const { data: session } = useSession();\n const user = session?.user;\n\n const visibleButtons = buttons.filter((button: any) => {\n const attrs = button?.attrs;\n const roles = attrs?.roles ?? [];\n const presentation = resolveButtonPresentation(attrs);\n\n return (\n attrs?.actionInContextMenu === true &&\n attrs?.visible !== false &&\n isButtonVisibleInCurrentEnv(attrs) &&\n (roles.length === 0 || hasAnyRole(user?.roles, roles)) &&\n (presentation.showIcon || presentation.showLabel)\n );\n });\n\n if (visibleButtons.length === 0) return null;\n\n return (\n <>\n {showSeparator ? <SolidDropdownMenuSeparator /> : null}\n {visibleButtons.map((button: any, index: number) => {\n const presentation = resolveButtonPresentation(button.attrs);\n const iconMeta = presentation.showIcon\n ? parseSolidIconMeta(presentation.icon)\n : undefined;\n const iconNode = presentation.showIcon\n ? iconMeta\n ? <SolidIcon name={iconMeta.name} spin={iconMeta.spin} className=\"solid-header-action-button-icon\" aria-hidden />\n : <i className={`${presentation.icon} solid-header-action-button-icon`} aria-hidden=\"true\" />\n : null;\n\n return (\n <SolidDropdownMenuItem\n key={`${rowData?.id ?? \"row\"}-${button?.attrs?.action ?? index}`}\n className={`solid-header-dropdown-item ${presentation.buttonClassName ?? \"\"}`}\n title={presentation.tooltip}\n aria-label={presentation.isIconOnly\n ? (presentation.tooltip ?? button?.attrs?.action ?? \"Action\")\n : undefined}\n onSelect={() => {\n handleCustomButtonClick(button.attrs, {\n params,\n rowData,\n solidListViewMetaData: solidViewMetaData?.data ?? solidViewMetaData,\n });\n onActionComplete?.();\n }}\n >\n {presentation.iconPos === \"left\" ? iconNode : null}\n {presentation.showLabel\n ? <span className=\"solid-header-action-button-label\">{presentation.label}</span>\n : null}\n {presentation.iconPos === \"right\" ? iconNode : null}\n </SolidDropdownMenuItem>\n );\n })}\n </>\n );\n}\n"]}
@@ -0,0 +1,91 @@
1
+ import { isButtonVisibleInCurrentEnv } from "../../../helpers/buttonEnvironment";
2
+ import { resolveButtonPresentation } from "../../../helpers/buttonPresentation";
3
+ import { hasAnyRole } from "../../../helpers/rolesHelper";
4
+ import { useSession } from "../../../hooks/useSession";
5
+ import {
6
+ SolidDropdownMenuItem,
7
+ SolidDropdownMenuSeparator,
8
+ SolidIcon,
9
+ parseSolidIconMeta,
10
+ } from "../../shad-cn-ui";
11
+
12
+ type SolidCollectionRowActionMenuItemsProps = {
13
+ buttons?: any[];
14
+ params: any;
15
+ rowData: any;
16
+ solidViewMetaData: any;
17
+ handleCustomButtonClick: (buttonAttrs: any, event: any) => void;
18
+ showSeparator?: boolean;
19
+ onActionComplete?: () => void;
20
+ };
21
+
22
+ export function SolidCollectionRowActionMenuItems({
23
+ buttons = [],
24
+ params,
25
+ rowData,
26
+ solidViewMetaData,
27
+ handleCustomButtonClick,
28
+ showSeparator = false,
29
+ onActionComplete,
30
+ }: SolidCollectionRowActionMenuItemsProps) {
31
+ const { data: session } = useSession();
32
+ const user = session?.user;
33
+
34
+ const visibleButtons = buttons.filter((button: any) => {
35
+ const attrs = button?.attrs;
36
+ const roles = attrs?.roles ?? [];
37
+ const presentation = resolveButtonPresentation(attrs);
38
+
39
+ return (
40
+ attrs?.actionInContextMenu === true &&
41
+ attrs?.visible !== false &&
42
+ isButtonVisibleInCurrentEnv(attrs) &&
43
+ (roles.length === 0 || hasAnyRole(user?.roles, roles)) &&
44
+ (presentation.showIcon || presentation.showLabel)
45
+ );
46
+ });
47
+
48
+ if (visibleButtons.length === 0) return null;
49
+
50
+ return (
51
+ <>
52
+ {showSeparator ? <SolidDropdownMenuSeparator /> : null}
53
+ {visibleButtons.map((button: any, index: number) => {
54
+ const presentation = resolveButtonPresentation(button.attrs);
55
+ const iconMeta = presentation.showIcon
56
+ ? parseSolidIconMeta(presentation.icon)
57
+ : undefined;
58
+ const iconNode = presentation.showIcon
59
+ ? iconMeta
60
+ ? <SolidIcon name={iconMeta.name} spin={iconMeta.spin} className="solid-header-action-button-icon" aria-hidden />
61
+ : <i className={`${presentation.icon} solid-header-action-button-icon`} aria-hidden="true" />
62
+ : null;
63
+
64
+ return (
65
+ <SolidDropdownMenuItem
66
+ key={`${rowData?.id ?? "row"}-${button?.attrs?.action ?? index}`}
67
+ className={`solid-header-dropdown-item ${presentation.buttonClassName ?? ""}`}
68
+ title={presentation.tooltip}
69
+ aria-label={presentation.isIconOnly
70
+ ? (presentation.tooltip ?? button?.attrs?.action ?? "Action")
71
+ : undefined}
72
+ onSelect={() => {
73
+ handleCustomButtonClick(button.attrs, {
74
+ params,
75
+ rowData,
76
+ solidListViewMetaData: solidViewMetaData?.data ?? solidViewMetaData,
77
+ });
78
+ onActionComplete?.();
79
+ }}
80
+ >
81
+ {presentation.iconPos === "left" ? iconNode : null}
82
+ {presentation.showLabel
83
+ ? <span className="solid-header-action-button-label">{presentation.label}</span>
84
+ : null}
85
+ {presentation.iconPos === "right" ? iconNode : null}
86
+ </SolidDropdownMenuItem>
87
+ );
88
+ })}
89
+ </>
90
+ );
91
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"SolidCreateButton.d.ts","sourceRoot":"","sources":["../../../../src/components/core/common/SolidCreateButton.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB,0FAAmG,GAAG,4CA6DnI,CAAC"}
1
+ {"version":3,"file":"SolidCreateButton.d.ts","sourceRoot":"","sources":["../../../../src/components/core/common/SolidCreateButton.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB,0FAAmG,GAAG,4CAiFnI,CAAC"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import Link from "../../common/Link";
3
3
  import { usePathname } from "../../../hooks/usePathname";
4
4
  import { normalizeSolidListTreeKanbanActionPath } from "../../../helpers/routePaths";
@@ -25,6 +25,6 @@ export var SolidCreateButton = function (_a) {
25
25
  var label = ((_c = solidListViewLayout === null || solidListViewLayout === void 0 ? void 0 : solidListViewLayout.attrs) === null || _c === void 0 ? void 0 : _c.addButtonTitle) || "Add";
26
26
  var className = ((_d = solidListViewLayout === null || solidListViewLayout === void 0 ? void 0 : solidListViewLayout.attrs) === null || _d === void 0 ? void 0 : _d.addButtonClassName) || "";
27
27
  var defaultIcon = _jsx(Plus, { size: 14 });
28
- return (_jsx("div", { children: _jsx(Link, { href: createPath, onClick: storeCurrentViewContext, children: responsiveIconOnly ? (_jsxs(_Fragment, { children: [_jsx(SolidButton, { type: "button", icon: icon, leftIcon: !icon ? defaultIcon : undefined, className: "".concat(className, " lg:hidden solid-icon-button "), size: 'sm' }), _jsx(SolidButton, { type: "button", icon: icon, leftIcon: !icon ? defaultIcon : undefined, className: "".concat(className, " hidden lg:inline-flex"), size: 'sm', children: label })] })) : (_jsx(SolidButton, { type: "button", icon: icon, leftIcon: !icon ? defaultIcon : undefined, className: "".concat(className), size: 'sm', children: label })) }) }));
28
+ return (_jsx("div", { children: _jsxs(Link, { href: createPath, onClick: storeCurrentViewContext, children: [_jsx(SolidButton, { type: "button", icon: icon, leftIcon: !icon ? defaultIcon : undefined, className: "".concat(className, " max-[576px]:hidden sm:hidden lg:flex"), size: 'sm', children: label }), _jsx(SolidButton, { type: "button", icon: icon, leftIcon: !icon ? defaultIcon : undefined, className: "".concat(className, " lg:hidden solid-icon-button "), size: 'sm' })] }) }));
29
29
  };
30
30
  //# sourceMappingURL=SolidCreateButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SolidCreateButton.js","sourceRoot":"","sources":["../../../../src/components/core/common/SolidCreateButton.tsx"],"names":[],"mappings":";AAAA,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,sCAAsC,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,MAAM,CAAC,IAAM,iBAAiB,GAAG,UAAC,EAAkG;;QAAhG,eAAe,qBAAA,EAAE,uBAAuB,6BAAA,EAAE,mBAAmB,yBAAA,EAAE,0BAA0B,EAA1B,kBAAkB,mBAAG,KAAK,KAAA;IACzH,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,IAAM,iBAAiB,GAAG;QACtB,IAAI,eAAe,EAAE;YACjB,IAAM,aAAa,GAAG,sCAAsC,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;YACxF,IAAM,KAAK,GAAG,IAAI,eAAe,CAAC,uBAAuB,CAAC,CAAC,QAAQ,EAAE,CAAC;YACtE,OAAO,KAAK,CAAC,CAAC,CAAC,UAAG,aAAa,cAAI,KAAK,CAAE,CAAC,CAAC,CAAC,aAAa,CAAC;SAC9D;QAED,OAAO,UAAG,sCAAsC,CAAC,QAAQ,EAAE,MAAM,CAAC,uBAAoB,CAAC;IAC3F,CAAC,CAAC;IAEF,IAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,IAAM,uBAAuB,GAAG;QAC5B,4BAA4B,EAAE,CAAC;IACnC,CAAC,CAAC;IAEF,IAAM,IAAI,GAAG,MAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,KAAK,0CAAE,aAAa,CAAC;IACvD,IAAM,KAAK,GAAG,CAAA,MAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,KAAK,0CAAE,cAAc,KAAI,KAAK,CAAC;IAClE,IAAM,SAAS,GAAG,CAAA,MAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,KAAK,0CAAE,kBAAkB,KAAI,EAAE,CAAC;IACvE,IAAM,WAAW,GAAG,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC;IAEvC,OAAO,CACH,wBACI,KAAC,IAAI,IAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,uBAAuB,YACnD,kBAAkB,CAAC,CAAC,CAAC,CAClB,8BACI,KAAC,WAAW,IACR,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EACzC,SAAS,EAAE,UAAG,SAAS,kCAA+B,EACtD,IAAI,EAAC,IAAI,GACX,EAEF,KAAC,WAAW,IACR,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EACzC,SAAS,EAAE,UAAG,SAAS,2BAAwB,EAC/C,IAAI,EAAC,IAAI,YAER,KAAK,GACI,IACf,CACN,CAAC,CAAC,CAAC,CACA,KAAC,WAAW,IACR,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EACzC,SAAS,EAAE,UAAG,SAAS,CAAE,EACzB,IAAI,EAAC,IAAI,YAER,KAAK,GACI,CACjB,GAEE,GACL,CACT,CAAC;AACN,CAAC,CAAC","sourcesContent":["import Link from \"../../common/Link\";\nimport { usePathname } from \"../../../hooks/usePathname\";\nimport { normalizeSolidListTreeKanbanActionPath } from \"../../../helpers/routePaths\";\nimport { storeCurrentModelViewContext } from \"../../../helpers/modelViewPersistence\";\nimport { SolidButton } from \"../../shad-cn-ui\";\nimport { Plus } from \"lucide-react\";\n\nexport const SolidCreateButton = ({ createButtonUrl, createActionQueryParams, solidListViewLayout, responsiveIconOnly = false }: any) => {\n const pathName = usePathname();\n\n const resolveCreatePath = () => {\n if (createButtonUrl) {\n const normalizedUrl = normalizeSolidListTreeKanbanActionPath(pathName, createButtonUrl);\n const query = new URLSearchParams(createActionQueryParams).toString();\n return query ? `${normalizedUrl}?${query}` : normalizedUrl;\n }\n\n return `${normalizeSolidListTreeKanbanActionPath(pathName, \"form\")}/new?viewMode=edit`;\n };\n\n const createPath = resolveCreatePath();\n const storeCurrentViewContext = () => {\n storeCurrentModelViewContext();\n };\n\n const icon = solidListViewLayout?.attrs?.addButtonIcon;\n const label = solidListViewLayout?.attrs?.addButtonTitle || \"Add\";\n const className = solidListViewLayout?.attrs?.addButtonClassName || \"\";\n const defaultIcon = <Plus size={14} />;\n\n return (\n <div>\n <Link href={createPath} onClick={storeCurrentViewContext}>\n {responsiveIconOnly ? (\n <>\n <SolidButton\n type=\"button\"\n icon={icon}\n leftIcon={!icon ? defaultIcon : undefined}\n className={`${className} lg:hidden solid-icon-button `}\n size='sm'\n />\n\n <SolidButton\n type=\"button\"\n icon={icon}\n leftIcon={!icon ? defaultIcon : undefined}\n className={`${className} hidden lg:inline-flex`}\n size='sm'\n >\n {label}\n </SolidButton>\n </>\n ) : (\n <SolidButton\n type=\"button\"\n icon={icon}\n leftIcon={!icon ? defaultIcon : undefined}\n className={`${className}`}\n size='sm'\n >\n {label}\n </SolidButton>\n )}\n\n </Link>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"SolidCreateButton.js","sourceRoot":"","sources":["../../../../src/components/core/common/SolidCreateButton.tsx"],"names":[],"mappings":";AAAA,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,sCAAsC,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,MAAM,CAAC,IAAM,iBAAiB,GAAG,UAAC,EAAkG;;QAAhG,eAAe,qBAAA,EAAE,uBAAuB,6BAAA,EAAE,mBAAmB,yBAAA,EAAE,0BAA0B,EAA1B,kBAAkB,mBAAG,KAAK,KAAA;IACzH,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,IAAM,iBAAiB,GAAG;QACtB,IAAI,eAAe,EAAE;YACjB,IAAM,aAAa,GAAG,sCAAsC,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;YACxF,IAAM,KAAK,GAAG,IAAI,eAAe,CAAC,uBAAuB,CAAC,CAAC,QAAQ,EAAE,CAAC;YACtE,OAAO,KAAK,CAAC,CAAC,CAAC,UAAG,aAAa,cAAI,KAAK,CAAE,CAAC,CAAC,CAAC,aAAa,CAAC;SAC9D;QAED,OAAO,UAAG,sCAAsC,CAAC,QAAQ,EAAE,MAAM,CAAC,uBAAoB,CAAC;IAC3F,CAAC,CAAC;IAEF,IAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,IAAM,uBAAuB,GAAG;QAC5B,4BAA4B,EAAE,CAAC;IACnC,CAAC,CAAC;IAEF,IAAM,IAAI,GAAG,MAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,KAAK,0CAAE,aAAa,CAAC;IACvD,IAAM,KAAK,GAAG,CAAA,MAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,KAAK,0CAAE,cAAc,KAAI,KAAK,CAAC;IAClE,IAAM,SAAS,GAAG,CAAA,MAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,KAAK,0CAAE,kBAAkB,KAAI,EAAE,CAAC;IACvE,IAAM,WAAW,GAAG,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC;IAEvC,OAAO,CACH,wBACI,MAAC,IAAI,IAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,uBAAuB,aAEpD,KAAC,WAAW,IACR,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EACzC,SAAS,EAAE,UAAG,SAAS,0CAAuC,EAC9D,IAAI,EAAC,IAAI,YAER,KAAK,GACI,EAGd,KAAC,WAAW,IACR,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EACzC,SAAS,EAAE,UAAG,SAAS,kCAA+B,EACtD,IAAI,EAAC,IAAI,GACX,IAkCC,GACL,CACT,CAAC;AACN,CAAC,CAAC","sourcesContent":["import Link from \"../../common/Link\";\nimport { usePathname } from \"../../../hooks/usePathname\";\nimport { normalizeSolidListTreeKanbanActionPath } from \"../../../helpers/routePaths\";\nimport { storeCurrentModelViewContext } from \"../../../helpers/modelViewPersistence\";\nimport { SolidButton } from \"../../shad-cn-ui\";\nimport { Plus } from \"lucide-react\";\n\nexport const SolidCreateButton = ({ createButtonUrl, createActionQueryParams, solidListViewLayout, responsiveIconOnly = false }: any) => {\n const pathName = usePathname();\n\n const resolveCreatePath = () => {\n if (createButtonUrl) {\n const normalizedUrl = normalizeSolidListTreeKanbanActionPath(pathName, createButtonUrl);\n const query = new URLSearchParams(createActionQueryParams).toString();\n return query ? `${normalizedUrl}?${query}` : normalizedUrl;\n }\n\n return `${normalizeSolidListTreeKanbanActionPath(pathName, \"form\")}/new?viewMode=edit`;\n };\n\n const createPath = resolveCreatePath();\n const storeCurrentViewContext = () => {\n storeCurrentModelViewContext();\n };\n\n const icon = solidListViewLayout?.attrs?.addButtonIcon;\n const label = solidListViewLayout?.attrs?.addButtonTitle || \"Add\";\n const className = solidListViewLayout?.attrs?.addButtonClassName || \"\";\n const defaultIcon = <Plus size={14} />;\n\n return (\n <div>\n <Link href={createPath} onClick={storeCurrentViewContext}>\n {/* Desktop Version */}\n <SolidButton\n type=\"button\"\n icon={icon}\n leftIcon={!icon ? defaultIcon : undefined}\n className={`${className} max-[576px]:hidden sm:hidden lg:flex`}\n size='sm'\n >\n {label}\n </SolidButton>\n\n {/* Mobile Version */}\n <SolidButton\n type=\"button\"\n icon={icon}\n leftIcon={!icon ? defaultIcon : undefined}\n className={`${className} lg:hidden solid-icon-button `}\n size='sm'\n />\n\n {/* {responsiveIconOnly ? (\n <>\n <SolidButton\n type=\"button\"\n icon={icon}\n leftIcon={!icon ? defaultIcon : undefined}\n className={`${className} lg:hidden solid-icon-button `}\n size='sm'\n />\n\n <SolidButton\n type=\"button\"\n icon={icon}\n leftIcon={!icon ? defaultIcon : undefined}\n className={`${className} hidden lg:inline-flex`}\n size='sm'\n >\n {label}\n </SolidButton>\n </>\n ) : (\n <SolidButton\n type=\"button\"\n icon={icon}\n leftIcon={!icon ? defaultIcon : undefined}\n className={`${className}`}\n size='sm'\n >\n {label}\n </SolidButton>\n )} */}\n\n </Link>\n </div>\n );\n};\n"]}
@@ -31,7 +31,27 @@ export const SolidCreateButton = ({ createButtonUrl, createActionQueryParams, so
31
31
  return (
32
32
  <div>
33
33
  <Link href={createPath} onClick={storeCurrentViewContext}>
34
- {responsiveIconOnly ? (
34
+ {/* Desktop Version */}
35
+ <SolidButton
36
+ type="button"
37
+ icon={icon}
38
+ leftIcon={!icon ? defaultIcon : undefined}
39
+ className={`${className} max-[576px]:hidden sm:hidden lg:flex`}
40
+ size='sm'
41
+ >
42
+ {label}
43
+ </SolidButton>
44
+
45
+ {/* Mobile Version */}
46
+ <SolidButton
47
+ type="button"
48
+ icon={icon}
49
+ leftIcon={!icon ? defaultIcon : undefined}
50
+ className={`${className} lg:hidden solid-icon-button `}
51
+ size='sm'
52
+ />
53
+
54
+ {/* {responsiveIconOnly ? (
35
55
  <>
36
56
  <SolidButton
37
57
  type="button"
@@ -61,7 +81,7 @@ export const SolidCreateButton = ({ createButtonUrl, createActionQueryParams, so
61
81
  >
62
82
  {label}
63
83
  </SolidButton>
64
- )}
84
+ )} */}
65
85
 
66
86
  </Link>
67
87
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"SolidGlobalSearchElement.d.ts","sourceRoot":"","sources":["../../../../src/components/core/common/SolidGlobalSearchElement.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6F,MAAM,OAAO,CAAC;AAclH,OAA0B,EAAE,eAAe,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AA0B3G,MAAM,MAAM,eAAe,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,CAAC;CAClC,CAAA;AAoUD,eAAO,MAAM,2BAA2B,sBAAuB,GAAG,aAAa,GAAG,yBAAyB,MAAM,iBAAiB,MAAM,QAavI,CAAA;AAGD,eAAO,MAAM,mBAAmB,iBAAkB,GAAG,gBAAgB,GAAG,eAAe,GAAG,qBAAqB,GAAG,kBAAkB,YAAY,EAAE,qBAAqB,eAAe,EAAE,QAwBvL,CAAA;AAoID,eAAO,MAAM,wBAAwB,kFA+0DnC,CAAC"}
1
+ {"version":3,"file":"SolidGlobalSearchElement.d.ts","sourceRoot":"","sources":["../../../../src/components/core/common/SolidGlobalSearchElement.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6F,MAAM,OAAO,CAAC;AAYlH,OAA0B,EAAE,eAAe,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AA0B3G,MAAM,MAAM,eAAe,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,CAAC;CAClC,CAAA;AAoUD,eAAO,MAAM,2BAA2B,sBAAuB,GAAG,aAAa,GAAG,yBAAyB,MAAM,iBAAiB,MAAM,QAavI,CAAA;AAGD,eAAO,MAAM,mBAAmB,iBAAkB,GAAG,gBAAgB,GAAG,eAAe,GAAG,qBAAqB,GAAG,kBAAkB,YAAY,EAAE,qBAAqB,eAAe,EAAE,QAwBvL,CAAA;AAsID,eAAO,MAAM,wBAAwB,kFAu1DnC,CAAC"}