@ziky/ui 0.1.8 → 0.2.0

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 (57) hide show
  1. package/README.md +38 -6
  2. package/dist/components/FilePicker.d.ts +22 -0
  3. package/dist/components/FilePicker.d.ts.map +1 -0
  4. package/dist/components/FilePicker.js +93 -0
  5. package/dist/components/FilePicker.js.map +1 -0
  6. package/dist/components/ImageUploadField.d.ts +21 -0
  7. package/dist/components/ImageUploadField.d.ts.map +1 -0
  8. package/dist/components/ImageUploadField.js +35 -0
  9. package/dist/components/ImageUploadField.js.map +1 -0
  10. package/dist/components/SmartAvatar.d.ts +16 -0
  11. package/dist/components/SmartAvatar.d.ts.map +1 -0
  12. package/dist/components/SmartAvatar.js +57 -0
  13. package/dist/components/SmartAvatar.js.map +1 -0
  14. package/dist/components/SmartCheckbox.d.ts +33 -0
  15. package/dist/components/SmartCheckbox.d.ts.map +1 -0
  16. package/dist/components/SmartCheckbox.js +53 -0
  17. package/dist/components/SmartCheckbox.js.map +1 -0
  18. package/dist/components/SmartDataTable/SmartDataTable.d.ts +30 -0
  19. package/dist/components/SmartDataTable/SmartDataTable.d.ts.map +1 -0
  20. package/dist/components/SmartDataTable/SmartDataTable.js +132 -0
  21. package/dist/components/SmartDataTable/SmartDataTable.js.map +1 -0
  22. package/dist/components/SmartDataTable/applyClientQuery.d.ts +9 -0
  23. package/dist/components/SmartDataTable/applyClientQuery.d.ts.map +1 -0
  24. package/dist/components/SmartDataTable/applyClientQuery.js +52 -0
  25. package/dist/components/SmartDataTable/applyClientQuery.js.map +1 -0
  26. package/dist/components/SmartDataTable/types.d.ts +17 -0
  27. package/dist/components/SmartDataTable/types.d.ts.map +1 -0
  28. package/dist/components/SmartDataTable/types.js +3 -0
  29. package/dist/components/SmartDataTable/types.js.map +1 -0
  30. package/dist/components/SmartDataTable/urlState.d.ts +20 -0
  31. package/dist/components/SmartDataTable/urlState.d.ts.map +1 -0
  32. package/dist/components/SmartDataTable/urlState.js +117 -0
  33. package/dist/components/SmartDataTable/urlState.js.map +1 -0
  34. package/dist/index.d.ts +8 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +11 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/layout/AppTopbar.d.ts.map +1 -1
  39. package/dist/layout/AppTopbar.js +2 -1
  40. package/dist/layout/AppTopbar.js.map +1 -1
  41. package/dist/providers/RidinProviders.d.ts.map +1 -1
  42. package/dist/providers/RidinProviders.js +2 -1
  43. package/dist/providers/RidinProviders.js.map +1 -1
  44. package/dist/providers/SmartDialogProvider.d.ts +19 -0
  45. package/dist/providers/SmartDialogProvider.d.ts.map +1 -0
  46. package/dist/providers/SmartDialogProvider.js +74 -0
  47. package/dist/providers/SmartDialogProvider.js.map +1 -0
  48. package/dist/styles/components/filepicker.css +69 -0
  49. package/dist/styles/components/smartcheckbox.css +33 -0
  50. package/dist/styles/index.d.ts +2 -0
  51. package/dist/styles/index.d.ts.map +1 -1
  52. package/dist/styles/index.js +2 -0
  53. package/dist/styles/index.js.map +1 -1
  54. package/dist/styles/index.ts +2 -0
  55. package/dist/styles/layout/_smartdatatable.scss +38 -0
  56. package/dist/styles/layout/layout.scss +5 -4
  57. package/package.json +3 -1
package/README.md CHANGED
@@ -1,11 +1,43 @@
1
1
  # ridin-mfe-ui
2
2
 
