@open-mercato/core 0.6.6 → 0.6.7-develop.6553.1.2ec7246e04
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/.turbo/turbo-build.log +2 -2
- package/dist/generated/entities/gateway_session_initialization/index.js +23 -0
- package/dist/generated/entities/gateway_session_initialization/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +1 -0
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +12 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/modules/api_keys/api/keys/route.js +30 -13
- package/dist/modules/api_keys/api/keys/route.js.map +2 -2
- package/dist/modules/api_keys/cli.js +2 -1
- package/dist/modules/api_keys/cli.js.map +2 -2
- package/dist/modules/attachments/api/file/[id]/route.js +9 -7
- package/dist/modules/attachments/api/file/[id]/route.js.map +2 -2
- package/dist/modules/attachments/api/image/[id]/[[...slug]]/route.js +9 -7
- package/dist/modules/attachments/api/image/[id]/[[...slug]]/route.js.map +2 -2
- package/dist/modules/attachments/api/route.js +21 -17
- package/dist/modules/attachments/api/route.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentContentPreview.js +6 -35
- package/dist/modules/attachments/components/AttachmentContentPreview.js.map +2 -2
- package/dist/modules/attachments/lib/reconcileOrganization.js +110 -0
- package/dist/modules/attachments/lib/reconcileOrganization.js.map +7 -0
- package/dist/modules/attachments/lib/requestScope.js +10 -0
- package/dist/modules/attachments/lib/requestScope.js.map +7 -0
- package/dist/modules/audit_logs/backend/audit-logs/page.js +14 -24
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/auth/api/autologin.js +85 -0
- package/dist/modules/auth/api/autologin.js.map +7 -0
- package/dist/modules/auth/api/users/route.js +6 -2
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/cli.js +3 -2
- package/dist/modules/auth/cli.js.map +2 -2
- package/dist/modules/auth/lib/autologin.js +19 -0
- package/dist/modules/auth/lib/autologin.js.map +7 -0
- package/dist/modules/configs/lib/upgrade-actions.js +22 -0
- package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/roles/[id]/acl.js +1 -0
- package/dist/modules/customer_accounts/api/admin/roles/[id]/acl.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/roles/[id].js +17 -3
- package/dist/modules/customer_accounts/api/admin/roles/[id].js.map +2 -2
- package/dist/modules/customer_accounts/api/portal/users/[id]/roles.js +6 -1
- package/dist/modules/customer_accounts/api/portal/users/[id]/roles.js.map +2 -2
- package/dist/modules/customer_accounts/api/portal/users-invite.js +6 -1
- package/dist/modules/customer_accounts/api/portal/users-invite.js.map +2 -2
- package/dist/modules/customer_accounts/services/customerInvitationService.js +1 -0
- package/dist/modules/customer_accounts/services/customerInvitationService.js.map +2 -2
- package/dist/modules/customer_accounts/services/customerRbacService.js +6 -1
- package/dist/modules/customer_accounts/services/customerRbacService.js.map +2 -2
- package/dist/modules/customer_accounts/widgets/injection-table.js +0 -2
- package/dist/modules/customer_accounts/widgets/injection-table.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +7 -1
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/ViewTabsRow.js +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/ViewTabsRow.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyDetailTabs.js +37 -43
- package/dist/modules/customers/components/detail/CompanyDetailTabs.js.map +2 -2
- package/dist/modules/customers/components/detail/DealDetailTabs.js +23 -35
- package/dist/modules/customers/components/detail/DealDetailTabs.js.map +2 -2
- package/dist/modules/customers/components/detail/DetailTabsLayout.js +6 -21
- package/dist/modules/customers/components/detail/DetailTabsLayout.js.map +2 -2
- package/dist/modules/customers/components/detail/MobilePersonDetail.js +26 -32
- package/dist/modules/customers/components/detail/MobilePersonDetail.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonDetailTabs.js +29 -39
- package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +2 -2
- package/dist/modules/customers/components/detail/useDealsAccess.js +16 -0
- package/dist/modules/customers/components/detail/useDealsAccess.js.map +7 -0
- package/dist/modules/dashboards/api/roles/widgets/route.js +22 -3
- package/dist/modules/dashboards/api/roles/widgets/route.js.map +2 -2
- package/dist/modules/dashboards/api/users/widgets/route.js +22 -3
- package/dist/modules/dashboards/api/users/widgets/route.js.map +2 -2
- package/dist/modules/dashboards/cli.js +4 -3
- package/dist/modules/dashboards/cli.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetAssignmentScope.js +9 -1
- package/dist/modules/dashboards/lib/widgetAssignmentScope.js.map +2 -2
- package/dist/modules/dictionaries/commands/entries.js +7 -14
- package/dist/modules/dictionaries/commands/entries.js.map +2 -2
- package/dist/modules/dictionaries/commands/entry-operations.js +7 -16
- package/dist/modules/dictionaries/commands/entry-operations.js.map +2 -2
- package/dist/modules/dictionaries/commands/factory.js +9 -3
- package/dist/modules/dictionaries/commands/factory.js.map +2 -2
- package/dist/modules/dictionaries/fields/dictionary.js +56 -41
- package/dist/modules/dictionaries/fields/dictionary.js.map +2 -2
- package/dist/modules/directory/utils/organizationScope.js +10 -3
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/records.js +5 -4
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/system/[entityId]/page.meta.js +1 -0
- package/dist/modules/entities/backend/entities/system/[entityId]/page.meta.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/page.js +49 -49
- package/dist/modules/entities/backend/entities/user/[entityId]/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/page.meta.js +1 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/page.meta.js.map +2 -2
- package/dist/modules/entities/cli.js +2 -1
- package/dist/modules/entities/cli.js.map +2 -2
- package/dist/modules/feature_toggles/api/check/boolean/route.js +0 -14
- package/dist/modules/feature_toggles/api/check/boolean/route.js.map +2 -2
- package/dist/modules/feature_toggles/defaults.json +8 -0
- package/dist/modules/integrations/backend/integrations/[id]/page.js +9 -80
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/payment_gateways/data/entities.js +45 -0
- package/dist/modules/payment_gateways/data/entities.js.map +2 -2
- package/dist/modules/payment_gateways/lib/gateway-service.js +173 -38
- package/dist/modules/payment_gateways/lib/gateway-service.js.map +3 -3
- package/dist/modules/payment_gateways/lib/session-idempotency.js +104 -0
- package/dist/modules/payment_gateways/lib/session-idempotency.js.map +7 -0
- package/dist/modules/payment_gateways/migrations/Migration20260709220938_payment_gateways.js +11 -0
- package/dist/modules/payment_gateways/migrations/Migration20260709220938_payment_gateways.js.map +7 -0
- package/dist/modules/planner/backend/planner/availability-rulesets/[id]/page.js +16 -14
- package/dist/modules/planner/backend/planner/availability-rulesets/[id]/page.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRulesEditor.js +18 -30
- package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
- package/dist/modules/query_index/api/status.js +2 -8
- package/dist/modules/query_index/api/status.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/[id]/page.js +24 -24
- package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/create/page.js +6 -0
- package/dist/modules/sales/backend/sales/channels/create/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/create/page.meta.js +2 -0
- package/dist/modules/sales/backend/sales/channels/create/page.meta.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +6 -0
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.meta.js +2 -0
- package/dist/modules/sales/backend/sales/channels/offers/page.meta.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +6 -0
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.meta.js +2 -0
- package/dist/modules/sales/backend/sales/channels/page.meta.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +6 -4
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +44 -0
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/commands/returns.js +2 -27
- package/dist/modules/sales/commands/returns.js.map +2 -2
- package/dist/modules/sales/components/SalesChannelsDisabledNotice.js +15 -0
- package/dist/modules/sales/components/SalesChannelsDisabledNotice.js.map +7 -0
- package/dist/modules/sales/components/documents/AddressesSection.js +6 -2
- package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +1 -0
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +9 -0
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentForm.js +51 -3
- package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +10 -8
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +59 -38
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/useSalesChannelsEnabled.js +44 -0
- package/dist/modules/sales/components/useSalesChannelsEnabled.js.map +7 -0
- package/dist/modules/sales/lib/calculations.js +6 -0
- package/dist/modules/sales/lib/calculations.js.map +2 -2
- package/dist/modules/sales/lib/salesChannelsToggle.js +18 -0
- package/dist/modules/sales/lib/salesChannelsToggle.js.map +7 -0
- package/dist/modules/sales/lib/salesChannelsToggleId.js +5 -0
- package/dist/modules/sales/lib/salesChannelsToggleId.js.map +7 -0
- package/dist/modules/sales/lib/shipments/snapshots.js +27 -1
- package/dist/modules/sales/lib/shipments/snapshots.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js +22 -25
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +12 -14
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.js +10 -29
- package/dist/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.js.map +2 -2
- package/dist/modules/sync_excel/lib/adapters/customers.js +19 -20
- package/dist/modules/sync_excel/lib/adapters/customers.js.map +2 -2
- package/dist/modules/sync_excel/lib/parser.js +185 -0
- package/dist/modules/sync_excel/lib/parser.js.map +2 -2
- package/dist/modules/sync_excel/lib/upload-storage.js +20 -1
- package/dist/modules/sync_excel/lib/upload-storage.js.map +2 -2
- package/generated/entities/gateway_session_initialization/index.ts +10 -0
- package/generated/entities.ids.generated.ts +1 -0
- package/generated/entity-fields-registry.ts +12 -0
- package/package.json +9 -8
- package/src/modules/api_keys/api/keys/route.ts +36 -13
- package/src/modules/api_keys/cli.ts +2 -3
- package/src/modules/attachments/api/file/[id]/route.ts +11 -7
- package/src/modules/attachments/api/image/[id]/[[...slug]]/route.ts +11 -7
- package/src/modules/attachments/api/route.ts +26 -21
- package/src/modules/attachments/components/AttachmentContentPreview.tsx +9 -44
- package/src/modules/attachments/lib/reconcileOrganization.ts +188 -0
- package/src/modules/attachments/lib/requestScope.ts +27 -0
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +12 -22
- package/src/modules/auth/api/autologin.ts +100 -0
- package/src/modules/auth/api/users/route.ts +11 -2
- package/src/modules/auth/cli.ts +3 -2
- package/src/modules/auth/lib/autologin.ts +36 -0
- package/src/modules/configs/i18n/de.json +5 -1
- package/src/modules/configs/i18n/en.json +5 -1
- package/src/modules/configs/i18n/es.json +5 -1
- package/src/modules/configs/i18n/pl.json +5 -1
- package/src/modules/configs/lib/upgrade-actions.ts +24 -0
- package/src/modules/customer_accounts/AGENTS.md +8 -6
- package/src/modules/customer_accounts/api/admin/roles/[id]/acl.ts +1 -0
- package/src/modules/customer_accounts/api/admin/roles/[id].ts +17 -3
- package/src/modules/customer_accounts/api/portal/users/[id]/roles.ts +6 -1
- package/src/modules/customer_accounts/api/portal/users-invite.ts +6 -1
- package/src/modules/customer_accounts/services/customerInvitationService.ts +1 -0
- package/src/modules/customer_accounts/services/customerRbacService.ts +9 -2
- package/src/modules/customer_accounts/widgets/injection-table.ts +0 -2
- package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +11 -1
- package/src/modules/customers/backend/customers/deals/pipeline/components/ViewTabsRow.tsx +6 -2
- package/src/modules/customers/components/detail/CompanyDetailTabs.tsx +39 -55
- package/src/modules/customers/components/detail/DealDetailTabs.tsx +24 -49
- package/src/modules/customers/components/detail/DetailTabsLayout.tsx +13 -24
- package/src/modules/customers/components/detail/MobilePersonDetail.tsx +25 -31
- package/src/modules/customers/components/detail/PersonDetailTabs.tsx +29 -50
- package/src/modules/customers/components/detail/useDealsAccess.ts +19 -0
- package/src/modules/dashboards/api/roles/widgets/route.ts +22 -3
- package/src/modules/dashboards/api/users/widgets/route.ts +22 -3
- package/src/modules/dashboards/cli.ts +4 -9
- package/src/modules/dashboards/lib/widgetAssignmentScope.ts +18 -0
- package/src/modules/dictionaries/commands/entries.ts +7 -16
- package/src/modules/dictionaries/commands/entry-operations.ts +8 -18
- package/src/modules/dictionaries/commands/factory.ts +8 -2
- package/src/modules/dictionaries/fields/dictionary.tsx +55 -32
- package/src/modules/dictionaries/i18n/de.json +2 -0
- package/src/modules/dictionaries/i18n/en.json +2 -0
- package/src/modules/dictionaries/i18n/es.json +2 -0
- package/src/modules/dictionaries/i18n/pl.json +2 -0
- package/src/modules/directory/utils/organizationScope.ts +36 -2
- package/src/modules/entities/api/records.ts +5 -7
- package/src/modules/entities/backend/entities/system/[entityId]/page.meta.ts +1 -0
- package/src/modules/entities/backend/entities/user/[entityId]/page.meta.ts +1 -0
- package/src/modules/entities/backend/entities/user/[entityId]/page.tsx +51 -49
- package/src/modules/entities/cli.ts +2 -1
- package/src/modules/entities/i18n/de.json +34 -0
- package/src/modules/entities/i18n/en.json +34 -0
- package/src/modules/entities/i18n/es.json +34 -0
- package/src/modules/entities/i18n/pl.json +34 -0
- package/src/modules/feature_toggles/api/check/boolean/route.ts +0 -15
- package/src/modules/feature_toggles/defaults.json +8 -0
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +16 -59
- package/src/modules/payment_gateways/data/entities.ts +39 -0
- package/src/modules/payment_gateways/lib/gateway-service.ts +211 -40
- package/src/modules/payment_gateways/lib/session-idempotency.ts +142 -0
- package/src/modules/payment_gateways/migrations/.snapshot-open-mercato.json +236 -0
- package/src/modules/payment_gateways/migrations/Migration20260709220938_payment_gateways.ts +10 -0
- package/src/modules/planner/backend/planner/availability-rulesets/[id]/page.tsx +14 -20
- package/src/modules/planner/components/AvailabilityRulesEditor.tsx +16 -34
- package/src/modules/query_index/api/status.ts +2 -8
- package/src/modules/resources/backend/resources/resources/[id]/page.tsx +27 -37
- package/src/modules/sales/backend/sales/channels/create/page.meta.ts +3 -0
- package/src/modules/sales/backend/sales/channels/create/page.tsx +7 -0
- package/src/modules/sales/backend/sales/channels/offers/page.meta.ts +3 -0
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +7 -0
- package/src/modules/sales/backend/sales/channels/page.meta.ts +4 -0
- package/src/modules/sales/backend/sales/channels/page.tsx +7 -0
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +7 -5
- package/src/modules/sales/commands/documents.ts +65 -0
- package/src/modules/sales/commands/returns.ts +2 -32
- package/src/modules/sales/components/SalesChannelsDisabledNotice.tsx +21 -0
- package/src/modules/sales/components/documents/AddressesSection.tsx +6 -2
- package/src/modules/sales/components/documents/ItemsSection.tsx +5 -0
- package/src/modules/sales/components/documents/LineItemDialog.tsx +10 -0
- package/src/modules/sales/components/documents/SalesDocumentForm.tsx +53 -3
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +10 -8
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +65 -40
- package/src/modules/sales/components/useSalesChannelsEnabled.ts +59 -0
- package/src/modules/sales/i18n/de.json +5 -0
- package/src/modules/sales/i18n/en.json +5 -0
- package/src/modules/sales/i18n/es.json +5 -0
- package/src/modules/sales/i18n/pl.json +5 -0
- package/src/modules/sales/lib/calculations.ts +15 -0
- package/src/modules/sales/lib/salesChannelsToggle.ts +26 -0
- package/src/modules/sales/lib/salesChannelsToggleId.ts +1 -0
- package/src/modules/sales/lib/shipments/snapshots.ts +30 -0
- package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +25 -34
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +11 -17
- package/src/modules/staff/lib/timesheets-projects-ui/SavedViewTabs.tsx +11 -28
- package/src/modules/sync_excel/lib/adapters/customers.ts +20 -22
- package/src/modules/sync_excel/lib/parser.ts +245 -0
- package/src/modules/sync_excel/lib/upload-storage.ts +23 -1
|
@@ -3,7 +3,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import { useRouter } from "next/navigation";
|
|
5
5
|
import { Page, PageBody } from "@open-mercato/ui/backend/Page";
|
|
6
|
-
import {
|
|
6
|
+
import { Tabs, TabsList, TabsTrigger } from "@open-mercato/ui/primitives/tabs";
|
|
7
7
|
import { ErrorMessage, RecordNotFoundState } from "@open-mercato/ui/backend/detail";
|
|
8
8
|
import { readApiResultOrThrow } from "@open-mercato/ui/backend/utils/apiCall";
|
|
9
9
|
import { updateCrud, deleteCrud } from "@open-mercato/ui/backend/utils/crud";
|
|
@@ -136,20 +136,22 @@ function PlannerAvailabilityRuleSetDetailPage({ params }) {
|
|
|
136
136
|
return /* @__PURE__ */ jsx(Page, { children: /* @__PURE__ */ jsx(PageBody, { children: /* @__PURE__ */ jsx(ErrorMessage, { label: error }) }) });
|
|
137
137
|
}
|
|
138
138
|
return /* @__PURE__ */ jsx(Page, { children: /* @__PURE__ */ jsx(PageBody, { children: /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
139
|
-
/* @__PURE__ */ jsx(
|
|
140
|
-
|
|
139
|
+
/* @__PURE__ */ jsx(
|
|
140
|
+
Tabs,
|
|
141
141
|
{
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
"
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
142
|
+
value: activeTab,
|
|
143
|
+
onValueChange: (value) => setActiveTab(value),
|
|
144
|
+
variant: "underline",
|
|
145
|
+
children: /* @__PURE__ */ jsx(
|
|
146
|
+
TabsList,
|
|
147
|
+
{
|
|
148
|
+
className: "w-full flex-wrap",
|
|
149
|
+
"aria-label": translate("planner.availabilityRuleSets.tabs.label", "Schedule sections"),
|
|
150
|
+
children: tabs.map((tab) => /* @__PURE__ */ jsx(TabsTrigger, { value: tab.id, children: tab.label }, tab.id))
|
|
151
|
+
}
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
),
|
|
153
155
|
activeTab === "details" ? /* @__PURE__ */ jsx(
|
|
154
156
|
AvailabilityRuleSetForm,
|
|
155
157
|
{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/planner/backend/planner/availability-rulesets/%5Bid%5D/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { ErrorMessage, RecordNotFoundState } from '@open-mercato/ui/backend/detail'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { updateCrud, deleteCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { AvailabilityRulesEditor, type AvailabilityScheduleItemBuilder } from '@open-mercato/core/modules/planner/components/AvailabilityRulesEditor'\nimport { parseAvailabilityRuleWindow } from '@open-mercato/core/modules/planner/lib/availabilitySchedule'\nimport { extractCustomFieldEntries } from '@open-mercato/shared/lib/crud/custom-fields-client'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { AvailabilityRuleSetForm, buildAvailabilityRuleSetPayload, type AvailabilityRuleSetFormValues } from '@open-mercato/core/modules/planner/components/AvailabilityRuleSetForm'\n\nconst DAY_MS = 24 * 60 * 60 * 1000\n\nfunction toFullDayWindow(value: Date): { start: Date; end: Date } {\n const start = new Date(value.getFullYear(), value.getMonth(), value.getDate())\n const end = new Date(start.getTime() + DAY_MS)\n return { start, end }\n}\n\ntype RuleSetRecord = {\n id: string\n name: string\n description?: string | null\n timezone: string\n updatedAt?: string | null\n updated_at?: string | null\n name_raw?: string | null\n} & Record<string, unknown>\n\ntype RuleSetResponse = {\n items?: RuleSetRecord[]\n}\n\nexport default function PlannerAvailabilityRuleSetDetailPage({ params }: { params?: { id?: string } }) {\n const rulesetId = params?.id\n const translate = useT()\n const router = useRouter()\n // optimistic-lock: AvailabilityRuleSetForm forwards optimisticLockUpdatedAt from initialValues.updatedAt (wrapper auto-derives the header on save + delete).\n const [initialValues, setInitialValues] = React.useState<AvailabilityRuleSetFormValues | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n const [isNotFound, setIsNotFound] = React.useState(false)\n const [activeTab, setActiveTab] = React.useState<'details' | 'availability'>('details')\n\n React.useEffect(() => {\n if (!rulesetId) return\n const rulesetIdValue = rulesetId\n let cancelled = false\n async function loadRuleSet() {\n if (!cancelled) {\n setError(null)\n setIsNotFound(false)\n }\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '1', ids: rulesetIdValue })\n const payload = await readApiResultOrThrow<RuleSetResponse>(\n `/api/planner/availability-rule-sets?${params.toString()}`,\n undefined,\n { errorMessage: translate('planner.availabilityRuleSets.form.errors.load', 'Failed to load schedule.') },\n )\n const record = Array.isArray(payload.items) ? payload.items[0] : null\n if (!record) {\n if (!cancelled) setIsNotFound(true)\n return\n }\n const customFields = extractCustomFieldEntries(record)\n if (!cancelled) {\n setInitialValues({\n id: record.id,\n name: record.name ?? record.name_raw ?? '',\n description: record.description ?? '',\n timezone: record.timezone ?? 'UTC',\n updatedAt: typeof record.updatedAt === 'string'\n ? record.updatedAt\n : typeof record.updated_at === 'string'\n ? record.updated_at\n : null,\n ...customFields,\n })\n }\n } catch (err) {\n if (!cancelled) {\n if ((err as { status?: number }).status === 404) {\n setIsNotFound(true)\n } else {\n const message = err instanceof Error ? err.message : translate('planner.availabilityRuleSets.form.errors.load', 'Failed to load schedule.')\n setError(message)\n }\n }\n }\n }\n loadRuleSet()\n return () => { cancelled = true }\n }, [rulesetId, translate])\n\n const handleSubmit = React.useCallback(async (values: AvailabilityRuleSetFormValues) => {\n if (!rulesetId) return\n const timezone = typeof initialValues?.timezone === 'string' && initialValues.timezone.trim().length\n ? initialValues.timezone.trim()\n : 'UTC'\n const payload = buildAvailabilityRuleSetPayload(values, { id: rulesetId, timezone })\n await updateCrud('planner/availability-rule-sets', payload, {\n errorMessage: translate('planner.availabilityRuleSets.form.errors.update', 'Failed to update schedule.'),\n })\n flash(translate('planner.availabilityRuleSets.form.flash.updated', 'Schedule updated.'), 'success')\n router.push('/backend/planner/availability-rulesets')\n }, [initialValues?.timezone, router, rulesetId, translate])\n\n const handleDelete = React.useCallback(async () => {\n if (!rulesetId) return\n // Let a non-ok DELETE (e.g. the 409 optimistic-lock conflict) propagate so\n // CrudForm surfaces the unified conflict bar and skips its success toast.\n // Swallowing the error here made CrudForm treat the delete as successful and\n // show a false \"Schedule deleted.\" toast even though the record was kept.\n await deleteCrud('planner/availability-rule-sets', rulesetId, {\n errorMessage: translate('planner.availabilityRuleSets.form.errors.delete', 'Failed to delete schedule.'),\n })\n flash(translate('planner.availabilityRuleSets.form.flash.deleted', 'Schedule deleted.'), 'success')\n router.push('/backend/planner/availability-rulesets')\n }, [router, rulesetId, translate])\n\n const buildScheduleItems: AvailabilityScheduleItemBuilder = React.useCallback(({ availabilityRules, bookedEvents, translate: translateLabel }) => {\n const overrideExdates = Array.from(new Set(\n availabilityRules\n .map((rule) => parseAvailabilityRuleWindow(rule))\n .filter((window) => window.repeat === 'once')\n .map((window) => toFullDayWindow(window.startAt).start.toISOString()),\n ))\n const availabilityItems = availabilityRules.map((rule) => {\n const window = parseAvailabilityRuleWindow(rule)\n const isUnavailable = rule.kind === 'unavailability'\n const titleKey = isUnavailable\n ? 'planner.availabilityRuleSets.availability.title.unavailable'\n : `planner.availabilityRuleSets.availability.title.${window.repeat}`\n const fallback = isUnavailable\n ? 'Unavailable'\n : window.repeat === 'weekly'\n ? 'Weekly availability'\n : window.repeat === 'daily'\n ? 'Daily availability'\n : 'Availability'\n const baseTitle = translateLabel(titleKey, fallback)\n const title = rule.note ? `${baseTitle}: ${rule.note}` : baseTitle\n const windowTime = window.repeat === 'once' ? toFullDayWindow(window.startAt) : { start: window.startAt, end: window.endAt }\n const exdates = window.repeat === 'once'\n ? rule.exdates ?? []\n : [...(rule.exdates ?? []), ...overrideExdates]\n return {\n id: rule.id,\n kind: isUnavailable ? 'exception' as const : 'availability' as const,\n title,\n startsAt: windowTime.start,\n endsAt: windowTime.end,\n metadata: { rule: { ...rule, exdates } },\n }\n })\n return availabilityItems\n }, [])\n\n const tabs = React.useMemo(() => ([\n { id: 'details', label: translate('planner.availabilityRuleSets.tabs.details', 'Details') },\n { id: 'availability', label: translate('planner.availabilityRuleSets.tabs.availability', 'Availability') },\n ]), [translate])\n\n const resolvedInitialValues = initialValues ?? {}\n\n if (isNotFound) {\n return (\n <Page>\n <PageBody>\n <RecordNotFoundState\n label={translate('planner.availabilityRuleSets.form.errors.notFound', 'Schedule not found.')}\n backHref=\"/backend/planner/availability-rulesets\"\n backLabel={translate('planner.availabilityRuleSets.actions.backToList', 'Back to schedules')}\n />\n </PageBody>\n </Page>\n )\n }\n\n if (error && !initialValues) {\n return (\n <Page>\n <PageBody>\n <ErrorMessage label={error} />\n </PageBody>\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody>\n <div className=\"space-y-6\">\n <div className=\"border-b\">\n <nav className=\"flex flex-wrap items-center gap-5 text-sm\" aria-label={translate('planner.availabilityRuleSets.tabs.label', 'Schedule sections')}>\n {tabs.map((tab) => (\n <Button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === tab.id}\n variant=\"ghost\"\n size=\"sm\"\n className={`relative -mb-px h-auto rounded-none border-b-2 px-0 py-2 font-medium ${\n activeTab === tab.id\n ? 'border-accent-indigo text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n onClick={() => setActiveTab(tab.id as 'details' | 'availability')}\n >\n {tab.label}\n </Button>\n ))}\n </nav>\n </div>\n\n {activeTab === 'details' ? (\n <AvailabilityRuleSetForm\n title={translate('planner.availabilityRuleSets.form.editTitle', 'Edit schedule')}\n backHref=\"/backend/planner/availability-rulesets\"\n cancelHref=\"/backend/planner/availability-rulesets\"\n initialValues={resolvedInitialValues}\n onSubmit={handleSubmit}\n onDelete={handleDelete}\n isLoading={!initialValues}\n loadingMessage={translate('planner.availabilityRuleSets.form.loading', 'Loading schedule...')}\n />\n ) : (\n <AvailabilityRulesEditor\n subjectType=\"ruleset\"\n subjectId={rulesetId ?? ''}\n initialTimezone={typeof initialValues?.timezone === 'string' ? initialValues.timezone : undefined}\n labelPrefix=\"planner.availabilityRuleSets\"\n mode=\"availability\"\n buildScheduleItems={buildScheduleItems}\n />\n )}\n </div>\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
-
"mappings": ";AA8KU,cAuBF,YAvBE;AA5KV,YAAY,WAAW;AACvB,SAAS,iBAAiB;AAC1B,SAAS,MAAM,gBAAgB;AAC/B,SAAS,
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Tabs, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'\nimport { ErrorMessage, RecordNotFoundState } from '@open-mercato/ui/backend/detail'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { updateCrud, deleteCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { AvailabilityRulesEditor, type AvailabilityScheduleItemBuilder } from '@open-mercato/core/modules/planner/components/AvailabilityRulesEditor'\nimport { parseAvailabilityRuleWindow } from '@open-mercato/core/modules/planner/lib/availabilitySchedule'\nimport { extractCustomFieldEntries } from '@open-mercato/shared/lib/crud/custom-fields-client'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { AvailabilityRuleSetForm, buildAvailabilityRuleSetPayload, type AvailabilityRuleSetFormValues } from '@open-mercato/core/modules/planner/components/AvailabilityRuleSetForm'\n\nconst DAY_MS = 24 * 60 * 60 * 1000\n\nfunction toFullDayWindow(value: Date): { start: Date; end: Date } {\n const start = new Date(value.getFullYear(), value.getMonth(), value.getDate())\n const end = new Date(start.getTime() + DAY_MS)\n return { start, end }\n}\n\ntype RuleSetRecord = {\n id: string\n name: string\n description?: string | null\n timezone: string\n updatedAt?: string | null\n updated_at?: string | null\n name_raw?: string | null\n} & Record<string, unknown>\n\ntype RuleSetResponse = {\n items?: RuleSetRecord[]\n}\n\nexport default function PlannerAvailabilityRuleSetDetailPage({ params }: { params?: { id?: string } }) {\n const rulesetId = params?.id\n const translate = useT()\n const router = useRouter()\n // optimistic-lock: AvailabilityRuleSetForm forwards optimisticLockUpdatedAt from initialValues.updatedAt (wrapper auto-derives the header on save + delete).\n const [initialValues, setInitialValues] = React.useState<AvailabilityRuleSetFormValues | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n const [isNotFound, setIsNotFound] = React.useState(false)\n const [activeTab, setActiveTab] = React.useState<'details' | 'availability'>('details')\n\n React.useEffect(() => {\n if (!rulesetId) return\n const rulesetIdValue = rulesetId\n let cancelled = false\n async function loadRuleSet() {\n if (!cancelled) {\n setError(null)\n setIsNotFound(false)\n }\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '1', ids: rulesetIdValue })\n const payload = await readApiResultOrThrow<RuleSetResponse>(\n `/api/planner/availability-rule-sets?${params.toString()}`,\n undefined,\n { errorMessage: translate('planner.availabilityRuleSets.form.errors.load', 'Failed to load schedule.') },\n )\n const record = Array.isArray(payload.items) ? payload.items[0] : null\n if (!record) {\n if (!cancelled) setIsNotFound(true)\n return\n }\n const customFields = extractCustomFieldEntries(record)\n if (!cancelled) {\n setInitialValues({\n id: record.id,\n name: record.name ?? record.name_raw ?? '',\n description: record.description ?? '',\n timezone: record.timezone ?? 'UTC',\n updatedAt: typeof record.updatedAt === 'string'\n ? record.updatedAt\n : typeof record.updated_at === 'string'\n ? record.updated_at\n : null,\n ...customFields,\n })\n }\n } catch (err) {\n if (!cancelled) {\n if ((err as { status?: number }).status === 404) {\n setIsNotFound(true)\n } else {\n const message = err instanceof Error ? err.message : translate('planner.availabilityRuleSets.form.errors.load', 'Failed to load schedule.')\n setError(message)\n }\n }\n }\n }\n loadRuleSet()\n return () => { cancelled = true }\n }, [rulesetId, translate])\n\n const handleSubmit = React.useCallback(async (values: AvailabilityRuleSetFormValues) => {\n if (!rulesetId) return\n const timezone = typeof initialValues?.timezone === 'string' && initialValues.timezone.trim().length\n ? initialValues.timezone.trim()\n : 'UTC'\n const payload = buildAvailabilityRuleSetPayload(values, { id: rulesetId, timezone })\n await updateCrud('planner/availability-rule-sets', payload, {\n errorMessage: translate('planner.availabilityRuleSets.form.errors.update', 'Failed to update schedule.'),\n })\n flash(translate('planner.availabilityRuleSets.form.flash.updated', 'Schedule updated.'), 'success')\n router.push('/backend/planner/availability-rulesets')\n }, [initialValues?.timezone, router, rulesetId, translate])\n\n const handleDelete = React.useCallback(async () => {\n if (!rulesetId) return\n // Let a non-ok DELETE (e.g. the 409 optimistic-lock conflict) propagate so\n // CrudForm surfaces the unified conflict bar and skips its success toast.\n // Swallowing the error here made CrudForm treat the delete as successful and\n // show a false \"Schedule deleted.\" toast even though the record was kept.\n await deleteCrud('planner/availability-rule-sets', rulesetId, {\n errorMessage: translate('planner.availabilityRuleSets.form.errors.delete', 'Failed to delete schedule.'),\n })\n flash(translate('planner.availabilityRuleSets.form.flash.deleted', 'Schedule deleted.'), 'success')\n router.push('/backend/planner/availability-rulesets')\n }, [router, rulesetId, translate])\n\n const buildScheduleItems: AvailabilityScheduleItemBuilder = React.useCallback(({ availabilityRules, bookedEvents, translate: translateLabel }) => {\n const overrideExdates = Array.from(new Set(\n availabilityRules\n .map((rule) => parseAvailabilityRuleWindow(rule))\n .filter((window) => window.repeat === 'once')\n .map((window) => toFullDayWindow(window.startAt).start.toISOString()),\n ))\n const availabilityItems = availabilityRules.map((rule) => {\n const window = parseAvailabilityRuleWindow(rule)\n const isUnavailable = rule.kind === 'unavailability'\n const titleKey = isUnavailable\n ? 'planner.availabilityRuleSets.availability.title.unavailable'\n : `planner.availabilityRuleSets.availability.title.${window.repeat}`\n const fallback = isUnavailable\n ? 'Unavailable'\n : window.repeat === 'weekly'\n ? 'Weekly availability'\n : window.repeat === 'daily'\n ? 'Daily availability'\n : 'Availability'\n const baseTitle = translateLabel(titleKey, fallback)\n const title = rule.note ? `${baseTitle}: ${rule.note}` : baseTitle\n const windowTime = window.repeat === 'once' ? toFullDayWindow(window.startAt) : { start: window.startAt, end: window.endAt }\n const exdates = window.repeat === 'once'\n ? rule.exdates ?? []\n : [...(rule.exdates ?? []), ...overrideExdates]\n return {\n id: rule.id,\n kind: isUnavailable ? 'exception' as const : 'availability' as const,\n title,\n startsAt: windowTime.start,\n endsAt: windowTime.end,\n metadata: { rule: { ...rule, exdates } },\n }\n })\n return availabilityItems\n }, [])\n\n const tabs = React.useMemo(() => ([\n { id: 'details', label: translate('planner.availabilityRuleSets.tabs.details', 'Details') },\n { id: 'availability', label: translate('planner.availabilityRuleSets.tabs.availability', 'Availability') },\n ]), [translate])\n\n const resolvedInitialValues = initialValues ?? {}\n\n if (isNotFound) {\n return (\n <Page>\n <PageBody>\n <RecordNotFoundState\n label={translate('planner.availabilityRuleSets.form.errors.notFound', 'Schedule not found.')}\n backHref=\"/backend/planner/availability-rulesets\"\n backLabel={translate('planner.availabilityRuleSets.actions.backToList', 'Back to schedules')}\n />\n </PageBody>\n </Page>\n )\n }\n\n if (error && !initialValues) {\n return (\n <Page>\n <PageBody>\n <ErrorMessage label={error} />\n </PageBody>\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody>\n <div className=\"space-y-6\">\n <Tabs\n value={activeTab}\n onValueChange={(value) => setActiveTab(value as 'details' | 'availability')}\n variant=\"underline\"\n >\n <TabsList\n className=\"w-full flex-wrap\"\n aria-label={translate('planner.availabilityRuleSets.tabs.label', 'Schedule sections')}\n >\n {tabs.map((tab) => (\n <TabsTrigger key={tab.id} value={tab.id}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n\n {activeTab === 'details' ? (\n <AvailabilityRuleSetForm\n title={translate('planner.availabilityRuleSets.form.editTitle', 'Edit schedule')}\n backHref=\"/backend/planner/availability-rulesets\"\n cancelHref=\"/backend/planner/availability-rulesets\"\n initialValues={resolvedInitialValues}\n onSubmit={handleSubmit}\n onDelete={handleDelete}\n isLoading={!initialValues}\n loadingMessage={translate('planner.availabilityRuleSets.form.loading', 'Loading schedule...')}\n />\n ) : (\n <AvailabilityRulesEditor\n subjectType=\"ruleset\"\n subjectId={rulesetId ?? ''}\n initialTimezone={typeof initialValues?.timezone === 'string' ? initialValues.timezone : undefined}\n labelPrefix=\"planner.availabilityRuleSets\"\n mode=\"availability\"\n buildScheduleItems={buildScheduleItems}\n />\n )}\n </div>\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["params"]
|
|
7
7
|
}
|
|
@@ -21,6 +21,7 @@ import { buildOptimisticLockHeader } from "@open-mercato/ui/backend/utils/optimi
|
|
|
21
21
|
import { flash } from "@open-mercato/ui/backend/FlashMessages";
|
|
22
22
|
import { surfaceRecordConflict } from "@open-mercato/ui/backend/conflicts";
|
|
23
23
|
import { Spinner } from "@open-mercato/ui/primitives/spinner";
|
|
24
|
+
import { Tabs, TabsList, TabsTrigger } from "@open-mercato/ui/primitives/tabs";
|
|
24
25
|
import { ComboboxInput, TimePicker } from "@open-mercato/ui/backend/inputs";
|
|
25
26
|
import { DictionaryEntrySelect } from "@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect";
|
|
26
27
|
import {
|
|
@@ -1611,40 +1612,27 @@ function AvailabilityRulesEditor({
|
|
|
1611
1612
|
label: listLabels.applyScopeLabel,
|
|
1612
1613
|
type: "custom",
|
|
1613
1614
|
component: () => /* @__PURE__ */ jsx("div", { className: "rounded-lg border bg-muted/30 p-4", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
1614
|
-
/* @__PURE__ */ jsx("div", { className: "space-y-2", children: /* @__PURE__ */
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
size: "sm",
|
|
1623
|
-
className: `h-auto rounded-md px-3 py-1.5 font-medium ${editorScope === "date" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"}`,
|
|
1624
|
-
onClick: () => setEditorScope("date"),
|
|
1625
|
-
children: listLabels.applyScopeDate
|
|
1626
|
-
}
|
|
1627
|
-
),
|
|
1628
|
-
/* @__PURE__ */ jsx(
|
|
1629
|
-
Button,
|
|
1630
|
-
{
|
|
1631
|
-
type: "button",
|
|
1632
|
-
role: "tab",
|
|
1633
|
-
"aria-selected": editorScope === "weekday",
|
|
1634
|
-
variant: "ghost",
|
|
1635
|
-
size: "sm",
|
|
1636
|
-
className: `h-auto rounded-md px-3 py-1.5 font-medium ${editorScope === "weekday" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"}`,
|
|
1637
|
-
onClick: () => {
|
|
1638
|
-
setEditorScope("weekday");
|
|
1615
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-2", children: /* @__PURE__ */ jsx(
|
|
1616
|
+
Tabs,
|
|
1617
|
+
{
|
|
1618
|
+
value: editorScope,
|
|
1619
|
+
onValueChange: (value) => {
|
|
1620
|
+
const nextScope = value;
|
|
1621
|
+
setEditorScope(nextScope);
|
|
1622
|
+
if (nextScope === "weekday") {
|
|
1639
1623
|
setEditorUnavailable(false);
|
|
1640
1624
|
setEditorNote("");
|
|
1641
1625
|
setEditorReasonEntryId(null);
|
|
1642
1626
|
setEditorReasonValue("");
|
|
1643
|
-
}
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1627
|
+
}
|
|
1628
|
+
},
|
|
1629
|
+
variant: "underline",
|
|
1630
|
+
children: /* @__PURE__ */ jsxs(TabsList, { "aria-label": listLabels.applyScopeLabel, children: [
|
|
1631
|
+
/* @__PURE__ */ jsx(TabsTrigger, { value: "date", children: listLabels.applyScopeDate }),
|
|
1632
|
+
/* @__PURE__ */ jsx(TabsTrigger, { value: "weekday", children: listLabels.editAllLabel })
|
|
1633
|
+
] })
|
|
1634
|
+
}
|
|
1635
|
+
) }),
|
|
1648
1636
|
editorScope === "date" ? /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
1649
1637
|
editorDates.map((value, index) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1650
1638
|
/* @__PURE__ */ jsx(
|