fix(version): 限制任务需求候选为版本已关联需求
This commit is contained in:
@@ -1,7 +1,11 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
|
||||
import { getProjectAdoptedRequirementCandidates, mergeSelectedRequirementOptions } from './requirement-selector';
|
||||
import {
|
||||
getProjectAdoptedRequirementCandidates,
|
||||
getVersionLinkedRequirementCandidates,
|
||||
mergeSelectedRequirementOptions,
|
||||
} from './requirement-selector';
|
||||
import type { Requirement } from './requirement';
|
||||
|
||||
const base = {
|
||||
@@ -38,6 +42,17 @@ test('returns only adopted requirements from current project', () => {
|
||||
assert.deepEqual(result.map((r: Requirement) => r.id), ['r1']);
|
||||
});
|
||||
|
||||
test('returns only requirements already linked to current version', () => {
|
||||
const result = getVersionLinkedRequirementCandidates([
|
||||
req('r1', 'project-1', 'adopted'),
|
||||
req('r2', 'project-1', 'developing'),
|
||||
req('r3', 'project-1', 'adopted'),
|
||||
req('r4', 'project-2', 'adopted'),
|
||||
], ['r2', 'r1']);
|
||||
|
||||
assert.deepEqual(result.map((r: Requirement) => r.id), ['r2', 'r1']);
|
||||
});
|
||||
|
||||
test('keeps historical selected requirements as non-candidate options', () => {
|
||||
const options = mergeSelectedRequirementOptions(
|
||||
[req('r1', 'project-1', 'adopted')],
|
||||
|
||||
@@ -26,6 +26,22 @@ export function getProjectAdoptedRequirementCandidates(requirements: Requirement
|
||||
.sort((a, b) => a.code.localeCompare(b.code, 'zh-CN'));
|
||||
}
|
||||
|
||||
export function getVersionLinkedRequirementCandidates(requirements: Requirement[], requirementIds: string[]): Requirement[] {
|
||||
const linkedOrder = new Map<string, number>();
|
||||
requirementIds.forEach((id, index) => {
|
||||
if (!linkedOrder.has(id)) linkedOrder.set(id, index);
|
||||
});
|
||||
|
||||
return requirements
|
||||
.filter((r) => linkedOrder.has(r.id))
|
||||
.sort((a, b) => {
|
||||
const orderA = linkedOrder.get(a.id) ?? Number.MAX_SAFE_INTEGER;
|
||||
const orderB = linkedOrder.get(b.id) ?? Number.MAX_SAFE_INTEGER;
|
||||
if (orderA !== orderB) return orderA - orderB;
|
||||
return a.code.localeCompare(b.code, 'zh-CN');
|
||||
});
|
||||
}
|
||||
|
||||
export function mergeSelectedRequirementOptions(
|
||||
candidates: Requirement[],
|
||||
allRequirements: Requirement[],
|
||||
|
||||
Reference in New Issue
Block a user