@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.
- package/dist/components/auth/AuthLayout.js +1 -1
- package/dist/components/auth/AuthLayout.js.map +1 -1
- package/dist/components/auth/AuthLayout.tsx +2 -2
- package/dist/components/common/SettingsComponent.module.css +4 -1
- package/dist/components/common/SolidFieldTooltip.d.ts.map +1 -1
- package/dist/components/common/SolidFieldTooltip.js +1 -1
- package/dist/components/common/SolidFieldTooltip.js.map +1 -1
- package/dist/components/common/SolidFieldTooltip.tsx +1 -0
- package/dist/components/common/SolidFormStepper.d.ts.map +1 -1
- package/dist/components/common/SolidFormStepper.js +7 -6
- package/dist/components/common/SolidFormStepper.js.map +1 -1
- package/dist/components/common/SolidFormStepper.tsx +7 -1
- package/dist/components/common/SolidThemeProvider.d.ts.map +1 -1
- package/dist/components/common/SolidThemeProvider.js +127 -11
- package/dist/components/common/SolidThemeProvider.js.map +1 -1
- package/dist/components/common/SolidThemeProvider.tsx +104 -22
- package/dist/components/core/card/CardGrid.d.ts +1 -1
- package/dist/components/core/card/CardGrid.d.ts.map +1 -1
- package/dist/components/core/card/CardGrid.js +2 -2
- package/dist/components/core/card/CardGrid.js.map +1 -1
- package/dist/components/core/card/CardGrid.tsx +4 -0
- package/dist/components/core/card/CardItem.d.ts +2 -0
- package/dist/components/core/card/CardItem.d.ts.map +1 -1
- package/dist/components/core/card/CardItem.js +4 -3
- package/dist/components/core/card/CardItem.js.map +1 -1
- package/dist/components/core/card/CardItem.tsx +15 -0
- package/dist/components/core/card/SolidCardView.d.ts +28 -1
- package/dist/components/core/card/SolidCardView.d.ts.map +1 -1
- package/dist/components/core/card/SolidCardView.js +99 -44
- package/dist/components/core/card/SolidCardView.js.map +1 -1
- package/dist/components/core/card/SolidCardView.tsx +124 -7
- package/dist/components/core/card/SolidCardViewConfigure.d.ts +1 -1
- package/dist/components/core/card/SolidCardViewConfigure.d.ts.map +1 -1
- package/dist/components/core/card/SolidCardViewConfigure.js +15 -6
- package/dist/components/core/card/SolidCardViewConfigure.js.map +1 -1
- package/dist/components/core/card/SolidCardViewConfigure.tsx +34 -0
- package/dist/components/core/card/cardViewRegistry.d.ts +7 -0
- package/dist/components/core/card/cardViewRegistry.d.ts.map +1 -0
- package/dist/components/core/card/cardViewRegistry.js +17 -0
- package/dist/components/core/card/cardViewRegistry.js.map +1 -0
- package/dist/components/core/card/cardViewRegistry.ts +23 -0
- package/dist/components/core/common/PDFViewer.d.ts +9 -5
- package/dist/components/core/common/PDFViewer.d.ts.map +1 -1
- package/dist/components/core/common/PDFViewer.js +10 -102
- package/dist/components/core/common/PDFViewer.js.map +1 -1
- package/dist/components/core/common/PDFViewer.tsx +29 -88
- package/dist/components/core/common/SolidCollectionRowActionMenuItems.d.ts +12 -0
- package/dist/components/core/common/SolidCollectionRowActionMenuItems.d.ts.map +1 -0
- package/dist/components/core/common/SolidCollectionRowActionMenuItems.js +50 -0
- package/dist/components/core/common/SolidCollectionRowActionMenuItems.js.map +1 -0
- package/dist/components/core/common/SolidCollectionRowActionMenuItems.tsx +91 -0
- package/dist/components/core/common/SolidCreateButton.d.ts.map +1 -1
- package/dist/components/core/common/SolidCreateButton.js +2 -2
- package/dist/components/core/common/SolidCreateButton.js.map +1 -1
- package/dist/components/core/common/SolidCreateButton.tsx +22 -2
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js +137 -134
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +127 -119
- package/dist/components/core/form/SolidFormActionHeader.d.ts.map +1 -1
- package/dist/components/core/form/SolidFormActionHeader.js +21 -21
- package/dist/components/core/form/SolidFormActionHeader.js.map +1 -1
- package/dist/components/core/form/SolidFormActionHeader.tsx +62 -53
- package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
- package/dist/components/core/form/SolidFormView.js +5 -2
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/SolidFormView.tsx +7 -2
- package/dist/components/core/kanban/KanbanBoard.d.ts +1 -1
- package/dist/components/core/kanban/KanbanBoard.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanBoard.js +2 -2
- package/dist/components/core/kanban/KanbanBoard.js.map +1 -1
- package/dist/components/core/kanban/KanbanBoard.tsx +3 -1
- package/dist/components/core/kanban/KanbanCard.d.ts +2 -0
- package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanCard.js +4 -2
- package/dist/components/core/kanban/KanbanCard.js.map +1 -1
- package/dist/components/core/kanban/KanbanCard.tsx +14 -1
- package/dist/components/core/kanban/KanbanColumn.d.ts +3 -1
- package/dist/components/core/kanban/KanbanColumn.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanColumn.js +2 -2
- package/dist/components/core/kanban/KanbanColumn.js.map +1 -1
- package/dist/components/core/kanban/KanbanColumn.tsx +4 -2
- package/dist/components/core/kanban/SolidKanbanView.d.ts +25 -1
- package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.js +89 -50
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.tsx +82 -9
- package/dist/components/core/kanban/kanbanViewRegistry.d.ts +7 -0
- package/dist/components/core/kanban/kanbanViewRegistry.d.ts.map +1 -0
- package/dist/components/core/kanban/kanbanViewRegistry.js +17 -0
- package/dist/components/core/kanban/kanbanViewRegistry.js.map +1 -0
- package/dist/components/core/kanban/kanbanViewRegistry.ts +23 -0
- package/dist/components/core/list/PLAN.md +1 -1
- package/dist/components/core/list/SolidListView.d.ts +11 -0
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +11 -6
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +88 -45
- package/dist/components/core/list/SolidListViewConfigure.js +1 -1
- package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
- package/dist/components/core/list/SolidListViewConfigure.tsx +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js +2 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.tsx +2 -1
- package/dist/components/core/model/CreateModel.d.ts.map +1 -1
- package/dist/components/core/model/CreateModel.js +2 -1
- package/dist/components/core/model/CreateModel.js.map +1 -1
- package/dist/components/core/model/CreateModel.tsx +2 -0
- package/dist/components/core/model/FieldMetaData.d.ts +1 -1
- package/dist/components/core/model/FieldMetaData.d.ts.map +1 -1
- package/dist/components/core/model/FieldMetaData.js +8 -8
- package/dist/components/core/model/FieldMetaData.js.map +1 -1
- package/dist/components/core/model/FieldMetaData.tsx +2 -2
- package/dist/components/core/model/FieldMetaDataForm.css +119 -0
- package/dist/components/core/model/FieldMetaDataForm.js +1 -1
- package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
- package/dist/components/core/model/FieldMetaDataForm.tsx +1 -1
- package/dist/components/core/module/ModuleMetadataExplorer.css +64 -0
- package/dist/components/core/module/ModulePackageDialog.css +117 -12
- package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
- package/dist/components/core/tree/SolidTreeView.js +6 -3
- package/dist/components/core/tree/SolidTreeView.js.map +1 -1
- package/dist/components/core/tree/SolidTreeView.tsx +35 -13
- package/dist/components/layout/AdminHeaderActions.d.ts.map +1 -1
- package/dist/components/layout/AdminHeaderActions.js +15 -10
- package/dist/components/layout/AdminHeaderActions.js.map +1 -1
- package/dist/components/layout/AdminHeaderActions.tsx +15 -8
- package/dist/components/layout/AdminTopHeader.d.ts.map +1 -1
- package/dist/components/layout/AdminTopHeader.js +1 -18
- package/dist/components/layout/AdminTopHeader.js.map +1 -1
- package/dist/components/layout/AdminTopHeader.tsx +3 -21
- package/dist/helpers/resolveActiveUserId.d.ts +13 -0
- package/dist/helpers/resolveActiveUserId.d.ts.map +1 -0
- package/dist/helpers/resolveActiveUserId.js +86 -0
- package/dist/helpers/resolveActiveUserId.js.map +1 -0
- package/dist/helpers/resolveActiveUserId.ts +90 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/index.ts +5 -0
- package/dist/resources/globals.css +15 -0
- package/dist/resources/solid-custom.css +18 -1
- package/dist/resources/solid-tailwind-generated.css +1 -1
- package/dist/resources/themes/solid-dark-enterprise/theme-variables.css +28 -0
- package/dist/resources/themes/solid-dark-enterprise/theme.css +926 -0
- package/dist/resources/themes/solid-dark-modern/theme-variables.css +27 -0
- package/dist/resources/themes/solid-dark-modern/theme.css +600 -0
- package/dist/resources/themes/solid-light-enterprise/theme-variables.css +28 -0
- package/dist/resources/themes/solid-light-enterprise/theme.css +930 -0
- package/dist/resources/themes/solid-light-modern/theme-variables.css +31 -0
- package/dist/resources/themes/solid-light-modern/theme.css +1041 -0
- package/dist/routes/pages/admin/core/CardPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/CardPage.js +15 -2
- package/dist/routes/pages/admin/core/CardPage.js.map +1 -1
- package/dist/routes/pages/admin/core/CardPage.tsx +17 -2
- package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.js +31 -3
- package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.tsx +39 -11
- package/dist/routes/pages/admin/core/KanbanPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/KanbanPage.js +15 -2
- package/dist/routes/pages/admin/core/KanbanPage.js.map +1 -1
- package/dist/routes/pages/admin/core/KanbanPage.tsx +17 -2
- package/dist/routes/pages/admin/core/ListPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/ListPage.js +5 -13
- package/dist/routes/pages/admin/core/ListPage.js.map +1 -1
- package/dist/routes/pages/admin/core/ListPage.tsx +5 -15
- package/dist/theme/theme-registry.d.ts +6 -0
- package/dist/theme/theme-registry.d.ts.map +1 -0
- package/dist/theme/theme-registry.js +65 -0
- package/dist/theme/theme-registry.js.map +1 -0
- package/dist/theme/theme-registry.ts +78 -0
- package/dist/types/solid-core.d.ts +8 -0
- 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
|
|
45
|
-
*
|
|
46
|
-
* the storage
|
|
47
|
-
*
|
|
48
|
-
*
|
|
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
|
-
|
|
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":"
|
|
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
|
|
15
|
-
*
|
|
16
|
-
* the storage
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
-
<
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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,
|
|
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,
|
|
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:
|
|
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,
|
|
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
|
-
{
|
|
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;
|
|
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"}
|