@open-mercato/core 0.6.8-develop.7101.1.bd9356828a → 0.7.1-develop.7102.1.b41f7e3e51
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 +1 -1
- package/dist/modules/auth/api/login.js +19 -0
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/routeError.js +11 -0
- package/dist/modules/auth/api/routeError.js.map +7 -0
- package/dist/modules/auth/api/users/acl/route.js +23 -7
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/[id]/page.meta.js +6 -1
- package/dist/modules/business_rules/backend/rules/[id]/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/create/page.meta.js +5 -1
- package/dist/modules/business_rules/backend/rules/create/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/[id]/page.meta.js +6 -1
- package/dist/modules/business_rules/backend/sets/[id]/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/create/page.meta.js +5 -1
- package/dist/modules/business_rules/backend/sets/create/page.meta.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js +84 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js +7 -81
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +525 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js +731 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +7 -727
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +7 -521
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customer_accounts/extension-points.js +1 -1
- package/dist/modules/customer_accounts/extension-points.js.map +2 -2
- package/dist/modules/customer_accounts/lib/portalUrl.js +69 -0
- package/dist/modules/customer_accounts/lib/portalUrl.js.map +7 -0
- package/dist/modules/customers/backend/customers/companies/page.js +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +2 -2
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/components/detail/AssignRoleDialog.js +33 -28
- package/dist/modules/customers/components/detail/AssignRoleDialog.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/page.meta.js +2 -2
- package/dist/modules/eudr/backend/eudr/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +8 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.js +8 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +2 -0
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +30 -25
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +2 -2
- package/dist/modules/eudr/commands/statements.js +5 -3
- package/dist/modules/eudr/commands/statements.js.map +2 -2
- package/dist/modules/eudr/components/crudErrorI18n.js +21 -1
- package/dist/modules/eudr/components/crudErrorI18n.js.map +2 -2
- package/dist/modules/eudr/components/formConfig.js +6 -2
- package/dist/modules/eudr/components/formConfig.js.map +2 -2
- package/dist/modules/eudr/lib/statement-lifecycle.js +9 -1
- package/dist/modules/eudr/lib/statement-lifecycle.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +1 -1
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +1 -1
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js +44 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +20 -16
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js +10 -6
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +11 -7
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +10 -6
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
- package/package.json +8 -8
- package/src/modules/auth/api/login.ts +23 -0
- package/src/modules/auth/api/routeError.ts +30 -0
- package/src/modules/auth/api/users/acl/route.ts +49 -9
- package/src/modules/business_rules/backend/rules/[id]/page.meta.ts +5 -0
- package/src/modules/business_rules/backend/rules/create/page.meta.ts +5 -1
- package/src/modules/business_rules/backend/sets/[id]/page.meta.ts +5 -0
- package/src/modules/business_rules/backend/sets/create/page.meta.ts +5 -1
- package/src/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.tsx +138 -0
- package/src/modules/customer_accounts/backend/customer_accounts/settings/page.tsx +8 -132
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +601 -0
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.tsx +838 -0
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +6 -838
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +6 -590
- package/src/modules/customer_accounts/extension-points.ts +1 -1
- package/src/modules/customer_accounts/lib/portalUrl.ts +112 -0
- package/src/modules/customers/backend/customers/companies/page.tsx +2 -2
- package/src/modules/customers/backend/customers/deals/page.tsx +2 -2
- package/src/modules/customers/backend/customers/people/page.tsx +2 -2
- package/src/modules/customers/components/detail/AssignRoleDialog.tsx +12 -7
- package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/page.meta.ts +2 -2
- package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +8 -2
- package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/plots/create/page.tsx +8 -2
- package/src/modules/eudr/backend/eudr/plots/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +2 -0
- package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/statements/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/statements/page.tsx +32 -26
- package/src/modules/eudr/commands/statements.ts +4 -2
- package/src/modules/eudr/components/crudErrorI18n.ts +31 -0
- package/src/modules/eudr/components/formConfig.tsx +9 -1
- package/src/modules/eudr/i18n/de.json +3 -2
- package/src/modules/eudr/i18n/en.json +3 -2
- package/src/modules/eudr/i18n/es.json +3 -2
- package/src/modules/eudr/i18n/ko.json +3 -2
- package/src/modules/eudr/i18n/pl.json +3 -2
- package/src/modules/eudr/lib/statement-lifecycle.ts +8 -0
- package/src/modules/sales/components/documents/LineItemDialog.tsx +1 -1
- package/src/modules/sales/i18n/de.json +37 -0
- package/src/modules/sales/i18n/en.json +37 -0
- package/src/modules/sales/i18n/es.json +37 -0
- package/src/modules/sales/i18n/ko.json +37 -0
- package/src/modules/sales/i18n/pl.json +37 -0
- package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +42 -2
- package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +30 -26
- package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +21 -17
- package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +17 -13
- package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +16 -12
|
@@ -172,8 +172,11 @@ function LookupSelectField({
|
|
|
172
172
|
cancelled = true;
|
|
173
173
|
};
|
|
174
174
|
}, [loadSelectedOption, selectedOption, selectedValue, translate]);
|
|
175
|
+
const hydratedValueRef = React.useRef(selectedValue);
|
|
175
176
|
React.useEffect(() => {
|
|
176
177
|
if (!onSnapshot || !selectedOption || selectedOption.unavailable) return;
|
|
178
|
+
if (hydratedValueRef.current === selectedOption.value) return;
|
|
179
|
+
hydratedValueRef.current = null;
|
|
177
180
|
onSnapshot(selectedOption.snapshot ?? null);
|
|
178
181
|
}, [onSnapshot, selectedOption]);
|
|
179
182
|
const selectedOptionRef = React.useRef(selectedOption);
|
|
@@ -476,7 +479,7 @@ function parseGeolocationInput(raw, translate) {
|
|
|
476
479
|
}
|
|
477
480
|
return parsed;
|
|
478
481
|
}
|
|
479
|
-
import { translateEudrCrudError } from "./crudErrorI18n.js";
|
|
482
|
+
import { translateEudrCrudError, translateEudrErrorMessage } from "./crudErrorI18n.js";
|
|
480
483
|
let referencedStatementRowKeySeq = 0;
|
|
481
484
|
function normalizeReferencedStatements(value) {
|
|
482
485
|
if (!Array.isArray(value)) return [];
|
|
@@ -588,6 +591,7 @@ export {
|
|
|
588
591
|
statementStatusOptions,
|
|
589
592
|
statusBadgeVariant,
|
|
590
593
|
submissionStatusOptions,
|
|
591
|
-
translateEudrCrudError
|
|
594
|
+
translateEudrCrudError,
|
|
595
|
+
translateEudrErrorMessage
|
|
592
596
|
};
|
|
593
597
|
//# sourceMappingURL=formConfig.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/eudr/components/formConfig.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { LookupSelect } from '@open-mercato/ui/backend/inputs'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport type { StatusBadgeVariant } from '@open-mercato/ui/primitives/status-badge'\nimport { Plus, Trash2 } from 'lucide-react'\nimport {\n EUDR_ACTIVITY_TYPES,\n EUDR_ACTOR_ROLES,\n EUDR_COMMODITIES,\n EUDR_STATEMENT_STATUSES,\n EUDR_SUBMISSION_STATUSES,\n GEOJSON_TYPES,\n type EudrActivityType,\n type EudrActorRole,\n type EudrCommodity,\n type EudrStatementStatus,\n type EudrSubmissionStatus,\n} from '../data/validators'\n\nexport type Translator = (\n key: string,\n fallbackOrParams?: string | Record<string, string | number>,\n params?: Record<string, string | number>,\n) => string\n\nexport type ProductSnapshot = {\n name?: string\n sku?: string\n}\n\nexport type CompanySnapshot = {\n displayName?: string\n}\n\nexport type OrderSnapshot = {\n orderNumber?: string | null\n}\n\nexport type ReferencedStatementValue = {\n referenceNumber: string\n verificationNumber?: string\n}\n\nexport type PickerOption<Snapshot extends Record<string, unknown>> = {\n value: string\n label: string\n subtitle?: string | null\n snapshot?: Snapshot | null\n unavailable?: boolean\n}\n\ntype PickerPayload = {\n items?: unknown[]\n}\n\ntype LookupSelectFieldProps<Snapshot extends Record<string, unknown>> = {\n id: string\n value?: string | null\n onChange: (value: string | undefined) => void\n onSnapshot?: (snapshot: Snapshot | null) => void\n placeholder: string\n emptyLabel?: string\n loadError: string\n disabled?: boolean\n loadOptions: (search: string) => Promise<PickerOption<Snapshot>[]>\n loadSelectedOption?: (id: string) => Promise<PickerOption<Snapshot> | null>\n}\n\nconst GEOJSON_SIZE_LIMIT = 1_048_576\nexport const PICKER_PAGE_SIZE = 20\n\nexport function commodityOptions(translate: Translator): Array<{ value: EudrCommodity; label: string }> {\n return EUDR_COMMODITIES.map((commodity) => ({\n value: commodity,\n label: translate(`eudr.commodity.${commodity}`),\n }))\n}\n\nexport function submissionStatusOptions(translate: Translator): Array<{ value: EudrSubmissionStatus; label: string }> {\n return EUDR_SUBMISSION_STATUSES.map((status) => ({\n value: status,\n label: translate(`eudr.submissionStatus.${status}`),\n }))\n}\n\nexport function statementStatusOptions(translate: Translator): Array<{ value: EudrStatementStatus; label: string }> {\n return EUDR_STATEMENT_STATUSES.map((status) => ({\n value: status,\n label: translate(`eudr.statementStatus.${status}`),\n }))\n}\n\nexport function activityTypeOptions(translate: Translator): Array<{ value: EudrActivityType; label: string }> {\n return EUDR_ACTIVITY_TYPES.map((activityType) => ({\n value: activityType,\n label: translate(`eudr.activityType.${activityType}`),\n }))\n}\n\nexport function actorRoleOptions(translate: Translator): Array<{ value: EudrActorRole; label: string }> {\n return EUDR_ACTOR_ROLES.map((actorRole) => ({\n value: actorRole,\n label: translate(`eudr.actorRole.${actorRole}`),\n }))\n}\n\nexport function statusBadgeVariant(\n status: EudrSubmissionStatus | EudrStatementStatus | string | null | undefined,\n): StatusBadgeVariant {\n if (status === 'submitted') return 'info'\n if (status === 'verified' || status === 'available') return 'success'\n if (status === 'rejected') return 'error'\n if (status === 'withdrawn') return 'warning'\n return 'neutral'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction readString(record: Record<string, unknown>, keys: string[]): string | null {\n for (const key of keys) {\n const value = record[key]\n if (typeof value !== 'string') continue\n const trimmed = value.trim()\n if (trimmed.length > 0) return trimmed\n }\n return null\n}\n\nfunction normalizeProductOption(raw: unknown): PickerOption<ProductSnapshot> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const title = readString(raw, ['title'])\n const sku = readString(raw, ['sku'])\n if (!title && !sku) return null\n const snapshot = {\n ...(title ? { name: title } : {}),\n ...(sku ? { sku } : {}),\n }\n return { value: id, label: title ?? sku ?? '', subtitle: title ? sku : null, snapshot }\n}\n\nfunction normalizeCompanyOption(raw: unknown): PickerOption<CompanySnapshot> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const displayName = readString(raw, ['display_name', 'displayName', 'name'])\n if (!displayName) return null\n return {\n value: id,\n label: displayName,\n snapshot: { displayName },\n }\n}\n\nfunction normalizeMappingOption(raw: unknown, translate: Translator): PickerOption<Record<string, unknown>> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const productSnapshot = isRecord(raw.productSnapshot) ? raw.productSnapshot : null\n const productName = productSnapshot ? readString(productSnapshot, ['name']) : null\n const productSku = productSnapshot ? readString(productSnapshot, ['sku']) : null\n const commodity = readString(raw, ['commodity'])\n const hsCode = readString(raw, ['hsCode'])\n const label = productName ?? productSku ?? translate('eudr.common.recordUnavailable')\n const subtitleSegments = [\n productName ? productSku : null,\n commodity ? translate(`eudr.commodity.${commodity}`) : null,\n hsCode,\n ].filter((segment): segment is string => typeof segment === 'string' && segment.length > 0)\n return { value: id, label, subtitle: subtitleSegments.length ? subtitleSegments.join(' - ') : null }\n}\n\nfunction normalizeStatementOption(raw: unknown, translate: Translator): PickerOption<Record<string, unknown>> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const title = readString(raw, ['title'])\n const referenceNumber = readString(raw, ['referenceNumber'])\n const label = title ?? referenceNumber ?? translate('eudr.common.recordUnavailable')\n return { value: id, label, subtitle: title ? referenceNumber : null }\n}\n\nexport function LookupSelectField<Snapshot extends Record<string, unknown>>({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n disabled,\n loadOptions,\n loadSelectedOption,\n}: LookupSelectFieldProps<Snapshot>) {\n const translate = useT()\n const selectedValue = typeof value === 'string' && value.length > 0 ? value : null\n const [selectedOption, setSelectedOption] = React.useState<PickerOption<Snapshot> | null>(null)\n const knownOptionsRef = React.useRef<Map<string, PickerOption<Snapshot>>>(new Map())\n\n React.useEffect(() => {\n if (!selectedValue) {\n setSelectedOption(null)\n return\n }\n if (selectedOption?.value === selectedValue) return\n const known = knownOptionsRef.current.get(selectedValue)\n if (known) {\n setSelectedOption(known)\n return\n }\n let cancelled = false\n const markUnavailable = () => {\n if (!cancelled) {\n setSelectedOption({\n value: selectedValue,\n label: translate('eudr.common.recordUnavailable'),\n unavailable: true,\n })\n }\n }\n if (!loadSelectedOption) {\n markUnavailable()\n return\n }\n loadSelectedOption(selectedValue)\n .then((resolved) => {\n if (cancelled) return\n if (resolved) {\n knownOptionsRef.current.set(resolved.value, resolved)\n setSelectedOption(resolved)\n } else {\n markUnavailable()\n }\n })\n .catch(markUnavailable)\n return () => {\n cancelled = true\n }\n }, [loadSelectedOption, selectedOption, selectedValue, translate])\n\n React.useEffect(() => {\n if (!onSnapshot || !selectedOption || selectedOption.unavailable) return\n onSnapshot(selectedOption.snapshot ?? null)\n }, [onSnapshot, selectedOption])\n\n const selectedOptionRef = React.useRef(selectedOption)\n React.useEffect(() => {\n selectedOptionRef.current = selectedOption\n }, [selectedOption])\n\n const setQueryRef = React.useRef<((value: string) => void) | null>(null)\n\n const fetchItems = React.useCallback(async (query: string) => {\n let options: Array<PickerOption<Snapshot>> = []\n try {\n options = await loadOptions(query)\n } catch (error) {\n const message = error instanceof Error && error.message ? error.message : loadError\n flash(message, 'error')\n options = []\n }\n for (const option of options) knownOptionsRef.current.set(option.value, option)\n const selected = selectedOptionRef.current\n const merged = selected && !options.some((option) => option.value === selected.value)\n ? [selected, ...options]\n : options\n return merged.map((option) => ({\n id: option.value,\n title: option.label,\n subtitle: option.subtitle ?? undefined,\n }))\n }, [loadError, loadOptions])\n\n return (\n <div id={id} className=\"space-y-2\">\n {selectedValue ? (\n <p className=\"text-sm text-foreground\">\n <span className=\"font-medium\">{selectedOption?.label ?? ''}</span>\n {selectedOption?.subtitle ? (\n <span className=\"text-muted-foreground\"> \u2014 {selectedOption.subtitle}</span>\n ) : null}\n </p>\n ) : null}\n <LookupSelect\n value={selectedValue}\n disabled={disabled}\n searchPlaceholder={placeholder}\n fetchItems={fetchItems}\n onReady={(controls) => { setQueryRef.current = controls.setQuery }}\n onChange={(nextValue) => {\n if (!nextValue) {\n onChange(undefined)\n onSnapshot?.(null)\n setSelectedOption(null)\n return\n }\n onChange(nextValue)\n const nextOption = knownOptionsRef.current.get(nextValue) ?? null\n setSelectedOption(nextOption)\n onSnapshot?.(nextOption?.snapshot ?? null)\n // Clearing the query drops LookupSelect back below its minQuery, which\n // collapses the result panel \u2014 otherwise it stays open over the form.\n setQueryRef.current?.('')\n }}\n />\n </div>\n )\n}\n\nexport function ProductSelectField({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<ProductSnapshot>, 'loadOptions' | 'loadSelectedOption' | 'emptyLabel'>) {\n const loadProductOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeProductOption(item))\n .filter((option): option is PickerOption<ProductSnapshot> => option !== null)\n }, [loadError])\n\n const loadSelectedProduct = React.useCallback(async (productId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?id=${encodeURIComponent(productId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeProductOption(item))\n .find((option): option is PickerOption<ProductSnapshot> => option?.value === productId) ?? null\n }, [loadError])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n onSnapshot={onSnapshot}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadProductOptions}\n loadSelectedOption={loadSelectedProduct}\n />\n )\n}\n\nexport function CompanySelectField({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<CompanySnapshot>, 'loadOptions' | 'loadSelectedOption' | 'emptyLabel'>) {\n const loadCompanyOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({\n page: '1',\n pageSize: String(PICKER_PAGE_SIZE),\n sortField: 'name',\n sortDir: 'asc',\n })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/customers/companies?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeCompanyOption(item))\n .filter((option): option is PickerOption<CompanySnapshot> => option !== null)\n }, [loadError])\n\n const loadSelectedCompany = React.useCallback(async (companyId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/customers/companies?id=${encodeURIComponent(companyId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeCompanyOption(item))\n .find((option): option is PickerOption<CompanySnapshot> => option?.value === companyId) ?? null\n }, [loadError])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n onSnapshot={onSnapshot}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadCompanyOptions}\n loadSelectedOption={loadSelectedCompany}\n />\n )\n}\n\nfunction collectProductIds(items: unknown[]): string[] {\n const ids: string[] = []\n for (const item of items) {\n if (!isRecord(item)) continue\n const id = readString(item, ['id'])\n if (id) ids.push(id)\n }\n return ids\n}\n\nexport function MappingSelectField({\n id,\n value,\n onChange,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<Record<string, unknown>>, 'loadOptions' | 'loadSelectedOption' | 'onSnapshot'>) {\n const translate = useT()\n const loadMappingOptions = React.useCallback(async (search: string) => {\n const mappingParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (!search) {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${mappingParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeMappingOption(item, translate))\n .filter((option): option is PickerOption<Record<string, unknown>> => option !== null)\n }\n const productParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE), search })\n const directParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE), search })\n const [productsPayload, directPayload] = await Promise.all([\n readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?${productParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n ),\n readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${directParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n ),\n ])\n const productIds = collectProductIds(Array.isArray(productsPayload.items) ? productsPayload.items : [])\n let byProductItems: unknown[] = []\n if (productIds.length) {\n const byProductParams = new URLSearchParams({\n page: '1',\n pageSize: String(PICKER_PAGE_SIZE),\n productId: productIds.join(','),\n })\n const byProductPayload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${byProductParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n byProductItems = Array.isArray(byProductPayload.items) ? byProductPayload.items : []\n }\n const directItems = Array.isArray(directPayload.items) ? directPayload.items : []\n const merged = new Map<string, PickerOption<Record<string, unknown>>>()\n for (const item of [...byProductItems, ...directItems]) {\n const option = normalizeMappingOption(item, translate)\n if (option && !merged.has(option.value)) merged.set(option.value, option)\n }\n return Array.from(merged.values())\n }, [loadError, translate])\n\n const loadSelectedMapping = React.useCallback(async (mappingId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?id=${encodeURIComponent(mappingId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeMappingOption(item, translate))\n .find((option): option is PickerOption<Record<string, unknown>> => option?.value === mappingId) ?? null\n }, [loadError, translate])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadMappingOptions}\n loadSelectedOption={loadSelectedMapping}\n />\n )\n}\n\nexport function StatementSelectField({\n id,\n value,\n onChange,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<Record<string, unknown>>, 'loadOptions' | 'loadSelectedOption' | 'onSnapshot'>) {\n const translate = useT()\n const loadStatementOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/statements?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeStatementOption(item, translate))\n .filter((option): option is PickerOption<Record<string, unknown>> => option !== null)\n }, [loadError, translate])\n\n const loadSelectedStatement = React.useCallback(async (statementId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/statements?id=${encodeURIComponent(statementId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeStatementOption(item, translate))\n .find((option): option is PickerOption<Record<string, unknown>> => option?.value === statementId) ?? null\n }, [loadError, translate])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadStatementOptions}\n loadSelectedOption={loadSelectedStatement}\n />\n )\n}\n\nexport function parseGeolocationInput(raw: string, translate: Translator): Record<string, unknown> | null {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n let parsed: unknown\n try {\n parsed = JSON.parse(trimmed)\n } catch {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n if (!isRecord(parsed)) {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n const geoJsonType = parsed.type\n if (\n typeof geoJsonType !== 'string' ||\n !GEOJSON_TYPES.some((allowedType) => allowedType === geoJsonType)\n ) {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n if (JSON.stringify(parsed).length > GEOJSON_SIZE_LIMIT) {\n const message = translate('eudr.errors.geolocationTooLarge')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n return parsed\n}\n\nexport { translateEudrCrudError } from './crudErrorI18n'\n\nlet referencedStatementRowKeySeq = 0\n\nfunction normalizeReferencedStatements(value: unknown): ReferencedStatementValue[] {\n if (!Array.isArray(value)) return []\n return value\n .map((entry) => {\n if (!isRecord(entry)) return null\n const referenceNumber = readString(entry, ['referenceNumber']) ?? ''\n const verificationNumber = readString(entry, ['verificationNumber']) ?? ''\n return verificationNumber\n ? { referenceNumber, verificationNumber }\n : { referenceNumber }\n })\n .filter((entry): entry is ReferencedStatementValue => entry !== null)\n}\n\nexport function ReferencedStatementsField({\n id,\n value,\n onChange,\n disabled,\n}: {\n id: string\n value: ReferencedStatementValue[] | unknown\n onChange: (value: ReferencedStatementValue[]) => void\n disabled?: boolean\n}) {\n const translate = useT()\n const rows = React.useMemo(() => normalizeReferencedStatements(value), [value])\n const hasIncompleteRows = rows.some((row) => row.referenceNumber.trim().length === 0)\n\n const updateRow = React.useCallback((index: number, patch: Partial<ReferencedStatementValue>) => {\n const nextRows = rows.map((row, rowIndex) => {\n if (rowIndex !== index) return row\n const referenceNumber = patch.referenceNumber ?? row.referenceNumber\n const verificationNumber = patch.verificationNumber ?? row.verificationNumber ?? ''\n return verificationNumber.trim()\n ? { referenceNumber, verificationNumber }\n : { referenceNumber }\n })\n onChange(nextRows)\n }, [onChange, rows])\n\n // Row identity lives outside the persisted value (which is the API's\n // [{referenceNumber, verificationNumber?}] contract), so keys are tracked\n // alongside it. Indexes as keys make React reuse the wrong input when a middle\n // row is removed, which steals focus from the row that shifts up.\n const rowKeysRef = React.useRef<string[]>([])\n if (rowKeysRef.current.length < rows.length) {\n const nextKeys = [...rowKeysRef.current]\n while (nextKeys.length < rows.length) {\n referencedStatementRowKeySeq += 1\n nextKeys.push(`referenced-statement-${referencedStatementRowKeySeq}`)\n }\n rowKeysRef.current = nextKeys\n } else if (rowKeysRef.current.length > rows.length) {\n rowKeysRef.current = rowKeysRef.current.slice(0, rows.length)\n }\n const rowKeys = rowKeysRef.current\n\n const removeRow = React.useCallback((index: number) => {\n rowKeysRef.current = rowKeysRef.current.filter((_, keyIndex) => keyIndex !== index)\n onChange(rows.filter((_, rowIndex) => rowIndex !== index))\n }, [onChange, rows])\n\n return (\n <div id={id} className=\"space-y-3\">\n {rows.length > 0 ? (\n <div className=\"space-y-2\">\n {rows.map((row, index) => (\n <div key={rowKeys[index]} className=\"grid gap-2 md:grid-cols-[1fr_1fr_auto]\">\n <Input\n value={row.referenceNumber}\n disabled={disabled}\n placeholder={translate('eudr.statements.form.referenceNumber')}\n onChange={(event) => updateRow(index, { referenceNumber: event.target.value })}\n />\n <Input\n value={row.verificationNumber ?? ''}\n disabled={disabled}\n placeholder={translate('eudr.statements.form.verificationNumber')}\n onChange={(event) => updateRow(index, { verificationNumber: event.target.value })}\n />\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n disabled={disabled}\n aria-label={translate('eudr.statements.form.removeReferencedStatement')}\n onClick={() => removeRow(index)}\n >\n <Trash2 className=\"size-4\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n {translate('eudr.statements.form.noReferencedStatements')}\n </p>\n )}\n {hasIncompleteRows ? (\n <p className=\"text-sm text-status-warning-text\">\n {translate('eudr.statements.form.referencedStatementsValidation')}\n </p>\n ) : null}\n <IconButton\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n aria-label={translate('eudr.statements.form.addReferencedStatement')}\n onClick={() => onChange([...rows, { referenceNumber: '' }])}\n >\n <Plus className=\"size-4\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n )\n}\n\nexport { CountrySelectField } from './CountrySelectField'\nexport { OrderSelectField } from './OrderSelectField'\nexport { PlotMultiSelectField } from './PlotMultiSelectField'\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { LookupSelect } from '@open-mercato/ui/backend/inputs'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport type { StatusBadgeVariant } from '@open-mercato/ui/primitives/status-badge'\nimport { Plus, Trash2 } from 'lucide-react'\nimport {\n EUDR_ACTIVITY_TYPES,\n EUDR_ACTOR_ROLES,\n EUDR_COMMODITIES,\n EUDR_STATEMENT_STATUSES,\n EUDR_SUBMISSION_STATUSES,\n GEOJSON_TYPES,\n type EudrActivityType,\n type EudrActorRole,\n type EudrCommodity,\n type EudrStatementStatus,\n type EudrSubmissionStatus,\n} from '../data/validators'\n\nexport type Translator = (\n key: string,\n fallbackOrParams?: string | Record<string, string | number>,\n params?: Record<string, string | number>,\n) => string\n\nexport type ProductSnapshot = {\n name?: string\n sku?: string\n}\n\nexport type CompanySnapshot = {\n displayName?: string\n}\n\nexport type OrderSnapshot = {\n orderNumber?: string | null\n}\n\nexport type ReferencedStatementValue = {\n referenceNumber: string\n verificationNumber?: string\n}\n\nexport type PickerOption<Snapshot extends Record<string, unknown>> = {\n value: string\n label: string\n subtitle?: string | null\n snapshot?: Snapshot | null\n unavailable?: boolean\n}\n\ntype PickerPayload = {\n items?: unknown[]\n}\n\ntype LookupSelectFieldProps<Snapshot extends Record<string, unknown>> = {\n id: string\n value?: string | null\n onChange: (value: string | undefined) => void\n onSnapshot?: (snapshot: Snapshot | null) => void\n placeholder: string\n emptyLabel?: string\n loadError: string\n disabled?: boolean\n loadOptions: (search: string) => Promise<PickerOption<Snapshot>[]>\n loadSelectedOption?: (id: string) => Promise<PickerOption<Snapshot> | null>\n}\n\nconst GEOJSON_SIZE_LIMIT = 1_048_576\nexport const PICKER_PAGE_SIZE = 20\n\nexport function commodityOptions(translate: Translator): Array<{ value: EudrCommodity; label: string }> {\n return EUDR_COMMODITIES.map((commodity) => ({\n value: commodity,\n label: translate(`eudr.commodity.${commodity}`),\n }))\n}\n\nexport function submissionStatusOptions(translate: Translator): Array<{ value: EudrSubmissionStatus; label: string }> {\n return EUDR_SUBMISSION_STATUSES.map((status) => ({\n value: status,\n label: translate(`eudr.submissionStatus.${status}`),\n }))\n}\n\nexport function statementStatusOptions(translate: Translator): Array<{ value: EudrStatementStatus; label: string }> {\n return EUDR_STATEMENT_STATUSES.map((status) => ({\n value: status,\n label: translate(`eudr.statementStatus.${status}`),\n }))\n}\n\nexport function activityTypeOptions(translate: Translator): Array<{ value: EudrActivityType; label: string }> {\n return EUDR_ACTIVITY_TYPES.map((activityType) => ({\n value: activityType,\n label: translate(`eudr.activityType.${activityType}`),\n }))\n}\n\nexport function actorRoleOptions(translate: Translator): Array<{ value: EudrActorRole; label: string }> {\n return EUDR_ACTOR_ROLES.map((actorRole) => ({\n value: actorRole,\n label: translate(`eudr.actorRole.${actorRole}`),\n }))\n}\n\nexport function statusBadgeVariant(\n status: EudrSubmissionStatus | EudrStatementStatus | string | null | undefined,\n): StatusBadgeVariant {\n if (status === 'submitted') return 'info'\n if (status === 'verified' || status === 'available') return 'success'\n if (status === 'rejected') return 'error'\n if (status === 'withdrawn') return 'warning'\n return 'neutral'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction readString(record: Record<string, unknown>, keys: string[]): string | null {\n for (const key of keys) {\n const value = record[key]\n if (typeof value !== 'string') continue\n const trimmed = value.trim()\n if (trimmed.length > 0) return trimmed\n }\n return null\n}\n\nfunction normalizeProductOption(raw: unknown): PickerOption<ProductSnapshot> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const title = readString(raw, ['title'])\n const sku = readString(raw, ['sku'])\n if (!title && !sku) return null\n const snapshot = {\n ...(title ? { name: title } : {}),\n ...(sku ? { sku } : {}),\n }\n return { value: id, label: title ?? sku ?? '', subtitle: title ? sku : null, snapshot }\n}\n\nfunction normalizeCompanyOption(raw: unknown): PickerOption<CompanySnapshot> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const displayName = readString(raw, ['display_name', 'displayName', 'name'])\n if (!displayName) return null\n return {\n value: id,\n label: displayName,\n snapshot: { displayName },\n }\n}\n\nfunction normalizeMappingOption(raw: unknown, translate: Translator): PickerOption<Record<string, unknown>> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const productSnapshot = isRecord(raw.productSnapshot) ? raw.productSnapshot : null\n const productName = productSnapshot ? readString(productSnapshot, ['name']) : null\n const productSku = productSnapshot ? readString(productSnapshot, ['sku']) : null\n const commodity = readString(raw, ['commodity'])\n const hsCode = readString(raw, ['hsCode'])\n const label = productName ?? productSku ?? translate('eudr.common.recordUnavailable')\n const subtitleSegments = [\n productName ? productSku : null,\n commodity ? translate(`eudr.commodity.${commodity}`) : null,\n hsCode,\n ].filter((segment): segment is string => typeof segment === 'string' && segment.length > 0)\n return { value: id, label, subtitle: subtitleSegments.length ? subtitleSegments.join(' - ') : null }\n}\n\nfunction normalizeStatementOption(raw: unknown, translate: Translator): PickerOption<Record<string, unknown>> | null {\n if (!isRecord(raw)) return null\n const id = readString(raw, ['id'])\n if (!id) return null\n const title = readString(raw, ['title'])\n const referenceNumber = readString(raw, ['referenceNumber'])\n const label = title ?? referenceNumber ?? translate('eudr.common.recordUnavailable')\n return { value: id, label, subtitle: title ? referenceNumber : null }\n}\n\nexport function LookupSelectField<Snapshot extends Record<string, unknown>>({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n disabled,\n loadOptions,\n loadSelectedOption,\n}: LookupSelectFieldProps<Snapshot>) {\n const translate = useT()\n const selectedValue = typeof value === 'string' && value.length > 0 ? value : null\n const [selectedOption, setSelectedOption] = React.useState<PickerOption<Snapshot> | null>(null)\n const knownOptionsRef = React.useRef<Map<string, PickerOption<Snapshot>>>(new Map())\n\n React.useEffect(() => {\n if (!selectedValue) {\n setSelectedOption(null)\n return\n }\n if (selectedOption?.value === selectedValue) return\n const known = knownOptionsRef.current.get(selectedValue)\n if (known) {\n setSelectedOption(known)\n return\n }\n let cancelled = false\n const markUnavailable = () => {\n if (!cancelled) {\n setSelectedOption({\n value: selectedValue,\n label: translate('eudr.common.recordUnavailable'),\n unavailable: true,\n })\n }\n }\n if (!loadSelectedOption) {\n markUnavailable()\n return\n }\n loadSelectedOption(selectedValue)\n .then((resolved) => {\n if (cancelled) return\n if (resolved) {\n knownOptionsRef.current.set(resolved.value, resolved)\n setSelectedOption(resolved)\n } else {\n markUnavailable()\n }\n })\n .catch(markUnavailable)\n return () => {\n cancelled = true\n }\n }, [loadSelectedOption, selectedOption, selectedValue, translate])\n\n // A snapshot is a denormalization captured when the user picks a record, so resolving the\n // value an edit form was hydrated with must not re-emit it. Doing so overwrites the stored\n // snapshot with a freshly fetched one, which makes an untouched CrudForm look dirty and\n // raises the \"You have unsaved changes\" prompt on the way out.\n const hydratedValueRef = React.useRef<string | null>(selectedValue)\n\n React.useEffect(() => {\n if (!onSnapshot || !selectedOption || selectedOption.unavailable) return\n if (hydratedValueRef.current === selectedOption.value) return\n hydratedValueRef.current = null\n onSnapshot(selectedOption.snapshot ?? null)\n }, [onSnapshot, selectedOption])\n\n const selectedOptionRef = React.useRef(selectedOption)\n React.useEffect(() => {\n selectedOptionRef.current = selectedOption\n }, [selectedOption])\n\n const setQueryRef = React.useRef<((value: string) => void) | null>(null)\n\n const fetchItems = React.useCallback(async (query: string) => {\n let options: Array<PickerOption<Snapshot>> = []\n try {\n options = await loadOptions(query)\n } catch (error) {\n const message = error instanceof Error && error.message ? error.message : loadError\n flash(message, 'error')\n options = []\n }\n for (const option of options) knownOptionsRef.current.set(option.value, option)\n const selected = selectedOptionRef.current\n const merged = selected && !options.some((option) => option.value === selected.value)\n ? [selected, ...options]\n : options\n return merged.map((option) => ({\n id: option.value,\n title: option.label,\n subtitle: option.subtitle ?? undefined,\n }))\n }, [loadError, loadOptions])\n\n return (\n <div id={id} className=\"space-y-2\">\n {selectedValue ? (\n <p className=\"text-sm text-foreground\">\n <span className=\"font-medium\">{selectedOption?.label ?? ''}</span>\n {selectedOption?.subtitle ? (\n <span className=\"text-muted-foreground\"> \u2014 {selectedOption.subtitle}</span>\n ) : null}\n </p>\n ) : null}\n <LookupSelect\n value={selectedValue}\n disabled={disabled}\n searchPlaceholder={placeholder}\n fetchItems={fetchItems}\n onReady={(controls) => { setQueryRef.current = controls.setQuery }}\n onChange={(nextValue) => {\n if (!nextValue) {\n onChange(undefined)\n onSnapshot?.(null)\n setSelectedOption(null)\n return\n }\n onChange(nextValue)\n const nextOption = knownOptionsRef.current.get(nextValue) ?? null\n setSelectedOption(nextOption)\n onSnapshot?.(nextOption?.snapshot ?? null)\n // Clearing the query drops LookupSelect back below its minQuery, which\n // collapses the result panel \u2014 otherwise it stays open over the form.\n setQueryRef.current?.('')\n }}\n />\n </div>\n )\n}\n\nexport function ProductSelectField({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<ProductSnapshot>, 'loadOptions' | 'loadSelectedOption' | 'emptyLabel'>) {\n const loadProductOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeProductOption(item))\n .filter((option): option is PickerOption<ProductSnapshot> => option !== null)\n }, [loadError])\n\n const loadSelectedProduct = React.useCallback(async (productId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?id=${encodeURIComponent(productId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeProductOption(item))\n .find((option): option is PickerOption<ProductSnapshot> => option?.value === productId) ?? null\n }, [loadError])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n onSnapshot={onSnapshot}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadProductOptions}\n loadSelectedOption={loadSelectedProduct}\n />\n )\n}\n\nexport function CompanySelectField({\n id,\n value,\n onChange,\n onSnapshot,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<CompanySnapshot>, 'loadOptions' | 'loadSelectedOption' | 'emptyLabel'>) {\n const loadCompanyOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({\n page: '1',\n pageSize: String(PICKER_PAGE_SIZE),\n sortField: 'name',\n sortDir: 'asc',\n })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/customers/companies?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeCompanyOption(item))\n .filter((option): option is PickerOption<CompanySnapshot> => option !== null)\n }, [loadError])\n\n const loadSelectedCompany = React.useCallback(async (companyId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/customers/companies?id=${encodeURIComponent(companyId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeCompanyOption(item))\n .find((option): option is PickerOption<CompanySnapshot> => option?.value === companyId) ?? null\n }, [loadError])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n onSnapshot={onSnapshot}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadCompanyOptions}\n loadSelectedOption={loadSelectedCompany}\n />\n )\n}\n\nfunction collectProductIds(items: unknown[]): string[] {\n const ids: string[] = []\n for (const item of items) {\n if (!isRecord(item)) continue\n const id = readString(item, ['id'])\n if (id) ids.push(id)\n }\n return ids\n}\n\nexport function MappingSelectField({\n id,\n value,\n onChange,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<Record<string, unknown>>, 'loadOptions' | 'loadSelectedOption' | 'onSnapshot'>) {\n const translate = useT()\n const loadMappingOptions = React.useCallback(async (search: string) => {\n const mappingParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (!search) {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${mappingParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeMappingOption(item, translate))\n .filter((option): option is PickerOption<Record<string, unknown>> => option !== null)\n }\n const productParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE), search })\n const directParams = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE), search })\n const [productsPayload, directPayload] = await Promise.all([\n readApiResultOrThrow<PickerPayload>(\n `/api/catalog/products?${productParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n ),\n readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${directParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n ),\n ])\n const productIds = collectProductIds(Array.isArray(productsPayload.items) ? productsPayload.items : [])\n let byProductItems: unknown[] = []\n if (productIds.length) {\n const byProductParams = new URLSearchParams({\n page: '1',\n pageSize: String(PICKER_PAGE_SIZE),\n productId: productIds.join(','),\n })\n const byProductPayload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?${byProductParams.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n byProductItems = Array.isArray(byProductPayload.items) ? byProductPayload.items : []\n }\n const directItems = Array.isArray(directPayload.items) ? directPayload.items : []\n const merged = new Map<string, PickerOption<Record<string, unknown>>>()\n for (const item of [...byProductItems, ...directItems]) {\n const option = normalizeMappingOption(item, translate)\n if (option && !merged.has(option.value)) merged.set(option.value, option)\n }\n return Array.from(merged.values())\n }, [loadError, translate])\n\n const loadSelectedMapping = React.useCallback(async (mappingId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/product-mappings?id=${encodeURIComponent(mappingId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeMappingOption(item, translate))\n .find((option): option is PickerOption<Record<string, unknown>> => option?.value === mappingId) ?? null\n }, [loadError, translate])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadMappingOptions}\n loadSelectedOption={loadSelectedMapping}\n />\n )\n}\n\nexport function StatementSelectField({\n id,\n value,\n onChange,\n placeholder,\n loadError,\n}: Omit<LookupSelectFieldProps<Record<string, unknown>>, 'loadOptions' | 'loadSelectedOption' | 'onSnapshot'>) {\n const translate = useT()\n const loadStatementOptions = React.useCallback(async (search: string) => {\n const params = new URLSearchParams({ page: '1', pageSize: String(PICKER_PAGE_SIZE) })\n if (search) params.set('search', search)\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/statements?${params.toString()}`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeStatementOption(item, translate))\n .filter((option): option is PickerOption<Record<string, unknown>> => option !== null)\n }, [loadError, translate])\n\n const loadSelectedStatement = React.useCallback(async (statementId: string) => {\n const payload = await readApiResultOrThrow<PickerPayload>(\n `/api/eudr/statements?id=${encodeURIComponent(statementId)}&pageSize=1`,\n undefined,\n { errorMessage: loadError },\n )\n const items = Array.isArray(payload.items) ? payload.items : []\n return items\n .map((item) => normalizeStatementOption(item, translate))\n .find((option): option is PickerOption<Record<string, unknown>> => option?.value === statementId) ?? null\n }, [loadError, translate])\n\n return (\n <LookupSelectField\n id={id}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n loadError={loadError}\n loadOptions={loadStatementOptions}\n loadSelectedOption={loadSelectedStatement}\n />\n )\n}\n\nexport function parseGeolocationInput(raw: string, translate: Translator): Record<string, unknown> | null {\n const trimmed = raw.trim()\n if (!trimmed) return null\n\n let parsed: unknown\n try {\n parsed = JSON.parse(trimmed)\n } catch {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n if (!isRecord(parsed)) {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n const geoJsonType = parsed.type\n if (\n typeof geoJsonType !== 'string' ||\n !GEOJSON_TYPES.some((allowedType) => allowedType === geoJsonType)\n ) {\n const message = translate('eudr.errors.geolocationInvalid')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n if (JSON.stringify(parsed).length > GEOJSON_SIZE_LIMIT) {\n const message = translate('eudr.errors.geolocationTooLarge')\n throw createCrudFormError(message, { geolocation: message })\n }\n\n return parsed\n}\n\nexport { translateEudrCrudError, translateEudrErrorMessage } from './crudErrorI18n'\n\nlet referencedStatementRowKeySeq = 0\n\nfunction normalizeReferencedStatements(value: unknown): ReferencedStatementValue[] {\n if (!Array.isArray(value)) return []\n return value\n .map((entry) => {\n if (!isRecord(entry)) return null\n const referenceNumber = readString(entry, ['referenceNumber']) ?? ''\n const verificationNumber = readString(entry, ['verificationNumber']) ?? ''\n return verificationNumber\n ? { referenceNumber, verificationNumber }\n : { referenceNumber }\n })\n .filter((entry): entry is ReferencedStatementValue => entry !== null)\n}\n\nexport function ReferencedStatementsField({\n id,\n value,\n onChange,\n disabled,\n}: {\n id: string\n value: ReferencedStatementValue[] | unknown\n onChange: (value: ReferencedStatementValue[]) => void\n disabled?: boolean\n}) {\n const translate = useT()\n const rows = React.useMemo(() => normalizeReferencedStatements(value), [value])\n const hasIncompleteRows = rows.some((row) => row.referenceNumber.trim().length === 0)\n\n const updateRow = React.useCallback((index: number, patch: Partial<ReferencedStatementValue>) => {\n const nextRows = rows.map((row, rowIndex) => {\n if (rowIndex !== index) return row\n const referenceNumber = patch.referenceNumber ?? row.referenceNumber\n const verificationNumber = patch.verificationNumber ?? row.verificationNumber ?? ''\n return verificationNumber.trim()\n ? { referenceNumber, verificationNumber }\n : { referenceNumber }\n })\n onChange(nextRows)\n }, [onChange, rows])\n\n // Row identity lives outside the persisted value (which is the API's\n // [{referenceNumber, verificationNumber?}] contract), so keys are tracked\n // alongside it. Indexes as keys make React reuse the wrong input when a middle\n // row is removed, which steals focus from the row that shifts up.\n const rowKeysRef = React.useRef<string[]>([])\n if (rowKeysRef.current.length < rows.length) {\n const nextKeys = [...rowKeysRef.current]\n while (nextKeys.length < rows.length) {\n referencedStatementRowKeySeq += 1\n nextKeys.push(`referenced-statement-${referencedStatementRowKeySeq}`)\n }\n rowKeysRef.current = nextKeys\n } else if (rowKeysRef.current.length > rows.length) {\n rowKeysRef.current = rowKeysRef.current.slice(0, rows.length)\n }\n const rowKeys = rowKeysRef.current\n\n const removeRow = React.useCallback((index: number) => {\n rowKeysRef.current = rowKeysRef.current.filter((_, keyIndex) => keyIndex !== index)\n onChange(rows.filter((_, rowIndex) => rowIndex !== index))\n }, [onChange, rows])\n\n return (\n <div id={id} className=\"space-y-3\">\n {rows.length > 0 ? (\n <div className=\"space-y-2\">\n {rows.map((row, index) => (\n <div key={rowKeys[index]} className=\"grid gap-2 md:grid-cols-[1fr_1fr_auto]\">\n <Input\n value={row.referenceNumber}\n disabled={disabled}\n placeholder={translate('eudr.statements.form.referenceNumber')}\n onChange={(event) => updateRow(index, { referenceNumber: event.target.value })}\n />\n <Input\n value={row.verificationNumber ?? ''}\n disabled={disabled}\n placeholder={translate('eudr.statements.form.verificationNumber')}\n onChange={(event) => updateRow(index, { verificationNumber: event.target.value })}\n />\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n disabled={disabled}\n aria-label={translate('eudr.statements.form.removeReferencedStatement')}\n onClick={() => removeRow(index)}\n >\n <Trash2 className=\"size-4\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n {translate('eudr.statements.form.noReferencedStatements')}\n </p>\n )}\n {hasIncompleteRows ? (\n <p className=\"text-sm text-status-warning-text\">\n {translate('eudr.statements.form.referencedStatementsValidation')}\n </p>\n ) : null}\n <IconButton\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n aria-label={translate('eudr.statements.form.addReferencedStatement')}\n onClick={() => onChange([...rows, { referenceNumber: '' }])}\n >\n <Plus className=\"size-4\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n )\n}\n\nexport { CountrySelectField } from './CountrySelectField'\nexport { OrderSelectField } from './OrderSelectField'\nexport { PlotMultiSelectField } from './PlotMultiSelectField'\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -9,6 +9,12 @@ const EUDR_STATEMENT_TRANSITIONS = {
|
|
|
9
9
|
function canTransition(from, to) {
|
|
10
10
|
return EUDR_STATEMENT_TRANSITIONS[from].includes(to);
|
|
11
11
|
}
|
|
12
|
+
function isStatementReadOnly(status) {
|
|
13
|
+
return status === "archived";
|
|
14
|
+
}
|
|
15
|
+
function canDeleteStatement(status) {
|
|
16
|
+
return !isStatementReadOnly(status);
|
|
17
|
+
}
|
|
12
18
|
const EUDR_AMEND_GUARDED_FIELDS = [
|
|
13
19
|
"commodity",
|
|
14
20
|
"quantityKg",
|
|
@@ -77,8 +83,10 @@ export {
|
|
|
77
83
|
EUDR_AMEND_GUARDED_FIELDS,
|
|
78
84
|
EUDR_AMEND_WINDOW_MS,
|
|
79
85
|
EUDR_STATEMENT_TRANSITIONS,
|
|
86
|
+
canDeleteStatement,
|
|
80
87
|
canTransition,
|
|
81
88
|
evaluateSubmissionGate,
|
|
82
|
-
isAmendWindowOpen
|
|
89
|
+
isAmendWindowOpen,
|
|
90
|
+
isStatementReadOnly
|
|
83
91
|
};
|
|
84
92
|
//# sourceMappingURL=statement-lifecycle.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/eudr/lib/statement-lifecycle.ts"],
|
|
4
|
-
"sourcesContent": ["import type { EudrStatementStatus } from '../data/validators'\nimport { getCountryRiskTier } from './reference-data'\n\nexport const EUDR_STATEMENT_TRANSITIONS: Record<EudrStatementStatus, readonly EudrStatementStatus[]> = {\n draft: ['submitted', 'archived'],\n submitted: ['draft', 'available', 'archived'],\n available: ['withdrawn', 'archived'],\n withdrawn: ['archived'],\n archived: [],\n}\n\nexport function canTransition(from: EudrStatementStatus, to: EudrStatementStatus): boolean {\n return EUDR_STATEMENT_TRANSITIONS[from].includes(to)\n}\n\nexport const EUDR_AMEND_GUARDED_FIELDS = [\n 'commodity',\n 'quantityKg',\n 'supplementaryUnit',\n 'supplementaryQuantity',\n 'referencedStatements',\n 'orderId',\n] as const\n\nexport const EUDR_AMEND_WINDOW_MS = 72 * 60 * 60 * 1000\n\nexport function isAmendWindowOpen(referenceIssuedAt: Date | null | undefined, now: Date = new Date()): boolean {\n if (referenceIssuedAt == null) return false\n const issuedAtMs = referenceIssuedAt.getTime()\n if (Number.isNaN(issuedAtMs)) return false\n const elapsedMs = now.getTime() - issuedAtMs\n return elapsedMs >= 0 && elapsedMs <= EUDR_AMEND_WINDOW_MS\n}\n\nexport type GateSubmissionView = { status: string; completenessScore: number; originCountry: string | null }\nexport type GateAssessmentView = {\n conclusion: string\n countryRisks: Array<{ country: string; tier: string }>\n reviewDueAt: Date | string | null\n hasConcernAnswers: boolean\n hasCompletedMitigation: boolean\n} | null\nexport type GateResult = { allowed: boolean; reasons: string[] }\n\nfunction normalizeCountry(value: string | null): string | null {\n const normalized = value?.trim().toUpperCase() ?? ''\n return normalized.length > 0 ? normalized : null\n}\n\nfunction parseDate(value: Date | string | null): Date | null {\n if (value == null) return null\n const date = value instanceof Date ? value : new Date(value)\n return Number.isNaN(date.getTime()) ? null : date\n}\n\nfunction hasSameCountries(left: Set<string>, right: Set<string>): boolean {\n if (left.size !== right.size) return false\n for (const country of left) {\n if (!right.has(country)) return false\n }\n return true\n}\n\nexport function evaluateSubmissionGate(input: {\n actorRole: string | null\n referencedStatementsCount: number\n submissions: GateSubmissionView[]\n latestAssessment: GateAssessmentView\n now?: Date\n}): GateResult {\n const reasons: string[] = []\n\n if (input.actorRole === 'sme_trader') {\n if (input.referencedStatementsCount < 1) reasons.push('referencedStatementsRequired')\n return { allowed: reasons.length === 0, reasons }\n }\n\n if (input.submissions.length === 0) reasons.push('noSubmissions')\n if (input.submissions.some((submission) => submission.status !== 'verified' || submission.completenessScore !== 100)) {\n reasons.push('submissionsNotReady')\n }\n if (input.submissions.some((submission) => normalizeCountry(submission.originCountry) === null)) {\n reasons.push('originCountryMissing')\n }\n\n const currentCountries = new Set(\n input.submissions\n .map((submission) => normalizeCountry(submission.originCountry))\n .filter((country): country is string => country !== null),\n )\n const allCountriesPresent = input.submissions.length > 0 && input.submissions.every((submission) => normalizeCountry(submission.originCountry) !== null)\n const tiers = [...currentCountries].map((country) => getCountryRiskTier(country))\n const simplifiedDueDiligenceSatisfied = allCountriesPresent && tiers.length > 0 && tiers.every((tier) => tier === 'low')\n\n if (!simplifiedDueDiligenceSatisfied) {\n const assessment = input.latestAssessment\n if (assessment == null || assessment.conclusion !== 'negligible') reasons.push('riskConclusionMissing')\n if (assessment != null) {\n const assessedCountries = new Set(assessment.countryRisks.map((risk) => risk.country.trim().toUpperCase()).filter((country) => country.length > 0))\n if (!hasSameCountries(currentCountries, assessedCountries)) reasons.push('riskAssessmentStale')\n\n const reviewDueAt = parseDate(assessment.reviewDueAt)\n if (reviewDueAt !== null && reviewDueAt.getTime() < (input.now ?? new Date()).getTime()) reasons.push('riskReviewOverdue')\n if (assessment.hasConcernAnswers && !assessment.hasCompletedMitigation) reasons.push('mitigationIncomplete')\n }\n }\n\n return { allowed: reasons.length === 0, reasons }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { EudrStatementStatus } from '../data/validators'\nimport { getCountryRiskTier } from './reference-data'\n\nexport const EUDR_STATEMENT_TRANSITIONS: Record<EudrStatementStatus, readonly EudrStatementStatus[]> = {\n draft: ['submitted', 'archived'],\n submitted: ['draft', 'available', 'archived'],\n available: ['withdrawn', 'archived'],\n withdrawn: ['archived'],\n archived: [],\n}\n\nexport function canTransition(from: EudrStatementStatus, to: EudrStatementStatus): boolean {\n return EUDR_STATEMENT_TRANSITIONS[from].includes(to)\n}\n\nexport function isStatementReadOnly(status: EudrStatementStatus): boolean {\n return status === 'archived'\n}\n\nexport function canDeleteStatement(status: EudrStatementStatus): boolean {\n return !isStatementReadOnly(status)\n}\n\nexport const EUDR_AMEND_GUARDED_FIELDS = [\n 'commodity',\n 'quantityKg',\n 'supplementaryUnit',\n 'supplementaryQuantity',\n 'referencedStatements',\n 'orderId',\n] as const\n\nexport const EUDR_AMEND_WINDOW_MS = 72 * 60 * 60 * 1000\n\nexport function isAmendWindowOpen(referenceIssuedAt: Date | null | undefined, now: Date = new Date()): boolean {\n if (referenceIssuedAt == null) return false\n const issuedAtMs = referenceIssuedAt.getTime()\n if (Number.isNaN(issuedAtMs)) return false\n const elapsedMs = now.getTime() - issuedAtMs\n return elapsedMs >= 0 && elapsedMs <= EUDR_AMEND_WINDOW_MS\n}\n\nexport type GateSubmissionView = { status: string; completenessScore: number; originCountry: string | null }\nexport type GateAssessmentView = {\n conclusion: string\n countryRisks: Array<{ country: string; tier: string }>\n reviewDueAt: Date | string | null\n hasConcernAnswers: boolean\n hasCompletedMitigation: boolean\n} | null\nexport type GateResult = { allowed: boolean; reasons: string[] }\n\nfunction normalizeCountry(value: string | null): string | null {\n const normalized = value?.trim().toUpperCase() ?? ''\n return normalized.length > 0 ? normalized : null\n}\n\nfunction parseDate(value: Date | string | null): Date | null {\n if (value == null) return null\n const date = value instanceof Date ? value : new Date(value)\n return Number.isNaN(date.getTime()) ? null : date\n}\n\nfunction hasSameCountries(left: Set<string>, right: Set<string>): boolean {\n if (left.size !== right.size) return false\n for (const country of left) {\n if (!right.has(country)) return false\n }\n return true\n}\n\nexport function evaluateSubmissionGate(input: {\n actorRole: string | null\n referencedStatementsCount: number\n submissions: GateSubmissionView[]\n latestAssessment: GateAssessmentView\n now?: Date\n}): GateResult {\n const reasons: string[] = []\n\n if (input.actorRole === 'sme_trader') {\n if (input.referencedStatementsCount < 1) reasons.push('referencedStatementsRequired')\n return { allowed: reasons.length === 0, reasons }\n }\n\n if (input.submissions.length === 0) reasons.push('noSubmissions')\n if (input.submissions.some((submission) => submission.status !== 'verified' || submission.completenessScore !== 100)) {\n reasons.push('submissionsNotReady')\n }\n if (input.submissions.some((submission) => normalizeCountry(submission.originCountry) === null)) {\n reasons.push('originCountryMissing')\n }\n\n const currentCountries = new Set(\n input.submissions\n .map((submission) => normalizeCountry(submission.originCountry))\n .filter((country): country is string => country !== null),\n )\n const allCountriesPresent = input.submissions.length > 0 && input.submissions.every((submission) => normalizeCountry(submission.originCountry) !== null)\n const tiers = [...currentCountries].map((country) => getCountryRiskTier(country))\n const simplifiedDueDiligenceSatisfied = allCountriesPresent && tiers.length > 0 && tiers.every((tier) => tier === 'low')\n\n if (!simplifiedDueDiligenceSatisfied) {\n const assessment = input.latestAssessment\n if (assessment == null || assessment.conclusion !== 'negligible') reasons.push('riskConclusionMissing')\n if (assessment != null) {\n const assessedCountries = new Set(assessment.countryRisks.map((risk) => risk.country.trim().toUpperCase()).filter((country) => country.length > 0))\n if (!hasSameCountries(currentCountries, assessedCountries)) reasons.push('riskAssessmentStale')\n\n const reviewDueAt = parseDate(assessment.reviewDueAt)\n if (reviewDueAt !== null && reviewDueAt.getTime() < (input.now ?? new Date()).getTime()) reasons.push('riskReviewOverdue')\n if (assessment.hasConcernAnswers && !assessment.hasCompletedMitigation) reasons.push('mitigationIncomplete')\n }\n }\n\n return { allowed: reasons.length === 0, reasons }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|