fix: reorder journal worklog sections

This commit is contained in:
mirivlad 2026-06-06 02:53:36 +08:00
parent 40c0953904
commit f88376264d
5 changed files with 48 additions and 37 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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>

View File

@ -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}

View File

@ -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')