@materialui-reactjs/admin 1.0.6 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/CHANGELOG.md +322 -0
  2. package/LICENSE +21 -0
  3. package/README.md +587 -453
  4. package/dist/Common-DFahMuQE.cjs +11 -0
  5. package/dist/Common-_PK8HLKN.js +267 -0
  6. package/dist/Env-DoS-iQjs.cjs +1 -0
  7. package/dist/Env-SHztUA3s.js +16 -0
  8. package/dist/HeaderUpdate-Dirxjmxs.cjs +1 -0
  9. package/dist/{chunks/HeaderUpdate-DuS-gHNR.js → HeaderUpdate-drlnuHI8.js} +28 -25
  10. package/dist/SortableItem-C3KzO8Xh.cjs +1 -0
  11. package/dist/SpinnerLoader-BujLjvC3.cjs +1 -0
  12. package/dist/{chunks/SpinnerLoader-h8RDIarB.js → SpinnerLoader-CyhOQC6d.js} +2 -2
  13. package/dist/UDragFile-D8wOZ1Ut.js +96 -0
  14. package/dist/UDragFile-Db0sK4M7.cjs +1 -0
  15. package/dist/{chunks/Validator-CXYkI7vJ.js → Validator-D2zwZeov.js} +83 -52
  16. package/dist/Validator-DBxl8wtE.cjs +1 -0
  17. package/dist/assets/css/form.css +1 -1
  18. package/dist/assets/css/index.css +1 -1
  19. package/dist/ckeditor/ckeditor.d.ts +3 -0
  20. package/dist/ckeditor/plugins/elfinder.d.ts +11 -0
  21. package/dist/ckeditor/plugins/fullscreen.d.ts +15 -0
  22. package/dist/ckeditor/plugins/pdffinder.d.ts +18 -0
  23. package/dist/ckeditor/types.d.ts +37 -0
  24. package/dist/common-CEZp8xpQ.js +30 -0
  25. package/dist/common-ivDX6gGq.cjs +1 -0
  26. package/dist/components/echarts/index.cjs +1 -0
  27. package/dist/components/echarts/index.js +1 -1
  28. package/dist/components/form/AdvancedMultiSelect.d.ts +6 -3
  29. package/dist/components/form/AsxhUImages.d.ts +2 -1
  30. package/dist/components/form/BoxAddRow.d.ts +13 -2
  31. package/dist/components/form/CheckTreeBox.d.ts +12 -3
  32. package/dist/components/form/CusForm.d.ts +19 -6
  33. package/dist/components/form/DateInput.d.ts +2 -1
  34. package/dist/components/form/Editor.d.ts +2 -1
  35. package/dist/components/form/EfFile.d.ts +2 -1
  36. package/dist/components/form/EfImage.d.ts +2 -1
  37. package/dist/components/form/EfImages.d.ts +2 -1
  38. package/dist/components/form/PImage.d.ts +2 -1
  39. package/dist/components/form/SelectAddRowBox.d.ts +9 -5
  40. package/dist/components/form/SelectAddRowBoxAdvanced.d.ts +13 -4
  41. package/dist/components/form/SelectBox.d.ts +20 -7
  42. package/dist/components/form/UDragFile.d.ts +2 -1
  43. package/dist/components/form/UFile.d.ts +2 -1
  44. package/dist/components/form/UFiles.d.ts +9 -2
  45. package/dist/components/form/UImages.d.ts +2 -1
  46. package/dist/components/form/index.cjs +1 -0
  47. package/dist/components/form/index.js +2 -2
  48. package/dist/components/loader/SpinnerLoader.d.ts +5 -1
  49. package/dist/components/loader/index.cjs +1 -0
  50. package/dist/components/loader/index.js +1 -2
  51. package/dist/components/meta/CardTable.d.ts +11 -5
  52. package/dist/components/meta/CardTable.types.d.ts +57 -0
  53. package/dist/components/meta/CusTooltip.d.ts +8 -2
  54. package/dist/components/meta/Head.d.ts +10 -1
  55. package/dist/components/meta/HeaderDetail.d.ts +2 -1
  56. package/dist/components/meta/HeaderUpdate.d.ts +5 -1
  57. package/dist/components/meta/ModalForm.d.ts +41 -11
  58. package/dist/components/meta/Navtabs.d.ts +1 -1
  59. package/dist/components/meta/ScrollTable.d.ts +7 -3
  60. package/dist/components/meta/SearchBox.d.ts +8 -5
  61. package/dist/components/meta/SortableItem.d.ts +11 -1
  62. package/dist/components/meta/index.cjs +1 -0
  63. package/dist/components/meta/index.d.ts +1 -0
  64. package/dist/components/meta/index.js +3 -3
  65. package/dist/components/sidebar/Sidebar.types.d.ts +9 -7
  66. package/dist/components/sidebar/index.cjs +1 -0
  67. package/dist/components/sidebar/index.js +1 -1
  68. package/dist/components/single/Detail.d.ts +8 -3
  69. package/dist/components/single/Fields.d.ts +10 -4
  70. package/dist/components/single/Import.d.ts +8 -3
  71. package/dist/components/single/List.d.ts +33 -7
  72. package/dist/components/single/Update.d.ts +10 -4
  73. package/dist/components/single/UpdateDetail.d.ts +3 -2
  74. package/dist/components/single/UpdateTableDetail.d.ts +4 -3
  75. package/dist/components/single/index.cjs +1 -0
  76. package/dist/components/single/index.js +1 -1
  77. package/dist/components/top-navbar/index.cjs +1 -0
  78. package/dist/components/top-navbar/index.js +78 -2
  79. package/dist/echarts-Bi3uwLbg.cjs +1 -0
  80. package/dist/{chunks/echarts-CRmndsxC.js → echarts-CTzMqeR5.js} +4 -4
  81. package/dist/form-heyswTRq.js +3897 -0
  82. package/dist/form-sgtop6li.cjs +49 -0
  83. package/dist/hook/common.d.ts +87 -0
  84. package/dist/hook/detail.cjs +1 -0
  85. package/dist/hook/detail.d.ts +9 -15
  86. package/dist/hook/detail.js +1 -11
  87. package/dist/hook/fields.cjs +1 -0
  88. package/dist/hook/fields.d.ts +6 -14
  89. package/dist/hook/fields.js +1 -11
  90. package/dist/hook/import.d.ts +6 -11
  91. package/dist/hook/index.cjs +1 -0
  92. package/dist/hook/index.d.ts +29 -20
  93. package/dist/hook/index.js +14 -11
  94. package/dist/hook/update.cjs +1 -0
  95. package/dist/hook/update.d.ts +11 -19
  96. package/dist/hook/update.js +12 -9
  97. package/dist/index.cjs +1 -0
  98. package/dist/index.d.ts +16 -0
  99. package/dist/index.js +14 -11
  100. package/dist/meta-BANk9kHW.cjs +1 -0
  101. package/dist/meta-CheDAmMh.js +745 -0
  102. package/dist/rolldown-runtime-BocRIvOZ.cjs +1 -0
  103. package/dist/sidebar-CfQAYWi-.cjs +1 -0
  104. package/dist/{chunks/sidebar-Dj4Xr9du.js → sidebar-CzRmfvhi.js} +10 -13
  105. package/dist/{chunks/single-CRF61o_U.js → single-BsJ7TYJi.js} +364 -282
  106. package/dist/single-C2WPEjhk.cjs +1 -0
  107. package/dist/style.cjs +0 -0
  108. package/dist/style.d.ts +0 -0
  109. package/dist/style.js +0 -0
  110. package/dist/types/Menu.d.ts +25 -0
  111. package/dist/utils/Common.d.ts +224 -43
  112. package/dist/utils/CusRoute.d.ts +21 -1
  113. package/dist/utils/Env.d.ts +23 -2
  114. package/dist/utils/Group.d.ts +12 -1
  115. package/dist/utils/Validator.d.ts +34 -12
  116. package/dist/utils/index.cjs +11 -0
  117. package/dist/utils/index.d.ts +2 -1
  118. package/dist/utils/index.js +212 -171
  119. package/package.json +190 -163
  120. package/dist/chunks/Common-BURf0rBN.js +0 -222
  121. package/dist/chunks/Env-DRXhvUcb.js +0 -16
  122. package/dist/chunks/UDragFile-BnUR3riq.js +0 -92
  123. package/dist/chunks/form-CPkpL5eA.js +0 -45889
  124. package/dist/chunks/loader-BUiOnhOH.js +0 -1
  125. package/dist/chunks/meta-4qPWijBT.js +0 -758
  126. package/dist/chunks/top-navbar-Bob0gMUh.js +0 -78
  127. package/scripts/postinstall.cjs +0 -80
  128. /package/dist/{chunks/SortableItem-B4-Zsso3.js → SortableItem-B4-Zsso3.js} +0 -0
  129. /package/dist/{components/meta/Pdfviewer.d.ts → hook/import.cjs} +0 -0
