iobroker.kanban 0.3.1 → 0.3.3
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 +91 -4
- package/admin/i18n/de.json +1 -0
- package/admin/i18n/en.json +1 -0
- package/admin/i18n/es.json +1 -0
- package/admin/i18n/fr.json +1 -0
- package/admin/i18n/it.json +1 -0
- package/admin/i18n/nl.json +1 -0
- package/admin/i18n/pl.json +1 -0
- package/admin/i18n/pt.json +1 -0
- package/admin/i18n/ru.json +1 -0
- package/admin/i18n/uk.json +1 -0
- package/admin/i18n/zh-cn.json +1 -0
- package/admin/jsonConfig.json +11 -0
- package/io-package.json +28 -17
- package/lib/cron.js +4 -4
- package/lib/freeze.js +69 -0
- package/lib/i18n-server.js +11 -11
- package/lib/notify.js +69 -3
- package/lib/scheduler.js +8 -9
- package/lib/server.js +44 -2
- package/lib/store.js +660 -48
- package/main.js +238 -27
- package/package.json +9 -6
- package/www/css/app.css +475 -29
- package/www/i18n/de.json +62 -6
- package/www/i18n/en.json +62 -6
- package/www/i18n/es.json +62 -6
- package/www/i18n/fr.json +62 -6
- package/www/i18n/it.json +62 -6
- package/www/i18n/nl.json +62 -6
- package/www/i18n/pl.json +62 -6
- package/www/i18n/pt.json +62 -6
- package/www/i18n/ru.json +62 -6
- package/www/i18n/uk.json +62 -6
- package/www/i18n/zh-cn.json +62 -6
- package/www/index.html +59 -32
- package/www/js/api.js +26 -1
- package/www/js/app.js +150 -9
- package/www/js/board.js +681 -55
- package/www/js/dialogs.js +991 -47
package/README.md
CHANGED
|
@@ -11,7 +11,9 @@ Kanban board adapter for ioBroker with its **own web server**, live sync, webhoo
|
|
|
11
11
|
|
|
12
12
|

