Merge branch 'feature-ui/pagination-tabellen'

# Conflicts:
#	ui/src/routes/WorkingHours/Formular.svelte
#	ui/src/routes/WorkingHours/Formular/ImportCsv.svelte
This commit is contained in:
2023-03-05 12:56:36 +01:00
7 changed files with 132 additions and 49 deletions
+2 -1
View File
@@ -25,6 +25,7 @@
"rollup-plugin-svelte": "^6.0.0", "rollup-plugin-svelte": "^6.0.0",
"rollup-plugin-terser": "^7.0.0", "rollup-plugin-terser": "^7.0.0",
"sirv-cli": "^1.0.8", "sirv-cli": "^1.0.8",
"svelte": "^3.4.4" "svelte": "^3.4.4",
"svelte-paginate": "^0.1.0"
} }
} }
+25
View File
@@ -74,3 +74,28 @@ section article {
} }
} }
} }
// Einstellungen für die Pagination-Navigation
.pagination-nav {
display: flex;
justify-content: center;
padding-top: 1rem;
.option {
&.number, &.ellipsis {
line-height: 1.25rem;
span {
margin: .25rem .5rem;
}
&.active {
text-decoration: underline solid;
}
}
&.disabled {
svg {
path {
fill: darken(@mainColorLight,40%,relativ);
}
}
}
}
}
+32 -13
View File
@@ -1,16 +1,21 @@
<script> <script>
export let params = {}; import { paginate, PaginationNav } from 'svelte-paginate'
export let params = {}
let records = [] let records = []
let isLoading = true let isLoading = true
console.log(params) console.log(params)
let currentPage = 1
let pageSize = 15
$: paginatedItems = paginate({ items: records, pageSize, currentPage })
if (!String.prototype.startsWith) { if (!String.prototype.startsWith) {
String.prototype.startsWith = function(searchString, position) { String.prototype.startsWith = function (searchString, position) {
position = position || 0; position = position || 0
return this.indexOf(searchString, position) === position; return this.indexOf(searchString, position) === position
}; }
} }
$: isNegative = time => time.startsWith('-') ? 'absence-time' : ''; $: isNegative = time => time.startsWith('-') ? 'absence-time' : ''
$: cutMinusChar = time => time.startsWith('-') ? time.substr(1) : time; $: cutMinusChar = time => time.startsWith('-') ? time.substr(1) : time
const init = async () => await params.promise.then(data => { const init = async () => await params.promise.then(data => {
records = data records = data
@@ -20,7 +25,7 @@
</script> </script>
<svelte:head> <svelte:head>
<title>{params.title}</title> <title>{params.title}</title>
</svelte:head> </svelte:head>
<section id="list-records"> <section id="list-records">
@@ -33,10 +38,10 @@
{:else} {:else}
<table> <table>
<colgroup> <colgroup>
<col /> <col/>
<col /> <col/>
<col /> <col/>
<col /> <col/>
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
@@ -47,7 +52,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{#each records as record} {#each paginatedItems as record}
<tr> <tr>
<td>{record.period}</td> <td>{record.period}</td>
<td>{record.workingDays}</td> <td>{record.workingDays}</td>
@@ -56,6 +61,20 @@
</tr> </tr>
{/each} {/each}
</tbody> </tbody>
<tfoot>
<tr>
<td colspan="4">
<PaginationNav
totalItems="{records.length}"
pageSize="{pageSize}"
currentPage="{currentPage}"
limit="{1}"
showStepOptions="{true}"
on:setPage="{(e) => currentPage = e.detail.page}"
/>
</td>
</tr>
</tfoot>
</table> </table>
{/if} {/if}
</article> </article>
+2 -1
View File
@@ -5,6 +5,7 @@
let TITLE = "Bearbeitung Einträge" let TITLE = "Bearbeitung Einträge"
let activeRecord = null; let activeRecord = null;
let currentPage = 1
</script> </script>
<svelte:head> <svelte:head>
@@ -17,7 +18,7 @@
<h1>{TITLE}</h1> <h1>{TITLE}</h1>
</header> </header>
<article> <article>
<List bind:activeRecord={activeRecord}/> <List bind:activeRecord={activeRecord} bind:currentPage/>
</article> </article>
</section> </section>
{:else} {:else}
+3 -3
View File
@@ -102,9 +102,9 @@
<!--suppress HtmlUnknownTarget --> <!--suppress HtmlUnknownTarget -->
<form action="/working-hours" name="editRecord"> <form action="/working-hours" name="editRecord">
<nav class="menu"> <nav class="menu">
<span on:click={MenuController.dailyEdit} class:active={period_of_edit === DAILY_EDIT}>Täglich</span> <span on:click={MenuController.dailyEdit} on:keypress={() => {}} class:active={period_of_edit === DAILY_EDIT}>Täglich</span>
<span on:click={MenuController.weeklyEdit} class:active={period_of_edit === WEEKLY_EDIT}>Wöchentlich</span> <span on:click={MenuController.weeklyEdit} on:keypress={() => {}} class:active={period_of_edit === WEEKLY_EDIT}>Wöchentlich</span>
<span on:click={MenuController.csvImport} class:active={period_of_edit === CSV_IMPORT}>Import per CSV</span> <span on:click={MenuController.csvImport} on:keypress={() => {}} class:active={period_of_edit === CSV_IMPORT}>Import per CSV</span>
</nav> </nav>
{#if period_of_edit === DAILY_EDIT} {#if period_of_edit === DAILY_EDIT}
<EditByDay bind:activeRecordList bind:activeDate bind:makeTimekeepingList/> <EditByDay bind:activeRecordList bind:activeDate bind:makeTimekeepingList/>
@@ -1,7 +1,12 @@
<script> <script>
import Papa from '../../../papaparse.min' import Papa from '../../../papaparse.min'
import { paginate, PaginationNav } from 'svelte-paginate'
export let activeRecordList = [] export let activeRecordList = []
let imported_data = [] let imported_data = []
export let currentPage = 1
let pageSize = 15
$: paginatedItems = paginate({ items: imported_data, pageSize, currentPage })
let files = null let files = null
@@ -26,17 +31,17 @@
let work_from = new Date(item['Von']) let work_from = new Date(item['Von'])
let work_to = new Date(item['Bis']) let work_to = new Date(item['Bis'])
let actual_day = work_from.toISOString().substring(0, 10) let actual_day = work_from.toISOString().substring(0, 10)
let actual_work_hours = (work_to - work_from)/(1000*60*60) let actual_work_hours = (work_to - work_from) / (1000 * 60 * 60)
cash_work_days[actual_day] ??= 0 cash_work_days[actual_day] ??= 0
cash_work_days[actual_day] += actual_work_hours cash_work_days[actual_day] += actual_work_hours
}) })
for (let day in cash_work_days) { for (let day in cash_work_days) {
let hours = cash_work_days[day] let hours = cash_work_days[day]
let hours_digits = Math.trunc(hours) let hours_digits = Math.trunc(hours)
let minutes_digits = Math.round((hours-hours_digits)*60) let minutes_digits = Math.round((hours - hours_digits) * 60)
let working_time = String(hours_digits).padStart(2, '0') + ":" let working_time = String(hours_digits).padStart(2, '0') + ':'
+ String(minutes_digits).padStart(2, '0') + ':00' + String(minutes_digits).padStart(2, '0') + ':00'
activeRecordList.push({workingTime: working_time, workingDay: day}) activeRecordList.push({ workingTime: working_time, workingDay: day })
} }
imported_data = activeRecordList imported_data = activeRecordList
}, },
@@ -55,23 +60,37 @@
</fieldset> </fieldset>
<fieldset name="record-data-for-import"> <fieldset name="record-data-for-import">
<div> <div>
{#if imported_data.length < 1} {#if imported_data.length < 1}
<p>Loading...</p> <p>Loading...</p>
{:else} {:else}
<table> <table>
<tbody> <tbody>
{#each imported_data as item} {#each imported_data as item}
<tr>
<td>
{item.workingDay}
</td>
<td>
{item.workingTime}
</td>
</tr>
{/each}
</tbody>
<tfoot>
<tr> <tr>
<td> <td colspan="4">
{item.workingDay} <PaginationNav
</td> totalItems="{imported_data.length}"
<td> pageSize="{pageSize}"
{item.workingTime} currentPage="{currentPage}"
limit="{1}"
showStepOptions="{true}"
on:setPage="{(e) => currentPage = e.detail.page}"
/>
</td> </td>
</tr> </tr>
{/each} </tfoot>
</tbody> </table>
</table> {/if}
{/if}
</div> </div>
</fieldset> </fieldset>
+30 -12
View File
@@ -1,22 +1,26 @@
<script> <script>
import {WorkingHoursRepository} from "../../components/Repositories.svelte" import { WorkingHoursRepository } from '../../components/Repositories.svelte'
import {TimekeepingDate} from "../../components/TimekeepingDate.svelte" import { TimekeepingDate } from '../../components/TimekeepingDate.svelte'
import { paginate, PaginationNav } from 'svelte-paginate'
export let activeRecord = null
let isLoading = true
let records = []
import IconifyIcon from '@iconify/svelte' import IconifyIcon from '@iconify/svelte'
import wrenchIcon from '@iconify-icons/oi/wrench' import wrenchIcon from '@iconify-icons/oi/wrench'
import documentIcon from '@iconify-icons/oi/document' import documentIcon from '@iconify-icons/oi/document'
export let activeRecord = null
let isLoading = true
let records = []
export let currentPage = 1
let pageSize = 15
$: paginatedItems = paginate({ items: records, pageSize, currentPage })
const Controller = { const Controller = {
'listRecords': () => { 'listRecords': () => {
Controller.cancelActiveRecord(); Controller.cancelActiveRecord()
WorkingHoursRepository.browse().then(data => { WorkingHoursRepository.browse().then(data => {
Controller.cancelActiveRecord() Controller.cancelActiveRecord()
records = data records = data
isLoading = false isLoading = false
}); })
}, },
'newRecord': async () => { 'newRecord': async () => {
const actDate = new TimekeepingDate() const actDate = new TimekeepingDate()
@@ -27,11 +31,11 @@
Controller.listRecords() Controller.listRecords()
return return
} }
activeRecord = data; activeRecord = data
}), }),
'cancelActiveRecord': () => { 'cancelActiveRecord': () => {
activeRecord = null; activeRecord = null
} },
} }
Controller.listRecords() Controller.listRecords()
</script> </script>
@@ -61,7 +65,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{#each records as record} {#each paginatedItems as record}
<tr> <tr>
<td>{record.workingDay}</td> <td>{record.workingDay}</td>
<td>{record.workingTime}</td> <td>{record.workingTime}</td>
@@ -73,5 +77,19 @@
</tr> </tr>
{/each} {/each}
</tbody> </tbody>
<tfoot>
<tr>
<td colspan="4">
<PaginationNav
totalItems="{records.length}"
pageSize="{pageSize}"
currentPage="{currentPage}"
limit="{1}"
showStepOptions="{true}"
on:setPage="{(e) => currentPage = e.detail.page}"
/>
</td>
</tr>
</tfoot>
</table> </table>
{/if} {/if}