@acorex-platform/module-software-management-client 0.0.46
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/fesm2022/acorex-platform-module-software-management-client-accept-software-suggestion.command-DVcM5TTv.mjs +83 -0
- package/fesm2022/acorex-platform-module-software-management-client-accept-software-suggestion.command-DVcM5TTv.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-complete-software-phase.activity-C56HhK20.mjs +182 -0
- package/fesm2022/acorex-platform-module-software-management-client-complete-software-phase.activity-C56HhK20.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-contracts.mjs +1196 -0
- package/fesm2022/acorex-platform-module-software-management-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-discovery-kickoff.commands-gB0_htfF.mjs +162 -0
- package/fesm2022/acorex-platform-module-software-management-client-discovery-kickoff.commands-gB0_htfF.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-discovery-report.commands-D2ricLpq.mjs +278 -0
- package/fesm2022/acorex-platform-module-software-management-client-discovery-report.commands-D2ricLpq.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-introduction-exit-message.util-DShFM8MY.mjs +71 -0
- package/fesm2022/acorex-platform-module-software-management-client-introduction-exit-message.util-DShFM8MY.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-introduction-task.activities-BOsJbeJe.mjs +158 -0
- package/fesm2022/acorex-platform-module-software-management-client-introduction-task.activities-BOsJbeJe.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-software-command.util-BsoKQCX5.mjs +9 -0
- package/fesm2022/acorex-platform-module-software-management-client-software-command.util-BsoKQCX5.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-start-software-definition-flow.command-B0YCgv2V.mjs +124 -0
- package/fesm2022/acorex-platform-module-software-management-client-start-software-definition-flow.command-B0YCgv2V.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client.mjs +260 -0
- package/fesm2022/acorex-platform-module-software-management-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-module-software-management-client-contracts.d.ts +547 -0
- package/types/acorex-platform-module-software-management-client.d.ts +9 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-software-management-client-contracts.mjs","sources":["../../../../libs/modules/software-management/contracts/src/permission.keys.ts","../../../../libs/modules/software-management/contracts/src/menu.keys.ts","../../../../libs/modules/software-management/contracts/src/root-config.ts","../../../../libs/modules/software-management/contracts/src/manifest.ts","../../../../libs/modules/software-management/contracts/src/runtime.keys.ts","../../../../libs/modules/software-management/contracts/src/software-phase.constants.ts","../../../../libs/modules/software-management/contracts/src/software-provenance.constants.ts","../../../../libs/modules/software-management/contracts/src/software-definition.workflow.ts","../../../../libs/modules/software-management/contracts/src/discovery-kickoff.sheet.ts","../../../../libs/modules/software-management/contracts/src/discovery-report.sheet.ts","../../../../libs/modules/software-management/contracts/src/software-gate.util.ts","../../../../libs/modules/software-management/contracts/src/acorex-platform-module-software-management-client-contracts.ts"],"sourcesContent":["/**\n * Applications & Platform capability for defining standalone software products.\n * Group ids live in `AXPCommonPermissionGroupKeys`.\n */\nexport const AXPSoftwareManagementPermissionKeys = {\n MaintainSoftwareDefinitions: 'ApplicationsPlatform:Permission:MaintainSoftwareDefinitions',\n} as const;\n","export const AXPSoftwareManagementMenuKeys = {\n Root: 'SoftwareManagement:Menu',\n Software: 'SoftwareManagement:Menu:Software',\n DiscoveryItems: 'SoftwareManagement:Menu:DiscoveryItems',\n ScopeItems: 'SoftwareManagement:Menu:ScopeItems',\n Requirements: 'SoftwareManagement:Menu:Requirements',\n AcceptanceCriteria: 'SoftwareManagement:Menu:AcceptanceCriteria',\n BusinessRules: 'SoftwareManagement:Menu:BusinessRules',\n Modules: 'SoftwareManagement:Menu:Modules',\n Features: 'SoftwareManagement:Menu:Features',\n UseCases: 'SoftwareManagement:Menu:UseCases',\n DesignDecisions: 'SoftwareManagement:Menu:DesignDecisions',\n} as const;\n","const config = {\n i18n: 'software-management',\n module: 'SoftwareManagement',\n} as const;\n\nexport const RootConfig = {\n config,\n module: {\n module: 'software-management',\n name: config.module,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-diagram-project',\n },\n entities: {\n software: {\n name: 'Software',\n source: `${config.module}.Software`,\n title: `@${config.i18n}:entities.software.title`,\n titlePlural: `@${config.i18n}:entities.software.plural`,\n icon: 'fa-light fa-lightbulb',\n },\n discoveryItem: {\n name: 'SoftwareDiscoveryItem',\n source: `${config.module}.SoftwareDiscoveryItem`,\n title: `@${config.i18n}:entities.discovery-item.title`,\n titlePlural: `@${config.i18n}:entities.discovery-item.plural`,\n icon: 'fa-light fa-magnifying-glass',\n },\n scopeItem: {\n name: 'SoftwareScopeItem',\n source: `${config.module}.SoftwareScopeItem`,\n title: `@${config.i18n}:entities.scope-item.title`,\n titlePlural: `@${config.i18n}:entities.scope-item.plural`,\n icon: 'fa-light fa-border-outer',\n },\n requirement: {\n name: 'SoftwareRequirement',\n source: `${config.module}.SoftwareRequirement`,\n title: `@${config.i18n}:entities.requirement.title`,\n titlePlural: `@${config.i18n}:entities.requirement.plural`,\n icon: 'fa-light fa-list-check',\n },\n acceptanceCriterion: {\n name: 'SoftwareAcceptanceCriterion',\n source: `${config.module}.SoftwareAcceptanceCriterion`,\n title: `@${config.i18n}:entities.acceptance-criterion.title`,\n titlePlural: `@${config.i18n}:entities.acceptance-criterion.plural`,\n icon: 'fa-light fa-badge-check',\n },\n businessRule: {\n name: 'SoftwareBusinessRule',\n source: `${config.module}.SoftwareBusinessRule`,\n title: `@${config.i18n}:entities.business-rule.title`,\n titlePlural: `@${config.i18n}:entities.business-rule.plural`,\n icon: 'fa-light fa-scale-balanced',\n },\n module: {\n name: 'SoftwareModule',\n source: `${config.module}.SoftwareModule`,\n title: `@${config.i18n}:entities.module.title`,\n titlePlural: `@${config.i18n}:entities.module.plural`,\n icon: 'fa-light fa-cubes',\n },\n feature: {\n name: 'SoftwareFeature',\n source: `${config.module}.SoftwareFeature`,\n title: `@${config.i18n}:entities.feature.title`,\n titlePlural: `@${config.i18n}:entities.feature.plural`,\n icon: 'fa-light fa-puzzle-piece',\n },\n useCase: {\n name: 'SoftwareUseCase',\n source: `${config.module}.SoftwareUseCase`,\n title: `@${config.i18n}:entities.use-case.title`,\n titlePlural: `@${config.i18n}:entities.use-case.plural`,\n icon: 'fa-light fa-person-walking-arrow-right',\n },\n designDecision: {\n name: 'SoftwareDesignDecision',\n source: `${config.module}.SoftwareDesignDecision`,\n title: `@${config.i18n}:entities.design-decision.title`,\n titlePlural: `@${config.i18n}:entities.design-decision.plural`,\n icon: 'fa-light fa-compass-drafting',\n },\n },\n} as const;\n","//#region ---- Imports ----\n\nimport { AXPModuleManifest } from '@acorex-platform/framework-shared/core';\n\nimport { RootConfig } from './root-config';\n\n//#endregion\n\n//#region ---- Manifest ----\n\nexport const SoftwareManagementManifest: AXPModuleManifest = {\n name: RootConfig.module.name,\n version: '1.0.0',\n title: RootConfig.module.title,\n icon: RootConfig.module.icon,\n i18n: RootConfig.config.i18n,\n type: 'platform',\n domain: 'platform',\n required: false,\n};\n\n//#endregion\n","export const AXPSoftwareManagementCommandKeys = {\n Software: {\n StartFlow: 'SoftwareManagement.Software:StartFlow',\n CompletePhase: 'SoftwareManagement.Software:CompletePhase',\n AcceptSuggestion: 'SoftwareManagement:AcceptSuggestion',\n GenerateKickoffSheet: 'SoftwareManagement.Software:GenerateKickoffSheet',\n SubmitKickoffSheet: 'SoftwareManagement.Software:SubmitKickoffSheet',\n ExportKickoffPdf: 'SoftwareManagement.Software:ExportKickoffPdf',\n OpenKickoffSheet: 'SoftwareManagement.Software:OpenKickoffSheet',\n ViewPinnedKickoff: 'SoftwareManagement.Software:ViewPinnedKickoff',\n GenerateDiscoveryReport: 'SoftwareManagement.Software:GenerateDiscoveryReport',\n SubmitDiscoveryReport: 'SoftwareManagement.Software:SubmitDiscoveryReport',\n ExportDiscoveryReportPdf: 'SoftwareManagement.Software:ExportDiscoveryReportPdf',\n OpenDiscoveryReport: 'SoftwareManagement.Software:OpenDiscoveryReport',\n LinkDiscoveryQuestionnaire: 'SoftwareManagement.Software:LinkDiscoveryQuestionnaire',\n },\n WorkflowActivity: {\n CompletePhase: 'workflow-activity:complete-software-phase',\n LoadIntroduction: 'workflow-activity:load-software-introduction',\n SaveIntroduction: 'workflow-activity:save-software-introduction',\n },\n} as const;\n","export const SOFTWARE_PHASES = [\n 'introduction',\n 'discovery',\n 'first-version-scope',\n 'behavior-specification',\n 'design',\n 'delivery-planning',\n] as const;\n\nexport type SoftwarePhase = (typeof SOFTWARE_PHASES)[number];\n\nexport const SOFTWARE_DEFINITION_WORKFLOW_NAME = 'software-definition';\n\nexport function softwarePhaseIndex(phase: string | null | undefined): number {\n return SOFTWARE_PHASES.indexOf(phase as SoftwarePhase);\n}\n\nexport function nextSoftwarePhase(phase: string | null | undefined): SoftwarePhase | null {\n const index = softwarePhaseIndex(phase);\n if (index < 0 || index >= SOFTWARE_PHASES.length - 1) {\n return null;\n }\n return SOFTWARE_PHASES[index + 1];\n}\n\nexport function isSoftwarePhaseAtLeast(\n current: string | null | undefined,\n required: SoftwarePhase,\n): boolean {\n const currentIndex = softwarePhaseIndex(current);\n const requiredIndex = softwarePhaseIndex(required);\n return currentIndex >= 0 && requiredIndex >= 0 && currentIndex >= requiredIndex;\n}\n","export const SOFTWARE_ORIGINS = ['original', 'assumption', 'suggestion', 'approved-fact'] as const;\n\nexport type SoftwareOrigin = (typeof SOFTWARE_ORIGINS)[number];\n\nexport const SOFTWARE_PROPOSED_BY = ['user', 'ai'] as const;\n\nexport type SoftwareProposedBy = (typeof SOFTWARE_PROPOSED_BY)[number];\n\nexport const SOFTWARE_DISCOVERY_KINDS = [\n 'audience',\n 'problem',\n 'pain',\n 'current-practice',\n 'constraint',\n 'alternative',\n 'hypothesis',\n 'evidence',\n 'unknown',\n] as const;\n\nexport type SoftwareDiscoveryKind = (typeof SOFTWARE_DISCOVERY_KINDS)[number];\n\nexport const SOFTWARE_SCOPE_KINDS = ['capability', 'out-of-scope', 'success-metric'] as const;\n\nexport type SoftwareScopeKind = (typeof SOFTWARE_SCOPE_KINDS)[number];\n\nexport const SOFTWARE_DESIGN_KINDS = ['data-model', 'ux', 'technical'] as const;\n\nexport type SoftwareDesignKind = (typeof SOFTWARE_DESIGN_KINDS)[number];\n","import type { AXPWorkflowDefinition } from '@acorex-platform/framework-shared/core';\n\nimport { AXPSoftwareManagementCommandKeys } from './runtime.keys';\nimport { SOFTWARE_DEFINITION_WORKFLOW_NAME, SOFTWARE_PHASES } from './software-phase.constants';\n\nconst M = (en: string, fa: string) => ({ 'en-US': en, 'fa-IR': fa });\n\nconst completeAction = {\n name: 'complete-phase',\n title: '@software-management:actions.complete-phase.title',\n icon: 'fa-light fa-check',\n color: 'success',\n command: { name: 'complete-phase' },\n};\n\nconst dialogCancelAction = {\n title: '@general:actions.cancel.title',\n icon: 'fa-times',\n color: 'default',\n command: { name: 'cancel' },\n};\n\nconst dialogSaveAction = {\n title: '@general:actions.save.title',\n icon: 'fa-check',\n color: 'primary',\n command: { name: 'submit', options: { validate: true } },\n};\n\nfunction introductionField(label: string, path: string, editor: 'text-editor' | 'large-text-editor' | 'lookup-editor', readonly: boolean) {\n const editorNode =\n editor === 'lookup-editor'\n ? {\n type: 'lookup-editor',\n path,\n name: path,\n options: {\n entity: 'SecurityManagement.User',\n textField: 'displayName',\n valueField: 'id',\n look: 'select',\n columns: ['displayName', 'username'],\n readonly,\n disabled: readonly,\n },\n }\n : {\n type: editor,\n path,\n name: path,\n options: {\n readonly,\n disabled: readonly,\n ...(editor === 'large-text-editor' ? { rows: 4 } : {}),\n },\n };\n return {\n type: 'grid-item-layout',\n options: { colSpan: 12 },\n children: [\n {\n type: 'form-field',\n options: { label, showLabel: true },\n children: [editorNode],\n },\n ],\n };\n}\n\nfunction introductionDialogLayout(readonly: boolean) {\n return {\n type: 'grid-layout',\n mode: readonly ? 'view' : 'edit',\n options: {\n grid: {\n default: {\n columns: 'repeat(12, 1fr)',\n rows: 'repeat(7, auto)',\n gap: '16px',\n },\n },\n },\n children: [\n introductionField('@software-management:entities.software.fields.title.title', 'title', 'text-editor', readonly),\n introductionField('@software-management:entities.software.fields.idea.title', 'idea', 'large-text-editor', readonly),\n introductionField('@software-management:entities.software.fields.initial-problem.title', 'initialProblem', 'large-text-editor', readonly),\n introductionField('@software-management:entities.software.fields.goal.title', 'goal', 'large-text-editor', readonly),\n introductionField('@software-management:entities.software.fields.owner.title', 'ownerId', 'lookup-editor', readonly),\n introductionField('@software-management:entities.software.fields.potential-users.title', 'potentialUsers', 'large-text-editor', readonly),\n introductionField('@software-management:entities.software.fields.open-questions.title', 'openQuestions', 'large-text-editor', readonly),\n ],\n };\n}\n\nfunction introductionDialogContext() {\n return {\n title: '{{ context.eval(\"outputs.last.title\") }}',\n idea: '{{ context.eval(\"outputs.last.idea\") }}',\n initialProblem: '{{ context.eval(\"outputs.last.initialProblem\") }}',\n goal: '{{ context.eval(\"outputs.last.goal\") }}',\n ownerId: '{{ context.eval(\"outputs.last.ownerId\") }}',\n potentialUsers: '{{ context.eval(\"outputs.last.potentialUsers\") }}',\n openQuestions: '{{ context.eval(\"outputs.last.openQuestions\") }}',\n };\n}\n\nfunction phaseTask(id: string, phase: (typeof SOFTWARE_PHASES)[number], title: string, description: string) {\n return {\n id,\n name: 'workflow-activity:human-task',\n title,\n inputs: {\n title: `{{ inputs.softwareTitle }} — ${title}`,\n description,\n assignedUserIds: '{{ inputs.ownerId }}',\n context: {\n softwareId: '{{ inputs.softwareId }}',\n phase,\n entityType: 'SoftwareManagement.Software',\n },\n actions: { suffix: [completeAction] },\n },\n };\n}\n\nfunction completePhaseActivity(id: string, phase: (typeof SOFTWARE_PHASES)[number]) {\n return {\n id,\n name: AXPSoftwareManagementCommandKeys.WorkflowActivity.CompletePhase,\n title: `Complete ${phase}`,\n inputs: {\n softwareId: '{{ inputs.softwareId }}',\n phase,\n },\n };\n}\n\nfunction failedToast(id: string, message: string) {\n return {\n id,\n name: 'workflow-activity:show-toast',\n title: 'Phase not ready',\n inputs: {\n message,\n type: 'warning',\n },\n };\n}\n\nexport const softwareDefinitionWorkflowDefinition: AXPWorkflowDefinition = {\n schemaVersion: 'acorex-platform-workflow/v1',\n name: SOFTWARE_DEFINITION_WORKFLOW_NAME,\n title: M('Software definition', 'تعریف نرمافزار'),\n description: M(\n 'Introduction → discovery → first-version scope → behavior → design → delivery planning. Each complete action is gated; AI is never required.',\n 'معرفی → کشف → محدوده نسخه اول → رفتار → طراحی → برنامهریزی تحویل. هر تکمیل فاز شرط دارد؛ هوش مصنوعی الزامی نیست.',\n ),\n variables: [],\n inputs: [\n {\n name: 'softwareId',\n title: 'Software ID',\n dataType: 'string',\n interface: { type: 'text-editor', options: {} },\n },\n {\n name: 'softwareTitle',\n title: 'Software title',\n dataType: 'string',\n interface: { type: 'text-editor', options: {} },\n },\n {\n name: 'ownerId',\n title: 'Owner user ID',\n dataType: 'string',\n interface: { type: 'text-editor', options: {} },\n },\n ],\n outputs: [],\n extensions: {},\n graph: {\n startActivityId: 'introductionTask',\n activities: [\n {\n id: 'introductionTask',\n name: 'workflow-activity:human-task',\n title: 'Introduction',\n inputs: {\n title: '{{ inputs.softwareTitle }} — Introduction',\n description: '@software-management:workflows.definition.introduction-task.description',\n assignedUserIds: '{{ inputs.ownerId }}',\n context: {\n softwareId: '{{ inputs.softwareId }}',\n phase: 'introduction',\n entityType: 'SoftwareManagement.Software',\n },\n actions: {\n suffix: [\n {\n name: 'edit-introduction',\n title: '@software-management:actions.edit-introduction.title',\n icon: 'fa-light fa-pen',\n color: 'primary',\n command: { name: 'edit-introduction' },\n },\n {\n name: 'generate-kickoff',\n title: '@software-management:actions.generate-kickoff-sheet.title',\n icon: 'fa-light fa-file-lines',\n color: 'primary',\n command: { name: 'generate-kickoff' },\n },\n {\n name: 'submit-kickoff',\n title: '@software-management:actions.submit-kickoff-sheet.title',\n icon: 'fa-light fa-paper-plane',\n color: 'default',\n command: { name: 'submit-kickoff' },\n },\n {\n name: 'view-approval',\n title: '@software-management:actions.view-kickoff-approval.title',\n icon: 'fa-light fa-eye',\n color: 'default',\n command: { name: 'view-approval' },\n },\n completeAction,\n ],\n },\n },\n },\n {\n id: 'loadIntroductionForEdit',\n name: AXPSoftwareManagementCommandKeys.WorkflowActivity.LoadIntroduction,\n title: 'Load introduction',\n inputs: { softwareId: '{{ inputs.softwareId }}' },\n },\n {\n id: 'editIntroductionDialog',\n name: 'workflow-activity:show-layout-popup',\n title: 'Edit introduction',\n inputs: {\n title: '@software-management:actions.edit-introduction.title',\n size: 'lg',\n context: introductionDialogContext(),\n layout: introductionDialogLayout(false),\n actions: { suffix: [dialogCancelAction, dialogSaveAction] },\n },\n },\n {\n id: 'viewIntroductionDialog',\n name: 'workflow-activity:show-layout-popup',\n title: 'View introduction',\n inputs: {\n title: '@software-management:actions.edit-introduction.title',\n size: 'lg',\n context: introductionDialogContext(),\n layout: introductionDialogLayout(true),\n actions: { suffix: [dialogCancelAction] },\n },\n },\n {\n id: 'saveIntroductionFromTask',\n name: AXPSoftwareManagementCommandKeys.WorkflowActivity.SaveIntroduction,\n title: 'Save introduction',\n inputs: {\n softwareId: '{{ inputs.softwareId }}',\n title: '{{ context.eval(\"outputs.last.title\") }}',\n idea: '{{ context.eval(\"outputs.last.idea\") }}',\n initialProblem: '{{ context.eval(\"outputs.last.initialProblem\") }}',\n goal: '{{ context.eval(\"outputs.last.goal\") }}',\n ownerId: '{{ context.eval(\"outputs.last.ownerId\") }}',\n potentialUsers: '{{ context.eval(\"outputs.last.potentialUsers\") }}',\n openQuestions: '{{ context.eval(\"outputs.last.openQuestions\") }}',\n },\n },\n {\n id: 'generateKickoffFromTask',\n name: AXPSoftwareManagementCommandKeys.Software.GenerateKickoffSheet,\n title: 'Generate kickoff sheet',\n inputs: { softwareId: '{{ inputs.softwareId }}' },\n },\n {\n id: 'submitKickoffFromTask',\n name: AXPSoftwareManagementCommandKeys.Software.SubmitKickoffSheet,\n title: 'Submit kickoff sheet',\n inputs: { softwareId: '{{ inputs.softwareId }}' },\n },\n {\n id: 'loadIntroductionForStatus',\n name: AXPSoftwareManagementCommandKeys.WorkflowActivity.LoadIntroduction,\n title: 'Load approval status',\n inputs: { softwareId: '{{ inputs.softwareId }}' },\n },\n {\n id: 'approvalStatusDialog',\n name: 'workflow-activity:show-layout-popup',\n title: 'Kickoff approval status',\n inputs: {\n title: '@software-management:actions.view-kickoff-approval.title',\n size: 'md',\n context: {\n approvalText: '{{ context.eval(\"outputs.last.approvalText\") }}',\n },\n layout: {\n type: 'grid-layout',\n mode: 'view',\n options: {\n grid: { default: { columns: 'repeat(12, 1fr)', rows: 'repeat(1, auto)', gap: '16px' } },\n },\n children: [\n introductionField(\n '@software-management:workflows.definition.approval-status.label',\n 'approvalText',\n 'large-text-editor',\n true,\n ),\n ],\n },\n actions: { suffix: [dialogCancelAction] },\n },\n },\n completePhaseActivity('completeIntroduction', 'introduction'),\n phaseTask(\n 'discoveryTask',\n 'discovery',\n 'Discovery',\n 'Read the approved kickoff version, collect evidence, then generate and approve a discovery report. Proceed enters scope only after that approval. Revise and stop stay in discovery.',\n ),\n completePhaseActivity('completeDiscovery', 'discovery'),\n failedToast(\n 'discoveryFailedToast',\n 'Discovery cannot enter scope without an approved report, a recorded rationale, and validated user or problem evidence.',\n ),\n phaseTask(\n 'scopeTask',\n 'first-version-scope',\n 'First-version scope',\n 'Record essential capabilities, out-of-scope items, and success metrics.',\n ),\n completePhaseActivity('completeScope', 'first-version-scope'),\n failedToast('scopeFailedToast', 'First-version scope cannot complete until discovery is approved.'),\n phaseTask(\n 'behaviorTask',\n 'behavior-specification',\n 'Behavior specification',\n 'Record requirements, use cases, business rules, and acceptance criteria.',\n ),\n completePhaseActivity('completeBehavior', 'behavior-specification'),\n failedToast('behaviorFailedToast', 'Behavior specification cannot complete until first-version scope is approved.'),\n phaseTask(\n 'designTask',\n 'design',\n 'Design',\n 'Record data-model, UX, and technical decisions. Do not pick a stack before this phase.',\n ),\n completePhaseActivity('completeDesign', 'design'),\n failedToast('designFailedToast', 'Design cannot complete until behavior specification is approved.'),\n phaseTask(\n 'deliveryTask',\n 'delivery-planning',\n 'Delivery planning',\n 'Link an existing Project and tasks only after the Software definition exists. Do not clone Project or Task.',\n ),\n completePhaseActivity('completeDelivery', 'delivery-planning'),\n failedToast('deliveryFailedToast', 'Delivery planning cannot complete until design is approved.'),\n {\n id: 'definitionFinishedToast',\n name: 'workflow-activity:show-toast',\n title: 'Definition complete',\n inputs: {\n message: 'Software definition phases are complete. Implementation of the target product is still out of this module.',\n type: 'success',\n },\n },\n ],\n connections: [\n { source: { activtyName: 'introductionTask', port: 'edit-introduction' }, target: { activtyName: 'loadIntroductionForEdit' } },\n { source: { activtyName: 'loadIntroductionForEdit', port: 'edit' }, target: { activtyName: 'editIntroductionDialog' } },\n { source: { activtyName: 'loadIntroductionForEdit', port: 'view' }, target: { activtyName: 'viewIntroductionDialog' } },\n { source: { activtyName: 'loadIntroductionForEdit', port: 'Failed' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'editIntroductionDialog', port: 'submit' }, target: { activtyName: 'saveIntroductionFromTask' } },\n { source: { activtyName: 'editIntroductionDialog', port: 'cancel' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'viewIntroductionDialog', port: 'cancel' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'saveIntroductionFromTask', port: 'Done' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'saveIntroductionFromTask', port: 'Failed' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'introductionTask', port: 'generate-kickoff' }, target: { activtyName: 'generateKickoffFromTask' } },\n { source: { activtyName: 'generateKickoffFromTask', port: 'Done' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'generateKickoffFromTask', port: 'Failed' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'introductionTask', port: 'submit-kickoff' }, target: { activtyName: 'submitKickoffFromTask' } },\n { source: { activtyName: 'submitKickoffFromTask', port: 'Done' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'submitKickoffFromTask', port: 'Failed' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'introductionTask', port: 'view-approval' }, target: { activtyName: 'loadIntroductionForStatus' } },\n { source: { activtyName: 'loadIntroductionForStatus', port: 'edit' }, target: { activtyName: 'approvalStatusDialog' } },\n { source: { activtyName: 'loadIntroductionForStatus', port: 'view' }, target: { activtyName: 'approvalStatusDialog' } },\n { source: { activtyName: 'loadIntroductionForStatus', port: 'Failed' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'approvalStatusDialog', port: 'cancel' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'introductionTask', port: 'complete-phase' }, target: { activtyName: 'completeIntroduction' } },\n { source: { activtyName: 'completeIntroduction', port: 'Done' }, target: { activtyName: 'discoveryTask' } },\n { source: { activtyName: 'completeIntroduction', port: 'Failed' }, target: { activtyName: 'introductionTask' } },\n { source: { activtyName: 'discoveryTask', port: 'complete-phase' }, target: { activtyName: 'completeDiscovery' } },\n { source: { activtyName: 'completeDiscovery', port: 'Done' }, target: { activtyName: 'scopeTask' } },\n { source: { activtyName: 'completeDiscovery', port: 'Failed' }, target: { activtyName: 'discoveryFailedToast' } },\n { source: { activtyName: 'discoveryFailedToast', port: 'Done' }, target: { activtyName: 'discoveryTask' } },\n { source: { activtyName: 'scopeTask', port: 'complete-phase' }, target: { activtyName: 'completeScope' } },\n { source: { activtyName: 'completeScope', port: 'Done' }, target: { activtyName: 'behaviorTask' } },\n { source: { activtyName: 'completeScope', port: 'Failed' }, target: { activtyName: 'scopeFailedToast' } },\n { source: { activtyName: 'scopeFailedToast', port: 'Done' }, target: { activtyName: 'scopeTask' } },\n { source: { activtyName: 'behaviorTask', port: 'complete-phase' }, target: { activtyName: 'completeBehavior' } },\n { source: { activtyName: 'completeBehavior', port: 'Done' }, target: { activtyName: 'designTask' } },\n { source: { activtyName: 'completeBehavior', port: 'Failed' }, target: { activtyName: 'behaviorFailedToast' } },\n { source: { activtyName: 'behaviorFailedToast', port: 'Done' }, target: { activtyName: 'behaviorTask' } },\n { source: { activtyName: 'designTask', port: 'complete-phase' }, target: { activtyName: 'completeDesign' } },\n { source: { activtyName: 'completeDesign', port: 'Done' }, target: { activtyName: 'deliveryTask' } },\n { source: { activtyName: 'completeDesign', port: 'Failed' }, target: { activtyName: 'designFailedToast' } },\n { source: { activtyName: 'designFailedToast', port: 'Done' }, target: { activtyName: 'designTask' } },\n { source: { activtyName: 'deliveryTask', port: 'complete-phase' }, target: { activtyName: 'completeDelivery' } },\n { source: { activtyName: 'completeDelivery', port: 'Done' }, target: { activtyName: 'definitionFinishedToast' } },\n { source: { activtyName: 'completeDelivery', port: 'Failed' }, target: { activtyName: 'deliveryFailedToast' } },\n { source: { activtyName: 'deliveryFailedToast', port: 'Done' }, target: { activtyName: 'deliveryTask' } },\n ],\n },\n};\n","//#region ----- Constants -----\n\n/** Document type name in Document Management. One kickoff sheet per Software record. */\nexport const DISCOVERY_KICKOFF_DOCUMENT_TYPE_NAME = 'software-discovery-kickoff';\n\nexport const DISCOVERY_KICKOFF_FILE_NAME = 'discovery-kickoff.html';\n\n/**\n * Review statuses stored on DocumentManagement.Document.\n * Same vocabulary as the EDMS document review workflow.\n */\nexport const KICKOFF_REVIEW_STATUS = {\n Draft: 'draft',\n InReview: 'in-review',\n Approved: 'approved',\n Rejected: 'rejected',\n RevisionRequested: 'revision-requested',\n} as const;\n\nexport type KickoffReviewStatus = (typeof KICKOFF_REVIEW_STATUS)[keyof typeof KICKOFF_REVIEW_STATUS];\n\nexport const KICKOFF_REVIEW_REASON_BASE_DATA = 'introduction-fields-changed';\n\n/** Fields whose change must not silently rewrite an approved sheet. */\nexport const KICKOFF_SOURCE_FIELDS = [\n 'title',\n 'idea',\n 'originalIdea',\n 'initialProblem',\n 'goal',\n 'ownerId',\n 'potentialUsers',\n 'openQuestions',\n] as const;\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type KickoffCertainty = 'recorded' | 'hypothesis' | 'unknown';\n\nexport interface DiscoveryKickoffSource {\n title?: unknown;\n idea?: unknown;\n originalIdea?: unknown;\n initialProblem?: unknown;\n goal?: unknown;\n ownerId?: unknown;\n ownerName?: unknown;\n potentialUsers?: unknown;\n openQuestions?: unknown;\n proposedBy?: unknown;\n origin?: unknown;\n}\n\nexport interface DiscoveryKickoffSection {\n key: string;\n titleEn: string;\n titleFa: string;\n body: string;\n certainty: KickoffCertainty;\n}\n\nexport interface DiscoveryKickoffSheet {\n title: string;\n fingerprint: string;\n html: string;\n plainText: string;\n sections: DiscoveryKickoffSection[];\n aiDraft: boolean;\n}\n\nexport interface DiscoveryKickoffMeta {\n bodyHtml?: string;\n plainText?: string;\n fingerprint?: string;\n aiDraft?: boolean;\n sections?: DiscoveryKickoffSection[];\n}\n\n/** What introduction must see before it may advance. Discovery reads `approvedVersionId`. */\nexport interface IntroductionKickoffCheck {\n statusId?: string | null;\n hostVersionId?: string | null;\n approvedVersionId?: string | null;\n approvedFingerprint?: string | null;\n}\n\nexport const INTRODUCTION_REQUIRED_FIELDS = ['title', 'idea', 'initialProblem', 'goal', 'ownerId'] as const;\n\nexport type IntroductionRequiredField = (typeof INTRODUCTION_REQUIRED_FIELDS)[number];\n\nexport const INTRODUCTION_EXIT_MESSAGE = {\n missingFields: '@software-management:messages.introduction.missing-fields',\n kickoffRejected: '@software-management:messages.introduction.kickoff-rejected',\n kickoffRevision: '@software-management:messages.introduction.kickoff-revision',\n kickoffInReview: '@software-management:messages.introduction.kickoff-in-review',\n kickoffDraft: '@software-management:messages.introduction.kickoff-draft',\n kickoffMissing: '@software-management:messages.introduction.kickoff-missing',\n kickoffRequired: '@software-management:messages.introduction.kickoff-required',\n kickoffPinMissing: '@software-management:messages.introduction.kickoff-pin-missing',\n kickoffFingerprintMissing: '@software-management:messages.introduction.kickoff-fingerprint-missing',\n kickoffStale: '@software-management:messages.introduction.kickoff-stale',\n kickoffNotApproved: '@software-management:messages.introduction.kickoff-not-approved',\n kickoffVersionMismatch: '@software-management:messages.introduction.kickoff-version-mismatch',\n ready: '@software-management:messages.introduction.ready',\n saved: '@software-management:messages.introduction.saved',\n} as const;\n\nexport interface IntroductionExitDecision {\n ok: boolean;\n message: string;\n /** Document version discovery must keep using. Empty until a version is approved. */\n discoveryVersionId: string;\n /** Required introduction fields that are still empty after lookup and locale coercion. */\n missingFields?: IntroductionRequiredField[];\n}\n\n//#endregion\n\n//#region ----- Labels -----\n\nconst CERTAINTY_LABEL: Record<KickoffCertainty, { en: string; fa: string }> = {\n recorded: { en: 'Recorded', fa: 'ثبتشده' },\n hypothesis: { en: 'Hypothesis', fa: 'فرضیه' },\n unknown: { en: 'Unknown', fa: 'نامعلوم' },\n};\n\nconst UNKNOWN_BODY = 'Unknown / نامعلوم';\n\n//#endregion\n\n//#region ----- Text helpers -----\n\nexport function kickoffText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\n/** Review status stored as a string or as a lookup `{ id }`. */\nexport function kickoffStatusId(value: unknown): string {\n const direct = kickoffText(value);\n if (direct) {\n return direct;\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return '';\n }\n return kickoffText((value as Record<string, unknown>)['id']);\n}\n\nconst LOOKUP_STUB_KEYS = new Set(['id', 'displayName', 'title', 'name', 'username', 'fullName']);\n\n/**\n * Reads introduction text from a string, a locale map, or a lookup stub such as `{ id, displayName }`.\n * A lookup stub contributes its id. Other objects contribute the first non-empty locale string.\n */\nexport function introductionValueText(value: unknown): string {\n const direct = kickoffText(value);\n if (direct) {\n return direct;\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return '';\n }\n const record = value as Record<string, unknown>;\n const id = kickoffText(record['id']);\n const keys = Object.keys(record);\n if (id && keys.length > 0 && keys.every((key) => LOOKUP_STUB_KEYS.has(key))) {\n return id;\n }\n const preferred = kickoffText(record['en-US']) || kickoffText(record['fa-IR']) || kickoffText(record['en-AU']);\n if (preferred) {\n return preferred;\n }\n for (const entry of Object.values(record)) {\n const text = kickoffText(entry);\n if (text) {\n return text;\n }\n }\n return '';\n}\n\nexport function missingIntroductionFields(software: DiscoveryKickoffSource): IntroductionRequiredField[] {\n return INTRODUCTION_REQUIRED_FIELDS.filter((field) => !introductionValueText(software[field]));\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nfunction isAiDraft(source: DiscoveryKickoffSource): boolean {\n return kickoffText(source.proposedBy) === 'ai' || kickoffText(source.origin) === 'suggestion';\n}\n\nfunction narrativeCertainty(source: DiscoveryKickoffSource, body: string): KickoffCertainty {\n if (!body) {\n return 'unknown';\n }\n return isAiDraft(source) ? 'hypothesis' : 'recorded';\n}\n\nfunction openCertainty(body: string): KickoffCertainty {\n return body ? 'hypothesis' : 'unknown';\n}\n\nfunction section(\n key: string,\n titleEn: string,\n titleFa: string,\n body: string,\n certainty: KickoffCertainty,\n): DiscoveryKickoffSection {\n return {\n key,\n titleEn,\n titleFa,\n body: body || UNKNOWN_BODY,\n certainty,\n };\n}\n\n//#endregion\n\n//#region ----- Fingerprint -----\n\nfunction sourcePayload(source: DiscoveryKickoffSource): string {\n return [\n introductionValueText(source.title),\n introductionValueText(source.idea),\n introductionValueText(source.originalIdea),\n introductionValueText(source.initialProblem),\n introductionValueText(source.goal),\n introductionValueText(source.ownerId),\n introductionValueText(source.potentialUsers),\n introductionValueText(source.openQuestions),\n kickoffText(source.proposedBy),\n kickoffText(source.origin),\n ].join('\\n');\n}\n\n/** Stable id of the introduction inputs baked into a sheet version. */\nexport function discoveryKickoffFingerprint(source: DiscoveryKickoffSource): string {\n const payload = sourcePayload(source);\n let hash = 0x811c9dc5;\n for (let index = 0; index < payload.length; index += 1) {\n hash = Math.imul(hash ^ payload.charCodeAt(index), 0x01000193);\n }\n const hex = (hash >>> 0).toString(16).padStart(8, '0');\n return `kickoff-${hex}-${payload.length}`;\n}\n\n//#endregion\n\n//#region ----- Sheet -----\n\nexport function kickoffSourceFromSoftware(software: DiscoveryKickoffSource & {\n owner?: { displayName?: unknown };\n}): DiscoveryKickoffSource {\n const ownerName =\n kickoffText(software.ownerName) || kickoffText(software.owner?.displayName);\n return {\n title: software.title,\n idea: software.idea,\n originalIdea: software.originalIdea,\n initialProblem: software.initialProblem,\n goal: software.goal,\n ownerId: software.ownerId,\n ownerName,\n potentialUsers: software.potentialUsers,\n openQuestions: software.openQuestions,\n proposedBy: software.proposedBy,\n origin: software.origin,\n };\n}\n\n/**\n * Builds the discovery kickoff sheet from introduction fields only.\n * Empty research items stay Unknown. Author-supplied guesses stay Hypothesis.\n * AI text is a draft: it is never labeled as evidence or a confirmed fact.\n */\nexport function buildDiscoveryKickoffSheet(source: DiscoveryKickoffSource): DiscoveryKickoffSheet {\n const aiDraft = isAiDraft(source);\n const title = introductionValueText(source.title);\n const idea = introductionValueText(source.idea);\n const originalIdea = introductionValueText(source.originalIdea) || idea;\n const problem = introductionValueText(source.initialProblem);\n const goal = introductionValueText(source.goal);\n const owner = kickoffText(source.ownerName) || introductionValueText(source.ownerId);\n const potentialUsers = introductionValueText(source.potentialUsers);\n const openQuestions = introductionValueText(source.openQuestions);\n\n const sections: DiscoveryKickoffSection[] = [\n section('title', 'Title', 'عنوان', title, narrativeCertainty(source, title)),\n section(\n 'original-idea',\n 'Original Idea at Registration',\n 'ایدهٔ اولیه هنگام ثبت',\n originalIdea,\n narrativeCertainty(source, originalIdea),\n ),\n section('idea', 'Idea Description', 'شرح ایده', idea, narrativeCertainty(source, idea)),\n section('initial-problem', 'Initial Problem', 'مسئلهٔ اولیه', problem, narrativeCertainty(source, problem)),\n section('goal', 'Goal', 'هدف', goal, narrativeCertainty(source, goal)),\n section('owner', 'Owner', 'مسئول', owner, owner ? 'recorded' : 'unknown'),\n section('potential-users', 'Potential Users', 'کاربران احتمالی', potentialUsers, openCertainty(potentialUsers)),\n section(\n 'open-questions',\n 'Open Research Questions',\n 'پرسشهای باز تحقیق',\n openQuestions,\n openCertainty(openQuestions),\n ),\n ];\n\n const fingerprint = discoveryKickoffFingerprint(source);\n const plainText = renderPlainText(title, sections, aiDraft, fingerprint);\n const html = renderHtml(title, sections, aiDraft, fingerprint);\n\n return {\n title: title || 'Discovery Kickoff Sheet',\n fingerprint,\n html,\n plainText,\n sections,\n aiDraft,\n };\n}\n\nfunction renderPlainText(\n title: string,\n sections: DiscoveryKickoffSection[],\n aiDraft: boolean,\n fingerprint: string,\n): string {\n const lines = [\n 'Discovery Kickoff Sheet / برگهٔ آغاز کشف',\n title ? `Title / عنوان: ${title}` : '',\n 'Unconfirmed items are marked Hypothesis or Unknown. This sheet is not evidence.',\n 'موارد تأییدنشده فرضیه یا نامعلوماند. این برگه شاهد نیست.',\n ];\n if (aiDraft) {\n lines.push(\n 'AI draft only. This text is not evidence and is not a confirmed fact.',\n 'فقط پیشنویس هوش مصنوعی. این متن شاهد یا واقعیت تأییدشده نیست.',\n );\n }\n for (const item of sections) {\n const label = CERTAINTY_LABEL[item.certainty];\n lines.push('', `${item.titleEn} / ${item.titleFa} [${label.en} / ${label.fa}]`, item.body);\n }\n lines.push('', `Fingerprint: ${fingerprint}`);\n return lines.filter((line) => line !== undefined).join('\\n');\n}\n\nfunction renderHtml(\n title: string,\n sections: DiscoveryKickoffSection[],\n aiDraft: boolean,\n fingerprint: string,\n): string {\n const blocks = sections\n .map((item) => {\n const label = CERTAINTY_LABEL[item.certainty];\n return [\n '<section>',\n `<h2>${escapeHtml(item.titleEn)} / ${escapeHtml(item.titleFa)}</h2>`,\n `<p class=\"certainty\">${escapeHtml(label.en)} / ${escapeHtml(label.fa)}</p>`,\n `<p>${escapeHtml(item.body).replace(/\\n/g, '<br>')}</p>`,\n '</section>',\n ].join('');\n })\n .join('');\n\n const aiNote = aiDraft\n ? '<p class=\"banner\">AI draft only. This text is not evidence and is not a confirmed fact. / فقط پیشنویس هوش مصنوعی. این متن شاهد یا واقعیت تأییدشده نیست.</p>'\n : '';\n\n return [\n '<!DOCTYPE html>',\n '<html lang=\"fa\">',\n '<head>',\n '<meta charset=\"utf-8\">',\n `<title>${escapeHtml(title || 'Discovery Kickoff Sheet')}</title>`,\n '<style>',\n 'body{font-family:Segoe UI,Tahoma,sans-serif;line-height:1.5;margin:2rem;color:#1a1a1a;}',\n 'h1{font-size:1.6rem;} h2{font-size:1.1rem;margin-bottom:0.2rem;}',\n '.banner{background:#fff6d8;border:1px solid #e6d38a;padding:0.75rem 1rem;}',\n '.certainty{font-size:0.85rem;color:#555;margin-top:0;}',\n 'section{margin:1.25rem 0;padding-top:0.5rem;border-top:1px solid #ddd;}',\n '</style>',\n '</head>',\n '<body>',\n '<h1>Discovery Kickoff Sheet / برگهٔ آغاز کشف</h1>',\n '<p>Unconfirmed items are marked Hypothesis or Unknown. This sheet is not evidence. / موارد تأییدنشده فرضیه یا نامعلوماند. این برگه شاهد نیست.</p>',\n aiNote,\n blocks,\n `<p class=\"certainty\">Fingerprint: ${escapeHtml(fingerprint)}</p>`,\n '</body>',\n '</html>',\n ].join('');\n}\n\nexport function readKickoffMeta(value: unknown): DiscoveryKickoffMeta {\n if (!value || typeof value !== 'object') {\n return {};\n }\n return value as DiscoveryKickoffMeta;\n}\n\n/** Fingerprint stored on the version, with the host document as fallback. */\nexport function kickoffFingerprintFromRows(\n version: { metaDataForm?: unknown } | null | undefined,\n host?: { metaDataForm?: unknown } | null,\n): string {\n return (\n kickoffText(readKickoffMeta(version?.metaDataForm).fingerprint) ||\n kickoffText(readKickoffMeta(host?.metaDataForm).fingerprint)\n );\n}\n\n//#endregion\n\n//#region ----- Review and phase gate -----\n\nexport function kickoffReviewKeepsIntroduction(statusId: string | null | undefined): boolean {\n return (\n statusId === KICKOFF_REVIEW_STATUS.Rejected ||\n statusId === KICKOFF_REVIEW_STATUS.RevisionRequested\n );\n}\n\n/**\n * Fills the gate check from the document when an approved host version exists\n * but the software row has not stored that version yet.\n * An unapproved sheet never becomes the pinned version here.\n */\nexport function buildIntroductionKickoffCheck(input: {\n statusId?: unknown;\n status?: unknown;\n hostVersionId?: unknown;\n approvedVersionId?: unknown;\n approvedFingerprint?: unknown;\n versionFingerprint?: unknown;\n} | null | undefined): IntroductionKickoffCheck | null {\n if (!input) {\n return null;\n }\n const statusId = kickoffStatusId(input.statusId) || kickoffStatusId(input.status);\n const hostVersionId = kickoffText(input.hostVersionId);\n const versionFingerprint = kickoffText(input.versionFingerprint);\n let approvedVersionId = kickoffText(input.approvedVersionId);\n let approvedFingerprint = kickoffText(input.approvedFingerprint);\n if (!approvedVersionId && !approvedFingerprint && !statusId && !hostVersionId) {\n return null;\n }\n if (statusId === KICKOFF_REVIEW_STATUS.Approved && hostVersionId) {\n if (!approvedVersionId) {\n approvedVersionId = hostVersionId;\n }\n if (!approvedFingerprint && versionFingerprint) {\n approvedFingerprint = versionFingerprint;\n }\n }\n return { statusId, hostVersionId, approvedVersionId, approvedFingerprint };\n}\n\n/**\n * Introduction may leave only when one specific document version is approved\n * and still matches the current introduction fields.\n * Discovery must keep using `discoveryVersionId`, not a later draft.\n */\nexport function evaluateIntroductionExit(\n software: DiscoveryKickoffSource,\n kickoff: IntroductionKickoffCheck | null | undefined,\n): IntroductionExitDecision {\n const stay = (\n message: string,\n discoveryVersionId = '',\n missingFields?: IntroductionRequiredField[],\n ): IntroductionExitDecision => ({\n ok: false,\n message,\n discoveryVersionId,\n ...(missingFields?.length ? { missingFields } : {}),\n });\n\n const missingFields = missingIntroductionFields(software);\n if (missingFields.length) {\n return stay(INTRODUCTION_EXIT_MESSAGE.missingFields, '', missingFields);\n }\n\n if (!kickoff) {\n return stay(INTRODUCTION_EXIT_MESSAGE.kickoffMissing);\n }\n\n const approvedVersionId = kickoffText(kickoff.approvedVersionId);\n const statusId = kickoffStatusId(kickoff.statusId);\n const hostVersionId = kickoffText(kickoff.hostVersionId);\n const approvedFingerprint = kickoffText(kickoff.approvedFingerprint);\n const currentFingerprint = discoveryKickoffFingerprint(software);\n\n if (!approvedVersionId) {\n if (kickoffReviewKeepsIntroduction(statusId)) {\n return stay(\n statusId === KICKOFF_REVIEW_STATUS.Rejected\n ? INTRODUCTION_EXIT_MESSAGE.kickoffRejected\n : INTRODUCTION_EXIT_MESSAGE.kickoffRevision,\n );\n }\n if (statusId === KICKOFF_REVIEW_STATUS.InReview) {\n return stay(INTRODUCTION_EXIT_MESSAGE.kickoffInReview);\n }\n if (statusId === KICKOFF_REVIEW_STATUS.Draft) {\n return stay(INTRODUCTION_EXIT_MESSAGE.kickoffDraft);\n }\n if (statusId === KICKOFF_REVIEW_STATUS.Approved) {\n return stay(INTRODUCTION_EXIT_MESSAGE.kickoffPinMissing);\n }\n if (!statusId) {\n return stay(INTRODUCTION_EXIT_MESSAGE.kickoffMissing);\n }\n return stay(INTRODUCTION_EXIT_MESSAGE.kickoffRequired);\n }\n\n if (!approvedFingerprint) {\n return stay(INTRODUCTION_EXIT_MESSAGE.kickoffFingerprintMissing, approvedVersionId);\n }\n\n if (approvedFingerprint !== currentFingerprint) {\n return stay(INTRODUCTION_EXIT_MESSAGE.kickoffStale, approvedVersionId);\n }\n\n if (statusId !== KICKOFF_REVIEW_STATUS.Approved) {\n if (kickoffReviewKeepsIntroduction(statusId)) {\n return stay(\n statusId === KICKOFF_REVIEW_STATUS.Rejected\n ? INTRODUCTION_EXIT_MESSAGE.kickoffRejected\n : INTRODUCTION_EXIT_MESSAGE.kickoffRevision,\n approvedVersionId,\n );\n }\n return stay(INTRODUCTION_EXIT_MESSAGE.kickoffNotApproved, approvedVersionId);\n }\n\n if (!hostVersionId || hostVersionId !== approvedVersionId) {\n return stay(INTRODUCTION_EXIT_MESSAGE.kickoffVersionMismatch, approvedVersionId);\n }\n\n return {\n ok: true,\n message: '',\n discoveryVersionId: approvedVersionId,\n };\n}\n\n/**\n * PDF bytes must be rendered from the approved version's stored HTML.\n * Rebuilding from later introduction fields is not allowed.\n */\nexport function approvedKickoffPdfSource(\n version: { id?: unknown; metaDataForm?: unknown } | null | undefined,\n approvedVersionId: string,\n): { ok: boolean; html: string; message: string } {\n const versionId = kickoffText(version?.id);\n if (!approvedVersionId || versionId !== approvedVersionId) {\n return {\n ok: false,\n html: '',\n message: 'PDF export needs the approved kickoff sheet version.',\n };\n }\n const html = kickoffText(readKickoffMeta(version?.metaDataForm).bodyHtml);\n if (!html) {\n return {\n ok: false,\n html: '',\n message: 'The approved kickoff sheet has no readable HTML to export.',\n };\n }\n return { ok: true, html, message: '' };\n}\n\n/**\n * A later edit must keep the approved HTML intact and ask for a new version.\n */\nexport function kickoffAfterBaseDataChange(\n approved: { html: string; fingerprint: string },\n next: DiscoveryKickoffSource,\n): { approvedHtml: string; needsReview: boolean; reviewReason: string; nextFingerprint: string } {\n const nextFingerprint = discoveryKickoffFingerprint(next);\n const changed = nextFingerprint !== approved.fingerprint;\n return {\n approvedHtml: approved.html,\n needsReview: changed,\n reviewReason: changed ? KICKOFF_REVIEW_REASON_BASE_DATA : '',\n nextFingerprint,\n };\n}\n\n//#endregion\n","import { kickoffText, readKickoffMeta, type DiscoveryKickoffMeta } from './discovery-kickoff.sheet';\n\n//#region ----- Constants -----\n\nexport const DISCOVERY_REPORT_DOCUMENT_TYPE_NAME = 'software-discovery-report';\n\nexport const DISCOVERY_REPORT_FILE_NAME = 'discovery-report.html';\n\nexport const DISCOVERY_DECISIONS = ['proceed', 'revise', 'stop'] as const;\n\nexport type DiscoveryDecision = (typeof DISCOVERY_DECISIONS)[number];\n\nexport const DISCOVERY_STANCES = ['assumption', 'validated'] as const;\n\nexport type DiscoveryStance = (typeof DISCOVERY_STANCES)[number];\n\nexport const DISCOVERY_METHODS = [\n 'interview',\n 'observation',\n 'analytics',\n 'document',\n 'questionnaire',\n 'other',\n] as const;\n\nexport type DiscoveryMethod = (typeof DISCOVERY_METHODS)[number];\n\nexport const DISCOVERY_FINDINGS_CHANGED = 'discovery-findings-changed';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface DiscoveryFindingRecord {\n id?: unknown;\n kind?: unknown;\n title?: unknown;\n body?: unknown;\n stance?: unknown;\n method?: unknown;\n researchDate?: unknown;\n userGroup?: unknown;\n claim?: unknown;\n sourceRefs?: unknown;\n kickoffVersionId?: unknown;\n}\n\nexport interface DiscoveryReportSource {\n kickoffVersionId: string;\n kickoffPlainText: string;\n decision: string;\n rationale: string;\n findings: DiscoveryFindingRecord[];\n}\n\nexport interface DiscoveryReportSheet {\n fingerprint: string;\n html: string;\n plainText: string;\n}\n\nexport interface DiscoveryExitDecision {\n ok: boolean;\n advance: boolean;\n message: string;\n discoveryVersionId: string;\n}\n\n//#endregion\n\n//#region ----- Findings -----\n\nexport function discoveryStance(value: unknown): DiscoveryStance {\n return kickoffText(value) === 'validated' ? 'validated' : 'assumption';\n}\n\nexport function parseSourceRefs(value: unknown): string[] {\n return kickoffText(value)\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n}\n\nexport function findingSupportsProceed(finding: DiscoveryFindingRecord): boolean {\n const kind = kickoffText(finding.kind);\n const userOrProblem = kind === 'audience' || kind === 'problem' || kind === 'pain';\n const hasEvidence = Boolean(kickoffText(finding.method) || parseSourceRefs(finding.sourceRefs).length);\n return discoveryStance(finding.stance) === 'validated' && userOrProblem && hasEvidence && Boolean(kickoffText(finding.claim) || kickoffText(finding.title));\n}\n\nexport function discoveryReportFingerprint(source: DiscoveryReportSource): string {\n const findings = [...source.findings]\n .map((finding) =>\n [\n kickoffText(finding.id),\n kickoffText(finding.kind),\n kickoffText(finding.title),\n kickoffText(finding.body),\n discoveryStance(finding.stance),\n kickoffText(finding.method),\n kickoffText(finding.researchDate),\n kickoffText(finding.userGroup),\n kickoffText(finding.claim),\n parseSourceRefs(finding.sourceRefs).join('|'),\n kickoffText(finding.kickoffVersionId),\n ].join('\\u001f'),\n )\n .sort();\n const payload = [source.kickoffVersionId, source.decision, source.rationale, ...findings].join('\\u001e');\n let hash = 0x811c9dc5;\n for (let index = 0; index < payload.length; index += 1) {\n hash ^= payload.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return `discovery-${(hash >>> 0).toString(16).padStart(8, '0')}-${payload.length}`;\n}\n\n//#endregion\n\n//#region ----- Report -----\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\nexport function kickoffPlainTextFromVersion(version: { metaDataForm?: unknown } | null | undefined): string {\n const meta = readKickoffMeta(version?.metaDataForm) as DiscoveryKickoffMeta;\n return kickoffText(meta.plainText) || kickoffText(meta.bodyHtml);\n}\n\nexport function buildDiscoveryReport(source: DiscoveryReportSource): DiscoveryReportSheet {\n const fingerprint = discoveryReportFingerprint(source);\n const lines = [\n 'Discovery Report / گزارش کشف',\n `Kickoff version / نسخهٔ آغاز: ${source.kickoffVersionId}`,\n 'Assumptions stay labeled as assumptions. Validated findings cite a method or source.',\n 'فرضیهها فرضیه میمانند. یافتهٔ اعتبارسنجیشده روش یا منبع دارد.',\n '',\n 'Pinned introduction / معرفی تأییدشده',\n source.kickoffPlainText || 'Unknown / نامعلوم',\n '',\n `Decision / تصمیم: ${source.decision || 'Unknown / نامعلوم'}`,\n `Rationale / دلیل: ${source.rationale || 'Unknown / نامعلوم'}`,\n ];\n for (const finding of source.findings) {\n const sources = parseSourceRefs(finding.sourceRefs);\n lines.push(\n '',\n `${kickoffText(finding.kind) || 'item'} / ${discoveryStance(finding.stance)}`,\n kickoffText(finding.title) || 'Unknown / نامعلوم',\n kickoffText(finding.claim) || kickoffText(finding.body) || 'Unknown / نامعلوم',\n `Method / روش: ${kickoffText(finding.method) || 'Unknown / نامعلوم'}`,\n `User group / گروه کاربر: ${kickoffText(finding.userGroup) || 'Unknown / نامعلوم'}`,\n `Date / تاریخ: ${kickoffText(finding.researchDate) || 'Unknown / نامعلوم'}`,\n `Sources / منابع: ${sources.length ? sources.join('; ') : 'Unknown / نامعلوم'}`,\n `Kickoff version / نسخه: ${kickoffText(finding.kickoffVersionId) || source.kickoffVersionId}`,\n );\n }\n lines.push('', `Fingerprint: ${fingerprint}`);\n const plainText = lines.join('\\n');\n const html = [\n '<!DOCTYPE html>',\n '<html>',\n '<head><meta charset=\"utf-8\"><title>Discovery Report</title></head>',\n '<body>',\n `<pre>${escapeHtml(plainText)}</pre>`,\n '</body>',\n '</html>',\n ].join('');\n return { fingerprint, html, plainText };\n}\n\n//#endregion\n\n//#region ----- Exit gate -----\n\nexport function evaluateDiscoveryExit(input: {\n currentPhase?: unknown;\n decision?: unknown;\n rationale?: unknown;\n kickoffApprovedVersionId?: unknown;\n findings?: DiscoveryFindingRecord[];\n statusId?: unknown;\n hostVersionId?: unknown;\n approvedVersionId?: unknown;\n approvedFingerprint?: unknown;\n reportFingerprint?: unknown;\n}): DiscoveryExitDecision {\n const stay = (message: string, discoveryVersionId = ''): DiscoveryExitDecision => ({\n ok: false,\n advance: false,\n message,\n discoveryVersionId,\n });\n const phase = kickoffText(input.currentPhase);\n const decision = kickoffText(input.decision);\n const approvedVersionId = kickoffText(input.approvedVersionId);\n const fingerprint = kickoffText(input.reportFingerprint);\n const approvedFingerprint = kickoffText(input.approvedFingerprint);\n const hostVersionId = kickoffText(input.hostVersionId);\n const statusId = kickoffText(input.statusId);\n\n if (phase && phase !== 'discovery' && phase !== 'introduction') {\n return { ok: true, advance: false, message: '', discoveryVersionId: approvedVersionId };\n }\n if (!kickoffText(input.kickoffApprovedVersionId)) {\n return stay('Discovery needs the approved introduction kickoff version.');\n }\n if (decision !== 'proceed' && decision !== 'revise' && decision !== 'stop') {\n return stay('Discovery needs a decision: proceed, revise, or stop.');\n }\n if (!kickoffText(input.rationale)) {\n return stay('Discovery needs a recorded rationale for the decision.');\n }\n if (!approvedVersionId || statusId !== 'approved' || hostVersionId !== approvedVersionId) {\n return stay('Discovery needs an approved discovery report before the phase can change.');\n }\n if (!fingerprint || approvedFingerprint !== fingerprint) {\n return stay(\n 'Discovery findings changed after approval. The approved report was not changed. Generate and approve a new report.',\n approvedVersionId,\n );\n }\n if (decision === 'revise' || decision === 'stop') {\n return {\n ok: true,\n advance: false,\n message:\n decision === 'stop'\n ? 'Discovery stops here. The approved report is kept and Scope does not start.'\n : 'Discovery stays open for revision. The approved report is kept and Scope does not start.',\n discoveryVersionId: approvedVersionId,\n };\n }\n const findings = input.findings ?? [];\n if (!findings.some(findingSupportsProceed)) {\n return stay(\n 'Proceed needs at least one validated user or problem finding with a method or source. A questionnaire alone is not a conclusion.',\n approvedVersionId,\n );\n }\n return {\n ok: true,\n advance: true,\n message: '',\n discoveryVersionId: approvedVersionId,\n };\n}\n\n//#endregion\n","import {\n evaluateIntroductionExit,\n kickoffText,\n missingIntroductionFields,\n type IntroductionKickoffCheck,\n type IntroductionRequiredField,\n} from './discovery-kickoff.sheet';\nimport { evaluateDiscoveryExit, type DiscoveryExitDecision } from './discovery-report.sheet';\nimport { isSoftwarePhaseAtLeast, nextSoftwarePhase, type SoftwarePhase } from './software-phase.constants';\n\nexport function textPresent(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nexport function canCompleteIntroduction(software: {\n title?: unknown;\n idea?: unknown;\n initialProblem?: unknown;\n goal?: unknown;\n ownerId?: unknown;\n}): boolean {\n return missingIntroductionFields(software).length === 0;\n}\n\nexport function isIntroductionComplete(software: {\n introductionCompletedAt?: unknown;\n currentPhase?: unknown;\n}): boolean {\n if (software.introductionCompletedAt) {\n return true;\n }\n return isSoftwarePhaseAtLeast(String(software.currentPhase ?? ''), 'discovery');\n}\n\nexport function canLinkProject(software: {\n introductionCompletedAt?: unknown;\n currentPhase?: unknown;\n}): boolean {\n return isIntroductionComplete(software);\n}\n\nexport function canWriteDesignKind(\n software: { currentPhase?: unknown },\n kind: string | undefined,\n): boolean {\n if (kind === 'technical') {\n return isSoftwarePhaseAtLeast(String(software.currentPhase ?? ''), 'design');\n }\n return isSoftwarePhaseAtLeast(String(software.currentPhase ?? ''), 'behavior-specification');\n}\n\nexport const INTRODUCTION_UPSTREAM_FIELDS = [\n 'title',\n 'idea',\n 'initialProblem',\n 'goal',\n 'ownerId',\n 'potentialUsers',\n 'openQuestions',\n] as const;\n\nexport function canCompletePhase(\n phase: SoftwarePhase,\n software: {\n title?: unknown;\n idea?: unknown;\n originalIdea?: unknown;\n initialProblem?: unknown;\n goal?: unknown;\n ownerId?: unknown;\n potentialUsers?: unknown;\n openQuestions?: unknown;\n proposedBy?: unknown;\n origin?: unknown;\n currentPhase?: unknown;\n introductionCompletedAt?: unknown;\n },\n kickoff?: IntroductionKickoffCheck | null,\n discovery?: Parameters<typeof evaluateDiscoveryExit>[0] | null,\n): { ok: boolean; message: string; advance?: boolean; missingFields?: IntroductionRequiredField[] } {\n if (phase === 'discovery') {\n const decision: DiscoveryExitDecision = evaluateDiscoveryExit({\n currentPhase: software.currentPhase,\n ...discovery,\n });\n return { ok: decision.ok, message: decision.message, advance: decision.advance };\n }\n\n if (phase === 'introduction') {\n const alreadyLeftIntroduction =\n isIntroductionComplete(software) && kickoffText(software.currentPhase) !== 'introduction';\n if (alreadyLeftIntroduction) {\n return { ok: true, message: '' };\n }\n const decision = evaluateIntroductionExit(software, kickoff);\n return { ok: decision.ok, message: decision.message, missingFields: decision.missingFields };\n }\n\n if (software.currentPhase !== phase) {\n const next = nextSoftwarePhase(phase);\n if (next && isSoftwarePhaseAtLeast(String(software.currentPhase ?? ''), next)) {\n return { ok: true, message: '' };\n }\n return {\n ok: false,\n message: `Software must be in ${phase} before this phase can complete.`,\n };\n }\n\n return { ok: true, message: '' };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["escapeHtml"],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { AXToastService } from '@acorex/components/toast';
|
|
2
|
+
import { AXTranslationService } from '@acorex/core/translation';
|
|
3
|
+
import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
|
|
4
|
+
import { AXPCommandExecutor } from '@acorex-platform/framework-client/runtime';
|
|
5
|
+
import { resolveMultiLanguageString, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';
|
|
6
|
+
import { resolveEntityActionRef } from '@acorex-platform/framework-shared/runtime';
|
|
7
|
+
import { AXPSoftwareManagementCommandKeys, kickoffText, RootConfig } from '@acorex-platform/module-software-management-client/contracts';
|
|
8
|
+
import * as i0 from '@angular/core';
|
|
9
|
+
import { inject, Injectable } from '@angular/core';
|
|
10
|
+
import { r as resolveSoftwareText } from './acorex-platform-module-software-management-client-software-command.util-BsoKQCX5.mjs';
|
|
11
|
+
|
|
12
|
+
//#region ----- Imports -----
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region ----- Helpers -----
|
|
15
|
+
function resolveSoftwareId(input) {
|
|
16
|
+
const resolved = resolveEntityActionRef(input);
|
|
17
|
+
const fromRef = resolveSoftwareText(resolved?.refId);
|
|
18
|
+
if (fromRef) {
|
|
19
|
+
return fromRef;
|
|
20
|
+
}
|
|
21
|
+
if (!input || typeof input !== 'object') {
|
|
22
|
+
return '';
|
|
23
|
+
}
|
|
24
|
+
const row = input;
|
|
25
|
+
return resolveSoftwareText(row['softwareId']) || resolveSoftwareText(row['id']);
|
|
26
|
+
}
|
|
27
|
+
function messageText(result) {
|
|
28
|
+
return resolveMultiLanguageString(result?.message?.text, 'en-US').trim();
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region ----- Remote kickoff commands -----
|
|
32
|
+
class DiscoveryKickoffRemoteCommand {
|
|
33
|
+
constructor() {
|
|
34
|
+
this.executor = inject(AXPCommandExecutor);
|
|
35
|
+
}
|
|
36
|
+
async execute(input) {
|
|
37
|
+
const softwareId = resolveSoftwareId(input);
|
|
38
|
+
if (!softwareId) {
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
message: { text: '@software-management:messages.kickoff.id-required', type: 'warning' },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const result = await this.executor.executeRemote(this.commandKey, {
|
|
45
|
+
softwareId,
|
|
46
|
+
});
|
|
47
|
+
if (!result?.success) {
|
|
48
|
+
const text = messageText(result) || '@software-management:messages.kickoff.failed';
|
|
49
|
+
return { success: false, message: { text, type: 'warning' } };
|
|
50
|
+
}
|
|
51
|
+
await this.afterSuccess(runtimeCommandPayloadData(result) ?? undefined);
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
async afterSuccess(_data) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
class GenerateDiscoveryKickoffCommand extends DiscoveryKickoffRemoteCommand {
|
|
59
|
+
constructor() {
|
|
60
|
+
super(...arguments);
|
|
61
|
+
this.commandKey = AXPSoftwareManagementCommandKeys.Software.GenerateKickoffSheet;
|
|
62
|
+
}
|
|
63
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: GenerateDiscoveryKickoffCommand, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
64
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: GenerateDiscoveryKickoffCommand, providedIn: 'root' }); }
|
|
65
|
+
}
|
|
66
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: GenerateDiscoveryKickoffCommand, decorators: [{
|
|
67
|
+
type: Injectable,
|
|
68
|
+
args: [{ providedIn: 'root' }]
|
|
69
|
+
}] });
|
|
70
|
+
class SubmitDiscoveryKickoffCommand extends DiscoveryKickoffRemoteCommand {
|
|
71
|
+
constructor() {
|
|
72
|
+
super(...arguments);
|
|
73
|
+
this.commandKey = AXPSoftwareManagementCommandKeys.Software.SubmitKickoffSheet;
|
|
74
|
+
}
|
|
75
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SubmitDiscoveryKickoffCommand, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
76
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SubmitDiscoveryKickoffCommand, providedIn: 'root' }); }
|
|
77
|
+
}
|
|
78
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SubmitDiscoveryKickoffCommand, decorators: [{
|
|
79
|
+
type: Injectable,
|
|
80
|
+
args: [{ providedIn: 'root' }]
|
|
81
|
+
}] });
|
|
82
|
+
class ExportDiscoveryKickoffPdfCommand extends DiscoveryKickoffRemoteCommand {
|
|
83
|
+
constructor() {
|
|
84
|
+
super(...arguments);
|
|
85
|
+
this.commandKey = AXPSoftwareManagementCommandKeys.Software.ExportKickoffPdf;
|
|
86
|
+
}
|
|
87
|
+
async afterSuccess(data) {
|
|
88
|
+
const base64 = kickoffText(data?.['base64']);
|
|
89
|
+
if (!base64 || typeof document === 'undefined') {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const binary = atob(base64);
|
|
93
|
+
const bytes = new Uint8Array(binary.length);
|
|
94
|
+
for (let index = 0; index < binary.length; index += 1) {
|
|
95
|
+
bytes[index] = binary.charCodeAt(index);
|
|
96
|
+
}
|
|
97
|
+
const blob = new Blob([bytes], { type: 'application/pdf' });
|
|
98
|
+
const url = URL.createObjectURL(blob);
|
|
99
|
+
const anchor = document.createElement('a');
|
|
100
|
+
anchor.href = url;
|
|
101
|
+
anchor.download = kickoffText(data?.['filename']) || 'discovery-kickoff.pdf';
|
|
102
|
+
anchor.click();
|
|
103
|
+
URL.revokeObjectURL(url);
|
|
104
|
+
}
|
|
105
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExportDiscoveryKickoffPdfCommand, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
106
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExportDiscoveryKickoffPdfCommand, providedIn: 'root' }); }
|
|
107
|
+
}
|
|
108
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExportDiscoveryKickoffPdfCommand, decorators: [{
|
|
109
|
+
type: Injectable,
|
|
110
|
+
args: [{ providedIn: 'root' }]
|
|
111
|
+
}] });
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region ----- Open the stored sheet -----
|
|
114
|
+
class OpenDiscoveryKickoffCommand {
|
|
115
|
+
constructor() {
|
|
116
|
+
this.entityService = inject(AXPEntityService);
|
|
117
|
+
this.executor = inject(AXPCommandExecutor);
|
|
118
|
+
this.toast = inject(AXToastService);
|
|
119
|
+
this.i18n = inject(AXTranslationService);
|
|
120
|
+
}
|
|
121
|
+
async execute(input) {
|
|
122
|
+
const softwareId = resolveSoftwareId(input);
|
|
123
|
+
if (!softwareId) {
|
|
124
|
+
const text = await this.i18n.translateAsync('@software-management:messages.kickoff.id-required');
|
|
125
|
+
this.toast.show({
|
|
126
|
+
color: 'warning',
|
|
127
|
+
title: text,
|
|
128
|
+
content: text,
|
|
129
|
+
closeButton: true,
|
|
130
|
+
timeOut: 5000,
|
|
131
|
+
});
|
|
132
|
+
return { success: false, message: { text } };
|
|
133
|
+
}
|
|
134
|
+
const software = (await this.entityService
|
|
135
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.software.name)
|
|
136
|
+
.data()
|
|
137
|
+
.byKey(softwareId));
|
|
138
|
+
const documentId = kickoffText(software?.kickoffDocumentId);
|
|
139
|
+
if (!documentId) {
|
|
140
|
+
const text = await this.i18n.translateAsync('@software-management:messages.kickoff.missing-sheet');
|
|
141
|
+
this.toast.show({
|
|
142
|
+
color: 'warning',
|
|
143
|
+
title: text,
|
|
144
|
+
content: text,
|
|
145
|
+
closeButton: true,
|
|
146
|
+
timeOut: 5000,
|
|
147
|
+
});
|
|
148
|
+
return { success: false, message: { text } };
|
|
149
|
+
}
|
|
150
|
+
await this.executor.execute('DocumentManagement.Document:Open', { documentId });
|
|
151
|
+
return { success: true, kind: 'object', data: { documentId } };
|
|
152
|
+
}
|
|
153
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: OpenDiscoveryKickoffCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
154
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: OpenDiscoveryKickoffCommand, providedIn: 'root' }); }
|
|
155
|
+
}
|
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: OpenDiscoveryKickoffCommand, decorators: [{
|
|
157
|
+
type: Injectable,
|
|
158
|
+
args: [{ providedIn: 'root' }]
|
|
159
|
+
}] });
|
|
160
|
+
|
|
161
|
+
export { ExportDiscoveryKickoffPdfCommand, GenerateDiscoveryKickoffCommand, OpenDiscoveryKickoffCommand, SubmitDiscoveryKickoffCommand };
|
|
162
|
+
//# sourceMappingURL=acorex-platform-module-software-management-client-discovery-kickoff.commands-gB0_htfF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-software-management-client-discovery-kickoff.commands-gB0_htfF.mjs","sources":["../../../../libs/modules/software-management/client/src/lib/commands/discovery-kickoff.commands.ts"],"sourcesContent":["//#region ----- Imports -----\n\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommandExecutor } from '@acorex-platform/framework-client/runtime';\nimport { resolveMultiLanguageString, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport {\n AXPCommand,\n resolveEntityActionRef,\n type AXPCommandExecuteResultPromise,\n} from '@acorex-platform/framework-shared/runtime';\nimport {\n AXPSoftwareManagementCommandKeys,\n kickoffText,\n RootConfig,\n type AXMSoftwareManagementSoftwareEntityModel,\n} from '@acorex-platform/module-software-management-client/contracts';\nimport { inject, Injectable } from '@angular/core';\n\nimport { resolveSoftwareText } from './software-command.util';\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction resolveSoftwareId(input: unknown): string {\n const resolved = resolveEntityActionRef(input);\n const fromRef = resolveSoftwareText(resolved?.refId);\n if (fromRef) {\n return fromRef;\n }\n if (!input || typeof input !== 'object') {\n return '';\n }\n const row = input as Record<string, unknown>;\n return resolveSoftwareText(row['softwareId']) || resolveSoftwareText(row['id']);\n}\n\nfunction messageText(result: { message?: { text?: unknown } } | null | undefined): string {\n return resolveMultiLanguageString(result?.message?.text, 'en-US').trim();\n}\n\n//#endregion\n\n//#region ----- Remote kickoff commands -----\n\nabstract class DiscoveryKickoffRemoteCommand implements AXPCommand<unknown, unknown> {\n protected readonly executor = inject(AXPCommandExecutor);\n\n protected abstract readonly commandKey: string;\n\n async execute(input: unknown): AXPCommandExecuteResultPromise<unknown> {\n const softwareId = resolveSoftwareId(input);\n if (!softwareId) {\n return {\n success: false,\n message: { text: '@software-management:messages.kickoff.id-required', type: 'warning' },\n };\n }\n\n const result = await this.executor.executeRemote<unknown, Record<string, unknown>>(this.commandKey, {\n softwareId,\n });\n if (!result?.success) {\n const text = messageText(result) || '@software-management:messages.kickoff.failed';\n return { success: false, message: { text, type: 'warning' } };\n }\n\n await this.afterSuccess(runtimeCommandPayloadData(result) ?? undefined);\n return result;\n }\n\n protected async afterSuccess(_data: Record<string, unknown> | undefined): Promise<void> {\n return undefined;\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class GenerateDiscoveryKickoffCommand extends DiscoveryKickoffRemoteCommand {\n protected readonly commandKey = AXPSoftwareManagementCommandKeys.Software.GenerateKickoffSheet;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SubmitDiscoveryKickoffCommand extends DiscoveryKickoffRemoteCommand {\n protected readonly commandKey = AXPSoftwareManagementCommandKeys.Software.SubmitKickoffSheet;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ExportDiscoveryKickoffPdfCommand extends DiscoveryKickoffRemoteCommand {\n protected readonly commandKey = AXPSoftwareManagementCommandKeys.Software.ExportKickoffPdf;\n\n protected override async afterSuccess(data: Record<string, unknown> | undefined): Promise<void> {\n const base64 = kickoffText(data?.['base64']);\n if (!base64 || typeof document === 'undefined') {\n return;\n }\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n const blob = new Blob([bytes], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = kickoffText(data?.['filename']) || 'discovery-kickoff.pdf';\n anchor.click();\n URL.revokeObjectURL(url);\n }\n}\n\n//#endregion\n\n//#region ----- Open the stored sheet -----\n\n@Injectable({ providedIn: 'root' })\nexport class OpenDiscoveryKickoffCommand implements AXPCommand<unknown, { documentId: string }> {\n private readonly entityService = inject(AXPEntityService);\n private readonly executor = inject(AXPCommandExecutor);\n private readonly toast = inject(AXToastService);\n private readonly i18n = inject(AXTranslationService);\n\n async execute(input: unknown): AXPCommandExecuteResultPromise<{ documentId: string }> {\n const softwareId = resolveSoftwareId(input);\n if (!softwareId) {\n const text = await this.i18n.translateAsync('@software-management:messages.kickoff.id-required');\n this.toast.show({\n color: 'warning',\n title: text,\n content: text,\n closeButton: true,\n timeOut: 5000,\n });\n return { success: false, message: { text } };\n }\n\n const software = (await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.software.name)\n .data()\n .byKey(softwareId)) as AXMSoftwareManagementSoftwareEntityModel | null;\n const documentId = kickoffText(software?.kickoffDocumentId);\n if (!documentId) {\n const text = await this.i18n.translateAsync('@software-management:messages.kickoff.missing-sheet');\n this.toast.show({\n color: 'warning',\n title: text,\n content: text,\n closeButton: true,\n timeOut: 5000,\n });\n return { success: false, message: { text } };\n }\n\n await this.executor.execute('DocumentManagement.Document:Open', { documentId });\n return { success: true, kind: 'object', data: { documentId } };\n }\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
|