@materialui-reactjs/admin 1.0.6 → 2.0.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/CHANGELOG.md +292 -0
- package/LICENSE +21 -0
- package/README.md +584 -453
- package/dist/Common-1GAoFU4L.js +261 -0
- package/dist/Common-BBYXssMH.cjs +11 -0
- package/dist/Env-DoS-iQjs.cjs +1 -0
- package/dist/Env-SHztUA3s.js +16 -0
- package/dist/HeaderUpdate-DIwc8EAA.cjs +1 -0
- package/dist/{chunks/HeaderUpdate-DuS-gHNR.js → HeaderUpdate-UXncZcAD.js} +8 -4
- package/dist/SortableItem-C3KzO8Xh.cjs +1 -0
- package/dist/SpinnerLoader-BujLjvC3.cjs +1 -0
- package/dist/{chunks/SpinnerLoader-h8RDIarB.js → SpinnerLoader-CyhOQC6d.js} +2 -2
- package/dist/UDragFile-BqGt1-gK.js +96 -0
- package/dist/UDragFile-oJ05zNLR.cjs +1 -0
- package/dist/Validator-BcydBvOg.cjs +1 -0
- package/dist/{chunks/Validator-CXYkI7vJ.js → Validator-aKlMgoxl.js} +50 -42
- package/dist/assets/css/form.css +1 -1
- package/dist/assets/css/index.css +1 -1
- package/dist/common-CHDJQ2Ca.cjs +1 -0
- package/dist/common-DVWX6AUQ.js +19 -0
- package/dist/components/echarts/index.cjs +1 -0
- package/dist/components/echarts/index.js +1 -1
- package/dist/components/form/AdvancedMultiSelect.d.ts +6 -3
- package/dist/components/form/AsxhUImages.d.ts +1 -1
- package/dist/components/form/BoxAddRow.d.ts +11 -1
- package/dist/components/form/CheckTreeBox.d.ts +12 -3
- package/dist/components/form/DateInput.d.ts +2 -1
- package/dist/components/form/EfFile.d.ts +2 -1
- package/dist/components/form/EfImage.d.ts +1 -1
- package/dist/components/form/EfImages.d.ts +1 -1
- package/dist/components/form/PImage.d.ts +1 -1
- package/dist/components/form/SelectAddRowBox.d.ts +9 -5
- package/dist/components/form/UDragFile.d.ts +1 -1
- package/dist/components/form/UFile.d.ts +1 -1
- package/dist/components/form/UFiles.d.ts +1 -1
- package/dist/components/form/UImages.d.ts +1 -1
- package/dist/components/form/index.cjs +1 -0
- package/dist/components/form/index.js +2 -2
- package/dist/components/loader/SpinnerLoader.d.ts +5 -1
- package/dist/components/loader/index.cjs +1 -0
- package/dist/components/loader/index.js +1 -2
- package/dist/components/meta/CardTable.d.ts +7 -3
- package/dist/components/meta/CardTable.types.d.ts +51 -0
- package/dist/components/meta/CusTooltip.d.ts +1 -1
- package/dist/components/meta/Head.d.ts +1 -1
- package/dist/components/meta/HeaderUpdate.d.ts +5 -1
- package/dist/components/meta/ModalForm.d.ts +41 -11
- package/dist/components/meta/Navtabs.d.ts +1 -1
- package/dist/components/meta/SearchBox.d.ts +6 -4
- package/dist/components/meta/SortableItem.d.ts +1 -1
- package/dist/components/meta/index.cjs +1 -0
- package/dist/components/meta/index.d.ts +1 -0
- package/dist/components/meta/index.js +3 -3
- package/dist/components/sidebar/Sidebar.types.d.ts +9 -7
- package/dist/components/sidebar/index.cjs +1 -0
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/single/Detail.d.ts +8 -3
- package/dist/components/single/Fields.d.ts +10 -4
- package/dist/components/single/Import.d.ts +8 -3
- package/dist/components/single/List.d.ts +18 -3
- package/dist/components/single/Update.d.ts +8 -3
- package/dist/components/single/UpdateDetail.d.ts +3 -2
- package/dist/components/single/UpdateTableDetail.d.ts +3 -3
- package/dist/components/single/index.cjs +1 -0
- package/dist/components/single/index.js +1 -1
- package/dist/components/top-navbar/index.cjs +1 -0
- package/dist/components/top-navbar/index.js +78 -2
- package/dist/echarts-Dla22xas.cjs +1 -0
- package/dist/{chunks/form-CPkpL5eA.js → form-BNAbGCXe.js} +6860 -6794
- package/dist/form-DUL_O4IY.cjs +65 -0
- package/dist/hook/common.d.ts +65 -0
- package/dist/hook/detail.cjs +1 -0
- package/dist/hook/detail.d.ts +9 -15
- package/dist/hook/detail.js +1 -11
- package/dist/hook/fields.cjs +1 -0
- package/dist/hook/fields.d.ts +6 -14
- package/dist/hook/fields.js +1 -11
- package/dist/hook/import.d.ts +6 -11
- package/dist/hook/index.cjs +1 -0
- package/dist/hook/index.d.ts +28 -20
- package/dist/hook/index.js +13 -10
- package/dist/hook/update.cjs +1 -0
- package/dist/hook/update.d.ts +9 -17
- package/dist/hook/update.js +2 -2
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +14 -11
- package/dist/meta-CXHXSPbq.cjs +1 -0
- package/dist/{chunks/meta-4qPWijBT.js → meta-Dhll5zt9.js} +45 -39
- package/dist/rolldown-runtime-BocRIvOZ.cjs +1 -0
- package/dist/{chunks/sidebar-Dj4Xr9du.js → sidebar-CVORMKBY.js} +9 -12
- package/dist/sidebar-G5Ody16K.cjs +1 -0
- package/dist/{chunks/single-CRF61o_U.js → single-CqD5cgNi.js} +353 -259
- package/dist/single-CsUaxEjQ.cjs +1 -0
- package/dist/style.cjs +0 -0
- package/dist/style.d.ts +0 -0
- package/dist/style.js +0 -0
- package/dist/types/Menu.d.ts +25 -0
- package/dist/utils/Common.d.ts +124 -16
- package/dist/utils/CusRoute.d.ts +21 -1
- package/dist/utils/Env.d.ts +23 -2
- package/dist/utils/Group.d.ts +12 -1
- package/dist/utils/Validator.d.ts +34 -12
- package/dist/utils/index.cjs +11 -0
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.js +181 -149
- package/package.json +190 -163
- package/dist/chunks/Common-BURf0rBN.js +0 -222
- package/dist/chunks/Env-DRXhvUcb.js +0 -16
- package/dist/chunks/UDragFile-BnUR3riq.js +0 -92
- package/dist/chunks/loader-BUiOnhOH.js +0 -1
- package/dist/chunks/top-navbar-Bob0gMUh.js +0 -78
- package/scripts/postinstall.cjs +0 -80
- /package/dist/{chunks/SortableItem-B4-Zsso3.js → SortableItem-B4-Zsso3.js} +0 -0
- /package/dist/{chunks/echarts-CRmndsxC.js → echarts-CRmndsxC.js} +0 -0
- /package/dist/{components/meta/Pdfviewer.d.ts → hook/import.cjs} +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { NavigateFunction } from 'react-router-dom';
|
|
2
|
+
import { UserType } from './index';
|
|
3
|
+
import { MenuPermissionItem } from '../types/Menu';
|
|
4
|
+
/** Sự kiện change của bất kỳ control nào trong form. */
|
|
5
|
+
export type FormChangeEvent<T extends HTMLElement = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> = React.ChangeEvent<T>;
|
|
6
|
+
/**
|
|
7
|
+
* Handler onChange mà các component form nhận.
|
|
8
|
+
*
|
|
9
|
+
* Hầu hết component tự dựng một event giả (`{ target, preventDefault }`) để báo
|
|
10
|
+
* ngược lên cho parent, nên kiểu là `ChangeEvent` chứ không phải callback tự do.
|
|
11
|
+
*/
|
|
12
|
+
export type FormChangeHandler = (e: FormChangeEvent) => void;
|
|
13
|
+
/** Giá trị nguyên thuỷ đọc từ một control của form. */
|
|
14
|
+
export type FormScalar = string | number | boolean | File | null;
|
|
15
|
+
/**
|
|
16
|
+
* Dữ liệu form sau khi đọc từ DOM.
|
|
17
|
+
*
|
|
18
|
+
* Khoá là động (tên `name` của input) nên không thể liệt kê trước. Giá trị được
|
|
19
|
+
* chặn ở các kiểu đi được qua `JSON.stringify` / `FormData`:
|
|
20
|
+
*
|
|
21
|
+
* - `FormScalar` — giá trị của một control đơn lẻ.
|
|
22
|
+
* - `CrudItem` — tên field dạng lồng `user{city}` được dựng thành object
|
|
23
|
+
* (xem `handleObjChange` ở `update.ts`).
|
|
24
|
+
* - mảng — các payload dạng `{ selected: [1, 2, 3] }` hoặc
|
|
25
|
+
* `{ details: [{ ... }, { ... }] }` (xem `List.handleDelete`
|
|
26
|
+
* và `UpdateDetail.handleDetailSubmit`).
|
|
27
|
+
*/
|
|
28
|
+
export type FormValue = Record<string, FormScalar | CrudItem | Array<FormScalar | CrudItem>>;
|
|
29
|
+
/** Một bản ghi do API trả về. */
|
|
30
|
+
export type CrudItem = Record<string, unknown>;
|
|
31
|
+
/**
|
|
32
|
+
* Trạng thái của `item` trong các trang chi tiết / sửa.
|
|
33
|
+
*
|
|
34
|
+
* `false` là sentinel cho "API không trả về bản ghi" -> component rơi vào
|
|
35
|
+
* nhánh 404. Không dùng `undefined` vì `undefined` còn là giá trị khởi tạo (chưa
|
|
36
|
+
* tải xong), hai trạng thái này dẫn tới hai render khác nhau.
|
|
37
|
+
*/
|
|
38
|
+
export type ItemState = CrudItem | false | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Đọc `id` từ `item` mà không vướng sentinel `false`.
|
|
41
|
+
*
|
|
42
|
+
* `item?.id` KHÔNG dùng được ở đây: optional chaining chỉ xử lý `null`/`undefined`,
|
|
43
|
+
* nên khi `item === false` TypeScript báo `Property 'id' does not exist on type
|
|
44
|
+
* 'false'`. Hàm này gom xử lý về một chỗ thay vì rải `item && item.id` khắp nơi.
|
|
45
|
+
*/
|
|
46
|
+
export declare function getItemId(item: ItemState): number | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Props chung cho mọi trang CRUD (`detail`, `fields`, `import`, `update`).
|
|
49
|
+
*
|
|
50
|
+
* Trước đây mỗi file tự khai báo một bản `PropsType` với `menuData: any[]` và
|
|
51
|
+
* `user: any` — 4 bản trùng nhau và đều không kiểm soát được hình dạng dữ liệu.
|
|
52
|
+
*/
|
|
53
|
+
export interface BasePropsType {
|
|
54
|
+
menuData: MenuPermissionItem[];
|
|
55
|
+
navigate: NavigateFunction;
|
|
56
|
+
user: UserType;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Đọc giá trị từ một change event.
|
|
60
|
+
*
|
|
61
|
+
* Dùng chung cho `detail` và `fields` (trước đây copy-paste giống hệt nhau).
|
|
62
|
+
* `update` có biến thể riêng vì còn phải dựng lại object cho tên field dạng
|
|
63
|
+
* lồng `user{city}` — xem `handleObjChange` trong `update.ts`.
|
|
64
|
+
*/
|
|
65
|
+
export declare const handleHookChange: (e: FormChangeEvent) => FormValue;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../common-CHDJQ2Ca.cjs");exports.handleHookChange=e.n;
|
package/dist/hook/detail.d.ts
CHANGED
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
navigate: NavigateFunction;
|
|
5
|
-
user: any;
|
|
6
|
-
}
|
|
1
|
+
import { CrudItem, FormValue } from './common';
|
|
2
|
+
export type { BasePropsType as PropsType, FormValue, CrudItem } from './common';
|
|
3
|
+
export { handleHookChange } from './common';
|
|
7
4
|
export interface StateType {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
/** Bản ghi đang xem, hoặc `false` khi API trả rỗng (đi vào nhánh 404). */
|
|
6
|
+
item: CrudItem | false | undefined;
|
|
7
|
+
/** Bản sao đã chuẩn hoá của `item`, dùng làm giá trị form ban đầu. */
|
|
8
|
+
formValue: FormValue;
|
|
9
|
+
/** Dữ liệu thô lấy từ API (dùng cho các trường đặc biệt). */
|
|
10
|
+
data: CrudItem | undefined;
|
|
11
11
|
isDetail: boolean | undefined;
|
|
12
|
-
[key: string]: any;
|
|
13
12
|
}
|
|
14
|
-
export declare const handleHookChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => {
|
|
15
|
-
[name]: File | null;
|
|
16
|
-
} | {
|
|
17
|
-
[name]: string;
|
|
18
|
-
};
|
package/dist/hook/detail.js
CHANGED
|
@@ -1,12 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
var e = (e) => {
|
|
3
|
-
e.preventDefault();
|
|
4
|
-
let { name: t, type: n, value: r } = e.target;
|
|
5
|
-
if (n === "file") {
|
|
6
|
-
let n = e.target.files;
|
|
7
|
-
return { [t]: n ? n[0] : null };
|
|
8
|
-
}
|
|
9
|
-
return { [t]: r };
|
|
10
|
-
};
|
|
11
|
-
//#endregion
|
|
1
|
+
import { n as e } from "../common-DVWX6AUQ.js";
|
|
12
2
|
export { e as handleHookChange };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../common-CHDJQ2Ca.cjs");exports.handleHookChange=e.n;
|
package/dist/hook/fields.d.ts
CHANGED
|
@@ -1,18 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
navigate: NavigateFunction;
|
|
5
|
-
user: any;
|
|
6
|
-
}
|
|
1
|
+
import { FormValue, ItemState } from './common';
|
|
2
|
+
export type { BasePropsType as PropsType, FormValue, CrudItem, ItemState } from './common';
|
|
3
|
+
export { handleHookChange } from './common';
|
|
7
4
|
export interface StateType {
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
/** Bản ghi cấu hình trường, hoặc `false` khi API trả rỗng. */
|
|
6
|
+
item: ItemState;
|
|
7
|
+
formValue: FormValue;
|
|
10
8
|
isField: boolean;
|
|
11
9
|
isDetail: boolean;
|
|
12
|
-
[key: string]: any;
|
|
13
10
|
}
|
|
14
|
-
export declare const handleHookChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => {
|
|
15
|
-
[name]: File | null;
|
|
16
|
-
} | {
|
|
17
|
-
[name]: string;
|
|
18
|
-
};
|
package/dist/hook/fields.js
CHANGED
|
@@ -1,12 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
var e = (e) => {
|
|
3
|
-
e.preventDefault();
|
|
4
|
-
let { name: t, type: n, value: r } = e.target;
|
|
5
|
-
if (n === "file") {
|
|
6
|
-
let n = e.target.files;
|
|
7
|
-
return { [t]: n ? n[0] : null };
|
|
8
|
-
}
|
|
9
|
-
return { [t]: r };
|
|
10
|
-
};
|
|
11
|
-
//#endregion
|
|
1
|
+
import { n as e } from "../common-DVWX6AUQ.js";
|
|
12
2
|
export { e as handleHookChange };
|
package/dist/hook/import.d.ts
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
user: any;
|
|
6
|
-
}
|
|
1
|
+
import { FormValue } from './common';
|
|
2
|
+
export type { BasePropsType as PropsType, FormValue } from './common';
|
|
3
|
+
/** Lỗi trả về từ API: một chuỗi, hoặc map field -> thông báo. */
|
|
4
|
+
export type FormError = string | Record<string, string>;
|
|
7
5
|
export interface StateType {
|
|
8
|
-
formValue:
|
|
9
|
-
error:
|
|
10
|
-
[key: string]: string;
|
|
11
|
-
} | string;
|
|
6
|
+
formValue: FormValue;
|
|
7
|
+
error: FormError;
|
|
12
8
|
isCre: boolean;
|
|
13
9
|
isEdit: boolean;
|
|
14
|
-
[key: string]: any;
|
|
15
10
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../Common-BBYXssMH.cjs"),t=require("../common-CHDJQ2Ca.cjs");var n=e=>{if(!e)return{};let[t,n]=e.split(`:`);return!t||!n?{}:{[t]:n}},r=e=>{let t=Object.entries(e).filter(([e,t])=>t!==`none`).map(([e,t])=>`${e}:${t}`).join(`,`);return t?{sort:t}:{}},i=async(t,n)=>{try{let r=new URLSearchParams;for(let[e,n]of Object.entries(t))n!=null&&r.append(e,String(n));let i=`${n}?${r.toString()}`;return(await e.n(i,{},`GET`)).data}catch{return{items:[],page:1,length:10,pageTotal:0,recordTotal:0}}},a=async(t,n,r,i)=>{let a=t.currentTarget,o=Number(a.getAttribute(`data-page`)??1),s={...n,page:o};return i(`${r}?${e.a(s)}`,{replace:!0}),s},o=async(t,n,r)=>{let i={...t,page:1};return r(`${n}?${e.a(i)}`,{replace:!0}),i},s=async(e,t)=>{e.preventDefault();let{name:n,value:r}=e.target,i={...t};return n===`pageLen`?(i.pageLen=Number(r),i.page=1):i[n]=r,i};exports.convertQueryToSort=n,exports.convertSortToQuery=r,exports.fetchHookData=i,exports.getItemId=t.t,exports.handleHookChange=t.n,exports.handleHookClickPage=a,exports.handleHookSeachForm=o,exports.handleParamChange=s;
|
package/dist/hook/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { NavigateFunction } from 'react-router-dom';
|
|
2
|
+
import { MenuPermissionItem } from '../types/Menu';
|
|
3
|
+
export type { BasePropsType, FormValue, FormScalar, CrudItem, ItemState, FormChangeEvent, FormChangeHandler, } from './common';
|
|
4
|
+
export { getItemId, handleHookChange } from './common';
|
|
2
5
|
export interface UserType {
|
|
3
6
|
id: number;
|
|
4
7
|
username: string;
|
|
@@ -7,26 +10,35 @@ export interface UserType {
|
|
|
7
10
|
numberId: number;
|
|
8
11
|
group: string;
|
|
9
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Filter truyền lên API: `page`, `pageLen`, từ khoá tìm kiếm, ...
|
|
15
|
+
*
|
|
16
|
+
* Kiểu này thay cho `Record<string, any>`: các key động vẫn được phép, nhưng
|
|
17
|
+
* giá trị bị chặn ở mức primitive — đủ cho query string và chặn được
|
|
18
|
+
* object/function lọt vào `URLSearchParams` (toString() sẽ ra `[object Object]`).
|
|
19
|
+
*/
|
|
20
|
+
export type TableFilter = Record<string, string | number | boolean | undefined>;
|
|
10
21
|
export interface PropsType {
|
|
11
|
-
menuData:
|
|
22
|
+
menuData: MenuPermissionItem[];
|
|
12
23
|
navigate: NavigateFunction;
|
|
13
24
|
user: UserType;
|
|
14
|
-
[key: string]: any;
|
|
15
25
|
}
|
|
16
26
|
export interface StateTable {
|
|
17
|
-
items: any[];
|
|
18
|
-
sort?: Record<string,
|
|
19
|
-
filter?:
|
|
27
|
+
items: Record<string, any>[];
|
|
28
|
+
sort?: Record<string, "asc" | "desc" | "none">;
|
|
29
|
+
filter?: TableFilter;
|
|
20
30
|
page: number;
|
|
21
31
|
length: number;
|
|
22
32
|
pageTotal: number;
|
|
23
33
|
recordTotal: number;
|
|
24
|
-
[key: string]: any;
|
|
25
34
|
}
|
|
26
35
|
export interface StateType {
|
|
27
36
|
data: StateTable;
|
|
28
|
-
|
|
29
|
-
|
|
37
|
+
/** Nội dung lỗi để hiển thị qua `showMessage` (đã được escape bên trong đó). */
|
|
38
|
+
error?: string | string[];
|
|
39
|
+
status?: unknown;
|
|
40
|
+
/** Cờ đang tải — render overlay spinner. */
|
|
41
|
+
loading?: boolean;
|
|
30
42
|
selectedIds: number[];
|
|
31
43
|
isDel: boolean | undefined;
|
|
32
44
|
isCre: boolean | undefined;
|
|
@@ -37,9 +49,9 @@ export interface StateType {
|
|
|
37
49
|
isImport: boolean | undefined;
|
|
38
50
|
isExport: boolean | undefined;
|
|
39
51
|
isCopy: boolean | undefined;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
52
|
+
/** Tên các cột lọc (form) và cột hiển thị (bảng). */
|
|
53
|
+
ftfield?: string[];
|
|
54
|
+
tbfield?: string[];
|
|
43
55
|
}
|
|
44
56
|
export declare const convertQueryToSort: (sort: string) => {
|
|
45
57
|
[x: string]: string;
|
|
@@ -49,13 +61,9 @@ export declare const convertSortToQuery: (sort: Record<string, string>) => {
|
|
|
49
61
|
} | {
|
|
50
62
|
sort?: undefined;
|
|
51
63
|
};
|
|
52
|
-
export declare const fetchHookData: (params:
|
|
53
|
-
export declare const handleHookClickPage: (e: React.MouseEvent<HTMLAnchorElement>, params:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
page: number;
|
|
58
|
-
}>;
|
|
59
|
-
export declare const handleParamChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>, params: Record<string, any>) => Promise<{
|
|
60
|
-
[x: string]: any;
|
|
64
|
+
export declare const fetchHookData: (params: TableFilter, getDataUrl: string) => Promise<StateTable>;
|
|
65
|
+
export declare const handleHookClickPage: (e: React.MouseEvent<HTMLAnchorElement>, params: TableFilter, cUri: string, navigate: NavigateFunction) => Promise<TableFilter>;
|
|
66
|
+
export declare const handleHookSeachForm: (params: TableFilter, cUri: string, navigate: NavigateFunction) => Promise<TableFilter>;
|
|
67
|
+
export declare const handleParamChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>, params: TableFilter) => Promise<{
|
|
68
|
+
[x: string]: string | number | boolean | undefined;
|
|
61
69
|
}>;
|
package/dist/hook/index.js
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as e, n as t } from "../Common-1GAoFU4L.js";
|
|
2
|
+
import { n, t as r } from "../common-DVWX6AUQ.js";
|
|
2
3
|
//#region src/hook/index.ts
|
|
3
|
-
var
|
|
4
|
+
var i = (e) => {
|
|
4
5
|
if (!e) return {};
|
|
5
6
|
let [t, n] = e.split(":");
|
|
6
7
|
return !t || !n ? {} : { [t]: n };
|
|
7
|
-
},
|
|
8
|
+
}, a = (e) => {
|
|
8
9
|
let t = Object.entries(e).filter(([e, t]) => t !== "none").map(([e, t]) => `${e}:${t}`).join(",");
|
|
9
10
|
return t ? { sort: t } : {};
|
|
10
|
-
},
|
|
11
|
+
}, o = async (e, n) => {
|
|
11
12
|
try {
|
|
12
|
-
let r =
|
|
13
|
-
|
|
13
|
+
let r = new URLSearchParams();
|
|
14
|
+
for (let [t, n] of Object.entries(e)) n != null && r.append(t, String(n));
|
|
15
|
+
let i = `${n}?${r.toString()}`;
|
|
16
|
+
return (await t(i, {}, "GET")).data;
|
|
14
17
|
} catch {
|
|
15
18
|
return {
|
|
16
19
|
items: [],
|
|
@@ -20,22 +23,22 @@ var n = (e) => {
|
|
|
20
23
|
recordTotal: 0
|
|
21
24
|
};
|
|
22
25
|
}
|
|
23
|
-
},
|
|
26
|
+
}, s = async (t, n, r, i) => {
|
|
24
27
|
let a = t.currentTarget, o = Number(a.getAttribute("data-page") ?? 1), s = {
|
|
25
28
|
...n,
|
|
26
29
|
page: o
|
|
27
30
|
};
|
|
28
31
|
return i(`${r}?${e(s)}`, { replace: !0 }), s;
|
|
29
|
-
},
|
|
32
|
+
}, c = async (t, n, r) => {
|
|
30
33
|
let i = {
|
|
31
34
|
...t,
|
|
32
35
|
page: 1
|
|
33
36
|
};
|
|
34
37
|
return r(`${n}?${e(i)}`, { replace: !0 }), i;
|
|
35
|
-
},
|
|
38
|
+
}, l = async (e, t) => {
|
|
36
39
|
e.preventDefault();
|
|
37
40
|
let { name: n, value: r } = e.target, i = { ...t };
|
|
38
41
|
return n === "pageLen" ? (i.pageLen = Number(r), i.page = 1) : i[n] = r, i;
|
|
39
42
|
};
|
|
40
43
|
//#endregion
|
|
41
|
-
export {
|
|
44
|
+
export { i as convertQueryToSort, a as convertSortToQuery, o as fetchHookData, r as getItemId, n as handleHookChange, s as handleHookClickPage, c as handleHookSeachForm, l as handleParamChange };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=e=>{e.preventDefault();let{name:n,type:r,value:i}=t(e);if(r===`file`){let t=e.target.files;return{[n]:t?.[0]??null}}return{[n]:i}},t=e=>{let{name:t,type:n,value:r}=e.target,i=t.split(/[{}]+/).filter(Boolean),a=i.shift();if(!a||i.length===0)return{name:t,type:n,value:r};let o={},s=o;for(let e=0;e<i.length-1;e++)s[i[e]]={},s=s[i[e]];return s[i[i.length-1]]=r,{name:a,type:n,value:o}},n=(e,t)=>{let r={...e};return Object.keys(t).forEach(e=>{let i=t[e],a=r[e];i&&typeof i==`object`&&!Array.isArray(i)&&a&&typeof a==`object`&&!Array.isArray(a)?r[e]=n(a,i):r[e]=i}),r};exports.deepMerge=n,exports.handleHookChange=e,exports.handleObjChange=t;
|
package/dist/hook/update.d.ts
CHANGED
|
@@ -1,26 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
user: any;
|
|
6
|
-
}
|
|
1
|
+
import { FormError } from './import';
|
|
2
|
+
import { CrudItem, FormChangeEvent, FormValue } from './common';
|
|
3
|
+
export type { BasePropsType as PropsType } from './common';
|
|
4
|
+
export type { FormError } from './import';
|
|
7
5
|
export interface StateType {
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
/** Bản ghi đang sửa, hoặc `false` khi API trả rỗng (đi vào nhánh 404). */
|
|
7
|
+
item?: CrudItem | false;
|
|
8
|
+
formValue: FormValue;
|
|
10
9
|
loading?: boolean;
|
|
11
|
-
error?:
|
|
12
|
-
[key: string]: string;
|
|
13
|
-
} | string;
|
|
10
|
+
error?: FormError;
|
|
14
11
|
isCre?: boolean;
|
|
15
12
|
isEdit?: boolean;
|
|
16
13
|
isDetail?: boolean;
|
|
17
|
-
[key: string]: any;
|
|
18
14
|
}
|
|
19
|
-
export declare const handleHookChange: (e:
|
|
20
|
-
[name]: File | null;
|
|
21
|
-
} | {
|
|
22
|
-
[name]: string | Record<string, any>;
|
|
23
|
-
};
|
|
15
|
+
export declare const handleHookChange: (e: FormChangeEvent) => FormValue;
|
|
24
16
|
export declare const handleObjChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => {
|
|
25
17
|
name: string;
|
|
26
18
|
type: string;
|
package/dist/hook/update.js
CHANGED
|
@@ -4,11 +4,11 @@ var e = (e) => {
|
|
|
4
4
|
let { name: n, type: r, value: i } = t(e);
|
|
5
5
|
if (r === "file") {
|
|
6
6
|
let t = e.target.files;
|
|
7
|
-
return { [n]: t
|
|
7
|
+
return { [n]: t?.[0] ?? null };
|
|
8
8
|
}
|
|
9
9
|
return { [n]: i };
|
|
10
10
|
}, t = (e) => {
|
|
11
|
-
let { name: t, type: n, value: r } = e.target, i = t.split(/[
|
|
11
|
+
let { name: t, type: n, value: r } = e.target, i = t.split(/[{}]+/).filter(Boolean), a = i.shift();
|
|
12
12
|
if (!a || i.length === 0) return {
|
|
13
13
|
name: t,
|
|
14
14
|
type: n,
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./form-DUL_O4IY.cjs"),t=require("./SortableItem-C3KzO8Xh.cjs"),n=require("./UDragFile-oJ05zNLR.cjs"),r=require("./echarts-Dla22xas.cjs"),i=require("./SpinnerLoader-BujLjvC3.cjs");require("./components/loader/index.cjs");const a=require("./meta-CXHXSPbq.cjs"),o=require("./HeaderUpdate-DIwc8EAA.cjs"),s=require("./common-CHDJQ2Ca.cjs"),c=require("./sidebar-G5Ody16K.cjs"),l=require("./single-CsUaxEjQ.cjs"),u=require("./components/top-navbar/index.cjs"),d=require("./hook/index.cjs");exports.AdvancedMultiSelect=e.D,exports.AsxhUImages=e.E,exports.BarChart=r.a,exports.BoxAddRow=e.p,exports.BtnGroup=a.l,exports.CardTable=a.a,exports.CheckBox=e.v,exports.CheckTreeBox=e.f,exports.CusTooltip=o.d,exports.DateInput=e.d,exports.DateTimeInput=e.u,exports.Editor=e.m,exports.EfFile=e.l,exports.EfImage=e.h,exports.EfImages=e.c,exports.ElfinderModal=a.i,exports.Email=e.y,exports.Error403=o.a,exports.Error404=o.i,exports.Head=a.r,exports.HeaderDetail=o.r,exports.HeaderIndex=o.n,exports.HeaderUpdate=o.t,exports.LineChart=r.i,exports.ModalForm=a.c,exports.MultiBarChart=r.r,exports.MultiLineChart=r.n,exports.NavTabs=a.n,exports.NumberText=e.b,exports.PDFEmbed=a.t,exports.PImage=e.s,exports.Pagination=o.u,exports.Password=e.x,exports.PhoneVn=e.S,exports.PieChart=r.t,exports.RatioKeyVal=e.C,exports.ScrollTable=a.s,exports.SearchBox=a.o,exports.SelectAddRowBox=e.o,exports.SelectAddRowBoxAdvanced=e.a,exports.SelectBox=e.g,exports.SelectMBox=e._,exports.Sidebar=c.t,exports.SingleDetail=l.s,exports.SingleFields=l.o,exports.SingleImport=l.a,exports.SingleIndex=l.i,exports.SingleUpdate=l.r,exports.SingleUpdateDetail=l.n,exports.SingleUpdateTableDetail=l.t,exports.SortableItem=t.t,exports.SpinnerLoader=i.t,exports.Text=e.w,exports.Textarea=e.T,exports.TopNavbar=u.TopNavbar,exports.UDragFile=n.t,exports.UFile=e.i,exports.UFiles=e.n,exports.UImages=e.t,exports.convertQueryToSort=d.convertQueryToSort,exports.convertSortToQuery=d.convertSortToQuery,exports.fetchHookData=d.fetchHookData,exports.getItemId=s.t,exports.handleHookChange=s.n,exports.handleHookClickPage=d.handleHookClickPage,exports.handleHookSeachForm=d.handleHookSeachForm,exports.handleParamChange=d.handleParamChange,exports.validateRequiredFiles=e.r;
|
package/dist/index.d.ts
CHANGED
|
@@ -5,3 +5,19 @@ export * from './components/meta';
|
|
|
5
5
|
export * from './components/sidebar';
|
|
6
6
|
export * from './components/single';
|
|
7
7
|
export * from './components/top-navbar';
|
|
8
|
+
/**
|
|
9
|
+
* Kiểu dùng chung cho các props bắt buộc người dùng phải cung cấp.
|
|
10
|
+
*
|
|
11
|
+
* Không export từ đây thì consumer không có cách nào lấy được kiểu — ví dụ
|
|
12
|
+
* `CardTable` yêu cầu `service: TableService`, nhưng nếu không re-export thì
|
|
13
|
+
* họ buộc phải tự viết lại cấu trúc, và mọi thay đổi sau này của package
|
|
14
|
+
* không ai biết.
|
|
15
|
+
*/
|
|
16
|
+
export * from './types/Menu';
|
|
17
|
+
export * from './components/meta/CardTable.types';
|
|
18
|
+
/**
|
|
19
|
+
* Kiểu của lớp tiện ích và hook — consumer dùng chúng để tự định nghĩa
|
|
20
|
+
* service/bundle, nên phải lấy được từ entry point chính.
|
|
21
|
+
*/
|
|
22
|
+
export * from './hook';
|
|
23
|
+
export type { ApiResponse, DateInput, StatusOption, RouteElement } from './utils';
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { C as e, D as t, E as n, S as r, T as i, _ as a, a as o, b as s, c, d as l, f as u, g as d, h as f, i as p, l as m, m as h, n as g, o as _, p as v, r as y, s as b, t as x, u as S, v as C, w, x as T, y as E } from "./
|
|
2
|
-
import { t as D } from "./
|
|
3
|
-
import { t as O } from "./
|
|
4
|
-
import { a as k, i as A, n as j, r as M, t as N } from "./
|
|
5
|
-
import { t as P } from "./
|
|
6
|
-
import
|
|
7
|
-
import { a as
|
|
8
|
-
import { t as
|
|
9
|
-
import {
|
|
10
|
-
import { t as
|
|
11
|
-
|
|
1
|
+
import { C as e, D as t, E as n, S as r, T as i, _ as a, a as o, b as s, c, d as l, f as u, g as d, h as f, i as p, l as m, m as h, n as g, o as _, p as v, r as y, s as b, t as x, u as S, v as C, w, x as T, y as E } from "./form-BNAbGCXe.js";
|
|
2
|
+
import { t as D } from "./SortableItem-B4-Zsso3.js";
|
|
3
|
+
import { t as O } from "./UDragFile-BqGt1-gK.js";
|
|
4
|
+
import { a as k, i as A, n as j, r as M, t as N } from "./echarts-CRmndsxC.js";
|
|
5
|
+
import { t as P } from "./SpinnerLoader-CyhOQC6d.js";
|
|
6
|
+
import "./components/loader/index.js";
|
|
7
|
+
import { a as F, c as I, i as L, l as R, n as z, o as B, r as V, s as H, t as U } from "./meta-Dhll5zt9.js";
|
|
8
|
+
import { a as W, d as G, i as K, n as q, r as J, t as Y, u as X } from "./HeaderUpdate-UXncZcAD.js";
|
|
9
|
+
import { n as Z, t as Q } from "./common-DVWX6AUQ.js";
|
|
10
|
+
import { t as $ } from "./sidebar-CVORMKBY.js";
|
|
11
|
+
import { a as ee, i as te, n as ne, o as re, r as ie, s as ae, t as oe } from "./single-CqD5cgNi.js";
|
|
12
|
+
import { TopNavbar as se } from "./components/top-navbar/index.js";
|
|
13
|
+
import { convertQueryToSort as ce, convertSortToQuery as le, fetchHookData as ue, handleHookClickPage as de, handleHookSeachForm as fe, handleParamChange as pe } from "./hook/index.js";
|
|
14
|
+
export { t as AdvancedMultiSelect, n as AsxhUImages, k as BarChart, v as BoxAddRow, R as BtnGroup, F as CardTable, C as CheckBox, u as CheckTreeBox, G as CusTooltip, l as DateInput, S as DateTimeInput, h as Editor, m as EfFile, f as EfImage, c as EfImages, L as ElfinderModal, E as Email, W as Error403, K as Error404, V as Head, J as HeaderDetail, q as HeaderIndex, Y as HeaderUpdate, A as LineChart, I as ModalForm, M as MultiBarChart, j as MultiLineChart, z as NavTabs, s as NumberText, U as PDFEmbed, b as PImage, X as Pagination, T as Password, r as PhoneVn, N as PieChart, e as RatioKeyVal, H as ScrollTable, B as SearchBox, _ as SelectAddRowBox, o as SelectAddRowBoxAdvanced, d as SelectBox, a as SelectMBox, $ as Sidebar, ae as SingleDetail, re as SingleFields, ee as SingleImport, te as SingleIndex, ie as SingleUpdate, ne as SingleUpdateDetail, oe as SingleUpdateTableDetail, D as SortableItem, P as SpinnerLoader, w as Text, i as Textarea, se as TopNavbar, O as UDragFile, p as UFile, g as UFiles, x as UImages, ce as convertQueryToSort, le as convertSortToQuery, ue as fetchHookData, Q as getItemId, Z as handleHookChange, de as handleHookClickPage, fe as handleHookSeachForm, pe as handleParamChange, y as validateRequiredFiles };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./rolldown-runtime-BocRIvOZ.cjs"),t=require("./Common-BBYXssMH.cjs"),n=require("./Validator-BcydBvOg.cjs"),r=require("./HeaderUpdate-DIwc8EAA.cjs");let i=require("react");i=e.t(i,1);let a=require("react-select");a=e.t(a,1);let o=require("react/jsx-runtime"),s=require("bootstrap"),c=require("react-router-dom"),l=require("react-helmet-async");var u=({cUri:e,itemId:t,isEdit:n=!1,isDel:i=!1,onDelete:a})=>(0,o.jsxs)(`div`,{className:`btn-group`,children:[n&&(0,o.jsx)(r.d,{title:`Chỉnh sửa`,children:(0,o.jsx)(c.Link,{to:e+`/edit/`+t,className:`btn btn-sm btn-icon btn-info`,children:(0,o.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`drive_file_rename_outline`})})}),i&&(0,o.jsx)(r.d,{title:`Xóa`,children:(0,o.jsx)(`button`,{type:`button`,onClick:()=>a?.(t),className:`btn btn-sm btn-icon btn-danger`,children:(0,o.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`delete`})})})]}),d=({modalRef:e,title:r,apiGetDetail:a,frmBody:l,onSubmit:u,onHide:d,itemId:f,setItemId:p,data:m,clsWidth:h=`xl`,btnTxt:g=`Lưu lại`,style:_={},clsBody:v=``})=>{let y=(0,i.useRef)(null),[b,x]=(0,i.useState)(),[S,C]=(0,i.useState)({});(0,i.useEffect)(()=>{if(!e.current)return;x(s.Modal.getOrCreateInstance(e.current,{backdrop:`static`,keyboard:!1}));let t=()=>{y?.current&&new n.t(y?.current).run()},r=()=>{p&&p(0),C({}),y?.current&&new n.t(y?.current).destroy()};return e.current.addEventListener(`shown.bs.modal`,t),e.current.addEventListener(`hidden.bs.modal`,r),()=>{e.current?.removeEventListener(`shown.bs.modal`,t),e.current?.removeEventListener(`hidden.bs.modal`,r)}},[]),(0,i.useEffect)(()=>{f&&(async()=>{try{if(!a)return;y.current&&t.x(y.current,!0);let e=await t.n(a+`/`+f,{},`GET`,`application/json`,!1),n=e?e.data:void 0;y.current&&t.x(y.current,!1),C(n??{})}catch(e){console.log(e)}})()},[f]),(0,i.useEffect)(()=>{m&&C(m)},[m]);let w=e=>{e.preventDefault(),document.activeElement?.blur(),b?.hide(),d&&d()};return(0,o.jsx)(`div`,{ref:e,className:`modal fade p-0 mx-auto`,tabIndex:-1,"data-bs-backdrop":`static`,"data-bs-keyboard":`false`,children:(0,o.jsx)(`div`,{className:`modal-dialog modal-${h}`,style:_,children:(0,o.jsx)(`div`,{className:`modal-content`,children:(0,o.jsxs)(c.Form,{ref:y,className:`position-relative`,encType:`multipart/form-data`,"data-toggle":`validator`,role:`form`,method:`POST`,onSubmit:async e=>{if(e.preventDefault(),!y?.current)return;let t=new n.t(y?.current);!t.hasErrors()&&!t.isIncomplete()&&b&&u(S,b,C)},children:[(0,o.jsxs)(`div`,{className:`modal-header py-3`,children:[(0,o.jsx)(`h5`,{className:`modal-title`,children:r}),(0,o.jsx)(`button`,{type:`button`,className:`btn-close btn-md-close`,onClick:w,children:(0,o.jsx)(`span`,{"aria-hidden":`true`,children:(0,o.jsx)(`i`,{className:`fal fa-times`,style:{fontSize:`1rem`}})})})]}),(0,o.jsx)(`div`,{className:`modal-body rounded-bottom pb-0 ${v}`,style:{overflowY:`auto`},children:l(S,async e=>{let{name:t,value:r}=n.i(e);C(e=>({...e,[t]:r}))})}),(0,o.jsxs)(`div`,{className:`modal-footer d-flex justify-content-center`,children:[(0,o.jsx)(`button`,{type:`button`,className:`btn btn-secondary btn-md-close`,"data-bs-original-title":`reply`,onClick:w,children:`Hủy`}),(0,o.jsx)(`button`,{type:`submit`,className:`btn btn-success`,"data-bs-original-title":`save`,children:g})]})]})})})})},f=({header:e,data:t,numOfFirst:n=0,numOfLast:r=0,columnWidth:a=200,...s})=>{let c=(0,i.useRef)(null),[l,u]=(0,i.useState)(0),[d,f]=(0,i.useState)(0),[p,m]=(0,i.useState)(!1),[h,g]=(0,i.useState)(!1),_=(e,t,n,r)=>e<n?{position:`left`}:e>=t-r?{position:`right`}:{position:`none`};(0,i.useEffect)(()=>{let e=c.current;if(!e)return;let t=()=>{u(e.scrollLeft),f(e.scrollWidth-e.offsetWidth)};return t(),e.addEventListener(`scroll`,t),window.addEventListener(`resize`,t),()=>{e.removeEventListener(`scroll`,t),window.removeEventListener(`resize`,t)}},[]),(0,i.useEffect)(()=>{let e=l>5,t=l<d-5;m(e),g(t)},[l,d]);let v=e=>{c.current&&(c.current.scrollLeft+=e.deltaY)},y=e=>{c.current&&c.current.scrollBy({left:e?150:-150,behavior:`smooth`})},b=t=>e[t]?.width??a,x=e.slice(0,n).reduce((e,t,n)=>e+b(n),0)||0,S=e.slice(e.length-r).reduce((t,n,i)=>t+b(e.length-r+i),0)||0;return(0,o.jsxs)(`div`,{className:`scroll-table-group`,children:[(0,o.jsx)(`div`,{className:`fade-overlay fade-left ${p?`fade-visible`:`fade-hidden`}`,style:{left:`${x}px`}}),(0,o.jsx)(`div`,{className:`fade-overlay fade-right ${h?`fade-visible`:`fade-hidden`}`,style:{right:`${S}px`}}),p&&(0,o.jsx)(`button`,{title:`Phải`,className:`scroll-btn left-btn`,onClick:()=>y(!1),style:{left:`${x}px`},children:(0,o.jsx)(`i`,{className:`fa-solid fa-chevron-left`})}),h&&(0,o.jsx)(`button`,{title:`Trái`,className:`scroll-btn right-btn`,onClick:()=>y(!0),style:{right:`${S}px`},children:(0,o.jsx)(`i`,{className:`fa-solid fa-chevron-right`})}),(0,o.jsx)(`div`,{ref:c,onWheel:v,className:`table-container`,children:(0,o.jsxs)(`table`,{className:`custom-table`,...s,children:[(0,o.jsx)(`thead`,{children:(0,o.jsx)(`tr`,{className:`text-center`,children:e.map((t,i)=>{let{position:s}=_(i,e.length,n,r),c=t.width??a,l={left:s===`left`?`${e.slice(0,i).reduce((e,t,n)=>e+b(n),0)}px`:void 0,right:s===`right`?`${e.slice(i+1).reduce((e,t,n)=>e+b(i+1+n),0)}px`:void 0,minWidth:`${c}px`};return(0,o.jsx)(`th`,{style:l,className:`custom-th ${s===`none`?``:`sticky-col`} ${t.thClassName??``}`,children:t.label},i)})})}),(0,o.jsxs)(`tbody`,{children:[t.map((t,i)=>(0,o.jsx)(`tr`,{className:`custom-tr`,children:e.map((i,s)=>{let c=Object.values(t)[s],{position:l}=_(s,e.length,n,r),u=i.width??a,d={left:l===`left`?`${e.slice(0,s).reduce((e,t,n)=>e+b(n),0)}px`:void 0,right:l===`right`?`${e.slice(s+1).reduce((e,t,n)=>e+b(s+1+n),0)}px`:void 0,minWidth:`${u}px`};return(0,o.jsx)(`td`,{style:d,className:`custom-td ${l===`none`?``:`sticky-col`} ${i.tdClassName??``}`,children:c},s)})},i)),t.length?``:(0,o.jsx)(`tr`,{className:`text-center`,children:(0,o.jsx)(`td`,{className:`px-3 pt-2`,colSpan:20,children:(0,o.jsx)(`p`,{children:`Không có dữ liệu`})})})]})]})})]})},p=(e,t)=>{t(e);let n=e.currentTarget.closest(`.input-group-outline`);e.currentTarget.value.trim()===``?n?.classList.remove(`is-filled`):n?.classList.add(`is-filled`)},m=e=>{e.preventDefault(),e.currentTarget.closest(`.input-group-outline`)?.classList.add(`is-focused`)},h=e=>{e.preventDefault(),e.currentTarget.closest(`.input-group-outline`)?.classList.remove(`is-focused`)},g=({label:e,name:t,value:n=``,required:r=!1,disabled:a=!1,readonly:s=!1,cpnClass:c=``,minLength:l=0,maxLength:u=255,onChange:d,style:f={}})=>{let g=(0,i.useRef)(null);return(0,i.useEffect)(()=>{document.activeElement!==g.current&&d&&d({target:{name:t,value:n},preventDefault:()=>{}})},[n]),(0,o.jsx)(`div`,{className:`form-group `+(c??``),children:(0,o.jsxs)(`div`,{className:`input-group input-group-outline ${n?`is-filled`:``}`,children:[(0,o.jsx)(`div`,{className:`form-label`,children:e+(r?` *`:``)}),(0,o.jsx)(`input`,{style:f,name:t,placeholder:``,readOnly:s,disabled:a,required:r,minLength:l,maxLength:u,"data-required-error":`Vui lòng nhập dữ liệu`,"data-error":`Dữ liệu không hợp lệ`,className:`form-control`,value:n,onChange:e=>p(e,d),onFocus:m,onBlur:h})]})})},_=(e,t)=>e.find(e=>e.value===t)||null,v=(e,t,n,r,i)=>{let a=[];r&&a.push({value:-1,label:`Tất cả`}),i&&a.push({value:0,label:`Không có`});let o=Array.isArray(e)?e.map(e=>({value:e[t],label:e[n]})):[];return[...a,...o]},y=({label:e,name:t,lists:n=[],keyValue:r=`id`,keyName:s=`name`,value:c=``,cpnClass:l=``,required:u=!1,disabled:d=!1,all:f=!1,zero:p=!1,onChange:m,style:h={}})=>{let[g,y]=(0,i.useState)([]);(0,i.useEffect)(()=>{y(v(n,r,s,f,p))},[n]);let b=(0,i.useRef)(!1);(0,i.useEffect)(()=>{b.current||g.length&&(b.current=!0,m?.({target:{name:t,value:c},preventDefault:()=>{}}))},[g]);let x=e=>{m&&m({target:{name:t,value:e},preventDefault:()=>{}})},S=(0,i.useRef)(null);return(0,i.useEffect)(()=>{let e=S.current?.querySelector(`input[name="${t}"][required]`);e&&e.setCustomValidity(c?``:`Vui lòng nhập dữ liệu`)},[c,t,u]),(0,o.jsx)(`div`,{ref:S,className:`form-group box-select `+(l??``),style:h,children:(0,o.jsxs)(`div`,{className:`input-group input-group-outline is-filled`,children:[(0,o.jsx)(`span`,{className:`form-label`,children:e+(u?` *`:``)}),(0,o.jsx)(a.default,{menuPortalTarget:document.body,styles:{menuPortal:e=>({...e,zIndex:99999})},classNamePrefix:`react-select`,placeholder:`Chọn`,name:t,options:g,value:_(g,c),onChange:e=>x(e?.value),noOptionsMessage:()=>`Không có dữ liệu`,isDisabled:d,required:u,"data-required-error":`Vui lòng nhập dữ liệu`,"data-error":`Dữ liệu không hợp lệ`,className:`form-control`})]})})},b=({ftfield:e,service:t,options:n,filter:r,handleChange:i,handleSearchForm:a})=>{let s=Array.isArray(e)?e:[];return(0,o.jsxs)(c.Form,{className:`d-flex align-items-center`,onSubmit:a,children:[(0,o.jsx)(`div`,{className:`mb-3 me-3`,children:`Tìm kiếm`}),(0,o.jsx)(`div`,{className:`row grid-space-16 row-cols-${s.length} flex-1`,children:s.map((e,a)=>{let s=t.ftFields(e);switch(s.type){case`text`:return(0,o.jsx)(g,{style:{minWidth:100},label:t.fieldName(e),name:e,cpnClass:`mb-3 col`,value:String(r?.[e]??``),onChange:i},a);case`select`:{let c=typeof s.option==`string`?n?.[s.option]??[]:s.option??[],l=s.keyName||`name`;return(0,o.jsx)(y,{style:{minWidth:100},label:t.fieldName(e),name:e,lists:c,keyName:l,cpnClass:`mb-3 col`,all:!0,value:r?.[e]??-1,onChange:i},a)}default:return``}})}),(0,o.jsx)(`div`,{className:`mb-3 ms-3`,children:(0,o.jsx)(`button`,{title:`Tìm kiếm`,type:`submit`,className:`btn btn-primary`,children:`Tìm`})})]})},x=({frmBody:e,service:n,apiOption:a,options:l,tbOption:u,roleOption:p,clsWidth:m=`xl`,btnTxt:h=`Lưu lại`})=>{let g=(0,i.useRef)(null),_=(0,c.useNavigate)(),[v,y]=(0,i.useState)(0),[x,S]=(0,i.useState)({items:[],page:1,filter:{},length:10,pageTotal:0,recordTotal:0}),C=(0,i.useRef)(!1);(0,i.useEffect)(()=>{C.current||(C.current=!0,w())},[]);let w=async e=>{try{let n=a.filter||{},r=e??x.filter??{},i=await t.n(a.apiGetData,{...r,...n},`GET`),o=i?i.data:x;o.filter||={...r,...n},S({...o,filter:o.filter??{...r,...n}})}catch(e){console.log(e)}},T=e=>{if(!g.current)return;let t=s.Modal.getOrCreateInstance(g?.current,{backdrop:`static`,keyboard:!1});y(e),t.show()},E=async e=>{try{e.preventDefault();let t=await r.s(e,x?.filter||{},a?.cUri,_);S({...x,filter:t}),await w(t)}catch(e){console.log(e)}},D=async e=>{e.preventDefault();let t=await r.l(e,x?.filter||{});S({...x,filter:t})},O=async e=>{e.preventDefault(),await w()},k=async(e,n)=>{try{g?.current&&t.x(g?.current,!0),e={...e,...a.formData};let r=e.id,i=r?a.apiEdit+`/`+r:a.apiCreate,o=await t.n(i,e,`POST`);r?t.b(`Cập nhật thành công`,`top-end`,!0):t.b(`Thêm mới thành công`,`top-end`,!0),o?.data?.id&&(await w(),document.activeElement?.blur(),n.hide())}catch(e){t.y(e.message)}finally{g?.current&&t.x(g?.current,!1)}},A=async e=>{try{if(!(await t.v()).isConfirmed)return;await t.n(`${a.apiDelete}/${e}`,{},`DELETE`),t.b(`Xoá thành công!`,`top-end`,!0),await w()}catch(e){t.y(e.message)}},j=[],M=u.numOfLast-1;j.push({label:`STT`,width:50,tdClassName:`text-center px-0`});for(let e of u.tbfield){let t=n.tbFields(e);j.push({label:n.fieldName(e),width:t?.width||150,tdClassName:t?.tdClassName||`text-start`})}(p?.isDelOne||p?.isEdit)&&(M+=1,j.push({label:`Thao tác`,width:100,align:`center`,thClassName:`p-0`,tdClassName:`text-center`}));let N=x?.items?.length?x?.items.map((e,r)=>{let i={};i.stt=r+1;for(let r of u.tbfield){let a=n.tbFields(r);switch(a.type){case`number`:i[r]=e[r]?.toLocaleString(`vi-VN`);break;case`selecthtml`:{let t=a?.func;i[r]=t?(0,o.jsx)(`span`,{dangerouslySetInnerHTML:{__html:t(e[r],!0)}}):(0,o.jsx)(`span`,{children:e[r]});break}case`select`:{let t=a?.func;i[r]=t?t(e[r],!0):e[r];break}case`date`:i[r]=t.s(e[r]);break;default:i[r]=e[r]}}return(p?.isDelOne||p?.isEdit)&&(i.action=(0,o.jsxs)(`div`,{className:`btn-group`,children:[(0,o.jsx)(`button`,{title:`Chỉnh sửa`,type:`button`,onClick:()=>T(e.id),className:`btn btn-sm btn-icon btn-info`,children:(0,o.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`drive_file_rename_outline`})}),(0,o.jsx)(`button`,{title:`Xóa`,type:`button`,onClick:()=>A(e.id),className:`btn btn-sm btn-icon btn-danger`,children:(0,o.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`delete`})})]})),i}):[];return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(`div`,{className:`card mb-20`,children:[(0,o.jsxs)(`div`,{className:`card-header flex-auto col-auto d-flex align-items-center`,children:[(0,o.jsx)(`h3`,{className:`card-title`,children:u.title}),p?.isCre&&(0,o.jsx)(`button`,{type:`button`,title:`Thêm mới`,className:`btn btn-success btn-sm btn-icon ms-auto`,onClick:()=>T(0),children:(0,o.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`add`})})]}),(0,o.jsx)(`hr`,{className:`m-0`}),(0,o.jsxs)(`div`,{className:`card-body`,children:[(0,o.jsx)(b,{ftfield:u.ftfield,service:n,options:l,filter:x?.filter||{},handleChange:D,handleSearchForm:O}),(0,o.jsx)(f,{header:j,data:N,numOfFirst:u.numOfFirst,numOfLast:M,columnWidth:u.columnWidth}),x.items.length?(0,o.jsx)(r.u,{data:x,onChange:D,onClickPage:E}):``]})]}),(0,o.jsx)(d,{title:`Thêm mới`,modalRef:g,frmBody:e,clsWidth:m,onSubmit:k,btnTxt:h,itemId:v,setItemId:y,apiGetDetail:a.apiGetDetail})]})},S=({id:e,title:t=`Hình ảnh`,clsWidth:n=`xl`,elId:r})=>(0,o.jsx)(o.Fragment,{children:(0,o.jsx)(`div`,{id:e,className:`modal fade p-0 mx-auto`,"data-bs-backdrop":`static`,"data-bs-keyboard":`false`,children:(0,o.jsx)(`div`,{className:`modal-dialog modal-dialog-scrollable modal-${n}`,children:(0,o.jsxs)(`div`,{className:`modal-content`,children:[(0,o.jsxs)(`div`,{className:`modal-header py-3`,children:[(0,o.jsx)(`h5`,{className:`modal-title`,children:t}),(0,o.jsx)(`button`,{type:`button`,className:`btn-close btn-md-close`,children:(0,o.jsx)(`span`,{"aria-hidden":`true`,children:(0,o.jsx)(`i`,{className:`fal fa-times`,style:{fontSize:`1rem`}})})})]}),(0,o.jsx)(`div`,{className:`modal-body rounded-bottom pb-0`,children:(0,o.jsx)(`div`,{id:r,style:{height:`500px`}})})]})})})}),C=({config:e})=>(0,o.jsx)(o.Fragment,{children:(0,o.jsxs)(l.Helmet,{children:[(0,o.jsx)(`title`,{children:e?.name}),(0,o.jsx)(`link`,{rel:`shortcut icon`,href:t.f(e?.favicon||`/styles/favicon.ico`),type:`image/x-icon`}),(0,o.jsx)(`link`,{rel:`canonical`,href:`/`}),(0,o.jsx)(`link`,{rel:`apple-touch-icon`,href:t.f(e?.logotext||`/styles/logotext.png`)}),(0,o.jsx)(`link`,{rel:`stylesheet`,type:`text/css`,href:`https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900|Roboto+Slab:400,700`})]})});function w({tabs:e,onChange:t}){let n=(0,i.useRef)(null),r=(0,i.useRef)(null),a=(0,i.useRef)([]),[s,c]=(0,i.useState)(e[0]?.key),l=e=>{let t=r.current,i=a.current[e],o=n.current;if(!t||!i||!o)return;let s=o.getBoundingClientRect(),c=i.getBoundingClientRect(),l=c.left-s.left;t.style.width=`${c.width}px`,t.style.transform=`translate3d(${l}px, 0, 0)`};(0,i.useLayoutEffect)(()=>{if(!e.length)return;let t=e.findIndex(e=>e.key===s),n=t===-1?0:t;c(e[n].key),l(n)},[e]),(0,i.useLayoutEffect)(()=>{let t=e.findIndex(e=>e.key===s);t!==-1&&l(t)},[s]),(0,i.useEffect)(()=>{if(!n.current)return;let t=()=>{let t=e.findIndex(e=>e.key===s);t!==-1&&l(t)};window.addEventListener(`resize`,t);let r=new ResizeObserver(t);return r.observe(n.current),()=>{window.removeEventListener(`resize`,t),r.disconnect()}},[s,e]);let u=e=>{c(e),t?.(e)};return(0,o.jsx)(`div`,{className:`nav-wrapper position-relative`,children:(0,o.jsxs)(`ul`,{ref:n,className:`nav nav-pills nav-fill p-1 position-relative`,children:[(0,o.jsx)(`div`,{ref:r,className:`moving-tab position-absolute nav-link`,style:{padding:0,top:`0.25rem`,left:0,pointerEvents:`none`,transition:`transform 0.5s ease, width 0.5s ease`,willChange:`transform, width`,zIndex:1},children:(0,o.jsx)(`div`,{className:`nav-link mb-0 px-0 py-2 cursor-pointer active`,children:e.find(e=>e.key===s)?.label})}),e.map((e,t)=>(0,o.jsx)(`li`,{ref:e=>{e&&(a.current[t]=e)},className:`nav-item`,children:(0,o.jsx)(`div`,{className:`nav-link cursor-pointer align-middle ${s===e.key?`active`:``}`,onClick:()=>u(e.key),style:{position:`relative`,zIndex:2},children:(0,o.jsxs)(`div`,{className:`d-flex align-items-center justify-content-center`,children:[e.icon&&(0,o.jsx)(`i`,{className:`material-icons text-md position-relative line-height-1 me-1`,style:{top:0},children:e.icon}),e.label]})})},e.key))]})})}function T({src:e,title:t=`PDF Viewer`,fullWidth:n=!0,fullHeight:r=!0,className:i=``,style:a={}}){let s={width:n?`100%`:`auto`,height:r?`100vh`:`600px`,border:`none`,...a};return(0,o.jsx)(`div`,{className:`w-full h-full ${i}`,style:{position:`relative`},children:(0,o.jsx)(`iframe`,{src:e,title:t,style:s,allow:`fullscreen`})})}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return T}});
|