From 88041b8133000ea65bc6979a3ec347bcfb51e6d9 Mon Sep 17 00:00:00 2001 From: Patrick Date: Tue, 25 Mar 2025 15:25:04 +0100 Subject: [PATCH] V1 --- src/lib/server/database.ts | 15 ++ src/lib/server/docstore.ts | 34 +++ src/lib/util.ts | 48 ++++- src/routes/+layout.svelte | 70 +++++-- src/routes/+page.server.ts | 89 +++++++- src/routes/+page.svelte | 290 +++++++++++++++++++------- src/routes/dokumente/+page.server.ts | 10 +- src/routes/dokumente/+page.svelte | 119 ++++++++++- src/routes/dokumente/expander.svelte | 62 ++++++ src/routes/record_input_row.svelte | 25 ++- src/routes/schaetzung/+page.server.ts | 47 ++++- src/routes/schaetzung/+page.svelte | 277 +++++++++++++++++------- static/global.css | 2 +- 13 files changed, 884 insertions(+), 204 deletions(-) create mode 100644 src/routes/dokumente/expander.svelte diff --git a/src/lib/server/database.ts b/src/lib/server/database.ts index 5414120..1417e59 100644 --- a/src/lib/server/database.ts +++ b/src/lib/server/database.ts @@ -123,6 +123,9 @@ const ENTRY_DATABASE_ADD_ENTRY: string = const ENTRY_DATABASE_EDIT_ENTRY: string = "UPDATE records SET date = $date, start = $start, end = $end, comment = $comment WHERE id = $id;"; +const ENTRY_DATABASE_REMOVE_ENTRY: string = + "DELETE FROM records WHERE id = $id;"; + const ESTIMATES_DATABASE_GET_ALL: string = "SELECT * FROM estimates ORDER BY year DESC, quarter DESC;" @@ -228,6 +231,17 @@ export class User { return res.changes > 1; } + remove_entry(id: number): boolean { + if (isNaN(id)) { + return false; + } + + const query = this._database.query(ENTRY_DATABASE_REMOVE_ENTRY); + const res = query.run({ id: id }); + + return res.changes > 1; + } + get_estimates(): Array { const query = this._database.query(ESTIMATES_DATABASE_GET_ALL); const res = query.all(); @@ -256,6 +270,7 @@ export class User { const query = this._database.query(ESTIMATES_DATABASE_INSERT); const res = query.run({ year: year, quarter: quarter, estimate_0: estimate_0, estimate_1: estimate_1, estimate_2: estimate_2 }); + console.log(res) return res.changes > 1; } diff --git a/src/lib/server/docstore.ts b/src/lib/server/docstore.ts index 63a9754..c76379c 100644 --- a/src/lib/server/docstore.ts +++ b/src/lib/server/docstore.ts @@ -81,6 +81,40 @@ export async function getAllFiles(user: User) { return files; } +export async function getRecordFiles(user: User) { + const path = `${DOCUMENTS_PATH}/user-${user.id}/${RECORDS_FOLD}`; + + let file_names = await fs.readdir(path).catch((err) => { console.log(err); return [] }); + + let files = await Promise.all(file_names.map(async (v) => { + return { + identifier: v.replace(/^Stundenliste-/, "").replace(/\.pdf$/, ""), + filename: v, + path: `${RECORDS_FOLD}/${v}`, + cdate: (await fs.stat(`${path}/${v}`)).ctime, + } + })) + + return files; +} + +export async function getEstimateFiles(user: User) { + const path = `${DOCUMENTS_PATH}/user-${user.id}/${ESTIMATES_FOLD}`; + + let file_names = await fs.readdir(path).catch((err) => { console.log(err); return [] }); + + let files = await Promise.all(file_names.map(async (v) => { + return { + identifier: v.match(/\d.Quartal_\d\d\d\d/)[0].replace(/.Quartal_/, ".").split(".").reverse().join("-"), + filename: v, + path: `${ESTIMATES_FOLD}/${v}`, + cdate: (await fs.stat(`${path}/${v}`)).ctime, + } + })) + + return files; +} + export async function getFile(user: User, filename: string) { const path = `${DOCUMENTS_PATH}/user-${user.id}`; diff --git a/src/lib/util.ts b/src/lib/util.ts index c27d2c1..6d82ed6 100644 --- a/src/lib/util.ts +++ b/src/lib/util.ts @@ -2,6 +2,16 @@ export const MONTHS: string[] = [ "Jänner", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" ]; export const WEEKDAYS: string[] = [ "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" ]; + +/* + * Converts a string containing a decimal number to number. + * If a non numeric (0-9) character is encountered returns NaN. + * + * @param str: string to be converted + * @returns the converted string or NaN if failed + * + */ + export function toInt(str: string): number { if (str.length === 0) { return NaN; @@ -10,8 +20,8 @@ export function toInt(str: string): number { let value = 0; for (let i = 0; i < str.length; ++i) { let c = str.charAt(i); - let n = Number(c); - if (isNaN(n)) { + let n = c.charCodeAt(0) - "0".charCodeAt(0); + if (isNaN(n) || n < 0 || n > 9) { return NaN; } value = value*10 + n; @@ -20,6 +30,15 @@ export function toInt(str: string): number { return value; } +/* + * Converts a string containing a decimal floating point number to number. + * If a invalid character is encountered returns NaN. + * Only one decimal separator may be present and may be one of "." or ",". + * + * @param str: string to convert to a number + * @returns the floating point number or NaN if failed + * + */ export function toFloat(str: string): number { if (str.length === 0) { return NaN; @@ -31,11 +50,12 @@ export function toFloat(str: string): number { let i = 0; for (i = 0; i < str.length; ++i) { let c = str.charAt(i); + console.log("c", c) if (c === ',' || c === '.') { break; } - let n = Number(c); - if (isNaN(n)) { + let n = c.charCodeAt(0) - "0".charCodeAt(0); + if (isNaN(n) || n < 0 || n > 9) { return NaN; } value = value * 10 + n; @@ -44,8 +64,8 @@ export function toFloat(str: string): number { let dec = 1; for (++i; i < str.length; ++i, ++dec) { let c = str.charAt(i); - let n = Number(c); - if (isNaN(n)) { + let n = c.charCodeAt(0) - "0".charCodeAt(0); + if (isNaN(n) || n < 0 || n > 9) { return NaN; } value += n / Math.pow(10, dec); @@ -54,15 +74,25 @@ export function toFloat(str: string): number { return value; } -export function padInt(num: number, upper: number, float: number = 0, pad_char: string = '0') { +export function padInt(num: number, upper: number, float: number = 0, pad_char: string = '0', add_plus_if_pos: boolean = false, show_dec_point_if_round: boolean = true, pad_char_back: string = "\u2007") { + if (num == null) { + return padInt(0, upper, float, pad_char, add_plus_if_pos, show_dec_point_if_round, pad_char_back) + } if (num >= 0) { + if (add_plus_if_pos) { + return "+" + padInt(num, upper, float, pad_char, false, show_dec_point_if_round, pad_char_back); + } if (float != 0) { - return num.toFixed(float).padStart(upper + 1 + float, pad_char) + if (show_dec_point_if_round || num.toFixed(float).search(".*\.0+") == -1) { + return num.toFixed(float).padStart(upper + 1 + float, pad_char) + } else { + return (num.toFixed(0) + pad_char_back.repeat(1 + float)).padStart(upper + 1 + float, pad_char); + } } else { return num.toFixed(float).padStart(upper, pad_char); } } else { - return "-" + padInt(-1 * num, upper, float); + return "-" + padInt(-1 * num, upper, float, pad_char, false, show_dec_point_if_round, pad_char_back); } } diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index a537654..43d4083 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -2,43 +2,77 @@ let { children } = $props(); - diff --git a/src/routes/dokumente/expander.svelte b/src/routes/dokumente/expander.svelte new file mode 100644 index 0000000..9dbe506 --- /dev/null +++ b/src/routes/dokumente/expander.svelte @@ -0,0 +1,62 @@ + + + + + + + diff --git a/src/routes/record_input_row.svelte b/src/routes/record_input_row.svelte index cc74867..1c9e5f9 100644 --- a/src/routes/record_input_row.svelte +++ b/src/routes/record_input_row.svelte @@ -62,17 +62,15 @@ return weekday_of(date); }) let inDuration: string = $state(""); - updateDuration(); - - - function updateDuration() { + + $effect(() => { + states; if ((states?.start?.valid && states?.end?.valid) && (states?.start?.value != null && states?.end?.value != null)) { let duration = calculateDuration(states.start.value, states.end.value); inDuration = isNaN(duration) ? "" : duration.toFixed(2); } - } - + }) function validateDate(element: HTMLInputElement) { @@ -498,7 +496,10 @@ - + { states.start.valid = validateTime(startInput); states.start.value = startInput.value; - updateDuration(); } } disabled={!enabled} @@ -570,7 +570,6 @@ (_) => { states.end.valid = validateTime(endInput); states.end.value = endInput.value; - updateDuration(); } } disabled={!enabled} @@ -590,11 +589,11 @@ disabled={!enabled}> - + {@render children?.()} - + diff --git a/static/global.css b/static/global.css index 97bdd0a..285cd51 100644 --- a/static/global.css +++ b/static/global.css @@ -1,6 +1,6 @@ body { - background: #BBBBBB; + background: #FFFFFF; } /*body * {