3
- Shared UI package for RIDIN MFEs (published to npm as `@ziky/ui`).
4
-
5
- ## Storybook
6
-
7
- ```bash
8
- npm install
3
+ Shared UI package for RIDIN MFEs (published to npm as `@ziky/ui`).
4
+
5
+ ## Usage
6
+
7
+ ```tsx
8
+ import React from 'react';
9
+ import { SmartCheckbox } from '@ziky/ui';
10
+
11
+ export function Example() {
12
+ const [value, setValue] = React.useState(false);
13
+ return <SmartCheckbox label="Active" value={value} onValueChange={setValue} />;
14
+ }
15
+ ```
16
+
17
+ React Hook Form (via `Controller`):
18
+
19
+ ```tsx
20
+ import { Controller } from 'react-hook-form';
21
+ import { SmartCheckbox } from '@ziky/ui';
22
+
23
+ <Controller
24
+ name="isActive"
25
+ control={control}
26
+ render={({ field, fieldState }) => (
27
+ <SmartCheckbox
28
+ label="Active"
29
+ value={field.value ?? false}
30
+ onValueChange={field.onChange}
31
+ errorText={fieldState.error?.message}
32
+ />
33
+ )}
34
+ />
35
+ ```
36
+
37
+ ## Storybook
38
+
39
+ ```bash
40
+ npm install
9
41
  npm run storybook
