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;
|
||||
}
|
||||
</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">
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
|||
|
|
@ -3299,7 +3299,40 @@
|
|||
</div>
|
||||
{/if}
|
||||
{: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-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-heading">{t('journal.filterHeading')}</div>
|
||||
<div class="journal-filters-row">
|
||||
|
|
@ -3357,40 +3390,7 @@
|
|||
<button class="btn btn-sm" on:click={resetJournalFilters}>{t('journal.reset')}</button>
|
||||
</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>
|
||||
|
||||
{#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}
|
||||
<div class="empty-state"><p>{t('journal.empty')}</p></div>
|
||||
|
|
|
|||
|
|
@ -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 clickText(cdp, '.journal-tab', 'Журнал работы')
|
||||
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: export section visible')
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue