diff --git a/dev/generator/src/issues.ts b/dev/generator/src/issues.ts index 860d9ef219..457e287cfb 100644 --- a/dev/generator/src/issues.ts +++ b/dev/generator/src/issues.ts @@ -23,7 +23,7 @@ const object: AttachedData = { description: '', assignee: null, component: null, - sprint: null, + milestone: null, number: 0, rank: '', status: '' as Ref, @@ -85,7 +85,7 @@ async function genIssue (client: TxOperations, statuses: Ref[]): Pr description: faker.lorem.paragraphs(), assignee: object.assignee, component: object.component, - sprint: object.sprint, + milestone: object.milestone, number: (incResult as any).object.sequence, status: faker.random.arrayElement(statuses), priority: faker.random.arrayElement(Object.values(IssuePriority)) as IssuePriority, diff --git a/models/tracker/src/index.ts b/models/tracker/src/index.ts index c01cdb2efd..a51bc30218 100644 --- a/models/tracker/src/index.ts +++ b/models/tracker/src/index.ts @@ -69,8 +69,8 @@ import { Project, Scrum, ScrumRecord, - Sprint, - SprintStatus, + Milestone, + MilestoneStatus, TimeReportDayType, TimeSpendReport, trackerId @@ -118,8 +118,8 @@ export function TypeComponentStatus (): Type { /** * @public */ -export function TypeSprintStatus (): Type { - return { _class: tracker.class.TypeSprintStatus, label: 'TypeSprintStatus' as IntlString } +export function TypeMilestoneStatus (): Type { + return { _class: tracker.class.TypeMilestoneStatus, label: 'TypeMilestoneStatus' as IntlString } } /** @@ -131,8 +131,8 @@ export class TTypeComponentStatus extends TType {} /** * @public */ -@Model(tracker.class.TypeSprintStatus, core.class.Type, DOMAIN_MODEL) -export class TTypeSprintStatus extends TType {} +@Model(tracker.class.TypeMilestoneStatus, core.class.Type, DOMAIN_MODEL) +export class TTypeMilestoneStatus extends TType {} /** * @public @@ -243,9 +243,9 @@ export class TIssue extends TAttachedDoc implements Issue { @Hidden() rank!: string - @Prop(TypeRef(tracker.class.Sprint), tracker.string.Sprint, { icon: tracker.icon.Sprint }) + @Prop(TypeRef(tracker.class.Milestone), tracker.string.Milestone, { icon: tracker.icon.Milestone }) @Index(IndexKind.Indexed) - sprint!: Ref | null + milestone!: Ref | null @Prop(TypeNumber(), tracker.string.Estimation) estimation!: number @@ -295,8 +295,8 @@ export class TIssueTemplate extends TDoc implements IssueTemplate { @Prop(TypeDate(DateRangeMode.DATETIME), tracker.string.DueDate) dueDate!: Timestamp | null - @Prop(TypeRef(tracker.class.Sprint), tracker.string.Sprint) - sprint!: Ref | null + @Prop(TypeRef(tracker.class.Milestone), tracker.string.Milestone) + milestone!: Ref | null @Prop(TypeNumber(), tracker.string.Estimation) estimation!: number @@ -376,9 +376,9 @@ export class TComponent extends TDoc implements Component { /** * @public */ -@Model(tracker.class.Sprint, core.class.Doc, DOMAIN_TRACKER) -@UX(tracker.string.Sprint, tracker.icon.Sprint) -export class TSprint extends TDoc implements Sprint { +@Model(tracker.class.Milestone, core.class.Doc, DOMAIN_TRACKER) +@UX(tracker.string.Milestone, tracker.icon.Milestone) +export class TMilestone extends TDoc implements Milestone { @Prop(TypeString(), tracker.string.Title) // @Index(IndexKind.FullText) label!: string @@ -386,9 +386,9 @@ export class TSprint extends TDoc implements Sprint { @Prop(TypeMarkup(), tracker.string.Description) description?: Markup - @Prop(TypeSprintStatus(), tracker.string.Status) + @Prop(TypeMilestoneStatus(), tracker.string.Status) @Index(IndexKind.Indexed) - status!: SprintStatus + status!: MilestoneStatus @Prop(TypeRef(contact.class.Employee), tracker.string.ComponentLead) lead!: Ref | null @@ -402,9 +402,6 @@ export class TSprint extends TDoc implements Sprint { @Prop(Collection(attachment.class.Attachment), attachment.string.Attachments, { shortLabel: attachment.string.Files }) attachments?: number - @Prop(TypeDate(), tracker.string.StartDate) - startDate!: Timestamp - @Prop(TypeDate(), tracker.string.TargetDate) targetDate!: Timestamp @@ -483,16 +480,16 @@ export function createModel (builder: Builder): void { TIssueStatus, TTypeIssuePriority, TTypeComponentStatus, - TSprint, + TMilestone, TScrum, TScrumRecord, - TTypeSprintStatus, + TTypeMilestoneStatus, TTimeSpendReport, TTypeReportedTime ) const issuesOptions: ViewOptionsModel = { - groupBy: ['status', 'assignee', 'priority', 'component', 'sprint'], + groupBy: ['status', 'assignee', 'priority', 'component', 'milestone'], orderBy: [ ['status', SortingOrder.Ascending], ['priority', SortingOrder.Ascending], @@ -574,14 +571,14 @@ export function createModel (builder: Builder): void { }, { key: '', - presenter: tracker.component.SprintEditor, + presenter: tracker.component.MilestoneEditor, props: { kind: 'list', size: 'small', shape: 'round', shouldShowPlaceholder: false, listProps: { - excludeByKey: 'sprint', + excludeByKey: 'milestone', compression: true, optional: true } @@ -619,7 +616,7 @@ export function createModel (builder: Builder): void { ) const subIssuesOptions: ViewOptionsModel = { - groupBy: ['status', 'assignee', 'priority', 'sprint'], + groupBy: ['status', 'assignee', 'priority', 'milestone'], orderBy: [ ['rank', SortingOrder.Ascending], ['status', SortingOrder.Ascending], @@ -662,14 +659,14 @@ export function createModel (builder: Builder): void { { key: '', presenter: tracker.component.DueDatePresenter, props: { kind: 'list' } }, { key: '', - presenter: tracker.component.SprintEditor, + presenter: tracker.component.MilestoneEditor, props: { kind: 'list', size: 'small', shape: 'round', shouldShowPlaceholder: false, listProps: { - excludeByKey: 'sprint', + excludeByKey: 'milestone', optional: true } } @@ -701,7 +698,7 @@ export function createModel (builder: Builder): void { attachTo: tracker.class.IssueTemplate, descriptor: view.viewlet.List, viewOptions: { - groupBy: ['assignee', 'priority', 'component', 'sprint'], + groupBy: ['assignee', 'priority', 'component', 'milestone'], orderBy: [ ['priority', SortingOrder.Ascending], ['modifiedOn', SortingOrder.Descending], @@ -726,7 +723,7 @@ export function createModel (builder: Builder): void { }, { key: '', - presenter: tracker.component.SprintEditor, + presenter: tracker.component.MilestoneEditor, props: { kind: 'list', size: 'small', shape: 'round', shouldShowPlaceholder: false } }, { key: '', presenter: tracker.component.TemplateEstimationEditor, props: { kind: 'list', size: 'small' } }, @@ -846,7 +843,7 @@ export function createModel (builder: Builder): void { const backlogId = 'backlog' const boardId = 'board' const componentsId = 'components' - const sprintsId = 'sprints' + const milestonesId = 'milestones' const templatesId = 'templates' const myIssuesId = 'my-issues' // const scrumsId = 'scrums' @@ -895,8 +892,8 @@ export function createModel (builder: Builder): void { func: tracker.function.IssuePrioritySort }) - builder.mixin(tracker.class.Sprint, core.class.Class, view.mixin.SortFuncs, { - func: tracker.function.SprintSort + builder.mixin(tracker.class.Milestone, core.class.Class, view.mixin.SortFuncs, { + func: tracker.function.MilestoneSort }) builder.mixin(tracker.class.TypeIssuePriority, core.class.Class, view.mixin.ObjectPresenter, { @@ -942,12 +939,12 @@ export function createModel (builder: Builder): void { inlineEditor: tracker.component.ComponentSelector }) - builder.mixin(tracker.class.Sprint, core.class.Class, view.mixin.ObjectPresenter, { - presenter: tracker.component.SprintPresenter + builder.mixin(tracker.class.Milestone, core.class.Class, view.mixin.ObjectPresenter, { + presenter: tracker.component.MilestonePresenter }) - builder.mixin(tracker.class.Sprint, core.class.Class, view.mixin.AttributePresenter, { - presenter: tracker.component.SprintRefPresenter + builder.mixin(tracker.class.Milestone, core.class.Class, view.mixin.AttributePresenter, { + presenter: tracker.component.MilestoneRefPresenter }) builder.mixin(tracker.class.Issue, core.class.Class, setting.mixin.Editable, { @@ -966,8 +963,8 @@ export function createModel (builder: Builder): void { func: tracker.function.GetAllComponents }) - builder.mixin(tracker.class.Sprint, core.class.Class, view.mixin.AllValuesFunc, { - func: tracker.function.GetAllSprints + builder.mixin(tracker.class.Milestone, core.class.Class, view.mixin.AllValuesFunc, { + func: tracker.function.GetAllMilestones }) builder.mixin(tracker.class.Issue, core.class.Class, view.mixin.LinkProvider, { @@ -1071,10 +1068,10 @@ export function createModel (builder: Builder): void { component: tracker.component.ProjectComponents }, { - id: sprintsId, - label: tracker.string.Sprints, - icon: tracker.icon.Sprint, - component: tracker.component.Sprints + id: milestonesId, + label: tracker.string.Milestones, + icon: tracker.icon.Milestone, + component: tracker.component.Milestones }, // { // id: scrumsId, @@ -1357,7 +1354,7 @@ export function createModel (builder: Builder): void { 'priority', 'labels', 'title', - 'sprint', + 'milestone', 'component', 'dueDate', 'createOn', @@ -1372,23 +1369,23 @@ export function createModel (builder: Builder): void { filters: [] }) - builder.mixin(tracker.class.Sprint, core.class.Class, view.mixin.ClassFilters, { + builder.mixin(tracker.class.Milestone, core.class.Class, view.mixin.ClassFilters, { filters: [] }) - builder.mixin(tracker.class.Sprint, core.class.Class, view.mixin.ClassFilters, { + builder.mixin(tracker.class.Milestone, core.class.Class, view.mixin.ClassFilters, { filters: ['status'], strict: true }) - builder.mixin(tracker.class.Sprint, core.class.Class, view.mixin.AttributeFilter, { - component: tracker.component.SprintFilter + builder.mixin(tracker.class.Milestone, core.class.Class, view.mixin.AttributeFilter, { + component: tracker.component.MilestoneFilter }) - builder.mixin(tracker.class.TypeSprintStatus, core.class.Class, view.mixin.AttributePresenter, { - presenter: tracker.component.SprintStatusPresenter + builder.mixin(tracker.class.TypeMilestoneStatus, core.class.Class, view.mixin.AttributePresenter, { + presenter: tracker.component.MilestoneStatusPresenter }) - builder.mixin(tracker.class.TypeSprintStatus, core.class.Class, view.mixin.AttributeFilter, { + builder.mixin(tracker.class.TypeMilestoneStatus, core.class.Class, view.mixin.AttributeFilter, { component: view.component.ValueFilter }) @@ -1547,13 +1544,13 @@ export function createModel (builder: Builder): void { builder, { action: view.actionImpl.AttributeSelector, - actionPopup: tracker.component.SprintEditor, + actionPopup: tracker.component.MilestoneEditor, actionProps: { - attribute: 'sprint', + attribute: 'milestone', isAction: true }, - label: tracker.string.Sprint, - icon: tracker.icon.Sprint, + label: tracker.string.Milestone, + icon: tracker.icon.Milestone, keyBinding: ['keyS->keyP'], input: 'any', category: tracker.category.Tracker, @@ -1564,7 +1561,7 @@ export function createModel (builder: Builder): void { group: 'edit' } }, - tracker.action.SetSprint + tracker.action.SetMilestone ) createAction( @@ -1779,19 +1776,19 @@ export function createModel (builder: Builder): void { createAction( builder, { - action: tracker.actionImpl.DeleteSprint, + action: tracker.actionImpl.DeleteMilestone, label: view.string.Delete, icon: view.icon.Delete, keyBinding: ['Meta + Backspace', 'Ctrl + Backspace'], category: tracker.category.Tracker, input: 'any', - target: tracker.class.Sprint, + target: tracker.class.Milestone, context: { mode: ['context', 'browser'], group: 'tools' } }, - tracker.action.DeleteSprint + tracker.action.DeleteMilestone ) - builder.mixin(tracker.class.Sprint, core.class.Class, view.mixin.IgnoreActions, { + builder.mixin(tracker.class.Milestone, core.class.Class, view.mixin.IgnoreActions, { actions: [view.action.Delete] }) @@ -1802,10 +1799,9 @@ export function createModel (builder: Builder): void { tracker.component.ReportedTimeEditor ) - const sprintOptions: ViewOptionsModel = { + const milestoneOptions: ViewOptionsModel = { groupBy: ['lead'], orderBy: [ - ['startDate', SortingOrder.Descending], ['modifiedOn', SortingOrder.Descending], ['targetDate', SortingOrder.Descending], ['capacity', SortingOrder.Ascending] @@ -1817,32 +1813,31 @@ export function createModel (builder: Builder): void { view.class.Viewlet, core.space.Model, { - attachTo: tracker.class.Sprint, + attachTo: tracker.class.Milestone, descriptor: view.viewlet.List, - viewOptions: sprintOptions, + viewOptions: milestoneOptions, config: [ { key: 'status', props: { width: '1rem', kind: 'list', size: 'small', justify: 'center' } }, - { key: '', presenter: tracker.component.SprintPresenter, props: { shouldUseMargin: true } }, + { key: '', presenter: tracker.component.MilestonePresenter, props: { shouldUseMargin: true } }, { key: '', presenter: view.component.GrowPresenter, props: { type: 'grow' } }, { key: '', presenter: contact.component.MembersPresenter, props: { kind: 'link', - intlTitle: tracker.string.SprintMembersTitle, - intlSearchPh: tracker.string.SprintMembersSearchPlaceholder + intlTitle: tracker.string.MilestoneMembersTitle, + intlSearchPh: tracker.string.MilestoneMembersSearchPlaceholder } }, - { key: '', presenter: tracker.component.SprintDatePresenter, props: { field: 'startDate' } }, - { key: '', presenter: tracker.component.SprintDatePresenter, props: { field: 'targetDate' } }, + { key: '', presenter: tracker.component.MilestoneDatePresenter, props: { field: 'targetDate' } }, { key: 'lead', - presenter: tracker.component.SprintLeadPresenter, + presenter: tracker.component.MilestoneLeadPresenter, props: { - _class: tracker.class.Sprint, + _class: tracker.class.Milestone, defaultClass: contact.class.Employee, shouldShowLabel: false, size: 'x-small' @@ -1850,7 +1845,7 @@ export function createModel (builder: Builder): void { } ] }, - tracker.viewlet.SprintList + tracker.viewlet.MilestoneList ) builder.createDoc( @@ -1893,7 +1888,7 @@ export function createModel (builder: Builder): void { tracker.class.Issue, tracker.ids.TrackerNotificationGroup, [], - ['comments', 'status', 'priority', 'assignee', 'subIssues', 'blockedBy', 'sprint', 'dueDate'] + ['comments', 'status', 'priority', 'assignee', 'subIssues', 'blockedBy', 'milestone', 'dueDate'] ) createAction( @@ -1905,21 +1900,21 @@ export function createModel (builder: Builder): void { attribute: 'lead', _class: contact.class.Employee, query: {}, - placeholder: tracker.string.SprintLead + placeholder: tracker.string.MilestoneLead }, - label: tracker.string.SprintLead, + label: tracker.string.MilestoneLead, icon: contact.icon.Person, keyBinding: [], input: 'none', category: tracker.category.Tracker, - target: tracker.class.Sprint, + target: tracker.class.Milestone, context: { mode: ['context'], application: tracker.app.Tracker, group: 'edit' } }, - tracker.action.SetSprintLead + tracker.action.SetMilestoneLead ) const componentListViewOptions: ViewOptionsModel = { diff --git a/models/tracker/src/migration.ts b/models/tracker/src/migration.ts index 2608d1ddc0..4350c73c17 100644 --- a/models/tracker/src/migration.ts +++ b/models/tracker/src/migration.ts @@ -40,8 +40,8 @@ import { IssueTemplate, IssueTemplateChild, Project, - Sprint, - SprintStatus, + Milestone, + MilestoneStatus, TimeReportDayType } from '@hcengineering/tracker' import { DOMAIN_TRACKER } from '.' @@ -387,11 +387,183 @@ async function upgradeIssues (tx: TxOperations): Promise { } } +async function renameSprintToMilestone (client: MigrationClient): Promise { + await client.update( + DOMAIN_TRACKER, + { + _class: tracker.class.Issue, + sprint: { $exists: true } + }, + { + $rename: { sprint: 'milestone' } + } + ) + await client.update( + DOMAIN_TRACKER, + { + _class: 'tracker:class:Sprint' as Ref> + }, + { + _class: tracker.class.Milestone + } + ) + const milestones = await client.find(DOMAIN_TRACKER, { _class: tracker.class.Milestone }) + for (const milestone of milestones) { + await client.update( + DOMAIN_TX, + { + objectId: milestone._id, + objectClass: 'tracker:class:Sprint' as Ref> + }, + { + objectClass: tracker.class.Milestone + } + ) + } + + await client.update( + DOMAIN_TX, + { + _class: core.class.TxCollectionCUD, + 'tx._class': core.class.TxCreateDoc, + 'tx.objectClass': tracker.class.Issue, + 'tx.attributes.sprint': { $exists: true } + }, + { + $rename: { 'tx.attributes.sprint': 'tx.attributes.milestone' } + } + ) + await client.update( + DOMAIN_TX, + { + _class: core.class.TxCollectionCUD, + 'tx._class': core.class.TxUpdateDoc, + 'tx.objectClass': tracker.class.Issue, + 'tx.operations.sprint': { $exists: true } + }, + { + $rename: { 'tx.operations.sprint': 'tx.operations.milestone' } + } + ) + await client.update( + DOMAIN_TX, + { + objectClass: tracker.class.Issue, + _class: core.class.TxUpdateDoc, + 'operations.sprint': { $exists: true } + }, + { + $rename: { 'operations.sprint': 'operations.milestone' } + } + ) + + const templates = await client.find(DOMAIN_TRACKER, { + _class: tracker.class.IssueTemplate, + sprint: { $exists: true } + }) + for (const template of templates) { + const children: IssueTemplateChild[] = template.children.map((p) => { + const res = { + ...p, + milestone: p.milestone + } + delete (res as any).sprint + return res + }) + await client.update( + DOMAIN_TRACKER, + { + _id: template._id + }, + { + children + } + ) + await client.update( + DOMAIN_TRACKER, + { + _id: template._id + }, + { + $rename: { sprint: 'milestone' } + } + ) + const createTxes = await client.find>(DOMAIN_TX, { + objectId: template._id, + _class: core.class.TxCreateDoc + }) + for (const createTx of createTxes) { + const children: IssueTemplateChild[] = createTx.attributes.children.map((p) => { + const res = { + ...p, + milestone: p.milestone + } + delete (res as any).sprint + return res + }) + await client.update>( + DOMAIN_TX, + { + _id: createTx._id + }, + { + children + } + ) + await client.update( + DOMAIN_TX, + { + _id: createTx._id + }, + { + $rename: { 'attributes.sprint': 'attributes.milestone' } + } + ) + } + const updateTxes = await client.find>(DOMAIN_TX, { + objectId: template._id, + _class: core.class.TxUpdateDoc + }) + for (const updateTx of updateTxes) { + if ((updateTx.operations as any).sprint !== undefined) { + await client.update( + DOMAIN_TX, + { + _id: updateTx._id + }, + { + $rename: { 'operations.sprint': 'operations.milestone' } + } + ) + } + if (updateTx.operations.children !== undefined) { + const children: IssueTemplateChild[] = updateTx.operations.children.map((p) => { + const res = { + ...p, + milestone: p.milestone + } + delete (res as any).sprint + return res + }) + await client.update( + DOMAIN_TX, + { + _id: updateTx._id + }, + { + children + } + ) + } + } + } +} + async function renameProject (client: MigrationClient): Promise { await client.update( DOMAIN_TRACKER, { - _class: { $in: [tracker.class.Issue, tracker.class.Sprint] }, + _class: { $in: [tracker.class.Issue, tracker.class.Milestone] }, project: { $exists: true } }, { @@ -448,7 +620,7 @@ async function renameProject (client: MigrationClient): Promise { await client.update( DOMAIN_TX, { - objectClass: tracker.class.Sprint, + objectClass: tracker.class.Milestone, _class: core.class.TxCreateDoc, 'attributes.project': { $exists: true } }, @@ -459,7 +631,7 @@ async function renameProject (client: MigrationClient): Promise { await client.update( DOMAIN_TX, { - objectClass: { $in: [tracker.class.Issue, tracker.class.Sprint] }, + objectClass: { $in: [tracker.class.Issue, tracker.class.Milestone] }, _class: core.class.TxUpdateDoc, 'operations.project': { $exists: true } }, @@ -732,11 +904,11 @@ async function setCreate (client: MigrationClient): Promise { } } -async function fixSprintEmptyStatuses (client: MigrationClient): Promise { - await client.update( +async function fixMilestoneEmptyStatuses (client: MigrationClient): Promise { + await client.update( DOMAIN_TRACKER, - { _class: tracker.class.Sprint, $or: [{ status: null }, { status: undefined }] }, - { status: SprintStatus.Planned } + { _class: tracker.class.Milestone, $or: [{ status: null }, { status: undefined }] }, + { status: MilestoneStatus.Planned } ) } @@ -754,6 +926,7 @@ export const trackerOperation: MigrateOperation = { await Promise.all([migrateIssueComponents(client), migrateParentIssues(client)]) await migrateIssueParentInfo(client) await fillRank(client) + await renameSprintToMilestone(client) await renameProject(client) await setCreate(client) @@ -773,7 +946,7 @@ export const trackerOperation: MigrateOperation = { } ) - await fixSprintEmptyStatuses(client) + await fixMilestoneEmptyStatuses(client) }, async upgrade (client: MigrationUpgradeClient): Promise { const tx = new TxOperations(client, core.account.System) diff --git a/models/tracker/src/plugin.ts b/models/tracker/src/plugin.ts index 3934566731..1710e4a60d 100644 --- a/models/tracker/src/plugin.ts +++ b/models/tracker/src/plugin.ts @@ -49,11 +49,11 @@ export default mergeIds(trackerId, tracker, { PriorityIcon: '' as AnyComponent }, component: { - SprintSelector: '' as AnyComponent, + MilestoneSelector: '' as AnyComponent, IssueStatistics: '' as AnyComponent, TimeSpendReportPopup: '' as AnyComponent, NotificationIssuePresenter: '' as AnyComponent, - SprintFilter: '' as AnyComponent + MilestoneFilter: '' as AnyComponent }, app: { Tracker: '' as Ref @@ -62,7 +62,7 @@ export default mergeIds(trackerId, tracker, { IssueList: '' as Ref, IssueTemplateList: '' as Ref, IssueKanban: '' as Ref, - SprintList: '' as Ref, + MilestoneList: '' as Ref, ComponentList: '' as Ref, ComponentsTimeline: '' as Ref }, @@ -81,12 +81,12 @@ export default mergeIds(trackerId, tracker, { EditWorkflowStatuses: '' as ViewAction, EditProject: '' as ViewAction, DeleteProject: '' as ViewAction, - DeleteSprint: '' as ViewAction + DeleteMilestone: '' as ViewAction }, action: { NewRelatedIssue: '' as Ref>>, - DeleteSprint: '' as Ref>>, + DeleteMilestone: '' as Ref>>, DeleteProject: '' as Ref>>, - SetSprintLead: '' as Ref>> + SetMilestoneLead: '' as Ref>> } }) diff --git a/plugins/recruit-resources/src/components/CreateVacancy.svelte b/plugins/recruit-resources/src/components/CreateVacancy.svelte index b831b3b6b4..68a1d11ead 100644 --- a/plugins/recruit-resources/src/components/CreateVacancy.svelte +++ b/plugins/recruit-resources/src/components/CreateVacancy.svelte @@ -129,7 +129,7 @@ description: template.description, assignee: template.assignee, component: template.component, - sprint: template.sprint, + milestone: template.milestone, number: (incResult as any).object.sequence, status: project?.defaultIssueStatus as Ref, priority: template.priority, diff --git a/plugins/tracker-assets/assets/icons.svg b/plugins/tracker-assets/assets/icons.svg index cc7e433b01..cda57ee9c5 100644 --- a/plugins/tracker-assets/assets/icons.svg +++ b/plugins/tracker-assets/assets/icons.svg @@ -172,7 +172,7 @@ - + diff --git a/plugins/tracker-assets/lang/en.json b/plugins/tracker-assets/lang/en.json index d9519a0731..6bcdf59195 100644 --- a/plugins/tracker-assets/lang/en.json +++ b/plugins/tracker-assets/lang/en.json @@ -203,27 +203,27 @@ "NewSubIssue": "Add sub-issue...", "AddLabel": "Add label", - "Sprint": "Sprint", - "NoSprint": "No Sprint", - "MoveToSprint": "Select Sprint", - "Sprints": "Sprints", - "AllSprints": "All", - "PlannedSprints": "Planned", - "ActiveSprints": "Active", - "ClosedSprints": "Done", - "AddToSprint": "Add to Sprint", - "SprintNamePlaceholder": "Sprint name", - "SprintLead": "Lead", - "SprintLeadTitle": "Sprint lead", - "SprintLeadSearchPlaceholder": "Set sprint lead\u2026", - "SprintMembersTitle": "Sprint members", - "SprintMembersSearchPlaceholder": "Change sprint members\u2026", + "Milestone": "Milestone", + "NoMilestone": "No Milestone", + "MoveToMilestone": "Select Milestone", + "Milestones": "Milestones", + "AllMilestones": "All", + "PlannedMilestones": "Planned", + "ActiveMilestones": "Active", + "ClosedMilestones": "Done", + "AddToMilestone": "Add to Milestone", + "MilestoneNamePlaceholder": "Milestone name", + "MilestoneLead": "Lead", + "MilestoneLeadTitle": "Milestone lead", + "MilestoneLeadSearchPlaceholder": "Set milestone lead\u2026", + "MilestoneMembersTitle": "Milestone members", + "MilestoneMembersSearchPlaceholder": "Change milestone members\u2026", - "NewSprint": "New Sprint", - "CreateSprint": "Create", + "NewMilestone": "New Milestone", + "CreateMilestone": "Create", - "MoveAndDeleteSprint": "Move Issues to {newSprint} and Delete {deleteSprint}", - "MoveAndDeleteSprintConfirm": "Do you want to delete sprint and move issues to another sprint?", + "MoveAndDeleteMilestone": "Move Issues to {newMilestone} and Delete {deleteMilestone}", + "MoveAndDeleteMilestoneConfirm": "Do you want to delete milestone and move issues to another milestone?", "Scrums": "Scrums", "Scrum": "Scrum", @@ -256,7 +256,6 @@ "TimeSpendReportDescription": "Description", "TimeSpendValue": "{value}d", "TimeSpendHours": "{value}h", - "SprintPassed": "{from}d/{to}d", "ChildEstimation": "Subissues Estimation", "ChildReportedTime": "Subissues Time", "Capacity": "Capacity", diff --git a/plugins/tracker-assets/lang/ru.json b/plugins/tracker-assets/lang/ru.json index 7c218b7131..4266749705 100644 --- a/plugins/tracker-assets/lang/ru.json +++ b/plugins/tracker-assets/lang/ru.json @@ -203,27 +203,27 @@ "NewSubIssue": "Добавить под-задачу...", "AddLabel": "Добавить метку", - "Sprint": "Спринт", - "NoSprint": "Без Спринта", - "MoveToSprint": "Выбрать Спринт", - "Sprints": "Спринты", - "AllSprints": "Все", - "PlannedSprints": "Запланировано", - "ActiveSprints": "Активно", - "ClosedSprints": "Завершено", - "AddToSprint": "Добавить в Спринт", - "SprintNamePlaceholder": "Название спринта", - "SprintLead": "Руководитель", - "SprintLeadTitle": "Руководитель спринта", - "SprintLeadSearchPlaceholder": "Назначьте руководителя спринта\u2026", - "SprintMembersTitle": "Участники спринта", - "SprintMembersSearchPlaceholder": "Измененить участников спринта\u2026", + "Milestone": "Майлстоун", + "NoMilestone": "Без Майлстоуна", + "MoveToMilestone": "Выбрать Майлстоун", + "Milestones": "Майлстоуны", + "AllMilestones": "Все", + "PlannedMilestones": "Запланировано", + "ActiveMilestones": "Активно", + "ClosedMilestones": "Завершено", + "AddToMilestone": "Добавить в Майлстоун", + "MilestoneNamePlaceholder": "Название майлстоуна", + "MilestoneLead": "Руководитель", + "MilestoneLeadTitle": "Руководитель майлстоуна", + "MilestoneLeadSearchPlaceholder": "Назначьте руководителя майлстоуна\u2026", + "MilestoneMembersTitle": "Участники майлстоуна", + "MilestoneMembersSearchPlaceholder": "Измененить участников майлстоуна\u2026", - "NewSprint": "Новый Спринт", - "CreateSprint": "Создать", + "NewMilestone": "Новый Майлстоун", + "CreateMilestone": "Создать", - "MoveAndDeleteSprint": "Переместить Задачи в {newSprint} и Удалить {deleteSprint}", - "MoveAndDeleteSprintConfirm": "Вы действительно хотите удалить спринт и перенести задачи в другой спринт?", + "MoveAndDeleteMilestone": "Переместить Задачи в {newMilestone} и Удалить {deleteMilestone}", + "MoveAndDeleteMilestoneConfirm": "Вы действительно хотите удалить майлстоун и перенести задачи в другой майлстоун?", "Scrums": "Скрамы", "Scrum": "Скрам", @@ -256,7 +256,6 @@ "TimeSpendReportDescription": "Описание", "TimeSpendValue": "{value}d", "TimeSpendHours": "{value}h", - "SprintPassed": "{from}d/{to}d", "ChildEstimation": "Оценка подзадач", "ChildReportedTime": "Время водзадач", "Capacity": "Вместимость", diff --git a/plugins/tracker-assets/src/index.ts b/plugins/tracker-assets/src/index.ts index 07481c8413..d7baf9d064 100644 --- a/plugins/tracker-assets/src/index.ts +++ b/plugins/tracker-assets/src/index.ts @@ -35,7 +35,7 @@ loadMetadata(tracker.icon, { Labels: `${icons}#priority-nopriority`, // TODO: add icon DueDate: `${icons}#inbox`, // TODO: add icon Parent: `${icons}#myissues`, // TODO: add icon - Sprint: `${icons}#sprint`, + Milestone: `${icons}#milestone`, IssueTemplates: `${icons}#issuetemplates`, Scrum: `${icons}#scrum`, Start: `${icons}#start`, @@ -62,11 +62,11 @@ loadMetadata(tracker.icon, { ComponentStatusCompleted: `${icons}#component-status-completed`, ComponentStatusCanceled: `${icons}#component-status-canceled`, - SprintStatusPlanned: `${icons}#component-status-planned`, - SprintStatusInProgress: `${icons}#component-status-in-progress`, - SprintStatusPaused: `${icons}#component-status-paused`, - SprintStatusCompleted: `${icons}#component-status-completed`, - SprintStatusCanceled: `${icons}#component-status-canceled`, + MilestoneStatusPlanned: `${icons}#component-status-planned`, + MilestoneStatusInProgress: `${icons}#component-status-in-progress`, + MilestoneStatusPaused: `${icons}#component-status-paused`, + MilestoneStatusCompleted: `${icons}#component-status-completed`, + MilestoneStatusCanceled: `${icons}#component-status-canceled`, CopyID: `${icons}#copyID`, CopyURL: `${icons}#copyURL`, diff --git a/plugins/tracker-resources/src/components/CreateIssue.svelte b/plugins/tracker-resources/src/components/CreateIssue.svelte index 1c00a41245..bca41a5029 100644 --- a/plugins/tracker-resources/src/components/CreateIssue.svelte +++ b/plugins/tracker-resources/src/components/CreateIssue.svelte @@ -38,7 +38,7 @@ IssueStatus, IssueTemplate, Project, - Sprint + Milestone } from '@hcengineering/tracker' import { ActionIcon, @@ -58,7 +58,7 @@ import view from '@hcengineering/view' import { ObjectBox } from '@hcengineering/view-resources' import { createEventDispatcher, onDestroy } from 'svelte' - import { activeComponent, activeSprint, generateIssueShortLink, getIssueId, updateIssueRelation } from '../issues' + import { activeComponent, activeMilestone, generateIssueShortLink, getIssueId, updateIssueRelation } from '../issues' import tracker from '../plugin' import ComponentSelector from './ComponentSelector.svelte' import AssigneeEditor from './issues/AssigneeEditor.svelte' @@ -69,7 +69,7 @@ import EstimationEditor from './issues/timereport/EstimationEditor.svelte' import SetDueDateActionPopup from './SetDueDateActionPopup.svelte' import SetParentIssueActionPopup from './SetParentIssueActionPopup.svelte' - import SprintSelector from './sprints/SprintSelector.svelte' + import MilestoneSelector from './milestones/MilestoneSelector.svelte' import SubIssues from './SubIssues.svelte' export let space: Ref @@ -77,7 +77,7 @@ export let priority: IssuePriority = IssuePriority.NoPriority export let assignee: Ref | null = null export let component: Ref | null = $activeComponent ?? null - export let sprint: Ref | null = $activeSprint ?? null + export let milestone: Ref | null = $activeMilestone ?? null export let relatedTo: Doc | undefined export let shouldSaveDraft: boolean = false export let parentIssue: Issue | undefined @@ -138,7 +138,7 @@ dueDate: null, attachments: 0, estimation: 0, - sprint, + milestone, status, assignee, labels: [], @@ -187,7 +187,7 @@ parentIssue: parentIssue?._id, description: '

', component, - sprint, + milestone, priority, space } @@ -339,7 +339,7 @@ description: object.description, assignee: object.assignee, component: object.component, - sprint: object.sprint, + milestone: object.milestone, number: (incResult as any).object.sequence, status: object.status, priority: object.priority, @@ -463,12 +463,12 @@ object.component = componentId } - const handleSprintIdChanged = async (sprintId: Ref | null | undefined) => { - if (sprintId === undefined) { + const handleMilestoneIdChanged = async (milestoneId: Ref | null | undefined) => { + if (milestoneId === undefined) { return } - object.sprint = sprintId + object.milestone = milestoneId } function addTagRef (tag: TagElement): void { @@ -626,7 +626,7 @@ projectId={_space} parendIssueId={object._id} project={currentProject} - sprint={object.sprint} + milestone={object.milestone} component={object.component} {shouldSaveDraft} bind:subIssues={object.subIssues} @@ -707,10 +707,10 @@ kind={'secondary'} size={'large'} /> - export let projectId: Ref export let project: Project | undefined - export let sprint: Ref | null = null + export let milestone: Ref | null = null export let component: Ref | null = null export let subIssues: IssueDraft[] = [] export let shouldSaveDraft: boolean = false @@ -86,7 +86,7 @@ description: subIssue.description, assignee: subIssue.assignee, component: subIssue.component, - sprint: subIssue.sprint, + milestone: subIssue.milestone, number: (incResult as any).object.sequence, status: subIssue.status ?? project.defaultIssueStatus, priority: subIssue.priority, @@ -220,7 +220,7 @@ { isManualCreating = false diff --git a/plugins/tracker-resources/src/components/components/ComponentPopup.svelte b/plugins/tracker-resources/src/components/components/ComponentPopup.svelte index c2866a072a..1c6706770e 100644 --- a/plugins/tracker-resources/src/components/components/ComponentPopup.svelte +++ b/plugins/tracker-resources/src/components/components/ComponentPopup.svelte @@ -20,7 +20,7 @@ export let _class: Ref> export let selected: Ref | undefined - export let sprintQuery: DocumentQuery = {} + export let milestoneQuery: DocumentQuery = {} export let create: ObjectCreate | undefined = undefined export let allowDeselect = false @@ -36,7 +36,7 @@ - - + + diff --git a/plugins/tracker-resources/src/components/issues/IssuesFilterMenu.svelte b/plugins/tracker-resources/src/components/issues/IssuesFilterMenu.svelte index 762718b398..fd4df2d861 100644 --- a/plugins/tracker-resources/src/components/issues/IssuesFilterMenu.svelte +++ b/plugins/tracker-resources/src/components/issues/IssuesFilterMenu.svelte @@ -26,7 +26,7 @@ import FilterMenu from '../FilterMenu.svelte' import PriorityFilterMenuSection from './PriorityFilterMenuSection.svelte' import ComponentFilterMenuSection from './ComponentFilterMenuSection.svelte' - import SprintFilterMenuSection from './SprintFilterMenuSection.svelte' + import MilestoneFilterMenuSection from './MilestoneFilterMenuSection.svelte' import StatusFilterMenuSection from './StatusFilterMenuSection.svelte' export let targetHtml: HTMLElement @@ -43,7 +43,7 @@ $: groupedByStatus = getGroupedIssues('status', issues, defaultStatusIds) $: groupedByPriority = getGroupedIssues('priority', issues, defaultPriorities) $: groupedByComponent = getGroupedIssues('component', issues) - $: groupedBySprint = getGroupedIssues('sprint', issues) + $: groupedByMilestone = getGroupedIssues('milestone', issues) const handleStatusFilterMenuSectionOpened = () => { const statusGroups: { [key: string]: number } = {} @@ -105,17 +105,17 @@ ) } - const handleSprintFilterMenuSectionOpened = () => { - const sprintGroups: { [key: string]: number } = {} + const handleMilestoneFilterMenuSectionOpened = () => { + const milestoneGroups: { [key: string]: number } = {} - for (const [sprint, value] of Object.entries(groupedBySprint)) { - sprintGroups[sprint] = value?.length ?? 0 + for (const [milestone, value] of Object.entries(groupedByMilestone)) { + milestoneGroups[milestone] = value?.length ?? 0 } showPopup( - SprintFilterMenuSection, + MilestoneFilterMenuSection, { - groups: sprintGroups, - selectedElements: currentFilterQuery?.sprint?.[currentFilterMode] ?? [], + groups: milestoneGroups, + selectedElements: currentFilterQuery?.milestone?.[currentFilterMode] ?? [], index, onUpdate, onBack @@ -138,8 +138,8 @@ onSelect: handleComponentFilterMenuSectionOpened }, { - ...getIssueFilterAssetsByType('sprint'), - onSelect: handleSprintFilterMenuSectionOpened + ...getIssueFilterAssetsByType('milestone'), + onSelect: handleMilestoneFilterMenuSectionOpened } ] diff --git a/plugins/tracker-resources/src/components/issues/KanbanView.svelte b/plugins/tracker-resources/src/components/issues/KanbanView.svelte index f0f455d7cc..10cfb5f65b 100644 --- a/plugins/tracker-resources/src/components/issues/KanbanView.svelte +++ b/plugins/tracker-resources/src/components/issues/KanbanView.svelte @@ -142,7 +142,7 @@ space: tracker.class.Project, status: tracker.class.IssueStatus, component: tracker.class.Component, - sprint: tracker.class.Sprint, + milestone: tracker.class.Milestone, _id: { subIssues: tracker.class.Issue, labels: tags.class.TagReference diff --git a/plugins/tracker-resources/src/components/issues/SprintFilterMenuSection.svelte b/plugins/tracker-resources/src/components/issues/MilestoneFilterMenuSection.svelte similarity index 80% rename from plugins/tracker-resources/src/components/issues/SprintFilterMenuSection.svelte rename to plugins/tracker-resources/src/components/issues/MilestoneFilterMenuSection.svelte index e88e82f04e..9339dac1c0 100644 --- a/plugins/tracker-resources/src/components/issues/SprintFilterMenuSection.svelte +++ b/plugins/tracker-resources/src/components/issues/MilestoneFilterMenuSection.svelte @@ -30,22 +30,22 @@ const elements: FilterSectionElement[] = [] const client = getClient() - const sprints = await client.findAll(tracker.class.Sprint, {}) + const milestones = await client.findAll(tracker.class.Milestone, {}) for (const [key, value] of Object.entries(groups)) { - const sprint = key === 'null' ? null : key - const label = sprint - ? sprints.find(({ _id }) => _id === sprint)?.label - : await translate(tracker.string.NoSprint, {}) + const milestone = key === 'null' ? null : key + const label = milestone + ? milestones.find(({ _id }) => _id === milestone)?.label + : await translate(tracker.string.NoMilestone, {}) if (!label) { continue } - elements.splice(sprint ? 1 : 0, 0, { - icon: tracker.icon.Sprint, + elements.splice(milestone ? 1 : 0, 0, { + icon: tracker.icon.Milestone, title: label, count: value, - isSelected: selected.includes(sprint), - onSelect: () => onUpdate({ sprint }, index) + isSelected: selected.includes(milestone), + onSelect: () => onUpdate({ milestone }, index) }) } return onBack diff --git a/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte b/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte index b69ea17a70..2039a516d5 100644 --- a/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte +++ b/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte @@ -24,7 +24,7 @@ import { ObjectBox, getFiltredKeys, isCollectionAttr } from '@hcengineering/view-resources' import tracker from '../../../plugin' import ComponentEditor from '../../components/ComponentEditor.svelte' - import SprintEditor from '../../sprints/SprintEditor.svelte' + import MilestoneEditor from '../../milestones/MilestoneEditor.svelte' import AssigneeEditor from '../AssigneeEditor.svelte' import DueDateEditor from '../DueDateEditor.svelte' import PriorityEditor from '../PriorityEditor.svelte' @@ -82,7 +82,7 @@ 'assignee', 'component', 'dueDate', - 'sprint', + 'milestone', 'relations', 'blockedBy' ]) @@ -176,9 +176,9 @@ - - + {#if issue.dueDate !== null}
diff --git a/plugins/tracker-resources/src/components/issues/edit/CreateSubIssue.svelte b/plugins/tracker-resources/src/components/issues/edit/CreateSubIssue.svelte index 9787fa389a..21d85cbb40 100644 --- a/plugins/tracker-resources/src/components/issues/edit/CreateSubIssue.svelte +++ b/plugins/tracker-resources/src/components/issues/edit/CreateSubIssue.svelte @@ -64,7 +64,7 @@ component: parentIssue.component, priority: IssuePriority.NoPriority, dueDate: null, - sprint: parentIssue.sprint, + milestone: parentIssue.milestone, estimation: 0 } } @@ -75,7 +75,7 @@ assignee: currentProject.defaultAssignee ?? null, component: parentIssue.component, priority: IssuePriority.NoPriority, - sprint: parentIssue.sprint + milestone: parentIssue.milestone } function objectChange (object: IssueDraft, empty: any) { diff --git a/plugins/tracker-resources/src/components/sprints/EditSprint.svelte b/plugins/tracker-resources/src/components/milestones/EditMilestone.svelte similarity index 51% rename from plugins/tracker-resources/src/components/sprints/EditSprint.svelte rename to plugins/tracker-resources/src/components/milestones/EditMilestone.svelte index 58e11c8484..1852463c27 100644 --- a/plugins/tracker-resources/src/components/sprints/EditSprint.svelte +++ b/plugins/tracker-resources/src/components/milestones/EditMilestone.svelte @@ -1,85 +1,73 @@ - +
-
- {@const now = Date.now()}
- - / +
- -
@@ -88,18 +76,18 @@
- change('label', sprint.label)} /> + change('label', milestone.label)} />
change('description', evt.detail)} />
- +
diff --git a/plugins/tracker-resources/src/components/sprints/IssueStatistics.svelte b/plugins/tracker-resources/src/components/milestones/IssueStatistics.svelte similarity index 96% rename from plugins/tracker-resources/src/components/sprints/IssueStatistics.svelte rename to plugins/tracker-resources/src/components/milestones/IssueStatistics.svelte index c1395d95e4..a35f4c3d01 100644 --- a/plugins/tracker-resources/src/components/sprints/IssueStatistics.svelte +++ b/plugins/tracker-resources/src/components/milestones/IssueStatistics.svelte @@ -82,9 +82,9 @@ ) -{#if docs && (category === 'sprint' || category === 'assignee')} +{#if docs && (category === 'milestone' || category === 'assignee')} - +
(capacity ?? 0)}>
diff --git a/plugins/tracker-resources/src/components/sprints/SprintBrowser.svelte b/plugins/tracker-resources/src/components/milestones/MilestoneBrowser.svelte similarity index 73% rename from plugins/tracker-resources/src/components/sprints/SprintBrowser.svelte rename to plugins/tracker-resources/src/components/milestones/MilestoneBrowser.svelte index bc3eb89fa2..4bdfbfd36a 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintBrowser.svelte +++ b/plugins/tracker-resources/src/components/milestones/MilestoneBrowser.svelte @@ -16,7 +16,7 @@ import { DocumentQuery, WithLookup } from '@hcengineering/core' import { IntlString } from '@hcengineering/platform' import { createQuery } from '@hcengineering/presentation' - import { Sprint } from '@hcengineering/tracker' + import { Milestone } from '@hcengineering/tracker' import { Button, IconAdd, @@ -40,42 +40,42 @@ } from '@hcengineering/view-resources' import { onDestroy } from 'svelte' import tracker from '../../plugin' - import { SprintViewMode, getIncludedSprintStatuses, sprintTitleMap } from '../../utils' - import NewSprint from './NewSprint.svelte' - import SprintContent from './SprintContent.svelte' + import { MilestoneViewMode, getIncludedMilestoneStatuses, milestoneTitleMap } from '../../utils' + import NewMilestone from './NewMilestone.svelte' + import MilestoneContent from './MilestoneContent.svelte' export let label: IntlString - export let query: DocumentQuery = {} + export let query: DocumentQuery = {} export let search: string = '' - export let mode: SprintViewMode = 'all' + export let mode: MilestoneViewMode = 'all' const space = typeof query.space === 'string' ? query.space : tracker.project.DefaultProject const showCreateDialog = async () => { - showPopup(NewSprint, { space, targetElement: null }, 'top') + showPopup(NewMilestone, { space, targetElement: null }, 'top') } export let panelWidth: number = 0 let viewlet: WithLookup | undefined = undefined - let searchQuery: DocumentQuery = { ...query } + let searchQuery: DocumentQuery = { ...query } function updateSearchQuery (search: string): void { searchQuery = search === '' ? { ...query } : { ...query, $search: search } } $: if (query) updateSearchQuery(search) - $: includedSprintStatuses = getIncludedSprintStatuses(mode) - $: title = sprintTitleMap[mode] - $: includedSprintsQuery = { status: { $in: includedSprintStatuses } } + $: includedMilestoneStatuses = getIncludedMilestoneStatuses(mode) + $: title = milestoneTitleMap[mode] + $: includedMilestonesQuery = { status: { $in: includedMilestoneStatuses } } - let resultQuery: DocumentQuery = { ...searchQuery } + let resultQuery: DocumentQuery = { ...searchQuery } let viewlets: WithLookup[] | undefined $: viewlet = viewlets && updateActiveViewlet(viewlets, active) const viewletQuery = createQuery() - viewletQuery.query(view.class.Viewlet, { attachTo: tracker.class.Sprint }, (res) => (viewlets = res), { + viewletQuery.query(view.class.Viewlet, { attachTo: tracker.class.Milestone }, (res) => (viewlets = res), { lookup: { descriptor: view.class.ViewletDescriptor } @@ -105,7 +105,7 @@ $: viewOptions = getViewOptions(viewlet, $viewOptionStore) - const handleViewModeChanged = (newMode: SprintViewMode) => { + const handleViewModeChanged = (newMode: MilestoneViewMode) => { if (newMode === undefined || newMode === mode) { return } @@ -114,10 +114,10 @@ } const modeList: TabItem[] = [ - { id: 'all', labelIntl: tracker.string.AllSprints, action: () => handleViewModeChanged('all') }, - { id: 'planned', labelIntl: tracker.string.PlannedSprints, action: () => handleViewModeChanged('planned') }, - { id: 'active', labelIntl: tracker.string.ActiveSprints, action: () => handleViewModeChanged('active') }, - { id: 'closed', labelIntl: tracker.string.ClosedSprints, action: () => handleViewModeChanged('closed') } + { id: 'all', labelIntl: tracker.string.AllMilestones, action: () => handleViewModeChanged('all') }, + { id: 'planned', labelIntl: tracker.string.PlannedMilestones, action: () => handleViewModeChanged('planned') }, + { id: 'active', labelIntl: tracker.string.ActiveMilestones, action: () => handleViewModeChanged('active') }, + { id: 'closed', labelIntl: tracker.string.ClosedMilestones, action: () => handleViewModeChanged('closed') } ] @@ -130,7 +130,7 @@
-
@@ -161,7 +161,7 @@
(resultQuery = e.detail)} @@ -169,7 +169,7 @@
{#if viewlet} - + {/if} {#if $$slots.aside !== undefined && asideShown}
diff --git a/plugins/tracker-resources/src/components/sprints/SprintContent.svelte b/plugins/tracker-resources/src/components/milestones/MilestoneContent.svelte similarity index 77% rename from plugins/tracker-resources/src/components/sprints/SprintContent.svelte rename to plugins/tracker-resources/src/components/milestones/MilestoneContent.svelte index f8122b1c33..b5a11b1dec 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintContent.svelte +++ b/plugins/tracker-resources/src/components/milestones/MilestoneContent.svelte @@ -1,23 +1,23 @@ {#if kind === 'list'} - {#if value.sprint} + {#if value.milestone}
-
@@ -107,9 +105,9 @@ class:label-wrapper={compression} style:flex-direction={twoRows ? 'column' : 'row'} > - {#if (value.sprint && value.sprint !== $activeSprint && groupBy !== 'sprint') || shouldShowPlaceholder} + {#if (value.milestone && value.milestone !== $activeMilestone && groupBy !== 'milestone') || shouldShowPlaceholder}
-
{/if} - {#if sprint && kind === 'list-header'} + {#if milestone && kind === 'list-header'}
- {#if sprint} - {@const now = Date.now()} - {@const sprintDaysFrom = - now < sprint.startDate - ? 0 - : now > sprint.targetDate - ? getDayOfSprint(sprint.startDate, sprint.targetDate) - : getDayOfSprint(sprint.startDate, now)} - {@const sprintDaysTo = getDayOfSprint(sprint.startDate, sprint.targetDate)} - - / - -
- - - / - + {#if milestone} + {/if}
{/if} diff --git a/plugins/tracker-resources/src/components/sprints/SprintFilter.svelte b/plugins/tracker-resources/src/components/milestones/MilestoneFilter.svelte similarity index 80% rename from plugins/tracker-resources/src/components/sprints/SprintFilter.svelte rename to plugins/tracker-resources/src/components/milestones/MilestoneFilter.svelte index f45c0911b7..f175652f81 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintFilter.svelte +++ b/plugins/tracker-resources/src/components/milestones/MilestoneFilter.svelte @@ -16,14 +16,14 @@ import { DocumentQuery, FindResult, Ref, SortingOrder } from '@hcengineering/core' import { translate } from '@hcengineering/platform' import presentation, { getClient } from '@hcengineering/presentation' - import { Project, Sprint, SprintStatus } from '@hcengineering/tracker' + import { Project, Milestone, MilestoneStatus } from '@hcengineering/tracker' import ui, { CheckBox, Icon, Label, Loading, deviceOptionsStore, resizeObserver } from '@hcengineering/ui' import { FILTER_DEBOUNCE_MS, sortFilterValues } from '@hcengineering/view-resources' import view, { Filter } from '@hcengineering/view' import { createEventDispatcher, onMount } from 'svelte' import tracker from '../../plugin' - import { sprintStatusAssets } from '../../types' - import SprintTitlePresenter from './SprintTitlePresenter.svelte' + import { milestoneStatusAssets } from '../../types' + import MilestoneTitlePresenter from './MilestoneTitlePresenter.svelte' export let space: Ref | undefined = undefined export let filter: Filter @@ -40,9 +40,9 @@ phTraslate = res }) - let values: Sprint[] = [] - let objectsPromise: Promise> | undefined = undefined - let selectedValues: Set | undefined | null> = new Set() + let values: Milestone[] = [] + let objectsPromise: Promise> | undefined = undefined + let selectedValues: Set | undefined | null> = new Set() let filterUpdateTimeout: number | undefined @@ -53,15 +53,15 @@ } values = [] selectedValues.clear() - const spaceQuery: DocumentQuery = space ? { space } : {} - const resultQuery: DocumentQuery = + const spaceQuery: DocumentQuery = space ? { space } : {} + const resultQuery: DocumentQuery = search !== '' ? { label: { $like: '%' + search + '%' } } : {} objectsPromise = client.findAll( - tracker.class.Sprint, + tracker.class.Milestone, { ...resultQuery, ...spaceQuery }, { sort: { label: SortingOrder.Ascending } @@ -77,11 +77,11 @@ objectsPromise = undefined } - function isSelected (value: Ref | undefined, values: Set | undefined | null>): boolean { + function isSelected (value: Ref | undefined, values: Set | undefined | null>): boolean { return values.has(value) } - function handleFilterToggle (value: Ref | undefined): void { + function handleFilterToggle (value: Ref | undefined): void { if (isSelected(value, selectedValues)) { selectedValues.delete(value) } else { @@ -92,7 +92,7 @@ updateFilter(selectedValues) } - function updateFilter (newValues: Set | null | undefined>) { + function updateFilter (newValues: Set | null | undefined>) { clearTimeout(filterUpdateTimeout) filterUpdateTimeout = setTimeout(() => { @@ -101,12 +101,12 @@ }, FILTER_DEBOUNCE_MS) } - function getStatusItem (status: SprintStatus, docs: Sprint[]): Sprint[] { + function getStatusItem (status: MilestoneStatus, docs: Milestone[]): Milestone[] { return docs.filter((p) => p.status === status) } - function getStatuses (): SprintStatus[] { - const res = Array.from(Object.values(SprintStatus).filter((v) => !isNaN(Number(v)))) as SprintStatus[] + function getStatuses (): MilestoneStatus[] { + const res = Array.from(Object.values(MilestoneStatus).filter((v) => !isNaN(Number(v)))) as MilestoneStatus[] return res } @@ -148,7 +148,7 @@
{#each getStatuses() as group} - {@const status = sprintStatusAssets[group]} + {@const status = milestoneStatusAssets[group]} {@const items = getStatusItem(group, values)} {#if items.length > 0}
@@ -168,7 +168,7 @@
- +
{/each} diff --git a/plugins/tracker-resources/src/components/sprints/SprintLeadPresenter.svelte b/plugins/tracker-resources/src/components/milestones/MilestoneLeadPresenter.svelte similarity index 97% rename from plugins/tracker-resources/src/components/sprints/SprintLeadPresenter.svelte rename to plugins/tracker-resources/src/components/milestones/MilestoneLeadPresenter.svelte index b7498836c0..9271b9f5f6 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintLeadPresenter.svelte +++ b/plugins/tracker-resources/src/components/milestones/MilestoneLeadPresenter.svelte @@ -18,7 +18,7 @@ import { IntlString } from '@hcengineering/platform' import { getClient } from '@hcengineering/presentation' import { UsersPopup } from '@hcengineering/contact-resources' - import { Sprint } from '@hcengineering/tracker' + import { Milestone } from '@hcengineering/tracker' import { eventToHTMLElement, IconSize, showPopup } from '@hcengineering/ui' import { AttributeModel } from '@hcengineering/view' import { getObjectPresenter } from '@hcengineering/view-resources' @@ -27,7 +27,7 @@ export let value: Employee | null export let size: IconSize = 'x-small' - export let object: Sprint + export let object: Milestone export let defaultClass: Ref> | undefined = undefined export let isEditable: boolean = true export let shouldShowLabel: boolean = false diff --git a/plugins/tracker-resources/src/components/sprints/SprintPopup.svelte b/plugins/tracker-resources/src/components/milestones/MilestonePopup.svelte similarity index 64% rename from plugins/tracker-resources/src/components/sprints/SprintPopup.svelte rename to plugins/tracker-resources/src/components/milestones/MilestonePopup.svelte index b29846f2f0..2c8cd27554 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintPopup.svelte +++ b/plugins/tracker-resources/src/components/milestones/MilestonePopup.svelte @@ -15,36 +15,36 @@ - - + + - - {@const status = sprintStatusAssets[getStatus(sprint)]} + + {@const status = milestoneStatusAssets[getStatus(milestone)]} {#if status}
diff --git a/plugins/tracker-resources/src/components/sprints/SprintPresenter.svelte b/plugins/tracker-resources/src/components/milestones/MilestonePresenter.svelte similarity index 82% rename from plugins/tracker-resources/src/components/sprints/SprintPresenter.svelte rename to plugins/tracker-resources/src/components/milestones/MilestonePresenter.svelte index e4481831b8..1e775085fc 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintPresenter.svelte +++ b/plugins/tracker-resources/src/components/milestones/MilestonePresenter.svelte @@ -14,17 +14,17 @@ --> - diff --git a/plugins/tracker-resources/src/components/sprints/SprintStatusSelector.svelte b/plugins/tracker-resources/src/components/milestones/MilestoneStatusSelector.svelte similarity index 65% rename from plugins/tracker-resources/src/components/sprints/SprintStatusSelector.svelte rename to plugins/tracker-resources/src/components/milestones/MilestoneStatusSelector.svelte index 19ae404c5d..9bedc6ef91 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintStatusSelector.svelte +++ b/plugins/tracker-resources/src/components/milestones/MilestoneStatusSelector.svelte @@ -13,15 +13,16 @@ // limitations under the License. --> @@ -68,5 +69,5 @@ icon={selectedStatusIcon} label={selectedStatusLabel} {showTooltip} - on:click={handleSprintStatusEditorOpened} + on:click={handleMilestoneStatusEditorOpened} /> diff --git a/plugins/tracker-resources/src/components/sprints/SprintTitlePresenter.svelte b/plugins/tracker-resources/src/components/milestones/MilestoneTitlePresenter.svelte similarity index 80% rename from plugins/tracker-resources/src/components/sprints/SprintTitlePresenter.svelte rename to plugins/tracker-resources/src/components/milestones/MilestoneTitlePresenter.svelte index 7a4b7a2f7a..5f071fc491 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintTitlePresenter.svelte +++ b/plugins/tracker-resources/src/components/milestones/MilestoneTitlePresenter.svelte @@ -13,22 +13,19 @@ // limitations under the License. --> {#if value} - +
{value.label}
- {new Date(value.startDate).getDate()} - {getMonthName(new Date(value.startDate), 'short')} - - {new Date(value.targetDate).getDate()} {getMonthName(new Date(value.targetDate), 'short')} diff --git a/plugins/tracker-resources/src/components/sprints/Sprints.svelte b/plugins/tracker-resources/src/components/milestones/Milestones.svelte similarity index 60% rename from plugins/tracker-resources/src/components/sprints/Sprints.svelte rename to plugins/tracker-resources/src/components/milestones/Milestones.svelte index 283059e232..c69493b75c 100644 --- a/plugins/tracker-resources/src/components/sprints/Sprints.svelte +++ b/plugins/tracker-resources/src/components/milestones/Milestones.svelte @@ -16,7 +16,7 @@ import { Ref } from '@hcengineering/core' import { IntlString } from '@hcengineering/platform' import { createQuery } from '@hcengineering/presentation' - import { Sprint, Project } from '@hcengineering/tracker' + import { Milestone, Project } from '@hcengineering/tracker' import { closePopup, closeTooltip, @@ -26,47 +26,47 @@ } from '@hcengineering/ui' import { onDestroy } from 'svelte' import tracker from '../../plugin' - import { SprintViewMode } from '../../utils' - import EditSprint from './EditSprint.svelte' - import SprintBrowser from './SprintBrowser.svelte' + import { MilestoneViewMode } from '../../utils' + import EditMilestone from './EditMilestone.svelte' + import MilestoneBrowser from './MilestoneBrowser.svelte' export let currentSpace: Ref - export let label: IntlString = tracker.string.Sprints + export let label: IntlString = tracker.string.Milestones export let search: string = '' - export let mode: SprintViewMode = 'all' + export let mode: MilestoneViewMode = 'all' - let sprintId: Ref | undefined - let sprint: Sprint | undefined + let milestoneId: Ref | undefined + let milestone: Milestone | undefined onDestroy( resolvedLocationStore.subscribe(async (loc) => { closeTooltip() closePopup() - sprintId = loc.path[5] as Ref + milestoneId = loc.path[5] as Ref }) ) - const sprintQuery = createQuery() - $: if (sprintId !== undefined) { - sprintQuery.query(tracker.class.Sprint, { _id: sprintId }, (result) => { - sprint = result.shift() + const milestoneQuery = createQuery() + $: if (milestoneId !== undefined) { + milestoneQuery.query(tracker.class.Milestone, { _id: milestoneId }, (result) => { + milestone = result.shift() }) } else { - sprintQuery.unsubscribe() - sprint = undefined + milestoneQuery.unsubscribe() + milestone = undefined } -{#if sprint} - { +{#if milestone} + { const loc = getCurrentResolvedLocation() loc.path[5] = evt.detail navigate(loc) }} /> {:else} - + {/if} diff --git a/plugins/tracker-resources/src/components/sprints/MoveAndDeleteSprintPopup.svelte b/plugins/tracker-resources/src/components/milestones/MoveAndDeleteMilestonePopup.svelte similarity index 53% rename from plugins/tracker-resources/src/components/sprints/MoveAndDeleteSprintPopup.svelte rename to plugins/tracker-resources/src/components/milestones/MoveAndDeleteMilestonePopup.svelte index 10ce150e54..239e2c7125 100644 --- a/plugins/tracker-resources/src/components/sprints/MoveAndDeleteSprintPopup.svelte +++ b/plugins/tracker-resources/src/components/milestones/MoveAndDeleteMilestonePopup.svelte @@ -18,35 +18,35 @@ import tracker from '../../plugin' import { Card } from '@hcengineering/presentation' import { translate } from '@hcengineering/platform' - import SprintPopup from './SprintPopup.svelte' - import { Sprint } from '@hcengineering/tracker' + import MilestonePopup from './MilestonePopup.svelte' + import { Milestone } from '@hcengineering/tracker' - export let sprints: Sprint[] - export let moveAndDeleteSprint: (selectedSprint?: Sprint) => Promise + export let milestones: Milestone[] + export let moveAndDeleteMilestone: (selectedMilestone?: Milestone) => Promise - let selectedSprint: Sprint | undefined - let noSprintLabel: string + let selectedMilestone: Milestone | undefined + let noMilestoneLabel: string - $: translate(tracker.string.NoSprint, {}).then((label) => (noSprintLabel = label)) - $: selectedSprintLabel = selectedSprint?.label ?? noSprintLabel + $: translate(tracker.string.NoMilestone, {}).then((label) => (noMilestoneLabel = label)) + $: selectedMilestoneLabel = selectedMilestone?.label ?? noMilestoneLabel p.label) }} + label={tracker.string.MoveAndDeleteMilestone} + labelProps={{ newMilestone: selectedMilestoneLabel, deleteMilestone: milestones.map((p) => p.label) }} okLabel={tracker.string.Delete} - okAction={() => moveAndDeleteSprint(selectedSprint)} + okAction={() => moveAndDeleteMilestone(selectedMilestone)} on:close on:changeContent > - (selectedSprint = detail)} + on:update={({ detail }) => (selectedMilestone = detail)} /> diff --git a/plugins/tracker-resources/src/components/sprints/NewSprint.svelte b/plugins/tracker-resources/src/components/milestones/NewMilestone.svelte similarity index 72% rename from plugins/tracker-resources/src/components/sprints/NewSprint.svelte rename to plugins/tracker-resources/src/components/milestones/NewMilestone.svelte index bbc326a36c..404a6513d2 100644 --- a/plugins/tracker-resources/src/components/sprints/NewSprint.svelte +++ b/plugins/tracker-resources/src/components/milestones/NewMilestone.svelte @@ -17,48 +17,47 @@ import { IntlString } from '@hcengineering/platform' import { Card, getClient, SpaceSelector } from '@hcengineering/presentation' import { EmployeeBox, UserBoxList } from '@hcengineering/contact-resources' - import { Sprint, SprintStatus, Project } from '@hcengineering/tracker' + import { Milestone, MilestoneStatus, Project } from '@hcengineering/tracker' import ui, { DatePresenter, EditBox } from '@hcengineering/ui' import { createEventDispatcher } from 'svelte' import tracker from '../../plugin' - import SprintStatusSelector from './SprintStatusSelector.svelte' + import MilestoneStatusSelector from './MilestoneStatusSelector.svelte' import { StyledTextArea } from '@hcengineering/text-editor' export let space: Ref const dispatch = createEventDispatcher() const client = getClient() - const object: Data = { + const object: Data = { label: '' as IntlString, description: '', - status: SprintStatus.Planned, + status: MilestoneStatus.Planned, lead: null, members: [], comments: 0, attachments: 0, capacity: 0, - startDate: Date.now(), targetDate: Date.now() + 14 * 24 * 60 * 60 * 1000 } async function onSave () { - await client.createDoc(tracker.class.Sprint, space, object) + await client.createDoc(tracker.class.Milestone, space, object) } - const handleComponentStatusChanged = (newSprintStatus: SprintStatus | undefined) => { - if (newSprintStatus === undefined) { + const handleComponentStatusChanged = (newMilestoneStatus: MilestoneStatus | undefined) => { + if (newMilestoneStatus === undefined) { return } - object.status = newSprintStatus + object.status = newMilestoneStatus } dispatch('close')} on:changeContent > @@ -71,21 +70,21 @@ bind:space /> - + - - diff --git a/plugins/tracker-resources/src/components/scrums/ScrumRecordObjects.svelte b/plugins/tracker-resources/src/components/scrums/ScrumRecordObjects.svelte index 38e06bce43..9805e604b8 100644 --- a/plugins/tracker-resources/src/components/scrums/ScrumRecordObjects.svelte +++ b/plugins/tracker-resources/src/components/scrums/ScrumRecordObjects.svelte @@ -27,7 +27,7 @@ tracker.class.Issue, tracker.class.IssueTemplate, tracker.class.Component, - tracker.class.Sprint + tracker.class.Milestone ] as const let changedObjectTxes: TxCUD[] = [] diff --git a/plugins/tracker-resources/src/components/scrums/ScrumRecordTimeSpend.svelte b/plugins/tracker-resources/src/components/scrums/ScrumRecordTimeSpend.svelte index 7718cd5789..54bdecd362 100644 --- a/plugins/tracker-resources/src/components/scrums/ScrumRecordTimeSpend.svelte +++ b/plugins/tracker-resources/src/components/scrums/ScrumRecordTimeSpend.svelte @@ -169,14 +169,14 @@ { key: '', presenter: tracker.component.DueDatePresenter, props: { kind: 'list', isEditable: false } }, { key: '', - presenter: tracker.component.SprintEditor, + presenter: tracker.component.MilestoneEditor, props: { kind: 'list', size: 'small', shape: 'round', shouldShowPlaceholder: false, listProps: { - excludeByKey: 'sprint' + excludeByKey: 'milestone' }, isEditable: false } diff --git a/plugins/tracker-resources/src/components/scrums/ScrumsView.svelte b/plugins/tracker-resources/src/components/scrums/ScrumsView.svelte index 3d71d509f5..6c736d3c8c 100644 --- a/plugins/tracker-resources/src/components/scrums/ScrumsView.svelte +++ b/plugins/tracker-resources/src/components/scrums/ScrumsView.svelte @@ -15,7 +15,7 @@ | null = null export let component: Ref | null = $activeComponent ?? null - export let sprint: Ref | null = $activeSprint ?? null + export let milestone: Ref | null = $activeMilestone ?? null export let relatedTo: Doc | undefined let labels: TagElement[] = [] @@ -45,7 +45,7 @@ description: '', assignee, component, - sprint, + milestone, priority, estimation: 0, children: [], @@ -85,7 +85,7 @@ description: object.description, assignee: object.assignee, component: object.component, - sprint: object.sprint, + milestone: object.milestone, priority: object.priority, estimation: object.estimation, children: object.children, @@ -107,12 +107,12 @@ object = { ...object, component: componentId } } - const handleSprintIdChanged = (sprintId: Ref | null | undefined) => { - if (sprintId === undefined) { + const handleMilestoneIdChanged = (milestoneId: Ref | null | undefined) => { + if (milestoneId === undefined) { return } - object = { ...object, sprint: sprintId } + object = { ...object, milestone: milestoneId } } function addTagRef (tag: TagElement): void { @@ -155,7 +155,7 @@ @@ -201,9 +201,9 @@ kind={'secondary'} size={'large'} /> - export let project: Project - export let sprint: Ref | null = null + export let milestone: Ref | null = null export let component: Ref | null = null export let childIssue: IssueDraft | undefined = undefined export let showBorder = false @@ -66,7 +73,7 @@ labels: [], component, priority: IssuePriority.NoPriority, - sprint, + milestone, estimation: 0 } } @@ -77,7 +84,7 @@ assignee: project.defaultAssignee ?? null, component, priority: IssuePriority.NoPriority, - sprint + milestone } function objectChange (object: IssueDraft, empty: any) { diff --git a/plugins/tracker-resources/src/components/templates/DraftIssueChildList.svelte b/plugins/tracker-resources/src/components/templates/DraftIssueChildList.svelte index a307669d1d..6f6599512b 100644 --- a/plugins/tracker-resources/src/components/templates/DraftIssueChildList.svelte +++ b/plugins/tracker-resources/src/components/templates/DraftIssueChildList.svelte @@ -15,7 +15,7 @@