10
42
  ```
11
43
 
@@ -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":"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"}
@@ -0,0 +1,21 @@
1
+ import type { CSSProperties } from 'react';
2
+ import type { FilePickerProps } from './FilePicker';
3
+ export type ImageUploadFieldProps = {
4
+ label: string;
5
+ value?: string | null;
6
+ onChange?: (value: string) => void;
7
+ file: File | null;
8
+ onFileChange: (file: File | null) => void;
9
+ onUpload: () => void;
10
+ uploading?: boolean;
11
+ error?: string | null;
12
+ helperText?: string;
13
+ chooseLabel?: string;
14
+ uploadLabel?: string;
15
+ urlPlaceholder?: string;
16
+ filePickerProps?: Omit<FilePickerProps, 'file' | 'onFileChange'>;
17
+ className?: string;
18
+ style?: CSSProperties;
19
+ };
20
+ export declare function ImageUploadField({ label, value, onChange, file, onFileChange, onUpload, uploading, error, helperText, chooseLabel, uploadLabel, urlPlaceholder, filePickerProps, className, style, }: ImageUploadFieldProps): import("react/jsx-runtime").JSX.Element;
21
+ //# 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,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,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;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,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,EACf,SAAS,EACT,KAAK,GACN,EAAE,qBAAqB,2CAoFvB"}
@@ -0,0 +1,35 @@
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, className, style, }) {
9
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, style: style, 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: 'minmax(80px, 120px) minmax(0, 1fr)',
15
+ gap: '0.75rem',
16
+ alignItems: 'center',
17
+ background: 'var(--surface-0)',
18
+ }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
19
+ width: '100%',
20
+ minWidth: 80,
21
+ height: 90,
22
+ borderRadius: 10,
23
+ background: 'var(--surface-100)',
24
+ display: 'flex',
25
+ alignItems: 'center',
26
+ justifyContent: 'center',
27
+ overflow: 'hidden',
28
+ }, 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', minWidth: 0 }, children: [typeof onChange === 'function' ? ((0, jsx_runtime_1.jsx)(inputtext_1.InputText, { value: value ?? '', onChange: (e) => onChange(e.target.value), placeholder: urlPlaceholder, style: { width: '100%' } })) : null, (0, jsx_runtime_1.jsxs)("div", { style: {
29
+ display: 'flex',
30
+ flexWrap: 'wrap',
31
+ gap: '0.75rem',
32
+ alignItems: 'center',
33
+ }, children: [(0, jsx_runtime_1.jsx)("div", { style: { flex: '1 1 320px', minWidth: 0 }, 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, style: { whiteSpace: 'nowrap' } })] }), error ? (0, jsx_runtime_1.jsx)("div", { className: "p-error", children: error }) : null] })] })] }));
34
+ }
35
+ //# sourceMappingURL=ImageUploadField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageUploadField.js","sourceRoot":"","sources":["../../src/components/ImageUploadField.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ export type SmartAvatarProps = {
3
+ src?: string | null;
4
+ name?: string | null;
5
+ size?: number;
6
+ alt?: string;
7
+ title?: string;
8
+ href?: string;
9
+ target?: string;
10
+ rel?: string;
11
+ onClick?: React.MouseEventHandler<HTMLElement>;
12
+ className?: string;
13
+ style?: React.CSSProperties;
14
+ };
15
+ export declare function SmartAvatar({ src, name, size, alt, title, href, target, rel, onClick, className, style, }: SmartAvatarProps): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=SmartAvatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartAvatar.d.ts","sourceRoot":"","sources":["../../src/components/SmartAvatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,CAAC;AAUF,wBAAgB,WAAW,CAAC,EAC1B,GAAG,EACH,IAAI,EACJ,IAAS,EACT,GAAQ,EACR,KAAK,EACL,IAAI,EACJ,MAAiB,EACjB,GAA2B,EAC3B,OAAO,EACP,SAAS,EACT,KAAK,GACN,EAAE,gBAAgB,2CAsFlB"}
@@ -0,0 +1,57 @@
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.SmartAvatar = SmartAvatar;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = __importDefault(require("react"));
9
+ function getInitials(value) {
10
+ const parts = value.trim().split(/\s+/).filter(Boolean);
11
+ if (!parts.length)
12
+ return '?';
13
+ const first = parts[0]?.[0] ?? '';
14
+ const last = parts.length > 1 ? parts[parts.length - 1]?.[0] ?? '' : '';
15
+ return (first + last).toUpperCase() || '?';
16
+ }
17
+ function SmartAvatar({ src, name, size = 36, alt = '', title, href, target = '_blank', rel = 'noreferrer noopener', onClick, className, style, }) {
18
+ const [errored, setErrored] = react_1.default.useState(false);
19
+ react_1.default.useEffect(() => {
20
+ setErrored(false);
21
+ }, [src]);
22
+ const initials = react_1.default.useMemo(() => getInitials(name?.trim() || ''), [name]);
23
+ const canShowImage = Boolean(src && src.trim() && !errored);
24
+ const interactive = Boolean(href || onClick);
25
+ const baseStyle = {
26
+ position: 'relative',
27
+ width: size,
28
+ height: size,
29
+ borderRadius: 9999,
30
+ overflow: 'hidden',
31
+ border: '1px solid var(--surface-border)',
32
+ background: 'var(--surface-100)',
33
+ display: 'inline-flex',
34
+ alignItems: 'center',
35
+ justifyContent: 'center',
36
+ userSelect: 'none',
37
+ cursor: interactive ? 'pointer' : undefined,
38
+ ...style,
39
+ };
40
+ const inner = canShowImage ? ((0, jsx_runtime_1.jsx)("img", { src: src ?? undefined, alt: alt, title: title, loading: "lazy", style: { width: '100%', height: '100%', objectFit: 'cover' }, onError: () => setErrored(true) })) : ((0, jsx_runtime_1.jsx)("span", { "aria-hidden": true, title: title, style: {
41
+ fontSize: Math.max(10, Math.round(size * 0.34)),
42
+ fontWeight: 700,
43
+ color: 'var(--text-700, #334155)',
44
+ }, children: initials }));
45
+ if (href) {
46
+ return ((0, jsx_runtime_1.jsx)("a", { href: href, target: target, rel: rel, onClick: onClick, className: className, style: { display: 'inline-flex' }, children: (0, jsx_runtime_1.jsx)("span", { style: baseStyle, "aria-label": name ?? alt, children: inner }) }));
47
+ }
48
+ return ((0, jsx_runtime_1.jsx)("span", { className: className, style: baseStyle, onClick: onClick, role: interactive ? 'button' : undefined, tabIndex: interactive ? 0 : undefined, "aria-label": name ?? alt, onKeyDown: (e) => {
49
+ if (!interactive)
50
+ return;
51
+ if (e.key === 'Enter' || e.key === ' ') {
52
+ e.preventDefault();
53
+ onClick?.(e);
54
+ }
55
+ }, children: inner }));
56
+ }
57
+ //# sourceMappingURL=SmartAvatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartAvatar.js","sourceRoot":"","sources":["../../src/components/SmartAvatar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ export type SmartCheckboxLabelPosition = 'left' | 'right';
3
+ type SmartCheckboxBaseProps = {
4
+ label?: React.ReactNode;
5
+ labelPosition?: SmartCheckboxLabelPosition;
6
+ helperText?: React.ReactNode;
7
+ errorText?: React.ReactNode;
8
+ invalid?: boolean;
9
+ disabled?: boolean;
10
+ readOnly?: boolean;
11
+ required?: boolean;
12
+ name?: string;
13
+ inputId?: string;
14
+ tooltip?: string;
15
+ tooltipOptions?: unknown;
16
+ className?: string;
17
+ style?: React.CSSProperties;
18
+ onRawChange?: (event: unknown) => void;
19
+ };
20
+ export type SmartCheckboxProps = (SmartCheckboxBaseProps & {
21
+ triState?: false;
22
+ value?: boolean;
23
+ defaultValue?: boolean;
24
+ onValueChange?: (value: boolean) => void;
25
+ }) | (SmartCheckboxBaseProps & {
26
+ triState: true;
27
+ value?: boolean | null;
28
+ defaultValue?: boolean | null;
29
+ onValueChange?: (value: boolean | null) => void;
30
+ });
31
+ export declare function SmartCheckbox(props: SmartCheckboxProps): import("react/jsx-runtime").JSX.Element;
32
+ export {};
33
+ //# sourceMappingURL=SmartCheckbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartCheckbox.d.ts","sourceRoot":"","sources":["../../src/components/SmartCheckbox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1D,KAAK,sBAAsB,GAAG;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAC3C,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,CAAC,sBAAsB,GAAG;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C,CAAC,GACF,CAAC,sBAAsB,GAAG;IACxB,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;CACjD,CAAC,CAAC;AAEP,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CAsHtD"}
@@ -0,0 +1,53 @@
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.SmartCheckbox = SmartCheckbox;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = __importDefault(require("react"));
9
+ const checkbox_1 = require("primereact/checkbox");
10
+ const tristatecheckbox_1 = require("primereact/tristatecheckbox");
11
+ function SmartCheckbox(props) {
12
+ const { label, labelPosition = 'right', helperText, errorText, invalid, disabled, readOnly, required, name, inputId, tooltip, tooltipOptions, className, style, onRawChange, onValueChange, } = props;
13
+ const isTriState = props.triState === true;
14
+ const fallbackId = react_1.default.useId();
15
+ const checkboxId = inputId ?? `sakai-smart-checkbox-${fallbackId}`;
16
+ const valueProp = props.value;
17
+ const isControlled = valueProp !== undefined || (isTriState && valueProp === null);
18
+ const initialValue = react_1.default.useMemo(() => {
19
+ if (props.defaultValue !== undefined)
20
+ return props.defaultValue;
21
+ return isTriState ? null : false;
22
+ }, [isTriState, props.defaultValue]);
23
+ const [uncontrolledValue, setUncontrolledValue] = react_1.default.useState(initialValue);
24
+ const value = (isControlled ? valueProp : uncontrolledValue);
25
+ const showInvalid = Boolean(invalid || errorText);
26
+ const triStateRef = react_1.default.useRef(null);
27
+ const setValue = react_1.default.useCallback((next, rawEvent) => {
28
+ if (!isControlled)
29
+ setUncontrolledValue(next);
30
+ onValueChange?.(next);
31
+ onRawChange?.(rawEvent);
32
+ }, [isControlled, onRawChange, onValueChange]);
33
+ const onLabelClick = react_1.default.useCallback(() => {
34
+ if (disabled || readOnly)
35
+ return;
36
+ if (!isTriState)
37
+ return;
38
+ triStateRef.current?.getElement()?.click();
39
+ }, [disabled, isTriState, readOnly]);
40
+ const control = isTriState ? ((0, jsx_runtime_1.jsx)(tristatecheckbox_1.TriStateCheckbox, { ref: triStateRef, id: checkboxId, value: (value ?? null), onChange: (e) => setValue((e.value ?? null), e), disabled: disabled, readOnly: readOnly, required: required, invalid: showInvalid, tooltip: tooltip, tooltipOptions: tooltipOptions })) : ((0, jsx_runtime_1.jsx)(checkbox_1.Checkbox, { inputId: checkboxId, name: name, checked: Boolean(value), onChange: (e) => setValue(Boolean(e.checked), e), disabled: disabled, readOnly: readOnly, required: required, invalid: showInvalid, tooltip: tooltip, tooltipOptions: tooltipOptions }));
41
+ const labelNode = label ? (
42
+ // For TriStateCheckbox, htmlFor isn't supported; we forward click to the component.
43
+ (0, jsx_runtime_1.jsxs)("label", { className: "sakai-smart-checkbox__label", htmlFor: !isTriState ? checkboxId : undefined, onClick: isTriState ? onLabelClick : undefined, children: [label, required ? (0, jsx_runtime_1.jsx)("span", { className: "sakai-smart-checkbox__required", children: " *" }) : null] })) : null;
44
+ return ((0, jsx_runtime_1.jsxs)("div", { className: [
45
+ 'sakai-smart-checkbox',
46
+ showInvalid ? 'sakai-smart-checkbox--invalid' : '',
47
+ disabled ? 'sakai-smart-checkbox--disabled' : '',
48
+ className ?? '',
49
+ ]
50
+ .filter(Boolean)
51
+ .join(' '), style: style, children: [(0, jsx_runtime_1.jsxs)("div", { className: "sakai-smart-checkbox__row", children: [labelPosition === 'left' ? labelNode : null, control, labelPosition === 'right' ? labelNode : null] }), errorText ? (0, jsx_runtime_1.jsx)("div", { className: "p-error sakai-smart-checkbox__helper", children: errorText }) : null, !errorText && helperText ? ((0, jsx_runtime_1.jsx)("div", { className: "sakai-smart-checkbox__helper", children: helperText })) : null] }));
52
+ }
53
+ //# sourceMappingURL=SmartCheckbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartCheckbox.js","sourceRoot":"","sources":["../../src/components/SmartCheckbox.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import { type DataTableProps } from 'primereact/datatable';
3
+ import type { SmartDataTableQuery, SmartDataTableResult } from './types';
4
+ type SmartDataTableProps<T extends Record<string, any>> = {
5
+ prefix: string;
6
+ dataKey: string;
7
+ fetchData: (query: SmartDataTableQuery) => Promise<SmartDataTableResult<T>>;
8
+ children: React.ReactNode;
9
+ title?: React.ReactNode;
10
+ emptyMessage?: React.ReactNode;
11
+ defaultRows?: number;
12
+ rowsPerPageOptions?: number[];
13
+ extraKeys?: string[];
14
+ filterFields?: string[];
15
+ searchPlaceholder?: string;
16
+ showSearch?: boolean;
17
+ showClear?: boolean;
18
+ headerStart?: React.ReactNode;
19
+ headerEnd?: React.ReactNode;
20
+ reloadToken?: unknown;
21
+ debounceMs?: number;
22
+ tableStyle?: React.CSSProperties;
23
+ className?: string;
24
+ autoSortableColumns?: boolean;
25
+ autoFilterColumns?: boolean;
26
+ dataTableProps?: Partial<DataTableProps<any>>;
27
+ };
28
+ export declare function SmartDataTable<T extends Record<string, any>>(props: SmartDataTableProps<T>): import("react/jsx-runtime").JSX.Element;
29
+ export {};
30
+ //# 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;AAG1B,OAAO,EAIL,KAAK,cAAc,EAEpB,MAAM,sBAAsB,CAAC;AAI9B,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,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,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;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;CAC/C,CAAC;AAUF,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,2CA8L1F"}
@@ -0,0 +1,132 @@
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 autoSortableColumns = props.autoSortableColumns ?? true;
30
+ const autoFilterColumns = props.autoFilterColumns ?? true;
31
+ const showSearch = props.showSearch ?? true;
32
+ const showClear = props.showClear ?? true;
33
+ const [rows, setRows] = react_1.default.useState([]);
34
+ const [total, setTotal] = react_1.default.useState(0);
35
+ const [loading, setLoading] = react_1.default.useState(false);
36
+ const [error, setError] = react_1.default.useState(null);
37
+ const [searchValue, setSearchValue] = react_1.default.useState(query.q ?? '');
38
+ react_1.default.useEffect(() => {
39
+ setSearchValue(query.q ?? '');
40
+ }, [query.q]);
41
+ const debounceMs = props.debounceMs ?? 300;
42
+ react_1.default.useEffect(() => {
43
+ let cancelled = false;
44
+ const handle = window.setTimeout(() => {
45
+ if (cancelled)
46
+ return;
47
+ void (async () => {
48
+ setLoading(true);
49
+ setError(null);
50
+ try {
51
+ const res = await fetchData(query);
52
+ if (cancelled)
53
+ return;
54
+ setRows(res.data ?? []);
55
+ setTotal(res.total ?? 0);
56
+ }
57
+ catch (e) {
58
+ if (cancelled)
59
+ return;
60
+ setRows([]);
61
+ setTotal(0);
62
+ setError(e instanceof Error ? e.message : String(e));
63
+ }
64
+ finally {
65
+ if (!cancelled)
66
+ setLoading(false);
67
+ }
68
+ })();
69
+ }, debounceMs);
70
+ return () => {
71
+ cancelled = true;
72
+ window.clearTimeout(handle);
73
+ };
74
+ }, [debounceMs, fetchData, query, reloadToken]);
75
+ const first = (query.page - 1) * query.rows;
76
+ const onPage = (event) => {
77
+ const nextRows = event.rows ?? query.rows;
78
+ const nextPage = Math.floor((event.first ?? 0) / nextRows) + 1;
79
+ setQuery({ page: nextPage, rows: nextRows });
80
+ };
81
+ const onSort = (event) => {
82
+ const sortField = typeof event.sortField === 'string' ? event.sortField : undefined;
83
+ const sortOrder = event.sortOrder === 1 || event.sortOrder === -1 ? event.sortOrder : undefined;
84
+ setQuery({ sortField, sortOrder, page: 1 });
85
+ };
86
+ const filters = react_1.default.useMemo(() => toDataTableFilters(props.filterFields, query.filters), [props.filterFields, query.filters]);
87
+ const onFilter = (event) => {
88
+ const nextFilters = {};
89
+ for (const field of props.filterFields ?? []) {
90
+ const meta = event.filters?.[field];
91
+ const value = meta?.value;
92
+ if (value != null && String(value).trim())
93
+ nextFilters[field] = String(value);
94
+ }
95
+ setQuery({ filters: nextFilters, page: 1 });
96
+ };
97
+ const clearAll = () => {
98
+ setSearchValue('');
99
+ setQuery({ page: 1, q: '', filters: {}, sortField: undefined, sortOrder: undefined }, { resetPage: true });
100
+ };
101
+ 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: [showSearch ? ((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) => {
102
+ const next = e.target.value;
103
+ setSearchValue(next);
104
+ setQuery({ q: next, page: 1 });
105
+ }, placeholder: props.searchPlaceholder ?? 'Search...' })] })) : null, showClear ? ((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' } })) : null, props.headerEnd] })] }));
106
+ const enhancedChildren = react_1.default.useMemo(() => {
107
+ const filterable = new Set(props.filterFields ?? []);
108
+ return react_1.default.Children.map(props.children, (child) => {
109
+ if (!react_1.default.isValidElement(child))
110
+ return child;
111
+ const childProps = child.props ?? {};
112
+ const fieldName = typeof childProps.sortField === 'string'
113
+ ? childProps.sortField
114
+ : typeof childProps.field === 'string'
115
+ ? childProps.field
116
+ : undefined;
117
+ if (!fieldName)
118
+ return child;
119
+ const nextProps = {};
120
+ if (autoSortableColumns && childProps.sortable === undefined) {
121
+ nextProps.sortable = true;
122
+ }
123
+ if (autoFilterColumns && filterable.has(fieldName) && childProps.filter === undefined) {
124
+ nextProps.filter = true;
125
+ nextProps.showFilterMenu = false;
126
+ }
127
+ return Object.keys(nextProps).length ? react_1.default.cloneElement(child, nextProps) : child;
128
+ });
129
+ }, [autoFilterColumns, autoSortableColumns, props.children, props.filterFields]);
130
+ 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, removableSort: true, 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, ...props.dataTableProps, children: enhancedChildren })] }));
131
+ }
132
+ //# sourceMappingURL=SmartDataTable.js.map