@ketvietlab/ketsuite 0.1.2 → 0.1.3
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/LICENSE +1 -1
- package/README.md +15 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +59 -0
- package/dist/cli.js.map +1 -0
- package/dist/deployment.d.ts +5 -0
- package/dist/deployment.d.ts.map +1 -0
- package/dist/deployment.js +152 -0
- package/dist/deployment.js.map +1 -0
- package/dist/development.d.ts +8 -0
- package/dist/development.d.ts.map +1 -0
- package/dist/development.js +40 -0
- package/dist/development.js.map +1 -0
- package/dist/index.d.ts +77 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +66 -6
- package/dist/index.js.map +1 -1
- package/dist/modules/account/analytics.d.ts +32 -0
- package/dist/modules/account/analytics.d.ts.map +1 -0
- package/dist/modules/account/analytics.js +457 -0
- package/dist/modules/account/analytics.js.map +1 -0
- package/dist/modules/account/assets-costing.d.ts +4 -0
- package/dist/modules/account/assets-costing.d.ts.map +1 -0
- package/dist/modules/account/assets-costing.js +1134 -0
- package/dist/modules/account/assets-costing.js.map +1 -0
- package/dist/modules/account/audit.d.ts +3 -0
- package/dist/modules/account/audit.d.ts.map +1 -0
- package/dist/modules/account/audit.js +14 -0
- package/dist/modules/account/audit.js.map +1 -0
- package/dist/modules/account/books.d.ts +4 -0
- package/dist/modules/account/books.d.ts.map +1 -0
- package/dist/modules/account/books.js +150 -0
- package/dist/modules/account/books.js.map +1 -0
- package/dist/modules/account/cash-receivables.d.ts +3 -0
- package/dist/modules/account/cash-receivables.d.ts.map +1 -0
- package/dist/modules/account/cash-receivables.js +1087 -0
- package/dist/modules/account/cash-receivables.js.map +1 -0
- package/dist/modules/account/close.d.ts +4 -0
- package/dist/modules/account/close.d.ts.map +1 -0
- package/dist/modules/account/close.js +343 -0
- package/dist/modules/account/close.js.map +1 -0
- package/dist/modules/account/date.d.ts +21 -0
- package/dist/modules/account/date.d.ts.map +1 -0
- package/dist/modules/account/date.js +70 -0
- package/dist/modules/account/date.js.map +1 -0
- package/dist/modules/account/functions.d.ts +131 -3
- package/dist/modules/account/functions.d.ts.map +1 -1
- package/dist/modules/account/functions.js +2570 -389
- package/dist/modules/account/functions.js.map +1 -1
- package/dist/modules/account/index.d.ts +1 -2
- package/dist/modules/account/index.d.ts.map +1 -1
- package/dist/modules/account/index.js +403 -8
- package/dist/modules/account/index.js.map +1 -1
- package/dist/modules/account/models.d.ts.map +1 -1
- package/dist/modules/account/models.js +748 -0
- package/dist/modules/account/models.js.map +1 -1
- package/dist/modules/account/money.d.ts +60 -0
- package/dist/modules/account/money.d.ts.map +1 -0
- package/dist/modules/account/money.js +237 -0
- package/dist/modules/account/money.js.map +1 -0
- package/dist/modules/account/open-items.d.ts +3 -0
- package/dist/modules/account/open-items.d.ts.map +1 -0
- package/dist/modules/account/open-items.js +390 -0
- package/dist/modules/account/open-items.js.map +1 -0
- package/dist/modules/account/opening.d.ts +3 -0
- package/dist/modules/account/opening.d.ts.map +1 -0
- package/dist/modules/account/opening.js +323 -0
- package/dist/modules/account/opening.js.map +1 -0
- package/dist/modules/account/period.d.ts +21 -0
- package/dist/modules/account/period.d.ts.map +1 -0
- package/dist/modules/account/period.js +155 -0
- package/dist/modules/account/period.js.map +1 -0
- package/dist/modules/account/relations.d.ts.map +1 -1
- package/dist/modules/account/relations.js +46 -0
- package/dist/modules/account/relations.js.map +1 -1
- package/dist/modules/account/reports.d.ts +4 -0
- package/dist/modules/account/reports.d.ts.map +1 -0
- package/dist/modules/account/reports.js +125 -0
- package/dist/modules/account/reports.js.map +1 -0
- package/dist/modules/account/setup.d.ts +3 -1
- package/dist/modules/account/setup.d.ts.map +1 -1
- package/dist/modules/account/setup.js +45 -160
- package/dist/modules/account/setup.js.map +1 -1
- package/dist/modules/account_activity_backend/index.d.ts.map +1 -1
- package/dist/modules/account_activity_backend/index.js +0 -1
- package/dist/modules/account_activity_backend/index.js.map +1 -1
- package/dist/modules/account_backend/index.js +3339 -494
- package/dist/modules/account_backend/index.js.map +1 -1
- package/dist/modules/account_backend/overview.d.ts +92 -0
- package/dist/modules/account_backend/overview.d.ts.map +1 -0
- package/dist/modules/account_backend/overview.js +257 -0
- package/dist/modules/account_backend/overview.js.map +1 -0
- package/dist/modules/account_backend/relation-control.d.ts +48 -0
- package/dist/modules/account_backend/relation-control.d.ts.map +1 -0
- package/dist/modules/account_backend/relation-control.js +67 -0
- package/dist/modules/account_backend/relation-control.js.map +1 -0
- package/dist/modules/account_backend/screens/account-defaults.d.ts +28 -0
- package/dist/modules/account_backend/screens/account-defaults.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/account-defaults.js +60 -0
- package/dist/modules/account_backend/screens/account-defaults.js.map +1 -0
- package/dist/modules/account_backend/screens/account-form.d.ts +16 -0
- package/dist/modules/account_backend/screens/account-form.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/account-form.js +53 -0
- package/dist/modules/account_backend/screens/account-form.js.map +1 -0
- package/dist/modules/account_backend/screens/accounting-books.d.ts +15 -0
- package/dist/modules/account_backend/screens/accounting-books.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/accounting-books.js +86 -0
- package/dist/modules/account_backend/screens/accounting-books.js.map +1 -0
- package/dist/modules/account_backend/screens/accounts-list.d.ts +50 -0
- package/dist/modules/account_backend/screens/accounts-list.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/accounts-list.js +66 -0
- package/dist/modules/account_backend/screens/accounts-list.js.map +1 -0
- package/dist/modules/account_backend/screens/customer-invoice-form.d.ts +13 -0
- package/dist/modules/account_backend/screens/customer-invoice-form.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/customer-invoice-form.js +20 -0
- package/dist/modules/account_backend/screens/customer-invoice-form.js.map +1 -0
- package/dist/modules/account_backend/screens/customer-invoices-list.d.ts +62 -0
- package/dist/modules/account_backend/screens/customer-invoices-list.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/customer-invoices-list.js +82 -0
- package/dist/modules/account_backend/screens/customer-invoices-list.js.map +1 -0
- package/dist/modules/account_backend/screens/general-ledger.d.ts +24 -0
- package/dist/modules/account_backend/screens/general-ledger.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/general-ledger.js +73 -0
- package/dist/modules/account_backend/screens/general-ledger.js.map +1 -0
- package/dist/modules/account_backend/screens/index.d.ts +27 -0
- package/dist/modules/account_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/index.js +27 -0
- package/dist/modules/account_backend/screens/index.js.map +1 -0
- package/dist/modules/account_backend/screens/journal-entries-list.d.ts +48 -0
- package/dist/modules/account_backend/screens/journal-entries-list.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/journal-entries-list.js +58 -0
- package/dist/modules/account_backend/screens/journal-entries-list.js.map +1 -0
- package/dist/modules/account_backend/screens/journal-entry-create.d.ts +14 -0
- package/dist/modules/account_backend/screens/journal-entry-create.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/journal-entry-create.js +41 -0
- package/dist/modules/account_backend/screens/journal-entry-create.js.map +1 -0
- package/dist/modules/account_backend/screens/journal-form.d.ts +15 -0
- package/dist/modules/account_backend/screens/journal-form.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/journal-form.js +53 -0
- package/dist/modules/account_backend/screens/journal-form.js.map +1 -0
- package/dist/modules/account_backend/screens/journals-list.d.ts +51 -0
- package/dist/modules/account_backend/screens/journals-list.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/journals-list.js +70 -0
- package/dist/modules/account_backend/screens/journals-list.js.map +1 -0
- package/dist/modules/account_backend/screens/move-detail.d.ts +26 -0
- package/dist/modules/account_backend/screens/move-detail.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/move-detail.js +130 -0
- package/dist/modules/account_backend/screens/move-detail.js.map +1 -0
- package/dist/modules/account_backend/screens/opening-balances.d.ts +28 -0
- package/dist/modules/account_backend/screens/opening-balances.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/opening-balances.js +96 -0
- package/dist/modules/account_backend/screens/opening-balances.js.map +1 -0
- package/dist/modules/account_backend/screens/overview.d.ts +62 -0
- package/dist/modules/account_backend/screens/overview.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/overview.js +215 -0
- package/dist/modules/account_backend/screens/overview.js.map +1 -0
- package/dist/modules/account_backend/screens/partner-statement.d.ts +26 -0
- package/dist/modules/account_backend/screens/partner-statement.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/partner-statement.js +82 -0
- package/dist/modules/account_backend/screens/partner-statement.js.map +1 -0
- package/dist/modules/account_backend/screens/payment-form.d.ts +14 -0
- package/dist/modules/account_backend/screens/payment-form.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/payment-form.js +21 -0
- package/dist/modules/account_backend/screens/payment-form.js.map +1 -0
- package/dist/modules/account_backend/screens/payment-term-form.d.ts +25 -0
- package/dist/modules/account_backend/screens/payment-term-form.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/payment-term-form.js +96 -0
- package/dist/modules/account_backend/screens/payment-term-form.js.map +1 -0
- package/dist/modules/account_backend/screens/payment-terms-list.d.ts +23 -0
- package/dist/modules/account_backend/screens/payment-terms-list.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/payment-terms-list.js +104 -0
- package/dist/modules/account_backend/screens/payment-terms-list.js.map +1 -0
- package/dist/modules/account_backend/screens/payments-list.d.ts +62 -0
- package/dist/modules/account_backend/screens/payments-list.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/payments-list.js +71 -0
- package/dist/modules/account_backend/screens/payments-list.js.map +1 -0
- package/dist/modules/account_backend/screens/period-closes.d.ts +21 -0
- package/dist/modules/account_backend/screens/period-closes.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/period-closes.js +123 -0
- package/dist/modules/account_backend/screens/period-closes.js.map +1 -0
- package/dist/modules/account_backend/screens/shared.d.ts +16 -0
- package/dist/modules/account_backend/screens/shared.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/shared.js +15 -0
- package/dist/modules/account_backend/screens/shared.js.map +1 -0
- package/dist/modules/account_backend/screens/tax-form.d.ts +14 -0
- package/dist/modules/account_backend/screens/tax-form.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/tax-form.js +25 -0
- package/dist/modules/account_backend/screens/tax-form.js.map +1 -0
- package/dist/modules/account_backend/screens/taxes-list.d.ts +55 -0
- package/dist/modules/account_backend/screens/taxes-list.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/taxes-list.js +83 -0
- package/dist/modules/account_backend/screens/taxes-list.js.map +1 -0
- package/dist/modules/account_backend/screens/trial-balance.d.ts +19 -0
- package/dist/modules/account_backend/screens/trial-balance.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/trial-balance.js +75 -0
- package/dist/modules/account_backend/screens/trial-balance.js.map +1 -0
- package/dist/modules/account_backend/screens/vendor-bill-form.d.ts +13 -0
- package/dist/modules/account_backend/screens/vendor-bill-form.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/vendor-bill-form.js +20 -0
- package/dist/modules/account_backend/screens/vendor-bill-form.js.map +1 -0
- package/dist/modules/account_backend/screens/vendor-bills-list.d.ts +62 -0
- package/dist/modules/account_backend/screens/vendor-bills-list.d.ts.map +1 -0
- package/dist/modules/account_backend/screens/vendor-bills-list.js +84 -0
- package/dist/modules/account_backend/screens/vendor-bills-list.js.map +1 -0
- package/dist/modules/account_mail_backend/index.d.ts.map +1 -1
- package/dist/modules/account_mail_backend/index.js +0 -1
- package/dist/modules/account_mail_backend/index.js.map +1 -1
- package/dist/modules/account_partner/index.js +0 -2
- package/dist/modules/account_partner/index.js.map +1 -1
- package/dist/modules/account_partner_backend/index.d.ts +1 -1
- package/dist/modules/account_partner_backend/index.d.ts.map +1 -1
- package/dist/modules/account_partner_backend/index.js +2 -3
- package/dist/modules/account_partner_backend/index.js.map +1 -1
- package/dist/modules/account_partner_backend/routes.d.ts.map +1 -1
- package/dist/modules/account_partner_backend/routes.js +19 -25
- package/dist/modules/account_partner_backend/routes.js.map +1 -1
- package/dist/modules/account_partner_backend/screens/accounting-terms.d.ts +20 -0
- package/dist/modules/account_partner_backend/screens/accounting-terms.d.ts.map +1 -0
- package/dist/modules/account_partner_backend/screens/accounting-terms.js +63 -0
- package/dist/modules/account_partner_backend/screens/accounting-terms.js.map +1 -0
- package/dist/modules/account_partner_backend/screens/index.d.ts +2 -0
- package/dist/modules/account_partner_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/account_partner_backend/screens/index.js +2 -0
- package/dist/modules/account_partner_backend/screens/index.js.map +1 -0
- package/dist/modules/account_staff_channel/channel-routes.d.ts +2 -0
- package/dist/modules/account_staff_channel/channel-routes.d.ts.map +1 -0
- package/dist/modules/account_staff_channel/channel-routes.js +787 -0
- package/dist/modules/account_staff_channel/channel-routes.js.map +1 -0
- package/dist/modules/account_staff_channel/functions.d.ts.map +1 -0
- package/dist/modules/account_staff_channel/functions.js +143 -0
- package/dist/modules/account_staff_channel/functions.js.map +1 -0
- package/dist/modules/account_staff_channel/index.d.ts +5 -0
- package/dist/modules/account_staff_channel/index.d.ts.map +1 -0
- package/dist/modules/account_staff_channel/index.js +42 -0
- package/dist/modules/account_staff_channel/index.js.map +1 -0
- package/dist/modules/account_staff_channel/models.d.ts.map +1 -0
- package/dist/modules/account_staff_channel/models.js +30 -0
- package/dist/modules/account_staff_channel/models.js.map +1 -0
- package/dist/modules/activity/index.d.ts.map +1 -1
- package/dist/modules/activity/index.js +0 -1
- package/dist/modules/activity/index.js.map +1 -1
- package/dist/modules/activity_backend/index.d.ts +1 -1
- package/dist/modules/activity_backend/index.d.ts.map +1 -1
- package/dist/modules/activity_backend/index.js +3 -12
- package/dist/modules/activity_backend/index.js.map +1 -1
- package/dist/modules/activity_backend/routes.d.ts.map +1 -1
- package/dist/modules/activity_backend/routes.js +36 -22
- package/dist/modules/activity_backend/routes.js.map +1 -1
- package/dist/modules/activity_backend/screens/activities-list.d.ts +15 -0
- package/dist/modules/activity_backend/screens/activities-list.d.ts.map +1 -0
- package/dist/modules/activity_backend/screens/activities-list.js +40 -0
- package/dist/modules/activity_backend/screens/activities-list.js.map +1 -0
- package/dist/modules/activity_backend/screens/index.d.ts +2 -0
- package/dist/modules/activity_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/activity_backend/screens/index.js +2 -0
- package/dist/modules/activity_backend/screens/index.js.map +1 -0
- package/dist/modules/address/data/VN/NOTICE.md +1 -1
- package/dist/modules/address/index.d.ts.map +1 -1
- package/dist/modules/address/index.js +0 -1
- package/dist/modules/address/index.js.map +1 -1
- package/dist/modules/address_backend/index.d.ts +1 -1
- package/dist/modules/address_backend/index.d.ts.map +1 -1
- package/dist/modules/address_backend/index.js +1 -3
- package/dist/modules/address_backend/index.js.map +1 -1
- package/dist/modules/address_backend/routes.d.ts.map +1 -1
- package/dist/modules/address_backend/routes.js +20 -27
- package/dist/modules/address_backend/routes.js.map +1 -1
- package/dist/modules/address_backend/screens/catalogs-list.d.ts +14 -0
- package/dist/modules/address_backend/screens/catalogs-list.d.ts.map +1 -0
- package/dist/modules/address_backend/screens/catalogs-list.js +38 -0
- package/dist/modules/address_backend/screens/catalogs-list.js.map +1 -0
- package/dist/modules/address_backend/screens/country-browser.d.ts +12 -0
- package/dist/modules/address_backend/screens/country-browser.d.ts.map +1 -0
- package/dist/modules/address_backend/screens/country-browser.js +74 -0
- package/dist/modules/address_backend/screens/country-browser.js.map +1 -0
- package/dist/modules/address_backend/screens/index.d.ts +4 -0
- package/dist/modules/address_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/address_backend/screens/index.js +3 -0
- package/dist/modules/address_backend/screens/index.js.map +1 -0
- package/dist/modules/address_backend/screens/types.d.ts +20 -0
- package/dist/modules/address_backend/screens/types.d.ts.map +1 -0
- package/dist/modules/address_backend/screens/types.js.map +1 -0
- package/dist/modules/attendance/channel-routes.d.ts +2 -0
- package/dist/modules/attendance/channel-routes.d.ts.map +1 -0
- package/dist/modules/attendance/channel-routes.js +234 -0
- package/dist/modules/attendance/channel-routes.js.map +1 -0
- package/dist/modules/attendance/functions.d.ts.map +1 -1
- package/dist/modules/attendance/functions.js +171 -22
- package/dist/modules/attendance/functions.js.map +1 -1
- package/dist/modules/attendance/index.d.ts.map +1 -1
- package/dist/modules/attendance/index.js +4 -2
- package/dist/modules/attendance/index.js.map +1 -1
- package/dist/modules/attendance/messages.d.ts +6 -0
- package/dist/modules/attendance/messages.d.ts.map +1 -1
- package/dist/modules/attendance/messages.js +6 -0
- package/dist/modules/attendance/messages.js.map +1 -1
- package/dist/modules/attendance/models.d.ts.map +1 -1
- package/dist/modules/attendance/models.js +1 -0
- package/dist/modules/attendance/models.js.map +1 -1
- package/dist/modules/attendance_backend/index.d.ts +3 -1
- package/dist/modules/attendance_backend/index.d.ts.map +1 -1
- package/dist/modules/attendance_backend/index.js +65 -4
- package/dist/modules/attendance_backend/index.js.map +1 -1
- package/dist/modules/attendance_backend/routes.d.ts.map +1 -1
- package/dist/modules/attendance_backend/routes.js +240 -53
- package/dist/modules/attendance_backend/routes.js.map +1 -1
- package/dist/modules/attendance_backend/screens/credentials.d.ts +32 -0
- package/dist/modules/attendance_backend/screens/credentials.d.ts.map +1 -0
- package/dist/modules/attendance_backend/screens/credentials.js +84 -0
- package/dist/modules/attendance_backend/screens/credentials.js.map +1 -0
- package/dist/modules/attendance_backend/screens/index.d.ts +4 -0
- package/dist/modules/attendance_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/attendance_backend/screens/index.js +4 -0
- package/dist/modules/attendance_backend/screens/index.js.map +1 -0
- package/dist/modules/attendance_backend/screens/my-work.d.ts +35 -0
- package/dist/modules/attendance_backend/screens/my-work.d.ts.map +1 -0
- package/dist/modules/attendance_backend/screens/my-work.js +189 -0
- package/dist/modules/attendance_backend/screens/my-work.js.map +1 -0
- package/dist/modules/attendance_backend/screens/period.d.ts +22 -0
- package/dist/modules/attendance_backend/screens/period.d.ts.map +1 -0
- package/dist/modules/attendance_backend/screens/period.js +85 -0
- package/dist/modules/attendance_backend/screens/period.js.map +1 -0
- package/dist/modules/attendance_backend/screens.d.ts +0 -4
- package/dist/modules/attendance_backend/screens.d.ts.map +1 -1
- package/dist/modules/attendance_backend/screens.js +1 -209
- package/dist/modules/attendance_backend/screens.js.map +1 -1
- package/dist/modules/backend/catalogue.d.ts.map +1 -1
- package/dist/modules/backend/catalogue.js +53 -115
- package/dist/modules/backend/catalogue.js.map +1 -1
- package/dist/modules/backend/chart.d.ts +42 -0
- package/dist/modules/backend/chart.d.ts.map +1 -0
- package/dist/modules/backend/chart.js +39 -0
- package/dist/modules/backend/chart.js.map +1 -0
- package/dist/modules/backend/design/HANDOFF.md +118 -38
- package/dist/modules/backend/design/auth.css +463 -0
- package/dist/modules/backend/design/brand/logo-dark.png +0 -0
- package/dist/modules/backend/design/brand/logo-light.png +0 -0
- package/dist/modules/backend/design/charts.css +229 -0
- package/dist/modules/backend/design/client/chart.d.mts +31 -0
- package/dist/modules/backend/design/client/chart.d.mts.map +1 -0
- package/dist/modules/backend/design/client/chart.mjs +23 -0
- package/dist/modules/backend/design/client/chart.mjs.map +7 -0
- package/dist/modules/backend/design/client/relation-select.d.mts +6 -1
- package/dist/modules/backend/design/client/relation-select.d.mts.map +1 -1
- package/dist/modules/backend/design/client/relation-select.mjs +2 -7
- package/dist/modules/backend/design/client/relation-select.mjs.map +7 -1
- package/dist/modules/backend/design/client/table-selection.d.mts +7 -0
- package/dist/modules/backend/design/client/table-selection.d.mts.map +1 -0
- package/dist/modules/backend/design/client/table-selection.mjs +2 -0
- package/dist/modules/backend/design/client/table-selection.mjs.map +7 -0
- package/dist/modules/backend/design/content.css +766 -0
- package/dist/modules/backend/design/controls.css +451 -0
- package/dist/modules/backend/design/design-system.css +2 -0
- package/dist/modules/backend/design/forms.css +1134 -0
- package/dist/modules/backend/design/foundation.css +423 -0
- package/dist/modules/backend/design/lists.css +1462 -0
- package/dist/modules/backend/design/record.css +526 -0
- package/dist/modules/backend/design/responsive.css +331 -0
- package/dist/modules/backend/design/tokens.css +317 -92
- package/dist/modules/backend/index.d.ts +12 -5
- package/dist/modules/backend/index.d.ts.map +1 -1
- package/dist/modules/backend/index.js +32 -15
- package/dist/modules/backend/index.js.map +1 -1
- package/dist/modules/backend/islands.d.ts.map +1 -1
- package/dist/modules/backend/islands.js +22 -4
- package/dist/modules/backend/islands.js.map +1 -1
- package/dist/modules/backend/joints.d.ts +1 -1
- package/dist/modules/backend/joints.d.ts.map +1 -1
- package/dist/modules/backend/joints.js +14 -6
- package/dist/modules/backend/joints.js.map +1 -1
- package/dist/modules/backend/list-search.d.ts +33 -0
- package/dist/modules/backend/list-search.d.ts.map +1 -0
- package/dist/modules/backend/list-search.js +232 -0
- package/dist/modules/backend/list-search.js.map +1 -0
- package/dist/modules/backend/menus.d.ts.map +1 -1
- package/dist/modules/backend/menus.js +3 -12
- package/dist/modules/backend/menus.js.map +1 -1
- package/dist/modules/backend/messages.d.ts +1 -1
- package/dist/modules/backend/messages.d.ts.map +1 -1
- package/dist/modules/backend/messages.js +48 -35
- package/dist/modules/backend/messages.js.map +1 -1
- package/dist/modules/backend/paging.d.ts +1 -1
- package/dist/modules/backend/paging.d.ts.map +1 -1
- package/dist/modules/backend/paging.js +1 -1
- package/dist/modules/backend/paging.js.map +1 -1
- package/dist/modules/backend/relation-select.d.ts +2 -57
- package/dist/modules/backend/relation-select.d.ts.map +1 -1
- package/dist/modules/backend/relation-select.js +2 -0
- package/dist/modules/backend/relation-select.js.map +1 -1
- package/dist/modules/backend/routes.d.ts +1 -8
- package/dist/modules/backend/routes.d.ts.map +1 -1
- package/dist/modules/backend/routes.js +36 -111
- package/dist/modules/backend/routes.js.map +1 -1
- package/dist/modules/backend/screen.d.ts +130 -0
- package/dist/modules/backend/screen.d.ts.map +1 -0
- package/dist/modules/backend/screen.js +205 -0
- package/dist/modules/backend/screen.js.map +1 -0
- package/dist/modules/backend/screens.d.ts +11 -14
- package/dist/modules/backend/screens.d.ts.map +1 -1
- package/dist/modules/backend/screens.js +13 -70
- package/dist/modules/backend/screens.js.map +1 -1
- package/dist/modules/business_report_staff_channel/channel-routes.d.ts +2 -0
- package/dist/modules/business_report_staff_channel/channel-routes.d.ts.map +1 -0
- package/dist/modules/business_report_staff_channel/channel-routes.js +438 -0
- package/dist/modules/business_report_staff_channel/channel-routes.js.map +1 -0
- package/dist/modules/business_report_staff_channel/index.d.ts +5 -0
- package/dist/modules/business_report_staff_channel/index.d.ts.map +1 -0
- package/dist/modules/business_report_staff_channel/index.js +18 -0
- package/dist/modules/business_report_staff_channel/index.js.map +1 -0
- package/dist/modules/calendar/index.d.ts.map +1 -1
- package/dist/modules/calendar/index.js +0 -1
- package/dist/modules/calendar/index.js.map +1 -1
- package/dist/modules/calendar/recurrence.d.ts.map +1 -1
- package/dist/modules/calendar/recurrence.js +3 -11
- package/dist/modules/calendar/recurrence.js.map +1 -1
- package/dist/modules/calendar_activity/index.d.ts.map +1 -1
- package/dist/modules/calendar_activity/index.js +0 -2
- package/dist/modules/calendar_activity/index.js.map +1 -1
- package/dist/modules/calendar_backend/index.d.ts +1 -1
- package/dist/modules/calendar_backend/index.d.ts.map +1 -1
- package/dist/modules/calendar_backend/index.js +1 -3
- package/dist/modules/calendar_backend/index.js.map +1 -1
- package/dist/modules/calendar_backend/routes.d.ts.map +1 -1
- package/dist/modules/calendar_backend/routes.js +10 -22
- package/dist/modules/calendar_backend/routes.js.map +1 -1
- package/dist/modules/calendar_backend/screens/calendar.d.ts +5 -0
- package/dist/modules/calendar_backend/screens/calendar.d.ts.map +1 -0
- package/dist/modules/calendar_backend/screens/calendar.js +10 -0
- package/dist/modules/calendar_backend/screens/calendar.js.map +1 -0
- package/dist/modules/calendar_backend/screens/index.d.ts +2 -0
- package/dist/modules/calendar_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/calendar_backend/screens/index.js +2 -0
- package/dist/modules/calendar_backend/screens/index.js.map +1 -0
- package/dist/modules/calendar_mail_transport/index.d.ts.map +1 -1
- package/dist/modules/calendar_mail_transport/index.js +0 -2
- package/dist/modules/calendar_mail_transport/index.js.map +1 -1
- package/dist/modules/channel_api/core.d.ts +253 -0
- package/dist/modules/channel_api/core.d.ts.map +1 -0
- package/dist/modules/channel_api/core.js +587 -0
- package/dist/modules/channel_api/core.js.map +1 -0
- package/dist/modules/channel_api/customer.d.ts +21 -0
- package/dist/modules/channel_api/customer.d.ts.map +1 -0
- package/dist/modules/channel_api/customer.js +368 -0
- package/dist/modules/channel_api/customer.js.map +1 -0
- package/dist/modules/channel_api/index.d.ts +6 -0
- package/dist/modules/channel_api/index.d.ts.map +1 -0
- package/dist/modules/channel_api/index.js +66 -0
- package/dist/modules/channel_api/index.js.map +1 -0
- package/dist/modules/channel_api/openapi.d.ts +17 -0
- package/dist/modules/channel_api/openapi.d.ts.map +1 -0
- package/dist/modules/channel_api/openapi.js +105 -0
- package/dist/modules/channel_api/openapi.js.map +1 -0
- package/dist/modules/channel_api/staff.d.ts +7 -0
- package/dist/modules/channel_api/staff.d.ts.map +1 -0
- package/dist/modules/channel_api/staff.js +209 -0
- package/dist/modules/channel_api/staff.js.map +1 -0
- package/dist/modules/company/functions.d.ts.map +1 -1
- package/dist/modules/company/functions.js +93 -12
- package/dist/modules/company/functions.js.map +1 -1
- package/dist/modules/company/index.js +3 -3
- package/dist/modules/company/index.js.map +1 -1
- package/dist/modules/company/messages.d.ts +8 -0
- package/dist/modules/company/messages.d.ts.map +1 -1
- package/dist/modules/company/messages.js +8 -0
- package/dist/modules/company/messages.js.map +1 -1
- package/dist/modules/company/models.d.ts +2 -2
- package/dist/modules/company/models.d.ts.map +1 -1
- package/dist/modules/company/models.js +12 -2
- package/dist/modules/company/models.js.map +1 -1
- package/dist/modules/company_backend/index.d.ts +2 -1
- package/dist/modules/company_backend/index.d.ts.map +1 -1
- package/dist/modules/company_backend/index.js +25 -4
- package/dist/modules/company_backend/index.js.map +1 -1
- package/dist/modules/company_backend/routes.d.ts.map +1 -1
- package/dist/modules/company_backend/routes.js +314 -96
- package/dist/modules/company_backend/routes.js.map +1 -1
- package/dist/modules/company_backend/screens/branch-form.d.ts +18 -0
- package/dist/modules/company_backend/screens/branch-form.d.ts.map +1 -0
- package/dist/modules/company_backend/screens/branch-form.js +63 -0
- package/dist/modules/company_backend/screens/branch-form.js.map +1 -0
- package/dist/modules/company_backend/screens/companies-list.d.ts +18 -0
- package/dist/modules/company_backend/screens/companies-list.d.ts.map +1 -0
- package/dist/modules/company_backend/screens/companies-list.js +49 -0
- package/dist/modules/company_backend/screens/companies-list.js.map +1 -0
- package/dist/modules/company_backend/screens/company-form.d.ts +25 -0
- package/dist/modules/company_backend/screens/company-form.d.ts.map +1 -0
- package/dist/modules/company_backend/screens/company-form.js +159 -0
- package/dist/modules/company_backend/screens/company-form.js.map +1 -0
- package/dist/modules/company_backend/screens/context.d.ts +30 -0
- package/dist/modules/company_backend/screens/context.d.ts.map +1 -0
- package/dist/modules/company_backend/screens/context.js +48 -0
- package/dist/modules/company_backend/screens/context.js.map +1 -0
- package/dist/modules/company_backend/screens/hierarchy.d.ts +16 -0
- package/dist/modules/company_backend/screens/hierarchy.d.ts.map +1 -0
- package/dist/modules/company_backend/screens/hierarchy.js +41 -0
- package/dist/modules/company_backend/screens/hierarchy.js.map +1 -0
- package/dist/modules/company_backend/screens/index.d.ts +7 -0
- package/dist/modules/company_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/company_backend/screens/index.js +6 -0
- package/dist/modules/company_backend/screens/index.js.map +1 -0
- package/dist/modules/company_backend/screens/types.d.ts +22 -0
- package/dist/modules/company_backend/screens/types.d.ts.map +1 -0
- package/dist/modules/company_backend/screens/types.js +2 -0
- package/dist/modules/company_backend/screens/types.js.map +1 -0
- package/dist/modules/crm/functions.d.ts +1 -1
- package/dist/modules/crm/functions.d.ts.map +1 -1
- package/dist/modules/crm/functions.js +534 -75
- package/dist/modules/crm/functions.js.map +1 -1
- package/dist/modules/crm/index.d.ts +2 -1
- package/dist/modules/crm/index.d.ts.map +1 -1
- package/dist/modules/crm/index.js +3 -4
- package/dist/modules/crm/index.js.map +1 -1
- package/dist/modules/crm/jobs.d.ts +10 -0
- package/dist/modules/crm/jobs.d.ts.map +1 -1
- package/dist/modules/crm/jobs.js +50 -1
- package/dist/modules/crm/jobs.js.map +1 -1
- package/dist/modules/crm/messages.d.ts +14 -1
- package/dist/modules/crm/messages.d.ts.map +1 -1
- package/dist/modules/crm/messages.js +26 -0
- package/dist/modules/crm/messages.js.map +1 -1
- package/dist/modules/crm/models.d.ts.map +1 -1
- package/dist/modules/crm/models.js +25 -0
- package/dist/modules/crm/models.js.map +1 -1
- package/dist/modules/crm/operations.d.ts +110 -1
- package/dist/modules/crm/operations.d.ts.map +1 -1
- package/dist/modules/crm/operations.js +612 -84
- package/dist/modules/crm/operations.js.map +1 -1
- package/dist/modules/crm_backend/client/crm-kanban-view.d.mts.map +1 -1
- package/dist/modules/crm_backend/client/crm-kanban-view.mjs +132 -32
- package/dist/modules/crm_backend/client/crm-kanban-view.mjs.map +1 -1
- package/dist/modules/crm_backend/client/crm.css +398 -63
- package/dist/modules/crm_backend/index.d.ts.map +1 -1
- package/dist/modules/crm_backend/index.js +12 -4
- package/dist/modules/crm_backend/index.js.map +1 -1
- package/dist/modules/crm_backend/messages.d.ts +212 -0
- package/dist/modules/crm_backend/messages.d.ts.map +1 -1
- package/dist/modules/crm_backend/messages.js +212 -0
- package/dist/modules/crm_backend/messages.js.map +1 -1
- package/dist/modules/crm_backend/relation-control.d.ts +51 -0
- package/dist/modules/crm_backend/relation-control.d.ts.map +1 -0
- package/dist/modules/crm_backend/relation-control.js +107 -0
- package/dist/modules/crm_backend/relation-control.js.map +1 -0
- package/dist/modules/crm_backend/routes.d.ts.map +1 -1
- package/dist/modules/crm_backend/routes.js +1068 -260
- package/dist/modules/crm_backend/routes.js.map +1 -1
- package/dist/modules/crm_backend/screens/activity-planner.d.ts +22 -0
- package/dist/modules/crm_backend/screens/activity-planner.d.ts.map +1 -0
- package/dist/modules/crm_backend/screens/activity-planner.js +159 -0
- package/dist/modules/crm_backend/screens/activity-planner.js.map +1 -0
- package/dist/modules/crm_backend/screens/case-create.d.ts +15 -0
- package/dist/modules/crm_backend/screens/case-create.d.ts.map +1 -0
- package/dist/modules/crm_backend/screens/case-create.js +19 -0
- package/dist/modules/crm_backend/screens/case-create.js.map +1 -0
- package/dist/modules/crm_backend/screens/case-detail.d.ts +46 -0
- package/dist/modules/crm_backend/screens/case-detail.d.ts.map +1 -0
- package/dist/modules/crm_backend/screens/case-detail.js +506 -0
- package/dist/modules/crm_backend/screens/case-detail.js.map +1 -0
- package/dist/modules/crm_backend/screens/cases-list.d.ts +16 -0
- package/dist/modules/crm_backend/screens/cases-list.d.ts.map +1 -0
- package/dist/modules/crm_backend/screens/cases-list.js +86 -0
- package/dist/modules/crm_backend/screens/cases-list.js.map +1 -0
- package/dist/modules/crm_backend/screens/configuration.d.ts +28 -0
- package/dist/modules/crm_backend/screens/configuration.d.ts.map +1 -0
- package/dist/modules/crm_backend/screens/configuration.js +115 -0
- package/dist/modules/crm_backend/screens/configuration.js.map +1 -0
- package/dist/modules/crm_backend/screens/index.d.ts +14 -0
- package/dist/modules/crm_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/crm_backend/screens/index.js +8 -0
- package/dist/modules/crm_backend/screens/index.js.map +1 -0
- package/dist/modules/crm_backend/screens/leaderboard.d.ts +12 -0
- package/dist/modules/crm_backend/screens/leaderboard.d.ts.map +1 -0
- package/dist/modules/crm_backend/screens/leaderboard.js +89 -0
- package/dist/modules/crm_backend/screens/leaderboard.js.map +1 -0
- package/dist/modules/crm_backend/screens/pipeline.d.ts +21 -0
- package/dist/modules/crm_backend/screens/pipeline.d.ts.map +1 -0
- package/dist/modules/crm_backend/screens/pipeline.js +22 -0
- package/dist/modules/crm_backend/screens/pipeline.js.map +1 -0
- package/dist/modules/crm_sale/index.d.ts.map +1 -1
- package/dist/modules/crm_sale/index.js +3 -4
- package/dist/modules/crm_sale/index.js.map +1 -1
- package/dist/modules/crm_sale/messages.d.ts +3 -1
- package/dist/modules/crm_sale/messages.d.ts.map +1 -1
- package/dist/modules/crm_sale/messages.js +4 -0
- package/dist/modules/crm_sale/messages.js.map +1 -1
- package/dist/modules/crm_sale/sale-functions.d.ts +8 -1
- package/dist/modules/crm_sale/sale-functions.d.ts.map +1 -1
- package/dist/modules/crm_sale/sale-functions.js +184 -55
- package/dist/modules/crm_sale/sale-functions.js.map +1 -1
- package/dist/modules/crm_staff_channel/channel-routes.d.ts +2 -0
- package/dist/modules/crm_staff_channel/channel-routes.d.ts.map +1 -0
- package/dist/modules/crm_staff_channel/channel-routes.js +788 -0
- package/dist/modules/crm_staff_channel/channel-routes.js.map +1 -0
- package/dist/modules/crm_staff_channel/index.d.ts +5 -0
- package/dist/modules/crm_staff_channel/index.d.ts.map +1 -0
- package/dist/modules/crm_staff_channel/index.js +30 -0
- package/dist/modules/crm_staff_channel/index.js.map +1 -0
- package/dist/modules/crm_website/functions.d.ts.map +1 -1
- package/dist/modules/crm_website/functions.js +89 -10
- package/dist/modules/crm_website/functions.js.map +1 -1
- package/dist/modules/crm_website/index.js +1 -2
- package/dist/modules/crm_website/index.js.map +1 -1
- package/dist/modules/crm_website/messages.d.ts +4 -1
- package/dist/modules/crm_website/messages.d.ts.map +1 -1
- package/dist/modules/crm_website/messages.js +6 -0
- package/dist/modules/crm_website/messages.js.map +1 -1
- package/dist/modules/crm_website/models.d.ts.map +1 -1
- package/dist/modules/crm_website/models.js +18 -0
- package/dist/modules/crm_website/models.js.map +1 -1
- package/dist/modules/crm_website/routes.d.ts.map +1 -1
- package/dist/modules/crm_website/routes.js +44 -12
- package/dist/modules/crm_website/routes.js.map +1 -1
- package/dist/modules/crm_website/screens.d.ts +7 -1
- package/dist/modules/crm_website/screens.d.ts.map +1 -1
- package/dist/modules/crm_website/screens.js +13 -8
- package/dist/modules/crm_website/screens.js.map +1 -1
- package/dist/modules/flow/functions.d.ts +3 -0
- package/dist/modules/flow/functions.d.ts.map +1 -0
- package/dist/modules/flow/functions.js +1876 -0
- package/dist/modules/flow/functions.js.map +1 -0
- package/dist/modules/flow/index.d.ts +12 -0
- package/dist/modules/flow/index.d.ts.map +1 -0
- package/dist/modules/flow/index.js +30 -0
- package/dist/modules/flow/index.js.map +1 -0
- package/dist/modules/flow/jobs.d.ts +3 -0
- package/dist/modules/flow/jobs.d.ts.map +1 -0
- package/dist/modules/flow/jobs.js +136 -0
- package/dist/modules/flow/jobs.js.map +1 -0
- package/dist/modules/flow/membership.d.ts +72 -0
- package/dist/modules/flow/membership.d.ts.map +1 -0
- package/dist/modules/flow/membership.js +176 -0
- package/dist/modules/flow/membership.js.map +1 -0
- package/dist/modules/flow/messages.d.ts +79 -0
- package/dist/modules/flow/messages.d.ts.map +1 -0
- package/dist/modules/flow/messages.js +152 -0
- package/dist/modules/flow/messages.js.map +1 -0
- package/dist/modules/flow/models.d.ts +3 -0
- package/dist/modules/flow/models.d.ts.map +1 -0
- package/dist/modules/flow/models.js +453 -0
- package/dist/modules/flow/models.js.map +1 -0
- package/dist/modules/flow/operations.d.ts +408 -0
- package/dist/modules/flow/operations.d.ts.map +1 -0
- package/dist/modules/flow/operations.js +1665 -0
- package/dist/modules/flow/operations.js.map +1 -0
- package/dist/modules/flow/pages.d.ts +146 -0
- package/dist/modules/flow/pages.d.ts.map +1 -0
- package/dist/modules/flow/pages.js +394 -0
- package/dist/modules/flow/pages.js.map +1 -0
- package/dist/modules/flow/projects.d.ts +41 -0
- package/dist/modules/flow/projects.d.ts.map +1 -0
- package/dist/modules/flow/projects.js +74 -0
- package/dist/modules/flow/projects.js.map +1 -0
- package/dist/modules/flow/search.d.ts +57 -0
- package/dist/modules/flow/search.d.ts.map +1 -0
- package/dist/modules/flow/search.js +110 -0
- package/dist/modules/flow/search.js.map +1 -0
- package/dist/modules/flow/types.d.ts +17 -0
- package/dist/modules/flow/types.d.ts.map +1 -0
- package/dist/modules/flow/types.js +13 -0
- package/dist/modules/flow/types.js.map +1 -0
- package/dist/modules/flow_backend/functions.d.ts +3 -0
- package/dist/modules/flow_backend/functions.d.ts.map +1 -0
- package/dist/modules/flow_backend/functions.js +162 -0
- package/dist/modules/flow_backend/functions.js.map +1 -0
- package/dist/modules/flow_backend/index.d.ts +3 -0
- package/dist/modules/flow_backend/index.d.ts.map +1 -0
- package/dist/modules/flow_backend/index.js +96 -0
- package/dist/modules/flow_backend/index.js.map +1 -0
- package/dist/modules/flow_backend/islands.d.ts +3 -0
- package/dist/modules/flow_backend/islands.d.ts.map +1 -0
- package/dist/modules/flow_backend/islands.js +31 -0
- package/dist/modules/flow_backend/islands.js.map +1 -0
- package/dist/modules/flow_backend/messages.d.ts +248 -0
- package/dist/modules/flow_backend/messages.d.ts.map +1 -0
- package/dist/modules/flow_backend/messages.js +470 -0
- package/dist/modules/flow_backend/messages.js.map +1 -0
- package/dist/modules/flow_backend/relation-control.d.ts +53 -0
- package/dist/modules/flow_backend/relation-control.d.ts.map +1 -0
- package/dist/modules/flow_backend/relation-control.js +106 -0
- package/dist/modules/flow_backend/relation-control.js.map +1 -0
- package/dist/modules/flow_backend/routes.d.ts +3 -0
- package/dist/modules/flow_backend/routes.d.ts.map +1 -0
- package/dist/modules/flow_backend/routes.js +2519 -0
- package/dist/modules/flow_backend/routes.js.map +1 -0
- package/dist/modules/flow_backend/screens/all-epics.d.ts +19 -0
- package/dist/modules/flow_backend/screens/all-epics.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/all-epics.js +59 -0
- package/dist/modules/flow_backend/screens/all-epics.js.map +1 -0
- package/dist/modules/flow_backend/screens/all-pages.d.ts +19 -0
- package/dist/modules/flow_backend/screens/all-pages.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/all-pages.js +65 -0
- package/dist/modules/flow_backend/screens/all-pages.js.map +1 -0
- package/dist/modules/flow_backend/screens/board.d.ts +5 -0
- package/dist/modules/flow_backend/screens/board.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/board.js +7 -0
- package/dist/modules/flow_backend/screens/board.js.map +1 -0
- package/dist/modules/flow_backend/screens/epic-detail.d.ts +22 -0
- package/dist/modules/flow_backend/screens/epic-detail.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/epic-detail.js +41 -0
- package/dist/modules/flow_backend/screens/epic-detail.js.map +1 -0
- package/dist/modules/flow_backend/screens/gantt.d.ts +21 -0
- package/dist/modules/flow_backend/screens/gantt.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/gantt.js +42 -0
- package/dist/modules/flow_backend/screens/gantt.js.map +1 -0
- package/dist/modules/flow_backend/screens/index.d.ts +29 -0
- package/dist/modules/flow_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/index.js +23 -0
- package/dist/modules/flow_backend/screens/index.js.map +1 -0
- package/dist/modules/flow_backend/screens/issue-detail.d.ts +38 -0
- package/dist/modules/flow_backend/screens/issue-detail.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/issue-detail.js +336 -0
- package/dist/modules/flow_backend/screens/issue-detail.js.map +1 -0
- package/dist/modules/flow_backend/screens/issues.d.ts +34 -0
- package/dist/modules/flow_backend/screens/issues.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/issues.js +118 -0
- package/dist/modules/flow_backend/screens/issues.js.map +1 -0
- package/dist/modules/flow_backend/screens/map.d.ts +13 -0
- package/dist/modules/flow_backend/screens/map.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/map.js +16 -0
- package/dist/modules/flow_backend/screens/map.js.map +1 -0
- package/dist/modules/flow_backend/screens/my-work.d.ts +42 -0
- package/dist/modules/flow_backend/screens/my-work.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/my-work.js +157 -0
- package/dist/modules/flow_backend/screens/my-work.js.map +1 -0
- package/dist/modules/flow_backend/screens/nav.d.ts +3 -0
- package/dist/modules/flow_backend/screens/nav.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/nav.js +79 -0
- package/dist/modules/flow_backend/screens/nav.js.map +1 -0
- package/dist/modules/flow_backend/screens/page-detail.d.ts +31 -0
- package/dist/modules/flow_backend/screens/page-detail.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/page-detail.js +113 -0
- package/dist/modules/flow_backend/screens/page-detail.js.map +1 -0
- package/dist/modules/flow_backend/screens/project-create.d.ts +26 -0
- package/dist/modules/flow_backend/screens/project-create.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/project-create.js +56 -0
- package/dist/modules/flow_backend/screens/project-create.js.map +1 -0
- package/dist/modules/flow_backend/screens/project-epics.d.ts +33 -0
- package/dist/modules/flow_backend/screens/project-epics.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/project-epics.js +90 -0
- package/dist/modules/flow_backend/screens/project-epics.js.map +1 -0
- package/dist/modules/flow_backend/screens/project-pages.d.ts +34 -0
- package/dist/modules/flow_backend/screens/project-pages.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/project-pages.js +66 -0
- package/dist/modules/flow_backend/screens/project-pages.js.map +1 -0
- package/dist/modules/flow_backend/screens/project-settings.d.ts +69 -0
- package/dist/modules/flow_backend/screens/project-settings.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/project-settings.js +248 -0
- package/dist/modules/flow_backend/screens/project-settings.js.map +1 -0
- package/dist/modules/flow_backend/screens/projects-list.d.ts +30 -0
- package/dist/modules/flow_backend/screens/projects-list.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/projects-list.js +121 -0
- package/dist/modules/flow_backend/screens/projects-list.js.map +1 -0
- package/dist/modules/flow_backend/screens/shared.d.ts +28 -0
- package/dist/modules/flow_backend/screens/shared.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/shared.js +46 -0
- package/dist/modules/flow_backend/screens/shared.js.map +1 -0
- package/dist/modules/flow_backend/screens/sprints.d.ts +33 -0
- package/dist/modules/flow_backend/screens/sprints.d.ts.map +1 -0
- package/dist/modules/flow_backend/screens/sprints.js +159 -0
- package/dist/modules/flow_backend/screens/sprints.js.map +1 -0
- package/dist/modules/flow_staff_channel/channel-routes.d.ts +2 -0
- package/dist/modules/flow_staff_channel/channel-routes.d.ts.map +1 -0
- package/dist/modules/flow_staff_channel/channel-routes.js +444 -0
- package/dist/modules/flow_staff_channel/channel-routes.js.map +1 -0
- package/dist/modules/flow_staff_channel/index.d.ts +5 -0
- package/dist/modules/flow_staff_channel/index.d.ts.map +1 -0
- package/dist/modules/flow_staff_channel/index.js +30 -0
- package/dist/modules/flow_staff_channel/index.js.map +1 -0
- package/dist/modules/hospitality_billing/functions.d.ts +18 -0
- package/dist/modules/hospitality_billing/functions.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/functions.js +426 -0
- package/dist/modules/hospitality_billing/functions.js.map +1 -0
- package/dist/modules/hospitality_billing/index.d.ts +3 -0
- package/dist/modules/hospitality_billing/index.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/index.js +25 -0
- package/dist/modules/hospitality_billing/index.js.map +1 -0
- package/dist/modules/hospitality_billing/jobs.d.ts +17 -0
- package/dist/modules/hospitality_billing/jobs.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/jobs.js +83 -0
- package/dist/modules/hospitality_billing/jobs.js.map +1 -0
- package/dist/modules/hospitality_billing/menus.d.ts +9 -0
- package/dist/modules/hospitality_billing/menus.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/menus.js +25 -0
- package/dist/modules/hospitality_billing/menus.js.map +1 -0
- package/dist/modules/hospitality_billing/messages.d.ts +3 -0
- package/dist/modules/hospitality_billing/messages.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/messages.js +163 -0
- package/dist/modules/hospitality_billing/messages.js.map +1 -0
- package/dist/modules/hospitality_billing/models.d.ts +3 -0
- package/dist/modules/hospitality_billing/models.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/models.js +65 -0
- package/dist/modules/hospitality_billing/models.js.map +1 -0
- package/dist/modules/hospitality_billing/routes.d.ts +3 -0
- package/dist/modules/hospitality_billing/routes.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/routes.js +189 -0
- package/dist/modules/hospitality_billing/routes.js.map +1 -0
- package/dist/modules/hospitality_billing/screens/billing.d.ts +3 -0
- package/dist/modules/hospitality_billing/screens/billing.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/screens/billing.js +20 -0
- package/dist/modules/hospitality_billing/screens/billing.js.map +1 -0
- package/dist/modules/hospitality_billing/screens/charge-rules.d.ts +12 -0
- package/dist/modules/hospitality_billing/screens/charge-rules.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/screens/charge-rules.js +86 -0
- package/dist/modules/hospitality_billing/screens/charge-rules.js.map +1 -0
- package/dist/modules/hospitality_billing/screens/index.d.ts +4 -0
- package/dist/modules/hospitality_billing/screens/index.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/screens/index.js +4 -0
- package/dist/modules/hospitality_billing/screens/index.js.map +1 -0
- package/dist/modules/hospitality_billing/screens/page-frame.d.ts +14 -0
- package/dist/modules/hospitality_billing/screens/page-frame.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/screens/page-frame.js +6 -0
- package/dist/modules/hospitality_billing/screens/page-frame.js.map +1 -0
- package/dist/modules/hospitality_billing/screens/shared.d.ts +64 -0
- package/dist/modules/hospitality_billing/screens/shared.d.ts.map +1 -0
- package/dist/modules/hospitality_billing/screens/shared.js +117 -0
- package/dist/modules/hospitality_billing/screens/shared.js.map +1 -0
- package/dist/modules/hospitality_core/calendar.d.ts.map +1 -1
- package/dist/modules/hospitality_core/calendar.js +2 -1
- package/dist/modules/hospitality_core/calendar.js.map +1 -1
- package/dist/modules/hospitality_core/functions.d.ts.map +1 -1
- package/dist/modules/hospitality_core/functions.js +114 -14
- package/dist/modules/hospitality_core/functions.js.map +1 -1
- package/dist/modules/hospitality_core/index.d.ts +2 -2
- package/dist/modules/hospitality_core/index.d.ts.map +1 -1
- package/dist/modules/hospitality_core/index.js +3 -2
- package/dist/modules/hospitality_core/index.js.map +1 -1
- package/dist/modules/hospitality_core/inventory.d.ts +53 -4
- package/dist/modules/hospitality_core/inventory.d.ts.map +1 -1
- package/dist/modules/hospitality_core/inventory.js +121 -14
- package/dist/modules/hospitality_core/inventory.js.map +1 -1
- package/dist/modules/hospitality_core/menus.d.ts.map +1 -1
- package/dist/modules/hospitality_core/menus.js +31 -0
- package/dist/modules/hospitality_core/menus.js.map +1 -1
- package/dist/modules/hospitality_core/messages.d.ts.map +1 -1
- package/dist/modules/hospitality_core/messages.js +383 -183
- package/dist/modules/hospitality_core/messages.js.map +1 -1
- package/dist/modules/hospitality_core/models.d.ts +1 -1
- package/dist/modules/hospitality_core/models.d.ts.map +1 -1
- package/dist/modules/hospitality_core/models.js +47 -2
- package/dist/modules/hospitality_core/models.js.map +1 -1
- package/dist/modules/hospitality_core/night-audit.d.ts +1 -0
- package/dist/modules/hospitality_core/night-audit.d.ts.map +1 -1
- package/dist/modules/hospitality_core/night-audit.js +39 -1
- package/dist/modules/hospitality_core/night-audit.js.map +1 -1
- package/dist/modules/hospitality_core/online-booking.d.ts +5 -0
- package/dist/modules/hospitality_core/online-booking.d.ts.map +1 -0
- package/dist/modules/hospitality_core/online-booking.js +775 -0
- package/dist/modules/hospitality_core/online-booking.js.map +1 -0
- package/dist/modules/hospitality_core/operations.d.ts +21 -1
- package/dist/modules/hospitality_core/operations.d.ts.map +1 -1
- package/dist/modules/hospitality_core/operations.js +432 -67
- package/dist/modules/hospitality_core/operations.js.map +1 -1
- package/dist/modules/hospitality_core/routes.d.ts.map +1 -1
- package/dist/modules/hospitality_core/routes.js +503 -106
- package/dist/modules/hospitality_core/routes.js.map +1 -1
- package/dist/modules/hospitality_core/screens/amenities.d.ts +10 -0
- package/dist/modules/hospitality_core/screens/amenities.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/amenities.js +65 -0
- package/dist/modules/hospitality_core/screens/amenities.js.map +1 -0
- package/dist/modules/hospitality_core/screens/building-detail.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/building-detail.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/building-detail.js +69 -0
- package/dist/modules/hospitality_core/screens/building-detail.js.map +1 -0
- package/dist/modules/hospitality_core/screens/cleaning-task-detail.d.ts +7 -0
- package/dist/modules/hospitality_core/screens/cleaning-task-detail.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/cleaning-task-detail.js +109 -0
- package/dist/modules/hospitality_core/screens/cleaning-task-detail.js.map +1 -0
- package/dist/modules/hospitality_core/screens/cleaning-tasks.d.ts +20 -0
- package/dist/modules/hospitality_core/screens/cleaning-tasks.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/cleaning-tasks.js +139 -0
- package/dist/modules/hospitality_core/screens/cleaning-tasks.js.map +1 -0
- package/dist/modules/hospitality_core/screens/content.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/content.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/content.js +114 -0
- package/dist/modules/hospitality_core/screens/content.js.map +1 -0
- package/dist/modules/hospitality_core/screens/floor-detail.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/floor-detail.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/floor-detail.js +74 -0
- package/dist/modules/hospitality_core/screens/floor-detail.js.map +1 -0
- package/dist/modules/hospitality_core/screens/folio-detail.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/folio-detail.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/folio-detail.js +142 -0
- package/dist/modules/hospitality_core/screens/folio-detail.js.map +1 -0
- package/dist/modules/hospitality_core/screens/folios.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/folios.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/folios.js +7 -0
- package/dist/modules/hospitality_core/screens/folios.js.map +1 -0
- package/dist/modules/hospitality_core/screens/front-desk.d.ts +35 -0
- package/dist/modules/hospitality_core/screens/front-desk.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/front-desk.js +195 -0
- package/dist/modules/hospitality_core/screens/front-desk.js.map +1 -0
- package/dist/modules/hospitality_core/screens/housekeeping-room-detail.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/housekeeping-room-detail.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/housekeeping-room-detail.js +121 -0
- package/dist/modules/hospitality_core/screens/housekeeping-room-detail.js.map +1 -0
- package/dist/modules/hospitality_core/screens/housekeeping-rooms.d.ts +9 -0
- package/dist/modules/hospitality_core/screens/housekeeping-rooms.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/housekeeping-rooms.js +54 -0
- package/dist/modules/hospitality_core/screens/housekeeping-rooms.js.map +1 -0
- package/dist/modules/hospitality_core/screens/index.d.ts +33 -0
- package/dist/modules/hospitality_core/screens/index.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/index.js +33 -0
- package/dist/modules/hospitality_core/screens/index.js.map +1 -0
- package/dist/modules/hospitality_core/screens/inventory.d.ts +8 -0
- package/dist/modules/hospitality_core/screens/inventory.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/inventory.js +122 -0
- package/dist/modules/hospitality_core/screens/inventory.js.map +1 -0
- package/dist/modules/hospitality_core/screens/new-property.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/new-property.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/new-property.js +8 -0
- package/dist/modules/hospitality_core/screens/new-property.js.map +1 -0
- package/dist/modules/hospitality_core/screens/new-room-type.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/new-room-type.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/new-room-type.js +8 -0
- package/dist/modules/hospitality_core/screens/new-room-type.js.map +1 -0
- package/dist/modules/hospitality_core/screens/new-room.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/new-room.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/new-room.js +8 -0
- package/dist/modules/hospitality_core/screens/new-room.js.map +1 -0
- package/dist/modules/hospitality_core/screens/night-audit.d.ts +10 -0
- package/dist/modules/hospitality_core/screens/night-audit.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/night-audit.js +67 -0
- package/dist/modules/hospitality_core/screens/night-audit.js.map +1 -0
- package/dist/modules/hospitality_core/screens/page-frame.d.ts +15 -0
- package/dist/modules/hospitality_core/screens/page-frame.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/page-frame.js +10 -0
- package/dist/modules/hospitality_core/screens/page-frame.js.map +1 -0
- package/dist/modules/hospitality_core/screens/policies.d.ts +10 -0
- package/dist/modules/hospitality_core/screens/policies.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/policies.js +72 -0
- package/dist/modules/hospitality_core/screens/policies.js.map +1 -0
- package/dist/modules/hospitality_core/screens/properties.d.ts +7 -0
- package/dist/modules/hospitality_core/screens/properties.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/properties.js +45 -0
- package/dist/modules/hospitality_core/screens/properties.js.map +1 -0
- package/dist/modules/hospitality_core/screens/property-detail.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/property-detail.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/property-detail.js +92 -0
- package/dist/modules/hospitality_core/screens/property-detail.js.map +1 -0
- package/dist/modules/hospitality_core/screens/rate-plans.d.ts +10 -0
- package/dist/modules/hospitality_core/screens/rate-plans.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/rate-plans.js +123 -0
- package/dist/modules/hospitality_core/screens/rate-plans.js.map +1 -0
- package/dist/modules/hospitality_core/screens/reservation-detail.d.ts +11 -0
- package/dist/modules/hospitality_core/screens/reservation-detail.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/reservation-detail.js +237 -0
- package/dist/modules/hospitality_core/screens/reservation-detail.js.map +1 -0
- package/dist/modules/hospitality_core/screens/reservations.d.ts +17 -0
- package/dist/modules/hospitality_core/screens/reservations.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/reservations.js +166 -0
- package/dist/modules/hospitality_core/screens/reservations.js.map +1 -0
- package/dist/modules/hospitality_core/screens/room-detail.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/room-detail.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/room-detail.js +75 -0
- package/dist/modules/hospitality_core/screens/room-detail.js.map +1 -0
- package/dist/modules/hospitality_core/screens/room-type-detail.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/room-type-detail.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/room-type-detail.js +91 -0
- package/dist/modules/hospitality_core/screens/room-type-detail.js.map +1 -0
- package/dist/modules/hospitality_core/screens/room-types.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/room-types.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/room-types.js +61 -0
- package/dist/modules/hospitality_core/screens/room-types.js.map +1 -0
- package/dist/modules/hospitality_core/screens/rooms.d.ts +10 -0
- package/dist/modules/hospitality_core/screens/rooms.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/rooms.js +150 -0
- package/dist/modules/hospitality_core/screens/rooms.js.map +1 -0
- package/dist/modules/hospitality_core/screens/services.d.ts +18 -0
- package/dist/modules/hospitality_core/screens/services.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/services.js +196 -0
- package/dist/modules/hospitality_core/screens/services.js.map +1 -0
- package/dist/modules/hospitality_core/screens/shared.d.ts +777 -0
- package/dist/modules/hospitality_core/screens/shared.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/shared.js +1586 -0
- package/dist/modules/hospitality_core/screens/shared.js.map +1 -0
- package/dist/modules/hospitality_core/screens/stay-detail.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/stay-detail.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/stay-detail.js +233 -0
- package/dist/modules/hospitality_core/screens/stay-detail.js.map +1 -0
- package/dist/modules/hospitality_core/screens/stay-notices.d.ts +9 -0
- package/dist/modules/hospitality_core/screens/stay-notices.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/stay-notices.js +87 -0
- package/dist/modules/hospitality_core/screens/stay-notices.js.map +1 -0
- package/dist/modules/hospitality_core/screens/stays.d.ts +3 -0
- package/dist/modules/hospitality_core/screens/stays.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/stays.js +7 -0
- package/dist/modules/hospitality_core/screens/stays.js.map +1 -0
- package/dist/modules/hospitality_core/screens/tape-chart.d.ts +7 -0
- package/dist/modules/hospitality_core/screens/tape-chart.d.ts.map +1 -0
- package/dist/modules/hospitality_core/screens/tape-chart.js +99 -0
- package/dist/modules/hospitality_core/screens/tape-chart.js.map +1 -0
- package/dist/modules/hospitality_core/services.d.ts.map +1 -1
- package/dist/modules/hospitality_core/services.js +133 -30
- package/dist/modules/hospitality_core/services.js.map +1 -1
- package/dist/modules/hospitality_core/stay-notices.js +2 -2
- package/dist/modules/hospitality_core/stay-notices.js.map +1 -1
- package/dist/modules/hospitality_core/types.d.ts +26 -5
- package/dist/modules/hospitality_core/types.d.ts.map +1 -1
- package/dist/modules/hospitality_core/types.js +47 -5
- package/dist/modules/hospitality_core/types.js.map +1 -1
- package/dist/modules/hospitality_staff_channel/channel-routes.d.ts +2 -0
- package/dist/modules/hospitality_staff_channel/channel-routes.d.ts.map +1 -0
- package/dist/modules/hospitality_staff_channel/channel-routes.js +1227 -0
- package/dist/modules/hospitality_staff_channel/channel-routes.js.map +1 -0
- package/dist/modules/hospitality_staff_channel/index.d.ts +5 -0
- package/dist/modules/hospitality_staff_channel/index.d.ts.map +1 -0
- package/dist/modules/hospitality_staff_channel/index.js +34 -0
- package/dist/modules/hospitality_staff_channel/index.js.map +1 -0
- package/dist/modules/hr/functions.d.ts.map +1 -1
- package/dist/modules/hr/functions.js +108 -44
- package/dist/modules/hr/functions.js.map +1 -1
- package/dist/modules/hr/index.d.ts.map +1 -1
- package/dist/modules/hr/index.js +0 -1
- package/dist/modules/hr/index.js.map +1 -1
- package/dist/modules/hr_backend/index.d.ts +2 -1
- package/dist/modules/hr_backend/index.d.ts.map +1 -1
- package/dist/modules/hr_backend/index.js +39 -7
- package/dist/modules/hr_backend/index.js.map +1 -1
- package/dist/modules/hr_backend/routes.d.ts.map +1 -1
- package/dist/modules/hr_backend/routes.js +279 -42
- package/dist/modules/hr_backend/routes.js.map +1 -1
- package/dist/modules/hr_backend/screens/employee-form.d.ts +28 -0
- package/dist/modules/hr_backend/screens/employee-form.d.ts.map +1 -0
- package/dist/modules/hr_backend/screens/employee-form.js +110 -0
- package/dist/modules/hr_backend/screens/employee-form.js.map +1 -0
- package/dist/modules/hr_backend/screens/employees-list.d.ts +22 -0
- package/dist/modules/hr_backend/screens/employees-list.d.ts.map +1 -0
- package/dist/modules/hr_backend/screens/employees-list.js +53 -0
- package/dist/modules/hr_backend/screens/employees-list.js.map +1 -0
- package/dist/modules/hr_backend/screens/index.d.ts +5 -0
- package/dist/modules/hr_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/hr_backend/screens/index.js +5 -0
- package/dist/modules/hr_backend/screens/index.js.map +1 -0
- package/dist/modules/hr_backend/screens/leaves-list.d.ts +22 -0
- package/dist/modules/hr_backend/screens/leaves-list.d.ts.map +1 -0
- package/dist/modules/hr_backend/screens/leaves-list.js +78 -0
- package/dist/modules/hr_backend/screens/leaves-list.js.map +1 -0
- package/dist/modules/hr_backend/screens/roster.d.ts +19 -0
- package/dist/modules/hr_backend/screens/roster.d.ts.map +1 -0
- package/dist/modules/hr_backend/screens/roster.js +83 -0
- package/dist/modules/hr_backend/screens/roster.js.map +1 -0
- package/dist/modules/inventory_staff_channel/channel-routes.d.ts +2 -0
- package/dist/modules/inventory_staff_channel/channel-routes.d.ts.map +1 -0
- package/dist/modules/inventory_staff_channel/channel-routes.js +724 -0
- package/dist/modules/inventory_staff_channel/channel-routes.js.map +1 -0
- package/dist/modules/inventory_staff_channel/index.d.ts +5 -0
- package/dist/modules/inventory_staff_channel/index.d.ts.map +1 -0
- package/dist/modules/inventory_staff_channel/index.js +38 -0
- package/dist/modules/inventory_staff_channel/index.js.map +1 -0
- package/dist/modules/livedoc/documents.d.ts +48 -0
- package/dist/modules/livedoc/documents.d.ts.map +1 -0
- package/dist/modules/livedoc/documents.js +99 -0
- package/dist/modules/livedoc/documents.js.map +1 -0
- package/dist/modules/livedoc/functions.d.ts +3 -0
- package/dist/modules/livedoc/functions.d.ts.map +1 -0
- package/dist/modules/livedoc/functions.js +47 -0
- package/dist/modules/livedoc/functions.js.map +1 -0
- package/dist/modules/livedoc/index.d.ts +22 -0
- package/dist/modules/livedoc/index.d.ts.map +1 -0
- package/dist/modules/livedoc/index.js +37 -0
- package/dist/modules/livedoc/index.js.map +1 -0
- package/dist/modules/livedoc/islands.d.ts +3 -0
- package/dist/modules/livedoc/islands.d.ts.map +1 -0
- package/dist/modules/livedoc/islands.js +22 -0
- package/dist/modules/livedoc/islands.js.map +1 -0
- package/dist/modules/livedoc/routes.d.ts +11 -0
- package/dist/modules/livedoc/routes.d.ts.map +1 -0
- package/dist/modules/livedoc/routes.js +232 -0
- package/dist/modules/livedoc/routes.js.map +1 -0
- package/dist/modules/livedoc/sync.d.ts +124 -0
- package/dist/modules/livedoc/sync.d.ts.map +1 -0
- package/dist/modules/livedoc/sync.js +218 -0
- package/dist/modules/livedoc/sync.js.map +1 -0
- package/dist/modules/loyalty/admin-functions.d.ts.map +1 -1
- package/dist/modules/loyalty/admin-functions.js +42 -6
- package/dist/modules/loyalty/admin-functions.js.map +1 -1
- package/dist/modules/loyalty/engine.d.ts +1 -0
- package/dist/modules/loyalty/engine.d.ts.map +1 -1
- package/dist/modules/loyalty/engine.js +88 -28
- package/dist/modules/loyalty/engine.js.map +1 -1
- package/dist/modules/loyalty/index.d.ts.map +1 -1
- package/dist/modules/loyalty/index.js +10 -2
- package/dist/modules/loyalty/index.js.map +1 -1
- package/dist/modules/loyalty/ledger.d.ts.map +1 -1
- package/dist/modules/loyalty/ledger.js +11 -0
- package/dist/modules/loyalty/ledger.js.map +1 -1
- package/dist/modules/loyalty/membership-functions.d.ts.map +1 -1
- package/dist/modules/loyalty/membership-functions.js +23 -7
- package/dist/modules/loyalty/membership-functions.js.map +1 -1
- package/dist/modules/loyalty/messages.d.ts +8 -0
- package/dist/modules/loyalty/messages.d.ts.map +1 -1
- package/dist/modules/loyalty/messages.js +8 -0
- package/dist/modules/loyalty/messages.js.map +1 -1
- package/dist/modules/loyalty/models.d.ts.map +1 -1
- package/dist/modules/loyalty/models.js +20 -0
- package/dist/modules/loyalty/models.js.map +1 -1
- package/dist/modules/loyalty/order-functions.d.ts +16 -1
- package/dist/modules/loyalty/order-functions.d.ts.map +1 -1
- package/dist/modules/loyalty/order-functions.js +513 -291
- package/dist/modules/loyalty/order-functions.js.map +1 -1
- package/dist/modules/loyalty/stats.d.ts +17 -0
- package/dist/modules/loyalty/stats.d.ts.map +1 -0
- package/dist/modules/loyalty/stats.js +178 -0
- package/dist/modules/loyalty/stats.js.map +1 -0
- package/dist/modules/loyalty/stored-value.d.ts +42 -0
- package/dist/modules/loyalty/stored-value.d.ts.map +1 -0
- package/dist/modules/loyalty/stored-value.js +368 -0
- package/dist/modules/loyalty/stored-value.js.map +1 -0
- package/dist/modules/loyalty/types.d.ts +6 -4
- package/dist/modules/loyalty/types.d.ts.map +1 -1
- package/dist/modules/loyalty/types.js +1 -1
- package/dist/modules/loyalty/types.js.map +1 -1
- package/dist/modules/loyalty_backend/index.js +443 -172
- package/dist/modules/loyalty_backend/index.js.map +1 -1
- package/dist/modules/loyalty_backend/messages.d.ts +58 -1
- package/dist/modules/loyalty_backend/messages.d.ts.map +1 -1
- package/dist/modules/loyalty_backend/messages.js +114 -0
- package/dist/modules/loyalty_backend/messages.js.map +1 -1
- package/dist/modules/loyalty_backend/screens/index.d.ts +90 -0
- package/dist/modules/loyalty_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/loyalty_backend/screens/index.js +912 -0
- package/dist/modules/loyalty_backend/screens/index.js.map +1 -0
- package/dist/modules/loyalty_backend/screens/page-frame.d.ts +14 -0
- package/dist/modules/loyalty_backend/screens/page-frame.d.ts.map +1 -0
- package/dist/modules/loyalty_backend/screens/page-frame.js +13 -0
- package/dist/modules/loyalty_backend/screens/page-frame.js.map +1 -0
- package/dist/modules/loyalty_pos/channel.d.ts +2 -0
- package/dist/modules/loyalty_pos/channel.d.ts.map +1 -0
- package/dist/modules/loyalty_pos/channel.js +270 -0
- package/dist/modules/loyalty_pos/channel.js.map +1 -0
- package/dist/modules/loyalty_pos/functions.d.ts +11 -17
- package/dist/modules/loyalty_pos/functions.d.ts.map +1 -1
- package/dist/modules/loyalty_pos/functions.js +454 -94
- package/dist/modules/loyalty_pos/functions.js.map +1 -1
- package/dist/modules/loyalty_pos/index.js +6 -16
- package/dist/modules/loyalty_pos/index.js.map +1 -1
- package/dist/modules/loyalty_pos/jobs.d.ts +3 -0
- package/dist/modules/loyalty_pos/jobs.d.ts.map +1 -0
- package/dist/modules/loyalty_pos/jobs.js +30 -0
- package/dist/modules/loyalty_pos/jobs.js.map +1 -0
- package/dist/modules/loyalty_sale/functions.d.ts +2 -2
- package/dist/modules/loyalty_sale/functions.d.ts.map +1 -1
- package/dist/modules/loyalty_sale/functions.js +53 -34
- package/dist/modules/loyalty_sale/functions.js.map +1 -1
- package/dist/modules/loyalty_sale/index.js +0 -2
- package/dist/modules/loyalty_sale/index.js.map +1 -1
- package/dist/modules/mail/functions.d.ts.map +1 -1
- package/dist/modules/mail/functions.js +48 -6
- package/dist/modules/mail/functions.js.map +1 -1
- package/dist/modules/mail/index.d.ts.map +1 -1
- package/dist/modules/mail/index.js +0 -1
- package/dist/modules/mail/index.js.map +1 -1
- package/dist/modules/mail/operations.d.ts +19 -0
- package/dist/modules/mail/operations.d.ts.map +1 -1
- package/dist/modules/mail/operations.js +69 -0
- package/dist/modules/mail/operations.js.map +1 -1
- package/dist/modules/mail_backend/index.d.ts +1 -1
- package/dist/modules/mail_backend/index.d.ts.map +1 -1
- package/dist/modules/mail_backend/index.js +5 -14
- package/dist/modules/mail_backend/index.js.map +1 -1
- package/dist/modules/mail_backend/islands.js +2 -2
- package/dist/modules/mail_backend/islands.js.map +1 -1
- package/dist/modules/mail_backend/routes.d.ts.map +1 -1
- package/dist/modules/mail_backend/routes.js +25 -20
- package/dist/modules/mail_backend/routes.js.map +1 -1
- package/dist/modules/mail_backend/screens/inbox-list.d.ts +9 -0
- package/dist/modules/mail_backend/screens/inbox-list.d.ts.map +1 -0
- package/dist/modules/mail_backend/screens/inbox-list.js +13 -0
- package/dist/modules/mail_backend/screens/inbox-list.js.map +1 -0
- package/dist/modules/mail_backend/screens/index.d.ts +3 -0
- package/dist/modules/mail_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/mail_backend/screens/index.js +2 -0
- package/dist/modules/mail_backend/screens/index.js.map +1 -0
- package/dist/modules/mail_inbound/index.d.ts.map +1 -1
- package/dist/modules/mail_inbound/index.js +0 -1
- package/dist/modules/mail_inbound/index.js.map +1 -1
- package/dist/modules/mail_inbound_backend/index.d.ts +1 -1
- package/dist/modules/mail_inbound_backend/index.d.ts.map +1 -1
- package/dist/modules/mail_inbound_backend/index.js +3 -12
- package/dist/modules/mail_inbound_backend/index.js.map +1 -1
- package/dist/modules/mail_inbound_backend/routes.d.ts.map +1 -1
- package/dist/modules/mail_inbound_backend/routes.js +6 -21
- package/dist/modules/mail_inbound_backend/routes.js.map +1 -1
- package/dist/modules/mail_inbound_backend/screens/inbound-list.d.ts +8 -0
- package/dist/modules/mail_inbound_backend/screens/inbound-list.d.ts.map +1 -0
- package/dist/modules/mail_inbound_backend/screens/inbound-list.js +20 -0
- package/dist/modules/mail_inbound_backend/screens/inbound-list.js.map +1 -0
- package/dist/modules/mail_inbound_backend/screens/index.d.ts +3 -0
- package/dist/modules/mail_inbound_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/mail_inbound_backend/screens/index.js +2 -0
- package/dist/modules/mail_inbound_backend/screens/index.js.map +1 -0
- package/dist/modules/mail_staff_channel/channel-routes.d.ts +2 -0
- package/dist/modules/mail_staff_channel/channel-routes.d.ts.map +1 -0
- package/dist/modules/mail_staff_channel/channel-routes.js +183 -0
- package/dist/modules/mail_staff_channel/channel-routes.js.map +1 -0
- package/dist/modules/mail_staff_channel/index.d.ts +5 -0
- package/dist/modules/mail_staff_channel/index.d.ts.map +1 -0
- package/dist/modules/mail_staff_channel/index.js +28 -0
- package/dist/modules/mail_staff_channel/index.js.map +1 -0
- package/dist/modules/mail_transport/index.d.ts.map +1 -1
- package/dist/modules/mail_transport/index.js +0 -1
- package/dist/modules/mail_transport/index.js.map +1 -1
- package/dist/modules/mail_transport_backend/index.d.ts +1 -1
- package/dist/modules/mail_transport_backend/index.d.ts.map +1 -1
- package/dist/modules/mail_transport_backend/index.js +3 -12
- package/dist/modules/mail_transport_backend/index.js.map +1 -1
- package/dist/modules/mail_transport_backend/routes.d.ts.map +1 -1
- package/dist/modules/mail_transport_backend/routes.js +23 -22
- package/dist/modules/mail_transport_backend/routes.js.map +1 -1
- package/dist/modules/mail_transport_backend/screens/index.d.ts +3 -0
- package/dist/modules/mail_transport_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/mail_transport_backend/screens/index.js +2 -0
- package/dist/modules/mail_transport_backend/screens/index.js.map +1 -0
- package/dist/modules/mail_transport_backend/screens/outbox-list.d.ts +9 -0
- package/dist/modules/mail_transport_backend/screens/outbox-list.d.ts.map +1 -0
- package/dist/modules/mail_transport_backend/screens/outbox-list.js +29 -0
- package/dist/modules/mail_transport_backend/screens/outbox-list.js.map +1 -0
- package/dist/modules/manufacturing/functions.d.ts +3 -0
- package/dist/modules/manufacturing/functions.d.ts.map +1 -0
- package/dist/modules/manufacturing/functions.js +912 -0
- package/dist/modules/manufacturing/functions.js.map +1 -0
- package/dist/modules/manufacturing/index.d.ts +6 -0
- package/dist/modules/manufacturing/index.d.ts.map +1 -0
- package/dist/modules/manufacturing/index.js +42 -0
- package/dist/modules/manufacturing/index.js.map +1 -0
- package/dist/modules/manufacturing/models.d.ts +8 -0
- package/dist/modules/manufacturing/models.d.ts.map +1 -0
- package/dist/modules/manufacturing/models.js +145 -0
- package/dist/modules/manufacturing/models.js.map +1 -0
- package/dist/modules/manufacturing/relations.d.ts.map +1 -0
- package/dist/modules/manufacturing/relations.js +37 -0
- package/dist/modules/manufacturing/relations.js.map +1 -0
- package/dist/modules/manufacturing/types.d.ts +7 -0
- package/dist/modules/manufacturing/types.d.ts.map +1 -0
- package/dist/modules/manufacturing/types.js +11 -0
- package/dist/modules/manufacturing/types.js.map +1 -0
- package/dist/modules/manufacturing_backend/index.d.ts +5 -0
- package/dist/modules/manufacturing_backend/index.d.ts.map +1 -0
- package/dist/modules/manufacturing_backend/index.js +146 -0
- package/dist/modules/manufacturing_backend/index.js.map +1 -0
- package/dist/modules/manufacturing_backend/routes.d.ts +3 -0
- package/dist/modules/manufacturing_backend/routes.d.ts.map +1 -0
- package/dist/modules/manufacturing_backend/routes.js +477 -0
- package/dist/modules/manufacturing_backend/routes.js.map +1 -0
- package/dist/modules/manufacturing_backend/screens/bom-create.d.ts +15 -0
- package/dist/modules/manufacturing_backend/screens/bom-create.d.ts.map +1 -0
- package/dist/modules/manufacturing_backend/screens/bom-create.js +39 -0
- package/dist/modules/manufacturing_backend/screens/bom-create.js.map +1 -0
- package/dist/modules/manufacturing_backend/screens/boms-list.d.ts +18 -0
- package/dist/modules/manufacturing_backend/screens/boms-list.d.ts.map +1 -0
- package/dist/modules/manufacturing_backend/screens/boms-list.js +36 -0
- package/dist/modules/manufacturing_backend/screens/boms-list.js.map +1 -0
- package/dist/modules/manufacturing_backend/screens/index.d.ts +8 -0
- package/dist/modules/manufacturing_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/manufacturing_backend/screens/index.js +8 -0
- package/dist/modules/manufacturing_backend/screens/index.js.map +1 -0
- package/dist/modules/manufacturing_backend/screens/order-create.d.ts +13 -0
- package/dist/modules/manufacturing_backend/screens/order-create.d.ts.map +1 -0
- package/dist/modules/manufacturing_backend/screens/order-create.js +20 -0
- package/dist/modules/manufacturing_backend/screens/order-create.js.map +1 -0
- package/dist/modules/manufacturing_backend/screens/order-execution.d.ts +7 -0
- package/dist/modules/manufacturing_backend/screens/order-execution.d.ts.map +1 -0
- package/dist/modules/manufacturing_backend/screens/order-execution.js +129 -0
- package/dist/modules/manufacturing_backend/screens/order-execution.js.map +1 -0
- package/dist/modules/manufacturing_backend/screens/orders-list.d.ts +21 -0
- package/dist/modules/manufacturing_backend/screens/orders-list.d.ts.map +1 -0
- package/dist/modules/manufacturing_backend/screens/orders-list.js +49 -0
- package/dist/modules/manufacturing_backend/screens/orders-list.js.map +1 -0
- package/dist/modules/manufacturing_backend/screens/work-center-form.d.ts +24 -0
- package/dist/modules/manufacturing_backend/screens/work-center-form.d.ts.map +1 -0
- package/dist/modules/manufacturing_backend/screens/work-center-form.js +80 -0
- package/dist/modules/manufacturing_backend/screens/work-center-form.js.map +1 -0
- package/dist/modules/manufacturing_backend/screens/work-centers-list.d.ts +23 -0
- package/dist/modules/manufacturing_backend/screens/work-centers-list.d.ts.map +1 -0
- package/dist/modules/manufacturing_backend/screens/work-centers-list.js +61 -0
- package/dist/modules/manufacturing_backend/screens/work-centers-list.js.map +1 -0
- package/dist/modules/oauth/index.d.ts.map +1 -1
- package/dist/modules/oauth/index.js +0 -1
- package/dist/modules/oauth/index.js.map +1 -1
- package/dist/modules/oauth/models.d.ts.map +1 -1
- package/dist/modules/oauth/models.js +2 -1
- package/dist/modules/oauth/models.js.map +1 -1
- package/dist/modules/oauth_backend/index.d.ts +1 -1
- package/dist/modules/oauth_backend/index.d.ts.map +1 -1
- package/dist/modules/oauth_backend/index.js +3 -5
- package/dist/modules/oauth_backend/index.js.map +1 -1
- package/dist/modules/oauth_backend/messages.d.ts +4 -0
- package/dist/modules/oauth_backend/messages.d.ts.map +1 -1
- package/dist/modules/oauth_backend/messages.js +4 -0
- package/dist/modules/oauth_backend/messages.js.map +1 -1
- package/dist/modules/oauth_backend/routes.d.ts.map +1 -1
- package/dist/modules/oauth_backend/routes.js +28 -30
- package/dist/modules/oauth_backend/routes.js.map +1 -1
- package/dist/modules/oauth_backend/screens/index.d.ts +66 -0
- package/dist/modules/oauth_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/oauth_backend/screens/index.js +306 -0
- package/dist/modules/oauth_backend/screens/index.js.map +1 -0
- package/dist/modules/partner/functions.d.ts.map +1 -1
- package/dist/modules/partner/functions.js +74 -6
- package/dist/modules/partner/functions.js.map +1 -1
- package/dist/modules/partner/index.d.ts.map +1 -1
- package/dist/modules/partner/index.js +0 -1
- package/dist/modules/partner/index.js.map +1 -1
- package/dist/modules/partner/models.d.ts +4 -4
- package/dist/modules/partner/models.d.ts.map +1 -1
- package/dist/modules/partner/models.js +9 -7
- package/dist/modules/partner/models.js.map +1 -1
- package/dist/modules/partner/types.d.ts +2 -2
- package/dist/modules/partner/types.js +2 -2
- package/dist/modules/partner_backend/client/address-view.mjs +5 -5
- package/dist/modules/partner_backend/client/address-view.mjs.map +1 -1
- package/dist/modules/partner_backend/client/address.css +22 -10
- package/dist/modules/partner_backend/client/partner.css +116 -0
- package/dist/modules/partner_backend/index.d.ts +1 -1
- package/dist/modules/partner_backend/index.d.ts.map +1 -1
- package/dist/modules/partner_backend/index.js +34 -4
- package/dist/modules/partner_backend/index.js.map +1 -1
- package/dist/modules/partner_backend/menus.js +2 -2
- package/dist/modules/partner_backend/menus.js.map +1 -1
- package/dist/modules/partner_backend/routes.d.ts +3 -1
- package/dist/modules/partner_backend/routes.d.ts.map +1 -1
- package/dist/modules/partner_backend/routes.js +236 -91
- package/dist/modules/partner_backend/routes.js.map +1 -1
- package/dist/modules/partner_backend/screens/form.d.ts +21 -0
- package/dist/modules/partner_backend/screens/form.d.ts.map +1 -0
- package/dist/modules/partner_backend/screens/form.js +101 -0
- package/dist/modules/partner_backend/screens/form.js.map +1 -0
- package/dist/modules/partner_backend/screens/index.d.ts +5 -0
- package/dist/modules/partner_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/partner_backend/screens/index.js +4 -0
- package/dist/modules/partner_backend/screens/index.js.map +1 -0
- package/dist/modules/partner_backend/screens/list.d.ts +6 -0
- package/dist/modules/partner_backend/screens/list.d.ts.map +1 -0
- package/dist/modules/partner_backend/screens/list.js +94 -0
- package/dist/modules/partner_backend/screens/list.js.map +1 -0
- package/dist/modules/partner_backend/screens/new.d.ts +5 -0
- package/dist/modules/partner_backend/screens/new.d.ts.map +1 -0
- package/dist/modules/partner_backend/screens/new.js +58 -0
- package/dist/modules/partner_backend/screens/new.js.map +1 -0
- package/dist/modules/partner_backend/screens/types.d.ts +44 -0
- package/dist/modules/partner_backend/screens/types.d.ts.map +1 -0
- package/dist/modules/partner_backend/screens/types.js +2 -0
- package/dist/modules/partner_backend/screens/types.js.map +1 -0
- package/dist/modules/partner_mail_backend/index.d.ts +5 -0
- package/dist/modules/partner_mail_backend/index.d.ts.map +1 -0
- package/dist/modules/partner_mail_backend/index.js +29 -0
- package/dist/modules/partner_mail_backend/index.js.map +1 -0
- package/dist/modules/pos/functions.d.ts +18 -2
- package/dist/modules/pos/functions.d.ts.map +1 -1
- package/dist/modules/pos/functions.js +3279 -345
- package/dist/modules/pos/functions.js.map +1 -1
- package/dist/modules/pos/index.d.ts +2 -1
- package/dist/modules/pos/index.d.ts.map +1 -1
- package/dist/modules/pos/index.js +5 -5
- package/dist/modules/pos/index.js.map +1 -1
- package/dist/modules/pos/models.d.ts.map +1 -1
- package/dist/modules/pos/models.js +189 -1
- package/dist/modules/pos/models.js.map +1 -1
- package/dist/modules/pos/relations.d.ts.map +1 -1
- package/dist/modules/pos/relations.js +11 -0
- package/dist/modules/pos/relations.js.map +1 -1
- package/dist/modules/pos_backend/index.js +182 -154
- package/dist/modules/pos_backend/index.js.map +1 -1
- package/dist/modules/pos_backend/screens.d.ts +1 -0
- package/dist/modules/pos_backend/screens.d.ts.map +1 -1
- package/dist/modules/pos_backend/screens.js +28 -38
- package/dist/modules/pos_backend/screens.js.map +1 -1
- package/dist/modules/pos_channel/catalog.d.ts +27 -0
- package/dist/modules/pos_channel/catalog.d.ts.map +1 -0
- package/dist/modules/pos_channel/catalog.js +310 -0
- package/dist/modules/pos_channel/catalog.js.map +1 -0
- package/dist/modules/pos_channel/index.d.ts +7 -0
- package/dist/modules/pos_channel/index.d.ts.map +1 -0
- package/dist/modules/pos_channel/index.js +61 -0
- package/dist/modules/pos_channel/index.js.map +1 -0
- package/dist/modules/pos_channel/offline.d.ts +66 -0
- package/dist/modules/pos_channel/offline.d.ts.map +1 -0
- package/dist/modules/pos_channel/offline.js +16 -0
- package/dist/modules/pos_channel/offline.js.map +1 -0
- package/dist/modules/pos_channel/operations.d.ts +422 -0
- package/dist/modules/pos_channel/operations.d.ts.map +1 -0
- package/dist/modules/pos_channel/operations.js +1781 -0
- package/dist/modules/pos_channel/operations.js.map +1 -0
- package/dist/modules/pos_channel/sync.d.ts +6 -0
- package/dist/modules/pos_channel/sync.d.ts.map +1 -0
- package/dist/modules/pos_channel/sync.js +1161 -0
- package/dist/modules/pos_channel/sync.js.map +1 -0
- package/dist/modules/pricing/index.d.ts.map +1 -1
- package/dist/modules/pricing/index.js +3 -4
- package/dist/modules/pricing/index.js.map +1 -1
- package/dist/modules/pricing_backend/index.js +135 -78
- package/dist/modules/pricing_backend/index.js.map +1 -1
- package/dist/modules/pricing_backend/screens/index.d.ts +5 -0
- package/dist/modules/pricing_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/pricing_backend/screens/index.js +4 -0
- package/dist/modules/pricing_backend/screens/index.js.map +1 -0
- package/dist/modules/pricing_backend/screens/pricelist-create.d.ts +10 -0
- package/dist/modules/pricing_backend/screens/pricelist-create.d.ts.map +1 -0
- package/dist/modules/pricing_backend/screens/pricelist-create.js +30 -0
- package/dist/modules/pricing_backend/screens/pricelist-create.js.map +1 -0
- package/dist/modules/pricing_backend/screens/pricelist-detail.d.ts +15 -0
- package/dist/modules/pricing_backend/screens/pricelist-detail.d.ts.map +1 -0
- package/dist/modules/pricing_backend/screens/pricelist-detail.js +164 -0
- package/dist/modules/pricing_backend/screens/pricelist-detail.js.map +1 -0
- package/dist/modules/pricing_backend/screens/pricelists-list.d.ts +11 -0
- package/dist/modules/pricing_backend/screens/pricelists-list.d.ts.map +1 -0
- package/dist/modules/pricing_backend/screens/pricelists-list.js +27 -0
- package/dist/modules/pricing_backend/screens/pricelists-list.js.map +1 -0
- package/dist/modules/pricing_backend/screens/shared.d.ts +21 -0
- package/dist/modules/pricing_backend/screens/shared.d.ts.map +1 -0
- package/dist/modules/pricing_backend/screens/shared.js +3 -0
- package/dist/modules/pricing_backend/screens/shared.js.map +1 -0
- package/dist/modules/product/functions.d.ts.map +1 -1
- package/dist/modules/product/functions.js +679 -50
- package/dist/modules/product/functions.js.map +1 -1
- package/dist/modules/product/index.d.ts +2 -0
- package/dist/modules/product/index.d.ts.map +1 -1
- package/dist/modules/product/index.js +2 -2
- package/dist/modules/product/index.js.map +1 -1
- package/dist/modules/product/models.d.ts +1 -1
- package/dist/modules/product/models.d.ts.map +1 -1
- package/dist/modules/product/models.js +27 -4
- package/dist/modules/product/models.js.map +1 -1
- package/dist/modules/product/relations.d.ts.map +1 -1
- package/dist/modules/product/relations.js +4 -0
- package/dist/modules/product/relations.js.map +1 -1
- package/dist/modules/product/sellable.d.ts +26 -0
- package/dist/modules/product/sellable.d.ts.map +1 -0
- package/dist/modules/product/sellable.js +56 -0
- package/dist/modules/product/sellable.js.map +1 -0
- package/dist/modules/product/types.d.ts +2 -2
- package/dist/modules/product/views.d.ts.map +1 -1
- package/dist/modules/product/views.js +5 -1
- package/dist/modules/product/views.js.map +1 -1
- package/dist/modules/product_activity_backend/index.d.ts.map +1 -1
- package/dist/modules/product_activity_backend/index.js +2 -3
- package/dist/modules/product_activity_backend/index.js.map +1 -1
- package/dist/modules/product_backend/client/media-upload-view.d.mts.map +1 -1
- package/dist/modules/product_backend/client/media-upload-view.mjs +1 -0
- package/dist/modules/product_backend/client/media-upload-view.mjs.map +1 -1
- package/dist/modules/product_backend/client/product.css +964 -0
- package/dist/modules/product_backend/index.d.ts +5 -6
- package/dist/modules/product_backend/index.d.ts.map +1 -1
- package/dist/modules/product_backend/index.js +203 -14
- package/dist/modules/product_backend/index.js.map +1 -1
- package/dist/modules/product_backend/menus.js +2 -2
- package/dist/modules/product_backend/menus.js.map +1 -1
- package/dist/modules/product_backend/relation-control.d.ts +85 -0
- package/dist/modules/product_backend/relation-control.d.ts.map +1 -0
- package/dist/modules/product_backend/relation-control.js +129 -0
- package/dist/modules/product_backend/relation-control.js.map +1 -0
- package/dist/modules/product_backend/routes.d.ts.map +1 -1
- package/dist/modules/product_backend/routes.js +502 -196
- package/dist/modules/product_backend/routes.js.map +1 -1
- package/dist/modules/product_backend/screens/attributes.d.ts +7 -0
- package/dist/modules/product_backend/screens/attributes.d.ts.map +1 -0
- package/dist/modules/product_backend/screens/attributes.js +66 -0
- package/dist/modules/product_backend/screens/attributes.js.map +1 -0
- package/dist/modules/product_backend/screens/create.d.ts +16 -0
- package/dist/modules/product_backend/screens/create.d.ts.map +1 -0
- package/dist/modules/product_backend/screens/create.js +86 -0
- package/dist/modules/product_backend/screens/create.js.map +1 -0
- package/dist/modules/product_backend/screens/detail.d.ts +87 -0
- package/dist/modules/product_backend/screens/detail.d.ts.map +1 -0
- package/dist/modules/product_backend/screens/detail.js +381 -0
- package/dist/modules/product_backend/screens/detail.js.map +1 -0
- package/dist/modules/product_backend/screens/favorite.d.ts +6 -0
- package/dist/modules/product_backend/screens/favorite.d.ts.map +1 -0
- package/dist/modules/product_backend/screens/favorite.js +43 -0
- package/dist/modules/product_backend/screens/favorite.js.map +1 -0
- package/dist/modules/product_backend/screens/index.d.ts +10 -0
- package/dist/modules/product_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/product_backend/screens/index.js +7 -0
- package/dist/modules/product_backend/screens/index.js.map +1 -0
- package/dist/modules/product_backend/screens/list.d.ts +54 -0
- package/dist/modules/product_backend/screens/list.d.ts.map +1 -0
- package/dist/modules/product_backend/screens/list.js +124 -0
- package/dist/modules/product_backend/screens/list.js.map +1 -0
- package/dist/modules/product_backend/screens/variant.d.ts +9 -0
- package/dist/modules/product_backend/screens/variant.d.ts.map +1 -0
- package/dist/modules/product_backend/screens/variant.js +113 -0
- package/dist/modules/product_backend/screens/variant.js.map +1 -0
- package/dist/modules/product_mail_backend/index.d.ts.map +1 -1
- package/dist/modules/product_mail_backend/index.js +2 -3
- package/dist/modules/product_mail_backend/index.js.map +1 -1
- package/dist/modules/product_media/functions.d.ts.map +1 -1
- package/dist/modules/product_media/functions.js +59 -6
- package/dist/modules/product_media/functions.js.map +1 -1
- package/dist/modules/product_media/index.js +0 -1
- package/dist/modules/product_media/index.js.map +1 -1
- package/dist/modules/product_variant_activity_backend/index.d.ts.map +1 -1
- package/dist/modules/product_variant_activity_backend/index.js +2 -3
- package/dist/modules/product_variant_activity_backend/index.js.map +1 -1
- package/dist/modules/product_variant_mail_backend/index.d.ts.map +1 -1
- package/dist/modules/product_variant_mail_backend/index.js +2 -3
- package/dist/modules/product_variant_mail_backend/index.js.map +1 -1
- package/dist/modules/purchase/functions.d.ts.map +1 -1
- package/dist/modules/purchase/functions.js +852 -225
- package/dist/modules/purchase/functions.js.map +1 -1
- package/dist/modules/purchase/index.d.ts.map +1 -1
- package/dist/modules/purchase/index.js +30 -5
- package/dist/modules/purchase/index.js.map +1 -1
- package/dist/modules/purchase/models.d.ts.map +1 -1
- package/dist/modules/purchase/models.js +1 -0
- package/dist/modules/purchase/models.js.map +1 -1
- package/dist/modules/purchase/reports.d.ts +4 -0
- package/dist/modules/purchase/reports.d.ts.map +1 -0
- package/dist/modules/purchase/reports.js +86 -0
- package/dist/modules/purchase/reports.js.map +1 -0
- package/dist/modules/purchase_backend/index.js +513 -112
- package/dist/modules/purchase_backend/index.js.map +1 -1
- package/dist/modules/purchase_backend/screens/index.d.ts +10 -0
- package/dist/modules/purchase_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/purchase_backend/screens/index.js +10 -0
- package/dist/modules/purchase_backend/screens/index.js.map +1 -0
- package/dist/modules/purchase_backend/screens/order-detail.d.ts +31 -0
- package/dist/modules/purchase_backend/screens/order-detail.d.ts.map +1 -0
- package/dist/modules/purchase_backend/screens/order-detail.js +204 -0
- package/dist/modules/purchase_backend/screens/order-detail.js.map +1 -0
- package/dist/modules/purchase_backend/screens/order-list-shared.d.ts +7 -0
- package/dist/modules/purchase_backend/screens/order-list-shared.d.ts.map +1 -0
- package/dist/modules/purchase_backend/screens/order-list-shared.js +58 -0
- package/dist/modules/purchase_backend/screens/order-list-shared.js.map +1 -0
- package/dist/modules/purchase_backend/screens/overview.d.ts +19 -0
- package/dist/modules/purchase_backend/screens/overview.d.ts.map +1 -0
- package/dist/modules/purchase_backend/screens/overview.js +52 -0
- package/dist/modules/purchase_backend/screens/overview.js.map +1 -0
- package/dist/modules/purchase_backend/screens/purchase-orders-list.d.ts +14 -0
- package/dist/modules/purchase_backend/screens/purchase-orders-list.d.ts.map +1 -0
- package/dist/modules/purchase_backend/screens/purchase-orders-list.js +26 -0
- package/dist/modules/purchase_backend/screens/purchase-orders-list.js.map +1 -0
- package/dist/modules/purchase_backend/screens/rfq-create.d.ts +16 -0
- package/dist/modules/purchase_backend/screens/rfq-create.d.ts.map +1 -0
- package/dist/modules/purchase_backend/screens/rfq-create.js +24 -0
- package/dist/modules/purchase_backend/screens/rfq-create.js.map +1 -0
- package/dist/modules/purchase_backend/screens/rfqs-list.d.ts +18 -0
- package/dist/modules/purchase_backend/screens/rfqs-list.d.ts.map +1 -0
- package/dist/modules/purchase_backend/screens/rfqs-list.js +28 -0
- package/dist/modules/purchase_backend/screens/rfqs-list.js.map +1 -0
- package/dist/modules/purchase_backend/screens/shared.d.ts +18 -0
- package/dist/modules/purchase_backend/screens/shared.d.ts.map +1 -0
- package/dist/modules/purchase_backend/screens/shared.js +30 -0
- package/dist/modules/purchase_backend/screens/shared.js.map +1 -0
- package/dist/modules/purchase_backend/screens/vendor-pricelist-create.d.ts +20 -0
- package/dist/modules/purchase_backend/screens/vendor-pricelist-create.d.ts.map +1 -0
- package/dist/modules/purchase_backend/screens/vendor-pricelist-create.js +25 -0
- package/dist/modules/purchase_backend/screens/vendor-pricelist-create.js.map +1 -0
- package/dist/modules/purchase_backend/screens/vendor-pricelists-list.d.ts +33 -0
- package/dist/modules/purchase_backend/screens/vendor-pricelists-list.d.ts.map +1 -0
- package/dist/modules/purchase_backend/screens/vendor-pricelists-list.js +73 -0
- package/dist/modules/purchase_backend/screens/vendor-pricelists-list.js.map +1 -0
- package/dist/modules/purchase_staff_channel/channel-routes.d.ts +2 -0
- package/dist/modules/purchase_staff_channel/channel-routes.d.ts.map +1 -0
- package/dist/modules/purchase_staff_channel/channel-routes.js +119 -0
- package/dist/modules/purchase_staff_channel/channel-routes.js.map +1 -0
- package/dist/modules/purchase_staff_channel/index.d.ts +8 -0
- package/dist/modules/purchase_staff_channel/index.d.ts.map +1 -0
- package/dist/modules/purchase_staff_channel/index.js +45 -0
- package/dist/modules/purchase_staff_channel/index.js.map +1 -0
- package/dist/modules/purchase_staff_channel/order-routes.d.ts +2 -0
- package/dist/modules/purchase_staff_channel/order-routes.d.ts.map +1 -0
- package/dist/modules/purchase_staff_channel/order-routes.js +754 -0
- package/dist/modules/purchase_staff_channel/order-routes.js.map +1 -0
- package/dist/modules/purchase_staff_channel/product-routes.d.ts +2 -0
- package/dist/modules/purchase_staff_channel/product-routes.d.ts.map +1 -0
- package/dist/modules/purchase_staff_channel/product-routes.js +183 -0
- package/dist/modules/purchase_staff_channel/product-routes.js.map +1 -0
- package/dist/modules/purchase_staff_channel/vendor-bill-routes.d.ts +2 -0
- package/dist/modules/purchase_staff_channel/vendor-bill-routes.d.ts.map +1 -0
- package/dist/modules/purchase_staff_channel/vendor-bill-routes.js +189 -0
- package/dist/modules/purchase_staff_channel/vendor-bill-routes.js.map +1 -0
- package/dist/modules/quality/functions.d.ts +3 -0
- package/dist/modules/quality/functions.d.ts.map +1 -0
- package/dist/modules/quality/functions.js +381 -0
- package/dist/modules/quality/functions.js.map +1 -0
- package/dist/modules/quality/index.d.ts +5 -0
- package/dist/modules/quality/index.d.ts.map +1 -0
- package/dist/modules/quality/index.js +19 -0
- package/dist/modules/quality/index.js.map +1 -0
- package/dist/modules/quality/models.d.ts +3 -0
- package/dist/modules/quality/models.d.ts.map +1 -0
- package/dist/modules/quality/models.js +91 -0
- package/dist/modules/quality/models.js.map +1 -0
- package/dist/modules/quality_staff_channel/channel-routes.d.ts +2 -0
- package/dist/modules/quality_staff_channel/channel-routes.d.ts.map +1 -0
- package/dist/modules/quality_staff_channel/channel-routes.js +495 -0
- package/dist/modules/quality_staff_channel/channel-routes.js.map +1 -0
- package/dist/modules/quality_staff_channel/index.d.ts +5 -0
- package/dist/modules/quality_staff_channel/index.d.ts.map +1 -0
- package/dist/modules/quality_staff_channel/index.js +30 -0
- package/dist/modules/quality_staff_channel/index.js.map +1 -0
- package/dist/modules/report/functions.d.ts +3 -0
- package/dist/modules/report/functions.d.ts.map +1 -0
- package/dist/modules/report/functions.js +197 -0
- package/dist/modules/report/functions.js.map +1 -0
- package/dist/modules/report/index.d.ts +3 -0
- package/dist/modules/report/index.d.ts.map +1 -0
- package/dist/modules/report/index.js +21 -0
- package/dist/modules/report/index.js.map +1 -0
- package/dist/modules/report/jobs.d.ts +3 -0
- package/dist/modules/report/jobs.d.ts.map +1 -0
- package/dist/modules/report/jobs.js +18 -0
- package/dist/modules/report/jobs.js.map +1 -0
- package/dist/modules/report/models.d.ts +3 -0
- package/dist/modules/report/models.d.ts.map +1 -0
- package/dist/modules/report/models.js +45 -0
- package/dist/modules/report/models.js.map +1 -0
- package/dist/modules/report/routes.d.ts +19 -0
- package/dist/modules/report/routes.d.ts.map +1 -0
- package/dist/modules/report/routes.js +138 -0
- package/dist/modules/report/routes.js.map +1 -0
- package/dist/modules/report_backend/index.d.ts +3 -0
- package/dist/modules/report_backend/index.d.ts.map +1 -0
- package/dist/modules/report_backend/index.js +67 -0
- package/dist/modules/report_backend/index.js.map +1 -0
- package/dist/modules/report_backend/routes.d.ts +10 -0
- package/dist/modules/report_backend/routes.d.ts.map +1 -0
- package/dist/modules/report_backend/routes.js +87 -0
- package/dist/modules/report_backend/routes.js.map +1 -0
- package/dist/modules/report_backend/screens/index.d.ts +13 -0
- package/dist/modules/report_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/report_backend/screens/index.js +91 -0
- package/dist/modules/report_backend/screens/index.js.map +1 -0
- package/dist/modules/sale/functions.d.ts.map +1 -1
- package/dist/modules/sale/functions.js +796 -238
- package/dist/modules/sale/functions.js.map +1 -1
- package/dist/modules/sale/index.d.ts.map +1 -1
- package/dist/modules/sale/index.js +44 -5
- package/dist/modules/sale/index.js.map +1 -1
- package/dist/modules/sale/models.d.ts.map +1 -1
- package/dist/modules/sale/models.js +47 -1
- package/dist/modules/sale/models.js.map +1 -1
- package/dist/modules/sale/relations.d.ts.map +1 -1
- package/dist/modules/sale/relations.js +6 -0
- package/dist/modules/sale/relations.js.map +1 -1
- package/dist/modules/sale/reports.d.ts +4 -0
- package/dist/modules/sale/reports.d.ts.map +1 -0
- package/dist/modules/sale/reports.js +132 -0
- package/dist/modules/sale/reports.js.map +1 -0
- package/dist/modules/sale/scope.d.ts +31 -0
- package/dist/modules/sale/scope.d.ts.map +1 -0
- package/dist/modules/sale/scope.js +34 -0
- package/dist/modules/sale/scope.js.map +1 -0
- package/dist/modules/sale_activity_backend/index.d.ts.map +1 -1
- package/dist/modules/sale_activity_backend/index.js +0 -1
- package/dist/modules/sale_activity_backend/index.js.map +1 -1
- package/dist/modules/sale_backend/index.js +338 -121
- package/dist/modules/sale_backend/index.js.map +1 -1
- package/dist/modules/sale_backend/screens/index.d.ts +9 -0
- package/dist/modules/sale_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/sale_backend/screens/index.js +9 -0
- package/dist/modules/sale_backend/screens/index.js.map +1 -0
- package/dist/modules/sale_backend/screens/invoicing-policies-list.d.ts +14 -0
- package/dist/modules/sale_backend/screens/invoicing-policies-list.d.ts.map +1 -0
- package/dist/modules/sale_backend/screens/invoicing-policies-list.js +48 -0
- package/dist/modules/sale_backend/screens/invoicing-policies-list.js.map +1 -0
- package/dist/modules/sale_backend/screens/invoicing-policy-create.d.ts +14 -0
- package/dist/modules/sale_backend/screens/invoicing-policy-create.d.ts.map +1 -0
- package/dist/modules/sale_backend/screens/invoicing-policy-create.js +38 -0
- package/dist/modules/sale_backend/screens/invoicing-policy-create.js.map +1 -0
- package/dist/modules/sale_backend/screens/order-detail.d.ts +43 -0
- package/dist/modules/sale_backend/screens/order-detail.d.ts.map +1 -0
- package/dist/modules/sale_backend/screens/order-detail.js +226 -0
- package/dist/modules/sale_backend/screens/order-detail.js.map +1 -0
- package/dist/modules/sale_backend/screens/overview.d.ts +31 -0
- package/dist/modules/sale_backend/screens/overview.d.ts.map +1 -0
- package/dist/modules/sale_backend/screens/overview.js +73 -0
- package/dist/modules/sale_backend/screens/overview.js.map +1 -0
- package/dist/modules/sale_backend/screens/quotation-create.d.ts +13 -0
- package/dist/modules/sale_backend/screens/quotation-create.d.ts.map +1 -0
- package/dist/modules/sale_backend/screens/quotation-create.js +19 -0
- package/dist/modules/sale_backend/screens/quotation-create.js.map +1 -0
- package/dist/modules/sale_backend/screens/quotations-list.d.ts +25 -0
- package/dist/modules/sale_backend/screens/quotations-list.d.ts.map +1 -0
- package/dist/modules/sale_backend/screens/quotations-list.js +96 -0
- package/dist/modules/sale_backend/screens/quotations-list.js.map +1 -0
- package/dist/modules/sale_backend/screens/sales-orders-list.d.ts +25 -0
- package/dist/modules/sale_backend/screens/sales-orders-list.d.ts.map +1 -0
- package/dist/modules/sale_backend/screens/sales-orders-list.js +100 -0
- package/dist/modules/sale_backend/screens/sales-orders-list.js.map +1 -0
- package/dist/modules/sale_backend/screens/shared.d.ts +4 -0
- package/dist/modules/sale_backend/screens/shared.d.ts.map +1 -0
- package/dist/modules/sale_backend/screens/shared.js +4 -0
- package/dist/modules/sale_backend/screens/shared.js.map +1 -0
- package/dist/modules/sale_mail_backend/index.d.ts.map +1 -1
- package/dist/modules/sale_mail_backend/index.js +0 -1
- package/dist/modules/sale_mail_backend/index.js.map +1 -1
- package/dist/modules/sale_staff_channel/channel-routes.d.ts +2 -0
- package/dist/modules/sale_staff_channel/channel-routes.d.ts.map +1 -0
- package/dist/modules/sale_staff_channel/channel-routes.js +296 -0
- package/dist/modules/sale_staff_channel/channel-routes.js.map +1 -0
- package/dist/modules/sale_staff_channel/index.d.ts +7 -0
- package/dist/modules/sale_staff_channel/index.d.ts.map +1 -0
- package/dist/modules/sale_staff_channel/index.js +44 -0
- package/dist/modules/sale_staff_channel/index.js.map +1 -0
- package/dist/modules/sale_staff_channel/order-routes.d.ts +2 -0
- package/dist/modules/sale_staff_channel/order-routes.d.ts.map +1 -0
- package/dist/modules/sale_staff_channel/order-routes.js +658 -0
- package/dist/modules/sale_staff_channel/order-routes.js.map +1 -0
- package/dist/modules/sale_staff_channel/product-routes.d.ts +2 -0
- package/dist/modules/sale_staff_channel/product-routes.d.ts.map +1 -0
- package/dist/modules/sale_staff_channel/product-routes.js +183 -0
- package/dist/modules/sale_staff_channel/product-routes.js.map +1 -0
- package/dist/modules/stock/functions.d.ts.map +1 -1
- package/dist/modules/stock/functions.js +1239 -332
- package/dist/modules/stock/functions.js.map +1 -1
- package/dist/modules/stock/index.d.ts +2 -0
- package/dist/modules/stock/index.d.ts.map +1 -1
- package/dist/modules/stock/index.js +29 -6
- package/dist/modules/stock/index.js.map +1 -1
- package/dist/modules/stock/models.d.ts.map +1 -1
- package/dist/modules/stock/models.js +1 -0
- package/dist/modules/stock/models.js.map +1 -1
- package/dist/modules/stock/reports.d.ts +4 -0
- package/dist/modules/stock/reports.d.ts.map +1 -0
- package/dist/modules/stock/reports.js +100 -0
- package/dist/modules/stock/reports.js.map +1 -0
- package/dist/modules/stock/routing.d.ts +1 -1
- package/dist/modules/stock/routing.d.ts.map +1 -1
- package/dist/modules/stock/routing.js +35 -30
- package/dist/modules/stock/routing.js.map +1 -1
- package/dist/modules/stock/scope.d.ts +23 -0
- package/dist/modules/stock/scope.d.ts.map +1 -0
- package/dist/modules/stock/scope.js +26 -0
- package/dist/modules/stock/scope.js.map +1 -0
- package/dist/modules/stock/units.d.ts +14 -0
- package/dist/modules/stock/units.d.ts.map +1 -0
- package/dist/modules/stock/units.js +50 -0
- package/dist/modules/stock/units.js.map +1 -0
- package/dist/modules/stock_activity_backend/index.d.ts.map +1 -1
- package/dist/modules/stock_activity_backend/index.js +0 -1
- package/dist/modules/stock_activity_backend/index.js.map +1 -1
- package/dist/modules/stock_backend/client/editor-view.d.mts.map +1 -1
- package/dist/modules/stock_backend/client/editor-view.mjs +12 -10
- package/dist/modules/stock_backend/client/editor-view.mjs.map +1 -1
- package/dist/modules/stock_backend/index.js +27 -20
- package/dist/modules/stock_backend/index.js.map +1 -1
- package/dist/modules/stock_backend/routes.d.ts.map +1 -1
- package/dist/modules/stock_backend/routes.js +485 -232
- package/dist/modules/stock_backend/routes.js.map +1 -1
- package/dist/modules/stock_backend/screens/forecast.d.ts +28 -0
- package/dist/modules/stock_backend/screens/forecast.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/forecast.js +108 -0
- package/dist/modules/stock_backend/screens/forecast.js.map +1 -0
- package/dist/modules/stock_backend/screens/index.d.ts +22 -0
- package/dist/modules/stock_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/index.js +22 -0
- package/dist/modules/stock_backend/screens/index.js.map +1 -0
- package/dist/modules/stock_backend/screens/inventory.d.ts +27 -0
- package/dist/modules/stock_backend/screens/inventory.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/inventory.js +128 -0
- package/dist/modules/stock_backend/screens/inventory.js.map +1 -0
- package/dist/modules/stock_backend/screens/location-create.d.ts +15 -0
- package/dist/modules/stock_backend/screens/location-create.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/location-create.js +75 -0
- package/dist/modules/stock_backend/screens/location-create.js.map +1 -0
- package/dist/modules/stock_backend/screens/locations-list.d.ts +21 -0
- package/dist/modules/stock_backend/screens/locations-list.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/locations-list.js +62 -0
- package/dist/modules/stock_backend/screens/locations-list.js.map +1 -0
- package/dist/modules/stock_backend/screens/lot-create.d.ts +14 -0
- package/dist/modules/stock_backend/screens/lot-create.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/lot-create.js +60 -0
- package/dist/modules/stock_backend/screens/lot-create.js.map +1 -0
- package/dist/modules/stock_backend/screens/lot-detail.d.ts +30 -0
- package/dist/modules/stock_backend/screens/lot-detail.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/lot-detail.js +84 -0
- package/dist/modules/stock_backend/screens/lot-detail.js.map +1 -0
- package/dist/modules/stock_backend/screens/lots-list.d.ts +25 -0
- package/dist/modules/stock_backend/screens/lots-list.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/lots-list.js +54 -0
- package/dist/modules/stock_backend/screens/lots-list.js.map +1 -0
- package/dist/modules/stock_backend/screens/picking-type-create.d.ts +15 -0
- package/dist/modules/stock_backend/screens/picking-type-create.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/picking-type-create.js +89 -0
- package/dist/modules/stock_backend/screens/picking-type-create.js.map +1 -0
- package/dist/modules/stock_backend/screens/picking-types-list.d.ts +22 -0
- package/dist/modules/stock_backend/screens/picking-types-list.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/picking-types-list.js +80 -0
- package/dist/modules/stock_backend/screens/picking-types-list.js.map +1 -0
- package/dist/modules/stock_backend/screens/replenishment-create.d.ts +17 -0
- package/dist/modules/stock_backend/screens/replenishment-create.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/replenishment-create.js +74 -0
- package/dist/modules/stock_backend/screens/replenishment-create.js.map +1 -0
- package/dist/modules/stock_backend/screens/replenishment-list.d.ts +29 -0
- package/dist/modules/stock_backend/screens/replenishment-list.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/replenishment-list.js +84 -0
- package/dist/modules/stock_backend/screens/replenishment-list.js.map +1 -0
- package/dist/modules/stock_backend/screens/shared.d.ts +12 -0
- package/dist/modules/stock_backend/screens/shared.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/shared.js +29 -0
- package/dist/modules/stock_backend/screens/shared.js.map +1 -0
- package/dist/modules/stock_backend/screens/stock-route-create.d.ts +13 -0
- package/dist/modules/stock_backend/screens/stock-route-create.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/stock-route-create.js +52 -0
- package/dist/modules/stock_backend/screens/stock-route-create.js.map +1 -0
- package/dist/modules/stock_backend/screens/stock-route-detail.d.ts +30 -0
- package/dist/modules/stock_backend/screens/stock-route-detail.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/stock-route-detail.js +131 -0
- package/dist/modules/stock_backend/screens/stock-route-detail.js.map +1 -0
- package/dist/modules/stock_backend/screens/stock-routes-list.d.ts +22 -0
- package/dist/modules/stock_backend/screens/stock-routes-list.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/stock-routes-list.js +51 -0
- package/dist/modules/stock_backend/screens/stock-routes-list.js.map +1 -0
- package/dist/modules/stock_backend/screens/stock.d.ts +7 -0
- package/dist/modules/stock_backend/screens/stock.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/stock.js +13 -0
- package/dist/modules/stock_backend/screens/stock.js.map +1 -0
- package/dist/modules/stock_backend/screens/transfer-create.d.ts +13 -0
- package/dist/modules/stock_backend/screens/transfer-create.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/transfer-create.js +38 -0
- package/dist/modules/stock_backend/screens/transfer-create.js.map +1 -0
- package/dist/modules/stock_backend/screens/transfer-detail.d.ts +27 -0
- package/dist/modules/stock_backend/screens/transfer-detail.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/transfer-detail.js +91 -0
- package/dist/modules/stock_backend/screens/transfer-detail.js.map +1 -0
- package/dist/modules/stock_backend/screens/transfers-list.d.ts +25 -0
- package/dist/modules/stock_backend/screens/transfers-list.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/transfers-list.js +81 -0
- package/dist/modules/stock_backend/screens/transfers-list.js.map +1 -0
- package/dist/modules/stock_backend/screens/warehouse-create.d.ts +13 -0
- package/dist/modules/stock_backend/screens/warehouse-create.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/warehouse-create.js +79 -0
- package/dist/modules/stock_backend/screens/warehouse-create.js.map +1 -0
- package/dist/modules/stock_backend/screens/warehouses-list.d.ts +21 -0
- package/dist/modules/stock_backend/screens/warehouses-list.d.ts.map +1 -0
- package/dist/modules/stock_backend/screens/warehouses-list.js +60 -0
- package/dist/modules/stock_backend/screens/warehouses-list.js.map +1 -0
- package/dist/modules/stock_lot_activity_backend/index.d.ts.map +1 -1
- package/dist/modules/stock_lot_activity_backend/index.js +0 -1
- package/dist/modules/stock_lot_activity_backend/index.js.map +1 -1
- package/dist/modules/stock_lot_mail_backend/index.d.ts.map +1 -1
- package/dist/modules/stock_lot_mail_backend/index.js +0 -1
- package/dist/modules/stock_lot_mail_backend/index.js.map +1 -1
- package/dist/modules/stock_mail_backend/index.d.ts.map +1 -1
- package/dist/modules/stock_mail_backend/index.js +0 -1
- package/dist/modules/stock_mail_backend/index.js.map +1 -1
- package/dist/modules/stock_mail_inbound/index.d.ts.map +1 -1
- package/dist/modules/stock_mail_inbound/index.js +0 -2
- package/dist/modules/stock_mail_inbound/index.js.map +1 -1
- package/dist/modules/stock_staff_channel/channel-routes.d.ts +656 -0
- package/dist/modules/stock_staff_channel/channel-routes.d.ts.map +1 -0
- package/dist/modules/stock_staff_channel/channel-routes.js +445 -0
- package/dist/modules/stock_staff_channel/channel-routes.js.map +1 -0
- package/dist/modules/stock_staff_channel/functions.d.ts +3 -0
- package/dist/modules/stock_staff_channel/functions.d.ts.map +1 -0
- package/dist/modules/stock_staff_channel/functions.js +954 -0
- package/dist/modules/stock_staff_channel/functions.js.map +1 -0
- package/dist/modules/stock_staff_channel/index.d.ts +8 -0
- package/dist/modules/stock_staff_channel/index.d.ts.map +1 -0
- package/dist/modules/stock_staff_channel/index.js +37 -0
- package/dist/modules/stock_staff_channel/index.js.map +1 -0
- package/dist/modules/stock_staff_channel/models.d.ts +4 -0
- package/dist/modules/stock_staff_channel/models.d.ts.map +1 -0
- package/dist/modules/stock_staff_channel/models.js +119 -0
- package/dist/modules/stock_staff_channel/models.js.map +1 -0
- package/dist/modules/stock_staff_channel/operation-routes.d.ts +2 -0
- package/dist/modules/stock_staff_channel/operation-routes.d.ts.map +1 -0
- package/dist/modules/stock_staff_channel/operation-routes.js +1269 -0
- package/dist/modules/stock_staff_channel/operation-routes.js.map +1 -0
- package/dist/modules/storage/functions.d.ts.map +1 -1
- package/dist/modules/storage/functions.js +18 -5
- package/dist/modules/storage/functions.js.map +1 -1
- package/dist/modules/storage/index.js +0 -1
- package/dist/modules/storage/index.js.map +1 -1
- package/dist/modules/storage/jobs.d.ts +21 -1
- package/dist/modules/storage/jobs.d.ts.map +1 -1
- package/dist/modules/storage/jobs.js +142 -2
- package/dist/modules/storage/jobs.js.map +1 -1
- package/dist/modules/storage/models.d.ts.map +1 -1
- package/dist/modules/storage/models.js +2 -0
- package/dist/modules/storage/models.js.map +1 -1
- package/dist/modules/storage/policy.d.ts +5 -0
- package/dist/modules/storage/policy.d.ts.map +1 -0
- package/dist/modules/storage/policy.js +13 -0
- package/dist/modules/storage/policy.js.map +1 -0
- package/dist/modules/storage/routes.d.ts +1 -0
- package/dist/modules/storage/routes.d.ts.map +1 -1
- package/dist/modules/storage/routes.js +19 -15
- package/dist/modules/storage/routes.js.map +1 -1
- package/dist/modules/uom/convert.d.ts +1 -1
- package/dist/modules/uom/convert.js +2 -2
- package/dist/modules/uom/convert.js.map +1 -1
- package/dist/modules/uom/functions.d.ts.map +1 -1
- package/dist/modules/uom/functions.js +39 -4
- package/dist/modules/uom/functions.js.map +1 -1
- package/dist/modules/uom/index.d.ts.map +1 -1
- package/dist/modules/uom/index.js +1 -2
- package/dist/modules/uom/index.js.map +1 -1
- package/dist/modules/uom/messages.js +2 -2
- package/dist/modules/uom/messages.js.map +1 -1
- package/dist/modules/uom/models.d.ts +1 -1
- package/dist/modules/uom/models.d.ts.map +1 -1
- package/dist/modules/uom/models.js +1 -1
- package/dist/modules/uom/models.js.map +1 -1
- package/dist/modules/user/authorization.d.ts +80 -0
- package/dist/modules/user/authorization.d.ts.map +1 -0
- package/dist/modules/user/authorization.js +1039 -0
- package/dist/modules/user/authorization.js.map +1 -0
- package/dist/modules/user/functions.d.ts.map +1 -1
- package/dist/modules/user/functions.js +188 -32
- package/dist/modules/user/functions.js.map +1 -1
- package/dist/modules/user/index.d.ts +4 -1
- package/dist/modules/user/index.d.ts.map +1 -1
- package/dist/modules/user/index.js +2 -3
- package/dist/modules/user/index.js.map +1 -1
- package/dist/modules/user/login.d.ts +1 -27
- package/dist/modules/user/login.d.ts.map +1 -1
- package/dist/modules/user/login.js +5 -45
- package/dist/modules/user/login.js.map +1 -1
- package/dist/modules/user/messages.d.ts +6 -0
- package/dist/modules/user/messages.d.ts.map +1 -1
- package/dist/modules/user/messages.js +6 -0
- package/dist/modules/user/messages.js.map +1 -1
- package/dist/modules/user/models.d.ts +1 -1
- package/dist/modules/user/models.d.ts.map +1 -1
- package/dist/modules/user/models.js +73 -9
- package/dist/modules/user/models.js.map +1 -1
- package/dist/modules/user/relations.d.ts.map +1 -1
- package/dist/modules/user/relations.js +6 -0
- package/dist/modules/user/relations.js.map +1 -1
- package/dist/modules/user/roles.d.ts +11 -1
- package/dist/modules/user/roles.d.ts.map +1 -1
- package/dist/modules/user/roles.js +402 -117
- package/dist/modules/user/roles.js.map +1 -1
- package/dist/modules/user/routes.js +1 -1
- package/dist/modules/user/routes.js.map +1 -1
- package/dist/modules/user_backend/index.d.ts +1 -1
- package/dist/modules/user_backend/index.d.ts.map +1 -1
- package/dist/modules/user_backend/index.js +1 -3
- package/dist/modules/user_backend/index.js.map +1 -1
- package/dist/modules/user_backend/messages.d.ts +60 -0
- package/dist/modules/user_backend/messages.d.ts.map +1 -1
- package/dist/modules/user_backend/messages.js +60 -0
- package/dist/modules/user_backend/messages.js.map +1 -1
- package/dist/modules/user_backend/routes.d.ts.map +1 -1
- package/dist/modules/user_backend/routes.js +352 -69
- package/dist/modules/user_backend/routes.js.map +1 -1
- package/dist/modules/user_backend/screens/index.d.ts +11 -0
- package/dist/modules/user_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/user_backend/screens/index.js +8 -0
- package/dist/modules/user_backend/screens/index.js.map +1 -0
- package/dist/modules/user_backend/screens/presets-form.d.ts +16 -0
- package/dist/modules/user_backend/screens/presets-form.d.ts.map +1 -0
- package/dist/modules/user_backend/screens/presets-form.js +37 -0
- package/dist/modules/user_backend/screens/presets-form.js.map +1 -0
- package/dist/modules/user_backend/screens/profile-form.d.ts +14 -0
- package/dist/modules/user_backend/screens/profile-form.d.ts.map +1 -0
- package/dist/modules/user_backend/screens/profile-form.js +37 -0
- package/dist/modules/user_backend/screens/profile-form.js.map +1 -0
- package/dist/modules/user_backend/screens/role-form.d.ts +21 -0
- package/dist/modules/user_backend/screens/role-form.d.ts.map +1 -0
- package/dist/modules/user_backend/screens/role-form.js +93 -0
- package/dist/modules/user_backend/screens/role-form.js.map +1 -0
- package/dist/modules/user_backend/screens/roles-list.d.ts +15 -0
- package/dist/modules/user_backend/screens/roles-list.d.ts.map +1 -0
- package/dist/modules/user_backend/screens/roles-list.js +48 -0
- package/dist/modules/user_backend/screens/roles-list.js.map +1 -0
- package/dist/modules/user_backend/screens/sessions.d.ts +5 -0
- package/dist/modules/user_backend/screens/sessions.d.ts.map +1 -0
- package/dist/modules/user_backend/screens/sessions.js +35 -0
- package/dist/modules/user_backend/screens/sessions.js.map +1 -0
- package/dist/modules/user_backend/screens/types.d.ts +68 -0
- package/dist/modules/user_backend/screens/types.d.ts.map +1 -0
- package/dist/modules/user_backend/screens/types.js +2 -0
- package/dist/modules/user_backend/screens/types.js.map +1 -0
- package/dist/modules/user_backend/screens/user-form.d.ts +55 -0
- package/dist/modules/user_backend/screens/user-form.d.ts.map +1 -0
- package/dist/modules/user_backend/screens/user-form.js +174 -0
- package/dist/modules/user_backend/screens/user-form.js.map +1 -0
- package/dist/modules/user_backend/screens/users-list.d.ts +17 -0
- package/dist/modules/user_backend/screens/users-list.d.ts.map +1 -0
- package/dist/modules/user_backend/screens/users-list.js +56 -0
- package/dist/modules/user_backend/screens/users-list.js.map +1 -0
- package/dist/modules/website/cms.d.ts +18 -1
- package/dist/modules/website/cms.d.ts.map +1 -1
- package/dist/modules/website/cms.js +373 -38
- package/dist/modules/website/cms.js.map +1 -1
- package/dist/modules/website/customer.d.ts.map +1 -1
- package/dist/modules/website/customer.js +249 -1
- package/dist/modules/website/customer.js.map +1 -1
- package/dist/modules/website/index.d.ts.map +1 -1
- package/dist/modules/website/index.js +26 -4
- package/dist/modules/website/index.js.map +1 -1
- package/dist/modules/website/models.d.ts.map +1 -1
- package/dist/modules/website/models.js +101 -0
- package/dist/modules/website/models.js.map +1 -1
- package/dist/modules/website/paths.d.ts +31 -0
- package/dist/modules/website/paths.d.ts.map +1 -0
- package/dist/modules/website/paths.js +48 -0
- package/dist/modules/website/paths.js.map +1 -0
- package/dist/modules/website/publication.d.ts +3 -0
- package/dist/modules/website/publication.d.ts.map +1 -0
- package/dist/modules/website/publication.js +366 -0
- package/dist/modules/website/publication.js.map +1 -0
- package/dist/modules/website/renderable.d.ts +32 -0
- package/dist/modules/website/renderable.d.ts.map +1 -0
- package/dist/modules/website/renderable.js +59 -0
- package/dist/modules/website/renderable.js.map +1 -0
- package/dist/modules/website/sections.d.ts.map +1 -1
- package/dist/modules/website/sections.js +13 -0
- package/dist/modules/website/sections.js.map +1 -1
- package/dist/modules/website_backend/csv.d.ts +23 -0
- package/dist/modules/website_backend/csv.d.ts.map +1 -0
- package/dist/modules/website_backend/csv.js +31 -0
- package/dist/modules/website_backend/csv.js.map +1 -0
- package/dist/modules/website_backend/index.js +260 -2
- package/dist/modules/website_backend/index.js.map +1 -1
- package/dist/modules/website_backend/menus.d.ts.map +1 -1
- package/dist/modules/website_backend/menus.js +28 -6
- package/dist/modules/website_backend/menus.js.map +1 -1
- package/dist/modules/website_backend/routes.d.ts.map +1 -1
- package/dist/modules/website_backend/routes.js +684 -126
- package/dist/modules/website_backend/routes.js.map +1 -1
- package/dist/modules/website_backend/screens/index.d.ts +333 -0
- package/dist/modules/website_backend/screens/index.d.ts.map +1 -0
- package/dist/modules/website_backend/screens/index.js +1332 -0
- package/dist/modules/website_backend/screens/index.js.map +1 -0
- package/dist/modules/website_backend/screens/page-frame.d.ts +14 -0
- package/dist/modules/website_backend/screens/page-frame.d.ts.map +1 -0
- package/dist/modules/website_backend/screens/page-frame.js +13 -0
- package/dist/modules/website_backend/screens/page-frame.js.map +1 -0
- package/dist/modules/website_form/audit.d.ts +27 -0
- package/dist/modules/website_form/audit.d.ts.map +1 -0
- package/dist/modules/website_form/audit.js +30 -0
- package/dist/modules/website_form/audit.js.map +1 -0
- package/dist/modules/website_form/functions.d.ts.map +1 -1
- package/dist/modules/website_form/functions.js +416 -12
- package/dist/modules/website_form/functions.js.map +1 -1
- package/dist/modules/website_form/index.js +24 -2
- package/dist/modules/website_form/index.js.map +1 -1
- package/dist/modules/website_form/jobs.d.ts +11 -0
- package/dist/modules/website_form/jobs.d.ts.map +1 -0
- package/dist/modules/website_form/jobs.js +80 -0
- package/dist/modules/website_form/jobs.js.map +1 -0
- package/dist/modules/website_form/models.d.ts.map +1 -1
- package/dist/modules/website_form/models.js +89 -0
- package/dist/modules/website_form/models.js.map +1 -1
- package/dist/modules/website_form/purge.d.ts +22 -0
- package/dist/modules/website_form/purge.d.ts.map +1 -0
- package/dist/modules/website_form/purge.js +59 -0
- package/dist/modules/website_form/purge.js.map +1 -0
- package/dist/modules/website_form/retention.d.ts +70 -0
- package/dist/modules/website_form/retention.d.ts.map +1 -0
- package/dist/modules/website_form/retention.js +145 -0
- package/dist/modules/website_form/retention.js.map +1 -0
- package/dist/modules/website_form/routes.d.ts.map +1 -1
- package/dist/modules/website_form/routes.js +37 -3
- package/dist/modules/website_form/routes.js.map +1 -1
- package/dist/modules/website_form_mail/index.d.ts +36 -0
- package/dist/modules/website_form_mail/index.d.ts.map +1 -0
- package/dist/modules/website_form_mail/index.js +137 -0
- package/dist/modules/website_form_mail/index.js.map +1 -0
- package/dist/modules/website_hospitality/channel-routes.d.ts +2 -0
- package/dist/modules/website_hospitality/channel-routes.d.ts.map +1 -0
- package/dist/modules/website_hospitality/channel-routes.js +355 -0
- package/dist/modules/website_hospitality/channel-routes.js.map +1 -0
- package/dist/modules/website_hospitality/functions.d.ts.map +1 -1
- package/dist/modules/website_hospitality/functions.js +27 -2
- package/dist/modules/website_hospitality/functions.js.map +1 -1
- package/dist/modules/website_hospitality/index.js +4 -3
- package/dist/modules/website_hospitality/index.js.map +1 -1
- package/dist/modules/website_hospitality/models.d.ts.map +1 -1
- package/dist/modules/website_hospitality/models.js +2 -0
- package/dist/modules/website_hospitality/models.js.map +1 -1
- package/dist/modules/website_menu/functions.d.ts.map +1 -1
- package/dist/modules/website_menu/functions.js +184 -9
- package/dist/modules/website_menu/functions.js.map +1 -1
- package/dist/modules/website_menu/index.js +6 -1
- package/dist/modules/website_menu/index.js.map +1 -1
- package/dist/modules/website_retail/channel-routes.d.ts +2 -0
- package/dist/modules/website_retail/channel-routes.d.ts.map +1 -0
- package/dist/modules/website_retail/channel-routes.js +305 -0
- package/dist/modules/website_retail/channel-routes.js.map +1 -0
- package/dist/modules/website_retail/functions.d.ts +14 -1
- package/dist/modules/website_retail/functions.d.ts.map +1 -1
- package/dist/modules/website_retail/functions.js +6 -6
- package/dist/modules/website_retail/functions.js.map +1 -1
- package/dist/modules/website_retail/index.js +24 -3
- package/dist/modules/website_retail/index.js.map +1 -1
- package/dist/modules/website_retail/models.d.ts.map +1 -1
- package/dist/modules/website_retail/models.js +30 -0
- package/dist/modules/website_retail/models.js.map +1 -1
- package/dist/modules/website_retail/online.d.ts +3 -0
- package/dist/modules/website_retail/online.d.ts.map +1 -0
- package/dist/modules/website_retail/online.js +710 -0
- package/dist/modules/website_retail/online.js.map +1 -0
- package/dist/modules/website_search/client/search.d.mts +16 -2
- package/dist/modules/website_search/client/search.d.mts.map +1 -1
- package/dist/modules/website_search/client/search.mjs +112 -6
- package/dist/modules/website_search/client/search.mjs.map +1 -1
- package/dist/modules/website_search/functions.d.ts +3 -0
- package/dist/modules/website_search/functions.d.ts.map +1 -0
- package/dist/modules/website_search/functions.js +239 -0
- package/dist/modules/website_search/functions.js.map +1 -0
- package/dist/modules/website_search/index.js +4 -1
- package/dist/modules/website_search/index.js.map +1 -1
- package/dist/modules/website_search/islands.d.ts +6 -0
- package/dist/modules/website_search/islands.d.ts.map +1 -1
- package/dist/modules/website_search/islands.js +8 -2
- package/dist/modules/website_search/islands.js.map +1 -1
- package/dist/modules/website_search/models.d.ts +15 -0
- package/dist/modules/website_search/models.d.ts.map +1 -0
- package/dist/modules/website_search/models.js +58 -0
- package/dist/modules/website_search/models.js.map +1 -0
- package/dist/modules/website_seo/functions.d.ts +3 -0
- package/dist/modules/website_seo/functions.d.ts.map +1 -0
- package/dist/modules/website_seo/functions.js +164 -0
- package/dist/modules/website_seo/functions.js.map +1 -0
- package/dist/modules/website_seo/index.js +15 -5
- package/dist/modules/website_seo/index.js.map +1 -1
- package/dist/modules/website_seo/projection.d.ts +52 -0
- package/dist/modules/website_seo/projection.d.ts.map +1 -0
- package/dist/modules/website_seo/projection.js +129 -0
- package/dist/modules/website_seo/projection.js.map +1 -0
- package/dist/modules/website_seo/routes.d.ts +3 -0
- package/dist/modules/website_seo/routes.d.ts.map +1 -0
- package/dist/modules/website_seo/routes.js +56 -0
- package/dist/modules/website_seo/routes.js.map +1 -0
- package/dist/permission-catalogue.d.ts +5 -0
- package/dist/permission-catalogue.d.ts.map +1 -0
- package/dist/permission-catalogue.js +1505 -0
- package/dist/permission-catalogue.js.map +1 -0
- package/dist/scaffold/index.d.ts +2 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +31 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/templates/README.md.tmpl +17 -0
- package/dist/scaffold/templates/gitignore.tmpl +2 -0
- package/dist/scaffold/templates/ket.workspace.mjs.tmpl +1 -0
- package/dist/scaffold/templates/package.json.tmpl +15 -0
- package/dist/themes/hospitality/templates/website.columns.ktl +4 -0
- package/dist/themes/paper/templates/website.columns.ktl +4 -0
- package/dist/ui/actions.d.ts +4 -0
- package/dist/ui/actions.d.ts.map +1 -1
- package/dist/ui/actions.js +1 -1
- package/dist/ui/actions.js.map +1 -1
- package/dist/ui/activity.d.ts +1 -1
- package/dist/ui/activity.d.ts.map +1 -1
- package/dist/ui/activity.js +3 -5
- package/dist/ui/activity.js.map +1 -1
- package/dist/ui/attachments.js +1 -1
- package/dist/ui/attachments.js.map +1 -1
- package/dist/ui/auth.d.ts +36 -0
- package/dist/ui/auth.d.ts.map +1 -1
- package/dist/ui/auth.js +55 -0
- package/dist/ui/auth.js.map +1 -1
- package/dist/ui/board-page.d.ts +6 -0
- package/dist/ui/board-page.d.ts.map +1 -0
- package/dist/ui/board-page.js +4 -0
- package/dist/ui/board-page.js.map +1 -0
- package/dist/ui/charts.d.ts +83 -0
- package/dist/ui/charts.d.ts.map +1 -0
- package/dist/ui/charts.js +105 -0
- package/dist/ui/charts.js.map +1 -0
- package/dist/ui/chrome.d.ts +37 -2
- package/dist/ui/chrome.d.ts.map +1 -1
- package/dist/ui/chrome.js +39 -5
- package/dist/ui/chrome.js.map +1 -1
- package/dist/ui/client/activity-view.mjs +7 -7
- package/dist/ui/client/activity-view.mjs.map +1 -1
- package/dist/ui/client/activity.css +6 -34
- package/dist/ui/client/calendar-view.d.mts.map +1 -1
- package/dist/ui/client/calendar-view.mjs +7 -6
- package/dist/ui/client/calendar-view.mjs.map +1 -1
- package/dist/ui/client/calendar.css +4 -14
- package/dist/ui/client/chart-view.d.ts +51 -0
- package/dist/ui/client/chart-view.d.ts.map +1 -0
- package/dist/ui/client/chart-view.js +192 -0
- package/dist/ui/client/chart-view.js.map +1 -0
- package/dist/ui/client/flow-app.css +387 -0
- package/dist/ui/client/flow-board-view.d.mts +8 -0
- package/dist/ui/client/flow-board-view.d.mts.map +1 -0
- package/dist/ui/client/flow-board-view.mjs +161 -0
- package/dist/ui/client/flow-board-view.mjs.map +1 -0
- package/dist/ui/client/flow-board.d.mts +3 -0
- package/dist/ui/client/flow-board.d.mts.map +1 -0
- package/dist/ui/client/flow-board.mjs +7 -0
- package/dist/ui/client/flow-board.mjs.map +1 -0
- package/dist/ui/client/flow-map-view.d.mts +2 -0
- package/dist/ui/client/flow-map-view.d.mts.map +1 -0
- package/dist/ui/client/flow-map-view.mjs +235 -0
- package/dist/ui/client/flow-map-view.mjs.map +1 -0
- package/dist/ui/client/flow-map.d.mts +3 -0
- package/dist/ui/client/flow-map.d.mts.map +1 -0
- package/dist/ui/client/flow-map.mjs +7 -0
- package/dist/ui/client/flow-map.mjs.map +1 -0
- package/dist/ui/client/live-doc-blocks.d.ts +19 -0
- package/dist/ui/client/live-doc-blocks.d.ts.map +1 -0
- package/dist/ui/client/live-doc-blocks.js +23 -0
- package/dist/ui/client/live-doc-blocks.js.map +1 -0
- package/dist/ui/client/live-doc-markdown.d.ts +18 -0
- package/dist/ui/client/live-doc-markdown.d.ts.map +1 -0
- package/dist/ui/client/live-doc-markdown.js +175 -0
- package/dist/ui/client/live-doc-markdown.js.map +1 -0
- package/dist/ui/client/live-doc-shell.d.ts +101 -0
- package/dist/ui/client/live-doc-shell.d.ts.map +1 -0
- package/dist/ui/client/live-doc-shell.js +251 -0
- package/dist/ui/client/live-doc-shell.js.map +1 -0
- package/dist/ui/client/live-doc-view.d.ts +33 -0
- package/dist/ui/client/live-doc-view.d.ts.map +1 -0
- package/dist/ui/client/live-doc-view.js +1237 -0
- package/dist/ui/client/live-doc-view.js.map +1 -0
- package/dist/ui/client/live-doc.css +243 -0
- package/dist/ui/client/live-doc.d.mts +12 -0
- package/dist/ui/client/live-doc.d.mts.map +1 -0
- package/dist/ui/client/live-doc.mjs +11 -0
- package/dist/ui/client/live-doc.mjs.map +7 -0
- package/dist/ui/client/mail-bundle.d.mts +9 -0
- package/dist/ui/client/mail-bundle.d.mts.map +1 -0
- package/dist/ui/client/mail-bundle.mjs +50 -0
- package/dist/ui/client/mail-bundle.mjs.map +7 -0
- package/dist/ui/client/mail-entry.d.mts +11 -0
- package/dist/ui/client/mail-entry.d.mts.map +1 -0
- package/dist/ui/client/mail-entry.mjs +9 -0
- package/dist/ui/client/mail-entry.mjs.map +1 -0
- package/dist/ui/client/mail-view.d.mts.map +1 -1
- package/dist/ui/client/mail-view.mjs +5 -3
- package/dist/ui/client/mail-view.mjs.map +1 -1
- package/dist/ui/client/mail.css +3 -3
- package/dist/ui/client/relation-select-view.d.ts +77 -0
- package/dist/ui/client/relation-select-view.d.ts.map +1 -0
- package/dist/ui/client/relation-select-view.js +216 -0
- package/dist/ui/client/relation-select-view.js.map +1 -0
- package/dist/ui/client/table-selection-view.d.ts +4 -0
- package/dist/ui/client/table-selection-view.d.ts.map +1 -0
- package/dist/ui/client/table-selection-view.js +283 -0
- package/dist/ui/client/table-selection-view.js.map +1 -0
- package/dist/ui/dashboard-page.d.ts +6 -0
- package/dist/ui/dashboard-page.d.ts.map +1 -0
- package/dist/ui/dashboard-page.js +4 -0
- package/dist/ui/dashboard-page.js.map +1 -0
- package/dist/ui/data.d.ts +51 -1
- package/dist/ui/data.d.ts.map +1 -1
- package/dist/ui/data.js +87 -1
- package/dist/ui/data.js.map +1 -1
- package/dist/ui/date-picker.d.ts.map +1 -1
- package/dist/ui/date-picker.js +2 -2
- package/dist/ui/date-picker.js.map +1 -1
- package/dist/ui/form-page.d.ts +6 -0
- package/dist/ui/form-page.d.ts.map +1 -0
- package/dist/ui/form-page.js +5 -0
- package/dist/ui/form-page.js.map +1 -0
- package/dist/ui/form.d.ts +4 -1
- package/dist/ui/form.d.ts.map +1 -1
- package/dist/ui/form.js +7 -5
- package/dist/ui/form.js.map +1 -1
- package/dist/ui/format.d.ts +13 -2
- package/dist/ui/format.d.ts.map +1 -1
- package/dist/ui/format.js +28 -7
- package/dist/ui/format.js.map +1 -1
- package/dist/ui/gantt.d.ts +52 -0
- package/dist/ui/gantt.d.ts.map +1 -0
- package/dist/ui/gantt.js +92 -0
- package/dist/ui/gantt.js.map +1 -0
- package/dist/ui/hooks.d.ts.map +1 -1
- package/dist/ui/hooks.js +14 -0
- package/dist/ui/hooks.js.map +1 -1
- package/dist/ui/icons.d.ts.map +1 -1
- package/dist/ui/icons.js +6 -1
- package/dist/ui/icons.js.map +1 -1
- package/dist/ui/index.d.ts +95 -14
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +78 -13
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/layout.d.ts +43 -38
- package/dist/ui/layout.d.ts.map +1 -1
- package/dist/ui/layout.js +29 -37
- package/dist/ui/layout.js.map +1 -1
- package/dist/ui/list-page.d.ts +19 -0
- package/dist/ui/list-page.d.ts.map +1 -0
- package/dist/ui/list-page.js +21 -0
- package/dist/ui/list-page.js.map +1 -0
- package/dist/ui/media.d.ts.map +1 -1
- package/dist/ui/media.js +1 -1
- package/dist/ui/media.js.map +1 -1
- package/dist/ui/modal.d.ts +26 -1
- package/dist/ui/modal.d.ts.map +1 -1
- package/dist/ui/modal.js +18 -2
- package/dist/ui/modal.js.map +1 -1
- package/dist/ui/nav.d.ts +21 -1
- package/dist/ui/nav.d.ts.map +1 -1
- package/dist/ui/nav.js +43 -8
- package/dist/ui/nav.js.map +1 -1
- package/dist/ui/navigation.d.ts +36 -2
- package/dist/ui/navigation.d.ts.map +1 -1
- package/dist/ui/navigation.js +60 -5
- package/dist/ui/navigation.js.map +1 -1
- package/dist/ui/partner.d.ts +18 -0
- package/dist/ui/partner.d.ts.map +1 -0
- package/dist/ui/partner.js +11 -0
- package/dist/ui/partner.js.map +1 -0
- package/dist/ui/primitives.d.ts +28 -10
- package/dist/ui/primitives.d.ts.map +1 -1
- package/dist/ui/primitives.js +21 -7
- package/dist/ui/primitives.js.map +1 -1
- package/dist/ui/product-media.d.ts +47 -0
- package/dist/ui/product-media.d.ts.map +1 -0
- package/dist/ui/product-media.js +67 -0
- package/dist/ui/product-media.js.map +1 -0
- package/dist/ui/product-variants.d.ts +68 -0
- package/dist/ui/product-variants.d.ts.map +1 -0
- package/dist/ui/product-variants.js +81 -0
- package/dist/ui/product-variants.js.map +1 -0
- package/dist/ui/record-detail.d.ts +70 -0
- package/dist/ui/record-detail.d.ts.map +1 -0
- package/dist/ui/record-detail.js +35 -0
- package/dist/ui/record-detail.js.map +1 -0
- package/dist/ui/record-page.d.ts +16 -0
- package/dist/ui/record-page.d.ts.map +1 -0
- package/dist/ui/record-page.js +13 -0
- package/dist/ui/record-page.js.map +1 -0
- package/dist/ui/record.d.ts +15 -3
- package/dist/ui/record.d.ts.map +1 -1
- package/dist/ui/record.js +6 -5
- package/dist/ui/record.js.map +1 -1
- package/dist/ui/surfaces.d.ts +30 -2
- package/dist/ui/surfaces.d.ts.map +1 -1
- package/dist/ui/surfaces.js +39 -2
- package/dist/ui/surfaces.js.map +1 -1
- package/dist/ui/table.d.ts +25 -2
- package/dist/ui/table.d.ts.map +1 -1
- package/dist/ui/table.js +10 -6
- package/dist/ui/table.js.map +1 -1
- package/dist/ui/timeframe.d.ts +39 -0
- package/dist/ui/timeframe.d.ts.map +1 -0
- package/dist/ui/timeframe.js +36 -0
- package/dist/ui/timeframe.js.map +1 -0
- package/dist/ui/workspace-page.d.ts +16 -0
- package/dist/ui/workspace-page.d.ts.map +1 -0
- package/dist/ui/workspace-page.js +15 -0
- package/dist/ui/workspace-page.js.map +1 -0
- package/package.json +16 -3
- package/dist/modules/account/tt99.d.ts +0 -30
- package/dist/modules/account/tt99.d.ts.map +0 -1
- package/dist/modules/account/tt99.js +0 -1661
- package/dist/modules/account/tt99.js.map +0 -1
- package/dist/modules/account_backend/accounting-overview-screen.d.ts +0 -18
- package/dist/modules/account_backend/accounting-overview-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/accounting-overview-screen.js +0 -104
- package/dist/modules/account_backend/accounting-overview-screen.js.map +0 -1
- package/dist/modules/account_backend/accounts-screen.d.ts +0 -13
- package/dist/modules/account_backend/accounts-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/accounts-screen.js +0 -49
- package/dist/modules/account_backend/accounts-screen.js.map +0 -1
- package/dist/modules/account_backend/customer-invoices-screen.d.ts +0 -14
- package/dist/modules/account_backend/customer-invoices-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/customer-invoices-screen.js +0 -63
- package/dist/modules/account_backend/customer-invoices-screen.js.map +0 -1
- package/dist/modules/account_backend/general-ledger-screen.d.ts +0 -13
- package/dist/modules/account_backend/general-ledger-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/general-ledger-screen.js +0 -56
- package/dist/modules/account_backend/general-ledger-screen.js.map +0 -1
- package/dist/modules/account_backend/journal-entries-screen.d.ts +0 -14
- package/dist/modules/account_backend/journal-entries-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/journal-entries-screen.js +0 -45
- package/dist/modules/account_backend/journal-entries-screen.js.map +0 -1
- package/dist/modules/account_backend/journals-screen.d.ts +0 -14
- package/dist/modules/account_backend/journals-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/journals-screen.js +0 -53
- package/dist/modules/account_backend/journals-screen.js.map +0 -1
- package/dist/modules/account_backend/move-detail-screen.d.ts +0 -10
- package/dist/modules/account_backend/move-detail-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/move-detail-screen.js +0 -100
- package/dist/modules/account_backend/move-detail-screen.js.map +0 -1
- package/dist/modules/account_backend/partner-ledger-screen.d.ts +0 -14
- package/dist/modules/account_backend/partner-ledger-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/partner-ledger-screen.js +0 -69
- package/dist/modules/account_backend/partner-ledger-screen.js.map +0 -1
- package/dist/modules/account_backend/payment-terms-screen.d.ts +0 -14
- package/dist/modules/account_backend/payment-terms-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/payment-terms-screen.js +0 -40
- package/dist/modules/account_backend/payment-terms-screen.js.map +0 -1
- package/dist/modules/account_backend/payments-screen.d.ts +0 -14
- package/dist/modules/account_backend/payments-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/payments-screen.js +0 -54
- package/dist/modules/account_backend/payments-screen.js.map +0 -1
- package/dist/modules/account_backend/screens.d.ts +0 -7
- package/dist/modules/account_backend/screens.d.ts.map +0 -1
- package/dist/modules/account_backend/screens.js +0 -7
- package/dist/modules/account_backend/screens.js.map +0 -1
- package/dist/modules/account_backend/taxes-screen.d.ts +0 -15
- package/dist/modules/account_backend/taxes-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/taxes-screen.js +0 -73
- package/dist/modules/account_backend/taxes-screen.js.map +0 -1
- package/dist/modules/account_backend/trial-balance-screen.d.ts +0 -13
- package/dist/modules/account_backend/trial-balance-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/trial-balance-screen.js +0 -62
- package/dist/modules/account_backend/trial-balance-screen.js.map +0 -1
- package/dist/modules/account_backend/vendor-bills-screen.d.ts +0 -14
- package/dist/modules/account_backend/vendor-bills-screen.d.ts.map +0 -1
- package/dist/modules/account_backend/vendor-bills-screen.js +0 -59
- package/dist/modules/account_backend/vendor-bills-screen.js.map +0 -1
- package/dist/modules/account_partner_backend/screens.d.ts +0 -16
- package/dist/modules/account_partner_backend/screens.d.ts.map +0 -1
- package/dist/modules/account_partner_backend/screens.js +0 -26
- package/dist/modules/account_partner_backend/screens.js.map +0 -1
- package/dist/modules/activity_backend/screens.d.ts +0 -5
- package/dist/modules/activity_backend/screens.d.ts.map +0 -1
- package/dist/modules/activity_backend/screens.js +0 -52
- package/dist/modules/activity_backend/screens.js.map +0 -1
- package/dist/modules/address_backend/screens.d.ts +0 -31
- package/dist/modules/address_backend/screens.d.ts.map +0 -1
- package/dist/modules/address_backend/screens.js +0 -147
- package/dist/modules/address_backend/screens.js.map +0 -1
- package/dist/modules/backend/design/admin.css +0 -4229
- package/dist/modules/backend/design/client/relation-select-view.d.mts +0 -5
- package/dist/modules/backend/design/client/relation-select-view.d.mts.map +0 -1
- package/dist/modules/backend/design/client/relation-select-view.mjs +0 -335
- package/dist/modules/backend/design/client/relation-select-view.mjs.map +0 -1
- package/dist/modules/calendar_backend/screens.d.ts +0 -5
- package/dist/modules/calendar_backend/screens.d.ts.map +0 -1
- package/dist/modules/calendar_backend/screens.js +0 -4
- package/dist/modules/calendar_backend/screens.js.map +0 -1
- package/dist/modules/company_backend/screens.d.ts +0 -62
- package/dist/modules/company_backend/screens.d.ts.map +0 -1
- package/dist/modules/company_backend/screens.js +0 -268
- package/dist/modules/company_backend/screens.js.map +0 -1
- package/dist/modules/crm_backend/list-search.d.ts +0 -21
- package/dist/modules/crm_backend/list-search.d.ts.map +0 -1
- package/dist/modules/crm_backend/list-search.js +0 -220
- package/dist/modules/crm_backend/list-search.js.map +0 -1
- package/dist/modules/crm_backend/screens.d.ts +0 -32
- package/dist/modules/crm_backend/screens.d.ts.map +0 -1
- package/dist/modules/crm_backend/screens.js +0 -405
- package/dist/modules/crm_backend/screens.js.map +0 -1
- package/dist/modules/hospitality_core/screens.d.ts +0 -773
- package/dist/modules/hospitality_core/screens.d.ts.map +0 -1
- package/dist/modules/hospitality_core/screens.js +0 -4152
- package/dist/modules/hospitality_core/screens.js.map +0 -1
- package/dist/modules/hr_backend/screens.d.ts +0 -9
- package/dist/modules/hr_backend/screens.d.ts.map +0 -1
- package/dist/modules/hr_backend/screens.js +0 -144
- package/dist/modules/hr_backend/screens.js.map +0 -1
- package/dist/modules/loyalty_backend/screens.d.ts +0 -33
- package/dist/modules/loyalty_backend/screens.d.ts.map +0 -1
- package/dist/modules/loyalty_backend/screens.js +0 -562
- package/dist/modules/loyalty_backend/screens.js.map +0 -1
- package/dist/modules/mail_backend/screens.d.ts +0 -5
- package/dist/modules/mail_backend/screens.d.ts.map +0 -1
- package/dist/modules/mail_backend/screens.js +0 -11
- package/dist/modules/mail_backend/screens.js.map +0 -1
- package/dist/modules/mail_inbound_backend/screens.d.ts +0 -5
- package/dist/modules/mail_inbound_backend/screens.d.ts.map +0 -1
- package/dist/modules/mail_inbound_backend/screens.js +0 -25
- package/dist/modules/mail_inbound_backend/screens.js.map +0 -1
- package/dist/modules/mail_transport_backend/screens.d.ts +0 -5
- package/dist/modules/mail_transport_backend/screens.d.ts.map +0 -1
- package/dist/modules/mail_transport_backend/screens.js +0 -35
- package/dist/modules/mail_transport_backend/screens.js.map +0 -1
- package/dist/modules/oauth_backend/screens.d.ts +0 -66
- package/dist/modules/oauth_backend/screens.d.ts.map +0 -1
- package/dist/modules/oauth_backend/screens.js +0 -323
- package/dist/modules/oauth_backend/screens.js.map +0 -1
- package/dist/modules/odoo_collaboration_import/functions.d.ts.map +0 -1
- package/dist/modules/odoo_collaboration_import/functions.js +0 -128
- package/dist/modules/odoo_collaboration_import/functions.js.map +0 -1
- package/dist/modules/odoo_collaboration_import/index.d.ts +0 -6
- package/dist/modules/odoo_collaboration_import/index.d.ts.map +0 -1
- package/dist/modules/odoo_collaboration_import/index.js +0 -31
- package/dist/modules/odoo_collaboration_import/index.js.map +0 -1
- package/dist/modules/odoo_collaboration_import/models.d.ts.map +0 -1
- package/dist/modules/odoo_collaboration_import/models.js +0 -76
- package/dist/modules/odoo_collaboration_import/models.js.map +0 -1
- package/dist/modules/odoo_collaboration_import/operations.d.ts +0 -14
- package/dist/modules/odoo_collaboration_import/operations.d.ts.map +0 -1
- package/dist/modules/odoo_collaboration_import/operations.js +0 -1139
- package/dist/modules/odoo_collaboration_import/operations.js.map +0 -1
- package/dist/modules/odoo_collaboration_import/relations.d.ts.map +0 -1
- package/dist/modules/odoo_collaboration_import/relations.js +0 -19
- package/dist/modules/odoo_collaboration_import/relations.js.map +0 -1
- package/dist/modules/odoo_collaboration_import/types.d.ts +0 -58
- package/dist/modules/odoo_collaboration_import/types.d.ts.map +0 -1
- package/dist/modules/odoo_collaboration_import/types.js.map +0 -1
- package/dist/modules/partner_backend/screens.d.ts +0 -53
- package/dist/modules/partner_backend/screens.d.ts.map +0 -1
- package/dist/modules/partner_backend/screens.js +0 -169
- package/dist/modules/partner_backend/screens.js.map +0 -1
- package/dist/modules/pricing_backend/screens.d.ts +0 -13
- package/dist/modules/pricing_backend/screens.d.ts.map +0 -1
- package/dist/modules/pricing_backend/screens.js +0 -182
- package/dist/modules/pricing_backend/screens.js.map +0 -1
- package/dist/modules/product_backend/attributes-screen.d.ts +0 -7
- package/dist/modules/product_backend/attributes-screen.d.ts.map +0 -1
- package/dist/modules/product_backend/attributes-screen.js +0 -76
- package/dist/modules/product_backend/attributes-screen.js.map +0 -1
- package/dist/modules/product_backend/create-screen.d.ts +0 -12
- package/dist/modules/product_backend/create-screen.d.ts.map +0 -1
- package/dist/modules/product_backend/create-screen.js +0 -83
- package/dist/modules/product_backend/create-screen.js.map +0 -1
- package/dist/modules/product_backend/screens.d.ts +0 -68
- package/dist/modules/product_backend/screens.d.ts.map +0 -1
- package/dist/modules/product_backend/screens.js +0 -388
- package/dist/modules/product_backend/screens.js.map +0 -1
- package/dist/modules/purchase_backend/screens.d.ts +0 -29
- package/dist/modules/purchase_backend/screens.d.ts.map +0 -1
- package/dist/modules/purchase_backend/screens.js +0 -324
- package/dist/modules/purchase_backend/screens.js.map +0 -1
- package/dist/modules/sale_backend/invoicing-policies-screen.d.ts +0 -14
- package/dist/modules/sale_backend/invoicing-policies-screen.d.ts.map +0 -1
- package/dist/modules/sale_backend/invoicing-policies-screen.js +0 -36
- package/dist/modules/sale_backend/invoicing-policies-screen.js.map +0 -1
- package/dist/modules/sale_backend/order-detail-screen.d.ts +0 -18
- package/dist/modules/sale_backend/order-detail-screen.d.ts.map +0 -1
- package/dist/modules/sale_backend/order-detail-screen.js +0 -217
- package/dist/modules/sale_backend/order-detail-screen.js.map +0 -1
- package/dist/modules/sale_backend/quotations-screen.d.ts +0 -15
- package/dist/modules/sale_backend/quotations-screen.d.ts.map +0 -1
- package/dist/modules/sale_backend/quotations-screen.js +0 -64
- package/dist/modules/sale_backend/quotations-screen.js.map +0 -1
- package/dist/modules/sale_backend/sales-orders-screen.d.ts +0 -12
- package/dist/modules/sale_backend/sales-orders-screen.d.ts.map +0 -1
- package/dist/modules/sale_backend/sales-orders-screen.js +0 -65
- package/dist/modules/sale_backend/sales-orders-screen.js.map +0 -1
- package/dist/modules/sale_backend/screens.d.ts +0 -23
- package/dist/modules/sale_backend/screens.d.ts.map +0 -1
- package/dist/modules/sale_backend/screens.js +0 -275
- package/dist/modules/sale_backend/screens.js.map +0 -1
- package/dist/modules/stock_backend/forecast-screen.d.ts +0 -28
- package/dist/modules/stock_backend/forecast-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/forecast-screen.js +0 -108
- package/dist/modules/stock_backend/forecast-screen.js.map +0 -1
- package/dist/modules/stock_backend/inventory-screen.d.ts +0 -27
- package/dist/modules/stock_backend/inventory-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/inventory-screen.js +0 -141
- package/dist/modules/stock_backend/inventory-screen.js.map +0 -1
- package/dist/modules/stock_backend/locations-screen.d.ts +0 -18
- package/dist/modules/stock_backend/locations-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/locations-screen.js +0 -92
- package/dist/modules/stock_backend/locations-screen.js.map +0 -1
- package/dist/modules/stock_backend/lot-screen.d.ts +0 -30
- package/dist/modules/stock_backend/lot-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/lot-screen.js +0 -86
- package/dist/modules/stock_backend/lot-screen.js.map +0 -1
- package/dist/modules/stock_backend/lots-screen.d.ts +0 -21
- package/dist/modules/stock_backend/lots-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/lots-screen.js +0 -79
- package/dist/modules/stock_backend/lots-screen.js.map +0 -1
- package/dist/modules/stock_backend/picking-types-screen.d.ts +0 -21
- package/dist/modules/stock_backend/picking-types-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/picking-types-screen.js +0 -110
- package/dist/modules/stock_backend/picking-types-screen.js.map +0 -1
- package/dist/modules/stock_backend/replenishment-screen.d.ts +0 -29
- package/dist/modules/stock_backend/replenishment-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/replenishment-screen.js +0 -131
- package/dist/modules/stock_backend/replenishment-screen.js.map +0 -1
- package/dist/modules/stock_backend/screens.d.ts +0 -14
- package/dist/modules/stock_backend/screens.d.ts.map +0 -1
- package/dist/modules/stock_backend/screens.js +0 -40
- package/dist/modules/stock_backend/screens.js.map +0 -1
- package/dist/modules/stock_backend/stock-route-screen.d.ts +0 -30
- package/dist/modules/stock_backend/stock-route-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/stock-route-screen.js +0 -129
- package/dist/modules/stock_backend/stock-route-screen.js.map +0 -1
- package/dist/modules/stock_backend/stock-routes-screen.d.ts +0 -17
- package/dist/modules/stock_backend/stock-routes-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/stock-routes-screen.js +0 -60
- package/dist/modules/stock_backend/stock-routes-screen.js.map +0 -1
- package/dist/modules/stock_backend/transfer-screen.d.ts +0 -26
- package/dist/modules/stock_backend/transfer-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/transfer-screen.js +0 -95
- package/dist/modules/stock_backend/transfer-screen.js.map +0 -1
- package/dist/modules/stock_backend/transfers-screen.d.ts +0 -21
- package/dist/modules/stock_backend/transfers-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/transfers-screen.js +0 -88
- package/dist/modules/stock_backend/transfers-screen.js.map +0 -1
- package/dist/modules/stock_backend/warehouses-screen.d.ts +0 -17
- package/dist/modules/stock_backend/warehouses-screen.d.ts.map +0 -1
- package/dist/modules/stock_backend/warehouses-screen.js +0 -96
- package/dist/modules/stock_backend/warehouses-screen.js.map +0 -1
- package/dist/modules/user_backend/screens.d.ts +0 -70
- package/dist/modules/user_backend/screens.d.ts.map +0 -1
- package/dist/modules/user_backend/screens.js +0 -308
- package/dist/modules/user_backend/screens.js.map +0 -1
- package/dist/modules/website/customer-routes.d.ts +0 -3
- package/dist/modules/website/customer-routes.d.ts.map +0 -1
- package/dist/modules/website/customer-routes.js +0 -322
- package/dist/modules/website/customer-routes.js.map +0 -1
- package/dist/modules/website_backend/screens.d.ts +0 -114
- package/dist/modules/website_backend/screens.d.ts.map +0 -1
- package/dist/modules/website_backend/screens.js +0 -625
- package/dist/modules/website_backend/screens.js.map +0 -1
- package/dist/ui/client/mail.d.mts +0 -11
- package/dist/ui/client/mail.d.mts.map +0 -1
- package/dist/ui/client/mail.mjs +0 -10
- package/dist/ui/client/mail.mjs.map +0 -1
- /package/dist/modules/{odoo_collaboration_import → account_staff_channel}/functions.d.ts +0 -0
- /package/dist/modules/{odoo_collaboration_import → account_staff_channel}/models.d.ts +0 -0
- /package/dist/modules/{odoo_collaboration_import → address_backend/screens}/types.js +0 -0
- /package/dist/modules/{odoo_collaboration_import → manufacturing}/relations.d.ts +0 -0
|
@@ -0,0 +1,1665 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { asc, bucketEq, compileListFilter, dateBucket, deleteFrom, desc, eq, from, gte, inArray, isNotNull, isNull, isTimezone, lt, not, or, } from '@ketvietlab/ketjs';
|
|
4
|
+
import { ensureThread, followThread, listTimeline, postMessage, unfollowThread } from '../mail/index.js';
|
|
5
|
+
import { DEPENDENCY_RELATIONS, ISSUE_PRIORITIES } from './types.js';
|
|
6
|
+
import { emptyIssueListState, FIELD_FILTER_PREFIX, issueListSearch } from './search.js';
|
|
7
|
+
import { readableProject, readableRow, restrictToVisible, visibleProjects } from './membership.js';
|
|
8
|
+
export const issue = (field, code, params) => ({
|
|
9
|
+
field,
|
|
10
|
+
code,
|
|
11
|
+
...(params ? { params } : {}),
|
|
12
|
+
});
|
|
13
|
+
export const invalid = (...errors) => ({ ok: false, errors });
|
|
14
|
+
export const now = () => new Date().toISOString();
|
|
15
|
+
/**
|
|
16
|
+
* The company's civil-date timezone, or UTC when it has none.
|
|
17
|
+
*
|
|
18
|
+
* "Overdue" and "grouped by day" are claims about a calendar, and a calendar
|
|
19
|
+
* belongs to a place. For Flow that place is the company: unlike Hospitality it
|
|
20
|
+
* has no notion of a site, and a company that disagreed with itself about what
|
|
21
|
+
* day it is would make the figures beside a list and the list itself say
|
|
22
|
+
* different things — see FLW-DEC-010.
|
|
23
|
+
*
|
|
24
|
+
* The column is Accounting's by name because Accounting needed a civil date
|
|
25
|
+
* first. It is the company's by meaning, and reading it here is what keeps two
|
|
26
|
+
* settings from having to agree.
|
|
27
|
+
*/
|
|
28
|
+
export async function businessTimezone(ctx) {
|
|
29
|
+
const companyId = ctx.scope?.company;
|
|
30
|
+
if (!companyId)
|
|
31
|
+
return 'UTC';
|
|
32
|
+
const company = (await ctx.db.select('company.Company', { id: companyId }))[0];
|
|
33
|
+
const timezone = String(company?.accountingTimezone ?? '').trim();
|
|
34
|
+
return isTimezone(timezone) ? timezone : 'UTC';
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Today where the company is — which, for most of the day in Vietnam, is not
|
|
38
|
+
* today in UTC. A task due today was being counted late from 07:00 local.
|
|
39
|
+
*/
|
|
40
|
+
export async function businessToday(ctx, timezone) {
|
|
41
|
+
const zone = timezone ?? (await businessTimezone(ctx));
|
|
42
|
+
return dateBucket(new Date().toISOString(), 'day', zone) ?? new Date().toISOString().slice(0, 10);
|
|
43
|
+
}
|
|
44
|
+
export const n = (value) => Number(value ?? 0);
|
|
45
|
+
export const normalized = (value) => String(value ?? '')
|
|
46
|
+
.normalize('NFKC')
|
|
47
|
+
.trim()
|
|
48
|
+
.toLowerCase();
|
|
49
|
+
export const actorRequired = (ctx) => ctx.actor || null;
|
|
50
|
+
/**
|
|
51
|
+
* The id of a record a command creates, derived from what the command is
|
|
52
|
+
* deduplicated under.
|
|
53
|
+
*
|
|
54
|
+
* A form that is submitted twice — a double click, a back button, a retry from
|
|
55
|
+
* a phone that lost its connection — sends the same idempotency key both
|
|
56
|
+
* times. If the id is fresh on each attempt, the second attempt is a different
|
|
57
|
+
* record and gets written as one: two issues from one intent. Deriving the id
|
|
58
|
+
* from the key makes the replay byte-identical, so it lands on the record the
|
|
59
|
+
* first attempt already made and updates it instead (FLW-033).
|
|
60
|
+
*/
|
|
61
|
+
export const commandRecordId = (namespace, key) => {
|
|
62
|
+
const hex = createHash('sha256').update(`${namespace}\n${key}`).digest('hex');
|
|
63
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
|
|
64
|
+
};
|
|
65
|
+
export const commandKey = (value) => {
|
|
66
|
+
const key = String(value ?? '').trim();
|
|
67
|
+
return key.length >= 8 && key.length <= 200 ? key : null;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Live, and readable by this caller.
|
|
71
|
+
*
|
|
72
|
+
* Creating an issue in a project somebody cannot see is writing to a project
|
|
73
|
+
* they cannot see, so the same gate answers both. The caller turns a false here
|
|
74
|
+
* into "not found", which is also the right answer for a project that is real
|
|
75
|
+
* but not theirs.
|
|
76
|
+
*/
|
|
77
|
+
const projectExists = async (ctx, id) => {
|
|
78
|
+
const project = await readableProject(ctx, id);
|
|
79
|
+
return Boolean(project && project.active === true);
|
|
80
|
+
};
|
|
81
|
+
const columnOf = async (ctx, id) => (await ctx.db.select('flow.Column', { id, active: true }))[0] ?? null;
|
|
82
|
+
const userExists = async (ctx, id) => !id || Boolean((await ctx.db.select('user.User', { id, active: true }))[0]);
|
|
83
|
+
/**
|
|
84
|
+
* A sprint an issue may still be dropped into.
|
|
85
|
+
*
|
|
86
|
+
* `null` reads as "no sprint" (always allowed). A closed sprint is the one
|
|
87
|
+
* state that refuses new membership — see the design note on the Sprint model.
|
|
88
|
+
*/
|
|
89
|
+
async function assignableSprint(ctx, sprintId) {
|
|
90
|
+
if (!sprintId)
|
|
91
|
+
return null;
|
|
92
|
+
const sprint = (await ctx.db.select('flow.Sprint', { id: sprintId }))[0];
|
|
93
|
+
if (!sprint)
|
|
94
|
+
return undefined;
|
|
95
|
+
return sprint.state === 'closed' ? undefined : sprint;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Subscribes a user to an issue's thread, when the platform can address them.
|
|
99
|
+
*
|
|
100
|
+
* Followers are partner-keyed the whole way down — `mail.Notification`'s
|
|
101
|
+
* `recipientPartnerId` is required — while `user.User.partnerId` is optional
|
|
102
|
+
* by design ("an internal operator needs no entry in the address book"). So a
|
|
103
|
+
* user without one cannot be subscribed and cannot be notified. Skipping is
|
|
104
|
+
* the truthful outcome: the alternative is creating address-book rows as a
|
|
105
|
+
* side effect of assigning a task, which is not a decision this module gets
|
|
106
|
+
* to make.
|
|
107
|
+
*/
|
|
108
|
+
async function followIssue(ctx, threadId, userId) {
|
|
109
|
+
if (!threadId || !userId)
|
|
110
|
+
return;
|
|
111
|
+
const user = (await ctx.db.select('user.User', { id: userId }))[0];
|
|
112
|
+
if (!user?.partnerId)
|
|
113
|
+
return;
|
|
114
|
+
await followThread(ctx, {
|
|
115
|
+
id: `${String(threadId)}:${String(user.partnerId)}`,
|
|
116
|
+
threadId: String(threadId),
|
|
117
|
+
partnerId: String(user.partnerId),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The partners behind a list of mentioned users.
|
|
122
|
+
*
|
|
123
|
+
* Mentions are partner-keyed the whole way down, the same as followers, so a
|
|
124
|
+
* user without a partner cannot be mentioned any more than they can be
|
|
125
|
+
* notified — see `followIssue` above for why that is the platform's shape
|
|
126
|
+
* rather than something to work around here. They are dropped rather than
|
|
127
|
+
* refused: a comment naming five people should still reach the four the system
|
|
128
|
+
* can address.
|
|
129
|
+
*/
|
|
130
|
+
async function mentionPartners(ctx, userIds) {
|
|
131
|
+
const wanted = [...new Set(userIds.filter(Boolean).map(String))];
|
|
132
|
+
if (!wanted.length)
|
|
133
|
+
return [];
|
|
134
|
+
const U = ctx.table('user.User');
|
|
135
|
+
const users = await ctx.db.all(from(U).where(inArray(U.id, wanted)));
|
|
136
|
+
return [
|
|
137
|
+
...new Set(users
|
|
138
|
+
.map((user) => user.partnerId)
|
|
139
|
+
.filter(Boolean)
|
|
140
|
+
.map(String)),
|
|
141
|
+
];
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* An epic an issue may belong to.
|
|
145
|
+
*
|
|
146
|
+
* `undefined` means "named but not found". Every other reference on an issue
|
|
147
|
+
* — column, sprint, parent — is checked for existence and for belonging to
|
|
148
|
+
* the same project; epic was the one that was written straight through, so an
|
|
149
|
+
* issue in project A could be filed under project B's epic and would then
|
|
150
|
+
* appear on B's epic panel and dependency map while still living on A's board.
|
|
151
|
+
*/
|
|
152
|
+
async function issueEpic(ctx, epicId) {
|
|
153
|
+
if (!epicId)
|
|
154
|
+
return null;
|
|
155
|
+
return (await ctx.db.select('flow.Epic', { id: epicId }))[0] ?? undefined;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* A type an issue may be filed as.
|
|
159
|
+
*
|
|
160
|
+
* Checked for existence and for belonging to the same project, which is what
|
|
161
|
+
* `epicId` was not and had to be taught — a reference written straight through
|
|
162
|
+
* puts a row on a board it does not belong to, and every screen downstream
|
|
163
|
+
* then agrees with it.
|
|
164
|
+
*/
|
|
165
|
+
async function issueType(ctx, typeId) {
|
|
166
|
+
if (!typeId)
|
|
167
|
+
return null;
|
|
168
|
+
return (await ctx.db.select('flow.IssueType', { id: typeId }))[0] ?? undefined;
|
|
169
|
+
}
|
|
170
|
+
/** The options a `select` field offers, as codes. */
|
|
171
|
+
const optionCodes = (config) => {
|
|
172
|
+
const options = config?.options;
|
|
173
|
+
return Array.isArray(options) ? options.map((option) => String(option?.code ?? '')) : [];
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* Whether a value is well-formed for the kind of field holding it.
|
|
177
|
+
*
|
|
178
|
+
* Empty always passes and clears the value: a field a team added last week is
|
|
179
|
+
* blank on every issue that already existed, and refusing to save those until
|
|
180
|
+
* somebody fills it in would make adding a field an act of vandalism.
|
|
181
|
+
*/
|
|
182
|
+
export function fieldValueError(field, raw) {
|
|
183
|
+
const value = String(raw ?? '').trim();
|
|
184
|
+
if (!value)
|
|
185
|
+
return null;
|
|
186
|
+
const kind = String(field.kind);
|
|
187
|
+
const bad = (code) => issue(`field:${String(field.code)}`, code);
|
|
188
|
+
if (kind === 'number' && !Number.isFinite(Number(value)))
|
|
189
|
+
return bad('flow.error.fieldNumber');
|
|
190
|
+
if (kind === 'date' && Number.isNaN(Date.parse(value)))
|
|
191
|
+
return bad('flow.error.fieldDate');
|
|
192
|
+
if (kind === 'bool' && value !== 'true' && value !== 'false')
|
|
193
|
+
return bad('flow.error.fieldBool');
|
|
194
|
+
// http/https only, the same rule the editor applies to a link it renders:
|
|
195
|
+
// this one ends up in an href on somebody else's screen too.
|
|
196
|
+
if (kind === 'url' && !/^https?:\/\//i.test(value))
|
|
197
|
+
return bad('flow.error.fieldUrl');
|
|
198
|
+
if (kind === 'select' && !optionCodes(field.config).includes(value))
|
|
199
|
+
return bad('flow.error.fieldOption');
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* The custom fields of one project, by id and by code.
|
|
204
|
+
*
|
|
205
|
+
* Callers name a field either way — a screen posts ids, an agent writing
|
|
206
|
+
* `{ environment: 'production' }` names codes — and both have to land on the
|
|
207
|
+
* same definition.
|
|
208
|
+
*/
|
|
209
|
+
async function fieldsOfProject(ctx, projectId) {
|
|
210
|
+
const defs = await ctx.db.select('flow.FieldDef', { projectId, active: true });
|
|
211
|
+
const by = new Map();
|
|
212
|
+
for (const def of defs) {
|
|
213
|
+
by.set(String(def.id), def);
|
|
214
|
+
by.set(String(def.code), def);
|
|
215
|
+
}
|
|
216
|
+
return by;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* A parent an issue may point at.
|
|
220
|
+
*
|
|
221
|
+
* Sub-tasks nest inside one project's board, so a parent from another project
|
|
222
|
+
* would put a child on a board its parent is not on. A cycle is worse: the
|
|
223
|
+
* pair becomes each other's ancestor and any walk up the tree runs forever.
|
|
224
|
+
* `blocks` already refuses cycles for the same reason (see createsBlockCycle);
|
|
225
|
+
* parentage had no check at all, and accepted a parent id that did not exist.
|
|
226
|
+
*/
|
|
227
|
+
async function parentIssueError(ctx, issueId, parentIssueId, projectId) {
|
|
228
|
+
if (!parentIssueId)
|
|
229
|
+
return null;
|
|
230
|
+
if (String(parentIssueId) === issueId)
|
|
231
|
+
return issue('parentIssueId', 'flow.error.selfParent');
|
|
232
|
+
const parent = (await ctx.db.select('flow.Issue', { id: parentIssueId }))[0];
|
|
233
|
+
if (!parent)
|
|
234
|
+
return issue('parentIssueId', 'flow.error.notFound');
|
|
235
|
+
if (String(parent.projectId) !== projectId)
|
|
236
|
+
return issue('parentIssueId', 'flow.error.parentProjectMismatch');
|
|
237
|
+
const seen = new Set([issueId]);
|
|
238
|
+
let at = parent;
|
|
239
|
+
while (at) {
|
|
240
|
+
const id = String(at.id);
|
|
241
|
+
if (seen.has(id))
|
|
242
|
+
return issue('parentIssueId', 'flow.error.parentCycle');
|
|
243
|
+
seen.add(id);
|
|
244
|
+
at = at.parentIssueId ? (await ctx.db.select('flow.Issue', { id: at.parentIssueId }))[0] : undefined;
|
|
245
|
+
}
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* How far along each issue is, counted from its sub-tasks.
|
|
250
|
+
*
|
|
251
|
+
* "Done" is a sub-task sitting in a column with `terminalState` — the concept
|
|
252
|
+
* models.ts introduced for exactly this kind of question, so that a team whose
|
|
253
|
+
* workflow is five columns wide gets the same answer as one running three, and
|
|
254
|
+
* neither has to be called "Done".
|
|
255
|
+
*
|
|
256
|
+
* Sub-tasks are the checklist. The description can hold one too, and does, but
|
|
257
|
+
* that one is prose: nobody can be given an item in it, nothing can be counted
|
|
258
|
+
* from outside the document, and it is not what this reads.
|
|
259
|
+
*
|
|
260
|
+
* Unlimited on purpose, unlike `dependenciesFor` below. The query is already
|
|
261
|
+
* bounded twice over — by one page of parents, and by sub-tasks being a
|
|
262
|
+
* relation a person types out by hand — and a cap on a *count* is worse than a
|
|
263
|
+
* cap on a list: a truncated list looks truncated, while 3/5 that should read
|
|
264
|
+
* 3/9 just looks wrong.
|
|
265
|
+
*/
|
|
266
|
+
async function progressOf(ctx, issueIds) {
|
|
267
|
+
const tally = new Map();
|
|
268
|
+
if (!issueIds.length)
|
|
269
|
+
return tally;
|
|
270
|
+
const I = ctx.table('flow.Issue');
|
|
271
|
+
const children = await ctx.db.all(from(I).where(inArray(I.parentIssueId, issueIds)).where(eq(I.active, true)));
|
|
272
|
+
if (!children.length)
|
|
273
|
+
return tally;
|
|
274
|
+
const C = ctx.table('flow.Column');
|
|
275
|
+
const columnIds = [...new Set(children.map((child) => String(child.columnId)))];
|
|
276
|
+
const columns = await ctx.db.all(from(C).where(inArray(C.id, columnIds)));
|
|
277
|
+
const terminal = new Set(columns.filter((column) => column.terminalState).map((column) => String(column.id)));
|
|
278
|
+
for (const child of children) {
|
|
279
|
+
const key = String(child.parentIssueId);
|
|
280
|
+
const at = tally.get(key) ?? { done: 0, total: 0 };
|
|
281
|
+
at.total += 1;
|
|
282
|
+
if (terminal.has(String(child.columnId)))
|
|
283
|
+
at.done += 1;
|
|
284
|
+
tally.set(key, at);
|
|
285
|
+
}
|
|
286
|
+
return tally;
|
|
287
|
+
}
|
|
288
|
+
export async function serializeIssueList(ctx, rows) {
|
|
289
|
+
const ids = (values) => [...new Set(values.filter(Boolean).map(String))];
|
|
290
|
+
const columnIds = ids(rows.map((row) => row.columnId));
|
|
291
|
+
const epicIds = ids(rows.map((row) => row.epicId));
|
|
292
|
+
const sprintIds = ids(rows.map((row) => row.sprintId));
|
|
293
|
+
const userIds = ids(rows.map((row) => row.assigneeUserId));
|
|
294
|
+
const typeIds = ids(rows.map((row) => row.typeId));
|
|
295
|
+
const issueIds = rows.map((row) => String(row.id));
|
|
296
|
+
// The project too, for the one list that spans them: an issue read outside
|
|
297
|
+
// its own board has to say which board it came from.
|
|
298
|
+
const projectIds = ids(rows.map((row) => row.projectId));
|
|
299
|
+
const [columns, epics, sprints, users, projects, types, progress, values] = await Promise.all([
|
|
300
|
+
columnIds.length
|
|
301
|
+
? ctx.db.all(from(ctx.table('flow.Column')).where(inArray(ctx.table('flow.Column').id, columnIds)))
|
|
302
|
+
: [],
|
|
303
|
+
epicIds.length
|
|
304
|
+
? ctx.db.all(from(ctx.table('flow.Epic')).where(inArray(ctx.table('flow.Epic').id, epicIds)))
|
|
305
|
+
: [],
|
|
306
|
+
sprintIds.length
|
|
307
|
+
? ctx.db.all(from(ctx.table('flow.Sprint')).where(inArray(ctx.table('flow.Sprint').id, sprintIds)))
|
|
308
|
+
: [],
|
|
309
|
+
userIds.length
|
|
310
|
+
? ctx.db.all(from(ctx.table('user.User')).where(inArray(ctx.table('user.User').id, userIds)))
|
|
311
|
+
: [],
|
|
312
|
+
projectIds.length
|
|
313
|
+
? ctx.db.all(from(ctx.table('flow.Project')).where(inArray(ctx.table('flow.Project').id, projectIds)))
|
|
314
|
+
: [],
|
|
315
|
+
typeIds.length
|
|
316
|
+
? ctx.db.all(from(ctx.table('flow.IssueType')).where(inArray(ctx.table('flow.IssueType').id, typeIds)))
|
|
317
|
+
: [],
|
|
318
|
+
progressOf(ctx, issueIds),
|
|
319
|
+
// Custom field values for the whole page in one query, so a list can show
|
|
320
|
+
// a column for them. Keyed by field id rather than code, because a screen
|
|
321
|
+
// holds the definitions and matches on what it was given.
|
|
322
|
+
issueIds.length
|
|
323
|
+
? ctx.db.all(from(ctx.table('flow.IssueFieldValue')).where(inArray(ctx.table('flow.IssueFieldValue').issueId, issueIds)))
|
|
324
|
+
: [],
|
|
325
|
+
]);
|
|
326
|
+
const by = (values) => new Map(values.map((row) => [String(row.id), row]));
|
|
327
|
+
const columnBy = by(columns);
|
|
328
|
+
const epicBy = by(epics);
|
|
329
|
+
const sprintBy = by(sprints);
|
|
330
|
+
const userBy = by(users);
|
|
331
|
+
const projectBy = by(projects);
|
|
332
|
+
const typeBy = by(types);
|
|
333
|
+
const fieldsBy = new Map();
|
|
334
|
+
for (const entry of values) {
|
|
335
|
+
const key = String(entry.issueId);
|
|
336
|
+
const held = fieldsBy.get(key) ?? {};
|
|
337
|
+
held[String(entry.fieldId)] = entry.value;
|
|
338
|
+
fieldsBy.set(key, held);
|
|
339
|
+
}
|
|
340
|
+
return rows.map((row) => {
|
|
341
|
+
const counted = progress.get(String(row.id));
|
|
342
|
+
return {
|
|
343
|
+
...row,
|
|
344
|
+
/**
|
|
345
|
+
* The day a bar starts, which is not the same fact as `startDate`.
|
|
346
|
+
*
|
|
347
|
+
* Nobody sets a start date on most issues, and a chart still has to
|
|
348
|
+
* begin somewhere; the day it was written down is the honest stand-in.
|
|
349
|
+
* Kept separate from the stored value on purpose — a form bound to this
|
|
350
|
+
* would show the fallback as an answer, and saving would then write it
|
|
351
|
+
* back as one.
|
|
352
|
+
*/
|
|
353
|
+
startsOn: row.startDate ?? (row.createdAt ? String(row.createdAt).slice(0, 10) : null),
|
|
354
|
+
subtaskTotal: counted?.total ?? 0,
|
|
355
|
+
subtaskDone: counted?.done ?? 0,
|
|
356
|
+
/**
|
|
357
|
+
* Null, not zero, when an issue has no sub-tasks. "Nothing to do" and
|
|
358
|
+
* "nothing done yet" are different facts, and a column of 0% against every
|
|
359
|
+
* issue nobody had broken down would report the second while meaning the
|
|
360
|
+
* first.
|
|
361
|
+
*/
|
|
362
|
+
progress: counted ? Math.round((counted.done * 100) / counted.total) : null,
|
|
363
|
+
projectName: row.projectId ? (projectBy.get(String(row.projectId))?.name ?? row.projectId) : null,
|
|
364
|
+
columnName: row.columnId ? (columnBy.get(String(row.columnId))?.name ?? row.columnId) : null,
|
|
365
|
+
/**
|
|
366
|
+
* Whether this issue's column is one the board treats as finished.
|
|
367
|
+
*
|
|
368
|
+
* The name alone cannot answer it — "Done", "Shipped" and "Closed" are
|
|
369
|
+
* all somebody's terminal column and none of them is a keyword — so a
|
|
370
|
+
* screen wanting to mark a late issue would have to re-read the columns
|
|
371
|
+
* it was just handed.
|
|
372
|
+
*/
|
|
373
|
+
terminal: row.columnId ? columnBy.get(String(row.columnId))?.terminalState === true : false,
|
|
374
|
+
epicTitle: row.epicId ? (epicBy.get(String(row.epicId))?.title ?? row.epicId) : null,
|
|
375
|
+
sprintName: row.sprintId ? (sprintBy.get(String(row.sprintId))?.name ?? row.sprintId) : null,
|
|
376
|
+
assigneeName: row.assigneeUserId
|
|
377
|
+
? (userBy.get(String(row.assigneeUserId))?.name ?? row.assigneeUserId)
|
|
378
|
+
: null,
|
|
379
|
+
/** `{ [fieldId]: value }`, for whatever fields this row happens to hold. */
|
|
380
|
+
fieldValues: fieldsBy.get(String(row.id)) ?? {},
|
|
381
|
+
typeName: row.typeId ? (typeBy.get(String(row.typeId))?.name ?? row.typeId) : null,
|
|
382
|
+
typeColor: row.typeId ? (typeBy.get(String(row.typeId))?.color ?? null) : null,
|
|
383
|
+
};
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* How many issues one custom-field filter may match.
|
|
388
|
+
*
|
|
389
|
+
* The value lives in another table and this query builder has no JOIN, so the
|
|
390
|
+
* rule is answered by collecting ids and handing them to `IN (...)`. That list
|
|
391
|
+
* becomes SQL parameters, and every database has a ceiling on those — SQLite's
|
|
392
|
+
* has historically been 999.
|
|
393
|
+
*
|
|
394
|
+
* Capped rather than left to fail at the driver, and reported rather than
|
|
395
|
+
* trimmed quietly: a truncated *list* looks truncated, while a truncated
|
|
396
|
+
* *filter* looks like an answer. `listIssues` passes `fieldFilterTruncated`
|
|
397
|
+
* back so a screen can say so.
|
|
398
|
+
*/
|
|
399
|
+
export const FIELD_FILTER_MATCHES = 900;
|
|
400
|
+
/**
|
|
401
|
+
* Answers every `field:<code>` rule as a set of issue ids, and takes the rules
|
|
402
|
+
* out of the state on the way.
|
|
403
|
+
*
|
|
404
|
+
* The value lives in another table, so the rule cannot compile against a column
|
|
405
|
+
* of `flow.Issue`. Rewriting it in place does not work either — the spec
|
|
406
|
+
* declares a select field's `choices`, and a list of ids is not among them, so
|
|
407
|
+
* validation refuses the rewritten rule. So the rules leave, and what they
|
|
408
|
+
* selected is applied to the query directly.
|
|
409
|
+
*
|
|
410
|
+
* Only the top level is read, which is the only shape the filter UI builds
|
|
411
|
+
* (facets and the custom-filter row are both flat, and flat means AND). A rule
|
|
412
|
+
* nested inside an `or` group is left where it is rather than quietly hoisted
|
|
413
|
+
* out of it: removing one from an `or` widens the group, and answering a
|
|
414
|
+
* narrower question than was asked is the failure that looks like success.
|
|
415
|
+
*/
|
|
416
|
+
async function resolveFieldFilters(ctx, state, projectId) {
|
|
417
|
+
const top = (state.filters ?? []);
|
|
418
|
+
const rules = top.filter((node) => node?.kind === 'rule' && String(node.field ?? '').startsWith(FIELD_FILTER_PREFIX));
|
|
419
|
+
if (!rules.length)
|
|
420
|
+
return { state, ids: null, truncated: false };
|
|
421
|
+
const defs = await ctx.db.select('flow.FieldDef', projectId ? { projectId, active: true } : { active: true });
|
|
422
|
+
const byCode = new Map(defs.map((def) => [String(def.code), def]));
|
|
423
|
+
let truncated = false;
|
|
424
|
+
let matched = null;
|
|
425
|
+
for (const rule of rules) {
|
|
426
|
+
const code = String(rule.field).slice(FIELD_FILTER_PREFIX.length);
|
|
427
|
+
const def = byCode.get(code);
|
|
428
|
+
const found = new Set();
|
|
429
|
+
if (def) {
|
|
430
|
+
const V = ctx.table('flow.IssueFieldValue');
|
|
431
|
+
let query = from(V).where(eq(V.fieldId, def.id));
|
|
432
|
+
const operator = String(rule.operator);
|
|
433
|
+
if (operator === 'equals')
|
|
434
|
+
query = query.where(eq(V.value, String(rule.value ?? '')));
|
|
435
|
+
else if (operator === 'anyOf') {
|
|
436
|
+
const values = (Array.isArray(rule.value) ? rule.value : [rule.value]).map(String);
|
|
437
|
+
query = query.where(inArray(V.value, values));
|
|
438
|
+
}
|
|
439
|
+
// `isSet` needs no clause of its own: a row exists only where there is a
|
|
440
|
+
// value, because emptying a field deletes its row rather than storing "".
|
|
441
|
+
const rows = await ctx.db.all(query.limit(FIELD_FILTER_MATCHES + 1));
|
|
442
|
+
if (rows.length > FIELD_FILTER_MATCHES)
|
|
443
|
+
truncated = true;
|
|
444
|
+
for (const row of rows.slice(0, FIELD_FILTER_MATCHES))
|
|
445
|
+
found.add(String(row.issueId));
|
|
446
|
+
}
|
|
447
|
+
// Several rules narrow each other, which is what a flat filter row means.
|
|
448
|
+
matched = matched ? new Set([...matched].filter((id) => found.has(id))) : found;
|
|
449
|
+
}
|
|
450
|
+
return {
|
|
451
|
+
state: { ...state, filters: top.filter((node) => !rules.includes(node)) },
|
|
452
|
+
ids: [...(matched ?? new Set())],
|
|
453
|
+
truncated,
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
const listStateOf = (value) => value && typeof value === 'object' ? value : null;
|
|
457
|
+
/**
|
|
458
|
+
* The columns a board treats as finished, and the one it starts from.
|
|
459
|
+
*
|
|
460
|
+
* Read once and shared, because "late" and "not started" both need them and
|
|
461
|
+
* two readings could disagree. A finished issue is never late, however long
|
|
462
|
+
* ago its date was — the work is done, and a red date on it would be asking
|
|
463
|
+
* for something that has already happened.
|
|
464
|
+
*/
|
|
465
|
+
const boardEdges = async (ctx) => {
|
|
466
|
+
const C = ctx.table('flow.Column');
|
|
467
|
+
const columns = await ctx.db.all(from(C).where(eq(C.active, true)));
|
|
468
|
+
const firstOf = new Map();
|
|
469
|
+
for (const column of columns) {
|
|
470
|
+
if (column.terminalState)
|
|
471
|
+
continue;
|
|
472
|
+
const key = String(column.projectId);
|
|
473
|
+
const held = firstOf.get(key);
|
|
474
|
+
const at = { id: String(column.id), sequence: n(column.sequence) };
|
|
475
|
+
if (!held || at.sequence < held.sequence)
|
|
476
|
+
firstOf.set(key, at);
|
|
477
|
+
}
|
|
478
|
+
return {
|
|
479
|
+
terminal: columns.filter((column) => column.terminalState).map((column) => String(column.id)),
|
|
480
|
+
first: [...firstOf.values()].map((column) => column.id),
|
|
481
|
+
};
|
|
482
|
+
};
|
|
483
|
+
const issueQuery = async (ctx, args) => {
|
|
484
|
+
const I = ctx.table('flow.Issue');
|
|
485
|
+
// Every issue read — list, group, buckets, options — comes through here, so
|
|
486
|
+
// this is where a caller stops seeing projects they are not on. One gate
|
|
487
|
+
// rather than four, because the fourth is the one somebody forgets.
|
|
488
|
+
const visible = await visibleProjects(ctx);
|
|
489
|
+
const given = listStateOf(args.listState) ?? emptyIssueListState();
|
|
490
|
+
// A caller may still name a timezone — an agent reporting for somewhere else
|
|
491
|
+
// — but no caller has to, and the screens no longer do. The default is the
|
|
492
|
+
// company's own calendar rather than UTC, which was nobody's calendar.
|
|
493
|
+
const timezone = String(args.timezone ?? '').trim() || (await businessTimezone(ctx));
|
|
494
|
+
let query = from(I);
|
|
495
|
+
// The spec has to know the project's own fields, or `parseListState` would
|
|
496
|
+
// have dropped their rules as unknown before they ever reached here.
|
|
497
|
+
const defs = args.projectId
|
|
498
|
+
? await ctx.db.select('flow.FieldDef', { projectId: args.projectId, active: true })
|
|
499
|
+
: [];
|
|
500
|
+
const { state, ids, truncated } = await resolveFieldFilters(ctx, given, args.projectId);
|
|
501
|
+
const spec = issueListSearch(I, defs);
|
|
502
|
+
const compiled = compileListFilter(spec, state, { timezone });
|
|
503
|
+
if (compiled)
|
|
504
|
+
query = query.where(compiled);
|
|
505
|
+
query = restrictToVisible(query, I.projectId, visible);
|
|
506
|
+
// No match is not "no filter": asking for a value nothing holds has to answer
|
|
507
|
+
// with nothing, which an empty list already does — `query.ts` compiles an
|
|
508
|
+
// empty `IN` to `1 = 0` rather than to no clause at all.
|
|
509
|
+
if (ids)
|
|
510
|
+
query = query.where(inArray(I.id, ids));
|
|
511
|
+
const path = Array.isArray(args.path) ? args.path : [];
|
|
512
|
+
for (let index = 0; index < path.length; index++) {
|
|
513
|
+
const selected = state.groupBy[index];
|
|
514
|
+
const field = spec.groupable?.find((candidate) => candidate.key === selected?.key);
|
|
515
|
+
if (!field)
|
|
516
|
+
continue;
|
|
517
|
+
const value = path[index];
|
|
518
|
+
query = query.where(selected?.interval
|
|
519
|
+
? bucketEq(field.col, selected.interval, timezone, String(value))
|
|
520
|
+
: eq(field.col, value));
|
|
521
|
+
}
|
|
522
|
+
if (args.projectId)
|
|
523
|
+
query = query.where(eq(I.projectId, args.projectId));
|
|
524
|
+
if (args.columnId)
|
|
525
|
+
query = query.where(eq(I.columnId, args.columnId));
|
|
526
|
+
if (args.epicId)
|
|
527
|
+
query = query.where(eq(I.epicId, args.epicId));
|
|
528
|
+
if (args.sprintId)
|
|
529
|
+
query = query.where(eq(I.sprintId, args.sprintId));
|
|
530
|
+
if (args.assigneeUserId)
|
|
531
|
+
query = query.where(eq(I.assigneeUserId, args.assigneeUserId));
|
|
532
|
+
// "Assigned to me" is resolved here rather than by the caller: a screen has
|
|
533
|
+
// no cheap way to learn who is signed in, and `activity.listMy` already
|
|
534
|
+
// settles the question the same way. A request with no actor matches
|
|
535
|
+
// nothing, which is the safe reading of "mine".
|
|
536
|
+
if (args.mine === true)
|
|
537
|
+
query = query.where(eq(I.assigneeUserId, ctx.actor ?? '\u0000'));
|
|
538
|
+
// A day, and the query narrows to what was already due before it and is not
|
|
539
|
+
// finished. Here rather than at each caller so the list, the counts and the
|
|
540
|
+
// rail cannot drift apart on what "late" means.
|
|
541
|
+
if (args.overdueOn) {
|
|
542
|
+
const { terminal } = await boardEdges(ctx);
|
|
543
|
+
query = query.where(isNotNull(I.dueDate), lt(I.dueDate, String(args.overdueOn)), ...(terminal.length ? [not(inArray(I.columnId, terminal))] : []));
|
|
544
|
+
}
|
|
545
|
+
if (!state.includeArchived && args.includeArchived !== true)
|
|
546
|
+
query = query.where(eq(I.active, true));
|
|
547
|
+
const sorts = state.sort.length ? state.sort : emptyIssueListState().sort;
|
|
548
|
+
const sortable = new Map((spec.sortable ?? []).map((field) => [field.key, field.col]));
|
|
549
|
+
for (const sort of sorts) {
|
|
550
|
+
const col = sortable.get(sort.key);
|
|
551
|
+
if (col)
|
|
552
|
+
query = query.orderBy(sort.dir === 'desc' ? desc(col) : asc(col));
|
|
553
|
+
}
|
|
554
|
+
return { query, state, spec, timezone, truncated };
|
|
555
|
+
};
|
|
556
|
+
export async function listIssues(ctx, args) {
|
|
557
|
+
const { query, truncated } = await issueQuery(ctx, args);
|
|
558
|
+
const offset = Math.max(0, Number.parseInt(String(args.cursor ?? '0'), 10) || 0);
|
|
559
|
+
const limit = Math.max(1, Math.min(200, n(args.limit ?? 50)));
|
|
560
|
+
const [total, page] = await Promise.all([
|
|
561
|
+
ctx.db.count(query),
|
|
562
|
+
ctx.db.all(query.limit(limit).offset(offset)),
|
|
563
|
+
]);
|
|
564
|
+
return {
|
|
565
|
+
rows: await serializeIssueList(ctx, page),
|
|
566
|
+
total,
|
|
567
|
+
nextCursor: offset + limit < total ? String(offset + limit) : null,
|
|
568
|
+
// Only said when it happened. A filter that quietly stopped short reads as
|
|
569
|
+
// an answer, which is the one thing it must not do.
|
|
570
|
+
...(truncated ? { fieldFilterTruncated: true } : {}),
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
export async function groupIssues(ctx, args) {
|
|
574
|
+
const { query, state, spec, timezone } = await issueQuery(ctx, args);
|
|
575
|
+
const path = Array.isArray(args.path) ? args.path : [];
|
|
576
|
+
const selected = state.groupBy[path.length];
|
|
577
|
+
const field = spec.groupable?.find((candidate) => candidate.key === selected?.key);
|
|
578
|
+
if (!field)
|
|
579
|
+
return [];
|
|
580
|
+
let grouped = query
|
|
581
|
+
.groupBy({ col: field.col, interval: selected?.interval, timezone })
|
|
582
|
+
.orderGroupsBy({ by: 'key', dir: 'asc' });
|
|
583
|
+
if (args.limit != null)
|
|
584
|
+
grouped = grouped.limit(Number(args.limit));
|
|
585
|
+
if (args.offset != null)
|
|
586
|
+
grouped = grouped.offset(Number(args.offset));
|
|
587
|
+
return ctx.db.group(grouped);
|
|
588
|
+
}
|
|
589
|
+
export async function issueBuckets(ctx, args, today) {
|
|
590
|
+
const { query, timezone } = await issueQuery(ctx, args);
|
|
591
|
+
// The same calendar the query was compiled against, so the overdue count and
|
|
592
|
+
// the list it sits beside cannot disagree about where the day ends.
|
|
593
|
+
const day = String(today ?? '').trim() || (await businessToday(ctx, timezone));
|
|
594
|
+
const I = ctx.table('flow.Issue');
|
|
595
|
+
const { terminal, first } = await boardEdges(ctx);
|
|
596
|
+
// `count` rather than `all`: none of these needs the rows.
|
|
597
|
+
const open = terminal.length ? [not(inArray(I.columnId, terminal))] : [];
|
|
598
|
+
const [total, done, overdue, waiting] = await Promise.all([
|
|
599
|
+
ctx.db.count(query),
|
|
600
|
+
terminal.length ? ctx.db.count(query.where(inArray(I.columnId, terminal))) : Promise.resolve(0),
|
|
601
|
+
ctx.db.count(query.where(...open, isNotNull(I.dueDate), lt(I.dueDate, day))),
|
|
602
|
+
first.length
|
|
603
|
+
? ctx.db.count(query.where(...open, inArray(I.columnId, first), or(isNull(I.dueDate), gte(I.dueDate, day))))
|
|
604
|
+
: Promise.resolve(0),
|
|
605
|
+
]);
|
|
606
|
+
return {
|
|
607
|
+
total,
|
|
608
|
+
done,
|
|
609
|
+
overdue,
|
|
610
|
+
waiting,
|
|
611
|
+
working: Math.max(0, total - done - overdue - waiting),
|
|
612
|
+
today: day,
|
|
613
|
+
};
|
|
614
|
+
}
|
|
615
|
+
export async function issueDetail(ctx, id) {
|
|
616
|
+
const row = (await ctx.db.select('flow.Issue', { id }))[0];
|
|
617
|
+
if (!row)
|
|
618
|
+
return null;
|
|
619
|
+
const [serialized] = await serializeIssueList(ctx, [row]);
|
|
620
|
+
const [tags, outgoing, incoming, comments, children] = await Promise.all([
|
|
621
|
+
ctx.db.select('flow.IssueTag', { issueId: id }),
|
|
622
|
+
ctx.db.select('flow.IssueDependency', { issueId: id }),
|
|
623
|
+
ctx.db.select('flow.IssueDependency', { dependsOnIssueId: id }),
|
|
624
|
+
listTimeline(ctx, String(row.threadId), { limit: 100 }),
|
|
625
|
+
// Sub-tasks. `parentIssueId` has been modelled, validated for project and
|
|
626
|
+
// for cycles since the start, and until now had no screen at all — the
|
|
627
|
+
// detail page is the only place the relationship reads from either end.
|
|
628
|
+
ctx.db.select('flow.Issue', { parentIssueId: id, active: true }),
|
|
629
|
+
]);
|
|
630
|
+
const tagIds = tags.map((row) => row.tagId);
|
|
631
|
+
const tagRows = tagIds.length
|
|
632
|
+
? await ctx.db.all(from(ctx.table('flow.Tag')).where(inArray(ctx.table('flow.Tag').id, tagIds)))
|
|
633
|
+
: [];
|
|
634
|
+
// The far side of each dependency, by id and in one query — the same shape
|
|
635
|
+
// serializeIssueList already uses for column/epic/sprint/assignee. A screen
|
|
636
|
+
// that resolved these itself could only do it by listing the project's
|
|
637
|
+
// issues and filtering, which silently prints a raw id for any dependency
|
|
638
|
+
// outside that page: `issue.options` caps at 100 rows, so a 1000-issue
|
|
639
|
+
// project showed uuids for every dependency older than the newest hundred.
|
|
640
|
+
const relatedIds = [
|
|
641
|
+
...new Set([...outgoing.map((row) => row.dependsOnIssueId), ...incoming.map((row) => row.issueId)]),
|
|
642
|
+
].map(String);
|
|
643
|
+
const relatedRows = relatedIds.length
|
|
644
|
+
? await ctx.db.all(from(ctx.table('flow.Issue')).where(inArray(ctx.table('flow.Issue').id, relatedIds)))
|
|
645
|
+
: [];
|
|
646
|
+
const titleOf = new Map(relatedRows.map((row) => [String(row.id), String(row.title)]));
|
|
647
|
+
// Every field this project defines, each carrying whatever this issue holds
|
|
648
|
+
// for it — the definitions, not just the answers, because a field nobody has
|
|
649
|
+
// filled in still has to appear on the form for anyone to fill it in.
|
|
650
|
+
const [defs, held] = await Promise.all([
|
|
651
|
+
ctx.db.select('flow.FieldDef', { projectId: row.projectId, active: true }),
|
|
652
|
+
ctx.db.select('flow.IssueFieldValue', { issueId: id }),
|
|
653
|
+
]);
|
|
654
|
+
const answerOf = new Map(held.map((entry) => [String(entry.fieldId), entry.value]));
|
|
655
|
+
const fields = defs
|
|
656
|
+
.sort((a, b) => n(a.sequence) - n(b.sequence) || String(a.id).localeCompare(String(b.id)))
|
|
657
|
+
.map((def) => ({ ...def, value: answerOf.get(String(def.id)) ?? null }));
|
|
658
|
+
const parent = row.parentIssueId
|
|
659
|
+
? ((await ctx.db.select('flow.Issue', { id: row.parentIssueId }))[0] ?? null)
|
|
660
|
+
: null;
|
|
661
|
+
return {
|
|
662
|
+
...serialized,
|
|
663
|
+
parentTitle: parent ? String(parent.title) : null,
|
|
664
|
+
fields,
|
|
665
|
+
following: await following(ctx, id),
|
|
666
|
+
children: await serializeIssueList(ctx, children),
|
|
667
|
+
tags: tagRows,
|
|
668
|
+
dependencies: outgoing.map((row) => ({
|
|
669
|
+
...row,
|
|
670
|
+
dependsOnTitle: titleOf.get(String(row.dependsOnIssueId)) ?? row.dependsOnIssueId,
|
|
671
|
+
})),
|
|
672
|
+
dependents: incoming.map((row) => ({
|
|
673
|
+
...row,
|
|
674
|
+
issueTitle: titleOf.get(String(row.issueId)) ?? row.issueId,
|
|
675
|
+
})),
|
|
676
|
+
comments,
|
|
677
|
+
};
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* Blocking dependencies leading into a given set of issues, batched — the map
|
|
681
|
+
* view (flow_backend's dependency atlas, one epic at a time) needs the edges
|
|
682
|
+
* among its own node set, not the per-issue read `issueDetail` already does.
|
|
683
|
+
* No JOIN in this query builder by design, so this is one query against
|
|
684
|
+
* `IssueDependency` alone.
|
|
685
|
+
*
|
|
686
|
+
* Both ends are matched by default: an edge pointing out of the set is not an
|
|
687
|
+
* edge of the set. The map opts into outgoing edges so it can page a large
|
|
688
|
+
* source set in bounded chunks, then filters both ends against the complete
|
|
689
|
+
* epic after aggregation. The id list remains capped because it arrives over
|
|
690
|
+
* HTTP.
|
|
691
|
+
*/
|
|
692
|
+
export const DEPENDENCY_BATCH = 200;
|
|
693
|
+
export async function dependenciesFor(ctx, issueIds, includeExternalTargets = false) {
|
|
694
|
+
const asked = [...new Set(issueIds.map(String))].slice(0, DEPENDENCY_BATCH);
|
|
695
|
+
if (!asked.length)
|
|
696
|
+
return [];
|
|
697
|
+
// The ids arrive from the caller, not from a query this function ran, so the
|
|
698
|
+
// membership rule has to be applied to them here. Without it, naming an issue
|
|
699
|
+
// in somebody else's project answered whether it had blockers — a small
|
|
700
|
+
// answer, and still an answer about a project that is supposed to be
|
|
701
|
+
// invisible (FLW-018).
|
|
702
|
+
const I = ctx.table('flow.Issue');
|
|
703
|
+
const visible = await visibleProjects(ctx);
|
|
704
|
+
const readable = await ctx.db.all(restrictToVisible(from(I).select(I.id).where(inArray(I.id, asked)), I.projectId, visible));
|
|
705
|
+
const ids = readable.map((row) => String(row.id));
|
|
706
|
+
if (!ids.length)
|
|
707
|
+
return [];
|
|
708
|
+
const D = ctx.table('flow.IssueDependency');
|
|
709
|
+
const held = new Set(ids);
|
|
710
|
+
const rows = await ctx.db.all(from(D).where(inArray(D.issueId, ids), eq(D.relation, 'blocks')));
|
|
711
|
+
// An external target is an issue outside the set that was asked about, which
|
|
712
|
+
// the map draws an arrow to. It may still be one the caller cannot read, so
|
|
713
|
+
// the far end is filtered the same way the near end was.
|
|
714
|
+
if (!includeExternalTargets)
|
|
715
|
+
return rows.filter((row) => held.has(String(row.dependsOnIssueId)));
|
|
716
|
+
const targets = [...new Set(rows.map((row) => String(row.dependsOnIssueId)))].filter((id) => !held.has(id));
|
|
717
|
+
if (!targets.length)
|
|
718
|
+
return rows;
|
|
719
|
+
const reachable = new Set((await ctx.db.all(restrictToVisible(from(I).select(I.id).where(inArray(I.id, targets)), I.projectId, visible))).map((row) => String(row.id)));
|
|
720
|
+
return rows.filter((row) => held.has(String(row.dependsOnIssueId)) || reachable.has(String(row.dependsOnIssueId)));
|
|
721
|
+
}
|
|
722
|
+
export async function saveIssue(ctx, input) {
|
|
723
|
+
if (!commandKey(input.idempotencyKey))
|
|
724
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
725
|
+
if (!actorRequired(ctx))
|
|
726
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
727
|
+
if (!String(input.title ?? '').trim())
|
|
728
|
+
return invalid(issue('title', 'flow.error.required'));
|
|
729
|
+
if (!ISSUE_PRIORITIES.includes(String(input.priority ?? 'normal')))
|
|
730
|
+
return invalid(issue('priority', 'flow.error.invalidPriority'));
|
|
731
|
+
if (!(await projectExists(ctx, input.projectId)))
|
|
732
|
+
return invalid(issue('projectId', 'flow.error.notFound'));
|
|
733
|
+
const column = await columnOf(ctx, input.columnId);
|
|
734
|
+
if (!column || String(column.projectId) !== String(input.projectId))
|
|
735
|
+
return invalid(issue('columnId', 'flow.error.invalidColumn'));
|
|
736
|
+
if (!(await userExists(ctx, input.assigneeUserId)))
|
|
737
|
+
return invalid(issue('assigneeUserId', 'flow.error.notFound'));
|
|
738
|
+
const sprint = await assignableSprint(ctx, input.sprintId);
|
|
739
|
+
if (sprint === undefined)
|
|
740
|
+
return invalid(issue('sprintId', 'flow.error.sprintClosed'));
|
|
741
|
+
if (sprint && String(sprint.projectId) !== String(input.projectId))
|
|
742
|
+
return invalid(issue('sprintId', 'flow.error.sprintProjectMismatch'));
|
|
743
|
+
const epic = await issueEpic(ctx, input.epicId);
|
|
744
|
+
if (epic === undefined)
|
|
745
|
+
return invalid(issue('epicId', 'flow.error.notFound'));
|
|
746
|
+
if (epic && String(epic.projectId) !== String(input.projectId))
|
|
747
|
+
return invalid(issue('epicId', 'flow.error.epicProjectMismatch'));
|
|
748
|
+
const kind = await issueType(ctx, input.typeId);
|
|
749
|
+
if (kind === undefined)
|
|
750
|
+
return invalid(issue('typeId', 'flow.error.notFound'));
|
|
751
|
+
if (kind && String(kind.projectId) !== String(input.projectId))
|
|
752
|
+
return invalid(issue('typeId', 'flow.error.typeProjectMismatch'));
|
|
753
|
+
return ctx.tx(async (tx) => {
|
|
754
|
+
const existing = await readableRow(tx, 'flow.Issue', input.id);
|
|
755
|
+
if (existing && String(existing.projectId) !== String(input.projectId))
|
|
756
|
+
return invalid(issue('projectId', 'flow.error.immutableProject'));
|
|
757
|
+
// moveIssue is the only door into a column, because it is the one that
|
|
758
|
+
// checks `blocks` dependencies before letting an issue reach a terminal
|
|
759
|
+
// state. Save used to keep `existing.columnId` and still answer ok, so a
|
|
760
|
+
// caller asking for a different column was told the move had happened.
|
|
761
|
+
if (existing && String(existing.columnId) !== String(input.columnId))
|
|
762
|
+
return invalid(issue('columnId', 'flow.error.columnNeedsMove'));
|
|
763
|
+
const parentError = await parentIssueError(tx, input.id, input.parentIssueId, String(input.projectId));
|
|
764
|
+
if (parentError)
|
|
765
|
+
return invalid(parentError);
|
|
766
|
+
// Resolved before the issue row is touched: `tx` only rolls back on a
|
|
767
|
+
// thrown exception, not on a plain `return invalid(...)`, so validating
|
|
768
|
+
// tags after the insert/compareAndSet below committed a half-written
|
|
769
|
+
// issue (row present, no tags, caller told `ok: false`) on every bad
|
|
770
|
+
// tagId — found by seeding 1000 issues and finding "failed" ones that
|
|
771
|
+
// existed anyway.
|
|
772
|
+
const tagIds = input.tagIds ? [...new Set(input.tagIds)] : null;
|
|
773
|
+
if (tagIds) {
|
|
774
|
+
const tags = tagIds.length
|
|
775
|
+
? await tx.db.all(from(tx.table('flow.Tag')).where(inArray(tx.table('flow.Tag').id, tagIds), eq(tx.table('flow.Tag').active, true)))
|
|
776
|
+
: [];
|
|
777
|
+
if (tags.length !== tagIds.length)
|
|
778
|
+
return invalid(issue('tagIds', 'flow.error.notFound'));
|
|
779
|
+
}
|
|
780
|
+
// Custom field values, resolved and checked here for the same reason the
|
|
781
|
+
// tags above are: `tx` rolls back on a thrown exception, not on a returned
|
|
782
|
+
// `invalid`, so anything validated after the write below leaves a
|
|
783
|
+
// half-written issue behind and still reports failure.
|
|
784
|
+
const fieldWrites = [];
|
|
785
|
+
if (input.fields) {
|
|
786
|
+
const defs = await fieldsOfProject(tx, input.projectId);
|
|
787
|
+
for (const [key, raw] of Object.entries(input.fields)) {
|
|
788
|
+
const field = defs.get(String(key));
|
|
789
|
+
// A field this project does not have, rather than one that is merely
|
|
790
|
+
// empty: naming it is a mistake worth reporting, the same as an epic
|
|
791
|
+
// from another board.
|
|
792
|
+
if (!field)
|
|
793
|
+
return invalid(issue(`field:${key}`, 'flow.error.fieldUnknown'));
|
|
794
|
+
const error = fieldValueError(field, raw);
|
|
795
|
+
if (error)
|
|
796
|
+
return invalid(error);
|
|
797
|
+
fieldWrites.push({ field, value: String(raw ?? '').trim() });
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
const timestamp = now();
|
|
801
|
+
const nextVersion = n(existing?.version) + 1;
|
|
802
|
+
// A reference the caller did not mention keeps what is stored; an
|
|
803
|
+
// explicit null clears it. `priority` and `estimate` below already read
|
|
804
|
+
// this way, but epic, sprint, parent, assignee and due date did not — so
|
|
805
|
+
// any caller sending a partial record silently cleared the rest. The
|
|
806
|
+
// issue detail screen is exactly that caller: its form carries no sprint
|
|
807
|
+
// and no parent field (both have their own action), so editing a title
|
|
808
|
+
// dropped the issue out of its sprint and orphaned its sub-task link.
|
|
809
|
+
const kept = (given, stored) => given === undefined ? (stored ?? null) : given || null;
|
|
810
|
+
const values = {
|
|
811
|
+
projectId: input.projectId,
|
|
812
|
+
columnId: existing ? existing.columnId : input.columnId,
|
|
813
|
+
typeId: input.typeId === undefined ? (existing?.typeId ?? null) : kind ? kind.id : null,
|
|
814
|
+
epicId: input.epicId === undefined ? (existing?.epicId ?? null) : epic ? epic.id : null,
|
|
815
|
+
sprintId: input.sprintId === undefined ? (existing?.sprintId ?? null) : sprint ? sprint.id : null,
|
|
816
|
+
parentIssueId: kept(input.parentIssueId, existing?.parentIssueId),
|
|
817
|
+
title: input.title.trim(),
|
|
818
|
+
assigneeUserId: kept(input.assigneeUserId, existing?.assigneeUserId),
|
|
819
|
+
priority: input.priority ?? existing?.priority ?? 'normal',
|
|
820
|
+
startDate: kept(input.startDate, existing?.startDate),
|
|
821
|
+
dueDate: kept(input.dueDate, existing?.dueDate),
|
|
822
|
+
estimate: input.estimate == null ? (existing?.estimate ?? null) : String(input.estimate),
|
|
823
|
+
active: true,
|
|
824
|
+
version: nextVersion,
|
|
825
|
+
updatedAt: timestamp,
|
|
826
|
+
};
|
|
827
|
+
let threadId;
|
|
828
|
+
if (existing) {
|
|
829
|
+
const expected = input.expectedVersion ?? n(existing.version);
|
|
830
|
+
const changed = await tx.db.compareAndSet('flow.Issue', { id: input.id }, { version: expected }, values);
|
|
831
|
+
if (!('dryRun' in changed) && !changed.matched)
|
|
832
|
+
return invalid(issue('version', 'flow.error.conflict', { current: existing.version }));
|
|
833
|
+
threadId = String(existing.threadId);
|
|
834
|
+
}
|
|
835
|
+
else {
|
|
836
|
+
const thread = await ensureIssueThread(tx, input.id, input.title.trim(), timestamp);
|
|
837
|
+
threadId = String(thread.id);
|
|
838
|
+
await tx.db.insert('flow.Issue', {
|
|
839
|
+
id: input.id,
|
|
840
|
+
...values,
|
|
841
|
+
threadId: thread.id,
|
|
842
|
+
createdByUserId: tx.actor ?? null,
|
|
843
|
+
createdAt: timestamp,
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
if (tagIds) {
|
|
847
|
+
const IT = tx.table('flow.IssueTag');
|
|
848
|
+
await tx.db.del(deleteFrom(IT).where(eq(IT.issueId, input.id)));
|
|
849
|
+
for (const tagId of tagIds)
|
|
850
|
+
await tx.db.insertIfAbsent('flow.IssueTag', { id: `${input.id}:${tagId}`, issueId: input.id, tagId });
|
|
851
|
+
}
|
|
852
|
+
// One row per issue and field, so a value is replaced rather than
|
|
853
|
+
// accumulated. Emptying one deletes the row instead of storing "": a field
|
|
854
|
+
// nobody has answered and a field answered with nothing read the same on
|
|
855
|
+
// screen, and only one of them should cost a row.
|
|
856
|
+
for (const { field, value } of fieldWrites) {
|
|
857
|
+
const id = `${input.id}:${String(field.id)}`;
|
|
858
|
+
if (!value) {
|
|
859
|
+
const V = tx.table('flow.IssueFieldValue');
|
|
860
|
+
await tx.db.del(deleteFrom(V).where(eq(V.id, id)));
|
|
861
|
+
continue;
|
|
862
|
+
}
|
|
863
|
+
// insertIfAbsent then update, rather than branching on whether the row
|
|
864
|
+
// exists: `db.update` answers with a result object either way, so there
|
|
865
|
+
// is nothing truthy to branch on, and the pair is correct in both cases.
|
|
866
|
+
await tx.db.insertIfAbsent('flow.IssueFieldValue', {
|
|
867
|
+
id,
|
|
868
|
+
issueId: input.id,
|
|
869
|
+
fieldId: field.id,
|
|
870
|
+
value,
|
|
871
|
+
});
|
|
872
|
+
await tx.db.update('flow.IssueFieldValue', { id }, { value });
|
|
873
|
+
}
|
|
874
|
+
// Whoever opened it, and whoever it lands on, are subscribed to its
|
|
875
|
+
// thread. Until this existed the thread had no followers at all, so
|
|
876
|
+
// `postMessage` addressed nobody and every comment notified nobody — the
|
|
877
|
+
// discussion feature was wired end to end and silently inert.
|
|
878
|
+
if (!existing)
|
|
879
|
+
await followIssue(tx, threadId, tx.actor);
|
|
880
|
+
const assignee = values.assigneeUserId;
|
|
881
|
+
if (assignee)
|
|
882
|
+
await followIssue(tx, threadId, assignee);
|
|
883
|
+
// Only what actually moved: a system entry on every title edit is noise,
|
|
884
|
+
// and the timeline is the one place that has to stay readable.
|
|
885
|
+
const handedOver = assignee && String(assignee) !== String(existing?.assigneeUserId ?? '')
|
|
886
|
+
? [
|
|
887
|
+
{
|
|
888
|
+
field: 'assigneeUserId',
|
|
889
|
+
...(existing?.assigneeUserId ? { oldValue: String(existing.assigneeUserId) } : {}),
|
|
890
|
+
newValue: String(assignee),
|
|
891
|
+
},
|
|
892
|
+
]
|
|
893
|
+
: [];
|
|
894
|
+
const rescheduled = existing
|
|
895
|
+
? [
|
|
896
|
+
...moved('dueDate', existing.dueDate, values.dueDate),
|
|
897
|
+
...moved('priority', existing.priority, values.priority),
|
|
898
|
+
]
|
|
899
|
+
: [];
|
|
900
|
+
if (handedOver.length || rescheduled.length)
|
|
901
|
+
await postMessage(tx, {
|
|
902
|
+
id: `${input.id}:assigned:${nextVersion}`,
|
|
903
|
+
threadId,
|
|
904
|
+
authorUserId: tx.actor ?? undefined,
|
|
905
|
+
kind: 'system',
|
|
906
|
+
// A message key, resolved by whoever renders the timeline — the same
|
|
907
|
+
// arrangement crm_backend's `entryBody` already reads. Handing an issue
|
|
908
|
+
// over keeps its own key, because that is the entry people look for.
|
|
909
|
+
body: rescheduled.length && !handedOver.length ? 'flow.timeline.changed' : 'flow.timeline.assigned',
|
|
910
|
+
tracking: [...handedOver, ...rescheduled],
|
|
911
|
+
});
|
|
912
|
+
return { ok: true, id: input.id, version: nextVersion };
|
|
913
|
+
});
|
|
914
|
+
}
|
|
915
|
+
/**
|
|
916
|
+
* One system entry per command, carrying every tracked field that moved.
|
|
917
|
+
*
|
|
918
|
+
* The timeline used to record exactly one thing — who an issue was handed to —
|
|
919
|
+
* so "who put this in Done, and when" had no answer anywhere in the system. The
|
|
920
|
+
* fields tracked are the ones a person asks about afterwards: the column, the
|
|
921
|
+
* deadline, the priority and the sprint. Title and description are deliberately
|
|
922
|
+
* out: an entry per keystroke is what makes a timeline unreadable, and both
|
|
923
|
+
* already have their own history in the Live Doc.
|
|
924
|
+
*
|
|
925
|
+
* One message rather than one per field, because a single edit that moved three
|
|
926
|
+
* of them is one thing that happened.
|
|
927
|
+
*/
|
|
928
|
+
async function trackIssueChange(tx, input) {
|
|
929
|
+
if (!input.changes.length || !input.threadId)
|
|
930
|
+
return;
|
|
931
|
+
await postMessage(tx, {
|
|
932
|
+
id: `${input.issueId}:changed:${input.version}`,
|
|
933
|
+
threadId: String(input.threadId),
|
|
934
|
+
authorUserId: tx.actor ?? undefined,
|
|
935
|
+
kind: 'system',
|
|
936
|
+
body: input.body,
|
|
937
|
+
tracking: input.changes,
|
|
938
|
+
});
|
|
939
|
+
}
|
|
940
|
+
/** A change worth an entry, or nothing when the value did not actually move. */
|
|
941
|
+
const moved = (field, before, after) => {
|
|
942
|
+
const from = before == null || before === '' ? '' : String(before);
|
|
943
|
+
const to = after == null || after === '' ? '' : String(after);
|
|
944
|
+
if (from === to)
|
|
945
|
+
return [];
|
|
946
|
+
return [{ field, ...(from ? { oldValue: from } : {}), ...(to ? { newValue: to } : {}) }];
|
|
947
|
+
};
|
|
948
|
+
async function ensureIssueThread(ctx, issueId, title, createdAt) {
|
|
949
|
+
return ensureThread(ctx, {
|
|
950
|
+
id: `thread:flow.Issue:${issueId}`,
|
|
951
|
+
resModel: 'flow.Issue',
|
|
952
|
+
resId: issueId,
|
|
953
|
+
displayName: title,
|
|
954
|
+
createdAt,
|
|
955
|
+
});
|
|
956
|
+
}
|
|
957
|
+
async function planTransfer(ctx, held, projectId, columnId) {
|
|
958
|
+
const columns = await ctx.db.select('flow.Column', { projectId, active: true });
|
|
959
|
+
if (!columns.length)
|
|
960
|
+
return issue('projectId', 'flow.error.projectHasNoColumns');
|
|
961
|
+
const named = columnId ? columns.find((row) => String(row.id) === String(columnId)) : undefined;
|
|
962
|
+
if (columnId && !named)
|
|
963
|
+
return issue('columnId', 'flow.error.notFound');
|
|
964
|
+
// No column named: the first one work arrives in, by the order the board
|
|
965
|
+
// shows. Landing in a terminal column would report the issue as finished
|
|
966
|
+
// the moment it moved, which is the one answer a move must not invent.
|
|
967
|
+
const landing = named ??
|
|
968
|
+
[...columns]
|
|
969
|
+
.filter((row) => row.terminalState !== true)
|
|
970
|
+
.sort((a, b) => n(a.sequence) - n(b.sequence) || String(a.id).localeCompare(String(b.id)))[0] ??
|
|
971
|
+
columns[0];
|
|
972
|
+
let typeId = null;
|
|
973
|
+
if (held.typeId) {
|
|
974
|
+
const from = (await ctx.db.select('flow.IssueType', { id: held.typeId }))[0];
|
|
975
|
+
const to = from
|
|
976
|
+
? (await ctx.db.select('flow.IssueType', { projectId, code: from.code, active: true }))[0]
|
|
977
|
+
: undefined;
|
|
978
|
+
typeId = to ? String(to.id) : null;
|
|
979
|
+
}
|
|
980
|
+
return {
|
|
981
|
+
columnId: String(landing.id),
|
|
982
|
+
typeId,
|
|
983
|
+
epicCleared: held.epicId != null,
|
|
984
|
+
sprintCleared: held.sprintId != null,
|
|
985
|
+
};
|
|
986
|
+
}
|
|
987
|
+
/** Carry the custom field values whose code exists on the other side. */
|
|
988
|
+
async function carryFields(ctx, fromIssueId, toIssueId, projectId) {
|
|
989
|
+
const values = await ctx.db.select('flow.IssueFieldValue', { issueId: fromIssueId });
|
|
990
|
+
if (!values.length)
|
|
991
|
+
return { carried: 0, dropped: 0 };
|
|
992
|
+
const defs = await ctx.db.select('flow.FieldDef', { projectId, active: true });
|
|
993
|
+
const byCode = new Map(defs.map((def) => [String(def.code), def]));
|
|
994
|
+
let carried = 0;
|
|
995
|
+
for (const value of values) {
|
|
996
|
+
const from = (await ctx.db.select('flow.FieldDef', { id: value.fieldId }))[0];
|
|
997
|
+
const to = from ? byCode.get(String(from.code)) : undefined;
|
|
998
|
+
if (!to)
|
|
999
|
+
continue;
|
|
1000
|
+
await ctx.db.insertIfAbsent('flow.IssueFieldValue', {
|
|
1001
|
+
id: `${toIssueId}:${String(to.id)}`,
|
|
1002
|
+
issueId: toIssueId,
|
|
1003
|
+
fieldId: to.id,
|
|
1004
|
+
value: value.value ?? null,
|
|
1005
|
+
});
|
|
1006
|
+
carried += 1;
|
|
1007
|
+
}
|
|
1008
|
+
return { carried, dropped: values.length - carried };
|
|
1009
|
+
}
|
|
1010
|
+
/**
|
|
1011
|
+
* Move an issue into another project.
|
|
1012
|
+
*
|
|
1013
|
+
* Both ends go through the membership gate: moving work into a project you
|
|
1014
|
+
* cannot see is writing to a project you cannot see, and moving it out of one
|
|
1015
|
+
* is reading it. Either way the answer is the same "not found" every other
|
|
1016
|
+
* Flow path gives (FLW-DEC-012).
|
|
1017
|
+
*
|
|
1018
|
+
* An issue with children refuses rather than leaving them behind pointing at a
|
|
1019
|
+
* parent in another project. That is the same shape of orphan the purge job
|
|
1020
|
+
* takes care to avoid, and silently splitting a tree is worse than saying no.
|
|
1021
|
+
*/
|
|
1022
|
+
export const BULK_ACTIONS = ['move', 'assign', 'archive', 'restore'];
|
|
1023
|
+
/** How many issues one request may touch. */
|
|
1024
|
+
const BULK_LIMIT = 200;
|
|
1025
|
+
/**
|
|
1026
|
+
* One action over many issues, applied one at a time and reported per issue.
|
|
1027
|
+
*
|
|
1028
|
+
* **This is not protected against concurrent edits, and cannot be.** Every
|
|
1029
|
+
* single-issue command takes an `expectedVersion` because the caller read the
|
|
1030
|
+
* record and is saying which version they meant. A person who ticked forty
|
|
1031
|
+
* rows on a list has read no versions and could not supply them, so this reads
|
|
1032
|
+
* each issue's current version and acts on it. Filling in a version on the
|
|
1033
|
+
* caller's behalf would be pretending to a guarantee that is not there — the
|
|
1034
|
+
* point of saying so here is that the guarantee is genuinely absent, not that
|
|
1035
|
+
* it is hidden.
|
|
1036
|
+
*
|
|
1037
|
+
* What replaces it is the report. Nothing is rolled back for a neighbour's
|
|
1038
|
+
* failure: an issue the caller cannot see, one already in the state asked for,
|
|
1039
|
+
* one that lost a race — each is named with its reason, and the rest still
|
|
1040
|
+
* happen. A bulk action that failed atomically would leave somebody with forty
|
|
1041
|
+
* rows and no idea which one was the problem.
|
|
1042
|
+
*/
|
|
1043
|
+
export async function bulkIssues(ctx, input) {
|
|
1044
|
+
if (!actorRequired(ctx))
|
|
1045
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1046
|
+
if (!commandKey(input.idempotencyKey))
|
|
1047
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1048
|
+
if (!BULK_ACTIONS.includes(input.action))
|
|
1049
|
+
return invalid(issue('action', 'flow.error.invalidAction'));
|
|
1050
|
+
const ids = [...new Set(input.ids.map(String).filter(Boolean))];
|
|
1051
|
+
if (!ids.length)
|
|
1052
|
+
return invalid(issue('ids', 'flow.error.required'));
|
|
1053
|
+
if (ids.length > BULK_LIMIT)
|
|
1054
|
+
return invalid(issue('ids', 'flow.error.tooMany', { limit: BULK_LIMIT }));
|
|
1055
|
+
if ((input.action === 'move' || input.action === 'assign') && !input.value)
|
|
1056
|
+
return invalid(issue('value', 'flow.error.required'));
|
|
1057
|
+
const outcome = { applied: 0, refused: [] };
|
|
1058
|
+
for (const id of ids) {
|
|
1059
|
+
// Read through the gate, one at a time. An issue in a project this caller
|
|
1060
|
+
// is not on is not found, and is refused for that reason rather than
|
|
1061
|
+
// being silently skipped — a count that does not add up is worse than a
|
|
1062
|
+
// refusal that says why.
|
|
1063
|
+
const held = await readableRow(ctx, 'flow.Issue', id);
|
|
1064
|
+
if (!held) {
|
|
1065
|
+
outcome.refused.push({ id, code: 'flow.error.notFound' });
|
|
1066
|
+
continue;
|
|
1067
|
+
}
|
|
1068
|
+
// A key per issue, derived from the one the request carries, so a retry
|
|
1069
|
+
// of the whole batch replays each item rather than being refused as a
|
|
1070
|
+
// duplicate of the first.
|
|
1071
|
+
const key = commandRecordId(`flow.issue.bulk:${input.action}:${id}`, input.idempotencyKey);
|
|
1072
|
+
const version = n(held.version);
|
|
1073
|
+
const result = input.action === 'move'
|
|
1074
|
+
? await moveIssue(ctx, {
|
|
1075
|
+
id,
|
|
1076
|
+
columnId: String(input.value),
|
|
1077
|
+
expectedVersion: version,
|
|
1078
|
+
idempotencyKey: key,
|
|
1079
|
+
})
|
|
1080
|
+
: input.action === 'archive'
|
|
1081
|
+
? await archiveIssue(ctx, { id, expectedVersion: version, idempotencyKey: key })
|
|
1082
|
+
: input.action === 'restore'
|
|
1083
|
+
? await restoreIssue(ctx, { id, expectedVersion: version, idempotencyKey: key })
|
|
1084
|
+
: await saveIssue(ctx, {
|
|
1085
|
+
id,
|
|
1086
|
+
projectId: String(held.projectId),
|
|
1087
|
+
columnId: String(held.columnId),
|
|
1088
|
+
title: String(held.title ?? ''),
|
|
1089
|
+
assigneeUserId: input.value ? String(input.value) : null,
|
|
1090
|
+
expectedVersion: version,
|
|
1091
|
+
idempotencyKey: key,
|
|
1092
|
+
});
|
|
1093
|
+
if (result.ok)
|
|
1094
|
+
outcome.applied += 1;
|
|
1095
|
+
else
|
|
1096
|
+
outcome.refused.push({
|
|
1097
|
+
id,
|
|
1098
|
+
code: String(result.errors?.[0]?.code ?? 'flow.error.invalid'),
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
return { ok: true, ...outcome };
|
|
1102
|
+
}
|
|
1103
|
+
export async function transferIssue(ctx, input) {
|
|
1104
|
+
if (!actorRequired(ctx))
|
|
1105
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1106
|
+
if (!commandKey(input.idempotencyKey))
|
|
1107
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1108
|
+
return ctx.tx(async (tx) => {
|
|
1109
|
+
const held = await readableRow(tx, 'flow.Issue', input.id);
|
|
1110
|
+
if (!held)
|
|
1111
|
+
return invalid(issue('id', 'flow.error.notFound'));
|
|
1112
|
+
if (String(held.projectId) === String(input.projectId))
|
|
1113
|
+
return invalid(issue('projectId', 'flow.error.sameProject'));
|
|
1114
|
+
if (n(held.version) !== input.expectedVersion)
|
|
1115
|
+
return invalid(issue('version', 'flow.error.conflict', { current: held.version }));
|
|
1116
|
+
const destination = await readableProject(tx, input.projectId);
|
|
1117
|
+
if (!destination || destination.active !== true)
|
|
1118
|
+
return invalid(issue('projectId', 'flow.error.notFound'));
|
|
1119
|
+
const children = await tx.db.select('flow.Issue', { parentIssueId: input.id, active: true });
|
|
1120
|
+
if (children.length)
|
|
1121
|
+
return invalid(issue('id', 'flow.error.issueHasChildren'));
|
|
1122
|
+
const plan = await planTransfer(tx, held, String(input.projectId), input.columnId);
|
|
1123
|
+
if ('code' in plan)
|
|
1124
|
+
return invalid(plan);
|
|
1125
|
+
// The values move rather than being copied, so they are read before the
|
|
1126
|
+
// old ones go and written against the destination's own definitions.
|
|
1127
|
+
const carried = await carryFields(tx, input.id, input.id, String(input.projectId));
|
|
1128
|
+
const V = tx.table('flow.IssueFieldValue');
|
|
1129
|
+
const defs = await tx.db.select('flow.FieldDef', { projectId: held.projectId });
|
|
1130
|
+
if (defs.length)
|
|
1131
|
+
await tx.db.del(deleteFrom(V).where(eq(V.issueId, input.id), inArray(V.fieldId, defs.map((def) => String(def.id)))));
|
|
1132
|
+
const version = n(held.version) + 1;
|
|
1133
|
+
await tx.db.update('flow.Issue', { id: input.id }, {
|
|
1134
|
+
projectId: input.projectId,
|
|
1135
|
+
columnId: plan.columnId,
|
|
1136
|
+
typeId: plan.typeId,
|
|
1137
|
+
// Neither means anything on the other side, and keeping either would
|
|
1138
|
+
// put an issue in a sprint its new project does not run.
|
|
1139
|
+
epicId: null,
|
|
1140
|
+
sprintId: null,
|
|
1141
|
+
parentIssueId: null,
|
|
1142
|
+
version,
|
|
1143
|
+
updatedAt: now(),
|
|
1144
|
+
});
|
|
1145
|
+
return {
|
|
1146
|
+
ok: true,
|
|
1147
|
+
id: input.id,
|
|
1148
|
+
version,
|
|
1149
|
+
columnId: plan.columnId,
|
|
1150
|
+
fieldsCarried: carried.carried,
|
|
1151
|
+
fieldsDropped: carried.dropped,
|
|
1152
|
+
typeCleared: Boolean(held.typeId) && plan.typeId === null,
|
|
1153
|
+
epicCleared: plan.epicCleared,
|
|
1154
|
+
sprintCleared: plan.sprintCleared,
|
|
1155
|
+
};
|
|
1156
|
+
});
|
|
1157
|
+
}
|
|
1158
|
+
/**
|
|
1159
|
+
* Put a copy of an issue into another project, leaving the original alone.
|
|
1160
|
+
*
|
|
1161
|
+
* The same mapping `transferIssue` uses, because the crossing is the same
|
|
1162
|
+
* crossing — a type or a field that has no counterpart on the other side has
|
|
1163
|
+
* none whether the issue is moving or being duplicated.
|
|
1164
|
+
*
|
|
1165
|
+
* What a copy deliberately does not bring is the history: the comments, the
|
|
1166
|
+
* followers and the document are the record of a conversation that happened
|
|
1167
|
+
* about *that* issue, and duplicating them would put words in people's mouths
|
|
1168
|
+
* on a record they never saw. The copy starts with a title and the fields, and
|
|
1169
|
+
* whoever asked for it can say the rest themselves (FLW-020).
|
|
1170
|
+
*/
|
|
1171
|
+
export async function copyIssue(ctx, input) {
|
|
1172
|
+
if (!actorRequired(ctx))
|
|
1173
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1174
|
+
if (!commandKey(input.idempotencyKey))
|
|
1175
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1176
|
+
const held = await readableRow(ctx, 'flow.Issue', input.id);
|
|
1177
|
+
if (!held)
|
|
1178
|
+
return invalid(issue('id', 'flow.error.notFound'));
|
|
1179
|
+
const destination = await readableProject(ctx, input.projectId);
|
|
1180
|
+
if (!destination || destination.active !== true)
|
|
1181
|
+
return invalid(issue('projectId', 'flow.error.notFound'));
|
|
1182
|
+
const plan = await planTransfer(ctx, held, String(input.projectId), input.columnId);
|
|
1183
|
+
if ('code' in plan)
|
|
1184
|
+
return invalid(plan);
|
|
1185
|
+
// Derived from the key, so a double click makes one copy rather than two —
|
|
1186
|
+
// the same reason the create form derives its id (FLW-033).
|
|
1187
|
+
const id = commandRecordId(`flow.issue.copy:${input.id}:${String(input.projectId)}`, input.idempotencyKey);
|
|
1188
|
+
const tags = await ctx.db.select('flow.IssueTag', { issueId: input.id });
|
|
1189
|
+
const made = await saveIssue(ctx, {
|
|
1190
|
+
id,
|
|
1191
|
+
projectId: String(input.projectId),
|
|
1192
|
+
columnId: plan.columnId,
|
|
1193
|
+
typeId: plan.typeId,
|
|
1194
|
+
title: String(input.title ?? held.title ?? ''),
|
|
1195
|
+
assigneeUserId: held.assigneeUserId ? String(held.assigneeUserId) : null,
|
|
1196
|
+
priority: String(held.priority ?? '2'),
|
|
1197
|
+
startDate: held.startDate ? String(held.startDate) : null,
|
|
1198
|
+
dueDate: held.dueDate ? String(held.dueDate) : null,
|
|
1199
|
+
estimate: held.estimate ?? undefined,
|
|
1200
|
+
// A tag is the company's, so it means the same thing in both projects.
|
|
1201
|
+
tagIds: tags.map((row) => String(row.tagId)),
|
|
1202
|
+
idempotencyKey: input.idempotencyKey,
|
|
1203
|
+
});
|
|
1204
|
+
if (!made.ok)
|
|
1205
|
+
return made;
|
|
1206
|
+
const carried = await carryFields(ctx, input.id, id, String(input.projectId));
|
|
1207
|
+
return {
|
|
1208
|
+
ok: true,
|
|
1209
|
+
id,
|
|
1210
|
+
columnId: plan.columnId,
|
|
1211
|
+
fieldsCarried: carried.carried,
|
|
1212
|
+
fieldsDropped: carried.dropped,
|
|
1213
|
+
typeCleared: Boolean(held.typeId) && plan.typeId === null,
|
|
1214
|
+
};
|
|
1215
|
+
}
|
|
1216
|
+
export async function moveIssue(ctx, input) {
|
|
1217
|
+
if (!actorRequired(ctx))
|
|
1218
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1219
|
+
if (!commandKey(input.idempotencyKey))
|
|
1220
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1221
|
+
return ctx.tx(async (tx) => {
|
|
1222
|
+
const held = await readableRow(tx, 'flow.Issue', input.id);
|
|
1223
|
+
if (!held)
|
|
1224
|
+
return invalid(issue('id', 'flow.error.notFound'));
|
|
1225
|
+
const column = await columnOf(tx, input.columnId);
|
|
1226
|
+
if (!column || String(column.projectId) !== String(held.projectId))
|
|
1227
|
+
return invalid(issue('columnId', 'flow.error.invalidColumn'));
|
|
1228
|
+
if (column.terminalState === true) {
|
|
1229
|
+
const blockers = (await tx.db.select('flow.IssueDependency', { issueId: input.id, relation: 'blocks' })).map((row) => String(row.dependsOnIssueId));
|
|
1230
|
+
if (blockers.length) {
|
|
1231
|
+
const blockingIssues = await tx.db.all(from(tx.table('flow.Issue')).where(inArray(tx.table('flow.Issue').id, blockers)));
|
|
1232
|
+
const columnIds = [...new Set(blockingIssues.map((row) => String(row.columnId)))];
|
|
1233
|
+
const blockingColumns = columnIds.length
|
|
1234
|
+
? await tx.db.all(from(tx.table('flow.Column')).where(inArray(tx.table('flow.Column').id, columnIds)))
|
|
1235
|
+
: [];
|
|
1236
|
+
const terminal = new Set(blockingColumns.filter((row) => row.terminalState === true).map((row) => String(row.id)));
|
|
1237
|
+
const open = blockingIssues.filter((row) => !terminal.has(String(row.columnId)));
|
|
1238
|
+
if (open.length)
|
|
1239
|
+
return invalid(issue('columnId', 'flow.error.blocked'));
|
|
1240
|
+
}
|
|
1241
|
+
}
|
|
1242
|
+
const timestamp = now();
|
|
1243
|
+
const changed = await tx.db.compareAndSet('flow.Issue', { id: input.id }, { version: input.expectedVersion }, { columnId: input.columnId, version: n(held.version) + 1, updatedAt: timestamp });
|
|
1244
|
+
if (!('dryRun' in changed) && !changed.matched)
|
|
1245
|
+
return invalid(issue('version', 'flow.error.conflict', { current: held.version }));
|
|
1246
|
+
await trackIssueChange(tx, {
|
|
1247
|
+
issueId: input.id,
|
|
1248
|
+
threadId: held.threadId,
|
|
1249
|
+
version: n(held.version) + 1,
|
|
1250
|
+
body: 'flow.timeline.moved',
|
|
1251
|
+
changes: moved('columnId', held.columnId, input.columnId),
|
|
1252
|
+
});
|
|
1253
|
+
return { ok: true, id: input.id, version: n(held.version) + 1 };
|
|
1254
|
+
});
|
|
1255
|
+
}
|
|
1256
|
+
export async function assignSprint(ctx, input) {
|
|
1257
|
+
if (!actorRequired(ctx))
|
|
1258
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1259
|
+
if (!commandKey(input.idempotencyKey))
|
|
1260
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1261
|
+
return ctx.tx(async (tx) => {
|
|
1262
|
+
const held = await readableRow(tx, 'flow.Issue', input.id);
|
|
1263
|
+
if (!held)
|
|
1264
|
+
return invalid(issue('id', 'flow.error.notFound'));
|
|
1265
|
+
const sprint = await assignableSprint(tx, input.sprintId);
|
|
1266
|
+
if (sprint === undefined)
|
|
1267
|
+
return invalid(issue('sprintId', 'flow.error.sprintClosed'));
|
|
1268
|
+
if (sprint && String(sprint.projectId) !== String(held.projectId))
|
|
1269
|
+
return invalid(issue('sprintId', 'flow.error.sprintProjectMismatch'));
|
|
1270
|
+
const timestamp = now();
|
|
1271
|
+
const changed = await tx.db.compareAndSet('flow.Issue', { id: input.id }, { version: input.expectedVersion }, { sprintId: sprint ? sprint.id : null, version: n(held.version) + 1, updatedAt: timestamp });
|
|
1272
|
+
if (!('dryRun' in changed) && !changed.matched)
|
|
1273
|
+
return invalid(issue('version', 'flow.error.conflict', { current: held.version }));
|
|
1274
|
+
await trackIssueChange(tx, {
|
|
1275
|
+
issueId: input.id,
|
|
1276
|
+
threadId: held.threadId,
|
|
1277
|
+
version: n(held.version) + 1,
|
|
1278
|
+
body: 'flow.timeline.sprint',
|
|
1279
|
+
changes: moved('sprintId', held.sprintId, sprint ? sprint.id : null),
|
|
1280
|
+
});
|
|
1281
|
+
return { ok: true, id: input.id, version: n(held.version) + 1 };
|
|
1282
|
+
});
|
|
1283
|
+
}
|
|
1284
|
+
/**
|
|
1285
|
+
* Only `blocks` is checked for cycles.
|
|
1286
|
+
*
|
|
1287
|
+
* `related` carries no ordering — an issue "related to" another can point back
|
|
1288
|
+
* without contradiction — so a cycle there is not a bug. A `blocks` cycle would
|
|
1289
|
+
* make every issue in the loop permanently unblockable, which is worth refusing
|
|
1290
|
+
* up front rather than discovering at move time.
|
|
1291
|
+
*/
|
|
1292
|
+
async function createsBlockCycle(ctx, issueId, dependsOnIssueId) {
|
|
1293
|
+
const seen = new Set([issueId]);
|
|
1294
|
+
let frontier = [dependsOnIssueId];
|
|
1295
|
+
while (frontier.length) {
|
|
1296
|
+
if (frontier.includes(issueId))
|
|
1297
|
+
return true;
|
|
1298
|
+
const next = [];
|
|
1299
|
+
for (const id of frontier) {
|
|
1300
|
+
if (seen.has(id))
|
|
1301
|
+
continue;
|
|
1302
|
+
seen.add(id);
|
|
1303
|
+
const edges = await ctx.db.select('flow.IssueDependency', { issueId: id, relation: 'blocks' });
|
|
1304
|
+
next.push(...edges.map((row) => String(row.dependsOnIssueId)));
|
|
1305
|
+
}
|
|
1306
|
+
frontier = next;
|
|
1307
|
+
}
|
|
1308
|
+
return false;
|
|
1309
|
+
}
|
|
1310
|
+
export async function addDependency(ctx, input) {
|
|
1311
|
+
if (!actorRequired(ctx))
|
|
1312
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1313
|
+
if (!commandKey(input.idempotencyKey))
|
|
1314
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1315
|
+
if (!DEPENDENCY_RELATIONS.includes(input.relation))
|
|
1316
|
+
return invalid(issue('relation', 'flow.error.invalidRelation'));
|
|
1317
|
+
if (input.issueId === input.dependsOnIssueId)
|
|
1318
|
+
return invalid(issue('dependsOnIssueId', 'flow.error.selfDependency'));
|
|
1319
|
+
return ctx.tx(async (tx) => {
|
|
1320
|
+
const [held, target] = await Promise.all([
|
|
1321
|
+
readableRow(tx, 'flow.Issue', input.issueId).then((row) => (row ? [row] : [])),
|
|
1322
|
+
readableRow(tx, 'flow.Issue', input.dependsOnIssueId).then((row) => (row ? [row] : [])),
|
|
1323
|
+
]);
|
|
1324
|
+
if (!held[0] || !target[0])
|
|
1325
|
+
return invalid(issue('id', 'flow.error.notFound'));
|
|
1326
|
+
if (input.relation === 'blocks' && (await createsBlockCycle(tx, input.issueId, input.dependsOnIssueId)))
|
|
1327
|
+
return invalid(issue('dependsOnIssueId', 'flow.error.cycle'));
|
|
1328
|
+
const inserted = await tx.db.insertIfAbsent('flow.IssueDependency', {
|
|
1329
|
+
id: input.id,
|
|
1330
|
+
issueId: input.issueId,
|
|
1331
|
+
dependsOnIssueId: input.dependsOnIssueId,
|
|
1332
|
+
relation: input.relation,
|
|
1333
|
+
});
|
|
1334
|
+
if (!('dryRun' in inserted) && !inserted.inserted)
|
|
1335
|
+
return invalid(issue('dependsOnIssueId', 'flow.error.duplicateDependency'));
|
|
1336
|
+
return { ok: true, id: input.id };
|
|
1337
|
+
});
|
|
1338
|
+
}
|
|
1339
|
+
export async function addComment(ctx, input) {
|
|
1340
|
+
if (!actorRequired(ctx))
|
|
1341
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1342
|
+
if (!commandKey(input.idempotencyKey))
|
|
1343
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1344
|
+
if (!input.body.trim())
|
|
1345
|
+
return invalid(issue('body', 'flow.error.required'));
|
|
1346
|
+
const held = await readableRow(ctx, 'flow.Issue', input.issueId);
|
|
1347
|
+
if (!held)
|
|
1348
|
+
return invalid(issue('issueId', 'flow.error.notFound'));
|
|
1349
|
+
// Before the message, so the author is subscribed to the replies to it.
|
|
1350
|
+
// `postMessage` excludes the author from its own recipients, so this does
|
|
1351
|
+
// not notify them about their own comment.
|
|
1352
|
+
await followIssue(ctx, held.threadId, ctx.actor);
|
|
1353
|
+
// Naming somebody subscribes them, so the answer to what they were asked
|
|
1354
|
+
// reaches them too. Being mentioned once is how most people end up following
|
|
1355
|
+
// an issue at all, which is also why `stopFollowing` exists below.
|
|
1356
|
+
for (const userId of input.mentionUserIds ?? [])
|
|
1357
|
+
await followIssue(ctx, held.threadId, userId);
|
|
1358
|
+
const result = await postMessage(ctx, {
|
|
1359
|
+
id: input.id,
|
|
1360
|
+
threadId: String(held.threadId),
|
|
1361
|
+
authorUserId: ctx.actor ?? undefined,
|
|
1362
|
+
kind: input.kind ?? 'comment',
|
|
1363
|
+
body: input.body.trim(),
|
|
1364
|
+
mentionPartnerIds: await mentionPartners(ctx, input.mentionUserIds ?? []),
|
|
1365
|
+
});
|
|
1366
|
+
return { ok: true, id: String(result.message.id) };
|
|
1367
|
+
}
|
|
1368
|
+
/**
|
|
1369
|
+
* Leaves an issue's thread.
|
|
1370
|
+
*
|
|
1371
|
+
* The only way out of a subscription this module hands out freely: being
|
|
1372
|
+
* assigned an issue, commenting on one, or being mentioned in one all
|
|
1373
|
+
* subscribe you, and every comment afterwards reaches you. Without this the
|
|
1374
|
+
* follower set only ever grows, and a single mention in a busy spec is a
|
|
1375
|
+
* standing appointment nobody agreed to.
|
|
1376
|
+
*
|
|
1377
|
+
* Answers ok when there was nothing to remove, because "I do not want these"
|
|
1378
|
+
* is satisfied either way.
|
|
1379
|
+
*/
|
|
1380
|
+
/**
|
|
1381
|
+
* Take an issue off the board without pretending it was finished.
|
|
1382
|
+
*
|
|
1383
|
+
* `Issue.active` has been in the model and in four indexes since Flow was
|
|
1384
|
+
* written, `issue.list` has taken `includeArchived`, and nothing has ever
|
|
1385
|
+
* written `false` — so the only way to clear a cancelled task was to drop it in
|
|
1386
|
+
* the done column, which made every progress figure lie about it.
|
|
1387
|
+
*
|
|
1388
|
+
* Under compare-and-set, unlike `page.archive`: an issue carries a version
|
|
1389
|
+
* because two people work the same one, and archiving from a stale screen is
|
|
1390
|
+
* exactly the kind of mistake that guard exists for.
|
|
1391
|
+
*
|
|
1392
|
+
* What archiving is *not*: it is not completion and it is not deletion.
|
|
1393
|
+
* Dependencies stay, so an archived blocker still blocks — silently unblocking
|
|
1394
|
+
* work is the worst way to clear a blocker (FLW-DEC-011). Sub-tasks keep their
|
|
1395
|
+
* parent, so restoring a parent restores the branch as it was.
|
|
1396
|
+
*/
|
|
1397
|
+
export async function archiveIssue(ctx, input) {
|
|
1398
|
+
return setIssueActive(ctx, input, false);
|
|
1399
|
+
}
|
|
1400
|
+
/**
|
|
1401
|
+
* Put it back, exactly where it was.
|
|
1402
|
+
*
|
|
1403
|
+
* Unlike `page.restore` this needs no reparenting rule: a sub-task of an
|
|
1404
|
+
* archived parent is still listed on every board and list of its own, so it
|
|
1405
|
+
* cannot come back invisible the way a page under an archived page would.
|
|
1406
|
+
*/
|
|
1407
|
+
export async function restoreIssue(ctx, input) {
|
|
1408
|
+
return setIssueActive(ctx, input, true);
|
|
1409
|
+
}
|
|
1410
|
+
async function setIssueActive(ctx, input, active) {
|
|
1411
|
+
if (!actorRequired(ctx))
|
|
1412
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1413
|
+
if (!commandKey(input.idempotencyKey))
|
|
1414
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1415
|
+
return ctx.tx(async (tx) => {
|
|
1416
|
+
const held = await readableRow(tx, 'flow.Issue', input.id);
|
|
1417
|
+
if (!held)
|
|
1418
|
+
return invalid(issue('id', 'flow.error.notFound'));
|
|
1419
|
+
// Already where the caller wants it: say so rather than burning a version.
|
|
1420
|
+
if (Boolean(held.active) === active)
|
|
1421
|
+
return { ok: true, id: input.id, version: n(held.version) };
|
|
1422
|
+
if (n(held.version) !== input.expectedVersion)
|
|
1423
|
+
return invalid(issue('version', 'flow.error.conflict', { current: held.version }));
|
|
1424
|
+
const version = n(held.version) + 1;
|
|
1425
|
+
await tx.db.update('flow.Issue', { id: input.id }, { active, version, updatedAt: now() });
|
|
1426
|
+
return { ok: true, id: input.id, version };
|
|
1427
|
+
});
|
|
1428
|
+
}
|
|
1429
|
+
/**
|
|
1430
|
+
* Follow an issue on purpose, rather than by being assigned it, commenting on
|
|
1431
|
+
* it or being named in it.
|
|
1432
|
+
*
|
|
1433
|
+
* Those three are how everybody who follows an issue got there, and `unfollow`
|
|
1434
|
+
* was the only door in the other direction. Somebody who wanted to watch
|
|
1435
|
+
* another person's work had to comment on it — which is noise in the timeline —
|
|
1436
|
+
* or ask to be mentioned.
|
|
1437
|
+
*/
|
|
1438
|
+
export async function startFollowing(ctx, input) {
|
|
1439
|
+
if (!actorRequired(ctx))
|
|
1440
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1441
|
+
if (!commandKey(input.idempotencyKey))
|
|
1442
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1443
|
+
const held = await readableRow(ctx, 'flow.Issue', input.issueId);
|
|
1444
|
+
if (!held)
|
|
1445
|
+
return invalid(issue('issueId', 'flow.error.notFound'));
|
|
1446
|
+
await followIssue(ctx, held.threadId, ctx.actor);
|
|
1447
|
+
return { ok: true, id: input.issueId };
|
|
1448
|
+
}
|
|
1449
|
+
export async function stopFollowing(ctx, input) {
|
|
1450
|
+
if (!actorRequired(ctx))
|
|
1451
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1452
|
+
if (!commandKey(input.idempotencyKey))
|
|
1453
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1454
|
+
const held = await readableRow(ctx, 'flow.Issue', input.issueId);
|
|
1455
|
+
if (!held)
|
|
1456
|
+
return invalid(issue('issueId', 'flow.error.notFound'));
|
|
1457
|
+
const user = (await ctx.db.select('user.User', { id: ctx.actor }))[0];
|
|
1458
|
+
if (!user?.partnerId)
|
|
1459
|
+
return { ok: true, removed: 0 };
|
|
1460
|
+
const removed = await unfollowThread(ctx, String(held.threadId), String(user.partnerId));
|
|
1461
|
+
return { ok: true, removed };
|
|
1462
|
+
}
|
|
1463
|
+
/**
|
|
1464
|
+
* Whether the reader follows this issue, so a screen can offer the right verb.
|
|
1465
|
+
*/
|
|
1466
|
+
export async function following(ctx, issueId) {
|
|
1467
|
+
const held = await readableRow(ctx, 'flow.Issue', issueId);
|
|
1468
|
+
if (!held || !ctx.actor)
|
|
1469
|
+
return false;
|
|
1470
|
+
const user = (await ctx.db.select('user.User', { id: ctx.actor }))[0];
|
|
1471
|
+
if (!user?.partnerId)
|
|
1472
|
+
return false;
|
|
1473
|
+
const rows = await ctx.db.select('mail.Follower', {
|
|
1474
|
+
threadId: held.threadId,
|
|
1475
|
+
partnerId: user.partnerId,
|
|
1476
|
+
});
|
|
1477
|
+
return rows.length > 0;
|
|
1478
|
+
}
|
|
1479
|
+
/**
|
|
1480
|
+
* Contend on one row per project, so an invariant that spans rows has
|
|
1481
|
+
* something a database can serialize — see `flow.ProjectGuard`.
|
|
1482
|
+
*
|
|
1483
|
+
* The row is made on first use rather than with the project: a project that
|
|
1484
|
+
* never starts a sprint never needs one, and creating it here means projects
|
|
1485
|
+
* that predate this code get one the first time it matters.
|
|
1486
|
+
*/
|
|
1487
|
+
async function serializeProject(ctx, projectId) {
|
|
1488
|
+
const id = `guard:${projectId}`;
|
|
1489
|
+
await ctx.db.insertIfAbsent('flow.ProjectGuard', { id, projectId, updatedAt: now() });
|
|
1490
|
+
await ctx.db.update('flow.ProjectGuard', { id }, { updatedAt: now() });
|
|
1491
|
+
}
|
|
1492
|
+
export async function startSprint(ctx, input) {
|
|
1493
|
+
if (!actorRequired(ctx))
|
|
1494
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1495
|
+
if (!commandKey(input.idempotencyKey))
|
|
1496
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1497
|
+
return ctx.tx(async (tx) => {
|
|
1498
|
+
const held = await readableRow(tx, 'flow.Sprint', input.id);
|
|
1499
|
+
if (!held)
|
|
1500
|
+
return invalid(issue('id', 'flow.error.notFound'));
|
|
1501
|
+
if (held.state !== 'planned')
|
|
1502
|
+
return invalid(issue('id', 'flow.error.invalidSprintState'));
|
|
1503
|
+
// Take the project's guard row before reading, so a second caller doing
|
|
1504
|
+
// the same thing waits here rather than racing past the check below. The
|
|
1505
|
+
// read after it is a new statement and so takes a fresh snapshot, which is
|
|
1506
|
+
// what lets it see a sprint the other transaction has just started.
|
|
1507
|
+
await serializeProject(tx, String(held.projectId));
|
|
1508
|
+
// A project runs at most one active sprint at a time, which is what makes
|
|
1509
|
+
// "the current sprint" a well-defined thing for the board to show.
|
|
1510
|
+
const active = await tx.db.select('flow.Sprint', { projectId: held.projectId, state: 'active' });
|
|
1511
|
+
if (active.length)
|
|
1512
|
+
return invalid(issue('id', 'flow.error.sprintAlreadyActive'));
|
|
1513
|
+
await tx.db.update('flow.Sprint', { id: input.id }, { state: 'active' });
|
|
1514
|
+
return { ok: true, id: input.id };
|
|
1515
|
+
});
|
|
1516
|
+
}
|
|
1517
|
+
/**
|
|
1518
|
+
* What a sprint is carrying, and how much of it is finished — see FLW-021.
|
|
1519
|
+
*
|
|
1520
|
+
* `estimate` has been stored, shown on the form and shown in the summary since
|
|
1521
|
+
* the module was written, and added up nowhere: a sprint had no total and there
|
|
1522
|
+
* was no velocity to read. Counted per sprint in two grouped passes rather than
|
|
1523
|
+
* one query per sprint.
|
|
1524
|
+
*/
|
|
1525
|
+
export async function sprintTotals(ctx, projectId) {
|
|
1526
|
+
const tally = new Map();
|
|
1527
|
+
const terminal = new Set((await ctx.db.select('flow.Column', { projectId, terminalState: true, active: true })).map((row) => String(row.id)));
|
|
1528
|
+
// One read of the project's live issues that carry a sprint. Estimates are
|
|
1529
|
+
// decimals, which no `count` adds up, so the sum happens here — over the
|
|
1530
|
+
// sprint members only, not over the project.
|
|
1531
|
+
const I = ctx.table('flow.Issue');
|
|
1532
|
+
const rows = await ctx.db.all(from(I).where(eq(I.projectId, projectId), eq(I.active, true), isNotNull(I.sprintId)));
|
|
1533
|
+
for (const row of rows) {
|
|
1534
|
+
const key = String(row.sprintId);
|
|
1535
|
+
const at = tally.get(key) ?? { total: 0, done: 0, unfinished: 0, estimate: 0, estimateDone: 0 };
|
|
1536
|
+
const finished = terminal.has(String(row.columnId));
|
|
1537
|
+
at.total += 1;
|
|
1538
|
+
at.estimate += n(row.estimate);
|
|
1539
|
+
if (finished) {
|
|
1540
|
+
at.done += 1;
|
|
1541
|
+
at.estimateDone += n(row.estimate);
|
|
1542
|
+
}
|
|
1543
|
+
else
|
|
1544
|
+
at.unfinished += 1;
|
|
1545
|
+
tally.set(key, at);
|
|
1546
|
+
}
|
|
1547
|
+
return tally;
|
|
1548
|
+
}
|
|
1549
|
+
/** The same reading for epics, which have the same missing total. */
|
|
1550
|
+
export async function epicTotals(ctx, projectId) {
|
|
1551
|
+
const tally = new Map();
|
|
1552
|
+
const terminal = new Set((await ctx.db.select('flow.Column', { projectId, terminalState: true, active: true })).map((row) => String(row.id)));
|
|
1553
|
+
const I = ctx.table('flow.Issue');
|
|
1554
|
+
const rows = await ctx.db.all(from(I).where(eq(I.projectId, projectId), eq(I.active, true), isNotNull(I.epicId)));
|
|
1555
|
+
for (const row of rows) {
|
|
1556
|
+
const key = String(row.epicId);
|
|
1557
|
+
const at = tally.get(key) ?? { total: 0, done: 0, estimate: 0, estimateDone: 0 };
|
|
1558
|
+
at.total += 1;
|
|
1559
|
+
at.estimate += n(row.estimate);
|
|
1560
|
+
if (terminal.has(String(row.columnId))) {
|
|
1561
|
+
at.done += 1;
|
|
1562
|
+
at.estimateDone += n(row.estimate);
|
|
1563
|
+
}
|
|
1564
|
+
tally.set(key, at);
|
|
1565
|
+
}
|
|
1566
|
+
return tally;
|
|
1567
|
+
}
|
|
1568
|
+
/**
|
|
1569
|
+
* Close a sprint, and say what happens to the work that did not finish.
|
|
1570
|
+
*
|
|
1571
|
+
* Closing used to change one column and stop. The issues stayed in a sprint
|
|
1572
|
+
* nobody would look at again, and moving them was one screen each — the step
|
|
1573
|
+
* every sprint process has, done by hand.
|
|
1574
|
+
*
|
|
1575
|
+
* `carryTo` names where the unfinished work goes: another sprint of the same
|
|
1576
|
+
* project that is still open, or `null` to take it out of the sprint entirely.
|
|
1577
|
+
* Omitting it leaves the work where it is, which is what closing has always
|
|
1578
|
+
* done, so no existing caller changes behaviour.
|
|
1579
|
+
*
|
|
1580
|
+
* The carry is not compare-and-set. A sprint close is a deliberate act on the
|
|
1581
|
+
* whole set, and failing it because one issue was edited a second ago would be
|
|
1582
|
+
* the wrong answer; the version still moves, so anyone with that issue open
|
|
1583
|
+
* gets the conflict on their own next save.
|
|
1584
|
+
*/
|
|
1585
|
+
/**
|
|
1586
|
+
* Remove a sprint that was never started.
|
|
1587
|
+
*
|
|
1588
|
+
* Only `planned`. A sprint that has run is a record of what a team did in a
|
|
1589
|
+
* fortnight, and deleting one would take that away from every figure that
|
|
1590
|
+
* reports on it — `closeSprint` is how a sprint ends. This is for the other
|
|
1591
|
+
* case: one made by mistake, or planned and then abandoned before it began.
|
|
1592
|
+
*
|
|
1593
|
+
* Issues planned into it are let go rather than deleted with it. They go back
|
|
1594
|
+
* to the backlog, which is where they were before somebody put them in a
|
|
1595
|
+
* sprint that never happened; taking the work away with the plan would be a
|
|
1596
|
+
* surprise nobody asked for (FLW-016).
|
|
1597
|
+
*/
|
|
1598
|
+
export async function deleteSprint(ctx, input) {
|
|
1599
|
+
if (!actorRequired(ctx))
|
|
1600
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1601
|
+
if (!commandKey(input.idempotencyKey))
|
|
1602
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1603
|
+
return ctx.tx(async (tx) => {
|
|
1604
|
+
const held = await readableRow(tx, 'flow.Sprint', input.id);
|
|
1605
|
+
if (!held)
|
|
1606
|
+
return invalid(issue('id', 'flow.error.notFound'));
|
|
1607
|
+
if (held.state !== 'planned')
|
|
1608
|
+
return invalid(issue('id', 'flow.error.invalidSprintState'));
|
|
1609
|
+
const planned = await tx.db.select('flow.Issue', { sprintId: input.id });
|
|
1610
|
+
for (const row of planned)
|
|
1611
|
+
await tx.db.update('flow.Issue', { id: row.id }, { sprintId: null, updatedAt: now() });
|
|
1612
|
+
const S = tx.table('flow.Sprint');
|
|
1613
|
+
await tx.db.del(deleteFrom(S).where(eq(S.id, input.id)));
|
|
1614
|
+
return { ok: true, id: input.id, released: planned.length };
|
|
1615
|
+
});
|
|
1616
|
+
}
|
|
1617
|
+
export async function closeSprint(ctx, input) {
|
|
1618
|
+
if (!actorRequired(ctx))
|
|
1619
|
+
return invalid(issue('actor', 'flow.error.actorRequired'));
|
|
1620
|
+
if (!commandKey(input.idempotencyKey))
|
|
1621
|
+
return invalid(issue('idempotencyKey', 'flow.error.idempotencyRequired'));
|
|
1622
|
+
return ctx.tx(async (tx) => {
|
|
1623
|
+
const held = await readableRow(tx, 'flow.Sprint', input.id);
|
|
1624
|
+
if (!held)
|
|
1625
|
+
return invalid(issue('id', 'flow.error.notFound'));
|
|
1626
|
+
if (held.state !== 'active')
|
|
1627
|
+
return invalid(issue('id', 'flow.error.invalidSprintState'));
|
|
1628
|
+
let carried = 0;
|
|
1629
|
+
if (input.carryTo !== undefined) {
|
|
1630
|
+
const target = input.carryTo ? await readableRow(tx, 'flow.Sprint', input.carryTo) : null;
|
|
1631
|
+
if (input.carryTo) {
|
|
1632
|
+
if (!target || String(target.projectId) !== String(held.projectId))
|
|
1633
|
+
return invalid(issue('carryTo', 'flow.error.sprintProjectMismatch'));
|
|
1634
|
+
if (target.state === 'closed')
|
|
1635
|
+
return invalid(issue('carryTo', 'flow.error.sprintClosed'));
|
|
1636
|
+
if (String(target.id) === String(held.id))
|
|
1637
|
+
return invalid(issue('carryTo', 'flow.error.invalidSprintState'));
|
|
1638
|
+
}
|
|
1639
|
+
const terminal = new Set((await tx.db.select('flow.Column', {
|
|
1640
|
+
projectId: held.projectId,
|
|
1641
|
+
terminalState: true,
|
|
1642
|
+
active: true,
|
|
1643
|
+
})).map((row) => String(row.id)));
|
|
1644
|
+
const members = await tx.db.select('flow.Issue', { sprintId: input.id, active: true });
|
|
1645
|
+
const timestamp = now();
|
|
1646
|
+
for (const row of members) {
|
|
1647
|
+
if (terminal.has(String(row.columnId)))
|
|
1648
|
+
continue;
|
|
1649
|
+
await tx.db.update('flow.Issue', { id: row.id }, { sprintId: target ? target.id : null, version: n(row.version) + 1, updatedAt: timestamp });
|
|
1650
|
+
await trackIssueChange(tx, {
|
|
1651
|
+
issueId: String(row.id),
|
|
1652
|
+
threadId: row.threadId,
|
|
1653
|
+
version: n(row.version) + 1,
|
|
1654
|
+
body: 'flow.timeline.sprint',
|
|
1655
|
+
changes: moved('sprintId', row.sprintId, target ? target.id : null),
|
|
1656
|
+
});
|
|
1657
|
+
carried += 1;
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
await tx.db.update('flow.Sprint', { id: input.id }, { state: 'closed' });
|
|
1661
|
+
return { ok: true, id: input.id, carried };
|
|
1662
|
+
});
|
|
1663
|
+
}
|
|
1664
|
+
export const createFlowId = () => randomUUID();
|
|
1665
|
+
//# sourceMappingURL=operations.js.map
|