diff --git a/plugins/tracker-resources/src/components/issues/timereport/EstimationEditor.svelte b/plugins/tracker-resources/src/components/issues/timereport/EstimationEditor.svelte index 5dcf612f34..a79a0d4710 100644 --- a/plugins/tracker-resources/src/components/issues/timereport/EstimationEditor.svelte +++ b/plugins/tracker-resources/src/components/issues/timereport/EstimationEditor.svelte @@ -18,7 +18,7 @@ import { getClient } from '@hcengineering/presentation' import { Issue, IssueDraft } from '@hcengineering/tracker' import { Button, ButtonKind, ButtonSize, eventToHTMLElement, showPopup } from '@hcengineering/ui' - import { EditBoxPopup } from '@hcengineering/view-resources' + import { EditBoxPopup, FixedColumn } from '@hcengineering/view-resources' import { createEventDispatcher } from 'svelte' import tracker from '../../../plugin' import EstimationPopup from './EstimationPopup.svelte' @@ -74,7 +74,9 @@ {#if value} {#if kind === 'list' && '_class' in value} - <EstimationStatsPresenter {value} {kind} on:click={handleestimationEditorOpened} /> + <FixedColumn key="estimation-editor-total"> + <EstimationStatsPresenter {value} {kind} on:click={handleestimationEditorOpened} /> + </FixedColumn> {:else} <Button {focusIndex} diff --git a/plugins/tracker-resources/src/components/issues/timereport/TimePresenter.svelte b/plugins/tracker-resources/src/components/issues/timereport/TimePresenter.svelte index df5ee8d56d..25a8b27ed3 100644 --- a/plugins/tracker-resources/src/components/issues/timereport/TimePresenter.svelte +++ b/plugins/tracker-resources/src/components/issues/timereport/TimePresenter.svelte @@ -29,13 +29,15 @@ on:click use:tooltip={{ component: Label, - props: { label: tracker.string.TimeSpendHours, params: { value: floorFractionDigits(value * 8, 2) } } + props: { label: tracker.string.TimeSpendHours, params: { value: floorFractionDigits(value * 8, 3) } } }} > {#if noSymbol} - {floorFractionDigits(value, 3)} + {floorFractionDigits(value, 1)} + {:else if value > 0 && value < 1} + <Label label={tracker.string.TimeSpendHours} params={{ value: floorFractionDigits(value * 8, 1) }} /> {:else} - <Label label={tracker.string.TimeSpendValue} params={{ value: floorFractionDigits(value, 3) }} /> + <Label label={tracker.string.TimeSpendValue} params={{ value: floorFractionDigits(value, 1) }} /> {/if} </span> diff --git a/plugins/tracker-resources/src/components/sprints/IssueStatistics.svelte b/plugins/tracker-resources/src/components/sprints/IssueStatistics.svelte index b34093c181..45749c61b6 100644 --- a/plugins/tracker-resources/src/components/sprints/IssueStatistics.svelte +++ b/plugins/tracker-resources/src/components/sprints/IssueStatistics.svelte @@ -20,8 +20,10 @@ import { statusStore } from '@hcengineering/presentation' import EstimationProgressCircle from '../issues/timereport/EstimationProgressCircle.svelte' import TimePresenter from '../issues/timereport/TimePresenter.svelte' + import { FixedColumn } from '@hcengineering/view-resources' export let docs: Issue[] | undefined = undefined export let capacity: number | undefined = undefined + export let category: string | undefined = undefined $: ids = new Set(docs?.map((it) => it._id) ?? []) @@ -60,7 +62,7 @@ .reduce((it, cur) => { return it + cur }, 0), - 3 + 1 ) $: totalReported = floorFractionDigits( (noParents ?? [{ reportedTime: 0, childInfo: [] } as unknown as Issue]) @@ -76,22 +78,24 @@ .reduce((it, cur) => { return it + cur }, 0), - 3 + 1 ) </script> -{#if docs} - <!-- <Label label={tracker.string.SprintDay} value={}/> --> - <div class="flex-row-center flex-no-shrink h-6" class:showWarning={totalEstimation > (capacity ?? 0)}> - <EstimationProgressCircle value={totalReported} max={totalEstimation} /> - <div class="w-2 min-w-2" /> - {#if totalReported > 0} - <TimePresenter value={totalReported} /> - / - {/if} - <TimePresenter value={totalEstimation} /> - {#if capacity} - <Label label={tracker.string.CapacityValue} params={{ value: capacity }} /> - {/if} - </div> +{#if docs && (category === 'sprint' || category === 'assignee')} + <FixedColumn key="estimation-editor"> + <!-- <Label label={tracker.string.SprintDay} value={}/> --> + <div class="flex-row-center flex-no-shrink h-6" class:showWarning={totalEstimation > (capacity ?? 0)}> + <EstimationProgressCircle value={totalReported} max={totalEstimation} /> + <div class="w-2 min-w-2" /> + {#if totalReported > 0} + <TimePresenter value={totalReported} /> + / + {/if} + <TimePresenter value={totalEstimation} /> + {#if capacity} + <Label label={tracker.string.CapacityValue} params={{ value: capacity }} /> + {/if} + </div> + </FixedColumn> {/if} diff --git a/plugins/view-resources/src/components/list/ListHeader.svelte b/plugins/view-resources/src/components/list/ListHeader.svelte index 6c6ea35f88..a0a4e09356 100644 --- a/plugins/view-resources/src/components/list/ListHeader.svelte +++ b/plugins/view-resources/src/components/list/ListHeader.svelte @@ -19,6 +19,7 @@ ActionIcon, AnyComponent, Button, + Component, IconAdd, IconBack, IconCheck, @@ -98,7 +99,7 @@ }} on:click={() => dispatch('collapse')} > - <div class="flex-row-center clear-mins"> + <div class="flex-row-center clear-mins flex-grow"> {#if level === 0} <div class="chevron"><IconCollapseArrow size={'small'} /></div> {/if} @@ -152,6 +153,11 @@ {:else} <span class="antiSection-header__counter ml-2">{items.length}</span> {/if} + <div class="flex-row-center flex-reverse flex-grow"> + {#each extraHeaders ?? [] as extra} + <Component is={extra} props={{ ...props, value: category, category: groupByKey, docs: items }} /> + {/each} + </div> </div> {#if createItemDialog !== undefined && createItemLabel !== undefined} <div class:on-hover={!mouseOver} class="flex-row-center"> @@ -190,7 +196,7 @@ position: relative; position: sticky; top: 0; - padding: 0 0.75rem 0 0.75rem; + padding: 0 2.5rem 0 0.75rem; height: 2.75rem; min-height: 2.75rem; min-width: 0; diff --git a/tests/sanity/tests/tracker.spec.ts b/tests/sanity/tests/tracker.spec.ts index 5e1660fd2e..f8e6b3533f 100644 --- a/tests/sanity/tests/tracker.spec.ts +++ b/tests/sanity/tests/tracker.spec.ts @@ -118,6 +118,18 @@ test('my-issues', async ({ page }) => { await expect(page.locator('.antiPanel-component')).not.toContainText(name) }) +function floorFractionDigits (n: number | string, amount: number): number { + return Number(Number(n).toFixed(amount)) +} + +function toTime (value: number): string { + if (value > 0 && value < 1) { + return `${floorFractionDigits(value * 8, 1)}h` + } else { + return `${floorFractionDigits(value, 1)}d` + } +} + test('report-time-from-issue-card', async ({ page }) => { await navigate(page) const assignee = 'Chen Rosamund' @@ -142,7 +154,7 @@ test('report-time-from-issue-card', async ({ page }) => { await page.click('button:has-text("Create")') await page.click('#card-close') - await expect(page.locator('#ReportedTimeEditor')).toContainText(`${time}d`) + await expect(page.locator('#ReportedTimeEditor')).toContainText(toTime(time)) } }) @@ -186,7 +198,7 @@ test('report-time-from-main-view', async ({ page }) => { await page.click('button:has-text("Create")') await page.click('#card-close') - await expect(page.locator('.estimation-container >> span').first()).toContainText(`${Number(count.toFixed(2))}d`) + await expect(page.locator('.estimation-container >> span').first()).toContainText(toTime(count)) } })