|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
**Full documentation:** [English](docs/en/README.md) · [Deutsch](docs/de/README.md)
|
|
15
|
+
|
|
16
|
+
**Questions, ideas, bug reports:** [GitHub issues](https://github.com/bmueller77/ioBroker.kanban/issues), or the ioBroker forum threads [Kanban board (English)](https://forum.iobroker.net/topic/85031/new-adapter-kanban-board) and [KanBan-Board (deutsch)](https://forum.iobroker.net/topic/85030/test-kanban-board).
|
|
15
17
|
|
|
16
18
|
## Installation
|
|
17
19
|
|
|
@@ -84,7 +86,7 @@ curl -X POST http://<host>:8095/webhook/<token>/action \
|
|
|
84
86
|
-d '{"cmd":"addCard","board":"family","title":"Buy milk","assignees":["user1"],"due":"2026-07-15"}'
|
|
85
87
|
```
|
|
86
88
|
|
|
87
|
-
Commands: `listBoards`, `getBoard`, `addBoard`, `deleteBoard`, `addCard`, `updateCard`, `moveCard`, `doneCard`, `deleteCard`. From ioBroker scripts:
|
|
89
|
+
Commands: `listBoards`, `getBoard`, `addBoard`, `deleteBoard`, `addCard`, `updateCard`, `moveCard`, `doneCard`, `deleteCard`, `reassignUser`. From ioBroker scripts:
|
|
88
90
|
|
|
89
91
|
```js
|
|
90
92
|
sendTo('kanban.0', 'addCard', { board: 'family', title: 'From a script' }, res => log(JSON.stringify(res)));
|
|
@@ -101,6 +103,7 @@ setState('kanban.0.action', JSON.stringify({ cmd: 'doneCard', board: 'family', c
|
|
|
101
103
|
| `kanban.0.boards.<id>.rev` / `.cardCount` / `.overdueCount` | revision & counters |
|
|
102
104
|
| `kanban.0.users.<name>.assignedCount` / `.overdueCount` / `.overdueList` | per user |
|
|
103
105
|
| `kanban.0.lastEvent` | last event as JSON (can trigger scripts) |
|
|
106
|
+
| `kanban.0.info.orphanedAssignees` | assignees that no longer exist as users, after a user ID was renamed |
|
|
104
107
|
| `kanban.0.action` | command input (write JSON, cleared after processing) |
|
|
105
108
|
|
|
106
109
|
## Security
|
|
@@ -113,7 +116,7 @@ Details: [Security & access control](docs/en/README.md#security--access-control)
|
|
|
113
116
|
|
|
114
117
|
## Requirements
|
|
115
118
|
|
|
116
|
-
- js-controller
|
|
119
|
+
- js-controller >= 6.0.11, Node.js >= 22
|
|
117
120
|
- For e-mail notifications: a configured `iobroker.email` instance
|
|
118
121
|
- Optional: `iobroker.feiertage` for region-accurate public-holiday calculation of the working-day recurrences
|
|
119
122
|
|
|
@@ -121,6 +124,90 @@ Details: [Security & access control](docs/en/README.md#security--access-control)
|
|
|
121
124
|
|
|
122
125
|
<!-- Der Platzhalter bleibt stehen. release-script trägt hier die
|
|
123
126
|
nächste Version ein und ersetzt die Überschrift. -->
|
|
127
|
+
### 0.3.3 (2026-09-21)
|
|
128
|
+
* (bmueller77) **Everything the adapter says is in English now.** Thirty-five error messages were German, from `title fehlt` to `Karte '…' existiert nicht`. They reach users in the log, as REST responses and as the answer to a `sendTo` call, so a German message left half the ioBroker world guessing. Cron messages are included
|
|
129
|
+
* (bmueller77) **Five state names were German** and are English now: `Card count`, `Overdue cards`, `Overdue cards (list)` and `Assigned open cards`. Since these objects are created only when they are missing, a new name never reached an existing installation. The adapter now corrects the names of its own objects once at startup, so boards that have been running for months are renamed as well
|
|
130
|
+
* (bmueller77) The HTTP status code of the REST API no longer depends on the wording of an error. It used to test the message for the German `existiert nicht` to decide between 404 and 400, which would have broken silently with the translation. An error that stands for something missing now carries its status itself
|
|
131
|
+
* (bmueller77) `reminderDaysBefore` is held to the range 0 to 30 in the code as well, not only in the settings dialog. The configuration can be edited by hand, and a value far outside that range moved the reminder threshold somewhere nobody would find
|
|
132
|
+
|
|
133
|
+
### 0.3.2 (2026-09-10)
|
|
134
|
+
* (bmueller77) **The trash has the sort toggle now**, like every other column. The default stays deletion time, oldest first, so whatever is closest to being removed for good sits on top; sorting by due date, priority or age is available all the same. The broom moved to the left of the toggle so that the sorting sits in the same place in every column
|
|
135
|
+
* (bmueller77) Fix: the **focus ring** took the accent colour unchanged. That works in the light theme; in the dark one the same dark tone stood against dark surfaces and was barely visible. The ring colour is computed now: lightened or darkened from the accent colour, only as far as it takes to stand out against every surface it lands on, so the instance keeps its colour family
|
|
136
|
+
* (bmueller77) Fix: below 600 px the card editor, the board manager and the views dialog did not fill the screen and sat pinned to the top left. Their rules hang on their IDs and beat the element rule in the mobile block
|
|
137
|
+
* (bmueller77) Fix: in the same block the tab panel was squashed as a flex child while its content visibly ran out of it. The scroll area did not count the overflowing pixels, and on a short window **Save scrolled out of sight entirely** - anyone who did not think to scroll back lost their input
|
|
138
|
+
* (bmueller77) Fix: the text colour on avatars and chips hung on a fixed brightness threshold, and around that threshold the choice came out wrong - on turquoise it picked white where black is the more legible of the two. It now compares both and takes the better one
|
|
139
|
+
* (bmueller77) Fix: the **browser's back button** closed the card editor without a word, while Escape and the close cross ask first. The open dialog now adds a history entry; the back button takes it away and raises the same prompt
|
|
140
|
+
* (bmueller77) Fix: if someone changed the same card in another window, the open editor did not notice and **overwrote it silently on save**. It now compares the state it opened with against the current one and asks when they differ. Only the fields the editor edits are compared, so a column change or a fresh completion timestamp does not raise the prompt
|
|
141
|
+
* (bmueller77) The eye and the broom in the column header, the drag handles in the settings and the "+X more" row were too small to hit reliably, on a touchscreen in particular. All four are bigger now. It weighs more on the broom than elsewhere, since an irreversible action sits behind it
|
|
142
|
+
* (bmueller77) Fix: the sort menu carried no roles, the tooltip on a completed card was the only single-line one, a badge without a warning colour was hard to make out against the white card and now carries a hairline, the disabled menu entry kept the pointing hand, the triangle was lost on a coloured badge, the focus landed on `body` after toggling "+X more", and in drag-handle mode the whole card carried the grab cursor while dragging only starts at the handle
|
|
143
|
+
* (bmueller77) Fix: the explanatory line in the due-date tooltip told the timeline backwards. It runs from yellow to red now, in eleven languages
|
|
144
|
+
* (bmueller77) Fix: the heading above the label switch always read "hide labels", even when it was set to "show only these labels". Fix: the prompt for removing a board member counted the cards correctly but named every future non-member instead of the people actually on those cards
|
|
145
|
+
* (bmueller77) Fix: the subject "card deleted" stood for a move to the trash. The checkbox says "to the trash" and so does the confirmation dialog, only the mail did not. Corrected in eleven languages
|
|
146
|
+
* (bmueller77) **Yellow means tomorrow, the lead time only drives the mail** (#25). Colour and column count followed the setting **Remind X days before due**: at a lead time of 3 everything up to the day after tomorrow turned yellow while the number above it still read "Tomorrow". Yellow now means the next calendar day, full stop, and the same arithmetic drives the column count. The tooltip needs no number any more, since the scale is the same for every instance
|
|
147
|
+
* (bmueller77) **Only IDs that something hangs on are frozen now.** Until now the adapter wrote the marker back for every user on the first start, and every such write restarts the instance - exactly the window in which saving in the admin was lost, reproduced twice, without a message and without a log entry. It hit the setup, the moment when someone sets the port, saves, enters users, saves. A fresh instance with users but no cards no longer writes its configuration back at all
|
|
148
|
+
* (bmueller77) Fix: creating a card fired "card created" and "card assigned", and **both attached the `.ics`** although the manual says the invite comes once. The notifier remembers the dispatch itself now
|
|
149
|
+
* (bmueller77) **Deleting a card sends a cancellation**: an `.ics` with `METHOD:CANCEL`, the same `UID` and the next sequence number, so the calendar clears the entry instead of leaving the appointment standing. Only where an invite was ever sent
|
|
150
|
+
* (bmueller77) The **add button** at the foot of a column is narrower. It used to span a good quarter of the column and caught the clicks on the rows of an expanded checklist below it. A "+" does not need that width
|
|
151
|
+
* (bmueller77) **No cards are created in a done column any more.** A card created there carried no `doneAt` and therefore dropped out of three documented features: the "age in column" sort, the display limit for done cards and the automatic cleanup. It stayed there forever without anyone seeing why. The store refuses it and the UI does not offer it: the card editor leaves done columns out when creating and copying, the transfer dialog likewise, and there is no "+" at the foot of such a column. Moving and editing an existing card keeps the column selectable
|
|
152
|
+
* (bmueller77) Fix: `doneAt` was cleared when a card moved to the trash, so restoring it lost the completion time. Fix: labels created through the interface were all green and now take their colour in turn from the same palette as the UI. Fix: the mirror states of deleted users stayed behind under `users.*`, so a dashboard reading `assignedCount` kept counting people too many. Fix: the "+" at the foot of a column was not blocked when no user existed - only the header button had been secured, the dead end was still reachable by the other route
|
|
153
|
+
* (bmueller77) **Error messages no longer arrive as a browser box.** All eight `alert()` calls go through the in-page hint now: a red border, `role=alert`, and they stay until someone closes them. A modal box halts the page until it is clicked away and is unreadable to any automated check - two testers could only report that the renderer refused scripts and had to leave the wording open
|
|
154
|
+
* (bmueller77) Fix: on a board without columns "+ Card" stayed active, the editor opened, the column field was empty, and only saving ran into the error. Fix: the menus in the column header hang off `body`, so a deleted column left its menu standing and operable. Fix: with fifteen users the chip bar grew wider than the window and pushed the whole page out of view; it wraps now. Fix: markdown tables in the description and the reading window had neither borders nor padding
|
|
155
|
+
* (bmueller77) The socket around the sticky add button is one pixel wide instead of seven. It only shows when the button floats over a card, and then as a heavy frame
|
|
156
|
+
* (bmueller77) Fix: a saved card that the active filter hides straight away **disappeared without a word**. A tester created six cards and thought saving was broken until the network response 201 told him otherwise. After saving, the board is checked for the card and the UI says so when it is not there
|
|
157
|
+
* (bmueller77) Fix: from the sixth column on, "+ Add column" sat on the edge of the scroll area, half cut off and without effect, and the input that followed was lost. Fix: the recurrence prefilled day and month with today's date even when the card carried a due date. Fix: the remembered expanded state silently overruled a freshly set display limit, so "Max 3" showed seven cards and looked broken. Fix: the board picker still showed the old name after renaming
|
|
158
|
+
* (bmueller77) Fix: the "duration" field took the whole width next to the checkbox, for a value like `01:00`. Fix: the summary of a collapsed section showed raw markdown for the description and only the host for the link, so two cards with different files on the same server looked identical. Fix: the label summary carried no colour dots although the manual describes them. Fix: the interface error texts wrote "zustaendige" without the umlaut
|
|
159
|
+
* (bmueller77) Fix: with the WIP limit exceeded and a filter active, the column header read "2/5" in red - the filtered figure before the slash, the colour from the unfiltered one. The column's own figure stands there now, and the tooltip still names how many the filter shows. The rule sat in the middle of the rendering and had been wrong twice for that reason; it lives in `totalLabel()` with five tests beside it
|
|
160
|
+
* (bmueller77) Fix: the plural form still read "card(s)", "tarjeta(s)" in the prompt for removing a board member. Written out in all eleven languages now. Fix: "+ New" in the card editor always assigned green - the palette had only reached the board manager
|
|
161
|
+
* (bmueller77) **A fresh instance no longer ships with two example users.** Since the adapter freezes user IDs, the presets were permanently called "user1" and "user2" and could only be deleted, not renamed, so the first thing to do on a new instance was to throw away two users whose names must not be touched. "+ Card" explains by itself that a user is missing first
|
|
162
|
+
* (bmueller77) Fix: a recurring card left lying for several intervals produced a follow-up card **dated in the past**. Due 28.08., interval 7, completed 07.09. gave 04.09. The calculation now starts from the later of due date and today. Finishing early keeps the calendar as the reference, otherwise the grid would creep forward with every early tick
|
|
163
|
+
* (bmueller77) Fix: without a single user the card editor opened and saving failed on a condition nobody could meet there. Fix: the reason on the blocked "+ Card" never appeared, because Chrome delivers no mouse events on disabled buttons. It uses `aria-disabled` now, so the click is caught and says what is missing
|
|
164
|
+
* (bmueller77) Fix: the column count and the sort button in the column header were too small to hit reliably and are bigger now. Fix: "+X more" hung on the column while the add button hung in the card list, so the hint sat below the add button, set off from the cards and not lined up with them
|
|
165
|
+
* (bmueller77) Fix: `info.orphanedAssignees` was only written on start, so a repair or a restore from the trash left the state stale until the next start. Fix: `info.frozenUserIds` only ever grew, so a user created later with the same ID would have found the field locked from the outset. Fix: `info.apiSecret` was created on fresh instances after all, although the manual has said the opposite since 0.3.0
|
|
166
|
+
* (bmueller77) Fix: "setInterval called, but adapter is shutting down" did not come from a normal restart but from saving the settings: the host stops the instance mid-start while the start is still creating timers. Server, scheduler and the delayed write ask first now
|
|
167
|
+
* (bmueller77) Fix: "2 Karte(n)" in the prompt for removing a board member. Fix: the tooltip on the due date named only the state; the scale stands below it now. Fix: after "+ Add column" and "+ Add label" the focus stayed on the link. Fix: the links in the rendered markdown preview sat in the tab order although it is display only
|
|
168
|
+
* (bmueller77) A card that carries a **time of day** now turns red once that time has passed. Until now the colour only changed at midnight, although 0.3.0 introduced the minute precise `cardDue` event, so the event and the colour contradicted each other. The badges are refreshed in place every minute rather than by re-rendering the board, which leaves the scroll position and a drag in progress untouched
|
|
169
|
+
* (bmueller77) Fix: **`boards.<id>.overdueCount` went stale.** The minute tick only refreshed the per-user states; the board counters were written by the persist path, which runs on changes. A card that becomes overdue purely because the date rolled over triggers no change, so on an untouched board the counter kept its old value
|
|
170
|
+
* (bmueller77) **A user ID can no longer be renamed once it exists.** Cards, avatar files and the addresses of shared views all hang on that ID, so a rename left every one of them pointing nowhere - and the adapter could not even clean up afterwards, because a rename cannot be told apart from "deleted and newly created". The field is locked as soon as the user has been saved once. The display name stays freely editable, which is what people actually want to change. Cost: the adapter writes a marker into its own instance configuration, which restarts the instance once per newly added user
|
|
171
|
+
* (bmueller77) **Cards that point at a user who no longer exists can be repaired in the board settings**, under *Users -> Orphaned assignees*. Each orphaned ID shows how many cards it holds and on which boards; the count expands into the list of cards - title, board, column, due date, done ones struck through - and each card opens in the normal editor, because nobody moves thirteen cards on trust. The gear icon carries a small dot while anything is open. The section is absent when there is nothing to fix, and it never appears in embedded views with `hideSettings=1`
|
|
172
|
+
* (bmueller77) The trash is now left out of the repair as well, not just out of the detection. Until now the confirmation named a number that the card list did not contain, and cards on their way to deletion were reassigned to somebody
|
|
173
|
+
* (bmueller77) `reassignUser` also moves the **avatar picture** now. The files are named after the user ID, so the picture stayed behind under the old one and the target person was left without. An existing picture of the target is not overwritten. The target also becomes a member of every board it touches - otherwise it would be responsible for cards while missing from that board's person filter
|
|
174
|
+
* (bmueller77) **The API validates assignees the way the card editor does.** At least one person is required, and every ID has to exist; unknown ones are answered with `400` and a list of the valid IDs. Until now anything went through, placeholders like `default` included, which produced cards the editor could never have created and which stay invisible behind a `users` filter. An ID already on the card stays allowed when editing, so an orphaned card does not become the one card you cannot touch. **This is a behaviour change:** callers that create cards without an assignee will start failing
|
|
175
|
+
* (bmueller77) An unknown **label** coming in through the API is added to the board instead of being rejected, so a script can hand out a new label without creating it first. Without that the card would carry a label the board does not list, which makes it invisible behind an `onlyLabel` filter
|
|
176
|
+
* (bmueller77) New commands `reassignUser` and `listOrphanedAssignees`, plus `POST /api/users/<name>/reassign`, `GET /api/users/orphaned` and `GET /api/users/orphaned/<name>` for the card list behind one ID. All of them touch every board, so they stay closed to board-restricted tokens
|
|
177
|
+
* (bmueller77) "+X more" below a column is a button now. It looked like one and was plain text, so the cards hidden by the display limit could not be reached without changing the limit itself. Clicking shows them, clicking again hides them, and the choice is remembered per device. Its text also lines up with the left edge of the cards now instead of sitting six pixels further left
|
|
178
|
+
* (bmueller77) Fix: with a filter on, an exceeded WIP limit turned the column red while the badge showed only the match count, so two cards against a limit of three looked like a bug. The limit now stays visible in that case, and the tooltip names both figures, the cards the column really holds and the ones the filter shows
|
|
179
|
+
* (bmueller77) **New recurrence kind: every X days counted from completion** (#40). "Every X days" keeps a fixed grid from its start date, so a card due every 30 days that is finished ten days late comes back after 20 days, not 30. The new kind counts from the moment the card is ticked off, which is what maintenance intervals mean: the filter lasts 30 days from the change, not from the calendar. Both kinds share the same arithmetic, only the anchor differs, and the follow-up card carries its own copy of the rule. No calendar series can be built for it, so such cards get a single invite like "working day of the month" does
|
|
180
|
+
* (bmueller77) The hint below the recurrence field for "every X days" said "new card after the configured number of days", which described the new kind rather than the existing one. That reading is exactly what was reported in #40
|
|
181
|
+
* (bmueller77) Fix: the adapter was killed with SIGKILL on every restart. Shutdown closed the web server first and wrote the data afterwards, but `server.close` waits for every connection to go away and an open browser tab holds its keep-alive. The adapter hung, never got to writing, and the host killed it after a second, so the last changes were at stake on every restart. Data is written first now, and open connections are closed instead of waited for
|
|
182
|
+
* (bmueller77) Fix: Escape and the close cross discarded card edits without asking. The settings dialog had always asked; the card editor had not. It now compares the form against a snapshot taken when it opened, so no field can be forgotten. "Cancel" still discards without asking
|
|
183
|
+
* (bmueller77) Fix: a card belonging to a deleted user showed an empty required field in the editor. Clicking a person then left the old ID in place unnoticed. The ID now appears as its own dashed chip marked "(deleted)"
|
|
184
|
+
* (bmueller77) Fix: the dot on the gear was only computed on load, on the assumption that orphaned assignees cannot appear while the board is open. They can: a card restored from the trash brings its ID back. The check now also runs after a restore, and it clears the dot again
|
|
185
|
+
* (bmueller77) Fix: an unusable date format was accepted without checking and then printed on every card verbatim. A format without a day, month or year token is discarded with a warning in the log
|
|
186
|
+
* (bmueller77) Fix: Enter inside the checklist saved the whole card and closed the dialog. It creates the next item now; Ctrl and Enter saves from there
|
|
187
|
+
* (bmueller77) Fix: selection and keyboard focus looked identical on the chips, both a two-pixel ring in the accent colour. The focus ring is dashed now
|
|
188
|
+
* (bmueller77) Fix: white on the orange due badge was hard to read, so the orange is darker now. Red as a text colour on a dark surface got a lighter tone through `--danger-fg`
|
|
189
|
+
* (bmueller77) Fix: the sticky add-card button sat on top of card titles and labels while scrolling. It has an opaque pad in the column colour now
|
|
190
|
+
* (bmueller77) Fix: below 600 px the board row in the settings stretched the board picker and the name field far beyond their content, because the column direction turned a `flex-basis` meant as width into a height
|
|
191
|
+
* (bmueller77) The due-date badge has a tooltip naming its state, since a colour on its own does not say whether it is worse than the one beside it. New labels take their colour from a palette in rotation. The pencil and the other card icons are easier to hit. "+ Card" is disabled while no board exists, and the filter button that has been dead since 0.3.0 is gone
|
|
192
|
+
* (bmueller77) **With exactly one user, assignment disappears** (#35). No chips in the header, no avatars on the cards, no assignees field in the editor, no user picker in the views dialog: with one person there is nothing to choose and nothing to filter. The API fills the field in instead of answering `400`, so a script does not fail on a question that answers itself. A card carrying an ID that no longer exists keeps it rather than being silently moved. Adding a second user brings all of it back
|
|
193
|
+
* (bmueller77) The copy button on a done card is `mdi:content-copy` now, two offset sheets (#33). It used to be a sheet with a circular arrow, which at that size looked like the recurrence icon sitting on the same card, so people read the copy button as a recurrence marker that had moved. The recurrence icon itself never moved. The documentation gained a table listing every icon that can appear on a card
|
|
194
|
+
* (bmueller77) Labels keep one order everywhere (#32). A card used to list them in the order they had been clicked in the editor, so two cards carrying the same labels looked different. Card, picker and section summary now all follow the order of the board, and that order can be dragged by a handle in the board settings, the same way the columns already worked
|
|
195
|
+
* (bmueller77) Fix: `overdueCount` and `overdueList` ignored the time of day (#31). A card due today at 09:00 turned red in the board at 09:01, while the states kept their old value until midnight, because the counters compared dates only. One function now decides it for the states, the `cardDue` event and the colour alike
|
|
196
|
+
* (bmueller77) **The column header can show more than the card count.** Clicking the number opens a menu with four checkmarks: total, tomorrow, today, overdue. Each ticked entry gets its own badge next to the others, in the same colours the due-date badges use on the cards and following the same arithmetic, lead time and time of day included. The choice is stored per column and per device, like the sort mode. Done columns and the trash have no menu, since every card there counts as completed
|
|
197
|
+
* (bmueller77) The sort menu and the new counts menu can be operated from the keyboard. Both hang off `body`, so a Tab from the button that opened them used to jump past them into the cards; they now take the focus, move with the arrow keys and hand it back on Escape
|
|
198
|
+
* (bmueller77) **The card editor is reorganised.** The two required fields come first, title and assignees - the latter used to sit far down and could fall below the fold on a small screen, so the card could not be saved without scrolling for it. Everything optional now sits in collapsible sections: description, labels and card colour, link, location, recurrence, checklist. Each header shows on its right what is inside, so a collapsed section summarises rather than hides. Which sections are open is remembered per device and applies to the next new card as well
|
|
199
|
+
* (bmueller77) Labels and card colour share one section header on wide screens; below 600 px each gets its own and collapses separately
|
|
200
|
+
* (bmueller77) **The chip groups can be operated from the keyboard.** Assignees, labels, card colours and the new link type bar are `<span>` elements and were invisible to Tab: focus skipped straight past them, and in the colour picker it landed on the last swatch because only the custom-colour wheel carried a `tabIndex`. Each group is now a single tab stop with arrow keys inside, Home and End for the ends, space or Enter to select. The section headers are tab stops too
|
|
201
|
+
* (bmueller77) **The link field has a bar of the nine link types above it.** Clicking one puts a matching example into the field as a placeholder, `tel:+49123456789` instead of `https://...`, without touching what is already typed. The bar also highlights which type matches the current address, using the same detection the board uses for the card
|
|
202
|
+
* (bmueller77) The link field accepts exactly what the board renders. It was an `<input type="url">`, which demanded a scheme and therefore rejected `example.com` and relative paths although the adapter accepts both - while letting `javascript:` through, because that is a formally valid URL. The same function now decides in both places
|
|
203
|
+
* (bmueller77) All dialogs have a close cross in the top right. Card editor and settings share one width and height so nothing jumps when switching between them; the views dialog stays as tall as its content
|
|
204
|
+
* (bmueller77) Fix: **a closed dialog stayed on screen.** The rule giving the dialogs their flex layout was not bound to `[open]` and therefore overrode the browser default `dialog:not([open]) { display: none }`. The dialog kept its space and, no longer being in the top layer, the board painted through it
|
|
205
|
+
* (bmueller77) Fix: the first label in the editor stretched over all free vertical space and pushed everything below it down, because `flex: 1` on labels is meant to distribute width in a row, not height in a column
|
|
206
|
+
* (bmueller77) Fix: the focus ring of the fields was clipped at the left edge of the scrolling area, and section headers did not line up with the other labels
|
|
207
|
+
* (bmueller77) The yellow of the lead-time step is `#ffd800`
|
|
208
|
+
* (bmueller77) `/api/config` now also carries `reminderDaysBefore`, which the web UI needs for the colour window
|
|
209
|
+
* (bmueller77) New CSS variables `--due-upcoming` and `--due-upcoming-text` for the yellow step, defined for both themes and referenced with a fallback so existing custom themes keep working
|
|
210
|
+
|
|
124
211
|
### 0.3.1 (2026-08-19)
|
|
125
212
|
* (bmueller77) Releases are now built and published by CI when a version tag is pushed, signed with provenance through npm trusted publishing. The 0.3.0 package was published by hand and carries no signature, which is what the repository checker flags as E2008 and E3032
|
|
126
213
|
* (bmueller77) The workflow follows the ioBroker standard now: separate `check-and-lint` and `adapter-tests` jobs, a trigger for `v*` tags, a concurrency group per branch, and a `deploy` job that also creates the GitHub release. Adapter tests run on Node 22 and 24 across Linux, Windows and macOS instead of Linux alone
|
|
@@ -163,7 +250,7 @@ Details: [Security & access control](docs/en/README.md#security--access-control)
|
|
|
163
250
|
* (bmueller77) **Security: the write token was readable by any website.** `Access-Control-Allow-Origin: *` sat on every route, including the one that hands the token to the UI in a `<meta>` tag, so any page open in your browser could scan the network for the adapter, read that page cross-origin, take the token and then change or delete boards. CORS is now limited to `/api` and `/webhook` and to origins listed in the new **"Allowed browser origins"** setting (empty by default = same origin only). Only browser access was affected; scripts, Node-RED and curl are unchanged
|
|
164
251
|
* (bmueller77) **Security: a board-restricted token could still escape its boards.** It was only checked for board-specific webhook calls and could change any board via `/api`. On the command route the guard accepted any allowed board named anywhere in the body as proof, even for commands that ignore that field: `addBoard` with `"board":"<allowed>"` created boards elsewhere, and the same trick worked on the user and avatar routes. What counts now is the board the call actually touches: the path board for REST plus a transfer's target, and per command the field that command really evaluates. A writing command that names no board is refused for restricted tokens; reading commands (`listBoards`, `getBoard`) stay open
|
|
165
252
|
* (bmueller77) **Security: an empty token row opened the API.** A row added in the token table but left blank matched every request that carried no token at all, because a missing token fell back to the empty string. Blank tokens are now rejected outright. In the same vein, an empty **"allowed boards"** field counted as `*`, so clearing it to take rights away in fact granted them for every board. Empty now means no board; enter `*` explicitly for all
|
|
166
|
-
* (bmueller77) Tokens are **no longer accepted as a URL parameter** (`?token
|
|
253
|
+
* (bmueller77) Tokens are **no longer accepted as a URL parameter** (`?token=...`), only in the `X-Kanban-Token` header or as `_token` in the body, so they stop showing up in logs, browser history and referrers
|
|
167
254
|
* (bmueller77) The **SPA write secret moved into the adapter's file storage**; the state `kanban.0.info.apiSecret` stays but is kept empty. An existing value is migrated on first start. Object access no longer implies write access to the API
|
|
168
255
|
* (bmueller77) The **`action` state can be switched off** in the instance settings ("Webhooks (in)"). It executes the full command vocabulary without a token, so installations that do not use it can close that door
|
|
169
256
|
* (bmueller77) **Irreversible commands** (`deleteBoard`, `emptyTrash`, `purgeCard`) are logged with their source, no matter which route they came in through
|
package/admin/i18n/de.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"usersTab__notifyLegend_text": "<div style='font-size:0.85rem;line-height:1.5;opacity:0.85'><b>Was die Spalten bedeuten</b><table style='border-collapse:collapse'><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Zugew.</b></td><td>dem Benutzer wurde eine Karte zugewiesen, auch nachträglich bei einer bestehenden Karte</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Fällig</b></td><td>eine offene Karte des Benutzers ist fällig, überfällig oder rückt in die eingestellten Tage vor Fälligkeit. Die Erinnerung wiederholt sich täglich zur Erinnerungs-Uhrzeit</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Geänd.</b></td><td>eine Karte des Benutzers wurde bearbeitet</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Versch.</b></td><td>eine Karte des Benutzers wurde in eine andere Spalte verschoben</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Erled.</b></td><td>eine Karte des Benutzers wurde als erledigt markiert</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Neu</b></td><td>in einem Board, in dem der Benutzer Mitglied ist, wurde eine neue Karte angelegt, ganz gleich wer zuständig ist. Das gilt auch für Kopien aus einem anderen Board und für Folgekarten von Wiederholungen</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Papier.</b></td><td>eine Karte des Benutzers ist im Papierkorb gelandet, manuell oder durch das automatische Aufräumen. Dort bleibt sie 30 Tage wiederherstellbar</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Wiederh.</b></td><td>eine Karte des Benutzers wurde aus dem Papierkorb wiederhergestellt</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Gelöscht</b></td><td>eine Karte des Benutzers wurde nach den 30 Tagen endgültig gelöscht</td></tr></table></div>",
|
|
57
57
|
"usersTab_label": "Benutzer",
|
|
58
58
|
"usersTab_users_0_title": "ID (klein, ohne Umlaute)",
|
|
59
|
+
"usersTab_users_0_tooltip": "Nach dem Anlegen nicht mehr änderbar: Karten, Avatare und geteilte Ansichten hängen an dieser ID. Zum Umziehen dient der Befehl reassignUser.",
|
|
59
60
|
"usersTab_users_10_title": "→ Wiederh.",
|
|
60
61
|
"usersTab_users_10_tooltip": "E-Mail, wenn eine Karte dieses Benutzers aus dem Papierkorb zurückgeholt wird",
|
|
61
62
|
"usersTab_users_11_title": "→ Gelöscht",
|
package/admin/i18n/en.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"usersTab__notifyLegend_text": "<div style='font-size:0.85rem;line-height:1.5;opacity:0.85'><b>What the columns mean</b><table style='border-collapse:collapse'><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ assigned</b></td><td>a card was assigned to this user, including later on an existing card</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ due</b></td><td>an open card of this user is due, overdue or enters the configured days before the due date. The reminder repeats daily at the reminder time</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ changed</b></td><td>a card of this user was edited</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ moved</b></td><td>a card of this user was moved to another column</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ done</b></td><td>a card of this user was marked done</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ created</b></td><td>a new card was created on a board this user is a member of, no matter who it is assigned to. This also covers copies from another board and follow-up cards of a recurrence</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ trash</b></td><td>a card of this user went to the trash, manually or through the automatic cleanup. It stays restorable for 30 days</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ restored</b></td><td>a card of this user was restored from the trash</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ deleted</b></td><td>a card of this user was deleted permanently after the 30 days</td></tr></table></div>",
|
|
57
57
|
"usersTab_label": "Users",
|
|
58
58
|
"usersTab_users_0_title": "ID (lowercase)",
|
|
59
|
+
"usersTab_users_0_tooltip": "Cannot be changed once created: cards, avatars and shared views are tied to this ID. Use the reassignUser command to move them over.",
|
|
59
60
|
"usersTab_users_10_title": "→ restored",
|
|
60
61
|
"usersTab_users_10_tooltip": "E-mail when a card of this user is restored from the trash",
|
|
61
62
|
"usersTab_users_11_title": "→ deleted",
|
package/admin/i18n/es.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"usersTab__notifyLegend_text": "<div style='font-size:0.85rem;line-height:1.5;opacity:0.85'><b>Qué significan las columnas</b><table style='border-collapse:collapse'><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Asignada</b></td><td>se asignó una tarjeta al usuario, también posteriormente en una tarjeta existente</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Vence</b></td><td>una tarjeta abierta del usuario vence, está atrasada o entra en los días configurados antes del vencimiento. El recordatorio se repite a diario a la hora indicada</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Modificada</b></td><td>se editó una tarjeta del usuario</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Movida</b></td><td>una tarjeta del usuario se movió a otra columna</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Hecha</b></td><td>una tarjeta del usuario se marcó como hecha</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Creada</b></td><td>se creó una tarjeta nueva en un tablero del que el usuario es miembro, sin importar a quién esté asignada. Esto incluye copias de otro tablero y tarjetas siguientes de una recurrencia</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Papelera</b></td><td>una tarjeta del usuario fue a la papelera, manualmente o por la limpieza automática. Sigue siendo restaurable durante 30 días</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Restaurada</b></td><td>una tarjeta del usuario se restauró desde la papelera</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Eliminada</b></td><td>una tarjeta del usuario se eliminó definitivamente tras los 30 días</td></tr></table></div>",
|
|
57
57
|
"usersTab_label": "Usuarios",
|
|
58
58
|
"usersTab_users_0_title": "ID (minúsculas)",
|
|
59
|
+
"usersTab_users_0_tooltip": "No se puede cambiar una vez creado: las tarjetas, los avatares y las vistas compartidas están vinculados a este ID. Use el comando reassignUser para trasladarlos.",
|
|
59
60
|
"usersTab_users_10_title": "→ Restaurada",
|
|
60
61
|
"usersTab_users_10_tooltip": "Correo cuando una tarjeta de este usuario se restaura desde la papelera",
|
|
61
62
|
"usersTab_users_11_title": "→ Eliminada",
|
package/admin/i18n/fr.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"usersTab__notifyLegend_text": "<div style='font-size:0.85rem;line-height:1.5;opacity:0.85'><b>Signification des colonnes</b><table style='border-collapse:collapse'><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Assigné</b></td><td>une carte a été affectée à cet utilisateur, y compris après coup sur une carte existante</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Échéance</b></td><td>une carte ouverte de cet utilisateur arrive à échéance, est en retard ou entre dans les jours configurés avant l’échéance. Le rappel se répète chaque jour à l’heure du rappel</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Modifiée</b></td><td>une carte de cet utilisateur a été modifiée</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Déplacée</b></td><td>une carte de cet utilisateur a été déplacée dans une autre colonne</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Terminée</b></td><td>une carte de cet utilisateur a été marquée comme terminée</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Créée</b></td><td>une nouvelle carte a été créée sur un tableau dont cet utilisateur est membre, quel que soit son affectataire. Cela vaut aussi pour les copies venant d’un autre tableau et les cartes suivantes d’une récurrence</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Corbeille</b></td><td>une carte de cet utilisateur est partie à la corbeille, manuellement ou par le nettoyage automatique. Elle y reste restaurable 30 jours</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Restaurée</b></td><td>une carte de cet utilisateur a été restaurée depuis la corbeille</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Supprimée</b></td><td>une carte de cet utilisateur a été supprimée définitivement après les 30 jours</td></tr></table></div>",
|
|
57
57
|
"usersTab_label": "Utilisateurs",
|
|
58
58
|
"usersTab_users_0_title": "ID (minuscules)",
|
|
59
|
+
"usersTab_users_0_tooltip": "Non modifiable après création : les cartes, les avatars et les vues partagées sont liés à cet ID. Utilisez la commande reassignUser pour les transférer.",
|
|
59
60
|
"usersTab_users_10_title": "→ Restaurée",
|
|
60
61
|
"usersTab_users_10_tooltip": "E-mail lorsqu’une carte de cet utilisateur est restaurée depuis la corbeille",
|
|
61
62
|
"usersTab_users_11_title": "→ Supprimée",
|
package/admin/i18n/it.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"usersTab__notifyLegend_text": "<div style='font-size:0.85rem;line-height:1.5;opacity:0.85'><b>Cosa significano le colonne</b><table style='border-collapse:collapse'><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Assegnata</b></td><td>all’utente è stata assegnata una scheda, anche in un secondo momento su una scheda esistente</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Scadenza</b></td><td>una scheda aperta dell’utente scade, è in ritardo o rientra nei giorni impostati prima della scadenza. Il promemoria si ripete ogni giorno all’ora indicata</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Modificata</b></td><td>una scheda dell’utente è stata modificata</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Spostata</b></td><td>una scheda dell’utente è stata spostata in un’altra colonna</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Completata</b></td><td>una scheda dell’utente è stata contrassegnata come completata</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Creata</b></td><td>in una bacheca di cui l’utente è membro è stata creata una nuova scheda, indipendentemente da chi ne sia responsabile. Vale anche per le copie da un’altra bacheca e per le schede successive di una ricorrenza</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Cestino</b></td><td>una scheda dell’utente è finita nel cestino, manualmente o con la pulizia automatica. Resta ripristinabile per 30 giorni</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Ripristinata</b></td><td>una scheda dell’utente è stata ripristinata dal cestino</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Eliminata</b></td><td>una scheda dell’utente è stata eliminata definitivamente dopo i 30 giorni</td></tr></table></div>",
|
|
57
57
|
"usersTab_label": "Utenti",
|
|
58
58
|
"usersTab_users_0_title": "ID (minuscolo)",
|
|
59
|
+
"usersTab_users_0_tooltip": "Non modificabile dopo la creazione: schede, avatar e viste condivise sono legati a questo ID. Usa il comando reassignUser per spostarli.",
|
|
59
60
|
"usersTab_users_10_title": "→ Ripristinata",
|
|
60
61
|
"usersTab_users_10_tooltip": "E-mail quando una scheda di questo utente viene ripristinata dal cestino",
|
|
61
62
|
"usersTab_users_11_title": "→ Eliminata",
|
package/admin/i18n/nl.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"usersTab__notifyLegend_text": "<div style='font-size:0.85rem;line-height:1.5;opacity:0.85'><b>Wat de kolommen betekenen</b><table style='border-collapse:collapse'><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Toegew.</b></td><td>de gebruiker kreeg een kaart toegewezen, ook later bij een bestaande kaart</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Verval</b></td><td>een open kaart van de gebruiker verloopt, is te laat of komt binnen de ingestelde dagen voor de vervaldatum. De herinnering herhaalt zich dagelijks op de herinneringstijd</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Gewijz.</b></td><td>een kaart van de gebruiker is bewerkt</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Verpl.</b></td><td>een kaart van de gebruiker is naar een andere kolom verplaatst</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Gereed</b></td><td>een kaart van de gebruiker is als gereed gemarkeerd</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Nieuw</b></td><td>op een bord waarvan de gebruiker lid is, is een nieuwe kaart aangemaakt, ongeacht aan wie die is toegewezen. Dit geldt ook voor kopieën van een ander bord en vervolgkaarten van een herhaling</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Prullenb.</b></td><td>een kaart van de gebruiker is in de prullenbak beland, handmatig of door het automatisch opruimen. Daar blijft die 30 dagen herstelbaar</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Hersteld</b></td><td>een kaart van de gebruiker is uit de prullenbak hersteld</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Verwijd.</b></td><td>een kaart van de gebruiker is na de 30 dagen definitief verwijderd</td></tr></table></div>",
|
|
57
57
|
"usersTab_label": "Gebruikers",
|
|
58
58
|
"usersTab_users_0_title": "ID (kleine letters)",
|
|
59
|
+
"usersTab_users_0_tooltip": "Niet meer te wijzigen na aanmaken: kaarten, avatars en gedeelde weergaven zijn aan deze ID gekoppeld. Gebruik het commando reassignUser om ze te verplaatsen.",
|
|
59
60
|
"usersTab_users_10_title": "→ Hersteld",
|
|
60
61
|
"usersTab_users_10_tooltip": "E-mail wanneer een kaart van deze gebruiker uit de prullenbak wordt hersteld",
|
|
61
62
|
"usersTab_users_11_title": "→ Verwijd.",
|
package/admin/i18n/pl.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"usersTab__notifyLegend_text": "<div style='font-size:0.85rem;line-height:1.5;opacity:0.85'><b>Co oznaczają kolumny</b><table style='border-collapse:collapse'><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Przypis.</b></td><td>użytkownikowi przypisano kartę, także później przy istniejącej karcie</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Termin</b></td><td>otwarta karta użytkownika ma termin, jest po terminie albo wchodzi w ustawioną liczbę dni przed terminem. Przypomnienie powtarza się codziennie o godzinie przypomnienia</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Zmien.</b></td><td>karta użytkownika została zmieniona</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Przenies.</b></td><td>karta użytkownika została przeniesiona do innej kolumny</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Gotowe</b></td><td>karta użytkownika została oznaczona jako gotowa</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Nowa</b></td><td>na tablicy, której użytkownik jest członkiem, utworzono nową kartę, niezależnie od tego, kto jest przypisany. Dotyczy to także kopii z innej tablicy i kart następnych przy powtarzaniu</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Kosz</b></td><td>karta użytkownika trafiła do kosza, ręcznie albo przez automatyczne porządkowanie. Pozostaje możliwa do przywrócenia przez 30 dni</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Przywr.</b></td><td>karta użytkownika została przywrócona z kosza</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Usunięta</b></td><td>karta użytkownika została trwale usunięta po 30 dniach</td></tr></table></div>",
|
|
57
57
|
"usersTab_label": "Użytkownicy",
|
|
58
58
|
"usersTab_users_0_title": "ID (małe litery)",
|
|
59
|
+
"usersTab_users_0_tooltip": "Nie można zmienić po utworzeniu: karty, awatary i udostępnione widoki są powiązane z tym identyfikatorem. Do przeniesienia służy polecenie reassignUser.",
|
|
59
60
|
"usersTab_users_10_title": "→ Przywr.",
|
|
60
61
|
"usersTab_users_10_tooltip": "E-mail, gdy karta użytkownika zostanie przywrócona z kosza",
|
|
61
62
|
"usersTab_users_11_title": "→ Usunięta",
|
package/admin/i18n/pt.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"usersTab__notifyLegend_text": "<div style='font-size:0.85rem;line-height:1.5;opacity:0.85'><b>O que significam as colunas</b><table style='border-collapse:collapse'><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Atribuído</b></td><td>foi atribuído um cartão ao utilizador, também posteriormente num cartão existente</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Vencimento</b></td><td>um cartão aberto do utilizador vence, está atrasado ou entra nos dias configurados antes do vencimento. O lembrete repete-se diariamente à hora indicada</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Alterado</b></td><td>um cartão do utilizador foi editado</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Movido</b></td><td>um cartão do utilizador foi movido para outra coluna</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Concluído</b></td><td>um cartão do utilizador foi marcado como concluído</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Criado</b></td><td>foi criado um novo cartão num quadro do qual o utilizador é membro, independentemente de quem esteja atribuído. Isto abrange também cópias de outro quadro e cartões seguintes de uma recorrência</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Lixeira</b></td><td>um cartão do utilizador foi para a lixeira, manualmente ou pela limpeza automática. Fica restaurável durante 30 dias</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Restaurado</b></td><td>um cartão do utilizador foi restaurado da lixeira</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Eliminado</b></td><td>um cartão do utilizador foi eliminado definitivamente após os 30 dias</td></tr></table></div>",
|
|
57
57
|
"usersTab_label": "Utilizadores",
|
|
58
58
|
"usersTab_users_0_title": "ID (minúsculas)",
|
|
59
|
+
"usersTab_users_0_tooltip": "Não pode ser alterado depois de criado: os cartões, avatares e vistas partilhadas estão ligados a este ID. Use o comando reassignUser para os transferir.",
|
|
59
60
|
"usersTab_users_10_title": "→ Restaurado",
|
|
60
61
|
"usersTab_users_10_tooltip": "E-mail quando um cartão deste utilizador é restaurado da lixeira",
|
|
61
62
|
"usersTab_users_11_title": "→ Eliminado",
|
package/admin/i18n/ru.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"usersTab__notifyLegend_text": "<div style='font-size:0.85rem;line-height:1.5;opacity:0.85'><b>Что означают столбцы</b><table style='border-collapse:collapse'><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Назнач.</b></td><td>пользователю назначили карточку, в том числе позже у существующей карточки</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Срок</b></td><td>открытая карточка пользователя наступила по сроку, просрочена или вошла в заданное число дней до срока. Напоминание повторяется ежедневно в указанное время</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Изменена</b></td><td>карточку пользователя отредактировали</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Перемещ.</b></td><td>карточку пользователя переместили в другой столбец</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Готово</b></td><td>карточку пользователя отметили выполненной</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Создана</b></td><td>на доске, где пользователь состоит участником, создана новая карточка, независимо от того, кто назначен. Это касается и копий с другой доски, и следующих карточек повторения</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Корзина</b></td><td>карточка пользователя попала в корзину — вручную или при автоматической очистке. Она остаётся восстановимой 30 дней</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Восстан.</b></td><td>карточку пользователя восстановили из корзины</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Удалена</b></td><td>карточку пользователя окончательно удалили по истечении 30 дней</td></tr></table></div>",
|
|
57
57
|
"usersTab_label": "Пользователи",
|
|
58
58
|
"usersTab_users_0_title": "ID (строчными)",
|
|
59
|
+
"usersTab_users_0_tooltip": "Нельзя изменить после создания: карточки, аватары и общие представления привязаны к этому ID. Для переноса служит команда reassignUser.",
|
|
59
60
|
"usersTab_users_10_title": "→ Восстан.",
|
|
60
61
|
"usersTab_users_10_tooltip": "Письмо, когда карточку пользователя восстановили из корзины",
|
|
61
62
|
"usersTab_users_11_title": "→ Удалена",
|
package/admin/i18n/uk.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"usersTab__notifyLegend_text": "<div style='font-size:0.85rem;line-height:1.5;opacity:0.85'><b>Що означають стовпці</b><table style='border-collapse:collapse'><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Признач.</b></td><td>користувачеві призначено картку, зокрема й згодом для наявної картки</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Термін</b></td><td>відкрита картка користувача настає, прострочена або входить у задану кількість днів до терміну. Нагадування повторюється щодня у вказаний час</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Змінено</b></td><td>картку користувача відредаговано</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Переміщ.</b></td><td>картку користувача переміщено в інший стовпець</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Готово</b></td><td>картку користувача позначено виконаною</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Створено</b></td><td>на дошці, учасником якої є користувач, створено нову картку, незалежно від того, кому її призначено. Це стосується й копій з іншої дошки та наступних карток повторення</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Кошик</b></td><td>картка користувача потрапила в кошик — вручну або під час автоматичного очищення. Вона лишається відновлюваною 30 днів</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Відновл.</b></td><td>картку користувача відновлено з кошика</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ Видалено</b></td><td>картку користувача остаточно видалено після 30 днів</td></tr></table></div>",
|
|
57
57
|
"usersTab_label": "Користувачі",
|
|
58
58
|
"usersTab_users_0_title": "ID (малі літери)",
|
|
59
|
+
"usersTab_users_0_tooltip": "Не можна змінити після створення: картки, аватари та спільні подання прив'язані до цього ID. Для перенесення слугує команда reassignUser.",
|
|
59
60
|
"usersTab_users_10_title": "→ Відновл.",
|
|
60
61
|
"usersTab_users_10_tooltip": "Лист, коли картку користувача відновлено з кошика",
|
|
61
62
|
"usersTab_users_11_title": "→ Видалено",
|
package/admin/i18n/zh-cn.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"usersTab__notifyLegend_text": "<div style='font-size:0.85rem;line-height:1.5;opacity:0.85'><b>各列的含义</b><table style='border-collapse:collapse'><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ 已指派</b></td><td>有卡片被指派给该用户,包括后来在已有卡片上指派</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ 到期</b></td><td>该用户有未完成的卡片到期、逾期,或进入设定的提前提醒天数。提醒会在每天的提醒时间重复</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ 已修改</b></td><td>该用户的卡片被编辑</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ 已移动</b></td><td>该用户的卡片被移动到其他列</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ 已完成</b></td><td>该用户的卡片被标记为已完成</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ 新建</b></td><td>在该用户所属的看板上创建了新卡片,无论指派给谁。这也包括从其他看板复制的卡片以及重复任务生成的后续卡片</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ 回收站</b></td><td>该用户的卡片进入了回收站,可能是手动删除或自动清理所致。卡片在 30 天内仍可恢复</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ 已恢复</b></td><td>该用户的卡片已从回收站恢复</td></tr><tr><td style='padding:1px 12px 1px 0;white-space:nowrap'><b>→ 已删除</b></td><td>该用户的卡片在 30 天后被永久删除</td></tr></table></div>",
|
|
57
57
|
"usersTab_label": "用户",
|
|
58
58
|
"usersTab_users_0_title": "ID(小写)",
|
|
59
|
+
"usersTab_users_0_tooltip": "创建后不可更改:卡片、头像和共享视图都绑定到此 ID。如需转移,请使用 reassignUser 命令。",
|
|
59
60
|
"usersTab_users_10_title": "→ 已恢复",
|
|
60
61
|
"usersTab_users_10_tooltip": "当该用户的卡片从回收站恢复时发送邮件",
|
|
61
62
|
"usersTab_users_11_title": "→ 已删除",
|
package/admin/jsonConfig.json
CHANGED
|
@@ -190,11 +190,22 @@
|
|
|
190
190
|
"label": "usersTab_users_label",
|
|
191
191
|
"sm": 12,
|
|
192
192
|
"items": [
|
|
193
|
+
{
|
|
194
|
+
"type": "checkbox",
|
|
195
|
+
"attr": "fixed",
|
|
196
|
+
"width": "1%",
|
|
197
|
+
"title": " ",
|
|
198
|
+
"hidden": "true",
|
|
199
|
+
"filter": false,
|
|
200
|
+
"sort": false
|
|
201
|
+
},
|
|
193
202
|
{
|
|
194
203
|
"type": "text",
|
|
195
204
|
"attr": "name",
|
|
196
205
|
"width": "10%",
|
|
197
206
|
"title": "usersTab_users_0_title",
|
|
207
|
+
"tooltip": "usersTab_users_0_tooltip",
|
|
208
|
+
"disabled": "!!data.fixed",
|
|
198
209
|
"filter": false,
|
|
199
210
|
"sort": false
|
|
200
211
|
},
|
package/io-package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "kanban",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.3",
|
|
5
5
|
"titleLang": {
|
|
6
6
|
"en": "Kanban Board",
|
|
7
7
|
"de": "Kanban Board",
|
|
@@ -74,6 +74,32 @@
|
|
|
74
74
|
"license": "MIT"
|
|
75
75
|
},
|
|
76
76
|
"news": {
|
|
77
|
+
"0.3.3": {
|
|
78
|
+
"de": "- Alle Meldungen des Adapters sind jetzt auf Englisch\n- Fünf Zustandsnamen waren deutsch und heißen jetzt \"Card count\", \"Overdue cards\", \"Overdue cards (list)\" und \"Assigned open cards\"; bestehende Installationen werden beim Start umbenannt\n- Der HTTP-Statuscode der REST-Schnittstelle hängt nicht mehr am Wortlaut der Fehlermeldung\n- \"reminderDaysBefore\" wird auch im Code auf 0 bis 30 begrenzt",
|
|
79
|
+
"en": "- Every message the adapter produces is in English now\n- Five state names were German and are now \"Card count\", \"Overdue cards\", \"Overdue cards (list)\" and \"Assigned open cards\"; existing installations are renamed at startup\n- The HTTP status code of the REST API no longer depends on the wording of the error message\n- \"reminderDaysBefore\" is held to the range 0 to 30 in the code as well",
|
|
80
|
+
"ru": "- Все сообщения адаптера теперь на английском языке\n- Пять имён состояний были на немецком, теперь это \"Card count\", \"Overdue cards\", \"Overdue cards (list)\" и \"Assigned open cards\"; существующие установки переименовываются при запуске\n- Код состояния HTTP в REST-интерфейсе больше не зависит от формулировки сообщения об ошибке\n- \"reminderDaysBefore\" ограничивается диапазоном от 0 до 30 и в коде",
|
|
81
|
+
"pt": "- Todas as mensagens do adaptador estão agora em inglês\n- Cinco nomes de estados estavam em alemão e são agora \"Card count\", \"Overdue cards\", \"Overdue cards (list)\" e \"Assigned open cards\"; as instalações existentes são renomeadas no arranque\n- O código de estado HTTP da API REST já não depende da redação da mensagem de erro\n- \"reminderDaysBefore\" é limitado ao intervalo de 0 a 30 também no código",
|
|
82
|
+
"nl": "- Alle meldingen van de adapter zijn nu in het Engels\n- Vijf toestandsnamen waren Duits en heten nu \"Card count\", \"Overdue cards\", \"Overdue cards (list)\" en \"Assigned open cards\"; bestaande installaties worden bij het starten hernoemd\n- De HTTP-statuscode van de REST-API hangt niet meer af van de formulering van de foutmelding\n- \"reminderDaysBefore\" wordt ook in de code begrensd op 0 tot 30",
|
|
83
|
+
"fr": "- Tous les messages de l'adaptateur sont désormais en anglais\n- Cinq noms d'états étaient en allemand et s'appellent maintenant \"Card count\", \"Overdue cards\", \"Overdue cards (list)\" et \"Assigned open cards\" ; les installations existantes sont renommées au démarrage\n- Le code de statut HTTP de l'API REST ne dépend plus de la formulation du message d'erreur\n- \"reminderDaysBefore\" est limité à la plage de 0 à 30 également dans le code",
|
|
84
|
+
"it": "- Tutti i messaggi dell'adattatore sono ora in inglese\n- Cinque nomi di stato erano in tedesco e ora sono \"Card count\", \"Overdue cards\", \"Overdue cards (list)\" e \"Assigned open cards\"; le installazioni esistenti vengono rinominate all'avvio\n- Il codice di stato HTTP dell'API REST non dipende più dal testo del messaggio di errore\n- \"reminderDaysBefore\" è limitato all'intervallo da 0 a 30 anche nel codice",
|
|
85
|
+
"es": "- Todos los mensajes del adaptador están ahora en inglés\n- Cinco nombres de estados estaban en alemán y ahora son \"Card count\", \"Overdue cards\", \"Overdue cards (list)\" y \"Assigned open cards\"; las instalaciones existentes se renombran al iniciar\n- El código de estado HTTP de la API REST ya no depende de la redacción del mensaje de error\n- \"reminderDaysBefore\" se limita al rango de 0 a 30 también en el código",
|
|
86
|
+
"pl": "- Wszystkie komunikaty adaptera są teraz w języku angielskim\n- Pięć nazw stanów było po niemiecku, teraz to \"Card count\", \"Overdue cards\", \"Overdue cards (list)\" i \"Assigned open cards\"; istniejące instalacje są zmieniane przy starcie\n- Kod stanu HTTP interfejsu REST nie zależy już od treści komunikatu o błędzie\n- \"reminderDaysBefore\" jest ograniczany do zakresu od 0 do 30 również w kodzie",
|
|
87
|
+
"uk": "- Усі повідомлення адаптера тепер англійською мовою\n- П'ять імен станів були німецькими, тепер це \"Card count\", \"Overdue cards\", \"Overdue cards (list)\" та \"Assigned open cards\"; наявні встановлення перейменовуються під час запуску\n- Код стану HTTP інтерфейсу REST більше не залежить від формулювання повідомлення про помилку\n- \"reminderDaysBefore\" обмежується діапазоном від 0 до 30 і в коді",
|
|
88
|
+
"zh-cn": "- 适配器的所有消息现在均为英文\n- 五个状态名称原为德语,现为 \"Card count\"、\"Overdue cards\"、\"Overdue cards (list)\" 和 \"Assigned open cards\";现有安装在启动时会被重命名\n- REST 接口的 HTTP 状态码不再取决于错误消息的措辞\n- \"reminderDaysBefore\" 在代码中同样被限制在 0 到 30 之间"
|
|
89
|
+
},
|
|
90
|
+
"0.3.2": {
|
|
91
|
+
"de": "- Zahlen im Spaltenkopf umschaltbar: Gesamt, Morgen, Heute, Ueberfaellig\n- Aufklappbare Abschnitte im Karteneditor mit Zusammenfassung in der Kopfzeile\n- Benutzer-IDs werden gesperrt, sobald eine Karte oder ein Avatarbild daran haengt; verwaiste Zustaendige lassen sich in der Oberflaeche reparieren\n- Neue Wiederholungsart \"Alle X Tage (nach Erledigung des Vorgaengers)\"\n- Gelb heisst jetzt genau der naechste Kalendertag; die Vorlaufzeit steuert nur noch die Erinnerungsmail\n- In Erledigt-Spalten entstehen keine Karten mehr\n- Beim Loeschen einer Karte mit Einladung geht eine Kalender-Absage raus\n- Der Papierkorb hat denselben Sortier-Umschalter wie jede andere Spalte\n- Frische Instanzen bringen keine Beispielbenutzer mehr mit\n- Dazu rund siebzig Korrekturen aus acht Testpaketen",
|
|
92
|
+
"en": "- Switchable counts in the column header: total, tomorrow, today, overdue\n- Collapsible sections in the card editor, each summarised in its header\n- User IDs are frozen once a card or an avatar hangs on them; orphaned assignees can be repaired in the UI\n- New recurrence kind \"every X days (after the previous one is done)\"\n- Yellow now means exactly the next calendar day; the lead time only drives the reminder mail\n- No cards are created in done columns any more\n- Deleting a card with an invite sends a calendar cancellation\n- The trash has the same sort toggle as every other column\n- Fresh instances no longer ship with example users\n- Plus around seventy fixes from eight test packages",
|
|
93
|
+
"ru": "- Переключаемые счётчики в заголовке столбца: всего, завтра, сегодня, просрочено\n- Сворачиваемые разделы в редакторе карточки со сводкой в заголовке\n- Идентификаторы пользователей блокируются, как только к ним привязана карточка или аватар; осиротевших исполнителей можно исправить в интерфейсе\n- Новый вид повторения «каждые X дней (после выполнения предыдущей)»\n- Жёлтый теперь означает ровно следующий календарный день; время предупреждения влияет только на письмо-напоминание\n- В столбцах «Готово» карточки больше не создаются\n- При удалении карточки с приглашением отправляется отмена встречи\n- В корзине появился тот же переключатель сортировки, что и в остальных столбцах\n- Новые экземпляры больше не содержат примеров пользователей\n- Кроме того, около семидесяти исправлений из восьми тестовых пакетов",
|
|
94
|
+
"pt": "- Contagens comutáveis no cabeçalho da coluna: total, amanhã, hoje, atrasado\n- Secções recolhíveis no editor de cartão, cada uma resumida no seu cabeçalho\n- Os IDs de utilizador ficam bloqueados assim que um cartão ou avatar depende deles; responsáveis órfãos podem ser reparados na interface\n- Novo tipo de repetição \"a cada X dias (após a conclusão do anterior)\"\n- Amarelo significa agora exatamente o dia seguinte; a antecedência controla apenas o e-mail de lembrete\n- Já não se criam cartões em colunas concluídas\n- Eliminar um cartão com convite envia um cancelamento de calendário\n- A reciclagem tem o mesmo seletor de ordenação que as outras colunas\n- As instâncias novas já não trazem utilizadores de exemplo\n- Além disso, cerca de setenta correções de oito pacotes de teste",
|
|
95
|
+
"nl": "- Omschakelbare tellers in de kolomkop: totaal, morgen, vandaag, te laat\n- Inklapbare secties in de kaarteditor, elk samengevat in de kop\n- Gebruikers-ID's worden vastgezet zodra er een kaart of avatar aan hangt; verweesde verantwoordelijken zijn in de interface te herstellen\n- Nieuwe herhaalsoort \"elke X dagen (na afronding van de vorige)\"\n- Geel betekent nu precies de volgende kalenderdag; de vooraankondiging stuurt alleen nog de herinneringsmail\n- In gereed-kolommen worden geen kaarten meer aangemaakt\n- Een kaart met uitnodiging verwijderen stuurt een agenda-annulering\n- De prullenbak heeft dezelfde sorteerschakelaar als elke andere kolom\n- Nieuwe instanties bevatten geen voorbeeldgebruikers meer\n- Daarnaast ongeveer zeventig correcties uit acht testpakketten",
|
|
96
|
+
"fr": "- Compteurs commutables dans l'en-tête de colonne : total, demain, aujourd'hui, en retard\n- Sections repliables dans l'éditeur de carte, chacune résumée dans son en-tête\n- Les identifiants d'utilisateur sont figés dès qu'une carte ou un avatar en dépend ; les responsables orphelins se réparent dans l'interface\n- Nouveau type de récurrence « tous les X jours (après l'achèvement du précédent) »\n- Le jaune signifie désormais exactement le jour civil suivant ; le délai ne pilote plus que le courriel de rappel\n- Plus aucune carte n'est créée dans les colonnes terminées\n- Supprimer une carte avec invitation envoie une annulation d'agenda\n- La corbeille dispose du même sélecteur de tri que les autres colonnes\n- Les nouvelles instances n'embarquent plus d'utilisateurs d'exemple\n- Et environ soixante-dix corrections issues de huit lots de tests",
|
|
97
|
+
"it": "- Conteggi commutabili nell'intestazione della colonna: totale, domani, oggi, scaduto\n- Sezioni comprimibili nell'editor della scheda, ognuna riassunta nella sua intestazione\n- Gli ID utente vengono bloccati non appena una scheda o un avatar dipende da essi; i responsabili orfani si riparano nell'interfaccia\n- Nuovo tipo di ricorrenza \"ogni X giorni (dopo il completamento del precedente)\"\n- Il giallo indica ora esattamente il giorno di calendario successivo; il preavviso governa solo l'e-mail di promemoria\n- Nelle colonne completate non si creano più schede\n- Eliminare una scheda con invito invia un annullamento di calendario\n- Il cestino ha lo stesso selettore di ordinamento di ogni altra colonna\n- Le nuove istanze non portano più utenti di esempio\n- Inoltre circa settanta correzioni da otto pacchetti di test",
|
|
98
|
+
"es": "- Recuentos conmutables en la cabecera de columna: total, mañana, hoy, vencido\n- Secciones plegables en el editor de tarjeta, cada una resumida en su cabecera\n- Los ID de usuario se bloquean en cuanto una tarjeta o un avatar depende de ellos; los responsables huérfanos se reparan en la interfaz\n- Nuevo tipo de repetición \"cada X días (tras completar la anterior)\"\n- El amarillo significa ahora exactamente el día natural siguiente; la antelación solo gobierna el correo de recordatorio\n- Ya no se crean tarjetas en columnas completadas\n- Eliminar una tarjeta con invitación envía una cancelación de calendario\n- La papelera tiene el mismo selector de orden que cualquier otra columna\n- Las instancias nuevas ya no traen usuarios de ejemplo\n- Además, unas setenta correcciones de ocho paquetes de pruebas",
|
|
99
|
+
"pl": "- Przełączane liczniki w nagłówku kolumny: razem, jutro, dziś, po terminie\n- Zwijane sekcje w edytorze karty, każda podsumowana w nagłówku\n- Identyfikatory użytkowników są blokowane, gdy tylko zależy od nich karta lub awatar; osierocone przypisania można naprawić w interfejsie\n- Nowy rodzaj powtarzania „co X dni (po ukończeniu poprzedniej)”\n- Żółty oznacza teraz dokładnie następny dzień kalendarzowy; wyprzedzenie steruje już tylko e-mailem przypominającym\n- W kolumnach ukończonych karty nie są już tworzone\n- Usunięcie karty z zaproszeniem wysyła odwołanie terminu\n- Kosz ma ten sam przełącznik sortowania co każda inna kolumna\n- Nowe instancje nie zawierają już przykładowych użytkowników\n- Do tego około siedemdziesięciu poprawek z ośmiu pakietów testowych",
|
|
100
|
+
"uk": "- Перемикані лічильники в заголовку стовпця: усього, завтра, сьогодні, прострочено\n- Згортані розділи в редакторі картки зі зведенням у заголовку\n- Ідентифікатори користувачів блокуються, щойно від них залежить картка або аватар; осиротілих виконавців можна виправити в інтерфейсі\n- Новий вид повторення «кожні X днів (після виконання попередньої)»\n- Жовтий тепер означає саме наступний календарний день; час попередження керує лише листом-нагадуванням\n- У стовпцях «Готово» картки більше не створюються\n- Видалення картки із запрошенням надсилає скасування зустрічі\n- Кошик має такий самий перемикач сортування, як і решта стовпців\n- Нові екземпляри більше не містять прикладів користувачів\n- Крім того, близько сімдесяти виправлень із восьми тестових пакетів",
|
|
101
|
+
"zh-cn": "- 列标题中的计数可切换:总计、明天、今天、逾期\n- 卡片编辑器中的可折叠区块,标题行显示摘要\n- 一旦有卡片或头像依赖于用户 ID,该 ID 即被锁定;界面中可修复孤立的负责人\n- 新的重复方式“每 X 天(在前一张完成之后)”\n- 黄色现在正好表示下一个日历日;提前量仅用于提醒邮件\n- 已完成列中不再创建卡片\n- 删除带邀请的卡片会发送日历取消通知\n- 回收站与其他列一样具有排序切换器\n- 新实例不再附带示例用户\n- 另有来自八个测试包的约七十项修复"
|
|
102
|
+
},
|
|
77
103
|
"0.3.1": {
|
|
78
104
|
"en": "Releases are now built and published by CI when a version tag is pushed, signed with provenance through npm trusted publishing. The 0.3.0 package was published by hand and carries no signature, which is what the repository checker flags as E2008 and E3032\nThe workflow follows the ioBroker standard now: separate `check-and-lint` and `adapter-tests` jobs, a trigger for `v*` tags, a concurrency group per branch, and a `deploy` job that also creates the GitHub release. Adapter tests run on Node 22 and 24 across Linux, Windows and macOS instead of Linux alone\nType checking for the adapter sources (`tsconfig.json` on `@tsconfig/node22`), with `lib/adapter-config.d.ts` declaring the 29 fields of the instance configuration, so a typo in `adapter.config.<field>` surfaces instead of silently reading `undefined`\n`npm run lint` is usable again. Prettier flagged every line of every file on a Windows checkout because the repository stores LF and git checks out CRLF; it now accepts the line ending a file arrives with\n`common.news` lists only the versions that actually exist on npm, so the changelog shown in the admin matches what can be installed\nInternal: the day difference of the \"every X days\" recurrence is computed from `getTime()` on both dates rather than subtracting the Date objects. Same result, without the implicit conversion",
|
|
79
105
|
"de": "Releases werden nun von CI erstellt und veröffentlicht, sobald ein Versions-Tag übertragen wird. Die Herkunft wird durch npm Trusted Publishing nachvollziehbar dokumentiert. Das Paket 0.3.0 wurde manuell veröffentlicht und ist daher nicht signiert. Der Repository-Checker meldet die Fehlercodes E2008 und E3032.\nDer Workflow folgt nun dem ioBroker-Standard: separate `check-and-lint`- und `adapter-tests`-Jobs, ein Trigger für `v*`-Tags, eine Concurrency Group pro Branch und ein `deploy`-Job, der auch das GitHub-Release erstellt. Adaptertests laufen auf Node 22 und 24 unter Linux, Windows und macOS anstatt nur unter Linux.\nDie Typüberprüfung der Adapterquellen (`tsconfig.json` auf `@tsconfig/node22`) erfolgt, wobei `lib/adapter-config.d.ts` die 29 Felder der Instanzkonfiguration deklariert. Daher wird ein Tippfehler in `adapter.config.<field>` sichtbar, anstatt stillschweigend `undefined` zu lesen.\n`npm run lint` ist wieder verwendbar. Prettier markierte zuvor jede Zeile jeder Datei bei einem Windows-Checkout, da das Repository LF speichert und Git CRLF auscheckt; nun akzeptiert es das Zeilenende, mit dem eine Datei ankommt.\n`common.news` listet nur die Versionen auf, die tatsächlich auf npm vorhanden sind, daher entspricht das im Adminbereich angezeigte Änderungsprotokoll dem, was installiert werden kann.\nIntern: Die Tagesdifferenz der Wiederholung „alle X Tage“ wird anhand von `getTime()` beider Datumsangaben berechnet, anstatt die Date-Objekte voneinander zu subtrahieren. Gleiches Ergebnis, ohne die implizite Konvertierung.",
|
|
@@ -112,22 +138,7 @@
|
|
|
112
138
|
"bind": "0.0.0.0",
|
|
113
139
|
"dateFormat": "",
|
|
114
140
|
"timeFormat": "24h",
|
|
115
|
-
"users": [
|
|
116
|
-
{
|
|
117
|
-
"name": "user1",
|
|
118
|
-
"displayName": "User 1",
|
|
119
|
-
"email": "",
|
|
120
|
-
"color": "#7E57C2",
|
|
121
|
-
"icon": "mdi:account"
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
"name": "user2",
|
|
125
|
-
"displayName": "User 2",
|
|
126
|
-
"email": "",
|
|
127
|
-
"color": "#26A69A",
|
|
128
|
-
"icon": "mdi:account"
|
|
129
|
-
}
|
|
130
|
-
],
|
|
141
|
+
"users": [],
|
|
131
142
|
"inboundTokens": [],
|
|
132
143
|
"outboundWebhooks": [],
|
|
133
144
|
"emailInstance": "email.0",
|
package/lib/cron.js
CHANGED
|
@@ -76,7 +76,7 @@ function parseField(raw, field) {
|
|
|
76
76
|
if (stepPart !== undefined) {
|
|
77
77
|
step = Number(stepPart);
|
|
78
78
|
if (!Number.isInteger(step) || step < 1) {
|
|
79
|
-
throw new Error(`${field.name}:
|
|
79
|
+
throw new Error(`${field.name}: invalid step '${stepPart}'`);
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
|
|
@@ -104,10 +104,10 @@ function parseField(raw, field) {
|
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
if (!Number.isInteger(from) || !Number.isInteger(to)) {
|
|
107
|
-
throw new Error(`${field.name}: '${piece}'
|
|
107
|
+
throw new Error(`${field.name}: '${piece}' is not a valid entry`);
|
|
108
108
|
}
|
|
109
109
|
if (from < field.min || to > field.max || from > to) {
|
|
110
|
-
throw new Error(`${field.name}: '${piece}'
|
|
110
|
+
throw new Error(`${field.name}: '${piece}' is outside ${field.min}-${field.max}`);
|
|
111
111
|
}
|
|
112
112
|
for (let v = from; v <= to; v += step) {
|
|
113
113
|
out.add(v);
|
|
@@ -137,7 +137,7 @@ function parseCron(expr) {
|
|
|
137
137
|
// Ausdruck ueber die token-freie Pruefroute den Event-Loop fuer Sekunden.
|
|
138
138
|
// Das laengste sinnvolle Muster (alle Monatsnamen) bleibt weit darunter.
|
|
139
139
|
if (raw.length > MAX_EXPR_LENGTH) {
|
|
140
|
-
throw new Error(`
|
|
140
|
+
throw new Error(`expression too long (at most ${MAX_EXPR_LENGTH} characters)`);
|
|
141
141
|
}
|
|
142
142
|
const parts = raw.split(/\s+/);
|
|
143
143
|
if (parts.length !== 5) {
|
package/lib/freeze.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Entscheidung, was beim Einfrieren der Benutzer-IDs zu tun ist.
|
|
5
|
+
*
|
|
6
|
+
* Die eigentliche Arbeit steckt im Adapter, hier steht nur die Entscheidung -
|
|
7
|
+
* sie ist der Teil, an dem der Fehler aus dem Abnahmetest (Befund 22) hing und
|
|
8
|
+
* der sich ohne laufenden ioBroker pruefen laesst.
|
|
9
|
+
*
|
|
10
|
+
* Hintergrund: Der Adapter schreibt beim Start das Merkmal `fixed` in die
|
|
11
|
+
* Benutzerliste der Instanz und startet dadurch einmal neu. Hat jemand die
|
|
12
|
+
* Instanzeinstellungen dabei offen, haelt sein Formular noch den Stand von
|
|
13
|
+
* vorher, und sein naechstes Speichern loescht das Merkmal wieder. Genau das
|
|
14
|
+
* ist der Normalfall beim Einrichten einer frischen Instanz.
|
|
15
|
+
*
|
|
16
|
+
* Deshalb mehrere Versuche statt eines einzigen. Eine wirklich kaputte
|
|
17
|
+
* Einstellungstabelle kostet dann `max` Neustarts, ein einmaliger Wettlauf
|
|
18
|
+
* heilt sich beim naechsten Start von selbst.
|
|
19
|
+
*
|
|
20
|
+
* Eingefroren wird nur, woran etwas haengt. Der Grund fuers Einfrieren sind
|
|
21
|
+
* Karten und Avatarbilder, die auf die Kennung zeigen; solange es keine gibt,
|
|
22
|
+
* ist eine Umbenennung harmlos. Das spart einer frisch eingerichteten Instanz
|
|
23
|
+
* den Rueckschreibvorgang und damit den Neustart, in dessen Fenster das
|
|
24
|
+
* Speichern im Admin verlorenging (A15).
|
|
25
|
+
*
|
|
26
|
+
* @param users Benutzerliste aus der Instanzkonfiguration
|
|
27
|
+
* @param versuche bisherige Versuche, das Merkmal zurueckzuschreiben
|
|
28
|
+
* @param max Hoechstzahl der Versuche
|
|
29
|
+
* @param benutzt Kennungen, an denen etwas haengt. Fehlt der Wert, gilt wie
|
|
30
|
+
* frueher jede Kennung als schuetzenswert.
|
|
31
|
+
* @returns `{ tun, offen, zuruecksetzen }` mit tun = 'nichts' | 'schreiben' | 'aufgeben'
|
|
32
|
+
*/
|
|
33
|
+
function freezePlan(users, versuche, max, benutzt) {
|
|
34
|
+
const liste = Array.isArray(users) ? users : [];
|
|
35
|
+
const zaehlt = benutzt instanceof Set ? n => benutzt.has(n) : () => true;
|
|
36
|
+
const offen = liste.filter(u => u && u.name && !u.fixed && zaehlt(u.name)).map(u => u.name);
|
|
37
|
+
if (!offen.length) {
|
|
38
|
+
// Nichts offen heisst: Der letzte Schreibversuch hat gehalten. Der
|
|
39
|
+
// Zaehler darf wieder bei null anfangen, damit ein spaeterer Verlust
|
|
40
|
+
// erneut volle Versuche bekommt.
|
|
41
|
+
return { tun: 'nichts', offen, zuruecksetzen: Number(versuche) > 0 };
|
|
42
|
+
}
|
|
43
|
+
if (Number(versuche) >= Number(max)) {
|
|
44
|
+
return { tun: 'aufgeben', offen, zuruecksetzen: false };
|
|
45
|
+
}
|
|
46
|
+
return { tun: 'schreiben', offen, zuruecksetzen: false };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Welche festgeschriebenen Kennungen noch gebraucht werden.
|
|
51
|
+
*
|
|
52
|
+
* Die Liste wuchs bisher nur. Wer einen Benutzer loeschte und spaeter einen
|
|
53
|
+
* neuen mit derselben Kennung anlegte, haette dessen ID-Feld von Anfang an
|
|
54
|
+
* gesperrt vorgefunden, obwohl an der Kennung nichts mehr haengt (B16).
|
|
55
|
+
*
|
|
56
|
+
* @param bekannt bisher festgeschriebene Kennungen
|
|
57
|
+
* @param users Benutzerliste aus der Instanzkonfiguration
|
|
58
|
+
* @returns `{ bleibt, faellt }`, beide in der Reihenfolge von `bekannt`
|
|
59
|
+
*/
|
|
60
|
+
function prunePlan(bekannt, users) {
|
|
61
|
+
const liste = Array.isArray(bekannt) ? bekannt.filter(n => typeof n === 'string' && n) : [];
|
|
62
|
+
const vorhanden = new Set((Array.isArray(users) ? users : []).map(u => u && u.name).filter(Boolean));
|
|
63
|
+
return {
|
|
64
|
+
bleibt: liste.filter(n => vorhanden.has(n)),
|
|
65
|
+
faellt: liste.filter(n => !vorhanden.has(n)),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
module.exports = { freezePlan, prunePlan };
|