@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.
- package/README.md +38 -6
- package/dist/components/FilePicker.d.ts +22 -0
- package/dist/components/FilePicker.d.ts.map +1 -0
- package/dist/components/FilePicker.js +93 -0
- package/dist/components/FilePicker.js.map +1 -0
- package/dist/components/ImageUploadField.d.ts +21 -0
- package/dist/components/ImageUploadField.d.ts.map +1 -0
- package/dist/components/ImageUploadField.js +35 -0
- package/dist/components/ImageUploadField.js.map +1 -0
- package/dist/components/SmartAvatar.d.ts +16 -0
- package/dist/components/SmartAvatar.d.ts.map +1 -0
- package/dist/components/SmartAvatar.js +57 -0
- package/dist/components/SmartAvatar.js.map +1 -0
- package/dist/components/SmartCheckbox.d.ts +33 -0
- package/dist/components/SmartCheckbox.d.ts.map +1 -0
- package/dist/components/SmartCheckbox.js +53 -0
- package/dist/components/SmartCheckbox.js.map +1 -0
- package/dist/components/SmartDataTable/SmartDataTable.d.ts +30 -0
- package/dist/components/SmartDataTable/SmartDataTable.d.ts.map +1 -0
- package/dist/components/SmartDataTable/SmartDataTable.js +132 -0
- package/dist/components/SmartDataTable/SmartDataTable.js.map +1 -0
- package/dist/components/SmartDataTable/applyClientQuery.d.ts +9 -0
- package/dist/components/SmartDataTable/applyClientQuery.d.ts.map +1 -0
- package/dist/components/SmartDataTable/applyClientQuery.js +52 -0
- package/dist/components/SmartDataTable/applyClientQuery.js.map +1 -0
- package/dist/components/SmartDataTable/types.d.ts +17 -0
- package/dist/components/SmartDataTable/types.d.ts.map +1 -0
- package/dist/components/SmartDataTable/types.js +3 -0
- package/dist/components/SmartDataTable/types.js.map +1 -0
- package/dist/components/SmartDataTable/urlState.d.ts +20 -0
- package/dist/components/SmartDataTable/urlState.d.ts.map +1 -0
- package/dist/components/SmartDataTable/urlState.js +117 -0
- package/dist/components/SmartDataTable/urlState.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/AppTopbar.d.ts.map +1 -1
- package/dist/layout/AppTopbar.js +2 -1
- package/dist/layout/AppTopbar.js.map +1 -1
- package/dist/providers/RidinProviders.d.ts.map +1 -1
- package/dist/providers/RidinProviders.js +2 -1
- package/dist/providers/RidinProviders.js.map +1 -1
- package/dist/providers/SmartDialogProvider.d.ts +19 -0
- package/dist/providers/SmartDialogProvider.d.ts.map +1 -0
- package/dist/providers/SmartDialogProvider.js +74 -0
- package/dist/providers/SmartDialogProvider.js.map +1 -0
- package/dist/styles/components/filepicker.css +69 -0
- package/dist/styles/components/smartcheckbox.css +33 -0
- package/dist/styles/index.d.ts +2 -0
- package/dist/styles/index.d.ts.map +1 -1
- package/dist/styles/index.js +2 -0
- package/dist/styles/index.js.map +1 -1
- package/dist/styles/index.ts +2 -0
- package/dist/styles/layout/_smartdatatable.scss +38 -0
- package/dist/styles/layout/layout.scss +5 -4
- 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
|
-
##
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
|
|
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":";;AAyBA,4CAoGC;;AA5HD,8CAA2C;AAC3C,oDAAiD;AAGjD,6CAA0C;AAoB1C,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,EACf,SAAS,EACT,KAAK,GACiB;IACtB,OAAO,CACL,iCAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,aACrC,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,oCAAoC;oBACzD,GAAG,EAAE,SAAS;oBACd,UAAU,EAAE,QAAQ;oBACpB,UAAU,EAAE,kBAAkB;iBAC/B,aAED,gCACE,KAAK,EAAE;4BACL,KAAK,EAAE,MAAM;4BACb,QAAQ,EAAE,EAAE;4BACZ,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,QAAQ,EAAE,CAAC,EAAE,aACxD,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,EAC3B,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GACxB,CACH,CAAC,CAAC,CAAC,IAAI,EACR,iCACE,KAAK,EAAE;oCACL,OAAO,EAAE,MAAM;oCACf,QAAQ,EAAE,MAAM;oCAChB,GAAG,EAAE,SAAS;oCACd,UAAU,EAAE,QAAQ;iCACrB,aAED,gCAAK,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,YAC5C,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,GACE,EACN,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,EAC5B,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,GAC/B,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,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":";;;;;AAsCA,sCAsHC;;AA5JD,kDAA0B;AAC1B,kDAA+C;AAC/C,kEAA+D;AAoC/D,SAAgB,aAAa,CAAC,KAAyB;IACrD,MAAM,EACJ,KAAK,EACL,aAAa,GAAG,OAAO,EACvB,UAAU,EACV,SAAS,EACT,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,OAAO,EACP,cAAc,EACd,SAAS,EACT,KAAK,EACL,WAAW,EACX,aAAa,GACd,GAAG,KAAK,CAAC;IAEV,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC3C,MAAM,UAAU,GAAG,eAAK,CAAC,KAAK,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,OAAO,IAAI,wBAAwB,UAAU,EAAE,CAAC;IAEnE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;IAC9B,MAAM,YAAY,GAAG,SAAS,KAAK,SAAS,IAAI,CAAC,UAAU,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC;IAEnF,MAAM,YAAY,GAAG,eAAK,CAAC,OAAO,CAAiB,GAAG,EAAE;QACtD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,YAA8B,CAAC;QAClF,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACnC,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAErC,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,eAAK,CAAC,QAAQ,CAAiB,YAAY,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAA+B,CAAC;IAE3F,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;IAElD,MAAM,WAAW,GAAG,eAAK,CAAC,MAAM,CAAmB,IAAI,CAAC,CAAC;IAEzD,MAAM,QAAQ,GAAG,eAAK,CAAC,WAAW,CAChC,CAAC,IAAoB,EAAE,QAAiB,EAAE,EAAE;QAC1C,IAAI,CAAC,YAAY;YAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC7C,aAAqB,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/B,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC,EACD,CAAC,YAAY,EAAE,WAAW,EAAE,aAAa,CAAC,CAC3C,CAAC;IAEF,MAAM,YAAY,GAAG,eAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC1C,IAAI,QAAQ,IAAI,QAAQ;YAAE,OAAO;QACjC,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAC3B,uBAAC,mCAAgB,IACf,GAAG,EAAE,WAAW,EAChB,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,CAAC,KAAK,IAAI,IAAI,CAAmB,EACxC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAmB,EAAE,CAAC,CAAC,EACjE,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,cAAqB,GACrC,CACH,CAAC,CAAC,CAAC,CACF,uBAAC,mBAAQ,IACP,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EACvB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAChD,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,cAAqB,GACrC,CACH,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;IACxB,oFAAoF;IACpF,mCACE,SAAS,EAAC,6BAA6B,EACvC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAC7C,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,aAE7C,KAAK,EACL,QAAQ,CAAC,CAAC,CAAC,iCAAM,SAAS,EAAC,gCAAgC,mBAAU,CAAC,CAAC,CAAC,IAAI,IACvE,CACT,CAAC,CAAC,CAAC,IAAI,CAAC;IAET,OAAO,CACL,iCACE,SAAS,EAAE;YACT,sBAAsB;YACtB,WAAW,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE;YAClD,QAAQ,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,EAAE;YAChD,SAAS,IAAI,EAAE;SAChB;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,EACZ,KAAK,EAAE,KAAK,aAEZ,iCAAK,SAAS,EAAC,2BAA2B,aACvC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAC3C,OAAO,EACP,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IACzC,EAEL,SAAS,CAAC,CAAC,CAAC,gCAAK,SAAS,EAAC,sCAAsC,YAAE,SAAS,GAAO,CAAC,CAAC,CAAC,IAAI,EAC1F,CAAC,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,CAC1B,gCAAK,SAAS,EAAC,8BAA8B,YAAE,UAAU,GAAO,CACjE,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -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
|