shutro-erp 0.3.5 → 0.3.7
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/account_asset/.kosh/bindings.js +15 -0
- package/dist/{mrp_account → account_asset}/.kosh/schema.d.ts +785 -614
- package/dist/account_asset/board.d.ts +61 -0
- package/dist/account_asset/board.js +86 -0
- package/dist/account_asset/books.d.ts +42 -0
- package/dist/account_asset/books.js +398 -0
- package/dist/account_asset/demo.d.ts +7 -0
- package/dist/account_asset/demo.js +72 -0
- package/dist/account_asset/i18n/bn.d.ts +2 -0
- package/dist/account_asset/i18n/bn.js +97 -0
- package/dist/account_asset/index.d.ts +9 -0
- package/dist/account_asset/index.js +337 -0
- package/dist/account_asset/module.d.ts +11076 -0
- package/dist/account_asset/module.js +230 -0
- package/dist/account_budget/.kosh/bindings.js +15 -0
- package/dist/account_budget/.kosh/schema.d.ts +2841 -0
- package/dist/account_budget/budget.d.ts +5 -0
- package/dist/account_budget/budget.js +142 -0
- package/dist/account_budget/demo.d.ts +6 -0
- package/dist/account_budget/demo.js +30 -0
- package/dist/account_budget/i18n/bn.d.ts +2 -0
- package/dist/account_budget/i18n/bn.js +63 -0
- package/dist/account_budget/index.d.ts +4 -0
- package/dist/account_budget/index.js +237 -0
- package/dist/account_budget/module.d.ts +27289 -0
- package/dist/account_budget/module.js +182 -0
- package/dist/account_portal/.kosh/bindings.js +1 -1
- package/dist/account_portal/.kosh/schema.d.ts +651 -10
- package/dist/account_portal/i18n/bn.d.ts +2 -0
- package/dist/account_portal/i18n/bn.js +6 -0
- package/dist/account_portal/index.js +2 -0
- package/dist/account_portal/module.d.ts +5212 -1592
- package/dist/accounting/.kosh/bindings.js +1 -1
- package/dist/accounting/.kosh/schema.d.ts +651 -10
- package/dist/accounting/closing.js +1 -0
- package/dist/accounting/fiscal.d.ts +578 -0
- package/dist/accounting/fiscal.js +401 -0
- package/dist/accounting/followups.d.ts +618 -0
- package/dist/accounting/followups.js +420 -0
- package/dist/accounting/i18n/bn.d.ts +2 -0
- package/dist/accounting/i18n/bn.js +425 -0
- package/dist/accounting/index.d.ts +3 -1
- package/dist/accounting/index.js +780 -5
- package/dist/accounting/module.d.ts +5386 -1543
- package/dist/accounting/module.js +155 -18
- package/dist/accounting/statements.d.ts +878 -0
- package/dist/accounting/statements.js +728 -0
- package/dist/accounting/web/BankReconcilePage.d.ts +9 -0
- package/dist/accounting/web/BankReconcilePage.js +138 -0
- package/dist/accounting/web/FollowupsPage.d.ts +8 -0
- package/dist/accounting/web/FollowupsPage.js +54 -0
- package/dist/accounting/web/PostingPreview.d.ts +8 -0
- package/dist/accounting/web/PostingPreview.js +26 -0
- package/dist/accounting/web/index.d.ts +3 -0
- package/dist/accounting/web/index.js +9 -0
- package/dist/accounting/web/messages.js +140 -0
- package/dist/approvals/.kosh/bindings.d.ts +22 -0
- package/dist/approvals/.kosh/bindings.js +15 -0
- package/dist/approvals/.kosh/schema.d.ts +879 -0
- package/dist/approvals/demo.d.ts +7 -0
- package/dist/approvals/demo.js +41 -0
- package/dist/approvals/i18n/bn.d.ts +2 -0
- package/dist/approvals/i18n/bn.js +133 -0
- package/dist/approvals/index.d.ts +36 -0
- package/dist/approvals/index.js +772 -0
- package/dist/approvals/mails.d.ts +30 -0
- package/dist/approvals/mails.js +87 -0
- package/dist/approvals/module.d.ts +2930 -0
- package/dist/approvals/module.js +473 -0
- package/dist/approvals/web/Config.d.ts +12 -0
- package/dist/approvals/web/Config.js +60 -0
- package/dist/approvals/web/History.d.ts +4 -0
- package/dist/approvals/web/History.js +13 -0
- package/dist/approvals/web/Inbox.d.ts +9 -0
- package/dist/approvals/web/Inbox.js +114 -0
- package/dist/approvals/web/Matrix.d.ts +9 -0
- package/dist/approvals/web/Matrix.js +26 -0
- package/dist/approvals/web/Mine.d.ts +7 -0
- package/dist/approvals/web/Mine.js +27 -0
- package/dist/approvals/web/index.d.ts +15 -0
- package/dist/approvals/web/index.js +29 -0
- package/dist/approvals/web/messages.d.ts +2 -0
- package/dist/approvals/web/messages.js +211 -0
- package/dist/approvals/web/shared.d.ts +59 -0
- package/dist/approvals/web/shared.js +46 -0
- package/dist/approvals_purchase/.kosh/bindings.d.ts +22 -0
- package/dist/approvals_purchase/.kosh/bindings.js +15 -0
- package/dist/approvals_purchase/.kosh/schema.d.ts +1997 -0
- package/dist/approvals_purchase/i18n/bn.d.ts +2 -0
- package/dist/approvals_purchase/i18n/bn.js +5 -0
- package/dist/approvals_purchase/index.d.ts +3 -0
- package/dist/approvals_purchase/index.js +47 -0
- package/dist/approvals_purchase/module.d.ts +12670 -0
- package/dist/approvals_purchase/module.js +84 -0
- package/dist/attendance/.kosh/bindings.d.ts +22 -0
- package/dist/attendance/.kosh/bindings.js +15 -0
- package/dist/attendance/.kosh/schema.d.ts +1106 -0
- package/dist/attendance/days.d.ts +96 -0
- package/dist/attendance/days.js +430 -0
- package/dist/attendance/demo.d.ts +7 -0
- package/dist/attendance/demo.js +58 -0
- package/dist/attendance/i18n/bn.d.ts +2 -0
- package/dist/attendance/i18n/bn.js +147 -0
- package/dist/attendance/index.d.ts +4 -0
- package/dist/attendance/index.js +515 -0
- package/dist/attendance/module.d.ts +4413 -0
- package/dist/attendance/module.js +412 -0
- package/dist/attendance/routes.d.ts +16 -0
- package/dist/attendance/routes.js +266 -0
- package/dist/attendance/web/Check.d.ts +8 -0
- package/dist/attendance/web/Check.js +40 -0
- package/dist/attendance/web/Kiosk.d.ts +8 -0
- package/dist/attendance/web/Kiosk.js +62 -0
- package/dist/attendance/web/PinButton.d.ts +7 -0
- package/dist/attendance/web/PinButton.js +29 -0
- package/dist/attendance/web/index.d.ts +13 -0
- package/dist/attendance/web/index.js +22 -0
- package/dist/attendance/web/messages.d.ts +2 -0
- package/dist/attendance/web/messages.js +61 -0
- package/dist/automation/engine.js +1 -1
- package/dist/calendar/.kosh/bindings.js +1 -1
- package/dist/calendar/.kosh/schema.d.ts +2 -1
- package/dist/calendar/i18n/bn.d.ts +2 -0
- package/dist/calendar/i18n/bn.js +80 -0
- package/dist/calendar/index.js +77 -0
- package/dist/calendar/module.d.ts +26 -0
- package/dist/calendar/module.js +14 -4
- package/dist/cli/apps.js +25 -5
- package/dist/cli/init.js +46 -4
- package/dist/cli/templates.d.ts +1 -1
- package/dist/cli/templates.js +123 -5
- package/dist/contacts/.kosh/bindings.js +1 -1
- package/dist/contacts/.kosh/schema.d.ts +2 -1
- package/dist/contacts/i18n/bn.d.ts +2 -0
- package/dist/contacts/i18n/bn.js +67 -0
- package/dist/contacts/index.js +3 -0
- package/dist/contacts/module.d.ts +42 -0
- package/dist/contacts/module.js +19 -3
- package/dist/crm/.kosh/bindings.js +1 -1
- package/dist/crm/.kosh/schema.d.ts +3 -1
- package/dist/crm/i18n/bn.d.ts +2 -0
- package/dist/crm/i18n/bn.js +80 -0
- package/dist/crm/index.js +22 -0
- package/dist/crm/module.d.ts +22 -0
- package/dist/crm/module.js +6 -3
- package/dist/documents/.kosh/bindings.d.ts +22 -0
- package/dist/documents/.kosh/bindings.js +15 -0
- package/dist/documents/.kosh/schema.d.ts +863 -0
- package/dist/documents/demo.d.ts +6 -0
- package/dist/documents/demo.js +22 -0
- package/dist/documents/documents.d.ts +98 -0
- package/dist/documents/documents.js +318 -0
- package/dist/documents/i18n/bn.d.ts +2 -0
- package/dist/documents/i18n/bn.js +83 -0
- package/dist/documents/index.d.ts +30 -0
- package/dist/documents/index.js +569 -0
- package/dist/documents/module.d.ts +2801 -0
- package/dist/documents/module.js +215 -0
- package/dist/documents/web/Versions.d.ts +7 -0
- package/dist/documents/web/Versions.js +45 -0
- package/dist/documents/web/index.d.ts +11 -0
- package/dist/documents/web/index.js +16 -0
- package/dist/documents/web/messages.d.ts +2 -0
- package/dist/documents/web/messages.js +21 -0
- package/dist/event/.kosh/bindings.js +1 -1
- package/dist/event/.kosh/schema.d.ts +2 -1
- package/dist/event/i18n/bn.d.ts +2 -0
- package/dist/event/i18n/bn.js +101 -0
- package/dist/event/index.js +66 -0
- package/dist/event/module.d.ts +20 -0
- package/dist/event/module.js +8 -1
- package/dist/event_account/.kosh/bindings.js +1 -1
- package/dist/event_account/.kosh/schema.d.ts +651 -10
- package/dist/event_account/i18n/bn.d.ts +2 -0
- package/dist/event_account/i18n/bn.js +5 -0
- package/dist/event_account/index.js +2 -0
- package/dist/event_account/module.d.ts +5133 -1513
- package/dist/expense/.kosh/bindings.d.ts +22 -0
- package/dist/expense/.kosh/bindings.js +15 -0
- package/dist/expense/.kosh/schema.d.ts +1620 -0
- package/dist/expense/demo.d.ts +7 -0
- package/dist/expense/demo.js +69 -0
- package/dist/expense/i18n/bn.d.ts +2 -0
- package/dist/expense/i18n/bn.js +155 -0
- package/dist/expense/index.d.ts +3 -0
- package/dist/expense/index.js +502 -0
- package/dist/expense/module.d.ts +6768 -0
- package/dist/expense/module.js +649 -0
- package/dist/expense_account/.kosh/bindings.d.ts +22 -0
- package/dist/expense_account/.kosh/bindings.js +15 -0
- package/dist/expense_account/.kosh/schema.d.ts +2515 -0
- package/dist/expense_account/i18n/bn.d.ts +2 -0
- package/dist/expense_account/i18n/bn.js +15 -0
- package/dist/expense_account/index.d.ts +3 -0
- package/dist/expense_account/index.js +76 -0
- package/dist/expense_account/module.d.ts +14628 -0
- package/dist/expense_account/module.js +318 -0
- package/dist/helpdesk/.kosh/bindings.d.ts +22 -0
- package/dist/helpdesk/.kosh/bindings.js +15 -0
- package/dist/helpdesk/.kosh/schema.d.ts +886 -0
- package/dist/helpdesk/demo.d.ts +7 -0
- package/dist/helpdesk/demo.js +65 -0
- package/dist/helpdesk/hours.d.ts +17 -0
- package/dist/helpdesk/hours.js +94 -0
- package/dist/helpdesk/i18n/bn.d.ts +2 -0
- package/dist/helpdesk/i18n/bn.js +127 -0
- package/dist/helpdesk/index.d.ts +10 -0
- package/dist/helpdesk/index.js +463 -0
- package/dist/helpdesk/module.d.ts +2960 -0
- package/dist/helpdesk/module.js +326 -0
- package/dist/helpdesk/routes.d.ts +12 -0
- package/dist/helpdesk/routes.js +132 -0
- package/dist/helpdesk/sla.d.ts +37 -0
- package/dist/helpdesk/sla.js +226 -0
- package/dist/hr/.kosh/bindings.js +1 -1
- package/dist/hr/.kosh/schema.d.ts +59 -1
- package/dist/hr/demo.js +11 -1
- package/dist/hr/i18n/bn.d.ts +2 -0
- package/dist/hr/i18n/bn.js +126 -0
- package/dist/hr/index.d.ts +1 -1
- package/dist/hr/index.js +158 -12
- package/dist/hr/module.d.ts +932 -59
- package/dist/hr/module.js +114 -17
- package/dist/indent/.kosh/bindings.d.ts +22 -0
- package/dist/indent/.kosh/bindings.js +15 -0
- package/dist/indent/.kosh/schema.d.ts +2084 -0
- package/dist/indent/demo.d.ts +7 -0
- package/dist/indent/demo.js +48 -0
- package/dist/indent/i18n/bn.d.ts +2 -0
- package/dist/indent/i18n/bn.js +143 -0
- package/dist/indent/index.d.ts +3 -0
- package/dist/indent/index.js +450 -0
- package/dist/indent/module.d.ts +13424 -0
- package/dist/indent/module.js +792 -0
- package/dist/indent_purchase/.kosh/bindings.d.ts +22 -0
- package/dist/indent_purchase/.kosh/bindings.js +15 -0
- package/dist/indent_purchase/.kosh/schema.d.ts +2710 -0
- package/dist/indent_purchase/i18n/bn.d.ts +2 -0
- package/dist/indent_purchase/i18n/bn.js +13 -0
- package/dist/indent_purchase/index.d.ts +3 -0
- package/dist/indent_purchase/index.js +61 -0
- package/dist/indent_purchase/module.d.ts +27950 -0
- package/dist/indent_purchase/module.js +163 -0
- package/dist/l10n_bd/.kosh/bindings.js +1 -1
- package/dist/l10n_bd/.kosh/schema.d.ts +651 -10
- package/dist/l10n_bd/i18n/bn.d.ts +2 -0
- package/dist/l10n_bd/i18n/bn.js +69 -0
- package/dist/l10n_bd/index.js +2 -0
- package/dist/l10n_bd/module.d.ts +5212 -1592
- package/dist/l10n_bd_payroll/.kosh/bindings.d.ts +22 -0
- package/dist/l10n_bd_payroll/.kosh/bindings.js +15 -0
- package/dist/l10n_bd_payroll/.kosh/schema.d.ts +2891 -0
- package/dist/l10n_bd_payroll/data.d.ts +47 -0
- package/dist/l10n_bd_payroll/data.js +347 -0
- package/dist/l10n_bd_payroll/i18n/bn.d.ts +2 -0
- package/dist/l10n_bd_payroll/i18n/bn.js +4 -0
- package/dist/l10n_bd_payroll/index.d.ts +4 -0
- package/dist/l10n_bd_payroll/index.js +26 -0
- package/dist/l10n_bd_payroll/module.d.ts +17294 -0
- package/dist/l10n_bd_payroll/module.js +86 -0
- package/dist/l10n_bd_pos/.kosh/bindings.d.ts +22 -0
- package/dist/{mrp_account → l10n_bd_pos}/.kosh/bindings.js +2 -2
- package/dist/l10n_bd_pos/.kosh/schema.d.ts +2341 -0
- package/dist/l10n_bd_pos/i18n/bn.d.ts +2 -0
- package/dist/l10n_bd_pos/i18n/bn.js +32 -0
- package/dist/l10n_bd_pos/index.d.ts +3 -0
- package/dist/l10n_bd_pos/index.js +111 -0
- package/dist/{mrp_account → l10n_bd_pos}/module.d.ts +9047 -6981
- package/dist/l10n_bd_pos/module.js +43 -0
- package/dist/l10n_in/.kosh/bindings.js +1 -1
- package/dist/l10n_in/.kosh/schema.d.ts +651 -10
- package/dist/l10n_in/i18n/bn.d.ts +2 -0
- package/dist/l10n_in/i18n/bn.js +95 -0
- package/dist/l10n_in/index.js +2 -0
- package/dist/l10n_in/module.d.ts +6778 -1580
- package/dist/l10n_in/module.js +25 -5
- package/dist/l10n_in/web/GstSettings.js +2 -2
- package/dist/mail/inbound/handle.js +8 -5
- package/dist/mail/inbound/models.js +5 -3
- package/dist/mail/index.d.ts +12 -1
- package/dist/mail/index.js +139 -2
- package/dist/mail/send.d.ts +56 -0
- package/dist/mail/send.js +394 -0
- package/dist/mail/web/SendButton.d.ts +9 -0
- package/dist/mail/web/SendButton.js +71 -0
- package/dist/mail/web/SendSelected.d.ts +8 -0
- package/dist/mail/web/SendSelected.js +33 -0
- package/dist/mail/web/index.d.ts +2 -0
- package/dist/mail/web/index.js +6 -0
- package/dist/mail/web/messages.js +36 -0
- package/dist/maintenance/.kosh/bindings.js +1 -1
- package/dist/maintenance/.kosh/schema.d.ts +2 -1
- package/dist/maintenance/i18n/bn.d.ts +2 -0
- package/dist/maintenance/i18n/bn.js +132 -0
- package/dist/maintenance/index.js +85 -0
- package/dist/maintenance/module.d.ts +25 -0
- package/dist/maintenance/module.js +27 -9
- package/dist/maintenance_stock/.kosh/bindings.js +1 -1
- package/dist/maintenance_stock/.kosh/schema.d.ts +374 -3
- package/dist/maintenance_stock/i18n/bn.d.ts +2 -0
- package/dist/maintenance_stock/i18n/bn.js +21 -0
- package/dist/maintenance_stock/index.js +2 -0
- package/dist/maintenance_stock/module.d.ts +6095 -1327
- package/dist/maintenance_stock/module.js +1 -0
- package/dist/modules-sdk/apps.d.ts +10 -0
- package/dist/modules-sdk/apps.js +32 -0
- package/dist/modules-sdk/index.d.ts +1 -1
- package/dist/modules-sdk/manifest.d.ts +105 -2
- package/dist/payment/.kosh/bindings.js +1 -1
- package/dist/payment/.kosh/schema.d.ts +653 -11
- package/dist/payment/i18n/bn.d.ts +2 -0
- package/dist/payment/i18n/bn.js +59 -0
- package/dist/payment/index.d.ts +41 -0
- package/dist/payment/index.js +216 -74
- package/dist/payment/module.d.ts +5353 -1675
- package/dist/payment/module.js +36 -6
- package/dist/payment/settle.js +11 -1
- package/dist/payroll/.kosh/bindings.d.ts +22 -0
- package/dist/payroll/.kosh/bindings.js +15 -0
- package/dist/payroll/.kosh/schema.d.ts +1448 -0
- package/dist/payroll/compute.d.ts +35 -0
- package/dist/payroll/compute.js +398 -0
- package/dist/payroll/demo.d.ts +55 -0
- package/dist/payroll/demo.js +121 -0
- package/dist/payroll/formula.d.ts +62 -0
- package/dist/payroll/formula.js +320 -0
- package/dist/payroll/i18n/bn.d.ts +2 -0
- package/dist/payroll/i18n/bn.js +206 -0
- package/dist/payroll/index.d.ts +230 -0
- package/dist/payroll/index.js +715 -0
- package/dist/{mrp → payroll}/module.d.ts +4294 -2624
- package/dist/payroll/module.js +606 -0
- package/dist/payroll/routes.d.ts +10 -0
- package/dist/payroll/routes.js +112 -0
- package/dist/payroll_account/.kosh/bindings.d.ts +22 -0
- package/dist/payroll_account/.kosh/bindings.js +15 -0
- package/dist/payroll_account/.kosh/schema.d.ts +2887 -0
- package/dist/payroll_account/i18n/bn.d.ts +2 -0
- package/dist/payroll_account/i18n/bn.js +10 -0
- package/dist/payroll_account/index.d.ts +3 -0
- package/dist/payroll_account/index.js +42 -0
- package/dist/payroll_account/module.d.ts +16738 -0
- package/dist/payroll_account/module.js +256 -0
- package/dist/permissions/approvals.d.ts +227 -12
- package/dist/permissions/approvals.js +1421 -67
- package/dist/permissions/index.d.ts +1 -1
- package/dist/permissions/index.js +2 -2
- package/dist/permissions/models.js +364 -13
- package/dist/permissions/routes.d.ts +9 -1
- package/dist/permissions/routes.js +72 -5
- package/dist/permissions/web/ApprovalPanel.d.ts +5 -4
- package/dist/permissions/web/ApprovalPanel.js +75 -11
- package/dist/permissions/web/index.d.ts +6 -4
- package/dist/permissions/web/index.js +13 -4
- package/dist/permissions/web/messages.d.ts +2 -0
- package/dist/permissions/web/messages.js +95 -0
- package/dist/portal/.kosh/bindings.js +1 -1
- package/dist/portal/.kosh/schema.d.ts +2 -1
- package/dist/portal/documents.d.ts +3 -0
- package/dist/portal/documents.js +21 -1
- package/dist/portal/i18n/bn.d.ts +2 -0
- package/dist/portal/i18n/bn.js +33 -0
- package/dist/portal/index.js +3 -1
- package/dist/portal/module.d.ts +20 -0
- package/dist/portal/routes-documents.js +76 -0
- package/dist/pos/.kosh/bindings.js +1 -1
- package/dist/pos/.kosh/schema.d.ts +652 -10
- package/dist/pos/i18n/bn.d.ts +2 -0
- package/dist/pos/i18n/bn.js +133 -0
- package/dist/pos/index.js +87 -1
- package/dist/pos/module.d.ts +6967 -1709
- package/dist/pos/module.js +49 -5
- package/dist/pos/routes.js +80 -7
- package/dist/pos/web/Register.js +2 -5
- package/dist/pos_stock/.kosh/bindings.js +1 -1
- package/dist/pos_stock/.kosh/schema.d.ts +822 -12
- package/dist/pos_stock/i18n/bn.d.ts +2 -0
- package/dist/pos_stock/i18n/bn.js +6 -0
- package/dist/pos_stock/index.js +2 -0
- package/dist/pos_stock/module.d.ts +11241 -2851
- package/dist/product/.kosh/bindings.js +1 -1
- package/dist/product/.kosh/schema.d.ts +203 -1
- package/dist/product/i18n/bn.d.ts +2 -0
- package/dist/product/i18n/bn.js +175 -0
- package/dist/product/index.d.ts +1 -0
- package/dist/product/index.js +301 -1
- package/dist/product/module.d.ts +1727 -0
- package/dist/product/module.js +67 -6
- package/dist/product/pricelist.d.ts +575 -0
- package/dist/product/pricelist.js +257 -0
- package/dist/product/variants.d.ts +908 -0
- package/dist/product/variants.js +251 -0
- package/dist/production/.kosh/bindings.d.ts +22 -0
- package/dist/production/.kosh/bindings.js +15 -0
- package/dist/production/.kosh/schema.d.ts +2345 -0
- package/dist/{mrp → production}/demo.d.ts +1 -1
- package/dist/{mrp → production}/demo.js +5 -5
- package/dist/production/depth.d.ts +790 -0
- package/dist/production/depth.js +262 -0
- package/dist/production/i18n/bn.d.ts +2 -0
- package/dist/production/i18n/bn.js +350 -0
- package/dist/production/index.d.ts +6 -0
- package/dist/production/index.js +1256 -0
- package/dist/production/module.d.ts +17327 -0
- package/dist/production/module.js +1333 -0
- package/dist/production/plan.d.ts +921 -0
- package/dist/production/plan.js +511 -0
- package/dist/production/schedule.d.ts +656 -0
- package/dist/production/schedule.js +309 -0
- package/dist/production_account/.kosh/bindings.d.ts +22 -0
- package/dist/production_account/.kosh/bindings.js +15 -0
- package/dist/production_account/.kosh/schema.d.ts +3496 -0
- package/dist/production_account/i18n/bn.d.ts +2 -0
- package/dist/production_account/i18n/bn.js +93 -0
- package/dist/production_account/index.d.ts +4 -0
- package/dist/production_account/index.js +246 -0
- package/dist/production_account/module.d.ts +1192 -0
- package/dist/{mrp_account → production_account}/module.js +72 -18
- package/dist/production_account/overhead.d.ts +1195 -0
- package/dist/production_account/overhead.js +554 -0
- package/dist/project/.kosh/bindings.js +1 -1
- package/dist/project/.kosh/schema.d.ts +735 -1
- package/dist/project/i18n/bn.d.ts +2 -0
- package/dist/project/i18n/bn.js +383 -0
- package/dist/project/index.d.ts +3 -1
- package/dist/project/index.js +1024 -14
- package/dist/project/module.d.ts +9912 -390
- package/dist/project/module.js +1590 -14
- package/dist/project/routes.d.ts +44 -0
- package/dist/project/routes.js +314 -0
- package/dist/project/schedule.d.ts +72 -0
- package/dist/project/schedule.js +192 -0
- package/dist/project/web/Refresh.d.ts +8 -0
- package/dist/project/web/Refresh.js +29 -0
- package/dist/project/web/Schedule.d.ts +9 -0
- package/dist/project/web/Schedule.js +93 -0
- package/dist/project/web/Structure.d.ts +8 -0
- package/dist/project/web/Structure.js +86 -0
- package/dist/project/web/Workload.d.ts +8 -0
- package/dist/project/web/Workload.js +43 -0
- package/dist/project/web/index.d.ts +14 -0
- package/dist/project/web/index.js +25 -0
- package/dist/project/web/messages.d.ts +2 -0
- package/dist/project/web/messages.js +85 -0
- package/dist/project_account/.kosh/bindings.d.ts +22 -0
- package/dist/project_account/.kosh/bindings.js +15 -0
- package/dist/project_account/.kosh/schema.d.ts +2763 -0
- package/dist/project_account/i18n/bn.d.ts +2 -0
- package/dist/project_account/i18n/bn.js +6 -0
- package/dist/project_account/index.d.ts +3 -0
- package/dist/project_account/index.js +29 -0
- package/dist/project_account/module.d.ts +15013 -0
- package/dist/project_account/module.js +76 -0
- package/dist/project_portal/.kosh/bindings.js +1 -1
- package/dist/project_portal/.kosh/schema.d.ts +735 -1
- package/dist/project_portal/i18n/bn.d.ts +2 -0
- package/dist/project_portal/i18n/bn.js +6 -0
- package/dist/project_portal/index.js +2 -0
- package/dist/project_portal/module.d.ts +4796 -87
- package/dist/project_purchase/.kosh/bindings.d.ts +22 -0
- package/dist/project_purchase/.kosh/bindings.js +15 -0
- package/dist/project_purchase/.kosh/schema.d.ts +3393 -0
- package/dist/project_purchase/i18n/bn.d.ts +2 -0
- package/dist/project_purchase/i18n/bn.js +4 -0
- package/dist/project_purchase/index.d.ts +9 -0
- package/dist/project_purchase/index.js +24 -0
- package/dist/project_purchase/module.d.ts +38613 -0
- package/dist/project_purchase/module.js +56 -0
- package/dist/purchase/.kosh/bindings.js +1 -1
- package/dist/purchase/.kosh/schema.d.ts +908 -5
- package/dist/purchase/comparison.d.ts +993 -0
- package/dist/purchase/comparison.js +415 -0
- package/dist/purchase/extras.d.ts +1509 -0
- package/dist/purchase/extras.js +445 -0
- package/dist/purchase/i18n/bn.d.ts +2 -0
- package/dist/purchase/i18n/bn.js +413 -0
- package/dist/purchase/index.d.ts +5 -0
- package/dist/purchase/index.js +1280 -4
- package/dist/purchase/module.d.ts +7147 -395
- package/dist/purchase/module.js +303 -10
- package/dist/purchase/request.d.ts +696 -0
- package/dist/purchase/request.js +446 -0
- package/dist/purchase/tender.d.ts +1208 -0
- package/dist/purchase/tender.js +507 -0
- package/dist/purchase/vendorprice.d.ts +340 -0
- package/dist/purchase/vendorprice.js +153 -0
- package/dist/purchase_account/.kosh/bindings.js +1 -1
- package/dist/purchase_account/.kosh/schema.d.ts +1209 -16
- package/dist/purchase_account/i18n/bn.d.ts +2 -0
- package/dist/purchase_account/i18n/bn.js +22 -0
- package/dist/purchase_account/index.js +20 -0
- package/dist/purchase_account/module.d.ts +12232 -2028
- package/dist/purchase_account/module.js +252 -9
- package/dist/purchase_portal/.kosh/bindings.js +1 -1
- package/dist/purchase_portal/.kosh/schema.d.ts +908 -5
- package/dist/purchase_portal/i18n/bn.d.ts +2 -0
- package/dist/purchase_portal/i18n/bn.js +5 -0
- package/dist/purchase_portal/index.js +2 -0
- package/dist/purchase_portal/module.d.ts +6853 -352
- package/dist/purchase_stock/.kosh/bindings.js +1 -1
- package/dist/purchase_stock/.kosh/schema.d.ts +1096 -21
- package/dist/purchase_stock/i18n/bn.d.ts +2 -0
- package/dist/purchase_stock/i18n/bn.js +19 -0
- package/dist/purchase_stock/index.d.ts +2 -2
- package/dist/purchase_stock/index.js +38 -2
- package/dist/purchase_stock/module.d.ts +12930 -1612
- package/dist/purchase_stock/module.js +317 -9
- package/dist/purchase_stock/scorecard.d.ts +22 -0
- package/dist/purchase_stock/scorecard.js +77 -0
- package/dist/purchase_stock/web/Scorecard.d.ts +7 -0
- package/dist/purchase_stock/web/Scorecard.js +22 -0
- package/dist/purchase_stock/web/index.d.ts +11 -0
- package/dist/purchase_stock/web/index.js +16 -0
- package/dist/purchase_stock/web/messages.d.ts +2 -0
- package/dist/purchase_stock/web/messages.js +27 -0
- package/dist/purchase_stock_account/.kosh/bindings.js +1 -1
- package/dist/purchase_stock_account/.kosh/schema.d.ts +1444 -20
- package/dist/purchase_stock_account/i18n/bn.d.ts +2 -0
- package/dist/purchase_stock_account/i18n/bn.js +8 -0
- package/dist/purchase_stock_account/index.js +18 -0
- package/dist/purchase_stock_account/module.d.ts +7 -35346
- package/dist/purchase_stock_account/module.js +35 -8
- package/dist/recruitment/.kosh/bindings.js +1 -1
- package/dist/recruitment/.kosh/schema.d.ts +60 -1
- package/dist/recruitment/i18n/bn.d.ts +2 -0
- package/dist/recruitment/i18n/bn.js +93 -0
- package/dist/recruitment/index.js +64 -0
- package/dist/recruitment/module.d.ts +460 -8
- package/dist/recruitment/module.js +13 -4
- package/dist/reporting/documents.d.ts +5 -0
- package/dist/reporting/documents.js +11 -1
- package/dist/reporting/index.d.ts +1 -1
- package/dist/reporting/index.js +1 -1
- package/dist/reporting/web/CalendarView.d.ts +18 -5
- package/dist/reporting/web/CalendarView.js +163 -29
- package/dist/reporting/web/messages.js +18 -0
- package/dist/sale_account/.kosh/bindings.js +1 -1
- package/dist/sale_account/.kosh/schema.d.ts +763 -18
- package/dist/sale_account/i18n/bn.d.ts +2 -0
- package/dist/sale_account/i18n/bn.js +48 -0
- package/dist/sale_account/index.d.ts +1 -1
- package/dist/sale_account/index.js +102 -4
- package/dist/sale_account/module.d.ts +8241 -2052
- package/dist/sale_account/module.js +535 -46
- package/dist/sale_crm/.kosh/bindings.d.ts +22 -0
- package/dist/sale_crm/.kosh/bindings.js +15 -0
- package/dist/{mrp → sale_crm}/.kosh/schema.d.ts +391 -494
- package/dist/sale_crm/i18n/bn.d.ts +2 -0
- package/dist/sale_crm/i18n/bn.js +9 -0
- package/dist/sale_crm/index.d.ts +7 -0
- package/dist/sale_crm/index.js +104 -0
- package/dist/sale_crm/module.d.ts +5609 -0
- package/dist/sale_crm/module.js +73 -0
- package/dist/sale_portal/.kosh/bindings.js +1 -1
- package/dist/sale_portal/.kosh/schema.d.ts +292 -4
- package/dist/sale_portal/i18n/bn.d.ts +2 -0
- package/dist/sale_portal/i18n/bn.js +7 -0
- package/dist/sale_portal/index.js +10 -0
- package/dist/sale_portal/module.d.ts +2563 -292
- package/dist/sale_project/.kosh/bindings.js +1 -1
- package/dist/sale_project/.kosh/schema.d.ts +1025 -4
- package/dist/sale_project/i18n/bn.d.ts +2 -0
- package/dist/sale_project/i18n/bn.js +12 -0
- package/dist/sale_project/index.js +2 -0
- package/dist/sale_project/module.d.ts +9280 -762
- package/dist/sale_project/module.js +17 -1
- package/dist/sale_stock/.kosh/bindings.js +1 -1
- package/dist/sale_stock/.kosh/schema.d.ts +463 -6
- package/dist/sale_stock/i18n/bn.d.ts +2 -0
- package/dist/sale_stock/i18n/bn.js +15 -0
- package/dist/sale_stock/index.js +2 -0
- package/dist/sale_stock/module.d.ts +8355 -1334
- package/dist/sale_stock/module.js +20 -3
- package/dist/sales/.kosh/bindings.js +1 -1
- package/dist/sales/.kosh/schema.d.ts +292 -4
- package/dist/sales/i18n/bn.d.ts +2 -0
- package/dist/sales/i18n/bn.js +128 -0
- package/dist/sales/index.js +124 -5
- package/dist/sales/module.d.ts +3568 -633
- package/dist/sales/module.js +306 -11
- package/dist/server/api/duplicate.d.ts +14 -0
- package/dist/server/api/duplicate.js +75 -0
- package/dist/server/api/explain.d.ts +70 -0
- package/dist/server/api/explain.js +111 -0
- package/dist/server/api/metadata.d.ts +2 -0
- package/dist/server/api/metadata.js +9 -0
- package/dist/server/api/openapi.js +15 -0
- package/dist/server/api/rest.d.ts +1 -0
- package/dist/server/api/rest.js +76 -12
- package/dist/server/api/views.js +1 -1
- package/dist/server/apps.d.ts +16 -1
- package/dist/server/apps.js +164 -2
- package/dist/server/auth/base.js +2 -0
- package/dist/server/auth/service.d.ts +8 -0
- package/dist/server/auth/service.js +19 -0
- package/dist/server/events.d.ts +13 -0
- package/dist/server/events.js +22 -0
- package/dist/server/i18n.d.ts +27 -0
- package/dist/server/i18n.js +143 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +2 -0
- package/dist/server/server.js +6 -0
- package/dist/settings/company.d.ts +3 -1
- package/dist/settings/company.js +26 -5
- package/dist/settings/routes.d.ts +10 -0
- package/dist/settings/routes.js +19 -3
- package/dist/settings/web/AppsPage.d.ts +3 -2
- package/dist/settings/web/AppsPage.js +26 -8
- package/dist/settings/web/CompaniesPage.js +91 -6
- package/dist/settings/web/messages.js +64 -0
- package/dist/sign/.kosh/bindings.d.ts +22 -0
- package/dist/{mrp → sign}/.kosh/bindings.js +2 -2
- package/dist/sign/.kosh/schema.d.ts +991 -0
- package/dist/sign/i18n/bn.d.ts +2 -0
- package/dist/sign/i18n/bn.js +97 -0
- package/dist/sign/index.d.ts +29 -0
- package/dist/sign/index.js +478 -0
- package/dist/sign/module.d.ts +4518 -0
- package/dist/sign/module.js +167 -0
- package/dist/sign/sign.d.ts +82 -0
- package/dist/sign/sign.js +474 -0
- package/dist/stock/.kosh/bindings.js +1 -1
- package/dist/stock/.kosh/schema.d.ts +374 -3
- package/dist/stock/demo.d.ts +2 -1
- package/dist/stock/demo.js +28 -1
- package/dist/stock/i18n/bn.d.ts +2 -0
- package/dist/stock/i18n/bn.js +311 -0
- package/dist/stock/index.d.ts +4 -1
- package/dist/stock/index.js +674 -6
- package/dist/stock/ledger.d.ts +78 -0
- package/dist/stock/ledger.js +582 -0
- package/dist/stock/module.d.ts +6142 -1380
- package/dist/stock/module.js +780 -26
- package/dist/stock/replenish.d.ts +38 -0
- package/dist/stock/replenish.js +191 -0
- package/dist/stock/returns.d.ts +157 -0
- package/dist/stock/returns.js +163 -0
- package/dist/stock/web/Ledger.d.ts +9 -0
- package/dist/stock/web/Ledger.js +108 -0
- package/dist/stock/web/Operations.d.ts +8 -0
- package/dist/stock/web/Operations.js +33 -0
- package/dist/stock/web/Replenishment.d.ts +8 -0
- package/dist/stock/web/Replenishment.js +84 -0
- package/dist/stock/web/ReturnButton.d.ts +7 -0
- package/dist/stock/web/ReturnButton.js +62 -0
- package/dist/stock/web/index.d.ts +7 -2
- package/dist/stock/web/index.js +15 -2
- package/dist/stock/web/messages.js +206 -0
- package/dist/stock_account/.kosh/bindings.js +1 -1
- package/dist/stock_account/.kosh/schema.d.ts +878 -12
- package/dist/stock_account/i18n/bn.d.ts +2 -0
- package/dist/stock_account/i18n/bn.js +73 -0
- package/dist/stock_account/index.d.ts +1 -0
- package/dist/stock_account/index.js +141 -3
- package/dist/stock_account/landed.d.ts +429 -0
- package/dist/stock_account/landed.js +335 -0
- package/dist/stock_account/module.d.ts +12143 -3391
- package/dist/stock_account/module.js +135 -6
- package/dist/stock_account/web/LandedPreview.d.ts +7 -0
- package/dist/stock_account/web/LandedPreview.js +23 -0
- package/dist/stock_account/web/index.d.ts +11 -0
- package/dist/stock_account/web/index.js +16 -0
- package/dist/stock_account/web/messages.d.ts +2 -0
- package/dist/stock_account/web/messages.js +27 -0
- package/dist/todo/i18n/bn.d.ts +2 -0
- package/dist/todo/i18n/bn.js +66 -0
- package/dist/todo/index.js +59 -0
- package/dist/todo/module.d.ts +5 -0
- package/dist/todo/module.js +5 -3
- package/dist/trade_finance/.kosh/bindings.js +1 -1
- package/dist/trade_finance/.kosh/schema.d.ts +2 -1
- package/dist/trade_finance/i18n/bn.d.ts +2 -0
- package/dist/trade_finance/i18n/bn.js +162 -0
- package/dist/trade_finance/index.js +95 -0
- package/dist/trade_finance/module.d.ts +26 -0
- package/dist/trade_finance/module.js +29 -8
- package/dist/trade_finance_account/.kosh/bindings.js +1 -1
- package/dist/trade_finance_account/.kosh/schema.d.ts +651 -10
- package/dist/trade_finance_account/i18n/bn.d.ts +2 -0
- package/dist/trade_finance_account/i18n/bn.js +27 -0
- package/dist/trade_finance_account/index.js +3 -0
- package/dist/trade_finance_account/module.d.ts +5129 -1509
- package/dist/trade_finance_account/module.js +2 -0
- package/dist/trade_finance_purchase/.kosh/bindings.js +1 -1
- package/dist/trade_finance_purchase/.kosh/schema.d.ts +908 -5
- package/dist/trade_finance_purchase/i18n/bn.d.ts +2 -0
- package/dist/trade_finance_purchase/i18n/bn.js +6 -0
- package/dist/trade_finance_purchase/index.js +2 -0
- package/dist/trade_finance_purchase/module.d.ts +6909 -408
- package/dist/trade_finance_sale/.kosh/bindings.js +1 -1
- package/dist/trade_finance_sale/.kosh/schema.d.ts +292 -4
- package/dist/trade_finance_sale/i18n/bn.d.ts +2 -0
- package/dist/trade_finance_sale/i18n/bn.js +6 -0
- package/dist/trade_finance_sale/index.js +2 -0
- package/dist/trade_finance_sale/module.d.ts +2602 -331
- package/dist/ui/api.d.ts +2 -0
- package/dist/ui/app.d.ts +9 -0
- package/dist/ui/app.js +47 -15
- package/dist/ui/components/AppIcon.js +9 -2
- package/dist/ui/components/Explain.d.ts +69 -0
- package/dist/ui/components/Explain.js +62 -0
- package/dist/ui/context.d.ts +8 -1
- package/dist/ui/context.js +34 -1
- package/dist/ui/i18n/messages.d.ts +40 -0
- package/dist/ui/i18n/messages.js +80 -0
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.js +1 -0
- package/dist/ui/registry.d.ts +14 -0
- package/dist/ui/registry.js +10 -0
- package/dist/ui/views/FormView.d.ts +6 -0
- package/dist/ui/views/FormView.js +51 -12
- package/dist/ui/views/KanbanView.js +9 -1
- package/dist/ui/views/ListView.d.ts +8 -0
- package/dist/ui/views/ListView.js +14 -5
- package/dist/ui/views/StatsRow.js +2 -1
- package/dist/ui/views/widgets.js +7 -1
- package/dist/views/extend.js +12 -0
- package/dist/views/types.d.ts +13 -2
- package/dist/views/validate.js +8 -1
- package/dist/website/.kosh/bindings.js +1 -1
- package/dist/website/.kosh/schema.d.ts +2 -1
- package/dist/website/i18n/bn.d.ts +2 -0
- package/dist/website/i18n/bn.js +113 -0
- package/dist/website/index.js +37 -0
- package/dist/website/module.d.ts +20 -0
- package/dist/website/module.js +30 -5
- package/dist/website_crm/.kosh/bindings.js +1 -1
- package/dist/website_crm/.kosh/schema.d.ts +3 -1
- package/dist/website_crm/i18n/bn.d.ts +2 -0
- package/dist/website_crm/i18n/bn.js +5 -0
- package/dist/website_crm/index.js +2 -0
- package/dist/website_crm/module.d.ts +41 -0
- package/dist/website_sale/.kosh/bindings.d.ts +22 -0
- package/dist/website_sale/.kosh/bindings.js +15 -0
- package/dist/website_sale/.kosh/schema.d.ts +2909 -0
- package/dist/website_sale/couriers.d.ts +50 -0
- package/dist/website_sale/couriers.js +59 -0
- package/dist/website_sale/demo.d.ts +7 -0
- package/dist/website_sale/demo.js +90 -0
- package/dist/website_sale/growth.d.ts +31 -0
- package/dist/website_sale/growth.js +163 -0
- package/dist/website_sale/i18n/bn.d.ts +2 -0
- package/dist/website_sale/i18n/bn.js +132 -0
- package/dist/website_sale/index.d.ts +49 -0
- package/dist/website_sale/index.js +620 -0
- package/dist/website_sale/module.d.ts +35182 -0
- package/dist/website_sale/module.js +419 -0
- package/dist/website_sale/shipments.d.ts +16 -0
- package/dist/website_sale/shipments.js +113 -0
- package/dist/website_sale/shop.d.ts +81 -0
- package/dist/website_sale/shop.js +662 -0
- package/dist/website_sale_stock/.kosh/bindings.d.ts +22 -0
- package/dist/website_sale_stock/.kosh/bindings.js +15 -0
- package/dist/website_sale_stock/.kosh/schema.d.ts +3400 -0
- package/dist/website_sale_stock/i18n/bn.d.ts +2 -0
- package/dist/website_sale_stock/i18n/bn.js +4 -0
- package/dist/website_sale_stock/index.d.ts +9 -0
- package/dist/website_sale_stock/index.js +22 -0
- package/dist/website_sale_stock/module.d.ts +11 -0
- package/dist/website_sale_stock/module.js +32 -0
- package/package.json +117 -8
- package/dist/mrp/index.d.ts +0 -3
- package/dist/mrp/index.js +0 -392
- package/dist/mrp/module.js +0 -695
- package/dist/mrp_account/index.d.ts +0 -3
- package/dist/mrp_account/index.js +0 -22
- /package/dist/{mrp → account_asset}/.kosh/bindings.d.ts +0 -0
- /package/dist/{mrp_account → account_budget}/.kosh/bindings.d.ts +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The Approvals inbox (RFC 0025 §3.1): what waits for me, as cards — the record and its app, who asked and how long
|
|
4
|
+
* ago, every level of the round as a step with its votes —, decided one by one (approve, reject or send back, with a
|
|
5
|
+
* comment; a reason is needed for the last two) or many at once. Keyboard: J / K move, A approves, R rejects, X
|
|
6
|
+
* selects. The server decides who may decide what; this page shows and sends.
|
|
7
|
+
*/
|
|
8
|
+
import { Alert, Badge, Button, Checkbox, EmptyState, Textarea, useKosh, } from '../../ui/index.js';
|
|
9
|
+
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
10
|
+
import { useEffect, useId, useState } from 'react';
|
|
11
|
+
import { useTranslation } from 'react-i18next';
|
|
12
|
+
import { ago, cardsQuery, Steps, waitedTone } from './shared.js';
|
|
13
|
+
export function Inbox({ api }) {
|
|
14
|
+
const { t } = useTranslation('approvals');
|
|
15
|
+
const { format } = useKosh();
|
|
16
|
+
const id = useId();
|
|
17
|
+
const client = useQueryClient();
|
|
18
|
+
const cards = useQuery(cardsQuery(api, 'inbox'));
|
|
19
|
+
const stats = useQuery({
|
|
20
|
+
queryKey: ['approvals', 'stats'],
|
|
21
|
+
queryFn: () => api.call('GET', '/api/v1/approvals/stats'),
|
|
22
|
+
});
|
|
23
|
+
const routes = useQuery({ queryKey: ['routes'], queryFn: () => api.routes() });
|
|
24
|
+
const [selected, setSelected] = useState(new Set());
|
|
25
|
+
const [focus, setFocus] = useState(0);
|
|
26
|
+
const [comments, setComments] = useState({});
|
|
27
|
+
const [message, setMessage] = useState(null);
|
|
28
|
+
const rows = cards.data ?? [];
|
|
29
|
+
const refresh = async () => {
|
|
30
|
+
await client.invalidateQueries({ queryKey: ['approvals'] });
|
|
31
|
+
await client.invalidateQueries({ queryKey: ['home', 'approvals'] });
|
|
32
|
+
};
|
|
33
|
+
const decide = useMutation({
|
|
34
|
+
mutationFn: ({ request, decision }) => api.call('POST', `/api/v1/approvals/requests/${request}/${decision}`, {
|
|
35
|
+
comment: comments[request] ?? '',
|
|
36
|
+
}),
|
|
37
|
+
onSuccess: async (_r, v) => {
|
|
38
|
+
setMessage(t(`done.${v.decision}`));
|
|
39
|
+
await refresh();
|
|
40
|
+
},
|
|
41
|
+
onError: (e) => setMessage(e.message),
|
|
42
|
+
});
|
|
43
|
+
const bulk = useMutation({
|
|
44
|
+
mutationFn: () => api.call('POST', '/api/v1/approvals/bulk', { requests: [...selected], decision: 'approve' }),
|
|
45
|
+
onSuccess: async (r) => {
|
|
46
|
+
setMessage(t('bulkDone', { count: r.approved, failed: r.failed.length }));
|
|
47
|
+
setSelected(new Set());
|
|
48
|
+
await refresh();
|
|
49
|
+
},
|
|
50
|
+
onError: (e) => setMessage(e.message),
|
|
51
|
+
});
|
|
52
|
+
// Keyboard: J / K move, A approves, R rejects (with the comment typed), X selects.
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
const onKey = (e) => {
|
|
55
|
+
const target = e.target;
|
|
56
|
+
if (target !== null && ['INPUT', 'TEXTAREA'].includes(target.tagName))
|
|
57
|
+
return;
|
|
58
|
+
const card = rows[focus];
|
|
59
|
+
if (e.key === 'j')
|
|
60
|
+
setFocus((f) => Math.min(f + 1, rows.length - 1));
|
|
61
|
+
else if (e.key === 'k')
|
|
62
|
+
setFocus((f) => Math.max(f - 1, 0));
|
|
63
|
+
else if (card === undefined)
|
|
64
|
+
return;
|
|
65
|
+
else if (e.key === 'a')
|
|
66
|
+
decide.mutate({ request: card.id, decision: 'approve' });
|
|
67
|
+
else if (e.key === 'r' && (comments[card.id] ?? '').trim() !== '')
|
|
68
|
+
decide.mutate({ request: card.id, decision: 'reject' });
|
|
69
|
+
else if (e.key === 'x')
|
|
70
|
+
setSelected((s) => {
|
|
71
|
+
const next = new Set(s);
|
|
72
|
+
if (next.has(card.id))
|
|
73
|
+
next.delete(card.id);
|
|
74
|
+
else
|
|
75
|
+
next.add(card.id);
|
|
76
|
+
return next;
|
|
77
|
+
});
|
|
78
|
+
else
|
|
79
|
+
return;
|
|
80
|
+
e.preventDefault();
|
|
81
|
+
};
|
|
82
|
+
window.addEventListener('keydown', onKey);
|
|
83
|
+
return () => window.removeEventListener('keydown', onKey);
|
|
84
|
+
}, [rows, focus, comments, decide]);
|
|
85
|
+
const link = (c) => {
|
|
86
|
+
const route = routes.data?.[c.record.model];
|
|
87
|
+
return route?.app === undefined ? null : `/${route.app}/a/${route.action}/${c.record.id}`;
|
|
88
|
+
};
|
|
89
|
+
return (_jsxs("div", { className: "grid gap-4 p-4", children: [_jsxs("header", { className: "flex flex-wrap items-center gap-3", children: [_jsx("h1", { className: "text-xl font-semibold", children: t('inbox.title') }), _jsx(Badge, { tone: "neutral", children: rows.length }), _jsx("p", { className: "w-full text-sm text-muted-foreground", children: t('inbox.hint') })] }), stats.data === undefined ? null : (_jsx("dl", { className: "grid grid-cols-2 gap-3 md:grid-cols-4", children: [
|
|
90
|
+
['waiting', String(stats.data.waiting), 'neutral'],
|
|
91
|
+
[
|
|
92
|
+
'overdue',
|
|
93
|
+
String(stats.data.overdue),
|
|
94
|
+
stats.data.overdue > 0 ? 'danger' : 'neutral',
|
|
95
|
+
],
|
|
96
|
+
['decided', String(stats.data.decidedThisMonth), 'neutral'],
|
|
97
|
+
[
|
|
98
|
+
'median',
|
|
99
|
+
stats.data.medianHours === null ? '—' : t('hours', { n: stats.data.medianHours }),
|
|
100
|
+
'neutral',
|
|
101
|
+
],
|
|
102
|
+
].map(([key, value, tone]) => (_jsxs("div", { className: "rounded-lg border bg-surface p-3", children: [_jsx("dt", { className: "text-xs text-muted-foreground", children: t(`stats.${key}`) }), _jsx("dd", { className: `text-2xl font-semibold tabular-nums ${tone === 'danger' ? 'text-danger' : ''}`, children: value })] }, key))) })), rows.length === 0 ? null : (_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Checkbox, { id: `${id}-all`, checked: selected.size === rows.length && rows.length > 0, onCheckedChange: (c) => setSelected(c === true ? new Set(rows.map((r) => r.id)) : new Set()) }), _jsx("label", { htmlFor: `${id}-all`, className: "text-sm", children: t('inbox.selectAll') }), _jsx(Button, { variant: "primary", disabled: selected.size === 0 || bulk.isPending, onClick: () => bulk.mutate(), children: t('inbox.approveSelected', { count: selected.size }) })] })), message === null ? null : _jsx(Alert, { tone: "info", children: message }), cards.isLoading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('loading') })) : rows.length === 0 ? (_jsx(EmptyState, { title: t('inbox.empty'), description: t('inbox.emptyHint') })) : (_jsx("ul", { className: "grid gap-3", children: rows.map((c, i) => {
|
|
103
|
+
const href = link(c);
|
|
104
|
+
const comment = comments[c.id] ?? '';
|
|
105
|
+
return (_jsxs("li", { "aria-current": i === focus ? 'true' : undefined, className: `grid gap-3 rounded-lg border bg-surface p-4 ${i === focus ? 'ring-2 ring-accent' : ''}`, children: [_jsxs("div", { className: "flex flex-wrap items-start gap-3", children: [_jsx(Checkbox, { "aria-label": t('inbox.select', { name: c.record.name }), checked: selected.has(c.id), onCheckedChange: (v) => setSelected((s) => {
|
|
106
|
+
const next = new Set(s);
|
|
107
|
+
if (v === true)
|
|
108
|
+
next.add(c.id);
|
|
109
|
+
else
|
|
110
|
+
next.delete(c.id);
|
|
111
|
+
return next;
|
|
112
|
+
}) }), _jsxs("div", { className: "grid min-w-0 flex-1 gap-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [href === null ? (_jsx("span", { className: "font-semibold", children: c.record.name })) : (_jsx("a", { href: href, className: "font-semibold underline-offset-2 hover:underline", children: c.record.name })), _jsx(Badge, { tone: "neutral", children: c.record.label }), _jsx(Badge, { tone: waitedTone(c), children: t('waiting', { since: ago(format.locale, c.waitingSince) }) }), c.dueAt === null ? null : (_jsx(Badge, { tone: Date.parse(c.dueAt) < Date.now() ? 'danger' : 'info', children: t('due', { when: ago(format.locale, c.dueAt) }) })), c.escalatedTo === null ? null : (_jsx(Badge, { tone: "danger", children: t('escalated') }))] }), _jsxs("p", { className: "text-sm text-muted-foreground", children: [t('askedBy', { name: c.requester?.name ?? '—' }), " \u00B7 ", c.levelName, c.required > 1 ? ` · ${t('votes', { n: c.approvals, of: c.required })}` : '', c.round > 1 ? ` · ${t('round', { n: c.round })}` : ''] })] })] }), _jsx(Steps, { steps: c.steps }), _jsx(Textarea, { "aria-label": t('comment', { name: c.record.name }), placeholder: t('commentHint'), value: comment, onChange: (e) => setComments((m) => ({ ...m, [c.id]: e.target.value })) }), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { variant: "primary", disabled: decide.isPending, onClick: () => decide.mutate({ request: c.id, decision: 'approve' }), children: t('approve') }), _jsx(Button, { disabled: decide.isPending || comment.trim() === '', onClick: () => decide.mutate({ request: c.id, decision: 'send-back' }), children: t('sendBack') }), _jsx(Button, { variant: "danger", disabled: decide.isPending || comment.trim() === '', onClick: () => decide.mutate({ request: c.id, decision: 'reject' }), children: t('reject') })] })] }, c.id));
|
|
113
|
+
}) }))] }));
|
|
114
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The matrix (RFC 0027 §2.7): the requests of a period the user decides — directly (named, or holding the role) or
|
|
3
|
+
* for others (as a backup, or for someone away) — a card per policy with what waits, what was approved and what was
|
|
4
|
+
* rejected; for Approvals managers also how long each level takes and who has the most requests late. The waiting
|
|
5
|
+
* counts open the inbox.
|
|
6
|
+
*/
|
|
7
|
+
import { type PageProps } from '../../ui/index.js';
|
|
8
|
+
import { type ReactElement } from 'react';
|
|
9
|
+
export declare function Matrix({ api, label }: PageProps): ReactElement;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The matrix (RFC 0027 §2.7): the requests of a period the user decides — directly (named, or holding the role) or
|
|
4
|
+
* for others (as a backup, or for someone away) — a card per policy with what waits, what was approved and what was
|
|
5
|
+
* rejected; for Approvals managers also how long each level takes and who has the most requests late. The waiting
|
|
6
|
+
* counts open the inbox.
|
|
7
|
+
*/
|
|
8
|
+
import { Badge, Card, EmptyState, Select } from '../../ui/index.js';
|
|
9
|
+
import { useQuery } from '@tanstack/react-query';
|
|
10
|
+
import { useId, useState } from 'react';
|
|
11
|
+
import { useTranslation } from 'react-i18next';
|
|
12
|
+
const PERIODS = ['7d', '30d', '3m', '6m', '1y', 'all'];
|
|
13
|
+
export function Matrix({ api, label }) {
|
|
14
|
+
const { t } = useTranslation('approvals');
|
|
15
|
+
const id = useId();
|
|
16
|
+
const [period, setPeriod] = useState('3m');
|
|
17
|
+
const [mode, setMode] = useState('direct');
|
|
18
|
+
const data = useQuery({
|
|
19
|
+
queryKey: ['approvals', 'matrix', period, mode],
|
|
20
|
+
queryFn: () => api.call('GET', `/api/v1/approvals/matrix?period=${period}&mode=${mode}`),
|
|
21
|
+
});
|
|
22
|
+
const m = data.data;
|
|
23
|
+
return (_jsxs("div", { className: "grid gap-4 p-4", children: [_jsxs("header", { className: "flex flex-wrap items-end justify-between gap-3", children: [_jsx("h1", { className: "text-xl font-semibold", children: label ?? t('matrix.title') }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("div", { role: "tablist", "aria-label": t('matrix.mode'), className: "flex rounded-md border p-0.5", children: ['direct', 'delegated'].map((k) => (_jsxs("button", { type: "button", role: "tab", "aria-selected": mode === k, className: `rounded px-3 py-1 text-sm ${mode === k ? 'bg-primary text-primary-foreground' : 'text-foreground hover:bg-muted'}`, onClick: () => setMode(k), children: [t(`matrix.${k}`), _jsx(Badge, { tone: "neutral", className: "ms-2", children: k === 'direct' ? (m?.direct ?? 0) : (m?.delegated ?? 0) })] }, k))) }), _jsx(Select, { id: `${id}-period`, label: t('matrix.period'), value: period, options: PERIODS.map((p) => ({ value: p, label: t(`matrix.periods.${p}`) })), onChange: (v) => setPeriod(v) })] })] }), m === undefined ? (_jsx(EmptyState, { title: t('loading') })) : m.cards.length === 0 ? (_jsx(EmptyState, { title: t('matrix.empty') })) : (_jsx("ul", { className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-3", children: m.cards.map((c) => (_jsx("li", { children: _jsxs(Card, { className: "grid gap-3 p-4", children: [_jsx("h2", { className: "font-medium", children: c.title }), _jsxs("dl", { className: "grid grid-cols-3 gap-2 text-center", children: [_jsxs("div", { children: [_jsx("dt", { className: "text-xs text-muted-foreground", children: t('matrix.waiting') }), _jsx("dd", { className: "text-lg font-semibold tabular-nums", children: c.waiting > 0 ? (_jsx("a", { className: "text-primary underline-offset-4 hover:underline", href: "/approvals/a/approvals.action_inbox", children: c.waiting })) : (0) })] }), _jsxs("div", { children: [_jsx("dt", { className: "text-xs text-muted-foreground", children: t('matrix.approved') }), _jsx("dd", { className: "text-lg font-semibold tabular-nums text-success", children: c.approved })] }), _jsxs("div", { children: [_jsx("dt", { className: "text-xs text-muted-foreground", children: t('matrix.rejected') }), _jsx("dd", { className: "text-lg font-semibold tabular-nums text-danger", children: c.rejected })] })] })] }) }, String(c.policy)))) })), m?.levels === null || m?.levels === undefined || m.levels.length === 0 ? null : (_jsxs("section", { "aria-labelledby": `${id}-levels`, className: "grid gap-2", children: [_jsx("h2", { id: `${id}-levels`, className: "font-semibold", children: t('matrix.levels') }), _jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted", children: _jsxs("tr", { children: [_jsx("th", { className: "px-2 py-1 text-start", children: t('matrix.policy') }), _jsx("th", { className: "px-2 py-1 text-start", children: t('matrix.level') }), _jsx("th", { className: "px-2 py-1 text-end", children: t('matrix.decided') }), _jsx("th", { className: "px-2 py-1 text-end", children: t('matrix.hours') })] }) }), _jsx("tbody", { children: m.levels.map((l) => (_jsxs("tr", { className: "border-b", children: [_jsx("td", { className: "px-2 py-1", children: l.policy }), _jsx("td", { className: "px-2 py-1", children: l.level }), _jsx("td", { className: "px-2 py-1 text-end tabular-nums", children: l.decided }), _jsx("td", { className: "px-2 py-1 text-end tabular-nums", children: l.averageHours })] }, `${l.policy}-${l.level}`))) })] }) })] })), m?.bottlenecks === null ||
|
|
24
|
+
m?.bottlenecks === undefined ||
|
|
25
|
+
m.bottlenecks.length === 0 ? null : (_jsxs("section", { "aria-labelledby": `${id}-late`, className: "grid gap-2", children: [_jsx("h2", { id: `${id}-late`, className: "font-semibold", children: t('matrix.bottlenecks') }), _jsx("ul", { className: "grid gap-1 text-sm", children: m.bottlenecks.map((b) => (_jsxs("li", { className: "flex items-center justify-between gap-2 border-b py-1", children: [_jsx("span", { children: b.name }), _jsxs("span", { className: "flex gap-2", children: [b.late > 0 ? (_jsx(Badge, { tone: "danger", children: t('matrix.late', { count: b.late }) })) : null, _jsx(Badge, { tone: "neutral", children: t('matrix.waitingCount', { count: b.waiting }) })] })] }, b.user))) })] }))] }));
|
|
26
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* My requests (RFC 0025 §3.1): what I asked to be approved, where each stands — every level as a step, since when —,
|
|
3
|
+
* withdrawn while it waits.
|
|
4
|
+
*/
|
|
5
|
+
import { type PageProps } from '../../ui/index.js';
|
|
6
|
+
import { type ReactElement } from 'react';
|
|
7
|
+
export declare function Mine({ api }: PageProps): ReactElement;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* My requests (RFC 0025 §3.1): what I asked to be approved, where each stands — every level as a step, since when —,
|
|
4
|
+
* withdrawn while it waits.
|
|
5
|
+
*/
|
|
6
|
+
import { Alert, Badge, Button, EmptyState, useKosh } from '../../ui/index.js';
|
|
7
|
+
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
8
|
+
import { useState } from 'react';
|
|
9
|
+
import { useTranslation } from 'react-i18next';
|
|
10
|
+
import { ago, cardsQuery, Steps, TONE } from './shared.js';
|
|
11
|
+
export function Mine({ api }) {
|
|
12
|
+
const { t } = useTranslation('approvals');
|
|
13
|
+
const { format } = useKosh();
|
|
14
|
+
const client = useQueryClient();
|
|
15
|
+
const cards = useQuery(cardsQuery(api, 'mine'));
|
|
16
|
+
const [message, setMessage] = useState(null);
|
|
17
|
+
const withdraw = useMutation({
|
|
18
|
+
mutationFn: ({ model, id }) => api.call('POST', `/api/v1/approvals/${model}/${id}/withdraw`),
|
|
19
|
+
onSuccess: async () => {
|
|
20
|
+
setMessage(t('done.withdrawn'));
|
|
21
|
+
await client.invalidateQueries({ queryKey: ['approvals'] });
|
|
22
|
+
},
|
|
23
|
+
onError: (e) => setMessage(e.message),
|
|
24
|
+
});
|
|
25
|
+
const rows = cards.data ?? [];
|
|
26
|
+
return (_jsxs("div", { className: "grid gap-4 p-4", children: [_jsx("h1", { className: "text-xl font-semibold", children: t('mine.title') }), message === null ? null : _jsx(Alert, { tone: "info", children: message }), rows.length === 0 ? (_jsx(EmptyState, { title: cards.isLoading ? t('loading') : t('mine.empty') })) : (_jsx("ul", { className: "grid gap-3", children: rows.map((c) => (_jsxs("li", { className: "grid gap-2 rounded-lg border bg-surface p-4", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "font-semibold", children: c.record.name }), _jsx(Badge, { tone: "neutral", children: c.record.label }), _jsx(Badge, { tone: TONE[c.state], children: t(`state.${c.state}`) }), _jsx("span", { className: "text-sm text-muted-foreground", children: t('asked', { since: ago(format.locale, c.waitingSince) }) })] }), _jsx(Steps, { steps: c.steps }), c.comment === null ? null : (_jsxs("p", { className: "text-sm", children: [_jsx("span", { className: "text-muted-foreground", children: t('saidWhy') }), " \u201C", c.comment, "\u201D"] })), c.state !== 'pending' ? null : (_jsx("div", { children: _jsx(Button, { disabled: withdraw.isPending, onClick: () => withdraw.mutate({ model: c.record.model, id: c.record.id }), children: t('withdraw') }) }))] }, `${c.record.model}:${c.record.id}`))) }))] }));
|
|
27
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
* The web contribution of `shutro-erp/approvals`: the inbox, my requests and what I decided; the policy preview and a request category's policy.
|
|
4
|
+
*/
|
|
5
|
+
import { type Registry } from '../../ui/index.js';
|
|
6
|
+
import type { i18n } from 'i18next';
|
|
7
|
+
import { messages } from './messages.js';
|
|
8
|
+
export { CategoryPolicy, PolicyPreview } from './Config.js';
|
|
9
|
+
export { History } from './History.js';
|
|
10
|
+
export { Inbox } from './Inbox.js';
|
|
11
|
+
export { Matrix } from './Matrix.js';
|
|
12
|
+
export { Mine } from './Mine.js';
|
|
13
|
+
/** Registers the pages (and the messages in `i18n`, when given). */
|
|
14
|
+
export declare function registerApprovalsWeb(registry: Registry, i18n?: i18n): Registry;
|
|
15
|
+
export { messages as approvalsMessages };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
* The web contribution of `shutro-erp/approvals`: the inbox, my requests and what I decided; the policy preview and a request category's policy.
|
|
4
|
+
*/
|
|
5
|
+
import { addMessages } from '../../ui/index.js';
|
|
6
|
+
import { CategoryPolicy, PolicyPreview } from './Config.js';
|
|
7
|
+
import { History } from './History.js';
|
|
8
|
+
import { Inbox } from './Inbox.js';
|
|
9
|
+
import { Matrix } from './Matrix.js';
|
|
10
|
+
import { Mine } from './Mine.js';
|
|
11
|
+
import { messages } from './messages.js';
|
|
12
|
+
export { CategoryPolicy, PolicyPreview } from './Config.js';
|
|
13
|
+
export { History } from './History.js';
|
|
14
|
+
export { Inbox } from './Inbox.js';
|
|
15
|
+
export { Matrix } from './Matrix.js';
|
|
16
|
+
export { Mine } from './Mine.js';
|
|
17
|
+
/** Registers the pages (and the messages in `i18n`, when given). */
|
|
18
|
+
export function registerApprovalsWeb(registry, i18n) {
|
|
19
|
+
registry.registerPage('approvals.Inbox', Inbox);
|
|
20
|
+
registry.registerPage('approvals.Mine', Mine);
|
|
21
|
+
registry.registerPage('approvals.History', History);
|
|
22
|
+
registry.registerPage('approvals.Matrix', Matrix);
|
|
23
|
+
registry.registerComponent('approvals.PolicyPreview', PolicyPreview);
|
|
24
|
+
registry.registerComponent('approvals.CategoryPolicy', CategoryPolicy);
|
|
25
|
+
if (i18n !== undefined)
|
|
26
|
+
addMessages(i18n, 'approvals', messages);
|
|
27
|
+
return registry;
|
|
28
|
+
}
|
|
29
|
+
export { messages as approvalsMessages };
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/** Messages of the Approvals screens (namespace `approvals`), in English and Bangla. */
|
|
2
|
+
export const messages = {
|
|
3
|
+
en: {
|
|
4
|
+
preview: {
|
|
5
|
+
title: 'What the levels would have asked about',
|
|
6
|
+
explain_one: 'Of the last record of this model (within the policy’s condition):',
|
|
7
|
+
explain_other: 'Of the last {{count}} records of this model (within the policy’s condition):',
|
|
8
|
+
matched_one: '{{matched}} of {{count}}',
|
|
9
|
+
matched_other: '{{matched}} of {{count}}',
|
|
10
|
+
sync: 'Sync waiting requests',
|
|
11
|
+
everyCompany: 'Covers every company.',
|
|
12
|
+
noCompany: 'Covers no company yet: its segment has none.',
|
|
13
|
+
covers: 'Covers {{companies}}.',
|
|
14
|
+
synced_one: '{{count}} waiting request updated.',
|
|
15
|
+
synced_other: '{{count}} waiting requests updated.',
|
|
16
|
+
},
|
|
17
|
+
category: {
|
|
18
|
+
setUp: 'Set up its approvals',
|
|
19
|
+
editLevels: 'Edit who approves (the policy’s levels)',
|
|
20
|
+
},
|
|
21
|
+
loading: 'Loading…',
|
|
22
|
+
steps: 'Approval levels',
|
|
23
|
+
approve: 'Approve',
|
|
24
|
+
reject: 'Reject',
|
|
25
|
+
sendBack: 'Send back for changes',
|
|
26
|
+
withdraw: 'Withdraw',
|
|
27
|
+
comment: 'Comment on {{name}}',
|
|
28
|
+
commentHint: 'A comment (needed to reject or send back)',
|
|
29
|
+
waiting: 'waiting since {{since}}',
|
|
30
|
+
due: 'due {{when}}',
|
|
31
|
+
escalated: 'Escalated: late',
|
|
32
|
+
asked: 'asked {{since}}',
|
|
33
|
+
askedBy: 'Asked by {{name}}',
|
|
34
|
+
votes: '{{n}} of {{of}} approvals',
|
|
35
|
+
round: 'round {{n}}',
|
|
36
|
+
saidWhy: 'Said:',
|
|
37
|
+
bulkDone: '{{count}} approved; {{failed}} could not be.',
|
|
38
|
+
hours: '{{n}} h',
|
|
39
|
+
stats: {
|
|
40
|
+
waiting: 'Waiting for you',
|
|
41
|
+
overdue: 'Waiting over 3 days',
|
|
42
|
+
decided: 'Decided this month',
|
|
43
|
+
median: 'Median time to decide',
|
|
44
|
+
},
|
|
45
|
+
state: {
|
|
46
|
+
pending: 'Waiting',
|
|
47
|
+
approved: 'Approved',
|
|
48
|
+
rejected: 'Rejected',
|
|
49
|
+
sent_back: 'Sent back',
|
|
50
|
+
cancelled: 'Cancelled',
|
|
51
|
+
},
|
|
52
|
+
done: {
|
|
53
|
+
approve: 'Approved.',
|
|
54
|
+
reject: 'Rejected.',
|
|
55
|
+
'send-back': 'Sent back for changes.',
|
|
56
|
+
withdrawn: 'Withdrawn.',
|
|
57
|
+
},
|
|
58
|
+
inbox: {
|
|
59
|
+
title: 'To approve',
|
|
60
|
+
hint: 'J and K move between requests, A approves, R rejects with the comment typed, X selects.',
|
|
61
|
+
selectAll: 'Select all',
|
|
62
|
+
select: 'Select {{name}}',
|
|
63
|
+
approveSelected: 'Approve selected ({{count}})',
|
|
64
|
+
empty: 'Nothing waits for you',
|
|
65
|
+
emptyHint: 'Requests you may decide appear here as soon as someone submits them.',
|
|
66
|
+
},
|
|
67
|
+
mine: { title: 'My requests', empty: 'You have not asked for any approval.' },
|
|
68
|
+
matrix: {
|
|
69
|
+
title: 'Matrix',
|
|
70
|
+
mode: 'Whose decisions',
|
|
71
|
+
direct: 'Mine',
|
|
72
|
+
delegated: 'For others',
|
|
73
|
+
period: 'Period',
|
|
74
|
+
periods: {
|
|
75
|
+
'7d': 'Last 7 days',
|
|
76
|
+
'30d': 'Last 30 days',
|
|
77
|
+
'3m': 'Last 3 months',
|
|
78
|
+
'6m': 'Last 6 months',
|
|
79
|
+
'1y': 'Last year',
|
|
80
|
+
all: 'All time',
|
|
81
|
+
},
|
|
82
|
+
empty: 'No approvals in this period.',
|
|
83
|
+
waiting: 'Waiting',
|
|
84
|
+
approved: 'Approved',
|
|
85
|
+
rejected: 'Rejected',
|
|
86
|
+
levels: 'Time to decide, by level',
|
|
87
|
+
policy: 'Policy',
|
|
88
|
+
level: 'Level',
|
|
89
|
+
decided: 'Decided',
|
|
90
|
+
hours: 'Average hours',
|
|
91
|
+
bottlenecks: 'Who has the most waiting',
|
|
92
|
+
late_one: '{{count}} late',
|
|
93
|
+
late_other: '{{count}} late',
|
|
94
|
+
waitingCount_one: '{{count}} waiting',
|
|
95
|
+
waitingCount_other: '{{count}} waiting',
|
|
96
|
+
},
|
|
97
|
+
history: {
|
|
98
|
+
title: 'What I decided',
|
|
99
|
+
empty: 'You have not decided any request yet.',
|
|
100
|
+
record: 'Record',
|
|
101
|
+
level: 'Level',
|
|
102
|
+
answer: 'Answer',
|
|
103
|
+
comment: 'Comment',
|
|
104
|
+
when: 'When',
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
bn: {
|
|
108
|
+
preview: {
|
|
109
|
+
title: 'স্তরগুলো কোন কোন রেকর্ডে অনুমোদন চাইত',
|
|
110
|
+
explain_one: 'এই মডেলের শেষ রেকর্ডটির মধ্যে (নীতির শর্তের ভেতরে):',
|
|
111
|
+
explain_other: 'এই মডেলের শেষ {{count}}টি রেকর্ডের মধ্যে (নীতির শর্তের ভেতরে):',
|
|
112
|
+
matched_one: '{{count}}টির মধ্যে {{matched}}টি',
|
|
113
|
+
matched_other: '{{count}}টির মধ্যে {{matched}}টি',
|
|
114
|
+
sync: 'অপেক্ষমাণ অনুরোধ মিলিয়ে নিন',
|
|
115
|
+
everyCompany: 'সব প্রতিষ্ঠানে প্রযোজ্য।',
|
|
116
|
+
noCompany: 'এখনো কোনো প্রতিষ্ঠানে প্রযোজ্য নয়: এর সেগমেন্টে কোনো প্রতিষ্ঠান নেই।',
|
|
117
|
+
covers: '{{companies}}-এ প্রযোজ্য।',
|
|
118
|
+
synced_one: '{{count}}টি অপেক্ষমাণ অনুরোধ হালনাগাদ হয়েছে।',
|
|
119
|
+
synced_other: '{{count}}টি অপেক্ষমাণ অনুরোধ হালনাগাদ হয়েছে।',
|
|
120
|
+
},
|
|
121
|
+
category: {
|
|
122
|
+
setUp: 'অনুমোদন ঠিক করুন',
|
|
123
|
+
editLevels: 'কে অনুমোদন দেবেন তা বদলান (নীতির স্তর)',
|
|
124
|
+
},
|
|
125
|
+
loading: 'লোড হচ্ছে…',
|
|
126
|
+
steps: 'অনুমোদনের ধাপ',
|
|
127
|
+
approve: 'অনুমোদন',
|
|
128
|
+
reject: 'প্রত্যাখ্যান',
|
|
129
|
+
sendBack: 'সংশোধনের জন্য ফেরত',
|
|
130
|
+
withdraw: 'প্রত্যাহার',
|
|
131
|
+
comment: '{{name}} সম্পর্কে মন্তব্য',
|
|
132
|
+
commentHint: 'একটি মন্তব্য (প্রত্যাখ্যান বা ফেরত পাঠাতে প্রয়োজন)',
|
|
133
|
+
waiting: '{{since}} থেকে অপেক্ষায়',
|
|
134
|
+
due: 'নির্ধারিত সময় {{when}}',
|
|
135
|
+
escalated: 'দেরি হওয়ায় ঊর্ধ্বতনে পাঠানো',
|
|
136
|
+
asked: '{{since}} চাওয়া হয়েছে',
|
|
137
|
+
askedBy: '{{name}} চেয়েছেন',
|
|
138
|
+
votes: '{{of}}টির মধ্যে {{n}}টি অনুমোদন',
|
|
139
|
+
round: 'পর্ব {{n}}',
|
|
140
|
+
saidWhy: 'বলেছেন:',
|
|
141
|
+
bulkDone: '{{count}}টি অনুমোদিত; {{failed}}টি করা যায়নি।',
|
|
142
|
+
hours: '{{n}} ঘণ্টা',
|
|
143
|
+
stats: {
|
|
144
|
+
waiting: 'আপনার অপেক্ষায়',
|
|
145
|
+
overdue: '৩ দিনের বেশি অপেক্ষায়',
|
|
146
|
+
decided: 'এ মাসে সিদ্ধান্ত',
|
|
147
|
+
median: 'সিদ্ধান্তের গড় সময় (মধ্যমা)',
|
|
148
|
+
},
|
|
149
|
+
state: {
|
|
150
|
+
pending: 'অপেক্ষায়',
|
|
151
|
+
approved: 'অনুমোদিত',
|
|
152
|
+
rejected: 'প্রত্যাখ্যাত',
|
|
153
|
+
sent_back: 'ফেরত পাঠানো',
|
|
154
|
+
cancelled: 'বাতিল',
|
|
155
|
+
},
|
|
156
|
+
done: {
|
|
157
|
+
approve: 'অনুমোদিত হয়েছে।',
|
|
158
|
+
reject: 'প্রত্যাখ্যাত হয়েছে।',
|
|
159
|
+
'send-back': 'সংশোধনের জন্য ফেরত পাঠানো হয়েছে।',
|
|
160
|
+
withdrawn: 'প্রত্যাহার করা হয়েছে।',
|
|
161
|
+
},
|
|
162
|
+
inbox: {
|
|
163
|
+
title: 'অনুমোদনের জন্য',
|
|
164
|
+
hint: 'J ও K দিয়ে অনুরোধে যান, A অনুমোদন, R লেখা মন্তব্যসহ প্রত্যাখ্যান, X নির্বাচন।',
|
|
165
|
+
selectAll: 'সব নির্বাচন',
|
|
166
|
+
select: '{{name}} নির্বাচন',
|
|
167
|
+
approveSelected: 'নির্বাচিতগুলো অনুমোদন ({{count}})',
|
|
168
|
+
empty: 'আপনার জন্য কিছু অপেক্ষায় নেই',
|
|
169
|
+
emptyHint: 'কেউ জমা দিলেই আপনার সিদ্ধান্তের অনুরোধ এখানে আসবে।',
|
|
170
|
+
},
|
|
171
|
+
mine: { title: 'আমার অনুরোধ', empty: 'আপনি কোনো অনুমোদন চাননি।' },
|
|
172
|
+
matrix: {
|
|
173
|
+
title: 'ম্যাট্রিক্স',
|
|
174
|
+
mode: 'কার সিদ্ধান্ত',
|
|
175
|
+
direct: 'আমার',
|
|
176
|
+
delegated: 'অন্যদের পক্ষে',
|
|
177
|
+
period: 'সময়কাল',
|
|
178
|
+
periods: {
|
|
179
|
+
'7d': 'গত ৭ দিন',
|
|
180
|
+
'30d': 'গত ৩০ দিন',
|
|
181
|
+
'3m': 'গত ৩ মাস',
|
|
182
|
+
'6m': 'গত ৬ মাস',
|
|
183
|
+
'1y': 'গত এক বছর',
|
|
184
|
+
all: 'সব সময়',
|
|
185
|
+
},
|
|
186
|
+
empty: 'এই সময়কালে কোনো অনুমোদন নেই।',
|
|
187
|
+
waiting: 'অপেক্ষমাণ',
|
|
188
|
+
approved: 'অনুমোদিত',
|
|
189
|
+
rejected: 'প্রত্যাখ্যাত',
|
|
190
|
+
levels: 'ধাপ অনুযায়ী সিদ্ধান্তের সময়',
|
|
191
|
+
policy: 'নীতি',
|
|
192
|
+
level: 'ধাপ',
|
|
193
|
+
decided: 'সিদ্ধান্ত হয়েছে',
|
|
194
|
+
hours: 'গড় ঘণ্টা',
|
|
195
|
+
bottlenecks: 'কার কাছে সবচেয়ে বেশি অপেক্ষমাণ',
|
|
196
|
+
late_one: '{{count}}টি দেরিতে',
|
|
197
|
+
late_other: '{{count}}টি দেরিতে',
|
|
198
|
+
waitingCount_one: '{{count}}টি অপেক্ষমাণ',
|
|
199
|
+
waitingCount_other: '{{count}}টি অপেক্ষমাণ',
|
|
200
|
+
},
|
|
201
|
+
history: {
|
|
202
|
+
title: 'আমার সিদ্ধান্ত',
|
|
203
|
+
empty: 'আপনি এখনো কোনো অনুরোধে সিদ্ধান্ত দেননি।',
|
|
204
|
+
record: 'রেকর্ড',
|
|
205
|
+
level: 'ধাপ',
|
|
206
|
+
answer: 'উত্তর',
|
|
207
|
+
comment: 'মন্তব্য',
|
|
208
|
+
when: 'কখন',
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the Approvals pages share (RFC 0025 §3.1): the card the server sends, its query, the steps of a round (each
|
|
3
|
+
* level with its state and votes), how long a request has waited, said in the user's language.
|
|
4
|
+
*/
|
|
5
|
+
import type { KoshApi } from '../../ui/index.js';
|
|
6
|
+
import type { ReactElement } from 'react';
|
|
7
|
+
export interface Step {
|
|
8
|
+
readonly id: number;
|
|
9
|
+
readonly levelName: string;
|
|
10
|
+
readonly sequence: number;
|
|
11
|
+
readonly state: 'pending' | 'approved' | 'rejected' | 'sent_back' | 'cancelled';
|
|
12
|
+
readonly approvals: number;
|
|
13
|
+
readonly required: number;
|
|
14
|
+
}
|
|
15
|
+
export interface Card {
|
|
16
|
+
readonly id: number;
|
|
17
|
+
readonly levelName: string;
|
|
18
|
+
readonly state: Step['state'];
|
|
19
|
+
readonly round: number;
|
|
20
|
+
readonly approvals: number;
|
|
21
|
+
readonly required: number;
|
|
22
|
+
readonly waitingSince: string;
|
|
23
|
+
readonly decidedAt: string | null;
|
|
24
|
+
readonly dueAt: string | null;
|
|
25
|
+
readonly escalatedTo: string | null;
|
|
26
|
+
readonly comment: string | null;
|
|
27
|
+
readonly record: {
|
|
28
|
+
readonly model: string;
|
|
29
|
+
readonly id: number;
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly label: string;
|
|
32
|
+
};
|
|
33
|
+
readonly requester: {
|
|
34
|
+
readonly id: number;
|
|
35
|
+
readonly name: string;
|
|
36
|
+
} | null;
|
|
37
|
+
readonly steps: readonly Step[];
|
|
38
|
+
}
|
|
39
|
+
/** The cards of a list: `inbox` (to decide), `mine` (asked by me), `history` (decided by me). */
|
|
40
|
+
export declare const cardsQuery: (api: KoshApi, list: 'inbox' | 'mine' | 'history') => {
|
|
41
|
+
queryKey: string[];
|
|
42
|
+
queryFn: () => Promise<Card[]>;
|
|
43
|
+
};
|
|
44
|
+
/** How long ago `iso` was, in `locale` ("3 hours ago", "৩ ঘণ্টা আগে"). */
|
|
45
|
+
export declare function ago(locale: string, iso: string, now?: number): string;
|
|
46
|
+
/** Amber after a day, red after three. */
|
|
47
|
+
export declare function waitedTone(card: Pick<Card, 'waitingSince'>, now?: number): 'neutral' | 'warning' | 'danger';
|
|
48
|
+
/** A state's badge tone. */
|
|
49
|
+
export declare const TONE: {
|
|
50
|
+
readonly pending: 'warning';
|
|
51
|
+
readonly approved: 'success';
|
|
52
|
+
readonly rejected: 'danger';
|
|
53
|
+
readonly sent_back: 'danger';
|
|
54
|
+
readonly cancelled: 'neutral';
|
|
55
|
+
};
|
|
56
|
+
/** The levels of a round as steps: done, waiting, refused — with their votes. */
|
|
57
|
+
export declare function Steps({ steps }: {
|
|
58
|
+
readonly steps: readonly Step[];
|
|
59
|
+
}): ReactElement;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
/** The cards of a list: `inbox` (to decide), `mine` (asked by me), `history` (decided by me). */
|
|
4
|
+
export const cardsQuery = (api, list) => ({
|
|
5
|
+
queryKey: ['approvals', list],
|
|
6
|
+
queryFn: async () => (await api.call('GET', `/api/v1/approvals/cards?list=${list}`)).cards,
|
|
7
|
+
});
|
|
8
|
+
/** How long ago `iso` was, in `locale` ("3 hours ago", "৩ ঘণ্টা আগে"). */
|
|
9
|
+
export function ago(locale, iso, now = Date.now()) {
|
|
10
|
+
const seconds = Math.round((Date.parse(iso) - now) / 1000);
|
|
11
|
+
const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });
|
|
12
|
+
const units = [
|
|
13
|
+
['day', 86_400],
|
|
14
|
+
['hour', 3_600],
|
|
15
|
+
['minute', 60],
|
|
16
|
+
];
|
|
17
|
+
for (const [unit, size] of units)
|
|
18
|
+
if (Math.abs(seconds) >= size)
|
|
19
|
+
return rtf.format(Math.round(seconds / size), unit);
|
|
20
|
+
return rtf.format(seconds, 'second');
|
|
21
|
+
}
|
|
22
|
+
/** Amber after a day, red after three. */
|
|
23
|
+
export function waitedTone(card, now = Date.now()) {
|
|
24
|
+
const hours = (now - Date.parse(card.waitingSince)) / 3_600_000;
|
|
25
|
+
return hours >= 72 ? 'danger' : hours >= 24 ? 'warning' : 'neutral';
|
|
26
|
+
}
|
|
27
|
+
/** A state's badge tone. */
|
|
28
|
+
export const TONE = {
|
|
29
|
+
pending: 'warning',
|
|
30
|
+
approved: 'success',
|
|
31
|
+
rejected: 'danger',
|
|
32
|
+
sent_back: 'danger',
|
|
33
|
+
cancelled: 'neutral',
|
|
34
|
+
};
|
|
35
|
+
const DOT = {
|
|
36
|
+
pending: 'border-warning bg-warning/20',
|
|
37
|
+
approved: 'border-success bg-success',
|
|
38
|
+
rejected: 'border-danger bg-danger',
|
|
39
|
+
sent_back: 'border-danger bg-danger/40',
|
|
40
|
+
cancelled: 'border-muted-foreground bg-muted',
|
|
41
|
+
};
|
|
42
|
+
/** The levels of a round as steps: done, waiting, refused — with their votes. */
|
|
43
|
+
export function Steps({ steps }) {
|
|
44
|
+
const { t } = useTranslation('approvals');
|
|
45
|
+
return (_jsx("ol", { className: "flex flex-wrap items-center gap-2", "aria-label": t('steps'), children: steps.map((s, i) => (_jsxs("li", { className: "flex items-center gap-2 text-xs", children: [i === 0 ? null : _jsx("span", { "aria-hidden": "true", className: "h-px w-4 bg-border" }), _jsx("span", { "aria-hidden": "true", className: `size-3 rounded-full border-2 ${DOT[s.state]}` }), _jsxs("span", { children: [_jsx("span", { className: "font-medium", children: s.levelName }), ' ', _jsxs("span", { className: "text-muted-foreground", children: [t(`state.${s.state}`), s.required > 1 ? ` · ${s.approvals}/${s.required}` : ''] })] })] }, s.id))) }));
|
|
46
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
|
|
2
|
+
import { type DefinitionHelpers } from '../../server/orm.js';
|
|
3
|
+
import type { DefaultLoaded, Env as CoreEnv, RecordSet as CoreRecordSet, Shutro as CoreShutro } from '../../server/orm.js';
|
|
4
|
+
import type { SchemaView } from './schema.js';
|
|
5
|
+
export type { SchemaView };
|
|
6
|
+
/** Every model visible in this view. */
|
|
7
|
+
export type ModelName = keyof SchemaView & string;
|
|
8
|
+
/** `Env` typed to this view. */
|
|
9
|
+
export type Env = CoreEnv<SchemaView>;
|
|
10
|
+
/** `Shutro` typed to this view. */
|
|
11
|
+
export type Shutro = CoreShutro<SchemaView>;
|
|
12
|
+
/** A recordset of `M`, with the default loaded shape unless `L` is given. */
|
|
13
|
+
export type Records<M extends ModelName, L = DefaultLoaded<SchemaView, M>> = CoreRecordSet<SchemaView, M, L>;
|
|
14
|
+
export declare const compute: DefinitionHelpers<SchemaView>['compute'];
|
|
15
|
+
export declare const check: DefinitionHelpers<SchemaView>['check'];
|
|
16
|
+
export declare const onchange: DefinitionHelpers<SchemaView>['onchange'];
|
|
17
|
+
export declare const records: DefinitionHelpers<SchemaView>['records'];
|
|
18
|
+
export declare const method: DefinitionHelpers<SchemaView>['method'];
|
|
19
|
+
/** Module data (RFC 0017): records, overrides of dependencies' records, and references, typed like creates. */
|
|
20
|
+
export declare const record: DefinitionHelpers<SchemaView>['record'];
|
|
21
|
+
export declare const override: DefinitionHelpers<SchemaView>['override'];
|
|
22
|
+
export declare const ref: DefinitionHelpers<SchemaView>['ref'];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 5d359b16ce96aaa8
|
|
2
|
+
// Bindings of module `approvals_purchase`: import the definition API from here to get types scoped to what it can see.
|
|
3
|
+
export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
|
|
4
|
+
import { definitions } from '../../server/orm.js';
|
|
5
|
+
/** Definition callbacks typed against this module's view: no casts in computes, checks, onchange, methods. */
|
|
6
|
+
const helpers = definitions();
|
|
7
|
+
export const compute = helpers.compute;
|
|
8
|
+
export const check = helpers.check;
|
|
9
|
+
export const onchange = helpers.onchange;
|
|
10
|
+
export const records = helpers.records;
|
|
11
|
+
export const method = helpers.method;
|
|
12
|
+
/** Module data (RFC 0017): records, overrides of dependencies' records, and references, typed like creates. */
|
|
13
|
+
export const record = helpers.record;
|
|
14
|
+
export const override = helpers.override;
|
|
15
|
+
export const ref = helpers.ref;
|