fix: reorder journal worklog sections
This commit is contained in:
parent
40c0953904
commit
f88376264d
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -19,7 +19,7 @@
|
||||||
background: #13131f;
|
background: #13131f;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<script type="module" crossorigin src="/assets/main-DqAK36oG.js"></script>
|
<script type="module" crossorigin src="/assets/main-DhmtVNHh.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/main-N_NpVgn3.css">
|
<link rel="stylesheet" crossorigin href="/assets/main-N_NpVgn3.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
||||||
|
|
@ -3299,7 +3299,40 @@
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
{:else}
|
{:else}
|
||||||
|
{#if journalSummary}
|
||||||
|
<div class="journal-summary">
|
||||||
|
<div class="summary-total">{t('journal.total')}: {Math.floor(journalSummary.totalMinutes / 60)}ч {journalSummary.totalMinutes % 60}м ({journalSummary.totalEntries} {t('worklog.min')})</div>
|
||||||
|
{#if journalSummary.byDay && journalSummary.byDay.length > 0}
|
||||||
|
<div class="summary-section">
|
||||||
|
<div class="summary-label">{t('journal.byDay')}</div>
|
||||||
|
{#each journalSummary.byDay as g}
|
||||||
|
<div class="summary-row"><span>{g.label}</span><span>{Math.floor(g.minutes / 60)}ч {g.minutes % 60}м</span><span class="summary-count">{g.count}</span></div>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
{#if journalSummary.byNode && journalSummary.byNode.length > 0}
|
||||||
|
<div class="summary-section">
|
||||||
|
<div class="summary-label">{t('journal.byNode')}</div>
|
||||||
|
{#each journalSummary.byNode as g}
|
||||||
|
<div class="summary-row"><span>{g.label}</span><span>{Math.floor(g.minutes / 60)}ч {g.minutes % 60}м</span><span class="summary-count">{g.count}</span></div>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<div class="journal-header">
|
<div class="journal-header">
|
||||||
|
<div class="journal-export-section">
|
||||||
|
<div class="journal-export-heading">{t('journal.exportHeading')}</div>
|
||||||
|
<div class="journal-export-row">
|
||||||
|
<button class="btn btn-sm" on:click={() => saveJournalReport('csv')}>{t('journal.exportCSV')}</button>
|
||||||
|
<button class="btn btn-sm" on:click={() => saveJournalReport('markdown')}>{t('journal.exportMarkdown')}</button>
|
||||||
|
<button class="btn btn-sm" on:click={() => saveJournalReport('pdf')}>PDF</button>
|
||||||
|
{#if journalStatusMsg}
|
||||||
|
<span class="journal-status-msg">{journalStatusMsg}</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="journal-filter-section">
|
<div class="journal-filter-section">
|
||||||
<div class="journal-filter-heading">{t('journal.filterHeading')}</div>
|
<div class="journal-filter-heading">{t('journal.filterHeading')}</div>
|
||||||
<div class="journal-filters-row">
|
<div class="journal-filters-row">
|
||||||
|
|
@ -3357,41 +3390,8 @@
|
||||||
<button class="btn btn-sm" on:click={resetJournalFilters}>{t('journal.reset')}</button>
|
<button class="btn btn-sm" on:click={resetJournalFilters}>{t('journal.reset')}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="journal-export-section">
|
|
||||||
<div class="journal-export-heading">{t('journal.exportHeading')}</div>
|
|
||||||
<div class="journal-export-row">
|
|
||||||
<button class="btn btn-sm" on:click={() => saveJournalReport('csv')}>{t('journal.exportCSV')}</button>
|
|
||||||
<button class="btn btn-sm" on:click={() => saveJournalReport('markdown')}>{t('journal.exportMarkdown')}</button>
|
|
||||||
<button class="btn btn-sm" on:click={() => saveJournalReport('pdf')}>PDF</button>
|
|
||||||
{#if journalStatusMsg}
|
|
||||||
<span class="journal-status-msg">{journalStatusMsg}</span>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#if journalSummary}
|
|
||||||
<div class="journal-summary">
|
|
||||||
<div class="summary-total">{t('journal.total')}: {Math.floor(journalSummary.totalMinutes / 60)}ч {journalSummary.totalMinutes % 60}м ({journalSummary.totalEntries} {t('worklog.min')})</div>
|
|
||||||
{#if journalSummary.byDay && journalSummary.byDay.length > 0}
|
|
||||||
<div class="summary-section">
|
|
||||||
<div class="summary-label">{t('journal.byDay')}</div>
|
|
||||||
{#each journalSummary.byDay as g}
|
|
||||||
<div class="summary-row"><span>{g.label}</span><span>{Math.floor(g.minutes / 60)}ч {g.minutes % 60}м</span><span class="summary-count">{g.count}</span></div>
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
{#if journalSummary.byNode && journalSummary.byNode.length > 0}
|
|
||||||
<div class="summary-section">
|
|
||||||
<div class="summary-label">{t('journal.byNode')}</div>
|
|
||||||
{#each journalSummary.byNode as g}
|
|
||||||
<div class="summary-row"><span>{g.label}</span><span>{Math.floor(g.minutes / 60)}ч {g.minutes % 60}м</span><span class="summary-count">{g.count}</span></div>
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
{#if journalRows.length === 0}
|
{#if journalRows.length === 0}
|
||||||
<div class="empty-state"><p>{t('journal.empty')}</p></div>
|
<div class="empty-state"><p>{t('journal.empty')}</p></div>
|
||||||
{:else}
|
{:else}
|
||||||
|
|
|
||||||
|
|
@ -348,6 +348,17 @@ async function runReadyScenario(cdp, url) {
|
||||||
await assertEval(cdp, `!document.querySelector('.journal-screen h2')`, 'journal: screen title is not duplicated inside body')
|
await assertEval(cdp, `!document.querySelector('.journal-screen h2')`, 'journal: screen title is not duplicated inside body')
|
||||||
await clickText(cdp, '.journal-tab', 'Журнал работы')
|
await clickText(cdp, '.journal-tab', 'Журнал работы')
|
||||||
await screenshot(cdp, 'journal.png')
|
await screenshot(cdp, 'journal.png')
|
||||||
|
await assertEval(cdp, `
|
||||||
|
(() => {
|
||||||
|
const summary = document.querySelector('.journal-summary');
|
||||||
|
const exportBlock = document.querySelector('.journal-export-section');
|
||||||
|
const filterBlock = document.querySelector('.journal-filter-section');
|
||||||
|
const table = document.querySelector('.journal-table-wrap');
|
||||||
|
if (!summary || !exportBlock || !filterBlock || !table) return false;
|
||||||
|
const top = (el) => el.getBoundingClientRect().top;
|
||||||
|
return top(summary) < top(exportBlock) && top(exportBlock) < top(filterBlock) && top(filterBlock) < top(table);
|
||||||
|
})()
|
||||||
|
`, 'journal: summary, export, filters, work list order')
|
||||||
await assertEval(cdp, `document.body.innerText.toLowerCase().includes('фильтры')`, 'journal: filter section visible')
|
await assertEval(cdp, `document.body.innerText.toLowerCase().includes('фильтры')`, 'journal: filter section visible')
|
||||||
await assertEval(cdp, `document.body.innerText.toLowerCase().includes('экспорт отчёта')`, 'journal: export section visible')
|
await assertEval(cdp, `document.body.innerText.toLowerCase().includes('экспорт отчёта')`, 'journal: export section visible')
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue