diff --git a/models/tracker/src/index.ts b/models/tracker/src/index.ts index aef9a2663e..544e54b7ed 100644 --- a/models/tracker/src/index.ts +++ b/models/tracker/src/index.ts @@ -1511,20 +1511,11 @@ export function createModel (builder: Builder): void { createAction( builder, { - action: view.actionImpl.ValueSelector, - actionPopup: view.component.ValueSelector, + action: view.actionImpl.AttributeSelector, + actionPopup: tracker.component.SprintEditor, actionProps: { attribute: 'sprint', - _class: tracker.class.Sprint, - queryOptions: { - sort: { - startDate: -1, - targetDate: -1 - } - }, - query: {}, - searchField: 'label', - placeholder: tracker.string.Sprint + isAction: true }, label: tracker.string.Sprint, icon: tracker.icon.Sprint, diff --git a/plugins/tracker-resources/src/components/sprints/SprintEditor.svelte b/plugins/tracker-resources/src/components/sprints/SprintEditor.svelte index ab5478e631..dc5192b17f 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintEditor.svelte +++ b/plugins/tracker-resources/src/components/sprints/SprintEditor.svelte @@ -29,6 +29,7 @@ import { getDayOfSprint } from '../../utils' import TimePresenter from '../issues/timereport/TimePresenter.svelte' import SprintSelector from './SprintSelector.svelte' + import { createEventDispatcher } from 'svelte' export let value: Issue | IssueTemplate export let isEditable: boolean = true @@ -41,19 +42,29 @@ export let justify: 'left' | 'center' = 'left' export let width: string | undefined = '100%' export let onlyIcon: boolean = false + export let isAction: boolean = false export let groupBy: string | undefined = undefined export let enlargedText: boolean = false export let compression: boolean = false const client = getClient() + const dispatch = createEventDispatcher() const handleSprintIdChanged = async (newSprintId: Ref | null | undefined) => { if (!isEditable || newSprintId === undefined || value.sprint === newSprintId) { return } - - await client.update(value, { sprint: newSprintId }) + if (Array.isArray(value)) { + await Promise.all( + value.map(async (p) => { + await client.update(p, { sprint: newSprintId }) + }) + ) + } else { + await client.update(value, { sprint: newSprintId }) + } + if (isAction) dispatch('close') } const sprintQuery = createQuery() @@ -85,6 +96,7 @@ showTooltip={{ label: value.sprint ? tracker.string.MoveToSprint : tracker.string.AddToSprint }} value={value.sprint} onChange={handleSprintIdChanged} + {isAction} /> {/if} @@ -111,6 +123,7 @@ showTooltip={{ label: value.sprint ? tracker.string.MoveToSprint : tracker.string.AddToSprint }} value={value.sprint} onChange={handleSprintIdChanged} + {isAction} /> {/if} diff --git a/plugins/tracker-resources/src/components/sprints/SprintSelector.svelte b/plugins/tracker-resources/src/components/sprints/SprintSelector.svelte index 76dd6ce674..6c43073366 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintSelector.svelte +++ b/plugins/tracker-resources/src/components/sprints/SprintSelector.svelte @@ -36,6 +36,7 @@ export let enlargedText: boolean = false export let short: boolean = false export let focusIndex: number | undefined = undefined + export let isAction: boolean = false export let useComponent: Ref | undefined = undefined export let showTooltip: LabelAndProps | undefined = undefined @@ -72,13 +73,8 @@ selectedSprint = sprints.find((it) => it._id === newSprintId) } - const handleSprintEditorOpened = async (event: MouseEvent): Promise => { - event.stopPropagation() - if (!isEditable) { - return - } - - const sprintInfo = [ + const getSprintInfo = (rawSprints: Sprint[]) => { + return [ { id: null, icon: tracker.icon.Sprint, label: tracker.string.NoSprint }, ...rawSprints.map((p) => ({ id: p._id, @@ -87,6 +83,17 @@ category: sprintStatusAssets[p.status] })) ] + } + + $: sprints = getSprintInfo(rawSprints) + + const handleSprintEditorOpened = async (event: MouseEvent): Promise => { + event.stopPropagation() + if (!isEditable) { + return + } + + const sprintInfo = sprints showPopup( SelectPopup, @@ -97,7 +104,16 @@ } -{#if onlyIcon || sprintText === undefined} +{#if isAction} + { + if (onChange !== undefined) onChange(evt.detail) + }} + /> +{:else if onlyIcon || sprintText === undefined}