@@ -0,0 +1,57 @@
1
+ import { CrudItem } from '../../hook/common';
2
+ /**
3
+ * Kiểu cột mà `service.tbFields()` trả về cho từng field của bảng.
4
+ */
5
+ export type TableColumnType = "text" | "number" | "date" | "select" | "selecthtml" | (string & {});
6
+ /** Cấu hình hiển thị của một cột trong bảng. */
7
+ export interface TableColumnConfig {
8
+ type: TableColumnType;
9
+ width?: number;
10
+ tdClassName?: string;
11
+ thClassName?: string;
12
+ /**
13
+ * Hàm chuyển đổi giá trị thô của API thành nội dung hiển thị.
14
+ *
15
+ * `raw = true` nghĩa là đang dựng nội dung cho `dangerouslySetInnerHTML`, nên hàm
16
+ * phải trả về chuỗi HTML — nhưng ép thành overload sẽ chặn cả những hàm trả
17
+ * `string | ReactNode`, vốn hợp lệ và phổ biến hơn. Ở đây chỉ siết tham số
18
+ * (`unknown` — giá trị đến từ API) và để kiểu trả về là `unknown`; phía render
19
+ * đã ép sang `ReactNode` khi cần.
20
+ */
21
+ func?: (value: unknown, raw?: boolean) => unknown;
22
+ }
23
+ /** Cấu hình của một trường tìm kiếm. */
24
+ export interface TableFilterConfig {
25
+ type: "text" | "select" | (string & {});
26
+ /** Danh sách chọn: mảng literal, hoặc tên key tra trong `TableOptions`. */
27
+ option?: string | Array<CrudItem>;
28
+ /** Tên trường dùng làm nhãn/giá trị hiển thị. */
29
+ keyName?: string;
30
+ }
31
+ /**
32
+ * Hợp đồng mà consumer phải cung cấp cho `CardTable` / `SearchBox`.
33
+ *
34
+ * Trước đây prop `service` kiểu `any`, nên sai tên hàm chỉ lộ ra lúc runtime.
35
+ * Giờ sai kiểu sẽ bị TypeScript chặn ngay.
36
+ */
37
+ export interface TableService {
38
+ /** Cấu hình cột hiển thị cho `field`. */
39
+ tbFields: (field: string) => TableColumnConfig;
40
+ /** Cấu hình trường tìm kiếm cho `field`. */
41
+ ftFields: (field: string) => TableFilterConfig;
42
+ /** Nhãn tiếng Việt của `field`. */
43
+ fieldName: (field: string) => string;
44
+ }
45
+ /**
46
+ * Bảng tra danh sách chọn, dùng bởi `ftFields().option` khi trả về tên key
47
+ * (chuỗi) thay vì mảng literal.
48
+ */
49
+ export type TableOptions = Record<string, Array<Record<string, unknown>>>;
50
+ /**
51
+ * Nội dung form render bên trong modal thêm/sửa.
52
+ *
53
+ * Không định nghĩa lại ở đây mà dùng chung với `ModalForm` — chính `ModalForm`
54
+ * là nơi quyết định gọi `frmBody(formData, handleChange)`, nên để một nguồn
55
+ * duy nhất tránh hai bản chữ ký lệch nhau.
56
+ */
57
+ export type { ModalFormBody as TableFormBody } from './ModalForm';
@@ -1,7 +1,13 @@
1
1
  import { TooltipProps } from '@mui/material';
