@genispace/geniapp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/CrossAppRecordPicker-BXchXcK5.js +624 -0
- package/dist/CrossAppRecordPicker-BXchXcK5.js.map +1 -0
- package/dist/Page-wHZrMN17.js +24 -0
- package/dist/Page-wHZrMN17.js.map +1 -0
- package/dist/ai/adopt/AiSuggestionPanel.d.ts +30 -0
- package/dist/ai/adopt/BusinessGuidancePanel.d.ts +31 -0
- package/dist/ai/adopt/DetailPageAiLayout.d.ts +7 -0
- package/dist/ai/adopt/adoptPresets.d.ts +11 -0
- package/dist/ai/adopt/guidanceContent.d.ts +27 -0
- package/dist/ai/adopt/parseAiSummary.d.ts +7 -0
- package/dist/ai/components/AgentJobProgress.d.ts +124 -0
- package/dist/ai/components/AsyncCombobox.d.ts +44 -0
- package/dist/ai/components/BulkActionBar.d.ts +44 -0
- package/dist/ai/components/EntityRef.d.ts +39 -0
- package/dist/ai/components/JobProgress.d.ts +64 -0
- package/dist/ai/components/ServerDataTable.d.ts +89 -0
- package/dist/ai/components/Timeline.d.ts +35 -0
- package/dist/ai/components/useInfiniteRows.d.ts +25 -0
- package/dist/ai/errors/userFacingError.d.ts +14 -0
- package/dist/ai/errors/userFacingError.js +48 -0
- package/dist/ai/errors/userFacingError.js.map +1 -0
- package/dist/ai/index.d.ts +34 -0
- package/dist/ai/integrations/partner/createPartnerRecordPickerHook.d.ts +15 -0
- package/dist/ai/integrations/partner/partnerRecordPicker.d.ts +20 -0
- package/dist/ai/layout/ModalWithAiLayout.d.ts +11 -0
- package/dist/ai/layout/aiUi.d.ts +16 -0
- package/dist/ai/layout/layoutConstants.d.ts +19 -0
- package/dist/ai/layout/modalSizeForAi.d.ts +5 -0
- package/dist/ai/locales/sharedAiCopy.d.ts +6 -0
- package/dist/ai/managed-data/DatasourceReadonlyTable.d.ts +11 -0
- package/dist/ai/managed-data/createTableClient.d.ts +7 -0
- package/dist/ai/managed-data/emitManagedEvent.d.ts +18 -0
- package/dist/ai/managed-data/executeManagedDatasource.d.ts +21 -0
- package/dist/ai/managed-data/queryManagedDatasource.d.ts +28 -0
- package/dist/ai/providers/AppUiProviders.d.ts +6 -0
- package/dist/ai/types/app-ai.types.d.ts +29 -0
- package/dist/ai/types/index.d.ts +1 -0
- package/dist/ai.d.ts +1 -0
- package/dist/ai.js +1817 -0
- package/dist/ai.js.map +1 -0
- package/dist/case-workspace/domain.d.ts +41 -0
- package/dist/case-workspace/domain.js +24 -0
- package/dist/case-workspace/domain.js.map +1 -0
- package/dist/case-workspace/index.d.ts +91 -0
- package/dist/case-workspace.d.ts +1 -0
- package/dist/case-workspace.js +392 -0
- package/dist/case-workspace.js.map +1 -0
- package/dist/cn-B6yFEsav.js +9 -0
- package/dist/cn-B6yFEsav.js.map +1 -0
- package/dist/components/ui/calendar.css +7 -0
- package/dist/cookieSettings-D_v3KS02.js +97 -0
- package/dist/cookieSettings-D_v3KS02.js.map +1 -0
- package/dist/dashboard/index.d.ts +16 -0
- package/dist/dashboard/src/ChartFrame.d.ts +18 -0
- package/dist/dashboard/src/ChartTooltip.d.ts +38 -0
- package/dist/dashboard/src/FilterBar.d.ts +23 -0
- package/dist/dashboard/src/KpiStatCard.d.ts +29 -0
- package/dist/dashboard/src/StatGrid.d.ts +15 -0
- package/dist/dashboard/src/TimeRangePicker.d.ts +14 -0
- package/dist/dashboard/src/chart.d.ts +10 -0
- package/dist/dashboard/src/format.d.ts +16 -0
- package/dist/dashboard/src/links.d.ts +2 -0
- package/dist/dashboard/src/useDashboardRange.d.ts +27 -0
- package/dist/dashboard.d.ts +1 -0
- package/dist/dashboard.js +361 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/fonts.css +15 -0
- package/dist/hooks/access/AppAccessGate.d.ts +20 -0
- package/dist/hooks/access/AppAccessNotice.d.ts +8 -0
- package/dist/hooks/access/useAppAccess.d.ts +26 -0
- package/dist/hooks/config/businessLocale.d.ts +12 -0
- package/dist/hooks/config/currencies.d.ts +9 -0
- package/dist/hooks/index.d.ts +17 -0
- package/dist/hooks/picker/CrossAppRecordPicker.d.ts +37 -0
- package/dist/hooks/picker/managedAppPicker.d.ts +21 -0
- package/dist/hooks/picker/partnerPayload.d.ts +6 -0
- package/dist/hooks/routing/draftEntityId.d.ts +5 -0
- package/dist/hooks/routing/useRefetchOnRouteMatch.d.ts +6 -0
- package/dist/hooks/shell/resolveApiRoot.d.ts +13 -0
- package/dist/hooks/shell/shell.d.ts +4 -0
- package/dist/hooks/shell/useGenispacePlatformClient.d.ts +7 -0
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.js +42 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/kit.d.ts +50 -0
- package/dist/kit.js +2067 -0
- package/dist/kit.js.map +1 -0
- package/dist/page.d.ts +1 -0
- package/dist/page.js +5 -0
- package/dist/page.js.map +1 -0
- package/dist/shell-DIHnXIUb.js +6 -0
- package/dist/shell-DIHnXIUb.js.map +1 -0
- package/dist/shell.d.ts +30 -0
- package/dist/shell.js +104 -0
- package/dist/shell.js.map +1 -0
- package/dist/storage/assetPreview.d.ts +12 -0
- package/dist/storage/components/AssetThumbnail.d.ts +15 -0
- package/dist/storage/components/CopyStorageLinkButton.d.ts +13 -0
- package/dist/storage/components/StorageImage.d.ts +9 -0
- package/dist/storage/components/StoragePreviewContent.d.ts +22 -0
- package/dist/storage/components/StorageVideo.d.ts +9 -0
- package/dist/storage/copyTextToClipboard.d.ts +5 -0
- package/dist/storage/hooks/useAuthenticatedStorageBlobs.d.ts +3 -0
- package/dist/storage/hooks/useImageThumbnailBlobs.d.ts +4 -0
- package/dist/storage/hooks/useShareableStorageLink.d.ts +7 -0
- package/dist/storage/index.d.ts +12 -0
- package/dist/storage/openUrlInNewTab.d.ts +6 -0
- package/dist/storage/platformStorage.d.ts +43 -0
- package/dist/storage.d.ts +1 -0
- package/dist/storage.js +605 -0
- package/dist/storage.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/styles/base.css +616 -0
- package/dist/styles/reduced-motion.css +14 -0
- package/dist/styles/tailwind-preset.js +269 -0
- package/dist/task-workspace/domain.d.ts +35 -0
- package/dist/task-workspace/domain.js +45 -0
- package/dist/task-workspace/domain.js.map +1 -0
- package/dist/task-workspace/experience.d.ts +50 -0
- package/dist/task-workspace/index.d.ts +172 -0
- package/dist/task-workspace.d.ts +1 -0
- package/dist/task-workspace.js +626 -0
- package/dist/task-workspace.js.map +1 -0
- package/dist/ui/components/features/app/AppCheckboxInput.d.ts +9 -0
- package/dist/ui/components/features/app/AppConfirmDialog.d.ts +12 -0
- package/dist/ui/components/features/app/AppDashboardSkeleton.d.ts +9 -0
- package/dist/ui/components/features/app/AppDatePicker.d.ts +69 -0
- package/dist/ui/components/features/app/AppModal.d.ts +27 -0
- package/dist/ui/components/features/app/AppPageStates.d.ts +17 -0
- package/dist/ui/components/features/app/AppSelectInput.d.ts +10 -0
- package/dist/ui/components/features/app/AppTemporalInput.d.ts +19 -0
- package/dist/ui/components/features/app/Page.d.ts +14 -0
- package/dist/ui/components/features/app/QueryErrorAlert.d.ts +7 -0
- package/dist/ui/components/features/app/Sidebar.d.ts +47 -0
- package/dist/ui/components/features/app/index.d.ts +17 -0
- package/dist/ui/components/features/user/UserAvatar.d.ts +17 -0
- package/dist/ui/components/features/user/UserDisplay.d.ts +10 -0
- package/dist/ui/components/features/user/UserSelect.d.ts +14 -0
- package/dist/ui/components/features/user/useUserDirectory.d.ts +13 -0
- package/dist/ui/components/features/user/userDirectoryTypes.d.ts +18 -0
- package/dist/ui/components/patterns/form-section.d.ts +11 -0
- package/dist/ui/components/primitives/feedback/index.d.ts +2 -0
- package/dist/ui/components/primitives/feedback/toaster.d.ts +1 -0
- package/dist/ui/components/primitives/feedback/use-toast.d.ts +46 -0
- package/dist/ui/components/primitives/page-skeleton/ChartAreaSkeleton.d.ts +13 -0
- package/dist/ui/components/primitives/page-skeleton/ChartEmptyState.d.ts +14 -0
- package/dist/ui/components/primitives/page-skeleton/ComponentSkeletonShell.d.ts +16 -0
- package/dist/ui/components/primitives/page-skeleton/ConfigEditorSkeleton.d.ts +5 -0
- package/dist/ui/components/primitives/page-skeleton/DetailTabsSkeleton.d.ts +6 -0
- package/dist/ui/components/primitives/page-skeleton/EmptyStateBadge.d.ts +13 -0
- package/dist/ui/components/primitives/page-skeleton/FormCardSkeleton.d.ts +7 -0
- package/dist/ui/components/primitives/page-skeleton/FormFieldSkeleton.d.ts +6 -0
- package/dist/ui/components/primitives/page-skeleton/FormPageSkeleton.d.ts +6 -0
- package/dist/ui/components/primitives/page-skeleton/GridCardsSkeleton.d.ts +6 -0
- package/dist/ui/components/primitives/page-skeleton/ListSkeleton.d.ts +26 -0
- package/dist/ui/components/primitives/page-skeleton/PageHeaderSkeleton.d.ts +6 -0
- package/dist/ui/components/primitives/page-skeleton/SplitPaneSkeleton.d.ts +4 -0
- package/dist/ui/components/primitives/page-skeleton/StatsRowSkeleton.d.ts +5 -0
- package/dist/ui/components/primitives/page-skeleton/TableEmptyState.d.ts +27 -0
- package/dist/ui/components/primitives/page-skeleton/TablePageSkeleton.d.ts +8 -0
- package/dist/ui/components/primitives/page-skeleton/TabsBarSkeleton.d.ts +6 -0
- package/dist/ui/components/primitives/page-skeleton/index.d.ts +24 -0
- package/dist/ui/components/primitives/page-skeleton/skeletonMetrics.d.ts +9 -0
- package/dist/ui/components/primitives/page-skeleton/useVisibleCenter.d.ts +34 -0
- package/dist/ui/components/ui/accordion.d.ts +7 -0
- package/dist/ui/components/ui/ai-draft-banner.d.ts +21 -0
- package/dist/ui/components/ui/alert-dialog.d.ts +48 -0
- package/dist/ui/components/ui/alert.d.ts +8 -0
- package/dist/ui/components/ui/avatar.d.ts +6 -0
- package/dist/ui/components/ui/badge.d.ts +9 -0
- package/dist/ui/components/ui/breadcrumb.d.ts +19 -0
- package/dist/ui/components/ui/button.d.ts +11 -0
- package/dist/ui/components/ui/calendar.d.ts +8 -0
- package/dist/ui/components/ui/card.d.ts +8 -0
- package/dist/ui/components/ui/chart.d.ts +16 -0
- package/dist/ui/components/ui/checkbox.d.ts +4 -0
- package/dist/ui/components/ui/collapsible.d.ts +5 -0
- package/dist/ui/components/ui/column-config.d.ts +42 -0
- package/dist/ui/components/ui/date-picker.d.ts +9 -0
- package/dist/ui/components/ui/date-range-filter.d.ts +32 -0
- package/dist/ui/components/ui/date-range-picker.d.ts +11 -0
- package/dist/ui/components/ui/dialog-input.d.ts +17 -0
- package/dist/ui/components/ui/dialog-safe-select.d.ts +13 -0
- package/dist/ui/components/ui/dialog.d.ts +25 -0
- package/dist/ui/components/ui/dropdown-menu.d.ts +27 -0
- package/dist/ui/components/ui/feature-guide.d.ts +43 -0
- package/dist/ui/components/ui/form.d.ts +25 -0
- package/dist/ui/components/ui/help-tip.d.ts +29 -0
- package/dist/ui/components/ui/hint-notice.d.ts +22 -0
- package/dist/ui/components/ui/index.d.ts +6 -0
- package/dist/ui/components/ui/input.d.ts +3 -0
- package/dist/ui/components/ui/label.d.ts +5 -0
- package/dist/ui/components/ui/modal-container.d.ts +56 -0
- package/dist/ui/components/ui/modal-templates.d.ts +46 -0
- package/dist/ui/components/ui/multi-select.d.ts +20 -0
- package/dist/ui/components/ui/pagination.d.ts +28 -0
- package/dist/ui/components/ui/popover.d.ts +7 -0
- package/dist/ui/components/ui/progress.d.ts +7 -0
- package/dist/ui/components/ui/radio-button-group.d.ts +18 -0
- package/dist/ui/components/ui/radio-group.d.ts +5 -0
- package/dist/ui/components/ui/scroll-area.d.ts +5 -0
- package/dist/ui/components/ui/select.d.ts +16 -0
- package/dist/ui/components/ui/separator.d.ts +7 -0
- package/dist/ui/components/ui/sheet.d.ts +25 -0
- package/dist/ui/components/ui/sidebar-rail.d.ts +9 -0
- package/dist/ui/components/ui/skeleton.d.ts +2 -0
- package/dist/ui/components/ui/slider.d.ts +13 -0
- package/dist/ui/components/ui/switch.d.ts +4 -0
- package/dist/ui/components/ui/table.d.ts +10 -0
- package/dist/ui/components/ui/tabs.d.ts +10 -0
- package/dist/ui/components/ui/textarea.d.ts +3 -0
- package/dist/ui/components/ui/toast.d.ts +21 -0
- package/dist/ui/components/ui/toggle-group.d.ts +12 -0
- package/dist/ui/components/ui/toggle.d.ts +12 -0
- package/dist/ui/components/ui/tooltip.d.ts +7 -0
- package/dist/ui/components/ui/typography.d.ts +15 -0
- package/dist/ui/components/ui/underline-tabs.d.ts +13 -0
- package/dist/ui/components/ui/view-mode-toggle.d.ts +9 -0
- package/dist/ui/hooks/useIsMobile.d.ts +16 -0
- package/dist/ui/styles/design-tokens.d.ts +189 -0
- package/dist/ui/styles/z-index-layers.d.ts +46 -0
- package/dist/ui.d.ts +2 -0
- package/dist/ui.js +35 -0
- package/dist/ui.js.map +1 -0
- package/dist/useUserDirectory-CqkyCQoR.js +2377 -0
- package/dist/useUserDirectory-CqkyCQoR.js.map +1 -0
- package/dist/utils/cookieSettings.d.ts +12 -0
- package/dist/utils/data/countryCodes.d.ts +26 -0
- package/dist/utils/index.d.ts +18 -0
- package/dist/utils/utils/appPath.d.ts +5 -0
- package/dist/utils/utils/chunkLoadRecovery.d.ts +7 -0
- package/dist/utils/utils/cn.d.ts +3 -0
- package/dist/utils/utils/crossApp.d.ts +71 -0
- package/dist/utils/utils/debounce.d.ts +1 -0
- package/dist/utils/utils/formatUserLabel.d.ts +8 -0
- package/dist/utils/utils/formatting.d.ts +18 -0
- package/dist/utils/utils/logoutNotification.d.ts +28 -0
- package/dist/utils/utils/operatorLocale.d.ts +32 -0
- package/dist/utils/utils/routeLocalePrefetch.d.ts +5 -0
- package/dist/utils/utils/shellIframeUrl.d.ts +20 -0
- package/dist/utils/utils/spaceSettings.d.ts +20 -0
- package/dist/utils/utils/sso.d.ts +42 -0
- package/dist/utils/utils/throttle.d.ts +1 -0
- package/dist/utils/utils/timezones.d.ts +14 -0
- package/dist/utils/utils/toDateInputValue.d.ts +5 -0
- package/dist/utils/utils/watermark.d.ts +1 -0
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +1334 -0
- package/dist/utils.js.map +1 -0
- package/dist/vite.d.ts +22 -0
- package/dist/vite.js +74 -0
- package/dist/vite.js.map +1 -0
- package/package.json +191 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-workspace.js","sources":["../src/task-workspace/experience.ts","../src/task-workspace/index.tsx"],"sourcesContent":["import type { WorkspaceField, WorkspaceOption } from \"./index\";\n\nexport type WorkspaceExperienceLevel = \"basic\" | \"standard\" | \"advanced\";\n\nexport type WorkspaceRecordProfile = {\n level: WorkspaceExperienceLevel;\n fieldKeys: string[];\n advancedFieldKeys: string[];\n requiredFieldKeys: string[];\n supportsReconciliation: boolean;\n capabilityKey?: string;\n};\n\nexport type WorkspaceCapability = {\n key: string;\n label: string;\n description: string;\n recordTypes: string[];\n defaultEnabled: boolean;\n};\n\nexport type WorkspaceExperience = {\n applicationId: string;\n recordProfiles: Record<string, WorkspaceRecordProfile>;\n capabilities: WorkspaceCapability[];\n copy: {\n advancedOptions: string;\n advancedOptionsHint: string;\n experienceLevel: string;\n experienceLevelHint: string;\n optionalCapabilities: string;\n optionalCapabilitiesHint: string;\n basic: string;\n standard: string;\n advanced: string;\n featureDisabled: string;\n };\n};\n\ntype CatalogEntry = {\n basicTypes: string[];\n advancedTypes: string[];\n reconcileTypes: string[];\n advancedFields: string[];\n compact?: Record<string, string[]>;\n};\n\n// Product language and progressive disclosure belong to the shared interaction\n// contract. Business states, permissions and transaction checks remain owned by\n// each GeniApp.\nconst catalog: Record<string, CatalogEntry> = {\n \"enterprise-performance-management\": {\n basicTypes: [\"budget\", \"forecast\", \"variance\"],\n advancedTypes: [\"allocation\", \"consolidation\", \"profitability\"],\n reconcileTypes: [\"budget\", \"forecast\", \"consolidation\", \"profitability\", \"variance\"],\n advancedFields: [\"driver_value\"],\n compact: { driver: [\"planning_basis\", \"legal_entity_code\", \"fiscal_period\", \"scenario_code\", \"driver_value\"] },\n },\n \"product-lifecycle-management\": {\n basicTypes: [\"item_revision\", \"engineering_change\", \"specification\"],\n advancedTypes: [\"cost_release\", \"retirement\"],\n reconcileTypes: [\"bom\", \"routing\", \"cost_release\"],\n advancedFields: [\"quantity\", \"unit\"],\n compact: { retirement: [\"product_code\", \"revision\", \"effective_from\", \"change_reason\"] },\n },\n \"supply-chain-planning\": {\n basicTypes: [\"demand_signal\", \"forecast\", \"demand_plan\", \"exception\"],\n advancedTypes: [\"capacity_plan\", \"mrp_run\", \"accuracy_review\"],\n reconcileTypes: [\"forecast\", \"demand_plan\", \"supply_plan\", \"capacity_plan\", \"accuracy_review\"],\n advancedFields: [\"confidence\"],\n compact: { exception: [\"market_code\", \"location_code\", \"product_code\", \"quantity\", \"unit\"] },\n },\n \"manufacturing-operations\": {\n basicTypes: [\"production_order\", \"operation\", \"completion\"],\n advancedTypes: [\"batch_genealogy\", \"cost_variance\"],\n reconcileTypes: [\"material_issue\", \"material_return\", \"labor_report\", \"completion\", \"cost_variance\"],\n advancedFields: [\"revision\", \"planned_end\"],\n compact: { labor_report: [\"plant_code\", \"batch_number\", \"quantity\", \"unit\", \"planned_start\"] },\n },\n \"quality-management\": {\n basicTypes: [\"inspection_plan\", \"inspection\", \"nonconformance\"],\n advancedTypes: [\"supplier_quality\", \"capa\", \"verification\"],\n reconcileTypes: [\"inspection\", \"nonconformance\", \"disposition\", \"verification\"],\n advancedFields: [\"sample_size\", \"defect_quantity\", \"disposition_code\"],\n compact: { quarantine: [\"product_code\", \"lot_number\", \"disposition_code\"] },\n },\n \"discovery-service-mapping\": {\n basicTypes: [\"source_connection\", \"discovery_schedule\", \"discovery_run\", \"finding\"],\n advancedTypes: [\"pattern\", \"identification_result\", \"topology_map\", \"retry\"],\n reconcileTypes: [\"discovery_run\", \"identification_result\", \"topology_map\"],\n advancedFields: [\"credential_reference\", \"timeout_minutes\"],\n compact: { finding: [\"source_type\", \"scope\", \"service_code\"] },\n },\n \"event-management\": {\n basicTypes: [\"raw_event\", \"normalized_event\", \"alert\", \"service_impact\"],\n advancedTypes: [\"correlation_group\", \"suppression_rule\", \"post_event_review\"],\n reconcileTypes: [\"correlation_group\", \"service_impact\", \"post_event_review\"],\n advancedFields: [\"correlation_key\"],\n compact: { post_event_review: [\"source_code\", \"service_code\", \"occurred_at\", \"summary\"] },\n },\n \"software-asset-management\": {\n basicTypes: [\"software_model\", \"entitlement\", \"installation\", \"renewal\"],\n advancedTypes: [\"usage_measurement\", \"license_position\", \"compliance_review\"],\n reconcileTypes: [\"entitlement\", \"usage_measurement\", \"license_position\", \"renewal\", \"compliance_review\"],\n advancedFields: [\"amount\", \"currency\"],\n compact: { installation: [\"publisher\", \"product_name\", \"edition_version\"] },\n },\n \"field-service-management\": {\n basicTypes: [\"work_order\", \"appointment\", \"dispatch\", \"work_log\"],\n advancedTypes: [\"travel\", \"billing_handoff\", \"follow_up\"],\n reconcileTypes: [\"part_usage\", \"billing_handoff\"],\n advancedFields: [\"part_code\"],\n compact: { customer_signature: [\"customer_or_site\", \"asset_tag\", \"resolution_target\"] },\n },\n \"security-operations\": {\n basicTypes: [\"security_event\", \"security_incident\", \"vulnerability\"],\n advancedTypes: [\"exposure\", \"evidence\", \"post_incident_review\"],\n reconcileTypes: [\"recovery_task\", \"post_incident_review\"],\n advancedFields: [\"evidence_reference\"],\n compact: { evidence: [\"detection_source\", \"affected_service\", \"detected_at\", \"evidence_reference\"] },\n },\n \"risk-compliance-audit\": {\n basicTypes: [\"risk\", \"control\", \"assessment\", \"remediation\"],\n advancedTypes: [\"audit\", \"residual_risk\", \"continuity_plan\"],\n reconcileTypes: [\"control_test\", \"audit\", \"remediation\", \"residual_risk\"],\n advancedFields: [\"test_evidence\", \"remediation_due\"],\n compact: { policy: [\"risk_domain\", \"business_entity\", \"control_code\", \"owner\"] },\n },\n \"sustainability-management\": {\n basicTypes: [\"activity_data\", \"calculation\", \"target\", \"initiative\"],\n advancedTypes: [\"allocation\", \"disclosure\", \"assurance_evidence\"],\n reconcileTypes: [\"calculation\", \"allocation\", \"target\", \"disclosure\"],\n advancedFields: [\"factor_version\", \"evidence_reference\"],\n compact: { emission_factor: [\"scope\", \"activity_category\", \"unit\", \"factor_version\", \"reporting_period\"] },\n },\n \"service-configuration\": {\n basicTypes: [\"configuration_item\", \"ci_relationship\", \"business_service\", \"quality_issue\"],\n advancedTypes: [\"ci_class\", \"ci_model\", \"reconciliation_rule\"],\n reconcileTypes: [\"reconciliation_rule\", \"quality_issue\"],\n advancedFields: [\"correlation_key\", \"owner_group\"],\n compact: { business_service: [\"service_code\", \"environment\", \"criticality\", \"owner_group\"] },\n },\n \"talent-management\": {\n basicTypes: [\"requisition\", \"application\", \"offer\", \"onboarding\", \"goal\", \"review\"],\n advancedTypes: [\"succession_slate\", \"appeal\"],\n reconcileTypes: [\"goal\", \"review\", \"learning_assignment\", \"appeal\"],\n advancedFields: [\"appeal_window_days\", \"evidence_reference\"],\n compact: { goal: [\"process_stage\", \"effective_date\", \"accountable_owner\", \"target_outcome\"] },\n },\n crm: {\n basicTypes: [\"customer_360\", \"consent\", \"opportunity_outcome\", \"service_relationship\"],\n advancedTypes: [\"commercial_attribution\", \"quote_handoff\", \"order_handoff\"],\n reconcileTypes: [\"opportunity_outcome\", \"quote_handoff\", \"order_handoff\", \"commercial_attribution\"],\n advancedFields: [\"provider_receipt\"],\n compact: { consent: [\"relationship_type\", \"customer_number\", \"consent_purpose\", \"consent_version\"] },\n },\n product: {\n basicTypes: [\"commercial_variant\", \"assortment_release\", \"regional_effectivity\", \"lifecycle_event\"],\n advancedTypes: [\"engineering_release\", \"quality_spec_link\", \"product_retirement\"],\n reconcileTypes: [\"assortment_release\", \"engineering_release\", \"product_retirement\"],\n advancedFields: [\"quality_specification\", \"retirement_reason\"],\n compact: { regional_effectivity: [\"commercial_product_code\", \"variant_code\", \"market_scope\", \"effective_from\"] },\n },\n \"retail-crm\": {\n basicTypes: [\"commerce_touchpoint\", \"consent_evidence\", \"service_outcome\"],\n advancedTypes: [\"brand_access\", \"commercial_attribution\", \"pos_receipt\"],\n reconcileTypes: [\"fulfillment_outcome\", \"pos_receipt\", \"service_outcome\"],\n advancedFields: [\"consent_version\", \"attribution_rule\"],\n compact: { consent_evidence: [\"channel_family\", \"member_number\", \"consent_purpose\", \"consent_version\"] },\n },\n \"short-drama\": {\n basicTypes: [\"delivery_package\", \"acceptance\", \"revision_request\"],\n advancedTypes: [\"rights_clearance\", \"distribution_receipt\", \"production_outcome\"],\n reconcileTypes: [\"acceptance\", \"distribution_receipt\", \"production_outcome\"],\n advancedFields: [\"provider_receipt\", \"expected_units\", \"accepted_units\"],\n compact: { rights_clearance: [\"production_project_code\", \"delivery_version\", \"rights_reference\"] },\n },\n};\n\nexport function createWorkspaceExperience(\n applicationId: string,\n locale: \"zh\" | \"en\",\n recordTypes: readonly WorkspaceOption[],\n fields: readonly WorkspaceField[],\n): WorkspaceExperience {\n const entry = catalog[applicationId];\n const allFieldKeys = fields.map((field) => field.key);\n const basicTypes = new Set(entry?.basicTypes ?? recordTypes.slice(0, 2).map((item) => item.value));\n const advancedTypes = new Set(entry?.advancedTypes ?? []);\n const reconcileTypes = new Set(entry?.reconcileTypes ?? []);\n const advancedFields = new Set(entry?.advancedFields ?? []);\n const advancedTypeLabels = recordTypes.filter((item) => advancedTypes.has(item.value)).map((item) => item.label);\n const recordProfiles = Object.fromEntries(recordTypes.map((type) => {\n const fieldKeys = entry?.compact?.[type.value] ?? allFieldKeys;\n const advancedFieldKeys = fieldKeys.filter((key) => advancedFields.has(key));\n const requiredFieldKeys = fields\n .filter((field) => field.required && fieldKeys.includes(field.key) && !advancedFields.has(field.key))\n .map((field) => field.key);\n const level: WorkspaceExperienceLevel = basicTypes.has(type.value) ? \"basic\" : advancedTypes.has(type.value) ? \"advanced\" : \"standard\";\n return [type.value, {\n level,\n fieldKeys,\n advancedFieldKeys,\n requiredFieldKeys,\n supportsReconciliation: reconcileTypes.has(type.value),\n capabilityKey: advancedTypes.has(type.value) ? \"specialized_scenarios\" : undefined,\n } satisfies WorkspaceRecordProfile];\n }));\n return {\n applicationId,\n recordProfiles,\n capabilities: advancedTypes.size ? [{\n key: \"specialized_scenarios\",\n label: locale === \"zh\" ? \"启用特定业务场景\" : \"Enable specialized scenarios\",\n description: locale === \"zh\"\n ? `仅在团队确实需要时启用:${advancedTypeLabels.join(\"、\")}。已有记录不会被删除。`\n : `Enable only when the team needs: ${advancedTypeLabels.join(\", \")}. Existing records are never deleted.`,\n recordTypes: [...advancedTypes],\n defaultEnabled: false,\n }] : [],\n copy: locale === \"zh\" ? {\n advancedOptions: \"更多选项\",\n advancedOptionsHint: \"这些信息只在当前场景需要时填写,不影响基本流程。\",\n experienceLevel: \"默认工作方式\",\n experienceLevelHint: \"“基础”只提供最常用入口;“标准”适合多数团队;“高级”仍需单独启用特定场景。\",\n optionalCapabilities: \"按需启用的场景\",\n optionalCapabilitiesHint: \"这里只控制是否提供入口,不会扩大任何人的数据权限。\",\n basic: \"基础\",\n standard: \"标准(推荐)\",\n advanced: \"高级\",\n featureDisabled: \"该场景尚未由业务管理员启用。\",\n } : {\n advancedOptions: \"More options\",\n advancedOptionsHint: \"Complete these only when this case needs them; the basic flow is unchanged.\",\n experienceLevel: \"Default way of working\",\n experienceLevelHint: \"Basic shows the most common entry points; Standard suits most teams; specialized scenarios still need explicit enablement.\",\n optionalCapabilities: \"Scenarios enabled when needed\",\n optionalCapabilitiesHint: \"This controls entry points only and never expands anyone's data access.\",\n basic: \"Basic\",\n standard: \"Standard (recommended)\",\n advanced: \"Advanced\",\n featureDisabled: \"A business administrator has not enabled this scenario.\",\n },\n };\n}\n\nexport function readExperienceConfiguration(policies: Array<{ state: string; effective_from?: string; configuration?: unknown }>, experience: WorkspaceExperience) {\n const today = new Date().toISOString().slice(0, 10);\n const candidate = policies\n .filter((policy) => policy.state === \"active\" && (!policy.effective_from || policy.effective_from <= today))\n .map((policy) => {\n if (typeof policy.configuration === \"string\") {\n try { return { ...policy, configuration: JSON.parse(policy.configuration) as Record<string, unknown> }; } catch { return { ...policy, configuration: {} }; }\n }\n return { ...policy, configuration: policy.configuration && typeof policy.configuration === \"object\" ? policy.configuration as Record<string, unknown> : {} };\n })\n .filter((policy) => \"experience_level\" in policy.configuration || \"enabled_features\" in policy.configuration)\n .at(-1);\n const level = candidate?.configuration.experience_level;\n const experienceLevel: WorkspaceExperienceLevel = level === \"basic\" || level === \"advanced\" ? level : \"standard\";\n const configured = Array.isArray(candidate?.configuration.enabled_features) ? candidate.configuration.enabled_features.filter((value): value is string => typeof value === \"string\") : [];\n const enabledFeatures = new Set(experience.capabilities.filter((item) => item.defaultEnabled).map((item) => item.key));\n configured.forEach((key) => enabledFeatures.add(key));\n return { experienceLevel, enabledFeatures };\n}\n\nexport function availableRecordTypes(recordTypes: readonly WorkspaceOption[], experience: WorkspaceExperience, level: WorkspaceExperienceLevel, enabledFeatures: ReadonlySet<string>) {\n const rank = { basic: 0, standard: 1, advanced: 2 } as const;\n return recordTypes.filter((type) => {\n const profile = experience.recordProfiles[type.value];\n if (!profile) return true;\n if (rank[profile.level] > rank[level]) return false;\n return !profile.capabilityKey || enabledFeatures.has(profile.capabilityKey);\n });\n}\n\nexport function experiencePolicyConfiguration(experienceLevel: WorkspaceExperienceLevel, enabledFeatures: ReadonlySet<string>, experience: WorkspaceExperience) {\n const enabled = experience.capabilities.filter((item) => enabledFeatures.has(item.key));\n const allowedLevels = experienceLevel === \"basic\" ? new Set([\"basic\"]) : experienceLevel === \"standard\" ? new Set([\"basic\", \"standard\"]) : new Set([\"basic\", \"standard\", \"advanced\"]);\n const enabledRecordTypes = Object.entries(experience.recordProfiles)\n .filter(([, profile]) => allowedLevels.has(profile.level) && (!profile.capabilityKey || enabledFeatures.has(profile.capabilityKey)))\n .map(([type]) => type);\n return { experience_level: experienceLevel, enabled_features: enabled.map((item) => item.key), enabled_record_types: enabledRecordTypes };\n}\n","import { formatBusinessDateTime } from '@genispace/geniapp/hooks';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n ArrowRight,\n CheckCircle2,\n AlertCircle,\n ChevronDown,\n FileCheck2,\n HelpCircle,\n Plus,\n RefreshCw,\n Search,\n Settings2,\n type LucideIcon,\n} from \"lucide-react\";\nimport { AppCheckboxInput, AppDatePicker, AppDateTimePicker, AppModal, AppPage, AppPageStates, AppSelectInput } from \"@genispace/geniapp/ui\";\nimport {\n CrossAppRecordPicker,\n type CrossAppRecordOption,\n type CrossAppRecordPage,\n} from \"@genispace/geniapp/hooks\";\nimport {\n calculateReconciliation,\n createIdempotencyKey,\n filterBusinessRecords,\n validateRecordDraft,\n validateTransition,\n type BusinessFieldValue,\n type TransitionMap,\n} from \"./domain\";\nimport {\n availableRecordTypes,\n experiencePolicyConfiguration,\n readExperienceConfiguration,\n type WorkspaceExperience,\n type WorkspaceExperienceLevel,\n} from \"./experience\";\n\nexport {\n availableRecordTypes,\n createWorkspaceExperience,\n experiencePolicyConfiguration,\n readExperienceConfiguration,\n} from \"./experience\";\nexport type { WorkspaceExperience, WorkspaceExperienceLevel, WorkspaceRecordProfile } from \"./experience\";\n\nexport {\n calculateReconciliation,\n createIdempotencyKey,\n filterBusinessRecords,\n validateRecordDraft,\n validateTransition,\n} from \"./domain\";\n\nexport type WorkspaceRecord = {\n id: string;\n number: string;\n record_type: string;\n name: string;\n description: string;\n state: string;\n priority: string;\n source_label?: string;\n amount?: number | string;\n currency?: string;\n quantity?: number | string;\n unit?: string;\n due_at?: string;\n effective_from?: string;\n effective_to?: string;\n payload?: Record<string, unknown> | string;\n reconciliation_state?: string;\n open_reconciliations?: number | string;\n updated_at?: string;\n};\n\nexport type WorkspacePolicy = {\n id: string;\n policy_type: string;\n code: string;\n name: string;\n region_code: string;\n version: number | string;\n state: string;\n threshold?: number | string;\n tolerance?: number | string;\n effective_from?: string;\n effective_to?: string;\n configuration?: Record<string, unknown> | string;\n};\n\nexport type WorkspaceOption = {\n value: string;\n label: string;\n description?: string;\n};\n\nexport type WorkspaceField = {\n key: string;\n label: string;\n type: \"text\" | \"number\" | \"date\" | \"datetime-local\" | \"textarea\" | \"select\";\n required?: boolean;\n placeholder?: string;\n options?: WorkspaceOption[];\n help?: string;\n};\n\nexport type WorkspaceContext = {\n providerApp: string;\n label: string;\n description: string;\n placeholder: string;\n emptyText: string;\n unavailableText: string;\n forbiddenText: string;\n loadPage: (input: {\n search: string;\n limit: number;\n offset: number;\n }) => Promise<CrossAppRecordPage>;\n};\n\nexport type TaskFlow = {\n id: string;\n title: string;\n description: string;\n recordTypes: string[];\n createLabel: string;\n emptyText: string;\n};\n\nexport type TaskWorkspaceSpec = {\n locale: \"en\" | \"zh\";\n title: string;\n description: string;\n icon: LucideIcon;\n taskFlows: TaskFlow[];\n recordTypes: WorkspaceOption[];\n states: WorkspaceOption[];\n transitions: TransitionMap;\n fields: WorkspaceField[];\n policyTypes: WorkspaceOption[];\n context?: WorkspaceContext;\n finalStates: string[];\n help: Array<{ title: string; body: string; steps: string[] }>;\n experience: WorkspaceExperience;\n copy: {\n refresh: string;\n help: string;\n close: string;\n createRecord: string;\n createPolicy: string;\n queue: string;\n policies: string;\n allTypes: string;\n allStates: string;\n search: string;\n empty: string;\n loading: string;\n loadError: string;\n saveError: string;\n saved: string;\n fields: {\n type: string;\n name: string;\n description: string;\n priority: string;\n dueAt: string;\n source: string;\n state: string;\n updated: string;\n action: string;\n evidence: string;\n expected: string;\n actual: string;\n tolerance: string;\n resolution: string;\n policyType: string;\n code: string;\n region: string;\n version: string;\n effectiveFrom: string;\n threshold: string;\n };\n metrics: { active: string; review: string; exception: string; closed: string };\n metricsLabel: string;\n priorities: readonly WorkspaceOption[];\n actions: {\n save: string;\n cancel: string;\n advance: string;\n reconcile: string;\n select: string;\n };\n validation: string;\n evidenceHint: string;\n reconciliationHint: string;\n noNextAction: string;\n policyIntro: string;\n };\n};\n\nexport type TaskWorkspaceApi = {\n queryRecords: () => Promise<WorkspaceRecord[]>;\n queryPolicies: () => Promise<WorkspacePolicy[]>;\n createRecord: (payload: Record<string, unknown>) => Promise<unknown>;\n transitionRecord: (payload: Record<string, unknown>) => Promise<unknown>;\n reconcileRecord: (payload: Record<string, unknown>) => Promise<unknown>;\n savePolicy: (payload: Record<string, unknown>) => Promise<unknown>;\n};\n\ntype Panel = \"record\" | \"policy\" | \"help\" | \"transition\" | \"reconcile\" | null;\n\nconst nowRevision = () => new Date().toISOString().replace(/[^0-9]/g, \"\").slice(0, 14);\n\nexport function TaskWorkspace({\n spec,\n api,\n footer,\n}: {\n spec: TaskWorkspaceSpec;\n api: TaskWorkspaceApi;\n footer?: ReactNode;\n}) {\n const [records, setRecords] = useState<WorkspaceRecord[]>([]);\n const [policies, setPolicies] = useState<WorkspacePolicy[]>([]);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState(\"\");\n const [notice, setNotice] = useState(\"\");\n const [activeFlowId, setActiveFlowId] = useState(spec.taskFlows[0]?.id || \"work\");\n const [panel, setPanel] = useState<Panel>(null);\n const [selectedRecord, setSelectedRecord] = useState<WorkspaceRecord | null>(null);\n const [selectedContext, setSelectedContext] = useState<CrossAppRecordOption | null>(null);\n const [filter, setFilter] = useState({ search: \"\", recordType: \"\", state: \"\" });\n const [draft, setDraft] = useState({\n recordType: spec.recordTypes[0]?.value || \"work_item\",\n name: \"\",\n description: \"\",\n priority: \"normal\",\n dueAt: \"\",\n values: Object.fromEntries(spec.fields.map((field) => [field.key, field.type === \"select\" ? field.options?.[0]?.value || \"\" : \"\"])) as Record<string, BusinessFieldValue>,\n });\n const [evidence, setEvidence] = useState(\"\");\n const [transitionTarget, setTransitionTarget] = useState(\"\");\n const [reconciliation, setReconciliation] = useState({ expected: \"\", actual: \"\", tolerance: \"0\", resolution: \"\" });\n const [policy, setPolicy] = useState({ policyType: spec.policyTypes[0]?.value || \"default\", code: \"\", name: \"\", region: \"GLOBAL\", version: \"1\", effectiveFrom: \"\", threshold: \"0\", tolerance: \"0\" });\n const [experienceLevel, setExperienceLevel] = useState<WorkspaceExperienceLevel>(\"standard\");\n const [enabledFeatures, setEnabledFeatures] = useState<Set<string>>(new Set());\n\n const load = useCallback(async () => {\n setLoading(true);\n setError(\"\");\n try {\n const [nextRecords, nextPolicies] = await Promise.all([api.queryRecords(), api.queryPolicies()]);\n setRecords(nextRecords);\n setPolicies(nextPolicies);\n setActiveFlowId((current) => {\n const currentFlow = spec.taskFlows.find((flow) => flow.id === current);\n if (currentFlow && nextRecords.some((record) => currentFlow.recordTypes.includes(record.record_type))) return current;\n const flowWithWork = spec.taskFlows.find((flow) => nextRecords.some((record) => flow.recordTypes.includes(record.record_type)));\n return flowWithWork?.id || current;\n });\n const configuration = readExperienceConfiguration(nextPolicies, spec.experience);\n setExperienceLevel(configuration.experienceLevel);\n setEnabledFeatures(configuration.enabledFeatures);\n } catch (reason) {\n setError(`${spec.copy.loadError}: ${(reason as Error).message}`);\n } finally {\n setLoading(false);\n }\n }, [api, spec.copy.loadError, spec.experience, spec.taskFlows]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const run = async (operation: () => Promise<unknown>) => {\n setSaving(true);\n setError(\"\");\n setNotice(\"\");\n try {\n await operation();\n setNotice(spec.copy.saved);\n setPanel(null);\n setSelectedRecord(null);\n setEvidence(\"\");\n await load();\n } catch (reason) {\n setError(`${spec.copy.saveError}: ${(reason as Error).message}`);\n } finally {\n setSaving(false);\n }\n };\n\n const activeFlow = useMemo(\n () => spec.taskFlows.find((flow) => flow.id === activeFlowId) || spec.taskFlows[0],\n [activeFlowId, spec.taskFlows],\n );\n const flowRecords = useMemo(\n () => records.filter((record) => !activeFlow || activeFlow.recordTypes.includes(record.record_type)),\n [activeFlow, records],\n );\n const filteredRecords = useMemo(\n () => filterBusinessRecords(flowRecords, filter),\n [filter, flowRecords],\n );\n const creatableRecordTypes = useMemo(\n () => availableRecordTypes(spec.recordTypes, spec.experience, experienceLevel, enabledFeatures)\n .filter((recordType) => !activeFlow || activeFlow.recordTypes.includes(recordType.value)),\n [activeFlow, enabledFeatures, experienceLevel, spec.experience, spec.recordTypes],\n );\n useEffect(() => {\n if (creatableRecordTypes.length && !creatableRecordTypes.some((item) => item.value === draft.recordType)) {\n setDraft((current) => ({ ...current, recordType: creatableRecordTypes[0].value }));\n }\n }, [creatableRecordTypes, draft.recordType]);\n const activeThreshold = useMemo(() => policies\n .filter((item) => item.state === \"active\" && Number(item.threshold || 0) > 0)\n .map((item) => Number(item.threshold || 0))\n .at(-1) || 0, [policies]);\n const metrics = useMemo(() => ({\n active: flowRecords.filter((record) => !spec.finalStates.includes(record.state)).length,\n review: flowRecords.filter((record) => [\"review\", \"submitted\", \"assessed\", \"triaged\", \"calculated\"].includes(record.state)).length,\n exception: flowRecords.filter((record) => Number(record.open_reconciliations || 0) > 0 || [\"exception\", \"quality_hold\", \"open\"].includes(record.reconciliation_state || \"\") || (activeThreshold > 0 && Number(record.amount || record.quantity || 0) > activeThreshold)).length,\n closed: flowRecords.filter((record) => spec.finalStates.includes(record.state)).length,\n }), [activeThreshold, flowRecords, spec.finalStates]);\n\n const selectFlow = (flow: TaskFlow) => {\n setActiveFlowId(flow.id);\n setFilter({ search: \"\", recordType: \"\", state: \"\" });\n const firstType = availableRecordTypes(spec.recordTypes, spec.experience, experienceLevel, enabledFeatures)\n .find((recordType) => flow.recordTypes.includes(recordType.value));\n if (firstType) setDraft((current) => ({ ...current, recordType: firstType.value }));\n };\n\n const openTransition = (record: WorkspaceRecord) => {\n const target = spec.transitions[record.state]?.[0] || \"\";\n setSelectedRecord(record);\n setTransitionTarget(target);\n setEvidence(\"\");\n setPanel(\"transition\");\n };\n\n const openReconciliation = (record: WorkspaceRecord) => {\n setSelectedRecord(record);\n const activeTolerance = policies.filter((item) => item.state === \"active\").map((item) => Number(item.tolerance || 0)).at(-1) || 0;\n setReconciliation({ expected: String(record.amount || record.quantity || \"\"), actual: \"\", tolerance: String(activeTolerance), resolution: \"\" });\n setPanel(\"reconcile\");\n };\n\n const createRecord = () => {\n const profile = spec.experience.recordProfiles[draft.recordType];\n const validation = validateRecordDraft(draft, profile?.requiredFieldKeys || spec.fields.filter((field) => field.required).map((field) => field.key));\n if (!validation.valid) {\n setError(`${spec.copy.validation}: ${validation.missing.join(\", \")}`);\n return;\n }\n const revision = nowRevision();\n void run(() => api.createRecord({\n record_type: draft.recordType,\n name: draft.name.trim(),\n description: draft.description.trim(),\n priority: draft.priority,\n due_at: draft.dueAt || null,\n values: draft.values,\n source_app: selectedContext ? spec.context?.providerApp || null : null,\n source_object_ref: selectedContext?.id || null,\n source_label: selectedContext?.primary || null,\n idempotency_key: createIdempotencyKey(\"create\", draft.name, revision),\n }));\n };\n\n const transition = () => {\n if (!selectedRecord) return;\n const validation = validateTransition(selectedRecord.state, transitionTarget, spec.transitions);\n if (!validation.allowed || evidence.trim().length < 10) {\n setError(spec.copy.evidenceHint);\n return;\n }\n void run(() => api.transitionRecord({\n record_id: selectedRecord.id,\n target_state: transitionTarget,\n evidence_note: evidence.trim(),\n idempotency_key: createIdempotencyKey(\"transition\", selectedRecord.number, `${selectedRecord.state}-${transitionTarget}`),\n }));\n };\n\n const reconcile = () => {\n if (!selectedRecord) return;\n let result;\n try {\n result = calculateReconciliation(Number(reconciliation.expected), Number(reconciliation.actual), Number(reconciliation.tolerance), reconciliation.resolution);\n } catch (reason) {\n setError((reason as Error).message);\n return;\n }\n if (result.state === \"open\") {\n setError(spec.copy.reconciliationHint);\n return;\n }\n void run(() => api.reconcileRecord({\n record_id: selectedRecord.id,\n reconciliation_type: selectedRecord.record_type,\n expected_value: Number(reconciliation.expected),\n actual_value: Number(reconciliation.actual),\n tolerance: Number(reconciliation.tolerance),\n resolution: reconciliation.resolution.trim(),\n idempotency_key: createIdempotencyKey(\"reconcile\", selectedRecord.number, nowRevision()),\n }));\n };\n\n const savePolicy = () => {\n const code = policy.code.trim() || `${policy.policyType}-SETTINGS`;\n if (policy.name.trim().length < 3 || !policy.effectiveFrom) {\n setError(spec.copy.validation);\n return;\n }\n void run(() => api.savePolicy({\n policy_type: policy.policyType,\n code: code.toUpperCase(),\n name: policy.name.trim(),\n region_code: policy.region.trim().toUpperCase() || \"GLOBAL\",\n version: Number(policy.version),\n effective_from: policy.effectiveFrom,\n threshold: Number(policy.threshold),\n tolerance: Number(policy.tolerance),\n configuration: experiencePolicyConfiguration(experienceLevel, enabledFeatures, spec.experience),\n idempotency_key: createIdempotencyKey(\"policy\", code, policy.version),\n }));\n };\n\n return (\n <AppPage\n title={spec.title}\n description={spec.description}\n icon={spec.icon}\n actions={\n <div className=\"flex w-full flex-wrap gap-2 sm:w-auto sm:justify-end\">\n <Action onClick={() => setPanel(\"help\")}><HelpCircle className=\"h-4 w-4\" />{spec.copy.help}</Action>\n <Action onClick={() => void load()}><RefreshCw className=\"h-4 w-4\" />{spec.copy.refresh}</Action>\n <Action onClick={() => setPanel(\"policy\")}><Settings2 className=\"h-4 w-4\" />{spec.copy.createPolicy}</Action>\n <Action primary onClick={() => setPanel(\"record\")}><Plus className=\"h-4 w-4\" />{activeFlow?.createLabel || spec.copy.createRecord}</Action>\n </div>\n }\n >\n {error && <Banner tone=\"error\"><AlertCircle className=\"h-4 w-4\" />{error}</Banner>}\n {notice && <Banner tone=\"success\"><CheckCircle2 className=\"h-4 w-4\" />{notice}</Banner>}\n <nav className=\"mb-5 grid gap-3 md:grid-cols-2 xl:grid-cols-3\" aria-label={spec.title}>\n {spec.taskFlows.map((flow) => {\n const selected = flow.id === activeFlow?.id;\n const count = records.filter((record) => flow.recordTypes.includes(record.record_type) && !spec.finalStates.includes(record.state)).length;\n return <button key={flow.id} type=\"button\" aria-current={selected ? \"page\" : undefined} onClick={() => selectFlow(flow)} className={`min-h-[112px] rounded-xl border p-4 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ${selected ? \"border-primary bg-primary/5\" : \"bg-card hover:bg-muted/35\"}`}>\n <span className=\"flex items-start justify-between gap-3\"><strong className=\"text-sm\">{flow.title}</strong><span className=\"rounded-md bg-muted px-2 py-1 text-xs font-semibold tabular-nums\">{count}</span></span>\n <span className=\"mt-2 block text-sm leading-6 text-muted-foreground\">{flow.description}</span>\n </button>;\n })}\n </nav>\n <section className=\"grid grid-cols-2 gap-3 lg:grid-cols-4\" aria-label={spec.copy.metricsLabel}>\n {(Object.keys(metrics) as Array<keyof typeof metrics>).map((key) => (\n <article key={key} className=\"rounded-xl bg-muted/45 px-4 py-4\">\n <strong className=\"block text-2xl tabular-nums\">{metrics[key]}</strong>\n <span className=\"mt-1 block text-xs font-medium text-muted-foreground\">{spec.copy.metrics[key]}</span>\n </article>\n ))}\n </section>\n <section className=\"mt-5 rounded-2xl border bg-card p-3 sm:p-4\">\n <div className=\"grid gap-3 lg:grid-cols-[minmax(14rem,1fr)_12rem_12rem]\">\n <label className=\"relative block\">\n <span className=\"sr-only\">{spec.copy.search}</span>\n <Search className=\"pointer-events-none absolute left-3 top-3.5 h-4 w-4 text-muted-foreground\" />\n <input className=\"enterprise-input min-h-[44px] pl-9\" value={filter.search} placeholder={spec.copy.search} onChange={(event) => setFilter({ ...filter, search: event.target.value })} />\n </label>\n <AppSelectInput aria-label={spec.copy.allTypes} className=\"enterprise-input min-h-[44px]\" value={filter.recordType} onChange={(event) => setFilter({ ...filter, recordType: event.target.value })}>\n <option value=\"\">{spec.copy.allTypes}</option>\n {spec.recordTypes.filter((option) => !activeFlow || activeFlow.recordTypes.includes(option.value)).map((option) => <option key={option.value} value={option.value}>{option.label}</option>)}\n </AppSelectInput>\n <AppSelectInput aria-label={spec.copy.allStates} className=\"enterprise-input min-h-[44px]\" value={filter.state} onChange={(event) => setFilter({ ...filter, state: event.target.value })}>\n <option value=\"\">{spec.copy.allStates}</option>\n {spec.states.map((option) => <option key={option.value} value={option.value}>{option.label}</option>)}\n </AppSelectInput>\n </div>\n </section>\n <AppPageStates loading={loading} error={null}>\n <section className=\"mt-4 grid gap-4\">\n <div className=\"min-w-0 overflow-hidden rounded-2xl border bg-card\">\n <div className=\"border-b px-4 py-3\"><h2 className=\"font-semibold\">{activeFlow?.title || spec.copy.queue}</h2>{activeFlow?.description && <p className=\"mt-1 text-sm leading-6 text-muted-foreground\">{activeFlow.description}</p>}</div>\n {filteredRecords.length ? (\n <div className=\"divide-y\">\n {filteredRecords.map((record) => {\n const next = spec.transitions[record.state] || [];\n const profile = spec.experience.recordProfiles[record.record_type];\n return (\n <article key={record.id} className=\"grid gap-3 px-4 py-4 transition-colors hover:bg-muted/30 lg:grid-cols-[minmax(0,1fr)_auto] lg:items-center\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-mono tabular-nums\">{record.number}</span>\n <span>{spec.recordTypes.find((item) => item.value === record.record_type)?.label || record.record_type}</span>\n <StateBadge label={spec.states.find((item) => item.value === record.state)?.label || record.state} />\n </div>\n <h3 className=\"mt-1 truncate font-semibold\">{record.name}</h3>\n <p className=\"mt-1 line-clamp-2 text-sm leading-6 text-muted-foreground\">{record.description}</p>\n <p className=\"mt-2 text-xs text-muted-foreground\">{record.source_label || \"—\"} · {record.updated_at ? formatBusinessDateTime(new Date(record.updated_at)) : \"—\"}</p>\n </div>\n <div className=\"flex flex-wrap gap-2 lg:justify-end\">\n {profile?.supportsReconciliation && <Action onClick={() => openReconciliation(record)}><FileCheck2 className=\"h-4 w-4\" />{spec.copy.actions.reconcile}</Action>}\n <Action primary disabled={!next.length} onClick={() => openTransition(record)}>{next.length ? spec.copy.actions.advance : spec.copy.noNextAction}<ArrowRight className=\"h-4 w-4\" /></Action>\n </div>\n </article>\n );\n })}\n </div>\n ) : <div className=\"p-12 text-center text-sm text-muted-foreground\">{activeFlow?.emptyText || spec.copy.empty}</div>}\n </div>\n <details className=\"group rounded-2xl border bg-card p-4\">\n <summary className=\"flex min-h-[44px] cursor-pointer list-none items-center justify-between gap-3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"><span><strong className=\"block text-sm\">{spec.copy.policies}</strong><span className=\"mt-1 block text-sm leading-6 text-muted-foreground\">{spec.copy.policyIntro}</span></span><ChevronDown className=\"h-4 w-4 shrink-0 transition-transform group-open:rotate-180\" /></summary>\n <div className=\"mt-4 grid gap-3 border-t pt-4 md:grid-cols-2 xl:grid-cols-3\">\n {policies.map((item) => (\n <article key={item.id} className=\"rounded-xl bg-muted/45 p-3\">\n <div className=\"flex items-center justify-between gap-2\"><strong className=\"text-sm\">{item.name}</strong><StateBadge label={item.state} /></div>\n <p className=\"mt-1 text-xs text-muted-foreground\">{item.code} · {item.region_code} · v{item.version}</p>\n </article>\n ))}\n {!policies.length && <p className=\"text-sm text-muted-foreground\">{spec.copy.empty}</p>}\n </div>\n </details>\n </section>\n </AppPageStates>\n {footer}\n {panel === \"record\" && (\n <Drawer title={activeFlow?.createLabel || spec.copy.createRecord} closeLabel={spec.copy.close} close={() => setPanel(null)}>\n <div className=\"grid gap-4\">\n <SelectField label={spec.copy.fields.type} value={draft.recordType} options={creatableRecordTypes} set={(value) => setDraft({ ...draft, recordType: value })} />\n {spec.context && <CrossAppRecordPicker label={spec.context.label} description={spec.context.description} placeholder={spec.context.placeholder} emptyText={spec.context.emptyText} unavailableText={spec.context.unavailableText} forbiddenText={spec.context.forbiddenText} loadPage={spec.context.loadPage} selected={selectedContext} onSelect={setSelectedContext} />}\n <TextField label={spec.copy.fields.name} value={draft.name} set={(value) => setDraft({ ...draft, name: value })} required />\n <TextField label={spec.copy.fields.description} type=\"textarea\" value={draft.description} set={(value) => setDraft({ ...draft, description: value })} required />\n {(() => {\n const profile = spec.experience.recordProfiles[draft.recordType];\n const fieldKeys = new Set(profile?.fieldKeys || spec.fields.map((field) => field.key));\n const advancedKeys = new Set(profile?.advancedFieldKeys || []);\n const primaryFields = spec.fields.filter((field) => fieldKeys.has(field.key) && !advancedKeys.has(field.key));\n const advancedFields = spec.fields.filter((field) => fieldKeys.has(field.key) && advancedKeys.has(field.key));\n const renderField = (field: WorkspaceField) => <DynamicField key={field.key} locale={spec.locale} field={{ ...field, required: profile?.requiredFieldKeys.includes(field.key) ?? field.required }} value={draft.values[field.key]} set={(value) => setDraft({ ...draft, values: { ...draft.values, [field.key]: value } })} />;\n return <>\n {primaryFields.map(renderField)}\n <details className=\"group rounded-xl border bg-muted/20 p-3\">\n <summary className=\"flex min-h-[44px] cursor-pointer list-none items-center justify-between gap-3 font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\">\n <span><span className=\"block text-sm\">{spec.experience.copy.advancedOptions}</span><span className=\"mt-0.5 block text-xs font-normal text-muted-foreground\">{spec.experience.copy.advancedOptionsHint}</span></span>\n <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform group-open:rotate-180\" />\n </summary>\n <div className=\"mt-3 grid gap-4 border-t pt-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <SelectField label={spec.copy.fields.priority} value={draft.priority} options={spec.copy.priorities} set={(value) => setDraft({ ...draft, priority: value })} />\n <TextField label={spec.copy.fields.dueAt} type=\"date\" locale={spec.locale} value={draft.dueAt} set={(value) => setDraft({ ...draft, dueAt: value })} />\n </div>\n {advancedFields.map(renderField)}\n </div>\n </details>\n </>;\n })()}\n <PanelActions copy={spec.copy} saving={saving} cancel={() => setPanel(null)} save={createRecord} />\n </div>\n </Drawer>\n )}\n {panel === \"policy\" && (\n <Drawer title={spec.copy.createPolicy} closeLabel={spec.copy.close} close={() => setPanel(null)}>\n <div className=\"grid gap-4\">\n <SelectField label={spec.copy.fields.policyType} value={policy.policyType} options={spec.policyTypes} set={(value) => setPolicy({ ...policy, policyType: value })} />\n <TextField label={spec.copy.fields.name} value={policy.name} set={(value) => setPolicy({ ...policy, name: value })} required />\n <TextField label={spec.copy.fields.effectiveFrom} type=\"date\" locale={spec.locale} value={policy.effectiveFrom} set={(value) => setPolicy({ ...policy, effectiveFrom: value })} required />\n <div className=\"rounded-xl bg-muted/35 p-4\">\n <SelectField label={spec.experience.copy.experienceLevel} value={experienceLevel} options={[\n { value: \"basic\", label: spec.experience.copy.basic },\n { value: \"standard\", label: spec.experience.copy.standard },\n { value: \"advanced\", label: spec.experience.copy.advanced },\n ]} set={(value) => setExperienceLevel(value as WorkspaceExperienceLevel)} />\n <p className=\"mt-2 text-xs leading-5 text-muted-foreground\">{spec.experience.copy.experienceLevelHint}</p>\n </div>\n {!!spec.experience.capabilities.length && <fieldset className=\"rounded-xl border p-4\">\n <legend className=\"px-1 text-sm font-semibold\">{spec.experience.copy.optionalCapabilities}</legend>\n <p className=\"mb-3 text-xs leading-5 text-muted-foreground\">{spec.experience.copy.optionalCapabilitiesHint}</p>\n <div className=\"grid gap-3\">{spec.experience.capabilities.map((capability) => <label key={capability.key} className=\"flex min-h-[44px] items-start gap-3 rounded-lg bg-muted/35 p-3 text-sm\">\n <AppCheckboxInput className=\"mt-1\" checked={enabledFeatures.has(capability.key)} onChange={(event) => setEnabledFeatures((current) => { const next = new Set(current); if (event.target.checked) next.add(capability.key); else next.delete(capability.key); return next; })} />\n <span><strong className=\"block\">{capability.label}</strong><span className=\"mt-1 block text-xs leading-5 text-muted-foreground\">{capability.description}</span></span>\n </label>)}</div>\n </fieldset>}\n <details className=\"group rounded-xl border bg-muted/20 p-3\">\n <summary className=\"flex min-h-[44px] cursor-pointer list-none items-center justify-between gap-3 text-sm font-medium\"><span>{spec.experience.copy.advancedOptions}</span><ChevronDown className=\"h-4 w-4 transition-transform group-open:rotate-180\" /></summary>\n <div className=\"mt-3 grid gap-4 border-t pt-4 sm:grid-cols-2\">\n <TextField label={spec.copy.fields.region} value={policy.region} set={(value) => setPolicy({ ...policy, region: value })} />\n <TextField label={spec.copy.fields.code} value={policy.code} set={(value) => setPolicy({ ...policy, code: value })} />\n <TextField label={spec.copy.fields.version} type=\"number\" value={policy.version} set={(value) => setPolicy({ ...policy, version: value })} />\n <TextField label={spec.copy.fields.threshold} type=\"number\" value={policy.threshold} set={(value) => setPolicy({ ...policy, threshold: value })} />\n <TextField label={spec.copy.fields.tolerance} type=\"number\" value={policy.tolerance} set={(value) => setPolicy({ ...policy, tolerance: value })} />\n </div>\n </details>\n <PanelActions copy={spec.copy} saving={saving} cancel={() => setPanel(null)} save={savePolicy} />\n </div>\n </Drawer>\n )}\n {panel === \"transition\" && selectedRecord && (\n <Drawer title={`${spec.copy.actions.advance} · ${selectedRecord.number}`} closeLabel={spec.copy.close} close={() => setPanel(null)}>\n <div className=\"grid gap-4\">\n <SelectField label={spec.copy.fields.state} value={transitionTarget} options={(spec.transitions[selectedRecord.state] || []).map((value) => ({ value, label: spec.states.find((item) => item.value === value)?.label || value }))} set={setTransitionTarget} />\n <TextField label={spec.copy.fields.evidence} type=\"textarea\" value={evidence} set={setEvidence} required />\n <p className=\"text-sm leading-6 text-muted-foreground\">{spec.copy.evidenceHint}</p>\n <PanelActions copy={spec.copy} saving={saving} cancel={() => setPanel(null)} save={transition} />\n </div>\n </Drawer>\n )}\n {panel === \"reconcile\" && selectedRecord && (\n <Drawer title={`${spec.copy.actions.reconcile} · ${selectedRecord.number}`} closeLabel={spec.copy.close} close={() => setPanel(null)}>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <TextField label={spec.copy.fields.expected} type=\"number\" value={reconciliation.expected} set={(value) => setReconciliation({ ...reconciliation, expected: value })} required />\n <TextField label={spec.copy.fields.actual} type=\"number\" value={reconciliation.actual} set={(value) => setReconciliation({ ...reconciliation, actual: value })} required />\n <TextField label={spec.copy.fields.tolerance} type=\"number\" value={reconciliation.tolerance} set={(value) => setReconciliation({ ...reconciliation, tolerance: value })} required />\n <div />\n <div className=\"sm:col-span-2\"><TextField label={spec.copy.fields.resolution} type=\"textarea\" value={reconciliation.resolution} set={(value) => setReconciliation({ ...reconciliation, resolution: value })} /></div>\n <div className=\"sm:col-span-2\"><PanelActions copy={spec.copy} saving={saving} cancel={() => setPanel(null)} save={reconcile} /></div>\n </div>\n </Drawer>\n )}\n {panel === \"help\" && (\n <Drawer title={spec.copy.help} closeLabel={spec.copy.close} close={() => setPanel(null)}>\n <div className=\"grid gap-5\">\n {spec.help.map((section, index) => (\n <section key={section.title} className=\"rounded-xl bg-muted/35 p-4\">\n <p className=\"text-xs font-semibold text-muted-foreground\">{String(index + 1).padStart(2, \"0\")}</p>\n <h2 className=\"mt-1 font-semibold\">{section.title}</h2>\n <p className=\"mt-2 text-sm leading-6 text-muted-foreground\">{section.body}</p>\n <ol className=\"mt-3 grid gap-2 text-sm leading-6\">{section.steps.map((step) => <li key={step} className=\"flex gap-2\"><span className=\"text-muted-foreground\">—</span><span>{step}</span></li>)}</ol>\n </section>\n ))}\n </div>\n </Drawer>\n )}\n </AppPage>\n );\n}\n\nfunction Action({ children, onClick, primary = false, disabled = false }: { children: ReactNode; onClick: () => void; primary?: boolean; disabled?: boolean }) {\n return <button type=\"button\" disabled={disabled} onClick={onClick} className={`inline-flex min-h-[44px] items-center justify-center gap-2 rounded-lg px-3 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 ${primary ? \"bg-primary text-primary-foreground hover:bg-primary/90\" : \"border bg-background hover:bg-accent\"}`}>{children}</button>;\n}\n\nfunction Banner({ children, tone }: { children: ReactNode; tone: \"error\" | \"success\" }) {\n return <div role={tone === \"error\" ? \"alert\" : \"status\"} className={`my-4 flex items-center gap-2 rounded-xl border p-4 text-sm ${tone === \"error\" ? \"border-destructive/30 bg-destructive/5 text-destructive\" : \"border-emerald-200 bg-emerald-50 text-emerald-800\"}`}>{children}</div>;\n}\n\nfunction StateBadge({ label }: { label: string }) {\n return <span className=\"inline-flex rounded-md bg-muted px-2 py-1 text-xs font-semibold text-foreground\">{label}</span>;\n}\n\nfunction Drawer({ title, closeLabel, close, children }: { title: string; closeLabel: string; close: () => void; children: ReactNode }) {\n return <AppModal open onClose={close} title={title} closeLabel={closeLabel} size=\"lg\">{children}</AppModal>;\n}\n\nfunction TextField({ label, value, set, type = \"text\", required = false, locale = \"en\" }: { label: string; value: string; set: (value: string) => void; type?: \"text\" | \"number\" | \"date\" | \"datetime-local\" | \"textarea\"; required?: boolean; locale?: string }) {\n return <label className=\"grid gap-1.5 text-sm font-medium\"><span>{label}{required ? \" *\" : \"\"}</span>{type === \"textarea\" ? <textarea className=\"enterprise-input min-h-[112px] resize-y\" value={value} required={required} onChange={(event) => set(event.target.value)} /> : type === \"date\" ? <AppDatePicker value={value} onChange={set} locale={locale} clearable={!required} aria-label={label} popoverLayer=\"aboveModal\" /> : type === \"datetime-local\" ? <AppDateTimePicker value={value} onChange={set} locale={locale} clearable={!required} aria-label={label} popoverLayer=\"aboveModal\" /> : <input className=\"enterprise-input min-h-[44px]\" type={type} value={value} required={required} onChange={(event) => set(event.target.value)} />}</label>;\n}\n\nfunction SelectField({ label, value, options, set }: { label: string; value: string; options: readonly WorkspaceOption[]; set: (value: string) => void }) {\n return <label className=\"grid gap-1.5 text-sm font-medium\"><span>{label}</span><AppSelectInput className=\"enterprise-input min-h-[44px]\" value={value} onChange={(event) => set(event.target.value)}>{options.map((option) => <option key={option.value} value={option.value}>{option.label}</option>)}</AppSelectInput></label>;\n}\n\nfunction DynamicField({ field, value, set, locale }: { field: WorkspaceField; value: BusinessFieldValue | undefined; set: (value: BusinessFieldValue) => void; locale: string }) {\n if (field.type === \"select\") return <div><SelectField label={field.label} value={String(value || field.options?.[0]?.value || \"\")} options={field.options || []} set={set} />{field.help && <p className=\"mt-1 text-xs text-muted-foreground\">{field.help}</p>}</div>;\n return <div><TextField label={field.label} type={field.type} locale={locale} value={String(value ?? \"\")} set={(next) => set(field.type === \"number\" && next !== \"\" ? Number(next) : next)} required={field.required} />{field.help && <p className=\"mt-1 text-xs text-muted-foreground\">{field.help}</p>}</div>;\n}\n\nfunction PanelActions({ copy, saving, cancel, save }: { copy: TaskWorkspaceSpec[\"copy\"]; saving: boolean; cancel: () => void; save: () => void }) {\n return <div className=\"mt-2 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\"><Action onClick={cancel}>{copy.actions.cancel}</Action><Action primary disabled={saving} onClick={save}>{copy.actions.save}</Action></div>;\n}\n"],"names":["catalog","createWorkspaceExperience","applicationId","locale","recordTypes","fields","entry","allFieldKeys","field","basicTypes","item","advancedTypes","reconcileTypes","advancedFields","advancedTypeLabels","recordProfiles","type","fieldKeys","advancedFieldKeys","key","requiredFieldKeys","level","readExperienceConfiguration","policies","experience","today","candidate","policy","experienceLevel","configured","value","enabledFeatures","availableRecordTypes","rank","profile","experiencePolicyConfiguration","enabled","allowedLevels","enabledRecordTypes","nowRevision","TaskWorkspace","spec","api","footer","records","setRecords","useState","setPolicies","loading","setLoading","saving","setSaving","error","setError","notice","setNotice","activeFlowId","setActiveFlowId","panel","setPanel","selectedRecord","setSelectedRecord","selectedContext","setSelectedContext","filter","setFilter","draft","setDraft","evidence","setEvidence","transitionTarget","setTransitionTarget","reconciliation","setReconciliation","setPolicy","setExperienceLevel","setEnabledFeatures","load","useCallback","nextRecords","nextPolicies","current","currentFlow","flow","record","configuration","reason","useEffect","run","operation","activeFlow","useMemo","flowRecords","filteredRecords","filterBusinessRecords","creatableRecordTypes","recordType","activeThreshold","metrics","selectFlow","firstType","openTransition","target","openReconciliation","activeTolerance","createRecord","validation","validateRecordDraft","revision","createIdempotencyKey","transition","validateTransition","reconcile","result","calculateReconciliation","savePolicy","code","jsxs","AppPage","Action","jsx","HelpCircle","RefreshCw","Settings2","Plus","Banner","AlertCircle","CheckCircle2","selected","count","Search","event","AppSelectInput","option","AppPageStates","next","StateBadge","formatBusinessDateTime","FileCheck2","ArrowRight","ChevronDown","Drawer","SelectField","CrossAppRecordPicker","TextField","advancedKeys","primaryFields","renderField","DynamicField","Fragment","PanelActions","capability","AppCheckboxInput","section","index","step","children","onClick","primary","disabled","tone","label","title","closeLabel","close","AppModal","set","required","AppDatePicker","AppDateTimePicker","options","copy","cancel","save"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ChangeEvent, InputHTMLAttributes } from 'react';
|
|
2
|
+
|
|
3
|
+
export type AppCheckboxInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'checked' | 'defaultChecked' | 'onChange' | 'type'> & {
|
|
4
|
+
checked?: boolean;
|
|
5
|
+
defaultChecked?: boolean;
|
|
6
|
+
onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
7
|
+
};
|
|
8
|
+
/** Input-compatible adapter for the platform Checkbox. */
|
|
9
|
+
export declare function AppCheckboxInput({ checked, defaultChecked, onChange, className, disabled, required, name, value, id, 'aria-label': ariaLabel, 'aria-describedby': ariaDescribedBy }: AppCheckboxInputProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface AppConfirmDialogProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
title: string;
|
|
4
|
+
message: string;
|
|
5
|
+
confirmLabel?: string;
|
|
6
|
+
cancelLabel?: string;
|
|
7
|
+
onConfirm: () => void;
|
|
8
|
+
onCancel: () => void;
|
|
9
|
+
danger?: boolean;
|
|
10
|
+
loading?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function AppConfirmDialog({ open, title, message, confirmLabel, cancelLabel, onConfirm, onCancel, danger, loading, }: AppConfirmDialogProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface AppDashboardSkeletonProps {
|
|
2
|
+
className?: string;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Page-level loading state for GeniApp dashboards. Its chrome and responsive
|
|
6
|
+
* grid mirror `AppPage` and the common dashboard composition so loading does
|
|
7
|
+
* not shift from a generic table into the final page.
|
|
8
|
+
*/
|
|
9
|
+
export declare function AppDashboardSkeleton({ className }: AppDashboardSkeletonProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Matcher } from 'react-day-picker';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
export type AppDatePickerPopoverLayer = 'default' | 'aboveModal';
|
|
4
|
+
export type AppDateTimePickerPopoverLayer = AppDatePickerPopoverLayer;
|
|
5
|
+
export interface AppTemporalLabels {
|
|
6
|
+
chooseDate: string;
|
|
7
|
+
chooseDateTime: string;
|
|
8
|
+
chooseTime: string;
|
|
9
|
+
clear: string;
|
|
10
|
+
today: string;
|
|
11
|
+
previousYear: string;
|
|
12
|
+
nextYear: string;
|
|
13
|
+
hour: string;
|
|
14
|
+
minute: string;
|
|
15
|
+
apply: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AppDatePickerProps {
|
|
18
|
+
id?: string;
|
|
19
|
+
value: string;
|
|
20
|
+
onChange: (value: string) => void;
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
placeholder?: string;
|
|
23
|
+
className?: string;
|
|
24
|
+
triggerClassName?: string;
|
|
25
|
+
min?: string;
|
|
26
|
+
max?: string;
|
|
27
|
+
locale?: string;
|
|
28
|
+
labels?: Partial<AppTemporalLabels>;
|
|
29
|
+
clearable?: boolean;
|
|
30
|
+
'aria-label'?: string;
|
|
31
|
+
popoverLayer?: AppDatePickerPopoverLayer;
|
|
32
|
+
disabledDays?: Matcher | Matcher[];
|
|
33
|
+
presets?: Array<{
|
|
34
|
+
label: string;
|
|
35
|
+
value: string;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
export interface AppDateRangePickerProps extends Omit<AppDatePickerProps, 'value' | 'onChange' | 'presets'> {
|
|
39
|
+
value: {
|
|
40
|
+
from: string;
|
|
41
|
+
to: string;
|
|
42
|
+
};
|
|
43
|
+
onChange: (value: {
|
|
44
|
+
from: string;
|
|
45
|
+
to: string;
|
|
46
|
+
}) => void;
|
|
47
|
+
presets?: Array<{
|
|
48
|
+
label: string;
|
|
49
|
+
value: {
|
|
50
|
+
from: string;
|
|
51
|
+
to: string;
|
|
52
|
+
};
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
export interface AppDateTimePickerProps extends Omit<AppDatePickerProps, 'placeholder'> {
|
|
56
|
+
placeholder?: string;
|
|
57
|
+
minuteStep?: number;
|
|
58
|
+
}
|
|
59
|
+
export interface AppTimePickerProps extends Pick<AppDatePickerProps, 'id' | 'value' | 'onChange' | 'disabled' | 'className' | 'triggerClassName' | 'locale' | 'labels' | 'clearable' | 'aria-label' | 'popoverLayer'> {
|
|
60
|
+
placeholder?: string;
|
|
61
|
+
minuteStep?: number;
|
|
62
|
+
}
|
|
63
|
+
export declare function temporalLabels(locale?: string, overrides?: Partial<AppTemporalLabels>): AppTemporalLabels;
|
|
64
|
+
export declare function parseBusinessDate(value?: string): Date | undefined;
|
|
65
|
+
export declare function formatBusinessDateValue(date: Date): string;
|
|
66
|
+
export declare function AppDatePicker(props: AppDatePickerProps): React.JSX.Element;
|
|
67
|
+
export declare function AppDateRangePicker(props: AppDateRangePickerProps): React.JSX.Element;
|
|
68
|
+
export declare function AppDateTimePicker(props: AppDateTimePickerProps): React.JSX.Element;
|
|
69
|
+
export declare function AppTimePicker(props: AppTimePickerProps): React.JSX.Element;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export type AppModalSize = 'sm' | 'md' | 'lg' | 'xl' | 'wide';
|
|
4
|
+
export interface AppModalProps {
|
|
5
|
+
open: boolean;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
title: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
footer?: ReactNode;
|
|
11
|
+
size?: AppModalSize;
|
|
12
|
+
contentClassName?: string;
|
|
13
|
+
bodyClassName?: string;
|
|
14
|
+
closeLabel?: string;
|
|
15
|
+
closeOnOutside?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function AppModal({ open, onClose, title, description, children, footer, size, contentClassName, bodyClassName, closeLabel, closeOnOutside, }: AppModalProps): import("react").JSX.Element | null;
|
|
18
|
+
export interface AppHelpSheetProps {
|
|
19
|
+
open: boolean;
|
|
20
|
+
onClose: () => void;
|
|
21
|
+
title: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
side?: 'left' | 'right';
|
|
25
|
+
className?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function AppHelpSheet({ open, onClose, title, description, children, side, className }: AppHelpSheetProps): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { PageSkeletonPreset } from '../../primitives/page-skeleton';
|
|
3
|
+
|
|
4
|
+
export interface AppPageStatesProps {
|
|
5
|
+
loading: boolean;
|
|
6
|
+
error: string | null;
|
|
7
|
+
onRetry?: () => void;
|
|
8
|
+
retryLabel?: string;
|
|
9
|
+
/** Used when `loadingFallback` is not provided. Default: `table-page`. */
|
|
10
|
+
preset?: PageSkeletonPreset;
|
|
11
|
+
/** Custom skeleton for pages whose layout does not match a preset. */
|
|
12
|
+
loadingFallback?: ReactNode;
|
|
13
|
+
className?: string;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
/** Standard GeniApp page body: loading skeleton, query error, or main content. */
|
|
17
|
+
export declare function AppPageStates({ loading, error, onRetry, retryLabel, preset, loadingFallback, className, children, }: AppPageStatesProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ChangeEvent, ReactNode, SelectHTMLAttributes } from 'react';
|
|
2
|
+
|
|
3
|
+
export type AppSelectInputProps = Omit<SelectHTMLAttributes<HTMLSelectElement>, 'onChange' | 'size'> & {
|
|
4
|
+
onChange?: (event: ChangeEvent<HTMLSelectElement>) => void;
|
|
5
|
+
children?: ReactNode;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
contentClassName?: string;
|
|
8
|
+
};
|
|
9
|
+
/** Input-compatible adapter for the platform Select. */
|
|
10
|
+
export declare function AppSelectInput({ value, defaultValue, onChange, children, className, contentClassName, disabled, required, name, id, placeholder, 'aria-label': ariaLabel, 'aria-describedby': ariaDescribedBy, }: AppSelectInputProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AppTemporalLabels, AppDatePickerPopoverLayer } from './AppDatePicker';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
export type TemporalInputType = 'date' | 'datetime-local' | 'time';
|
|
4
|
+
export interface AppTemporalInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue' | 'onChange' | 'type' | 'min' | 'max'> {
|
|
5
|
+
type?: React.HTMLInputTypeAttribute;
|
|
6
|
+
value?: string | number | readonly string[];
|
|
7
|
+
defaultValue?: string | number | readonly string[];
|
|
8
|
+
onChange?: React.ChangeEventHandler<HTMLInputElement>;
|
|
9
|
+
onValueChange?: (value: string) => void;
|
|
10
|
+
min?: string | number;
|
|
11
|
+
max?: string | number;
|
|
12
|
+
locale?: string;
|
|
13
|
+
labels?: Partial<AppTemporalLabels>;
|
|
14
|
+
clearable?: boolean;
|
|
15
|
+
minuteStep?: number;
|
|
16
|
+
popoverLayer?: AppDatePickerPopoverLayer;
|
|
17
|
+
}
|
|
18
|
+
export declare function isTemporalInputType(type?: React.HTMLInputTypeAttribute): type is TemporalInputType;
|
|
19
|
+
export declare const AppTemporalInput: React.ForwardRefExoticComponent<AppTemporalInputProps & React.RefAttributes<HTMLInputElement>>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { LucideIcon } from 'lucide-react';
|
|
3
|
+
|
|
4
|
+
export interface AppPageProps {
|
|
5
|
+
title: string;
|
|
6
|
+
icon?: LucideIcon;
|
|
7
|
+
description?: string;
|
|
8
|
+
/** Renders to the left of the title block (e.g. a back button). */
|
|
9
|
+
leading?: ReactNode;
|
|
10
|
+
/** Action buttons rendered top-right. */
|
|
11
|
+
actions?: ReactNode;
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
}
|
|
14
|
+
export declare function AppPage({ title, icon: Icon, description, leading, actions, children }: AppPageProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface QueryErrorAlertProps {
|
|
2
|
+
message: string;
|
|
3
|
+
onRetry?: () => void;
|
|
4
|
+
retryLabel?: string;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function QueryErrorAlert({ message, onRetry, retryLabel, className, }: QueryErrorAlertProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface AppSidebarProps {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
sidebarHeader: ReactNode | ((collapsed: boolean) => ReactNode);
|
|
6
|
+
/**
|
|
7
|
+
* Legacy single-level navigation. Existing GeniApps can keep passing this
|
|
8
|
+
* prop without any behavioural or visual changes.
|
|
9
|
+
*/
|
|
10
|
+
sidebarNav?: ReactNode | ((collapsed: boolean) => ReactNode);
|
|
11
|
+
/**
|
|
12
|
+
* Optional grouped navigation for applications with a second information
|
|
13
|
+
* level. When supplied it takes precedence over `sidebarNav`.
|
|
14
|
+
*/
|
|
15
|
+
sidebarNavGroups?: AppSidebarNavGroup[] | ((collapsed: boolean) => AppSidebarNavGroup[]);
|
|
16
|
+
/**
|
|
17
|
+
* Optional navigation pinned below the scrollable navigation area. A render
|
|
18
|
+
* function can adapt the item to the desktop collapsed state. Returning
|
|
19
|
+
* `null` removes both the footer content and its separator.
|
|
20
|
+
*/
|
|
21
|
+
sidebarFooter?: ReactNode | ((collapsed: boolean) => ReactNode);
|
|
22
|
+
collapsible?: boolean;
|
|
23
|
+
defaultCollapsed?: boolean;
|
|
24
|
+
withMobileDrawer?: boolean;
|
|
25
|
+
mobileTitle?: string;
|
|
26
|
+
navAriaLabel?: string;
|
|
27
|
+
expandLabel?: string;
|
|
28
|
+
collapseLabel?: string;
|
|
29
|
+
openLabel?: string;
|
|
30
|
+
closeLabel?: string;
|
|
31
|
+
storageKey?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface AppSidebarNavGroup {
|
|
34
|
+
/** Stable key used for expansion state and rendering. */
|
|
35
|
+
id: string;
|
|
36
|
+
/** Business-facing section label, for example "智能审核". */
|
|
37
|
+
label: ReactNode;
|
|
38
|
+
/** Optional compact symbol shown when the sidebar is collapsed. */
|
|
39
|
+
icon?: ReactNode;
|
|
40
|
+
/** Navigation links or buttons. Callers retain routing and RBAC control. */
|
|
41
|
+
items: ReactNode[];
|
|
42
|
+
/** Groups default to expandable. Set false for a permanent section. */
|
|
43
|
+
collapsible?: boolean;
|
|
44
|
+
/** Initial state for expandable groups. */
|
|
45
|
+
defaultOpen?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export declare function AppSidebar({ children, sidebarHeader, sidebarNav, sidebarNavGroups, sidebarFooter, collapsible, defaultCollapsed, withMobileDrawer, mobileTitle: _mobileTitle, navAriaLabel, expandLabel, collapseLabel, openLabel, closeLabel, storageKey, }: AppSidebarProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { AppSidebar, type AppSidebarProps, type AppSidebarNavGroup } from './Sidebar';
|
|
2
|
+
export { AppPage, type AppPageProps } from './Page';
|
|
3
|
+
export { AppPageStates, type AppPageStatesProps } from './AppPageStates';
|
|
4
|
+
export { AppDashboardSkeleton, type AppDashboardSkeletonProps } from './AppDashboardSkeleton';
|
|
5
|
+
export { QueryErrorAlert } from './QueryErrorAlert';
|
|
6
|
+
export { AppModal, AppHelpSheet, type AppModalProps, type AppModalSize, type AppHelpSheetProps } from './AppModal';
|
|
7
|
+
export { AppConfirmDialog, type AppConfirmDialogProps } from './AppConfirmDialog';
|
|
8
|
+
export { AppDatePicker, AppDateRangePicker, AppDateTimePicker, AppTimePicker, temporalLabels, parseBusinessDate, formatBusinessDateValue, type AppDatePickerProps, type AppDateRangePickerProps, type AppDateTimePickerProps, type AppTimePickerProps, type AppTemporalLabels, type AppDatePickerPopoverLayer, type AppDateTimePickerPopoverLayer, } from './AppDatePicker';
|
|
9
|
+
export { AppTemporalInput, isTemporalInputType, type AppTemporalInputProps, type TemporalInputType, } from './AppTemporalInput';
|
|
10
|
+
export { AppSelectInput, type AppSelectInputProps } from './AppSelectInput';
|
|
11
|
+
export { AppCheckboxInput, type AppCheckboxInputProps } from './AppCheckboxInput';
|
|
12
|
+
export { UserDisplay, type UserDisplayProps } from '../user/UserDisplay';
|
|
13
|
+
export { UserSelect, type UserSelectProps } from '../user/UserSelect';
|
|
14
|
+
export { useUserDirectory, type UseUserDirectoryOptions, type UseUserDirectoryResult, } from '../user/useUserDirectory';
|
|
15
|
+
export type { PublicUserProfile, UserDirectoryClient } from '../user/userDirectoryTypes';
|
|
16
|
+
export { Skeleton } from '../../ui/skeleton';
|
|
17
|
+
export { TablePageSkeleton, PageLoadingSkeleton, DetailTabsSkeleton, ConfigEditorSkeleton, FormPageSkeleton, GridCardsSkeleton, StatsRowSkeleton, type TablePageSkeletonProps, type PageSkeletonPreset, } from '../../primitives/page-skeleton';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare function userInitials(name: string, email?: string): string;
|
|
2
|
+
export declare function resolveAvatarUrl(u: {
|
|
3
|
+
avatarUrl?: string | null;
|
|
4
|
+
avatar?: string | null;
|
|
5
|
+
}): string | null;
|
|
6
|
+
export type UserAvatarVariant = 'default' | 'chatUser';
|
|
7
|
+
export interface UserAvatarProps {
|
|
8
|
+
name: string;
|
|
9
|
+
email?: string;
|
|
10
|
+
avatarUrl?: string | null;
|
|
11
|
+
/** Tailwind size classes, e.g. size-5, size-6, size-20 */
|
|
12
|
+
sizeClassName?: string;
|
|
13
|
+
className?: string;
|
|
14
|
+
variant?: UserAvatarVariant;
|
|
15
|
+
shape?: 'circle' | 'rounded';
|
|
16
|
+
}
|
|
17
|
+
export declare function UserAvatar({ name, email, avatarUrl, sizeClassName, className, variant, shape, }: UserAvatarProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PublicUserProfile } from './userDirectoryTypes';
|
|
2
|
+
|
|
3
|
+
export type UserDisplayProps = {
|
|
4
|
+
userId?: string | null;
|
|
5
|
+
profile?: PublicUserProfile | null;
|
|
6
|
+
showAvatar?: boolean;
|
|
7
|
+
className?: string;
|
|
8
|
+
emptyLabel?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function UserDisplay({ userId, profile, showAvatar, className, emptyLabel, }: UserDisplayProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PublicUserProfile } from './userDirectoryTypes';
|
|
2
|
+
|
|
3
|
+
export type UserSelectProps = {
|
|
4
|
+
value: string;
|
|
5
|
+
onChange: (userId: string) => void;
|
|
6
|
+
members: PublicUserProfile[];
|
|
7
|
+
allowEmpty?: boolean;
|
|
8
|
+
emptyLabel?: string;
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
className?: string;
|
|
12
|
+
id?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function UserSelect({ value, onChange, members, allowEmpty, emptyLabel, placeholder, disabled, className, id, }: UserSelectProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PublicUserProfile, UserDirectoryClient } from './userDirectoryTypes';
|
|
2
|
+
|
|
3
|
+
export type UseUserDirectoryOptions = {
|
|
4
|
+
memberStatus?: string;
|
|
5
|
+
};
|
|
6
|
+
export type UseUserDirectoryResult = {
|
|
7
|
+
loading: boolean;
|
|
8
|
+
error: string | null;
|
|
9
|
+
members: PublicUserProfile[];
|
|
10
|
+
getProfile: (userId: string | null | undefined) => PublicUserProfile | undefined;
|
|
11
|
+
resolveMany: (userIds: string[]) => Promise<void>;
|
|
12
|
+
};
|
|
13
|
+
export declare function useUserDirectory(client: UserDirectoryClient | null | undefined, options?: UseUserDirectoryOptions): UseUserDirectoryResult;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type PublicUserProfile = {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
email?: string;
|
|
5
|
+
avatarUrl?: string | null;
|
|
6
|
+
status?: string;
|
|
7
|
+
};
|
|
8
|
+
/** Minimal GeniSpace client surface for user directory hooks. */
|
|
9
|
+
export type UserDirectoryClient = {
|
|
10
|
+
spaces: {
|
|
11
|
+
listMemberProfiles(params?: {
|
|
12
|
+
status?: string;
|
|
13
|
+
}): Promise<PublicUserProfile[]>;
|
|
14
|
+
};
|
|
15
|
+
users: {
|
|
16
|
+
getPublicProfiles(userIds: string[]): Promise<PublicUserProfile[]>;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export type FormSectionProps = {
|
|
3
|
+
title: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Grouped form block: title, optional description, and fields (design tokens).
|
|
10
|
+
*/
|
|
11
|
+
export declare function FormSection({ title, description, children, className }: FormSectionProps): React.JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function Toaster(): import("react").JSX.Element;
|