@ziky/ui 0.1.7 → 0.1.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 (58) hide show
  1. package/dist/components/ActivityList.d.ts +15 -0
  2. package/dist/components/ActivityList.d.ts.map +1 -0
  3. package/dist/components/ActivityList.js +8 -0
  4. package/dist/components/ActivityList.js.map +1 -0
  5. package/dist/components/DashboardPanel.d.ts +10 -0
  6. package/dist/components/DashboardPanel.d.ts.map +1 -0
  7. package/dist/components/DashboardPanel.js +8 -0
  8. package/dist/components/DashboardPanel.js.map +1 -0
  9. package/dist/components/DashboardStatCard.d.ts +16 -0
  10. package/dist/components/DashboardStatCard.d.ts.map +1 -0
  11. package/dist/components/DashboardStatCard.js +15 -0
  12. package/dist/components/DashboardStatCard.js.map +1 -0
  13. package/dist/components/FilePicker.d.ts +22 -0
  14. package/dist/components/FilePicker.d.ts.map +1 -0
  15. package/dist/components/FilePicker.js +93 -0
  16. package/dist/components/FilePicker.js.map +1 -0
  17. package/dist/components/ImageUploadField.d.ts +18 -0
  18. package/dist/components/ImageUploadField.d.ts.map +1 -0
  19. package/dist/components/ImageUploadField.js +34 -0
  20. package/dist/components/ImageUploadField.js.map +1 -0
  21. package/dist/components/SectionHeader.d.ts +9 -0
  22. package/dist/components/SectionHeader.d.ts.map +1 -0
  23. package/dist/components/SectionHeader.js +8 -0
  24. package/dist/components/SectionHeader.js.map +1 -0
  25. package/dist/components/SmartDataTable/SmartDataTable.d.ts +24 -0
  26. package/dist/components/SmartDataTable/SmartDataTable.d.ts.map +1 -0
  27. package/dist/components/SmartDataTable/SmartDataTable.js +104 -0
  28. package/dist/components/SmartDataTable/SmartDataTable.js.map +1 -0
  29. package/dist/components/SmartDataTable/applyClientQuery.d.ts +9 -0
  30. package/dist/components/SmartDataTable/applyClientQuery.d.ts.map +1 -0
  31. package/dist/components/SmartDataTable/applyClientQuery.js +52 -0
  32. package/dist/components/SmartDataTable/applyClientQuery.js.map +1 -0
  33. package/dist/components/SmartDataTable/types.d.ts +17 -0
  34. package/dist/components/SmartDataTable/types.d.ts.map +1 -0
  35. package/dist/components/SmartDataTable/types.js +3 -0
  36. package/dist/components/SmartDataTable/types.js.map +1 -0
  37. package/dist/components/SmartDataTable/urlState.d.ts +20 -0
  38. package/dist/components/SmartDataTable/urlState.d.ts.map +1 -0
  39. package/dist/components/SmartDataTable/urlState.js +117 -0
  40. package/dist/components/SmartDataTable/urlState.js.map +1 -0
  41. package/dist/index.d.ts +9 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +9 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/menu/adminMenu.d.ts.map +1 -1
  46. package/dist/menu/adminMenu.js +5 -0
  47. package/dist/menu/adminMenu.js.map +1 -1
  48. package/dist/styles/components/filepicker.css +69 -0
  49. package/dist/styles/index.d.ts +1 -1
  50. package/dist/styles/index.d.ts.map +1 -1
  51. package/dist/styles/index.js +1 -1
  52. package/dist/styles/index.js.map +1 -1
  53. package/dist/styles/index.ts +1 -1
  54. package/dist/styles/layout/_dashboard.scss +279 -0
  55. package/dist/styles/layout/_dialog.scss +63 -0
  56. package/dist/styles/layout/_smartdatatable.scss +38 -0
  57. package/dist/styles/layout/layout.scss +11 -8
  58. package/package.json +1 -1