2
- interface TooltipCusProps extends Omit<TooltipProps, "children"> {
2
+ interface TooltipCusProps extends Omit<TooltipProps, "children" | "placement"> {
3
3
  children: React.ReactElement;
4
4
  y?: number;
5
+ /**
6
+ * `Tooltip` của MUI chỉ nhận đúng 12 vị trí đã định nghĩa (`TooltipProps`
7
+ * mặc định không để truyền string tự do). Thu hẹp về đúng union đó thay vì
8
+ * ép `as any` — trước đây sai kiểu chỉ lộ lúc runtime.
9
+ */
10
+ placement?: TooltipProps["placement"];
5
11
  }
6
- export declare function CusTooltip({ title, children, placement, y }: TooltipCusProps): import("react").JSX.Element;
12
+ export declare function CusTooltip({ title, children, placement, y }: TooltipCusProps): import('react').JSX.Element;
7
13
  export {};
@@ -1 +1,10 @@
1
- export declare const Head: ({ config }: Record<string, any>) => import("react").JSX.Element;
1
+ /** Cấu hình mà app truyền cho `Head` để dựng `<Helmet>`. */
2
+ export interface HeadConfig {
3
+ name?: string;
4
+ favicon?: string;
5
+ logotext?: string;
6
+ [key: string]: unknown;
7
+ }
8
+ export declare const Head: ({ config }: {
9
+ config?: HeadConfig;
10
+ }) => import('react').JSX.Element;
@@ -1,8 +1,9 @@
1
+ import { CrudItem } from '../../hook/common';
1
2
  export interface HDProps {
2
3
  cUri: string;
3
4
  adminUri: string;
4
5
  title: string;
5
- item?: any;
6
+ item?: CrudItem;
6
7
  isSave?: boolean;
7
8
  titleAction?: string;
8
9
  }
@@ -2,7 +2,11 @@ export interface HUProps {
2
2
  adminUri: string;
3
3
  cUri: string;
4
4
  title: string;
5
- itemId: number;
5
+ /**
6
+ * `id` của bản ghi. Tuỳ chọn vì trang "thêm mới" chưa có bản ghi nào —
7
+ * lúc đó header chỉ hiện nút quay lại, không dùng id.
8
+ */
9
+ itemId?: number;
6
10
  isSave?: boolean;
7
11
  titleAction?: string;
8
12
  }
@@ -1,18 +1,48 @@
1
- import { Modal } from 'bootstrap';
2
- interface ModalProps {
3
- modalRef: any;
1
+ import { Dispatch, RefObject, SetStateAction } from 'react';
2
+ import { FormValue } from '../../hook/common';
3
+ /**
4
+ * Instance modal của Bootstrap, chỉ phần `ModalForm` thực sự dùng.
5
+ *
6
+ * Cố tình KHÔNG khai báo `Modal` từ `bootstrap`: đó là peerDependency nhưng
7
+ * `@types/bootstrap` thì không được khai ở đâu cả. Nếu để kiểu đó lọt vào
8
+ * `.d.ts`, mọi consumer chạy `skipLibCheck: false` đều phải tự cài
9
+ * `@types/bootstrap` chỉ để typecheck — đã kiểm chứng bằng cách cài package
10
+ * vào một project sạch.
11
+ */
12
+ export interface ModalInstance {
13
+ hide(): void;
14
+ show(): void;
15
+ }
16
+ /**
17
+ * Nội dung form trong modal.
18
+ *
19
+ * Là HÀM render chứ không phải node: `ModalForm` gọi
20
+ * `frmBody(formData, handleChange)` để truyền dữ liệu hiện tại + handler đổi
21
+ * giá trị xuống form con. Truyền một element trực tiếp sẽ ném
22
+ * "frmBody is not a function" lúc runtime.
23
+ */
24
+ export type ModalFormBody = (formData: FormValue, onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => void) => React.ReactNode;
25
+ export interface ModalFormProps {
26
+ /** Element gốc của modal; component gắn instance Bootstrap vào đây. */
27
+ modalRef: RefObject<HTMLDivElement | null>;
28
+ /** URL chi tiết; có `itemId` thì modal tự nạp bản ghi. */
4
29
  apiGetDetail?: string;
30
+ /** `0` (hoặc bỏ trống) = chế độ thêm mới. */
5
31
  itemId?: number;
6
- setItemId?: any;
32
+ /** Được gọi khi modal đóng, để parent reset `itemId` về 0. */
33
+ setItemId?: (id: number) => void;
7
34
  title: string;
8
- frmBody: any;
35
+ frmBody: ModalFormBody;
9
36
  clsWidth?: string;
10
37
  btnTxt?: string;
11
- onHide?: any;
12
- style?: any;
38
+ onHide?: () => void;
39
+ style?: React.CSSProperties;
13
40
  clsBody?: string;
14
- data?: any;
15
- onSubmit: (data: any, modal: Modal, setFormData?: React.Dispatch<any>) => void;
41
+ /**
42
+ * Dữ liệu khởi tạo cho form; ưu tiên dùng `itemId` để tự nạp từ API.
43
+ * Cùng kiểu với state nội bộ nên gán thẳng, không cần chuyển đổi.
44
+ */
45
+ data?: FormValue;
46
+ onSubmit: (data: FormValue, modal: ModalInstance, setFormData?: Dispatch<SetStateAction<FormValue>>) => void;
16
47
  }
17
- export declare const ModalForm: React.FC<ModalProps>;
18
- export {};
48
+ export declare const ModalForm: React.FC<ModalFormProps>;
@@ -8,5 +8,5 @@ interface Props {
8
8
  tabs: Tab[];
9
9
  onChange?: (key: TabKey) => void;
10
10
  }
11
- export declare function NavTabs({ tabs, onChange }: Props): import("react").JSX.Element;
11
+ export declare function NavTabs({ tabs, onChange }: Props): import('react').JSX.Element;
12
12
  export {};
@@ -1,13 +1,17 @@
1
1
  import { default as React } from 'react';
2
- interface HeaderItem {
3
- label?: any;
2
+ import { CrudItem } from '../../hook/common';
3
+ export interface HeaderItem {
4
+ /** Nhãn cột: chuỗi, hoặc node React tuỳ ý (vd icon, badge). */
5
+ label?: React.ReactNode;
4
6
  width?: number;
7
+ /** Căn chỉnh nội dung ô dữ liệu — CSS `text-*` của Bootstrap. */
8
+ align?: string;
5
9
  thClassName?: string;
6
10
  tdClassName?: string;
7
11
  }
8
12
  interface ScrollTableProps extends React.HTMLAttributes<HTMLTableElement> {
9
13
  header: HeaderItem[];
10
- data: Record<string, any>[];
14
+ data: CrudItem[];
11
15
  numOfFirst?: number;
12
16
  numOfLast?: number;
13
17
  columnWidth?: number;
@@ -1,9 +1,12 @@
1
+ import { TableFilter } from '../../hook/index';
2
+ import { FormChangeHandler } from '../../hook/common';
3
+ import { TableOptions, TableService } from './CardTable.types';
1
4
  export interface SearchBoxProps {
2
- ftfield: any[];
3
- service: any;
4
- options: any;
5
- filter: any;
6
- handleChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => void;
5
+ ftfield: string[];
6
+ service: TableService;
7
+ options: TableOptions;
8
+ filter: TableFilter;
9
+ handleChange: FormChangeHandler;
7
10
  handleSearchForm: (e: React.MouseEvent<HTMLFormElement>) => void;
8
11
  }
9
12
  export declare const SearchBox: React.FC<SearchBoxProps>;
@@ -1 +1,11 @@
1
- export declare function SortableItem({ id, className, iconSize, iconStyle, children }: any): import("react").JSX.Element;
1
+ import { CSSProperties, ReactNode } from 'react';
2
+ /** Props của một item có thể kéo-thả (dùng chung bởi `BoxAddRow`). */
3
+ export interface SortableItemProps {
4
+ /** Khóa duy nhất — `useSortable` dùng nó để định danh node. */
5
+ id: string;
6
+ className?: string;
7
+ iconSize?: string;
8
+ iconStyle?: CSSProperties;
9
+ children?: ReactNode;
10
+ }
11
+ export declare function SortableItem({ id, className, iconSize, iconStyle, children, }: SortableItemProps): import('react').JSX.Element;
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../SortableItem-C3KzO8Xh.cjs"),t=require("../../meta-BANk9kHW.cjs"),n=require("../../HeaderUpdate-Dirxjmxs.cjs");exports.BtnGroup=t.l,exports.CardTable=t.a,exports.CusTooltip=n.d,exports.ElfinderModal=t.i,exports.Error403=n.a,exports.Error404=n.i,exports.Head=t.r,exports.HeaderDetail=n.r,exports.HeaderIndex=n.n,exports.HeaderUpdate=n.t,exports.ModalForm=t.c,exports.NavTabs=t.n,exports.PDFEmbed=t.t,exports.Pagination=n.u,exports.ScrollTable=t.s,exports.SearchBox=t.o,exports.SortableItem=e.t;
@@ -1,5 +1,6 @@
1
1
  export * from './BtnGroup';
2
2
  export * from './CardTable';
3
+ export * from './CardTable.types';
3
4
  export * from './CusTooltip';
4
5
  export * from './ElfinderModal';
5
6
  export * from './Error403';
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../chunks/SortableItem-B4-Zsso3.js";
2
- import { a as t, c as n, i as r, l as i, n as a, o, r as s, s as c, t as l } from "../../chunks/meta-4qPWijBT.js";
3
- import { a as u, d, i as f, n as p, r as m, t as h, u as g } from "../../chunks/HeaderUpdate-DuS-gHNR.js";
1
+ import { t as e } from "../../SortableItem-B4-Zsso3.js";
2
+ import { a as t, c as n, i as r, l as i, n as a, o, r as s, s as c, t as l } from "../../meta-CheDAmMh.js";
3
+ import { a as u, d, i as f, n as p, r as m, t as h, u as g } from "../../HeaderUpdate-drlnuHI8.js";
4
4
  export { i as BtnGroup, t as CardTable, d as CusTooltip, r as ElfinderModal, u as Error403, f as Error404, s as Head, m as HeaderDetail, p as HeaderIndex, h as HeaderUpdate, n as ModalForm, a as NavTabs, l as PDFEmbed, g as Pagination, c as ScrollTable, o as SearchBox, e as SortableItem };
@@ -1,17 +1,19 @@
1
- export interface MenuItem {
1
+ import { MenuPermissionItem } from '../../types/Menu';
2
+ /**
3
+ * Menu hiển thị trong Sidebar.
4
+ *
5
+ * Mở rộng `MenuPermissionItem` (hình dạng tối thiểu cho lớp phân quyền) bằng
6
+ * các trường chỉ dùng để render. Nhờ vậy `MenuItem[]` truyền thẳng được vào
7
+ * `checkPermission` mà không cần ép kiểu.
8
+ */
9
+ export interface MenuItem extends MenuPermissionItem {
2
10
  id: number;
3
11
  name: string;
4
12
  url: string;
5
- module: string;
6
- controller: string;
7
- action: string;
8
- code: number;
9
13
  parentId: number;
10
14
  sortOrder: number;
11
15
  menuIcon: string;
12
- status: number;
13
16
  vf: number;
14
- isPer: boolean;
15
17
  subs?: MenuItem[];
16
18
  }
17
19
  export interface SidebarProps {
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../sidebar-CfQAYWi-.cjs");exports.Sidebar=e.t;
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../chunks/sidebar-Dj4Xr9du.js";
1
+ import { t as e } from "../../sidebar-CzRmfvhi.js";
2
2
  export { e as Sidebar };
@@ -7,9 +7,14 @@ export declare class SingleDetail extends React.Component<PropsType, StateType>
7
7
  state: StateType;
8
8
  title: string;
9
9
  cUri: string;
10
- cLink: string;
11
- API_URL: any;
12
- ADMIN_URI: any;
10
+ private _envOverride;
11
+ private _cLinkOverride?;
12
+ get API_URL(): string;
13
+ set API_URL(v: string);
14
+ get ADMIN_URI(): string;
15
+ set ADMIN_URI(v: string);
16
+ get cLink(): string;
17
+ set cLink(v: string);
13
18
  getDataUrl: string;
14
19
  ctype: string;
15
20
  fluid: boolean;
@@ -1,5 +1,6 @@
1
1
  import { default as React } from 'react';
2
2
  import { PropsType, StateType } from '../../hook/fields';
3
+ import { CrudItem } from '../../hook/common';
3
4
  export declare class SingleFields extends React.Component<PropsType, StateType> {
4
5
  effectRan: boolean;
5
6
  module: string;
@@ -8,9 +9,14 @@ export declare class SingleFields extends React.Component<PropsType, StateType>
8
9
  state: StateType;
9
10
  title: string;
10
11
  cUri: string;
11
- cLink: string;
12
- API_URL: any;
13
- ADMIN_URI: any;
12
+ private _envOverride;
13
+ private _cLinkOverride?;
14
+ get API_URL(): string;
15
+ set API_URL(v: string);
16
+ get ADMIN_URI(): string;
17
+ set ADMIN_URI(v: string);
18
+ get cLink(): string;
19
+ set cLink(v: string);
14
20
  getDataUrl: string;
15
21
  editUrl: string;
16
22
  createUrl: string;
@@ -26,7 +32,7 @@ export declare class SingleFields extends React.Component<PropsType, StateType>
26
32
  componentDidMount(): void;
27
33
  componentDidMountAfter: () => Promise<void>;
28
34
  handleSubmit: (e: React.SubmitEvent<HTMLFormElement>) => Promise<void>;
29
- afterSubmit: (_item: any) => Promise<void>;
35
+ afterSubmit: (_item: CrudItem | false) => Promise<void>;
30
36
  renderHeaderUpdate(): React.JSX.Element;
31
37
  render(): React.JSX.Element;
32
38
  }
@@ -6,9 +6,14 @@ export declare class SingleImport extends React.Component<PropsType, StateType>
6
6
  state: StateType;
7
7
  title: string;
8
8
  cUri: string;
9
- cLink: string;
10
- API_URL: any;
11
- ADMIN_URI: any;
9
+ private _envOverride;
10
+ private _cLinkOverride?;
11
+ get API_URL(): string;
12
+ set API_URL(v: string);
13
+ get ADMIN_URI(): string;
14
+ set ADMIN_URI(v: string);
15
+ get cLink(): string;
16
+ set cLink(v: string);
12
17
  importUrl: string;
13
18
  importFile: string;
14
19
  ctype: string;
@@ -1,5 +1,6 @@
1
1
  import { default as React } from 'react';
2
- import { StateType, PropsType } from '../../hook/index';
2
+ import { StateType, PropsType, TableFilter } from '../../hook/index';
3
+ import { CrudItem } from '../../hook/common';
3
4
  export declare class SingleIndex extends React.Component<PropsType, StateType> {
4
5
  effectRan: boolean;
5
6
  fluid: boolean;
@@ -10,9 +11,14 @@ export declare class SingleIndex extends React.Component<PropsType, StateType> {
10
11
  state: StateType;
11
12
  activeMethod: string[];
12
13
  cUri: string;
13
- cLink: string;
14
- API_URL: any;
15
- ADMIN_URI: any;
14
+ private _envOverride;
15
+ private _cLinkOverride?;
16
+ get API_URL(): string;
17
+ set API_URL(v: string);
18
+ get ADMIN_URI(): string;
19
+ set ADMIN_URI(v: string);
20
+ get cLink(): string;
21
+ set cLink(v: string);
16
22
  getDataUrl: string;
17
23
  deleteUrl: string;
18
24
  copyUrl: string;
@@ -27,11 +33,31 @@ export declare class SingleIndex extends React.Component<PropsType, StateType> {
27
33
  handleExport: () => Promise<void>;
28
34
  handleSelectOne: (id: number, checked: boolean) => void;
29
35
  handleSelectAll: (checked: boolean, skipIds?: number[]) => void;
30
- setFilter(filter: any): Promise<void>;
36
+ setFilter(filter: TableFilter): Promise<void>;
31
37
  fetchData: () => Promise<void>;
38
+ /**
39
+ * Điểm mở rộng (override point) để subclass nạp cấu hình cột theo người dùng.
40
+ *
41
+ * Mặc định trả hai object RỖNG — nghĩa là `ftfield`/`tbfield` rơi về `[]`.
42
+ * Đây là hành vi có chủ đích, không phải stub quên hoàn thiện: thư viện
43
+ * không được phụ thuộc vào service cụ thể của ứng dụng, nên consumer muốn
44
+ * dùng `hasField` thì override hàm này (xem `Fields.tsx`).
45
+ *
46
+ * Kiểu trả về khớp với cách đọc ở `syncPermissionsAndState`.
47
+ */
32
48
  syncGetField: () => Promise<{
33
- userfield: Record<string, any>;
34
- tablefield: Record<string, any>;
49
+ userfield: CrudItem & {
50
+ data?: {
51
+ ftfield?: string[];
52
+ tbfield?: string[];
53
+ };
54
+ };
55
+ tablefield: CrudItem & {
56
+ data?: {
57
+ deft?: string[];
58
+ detb?: string[];
59
+ };
60
+ };
35
61
  }>;
36
62
  syncPermissionsAndState: () => Promise<void>;
37
63
  initDidMount(): Promise<void>;
@@ -1,5 +1,6 @@
1
1
  import { default as React } from 'react';
2
2
  import { PropsType, StateType } from '../../hook/update';
3
+ import { CrudItem } from '../../hook/common';
3
4
  export declare class SingleUpdate extends React.Component<PropsType, StateType> {
4
5
  effectRan: boolean;
5
6
  module: string;
@@ -7,9 +8,14 @@ export declare class SingleUpdate extends React.Component<PropsType, StateType>
7
8
  state: StateType;
8
9
  title: string;
9
10
  cUri: string;
10
- cLink: string;
11
- API_URL: any;
12
- ADMIN_URI: any;
11
+ private _envOverride;
12
+ private _cLinkOverride?;
13
+ get API_URL(): string;
14
+ set API_URL(v: string);
15
+ get ADMIN_URI(): string;
16
+ set ADMIN_URI(v: string);
17
+ get cLink(): string;
18
+ set cLink(v: string);
13
19
  getDataUrl: string;
14
20
  editUrl: string;
15
21
  createUrl: string;
@@ -28,7 +34,7 @@ export declare class SingleUpdate extends React.Component<PropsType, StateType>
28
34
  componentDidMountAfter: () => Promise<void>;
29
35
  beforeSubmit: () => Promise<unknown>;
30
36
  handleSubmit: (e: React.SubmitEvent<HTMLFormElement>) => Promise<void>;
31
- afterSubmit: (_item: any) => Promise<void>;
37
+ afterSubmit: (_item: CrudItem) => Promise<void>;
32
38
  renderHeaderUpdate(): React.JSX.Element;
33
39
  render(): React.JSX.Element;
34
40
  }
@@ -1,7 +1,8 @@
1
1
  import { SingleUpdate } from './Update';
2
+ import { FormValue } from '../../hook/common';
2
3
  export declare class SingleUpdateDetail extends SingleUpdate {
3
4
  urlUpdateDetail: string;
4
- render(): any;
5
- handleDetailSubmit: (formData: any[], frmRef: Element) => Promise<void>;
5
+ render(): import('react').JSX.Element;
6
+ handleDetailSubmit: (formData: FormValue[], frmRef: Element) => Promise<void>;
6
7
  editDetailAfter: (_itemId: number) => Promise<void>;
7
8
  }
@@ -1,5 +1,6 @@
1
1
  import { SingleUpdate } from './Update';
2
2
  import { PropsType } from '../../hook/update';
3
+ import { TableFormBody } from '../meta/CardTable.types';
3
4
  export declare class SingleUpdateTableDetail extends SingleUpdate {
4
5
  urlGetDeTableList: string;
5
6
  urlGetDeTable: string;
@@ -10,9 +11,9 @@ export declare class SingleUpdateTableDetail extends SingleUpdate {
10
11
  isBackUri: boolean;
11
12
  constructor(props: PropsType);
12
13
  fetchDataDetails(): Promise<{}>;
13
- render(): any;
14
- renderDeTable(): import("react").JSX.Element;
15
- renderModalDeBody: (_formData: any, _handleFMChange?: any) => import("react").JSX.Element;
14
+ render(): import('react').JSX.Element;
15
+ renderDeTable(): import('react').JSX.Element;
16
+ renderModalDeBody: TableFormBody;
16
17
  handleDetailSubmit: (e: React.SubmitEvent<HTMLFormElement>) => Promise<void>;
17
18
  editDetailAfter: (_itemId: number) => Promise<void>;
18
19
  }
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../single-C2WPEjhk.cjs");exports.SingleDetail=e.s,exports.SingleFields=e.o,exports.SingleImport=e.a,exports.SingleIndex=e.i,exports.SingleUpdate=e.r,exports.SingleUpdateDetail=e.n,exports.SingleUpdateTableDetail=e.t;
@@ -1,2 +1,2 @@
1
- import { a as e, i as t, n, o as r, r as i, s as a, t as o } from "../../chunks/single-CRF61o_U.js";
1
+ import { a as e, i as t, n, o as r, r as i, s as a, t as o } from "../../single-BsJ7TYJi.js";
2
2
  export { a as SingleDetail, r as SingleFields, e as SingleImport, t as SingleIndex, i as SingleUpdate, n as SingleUpdateDetail, o as SingleUpdateTableDetail };
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../rolldown-runtime-BocRIvOZ.cjs"),t=require("../../Common-DFahMuQE.cjs");let n=require("react");n=e.t(n,1);let r=require("react/jsx-runtime"),i=require("react-router-dom");var a=({userName:e,role:n})=>{let a=(0,i.useNavigate)(),o=async()=>{a(`/`,{replace:!0}),localStorage.removeItem(`isLogin`),window.dispatchEvent(new Event(`storage`))};return(0,r.jsx)(`nav`,{className:`navbar navbar-main navbar-expand-lg position-sticky z-index-sticky shadow-none bg-gradient-dark py-3 px-0`,"data-scroll":`true`,children:(0,r.jsx)(`div`,{className:`container-fluid`,children:(0,r.jsx)(`div`,{className:`collapse navbar-collapse mt-sm-0 mt-2 me-md-0 me-sm-4`,children:(0,r.jsx)(`ul`,{className:`navbar-nav justify-content-end ms-auto`,children:(0,r.jsxs)(`li`,{className:`nav-item dropdown py-0`,children:[(0,r.jsxs)(`button`,{className:`btn btn-sm btn-outline-light dropdown-toggle`,"data-bs-toggle":`dropdown`,"aria-expanded":`false`,children:[(0,r.jsx)(`i`,{className:`fa-regular fa-user-circle me-1`}),e,n&&(0,r.jsx)(`span`,{className:`badge bg-warning text-white ms-2`,children:n})]}),(0,r.jsxs)(`ul`,{className:`dropdown-menu dropdown-menu-end dropdown-menu-animation dropdown-md p-2 border border-radius-xl mt-0 mt-lg-3`,role:`menu`,children:[e&&(0,r.jsx)(`li`,{className:`dropdown-item border-radius-md`,children:(0,r.jsx)(i.Link,{className:`d-block w-100 nav-link py-1`,to:`/profile`,children:`Thông tin tài khoản`})}),e&&(0,r.jsx)(`li`,{className:`dropdown-item border-radius-md`,children:(0,r.jsx)(i.Link,{className:`d-block w-100 nav-link py-1`,to:`/userlogs`,children:`Nhật ký hoạt động`})}),(0,r.jsx)(`li`,{className:`dropdown-item border-radius-md`,children:(0,r.jsx)(i.Link,{className:`d-block w-100 nav-link py-1`,to:`#`,onClick:async e=>{e.preventDefault();try{await o(),t.S(`Đăng xuất thành công`,`top-end`,!0)}catch(e){t.x(t.s(e))}},children:`Đăng xuất`})})]})]})})})})})};exports.TopNavbar=a;
@@ -1,2 +1,78 @@
1
- import { t as e } from "../../chunks/top-navbar-Bob0gMUh.js";
2
- export { e as TopNavbar };
1
+ import { S as e, s as t, x as n } from "../../Common-_PK8HLKN.js";
2
+ import "react";
3
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
+ import { Link as a, useNavigate as o } from "react-router-dom";
5
+ //#region src/components/top-navbar/TopNavbar.tsx
6
+ var s = ({ userName: s, role: c }) => {
7
+ let l = o(), u = async () => {
8
+ l("/", { replace: !0 }), localStorage.removeItem("isLogin"), window.dispatchEvent(new Event("storage"));
9
+ };
10
+ return /* @__PURE__ */ r("nav", {
11
+ className: "navbar navbar-main navbar-expand-lg position-sticky z-index-sticky shadow-none bg-gradient-dark py-3 px-0",
12
+ "data-scroll": "true",
13
+ children: /* @__PURE__ */ r("div", {
14
+ className: "container-fluid",
15
+ children: /* @__PURE__ */ r("div", {
16
+ className: "collapse navbar-collapse mt-sm-0 mt-2 me-md-0 me-sm-4",
17
+ children: /* @__PURE__ */ r("ul", {
18
+ className: "navbar-nav justify-content-end ms-auto",
19
+ children: /* @__PURE__ */ i("li", {
20
+ className: "nav-item dropdown py-0",
21
+ children: [/* @__PURE__ */ i("button", {
22
+ className: "btn btn-sm btn-outline-light dropdown-toggle",
23
+ "data-bs-toggle": "dropdown",
24
+ "aria-expanded": "false",
25
+ children: [
26
+ /* @__PURE__ */ r("i", { className: "fa-regular fa-user-circle me-1" }),
27
+ s,
28
+ c && /* @__PURE__ */ r("span", {
29
+ className: "badge bg-warning text-white ms-2",
30
+ children: c
31
+ })
32
+ ]
33
+ }), /* @__PURE__ */ i("ul", {
34
+ className: "dropdown-menu dropdown-menu-end dropdown-menu-animation dropdown-md p-2 border border-radius-xl mt-0 mt-lg-3",
35
+ role: "menu",
36
+ children: [
37
+ s && /* @__PURE__ */ r("li", {
38
+ className: "dropdown-item border-radius-md",
39
+ children: /* @__PURE__ */ r(a, {
40
+ className: "d-block w-100 nav-link py-1",
41
+ to: "/profile",
42
+ children: "Thông tin tài khoản"
43
+ })
44
+ }),
45
+ s && /* @__PURE__ */ r("li", {
46
+ className: "dropdown-item border-radius-md",
47
+ children: /* @__PURE__ */ r(a, {
48
+ className: "d-block w-100 nav-link py-1",
49
+ to: "/userlogs",
50
+ children: "Nhật ký hoạt động"
51
+ })
52
+ }),
53
+ /* @__PURE__ */ r("li", {
54
+ className: "dropdown-item border-radius-md",
55
+ children: /* @__PURE__ */ r(a, {
56
+ className: "d-block w-100 nav-link py-1",
57
+ to: "#",
58
+ onClick: async (r) => {
59
+ r.preventDefault();
60
+ try {
61
+ await u(), e("Đăng xuất thành công", "top-end", !0);
62
+ } catch (e) {
63
+ n(t(e));
64
+ }
65
+ },
66
+ children: "Đăng xuất"
67
+ })
68
+ })
69
+ ]
70
+ })]
71
+ })
72
+ })
73
+ })
74
+ })
75
+ });
76
+ };
77
+ //#endregion
78
+ export { s as TopNavbar };
@@ -0,0 +1 @@
1
+ const e=require("./rolldown-runtime-BocRIvOZ.cjs");let t=require("react");t=e.t(t,1);let n=require("react/jsx-runtime"),r=require("echarts-for-react");r=e.t(r,1);var i=(0,t.memo)(({title:e=`Bar Chart`,labels:i,values:a,color:o=`#5470C6`,showGrid:s=!1,visible:c=!1})=>{let l=(0,t.useRef)(null),u=(0,t.useMemo)(()=>({title:{text:e,left:`center`,textStyle:{fontSize:18,fontFamily:`Roboto, sans-serif`}},textStyle:{fontFamily:`Roboto, sans-serif`},tooltip:{trigger:`axis`,axisPointer:{type:`shadow`}},xAxis:{type:`category`,data:i,axisTick:{alignWithLabel:!0},axisLabel:{rotate:0}},yAxis:{type:`value`,splitLine:{show:s}},series:[{data:a,type:`bar`,barWidth:`50%`,itemStyle:{color:o,borderRadius:[6,6,0,0]},emphasis:{itemStyle:{color:`#91cc75`}}}],grid:{left:`5%`,right:`5%`,bottom:`10%`,containLabel:!0},animationDuration:600}),[e,i,a,o,s]);return(0,t.useEffect)(()=>{c&&l.current?.getEchartsInstance()?.resize()},[c]),(0,n.jsx)(r.default,{ref:l,option:u,style:{height:400,width:`100%`},notMerge:!0,autoResize:!0,lazyUpdate:!0})}),a=(0,t.memo)(({title:e=`Line Chart`,labels:i,values:a,color:o=`#5470C6`,visible:s=!1})=>{let c=(0,t.useRef)(null),l=(0,t.useMemo)(()=>({title:{text:e,left:`center`,textStyle:{fontSize:18,fontFamily:`Roboto, sans-serif`}},textStyle:{fontFamily:`Roboto, sans-serif`},tooltip:{trigger:`axis`},xAxis:{type:`category`,data:i,boundaryGap:!1},yAxis:{type:`value`,min:e=>Math.floor(e.min*.9),max:e=>Math.ceil(e.max*1.1)},series:[{data:a,type:`line`,smooth:!0,lineStyle:{color:o,width:3},itemStyle:{color:o},areaStyle:{color:`${o}33`}}],grid:{left:`5%`,right:`5%`,bottom:`10%`,containLabel:!0}}),[e,i,a,o]);return(0,t.useEffect)(()=>{s&&c.current?.getEchartsInstance()?.resize()},[s]),(0,n.jsx)(r.default,{ref:c,option:l,style:{height:400,width:`100%`},notMerge:!0,autoResize:!0,lazyUpdate:!0})}),o=(0,t.memo)(({title:e=`Multi Bar Chart`,labels:i,series:a,visible:o=!1})=>{let s=(0,t.useRef)(null),c=(0,t.useMemo)(()=>({title:{text:e,left:`center`,textStyle:{fontSize:18,fontFamily:`Roboto, sans-serif`}},textStyle:{fontFamily:`Roboto, sans-serif`},tooltip:{trigger:`axis`,axisPointer:{type:`shadow`}},legend:{top:`5%`,left:`center`,icon:`circle`},grid:{top:`15%`,left:`5%`,right:`5%`,bottom:`10%`,containLabel:!0},xAxis:{type:`category`,data:Array.isArray(i)?i:[],axisTick:{alignWithLabel:!0}},yAxis:{type:`value`,splitLine:{lineStyle:{color:`#eee`}}},series:Array.isArray(a)?a.map(e=>({name:e.name,type:`bar`,data:e.data,barWidth:`40%`,itemStyle:{color:e.color,borderRadius:[4,4,0,0]},emphasis:{focus:`series`}})):[],animationDuration:600}),[e,i,a]);return(0,t.useEffect)(()=>{o&&s.current?.getEchartsInstance()?.resize()},[o]),(0,n.jsx)(r.default,{ref:s,option:c,style:{height:400,width:`100%`},notMerge:!0,autoResize:!0,lazyUpdate:!0})}),s=(0,t.memo)(({title:e=`Multi-Line Chart`,labels:i,series:a,visible:o=!1})=>{let s=(0,t.useRef)(null),c=(0,t.useMemo)(()=>({title:{text:e,left:`center`,textStyle:{fontSize:18,fontFamily:`Roboto, sans-serif`}},textStyle:{fontFamily:`Roboto, sans-serif`},tooltip:{trigger:`axis`,backgroundColor:`rgba(50,50,50,0.8)`,borderWidth:0,textStyle:{color:`#fff`}},legend:{top:`5%`,left:`center`,icon:`circle`},grid:{top:`15%`,left:`5%`,right:`5%`,bottom:`10%`,containLabel:!0},xAxis:{type:`category`,data:Array.isArray(i)?i:[],boundaryGap:!1,axisLine:{lineStyle:{color:`#aaa`}},axisLabel:{fontSize:12}},yAxis:{type:`value`,axisLine:{show:!1},splitLine:{lineStyle:{color:`#eee`}}},series:Array.isArray(a)?a.map(e=>({name:e.name,type:`line`,data:e.data,smooth:!0,lineStyle:{width:3,color:e.color},itemStyle:{color:e.color},areaStyle:{color:e.color?`${e.color}33`:void 0},emphasis:{focus:`series`}})):[],animationDuration:600}),[e,i,a]);return(0,t.useEffect)(()=>{o&&s.current?.getEchartsInstance()?.resize()},[o]),(0,n.jsx)(r.default,{ref:s,option:c,style:{height:400,width:`100%`},notMerge:!0,autoResize:!0,lazyUpdate:!0})}),c=(0,t.memo)(({title:e=`Pie Chart`,data:i,visible:a=!1})=>{let o=(0,t.useRef)(null),s=(0,t.useMemo)(()=>({title:{text:e,left:`center`,textStyle:{fontSize:18,fontFamily:`Roboto, sans-serif`}},textStyle:{fontFamily:`Roboto, sans-serif`},tooltip:{trigger:`item`,formatter:`{a} <br/>{b}: {c} ({d}%)`},legend:{left:`center`,top:`top`},series:[{name:e,type:`pie`,radius:`65%`,center:[`50%`,`60%`],data:i,emphasis:{itemStyle:{shadowBlur:10,shadowOffsetX:0,shadowColor:`rgba(0, 0, 0, 0.3)`}},label:{formatter:`{b}: {d}%`}}]}),[i,e]);return(0,t.useEffect)(()=>{a&&o.current?.getEchartsInstance()?.resize()},[a]),(0,n.jsx)(r.default,{ref:o,option:s,style:{height:400,width:`100%`},notMerge:!0,autoResize:!0,lazyUpdate:!0})});Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return c}});
@@ -156,14 +156,14 @@ var o = e(({ title: e = "Bar Chart", labels: o, values: s, color: c = "#5470C6",
156
156
  },
157
157
  xAxis: {
158
158
  type: "category",
159
- data: o,
159
+ data: Array.isArray(o) ? o : [],
160
160
  axisTick: { alignWithLabel: !0 }
161
161
  },
162
162
  yAxis: {
163
163
  type: "value",
164
164
  splitLine: { lineStyle: { color: "#eee" } }
165
165
  },
166
- series: s.map((e) => ({
166
+ series: Array.isArray(s) ? s.map((e) => ({
167
167
  name: e.name,
168
168
  type: "bar",
169
169
  data: e.data,
@@ -178,7 +178,7 @@ var o = e(({ title: e = "Bar Chart", labels: o, values: s, color: c = "#5470C6",
178
178
  ]
179
179
  },
180
180
  emphasis: { focus: "series" }
181
- })),
181
+ })) : [],
182
182
  animationDuration: 600
183
183
  }), [
184
184
  e,
@@ -229,7 +229,7 @@ var o = e(({ title: e = "Bar Chart", labels: o, values: s, color: c = "#5470C6",
229
229
  },
230
230
  xAxis: {
231
231
  type: "category",
232
- data: o,
232
+ data: Array.isArray(o) ? o : [],
233
233
  boundaryGap: !1,
234
234
  axisLine: { lineStyle: { color: "#aaa" } },
235
235
  axisLabel: { fontSize: 12 }