feat: custom fields per project
Text, number, date or option-list fields defined in the project settings (archived, never removed; their type is fixed once saved). Tickets hold them, edited in the side panel, listed under the title and filtered by option in the list view; also over GraphQL, REST (?field=ID:value) and MCP. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -449,6 +449,10 @@ function toMongoFilter(filter: IssueFilter): FilterQuery<IssueDoc> {
|
||||
// Full ISO dates on the last day still count.
|
||||
...(filter.dueTo ? { $lte: `${filter.dueTo}\uffff` } : {}),
|
||||
};
|
||||
// Only field ids: a key never becomes an operator.
|
||||
for (const [field, value] of Object.entries(filter.customFields ?? {}))
|
||||
if (/^[A-Z][A-Z0-9_]{0,29}$/.test(field) && typeof value === 'string')
|
||||
query[`customFields.${field}`] = value;
|
||||
if (filter.noSprint) query['sprint'] = null;
|
||||
else if (filter.sprintId) query['sprint.id'] = filter.sprintId;
|
||||
if (filter.unassigned) query['assignee'] = null;
|
||||
|
||||
@@ -199,6 +199,8 @@ class IssueDocument {
|
||||
@Prop({ type: [SchemaFactory.createForClass(AttachmentProp)] })
|
||||
attachments!: AttachmentProp[];
|
||||
@Prop({ type: [String] }) labels!: string[];
|
||||
/** Field id → value: filtered as `customFields.<id>`. */
|
||||
@Prop({ type: Object }) customFields!: Record<string, string>;
|
||||
@Prop({ type: Number }) version!: number;
|
||||
}
|
||||
export const IssueSchema = SchemaFactory.createForClass(IssueDocument);
|
||||
@@ -413,6 +415,7 @@ export function issueFromDoc(doc: IssueDoc): IssueReadModel {
|
||||
parent: rest.parent?.id ? rest.parent : null,
|
||||
rank: rest.rank ?? implicitRank(rest.number),
|
||||
startDate: rest.startDate ?? null,
|
||||
customFields: rest.customFields ?? {},
|
||||
sprint: rest.sprint?.id ? rest.sprint : null,
|
||||
// Links recorded before projects had several repositories name none.
|
||||
devLinks: (rest.devLinks ?? []).map((link) => ({
|
||||
|
||||
Reference in New Issue
Block a user