Check, format and test / build (push) Successful in 11m23s
Replaces the export button's placeholder (which only dbg!-printed the payload) with a real implementation: one employee exports a single .ods file, more than one bundles a .zip of one .ods per employee, written wherever the user picks via the native "save" dialog (tauri-plugin-dialog). The "hours worked" column is a live ODF formula with a cached fallback value, not just a static number, so the file stays correct if edited afterward in LibreOffice; the formula and the cached value both treat a day's own missing punches as 0 in the subtraction, matching how a day with only an entry and an exit (no lunch break) still nets out to the right span. Column headers are sent by the frontend (translated via its own i18n), not hardcoded in Rust. A stacked slot (more than one punch the device recorded in the same shift) exports every punch, one per line in the cell, instead of only the first. Also closes a real gap surfaced while building this: the new-employees screen already blocked "Continue" for a blank name, but not for a name the device sent as invalid UTF-8 (lossily converted to text containing the Unicode replacement character on the Rust side) — such a name is now flagged and blocks continuing too, so every employee reaching the review/export flow is guaranteed to have a real, displayable name. Assisted-by: Claude Sonnet 5 <noreply@anthropic.com>
35 lines
1.0 KiB
JSON
35 lines
1.0 KiB
JSON
{
|
|
"name": "oxibadge",
|
|
"version": "0.1.0",
|
|
"description": "A reverse-engineered client for the R701 attendance reader by I.P.S. Informatica",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite dev",
|
|
"build": "vite build",
|
|
"preview": "vite preview",
|
|
"prepare": "svelte-kit sync || echo ''",
|
|
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
|
"tauri": "tauri"
|
|
},
|
|
"license": "AGPL-3.0-or-later",
|
|
"dependencies": {
|
|
"@fontsource/bricolage-grotesque": "^5.3.0",
|
|
"@fontsource/geist": "^5.3.0",
|
|
"@fontsource/geist-mono": "^5.3.0",
|
|
"@tauri-apps/api": "^2",
|
|
"@tauri-apps/plugin-dialog": "^2.8.1",
|
|
"svelte-i18n": "^4.0.1"
|
|
},
|
|
"devDependencies": {
|
|
"@sveltejs/adapter-static": "^3.0.10",
|
|
"@sveltejs/kit": "^2.65.1",
|
|
"@sveltejs/vite-plugin-svelte": "^7.1.2",
|
|
"svelte": "^5.56.3",
|
|
"svelte-check": "^4.6.0",
|
|
"typescript": "~6.0.3",
|
|
"vite": "^8.0.16",
|
|
"@tauri-apps/cli": "^2"
|
|
}
|
|
}
|