@@ -0,0 +1,15 @@
1
+ export type ActivityItem = {
2
+ id: string;
3
+ title: string;
4
+ timestamp?: string;
5
+ description?: string;
6
+ icon?: string;
7
+ tone?: 'primary' | 'success' | 'warn' | 'danger';
8
+ };
9
+ export type ActivityListProps = {
10
+ title?: string;
11
+ items: ActivityItem[];
12
+ className?: string;
13
+ };
14
+ export declare function ActivityList({ title, items, className }: ActivityListProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=ActivityList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityList.d.ts","sourceRoot":"","sources":["../../src/components/ActivityList.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,KAAyB,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CA+B9F"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ActivityList = ActivityList;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ function ActivityList({ title = 'Recent Activity', items, className }) {
6
+ return ((0, jsx_runtime_1.jsxs)("section", { className: `card sakai-activity${className ? ` ${className}` : ''}`.trim(), children: [(0, jsx_runtime_1.jsx)("div", { className: "sakai-activity__header", children: (0, jsx_runtime_1.jsx)("h3", { className: "sakai-activity__title", children: title }) }), (0, jsx_runtime_1.jsx)("ul", { className: "sakai-activity__list", children: items.map((item) => ((0, jsx_runtime_1.jsxs)("li", { className: "sakai-activity__item", children: [(0, jsx_runtime_1.jsx)("span", { className: `sakai-activity__icon sakai-activity__icon--${item.tone ?? 'primary'}`, "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)("i", { className: item.icon ?? 'pi pi-bell' }) }), (0, jsx_runtime_1.jsxs)("div", { className: "sakai-activity__content", children: [(0, jsx_runtime_1.jsxs)("div", { className: "sakai-activity__row", children: [(0, jsx_runtime_1.jsx)("span", { className: "sakai-activity__item-title", children: item.title }), item.timestamp ? ((0, jsx_runtime_1.jsx)("span", { className: "sakai-activity__time", children: item.timestamp })) : null] }), item.description ? ((0, jsx_runtime_1.jsx)("p", { className: "sakai-activity__description", children: item.description })) : null] })] }, item.id))) })] }));
7
+ }
8
+ //# sourceMappingURL=ActivityList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityList.js","sourceRoot":"","sources":["../../src/components/ActivityList.tsx"],"names":[],"mappings":";;AAiBA,oCA+BC;;AA/BD,SAAgB,YAAY,CAAC,EAAE,KAAK,GAAG,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAqB;IAC7F,OAAO,CACL,qCAAS,SAAS,EAAE,sBAAsB,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,aACjF,gCAAK,SAAS,EAAC,wBAAwB,YACrC,+BAAI,SAAS,EAAC,uBAAuB,YAAE,KAAK,GAAM,GAC9C,EACN,+BAAI,SAAS,EAAC,sBAAsB,YACjC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,gCAAkB,SAAS,EAAC,sBAAsB,aAChD,iCACE,SAAS,EAAE,8CAA8C,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE,iBACrE,MAAM,YAElB,8BAAG,SAAS,EAAE,IAAI,CAAC,IAAI,IAAI,YAAY,GAAI,GACtC,EACP,iCAAK,SAAS,EAAC,yBAAyB,aACtC,iCAAK,SAAS,EAAC,qBAAqB,aAClC,iCAAM,SAAS,EAAC,4BAA4B,YAAE,IAAI,CAAC,KAAK,GAAQ,EAC/D,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAChB,iCAAM,SAAS,EAAC,sBAAsB,YAAE,IAAI,CAAC,SAAS,GAAQ,CAC/D,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAClB,8BAAG,SAAS,EAAC,6BAA6B,YAAE,IAAI,CAAC,WAAW,GAAK,CAClE,CAAC,CAAC,CAAC,IAAI,IACJ,KAjBC,IAAI,CAAC,EAAE,CAkBX,CACN,CAAC,GACC,IACG,CACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export type DashboardPanelProps = {
3
+ title: string;
4
+ subtitle?: string;
5
+ actions?: React.ReactNode;
6
+ children: React.ReactNode;
7
+ className?: string;
8
+ };
9
+ export declare function DashboardPanel({ title, subtitle, actions, children, className, }: DashboardPanelProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=DashboardPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardPanel.d.ts","sourceRoot":"","sources":["../../src/components/DashboardPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,GACV,EAAE,mBAAmB,2CAarB"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DashboardPanel = DashboardPanel;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ function DashboardPanel({ title, subtitle, actions, children, className, }) {
6
+ return ((0, jsx_runtime_1.jsxs)("section", { className: `card sakai-panel${className ? ` ${className}` : ''}`.trim(), children: [(0, jsx_runtime_1.jsxs)("header", { className: "sakai-panel__header", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h3", { className: "sakai-panel__title", children: title }), subtitle ? (0, jsx_runtime_1.jsx)("p", { className: "sakai-panel__subtitle", children: subtitle }) : null] }), actions ? (0, jsx_runtime_1.jsx)("div", { className: "sakai-panel__actions", children: actions }) : null] }), (0, jsx_runtime_1.jsx)("div", { className: "sakai-panel__body", children: children })] }));
7
+ }
8
+ //# sourceMappingURL=DashboardPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardPanel.js","sourceRoot":"","sources":["../../src/components/DashboardPanel.tsx"],"names":[],"mappings":";;AAUA,wCAmBC;;AAnBD,SAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,GACW;IACpB,OAAO,CACL,qCAAS,SAAS,EAAE,mBAAmB,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,aAC9E,oCAAQ,SAAS,EAAC,qBAAqB,aACrC,4CACE,+BAAI,SAAS,EAAC,oBAAoB,YAAE,KAAK,GAAM,EAC9C,QAAQ,CAAC,CAAC,CAAC,8BAAG,SAAS,EAAC,uBAAuB,YAAE,QAAQ,GAAK,CAAC,CAAC,CAAC,IAAI,IAClE,EACL,OAAO,CAAC,CAAC,CAAC,gCAAK,SAAS,EAAC,sBAAsB,YAAE,OAAO,GAAO,CAAC,CAAC,CAAC,IAAI,IAChE,EACT,gCAAK,SAAS,EAAC,mBAAmB,YAAE,QAAQ,GAAO,IAC3C,CACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ export type DashboardStatCardProps = {
3
+ title: string;
4
+ value: string | number;
5
+ icon?: string;
6
+ variant?: 'default' | 'success' | 'warn' | 'danger';
7
+ trend?: {
8
+ value: string;
9
+ direction?: 'up' | 'down' | 'neutral';
10
+ label?: string;
11
+ };
12
+ footer?: React.ReactNode;
13
+ className?: string;
14
+ };
15
+ export declare function DashboardStatCard({ title, value, icon, variant, trend, footer, className, }: DashboardStatCardProps): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=DashboardStatCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardStatCard.d.ts","sourceRoot":"","sources":["../../src/components/DashboardStatCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpD,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;QACtC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,IAAI,EACJ,OAAmB,EACnB,KAAK,EACL,MAAM,EACN,SAAS,GACV,EAAE,sBAAsB,2CA6BxB"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DashboardStatCard = DashboardStatCard;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const trendIconMap = {
6
+ up: 'pi pi-arrow-up-right',
7
+ down: 'pi pi-arrow-down-right',
8
+ neutral: 'pi pi-minus',
9
+ };
10
+ function DashboardStatCard({ title, value, icon, variant = 'default', trend, footer, className, }) {
11
+ const trendDirection = trend?.direction ?? 'neutral';
12
+ const trendIcon = trend ? trendIconMap[trendDirection] : null;
13
+ return ((0, jsx_runtime_1.jsxs)("div", { className: `card sakai-stat-card sakai-stat-card--${variant}${className ? ` ${className}` : ''}`.trim(), children: [(0, jsx_runtime_1.jsxs)("div", { className: "sakai-stat-card__top", children: [(0, jsx_runtime_1.jsx)("span", { className: "sakai-stat-card__title", children: title }), icon ? ((0, jsx_runtime_1.jsx)("span", { className: "sakai-stat-card__icon", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)("i", { className: icon }) })) : null] }), (0, jsx_runtime_1.jsx)("div", { className: "sakai-stat-card__value", children: value }), trend ? ((0, jsx_runtime_1.jsxs)("div", { className: `sakai-stat-card__trend sakai-stat-card__trend--${trendDirection}`, children: [trendIcon ? (0, jsx_runtime_1.jsx)("i", { className: trendIcon, "aria-hidden": "true" }) : null, (0, jsx_runtime_1.jsx)("span", { children: trend.value }), trend.label ? (0, jsx_runtime_1.jsx)("span", { className: "sakai-stat-card__trend-label", children: trend.label }) : null] })) : null, footer ? (0, jsx_runtime_1.jsx)("div", { className: "sakai-stat-card__footer", children: footer }) : null] }));
14
+ }
15
+ //# sourceMappingURL=DashboardStatCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardStatCard.js","sourceRoot":"","sources":["../../src/components/DashboardStatCard.tsx"],"names":[],"mappings":";;AAwBA,8CAqCC;;AA3CD,MAAM,YAAY,GAAgD;IAChE,EAAE,EAAE,sBAAsB;IAC1B,IAAI,EAAE,wBAAwB;IAC9B,OAAO,EAAE,aAAa;CACvB,CAAC;AAEF,SAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,IAAI,EACJ,OAAO,GAAG,SAAS,EACnB,KAAK,EACL,MAAM,EACN,SAAS,GACc;IACvB,MAAM,cAAc,GAAG,KAAK,EAAE,SAAS,IAAI,SAAS,CAAC;IACrD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9D,OAAO,CACL,iCACE,SAAS,EAAE,yCAAyC,OAAO,GACzD,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAChC,EAAE,CAAC,IAAI,EAAE,aAET,iCAAK,SAAS,EAAC,sBAAsB,aACnC,iCAAM,SAAS,EAAC,wBAAwB,YAAE,KAAK,GAAQ,EACtD,IAAI,CAAC,CAAC,CAAC,CACN,iCAAM,SAAS,EAAC,uBAAuB,iBAAa,MAAM,YACxD,8BAAG,SAAS,EAAE,IAAI,GAAI,GACjB,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,gCAAK,SAAS,EAAC,wBAAwB,YAAE,KAAK,GAAO,EACpD,KAAK,CAAC,CAAC,CAAC,CACP,iCAAK,SAAS,EAAE,kDAAkD,cAAc,EAAE,aAC/E,SAAS,CAAC,CAAC,CAAC,8BAAG,SAAS,EAAE,SAAS,iBAAc,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAClE,2CAAO,KAAK,CAAC,KAAK,GAAQ,EACzB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,iCAAM,SAAS,EAAC,8BAA8B,YAAE,KAAK,CAAC,KAAK,GAAQ,CAAC,CAAC,CAAC,IAAI,IACrF,CACP,CAAC,CAAC,CAAC,IAAI,EACP,MAAM,CAAC,CAAC,CAAC,gCAAK,SAAS,EAAC,yBAAyB,YAAE,MAAM,GAAO,CAAC,CAAC,CAAC,IAAI,IACpE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ type FilePickerStrings = {
2
+ noFile: string;
3
+ hint: string;
4
+ choose: string;
5
+ change: string;
6
+ clear: string;
7
+ max: (max: string) => string;
8
+ tooLarge: (max: string) => string;
9
+ };
10
+ export type FilePickerProps = {
11
+ file: File | null;
12
+ onFileChange: (file: File | null) => void;
13
+ accept?: string;
14
+ disabled?: boolean;
15
+ helperText?: string;
16
+ maxSizeBytes?: number;
17
+ chooseLabel?: string;
18
+ strings?: Partial<FilePickerStrings>;
19
+ };
20
+ export declare function FilePicker({ file, onFileChange, accept, disabled, helperText, maxSizeBytes, chooseLabel, strings, }: FilePickerProps): import("react/jsx-runtime").JSX.Element;
21
+ export {};
22
+ //# sourceMappingURL=FilePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePicker.d.ts","sourceRoot":"","sources":["../../src/components/FilePicker.tsx"],"names":[],"mappings":"AAWA,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7B,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACnC,CAAC;AAYF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACtC,CAAC;AAEF,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,WAAW,EACX,OAAO,GACR,EAAE,eAAe,2CAqJjB"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FilePicker = FilePicker;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = __importDefault(require("react"));
9
+ const button_1 = require("primereact/button");
10
+ function formatBytes(size) {
11
+ if (!size || size <= 0)
12
+ return '0 B';
13
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
14
+ const idx = Math.min(units.length - 1, Math.floor(Math.log(size) / Math.log(1024)));
15
+ const value = size / Math.pow(1024, idx);
16
+ return `${value.toFixed(value >= 10 || idx === 0 ? 0 : 1)} ${units[idx]}`;
17
+ }
18
+ const defaultStrings = {
19
+ noFile: 'No file selected',
20
+ hint: 'Drag & drop a file here or click to choose',
21
+ choose: 'Choose file',
22
+ change: 'Change',
23
+ clear: 'Clear',
24
+ max: (max) => `Max ${max}`,
25
+ tooLarge: (max) => `File exceeds ${max}.`,
26
+ };
27
+ function FilePicker({ file, onFileChange, accept, disabled, helperText, maxSizeBytes, chooseLabel, strings, }) {
28
+ const s = react_1.default.useMemo(() => ({ ...defaultStrings, ...(strings ?? {}) }), [strings]);
29
+ const inputId = react_1.default.useId();
30
+ const inputRef = react_1.default.useRef(null);
31
+ const [dragActive, setDragActive] = react_1.default.useState(false);
32
+ const [error, setError] = react_1.default.useState(null);
33
+ const safeSetFile = react_1.default.useCallback((next) => {
34
+ if (!next) {
35
+ setError(null);
36
+ onFileChange(null);
37
+ if (inputRef.current)
38
+ inputRef.current.value = '';
39
+ return;
40
+ }
41
+ if (typeof maxSizeBytes === 'number' && maxSizeBytes > 0 && next.size > maxSizeBytes) {
42
+ setError(s.tooLarge(formatBytes(maxSizeBytes)));
43
+ onFileChange(null);
44
+ if (inputRef.current)
45
+ inputRef.current.value = '';
46
+ return;
47
+ }
48
+ setError(null);
49
+ onFileChange(next);
50
+ }, [maxSizeBytes, onFileChange, s]);
51
+ const onChoose = react_1.default.useCallback(() => {
52
+ if (disabled)
53
+ return;
54
+ inputRef.current?.click();
55
+ }, [disabled]);
56
+ const onInputChange = react_1.default.useCallback((e) => {
57
+ safeSetFile(e.target.files?.[0] ?? null);
58
+ }, [safeSetFile]);
59
+ const onDrop = react_1.default.useCallback((e) => {
60
+ e.preventDefault();
61
+ e.stopPropagation();
62
+ setDragActive(false);
63
+ if (disabled)
64
+ return;
65
+ const dropped = e.dataTransfer.files?.[0] ?? null;
66
+ safeSetFile(dropped);
67
+ }, [disabled, safeSetFile]);
68
+ const onDragOver = react_1.default.useCallback((e) => {
69
+ e.preventDefault();
70
+ e.stopPropagation();
71
+ }, []);
72
+ const onDragEnter = react_1.default.useCallback((e) => {
73
+ e.preventDefault();
74
+ e.stopPropagation();
75
+ if (!disabled)
76
+ setDragActive(true);
77
+ }, [disabled]);
78
+ const onDragLeave = react_1.default.useCallback((e) => {
79
+ e.preventDefault();
80
+ e.stopPropagation();
81
+ setDragActive(false);
82
+ }, []);
83
+ const name = file?.name ?? s.noFile;
84
+ const details = file ? `${formatBytes(file.size)}${file.type ? ` • ${file.type}` : ''}` : '';
85
+ const chooseText = chooseLabel ?? s.choose;
86
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "sakai-file-picker", children: [(0, jsx_runtime_1.jsx)("input", { id: inputId, ref: inputRef, type: "file", accept: accept, disabled: disabled, onChange: onInputChange, style: { display: 'none' } }), (0, jsx_runtime_1.jsxs)("div", { className: `sakai-file-picker__drop${dragActive ? ' sakai-file-picker__drop--drag' : ''}`, onClick: onChoose, onDrop: onDrop, onDragOver: onDragOver, onDragEnter: onDragEnter, onDragLeave: onDragLeave, role: "button", tabIndex: 0, "aria-disabled": disabled, onKeyDown: (e) => {
87
+ if (disabled)
88
+ return;
89
+ if (e.key === 'Enter' || e.key === ' ')
90
+ onChoose();
91
+ }, children: [(0, jsx_runtime_1.jsx)("div", { className: "sakai-file-picker__icon", children: (0, jsx_runtime_1.jsx)("i", { className: "pi pi-cloud-upload text-600" }) }), (0, jsx_runtime_1.jsxs)("div", { className: "sakai-file-picker__meta", children: [(0, jsx_runtime_1.jsx)("div", { className: "sakai-file-picker__name", children: name }), (0, jsx_runtime_1.jsx)("div", { className: "sakai-file-picker__sub", children: details || s.hint })] }), (0, jsx_runtime_1.jsxs)("div", { className: "sakai-file-picker__actions", onClick: (e) => e.stopPropagation(), children: [(0, jsx_runtime_1.jsx)(button_1.Button, { label: file ? s.change : chooseText, icon: "pi pi-folder-open", onClick: onChoose, outlined: true, disabled: disabled }), file ? ((0, jsx_runtime_1.jsx)(button_1.Button, { icon: "pi pi-times", rounded: true, text: true, severity: "secondary", onClick: () => safeSetFile(null), disabled: disabled, tooltip: s.clear, tooltipOptions: { position: 'top' } })) : null] })] }), error ? (0, jsx_runtime_1.jsx)("div", { className: "p-error sakai-file-picker__helper", children: error }) : null, helperText || maxSizeBytes ? ((0, jsx_runtime_1.jsxs)("div", { className: "sakai-file-picker__helper", children: [helperText ? helperText : null, helperText && maxSizeBytes ? ' • ' : null, maxSizeBytes ? s.max(formatBytes(maxSizeBytes)) : null] })) : null] }));
92
+ }
93
+ //# sourceMappingURL=FilePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePicker.js","sourceRoot":"","sources":["../../src/components/FilePicker.tsx"],"names":[],"mappings":";;;;;AA0CA,gCA8JC;;AAxMD,kDAA0B;AAC1B,8CAA2C;AAE3C,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5E,CAAC;AAYD,MAAM,cAAc,GAAsB;IACxC,MAAM,EAAE,kBAAkB;IAC1B,IAAI,EAAE,4CAA4C;IAClD,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,EAAE;IAC1B,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,GAAG,GAAG;CAC1C,CAAC;AAaF,SAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,WAAW,EACX,OAAO,GACS;IAChB,MAAM,CAAC,GAAsB,eAAK,CAAC,OAAO,CACxC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,EACjD,CAAC,OAAO,CAAC,CACV,CAAC;IACF,MAAM,OAAO,GAAG,eAAK,CAAC,KAAK,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,eAAK,CAAC,MAAM,CAA0B,IAAI,CAAC,CAAC;IAC7D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,eAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,eAAK,CAAC,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE9D,MAAM,WAAW,GAAG,eAAK,CAAC,WAAW,CACnC,CAAC,IAAiB,EAAE,EAAE;QACpB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,IAAI,QAAQ,CAAC,OAAO;gBAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;QAED,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC;YACrF,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChD,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,IAAI,QAAQ,CAAC,OAAO;gBAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,EACD,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAChC,CAAC;IAEF,MAAM,QAAQ,GAAG,eAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,aAAa,GAAG,eAAK,CAAC,WAAW,CACrC,CAAC,CAAsC,EAAE,EAAE;QACzC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC3C,CAAC,EACD,CAAC,WAAW,CAAC,CACd,CAAC;IAEF,MAAM,MAAM,GAAG,eAAK,CAAC,WAAW,CAC9B,CAAC,CAAkB,EAAE,EAAE;QACrB,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,QAAQ;YAAE,OAAO;QACrB,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAClD,WAAW,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,EACD,CAAC,QAAQ,EAAE,WAAW,CAAC,CACxB,CAAC;IAEF,MAAM,UAAU,GAAG,eAAK,CAAC,WAAW,CAAC,CAAC,CAAkB,EAAE,EAAE;QAC1D,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;IACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,eAAK,CAAC,WAAW,CACnC,CAAC,CAAkB,EAAE,EAAE;QACrB,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,IAAI,CAAC,QAAQ;YAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,WAAW,GAAG,eAAK,CAAC,WAAW,CAAC,CAAC,CAAkB,EAAE,EAAE;QAC3D,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,MAAM,UAAU,GAAG,WAAW,IAAI,CAAC,CAAC,MAAM,CAAC;IAE3C,OAAO,CACL,iCAAK,SAAS,EAAC,mBAAmB,aAChC,kCACE,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,QAAQ,EACb,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAC1B,EAEF,iCACE,SAAS,EAAE,0BAA0B,UAAU,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,EAAE,EAAE,EACzF,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,mBACI,QAAQ,EACvB,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oBACf,IAAI,QAAQ;wBAAE,OAAO;oBACrB,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG;wBAAE,QAAQ,EAAE,CAAC;gBACrD,CAAC,aAED,gCAAK,SAAS,EAAC,yBAAyB,YACtC,8BAAG,SAAS,EAAC,6BAA6B,GAAG,GACzC,EAEN,iCAAK,SAAS,EAAC,yBAAyB,aACtC,gCAAK,SAAS,EAAC,yBAAyB,YAAE,IAAI,GAAO,EACrD,gCAAK,SAAS,EAAC,wBAAwB,YAAE,OAAO,IAAI,CAAC,CAAC,IAAI,GAAO,IAC7D,EAEN,iCAAK,SAAS,EAAC,4BAA4B,EAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,aAC7E,uBAAC,eAAM,IACL,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EACnC,IAAI,EAAC,mBAAmB,EACxB,OAAO,EAAE,QAAQ,EACjB,QAAQ,QACR,QAAQ,EAAE,QAAQ,GAClB,EACD,IAAI,CAAC,CAAC,CAAC,CACN,uBAAC,eAAM,IACL,IAAI,EAAC,aAAa,EAClB,OAAO,QACP,IAAI,QACJ,QAAQ,EAAC,WAAW,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,CAAC,CAAC,KAAK,EAChB,cAAc,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GACnC,CACH,CAAC,CAAC,CAAC,IAAI,IACJ,IACF,EAEL,KAAK,CAAC,CAAC,CAAC,gCAAK,SAAS,EAAC,mCAAmC,YAAE,KAAK,GAAO,CAAC,CAAC,CAAC,IAAI,EAC/E,UAAU,IAAI,YAAY,CAAC,CAAC,CAAC,CAC5B,iCAAK,SAAS,EAAC,2BAA2B,aACvC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAC9B,UAAU,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EACzC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IACnD,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { FilePickerProps } from './FilePicker';
2
+ export type ImageUploadFieldProps = {
3
+ label: string;
4
+ value?: string | null;
5
+ onChange?: (value: string) => void;
6
+ file: File | null;
7
+ onFileChange: (file: File | null) => void;
8
+ onUpload: () => void;
9
+ uploading?: boolean;
10
+ error?: string | null;
11
+ helperText?: string;
12
+ chooseLabel?: string;
13
+ uploadLabel?: string;
14
+ urlPlaceholder?: string;
15
+ filePickerProps?: Omit<FilePickerProps, 'file' | 'onFileChange'>;
16
+ };
17
+ export declare function ImageUploadField({ label, value, onChange, file, onFileChange, onUpload, uploading, error, helperText, chooseLabel, uploadLabel, urlPlaceholder, filePickerProps, }: ImageUploadFieldProps): import("react/jsx-runtime").JSX.Element;
18
+ //# sourceMappingURL=ImageUploadField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageUploadField.d.ts","sourceRoot":"","sources":["../../src/components/ImageUploadField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC;CAClE,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,SAAiB,EACjB,KAAK,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,eAAe,GAChB,EAAE,qBAAqB,2CA+EvB"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImageUploadField = ImageUploadField;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const button_1 = require("primereact/button");
6
+ const inputtext_1 = require("primereact/inputtext");
7
+ const FilePicker_1 = require("./FilePicker");
8
+ function ImageUploadField({ label, value, onChange, file, onFileChange, onUpload, uploading = false, error, helperText, chooseLabel, uploadLabel, urlPlaceholder, filePickerProps, }) {
9
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { style: { display: 'block', marginBottom: '0.25rem' }, children: label }), (0, jsx_runtime_1.jsxs)("div", { style: {
10
+ border: '1px dashed var(--surface-border)',
11
+ borderRadius: 12,
12
+ padding: '0.75rem',
13
+ display: 'grid',
14
+ gridTemplateColumns: '80px 1fr',
15
+ gap: '0.75rem',
16
+ alignItems: 'center',
17
+ background: 'var(--surface-0)',
18
+ }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
19
+ width: 80,
20
+ height: 80,
21
+ borderRadius: 10,
22
+ background: 'var(--surface-100)',
23
+ display: 'flex',
24
+ alignItems: 'center',
25
+ justifyContent: 'center',
26
+ overflow: 'hidden',
27
+ }, children: value ? ((0, jsx_runtime_1.jsx)("img", { src: value, alt: "preview", style: { width: '100%', height: '100%', objectFit: 'cover' } })) : ((0, jsx_runtime_1.jsx)("i", { className: "pi pi-image", style: { fontSize: 28, color: 'var(--text-color-secondary)' } })) }), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'grid', gap: '0.5rem' }, children: [typeof onChange === 'function' ? ((0, jsx_runtime_1.jsx)(inputtext_1.InputText, { value: value ?? '', onChange: (e) => onChange(e.target.value), placeholder: urlPlaceholder })) : null, (0, jsx_runtime_1.jsxs)("div", { style: {
28
+ display: 'grid',
29
+ gridTemplateColumns: '1fr auto',
30
+ gap: '0.75rem',
31
+ alignItems: 'center',
32
+ }, children: [(0, jsx_runtime_1.jsx)(FilePicker_1.FilePicker, { file: file, onFileChange: onFileChange, accept: "image/*", helperText: helperText, chooseLabel: chooseLabel, ...filePickerProps }), (0, jsx_runtime_1.jsx)(button_1.Button, { label: uploadLabel ?? 'Upload', icon: "pi pi-cloud-upload", onClick: onUpload, loading: uploading, disabled: !file || uploading })] }), error ? (0, jsx_runtime_1.jsx)("div", { className: "p-error", children: error }) : null] })] })] }));
33
+ }
34
+ //# sourceMappingURL=ImageUploadField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageUploadField.js","sourceRoot":"","sources":["../../src/components/ImageUploadField.tsx"],"names":[],"mappings":";;AAsBA,4CA6FC;;AAlHD,8CAA2C;AAC3C,oDAAiD;AAEjD,6CAA0C;AAkB1C,SAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,SAAS,GAAG,KAAK,EACjB,KAAK,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,eAAe,GACO;IACtB,OAAO,CACL,4CACE,kCAAO,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAG,KAAK,GAAS,EAC5E,iCACE,KAAK,EAAE;oBACL,MAAM,EAAE,kCAAkC;oBAC1C,YAAY,EAAE,EAAE;oBAChB,OAAO,EAAE,SAAS;oBAClB,OAAO,EAAE,MAAM;oBACf,mBAAmB,EAAE,UAAU;oBAC/B,GAAG,EAAE,SAAS;oBACd,UAAU,EAAE,QAAQ;oBACpB,UAAU,EAAE,kBAAkB;iBAC/B,aAED,gCACE,KAAK,EAAE;4BACL,KAAK,EAAE,EAAE;4BACT,MAAM,EAAE,EAAE;4BACV,YAAY,EAAE,EAAE;4BAChB,UAAU,EAAE,oBAAoB;4BAChC,OAAO,EAAE,MAAM;4BACf,UAAU,EAAE,QAAQ;4BACpB,cAAc,EAAE,QAAQ;4BACxB,QAAQ,EAAE,QAAQ;yBACnB,YAEA,KAAK,CAAC,CAAC,CAAC,CACP,gCACE,GAAG,EAAE,KAAK,EACV,GAAG,EAAC,SAAS,EACb,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAC5D,CACH,CAAC,CAAC,CAAC,CACF,8BACE,SAAS,EAAC,aAAa,EACvB,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,GAC7D,CACH,GACG,EAEN,iCAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,aAC3C,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,CAChC,uBAAC,qBAAS,IACR,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,WAAW,EAAE,cAAc,GAC3B,CACH,CAAC,CAAC,CAAC,IAAI,EACR,iCACE,KAAK,EAAE;oCACL,OAAO,EAAE,MAAM;oCACf,mBAAmB,EAAE,UAAU;oCAC/B,GAAG,EAAE,SAAS;oCACd,UAAU,EAAE,QAAQ;iCACrB,aAED,uBAAC,uBAAU,IACT,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAC,SAAS,EAChB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW,KACpB,eAAe,GACnB,EACF,uBAAC,eAAM,IACL,KAAK,EAAE,WAAW,IAAI,QAAQ,EAC9B,IAAI,EAAC,oBAAoB,EACzB,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,CAAC,IAAI,IAAI,SAAS,GAC5B,IACE,EACL,KAAK,CAAC,CAAC,CAAC,gCAAK,SAAS,EAAC,SAAS,YAAE,KAAK,GAAO,CAAC,CAAC,CAAC,IAAI,IAClD,IACF,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export type SectionHeaderProps = {
3
+ title: string;
4
+ subtitle?: string;
5
+ actions?: React.ReactNode;
6
+ className?: string;
7
+ };
8
+ export declare function SectionHeader({ title, subtitle, actions, className }: SectionHeaderProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=SectionHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.d.ts","sourceRoot":"","sources":["../../src/components/SectionHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CAUxF"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SectionHeader = SectionHeader;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ function SectionHeader({ title, subtitle, actions, className }) {
6
+ return ((0, jsx_runtime_1.jsxs)("div", { className: `sakai-section-header${className ? ` ${className}` : ''}`.trim(), children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h2", { className: "sakai-section-header__title", children: title }), subtitle ? (0, jsx_runtime_1.jsx)("p", { className: "sakai-section-header__subtitle", children: subtitle }) : null] }), actions ? (0, jsx_runtime_1.jsx)("div", { className: "sakai-section-header__actions", children: actions }) : null] }));
7
+ }
8
+ //# sourceMappingURL=SectionHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.js","sourceRoot":"","sources":["../../src/components/SectionHeader.tsx"],"names":[],"mappings":";;AASA,sCAUC;;AAVD,SAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAsB;IACvF,OAAO,CACL,iCAAK,SAAS,EAAE,uBAAuB,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,aAC9E,4CACE,+BAAI,SAAS,EAAC,6BAA6B,YAAE,KAAK,GAAM,EACvD,QAAQ,CAAC,CAAC,CAAC,8BAAG,SAAS,EAAC,gCAAgC,YAAE,QAAQ,GAAK,CAAC,CAAC,CAAC,IAAI,IAC3E,EACL,OAAO,CAAC,CAAC,CAAC,gCAAK,SAAS,EAAC,+BAA+B,YAAE,OAAO,GAAO,CAAC,CAAC,CAAC,IAAI,IAC5E,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import type { SmartDataTableQuery, SmartDataTableResult } from './types';
3
+ type SmartDataTableProps<T extends Record<string, any>> = {
4
+ prefix: string;
5
+ dataKey: string;
6
+ fetchData: (query: SmartDataTableQuery) => Promise<SmartDataTableResult<T>>;
7
+ children: React.ReactNode;
8
+ title?: React.ReactNode;
9
+ emptyMessage?: React.ReactNode;
10
+ defaultRows?: number;
11
+ rowsPerPageOptions?: number[];
12
+ extraKeys?: string[];
13
+ filterFields?: string[];
14
+ searchPlaceholder?: string;
15
+ headerStart?: React.ReactNode;
16
+ headerEnd?: React.ReactNode;
17
+ reloadToken?: unknown;
18
+ debounceMs?: number;
19
+ tableStyle?: React.CSSProperties;
20
+ className?: string;
21
+ };
22
+ export declare function SmartDataTable<T extends Record<string, any>>(props: SmartDataTableProps<T>): import("react/jsx-runtime").JSX.Element;
23
+ export {};
24
+ //# sourceMappingURL=SmartDataTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartDataTable.d.ts","sourceRoot":"","sources":["../../../src/components/SmartDataTable/SmartDataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEzE,KAAK,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,2CAoJ1F"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SmartDataTable = SmartDataTable;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = __importDefault(require("react"));
9
+ const api_1 = require("primereact/api");
10
+ const button_1 = require("primereact/button");
11
+ const datatable_1 = require("primereact/datatable");
12
+ const inputtext_1 = require("primereact/inputtext");
13
+ const utils_1 = require("primereact/utils");
14
+ const urlState_1 = require("./urlState");
15
+ function toDataTableFilters(filterFields, values) {
16
+ const meta = {};
17
+ for (const field of filterFields ?? []) {
18
+ meta[field] = { value: values[field] ?? null, matchMode: api_1.FilterMatchMode.CONTAINS };
19
+ }
20
+ return meta;
21
+ }
22
+ function SmartDataTable(props) {
23
+ const { fetchData, reloadToken } = props;
24
+ const { query, setQuery } = (0, urlState_1.useSmartDataTableUrlState)({
25
+ prefix: props.prefix,
26
+ defaultRows: props.defaultRows,
27
+ extraKeys: props.extraKeys,
28
+ });
29
+ const [rows, setRows] = react_1.default.useState([]);
30
+ const [total, setTotal] = react_1.default.useState(0);
31
+ const [loading, setLoading] = react_1.default.useState(false);
32
+ const [error, setError] = react_1.default.useState(null);
33
+ const [searchValue, setSearchValue] = react_1.default.useState(query.q ?? '');
34
+ react_1.default.useEffect(() => {
35
+ setSearchValue(query.q ?? '');
36
+ }, [query.q]);
37
+ const debounceMs = props.debounceMs ?? 300;
38
+ react_1.default.useEffect(() => {
39
+ let cancelled = false;
40
+ const handle = window.setTimeout(() => {
41
+ if (cancelled)
42
+ return;
43
+ void (async () => {
44
+ setLoading(true);
45
+ setError(null);
46
+ try {
47
+ const res = await fetchData(query);
48
+ if (cancelled)
49
+ return;
50
+ setRows(res.data ?? []);
51
+ setTotal(res.total ?? 0);
52
+ }
53
+ catch (e) {
54
+ if (cancelled)
55
+ return;
56
+ setRows([]);
57
+ setTotal(0);
58
+ setError(e instanceof Error ? e.message : String(e));
59
+ }
60
+ finally {
61
+ if (!cancelled)
62
+ setLoading(false);
63
+ }
64
+ })();
65
+ }, debounceMs);
66
+ return () => {
67
+ cancelled = true;
68
+ window.clearTimeout(handle);
69
+ };
70
+ }, [debounceMs, fetchData, query, reloadToken]);
71
+ const first = (query.page - 1) * query.rows;
72
+ const onPage = (event) => {
73
+ const nextRows = event.rows ?? query.rows;
74
+ const nextPage = Math.floor((event.first ?? 0) / nextRows) + 1;
75
+ setQuery({ page: nextPage, rows: nextRows });
76
+ };
77
+ const onSort = (event) => {
78
+ const sortField = typeof event.sortField === 'string' ? event.sortField : undefined;
79
+ const sortOrder = event.sortOrder === 1 || event.sortOrder === -1 ? event.sortOrder : undefined;
80
+ setQuery({ sortField, sortOrder, page: 1 });
81
+ };
82
+ const filters = react_1.default.useMemo(() => toDataTableFilters(props.filterFields, query.filters), [props.filterFields, query.filters]);
83
+ const onFilter = (event) => {
84
+ const nextFilters = {};
85
+ for (const field of props.filterFields ?? []) {
86
+ const meta = event.filters?.[field];
87
+ const value = meta?.value;
88
+ if (value != null && String(value).trim())
89
+ nextFilters[field] = String(value);
90
+ }
91
+ setQuery({ filters: nextFilters, page: 1 });
92
+ };
93
+ const clearAll = () => {
94
+ setSearchValue('');
95
+ setQuery({ page: 1, q: '', filters: {}, sortField: undefined, sortOrder: undefined }, { resetPage: true });
96
+ };
97
+ const header = ((0, jsx_runtime_1.jsxs)("div", { className: "rd-smart-table__header", children: [(0, jsx_runtime_1.jsxs)("div", { className: "rd-smart-table__header-left", children: [props.title ? (0, jsx_runtime_1.jsx)("div", { className: "rd-smart-table__title", children: props.title }) : null, props.headerStart] }), (0, jsx_runtime_1.jsxs)("div", { className: "rd-smart-table__header-right", children: [(0, jsx_runtime_1.jsxs)("span", { className: "p-input-icon-left rd-smart-table__search", children: [(0, jsx_runtime_1.jsx)("i", { className: "pi pi-search" }), (0, jsx_runtime_1.jsx)(inputtext_1.InputText, { value: searchValue, onChange: (e) => {
98
+ const next = e.target.value;
99
+ setSearchValue(next);
100
+ setQuery({ q: next, page: 1 });
101
+ }, placeholder: props.searchPlaceholder ?? 'Search...' })] }), (0, jsx_runtime_1.jsx)(button_1.Button, { icon: "pi pi-filter-slash", text: true, severity: "secondary", onClick: clearAll, tooltip: "Clear filters", tooltipOptions: { position: 'top' } }), props.headerEnd] })] }));
102
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.classNames)('rd-smart-table', props.className), children: [error ? (0, jsx_runtime_1.jsx)("div", { className: "rd-smart-table__error", children: error }) : null, (0, jsx_runtime_1.jsx)(datatable_1.DataTable, { value: rows, lazy: true, paginator: true, first: first, rows: query.rows, totalRecords: total, onPage: onPage, rowsPerPageOptions: props.rowsPerPageOptions ?? [10, 20, 50], sortField: query.sortField, sortOrder: query.sortOrder, onSort: onSort, filters: filters, onFilter: props.filterFields?.length ? onFilter : undefined, filterDisplay: props.filterFields?.length ? 'row' : undefined, loading: loading, size: "small", dataKey: props.dataKey, stripedRows: true, rowHover: true, emptyMessage: props.emptyMessage, header: header, tableStyle: props.tableStyle, children: props.children })] }));
103
+ }
104
+ //# sourceMappingURL=SmartDataTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartDataTable.js","sourceRoot":"","sources":["../../../src/components/SmartDataTable/SmartDataTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { SmartDataTableQuery, SmartDataTableResult } from './types';
2
+ type ApplyOptions<T> = {
3
+ searchFields?: Array<keyof T>;
4
+ filterFields?: Array<keyof T>;
5
+ getFieldValue?: (row: T, field: string) => unknown;
6
+ };
7
+ export declare function applySmartDataTableQuery<T>(rows: T[], query: SmartDataTableQuery, options?: ApplyOptions<T>): SmartDataTableResult<T>;
8
+ export {};
9
+ //# sourceMappingURL=applyClientQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyClientQuery.d.ts","sourceRoot":"","sources":["../../../src/components/SmartDataTable/applyClientQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEzE,KAAK,YAAY,CAAC,CAAC,IAAI;IACrB,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CACpD,CAAC;AAeF,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,IAAI,EAAE,CAAC,EAAE,EACT,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,YAAY,CAAC,CAAC,CAAM,GAC5B,oBAAoB,CAAC,CAAC,CAAC,CAsCzB"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applySmartDataTableQuery = applySmartDataTableQuery;
4
+ function normalize(value) {
5
+ return String(value ?? '').toLowerCase();
6
+ }
7
+ function defaultGetFieldValue(row, field) {
8
+ return row[field];
9
+ }
10
+ function matchesContains(haystack, needle) {
11
+ if (!needle)
12
+ return true;
13
+ return normalize(haystack).includes(needle);
14
+ }
15
+ function applySmartDataTableQuery(rows, query, options = {}) {
16
+ const searchNeedle = normalize(query.q);
17
+ const getFieldValue = options.getFieldValue ?? (defaultGetFieldValue);
18
+ const filtered = rows.filter((row) => {
19
+ if (searchNeedle && options.searchFields?.length) {
20
+ const matchAny = options.searchFields.some((field) => matchesContains(getFieldValue(row, String(field)), searchNeedle));
21
+ if (!matchAny)
22
+ return false;
23
+ }
24
+ for (const [field, value] of Object.entries(query.filters ?? {})) {
25
+ if (!value)
26
+ continue;
27
+ if (!matchesContains(getFieldValue(row, field), normalize(value)))
28
+ return false;
29
+ }
30
+ return true;
31
+ });
32
+ const sorted = (() => {
33
+ if (!query.sortField || !query.sortOrder)
34
+ return filtered;
35
+ const field = query.sortField;
36
+ const order = query.sortOrder;
37
+ return [...filtered].sort((a, b) => {
38
+ const av = getFieldValue(a, field);
39
+ const bv = getFieldValue(b, field);
40
+ const an = Number(av);
41
+ const bn = Number(bv);
42
+ if (Number.isFinite(an) && Number.isFinite(bn))
43
+ return order * (an - bn);
44
+ return order * normalize(av).localeCompare(normalize(bv));
45
+ });
46
+ })();
47
+ const total = sorted.length;
48
+ const start = Math.max(0, (query.page - 1) * query.rows);
49
+ const data = sorted.slice(start, start + query.rows);
50
+ return { data, total };
51
+ }
52
+ //# sourceMappingURL=applyClientQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyClientQuery.js","sourceRoot":"","sources":["../../../src/components/SmartDataTable/applyClientQuery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { DataTableFilterMeta } from 'primereact/datatable';
2
+ export type SmartSortOrder = 1 | -1;
3
+ export type SmartDataTableQuery = {
4
+ page: number;
5
+ rows: number;
6
+ sortField?: string;
7
+ sortOrder?: SmartSortOrder;
8
+ q?: string;
9
+ filters: Record<string, string>;
10
+ extra: Record<string, string>;
11
+ };
12
+ export type SmartDataTableResult<T> = {
13
+ data: T[];
14
+ total: number;
15
+ };
16
+ export type SmartDataTableFilterMeta = DataTableFilterMeta;
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/SmartDataTable/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAEpC,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI;IACpC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/SmartDataTable/types.ts"],"names":[],"mappings":""}