@atomsolution/sdk-merchant 1.4.1 → 1.4.2

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.
@@ -1,5 +1,5 @@
1
1
  export type { Permission, PermissionSubGroup, PermissionGroup, ApiPermission, ApiSubPermission, ApiRolePayload, RoleFormData, } from './types/role';
2
- export type { createRoleService, TRole, TCreateRolePayload, TUpdateRolePayload, RoleListResponse, } from './service/roleService';
2
+ export { createRoleService, type TRole, type TCreateRolePayload, type TUpdateRolePayload, type RoleListResponse, } from './service/roleService';
3
3
  export { PERMISSION_GROUPS, ROLE_FORM } from './constant/role';
4
4
  export { DASHBOARD_PERMISSIONS, REPORT_PERMISSIONS, PAYMENT_PERMISSIONS, EDC_PERMISSIONS, SALES_PERMISSIONS, EINVOICE_PERMISSIONS, BUSINESS_PERMISSIONS, FEEDBACK_PERMISSIONS, TRACKING_PERMISSIONS, SETTINGS_PERMISSIONS } from './constant/permission';
5
5
  export { findPermission, hasPermission, getAllSubPermissions } from './utils/permission';
@@ -18,10 +18,74 @@ var __spreadValues = (a, b) => {
18
18
  return a;
19
19
  };
20
20
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
+ var __async = (__this, __arguments, generator) => {
22
+ return new Promise((resolve, reject) => {
23
+ var fulfilled = (value) => {
24
+ try {
25
+ step(generator.next(value));
26
+ } catch (e) {
27
+ reject(e);
28
+ }
29
+ };
30
+ var rejected = (value) => {
31
+ try {
32
+ step(generator.throw(value));
33
+ } catch (e) {
34
+ reject(e);
35
+ }
36
+ };
37
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
38
+ step((generator = generator.apply(__this, __arguments)).next());
39
+ });
40
+ };
21
41
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
22
42
  const jsxRuntime = require("./jsx-runtime-DV8UmLi4.cjs");
23
43
  const React = require("react");
24
44
  const index_esm = require("./index.esm-B0J-MTn-.cjs");
45
+ const formatParams = (params) => {
46
+ const searchParams = new URLSearchParams();
47
+ Object.entries(params).forEach(([key, value]) => {
48
+ if (value !== void 0 && value !== null) {
49
+ searchParams.append(key, String(value));
50
+ }
51
+ });
52
+ return searchParams.toString();
53
+ };
54
+ const createRoleService = (axiosClientPortal) => {
55
+ return {
56
+ getAll: (params) => __async(exports, null, function* () {
57
+ var _a, _b, _c, _d;
58
+ const response = yield axiosClientPortal.get(
59
+ `/roles/?${formatParams(params)}`
60
+ );
61
+ const raw = response.data;
62
+ return {
63
+ data: (_a = raw == null ? void 0 : raw.data) != null ? _a : [],
64
+ errors: (_b = raw == null ? void 0 : raw.errors) != null ? _b : null,
65
+ error_code: (_c = raw == null ? void 0 : raw.error_code) != null ? _c : null,
66
+ msg: (_d = raw == null ? void 0 : raw.msg) != null ? _d : null
67
+ };
68
+ }),
69
+ getRoleById: (role_id) => __async(exports, null, function* () {
70
+ const response = yield axiosClientPortal.get(`/roles/${role_id}`);
71
+ return response.data;
72
+ }),
73
+ create: (data) => __async(exports, null, function* () {
74
+ const response = yield axiosClientPortal.post(`/roles/`, data);
75
+ return response.data;
76
+ }),
77
+ update: (role_id, data) => __async(exports, null, function* () {
78
+ const response = yield axiosClientPortal.put(`/roles/${role_id}`, data);
79
+ return response.data;
80
+ }),
81
+ delete: (roleId) => __async(exports, null, function* () {
82
+ const response = yield axiosClientPortal.delete(
83
+ `/roles/${roleId}`
84
+ );
85
+ return response.data;
86
+ })
87
+ };
88
+ };
25
89
  const DASHBOARD_PERMISSIONS = {
26
90
  OVERVIEW: "TONGQUAN_READ"
27
91
  };
@@ -990,6 +1054,7 @@ exports.RoleTestComponent = RoleTestComponent;
990
1054
  exports.SALES_PERMISSIONS = SALES_PERMISSIONS;
991
1055
  exports.SETTINGS_PERMISSIONS = SETTINGS_PERMISSIONS;
992
1056
  exports.TRACKING_PERMISSIONS = TRACKING_PERMISSIONS;
1057
+ exports.createRoleService = createRoleService;
993
1058
  exports.findPermission = findPermission;
994
1059
  exports.getAllSubPermissions = getAllSubPermissions;
995
1060
  exports.getDefaultActivePermissions = getDefaultActivePermissions;
