@atomsolution/sdk-merchant 1.4.1 → 1.5.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.
- package/dist/assets/locales/en/file.json.d.ts +3 -1
- package/dist/assets/locales/en/merchant-batch-create-form.json.d.ts +3 -1
- package/dist/assets/locales/vi/file.json.d.ts +3 -1
- package/dist/assets/locales/vi/merchant-batch-create-form.json.d.ts +3 -1
- package/dist/batch-product-creation/components/merchant-batch-create-form/file-upload-tab.d.ts +6 -1
- package/dist/batch-product-creation/components/merchant-batch-create-form/index.d.ts +6 -1
- package/dist/batch-product-creation/components/merchant-batch-create-form/merge-and-check-data.d.ts +5 -1
- package/dist/batch-product-creation/components/merchant-batch-create-form/modals/create-product-confirm-modal.d.ts +3 -1
- package/dist/batch-product-creation/components/merchant-batch-create-form/modals/update-product-modal/index.d.ts +2 -1
- package/dist/batch-product-creation/components/merchant-batch-create-form/product-info-preview/index.d.ts +5 -1
- package/dist/batch-product-creation/components/merchant-batch-create-form/product-info-preview/product-preview-table/index.d.ts +2 -2
- package/dist/batch-product-creation/store/use-upload-store.d.ts +3 -1
- package/dist/batch-product-creation/types/product-info-preview.d.ts +32 -3
- package/dist/batch-product-creation.cjs +700 -541
- package/dist/batch-product-creation.cjs.map +1 -1
- package/dist/batch-product-creation.esm.js +701 -542
- package/dist/batch-product-creation.esm.js.map +1 -1
- package/dist/batch-product-creation.js +701 -542
- package/dist/batch-product-creation.js.map +1 -1
- package/dist/components/MerchantBatchCreateForm/index.d.ts +6 -0
- package/dist/digistore.cjs +1 -1
- package/dist/digistore.esm.js +1 -1
- package/dist/digistore.js +1 -1
- package/dist/{dropdownMenuAbsolute-BKV3mzgE.cjs → dropdownMenuAbsolute-89gAGgGd.cjs} +2 -2
- package/dist/{dropdownMenuAbsolute-BKV3mzgE.cjs.map → dropdownMenuAbsolute-89gAGgGd.cjs.map} +1 -1
- package/dist/{dropdownMenuAbsolute-BreOsoPt.js → dropdownMenuAbsolute-Dw7Pk9Ke.js} +2 -2
- package/dist/{dropdownMenuAbsolute-BreOsoPt.js.map → dropdownMenuAbsolute-Dw7Pk9Ke.js.map} +1 -1
- package/dist/{index.esm-DPmk5fdS.js → index.esm-CW4gWR7r.js} +3 -3
- package/dist/{index.esm-DPmk5fdS.js.map → index.esm-CW4gWR7r.js.map} +1 -1
- package/dist/merchant-profile.cjs +2 -2
- package/dist/merchant-profile.esm.js +2 -2
- package/dist/merchant-profile.js +2 -2
- package/dist/permission/index.d.ts +1 -1
- package/dist/permission.cjs +65 -0
- package/dist/permission.cjs.map +1 -1
- package/dist/permission.esm.js +66 -1
- package/dist/permission.esm.js.map +1 -1
- package/dist/permission.js +66 -1
- package/dist/permission.js.map +1 -1
- package/dist/style.css +4 -0
- package/dist/{use-translation-Df6YK55O.js → use-translation-DoUEE54r.js} +17 -5
- package/dist/{use-translation-Df6YK55O.js.map → use-translation-DoUEE54r.js.map} +1 -1
- package/dist/{use-translation-OSujcs4v.cjs → use-translation-T0TNDEqs.cjs} +17 -5
- package/dist/{use-translation-OSujcs4v.cjs.map → use-translation-T0TNDEqs.cjs.map} +1 -1
- package/dist/utils/translations.d.ts +4 -0
- package/package.json +1 -1
package/dist/permission.js.map
CHANGED
|
@@ -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/dist/style.css
CHANGED
|
@@ -458,7 +458,9 @@ const image$1 = "Hình ảnh sản phẩm";
|
|
|
458
458
|
const no_image$1 = "Không có ảnh";
|
|
459
459
|
const name$1 = "Tên sản phẩm";
|
|
460
460
|
const code$1 = "Mã sản phẩm";
|
|
461
|
-
const price_vat$1 = "Giá";
|
|
461
|
+
const price_vat$1 = "Giá bán sau thuế";
|
|
462
|
+
const tax$1 = "Thuế VAT";
|
|
463
|
+
const price_without_vat$1 = "Giá bán trước thuế";
|
|
462
464
|
const category$1 = "Danh mục sản phẩm";
|
|
463
465
|
const unit$1 = "Đơn vị tính";
|
|
464
466
|
const not_available$1 = "Chưa có";
|
|
@@ -544,6 +546,8 @@ const BATCH_CREATE_PRODUCT_VI = {
|
|
|
544
546
|
name: name$1,
|
|
545
547
|
code: code$1,
|
|
546
548
|
price_vat: price_vat$1,
|
|
549
|
+
tax: tax$1,
|
|
550
|
+
price_without_vat: price_without_vat$1,
|
|
547
551
|
category: category$1,
|
|
548
552
|
unit: unit$1,
|
|
549
553
|
not_available: not_available$1,
|
|
@@ -629,7 +633,9 @@ const image = "Product Image";
|
|
|
629
633
|
const no_image = "No Image";
|
|
630
634
|
const name = "Product Name";
|
|
631
635
|
const code = "Product Code";
|
|
632
|
-
const price_vat = "Price";
|
|
636
|
+
const price_vat = "Price after tax";
|
|
637
|
+
const tax = "Tax VAT";
|
|
638
|
+
const price_without_vat = "Price before tax";
|
|
633
639
|
const category = "Category";
|
|
634
640
|
const unit = "Unit";
|
|
635
641
|
const not_available = "Not available";
|
|
@@ -715,6 +721,8 @@ const BATCH_CREATE_PRODUCT_EN = {
|
|
|
715
721
|
name,
|
|
716
722
|
code,
|
|
717
723
|
price_vat,
|
|
724
|
+
tax,
|
|
725
|
+
price_without_vat,
|
|
718
726
|
category,
|
|
719
727
|
unit,
|
|
720
728
|
not_available,
|
|
@@ -846,7 +854,9 @@ const reset$1 = "Khôi phục lại";
|
|
|
846
854
|
const systemFields$1 = [
|
|
847
855
|
"Mã sản phẩm",
|
|
848
856
|
"Tên sản phẩm",
|
|
849
|
-
"Giá",
|
|
857
|
+
"Giá bán trước thuế",
|
|
858
|
+
"Thuế VAT",
|
|
859
|
+
"Giá bán sau thuế",
|
|
850
860
|
"Đơn vị tính",
|
|
851
861
|
"Danh mục sản phẩm"
|
|
852
862
|
];
|
|
@@ -925,7 +935,9 @@ const reset = "Reset";
|
|
|
925
935
|
const systemFields = [
|
|
926
936
|
"Product Code",
|
|
927
937
|
"Product Name",
|
|
928
|
-
"Price",
|
|
938
|
+
"Price before tax",
|
|
939
|
+
"Tax (VAT)",
|
|
940
|
+
"Price after tax",
|
|
929
941
|
"Unit",
|
|
930
942
|
"Product Category"
|
|
931
943
|
];
|
|
@@ -1259,4 +1271,4 @@ export {
|
|
|
1259
1271
|
translate as t,
|
|
1260
1272
|
useTranslation as u
|
|
1261
1273
|
};
|
|
1262
|
-
//# sourceMappingURL=use-translation-
|
|
1274
|
+
//# sourceMappingURL=use-translation-DoUEE54r.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-translation-
|
|
1
|
+
{"version":3,"file":"use-translation-DoUEE54r.js","sources":["../src/utils/translations.ts","../src/hooks/use-translation.ts"],"sourcesContent":["import TABLE_VI from '@/assets/locales/vi/table.json';\nimport TABLE_EN from '@/assets/locales/en/table.json';\nimport FORM_VI from '@/assets/locales/vi/form.json';\nimport FORM_EN from '@/assets/locales/en/form.json';\nimport BATCH_CREATE_PRODUCT_VI from '@/assets/locales/vi/merchant-batch-create-form.json';\nimport BATCH_CREATE_PRODUCT_EN from '@/assets/locales/en/merchant-batch-create-form.json';\nimport COMMON_VI from '@/assets/locales/vi/common.json';\nimport COMMON_EN from '@/assets/locales/en/common.json';\nimport FILE_VI from '@/assets/locales/vi/file.json';\nimport FILE_VN from '@/assets/locales/en/file.json';\nimport DOWNLOAD_SAMPLE_VI from '@/assets/locales/vi/download-sample.json';\nimport DOWNLOAD_SAMPLE_EN from '@/assets/locales/en/download-sample.json';\nimport DIGISTORE_ID_VI from '@/assets/locales/vi/digistore-id.json';\nimport DIGISTORE_ID_EN from '@/assets/locales/en/digistore-id.json';\n\nexport const TRANSLATIONS = {\n vi: {\n common: COMMON_VI,\n table: TABLE_VI,\n form: FORM_VI,\n 'batch-create-product': BATCH_CREATE_PRODUCT_VI,\n file: FILE_VI,\n 'download-sample': DOWNLOAD_SAMPLE_VI,\n 'digistore-id': DIGISTORE_ID_VI\n },\n en: {\n common: COMMON_EN,\n table: TABLE_EN,\n form: FORM_EN,\n 'batch-create-product': BATCH_CREATE_PRODUCT_EN,\n file: FILE_VN,\n 'download-sample': DOWNLOAD_SAMPLE_EN,\n 'digistore-id': DIGISTORE_ID_EN\n },\n} as const;\n","import useExternalConfigStore from '@/shared/store/use-external-config.store';\nimport { TRANSLATIONS } from '../utils/translations';\n\nexport type Language = keyof typeof TRANSLATIONS;\ntype Namespace = keyof (typeof TRANSLATIONS)[Language];\n\ninterface UseTranslationReturn {\n translate: (key: string) => string;\n language?: Language;\n}\n\nexport const translate = (\n key: string,\n name_space: Namespace = 'table',\n language?: Language\n): string => {\n const lang = language || useExternalConfigStore.getState().language;\n\n const splitKey = key?.split(':');\n const [namespace, derivedKey] =\n splitKey.length > 1 ? splitKey : [name_space, key];\n\n const ns = namespace as Namespace;\n const translations = TRANSLATIONS[lang][ns] as any;\n const keys = derivedKey.split('.');\n let value: any = translations;\n for (const k of keys) {\n value = value?.[k];\n }\n\n return value ?? key;\n};\n\nexport const useTranslation = (\n defaultNs: Namespace = 'table',\n manualLanguage?: Language\n): UseTranslationReturn => {\n const language: Language =\n manualLanguage || useExternalConfigStore.getState().language;\n const translateWithDefault = (key: string) =>\n translate(key, defaultNs, language);\n\n return { translate: translateWithDefault, language };\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,eAAe;AAAA,EAC1B,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAAA;AAAA,EAElB,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAAA;AAEpB;ACvBO,MAAM,YAAY,CACvB,KACA,aAAwB,SACxB,aACW;AACX,QAAM,OAAO,YAAY,uBAAuB,SAAA,EAAW;AAE3D,QAAM,WAAW,2BAAK,MAAM;AAC5B,QAAM,CAAC,WAAW,UAAU,IAC1B,SAAS,SAAS,IAAI,WAAW,CAAC,YAAY,GAAG;AAEnD,QAAM,KAAK;AACX,QAAM,eAAe,aAAa,IAAI,EAAE,EAAE;AAC1C,QAAM,OAAO,WAAW,MAAM,GAAG;AACjC,MAAI,QAAa;AACjB,aAAW,KAAK,MAAM;AACpB,YAAQ,+BAAQ;AAAA,EAClB;AAEA,SAAO,wBAAS;AAClB;AAEO,MAAM,iBAAiB,CAC5B,YAAuB,SACvB,mBACyB;AACzB,QAAM,WACJ,kBAAkB,uBAAuB,SAAA,EAAW;AACtD,QAAM,uBAAuB,CAAC,QAC5B,UAAU,KAAK,WAAW,QAAQ;AAEpC,SAAO,EAAE,WAAW,sBAAsB,SAAA;AAC5C;"}
|
|
@@ -459,7 +459,9 @@ const image$1 = "Hình ảnh sản phẩm";
|
|
|
459
459
|
const no_image$1 = "Không có ảnh";
|
|
460
460
|
const name$1 = "Tên sản phẩm";
|
|
461
461
|
const code$1 = "Mã sản phẩm";
|
|
462
|
-
const price_vat$1 = "Giá";
|
|
462
|
+
const price_vat$1 = "Giá bán sau thuế";
|
|
463
|
+
const tax$1 = "Thuế VAT";
|
|
464
|
+
const price_without_vat$1 = "Giá bán trước thuế";
|
|
463
465
|
const category$1 = "Danh mục sản phẩm";
|
|
464
466
|
const unit$1 = "Đơn vị tính";
|
|
465
467
|
const not_available$1 = "Chưa có";
|
|
@@ -545,6 +547,8 @@ const BATCH_CREATE_PRODUCT_VI = {
|
|
|
545
547
|
name: name$1,
|
|
546
548
|
code: code$1,
|
|
547
549
|
price_vat: price_vat$1,
|
|
550
|
+
tax: tax$1,
|
|
551
|
+
price_without_vat: price_without_vat$1,
|
|
548
552
|
category: category$1,
|
|
549
553
|
unit: unit$1,
|
|
550
554
|
not_available: not_available$1,
|
|
@@ -630,7 +634,9 @@ const image = "Product Image";
|
|
|
630
634
|
const no_image = "No Image";
|
|
631
635
|
const name = "Product Name";
|
|
632
636
|
const code = "Product Code";
|
|
633
|
-
const price_vat = "Price";
|
|
637
|
+
const price_vat = "Price after tax";
|
|
638
|
+
const tax = "Tax VAT";
|
|
639
|
+
const price_without_vat = "Price before tax";
|
|
634
640
|
const category = "Category";
|
|
635
641
|
const unit = "Unit";
|
|
636
642
|
const not_available = "Not available";
|
|
@@ -716,6 +722,8 @@ const BATCH_CREATE_PRODUCT_EN = {
|
|
|
716
722
|
name,
|
|
717
723
|
code,
|
|
718
724
|
price_vat,
|
|
725
|
+
tax,
|
|
726
|
+
price_without_vat,
|
|
719
727
|
category,
|
|
720
728
|
unit,
|
|
721
729
|
not_available,
|
|
@@ -847,7 +855,9 @@ const reset$1 = "Khôi phục lại";
|
|
|
847
855
|
const systemFields$1 = [
|
|
848
856
|
"Mã sản phẩm",
|
|
849
857
|
"Tên sản phẩm",
|
|
850
|
-
"Giá",
|
|
858
|
+
"Giá bán trước thuế",
|
|
859
|
+
"Thuế VAT",
|
|
860
|
+
"Giá bán sau thuế",
|
|
851
861
|
"Đơn vị tính",
|
|
852
862
|
"Danh mục sản phẩm"
|
|
853
863
|
];
|
|
@@ -926,7 +936,9 @@ const reset = "Reset";
|
|
|
926
936
|
const systemFields = [
|
|
927
937
|
"Product Code",
|
|
928
938
|
"Product Name",
|
|
929
|
-
"Price",
|
|
939
|
+
"Price before tax",
|
|
940
|
+
"Tax (VAT)",
|
|
941
|
+
"Price after tax",
|
|
930
942
|
"Unit",
|
|
931
943
|
"Product Category"
|
|
932
944
|
];
|
|
@@ -1258,4 +1270,4 @@ const useTranslation = (defaultNs = "table", manualLanguage) => {
|
|
|
1258
1270
|
};
|
|
1259
1271
|
exports.translate = translate;
|
|
1260
1272
|
exports.useTranslation = useTranslation;
|
|
1261
|
-
//# sourceMappingURL=use-translation-
|
|
1273
|
+
//# sourceMappingURL=use-translation-T0TNDEqs.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-translation-
|
|
1
|
+
{"version":3,"file":"use-translation-T0TNDEqs.cjs","sources":["../src/utils/translations.ts","../src/hooks/use-translation.ts"],"sourcesContent":["import TABLE_VI from '@/assets/locales/vi/table.json';\nimport TABLE_EN from '@/assets/locales/en/table.json';\nimport FORM_VI from '@/assets/locales/vi/form.json';\nimport FORM_EN from '@/assets/locales/en/form.json';\nimport BATCH_CREATE_PRODUCT_VI from '@/assets/locales/vi/merchant-batch-create-form.json';\nimport BATCH_CREATE_PRODUCT_EN from '@/assets/locales/en/merchant-batch-create-form.json';\nimport COMMON_VI from '@/assets/locales/vi/common.json';\nimport COMMON_EN from '@/assets/locales/en/common.json';\nimport FILE_VI from '@/assets/locales/vi/file.json';\nimport FILE_VN from '@/assets/locales/en/file.json';\nimport DOWNLOAD_SAMPLE_VI from '@/assets/locales/vi/download-sample.json';\nimport DOWNLOAD_SAMPLE_EN from '@/assets/locales/en/download-sample.json';\nimport DIGISTORE_ID_VI from '@/assets/locales/vi/digistore-id.json';\nimport DIGISTORE_ID_EN from '@/assets/locales/en/digistore-id.json';\n\nexport const TRANSLATIONS = {\n vi: {\n common: COMMON_VI,\n table: TABLE_VI,\n form: FORM_VI,\n 'batch-create-product': BATCH_CREATE_PRODUCT_VI,\n file: FILE_VI,\n 'download-sample': DOWNLOAD_SAMPLE_VI,\n 'digistore-id': DIGISTORE_ID_VI\n },\n en: {\n common: COMMON_EN,\n table: TABLE_EN,\n form: FORM_EN,\n 'batch-create-product': BATCH_CREATE_PRODUCT_EN,\n file: FILE_VN,\n 'download-sample': DOWNLOAD_SAMPLE_EN,\n 'digistore-id': DIGISTORE_ID_EN\n },\n} as const;\n","import useExternalConfigStore from '@/shared/store/use-external-config.store';\nimport { TRANSLATIONS } from '../utils/translations';\n\nexport type Language = keyof typeof TRANSLATIONS;\ntype Namespace = keyof (typeof TRANSLATIONS)[Language];\n\ninterface UseTranslationReturn {\n translate: (key: string) => string;\n language?: Language;\n}\n\nexport const translate = (\n key: string,\n name_space: Namespace = 'table',\n language?: Language\n): string => {\n const lang = language || useExternalConfigStore.getState().language;\n\n const splitKey = key?.split(':');\n const [namespace, derivedKey] =\n splitKey.length > 1 ? splitKey : [name_space, key];\n\n const ns = namespace as Namespace;\n const translations = TRANSLATIONS[lang][ns] as any;\n const keys = derivedKey.split('.');\n let value: any = translations;\n for (const k of keys) {\n value = value?.[k];\n }\n\n return value ?? key;\n};\n\nexport const useTranslation = (\n defaultNs: Namespace = 'table',\n manualLanguage?: Language\n): UseTranslationReturn => {\n const language: Language =\n manualLanguage || useExternalConfigStore.getState().language;\n const translateWithDefault = (key: string) =>\n translate(key, defaultNs, language);\n\n return { translate: translateWithDefault, language };\n};\n"],"names":["useExternalConfigStore"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,eAAe;AAAA,EAC1B,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAAA;AAAA,EAElB,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAAA;AAEpB;ACvBO,MAAM,YAAY,CACvB,KACA,aAAwB,SACxB,aACW;AACX,QAAM,OAAO,YAAYA,+CAAuB,SAAA,EAAW;AAE3D,QAAM,WAAW,2BAAK,MAAM;AAC5B,QAAM,CAAC,WAAW,UAAU,IAC1B,SAAS,SAAS,IAAI,WAAW,CAAC,YAAY,GAAG;AAEnD,QAAM,KAAK;AACX,QAAM,eAAe,aAAa,IAAI,EAAE,EAAE;AAC1C,QAAM,OAAO,WAAW,MAAM,GAAG;AACjC,MAAI,QAAa;AACjB,aAAW,KAAK,MAAM;AACpB,YAAQ,+BAAQ;AAAA,EAClB;AAEA,SAAO,wBAAS;AAClB;AAEO,MAAM,iBAAiB,CAC5B,YAAuB,SACvB,mBACyB;AACzB,QAAM,WACJ,kBAAkBA,+CAAuB,SAAA,EAAW;AACtD,QAAM,uBAAuB,CAAC,QAC5B,UAAU,KAAK,WAAW,QAAQ;AAEpC,SAAO,EAAE,WAAW,sBAAsB,SAAA;AAC5C;;;"}
|
|
@@ -142,6 +142,8 @@ export declare const TRANSLATIONS: {
|
|
|
142
142
|
name: string;
|
|
143
143
|
code: string;
|
|
144
144
|
price_vat: string;
|
|
145
|
+
tax: string;
|
|
146
|
+
price_without_vat: string;
|
|
145
147
|
category: string;
|
|
146
148
|
unit: string;
|
|
147
149
|
not_available: string;
|
|
@@ -484,6 +486,8 @@ export declare const TRANSLATIONS: {
|
|
|
484
486
|
name: string;
|
|
485
487
|
code: string;
|
|
486
488
|
price_vat: string;
|
|
489
|
+
tax: string;
|
|
490
|
+
price_without_vat: string;
|
|
487
491
|
category: string;
|
|
488
492
|
unit: string;
|
|
489
493
|
not_available: string;
|