iobroker.time-tracker 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,10 +44,6 @@ PIN. All data stays on your own ioBroker host: no cloud, no subscription.
44
44
  `http://<ioBroker host>:8092/`
45
45
  3. Log in with the start password (see [First start](#first-start)) and create your employees.
46
46
 
47
- > **For work on the sources** the adapter is built in the repository: `npm ci && npm run install:pwa &&
48
- > npm run build:pwa && npm run build`, then `iobroker install .`. `build/` and `www/` are built and not part of the
49
- > repository, so a plain Git installation does not work on its own.
50
-
51
47
  ## First start
52
48
 
53
49
  The first start creates the database, the roles and the settings — and **one administrator account**, because
@@ -355,6 +351,11 @@ local SQLite file, access is role-based, and every correction is written to an a
355
351
 
356
352
  ### **WORK IN PROGRESS**
357
353
 
354
+ ### 0.4.1 (2026-09-22)
355
+
356
+ - (Alex) docs: the installation chapter no longer carries the build steps for work on the sources — they live in
357
+ `CONTRIBUTING.md` and `docs/entwicklung.md`, so the README stays a manual for users
358
+
358
359
  ### 0.4.0 (2026-09-22)
359
360
 
360
361
  - (Alex) new: the administration decides about absences. A request of an employee waits as `requested` and counts for
@@ -371,11 +372,11 @@ local SQLite file, access is role-based, and every correction is written to an a
371
372
 
372
373
  ### 0.3.3 (2026-09-22)
373
374
 
374
- - (Alex) fix: the installation chapter no longer points to the “Install from custom URL” dialog — the repository
375
- checker reports that as `E6013` (“suggests to install the adapter directly from GitHub, directly from npm or using
376
- npm commands”). It now leads with the normal way through the adapter list of the ioBroker admin, names the registry
377
- for a machine without the admin and keeps the build steps in a clearly marked note for work on the sources. The
378
- troubleshooting row for a missing web app no longer carries npm commands either
375
+ - (Alex) fix: the installation chapter no longer points to the dialog that installs an adapter from a URL — the
376
+ repository checker reports that as `E6013` (“suggests to install the adapter directly from GitHub, directly from npm
377
+ or using npm commands”). It now leads with the normal way through the adapter list of the ioBroker admin, names the
378
+ registry for a machine without the admin and keeps the build steps in a clearly marked note for work on the sources.
379
+ The troubleshooting row for a missing web app no longer carries npm commands either
379
380
 
380
381
  ### 0.3.2 (2026-09-22)
381
382
 
@@ -385,15 +386,6 @@ local SQLite file, access is role-based, and every correction is written to an a
385
386
  carried the caption of the break rules before). New texts in all 11 languages, and an end-to-end test keeps both
386
387
  findings
387
388
 
388
- ### 0.3.1 (2026-09-22)
389
-
390
- - (Alex) fix: the presence board shows the **real running** time of the day now. Two things kept it frozen:
391
- `/terminal/users` answered with the stored day aggregate, which only changes on a punch (it counts finished
392
- pairs), and the tile “ticker” measured the seconds since the last server answer — a refresh every 60 s never let
393
- it grow beyond 0. The API adds the minutes of an open punch to its answer now, the tile shows that value directly,
394
- and the board refreshes every 20 s (was 60 s). The API test moves the clock ten minutes and expects the open punch
395
- in the answer
396
-
397
389
  Older entries are kept in [`CHANGELOG_OLD.md`](CHANGELOG_OLD.md).
398
390
 
399
391
  ## Provenance
package/io-package.json CHANGED
@@ -1,9 +1,22 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "time-tracker",
4
- "version": "0.4.0",
4
+ "version": "0.4.1",
5
5
  "nogit": true,
6
6
  "news": {
7
+ "0.4.1": {
8
+ "en": "docs: the installation chapter no longer carries the build steps for work on the sources — they live in `CONTRIBUTING.md` and `docs/entwicklung.md`, so the README stays a manual for users",
9
+ "de": "docs: das Installationskapitel der README enthält nicht mehr die Build-Schritte für die Arbeit an den Quellen — sie stehen in `CONTRIBUTING.md` und `docs/entwicklung.md`, die README bleibt eine Anleitung für Anwender",
10
+ "ru": "док: раздел установки в README больше не содержит шагов сборки для работы с исходниками — они описаны в `CONTRIBUTING.md` и `docs/entwicklung.md`, а README остаётся руководством для пользователей",
11
+ "pt": "docs: o capítulo de instalação do README já não contém os passos de compilação para trabalhar nos fontes — estão em `CONTRIBUTING.md` e `docs/entwicklung.md`, e o README fica um manual para utilizadores",
12
+ "nl": "docs: het installatiehoofdstuk van de README bevat niet langer de buildstappen voor werk aan de bron — die staan in `CONTRIBUTING.md` en `docs/entwicklung.md`, zodat de README een handleiding voor gebruikers blijft",
13
+ "fr": "docs : le chapitre d'installation du README ne contient plus les étapes de compilation pour travailler sur les sources — elles se trouvent dans `CONTRIBUTING.md` et `docs/entwicklung.md`, le README reste un manuel pour les utilisateurs",
14
+ "it": "docs: il capitolo di installazione del README non contiene più i passaggi di build per lavorare sui sorgenti — sono in `CONTRIBUTING.md` e `docs/entwicklung.md`, così il README resta un manuale per gli utenti",
15
+ "es": "docs: el capítulo de instalación del README ya no incluye los pasos de compilación para trabajar en las fuentes — están en `CONTRIBUTING.md` y `docs/entwicklung.md`, así el README sigue siendo un manual para usuarios",
16
+ "pl": "dok: rozdział instalacji w README nie zawiera już kroków budowania do pracy nad źródłami — są one w `CONTRIBUTING.md` i `docs/entwicklung.md`, a README pozostaje instrukcją dla użytkowników",
17
+ "uk": "док: розділ встановлення в README більше не містить кроків збірки для роботи з джерелами — вони в `CONTRIBUTING.md` та `docs/entwicklung.md`, а README залишається посібником для користувачів",
18
+ "zh-cn": "文档:README 的安装章节不再包含针对源码开发的构建步骤 —— 它们在 `CONTRIBUTING.md` 和 `docs/entwicklung.md` 中,README 保持为面向使用者的手册"
19
+ },
7
20
  "0.4.0": {
8
21
  "en": "new: the administration decides about absences now. A request of an employee waits as “requested” and counts for nothing until somebody approves or rejects it — the new tab “Abwesenheiten” shows the open requests with a reason for the decision, lets the administration enter dates for an employee (approved right away) and answers “who is away”. Only approved days reach the working time and the vacation balance, and a rejected request carries its reason back to the employee (migration 21)",
9
22
  "de": "neu: die Verwaltung entscheidet jetzt über Abwesenheiten. Ein Antrag eines Mitarbeiters wartet als „beantragt“ und zählt für nichts, bis jemand ihn genehmigt oder ablehnt — der neue Reiter „Abwesenheiten“ zeigt die offenen Anträge mit einer Begründung zur Entscheidung, lässt die Verwaltung Daten für einen Mitarbeiter eintragen (sofort genehmigt) und beantwortet „wer ist abwesend“. Nur genehmigte Tage erreichen Arbeitszeit und Urlaubssaldo, und ein abgelehnter Antrag trägt seinen Grund zum Mitarbeiter zurück (Migration 21)",
@@ -81,19 +94,6 @@
81
94
  "pl": "nowość: tablica obecności może pokazywać czas przepracowany dzisiaj na kafelkach pracowników — obok `obecny`/`nieobecny`, np. `1:23` (i `0:00` przed pierwszym wpisem). Włącza się to **dla każdego pracownika** w profilu pracy (*Arbeitszeit auf der Anwesenheitskarte*), bo tablica jest widoczna jeszcze przed wpisaniem PIN-u; bez tej zgody API w ogóle nie przesyła minut. Dopóki pracownik jest obecny, kafelek liczy dalej",
82
95
  "uk": "нове: табло присутності може показувати відпрацьований сьогодні час на плитках працівників — поряд з `присутній`/`відсутній`, наприклад `1:23` (і `0:00` до першої відмітки). Вмикається **для кожного працівника** у робочому профілі (*Arbeitszeit auf der Anwesenheitskarte*), бо табло видно ще до введення PIN; без цього дозволу API взагалі не надсилає хвилини. Поки працівник на місці, плитка продовжує рахувати",
83
96
  "zh-cn": "新增:在岗看板可以在员工卡片上显示今天的工作时间 —— 与「在岗/缺勤」并列,例如 `1:23`(首次打卡前为 `0:00`)。此功能在**每位员工的**工作资料中开启(*Arbeitszeit auf der Anwesenheitskarte*),因为在岗看板在输入 PIN 之前就可见;没有该授权时 API 根本不会发送分钟数。员工在岗期间卡片会持续计时"
84
- },
85
- "0.2.7": {
86
- "en": "fix: every punch path reaches `events.*` and the web app now. Besides the presence state (0.2.6) the `commands.punch`/`quickPunch` buttons, a `sendTo` message (`punch`, `present`) and the trigger rules wrote the punch but never published an event — the event states kept the punch before. The automation rules report the direction with their `automation.*` event now",
87
- "de": "fix: jeder Stempel-Weg erreicht jetzt `events.*` und die Web-App. Außer dem Anwesenheits-State (0.2.6) schrieben die Buttons `commands.punch`/`quickPunch`, eine `sendTo`-Nachricht (`punch`, `present`) und die Trigger-Regeln die Buchung, veröffentlichten aber kein Ereignis — die Ereignis-States blieben beim vorigen Stempel stehen. Die Automatik-Regeln melden die Richtung jetzt mit ihrem `automation.*`-Ereignis",
88
- "ru": "исправление: теперь каждый путь отметки доходит до `events.*` и веб-приложения. Кроме состояния присутствия (0.2.6), кнопки `commands.punch`/`quickPunch`, сообщение `sendTo` (`punch`, `present`) и правила-триггеры записывали отметку, но не публиковали событие — состояния событий оставались от предыдущей отметки. Правила автоматики теперь передают направление в своём событии `automation.*`",
89
- "pt": "correção: todos os caminhos de marcação chegam agora a `events.*` e à aplicação web. Além do estado de presença (0.2.6), os botões `commands.punch`/`quickPunch`, uma mensagem `sendTo` (`punch`, `present`) e as regras de acionamento gravavam a marcação mas não publicavam evento — os estados de evento ficavam na marcação anterior. As regras de automação passam a indicar a direção no seu evento `automation.*`",
90
- "nl": "fix: elk stempelpad bereikt nu `events.*` en de webapp. Naast de aanwezigheidsstate (0.2.6) schreven de knoppen `commands.punch`/`quickPunch`, een `sendTo`-bericht (`punch`, `present`) en de triggerregels de stempeling, maar publiceerden geen gebeurtenis — de gebeurtenisstates bleven bij de vorige stempeling staan. De automatiseringsregels melden de richting nu met hun `automation.*`-gebeurtenis",
91
- "fr": "correctif : tous les chemins de pointage atteignent désormais `events.*` et l'application web. Outre l'état de présence (0.2.6), les boutons `commands.punch`/`quickPunch`, un message `sendTo` (`punch`, `present`) et les règles de déclenchement écrivaient le pointage sans publier d'événement — les états d'événement restaient sur le pointage précédent. Les règles d'automatisation indiquent désormais la direction dans leur événement `automation.*`",
92
- "it": "correzione: ora tutti i percorsi di timbratura raggiungono `events.*` e l'app web. Oltre allo stato di presenza (0.2.6), i pulsanti `commands.punch`/`quickPunch`, un messaggio `sendTo` (`punch`, `present`) e le regole di trigger scrivevano la timbratura senza pubblicare eventi — gli stati degli eventi restavano sulla timbratura precedente. Le regole di automazione ora indicano la direzione nel loro evento `automation.*`",
93
- "es": "corrección: ahora todos los caminos de fichaje llegan a `events.*` y a la aplicación web. Además del estado de presencia (0.2.6), los botones `commands.punch`/`quickPunch`, un mensaje `sendTo` (`punch`, `present`) y las reglas de disparo escribían el fichaje sin publicar evento — los estados de evento se quedaban en el fichaje anterior. Las reglas de automatización ahora indican la dirección en su evento `automation.*`",
94
- "pl": "poprawka: teraz każda droga rejestracji dociera do `events.*` i aplikacji web. Poza stanem obecności (0.2.6) przyciski `commands.punch`/`quickPunch`, wiadomość `sendTo` (`punch`, `present`) oraz reguły wyzwalające zapisywały wpis, ale nie publikowały zdarzenia — stany zdarzeń zostawały przy poprzednim wpisie. Reguły automatyki przekazują teraz kierunek w swoim zdarzeniu `automation.*`",
95
- "uk": "виправлення: тепер кожен шлях відмітки доходить до `events.*` і веб-застосунку. Крім стану присутності (0.2.6), кнопки `commands.punch`/`quickPunch`, повідомлення `sendTo` (`punch`, `present`) і правила-тригери записували відмітку, але не публікували подію — стани подій залишалися від попередньої відмітки. Правила автоматики тепер передають напрямок у своїй події `automation.*`",
96
- "zh-cn": "修复:现在每个打卡路径都会到达 `events.*` 和 Web 应用。除在岗状态(0.2.6)外,`commands.punch`/`quickPunch` 按钮、`sendTo` 消息(`punch`、`present`)和触发规则虽然写入了打卡,却从未发布事件 —— 事件状态一直停留在上一次打卡。自动化规则现在会在其 `automation.*` 事件中带上方向"
97
97
  }
98
98
  },
99
99
  "titleLang": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.time-tracker",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Time tracking (clock-in/out) for ioBroker with web app, badge terminal and reports",
5
5
  "author": {
6
6
  "name": "Alex",
package/www/sw.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sw.js","sources":["../../../../../../tmp/dcfeb05d735a19d3b2c5c22cfa20128b/sw.js"],"sourcesContent":["import {clientsClaim as workbox_core_clientsClaim} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';\nimport {registerRoute as workbox_routing_registerRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-routing/registerRoute.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\nself.skipWaiting();\nworkbox_core_clientsClaim();\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"person.png\",\n \"revision\": \"771d3283ece4739e203e02aac535855e\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"485b5b4a9180831bee5a608f6f95f079\"\n },\n {\n \"url\": \"icon-512.png\",\n \"revision\": \"d8e3715779f4cd7e67e1f82f215a2f22\"\n },\n {\n \"url\": \"icon-192.png\",\n \"revision\": \"940ef37caef09c52272ddab844b9ea9b\"\n },\n {\n \"url\": \"favicon.svg\",\n \"revision\": \"309e9efece69d60920618512ab9d57bf\"\n },\n {\n \"url\": \"assets/workbox-window.prod.es5-Bd17z0YL.js\",\n \"revision\": null\n },\n {\n \"url\": \"assets/index-dp7TWY3R.js\",\n \"revision\": null\n },\n {\n \"url\": \"icon-192.png\",\n \"revision\": \"940ef37caef09c52272ddab844b9ea9b\"\n },\n {\n \"url\": \"icon-512.png\",\n \"revision\": \"d8e3715779f4cd7e67e1f82f215a2f22\"\n },\n {\n \"url\": \"manifest.webmanifest\",\n \"revision\": \"6f40f1ce0ce138d5af307fb0dbb1e6f9\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();workbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"index.html\"), {\n allowlist: [/^\\/$/], denylist: [/^\\/api\\//],}));\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision","workbox_precaching_cleanupOutdatedCaches","workbox_routing_registerRoute","workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","allowlist","denylist"],"mappings":"inBAoBAA,KAAKC,cACLC,EAAAA,eAMAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,MAEd,CACED,IAAO,2BACPC,SAAY,MAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,qCAEb,CAAA,GACHC,EAAAA,wBAA2CC,EAAAA,cAA8B,IAAIC,EAAAA,gBAAgCC,0BAA2C,cAAe,CACrKC,UAAW,CAAC,QAAUC,SAAU,CAAC"}
1
+ {"version":3,"file":"sw.js","sources":["../../../../../../tmp/c7f81517dc041875e710c122cc88be99/sw.js"],"sourcesContent":["import {clientsClaim as workbox_core_clientsClaim} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';\nimport {registerRoute as workbox_routing_registerRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-routing/registerRoute.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-pwa/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\nself.skipWaiting();\nworkbox_core_clientsClaim();\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"person.png\",\n \"revision\": \"771d3283ece4739e203e02aac535855e\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"485b5b4a9180831bee5a608f6f95f079\"\n },\n {\n \"url\": \"icon-512.png\",\n \"revision\": \"d8e3715779f4cd7e67e1f82f215a2f22\"\n },\n {\n \"url\": \"icon-192.png\",\n \"revision\": \"940ef37caef09c52272ddab844b9ea9b\"\n },\n {\n \"url\": \"favicon.svg\",\n \"revision\": \"309e9efece69d60920618512ab9d57bf\"\n },\n {\n \"url\": \"assets/workbox-window.prod.es5-Bd17z0YL.js\",\n \"revision\": null\n },\n {\n \"url\": \"assets/index-dp7TWY3R.js\",\n \"revision\": null\n },\n {\n \"url\": \"icon-192.png\",\n \"revision\": \"940ef37caef09c52272ddab844b9ea9b\"\n },\n {\n \"url\": \"icon-512.png\",\n \"revision\": \"d8e3715779f4cd7e67e1f82f215a2f22\"\n },\n {\n \"url\": \"manifest.webmanifest\",\n \"revision\": \"6f40f1ce0ce138d5af307fb0dbb1e6f9\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();workbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"index.html\"), {\n allowlist: [/^\\/$/], denylist: [/^\\/api\\//],}));\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision","workbox_precaching_cleanupOutdatedCaches","workbox_routing_registerRoute","workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","allowlist","denylist"],"mappings":"inBAoBAA,KAAKC,cACLC,EAAAA,eAMAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,MAEd,CACED,IAAO,2BACPC,SAAY,MAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,qCAEb,CAAA,GACHC,EAAAA,wBAA2CC,EAAAA,cAA8B,IAAIC,EAAAA,gBAAgCC,0BAA2C,cAAe,CACrKC,UAAW,CAAC,QAAUC,SAAU,CAAC"}