@@ -1 +1 @@
1
- {"version":3,"file":"permission.cjs","sources":["../src/permission/constant/permission.ts","../src/permission/constant/role.ts","../src/permission/utils/permission.ts","../src/permission/utils/role.ts","../src/components/common/Icons.tsx","../src/permission/components/PermissionCheckboxGroup.tsx","../src/permission/components/RoleTestComponent.tsx"],"sourcesContent":["/**\n * Permission Constants\n * Định nghĩa tất cả các permission codes theo cấu trúc <MODULE>.<ACTION>\n * Khi cần thay đổi permission code, chỉ cần sửa ở file này\n */\n\n// ==================== DASHBOARD ====================\nexport const DASHBOARD_PERMISSIONS = {\n OVERVIEW: 'TONGQUAN_READ',\n}\n\n// ==================== BÁO CÁO GIAO DỊCH ====================\nexport const REPORT_PERMISSIONS = {\n // Báo cáo giao dịch thẻ\n CARD_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_THE_READ',\n CARD_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_THE_CREATE',\n CARD_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_THE_UPDATE',\n CARD_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_THE_DELETE',\n\n // Báo cáo giao dịch QR\n QR_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_QR_READ',\n QR_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_QR_CREATE',\n QR_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_QR_UPDATE',\n QR_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_QR_DELETE',\n\n // Báo cáo giao dịch tiền mặt\n CASH_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIENMAT_READ',\n\n // Báo cáo giao dịch E-wallet\n EWALLET_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_EWALLET_READ',\n\n // Báo cáo giao dịch trả góp\n INSTALLMENT_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TRAGOP_READ',\n\n // Báo cáo giao dịch E-commerce\n ECOM_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_ECOM_READ',\n\n // Báo cáo giao dịch tiết kiệm\n SAVING_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIETKIEM_READ',\n\n // Báo cáo giao dịch vay vốn\n LOAN_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_VAYVON_READ',\n\n // Xuất báo cáo\n EXPORT_QR_REPORT: 'XUAT_BAOCAO_GIAODICH_QR_CREATE',\n EXPORT_CARD_REPORT: 'XUAT_BAOCAO_GIAODICH_THE_CREATE',\n}\n\n// ==================== QUẢN LÝ THANH TOÁN ====================\nexport const PAYMENT_PERMISSIONS = {\n // Tài khoản thanh toán\n PAYMENT_ACCOUNT_READ: 'QUANLY_TAIKHOAN_THANHTOAN_READ',\n PAYMENT_ACCOUNT_CREATE: 'QUANLY_TAIKHOAN_THANHTOAN_CREATE',\n PAYMENT_ACCOUNT_UPDATE: 'QUANLY_TAIKHOAN_THANHTOAN_UPDATE',\n PAYMENT_ACCOUNT_DELETE: 'QUANLY_TAIKHOAN_THANHTOAN_DELETE',\n\n // Shop QR\n SHOP_QR_READ: 'QUANLY_SHOPQR_READ',\n SHOP_QR_CREATE: 'QUANLY_SHOPQR_CREATE',\n SHOP_QR_UPDATE: 'QUANLY_SHOPQR_UPDATE',\n SHOP_QR_DELETE: 'QUANLY_SHOPQR_DELETE',\n\n // Pay by Link\n PAY_BY_LINK_READ: 'PAY_BY_LINK_READ',\n PAY_BY_LINK_CREATE: 'PAY_BY_LINK_CREATE',\n PAY_BY_LINK_UPDATE: 'PAY_BY_LINK_UPDATE',\n PAY_BY_LINK_DELETE: 'PAY_BY_LINK_DELETE',\n\n //Quản lí QR thanh toán\n QUANLY_QR_THANHTOAN_READ: 'QUANLY_QR_THANHTOAN_READ',\n QUANLY_QR_THANHTOAN_CREATE: 'QUANLY_QR_THANHTOAN_CREATE',\n QUANLY_QR_THANHTOAN_UPDATE: 'QUANLY_QR_THANHTOAN_UPDATE',\n QUANLY_QR_THANHTOAN_DELETE: 'QUANLY_QR_THANHTOAN_DELETE',\n}\n\n// ==================== QUẢN LÝ MÁY POS/EDC ====================\nexport const EDC_PERMISSIONS = {\n POS_MACHINE_READ: 'QUANLY_MAY_THANHTOAN_THE_READ',\n POS_MACHINE_CREATE: 'QUANLY_MAY_THANHTOAN_THE_CREATE',\n POS_MACHINE_UPDATE: 'QUANLY_MAY_THANHTOAN_THE_UPDATE',\n POS_MACHINE_DELETE: 'QUANLY_MAY_THANHTOAN_THE_DELETE',\n}\n\n// ==================== QUẢN LÝ BÁN HÀNG ====================\nexport const SALES_PERMISSIONS = {\n // Khách hàng\n CUSTOMER_READ: 'QUANLY_KHACHHANG_READ',\n CUSTOMER_CREATE: 'QUANLY_KHACHHANG_CREATE',\n CUSTOMER_UPDATE: 'QUANLY_KHACHHANG_UPDATE',\n CUSTOMER_DELETE: 'QUANLY_KHACHHANG_DELETE',\n\n // Sản phẩm\n PRODUCT_READ: 'QUANLY_SP_READ',\n PRODUCT_CREATE: 'QUANLY_SP_CREATE',\n PRODUCT_UPDATE: 'QUANLY_SP_UPDATE',\n PRODUCT_DELETE: 'QUANLY_SP_DELETE',\n\n // Đơn hàng\n QUANLY_DONHANG_READ: 'QUANLY_DONHANG_READ',\n QUANLY_DONHANG_CREATE: 'QUANLY_DONHANG_CREATE',\n QUANLY_DONHANG_UPDATE: 'QUANLY_DONHANG_UPDATE',\n QUANLY_DONHANG_DELETE: 'QUANLY_DONHANG_DELETE',\n\n // Bàn (cho F&B)\n TABLE_READ: 'QUANLY_BAN_READ',\n TABLE_CREATE: 'QUANLY_BAN_CREATE',\n TABLE_UPDATE: 'QUANLY_BAN_UPDATE',\n TABLE_DELETE: 'QUANLY_BAN_DELETE',\n\n // Cài đặt bán hàng\n SALES_SETTINGS_READ: 'CAIDAT_BANHANG_READ',\n SALES_SETTINGS_UPDATE: 'CAIDAT_BANHANG_UPDATE',\n\n // Đăng ký bán hàng\n SALES_REGISTER_READ: 'DANGKY_BANHANG_READ',\n}\n\nexport const SETTINGS_PERMISSIONS = {\n THIETLAP_BANHANG_READ: 'THIETLAP_BANHANG_READ',\n THIETLAP_BANHANG_UPDATE: 'THIETLAP_BANHANG_UPDATE',\n THIETLAP_BANHANG_CREATE: 'THIETLAP_BANHANG_CREATE',\n}\n\n// ==================== HÓA ĐƠN ĐIỆN TỬ ====================\nexport const EINVOICE_PERMISSIONS = {\n // Hóa đơn điện tử\n EINVOICE_READ: 'HOA_DON_DIEN_TU_READ',\n EINVOICE_CREATE: 'HOA_DON_DIEN_TU_CREATE',\n EINVOICE_UPDATE: 'HOA_DON_DIEN_TU_UPDATE',\n EINVOICE_DELETE: 'HOA_DON_DIEN_TU_DELETE',\n EINVOICE_ONBOARD: 'HOA_DON_DIEN_TU_ONBOARD',\n EINVOICE_CONFIGURE: 'HOA_DON_DIEN_TU_CONFIG',\n}\n\n// ==================== QUẢN LÝ DOANH NGHIỆP ====================\nexport const BUSINESS_PERMISSIONS = {\n // Hồ sơ\n THONGTIN_READ: 'THONGTIN_READ',\n\n // Cửa hàng\n STORE_READ: 'QUANLY_CUAHANG_READ',\n STORE_CREATE: 'QUANLY_CUAHANG_CREATE',\n STORE_UPDATE: 'QUANLY_CUAHANG_UPDATE',\n STORE_DELETE: 'QUANLY_CUAHANG_DELETE',\n\n // Nhân viên\n STAFF_READ: 'QUANLY_NHANVIEN_READ',\n STAFF_CREATE: 'QUANLY_NHANVIEN_CREATE',\n STAFF_UPDATE: 'QUANLY_NHANVIEN_UPDATE',\n STAFF_DELETE: 'QUANLY_NHANVIEN_DELETE',\n STAFF_ACCOUNT: 'QUANLY_NHANVIEN_ACCOUNT',\n\n // Phân quyền nhân viên (Vai trò)\n ROLE_READ: 'QUANLY_VAITRO_READ',\n ROLE_CREATE: 'QUANLY_VAITRO_CREATE',\n ROLE_UPDATE: 'QUANLY_VAITRO_UPDATE',\n ROLE_DELETE: 'QUANLY_VAITRO_DELETE',\n}\n\n// ==================== PHẢN HỒI ====================\nexport const FEEDBACK_PERMISSIONS = {\n FEEDBACK_READ: 'PHAN_HOI_READ',\n FEEDBACK_CREATE: 'PHAN_HOI_CREATE',\n FEEDBACK_UPDATE: 'PHAN_HOI_UPDATE',\n FEEDBACK_DELETE: 'PHAN_HOI_DELETE',\n}\n\n// ==================== THEO DÕI ====================\nexport const TRACKING_PERMISSIONS = {\n TRACKING_READ: 'THEO_DOI_READ',\n}\n\n// ==================== TỔNG HỢP TẤT CẢ PERMISSIONS ====================\nexport const ALL_PERMISSIONS = {\n ...DASHBOARD_PERMISSIONS,\n ...REPORT_PERMISSIONS,\n ...PAYMENT_PERMISSIONS,\n ...EDC_PERMISSIONS,\n ...SALES_PERMISSIONS,\n ...EINVOICE_PERMISSIONS,\n ...BUSINESS_PERMISSIONS,\n ...FEEDBACK_PERMISSIONS,\n ...TRACKING_PERMISSIONS,\n}\n\n// ==================== PERMISSION GROUPS (Optional - để group permissions) ====================\nexport const PERMISSION_GROUPS = {\n DASHBOARD: DASHBOARD_PERMISSIONS,\n REPORTS: REPORT_PERMISSIONS,\n PAYMENTS: PAYMENT_PERMISSIONS,\n EDC: EDC_PERMISSIONS,\n SALES: SALES_PERMISSIONS,\n EINVOICE: EINVOICE_PERMISSIONS,\n BUSINESS: BUSINESS_PERMISSIONS,\n FEEDBACK: FEEDBACK_PERMISSIONS,\n TRACKING: TRACKING_PERMISSIONS,\n}\n","import { PermissionGroup } from '@/permission/types/role'\nimport {\n DASHBOARD_PERMISSIONS,\n REPORT_PERMISSIONS,\n PAYMENT_PERMISSIONS,\n EDC_PERMISSIONS,\n SALES_PERMISSIONS,\n EINVOICE_PERMISSIONS,\n BUSINESS_PERMISSIONS,\n FEEDBACK_PERMISSIONS,\n TRACKING_PERMISSIONS,\n SETTINGS_PERMISSIONS\n} from \"./permission\";\n\n\nexport const ROLE_FORM = {\n ROLE_NAME: 'role_name',\n PERMISSIONS: 'permissions',\n}\n\n// // Không dùng trong form nhưng có trong file gốc\n// export const PERMISSION_OPTIONS = [\n// { value: 'CREATE', label: 'Tạo mới' },\n// { value: 'READ', label: 'Xem' },\n// { value: 'UPDATE', label: 'Cập nhật' },\n// { value: 'DELETE', label: 'Xóa' },\n// ]\n\nexport const PERMISSION_GROUPS: PermissionGroup[] = [\n {\n code: 'TONGQUAN',\n label: 'Tổng quan',\n permissions: [\n {\n code: DASHBOARD_PERMISSIONS.OVERVIEW,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'bao_cao',\n label: 'Báo cáo',\n isNested: true,\n subGroups: [\n {\n code: 'BAOCAO_GIAODICH_THE',\n label: 'Giao dịch thẻ',\n permissions: [\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'BAOCAO_GIAODICH_QR',\n label: 'Giao dịch QR',\n permissions: [\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'shop_qr',\n label: 'ShopQR',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_TAIKHOAN_THANHTOAN',\n label: 'Tài khoản thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAYMENT_ACCOUNT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_SHOPQR',\n label: 'Quản lý ShopQR',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_QR_THANHTOAN',\n label: 'Quản lý QR thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'PAY_BY_LINK',\n label: 'Pay By Link',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAY_BY_LINK_CREATE,\n label: 'Tạo Payment Link',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_MAY_THANHTOAN_THE',\n label: 'Quản lý máy thanh toán thẻ',\n permissions: [\n {\n code: EDC_PERMISSIONS.POS_MACHINE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EDC_PERMISSIONS.POS_MACHINE_UPDATE,\n label: 'Tích hợp ShopQR',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Quản lý bán hàng',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_KHACHHANG',\n label: 'Danh sách khách hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.CUSTOMER_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_SP',\n label: 'Danh sách sản phẩm',\n permissions: [\n {\n code: SALES_PERMISSIONS.PRODUCT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_DONHANG',\n label: 'Danh sách đơn hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_CREATE,\n label: 'Tạo đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_UPDATE,\n label: 'Cập nhật đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Danh sách bàn',\n permissions: [\n {\n code: SALES_PERMISSIONS.TABLE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.TABLE_CREATE,\n label: 'Tạo bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_UPDATE,\n label: 'Chỉnh sửa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_DELETE,\n label: 'Xóa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'THIETLAP_BANHANG',\n label: 'Thiết lập',\n permissions: [\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_CREATE,\n label: 'Thêm máy in',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'thong_tin_ho_so',\n label: 'Thông tin hồ sơ',\n isNested: true,\n subGroups: [\n {\n code: 'THONGTIN',\n label: 'Hồ sơ',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.THONGTIN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_CUAHANG',\n label: 'Quản lý cửa hàng',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STORE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_NHANVIEN',\n label: 'Quản lý nhân viên',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STAFF_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_ACCOUNT,\n label: 'Cấp tài khoản/ Thu hồi',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'hoa_don_dien_tu',\n label: 'Hóa đơn điện tử',\n isNested: true,\n subGroups: [\n {\n code: 'HOA_DON_DIEN_TU',\n label: 'Danh sách hóa đơn điện tử',\n permissions: [\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_CREATE,\n label: 'Xuất hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_UPDATE,\n label: 'Ký hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n]\n","/**\n * Permission Helper Utilities\n * Xử lý permissions theo cấu trúc mảng với sub_permissions\n */\n\nimport { Permission } from \"@/permission/types/permission\";\n\nexport const findPermission = (permissions : Permission[], permissionCode: string) => {\n if (!permissionCode) return null;\n\n return permissions.find(item => item.code === permissionCode) || null;\n\n};\n\nexport const hasPermission = (permissions: Permission[], permissionCode: string) => {\n if (!permissionCode) return false; // Nếu không có permissionCode thì không cho phép\n\n const permission = findPermission(permissions, permissionCode);\n\n return !!permission?.active;\n};\n\nexport const getAllSubPermissions = (permissions: Permission[]) => {\n if (!Array.isArray(permissions)) {\n return [];\n }\n\n return permissions.flatMap(group => group.sub_permissions || []);\n};","import type { PermissionGroup, Permission } from '@/permission/types/role';\n\nexport const getDefaultActivePermissions = (\n groups: PermissionGroup[]\n): string[] => {\n const activeIds: string[] = [];\n\n const findActiveIds = (permissions: Permission[]) => {\n permissions.forEach((perm) => {\n if (perm.active) {\n activeIds.push(perm.code);\n }\n });\n };\n\n groups.forEach((group) => {\n if (group.permissions) {\n findActiveIds(group.permissions);\n }\n if (group.subGroups) {\n group.subGroups.forEach((sub) => {\n if (sub.permissions) {\n findActiveIds(sub.permissions);\n }\n });\n }\n });\n\n return activeIds;\n};","import React from 'react';\n\nexport const ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n);\n\nexport const ChevronUpIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n);","import type { Permission, PermissionSubGroup } from '@/permission/types/role';\nimport React, { useState } from 'react';\nimport { ChevronDownIcon, ChevronUpIcon } from '../../components/common/Icons';\n\ninterface PermissionCheckboxGroupProps {\n label: string;\n permissions?: Permission[];\n subGroups?: PermissionSubGroup[];\n isNested?: boolean;\n collapsible?: boolean;\n value: string[];\n disabled?: boolean;\n onChange: (value: string[]) => void;\n}\n\nexport const PermissionCheckboxGroup: React.FC<PermissionCheckboxGroupProps> = ({\n label,\n permissions = [],\n subGroups = [],\n isNested = false,\n collapsible = true,\n disabled = false,\n value = [],\n onChange,\n}) => {\n const [isExpanded, setIsExpanded] = useState(true);\n\n const getAllPermissionIds = () => {\n let ids = permissions.map((p) => p.code);\n if (isNested && subGroups.length > 0) {\n subGroups.forEach((subGroup) => {\n ids = [...ids, ...subGroup.permissions.map((p) => p.code)];\n });\n }\n return ids;\n };\n\n const handleParentChange = (checked: boolean) => {\n const allPermissionIds = getAllPermissionIds();\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...allPermissionIds])];\n } else {\n newValue = value.filter((v) => !allPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const handlePermissionChange = (\n permissionId: string,\n checked: boolean,\n permissionsList: Permission[]\n ) => {\n const clickedPermission = permissionsList.find((p) => p.code === permissionId);\n const primaryPermissions = permissionsList.filter((p) => p.is_primary === true);\n const nonPrimaryPermissions = permissionsList.filter((p) => p.is_primary !== true);\n\n const primaryIds = primaryPermissions.map((p) => p.code);\n const nonPrimaryIds = nonPrimaryPermissions.map((p) => p.code);\n\n let newValue = [...value];\n\n if (checked) {\n if (!clickedPermission?.is_primary) {\n const missingPrimaryIds = primaryIds.filter((code) => !newValue.includes(code));\n newValue = [...new Set([...newValue, ...missingPrimaryIds, permissionId])];\n } else {\n if (!newValue.includes(permissionId)) newValue.push(permissionId);\n }\n } else {\n if (clickedPermission?.is_primary) {\n newValue = newValue.filter((code) => code !== permissionId && !nonPrimaryIds.includes(code));\n } else {\n newValue = newValue.filter((code) => code !== permissionId);\n }\n }\n\n onChange(newValue);\n };\n\n const handleSubGroupChange = (subGroup: PermissionSubGroup, checked: boolean) => {\n const subGroupPermissionIds = subGroup.permissions.map((p) => p.code);\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...subGroupPermissionIds])];\n } else {\n newValue = value.filter((v) => !subGroupPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const isSubGroupChecked = (subGroup: PermissionSubGroup) => {\n if (subGroup.permissions.length === 0) return false;\n return subGroup.permissions.every((p) => value.includes(p.code));\n };\n\n const isSubGroupIndeterminate = (subGroup: PermissionSubGroup) => {\n const checked = isSubGroupChecked(subGroup);\n return !checked && subGroup.permissions.some((p) => value.includes(p.code));\n };\n\n const allPermissionIds = getAllPermissionIds();\n const isParentChecked =\n allPermissionIds.length > 0 && allPermissionIds.every((code) => value.includes(code));\n\n const isParentIndeterminate = !isParentChecked && allPermissionIds.some((code) => value.includes(code));\n\n const hasContent = permissions.length > 0 || (isNested && subGroups.length > 0);\n\n return (\n <div className=\"border border-gray-200 rounded-lg bg-white overflow-hidden\">\n {/* Parent Checkbox */}\n <div\n className={`flex items-center justify-between p-4 bg-gray-50 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer hover:bg-gray-100'}`}\n onClick={() => collapsible && hasContent && setIsExpanded(!isExpanded)}\n >\n <label\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'} flex-1`}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isParentChecked}\n ref={(input) => {\n if (input) {\n input.indeterminate = isParentIndeterminate;\n }\n }}\n onChange={(e) => !disabled && handleParentChange(e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-gray-900\">{label}</span>\n </label>\n\n {collapsible && hasContent && (\n <button\n type=\"button\"\n className=\"p-1 hover:bg-gray-200 rounded\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(!isExpanded);\n }}\n >\n {isExpanded ? (\n <ChevronUpIcon className=\"w-5 h-5 text-gray-500\" />\n ) : (\n <ChevronDownIcon className=\"w-5 h-5 text-gray-500\" />\n )}\n </button>\n )}\n </div>\n\n {isExpanded && hasContent && (\n <div className=\"p-4 pt-2\">\n {/* Flat layout (no nesting) */}\n {!isNested && permissions.length > 0 && (\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 pl-6 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n )}\n\n {/* Nested layout */}\n {isNested && subGroups.length > 0 && (\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4 pl-6\">\n {subGroups.map((subGroup) => (\n <div\n key={subGroup.code}\n className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\"\n >\n {/* Sub-group header */}\n <label className={`flex items-center gap-2 mb-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}>\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isSubGroupChecked(subGroup)}\n ref={(input) => {\n if (input) {\n input.indeterminate = isSubGroupIndeterminate(subGroup);\n }\n }}\n onChange={(e) => !disabled && handleSubGroupChange(subGroup, e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-sm text-gray-800\">{subGroup.label}</span>\n </label>\n\n {/* Sub-group permissions (level 3) */}\n <div className=\"space-y-2 pl-6\">\n {subGroup.permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, subGroup.permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useForm, useController } from 'react-hook-form';\nimport { PERMISSION_GROUPS } from '@/permission/constant/role';\nimport type { RoleFormData, PermissionGroup } from '@/permission/types/role';\nimport { getDefaultActivePermissions } from '@/permission/utils/role';\nimport { PermissionCheckboxGroup } from './PermissionCheckboxGroup';\n\ninterface RoleTestComponentProps {\n onSubmit?: (data: any) => void;\n}\n\nexport const RoleTestComponent: React.FC<RoleTestComponentProps> = ({\n onSubmit,\n}) => {\n const [permissionGroups] = useState<PermissionGroup[]>(PERMISSION_GROUPS);\n\n const {\n register,\n handleSubmit,\n control,\n formState: { errors },\n } = useForm<RoleFormData>({\n defaultValues: {\n role_name: '',\n permissions: getDefaultActivePermissions(permissionGroups),\n },\n });\n\n const {\n field: { value: permissionsValue, onChange: setPermissions },\n } = useController({\n name: 'permissions',\n control,\n });\n\n const handleFormSubmit = (data: RoleFormData) => {\n // data.permissions là một mảng ID, ví dụ: ['tong_quan.view', 'shop_qr.manage.create']\n const activePermissionIds = new Set(data.permissions || []);\n\n const apiPermissions = permissionGroups.flatMap((group) => {\n // Hàm helper nội bộ để tạo payload cho từng sub-permission\n const createSubPermissionPayload = (perm: any) => { // Dùng 'any' hoặc import type 'Permission'\n const isActive = activePermissionIds.has(perm.code);\n const isPrimary = perm.is_primary;\n\n const subPermissionPayload: any = {\n code: perm.code,\n active: isActive,\n is_primary: isPrimary,\n };\n\n if (isPrimary && perm.max !== undefined) {\n subPermissionPayload.max = perm.max;\n }\n return subPermissionPayload;\n };\n\n // TRƯỜNG HỢP 1: group.isNested === true (ví dụ: ShopQR)\n if (group.isNested) {\n if (!group.subGroups) return [];\n\n return group.subGroups.map((subGroup) => {\n const sub_permissions = subGroup.permissions\n ? subGroup.permissions.map(createSubPermissionPayload)\n : [];\n\n return {\n code: subGroup.code, // code = subGroup.code\n sub_permissions: sub_permissions,\n };\n });\n }\n // TRƯỜG HỢP 2: group.isNested === false (ví dụ: Tổng quan)\n else {\n const sub_permissions = group.permissions\n ? group.permissions.map(createSubPermissionPayload)\n : [];\n\n return [\n {\n code: group.code, // code = group.code\n sub_permissions: sub_permissions,\n },\n ];\n }\n });\n\n const finalApiPermissions = apiPermissions.filter(\n (p) => p.sub_permissions.length > 0\n );\n\n // Payload cuối cùng để gửi đi\n const apiPayload = {\n name: data.role_name,\n permissions: finalApiPermissions,\n };\n\n console.log('Form Data (Raw):', data);\n console.log('API Payload (Transformed):', apiPayload);\n\n if (onSubmit) {\n onSubmit(apiPayload);\n }\n };\n\n return (\n <div className=\"max-w-5xl mx-auto p-6 bg-gray-50 rounded-lg\">\n <form onSubmit={handleSubmit(handleFormSubmit)} className=\"space-y-6\">\n {/* Phần Tên Vai Trò */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Thông tin vai trò\n </h3>\n <div>\n <label\n htmlFor=\"role_name\"\n className=\"block text-sm font-medium text-gray-700 mb-2\"\n >\n Tên vai trò <span className=\"text-red-500\">*</span>\n </label>\n <input\n {...register('role_name', { required: 'Tên vai trò là bắt buộc' })}\n type=\"text\"\n // code=\"role_name\"\n placeholder=\"Nhập tên vai trò\"\n className=\"w-full md:w-1/2 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500\"\n />\n {errors.role_name && (\n <p className=\"mt-1 text-sm text-red-600\">\n {errors.role_name.message}\n </p>\n )}\n </div>\n </div>\n\n {/* Phần Cấu Hình Quyền */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Cấu hình quyền\n </h3>\n <div className=\"space-y-4\">\n {/* Dùng component đã import */}\n {permissionGroups.map((group) => (\n <PermissionCheckboxGroup\n key={group.code}\n label={group.label}\n permissions={group.permissions || []}\n subGroups={group.subGroups || []}\n isNested={group.isNested || false}\n disabled={true}\n collapsible={\n (group.permissions && group.permissions.length > 0) ||\n (group.subGroups && group.subGroups.length > 0)\n }\n value={permissionsValue || []} // Lấy value từ useController\n onChange={setPermissions} // Dùng hàm onChange từ useController\n />\n ))}\n </div>\n </div>\n\n {/* Nút Submit */}\n <div className=\"flex justify-end gap-4 pt-4\">\n <button\n type=\"button\"\n onClick={() => console.log('Go Back')}\n className=\"px-6 py-2 bg-white border border-gray-300 text-gray-700 font-medium rounded-md hover:bg-gray-50 focus:ring-2 focus:ring-gray-300 focus:ring-offset-2 transition-colors\"\n >\n Quay lại\n </button>\n <button\n type=\"submit\"\n className=\"px-6 py-2 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors\"\n >\n Tạo vai trò\n </button>\n </div>\n </form>\n </div>\n );\n};"],"names":["jsx","useState","allPermissionIds","jsxs","useForm","useController"],"mappings":"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"}
1
+ {"version":3,"file":"permission.cjs","sources":["../src/permission/service/roleService.ts","../src/permission/constant/permission.ts","../src/permission/constant/role.ts","../src/permission/utils/permission.ts","../src/permission/utils/role.ts","../src/components/common/Icons.tsx","../src/permission/components/PermissionCheckboxGroup.tsx","../src/permission/components/RoleTestComponent.tsx"],"sourcesContent":["import type { ApiRolePayload, RoleFormData } from \"@/permission/types/role\";\n// import type { AxiosInstance } from \"axios\";\n\nexport interface RoleListResponse {\n data: TRole[];\n errors: string | null;\n error_code: string | null;\n msg: string | null;\n}\n\n\nexport interface TRole {\n id: number;\n name: string;\n role?: {\n name: string;\n };\n description?: string;\n permissions?: any[];\n module_number: string;\n staff_number: string;\n created_at: string;\n updated_at: string;\n created_by: boolean;\n}\n\nexport interface TCreateRolePayload extends ApiRolePayload {}\n\nexport interface TUpdateRolePayload extends ApiRolePayload {\n id: number;\n}\n\nconst formatParams = (params: Record<string, any>): string => {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n return searchParams.toString();\n};\n\nexport const createRoleService = (axiosClientPortal: any) => {\n return {\n getAll: async (params: {\n page: number;\n page_size: number;\n }): Promise<RoleListResponse> => {\n const response = await axiosClientPortal.get(\n `/roles/?${formatParams(params)}`\n );\n\n const raw = response.data;\n return {\n data: raw?.data ?? [],\n errors: raw?.errors ?? null,\n error_code: raw?.error_code ?? null,\n msg: raw?.msg ?? null,\n };\n },\n\n getRoleById: async (role_id: number): Promise<TRole> => {\n const response = await axiosClientPortal.get(`/roles/${role_id}`);\n return response.data;\n },\n\n create: async (data: TCreateRolePayload): Promise<TRole> => {\n const response = await axiosClientPortal.post(`/roles/`, data);\n return response.data;\n },\n\n update: async (role_id: number, data: TUpdateRolePayload): Promise<TRole> => {\n const response = await axiosClientPortal.put(`/roles/${role_id}`, data);\n return response.data;\n },\n\n delete: async (\n roleId: number\n ): Promise<{ success: boolean; message?: string }> => {\n const response = await axiosClientPortal.delete(\n `/roles/${roleId}`\n );\n return response.data;\n },\n };\n};\n","/**\n * Permission Constants\n * Định nghĩa tất cả các permission codes theo cấu trúc <MODULE>.<ACTION>\n * Khi cần thay đổi permission code, chỉ cần sửa ở file này\n */\n\n// ==================== DASHBOARD ====================\nexport const DASHBOARD_PERMISSIONS = {\n OVERVIEW: 'TONGQUAN_READ',\n}\n\n// ==================== BÁO CÁO GIAO DỊCH ====================\nexport const REPORT_PERMISSIONS = {\n // Báo cáo giao dịch thẻ\n CARD_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_THE_READ',\n CARD_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_THE_CREATE',\n CARD_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_THE_UPDATE',\n CARD_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_THE_DELETE',\n\n // Báo cáo giao dịch QR\n QR_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_QR_READ',\n QR_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_QR_CREATE',\n QR_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_QR_UPDATE',\n QR_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_QR_DELETE',\n\n // Báo cáo giao dịch tiền mặt\n CASH_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIENMAT_READ',\n\n // Báo cáo giao dịch E-wallet\n EWALLET_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_EWALLET_READ',\n\n // Báo cáo giao dịch trả góp\n INSTALLMENT_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TRAGOP_READ',\n\n // Báo cáo giao dịch E-commerce\n ECOM_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_ECOM_READ',\n\n // Báo cáo giao dịch tiết kiệm\n SAVING_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIETKIEM_READ',\n\n // Báo cáo giao dịch vay vốn\n LOAN_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_VAYVON_READ',\n\n // Xuất báo cáo\n EXPORT_QR_REPORT: 'XUAT_BAOCAO_GIAODICH_QR_CREATE',\n EXPORT_CARD_REPORT: 'XUAT_BAOCAO_GIAODICH_THE_CREATE',\n}\n\n// ==================== QUẢN LÝ THANH TOÁN ====================\nexport const PAYMENT_PERMISSIONS = {\n // Tài khoản thanh toán\n PAYMENT_ACCOUNT_READ: 'QUANLY_TAIKHOAN_THANHTOAN_READ',\n PAYMENT_ACCOUNT_CREATE: 'QUANLY_TAIKHOAN_THANHTOAN_CREATE',\n PAYMENT_ACCOUNT_UPDATE: 'QUANLY_TAIKHOAN_THANHTOAN_UPDATE',\n PAYMENT_ACCOUNT_DELETE: 'QUANLY_TAIKHOAN_THANHTOAN_DELETE',\n\n // Shop QR\n SHOP_QR_READ: 'QUANLY_SHOPQR_READ',\n SHOP_QR_CREATE: 'QUANLY_SHOPQR_CREATE',\n SHOP_QR_UPDATE: 'QUANLY_SHOPQR_UPDATE',\n SHOP_QR_DELETE: 'QUANLY_SHOPQR_DELETE',\n\n // Pay by Link\n PAY_BY_LINK_READ: 'PAY_BY_LINK_READ',\n PAY_BY_LINK_CREATE: 'PAY_BY_LINK_CREATE',\n PAY_BY_LINK_UPDATE: 'PAY_BY_LINK_UPDATE',\n PAY_BY_LINK_DELETE: 'PAY_BY_LINK_DELETE',\n\n //Quản lí QR thanh toán\n QUANLY_QR_THANHTOAN_READ: 'QUANLY_QR_THANHTOAN_READ',\n QUANLY_QR_THANHTOAN_CREATE: 'QUANLY_QR_THANHTOAN_CREATE',\n QUANLY_QR_THANHTOAN_UPDATE: 'QUANLY_QR_THANHTOAN_UPDATE',\n QUANLY_QR_THANHTOAN_DELETE: 'QUANLY_QR_THANHTOAN_DELETE',\n}\n\n// ==================== QUẢN LÝ MÁY POS/EDC ====================\nexport const EDC_PERMISSIONS = {\n POS_MACHINE_READ: 'QUANLY_MAY_THANHTOAN_THE_READ',\n POS_MACHINE_CREATE: 'QUANLY_MAY_THANHTOAN_THE_CREATE',\n POS_MACHINE_UPDATE: 'QUANLY_MAY_THANHTOAN_THE_UPDATE',\n POS_MACHINE_DELETE: 'QUANLY_MAY_THANHTOAN_THE_DELETE',\n}\n\n// ==================== QUẢN LÝ BÁN HÀNG ====================\nexport const SALES_PERMISSIONS = {\n // Khách hàng\n CUSTOMER_READ: 'QUANLY_KHACHHANG_READ',\n CUSTOMER_CREATE: 'QUANLY_KHACHHANG_CREATE',\n CUSTOMER_UPDATE: 'QUANLY_KHACHHANG_UPDATE',\n CUSTOMER_DELETE: 'QUANLY_KHACHHANG_DELETE',\n\n // Sản phẩm\n PRODUCT_READ: 'QUANLY_SP_READ',\n PRODUCT_CREATE: 'QUANLY_SP_CREATE',\n PRODUCT_UPDATE: 'QUANLY_SP_UPDATE',\n PRODUCT_DELETE: 'QUANLY_SP_DELETE',\n\n // Đơn hàng\n QUANLY_DONHANG_READ: 'QUANLY_DONHANG_READ',\n QUANLY_DONHANG_CREATE: 'QUANLY_DONHANG_CREATE',\n QUANLY_DONHANG_UPDATE: 'QUANLY_DONHANG_UPDATE',\n QUANLY_DONHANG_DELETE: 'QUANLY_DONHANG_DELETE',\n\n // Bàn (cho F&B)\n TABLE_READ: 'QUANLY_BAN_READ',\n TABLE_CREATE: 'QUANLY_BAN_CREATE',\n TABLE_UPDATE: 'QUANLY_BAN_UPDATE',\n TABLE_DELETE: 'QUANLY_BAN_DELETE',\n\n // Cài đặt bán hàng\n SALES_SETTINGS_READ: 'CAIDAT_BANHANG_READ',\n SALES_SETTINGS_UPDATE: 'CAIDAT_BANHANG_UPDATE',\n\n // Đăng ký bán hàng\n SALES_REGISTER_READ: 'DANGKY_BANHANG_READ',\n}\n\nexport const SETTINGS_PERMISSIONS = {\n THIETLAP_BANHANG_READ: 'THIETLAP_BANHANG_READ',\n THIETLAP_BANHANG_UPDATE: 'THIETLAP_BANHANG_UPDATE',\n THIETLAP_BANHANG_CREATE: 'THIETLAP_BANHANG_CREATE',\n}\n\n// ==================== HÓA ĐƠN ĐIỆN TỬ ====================\nexport const EINVOICE_PERMISSIONS = {\n // Hóa đơn điện tử\n EINVOICE_READ: 'HOA_DON_DIEN_TU_READ',\n EINVOICE_CREATE: 'HOA_DON_DIEN_TU_CREATE',\n EINVOICE_UPDATE: 'HOA_DON_DIEN_TU_UPDATE',\n EINVOICE_DELETE: 'HOA_DON_DIEN_TU_DELETE',\n EINVOICE_ONBOARD: 'HOA_DON_DIEN_TU_ONBOARD',\n EINVOICE_CONFIGURE: 'HOA_DON_DIEN_TU_CONFIG',\n}\n\n// ==================== QUẢN LÝ DOANH NGHIỆP ====================\nexport const BUSINESS_PERMISSIONS = {\n // Hồ sơ\n THONGTIN_READ: 'THONGTIN_READ',\n\n // Cửa hàng\n STORE_READ: 'QUANLY_CUAHANG_READ',\n STORE_CREATE: 'QUANLY_CUAHANG_CREATE',\n STORE_UPDATE: 'QUANLY_CUAHANG_UPDATE',\n STORE_DELETE: 'QUANLY_CUAHANG_DELETE',\n\n // Nhân viên\n STAFF_READ: 'QUANLY_NHANVIEN_READ',\n STAFF_CREATE: 'QUANLY_NHANVIEN_CREATE',\n STAFF_UPDATE: 'QUANLY_NHANVIEN_UPDATE',\n STAFF_DELETE: 'QUANLY_NHANVIEN_DELETE',\n STAFF_ACCOUNT: 'QUANLY_NHANVIEN_ACCOUNT',\n\n // Phân quyền nhân viên (Vai trò)\n ROLE_READ: 'QUANLY_VAITRO_READ',\n ROLE_CREATE: 'QUANLY_VAITRO_CREATE',\n ROLE_UPDATE: 'QUANLY_VAITRO_UPDATE',\n ROLE_DELETE: 'QUANLY_VAITRO_DELETE',\n}\n\n// ==================== PHẢN HỒI ====================\nexport const FEEDBACK_PERMISSIONS = {\n FEEDBACK_READ: 'PHAN_HOI_READ',\n FEEDBACK_CREATE: 'PHAN_HOI_CREATE',\n FEEDBACK_UPDATE: 'PHAN_HOI_UPDATE',\n FEEDBACK_DELETE: 'PHAN_HOI_DELETE',\n}\n\n// ==================== THEO DÕI ====================\nexport const TRACKING_PERMISSIONS = {\n TRACKING_READ: 'THEO_DOI_READ',\n}\n\n// ==================== TỔNG HỢP TẤT CẢ PERMISSIONS ====================\nexport const ALL_PERMISSIONS = {\n ...DASHBOARD_PERMISSIONS,\n ...REPORT_PERMISSIONS,\n ...PAYMENT_PERMISSIONS,\n ...EDC_PERMISSIONS,\n ...SALES_PERMISSIONS,\n ...EINVOICE_PERMISSIONS,\n ...BUSINESS_PERMISSIONS,\n ...FEEDBACK_PERMISSIONS,\n ...TRACKING_PERMISSIONS,\n}\n\n// ==================== PERMISSION GROUPS (Optional - để group permissions) ====================\nexport const PERMISSION_GROUPS = {\n DASHBOARD: DASHBOARD_PERMISSIONS,\n REPORTS: REPORT_PERMISSIONS,\n PAYMENTS: PAYMENT_PERMISSIONS,\n EDC: EDC_PERMISSIONS,\n SALES: SALES_PERMISSIONS,\n EINVOICE: EINVOICE_PERMISSIONS,\n BUSINESS: BUSINESS_PERMISSIONS,\n FEEDBACK: FEEDBACK_PERMISSIONS,\n TRACKING: TRACKING_PERMISSIONS,\n}\n","import { PermissionGroup } from '@/permission/types/role'\nimport {\n DASHBOARD_PERMISSIONS,\n REPORT_PERMISSIONS,\n PAYMENT_PERMISSIONS,\n EDC_PERMISSIONS,\n SALES_PERMISSIONS,\n EINVOICE_PERMISSIONS,\n BUSINESS_PERMISSIONS,\n FEEDBACK_PERMISSIONS,\n TRACKING_PERMISSIONS,\n SETTINGS_PERMISSIONS\n} from \"./permission\";\n\n\nexport const ROLE_FORM = {\n ROLE_NAME: 'role_name',\n PERMISSIONS: 'permissions',\n}\n\n// // Không dùng trong form nhưng có trong file gốc\n// export const PERMISSION_OPTIONS = [\n// { value: 'CREATE', label: 'Tạo mới' },\n// { value: 'READ', label: 'Xem' },\n// { value: 'UPDATE', label: 'Cập nhật' },\n// { value: 'DELETE', label: 'Xóa' },\n// ]\n\nexport const PERMISSION_GROUPS: PermissionGroup[] = [\n {\n code: 'TONGQUAN',\n label: 'Tổng quan',\n permissions: [\n {\n code: DASHBOARD_PERMISSIONS.OVERVIEW,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'bao_cao',\n label: 'Báo cáo',\n isNested: true,\n subGroups: [\n {\n code: 'BAOCAO_GIAODICH_THE',\n label: 'Giao dịch thẻ',\n permissions: [\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'BAOCAO_GIAODICH_QR',\n label: 'Giao dịch QR',\n permissions: [\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'shop_qr',\n label: 'ShopQR',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_TAIKHOAN_THANHTOAN',\n label: 'Tài khoản thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAYMENT_ACCOUNT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_SHOPQR',\n label: 'Quản lý ShopQR',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_QR_THANHTOAN',\n label: 'Quản lý QR thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'PAY_BY_LINK',\n label: 'Pay By Link',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAY_BY_LINK_CREATE,\n label: 'Tạo Payment Link',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_MAY_THANHTOAN_THE',\n label: 'Quản lý máy thanh toán thẻ',\n permissions: [\n {\n code: EDC_PERMISSIONS.POS_MACHINE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EDC_PERMISSIONS.POS_MACHINE_UPDATE,\n label: 'Tích hợp ShopQR',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Quản lý bán hàng',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_KHACHHANG',\n label: 'Danh sách khách hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.CUSTOMER_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_SP',\n label: 'Danh sách sản phẩm',\n permissions: [\n {\n code: SALES_PERMISSIONS.PRODUCT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_DONHANG',\n label: 'Danh sách đơn hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_CREATE,\n label: 'Tạo đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_UPDATE,\n label: 'Cập nhật đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Danh sách bàn',\n permissions: [\n {\n code: SALES_PERMISSIONS.TABLE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.TABLE_CREATE,\n label: 'Tạo bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_UPDATE,\n label: 'Chỉnh sửa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_DELETE,\n label: 'Xóa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'THIETLAP_BANHANG',\n label: 'Thiết lập',\n permissions: [\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_CREATE,\n label: 'Thêm máy in',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'thong_tin_ho_so',\n label: 'Thông tin hồ sơ',\n isNested: true,\n subGroups: [\n {\n code: 'THONGTIN',\n label: 'Hồ sơ',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.THONGTIN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_CUAHANG',\n label: 'Quản lý cửa hàng',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STORE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_NHANVIEN',\n label: 'Quản lý nhân viên',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STAFF_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_ACCOUNT,\n label: 'Cấp tài khoản/ Thu hồi',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'hoa_don_dien_tu',\n label: 'Hóa đơn điện tử',\n isNested: true,\n subGroups: [\n {\n code: 'HOA_DON_DIEN_TU',\n label: 'Danh sách hóa đơn điện tử',\n permissions: [\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_CREATE,\n label: 'Xuất hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_UPDATE,\n label: 'Ký hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n]\n","/**\n * Permission Helper Utilities\n * Xử lý permissions theo cấu trúc mảng với sub_permissions\n */\n\nimport { Permission } from \"@/permission/types/permission\";\n\nexport const findPermission = (permissions : Permission[], permissionCode: string) => {\n if (!permissionCode) return null;\n\n return permissions.find(item => item.code === permissionCode) || null;\n\n};\n\nexport const hasPermission = (permissions: Permission[], permissionCode: string) => {\n if (!permissionCode) return false; // Nếu không có permissionCode thì không cho phép\n\n const permission = findPermission(permissions, permissionCode);\n\n return !!permission?.active;\n};\n\nexport const getAllSubPermissions = (permissions: Permission[]) => {\n if (!Array.isArray(permissions)) {\n return [];\n }\n\n return permissions.flatMap(group => group.sub_permissions || []);\n};","import type { PermissionGroup, Permission } from '@/permission/types/role';\n\nexport const getDefaultActivePermissions = (\n groups: PermissionGroup[]\n): string[] => {\n const activeIds: string[] = [];\n\n const findActiveIds = (permissions: Permission[]) => {\n permissions.forEach((perm) => {\n if (perm.active) {\n activeIds.push(perm.code);\n }\n });\n };\n\n groups.forEach((group) => {\n if (group.permissions) {\n findActiveIds(group.permissions);\n }\n if (group.subGroups) {\n group.subGroups.forEach((sub) => {\n if (sub.permissions) {\n findActiveIds(sub.permissions);\n }\n });\n }\n });\n\n return activeIds;\n};","import React from 'react';\n\nexport const ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n);\n\nexport const ChevronUpIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n);","import type { Permission, PermissionSubGroup } from '@/permission/types/role';\nimport React, { useState } from 'react';\nimport { ChevronDownIcon, ChevronUpIcon } from '../../components/common/Icons';\n\ninterface PermissionCheckboxGroupProps {\n label: string;\n permissions?: Permission[];\n subGroups?: PermissionSubGroup[];\n isNested?: boolean;\n collapsible?: boolean;\n value: string[];\n disabled?: boolean;\n onChange: (value: string[]) => void;\n}\n\nexport const PermissionCheckboxGroup: React.FC<PermissionCheckboxGroupProps> = ({\n label,\n permissions = [],\n subGroups = [],\n isNested = false,\n collapsible = true,\n disabled = false,\n value = [],\n onChange,\n}) => {\n const [isExpanded, setIsExpanded] = useState(true);\n\n const getAllPermissionIds = () => {\n let ids = permissions.map((p) => p.code);\n if (isNested && subGroups.length > 0) {\n subGroups.forEach((subGroup) => {\n ids = [...ids, ...subGroup.permissions.map((p) => p.code)];\n });\n }\n return ids;\n };\n\n const handleParentChange = (checked: boolean) => {\n const allPermissionIds = getAllPermissionIds();\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...allPermissionIds])];\n } else {\n newValue = value.filter((v) => !allPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const handlePermissionChange = (\n permissionId: string,\n checked: boolean,\n permissionsList: Permission[]\n ) => {\n const clickedPermission = permissionsList.find((p) => p.code === permissionId);\n const primaryPermissions = permissionsList.filter((p) => p.is_primary === true);\n const nonPrimaryPermissions = permissionsList.filter((p) => p.is_primary !== true);\n\n const primaryIds = primaryPermissions.map((p) => p.code);\n const nonPrimaryIds = nonPrimaryPermissions.map((p) => p.code);\n\n let newValue = [...value];\n\n if (checked) {\n if (!clickedPermission?.is_primary) {\n const missingPrimaryIds = primaryIds.filter((code) => !newValue.includes(code));\n newValue = [...new Set([...newValue, ...missingPrimaryIds, permissionId])];\n } else {\n if (!newValue.includes(permissionId)) newValue.push(permissionId);\n }\n } else {\n if (clickedPermission?.is_primary) {\n newValue = newValue.filter((code) => code !== permissionId && !nonPrimaryIds.includes(code));\n } else {\n newValue = newValue.filter((code) => code !== permissionId);\n }\n }\n\n onChange(newValue);\n };\n\n const handleSubGroupChange = (subGroup: PermissionSubGroup, checked: boolean) => {\n const subGroupPermissionIds = subGroup.permissions.map((p) => p.code);\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...subGroupPermissionIds])];\n } else {\n newValue = value.filter((v) => !subGroupPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const isSubGroupChecked = (subGroup: PermissionSubGroup) => {\n if (subGroup.permissions.length === 0) return false;\n return subGroup.permissions.every((p) => value.includes(p.code));\n };\n\n const isSubGroupIndeterminate = (subGroup: PermissionSubGroup) => {\n const checked = isSubGroupChecked(subGroup);\n return !checked && subGroup.permissions.some((p) => value.includes(p.code));\n };\n\n const allPermissionIds = getAllPermissionIds();\n const isParentChecked =\n allPermissionIds.length > 0 && allPermissionIds.every((code) => value.includes(code));\n\n const isParentIndeterminate = !isParentChecked && allPermissionIds.some((code) => value.includes(code));\n\n const hasContent = permissions.length > 0 || (isNested && subGroups.length > 0);\n\n return (\n <div className=\"border border-gray-200 rounded-lg bg-white overflow-hidden\">\n {/* Parent Checkbox */}\n <div\n className={`flex items-center justify-between p-4 bg-gray-50 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer hover:bg-gray-100'}`}\n onClick={() => collapsible && hasContent && setIsExpanded(!isExpanded)}\n >\n <label\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'} flex-1`}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isParentChecked}\n ref={(input) => {\n if (input) {\n input.indeterminate = isParentIndeterminate;\n }\n }}\n onChange={(e) => !disabled && handleParentChange(e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-gray-900\">{label}</span>\n </label>\n\n {collapsible && hasContent && (\n <button\n type=\"button\"\n className=\"p-1 hover:bg-gray-200 rounded\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(!isExpanded);\n }}\n >\n {isExpanded ? (\n <ChevronUpIcon className=\"w-5 h-5 text-gray-500\" />\n ) : (\n <ChevronDownIcon className=\"w-5 h-5 text-gray-500\" />\n )}\n </button>\n )}\n </div>\n\n {isExpanded && hasContent && (\n <div className=\"p-4 pt-2\">\n {/* Flat layout (no nesting) */}\n {!isNested && permissions.length > 0 && (\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 pl-6 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n )}\n\n {/* Nested layout */}\n {isNested && subGroups.length > 0 && (\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4 pl-6\">\n {subGroups.map((subGroup) => (\n <div\n key={subGroup.code}\n className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\"\n >\n {/* Sub-group header */}\n <label className={`flex items-center gap-2 mb-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}>\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isSubGroupChecked(subGroup)}\n ref={(input) => {\n if (input) {\n input.indeterminate = isSubGroupIndeterminate(subGroup);\n }\n }}\n onChange={(e) => !disabled && handleSubGroupChange(subGroup, e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-sm text-gray-800\">{subGroup.label}</span>\n </label>\n\n {/* Sub-group permissions (level 3) */}\n <div className=\"space-y-2 pl-6\">\n {subGroup.permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, subGroup.permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useForm, useController } from 'react-hook-form';\nimport { PERMISSION_GROUPS } from '@/permission/constant/role';\nimport type { RoleFormData, PermissionGroup } from '@/permission/types/role';\nimport { getDefaultActivePermissions } from '@/permission/utils/role';\nimport { PermissionCheckboxGroup } from './PermissionCheckboxGroup';\n\ninterface RoleTestComponentProps {\n onSubmit?: (data: any) => void;\n}\n\nexport const RoleTestComponent: React.FC<RoleTestComponentProps> = ({\n onSubmit,\n}) => {\n const [permissionGroups] = useState<PermissionGroup[]>(PERMISSION_GROUPS);\n\n const {\n register,\n handleSubmit,\n control,\n formState: { errors },\n } = useForm<RoleFormData>({\n defaultValues: {\n role_name: '',\n permissions: getDefaultActivePermissions(permissionGroups),\n },\n });\n\n const {\n field: { value: permissionsValue, onChange: setPermissions },\n } = useController({\n name: 'permissions',\n control,\n });\n\n const handleFormSubmit = (data: RoleFormData) => {\n // data.permissions là một mảng ID, ví dụ: ['tong_quan.view', 'shop_qr.manage.create']\n const activePermissionIds = new Set(data.permissions || []);\n\n const apiPermissions = permissionGroups.flatMap((group) => {\n // Hàm helper nội bộ để tạo payload cho từng sub-permission\n const createSubPermissionPayload = (perm: any) => { // Dùng 'any' hoặc import type 'Permission'\n const isActive = activePermissionIds.has(perm.code);\n const isPrimary = perm.is_primary;\n\n const subPermissionPayload: any = {\n code: perm.code,\n active: isActive,\n is_primary: isPrimary,\n };\n\n if (isPrimary && perm.max !== undefined) {\n subPermissionPayload.max = perm.max;\n }\n return subPermissionPayload;\n };\n\n // TRƯỜNG HỢP 1: group.isNested === true (ví dụ: ShopQR)\n if (group.isNested) {\n if (!group.subGroups) return [];\n\n return group.subGroups.map((subGroup) => {\n const sub_permissions = subGroup.permissions\n ? subGroup.permissions.map(createSubPermissionPayload)\n : [];\n\n return {\n code: subGroup.code, // code = subGroup.code\n sub_permissions: sub_permissions,\n };\n });\n }\n // TRƯỜG HỢP 2: group.isNested === false (ví dụ: Tổng quan)\n else {\n const sub_permissions = group.permissions\n ? group.permissions.map(createSubPermissionPayload)\n : [];\n\n return [\n {\n code: group.code, // code = group.code\n sub_permissions: sub_permissions,\n },\n ];\n }\n });\n\n const finalApiPermissions = apiPermissions.filter(\n (p) => p.sub_permissions.length > 0\n );\n\n // Payload cuối cùng để gửi đi\n const apiPayload = {\n name: data.role_name,\n permissions: finalApiPermissions,\n };\n\n console.log('Form Data (Raw):', data);\n console.log('API Payload (Transformed):', apiPayload);\n\n if (onSubmit) {\n onSubmit(apiPayload);\n }\n };\n\n return (\n <div className=\"max-w-5xl mx-auto p-6 bg-gray-50 rounded-lg\">\n <form onSubmit={handleSubmit(handleFormSubmit)} className=\"space-y-6\">\n {/* Phần Tên Vai Trò */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Thông tin vai trò\n </h3>\n <div>\n <label\n htmlFor=\"role_name\"\n className=\"block text-sm font-medium text-gray-700 mb-2\"\n >\n Tên vai trò <span className=\"text-red-500\">*</span>\n </label>\n <input\n {...register('role_name', { required: 'Tên vai trò là bắt buộc' })}\n type=\"text\"\n // code=\"role_name\"\n placeholder=\"Nhập tên vai trò\"\n className=\"w-full md:w-1/2 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500\"\n />\n {errors.role_name && (\n <p className=\"mt-1 text-sm text-red-600\">\n {errors.role_name.message}\n </p>\n )}\n </div>\n </div>\n\n {/* Phần Cấu Hình Quyền */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Cấu hình quyền\n </h3>\n <div className=\"space-y-4\">\n {/* Dùng component đã import */}\n {permissionGroups.map((group) => (\n <PermissionCheckboxGroup\n key={group.code}\n label={group.label}\n permissions={group.permissions || []}\n subGroups={group.subGroups || []}\n isNested={group.isNested || false}\n disabled={true}\n collapsible={\n (group.permissions && group.permissions.length > 0) ||\n (group.subGroups && group.subGroups.length > 0)\n }\n value={permissionsValue || []} // Lấy value từ useController\n onChange={setPermissions} // Dùng hàm onChange từ useController\n />\n ))}\n </div>\n </div>\n\n {/* Nút Submit */}\n <div className=\"flex justify-end gap-4 pt-4\">\n <button\n type=\"button\"\n onClick={() => console.log('Go Back')}\n className=\"px-6 py-2 bg-white border border-gray-300 text-gray-700 font-medium rounded-md hover:bg-gray-50 focus:ring-2 focus:ring-gray-300 focus:ring-offset-2 transition-colors\"\n >\n Quay lại\n </button>\n <button\n type=\"submit\"\n className=\"px-6 py-2 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors\"\n >\n Tạo vai trò\n </button>\n </div>\n </form>\n </div>\n );\n};"],"names":["jsx","useState","allPermissionIds","jsxs","useForm","useController"],"mappings":"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"}
@@ -17,9 +17,73 @@ var __spreadValues = (a, b) => {
17
17
  return a;
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __async = (__this, __arguments, generator) => {
21
+ return new Promise((resolve, reject) => {
22
+ var fulfilled = (value) => {
23
+ try {
24
+ step(generator.next(value));
25
+ } catch (e) {
26
+ reject(e);
27
+ }
28
+ };
29
+ var rejected = (value) => {
30
+ try {
31
+ step(generator.throw(value));
32
+ } catch (e) {
33
+ reject(e);
34
+ }
35
+ };
36
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
37
+ step((generator = generator.apply(__this, __arguments)).next());
38
+ });
39
+ };
20
40
  import { j as jsxRuntimeExports } from "./jsx-runtime-ClP9nxnW.js";
21
41
  import { useState } from "react";
22
42
  import { u as useForm, a as useController } from "./index.esm-DPmk5fdS.js";
43
+ const formatParams = (params) => {
44
+ const searchParams = new URLSearchParams();
45
+ Object.entries(params).forEach(([key, value]) => {
46
+ if (value !== void 0 && value !== null) {
47
+ searchParams.append(key, String(value));
48
+ }
49
+ });
50
+ return searchParams.toString();
51
+ };
52
+ const createRoleService = (axiosClientPortal) => {
53
+ return {
54
+ getAll: (params) => __async(void 0, null, function* () {
55
+ var _a, _b, _c, _d;
56
+ const response = yield axiosClientPortal.get(
57
+ `/roles/?${formatParams(params)}`
58
+ );
59
+ const raw = response.data;
60
+ return {
61
+ data: (_a = raw == null ? void 0 : raw.data) != null ? _a : [],
62
+ errors: (_b = raw == null ? void 0 : raw.errors) != null ? _b : null,
63
+ error_code: (_c = raw == null ? void 0 : raw.error_code) != null ? _c : null,
64
+ msg: (_d = raw == null ? void 0 : raw.msg) != null ? _d : null
65
+ };
66
+ }),
67
+ getRoleById: (role_id) => __async(void 0, null, function* () {
68
+ const response = yield axiosClientPortal.get(`/roles/${role_id}`);
69
+ return response.data;
70
+ }),
71
+ create: (data) => __async(void 0, null, function* () {
72
+ const response = yield axiosClientPortal.post(`/roles/`, data);
73
+ return response.data;
74
+ }),
75
+ update: (role_id, data) => __async(void 0, null, function* () {
76
+ const response = yield axiosClientPortal.put(`/roles/${role_id}`, data);
77
+ return response.data;
78
+ }),
79
+ delete: (roleId) => __async(void 0, null, function* () {
80
+ const response = yield axiosClientPortal.delete(
81
+ `/roles/${roleId}`
82
+ );
83
+ return response.data;
84
+ })
85
+ };
86
+ };
23
87
  const DASHBOARD_PERMISSIONS = {
24
88
  OVERVIEW: "TONGQUAN_READ"
25
89
  };
@@ -989,6 +1053,7 @@ export {
989
1053
  SALES_PERMISSIONS,
990
1054
  SETTINGS_PERMISSIONS,
991
1055
  TRACKING_PERMISSIONS,
1056
+ createRoleService,
992
1057
  findPermission,
993
1058
  getAllSubPermissions,
994
1059
  getDefaultActivePermissions,
@@ -1 +1 @@
1
- {"version":3,"file":"permission.esm.js","sources":["../src/permission/constant/permission.ts","../src/permission/constant/role.ts","../src/permission/utils/permission.ts","../src/permission/utils/role.ts","../src/components/common/Icons.tsx","../src/permission/components/PermissionCheckboxGroup.tsx","../src/permission/components/RoleTestComponent.tsx"],"sourcesContent":["/**\n * Permission Constants\n * Định nghĩa tất cả các permission codes theo cấu trúc <MODULE>.<ACTION>\n * Khi cần thay đổi permission code, chỉ cần sửa ở file này\n */\n\n// ==================== DASHBOARD ====================\nexport const DASHBOARD_PERMISSIONS = {\n OVERVIEW: 'TONGQUAN_READ',\n}\n\n// ==================== BÁO CÁO GIAO DỊCH ====================\nexport const REPORT_PERMISSIONS = {\n // Báo cáo giao dịch thẻ\n CARD_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_THE_READ',\n CARD_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_THE_CREATE',\n CARD_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_THE_UPDATE',\n CARD_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_THE_DELETE',\n\n // Báo cáo giao dịch QR\n QR_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_QR_READ',\n QR_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_QR_CREATE',\n QR_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_QR_UPDATE',\n QR_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_QR_DELETE',\n\n // Báo cáo giao dịch tiền mặt\n CASH_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIENMAT_READ',\n\n // Báo cáo giao dịch E-wallet\n EWALLET_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_EWALLET_READ',\n\n // Báo cáo giao dịch trả góp\n INSTALLMENT_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TRAGOP_READ',\n\n // Báo cáo giao dịch E-commerce\n ECOM_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_ECOM_READ',\n\n // Báo cáo giao dịch tiết kiệm\n SAVING_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIETKIEM_READ',\n\n // Báo cáo giao dịch vay vốn\n LOAN_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_VAYVON_READ',\n\n // Xuất báo cáo\n EXPORT_QR_REPORT: 'XUAT_BAOCAO_GIAODICH_QR_CREATE',\n EXPORT_CARD_REPORT: 'XUAT_BAOCAO_GIAODICH_THE_CREATE',\n}\n\n// ==================== QUẢN LÝ THANH TOÁN ====================\nexport const PAYMENT_PERMISSIONS = {\n // Tài khoản thanh toán\n PAYMENT_ACCOUNT_READ: 'QUANLY_TAIKHOAN_THANHTOAN_READ',\n PAYMENT_ACCOUNT_CREATE: 'QUANLY_TAIKHOAN_THANHTOAN_CREATE',\n PAYMENT_ACCOUNT_UPDATE: 'QUANLY_TAIKHOAN_THANHTOAN_UPDATE',\n PAYMENT_ACCOUNT_DELETE: 'QUANLY_TAIKHOAN_THANHTOAN_DELETE',\n\n // Shop QR\n SHOP_QR_READ: 'QUANLY_SHOPQR_READ',\n SHOP_QR_CREATE: 'QUANLY_SHOPQR_CREATE',\n SHOP_QR_UPDATE: 'QUANLY_SHOPQR_UPDATE',\n SHOP_QR_DELETE: 'QUANLY_SHOPQR_DELETE',\n\n // Pay by Link\n PAY_BY_LINK_READ: 'PAY_BY_LINK_READ',\n PAY_BY_LINK_CREATE: 'PAY_BY_LINK_CREATE',\n PAY_BY_LINK_UPDATE: 'PAY_BY_LINK_UPDATE',\n PAY_BY_LINK_DELETE: 'PAY_BY_LINK_DELETE',\n\n //Quản lí QR thanh toán\n QUANLY_QR_THANHTOAN_READ: 'QUANLY_QR_THANHTOAN_READ',\n QUANLY_QR_THANHTOAN_CREATE: 'QUANLY_QR_THANHTOAN_CREATE',\n QUANLY_QR_THANHTOAN_UPDATE: 'QUANLY_QR_THANHTOAN_UPDATE',\n QUANLY_QR_THANHTOAN_DELETE: 'QUANLY_QR_THANHTOAN_DELETE',\n}\n\n// ==================== QUẢN LÝ MÁY POS/EDC ====================\nexport const EDC_PERMISSIONS = {\n POS_MACHINE_READ: 'QUANLY_MAY_THANHTOAN_THE_READ',\n POS_MACHINE_CREATE: 'QUANLY_MAY_THANHTOAN_THE_CREATE',\n POS_MACHINE_UPDATE: 'QUANLY_MAY_THANHTOAN_THE_UPDATE',\n POS_MACHINE_DELETE: 'QUANLY_MAY_THANHTOAN_THE_DELETE',\n}\n\n// ==================== QUẢN LÝ BÁN HÀNG ====================\nexport const SALES_PERMISSIONS = {\n // Khách hàng\n CUSTOMER_READ: 'QUANLY_KHACHHANG_READ',\n CUSTOMER_CREATE: 'QUANLY_KHACHHANG_CREATE',\n CUSTOMER_UPDATE: 'QUANLY_KHACHHANG_UPDATE',\n CUSTOMER_DELETE: 'QUANLY_KHACHHANG_DELETE',\n\n // Sản phẩm\n PRODUCT_READ: 'QUANLY_SP_READ',\n PRODUCT_CREATE: 'QUANLY_SP_CREATE',\n PRODUCT_UPDATE: 'QUANLY_SP_UPDATE',\n PRODUCT_DELETE: 'QUANLY_SP_DELETE',\n\n // Đơn hàng\n QUANLY_DONHANG_READ: 'QUANLY_DONHANG_READ',\n QUANLY_DONHANG_CREATE: 'QUANLY_DONHANG_CREATE',\n QUANLY_DONHANG_UPDATE: 'QUANLY_DONHANG_UPDATE',\n QUANLY_DONHANG_DELETE: 'QUANLY_DONHANG_DELETE',\n\n // Bàn (cho F&B)\n TABLE_READ: 'QUANLY_BAN_READ',\n TABLE_CREATE: 'QUANLY_BAN_CREATE',\n TABLE_UPDATE: 'QUANLY_BAN_UPDATE',\n TABLE_DELETE: 'QUANLY_BAN_DELETE',\n\n // Cài đặt bán hàng\n SALES_SETTINGS_READ: 'CAIDAT_BANHANG_READ',\n SALES_SETTINGS_UPDATE: 'CAIDAT_BANHANG_UPDATE',\n\n // Đăng ký bán hàng\n SALES_REGISTER_READ: 'DANGKY_BANHANG_READ',\n}\n\nexport const SETTINGS_PERMISSIONS = {\n THIETLAP_BANHANG_READ: 'THIETLAP_BANHANG_READ',\n THIETLAP_BANHANG_UPDATE: 'THIETLAP_BANHANG_UPDATE',\n THIETLAP_BANHANG_CREATE: 'THIETLAP_BANHANG_CREATE',\n}\n\n// ==================== HÓA ĐƠN ĐIỆN TỬ ====================\nexport const EINVOICE_PERMISSIONS = {\n // Hóa đơn điện tử\n EINVOICE_READ: 'HOA_DON_DIEN_TU_READ',\n EINVOICE_CREATE: 'HOA_DON_DIEN_TU_CREATE',\n EINVOICE_UPDATE: 'HOA_DON_DIEN_TU_UPDATE',\n EINVOICE_DELETE: 'HOA_DON_DIEN_TU_DELETE',\n EINVOICE_ONBOARD: 'HOA_DON_DIEN_TU_ONBOARD',\n EINVOICE_CONFIGURE: 'HOA_DON_DIEN_TU_CONFIG',\n}\n\n// ==================== QUẢN LÝ DOANH NGHIỆP ====================\nexport const BUSINESS_PERMISSIONS = {\n // Hồ sơ\n THONGTIN_READ: 'THONGTIN_READ',\n\n // Cửa hàng\n STORE_READ: 'QUANLY_CUAHANG_READ',\n STORE_CREATE: 'QUANLY_CUAHANG_CREATE',\n STORE_UPDATE: 'QUANLY_CUAHANG_UPDATE',\n STORE_DELETE: 'QUANLY_CUAHANG_DELETE',\n\n // Nhân viên\n STAFF_READ: 'QUANLY_NHANVIEN_READ',\n STAFF_CREATE: 'QUANLY_NHANVIEN_CREATE',\n STAFF_UPDATE: 'QUANLY_NHANVIEN_UPDATE',\n STAFF_DELETE: 'QUANLY_NHANVIEN_DELETE',\n STAFF_ACCOUNT: 'QUANLY_NHANVIEN_ACCOUNT',\n\n // Phân quyền nhân viên (Vai trò)\n ROLE_READ: 'QUANLY_VAITRO_READ',\n ROLE_CREATE: 'QUANLY_VAITRO_CREATE',\n ROLE_UPDATE: 'QUANLY_VAITRO_UPDATE',\n ROLE_DELETE: 'QUANLY_VAITRO_DELETE',\n}\n\n// ==================== PHẢN HỒI ====================\nexport const FEEDBACK_PERMISSIONS = {\n FEEDBACK_READ: 'PHAN_HOI_READ',\n FEEDBACK_CREATE: 'PHAN_HOI_CREATE',\n FEEDBACK_UPDATE: 'PHAN_HOI_UPDATE',\n FEEDBACK_DELETE: 'PHAN_HOI_DELETE',\n}\n\n// ==================== THEO DÕI ====================\nexport const TRACKING_PERMISSIONS = {\n TRACKING_READ: 'THEO_DOI_READ',\n}\n\n// ==================== TỔNG HỢP TẤT CẢ PERMISSIONS ====================\nexport const ALL_PERMISSIONS = {\n ...DASHBOARD_PERMISSIONS,\n ...REPORT_PERMISSIONS,\n ...PAYMENT_PERMISSIONS,\n ...EDC_PERMISSIONS,\n ...SALES_PERMISSIONS,\n ...EINVOICE_PERMISSIONS,\n ...BUSINESS_PERMISSIONS,\n ...FEEDBACK_PERMISSIONS,\n ...TRACKING_PERMISSIONS,\n}\n\n// ==================== PERMISSION GROUPS (Optional - để group permissions) ====================\nexport const PERMISSION_GROUPS = {\n DASHBOARD: DASHBOARD_PERMISSIONS,\n REPORTS: REPORT_PERMISSIONS,\n PAYMENTS: PAYMENT_PERMISSIONS,\n EDC: EDC_PERMISSIONS,\n SALES: SALES_PERMISSIONS,\n EINVOICE: EINVOICE_PERMISSIONS,\n BUSINESS: BUSINESS_PERMISSIONS,\n FEEDBACK: FEEDBACK_PERMISSIONS,\n TRACKING: TRACKING_PERMISSIONS,\n}\n","import { PermissionGroup } from '@/permission/types/role'\nimport {\n DASHBOARD_PERMISSIONS,\n REPORT_PERMISSIONS,\n PAYMENT_PERMISSIONS,\n EDC_PERMISSIONS,\n SALES_PERMISSIONS,\n EINVOICE_PERMISSIONS,\n BUSINESS_PERMISSIONS,\n FEEDBACK_PERMISSIONS,\n TRACKING_PERMISSIONS,\n SETTINGS_PERMISSIONS\n} from \"./permission\";\n\n\nexport const ROLE_FORM = {\n ROLE_NAME: 'role_name',\n PERMISSIONS: 'permissions',\n}\n\n// // Không dùng trong form nhưng có trong file gốc\n// export const PERMISSION_OPTIONS = [\n// { value: 'CREATE', label: 'Tạo mới' },\n// { value: 'READ', label: 'Xem' },\n// { value: 'UPDATE', label: 'Cập nhật' },\n// { value: 'DELETE', label: 'Xóa' },\n// ]\n\nexport const PERMISSION_GROUPS: PermissionGroup[] = [\n {\n code: 'TONGQUAN',\n label: 'Tổng quan',\n permissions: [\n {\n code: DASHBOARD_PERMISSIONS.OVERVIEW,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'bao_cao',\n label: 'Báo cáo',\n isNested: true,\n subGroups: [\n {\n code: 'BAOCAO_GIAODICH_THE',\n label: 'Giao dịch thẻ',\n permissions: [\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'BAOCAO_GIAODICH_QR',\n label: 'Giao dịch QR',\n permissions: [\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'shop_qr',\n label: 'ShopQR',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_TAIKHOAN_THANHTOAN',\n label: 'Tài khoản thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAYMENT_ACCOUNT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_SHOPQR',\n label: 'Quản lý ShopQR',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_QR_THANHTOAN',\n label: 'Quản lý QR thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'PAY_BY_LINK',\n label: 'Pay By Link',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAY_BY_LINK_CREATE,\n label: 'Tạo Payment Link',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_MAY_THANHTOAN_THE',\n label: 'Quản lý máy thanh toán thẻ',\n permissions: [\n {\n code: EDC_PERMISSIONS.POS_MACHINE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EDC_PERMISSIONS.POS_MACHINE_UPDATE,\n label: 'Tích hợp ShopQR',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Quản lý bán hàng',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_KHACHHANG',\n label: 'Danh sách khách hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.CUSTOMER_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_SP',\n label: 'Danh sách sản phẩm',\n permissions: [\n {\n code: SALES_PERMISSIONS.PRODUCT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_DONHANG',\n label: 'Danh sách đơn hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_CREATE,\n label: 'Tạo đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_UPDATE,\n label: 'Cập nhật đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Danh sách bàn',\n permissions: [\n {\n code: SALES_PERMISSIONS.TABLE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.TABLE_CREATE,\n label: 'Tạo bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_UPDATE,\n label: 'Chỉnh sửa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_DELETE,\n label: 'Xóa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'THIETLAP_BANHANG',\n label: 'Thiết lập',\n permissions: [\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_CREATE,\n label: 'Thêm máy in',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'thong_tin_ho_so',\n label: 'Thông tin hồ sơ',\n isNested: true,\n subGroups: [\n {\n code: 'THONGTIN',\n label: 'Hồ sơ',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.THONGTIN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_CUAHANG',\n label: 'Quản lý cửa hàng',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STORE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_NHANVIEN',\n label: 'Quản lý nhân viên',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STAFF_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_ACCOUNT,\n label: 'Cấp tài khoản/ Thu hồi',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'hoa_don_dien_tu',\n label: 'Hóa đơn điện tử',\n isNested: true,\n subGroups: [\n {\n code: 'HOA_DON_DIEN_TU',\n label: 'Danh sách hóa đơn điện tử',\n permissions: [\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_CREATE,\n label: 'Xuất hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_UPDATE,\n label: 'Ký hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n]\n","/**\n * Permission Helper Utilities\n * Xử lý permissions theo cấu trúc mảng với sub_permissions\n */\n\nimport { Permission } from \"@/permission/types/permission\";\n\nexport const findPermission = (permissions : Permission[], permissionCode: string) => {\n if (!permissionCode) return null;\n\n return permissions.find(item => item.code === permissionCode) || null;\n\n};\n\nexport const hasPermission = (permissions: Permission[], permissionCode: string) => {\n if (!permissionCode) return false; // Nếu không có permissionCode thì không cho phép\n\n const permission = findPermission(permissions, permissionCode);\n\n return !!permission?.active;\n};\n\nexport const getAllSubPermissions = (permissions: Permission[]) => {\n if (!Array.isArray(permissions)) {\n return [];\n }\n\n return permissions.flatMap(group => group.sub_permissions || []);\n};","import type { PermissionGroup, Permission } from '@/permission/types/role';\n\nexport const getDefaultActivePermissions = (\n groups: PermissionGroup[]\n): string[] => {\n const activeIds: string[] = [];\n\n const findActiveIds = (permissions: Permission[]) => {\n permissions.forEach((perm) => {\n if (perm.active) {\n activeIds.push(perm.code);\n }\n });\n };\n\n groups.forEach((group) => {\n if (group.permissions) {\n findActiveIds(group.permissions);\n }\n if (group.subGroups) {\n group.subGroups.forEach((sub) => {\n if (sub.permissions) {\n findActiveIds(sub.permissions);\n }\n });\n }\n });\n\n return activeIds;\n};","import React from 'react';\n\nexport const ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n);\n\nexport const ChevronUpIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n);","import type { Permission, PermissionSubGroup } from '@/permission/types/role';\nimport React, { useState } from 'react';\nimport { ChevronDownIcon, ChevronUpIcon } from '../../components/common/Icons';\n\ninterface PermissionCheckboxGroupProps {\n label: string;\n permissions?: Permission[];\n subGroups?: PermissionSubGroup[];\n isNested?: boolean;\n collapsible?: boolean;\n value: string[];\n disabled?: boolean;\n onChange: (value: string[]) => void;\n}\n\nexport const PermissionCheckboxGroup: React.FC<PermissionCheckboxGroupProps> = ({\n label,\n permissions = [],\n subGroups = [],\n isNested = false,\n collapsible = true,\n disabled = false,\n value = [],\n onChange,\n}) => {\n const [isExpanded, setIsExpanded] = useState(true);\n\n const getAllPermissionIds = () => {\n let ids = permissions.map((p) => p.code);\n if (isNested && subGroups.length > 0) {\n subGroups.forEach((subGroup) => {\n ids = [...ids, ...subGroup.permissions.map((p) => p.code)];\n });\n }\n return ids;\n };\n\n const handleParentChange = (checked: boolean) => {\n const allPermissionIds = getAllPermissionIds();\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...allPermissionIds])];\n } else {\n newValue = value.filter((v) => !allPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const handlePermissionChange = (\n permissionId: string,\n checked: boolean,\n permissionsList: Permission[]\n ) => {\n const clickedPermission = permissionsList.find((p) => p.code === permissionId);\n const primaryPermissions = permissionsList.filter((p) => p.is_primary === true);\n const nonPrimaryPermissions = permissionsList.filter((p) => p.is_primary !== true);\n\n const primaryIds = primaryPermissions.map((p) => p.code);\n const nonPrimaryIds = nonPrimaryPermissions.map((p) => p.code);\n\n let newValue = [...value];\n\n if (checked) {\n if (!clickedPermission?.is_primary) {\n const missingPrimaryIds = primaryIds.filter((code) => !newValue.includes(code));\n newValue = [...new Set([...newValue, ...missingPrimaryIds, permissionId])];\n } else {\n if (!newValue.includes(permissionId)) newValue.push(permissionId);\n }\n } else {\n if (clickedPermission?.is_primary) {\n newValue = newValue.filter((code) => code !== permissionId && !nonPrimaryIds.includes(code));\n } else {\n newValue = newValue.filter((code) => code !== permissionId);\n }\n }\n\n onChange(newValue);\n };\n\n const handleSubGroupChange = (subGroup: PermissionSubGroup, checked: boolean) => {\n const subGroupPermissionIds = subGroup.permissions.map((p) => p.code);\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...subGroupPermissionIds])];\n } else {\n newValue = value.filter((v) => !subGroupPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const isSubGroupChecked = (subGroup: PermissionSubGroup) => {\n if (subGroup.permissions.length === 0) return false;\n return subGroup.permissions.every((p) => value.includes(p.code));\n };\n\n const isSubGroupIndeterminate = (subGroup: PermissionSubGroup) => {\n const checked = isSubGroupChecked(subGroup);\n return !checked && subGroup.permissions.some((p) => value.includes(p.code));\n };\n\n const allPermissionIds = getAllPermissionIds();\n const isParentChecked =\n allPermissionIds.length > 0 && allPermissionIds.every((code) => value.includes(code));\n\n const isParentIndeterminate = !isParentChecked && allPermissionIds.some((code) => value.includes(code));\n\n const hasContent = permissions.length > 0 || (isNested && subGroups.length > 0);\n\n return (\n <div className=\"border border-gray-200 rounded-lg bg-white overflow-hidden\">\n {/* Parent Checkbox */}\n <div\n className={`flex items-center justify-between p-4 bg-gray-50 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer hover:bg-gray-100'}`}\n onClick={() => collapsible && hasContent && setIsExpanded(!isExpanded)}\n >\n <label\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'} flex-1`}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isParentChecked}\n ref={(input) => {\n if (input) {\n input.indeterminate = isParentIndeterminate;\n }\n }}\n onChange={(e) => !disabled && handleParentChange(e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-gray-900\">{label}</span>\n </label>\n\n {collapsible && hasContent && (\n <button\n type=\"button\"\n className=\"p-1 hover:bg-gray-200 rounded\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(!isExpanded);\n }}\n >\n {isExpanded ? (\n <ChevronUpIcon className=\"w-5 h-5 text-gray-500\" />\n ) : (\n <ChevronDownIcon className=\"w-5 h-5 text-gray-500\" />\n )}\n </button>\n )}\n </div>\n\n {isExpanded && hasContent && (\n <div className=\"p-4 pt-2\">\n {/* Flat layout (no nesting) */}\n {!isNested && permissions.length > 0 && (\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 pl-6 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n )}\n\n {/* Nested layout */}\n {isNested && subGroups.length > 0 && (\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4 pl-6\">\n {subGroups.map((subGroup) => (\n <div\n key={subGroup.code}\n className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\"\n >\n {/* Sub-group header */}\n <label className={`flex items-center gap-2 mb-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}>\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isSubGroupChecked(subGroup)}\n ref={(input) => {\n if (input) {\n input.indeterminate = isSubGroupIndeterminate(subGroup);\n }\n }}\n onChange={(e) => !disabled && handleSubGroupChange(subGroup, e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-sm text-gray-800\">{subGroup.label}</span>\n </label>\n\n {/* Sub-group permissions (level 3) */}\n <div className=\"space-y-2 pl-6\">\n {subGroup.permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, subGroup.permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useForm, useController } from 'react-hook-form';\nimport { PERMISSION_GROUPS } from '@/permission/constant/role';\nimport type { RoleFormData, PermissionGroup } from '@/permission/types/role';\nimport { getDefaultActivePermissions } from '@/permission/utils/role';\nimport { PermissionCheckboxGroup } from './PermissionCheckboxGroup';\n\ninterface RoleTestComponentProps {\n onSubmit?: (data: any) => void;\n}\n\nexport const RoleTestComponent: React.FC<RoleTestComponentProps> = ({\n onSubmit,\n}) => {\n const [permissionGroups] = useState<PermissionGroup[]>(PERMISSION_GROUPS);\n\n const {\n register,\n handleSubmit,\n control,\n formState: { errors },\n } = useForm<RoleFormData>({\n defaultValues: {\n role_name: '',\n permissions: getDefaultActivePermissions(permissionGroups),\n },\n });\n\n const {\n field: { value: permissionsValue, onChange: setPermissions },\n } = useController({\n name: 'permissions',\n control,\n });\n\n const handleFormSubmit = (data: RoleFormData) => {\n // data.permissions là một mảng ID, ví dụ: ['tong_quan.view', 'shop_qr.manage.create']\n const activePermissionIds = new Set(data.permissions || []);\n\n const apiPermissions = permissionGroups.flatMap((group) => {\n // Hàm helper nội bộ để tạo payload cho từng sub-permission\n const createSubPermissionPayload = (perm: any) => { // Dùng 'any' hoặc import type 'Permission'\n const isActive = activePermissionIds.has(perm.code);\n const isPrimary = perm.is_primary;\n\n const subPermissionPayload: any = {\n code: perm.code,\n active: isActive,\n is_primary: isPrimary,\n };\n\n if (isPrimary && perm.max !== undefined) {\n subPermissionPayload.max = perm.max;\n }\n return subPermissionPayload;\n };\n\n // TRƯỜNG HỢP 1: group.isNested === true (ví dụ: ShopQR)\n if (group.isNested) {\n if (!group.subGroups) return [];\n\n return group.subGroups.map((subGroup) => {\n const sub_permissions = subGroup.permissions\n ? subGroup.permissions.map(createSubPermissionPayload)\n : [];\n\n return {\n code: subGroup.code, // code = subGroup.code\n sub_permissions: sub_permissions,\n };\n });\n }\n // TRƯỜG HỢP 2: group.isNested === false (ví dụ: Tổng quan)\n else {\n const sub_permissions = group.permissions\n ? group.permissions.map(createSubPermissionPayload)\n : [];\n\n return [\n {\n code: group.code, // code = group.code\n sub_permissions: sub_permissions,\n },\n ];\n }\n });\n\n const finalApiPermissions = apiPermissions.filter(\n (p) => p.sub_permissions.length > 0\n );\n\n // Payload cuối cùng để gửi đi\n const apiPayload = {\n name: data.role_name,\n permissions: finalApiPermissions,\n };\n\n console.log('Form Data (Raw):', data);\n console.log('API Payload (Transformed):', apiPayload);\n\n if (onSubmit) {\n onSubmit(apiPayload);\n }\n };\n\n return (\n <div className=\"max-w-5xl mx-auto p-6 bg-gray-50 rounded-lg\">\n <form onSubmit={handleSubmit(handleFormSubmit)} className=\"space-y-6\">\n {/* Phần Tên Vai Trò */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Thông tin vai trò\n </h3>\n <div>\n <label\n htmlFor=\"role_name\"\n className=\"block text-sm font-medium text-gray-700 mb-2\"\n >\n Tên vai trò <span className=\"text-red-500\">*</span>\n </label>\n <input\n {...register('role_name', { required: 'Tên vai trò là bắt buộc' })}\n type=\"text\"\n // code=\"role_name\"\n placeholder=\"Nhập tên vai trò\"\n className=\"w-full md:w-1/2 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500\"\n />\n {errors.role_name && (\n <p className=\"mt-1 text-sm text-red-600\">\n {errors.role_name.message}\n </p>\n )}\n </div>\n </div>\n\n {/* Phần Cấu Hình Quyền */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Cấu hình quyền\n </h3>\n <div className=\"space-y-4\">\n {/* Dùng component đã import */}\n {permissionGroups.map((group) => (\n <PermissionCheckboxGroup\n key={group.code}\n label={group.label}\n permissions={group.permissions || []}\n subGroups={group.subGroups || []}\n isNested={group.isNested || false}\n disabled={true}\n collapsible={\n (group.permissions && group.permissions.length > 0) ||\n (group.subGroups && group.subGroups.length > 0)\n }\n value={permissionsValue || []} // Lấy value từ useController\n onChange={setPermissions} // Dùng hàm onChange từ useController\n />\n ))}\n </div>\n </div>\n\n {/* Nút Submit */}\n <div className=\"flex justify-end gap-4 pt-4\">\n <button\n type=\"button\"\n onClick={() => console.log('Go Back')}\n className=\"px-6 py-2 bg-white border border-gray-300 text-gray-700 font-medium rounded-md hover:bg-gray-50 focus:ring-2 focus:ring-gray-300 focus:ring-offset-2 transition-colors\"\n >\n Quay lại\n </button>\n <button\n type=\"submit\"\n className=\"px-6 py-2 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors\"\n >\n Tạo vai trò\n </button>\n </div>\n </form>\n </div>\n );\n};"],"names":["jsx","allPermissionIds","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"permission.esm.js","sources":["../src/permission/service/roleService.ts","../src/permission/constant/permission.ts","../src/permission/constant/role.ts","../src/permission/utils/permission.ts","../src/permission/utils/role.ts","../src/components/common/Icons.tsx","../src/permission/components/PermissionCheckboxGroup.tsx","../src/permission/components/RoleTestComponent.tsx"],"sourcesContent":["import type { ApiRolePayload, RoleFormData } from \"@/permission/types/role\";\n// import type { AxiosInstance } from \"axios\";\n\nexport interface RoleListResponse {\n data: TRole[];\n errors: string | null;\n error_code: string | null;\n msg: string | null;\n}\n\n\nexport interface TRole {\n id: number;\n name: string;\n role?: {\n name: string;\n };\n description?: string;\n permissions?: any[];\n module_number: string;\n staff_number: string;\n created_at: string;\n updated_at: string;\n created_by: boolean;\n}\n\nexport interface TCreateRolePayload extends ApiRolePayload {}\n\nexport interface TUpdateRolePayload extends ApiRolePayload {\n id: number;\n}\n\nconst formatParams = (params: Record<string, any>): string => {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n return searchParams.toString();\n};\n\nexport const createRoleService = (axiosClientPortal: any) => {\n return {\n getAll: async (params: {\n page: number;\n page_size: number;\n }): Promise<RoleListResponse> => {\n const response = await axiosClientPortal.get(\n `/roles/?${formatParams(params)}`\n );\n\n const raw = response.data;\n return {\n data: raw?.data ?? [],\n errors: raw?.errors ?? null,\n error_code: raw?.error_code ?? null,\n msg: raw?.msg ?? null,\n };\n },\n\n getRoleById: async (role_id: number): Promise<TRole> => {\n const response = await axiosClientPortal.get(`/roles/${role_id}`);\n return response.data;\n },\n\n create: async (data: TCreateRolePayload): Promise<TRole> => {\n const response = await axiosClientPortal.post(`/roles/`, data);\n return response.data;\n },\n\n update: async (role_id: number, data: TUpdateRolePayload): Promise<TRole> => {\n const response = await axiosClientPortal.put(`/roles/${role_id}`, data);\n return response.data;\n },\n\n delete: async (\n roleId: number\n ): Promise<{ success: boolean; message?: string }> => {\n const response = await axiosClientPortal.delete(\n `/roles/${roleId}`\n );\n return response.data;\n },\n };\n};\n","/**\n * Permission Constants\n * Định nghĩa tất cả các permission codes theo cấu trúc <MODULE>.<ACTION>\n * Khi cần thay đổi permission code, chỉ cần sửa ở file này\n */\n\n// ==================== DASHBOARD ====================\nexport const DASHBOARD_PERMISSIONS = {\n OVERVIEW: 'TONGQUAN_READ',\n}\n\n// ==================== BÁO CÁO GIAO DỊCH ====================\nexport const REPORT_PERMISSIONS = {\n // Báo cáo giao dịch thẻ\n CARD_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_THE_READ',\n CARD_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_THE_CREATE',\n CARD_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_THE_UPDATE',\n CARD_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_THE_DELETE',\n\n // Báo cáo giao dịch QR\n QR_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_QR_READ',\n QR_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_QR_CREATE',\n QR_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_QR_UPDATE',\n QR_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_QR_DELETE',\n\n // Báo cáo giao dịch tiền mặt\n CASH_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIENMAT_READ',\n\n // Báo cáo giao dịch E-wallet\n EWALLET_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_EWALLET_READ',\n\n // Báo cáo giao dịch trả góp\n INSTALLMENT_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TRAGOP_READ',\n\n // Báo cáo giao dịch E-commerce\n ECOM_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_ECOM_READ',\n\n // Báo cáo giao dịch tiết kiệm\n SAVING_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIETKIEM_READ',\n\n // Báo cáo giao dịch vay vốn\n LOAN_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_VAYVON_READ',\n\n // Xuất báo cáo\n EXPORT_QR_REPORT: 'XUAT_BAOCAO_GIAODICH_QR_CREATE',\n EXPORT_CARD_REPORT: 'XUAT_BAOCAO_GIAODICH_THE_CREATE',\n}\n\n// ==================== QUẢN LÝ THANH TOÁN ====================\nexport const PAYMENT_PERMISSIONS = {\n // Tài khoản thanh toán\n PAYMENT_ACCOUNT_READ: 'QUANLY_TAIKHOAN_THANHTOAN_READ',\n PAYMENT_ACCOUNT_CREATE: 'QUANLY_TAIKHOAN_THANHTOAN_CREATE',\n PAYMENT_ACCOUNT_UPDATE: 'QUANLY_TAIKHOAN_THANHTOAN_UPDATE',\n PAYMENT_ACCOUNT_DELETE: 'QUANLY_TAIKHOAN_THANHTOAN_DELETE',\n\n // Shop QR\n SHOP_QR_READ: 'QUANLY_SHOPQR_READ',\n SHOP_QR_CREATE: 'QUANLY_SHOPQR_CREATE',\n SHOP_QR_UPDATE: 'QUANLY_SHOPQR_UPDATE',\n SHOP_QR_DELETE: 'QUANLY_SHOPQR_DELETE',\n\n // Pay by Link\n PAY_BY_LINK_READ: 'PAY_BY_LINK_READ',\n PAY_BY_LINK_CREATE: 'PAY_BY_LINK_CREATE',\n PAY_BY_LINK_UPDATE: 'PAY_BY_LINK_UPDATE',\n PAY_BY_LINK_DELETE: 'PAY_BY_LINK_DELETE',\n\n //Quản lí QR thanh toán\n QUANLY_QR_THANHTOAN_READ: 'QUANLY_QR_THANHTOAN_READ',\n QUANLY_QR_THANHTOAN_CREATE: 'QUANLY_QR_THANHTOAN_CREATE',\n QUANLY_QR_THANHTOAN_UPDATE: 'QUANLY_QR_THANHTOAN_UPDATE',\n QUANLY_QR_THANHTOAN_DELETE: 'QUANLY_QR_THANHTOAN_DELETE',\n}\n\n// ==================== QUẢN LÝ MÁY POS/EDC ====================\nexport const EDC_PERMISSIONS = {\n POS_MACHINE_READ: 'QUANLY_MAY_THANHTOAN_THE_READ',\n POS_MACHINE_CREATE: 'QUANLY_MAY_THANHTOAN_THE_CREATE',\n POS_MACHINE_UPDATE: 'QUANLY_MAY_THANHTOAN_THE_UPDATE',\n POS_MACHINE_DELETE: 'QUANLY_MAY_THANHTOAN_THE_DELETE',\n}\n\n// ==================== QUẢN LÝ BÁN HÀNG ====================\nexport const SALES_PERMISSIONS = {\n // Khách hàng\n CUSTOMER_READ: 'QUANLY_KHACHHANG_READ',\n CUSTOMER_CREATE: 'QUANLY_KHACHHANG_CREATE',\n CUSTOMER_UPDATE: 'QUANLY_KHACHHANG_UPDATE',\n CUSTOMER_DELETE: 'QUANLY_KHACHHANG_DELETE',\n\n // Sản phẩm\n PRODUCT_READ: 'QUANLY_SP_READ',\n PRODUCT_CREATE: 'QUANLY_SP_CREATE',\n PRODUCT_UPDATE: 'QUANLY_SP_UPDATE',\n PRODUCT_DELETE: 'QUANLY_SP_DELETE',\n\n // Đơn hàng\n QUANLY_DONHANG_READ: 'QUANLY_DONHANG_READ',\n QUANLY_DONHANG_CREATE: 'QUANLY_DONHANG_CREATE',\n QUANLY_DONHANG_UPDATE: 'QUANLY_DONHANG_UPDATE',\n QUANLY_DONHANG_DELETE: 'QUANLY_DONHANG_DELETE',\n\n // Bàn (cho F&B)\n TABLE_READ: 'QUANLY_BAN_READ',\n TABLE_CREATE: 'QUANLY_BAN_CREATE',\n TABLE_UPDATE: 'QUANLY_BAN_UPDATE',\n TABLE_DELETE: 'QUANLY_BAN_DELETE',\n\n // Cài đặt bán hàng\n SALES_SETTINGS_READ: 'CAIDAT_BANHANG_READ',\n SALES_SETTINGS_UPDATE: 'CAIDAT_BANHANG_UPDATE',\n\n // Đăng ký bán hàng\n SALES_REGISTER_READ: 'DANGKY_BANHANG_READ',\n}\n\nexport const SETTINGS_PERMISSIONS = {\n THIETLAP_BANHANG_READ: 'THIETLAP_BANHANG_READ',\n THIETLAP_BANHANG_UPDATE: 'THIETLAP_BANHANG_UPDATE',\n THIETLAP_BANHANG_CREATE: 'THIETLAP_BANHANG_CREATE',\n}\n\n// ==================== HÓA ĐƠN ĐIỆN TỬ ====================\nexport const EINVOICE_PERMISSIONS = {\n // Hóa đơn điện tử\n EINVOICE_READ: 'HOA_DON_DIEN_TU_READ',\n EINVOICE_CREATE: 'HOA_DON_DIEN_TU_CREATE',\n EINVOICE_UPDATE: 'HOA_DON_DIEN_TU_UPDATE',\n EINVOICE_DELETE: 'HOA_DON_DIEN_TU_DELETE',\n EINVOICE_ONBOARD: 'HOA_DON_DIEN_TU_ONBOARD',\n EINVOICE_CONFIGURE: 'HOA_DON_DIEN_TU_CONFIG',\n}\n\n// ==================== QUẢN LÝ DOANH NGHIỆP ====================\nexport const BUSINESS_PERMISSIONS = {\n // Hồ sơ\n THONGTIN_READ: 'THONGTIN_READ',\n\n // Cửa hàng\n STORE_READ: 'QUANLY_CUAHANG_READ',\n STORE_CREATE: 'QUANLY_CUAHANG_CREATE',\n STORE_UPDATE: 'QUANLY_CUAHANG_UPDATE',\n STORE_DELETE: 'QUANLY_CUAHANG_DELETE',\n\n // Nhân viên\n STAFF_READ: 'QUANLY_NHANVIEN_READ',\n STAFF_CREATE: 'QUANLY_NHANVIEN_CREATE',\n STAFF_UPDATE: 'QUANLY_NHANVIEN_UPDATE',\n STAFF_DELETE: 'QUANLY_NHANVIEN_DELETE',\n STAFF_ACCOUNT: 'QUANLY_NHANVIEN_ACCOUNT',\n\n // Phân quyền nhân viên (Vai trò)\n ROLE_READ: 'QUANLY_VAITRO_READ',\n ROLE_CREATE: 'QUANLY_VAITRO_CREATE',\n ROLE_UPDATE: 'QUANLY_VAITRO_UPDATE',\n ROLE_DELETE: 'QUANLY_VAITRO_DELETE',\n}\n\n// ==================== PHẢN HỒI ====================\nexport const FEEDBACK_PERMISSIONS = {\n FEEDBACK_READ: 'PHAN_HOI_READ',\n FEEDBACK_CREATE: 'PHAN_HOI_CREATE',\n FEEDBACK_UPDATE: 'PHAN_HOI_UPDATE',\n FEEDBACK_DELETE: 'PHAN_HOI_DELETE',\n}\n\n// ==================== THEO DÕI ====================\nexport const TRACKING_PERMISSIONS = {\n TRACKING_READ: 'THEO_DOI_READ',\n}\n\n// ==================== TỔNG HỢP TẤT CẢ PERMISSIONS ====================\nexport const ALL_PERMISSIONS = {\n ...DASHBOARD_PERMISSIONS,\n ...REPORT_PERMISSIONS,\n ...PAYMENT_PERMISSIONS,\n ...EDC_PERMISSIONS,\n ...SALES_PERMISSIONS,\n ...EINVOICE_PERMISSIONS,\n ...BUSINESS_PERMISSIONS,\n ...FEEDBACK_PERMISSIONS,\n ...TRACKING_PERMISSIONS,\n}\n\n// ==================== PERMISSION GROUPS (Optional - để group permissions) ====================\nexport const PERMISSION_GROUPS = {\n DASHBOARD: DASHBOARD_PERMISSIONS,\n REPORTS: REPORT_PERMISSIONS,\n PAYMENTS: PAYMENT_PERMISSIONS,\n EDC: EDC_PERMISSIONS,\n SALES: SALES_PERMISSIONS,\n EINVOICE: EINVOICE_PERMISSIONS,\n BUSINESS: BUSINESS_PERMISSIONS,\n FEEDBACK: FEEDBACK_PERMISSIONS,\n TRACKING: TRACKING_PERMISSIONS,\n}\n","import { PermissionGroup } from '@/permission/types/role'\nimport {\n DASHBOARD_PERMISSIONS,\n REPORT_PERMISSIONS,\n PAYMENT_PERMISSIONS,\n EDC_PERMISSIONS,\n SALES_PERMISSIONS,\n EINVOICE_PERMISSIONS,\n BUSINESS_PERMISSIONS,\n FEEDBACK_PERMISSIONS,\n TRACKING_PERMISSIONS,\n SETTINGS_PERMISSIONS\n} from \"./permission\";\n\n\nexport const ROLE_FORM = {\n ROLE_NAME: 'role_name',\n PERMISSIONS: 'permissions',\n}\n\n// // Không dùng trong form nhưng có trong file gốc\n// export const PERMISSION_OPTIONS = [\n// { value: 'CREATE', label: 'Tạo mới' },\n// { value: 'READ', label: 'Xem' },\n// { value: 'UPDATE', label: 'Cập nhật' },\n// { value: 'DELETE', label: 'Xóa' },\n// ]\n\nexport const PERMISSION_GROUPS: PermissionGroup[] = [\n {\n code: 'TONGQUAN',\n label: 'Tổng quan',\n permissions: [\n {\n code: DASHBOARD_PERMISSIONS.OVERVIEW,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'bao_cao',\n label: 'Báo cáo',\n isNested: true,\n subGroups: [\n {\n code: 'BAOCAO_GIAODICH_THE',\n label: 'Giao dịch thẻ',\n permissions: [\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'BAOCAO_GIAODICH_QR',\n label: 'Giao dịch QR',\n permissions: [\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'shop_qr',\n label: 'ShopQR',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_TAIKHOAN_THANHTOAN',\n label: 'Tài khoản thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAYMENT_ACCOUNT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_SHOPQR',\n label: 'Quản lý ShopQR',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_QR_THANHTOAN',\n label: 'Quản lý QR thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'PAY_BY_LINK',\n label: 'Pay By Link',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAY_BY_LINK_CREATE,\n label: 'Tạo Payment Link',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_MAY_THANHTOAN_THE',\n label: 'Quản lý máy thanh toán thẻ',\n permissions: [\n {\n code: EDC_PERMISSIONS.POS_MACHINE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EDC_PERMISSIONS.POS_MACHINE_UPDATE,\n label: 'Tích hợp ShopQR',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Quản lý bán hàng',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_KHACHHANG',\n label: 'Danh sách khách hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.CUSTOMER_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_SP',\n label: 'Danh sách sản phẩm',\n permissions: [\n {\n code: SALES_PERMISSIONS.PRODUCT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_DONHANG',\n label: 'Danh sách đơn hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_CREATE,\n label: 'Tạo đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_UPDATE,\n label: 'Cập nhật đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Danh sách bàn',\n permissions: [\n {\n code: SALES_PERMISSIONS.TABLE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.TABLE_CREATE,\n label: 'Tạo bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_UPDATE,\n label: 'Chỉnh sửa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_DELETE,\n label: 'Xóa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'THIETLAP_BANHANG',\n label: 'Thiết lập',\n permissions: [\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_CREATE,\n label: 'Thêm máy in',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'thong_tin_ho_so',\n label: 'Thông tin hồ sơ',\n isNested: true,\n subGroups: [\n {\n code: 'THONGTIN',\n label: 'Hồ sơ',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.THONGTIN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_CUAHANG',\n label: 'Quản lý cửa hàng',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STORE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_NHANVIEN',\n label: 'Quản lý nhân viên',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STAFF_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_ACCOUNT,\n label: 'Cấp tài khoản/ Thu hồi',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'hoa_don_dien_tu',\n label: 'Hóa đơn điện tử',\n isNested: true,\n subGroups: [\n {\n code: 'HOA_DON_DIEN_TU',\n label: 'Danh sách hóa đơn điện tử',\n permissions: [\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_CREATE,\n label: 'Xuất hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_UPDATE,\n label: 'Ký hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n]\n","/**\n * Permission Helper Utilities\n * Xử lý permissions theo cấu trúc mảng với sub_permissions\n */\n\nimport { Permission } from \"@/permission/types/permission\";\n\nexport const findPermission = (permissions : Permission[], permissionCode: string) => {\n if (!permissionCode) return null;\n\n return permissions.find(item => item.code === permissionCode) || null;\n\n};\n\nexport const hasPermission = (permissions: Permission[], permissionCode: string) => {\n if (!permissionCode) return false; // Nếu không có permissionCode thì không cho phép\n\n const permission = findPermission(permissions, permissionCode);\n\n return !!permission?.active;\n};\n\nexport const getAllSubPermissions = (permissions: Permission[]) => {\n if (!Array.isArray(permissions)) {\n return [];\n }\n\n return permissions.flatMap(group => group.sub_permissions || []);\n};","import type { PermissionGroup, Permission } from '@/permission/types/role';\n\nexport const getDefaultActivePermissions = (\n groups: PermissionGroup[]\n): string[] => {\n const activeIds: string[] = [];\n\n const findActiveIds = (permissions: Permission[]) => {\n permissions.forEach((perm) => {\n if (perm.active) {\n activeIds.push(perm.code);\n }\n });\n };\n\n groups.forEach((group) => {\n if (group.permissions) {\n findActiveIds(group.permissions);\n }\n if (group.subGroups) {\n group.subGroups.forEach((sub) => {\n if (sub.permissions) {\n findActiveIds(sub.permissions);\n }\n });\n }\n });\n\n return activeIds;\n};","import React from 'react';\n\nexport const ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n);\n\nexport const ChevronUpIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n);","import type { Permission, PermissionSubGroup } from '@/permission/types/role';\nimport React, { useState } from 'react';\nimport { ChevronDownIcon, ChevronUpIcon } from '../../components/common/Icons';\n\ninterface PermissionCheckboxGroupProps {\n label: string;\n permissions?: Permission[];\n subGroups?: PermissionSubGroup[];\n isNested?: boolean;\n collapsible?: boolean;\n value: string[];\n disabled?: boolean;\n onChange: (value: string[]) => void;\n}\n\nexport const PermissionCheckboxGroup: React.FC<PermissionCheckboxGroupProps> = ({\n label,\n permissions = [],\n subGroups = [],\n isNested = false,\n collapsible = true,\n disabled = false,\n value = [],\n onChange,\n}) => {\n const [isExpanded, setIsExpanded] = useState(true);\n\n const getAllPermissionIds = () => {\n let ids = permissions.map((p) => p.code);\n if (isNested && subGroups.length > 0) {\n subGroups.forEach((subGroup) => {\n ids = [...ids, ...subGroup.permissions.map((p) => p.code)];\n });\n }\n return ids;\n };\n\n const handleParentChange = (checked: boolean) => {\n const allPermissionIds = getAllPermissionIds();\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...allPermissionIds])];\n } else {\n newValue = value.filter((v) => !allPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const handlePermissionChange = (\n permissionId: string,\n checked: boolean,\n permissionsList: Permission[]\n ) => {\n const clickedPermission = permissionsList.find((p) => p.code === permissionId);\n const primaryPermissions = permissionsList.filter((p) => p.is_primary === true);\n const nonPrimaryPermissions = permissionsList.filter((p) => p.is_primary !== true);\n\n const primaryIds = primaryPermissions.map((p) => p.code);\n const nonPrimaryIds = nonPrimaryPermissions.map((p) => p.code);\n\n let newValue = [...value];\n\n if (checked) {\n if (!clickedPermission?.is_primary) {\n const missingPrimaryIds = primaryIds.filter((code) => !newValue.includes(code));\n newValue = [...new Set([...newValue, ...missingPrimaryIds, permissionId])];\n } else {\n if (!newValue.includes(permissionId)) newValue.push(permissionId);\n }\n } else {\n if (clickedPermission?.is_primary) {\n newValue = newValue.filter((code) => code !== permissionId && !nonPrimaryIds.includes(code));\n } else {\n newValue = newValue.filter((code) => code !== permissionId);\n }\n }\n\n onChange(newValue);\n };\n\n const handleSubGroupChange = (subGroup: PermissionSubGroup, checked: boolean) => {\n const subGroupPermissionIds = subGroup.permissions.map((p) => p.code);\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...subGroupPermissionIds])];\n } else {\n newValue = value.filter((v) => !subGroupPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const isSubGroupChecked = (subGroup: PermissionSubGroup) => {\n if (subGroup.permissions.length === 0) return false;\n return subGroup.permissions.every((p) => value.includes(p.code));\n };\n\n const isSubGroupIndeterminate = (subGroup: PermissionSubGroup) => {\n const checked = isSubGroupChecked(subGroup);\n return !checked && subGroup.permissions.some((p) => value.includes(p.code));\n };\n\n const allPermissionIds = getAllPermissionIds();\n const isParentChecked =\n allPermissionIds.length > 0 && allPermissionIds.every((code) => value.includes(code));\n\n const isParentIndeterminate = !isParentChecked && allPermissionIds.some((code) => value.includes(code));\n\n const hasContent = permissions.length > 0 || (isNested && subGroups.length > 0);\n\n return (\n <div className=\"border border-gray-200 rounded-lg bg-white overflow-hidden\">\n {/* Parent Checkbox */}\n <div\n className={`flex items-center justify-between p-4 bg-gray-50 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer hover:bg-gray-100'}`}\n onClick={() => collapsible && hasContent && setIsExpanded(!isExpanded)}\n >\n <label\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'} flex-1`}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isParentChecked}\n ref={(input) => {\n if (input) {\n input.indeterminate = isParentIndeterminate;\n }\n }}\n onChange={(e) => !disabled && handleParentChange(e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-gray-900\">{label}</span>\n </label>\n\n {collapsible && hasContent && (\n <button\n type=\"button\"\n className=\"p-1 hover:bg-gray-200 rounded\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(!isExpanded);\n }}\n >\n {isExpanded ? (\n <ChevronUpIcon className=\"w-5 h-5 text-gray-500\" />\n ) : (\n <ChevronDownIcon className=\"w-5 h-5 text-gray-500\" />\n )}\n </button>\n )}\n </div>\n\n {isExpanded && hasContent && (\n <div className=\"p-4 pt-2\">\n {/* Flat layout (no nesting) */}\n {!isNested && permissions.length > 0 && (\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 pl-6 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n )}\n\n {/* Nested layout */}\n {isNested && subGroups.length > 0 && (\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4 pl-6\">\n {subGroups.map((subGroup) => (\n <div\n key={subGroup.code}\n className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\"\n >\n {/* Sub-group header */}\n <label className={`flex items-center gap-2 mb-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}>\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isSubGroupChecked(subGroup)}\n ref={(input) => {\n if (input) {\n input.indeterminate = isSubGroupIndeterminate(subGroup);\n }\n }}\n onChange={(e) => !disabled && handleSubGroupChange(subGroup, e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-sm text-gray-800\">{subGroup.label}</span>\n </label>\n\n {/* Sub-group permissions (level 3) */}\n <div className=\"space-y-2 pl-6\">\n {subGroup.permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, subGroup.permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useForm, useController } from 'react-hook-form';\nimport { PERMISSION_GROUPS } from '@/permission/constant/role';\nimport type { RoleFormData, PermissionGroup } from '@/permission/types/role';\nimport { getDefaultActivePermissions } from '@/permission/utils/role';\nimport { PermissionCheckboxGroup } from './PermissionCheckboxGroup';\n\ninterface RoleTestComponentProps {\n onSubmit?: (data: any) => void;\n}\n\nexport const RoleTestComponent: React.FC<RoleTestComponentProps> = ({\n onSubmit,\n}) => {\n const [permissionGroups] = useState<PermissionGroup[]>(PERMISSION_GROUPS);\n\n const {\n register,\n handleSubmit,\n control,\n formState: { errors },\n } = useForm<RoleFormData>({\n defaultValues: {\n role_name: '',\n permissions: getDefaultActivePermissions(permissionGroups),\n },\n });\n\n const {\n field: { value: permissionsValue, onChange: setPermissions },\n } = useController({\n name: 'permissions',\n control,\n });\n\n const handleFormSubmit = (data: RoleFormData) => {\n // data.permissions là một mảng ID, ví dụ: ['tong_quan.view', 'shop_qr.manage.create']\n const activePermissionIds = new Set(data.permissions || []);\n\n const apiPermissions = permissionGroups.flatMap((group) => {\n // Hàm helper nội bộ để tạo payload cho từng sub-permission\n const createSubPermissionPayload = (perm: any) => { // Dùng 'any' hoặc import type 'Permission'\n const isActive = activePermissionIds.has(perm.code);\n const isPrimary = perm.is_primary;\n\n const subPermissionPayload: any = {\n code: perm.code,\n active: isActive,\n is_primary: isPrimary,\n };\n\n if (isPrimary && perm.max !== undefined) {\n subPermissionPayload.max = perm.max;\n }\n return subPermissionPayload;\n };\n\n // TRƯỜNG HỢP 1: group.isNested === true (ví dụ: ShopQR)\n if (group.isNested) {\n if (!group.subGroups) return [];\n\n return group.subGroups.map((subGroup) => {\n const sub_permissions = subGroup.permissions\n ? subGroup.permissions.map(createSubPermissionPayload)\n : [];\n\n return {\n code: subGroup.code, // code = subGroup.code\n sub_permissions: sub_permissions,\n };\n });\n }\n // TRƯỜG HỢP 2: group.isNested === false (ví dụ: Tổng quan)\n else {\n const sub_permissions = group.permissions\n ? group.permissions.map(createSubPermissionPayload)\n : [];\n\n return [\n {\n code: group.code, // code = group.code\n sub_permissions: sub_permissions,\n },\n ];\n }\n });\n\n const finalApiPermissions = apiPermissions.filter(\n (p) => p.sub_permissions.length > 0\n );\n\n // Payload cuối cùng để gửi đi\n const apiPayload = {\n name: data.role_name,\n permissions: finalApiPermissions,\n };\n\n console.log('Form Data (Raw):', data);\n console.log('API Payload (Transformed):', apiPayload);\n\n if (onSubmit) {\n onSubmit(apiPayload);\n }\n };\n\n return (\n <div className=\"max-w-5xl mx-auto p-6 bg-gray-50 rounded-lg\">\n <form onSubmit={handleSubmit(handleFormSubmit)} className=\"space-y-6\">\n {/* Phần Tên Vai Trò */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Thông tin vai trò\n </h3>\n <div>\n <label\n htmlFor=\"role_name\"\n className=\"block text-sm font-medium text-gray-700 mb-2\"\n >\n Tên vai trò <span className=\"text-red-500\">*</span>\n </label>\n <input\n {...register('role_name', { required: 'Tên vai trò là bắt buộc' })}\n type=\"text\"\n // code=\"role_name\"\n placeholder=\"Nhập tên vai trò\"\n className=\"w-full md:w-1/2 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500\"\n />\n {errors.role_name && (\n <p className=\"mt-1 text-sm text-red-600\">\n {errors.role_name.message}\n </p>\n )}\n </div>\n </div>\n\n {/* Phần Cấu Hình Quyền */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Cấu hình quyền\n </h3>\n <div className=\"space-y-4\">\n {/* Dùng component đã import */}\n {permissionGroups.map((group) => (\n <PermissionCheckboxGroup\n key={group.code}\n label={group.label}\n permissions={group.permissions || []}\n subGroups={group.subGroups || []}\n isNested={group.isNested || false}\n disabled={true}\n collapsible={\n (group.permissions && group.permissions.length > 0) ||\n (group.subGroups && group.subGroups.length > 0)\n }\n value={permissionsValue || []} // Lấy value từ useController\n onChange={setPermissions} // Dùng hàm onChange từ useController\n />\n ))}\n </div>\n </div>\n\n {/* Nút Submit */}\n <div className=\"flex justify-end gap-4 pt-4\">\n <button\n type=\"button\"\n onClick={() => console.log('Go Back')}\n className=\"px-6 py-2 bg-white border border-gray-300 text-gray-700 font-medium rounded-md hover:bg-gray-50 focus:ring-2 focus:ring-gray-300 focus:ring-offset-2 transition-colors\"\n >\n Quay lại\n </button>\n <button\n type=\"submit\"\n className=\"px-6 py-2 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors\"\n >\n Tạo vai trò\n </button>\n </div>\n </form>\n </div>\n );\n};"],"names":["jsx","allPermissionIds","jsxs"],"mappings":"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"}
@@ -17,9 +17,73 @@ var __spreadValues = (a, b) => {
17
17
  return a;
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __async = (__this, __arguments, generator) => {
21
+ return new Promise((resolve, reject) => {
22
+ var fulfilled = (value) => {
23
+ try {
24
+ step(generator.next(value));
25
+ } catch (e) {
26
+ reject(e);
27
+ }
28
+ };
29
+ var rejected = (value) => {
30
+ try {
31
+ step(generator.throw(value));
32
+ } catch (e) {
33
+ reject(e);
34
+ }
35
+ };
36
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
37
+ step((generator = generator.apply(__this, __arguments)).next());
38
+ });
39
+ };
20
40
  import { j as jsxRuntimeExports } from "./jsx-runtime-ClP9nxnW.js";
21
41
  import { useState } from "react";
22
42
  import { u as useForm, a as useController } from "./index.esm-DPmk5fdS.js";
43
+ const formatParams = (params) => {
44
+ const searchParams = new URLSearchParams();
45
+ Object.entries(params).forEach(([key, value]) => {
46
+ if (value !== void 0 && value !== null) {
47
+ searchParams.append(key, String(value));
48
+ }
49
+ });
50
+ return searchParams.toString();
51
+ };
52
+ const createRoleService = (axiosClientPortal) => {
53
+ return {
54
+ getAll: (params) => __async(void 0, null, function* () {
55
+ var _a, _b, _c, _d;
56
+ const response = yield axiosClientPortal.get(
57
+ `/roles/?${formatParams(params)}`
58
+ );
59
+ const raw = response.data;
60
+ return {
61
+ data: (_a = raw == null ? void 0 : raw.data) != null ? _a : [],
62
+ errors: (_b = raw == null ? void 0 : raw.errors) != null ? _b : null,
63
+ error_code: (_c = raw == null ? void 0 : raw.error_code) != null ? _c : null,
64
+ msg: (_d = raw == null ? void 0 : raw.msg) != null ? _d : null
65
+ };
66
+ }),
67
+ getRoleById: (role_id) => __async(void 0, null, function* () {
68
+ const response = yield axiosClientPortal.get(`/roles/${role_id}`);
69
+ return response.data;
70
+ }),
71
+ create: (data) => __async(void 0, null, function* () {
72
+ const response = yield axiosClientPortal.post(`/roles/`, data);
73
+ return response.data;
74
+ }),
75
+ update: (role_id, data) => __async(void 0, null, function* () {
76
+ const response = yield axiosClientPortal.put(`/roles/${role_id}`, data);
77
+ return response.data;
78
+ }),
79
+ delete: (roleId) => __async(void 0, null, function* () {
80
+ const response = yield axiosClientPortal.delete(
81
+ `/roles/${roleId}`
82
+ );
83
+ return response.data;
84
+ })
85
+ };
86
+ };
23
87
  const DASHBOARD_PERMISSIONS = {
24
88
  OVERVIEW: "TONGQUAN_READ"
25
89
  };
@@ -989,6 +1053,7 @@ export {
989
1053
  SALES_PERMISSIONS,
990
1054
  SETTINGS_PERMISSIONS,
991
1055
  TRACKING_PERMISSIONS,
1056
+ createRoleService,
992
1057
  findPermission,
993
1058
  getAllSubPermissions,
994
1059
  getDefaultActivePermissions,
@@ -1 +1 @@
1
- {"version":3,"file":"permission.js","sources":["../src/permission/constant/permission.ts","../src/permission/constant/role.ts","../src/permission/utils/permission.ts","../src/permission/utils/role.ts","../src/components/common/Icons.tsx","../src/permission/components/PermissionCheckboxGroup.tsx","../src/permission/components/RoleTestComponent.tsx"],"sourcesContent":["/**\n * Permission Constants\n * Định nghĩa tất cả các permission codes theo cấu trúc <MODULE>.<ACTION>\n * Khi cần thay đổi permission code, chỉ cần sửa ở file này\n */\n\n// ==================== DASHBOARD ====================\nexport const DASHBOARD_PERMISSIONS = {\n OVERVIEW: 'TONGQUAN_READ',\n}\n\n// ==================== BÁO CÁO GIAO DỊCH ====================\nexport const REPORT_PERMISSIONS = {\n // Báo cáo giao dịch thẻ\n CARD_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_THE_READ',\n CARD_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_THE_CREATE',\n CARD_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_THE_UPDATE',\n CARD_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_THE_DELETE',\n\n // Báo cáo giao dịch QR\n QR_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_QR_READ',\n QR_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_QR_CREATE',\n QR_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_QR_UPDATE',\n QR_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_QR_DELETE',\n\n // Báo cáo giao dịch tiền mặt\n CASH_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIENMAT_READ',\n\n // Báo cáo giao dịch E-wallet\n EWALLET_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_EWALLET_READ',\n\n // Báo cáo giao dịch trả góp\n INSTALLMENT_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TRAGOP_READ',\n\n // Báo cáo giao dịch E-commerce\n ECOM_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_ECOM_READ',\n\n // Báo cáo giao dịch tiết kiệm\n SAVING_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIETKIEM_READ',\n\n // Báo cáo giao dịch vay vốn\n LOAN_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_VAYVON_READ',\n\n // Xuất báo cáo\n EXPORT_QR_REPORT: 'XUAT_BAOCAO_GIAODICH_QR_CREATE',\n EXPORT_CARD_REPORT: 'XUAT_BAOCAO_GIAODICH_THE_CREATE',\n}\n\n// ==================== QUẢN LÝ THANH TOÁN ====================\nexport const PAYMENT_PERMISSIONS = {\n // Tài khoản thanh toán\n PAYMENT_ACCOUNT_READ: 'QUANLY_TAIKHOAN_THANHTOAN_READ',\n PAYMENT_ACCOUNT_CREATE: 'QUANLY_TAIKHOAN_THANHTOAN_CREATE',\n PAYMENT_ACCOUNT_UPDATE: 'QUANLY_TAIKHOAN_THANHTOAN_UPDATE',\n PAYMENT_ACCOUNT_DELETE: 'QUANLY_TAIKHOAN_THANHTOAN_DELETE',\n\n // Shop QR\n SHOP_QR_READ: 'QUANLY_SHOPQR_READ',\n SHOP_QR_CREATE: 'QUANLY_SHOPQR_CREATE',\n SHOP_QR_UPDATE: 'QUANLY_SHOPQR_UPDATE',\n SHOP_QR_DELETE: 'QUANLY_SHOPQR_DELETE',\n\n // Pay by Link\n PAY_BY_LINK_READ: 'PAY_BY_LINK_READ',\n PAY_BY_LINK_CREATE: 'PAY_BY_LINK_CREATE',\n PAY_BY_LINK_UPDATE: 'PAY_BY_LINK_UPDATE',\n PAY_BY_LINK_DELETE: 'PAY_BY_LINK_DELETE',\n\n //Quản lí QR thanh toán\n QUANLY_QR_THANHTOAN_READ: 'QUANLY_QR_THANHTOAN_READ',\n QUANLY_QR_THANHTOAN_CREATE: 'QUANLY_QR_THANHTOAN_CREATE',\n QUANLY_QR_THANHTOAN_UPDATE: 'QUANLY_QR_THANHTOAN_UPDATE',\n QUANLY_QR_THANHTOAN_DELETE: 'QUANLY_QR_THANHTOAN_DELETE',\n}\n\n// ==================== QUẢN LÝ MÁY POS/EDC ====================\nexport const EDC_PERMISSIONS = {\n POS_MACHINE_READ: 'QUANLY_MAY_THANHTOAN_THE_READ',\n POS_MACHINE_CREATE: 'QUANLY_MAY_THANHTOAN_THE_CREATE',\n POS_MACHINE_UPDATE: 'QUANLY_MAY_THANHTOAN_THE_UPDATE',\n POS_MACHINE_DELETE: 'QUANLY_MAY_THANHTOAN_THE_DELETE',\n}\n\n// ==================== QUẢN LÝ BÁN HÀNG ====================\nexport const SALES_PERMISSIONS = {\n // Khách hàng\n CUSTOMER_READ: 'QUANLY_KHACHHANG_READ',\n CUSTOMER_CREATE: 'QUANLY_KHACHHANG_CREATE',\n CUSTOMER_UPDATE: 'QUANLY_KHACHHANG_UPDATE',\n CUSTOMER_DELETE: 'QUANLY_KHACHHANG_DELETE',\n\n // Sản phẩm\n PRODUCT_READ: 'QUANLY_SP_READ',\n PRODUCT_CREATE: 'QUANLY_SP_CREATE',\n PRODUCT_UPDATE: 'QUANLY_SP_UPDATE',\n PRODUCT_DELETE: 'QUANLY_SP_DELETE',\n\n // Đơn hàng\n QUANLY_DONHANG_READ: 'QUANLY_DONHANG_READ',\n QUANLY_DONHANG_CREATE: 'QUANLY_DONHANG_CREATE',\n QUANLY_DONHANG_UPDATE: 'QUANLY_DONHANG_UPDATE',\n QUANLY_DONHANG_DELETE: 'QUANLY_DONHANG_DELETE',\n\n // Bàn (cho F&B)\n TABLE_READ: 'QUANLY_BAN_READ',\n TABLE_CREATE: 'QUANLY_BAN_CREATE',\n TABLE_UPDATE: 'QUANLY_BAN_UPDATE',\n TABLE_DELETE: 'QUANLY_BAN_DELETE',\n\n // Cài đặt bán hàng\n SALES_SETTINGS_READ: 'CAIDAT_BANHANG_READ',\n SALES_SETTINGS_UPDATE: 'CAIDAT_BANHANG_UPDATE',\n\n // Đăng ký bán hàng\n SALES_REGISTER_READ: 'DANGKY_BANHANG_READ',\n}\n\nexport const SETTINGS_PERMISSIONS = {\n THIETLAP_BANHANG_READ: 'THIETLAP_BANHANG_READ',\n THIETLAP_BANHANG_UPDATE: 'THIETLAP_BANHANG_UPDATE',\n THIETLAP_BANHANG_CREATE: 'THIETLAP_BANHANG_CREATE',\n}\n\n// ==================== HÓA ĐƠN ĐIỆN TỬ ====================\nexport const EINVOICE_PERMISSIONS = {\n // Hóa đơn điện tử\n EINVOICE_READ: 'HOA_DON_DIEN_TU_READ',\n EINVOICE_CREATE: 'HOA_DON_DIEN_TU_CREATE',\n EINVOICE_UPDATE: 'HOA_DON_DIEN_TU_UPDATE',\n EINVOICE_DELETE: 'HOA_DON_DIEN_TU_DELETE',\n EINVOICE_ONBOARD: 'HOA_DON_DIEN_TU_ONBOARD',\n EINVOICE_CONFIGURE: 'HOA_DON_DIEN_TU_CONFIG',\n}\n\n// ==================== QUẢN LÝ DOANH NGHIỆP ====================\nexport const BUSINESS_PERMISSIONS = {\n // Hồ sơ\n THONGTIN_READ: 'THONGTIN_READ',\n\n // Cửa hàng\n STORE_READ: 'QUANLY_CUAHANG_READ',\n STORE_CREATE: 'QUANLY_CUAHANG_CREATE',\n STORE_UPDATE: 'QUANLY_CUAHANG_UPDATE',\n STORE_DELETE: 'QUANLY_CUAHANG_DELETE',\n\n // Nhân viên\n STAFF_READ: 'QUANLY_NHANVIEN_READ',\n STAFF_CREATE: 'QUANLY_NHANVIEN_CREATE',\n STAFF_UPDATE: 'QUANLY_NHANVIEN_UPDATE',\n STAFF_DELETE: 'QUANLY_NHANVIEN_DELETE',\n STAFF_ACCOUNT: 'QUANLY_NHANVIEN_ACCOUNT',\n\n // Phân quyền nhân viên (Vai trò)\n ROLE_READ: 'QUANLY_VAITRO_READ',\n ROLE_CREATE: 'QUANLY_VAITRO_CREATE',\n ROLE_UPDATE: 'QUANLY_VAITRO_UPDATE',\n ROLE_DELETE: 'QUANLY_VAITRO_DELETE',\n}\n\n// ==================== PHẢN HỒI ====================\nexport const FEEDBACK_PERMISSIONS = {\n FEEDBACK_READ: 'PHAN_HOI_READ',\n FEEDBACK_CREATE: 'PHAN_HOI_CREATE',\n FEEDBACK_UPDATE: 'PHAN_HOI_UPDATE',\n FEEDBACK_DELETE: 'PHAN_HOI_DELETE',\n}\n\n// ==================== THEO DÕI ====================\nexport const TRACKING_PERMISSIONS = {\n TRACKING_READ: 'THEO_DOI_READ',\n}\n\n// ==================== TỔNG HỢP TẤT CẢ PERMISSIONS ====================\nexport const ALL_PERMISSIONS = {\n ...DASHBOARD_PERMISSIONS,\n ...REPORT_PERMISSIONS,\n ...PAYMENT_PERMISSIONS,\n ...EDC_PERMISSIONS,\n ...SALES_PERMISSIONS,\n ...EINVOICE_PERMISSIONS,\n ...BUSINESS_PERMISSIONS,\n ...FEEDBACK_PERMISSIONS,\n ...TRACKING_PERMISSIONS,\n}\n\n// ==================== PERMISSION GROUPS (Optional - để group permissions) ====================\nexport const PERMISSION_GROUPS = {\n DASHBOARD: DASHBOARD_PERMISSIONS,\n REPORTS: REPORT_PERMISSIONS,\n PAYMENTS: PAYMENT_PERMISSIONS,\n EDC: EDC_PERMISSIONS,\n SALES: SALES_PERMISSIONS,\n EINVOICE: EINVOICE_PERMISSIONS,\n BUSINESS: BUSINESS_PERMISSIONS,\n FEEDBACK: FEEDBACK_PERMISSIONS,\n TRACKING: TRACKING_PERMISSIONS,\n}\n","import { PermissionGroup } from '@/permission/types/role'\nimport {\n DASHBOARD_PERMISSIONS,\n REPORT_PERMISSIONS,\n PAYMENT_PERMISSIONS,\n EDC_PERMISSIONS,\n SALES_PERMISSIONS,\n EINVOICE_PERMISSIONS,\n BUSINESS_PERMISSIONS,\n FEEDBACK_PERMISSIONS,\n TRACKING_PERMISSIONS,\n SETTINGS_PERMISSIONS\n} from \"./permission\";\n\n\nexport const ROLE_FORM = {\n ROLE_NAME: 'role_name',\n PERMISSIONS: 'permissions',\n}\n\n// // Không dùng trong form nhưng có trong file gốc\n// export const PERMISSION_OPTIONS = [\n// { value: 'CREATE', label: 'Tạo mới' },\n// { value: 'READ', label: 'Xem' },\n// { value: 'UPDATE', label: 'Cập nhật' },\n// { value: 'DELETE', label: 'Xóa' },\n// ]\n\nexport const PERMISSION_GROUPS: PermissionGroup[] = [\n {\n code: 'TONGQUAN',\n label: 'Tổng quan',\n permissions: [\n {\n code: DASHBOARD_PERMISSIONS.OVERVIEW,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'bao_cao',\n label: 'Báo cáo',\n isNested: true,\n subGroups: [\n {\n code: 'BAOCAO_GIAODICH_THE',\n label: 'Giao dịch thẻ',\n permissions: [\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'BAOCAO_GIAODICH_QR',\n label: 'Giao dịch QR',\n permissions: [\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'shop_qr',\n label: 'ShopQR',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_TAIKHOAN_THANHTOAN',\n label: 'Tài khoản thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAYMENT_ACCOUNT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_SHOPQR',\n label: 'Quản lý ShopQR',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_QR_THANHTOAN',\n label: 'Quản lý QR thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'PAY_BY_LINK',\n label: 'Pay By Link',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAY_BY_LINK_CREATE,\n label: 'Tạo Payment Link',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_MAY_THANHTOAN_THE',\n label: 'Quản lý máy thanh toán thẻ',\n permissions: [\n {\n code: EDC_PERMISSIONS.POS_MACHINE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EDC_PERMISSIONS.POS_MACHINE_UPDATE,\n label: 'Tích hợp ShopQR',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Quản lý bán hàng',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_KHACHHANG',\n label: 'Danh sách khách hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.CUSTOMER_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_SP',\n label: 'Danh sách sản phẩm',\n permissions: [\n {\n code: SALES_PERMISSIONS.PRODUCT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_DONHANG',\n label: 'Danh sách đơn hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_CREATE,\n label: 'Tạo đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_UPDATE,\n label: 'Cập nhật đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Danh sách bàn',\n permissions: [\n {\n code: SALES_PERMISSIONS.TABLE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.TABLE_CREATE,\n label: 'Tạo bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_UPDATE,\n label: 'Chỉnh sửa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_DELETE,\n label: 'Xóa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'THIETLAP_BANHANG',\n label: 'Thiết lập',\n permissions: [\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_CREATE,\n label: 'Thêm máy in',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'thong_tin_ho_so',\n label: 'Thông tin hồ sơ',\n isNested: true,\n subGroups: [\n {\n code: 'THONGTIN',\n label: 'Hồ sơ',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.THONGTIN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_CUAHANG',\n label: 'Quản lý cửa hàng',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STORE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_NHANVIEN',\n label: 'Quản lý nhân viên',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STAFF_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_ACCOUNT,\n label: 'Cấp tài khoản/ Thu hồi',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'hoa_don_dien_tu',\n label: 'Hóa đơn điện tử',\n isNested: true,\n subGroups: [\n {\n code: 'HOA_DON_DIEN_TU',\n label: 'Danh sách hóa đơn điện tử',\n permissions: [\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_CREATE,\n label: 'Xuất hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_UPDATE,\n label: 'Ký hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n]\n","/**\n * Permission Helper Utilities\n * Xử lý permissions theo cấu trúc mảng với sub_permissions\n */\n\nimport { Permission } from \"@/permission/types/permission\";\n\nexport const findPermission = (permissions : Permission[], permissionCode: string) => {\n if (!permissionCode) return null;\n\n return permissions.find(item => item.code === permissionCode) || null;\n\n};\n\nexport const hasPermission = (permissions: Permission[], permissionCode: string) => {\n if (!permissionCode) return false; // Nếu không có permissionCode thì không cho phép\n\n const permission = findPermission(permissions, permissionCode);\n\n return !!permission?.active;\n};\n\nexport const getAllSubPermissions = (permissions: Permission[]) => {\n if (!Array.isArray(permissions)) {\n return [];\n }\n\n return permissions.flatMap(group => group.sub_permissions || []);\n};","import type { PermissionGroup, Permission } from '@/permission/types/role';\n\nexport const getDefaultActivePermissions = (\n groups: PermissionGroup[]\n): string[] => {\n const activeIds: string[] = [];\n\n const findActiveIds = (permissions: Permission[]) => {\n permissions.forEach((perm) => {\n if (perm.active) {\n activeIds.push(perm.code);\n }\n });\n };\n\n groups.forEach((group) => {\n if (group.permissions) {\n findActiveIds(group.permissions);\n }\n if (group.subGroups) {\n group.subGroups.forEach((sub) => {\n if (sub.permissions) {\n findActiveIds(sub.permissions);\n }\n });\n }\n });\n\n return activeIds;\n};","import React from 'react';\n\nexport const ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n);\n\nexport const ChevronUpIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n);","import type { Permission, PermissionSubGroup } from '@/permission/types/role';\nimport React, { useState } from 'react';\nimport { ChevronDownIcon, ChevronUpIcon } from '../../components/common/Icons';\n\ninterface PermissionCheckboxGroupProps {\n label: string;\n permissions?: Permission[];\n subGroups?: PermissionSubGroup[];\n isNested?: boolean;\n collapsible?: boolean;\n value: string[];\n disabled?: boolean;\n onChange: (value: string[]) => void;\n}\n\nexport const PermissionCheckboxGroup: React.FC<PermissionCheckboxGroupProps> = ({\n label,\n permissions = [],\n subGroups = [],\n isNested = false,\n collapsible = true,\n disabled = false,\n value = [],\n onChange,\n}) => {\n const [isExpanded, setIsExpanded] = useState(true);\n\n const getAllPermissionIds = () => {\n let ids = permissions.map((p) => p.code);\n if (isNested && subGroups.length > 0) {\n subGroups.forEach((subGroup) => {\n ids = [...ids, ...subGroup.permissions.map((p) => p.code)];\n });\n }\n return ids;\n };\n\n const handleParentChange = (checked: boolean) => {\n const allPermissionIds = getAllPermissionIds();\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...allPermissionIds])];\n } else {\n newValue = value.filter((v) => !allPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const handlePermissionChange = (\n permissionId: string,\n checked: boolean,\n permissionsList: Permission[]\n ) => {\n const clickedPermission = permissionsList.find((p) => p.code === permissionId);\n const primaryPermissions = permissionsList.filter((p) => p.is_primary === true);\n const nonPrimaryPermissions = permissionsList.filter((p) => p.is_primary !== true);\n\n const primaryIds = primaryPermissions.map((p) => p.code);\n const nonPrimaryIds = nonPrimaryPermissions.map((p) => p.code);\n\n let newValue = [...value];\n\n if (checked) {\n if (!clickedPermission?.is_primary) {\n const missingPrimaryIds = primaryIds.filter((code) => !newValue.includes(code));\n newValue = [...new Set([...newValue, ...missingPrimaryIds, permissionId])];\n } else {\n if (!newValue.includes(permissionId)) newValue.push(permissionId);\n }\n } else {\n if (clickedPermission?.is_primary) {\n newValue = newValue.filter((code) => code !== permissionId && !nonPrimaryIds.includes(code));\n } else {\n newValue = newValue.filter((code) => code !== permissionId);\n }\n }\n\n onChange(newValue);\n };\n\n const handleSubGroupChange = (subGroup: PermissionSubGroup, checked: boolean) => {\n const subGroupPermissionIds = subGroup.permissions.map((p) => p.code);\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...subGroupPermissionIds])];\n } else {\n newValue = value.filter((v) => !subGroupPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const isSubGroupChecked = (subGroup: PermissionSubGroup) => {\n if (subGroup.permissions.length === 0) return false;\n return subGroup.permissions.every((p) => value.includes(p.code));\n };\n\n const isSubGroupIndeterminate = (subGroup: PermissionSubGroup) => {\n const checked = isSubGroupChecked(subGroup);\n return !checked && subGroup.permissions.some((p) => value.includes(p.code));\n };\n\n const allPermissionIds = getAllPermissionIds();\n const isParentChecked =\n allPermissionIds.length > 0 && allPermissionIds.every((code) => value.includes(code));\n\n const isParentIndeterminate = !isParentChecked && allPermissionIds.some((code) => value.includes(code));\n\n const hasContent = permissions.length > 0 || (isNested && subGroups.length > 0);\n\n return (\n <div className=\"border border-gray-200 rounded-lg bg-white overflow-hidden\">\n {/* Parent Checkbox */}\n <div\n className={`flex items-center justify-between p-4 bg-gray-50 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer hover:bg-gray-100'}`}\n onClick={() => collapsible && hasContent && setIsExpanded(!isExpanded)}\n >\n <label\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'} flex-1`}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isParentChecked}\n ref={(input) => {\n if (input) {\n input.indeterminate = isParentIndeterminate;\n }\n }}\n onChange={(e) => !disabled && handleParentChange(e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-gray-900\">{label}</span>\n </label>\n\n {collapsible && hasContent && (\n <button\n type=\"button\"\n className=\"p-1 hover:bg-gray-200 rounded\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(!isExpanded);\n }}\n >\n {isExpanded ? (\n <ChevronUpIcon className=\"w-5 h-5 text-gray-500\" />\n ) : (\n <ChevronDownIcon className=\"w-5 h-5 text-gray-500\" />\n )}\n </button>\n )}\n </div>\n\n {isExpanded && hasContent && (\n <div className=\"p-4 pt-2\">\n {/* Flat layout (no nesting) */}\n {!isNested && permissions.length > 0 && (\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 pl-6 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n )}\n\n {/* Nested layout */}\n {isNested && subGroups.length > 0 && (\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4 pl-6\">\n {subGroups.map((subGroup) => (\n <div\n key={subGroup.code}\n className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\"\n >\n {/* Sub-group header */}\n <label className={`flex items-center gap-2 mb-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}>\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isSubGroupChecked(subGroup)}\n ref={(input) => {\n if (input) {\n input.indeterminate = isSubGroupIndeterminate(subGroup);\n }\n }}\n onChange={(e) => !disabled && handleSubGroupChange(subGroup, e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-sm text-gray-800\">{subGroup.label}</span>\n </label>\n\n {/* Sub-group permissions (level 3) */}\n <div className=\"space-y-2 pl-6\">\n {subGroup.permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, subGroup.permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useForm, useController } from 'react-hook-form';\nimport { PERMISSION_GROUPS } from '@/permission/constant/role';\nimport type { RoleFormData, PermissionGroup } from '@/permission/types/role';\nimport { getDefaultActivePermissions } from '@/permission/utils/role';\nimport { PermissionCheckboxGroup } from './PermissionCheckboxGroup';\n\ninterface RoleTestComponentProps {\n onSubmit?: (data: any) => void;\n}\n\nexport const RoleTestComponent: React.FC<RoleTestComponentProps> = ({\n onSubmit,\n}) => {\n const [permissionGroups] = useState<PermissionGroup[]>(PERMISSION_GROUPS);\n\n const {\n register,\n handleSubmit,\n control,\n formState: { errors },\n } = useForm<RoleFormData>({\n defaultValues: {\n role_name: '',\n permissions: getDefaultActivePermissions(permissionGroups),\n },\n });\n\n const {\n field: { value: permissionsValue, onChange: setPermissions },\n } = useController({\n name: 'permissions',\n control,\n });\n\n const handleFormSubmit = (data: RoleFormData) => {\n // data.permissions là một mảng ID, ví dụ: ['tong_quan.view', 'shop_qr.manage.create']\n const activePermissionIds = new Set(data.permissions || []);\n\n const apiPermissions = permissionGroups.flatMap((group) => {\n // Hàm helper nội bộ để tạo payload cho từng sub-permission\n const createSubPermissionPayload = (perm: any) => { // Dùng 'any' hoặc import type 'Permission'\n const isActive = activePermissionIds.has(perm.code);\n const isPrimary = perm.is_primary;\n\n const subPermissionPayload: any = {\n code: perm.code,\n active: isActive,\n is_primary: isPrimary,\n };\n\n if (isPrimary && perm.max !== undefined) {\n subPermissionPayload.max = perm.max;\n }\n return subPermissionPayload;\n };\n\n // TRƯỜNG HỢP 1: group.isNested === true (ví dụ: ShopQR)\n if (group.isNested) {\n if (!group.subGroups) return [];\n\n return group.subGroups.map((subGroup) => {\n const sub_permissions = subGroup.permissions\n ? subGroup.permissions.map(createSubPermissionPayload)\n : [];\n\n return {\n code: subGroup.code, // code = subGroup.code\n sub_permissions: sub_permissions,\n };\n });\n }\n // TRƯỜG HỢP 2: group.isNested === false (ví dụ: Tổng quan)\n else {\n const sub_permissions = group.permissions\n ? group.permissions.map(createSubPermissionPayload)\n : [];\n\n return [\n {\n code: group.code, // code = group.code\n sub_permissions: sub_permissions,\n },\n ];\n }\n });\n\n const finalApiPermissions = apiPermissions.filter(\n (p) => p.sub_permissions.length > 0\n );\n\n // Payload cuối cùng để gửi đi\n const apiPayload = {\n name: data.role_name,\n permissions: finalApiPermissions,\n };\n\n console.log('Form Data (Raw):', data);\n console.log('API Payload (Transformed):', apiPayload);\n\n if (onSubmit) {\n onSubmit(apiPayload);\n }\n };\n\n return (\n <div className=\"max-w-5xl mx-auto p-6 bg-gray-50 rounded-lg\">\n <form onSubmit={handleSubmit(handleFormSubmit)} className=\"space-y-6\">\n {/* Phần Tên Vai Trò */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Thông tin vai trò\n </h3>\n <div>\n <label\n htmlFor=\"role_name\"\n className=\"block text-sm font-medium text-gray-700 mb-2\"\n >\n Tên vai trò <span className=\"text-red-500\">*</span>\n </label>\n <input\n {...register('role_name', { required: 'Tên vai trò là bắt buộc' })}\n type=\"text\"\n // code=\"role_name\"\n placeholder=\"Nhập tên vai trò\"\n className=\"w-full md:w-1/2 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500\"\n />\n {errors.role_name && (\n <p className=\"mt-1 text-sm text-red-600\">\n {errors.role_name.message}\n </p>\n )}\n </div>\n </div>\n\n {/* Phần Cấu Hình Quyền */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Cấu hình quyền\n </h3>\n <div className=\"space-y-4\">\n {/* Dùng component đã import */}\n {permissionGroups.map((group) => (\n <PermissionCheckboxGroup\n key={group.code}\n label={group.label}\n permissions={group.permissions || []}\n subGroups={group.subGroups || []}\n isNested={group.isNested || false}\n disabled={true}\n collapsible={\n (group.permissions && group.permissions.length > 0) ||\n (group.subGroups && group.subGroups.length > 0)\n }\n value={permissionsValue || []} // Lấy value từ useController\n onChange={setPermissions} // Dùng hàm onChange từ useController\n />\n ))}\n </div>\n </div>\n\n {/* Nút Submit */}\n <div className=\"flex justify-end gap-4 pt-4\">\n <button\n type=\"button\"\n onClick={() => console.log('Go Back')}\n className=\"px-6 py-2 bg-white border border-gray-300 text-gray-700 font-medium rounded-md hover:bg-gray-50 focus:ring-2 focus:ring-gray-300 focus:ring-offset-2 transition-colors\"\n >\n Quay lại\n </button>\n <button\n type=\"submit\"\n className=\"px-6 py-2 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors\"\n >\n Tạo vai trò\n </button>\n </div>\n </form>\n </div>\n );\n};"],"names":["jsx","allPermissionIds","jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAOO,MAAM,wBAAwB;AAAA,EACjC,UAAU;AACd;AAGO,MAAM,qBAAqB;AAAA;AAAA,EAE9B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA;AAAA,EAG1B,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA;AAAA,EAGxB,wBAAwB;AAAA;AAAA,EAGxB,2BAA2B;AAAA;AAAA,EAG3B,+BAA+B;AAAA;AAAA,EAG/B,wBAAwB;AAAA;AAAA,EAGxB,0BAA0B;AAAA;AAAA,EAG1B,wBAAwB;AAAA;AAAA,EAGxB,kBAAkB;AAAA,EAClB,oBAAoB;AACxB;AAGO,MAAM,sBAAsB;AAAA;AAAA,EAE/B,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA;AAAA,EAGxB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA;AAAA,EAGhB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA;AAAA,EAGpB,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,4BAA4B;AAChC;AAGO,MAAM,kBAAkB;AAAA,EAC3B,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,oBAAoB;AACxB;AAGO,MAAM,oBAAoB;AAAA;AAAA,EAE7B,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA;AAAA,EAGjB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA;AAAA,EAGhB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA;AAAA,EAGvB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAGd,qBAAqB;AAAA,EACrB,uBAAuB;AAAA;AAAA,EAGvB,qBAAqB;AACzB;AAEO,MAAM,uBAAuB;AAAA,EAChC,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,yBAAyB;AAC7B;AAGO,MAAM,uBAAuB;AAAA;AAAA,EAEhC,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,oBAAoB;AACxB;AAGO,MAAM,uBAAuB;AAAA;AAAA,EAEhC,eAAe;AAAA;AAAA,EAGf,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAGd,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA;AAAA,EAGf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AACjB;AAGO,MAAM,uBAAuB;AAAA,EAChC,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,iBAAiB;AACrB;AAGO,MAAM,uBAAuB;AAAA,EAChC,eAAe;AACnB;AAG+B,2IACxB,wBACA,qBACA,sBACA,kBACA,oBACA,uBACA,uBACA,uBACA;ACvKA,MAAM,YAAY;AAAA,EACvB,WAAW;AAAA,EACX,aAAa;AACf;AAUO,MAAM,oBAAuC;AAAA,EAClD;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,MACX;AAAA,QACE,MAAM,sBAAsB;AAAA,QAC5B,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,KAAK;AAAA,MAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,mBAAmB;AAAA,YACzB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,mBAAmB;AAAA,YACzB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,MAEF;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,mBAAmB;AAAA,YACzB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,mBAAmB;AAAA,YACzB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,oBAAoB;AAAA,YAC1B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,MAEF;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,oBAAoB;AAAA,YAC1B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,oBAAoB;AAAA,YAC1B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,oBAAoB;AAAA,YAC1B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,MAEF;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,oBAAoB;AAAA,YAC1B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,oBAAoB;AAAA,YAC1B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,MACX;AAAA,QACE,MAAM,oBAAoB;AAAA,QAC1B,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,KAAK;AAAA,MAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,MACX;AAAA,QACE,MAAM,gBAAgB;AAAA,QACtB,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,KAAK;AAAA,MAAA;AAAA,MAEP;AAAA,QACE,MAAM,gBAAgB;AAAA,QACtB,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,KAAK;AAAA,MAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,MAEF;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,MAEF;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,MAEF;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,kBAAkB;AAAA,YACxB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,MAEF;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,MAEF;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,MAEF;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,UACX;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,UAEP;AAAA,YACE,MAAM,qBAAqB;AAAA,YAC3B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,KAAK;AAAA,UAAA;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEJ;ACvbO,MAAM,iBAAiB,CAAC,aAA4B,mBAA2B;AAClF,MAAI,CAAC,eAAgB,QAAO;AAE5B,SAAO,YAAY,KAAK,CAAA,SAAQ,KAAK,SAAS,cAAc,KAAK;AAErE;AAEO,MAAM,gBAAgB,CAAC,aAA2B,mBAA2B;AAChF,MAAI,CAAC,eAAgB,QAAO;AAE5B,QAAM,aAAa,eAAe,aAAa,cAAc;AAE7D,SAAO,CAAC,EAAC,yCAAY;AACzB;AAEO,MAAM,uBAAuB,CAAC,gBAA8B;AACjE,MAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,WAAO,CAAA;AAAA,EACT;AAEA,SAAO,YAAY,QAAQ,CAAA,UAAS,MAAM,mBAAmB,EAAE;AACjE;AC1BO,MAAM,8BAA8B,CACzC,WACa;AACb,QAAM,YAAsB,CAAA;AAE5B,QAAM,gBAAgB,CAAC,gBAA8B;AACnD,gBAAY,QAAQ,CAAC,SAAS;AAC5B,UAAI,KAAK,QAAQ;AACf,kBAAU,KAAK,KAAK,IAAI;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,MAAM,aAAa;AACrB,oBAAc,MAAM,WAAW;AAAA,IACjC;AACA,QAAI,MAAM,WAAW;AACnB,YAAM,UAAU,QAAQ,CAAC,QAAQ;AAC/B,YAAI,IAAI,aAAa;AACnB,wBAAc,IAAI,WAAW;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AACT;AC3BO,MAAM,kBAAkB,CAAC,EAAE,UAAA,MAChCA,kCAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC;AAAA,IACA,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,QAAO;AAAA,IAEP,UAAAA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAc;AAAA,QACd,gBAAe;AAAA,QACf,aAAa;AAAA,QACb,GAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EACJ;AACF;AAGK,MAAM,gBAAgB,CAAC,EAAE,UAAA,MAC9BA,kCAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC;AAAA,IACA,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,QAAO;AAAA,IAEP,UAAAA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,eAAc;AAAA,QACd,gBAAe;AAAA,QACf,aAAa;AAAA,QACb,GAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EACJ;AACF;AChBK,MAAM,0BAAkE,CAAC;AAAA,EAC9E;AAAA,EACA,cAAc,CAAA;AAAA,EACd,YAAY,CAAA;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,QAAQ,CAAA;AAAA,EACR;AACF,MAAM;AACJ,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,IAAI;AAEjD,QAAM,sBAAsB,MAAM;AAChC,QAAI,MAAM,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI;AACvC,QAAI,YAAY,UAAU,SAAS,GAAG;AACpC,gBAAU,QAAQ,CAAC,aAAa;AAC9B,cAAM,CAAC,GAAG,KAAK,GAAG,SAAS,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAAA,MAC3D,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB,CAAC,YAAqB;AAC/C,UAAMC,oBAAmB,oBAAA;AACzB,QAAI;AACJ,QAAI,SAAS;AACX,iBAAW,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,GAAGA,iBAAgB,CAAC,CAAC;AAAA,IACzD,OAAO;AACL,iBAAW,MAAM,OAAO,CAAC,MAAM,CAACA,kBAAiB,SAAS,CAAC,CAAC;AAAA,IAC9D;AACA,aAAS,QAAQ;AAAA,EACnB;AAEA,QAAM,yBAAyB,CAC7B,cACA,SACA,oBACG;AACH,UAAM,oBAAoB,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,YAAY;AAC7E,UAAM,qBAAqB,gBAAgB,OAAO,CAAC,MAAM,EAAE,eAAe,IAAI;AAC9E,UAAM,wBAAwB,gBAAgB,OAAO,CAAC,MAAM,EAAE,eAAe,IAAI;AAEjF,UAAM,aAAa,mBAAmB,IAAI,CAAC,MAAM,EAAE,IAAI;AACvD,UAAM,gBAAgB,sBAAsB,IAAI,CAAC,MAAM,EAAE,IAAI;AAE7D,QAAI,WAAW,CAAC,GAAG,KAAK;AAExB,QAAI,SAAS;AACX,UAAI,EAAC,uDAAmB,aAAY;AAClC,cAAM,oBAAoB,WAAW,OAAO,CAAC,SAAS,CAAC,SAAS,SAAS,IAAI,CAAC;AAC9E,mBAAW,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,mBAAmB,YAAY,CAAC,CAAC;AAAA,MAC3E,OAAO;AACL,YAAI,CAAC,SAAS,SAAS,YAAY,EAAG,UAAS,KAAK,YAAY;AAAA,MAClE;AAAA,IACF,OAAO;AACL,UAAI,uDAAmB,YAAY;AACjC,mBAAW,SAAS,OAAO,CAAC,SAAS,SAAS,gBAAgB,CAAC,cAAc,SAAS,IAAI,CAAC;AAAA,MAC7F,OAAO;AACL,mBAAW,SAAS,OAAO,CAAC,SAAS,SAAS,YAAY;AAAA,MAC5D;AAAA,IACF;AAEA,aAAS,QAAQ;AAAA,EACnB;AAEA,QAAM,uBAAuB,CAAC,UAA8B,YAAqB;AAC/E,UAAM,wBAAwB,SAAS,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI;AACpE,QAAI;AACJ,QAAI,SAAS;AACX,iBAAW,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,GAAG,qBAAqB,CAAC,CAAC;AAAA,IAC9D,OAAO;AACL,iBAAW,MAAM,OAAO,CAAC,MAAM,CAAC,sBAAsB,SAAS,CAAC,CAAC;AAAA,IACnE;AACA,aAAS,QAAQ;AAAA,EACnB;AAEA,QAAM,oBAAoB,CAAC,aAAiC;AAC1D,QAAI,SAAS,YAAY,WAAW,EAAG,QAAO;AAC9C,WAAO,SAAS,YAAY,MAAM,CAAC,MAAM,MAAM,SAAS,EAAE,IAAI,CAAC;AAAA,EACjE;AAEA,QAAM,0BAA0B,CAAC,aAAiC;AAChE,UAAM,UAAU,kBAAkB,QAAQ;AAC1C,WAAO,CAAC,WAAW,SAAS,YAAY,KAAK,CAAC,MAAM,MAAM,SAAS,EAAE,IAAI,CAAC;AAAA,EAC5E;AAEA,QAAM,mBAAmB,oBAAA;AACzB,QAAM,kBACJ,iBAAiB,SAAS,KAAK,iBAAiB,MAAM,CAAC,SAAS,MAAM,SAAS,IAAI,CAAC;AAEtF,QAAM,wBAAwB,CAAC,mBAAmB,iBAAiB,KAAK,CAAC,SAAS,MAAM,SAAS,IAAI,CAAC;AAEtG,QAAM,aAAa,YAAY,SAAS,KAAM,YAAY,UAAU,SAAS;AAE7E,SACEC,kCAAAA,KAAC,OAAA,EAAI,WAAU,8DAEb,UAAA;AAAA,IAAAA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,oDAAoD,WAAW,uBAAuB,kCAAkC;AAAA,QACnI,SAAS,MAAM,eAAe,cAAc,cAAc,CAAC,UAAU;AAAA,QAErE,UAAA;AAAA,UAAAA,kCAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,2BAA2B,WAAW,uBAAuB,gBAAgB;AAAA,cACxF,SAAS,CAAC,MAAM,EAAE,gBAAA;AAAA,cAElB,UAAA;AAAA,gBAAAF,kCAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL;AAAA,oBACA,SAAS;AAAA,oBACT,KAAK,CAAC,UAAU;AACd,0BAAI,OAAO;AACT,8BAAM,gBAAgB;AAAA,sBACxB;AAAA,oBACF;AAAA,oBACA,UAAU,CAAC,MAAM,CAAC,YAAY,mBAAmB,EAAE,OAAO,OAAO;AAAA,oBACjE,WAAW,qEAAqE,WAAW,eAAe,EAAE;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAE9GA,kCAAAA,IAAC,QAAA,EAAK,WAAU,6BAA6B,UAAA,MAAA,CAAM;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGpD,eAAe,cACdA,kCAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,CAAC,MAAM;AACd,kBAAE,gBAAA;AACF,8BAAc,CAAC,UAAU;AAAA,cAC3B;AAAA,cAEC,UAAA,mDACE,eAAA,EAAc,WAAU,yBAAwB,IAEjDA,kCAAAA,IAAC,iBAAA,EAAgB,WAAU,wBAAA,CAAwB;AAAA,YAAA;AAAA,UAAA;AAAA,QAEvD;AAAA,MAAA;AAAA,IAAA;AAAA,IAIH,cAAc,cACbE,uCAAC,OAAA,EAAI,WAAU,YAEZ,UAAA;AAAA,MAAA,CAAC,YAAY,YAAY,SAAS,KACjCF,kCAAAA,IAAC,OAAA,EAAI,WAAU,yCACZ,UAAA,YAAY,IAAI,CAAC,eAChBE,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,gCAAgC,WAAW,uBAAuB,gBAAgB;AAAA,UAE7F,UAAA;AAAA,YAAAF,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL;AAAA,gBACA,SAAS,MAAM,SAAS,WAAW,IAAI;AAAA,gBACvC,UAAU,CAAC,MACT,CAAC,YACD,uBAAuB,WAAW,MAAM,EAAE,OAAO,SAAS,WAAW;AAAA,gBAEvE,WAAW,qEAAqE,WAAW,eAAe,EAAE;AAAA,cAAA;AAAA,YAAA;AAAA,YAE9GA,kCAAAA,IAAC,QAAA,EAAK,WAAU,yBAAyB,qBAAW,MAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAbrD,WAAW;AAAA,MAAA,CAenB,GACH;AAAA,MAID,YAAY,UAAU,SAAS,KAC9BA,kCAAAA,IAAC,OAAA,EAAI,WAAU,8CACZ,UAAA,UAAU,IAAI,CAAC,aACdE,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UAGV,UAAA;AAAA,YAAAA,uCAAC,WAAM,WAAW,gCAAgC,WAAW,uBAAuB,gBAAgB,IAClG,UAAA;AAAA,cAAAF,kCAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL;AAAA,kBACA,SAAS,kBAAkB,QAAQ;AAAA,kBACnC,KAAK,CAAC,UAAU;AACd,wBAAI,OAAO;AACT,4BAAM,gBAAgB,wBAAwB,QAAQ;AAAA,oBACxD;AAAA,kBACF;AAAA,kBACA,UAAU,CAAC,MAAM,CAAC,YAAY,qBAAqB,UAAU,EAAE,OAAO,OAAO;AAAA,kBAC7E,WAAW,qEAAqE,WAAW,eAAe,EAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,cAE9GA,kCAAAA,IAAC,QAAA,EAAK,WAAU,qCAAqC,mBAAS,MAAA,CAAM;AAAA,YAAA,GACtE;AAAA,YAGAA,kCAAAA,IAAC,SAAI,WAAU,kBACZ,mBAAS,YAAY,IAAI,CAAC,eACzBE,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAW,2BAA2B,WAAW,uBAAuB,gBAAgB;AAAA,gBAExF,UAAA;AAAA,kBAAAF,kCAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL;AAAA,sBACA,SAAS,MAAM,SAAS,WAAW,IAAI;AAAA,sBACvC,UAAU,CAAC,MACT,CAAC,YACD,uBAAuB,WAAW,MAAM,EAAE,OAAO,SAAS,SAAS,WAAW;AAAA,sBAEhF,WAAW,qEAAqE,WAAW,eAAe,EAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAE9GA,kCAAAA,IAAC,QAAA,EAAK,WAAU,yBAAyB,qBAAW,MAAA,CAAM;AAAA,gBAAA;AAAA,cAAA;AAAA,cAbrD,WAAW;AAAA,YAAA,CAenB,EAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,QAxCK,SAAS;AAAA,MAAA,CA0CjB,EAAA,CACH;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ;AC9NO,MAAM,oBAAsD,CAAC;AAAA,EAClE;AACF,MAAM;AACJ,QAAM,CAAC,gBAAgB,IAAI,SAA4B,iBAAiB;AAExE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,EAAE,OAAA;AAAA,EAAO,IAClB,QAAsB;AAAA,IACxB,eAAe;AAAA,MACb,WAAW;AAAA,MACX,aAAa,4BAA4B,gBAAgB;AAAA,IAAA;AAAA,EAC3D,CACD;AAED,QAAM;AAAA,IACJ,OAAO,EAAE,OAAO,kBAAkB,UAAU,eAAA;AAAA,EAAe,IACzD,cAAc;AAAA,IAChB,MAAM;AAAA,IACN;AAAA,EAAA,CACD;AAED,QAAM,mBAAmB,CAAC,SAAuB;AAE/C,UAAM,sBAAsB,IAAI,IAAI,KAAK,eAAe,CAAA,CAAE;AAE1D,UAAM,iBAAiB,iBAAiB,QAAQ,CAAC,UAAU;AAEzD,YAAM,6BAA6B,CAAC,SAAc;AAChD,cAAM,WAAW,oBAAoB,IAAI,KAAK,IAAI;AAClD,cAAM,YAAY,KAAK;AAEvB,cAAM,uBAA4B;AAAA,UAChC,MAAM,KAAK;AAAA,UACX,QAAQ;AAAA,UACR,YAAY;AAAA,QAAA;AAGd,YAAI,aAAa,KAAK,QAAQ,QAAW;AACvC,+BAAqB,MAAM,KAAK;AAAA,QAClC;AACA,eAAO;AAAA,MACT;AAGA,UAAI,MAAM,UAAU;AAClB,YAAI,CAAC,MAAM,UAAW,QAAO,CAAA;AAE7B,eAAO,MAAM,UAAU,IAAI,CAAC,aAAa;AACvC,gBAAM,kBAAkB,SAAS,cAC7B,SAAS,YAAY,IAAI,0BAA0B,IACnD,CAAA;AAEJ,iBAAO;AAAA,YACL,MAAM,SAAS;AAAA;AAAA,YACf;AAAA,UAAA;AAAA,QAEJ,CAAC;AAAA,MACH,OAEK;AACH,cAAM,kBAAkB,MAAM,cAC1B,MAAM,YAAY,IAAI,0BAA0B,IAChD,CAAA;AAEJ,eAAO;AAAA,UACL;AAAA,YACE,MAAM,MAAM;AAAA;AAAA,YACZ;AAAA,UAAA;AAAA,QACF;AAAA,MAEJ;AAAA,IACF,CAAC;AAED,UAAM,sBAAsB,eAAe;AAAA,MACzC,CAAC,MAAM,EAAE,gBAAgB,SAAS;AAAA,IAAA;AAIpC,UAAM,aAAa;AAAA,MACjB,MAAM,KAAK;AAAA,MACX,aAAa;AAAA,IAAA;AAGf,YAAQ,IAAI,oBAAoB,IAAI;AACpC,YAAQ,IAAI,8BAA8B,UAAU;AAEpD,QAAI,UAAU;AACZ,eAAS,UAAU;AAAA,IACrB;AAAA,EACF;AAEA,SACEA,kCAAAA,IAAC,OAAA,EAAI,WAAU,+CACb,UAAAE,kCAAAA,KAAC,QAAA,EAAK,UAAU,aAAa,gBAAgB,GAAG,WAAU,aAExD,UAAA;AAAA,IAAAA,kCAAAA,KAAC,OAAA,EAAI,WAAU,4DACb,UAAA;AAAA,MAAAF,kCAAAA,IAAC,MAAA,EAAG,WAAU,4CAA2C,UAAA,qBAEzD;AAAA,6CACC,OAAA,EACC,UAAA;AAAA,QAAAE,kCAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA,YACX,UAAA;AAAA,cAAA;AAAA,cACaF,kCAAAA,IAAC,QAAA,EAAK,WAAU,gBAAe,UAAA,IAAA,CAAC;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAE9CA,kCAAAA;AAAAA,UAAC;AAAA,UAAA,iCACK,SAAS,aAAa,EAAE,UAAU,2BAA2B,IADlE;AAAA,YAEC,MAAK;AAAA,YAEL,aAAY;AAAA,YACZ,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAEX,OAAO,aACNA,sCAAC,KAAA,EAAE,WAAU,6BACV,UAAA,OAAO,UAAU,QAAA,CACpB;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,IAGAE,kCAAAA,KAAC,OAAA,EAAI,WAAU,4DACb,UAAA;AAAA,MAAAF,kCAAAA,IAAC,MAAA,EAAG,WAAU,4CAA2C,UAAA,kBAEzD;AAAA,4CACC,OAAA,EAAI,WAAU,aAEZ,UAAA,iBAAiB,IAAI,CAAC,UACrBA,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,OAAO,MAAM;AAAA,UACb,aAAa,MAAM,eAAe,CAAA;AAAA,UAClC,WAAW,MAAM,aAAa,CAAA;AAAA,UAC9B,UAAU,MAAM,YAAY;AAAA,UAC5B,UAAU;AAAA,UACV,aACG,MAAM,eAAe,MAAM,YAAY,SAAS,KAChD,MAAM,aAAa,MAAM,UAAU,SAAS;AAAA,UAE/C,OAAO,oBAAoB,CAAA;AAAA,UAC3B,UAAU;AAAA,QAAA;AAAA,QAXL,MAAM;AAAA,MAAA,CAad,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IAGAE,kCAAAA,KAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAAF,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,QAAQ,IAAI,SAAS;AAAA,UACpC,WAAU;AAAA,UACX,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGDA,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACX,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;"}
1
+ {"version":3,"file":"permission.js","sources":["../src/permission/service/roleService.ts","../src/permission/constant/permission.ts","../src/permission/constant/role.ts","../src/permission/utils/permission.ts","../src/permission/utils/role.ts","../src/components/common/Icons.tsx","../src/permission/components/PermissionCheckboxGroup.tsx","../src/permission/components/RoleTestComponent.tsx"],"sourcesContent":["import type { ApiRolePayload, RoleFormData } from \"@/permission/types/role\";\n// import type { AxiosInstance } from \"axios\";\n\nexport interface RoleListResponse {\n data: TRole[];\n errors: string | null;\n error_code: string | null;\n msg: string | null;\n}\n\n\nexport interface TRole {\n id: number;\n name: string;\n role?: {\n name: string;\n };\n description?: string;\n permissions?: any[];\n module_number: string;\n staff_number: string;\n created_at: string;\n updated_at: string;\n created_by: boolean;\n}\n\nexport interface TCreateRolePayload extends ApiRolePayload {}\n\nexport interface TUpdateRolePayload extends ApiRolePayload {\n id: number;\n}\n\nconst formatParams = (params: Record<string, any>): string => {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n return searchParams.toString();\n};\n\nexport const createRoleService = (axiosClientPortal: any) => {\n return {\n getAll: async (params: {\n page: number;\n page_size: number;\n }): Promise<RoleListResponse> => {\n const response = await axiosClientPortal.get(\n `/roles/?${formatParams(params)}`\n );\n\n const raw = response.data;\n return {\n data: raw?.data ?? [],\n errors: raw?.errors ?? null,\n error_code: raw?.error_code ?? null,\n msg: raw?.msg ?? null,\n };\n },\n\n getRoleById: async (role_id: number): Promise<TRole> => {\n const response = await axiosClientPortal.get(`/roles/${role_id}`);\n return response.data;\n },\n\n create: async (data: TCreateRolePayload): Promise<TRole> => {\n const response = await axiosClientPortal.post(`/roles/`, data);\n return response.data;\n },\n\n update: async (role_id: number, data: TUpdateRolePayload): Promise<TRole> => {\n const response = await axiosClientPortal.put(`/roles/${role_id}`, data);\n return response.data;\n },\n\n delete: async (\n roleId: number\n ): Promise<{ success: boolean; message?: string }> => {\n const response = await axiosClientPortal.delete(\n `/roles/${roleId}`\n );\n return response.data;\n },\n };\n};\n","/**\n * Permission Constants\n * Định nghĩa tất cả các permission codes theo cấu trúc <MODULE>.<ACTION>\n * Khi cần thay đổi permission code, chỉ cần sửa ở file này\n */\n\n// ==================== DASHBOARD ====================\nexport const DASHBOARD_PERMISSIONS = {\n OVERVIEW: 'TONGQUAN_READ',\n}\n\n// ==================== BÁO CÁO GIAO DỊCH ====================\nexport const REPORT_PERMISSIONS = {\n // Báo cáo giao dịch thẻ\n CARD_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_THE_READ',\n CARD_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_THE_CREATE',\n CARD_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_THE_UPDATE',\n CARD_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_THE_DELETE',\n\n // Báo cáo giao dịch QR\n QR_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_QR_READ',\n QR_TRANSACTIONS_CREATE: 'BAOCAO_GIAODICH_QR_CREATE',\n QR_TRANSACTIONS_UPDATE: 'BAOCAO_GIAODICH_QR_UPDATE',\n QR_TRANSACTIONS_DELETE: 'BAOCAO_GIAODICH_QR_DELETE',\n\n // Báo cáo giao dịch tiền mặt\n CASH_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIENMAT_READ',\n\n // Báo cáo giao dịch E-wallet\n EWALLET_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_EWALLET_READ',\n\n // Báo cáo giao dịch trả góp\n INSTALLMENT_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TRAGOP_READ',\n\n // Báo cáo giao dịch E-commerce\n ECOM_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_ECOM_READ',\n\n // Báo cáo giao dịch tiết kiệm\n SAVING_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_TIETKIEM_READ',\n\n // Báo cáo giao dịch vay vốn\n LOAN_TRANSACTIONS_READ: 'BAOCAO_GIAODICH_VAYVON_READ',\n\n // Xuất báo cáo\n EXPORT_QR_REPORT: 'XUAT_BAOCAO_GIAODICH_QR_CREATE',\n EXPORT_CARD_REPORT: 'XUAT_BAOCAO_GIAODICH_THE_CREATE',\n}\n\n// ==================== QUẢN LÝ THANH TOÁN ====================\nexport const PAYMENT_PERMISSIONS = {\n // Tài khoản thanh toán\n PAYMENT_ACCOUNT_READ: 'QUANLY_TAIKHOAN_THANHTOAN_READ',\n PAYMENT_ACCOUNT_CREATE: 'QUANLY_TAIKHOAN_THANHTOAN_CREATE',\n PAYMENT_ACCOUNT_UPDATE: 'QUANLY_TAIKHOAN_THANHTOAN_UPDATE',\n PAYMENT_ACCOUNT_DELETE: 'QUANLY_TAIKHOAN_THANHTOAN_DELETE',\n\n // Shop QR\n SHOP_QR_READ: 'QUANLY_SHOPQR_READ',\n SHOP_QR_CREATE: 'QUANLY_SHOPQR_CREATE',\n SHOP_QR_UPDATE: 'QUANLY_SHOPQR_UPDATE',\n SHOP_QR_DELETE: 'QUANLY_SHOPQR_DELETE',\n\n // Pay by Link\n PAY_BY_LINK_READ: 'PAY_BY_LINK_READ',\n PAY_BY_LINK_CREATE: 'PAY_BY_LINK_CREATE',\n PAY_BY_LINK_UPDATE: 'PAY_BY_LINK_UPDATE',\n PAY_BY_LINK_DELETE: 'PAY_BY_LINK_DELETE',\n\n //Quản lí QR thanh toán\n QUANLY_QR_THANHTOAN_READ: 'QUANLY_QR_THANHTOAN_READ',\n QUANLY_QR_THANHTOAN_CREATE: 'QUANLY_QR_THANHTOAN_CREATE',\n QUANLY_QR_THANHTOAN_UPDATE: 'QUANLY_QR_THANHTOAN_UPDATE',\n QUANLY_QR_THANHTOAN_DELETE: 'QUANLY_QR_THANHTOAN_DELETE',\n}\n\n// ==================== QUẢN LÝ MÁY POS/EDC ====================\nexport const EDC_PERMISSIONS = {\n POS_MACHINE_READ: 'QUANLY_MAY_THANHTOAN_THE_READ',\n POS_MACHINE_CREATE: 'QUANLY_MAY_THANHTOAN_THE_CREATE',\n POS_MACHINE_UPDATE: 'QUANLY_MAY_THANHTOAN_THE_UPDATE',\n POS_MACHINE_DELETE: 'QUANLY_MAY_THANHTOAN_THE_DELETE',\n}\n\n// ==================== QUẢN LÝ BÁN HÀNG ====================\nexport const SALES_PERMISSIONS = {\n // Khách hàng\n CUSTOMER_READ: 'QUANLY_KHACHHANG_READ',\n CUSTOMER_CREATE: 'QUANLY_KHACHHANG_CREATE',\n CUSTOMER_UPDATE: 'QUANLY_KHACHHANG_UPDATE',\n CUSTOMER_DELETE: 'QUANLY_KHACHHANG_DELETE',\n\n // Sản phẩm\n PRODUCT_READ: 'QUANLY_SP_READ',\n PRODUCT_CREATE: 'QUANLY_SP_CREATE',\n PRODUCT_UPDATE: 'QUANLY_SP_UPDATE',\n PRODUCT_DELETE: 'QUANLY_SP_DELETE',\n\n // Đơn hàng\n QUANLY_DONHANG_READ: 'QUANLY_DONHANG_READ',\n QUANLY_DONHANG_CREATE: 'QUANLY_DONHANG_CREATE',\n QUANLY_DONHANG_UPDATE: 'QUANLY_DONHANG_UPDATE',\n QUANLY_DONHANG_DELETE: 'QUANLY_DONHANG_DELETE',\n\n // Bàn (cho F&B)\n TABLE_READ: 'QUANLY_BAN_READ',\n TABLE_CREATE: 'QUANLY_BAN_CREATE',\n TABLE_UPDATE: 'QUANLY_BAN_UPDATE',\n TABLE_DELETE: 'QUANLY_BAN_DELETE',\n\n // Cài đặt bán hàng\n SALES_SETTINGS_READ: 'CAIDAT_BANHANG_READ',\n SALES_SETTINGS_UPDATE: 'CAIDAT_BANHANG_UPDATE',\n\n // Đăng ký bán hàng\n SALES_REGISTER_READ: 'DANGKY_BANHANG_READ',\n}\n\nexport const SETTINGS_PERMISSIONS = {\n THIETLAP_BANHANG_READ: 'THIETLAP_BANHANG_READ',\n THIETLAP_BANHANG_UPDATE: 'THIETLAP_BANHANG_UPDATE',\n THIETLAP_BANHANG_CREATE: 'THIETLAP_BANHANG_CREATE',\n}\n\n// ==================== HÓA ĐƠN ĐIỆN TỬ ====================\nexport const EINVOICE_PERMISSIONS = {\n // Hóa đơn điện tử\n EINVOICE_READ: 'HOA_DON_DIEN_TU_READ',\n EINVOICE_CREATE: 'HOA_DON_DIEN_TU_CREATE',\n EINVOICE_UPDATE: 'HOA_DON_DIEN_TU_UPDATE',\n EINVOICE_DELETE: 'HOA_DON_DIEN_TU_DELETE',\n EINVOICE_ONBOARD: 'HOA_DON_DIEN_TU_ONBOARD',\n EINVOICE_CONFIGURE: 'HOA_DON_DIEN_TU_CONFIG',\n}\n\n// ==================== QUẢN LÝ DOANH NGHIỆP ====================\nexport const BUSINESS_PERMISSIONS = {\n // Hồ sơ\n THONGTIN_READ: 'THONGTIN_READ',\n\n // Cửa hàng\n STORE_READ: 'QUANLY_CUAHANG_READ',\n STORE_CREATE: 'QUANLY_CUAHANG_CREATE',\n STORE_UPDATE: 'QUANLY_CUAHANG_UPDATE',\n STORE_DELETE: 'QUANLY_CUAHANG_DELETE',\n\n // Nhân viên\n STAFF_READ: 'QUANLY_NHANVIEN_READ',\n STAFF_CREATE: 'QUANLY_NHANVIEN_CREATE',\n STAFF_UPDATE: 'QUANLY_NHANVIEN_UPDATE',\n STAFF_DELETE: 'QUANLY_NHANVIEN_DELETE',\n STAFF_ACCOUNT: 'QUANLY_NHANVIEN_ACCOUNT',\n\n // Phân quyền nhân viên (Vai trò)\n ROLE_READ: 'QUANLY_VAITRO_READ',\n ROLE_CREATE: 'QUANLY_VAITRO_CREATE',\n ROLE_UPDATE: 'QUANLY_VAITRO_UPDATE',\n ROLE_DELETE: 'QUANLY_VAITRO_DELETE',\n}\n\n// ==================== PHẢN HỒI ====================\nexport const FEEDBACK_PERMISSIONS = {\n FEEDBACK_READ: 'PHAN_HOI_READ',\n FEEDBACK_CREATE: 'PHAN_HOI_CREATE',\n FEEDBACK_UPDATE: 'PHAN_HOI_UPDATE',\n FEEDBACK_DELETE: 'PHAN_HOI_DELETE',\n}\n\n// ==================== THEO DÕI ====================\nexport const TRACKING_PERMISSIONS = {\n TRACKING_READ: 'THEO_DOI_READ',\n}\n\n// ==================== TỔNG HỢP TẤT CẢ PERMISSIONS ====================\nexport const ALL_PERMISSIONS = {\n ...DASHBOARD_PERMISSIONS,\n ...REPORT_PERMISSIONS,\n ...PAYMENT_PERMISSIONS,\n ...EDC_PERMISSIONS,\n ...SALES_PERMISSIONS,\n ...EINVOICE_PERMISSIONS,\n ...BUSINESS_PERMISSIONS,\n ...FEEDBACK_PERMISSIONS,\n ...TRACKING_PERMISSIONS,\n}\n\n// ==================== PERMISSION GROUPS (Optional - để group permissions) ====================\nexport const PERMISSION_GROUPS = {\n DASHBOARD: DASHBOARD_PERMISSIONS,\n REPORTS: REPORT_PERMISSIONS,\n PAYMENTS: PAYMENT_PERMISSIONS,\n EDC: EDC_PERMISSIONS,\n SALES: SALES_PERMISSIONS,\n EINVOICE: EINVOICE_PERMISSIONS,\n BUSINESS: BUSINESS_PERMISSIONS,\n FEEDBACK: FEEDBACK_PERMISSIONS,\n TRACKING: TRACKING_PERMISSIONS,\n}\n","import { PermissionGroup } from '@/permission/types/role'\nimport {\n DASHBOARD_PERMISSIONS,\n REPORT_PERMISSIONS,\n PAYMENT_PERMISSIONS,\n EDC_PERMISSIONS,\n SALES_PERMISSIONS,\n EINVOICE_PERMISSIONS,\n BUSINESS_PERMISSIONS,\n FEEDBACK_PERMISSIONS,\n TRACKING_PERMISSIONS,\n SETTINGS_PERMISSIONS\n} from \"./permission\";\n\n\nexport const ROLE_FORM = {\n ROLE_NAME: 'role_name',\n PERMISSIONS: 'permissions',\n}\n\n// // Không dùng trong form nhưng có trong file gốc\n// export const PERMISSION_OPTIONS = [\n// { value: 'CREATE', label: 'Tạo mới' },\n// { value: 'READ', label: 'Xem' },\n// { value: 'UPDATE', label: 'Cập nhật' },\n// { value: 'DELETE', label: 'Xóa' },\n// ]\n\nexport const PERMISSION_GROUPS: PermissionGroup[] = [\n {\n code: 'TONGQUAN',\n label: 'Tổng quan',\n permissions: [\n {\n code: DASHBOARD_PERMISSIONS.OVERVIEW,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'bao_cao',\n label: 'Báo cáo',\n isNested: true,\n subGroups: [\n {\n code: 'BAOCAO_GIAODICH_THE',\n label: 'Giao dịch thẻ',\n permissions: [\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.CARD_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'BAOCAO_GIAODICH_QR',\n label: 'Giao dịch QR',\n permissions: [\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: REPORT_PERMISSIONS.QR_TRANSACTIONS_CREATE,\n label: 'Xuất báo cáo',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'shop_qr',\n label: 'ShopQR',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_TAIKHOAN_THANHTOAN',\n label: 'Tài khoản thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAYMENT_ACCOUNT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_SHOPQR',\n label: 'Quản lý ShopQR',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: PAYMENT_PERMISSIONS.SHOP_QR_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_QR_THANHTOAN',\n label: 'Quản lý QR thanh toán',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: PAYMENT_PERMISSIONS.QUANLY_QR_THANHTOAN_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'PAY_BY_LINK',\n label: 'Pay By Link',\n permissions: [\n {\n code: PAYMENT_PERMISSIONS.PAY_BY_LINK_CREATE,\n label: 'Tạo Payment Link',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_MAY_THANHTOAN_THE',\n label: 'Quản lý máy thanh toán thẻ',\n permissions: [\n {\n code: EDC_PERMISSIONS.POS_MACHINE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EDC_PERMISSIONS.POS_MACHINE_UPDATE,\n label: 'Tích hợp ShopQR',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Quản lý bán hàng',\n isNested: true,\n subGroups: [\n {\n code: 'QUANLY_KHACHHANG',\n label: 'Danh sách khách hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.CUSTOMER_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.CUSTOMER_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_SP',\n label: 'Danh sách sản phẩm',\n permissions: [\n {\n code: SALES_PERMISSIONS.PRODUCT_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.PRODUCT_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_DONHANG',\n label: 'Danh sách đơn hàng',\n permissions: [\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_CREATE,\n label: 'Tạo đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.QUANLY_DONHANG_UPDATE,\n label: 'Cập nhật đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'QUANLY_BANHANG',\n label: 'Danh sách bàn',\n permissions: [\n {\n code: SALES_PERMISSIONS.TABLE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SALES_PERMISSIONS.TABLE_CREATE,\n label: 'Tạo bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_UPDATE,\n label: 'Chỉnh sửa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SALES_PERMISSIONS.TABLE_DELETE,\n label: 'Xóa bàn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n {\n code: 'THIETLAP_BANHANG',\n label: 'Thiết lập',\n permissions: [\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: SETTINGS_PERMISSIONS.THIETLAP_BANHANG_CREATE,\n label: 'Thêm máy in',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'thong_tin_ho_so',\n label: 'Thông tin hồ sơ',\n isNested: true,\n subGroups: [\n {\n code: 'THONGTIN',\n label: 'Hồ sơ',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.THONGTIN_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_CUAHANG',\n label: 'Quản lý cửa hàng',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STORE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n ],\n },\n {\n code: 'QUANLY_NHANVIEN',\n label: 'Quản lý nhân viên',\n permissions: [\n {\n code: BUSINESS_PERMISSIONS.STAFF_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_CREATE,\n label: 'Tạo mới',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_UPDATE,\n label: 'Chỉnh sửa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_DELETE,\n label: 'Xóa',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: BUSINESS_PERMISSIONS.STAFF_ACCOUNT,\n label: 'Cấp tài khoản/ Thu hồi',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n {\n code: 'hoa_don_dien_tu',\n label: 'Hóa đơn điện tử',\n isNested: true,\n subGroups: [\n {\n code: 'HOA_DON_DIEN_TU',\n label: 'Danh sách hóa đơn điện tử',\n permissions: [\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_READ,\n label: 'Xem thông tin',\n is_primary: true,\n active: false,\n max: 10,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_CREATE,\n label: 'Xuất hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n {\n code: EINVOICE_PERMISSIONS.EINVOICE_UPDATE,\n label: 'Ký hóa đơn',\n is_primary: false,\n active: false,\n max: null,\n },\n ],\n },\n ],\n },\n]\n","/**\n * Permission Helper Utilities\n * Xử lý permissions theo cấu trúc mảng với sub_permissions\n */\n\nimport { Permission } from \"@/permission/types/permission\";\n\nexport const findPermission = (permissions : Permission[], permissionCode: string) => {\n if (!permissionCode) return null;\n\n return permissions.find(item => item.code === permissionCode) || null;\n\n};\n\nexport const hasPermission = (permissions: Permission[], permissionCode: string) => {\n if (!permissionCode) return false; // Nếu không có permissionCode thì không cho phép\n\n const permission = findPermission(permissions, permissionCode);\n\n return !!permission?.active;\n};\n\nexport const getAllSubPermissions = (permissions: Permission[]) => {\n if (!Array.isArray(permissions)) {\n return [];\n }\n\n return permissions.flatMap(group => group.sub_permissions || []);\n};","import type { PermissionGroup, Permission } from '@/permission/types/role';\n\nexport const getDefaultActivePermissions = (\n groups: PermissionGroup[]\n): string[] => {\n const activeIds: string[] = [];\n\n const findActiveIds = (permissions: Permission[]) => {\n permissions.forEach((perm) => {\n if (perm.active) {\n activeIds.push(perm.code);\n }\n });\n };\n\n groups.forEach((group) => {\n if (group.permissions) {\n findActiveIds(group.permissions);\n }\n if (group.subGroups) {\n group.subGroups.forEach((sub) => {\n if (sub.permissions) {\n findActiveIds(sub.permissions);\n }\n });\n }\n });\n\n return activeIds;\n};","import React from 'react';\n\nexport const ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n);\n\nexport const ChevronUpIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n);","import type { Permission, PermissionSubGroup } from '@/permission/types/role';\nimport React, { useState } from 'react';\nimport { ChevronDownIcon, ChevronUpIcon } from '../../components/common/Icons';\n\ninterface PermissionCheckboxGroupProps {\n label: string;\n permissions?: Permission[];\n subGroups?: PermissionSubGroup[];\n isNested?: boolean;\n collapsible?: boolean;\n value: string[];\n disabled?: boolean;\n onChange: (value: string[]) => void;\n}\n\nexport const PermissionCheckboxGroup: React.FC<PermissionCheckboxGroupProps> = ({\n label,\n permissions = [],\n subGroups = [],\n isNested = false,\n collapsible = true,\n disabled = false,\n value = [],\n onChange,\n}) => {\n const [isExpanded, setIsExpanded] = useState(true);\n\n const getAllPermissionIds = () => {\n let ids = permissions.map((p) => p.code);\n if (isNested && subGroups.length > 0) {\n subGroups.forEach((subGroup) => {\n ids = [...ids, ...subGroup.permissions.map((p) => p.code)];\n });\n }\n return ids;\n };\n\n const handleParentChange = (checked: boolean) => {\n const allPermissionIds = getAllPermissionIds();\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...allPermissionIds])];\n } else {\n newValue = value.filter((v) => !allPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const handlePermissionChange = (\n permissionId: string,\n checked: boolean,\n permissionsList: Permission[]\n ) => {\n const clickedPermission = permissionsList.find((p) => p.code === permissionId);\n const primaryPermissions = permissionsList.filter((p) => p.is_primary === true);\n const nonPrimaryPermissions = permissionsList.filter((p) => p.is_primary !== true);\n\n const primaryIds = primaryPermissions.map((p) => p.code);\n const nonPrimaryIds = nonPrimaryPermissions.map((p) => p.code);\n\n let newValue = [...value];\n\n if (checked) {\n if (!clickedPermission?.is_primary) {\n const missingPrimaryIds = primaryIds.filter((code) => !newValue.includes(code));\n newValue = [...new Set([...newValue, ...missingPrimaryIds, permissionId])];\n } else {\n if (!newValue.includes(permissionId)) newValue.push(permissionId);\n }\n } else {\n if (clickedPermission?.is_primary) {\n newValue = newValue.filter((code) => code !== permissionId && !nonPrimaryIds.includes(code));\n } else {\n newValue = newValue.filter((code) => code !== permissionId);\n }\n }\n\n onChange(newValue);\n };\n\n const handleSubGroupChange = (subGroup: PermissionSubGroup, checked: boolean) => {\n const subGroupPermissionIds = subGroup.permissions.map((p) => p.code);\n let newValue;\n if (checked) {\n newValue = [...new Set([...value, ...subGroupPermissionIds])];\n } else {\n newValue = value.filter((v) => !subGroupPermissionIds.includes(v));\n }\n onChange(newValue);\n };\n\n const isSubGroupChecked = (subGroup: PermissionSubGroup) => {\n if (subGroup.permissions.length === 0) return false;\n return subGroup.permissions.every((p) => value.includes(p.code));\n };\n\n const isSubGroupIndeterminate = (subGroup: PermissionSubGroup) => {\n const checked = isSubGroupChecked(subGroup);\n return !checked && subGroup.permissions.some((p) => value.includes(p.code));\n };\n\n const allPermissionIds = getAllPermissionIds();\n const isParentChecked =\n allPermissionIds.length > 0 && allPermissionIds.every((code) => value.includes(code));\n\n const isParentIndeterminate = !isParentChecked && allPermissionIds.some((code) => value.includes(code));\n\n const hasContent = permissions.length > 0 || (isNested && subGroups.length > 0);\n\n return (\n <div className=\"border border-gray-200 rounded-lg bg-white overflow-hidden\">\n {/* Parent Checkbox */}\n <div\n className={`flex items-center justify-between p-4 bg-gray-50 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer hover:bg-gray-100'}`}\n onClick={() => collapsible && hasContent && setIsExpanded(!isExpanded)}\n >\n <label\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'} flex-1`}\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isParentChecked}\n ref={(input) => {\n if (input) {\n input.indeterminate = isParentIndeterminate;\n }\n }}\n onChange={(e) => !disabled && handleParentChange(e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-gray-900\">{label}</span>\n </label>\n\n {collapsible && hasContent && (\n <button\n type=\"button\"\n className=\"p-1 hover:bg-gray-200 rounded\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(!isExpanded);\n }}\n >\n {isExpanded ? (\n <ChevronUpIcon className=\"w-5 h-5 text-gray-500\" />\n ) : (\n <ChevronDownIcon className=\"w-5 h-5 text-gray-500\" />\n )}\n </button>\n )}\n </div>\n\n {isExpanded && hasContent && (\n <div className=\"p-4 pt-2\">\n {/* Flat layout (no nesting) */}\n {!isNested && permissions.length > 0 && (\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 pl-6 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n )}\n\n {/* Nested layout */}\n {isNested && subGroups.length > 0 && (\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4 pl-6\">\n {subGroups.map((subGroup) => (\n <div\n key={subGroup.code}\n className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\"\n >\n {/* Sub-group header */}\n <label className={`flex items-center gap-2 mb-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}>\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={isSubGroupChecked(subGroup)}\n ref={(input) => {\n if (input) {\n input.indeterminate = isSubGroupIndeterminate(subGroup);\n }\n }}\n onChange={(e) => !disabled && handleSubGroupChange(subGroup, e.target.checked)}\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"font-medium text-sm text-gray-800\">{subGroup.label}</span>\n </label>\n\n {/* Sub-group permissions (level 3) */}\n <div className=\"space-y-2 pl-6\">\n {subGroup.permissions.map((permission) => (\n <label\n key={permission.code}\n className={`flex items-center gap-2 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value.includes(permission.code)}\n onChange={(e) =>\n !disabled &&\n handlePermissionChange(permission.code, e.target.checked, subGroup.permissions)\n }\n className={`w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 ${disabled ? 'opacity-60' : ''}`}\n />\n <span className=\"text-sm text-gray-700\">{permission.label}</span>\n </label>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useForm, useController } from 'react-hook-form';\nimport { PERMISSION_GROUPS } from '@/permission/constant/role';\nimport type { RoleFormData, PermissionGroup } from '@/permission/types/role';\nimport { getDefaultActivePermissions } from '@/permission/utils/role';\nimport { PermissionCheckboxGroup } from './PermissionCheckboxGroup';\n\ninterface RoleTestComponentProps {\n onSubmit?: (data: any) => void;\n}\n\nexport const RoleTestComponent: React.FC<RoleTestComponentProps> = ({\n onSubmit,\n}) => {\n const [permissionGroups] = useState<PermissionGroup[]>(PERMISSION_GROUPS);\n\n const {\n register,\n handleSubmit,\n control,\n formState: { errors },\n } = useForm<RoleFormData>({\n defaultValues: {\n role_name: '',\n permissions: getDefaultActivePermissions(permissionGroups),\n },\n });\n\n const {\n field: { value: permissionsValue, onChange: setPermissions },\n } = useController({\n name: 'permissions',\n control,\n });\n\n const handleFormSubmit = (data: RoleFormData) => {\n // data.permissions là một mảng ID, ví dụ: ['tong_quan.view', 'shop_qr.manage.create']\n const activePermissionIds = new Set(data.permissions || []);\n\n const apiPermissions = permissionGroups.flatMap((group) => {\n // Hàm helper nội bộ để tạo payload cho từng sub-permission\n const createSubPermissionPayload = (perm: any) => { // Dùng 'any' hoặc import type 'Permission'\n const isActive = activePermissionIds.has(perm.code);\n const isPrimary = perm.is_primary;\n\n const subPermissionPayload: any = {\n code: perm.code,\n active: isActive,\n is_primary: isPrimary,\n };\n\n if (isPrimary && perm.max !== undefined) {\n subPermissionPayload.max = perm.max;\n }\n return subPermissionPayload;\n };\n\n // TRƯỜNG HỢP 1: group.isNested === true (ví dụ: ShopQR)\n if (group.isNested) {\n if (!group.subGroups) return [];\n\n return group.subGroups.map((subGroup) => {\n const sub_permissions = subGroup.permissions\n ? subGroup.permissions.map(createSubPermissionPayload)\n : [];\n\n return {\n code: subGroup.code, // code = subGroup.code\n sub_permissions: sub_permissions,\n };\n });\n }\n // TRƯỜG HỢP 2: group.isNested === false (ví dụ: Tổng quan)\n else {\n const sub_permissions = group.permissions\n ? group.permissions.map(createSubPermissionPayload)\n : [];\n\n return [\n {\n code: group.code, // code = group.code\n sub_permissions: sub_permissions,\n },\n ];\n }\n });\n\n const finalApiPermissions = apiPermissions.filter(\n (p) => p.sub_permissions.length > 0\n );\n\n // Payload cuối cùng để gửi đi\n const apiPayload = {\n name: data.role_name,\n permissions: finalApiPermissions,\n };\n\n console.log('Form Data (Raw):', data);\n console.log('API Payload (Transformed):', apiPayload);\n\n if (onSubmit) {\n onSubmit(apiPayload);\n }\n };\n\n return (\n <div className=\"max-w-5xl mx-auto p-6 bg-gray-50 rounded-lg\">\n <form onSubmit={handleSubmit(handleFormSubmit)} className=\"space-y-6\">\n {/* Phần Tên Vai Trò */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Thông tin vai trò\n </h3>\n <div>\n <label\n htmlFor=\"role_name\"\n className=\"block text-sm font-medium text-gray-700 mb-2\"\n >\n Tên vai trò <span className=\"text-red-500\">*</span>\n </label>\n <input\n {...register('role_name', { required: 'Tên vai trò là bắt buộc' })}\n type=\"text\"\n // code=\"role_name\"\n placeholder=\"Nhập tên vai trò\"\n className=\"w-full md:w-1/2 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500\"\n />\n {errors.role_name && (\n <p className=\"mt-1 text-sm text-red-600\">\n {errors.role_name.message}\n </p>\n )}\n </div>\n </div>\n\n {/* Phần Cấu Hình Quyền */}\n <div className=\"bg-white p-6 rounded-lg shadow-sm border border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n Cấu hình quyền\n </h3>\n <div className=\"space-y-4\">\n {/* Dùng component đã import */}\n {permissionGroups.map((group) => (\n <PermissionCheckboxGroup\n key={group.code}\n label={group.label}\n permissions={group.permissions || []}\n subGroups={group.subGroups || []}\n isNested={group.isNested || false}\n disabled={true}\n collapsible={\n (group.permissions && group.permissions.length > 0) ||\n (group.subGroups && group.subGroups.length > 0)\n }\n value={permissionsValue || []} // Lấy value từ useController\n onChange={setPermissions} // Dùng hàm onChange từ useController\n />\n ))}\n </div>\n </div>\n\n {/* Nút Submit */}\n <div className=\"flex justify-end gap-4 pt-4\">\n <button\n type=\"button\"\n onClick={() => console.log('Go Back')}\n className=\"px-6 py-2 bg-white border border-gray-300 text-gray-700 font-medium rounded-md hover:bg-gray-50 focus:ring-2 focus:ring-gray-300 focus:ring-offset-2 transition-colors\"\n >\n Quay lại\n </button>\n <button\n type=\"submit\"\n className=\"px-6 py-2 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors\"\n >\n Tạo vai trò\n </button>\n </div>\n </form>\n </div>\n );\n};"],"names":["jsx","allPermissionIds","jsxs"],"mappings":"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"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.4.1",
6
+ "version": "1.4.2",
7
7
  "type": "module",
8
8
  "main": "dist/index.cjs",
9
9
  "module": "dist/index.esm.js",