@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.
Files changed (46) hide show
  1. package/dist/assets/locales/en/file.json.d.ts +3 -1
  2. package/dist/assets/locales/en/merchant-batch-create-form.json.d.ts +3 -1
  3. package/dist/assets/locales/vi/file.json.d.ts +3 -1
  4. package/dist/assets/locales/vi/merchant-batch-create-form.json.d.ts +3 -1
  5. package/dist/batch-product-creation/components/merchant-batch-create-form/file-upload-tab.d.ts +6 -1
  6. package/dist/batch-product-creation/components/merchant-batch-create-form/index.d.ts +6 -1
  7. package/dist/batch-product-creation/components/merchant-batch-create-form/merge-and-check-data.d.ts +5 -1
  8. package/dist/batch-product-creation/components/merchant-batch-create-form/modals/create-product-confirm-modal.d.ts +3 -1
  9. package/dist/batch-product-creation/components/merchant-batch-create-form/modals/update-product-modal/index.d.ts +2 -1
  10. package/dist/batch-product-creation/components/merchant-batch-create-form/product-info-preview/index.d.ts +5 -1
  11. package/dist/batch-product-creation/components/merchant-batch-create-form/product-info-preview/product-preview-table/index.d.ts +2 -2
  12. package/dist/batch-product-creation/store/use-upload-store.d.ts +3 -1
  13. package/dist/batch-product-creation/types/product-info-preview.d.ts +32 -3
  14. package/dist/batch-product-creation.cjs +700 -541
  15. package/dist/batch-product-creation.cjs.map +1 -1
  16. package/dist/batch-product-creation.esm.js +701 -542
  17. package/dist/batch-product-creation.esm.js.map +1 -1
  18. package/dist/batch-product-creation.js +701 -542
  19. package/dist/batch-product-creation.js.map +1 -1
  20. package/dist/components/MerchantBatchCreateForm/index.d.ts +6 -0
  21. package/dist/digistore.cjs +1 -1
  22. package/dist/digistore.esm.js +1 -1
  23. package/dist/digistore.js +1 -1
  24. package/dist/{dropdownMenuAbsolute-BKV3mzgE.cjs → dropdownMenuAbsolute-89gAGgGd.cjs} +2 -2
  25. package/dist/{dropdownMenuAbsolute-BKV3mzgE.cjs.map → dropdownMenuAbsolute-89gAGgGd.cjs.map} +1 -1
  26. package/dist/{dropdownMenuAbsolute-BreOsoPt.js → dropdownMenuAbsolute-Dw7Pk9Ke.js} +2 -2
  27. package/dist/{dropdownMenuAbsolute-BreOsoPt.js.map → dropdownMenuAbsolute-Dw7Pk9Ke.js.map} +1 -1
  28. package/dist/{index.esm-DPmk5fdS.js → index.esm-CW4gWR7r.js} +3 -3
  29. package/dist/{index.esm-DPmk5fdS.js.map → index.esm-CW4gWR7r.js.map} +1 -1
  30. package/dist/merchant-profile.cjs +2 -2
  31. package/dist/merchant-profile.esm.js +2 -2
  32. package/dist/merchant-profile.js +2 -2
  33. package/dist/permission/index.d.ts +1 -1
  34. package/dist/permission.cjs +65 -0
  35. package/dist/permission.cjs.map +1 -1
  36. package/dist/permission.esm.js +66 -1
  37. package/dist/permission.esm.js.map +1 -1
  38. package/dist/permission.js +66 -1
  39. package/dist/permission.js.map +1 -1
  40. package/dist/style.css +4 -0
  41. package/dist/{use-translation-Df6YK55O.js → use-translation-DoUEE54r.js} +17 -5
  42. package/dist/{use-translation-Df6YK55O.js.map → use-translation-DoUEE54r.js.map} +1 -1
  43. package/dist/{use-translation-OSujcs4v.cjs → use-translation-T0TNDEqs.cjs} +17 -5
  44. package/dist/{use-translation-OSujcs4v.cjs.map → use-translation-T0TNDEqs.cjs.map} +1 -1
  45. package/dist/utils/translations.d.ts +4 -0
  46. package/package.json +1 -1
@@ -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":"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"}
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
@@ -1498,6 +1498,10 @@ video {
1498
1498
  padding-top: 7.5px;
1499
1499
  padding-bottom: 7.5px;
1500
1500
  }
1501
+ .py-\[8px\] {
1502
+ padding-top: 8px;
1503
+ padding-bottom: 8px;
1504
+ }
1501
1505
  .pb-2 {
1502
1506
  padding-bottom: 0.5rem;
1503
1507
  }
@@ -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-Df6YK55O.js.map
1274
+ //# sourceMappingURL=use-translation-DoUEE54r.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-translation-Df6YK55O.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;"}
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-OSujcs4v.cjs.map
1273
+ //# sourceMappingURL=use-translation-T0TNDEqs.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-translation-OSujcs4v.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;;;"}
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;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.4.1",
6
+ "version": "1.5.2",
7
7
  "type": "module",
8
8
  "main": "dist/index.cjs",
9
9
  "module": "dist/index.esm.js",