Compare commits

...
1241 Commits
Author SHA1 Message Date
github-actions[bot] 289ff9fb17 Bump versions for v11.87 2026-09-19 16:23:58 +00:00
Lauri Ojansivu 6bfceb80d6 Prepare v11.87 release 2026-09-19 19:22:24 +03:00
Lauri Ojansivu d0d9195c1c Document notification delivery verification for #6658. 2026-09-19 16:07:36 +03:00
Lauri Ojansivu fd238d34c3 Verify muted-board fixes through actual SMTP delivery.
The muted-assignment fix in 4be77e7189 and scoped-subscription/settings fix in 03e8a6bf66 are already present. Add browser regressions that capture SMTP email for board, list and card watching, comments, title changes and new cards; verify muted assignments and member email opt-outs stay silent. Correct the channel settings guide and document delivery prerequisites and test setup.

Ten SMTP scenarios and six existing tray/settings scenarios passed across Chromium and Firefox against the current Meteor bundle with MongoDB. Focused recipient and notification Node suites passed. External inbox delivery and FerretDB runtime were not verified; the latest reported delivery failure was not reproduced.

Thanks to Nissulya and xet7 !

Fixes #6658,
2026-09-19 16:07:09 +03:00
Lauri Ojansivu c6763f496c Document clean task board features and complete regression checks. 2026-09-19 15:59:41 +03:00
Lauri Ojansivu 16b1b307fc Add cleaner task board presentation and date-only formats.
Add board controls for minicard collapse, labels above the title, checklist due dates and the outer checklist heading. Keep previously collapsed content accessible when its control is hidden, and preserve stored content and existing defaults.

Add personal and admin date-only formats across calendars and exports. Extend the existing smaller font presets with compact checklist and settings spacing. Cover persistence, permissions, layout and date behavior with unit and browser tests.

Thanks to xet7 !
2026-09-19 15:56:01 +03:00
Lauri Ojansivu e13fc2028a Document retired editor removal in Upcoming. 2026-09-19 14:33:52 +03:00
Lauri Ojansivu 5ed9fc944a Remove obsolete Summernote integration and editor configuration.
Use the Markdown textarea for every editor. Remove the retired environment and Snap options from server settings, all platform launchers, build scripts and current documentation. Keep released and archived changelog entries intact.

Keep notification HTML escaping independent of editor configuration, preserve attachment metadata and mention behavior, and cover Markdown and emoji round trips in browser tests. Also import the translator used by attachment error handlers.

Thanks to xet7 !
2026-09-19 14:32:29 +03:00
Lauri Ojansivu 43b0a8de1e Document audited usability fixes and issue regressions in Upcoming. 2026-09-19 14:02:16 +03:00
Lauri Ojansivu 896f1222bd Implement audited board usability and accessibility fixes.
Repair relative ordering and destination dialog lifecycles, retain failed operations, and make checklist, rule and attachment controls keyboard accessible. Improve scaled layouts and reuse canonical translated labels.

Add source-execution and Chromium/Firefox regression coverage, including awaiting background persistence before reload. Record implementation decisions and validation limits.

Thanks to xet7 !
2026-09-19 14:00:48 +03:00
Lauri Ojansivu 684411f139 Keep only the English proposed-fix audit. 2026-09-19 13:59:21 +03:00
Lauri Ojansivu 193c799539 Restore visible, selectable comment mention suggestions.
Initialize autocomplete once per editor, place its styled menu above card windows, and fall back to the textarea when Summernote is unavailable. Verify pointer and keyboard selection for password and LDAP account fixtures.

Thanks to bbyszio and xet7 !

Fixes #6704.
2026-09-19 13:26:08 +03:00
Lauri Ojansivu 337f601852 Restore card dragging after expanding collapsed lists.
Bind sortable initialization and reactive work to the replaceable list body, and clean it up on destruction. Cover repeated collapse, expansion, reload and drag permissions.

Thanks to Nich01asFox and xet7 !

Fixes #6705.
2026-09-19 13:26:08 +03:00
Lauri Ojansivu 0d9744bb8d Add Finnish translation of the proposed-fix audit.
Thanks to xet7 !
2026-09-19 13:26:08 +03:00
Lauri Ojansivu 4ec273068e Audit September 18 fix proposals against source and browser behavior. 2026-09-19 12:37:52 +03:00
Lauri Ojansivu 2dbf9c7f39 Clean up spacing in September 18 fixes report. 2026-09-19 12:23:34 +03:00
Lauri Ojansivu e693fe5212 Document Launchpad build recovery fixes and verification
Thanks to xet7 !
2026-09-18 20:09:31 +03:00
Lauri Ojansivu 29bd491e85 Fix Launchpad recovery, ref indexing and artifact downloads
Recover the project repository used for submission, retry recipe creation while Launchpad indexes main, and reject incomplete snaps before remote cleanup. Run the compatibility wrapper inside Snapcraft's own environment.

Verified all 1173 Node suites sequentially, workflow lint and script syntax. Regression coverage exercises delayed refs, unrelated errors, recovery paths, invalid downloads and launcher argument handling without remote writes.

Thanks to xet7 !
2026-09-18 20:08:50 +03:00
github-actions[bot] e1e64e92b4 Bump versions for v11.86 2026-09-18 04:39:23 +00:00
Lauri Ojansivu 566190a97e Prepare v11.86 release 2026-09-18 07:37:51 +03:00
Lauri Ojansivu 1c3bb8448b Document Snap recovery and attachment verification 2026-09-18 07:36:46 +03:00
Lauri Ojansivu bc5881ff90 Recover interrupted Snap builds and bound release attachments
The v11.85 logs show ARMHF failing during Launchpad polling after TLS EOF,
PPC64EL and S390X reaching the six-hour job cap while queued, and AMD64
successfully publishing to the Snap Store before its GitHub attachment hung.

Recover existing recipes before considering a new submission, and share one
five-hour waiter budget across attempts on every architecture. Prepare an
isolated complete source snapshot with Git metadata and logs outside the
project hash, and distinguish architectures so matrix recipes stay separate.
Move downloaded artifacts out before retrying recovery.

Bound GitHub snap attachments and verify remote names and sizes. Exercise
these paths with fixture repositories and mocked network commands, covering
TLS failures, absent recipes, denied credentials, queue timeouts, invalid
artifacts and failed uploads. Workflow parsing, shell syntax and Actionlint
pass. The full 1,172 Node suite sweep is verified with corrected guards rerun.
Live remote builds and publishing have not been run.

Thanks to xet7 !
2026-09-18 07:36:20 +03:00
github-actions[bot] 1657a96943 Bump versions for v11.85 2026-09-17 15:17:56 +00:00
Lauri Ojansivu ee4eeedaa2 Prepare v11.85 release 2026-09-17 18:16:04 +03:00
Lauri Ojansivu 20b7dd33fa Merge remote-tracking branch 'origin/main' 2026-09-17 18:15:42 +03:00
Lauri Ojansivu 53a23258cf Document the global date format setting and verification 2026-09-17 18:14:28 +03:00
Lauri Ojansivu 46607d4299 Add an admin date format override for everyone
Place the global date format checkbox and selector between Board member
list and Wait Spinner in Visibility settings. While enabled, use the
selected format for members and guests, call the card section Date and
hide its personal format selector. Preserve personal preferences so they
return when the override is disabled.

Apply the same policy to date displays, filter parsing and browser export
requests. Validate supported formats and retain admin-only settings writes.
Add positive, negative and browser regression coverage and document the
setting. Translate the new label without changing existing translations.

Lower-confidence new translations include Acehnese, Aymara, Cherokee,
Inuktitut, Kashmiri, Nahuatl, Veps, Volapuk and Wolaytta; native-speaker
review would improve these labels.

Thanks to Mathia2 and xet7 !

Fixes #6703,
2026-09-17 18:13:20 +03:00
github-actions[bot] 4f5013ec48 Bump versions for v11.84 2026-09-17 14:04:58 +00:00
Lauri Ojansivu e2993617bc Prepare v11.84 release 2026-09-17 17:02:52 +03:00
Lauri Ojansivu f297cd989b Document the My Cards and My Attachments popup fix
Thanks to Mathia2 and xet7 !
2026-09-17 16:33:31 +03:00
Lauri Ojansivu d01b3a3d92 Open the selected card from My Cards and My Attachments
Bind card and board identifiers explicitly on links rendered under lexical each loops. Open the subscribed card popup from the link rather than the unrelated outer Blaze data context, while preserving modified-click navigation.

Regression tests cover outer-context mismatch, nested click targets, missing identifiers, modified clicks, and sequential card popup selection on both pages. The fresh bundle passes both page regressions in Chromium, Firefox and WebKit using polling reactivity.

Thanks to Mathia2 and xet7 !

Fixes #6702,
2026-09-17 16:32:53 +03:00
Lauri Ojansivu 4c1bcca5f7 Document verified translation repair and card visibility guard fixes
Thanks to xet7 !
2026-09-17 14:21:01 +03:00
Lauri Ojansivu 5dd0b11f7c Keep translation repairs and card visibility guards aligned with reviewed changes
Preserve the newer Traditional Chinese wording in historical repair records. Locate the card read-only branch by its matching conditional rather than fixed indentation after optional field grouping.

Verified all 1169 Node suites pass, translation pull/fill protection passes, and missing requester or assigner avatars still fail the repaired guard.

Thanks to xet7 !
2026-09-17 14:20:35 +03:00
Lauri Ojansivu d23e666aec Document verified issue fixes and the remaining login investigation.
Record notification, empty-card-section, WIP-group and duplicate-checklist fixes with their regression coverage. Link the tested FerretDB oplog changes and retain #6701 in TODO Later until the affected snap's database is confirmed. Verify the exact resumed user in the session regression.

Thanks to Nissulya, fabiosalles, Mahgozar, rmb82 and xet7 !
2026-09-17 13:47:31 +03:00
Lauri Ojansivu fd41207c54 Cover LDAP session restoration around large directory changes.
Resume an LDAP account with 1600 directory users, verify reloads before and after a bulk deletion, keep the directory out of client publications, and reject invalid cookies. The test passes against MongoDB and patched FerretDB; retain #6701 pending confirmation of the reported deployment's backend.

Thanks to Nissulya and xet7 !

Refs #6701,
2026-09-17 13:44:10 +03:00
Lauri Ojansivu 783733623e Authorize and persist edits to saved WIP limit groups.
Route group edits through a validated server method with board/site-admin authorization. Compare the saved group array before updating so concurrent edits are not overwritten and database backends need no positional array update. Unit and Chromium tests cover editing, invalid lists and limits, and unauthorized users.

Thanks to Mahgozar and xet7 !

Fixes #6699,
2026-09-17 13:43:01 +03:00
Lauri Ojansivu 762e742b24 Verify muted-board and explicit-list notification delivery.
Check the persisted profile notification array and exercise comments delivered to explicit list subscribers on otherwise muted boards.

Thanks to Nissulya and xet7 !

Fixes #6658,
2026-09-17 13:34:50 +03:00
Lauri Ojansivu 5c9e5045f8 Preserve checklist insert validation while awaiting submission.
Keep the existing client insert path, wait for its server callback, and retain the editor on failure. Verified click, Enter and Ctrl+Enter creation and persistence in Chromium, plus duplicate-submit and retry unit tests.

Thanks to rmb82 and xet7 !

Fixes #6700,
2026-09-17 13:34:50 +03:00
Lauri Ojansivu 0a8ee08d56 Submit checklist creation once per user action.
Stop handled Enter events before the enclosing checklist submits them again. Await the insert, scope the textarea to its form, and reject duplicate submits while the write is pending. Keep failed edits available for retry.

Thanks to rmb82 and xet7 !

Fixes #6700,
2026-09-17 13:12:32 +03:00
Lauri Ojansivu 87d69358dc Make WIP group list checkboxes visible and editable.
Restore native checkbox visibility and keyboard interaction inside the WIP group editor, and resolve list rows through the template helper when editing saved groups.

Thanks to Mahgozar and xet7 !

Fixes #6699,
2026-09-17 13:08:06 +03:00
Lauri Ojansivu 5c7f455285 Hide empty card field groups and their separators.
Render Dates, Members and Sort groups only when their fields can display content. Keep a group when any independently enabled field remains visible.

Thanks to fabiosalles and xet7 !

Fixes #6696,
2026-09-17 13:07:01 +03:00
Lauri Ojansivu 03e8a6bf66 Honor scoped notification subscriptions and settings.
Keep muted board assignments silent while honoring explicit list and card subscriptions. Resolve notification controls against their owning settings scope and show the selected option.

Thanks to Nissulya and xet7 !

Fixes #6658,
2026-09-17 13:05:45 +03:00
Lauri Ojansivu 959f15cbe0 Merge pull request #6697 from AmigaAbattoir/patch-1
fix(docs): images missing in multiple lines to checklist page
2026-09-16 21:52:36 +03:00
Christopher Pollati d87ec3954b fix(docs): images missing in multiple lines to checklist page 2026-09-16 10:26:41 -04:00
github-actions[bot] 97f74ea3b5 Bump versions for v11.83 2026-09-15 23:48:36 +00:00
Lauri Ojansivu 278f7b869a Prepare v11.83 release 2026-09-16 02:47:17 +03:00
Lauri Ojansivu e71e20036c Merge remote-tracking branch 'origin/main' 2026-09-16 02:47:00 +03:00
Lauri Ojansivu 9aeeac51a8 Bring upcoming changelog into release format 2026-09-16 02:38:41 +03:00
Lauri Ojansivu 522a7e88e8 Document custom logo loading and uploads in upcoming changelog 2026-09-16 02:26:43 +03:00
Lauri Ojansivu 593cab5911 Load configured logos without stock logo flash and allow uploads 2026-09-16 02:26:25 +03:00
Lauri Ojansivu a4eda40c89 Document live-only mirror links in upcoming changelog 2026-09-16 02:07:37 +03:00
Lauri Ojansivu f7da598ad2 Stop using archive.org for mirror linked files 2026-09-16 02:07:22 +03:00
github-actions[bot] f32a0f7e10 Bump versions for v11.82 2026-09-15 22:40:21 +00:00
Lauri Ojansivu e478ce7309 Prepare v11.82 release 2026-09-16 01:38:35 +03:00
Lauri Ojansivu f60df9b0be Merge remote-tracking branch 'origin/main' 2026-09-16 01:38:07 +03:00
Lauri Ojansivu b68dd01893 Document release preflight and keep changelog checks current 2026-09-16 01:37:35 +03:00
Lauri Ojansivu 7489120eb9 Validate translation languages before release tagging 2026-09-16 01:35:55 +03:00
github-actions[bot] f238c02af7 Bump versions for v11.81 2026-09-15 22:23:51 +00:00
Lauri Ojansivu 3ecc62c960 Prepare v11.81 release 2026-09-16 01:22:26 +03:00
Lauri Ojansivu 5e951845eb Update Upcoming WeKan changelog for recent fixes 2026-09-16 01:17:08 +03:00
Lauri Ojansivu 3865c3fdea Avoid incomplete escaping in Veps sync test 2026-09-16 01:10:05 +03:00
Lauri Ojansivu 8acf5d947d Preserve PR 6695 human translations across pull and push 2026-09-16 01:07:00 +03:00
Lauri Ojansivu c399aeeee6 Protect PR 6695 human translations from machine fills 2026-09-16 01:04:06 +03:00
Lauri Ojansivu 2078c21819 Merge pull request #6695 from l10n-tw/main
Replace zh-Hant and zh-TW translations with Transifex ones
2026-09-16 01:01:44 +03:00
Lauri Ojansivu 25ed0c3067 Keep local Docker build available during Quay outages 2026-09-16 00:58:35 +03:00
Lauri Ojansivu 0e962bba3f Record interrupted translation audit status 2026-09-16 00:54:14 +03:00
Lauri Ojansivu 99570e213f Serve Admin Panel assetlinks at well-known URL 2026-09-16 00:51:35 +03:00
Lauri Ojansivu 1cf93f7e52 Distinguish native Tamazight card and list URL labels 2026-09-15 15:54:57 +03:00
Lauri Ojansivu bfac55c30c Record dated board and card translation audit progress 2026-09-15 15:52:25 +03:00
Lauri Ojansivu 18a11d1210 Replace Arabic and French Tamazight board and card labels 2026-09-15 15:51:48 +03:00
Lauri Ojansivu 77d574a627 Record dated Tamazight version-check audit progress 2026-09-15 15:49:32 +03:00
Lauri Ojansivu ff5a286b53 Replace mixed Tamazight version-check messages 2026-09-15 15:48:22 +03:00
Lauri Ojansivu cf14bd7db9 Record dated Tamazight version terminology progress 2026-09-15 15:46:44 +03:00
Lauri Ojansivu 413b4ef405 Use native Tamazight version noun in Admin Panel 2026-09-15 15:46:05 +03:00
Lauri Ojansivu 7da3334c47 Record dated Tamazight shared-label repair progress 2026-09-15 15:42:18 +03:00
Lauri Ojansivu 63da3d3c97 Reuse native Tamazight labels in shared UI controls 2026-09-15 15:41:26 +03:00
Lauri Ojansivu 1cf705484e Record Tamazight popup audit progress 2026-09-15 15:28:59 +03:00
Lauri Ojansivu e11a2654c7 Align Arabic Tamazight popup labels with native controls 2026-09-15 15:27:09 +03:00
Lauri Ojansivu 1405047ba7 Record Tamazight noun audit progress and source evidence 2026-09-15 15:24:39 +03:00
Lauri Ojansivu 2b22dd0bef Replace Arabic Tamazight common nouns with native labels 2026-09-15 15:23:19 +03:00
Lauri Ojansivu 3447011b4d Record successful sequential EVERYTHING verification 2026-09-15 15:17:51 +03:00
Lauri Ojansivu 7a37811883 Record browser matrix and Firefox avatar fixture repair 2026-09-15 13:57:45 +03:00
Lauri Ojansivu 66c5b85c30 Use a valid PNG in legacy avatar browser coverage 2026-09-15 13:57:26 +03:00
Lauri Ojansivu 7b5dd6549d Document sequential board title viewer coverage 2026-09-15 12:59:21 +03:00
Lauri Ojansivu 929326ba22 Exercise board title viewers through visible controls
Activate the card link instead of its date badge and open the Board View popup before choosing timeline, chart and Gantt views. The complete 24-case Chromium title suite passes sequentially.
2026-09-15 12:58:07 +03:00
Lauri Ojansivu 56f04dcab7 Guard external link autolink sync against repeated renders
Update the regression check to require one value-guarded ReactiveVar setter shared by the viewer and startup autorun. The focused external-link suite now passes all 24 tests.
2026-09-15 12:20:06 +03:00
Lauri Ojansivu 128e482d7a Document browser and markdown repairs in Upcoming release 2026-09-15 12:12:08 +03:00
Lauri Ojansivu fb66fa95cf Repair browser test flows and Meteor markdown package exports
Expose the renderer through a Meteor main module, synchronize security settings without repeated reactive invalidation, and route canonical avatar downloads around the automatic Meteor-Files handler. Update browser tests for the visible Board View and list menus, correct fixture IDs and authentication headers, and wait for the settings publication where direct Mongo updates are used.
2026-09-15 12:10:40 +03:00
Lauri Ojansivu 0ebfe1d775 Record security reporting and node regression repairs 2026-09-15 10:36:01 +03:00
Lauri Ojansivu c4c6e34ec4 Repair node regressions and align security problem names 2026-09-15 10:35:31 +03:00
Lauri Ojansivu 9b49eb1c43 Document Docker outage handling and repair language test harness 2026-09-15 10:16:14 +03:00
Lauri Ojansivu e6685eb0b4 Keep Docker publication available during Quay read-only outages 2026-09-15 10:12:39 +03:00
Lauri Ojansivu 0134b39520 Record Tamazight popup title audit progress 2026-09-15 10:12:19 +03:00
Lauri Ojansivu 79e5a93b42 Repair Tamazight common popup titles 2026-09-15 10:09:27 +03:00
Lauri Ojansivu 0b7606194e Record Tamazight Unset context audit progress 2026-09-15 10:04:49 +03:00
Lauri Ojansivu f0ceb8d72b Separate translated removal actions from Unset status 2026-09-15 10:04:08 +03:00
Lauri Ojansivu 0b2cc01e6f Record Tamazight board popup audit progress 2026-09-15 09:58:53 +03:00
Lauri Ojansivu 87c0495710 Repair Tamazight board and color popup titles 2026-09-15 09:58:15 +03:00
Lauri Ojansivu 0539ac8a23 Merge remote-tracking branch 'origin/main' 2026-09-15 09:55:38 +03:00
Lauri Ojansivu 6de53fb0c1 Record Tamazight board background audit progress 2026-09-15 09:55:12 +03:00
Lauri Ojansivu 79d58098f4 Repair Tamazight board background controls 2026-09-15 09:54:38 +03:00
Lauri Ojansivu 8922a87f2a Record Tamazight activity audit progress 2026-09-15 09:52:17 +03:00
Lauri Ojansivu ada7e35333 Repair Tamazight activity messages using UI meanings 2026-09-15 09:51:39 +03:00
Lauri Ojansivu 1990e60396 Record Tamazight admin status audit progress 2026-09-15 09:49:06 +03:00
Lauri Ojansivu f10daf2ae9 Repair Tamazight admin activity status labels 2026-09-15 09:48:29 +03:00
Lauri Ojansivu 987c5c22b5 Record Tamazight filter and sort audit progress 2026-09-15 09:47:07 +03:00
Lauri Ojansivu 65c6674196 Repair Tamazight filter and sort control labels 2026-09-15 09:46:20 +03:00
Lauri Ojansivu a58c572961 Record Tamazight creator-label audit progress 2026-09-15 09:44:15 +03:00
Lauri Ojansivu bea96680ee Repair Tamazight creator labels in filters and minicards 2026-09-15 09:43:31 +03:00
Lauri Ojansivu f30c32e897 Record Tamazight search predicate audit progress 2026-09-15 09:41:33 +03:00
Lauri Ojansivu 32c2d95756 Repair Tamazight search predicates and protect syntax keywords 2026-09-15 09:38:45 +03:00
Lauri Ojansivu fc2a8da2c8 Record Tamazight search syntax audit progress 2026-09-15 09:32:43 +03:00
Lauri Ojansivu c365e2cf6a Repair Tamazight search operator names and aliases 2026-09-15 09:31:43 +03:00
Lauri Ojansivu 278ca10a0f Record Tamazight board label repairs and Arabic-script queue 2026-09-15 09:27:31 +03:00
Lauri Ojansivu d1c4a7290a Replace Arabic and French Tamazight board labels 2026-09-15 09:26:37 +03:00
Lauri Ojansivu f851f409d7 Record Tamazight sky and metal-color audit progress 2026-09-15 09:23:34 +03:00
Lauri Ojansivu e114ffde89 Replace Tamazight sky and metal-color seeds 2026-09-15 09:22:50 +03:00
Lauri Ojansivu 5fcd43df39 Record Tamazight color repairs and remaining plural review 2026-09-15 09:20:42 +03:00
Lauri Ojansivu 06678678d0 Replace Arabic and French Tamazight color labels 2026-09-15 09:19:58 +03:00
Lauri Ojansivu 3ed7dd3761 Record Tamazight email-address repair and plural review 2026-09-15 09:14:58 +03:00
Lauri Ojansivu ce50929661 Replace French Tamazight email-address placeholder 2026-09-15 09:14:13 +03:00
Lauri Ojansivu a43727f0bc Record Tigre slate-blue review and reconcile overlap counts 2026-09-15 09:10:49 +03:00
Lauri Ojansivu 6f14c9a8c6 Repair Tigre slate-blue component 2026-09-15 09:09:19 +03:00
Lauri Ojansivu 59a7261e33 Record Tigre dark-green audit progress 2026-09-15 09:06:57 +03:00
Lauri Ojansivu de0cc0ce45 Repair copied Tigre dark-green translation 2026-09-15 09:05:50 +03:00
Lauri Ojansivu 10fff07af3 Record dated Tigre transport corpus audit 2026-09-15 09:00:19 +03:00
Jeff Huang 460263f21b Replace zh-Hant and zh-TW translations with Transifex ones 2026-09-15 14:00:08 +08:00
Lauri Ojansivu ae76ba79d0 Use corpus Tigre noun for DDP transport 2026-09-15 08:58:45 +03:00
Lauri Ojansivu 23b77ed14a Reconcile translation audit summary after width repairs 2026-09-15 08:54:31 +03:00
Lauri Ojansivu f4097bfda1 Record dated final width-rule translation audit 2026-09-15 08:53:36 +03:00
Lauri Ojansivu 31a238d91b Correct Cherokee and Wolaytta list-width bounds 2026-09-15 08:52:54 +03:00
Lauri Ojansivu 4ac8c5d129 Record dated Xitsonga translation audit 2026-09-15 08:49:12 +03:00
Lauri Ojansivu 21319c523d Replace corrupt Tsonga list-width seeds 2026-09-15 08:48:42 +03:00
Lauri Ojansivu c95017d560 Record dated Aymara Quechua translation audit 2026-09-15 08:47:12 +03:00
Lauri Ojansivu 83c8d0c2bb Repair Aymara and Quechua list-width strings 2026-09-15 08:46:36 +03:00
Lauri Ojansivu 04df435baf Record dated Hawaiian Klingon Inuktitut audit 2026-09-15 08:43:38 +03:00
Lauri Ojansivu c18780d5bd Correct three more native list-width bounds 2026-09-15 08:43:08 +03:00
Lauri Ojansivu 4e67398440 Record dated three-locale width repair audit 2026-09-15 08:41:11 +03:00
Lauri Ojansivu bb2d2dfebe Correct three native list-width minimum messages 2026-09-15 08:40:38 +03:00
Lauri Ojansivu 0bd8f32316 Record dated Serbian and regional translation audit progress 2026-09-15 08:35:55 +03:00
Lauri Ojansivu beddec7cb9 Repair Serbian list-width controls and four locale rules 2026-09-15 08:35:09 +03:00
Lauri Ojansivu 77cf4af47e Record dated wrong-language translation audit progress 2026-09-15 08:31:00 +03:00
Lauri Ojansivu 3eaeac9e7e Repair ten wrong-language and obsolete list-width values 2026-09-15 08:29:49 +03:00
Lauri Ojansivu e855bb7ede Record dated native-minimum translation audit progress 2026-09-15 08:25:37 +03:00
Lauri Ojansivu 92ea2a0f0c Repair ten native list-width minimum translations 2026-09-15 08:25:01 +03:00
Lauri Ojansivu 91555657e2 Record dated ten-locale translation audit progress 2026-09-15 08:21:53 +03:00
Lauri Ojansivu 9c1388a496 Repair ten native and mixed-seed list-width values 2026-09-15 08:21:00 +03:00
Lauri Ojansivu 376ecf3043 Record dated nine-locale translation audit progress 2026-09-15 08:18:23 +03:00
Lauri Ojansivu 3bf6a4c821 Repair nine African and Pacific list-width translations 2026-09-15 08:17:46 +03:00
Lauri Ojansivu bf18a5b737 Record dated list-width audit progress for twelve locales 2026-09-15 08:15:04 +03:00
Lauri Ojansivu 74e6deabe8 Repair twelve African, Kurdish and Yiddish list-width translations 2026-09-15 08:14:26 +03:00
Lauri Ojansivu e20321100b Record Asian-script list-width audit progress on 2026-09-15 2026-09-15 08:08:37 +03:00
Lauri Ojansivu 8cc659ac92 Repair 24 Asian list-width locale values and progress gates 2026-09-15 08:07:38 +03:00
Lauri Ojansivu 217dd1e3df Record Romance and Celtic audit progress on 2026-09-15 2026-09-15 08:02:49 +03:00
Lauri Ojansivu 0fe4ecb480 Repair twenty Romance and Celtic list-width meanings 2026-09-15 08:02:03 +03:00
Lauri Ojansivu d0388a2c0e Record Eurasian list-width audit progress on 2026-09-15 2026-09-15 07:57:31 +03:00
Lauri Ojansivu 6d94f4edb4 Repair 28 locale list-width rules and update regression gates 2026-09-15 07:56:49 +03:00
Lauri Ojansivu 17d3a34054 Record Chinese variant audit progress on 2026-09-15 2026-09-15 07:52:18 +03:00
Lauri Ojansivu 0b0349d34d Repair Chinese variant list-width rules in eleven locales 2026-09-15 07:51:42 +03:00
Lauri Ojansivu 7bf55675f6 Record native lower-bound audit progress on 2026-09-15 2026-09-15 07:48:52 +03:00
Lauri Ojansivu 212a46c078 Repair 33 native list-width rules and align Galician archive check 2026-09-15 07:48:17 +03:00
Lauri Ojansivu 0fdeaf7994 Record multilingual list-width audit progress on 2026-09-15 2026-09-15 07:44:58 +03:00
Lauri Ojansivu d6e6c558d6 Repair 22 multilingual list-width validation translations 2026-09-15 07:44:00 +03:00
Lauri Ojansivu 3a6463541c Record German and Romance list-width translation repairs 2026-09-15 07:38:28 +03:00
Lauri Ojansivu e6895b3dee Repair Romance and German list-width validation translations 2026-09-15 07:37:31 +03:00
Lauri Ojansivu 49a0654bd1 Document Persian-digit list-width repairs 2026-09-15 07:35:35 +03:00
Lauri Ojansivu 196bc49df9 Repair Persian-digit list-width messages 2026-09-15 07:34:12 +03:00
Lauri Ojansivu c249bacaa2 Record list-width source mismatch and locale repair queue 2026-09-15 07:32:39 +03:00
Lauri Ojansivu 68d679c6c7 Align list-width validation and source translations with 200px minimum 2026-09-15 07:30:40 +03:00
Lauri Ojansivu 8bf19dada2 Document Tigre Trello and S3 plural repair 2026-09-15 07:23:24 +03:00
Lauri Ojansivu 6909fb85e7 Repair Tigre Trello key terminology and S3 file plural 2026-09-15 07:22:09 +03:00
Lauri Ojansivu 99e0121b0e Document Tigre PDF preview translation review 2026-09-15 07:17:34 +03:00
Lauri Ojansivu 78f2c9bf78 Repair Tigre PDF preview warning copied from Tigrinya 2026-09-15 07:16:11 +03:00
Lauri Ojansivu e24a4fe717 Document Tigre authentication error review 2026-09-15 07:14:24 +03:00
Lauri Ojansivu 36c2148ecb Repair Tigre authentication error copied from Tigrinya 2026-09-15 07:12:31 +03:00
Lauri Ojansivu 7030814546 Record Tigre S3 translation audit progress 2026-09-15 07:10:05 +03:00
Lauri Ojansivu 970d9e664b Fill Tigre S3 settings English placeholders 2026-09-15 07:08:17 +03:00
Lauri Ojansivu 3d8b41be8c Document Tamazight due-reminder activity repair 2026-09-15 07:04:46 +03:00
Lauri Ojansivu 780a75a2bb Repair French Tamazight due-reminder activity 2026-09-15 07:04:00 +03:00
Lauri Ojansivu d140ac347f Document corpus-attested Tigre plural follow-up 2026-09-15 06:59:29 +03:00
Lauri Ojansivu 5d53aa9904 Correct provisional Tigre plurals using corpus evidence 2026-09-15 06:58:48 +03:00
Lauri Ojansivu 95a3a4baff Document Tigre Star and Break repairs 2026-09-15 06:54:02 +03:00
Lauri Ojansivu 009d7f8329 Repair Tigre star and break terms and refresh reviewed tests 2026-09-15 06:53:22 +03:00
Lauri Ojansivu f4dd67eb3b Document Tigre Endpoint meaning repair 2026-09-15 06:48:18 +03:00
Lauri Ojansivu 6b78c88cb9 Repair Tigre Endpoint terminology 2026-09-15 06:47:45 +03:00
Lauri Ojansivu c450740d78 Document Tigre exact control reviews 2026-09-15 06:46:53 +03:00
Lauri Ojansivu 0eac733cdb Repair corpus-supported Tigre exact controls 2026-09-15 06:45:57 +03:00
Lauri Ojansivu 0f9f13d1d9 Document missed Tigre organizations repair 2026-09-15 06:44:49 +03:00
Lauri Ojansivu 0ef3ca6dd6 Repair missed Tigre organizations control 2026-09-15 06:44:21 +03:00
Lauri Ojansivu 238e331278 Document full Tigre noun family repairs 2026-09-15 06:43:26 +03:00
Lauri Ojansivu 08e7092c36 Repair established Tigre noun families throughout 2026-09-15 06:42:10 +03:00
Lauri Ojansivu d954922c90 Document full Tigre board and card cleanup 2026-09-15 06:38:45 +03:00
Lauri Ojansivu 83546ed248 Repair Tigre board and card terms throughout 2026-09-15 06:37:59 +03:00
Lauri Ojansivu b30134be78 Document Tigre short control repairs 2026-09-15 06:34:26 +03:00
Lauri Ojansivu 40a20207bd Repair Tigre short interface controls 2026-09-15 06:33:45 +03:00
Lauri Ojansivu 4e09c23b21 Document additional Tigre interface repairs 2026-09-15 06:32:18 +03:00
Lauri Ojansivu 088b01587f Repair additional Tigre interface terms 2026-09-15 06:31:27 +03:00
Lauri Ojansivu 828800a301 Document second Tigre ledger reuse pass 2026-09-15 06:29:02 +03:00
Lauri Ojansivu 45a568aea7 Reuse reviewed Tigre terms in remaining controls 2026-09-15 06:28:06 +03:00
Lauri Ojansivu 2fa5a88449 Document Tigre edit and template repairs 2026-09-15 06:25:39 +03:00
Lauri Ojansivu e50072bc32 Repair Tigre edit and template terms 2026-09-15 06:24:01 +03:00
Lauri Ojansivu 876d879596 Document embedded Tigre terminology repairs 2026-09-15 06:22:22 +03:00
Lauri Ojansivu eb1add1f21 Repair embedded Tigre account storage and description terms 2026-09-15 06:21:31 +03:00
Lauri Ojansivu 79b144ae76 Document Tigre account storage and template repairs 2026-09-15 06:19:12 +03:00
Lauri Ojansivu 8296c12a57 Repair Tigre account storage and template terms 2026-09-15 06:17:14 +03:00
Lauri Ojansivu 9173c62599 Document remaining Tigre card repairs 2026-09-15 06:14:14 +03:00
Lauri Ojansivu c73362aae6 Repair remaining Tigre card terms 2026-09-15 06:13:23 +03:00
Lauri Ojansivu b0fd098cea Document Tigre outcome and account repairs 2026-09-15 06:11:46 +03:00
Lauri Ojansivu c91e56a504 Repair Tigre outcome and account terms 2026-09-15 06:10:55 +03:00
Lauri Ojansivu 1ae4305237 Document Tigre date and time repairs 2026-09-15 06:09:49 +03:00
Lauri Ojansivu 0896117b5a Repair Tigre date and time terms 2026-09-15 06:08:58 +03:00
Lauri Ojansivu 4a8323c96f Document Tigre noun repairs 2026-09-15 06:07:42 +03:00
Lauri Ojansivu 242c1f27ba Repair Tigre label organization and team terms 2026-09-15 06:06:53 +03:00
Lauri Ojansivu b658832f59 Document repeated Tigre component repairs 2026-09-15 06:05:39 +03:00
Lauri Ojansivu 8b6c21ff90 Repair repeated Tigre interface components 2026-09-15 06:04:49 +03:00
Lauri Ojansivu 7e49057262 Document Tigre board repairs 2026-09-15 06:02:56 +03:00
Lauri Ojansivu 1196bebaab Repair Tigre board terms 2026-09-15 06:02:01 +03:00
Lauri Ojansivu 79708827c7 Document Tigre file-clause repairs 2026-09-15 06:00:37 +03:00
Lauri Ojansivu 71a15613c7 Repair Tigre file terms in longer clauses 2026-09-15 05:59:48 +03:00
Lauri Ojansivu f81c9ab58f Document Tigre card and file repairs 2026-09-15 05:58:49 +03:00
Lauri Ojansivu 8560f3d7c2 Repair Tigre card and file terms 2026-09-15 05:58:06 +03:00
Lauri Ojansivu b0bef07079 Document shared Tigre plural review 2026-09-15 05:55:59 +03:00
Lauri Ojansivu a69ed23251 Retain attested Tigre account and error plurals 2026-09-15 05:55:23 +03:00
Lauri Ojansivu a56cccfeb3 Document multi-component Tigre repairs 2026-09-15 05:54:08 +03:00
Lauri Ojansivu f64f9c98d3 Repair multi-component Tigre labels 2026-09-15 05:52:49 +03:00
Lauri Ojansivu 4a25311bf7 Document compact Tigre repairs 2026-09-15 05:47:59 +03:00
Lauri Ojansivu fc61397455 Repair compact Tigre terminology 2026-09-15 05:47:17 +03:00
Lauri Ojansivu edb736acf0 Document Tigre name repairs 2026-09-15 05:43:52 +03:00
Lauri Ojansivu 002f8bc7bb Repair Tigre name controls 2026-09-15 05:43:11 +03:00
Lauri Ojansivu fcc461b156 Document Tigre import repairs 2026-09-15 05:41:32 +03:00
Lauri Ojansivu b8bbd8fa39 Repair Tigre import controls 2026-09-15 05:40:52 +03:00
Lauri Ojansivu 69c1145a87 Document reused Tigre terms 2026-09-15 05:39:29 +03:00
Lauri Ojansivu 22615501d1 Reuse reviewed Tigre interface terms 2026-09-15 05:38:51 +03:00
Lauri Ojansivu 46cccccd3a Document Tigre selection repairs 2026-09-15 05:37:13 +03:00
Lauri Ojansivu a6dd320fd2 Repair Tigre selection controls 2026-09-15 05:36:33 +03:00
Lauri Ojansivu d73a200439 Document Tigre date repairs 2026-09-15 05:35:04 +03:00
Lauri Ojansivu a03aa027cb Repair Tigre date controls 2026-09-15 05:33:22 +03:00
Lauri Ojansivu d44beb0228 Document Tigre member compound repairs
Record reused corpus evidence, residual overlap, limitations and regression coverage for seven corrected member controls.\n\nThanks to xet7 !
2026-09-15 05:28:28 +03:00
Lauri Ojansivu 284fcff144 Repair Tigre member compounds
Use the explicit Tigre Member and Members pair across seven board, filter, selection and rule controls. Reuse reviewed Tigre control terms and add former-seed coverage.\n\nThanks to xet7 !
2026-09-15 05:27:54 +03:00
Lauri Ojansivu d39930eb77 Document ledger-grounded Tigre repairs
Record the reused evidence, residual overlap, limitations and regression coverage for 17 corrected Tigre compounds.\n\nThanks to xet7 !
2026-09-15 05:25:10 +03:00
Lauri Ojansivu 0651f745bc Repair Tigre interface compounds
Replace 17 compact Tigrinya-seeded controls using only independently reviewed Tigre ledger terms. Add exact and former-seed regression coverage.\n\nThanks to xet7 !
2026-09-15 05:24:37 +03:00
Lauri Ojansivu 387e10980e Document Tigre speed and storage repairs
Record corpus and native-interface evidence, residual overlap and regression coverage for four corrected controls.\n\nThanks to xet7 !
2026-09-15 05:21:32 +03:00
Lauri Ojansivu b8ebfc67e3 Repair Tigre speed and storage terms
Replace Tigrinya-specific Speed and Storage spellings with forms attested in the Tigre corpus and native Tigre Wikidata interface. Add exact and former-seed coverage.\n\nThanks to xet7 !
2026-09-15 05:20:58 +03:00
Lauri Ojansivu 194f4556aa Document Tigre interface action repairs
Record corpus evidence, residual overlap, limitations and regression coverage for the Font, Invite and permissions controls.\n\nThanks to xet7 !
2026-09-15 05:20:07 +03:00
Lauri Ojansivu e4ae5173fc Repair Tigre interface actions
Use corpus-grounded Tigre terms across seven Font, Invite People and Change permissions controls. Add exact and former-seed regression coverage.\n\nThanks to xet7 !
2026-09-15 05:19:35 +03:00
Lauri Ojansivu 4a26ff5412 Document Tigre visual repairs
Record corpus evidence, residual overlap, limitations and regression coverage for the repaired Rename and board-background controls.\n\nThanks to xet7 !
2026-09-15 05:17:49 +03:00
Lauri Ojansivu f1b12cc668 Repair Tigre visual controls
Use corpus-attested Tigre name, change, image and background terms across eight Rename and board-background controls. Add exact and former-seed regression coverage.\n\nThanks to xet7 !
2026-09-15 05:17:15 +03:00
Lauri Ojansivu c0f430b0b3 Document Tigre status repairs
Record the evidence, residual overlap count, limitations and regression coverage for eight repaired Tigre status controls.\n\nThanks to xet7 !
2026-09-15 05:15:49 +03:00
Lauri Ojansivu b4586ba970 Repair Tigre status controls
Use corpus-attested Tigre terms across eight Overall progress, CPU usage, Card loading and Remaining time controls. Preserve CPU and add exact former-seed coverage.\n\nThanks to xet7 !
2026-09-15 05:15:16 +03:00
Lauri Ojansivu 33300f303e Add Tigre severity repair to changelog
Record the three corrected Severity controls in the upcoming WeKan release.\n\nThanks to xet7 !
2026-09-15 05:13:52 +03:00
Lauri Ojansivu c59789dfb5 Document Tigre severity repairs
Record the contradicted weight sense, replacement evidence, low-confidence compound limitation and residual overlap count.\n\nThanks to xet7 !
2026-09-15 05:13:39 +03:00
Lauri Ojansivu e27abadf67 Repair Tigre severity controls
Replace the misleading physical-weight seed in three Severity controls with a corpus-grounded Tigre severity-level compound. Record its compound grammar as low confidence and add negative coverage for the former seed.\n\nThanks to xet7 !
2026-09-15 05:13:06 +03:00
Lauri Ojansivu 3d2c249f21 Document Tigre export repairs
Record the corpus evidence, residual overlap count, limitations and regression coverage for the repaired Tigre Export controls.\n\nThanks to xet7 !
2026-09-15 05:12:12 +03:00
Lauri Ojansivu 6d8f830a70 Repair Tigre export controls
Use the Tigre export action attested in a software-context corpus entry across the generic, list and board export controls. Add exact and former-seed regression coverage.\n\nThanks to xet7 !
2026-09-15 05:11:36 +03:00
Lauri Ojansivu ee6607dc9d Document Tigre administrative term repairs
Record the evidence, residual overlap counts, test coverage and source commit for the reviewed Tigre administrative and location controls.\n\nThanks to xet7 !
2026-09-15 05:10:30 +03:00
Lauri Ojansivu 9f5f2d1dba Repair Tigre administrative controls
Use corpus-attested Tigre terminology for administrator, organization administrators, confirmation, type, location and adding a location. Add focused coverage for all corrected controls and their former Tigrinya seeds.\n\nThanks to xet7 !
2026-09-15 05:09:45 +03:00
Lauri Ojansivu fbfb37e272 Document Tigre member terminology correction 2026-09-15 05:06:21 +03:00
Lauri Ojansivu 2bb4b88cb5 Correct Tigre member terminology 2026-09-15 05:05:42 +03:00
Lauri Ojansivu 212232a5c0 Document Tigre interface compound repairs 2026-09-15 05:04:06 +03:00
Lauri Ojansivu 6f25928145 Repair Tigre interface compounds 2026-09-15 05:03:31 +03:00
Lauri Ojansivu eb797932fe Document Tigre operational term repairs 2026-09-15 05:02:14 +03:00
Lauri Ojansivu fa6cbd1666 Retain shared Tigre seconds term 2026-09-15 05:01:34 +03:00
Lauri Ojansivu a268d6167a Repair Tigre operational terms 2026-09-15 05:01:19 +03:00
Lauri Ojansivu 4936e9fc47 Document basic Tigre term repairs 2026-09-15 05:00:07 +03:00
Lauri Ojansivu 62ff72c607 Repair basic Tigre interface terms 2026-09-15 04:59:34 +03:00
Lauri Ojansivu 8c324ff5e9 Document Tigre sense repairs 2026-09-15 04:58:14 +03:00
Lauri Ojansivu 67632637c2 Repair conflicting Tigre interface senses 2026-09-15 04:57:44 +03:00
Lauri Ojansivu c839ae2bf3 Document shared Tigre term review 2026-09-15 04:56:51 +03:00
Lauri Ojansivu b2caad45b7 Retain corpus-backed shared Tigre terms 2026-09-15 04:56:15 +03:00
Lauri Ojansivu 154c3cc31f Document repeated Tigre noun repairs 2026-09-15 04:54:11 +03:00
Lauri Ojansivu f9b716fd61 Repair repeated Tigre interface nouns 2026-09-15 04:53:42 +03:00
Lauri Ojansivu 9b266cc353 Document Tigre Azure path repairs 2026-09-15 04:52:45 +03:00
Lauri Ojansivu 77e08a8f61 Repair Tigre Azure menu paths 2026-09-15 04:52:14 +03:00
Lauri Ojansivu a568dc4208 Document repeated Tigre interface repairs 2026-09-15 04:50:49 +03:00
Lauri Ojansivu 2530126f27 Repair repeated Tigre interface families 2026-09-15 04:50:10 +03:00
Lauri Ojansivu b7b7cd2de8 Document Tigre address and name repairs 2026-09-15 04:48:26 +03:00
Lauri Ojansivu 62956f2819 Repair Tigre address and name labels 2026-09-15 04:47:52 +03:00
Lauri Ojansivu 2fcf2788e5 Document lexical Tigre repairs 2026-09-15 04:47:01 +03:00
Lauri Ojansivu f27cb82ca6 Repair lexical Tigre interface terms 2026-09-15 04:45:56 +03:00
Lauri Ojansivu 7db8afc76c Document completed Veps seed review 2026-09-15 04:42:55 +03:00
Lauri Ojansivu a4ec295ffa Complete Finnish-seeded Veps translation review 2026-09-15 04:42:14 +03:00
Lauri Ojansivu 33d1a89761 Document Veps account and rule repairs 2026-09-15 04:39:52 +03:00
Lauri Ojansivu 4caef872b0 Repair Veps account and rule interface families 2026-09-15 04:39:14 +03:00
Lauri Ojansivu be8c47c26a Document Veps board interface repairs 2026-09-15 04:36:32 +03:00
Lauri Ojansivu a222bad2d7 Repair Veps board interface families 2026-09-15 04:35:53 +03:00
Lauri Ojansivu 8858912ed4 Document lexical Veps repairs 2026-09-15 04:33:33 +03:00
Lauri Ojansivu c67a91a416 Repair lexical Veps interface terms 2026-09-15 04:32:34 +03:00
Lauri Ojansivu 8d02a5d758 Document native-catalogue Veps repairs 2026-09-15 04:31:18 +03:00
Lauri Ojansivu e17bb2b5e3 Repair native-catalogue Veps interface terms 2026-09-15 04:30:06 +03:00
Lauri Ojansivu 3e492107cb Document shared Tigre vocabulary review 2026-09-15 04:27:38 +03:00
Lauri Ojansivu 5b2c5942ef Record corpus-attested shared Tigre terms 2026-09-15 04:27:05 +03:00
Lauri Ojansivu 8db30cf182 Document corpus-backed Tigre interface repairs 2026-09-15 04:25:58 +03:00
Lauri Ojansivu 0e94189604 Repair corpus-backed Tigre interface terms 2026-09-15 04:24:56 +03:00
Lauri Ojansivu 391e7fc811 Document Tigre date vocabulary repairs 2026-09-15 04:22:31 +03:00
Lauri Ojansivu 9ab9215c6b Repair Tigre basic date vocabulary 2026-09-15 04:19:37 +03:00
Lauri Ojansivu e911879b6b Document completion of tracked translation audit 2026-09-15 04:17:44 +03:00
Lauri Ojansivu 2ecd746378 Complete restored Basque rule translation review 2026-09-15 04:16:25 +03:00
Lauri Ojansivu f18a925c26 Translate Aromanian magenta color label 2026-09-15 04:14:38 +03:00
Lauri Ojansivu ee9228ab6d Complete tracked Tamazight migration translations 2026-09-15 04:13:44 +03:00
Lauri Ojansivu a11978016d Repair Tamazight global search guidance 2026-09-15 04:11:42 +03:00
Lauri Ojansivu 36c8afc8ea Repair Tamazight board and import guidance 2026-09-15 04:10:38 +03:00
Lauri Ojansivu 667eb393dd Document Tamazight diagnostic translation repairs 2026-09-15 04:08:50 +03:00
Lauri Ojansivu 3d79d5ca5b Repair Tamazight diagnostics and repository actions 2026-09-15 04:07:33 +03:00
Lauri Ojansivu c9d838170b Document Tamazight accessibility translation repairs 2026-09-15 04:06:17 +03:00
Lauri Ojansivu 7d87955de3 Repair Tamazight accessibility and UI labels 2026-09-15 04:05:00 +03:00
Lauri Ojansivu e0bb7f2ca1 Document Tamazight calendar repairs 2026-09-15 04:01:51 +03:00
Lauri Ojansivu 10aa310033 Translate Tamazight tabular Hijri labels 2026-09-15 04:01:24 +03:00
Lauri Ojansivu 3caf5f6a73 Document completed Inuktitut audit queue 2026-09-15 03:59:31 +03:00
Lauri Ojansivu b5acfdaec3 Complete Inuktitut calendar labels 2026-09-15 03:58:53 +03:00
Lauri Ojansivu 97dc41d076 Document Inuktitut orthography review 2026-09-15 03:57:22 +03:00
Lauri Ojansivu a0eeee9d63 Retain valid Roman Inuktitut translations 2026-09-15 03:56:49 +03:00
Lauri Ojansivu 81f18f4807 Document Tigre translation audit progress 2026-09-15 03:55:55 +03:00
Lauri Ojansivu 88caf17515 Translate Tigre calendar system labels 2026-09-15 03:54:16 +03:00
Lauri Ojansivu 85d994c2fb Document completed Wolaytta tracked audit
Record the final calendar repairs, source commit, updated counts, verification, and remaining low-confidence compounds.

Thanks to xet7 !
2026-09-15 03:49:22 +03:00
Lauri Ojansivu e97f8fb206 Complete Wolaytta calendar labels
Replace ten incomplete English seeds with the attested calendar-noun family while preserving named systems, calculated epochs, and moon-sighting distinctions.

Thanks to xet7 !
2026-09-15 03:48:41 +03:00
Lauri Ojansivu 54f008fc5d Document completed Nahuatl tracked audit
Record the calendar-system repair, source rationale, updated counts, verification, and remaining low-confidence scope.

Thanks to xet7 !
2026-09-15 03:47:22 +03:00
Lauri Ojansivu 56ce505d0c Translate Nahuatl calendar system labels
Replace seventeen Azerbaijani, English, and incomplete labels with a coordinated modern date-reckoning family while preserving every named calendar and variant distinction.

Thanks to xet7 !
2026-09-15 03:46:07 +03:00
Lauri Ojansivu 78fda5345a Document completed Ewe tracked audit
Record the calendar terminology evidence, source commit, updated counts, and remaining low-confidence construction.

Thanks to xet7 !
2026-09-15 03:43:57 +03:00
Lauri Ojansivu 52836b241d Complete Ewe tabular Hijri label
Replace the incomplete English calendar name with an Ewe calculation-and-epoch draft while preserving the distinct astronomical variant.

Thanks to xet7 !
2026-09-15 03:42:46 +03:00
Lauri Ojansivu 38cde52187 Document completed Veps tracked audit
Record the final tracked Veps repair, parser evidence, updated counts, and the remaining low-confidence review scope.

Thanks to xet7 !
2026-09-15 03:40:32 +03:00
Lauri Ojansivu 7bc3b73b05 Translate Veps advanced filter help
Replace the final tracked Finnish paragraph with a Veps draft while preserving every executable operator, quote, escape, grouping, and regular-expression example.

Thanks to xet7 !
2026-09-15 03:39:52 +03:00
Lauri Ojansivu a229d53471 Document Veps keyboard translation repair
Record the dated source commit, verified behavior, updated audit counts, and remaining low-confidence terminology.

Thanks to xet7 !
2026-09-15 03:38:17 +03:00
Lauri Ojansivu 4d74f7080f Fix Veps keyboard command translations
Replace four Finnish keyboard-shortcut values with a coordinated Veps keyboard-command draft while preserving state transitions, route behavior, and the literal question-mark binding.

Thanks to xet7 !
2026-09-15 03:36:49 +03:00
Lauri Ojansivu 3830365ecd Document Veps scrollbar translation repair
Record the affected UI scope, native component evidence, focused checks, updated queue, and low-confidence compound limit.\n\nThanks to xet7 !
2026-09-15 03:33:39 +03:00
Lauri Ojansivu b82d5761ed Fix Veps vertical scrollbar translation
Replace the Finnish toggle label with a Veps vertical-scrollbar draft and verify its visible control and affected containers.\n\nThanks to xet7 !
2026-09-15 03:32:56 +03:00
Lauri Ojansivu e8d971489b Document Veps field sum translation repair
Record the numeric-only source context, dictionary evidence, focused checks, updated queue, and remaining low-confidence grammar.\n\nThanks to xet7 !
2026-09-15 03:31:49 +03:00
Lauri Ojansivu 1b35cd8b4f Fix Veps field sum control translation
Replace the Finnish checkbox label with Veps arithmetic-addition and list-top terminology already verified for the numeric total tooltip.\n\nThanks to xet7 !
2026-09-15 03:31:03 +03:00
Lauri Ojansivu 68c82d941c Document Veps accessibility translation repairs
Record the five repaired UI roles, source bindings, descriptive terminology basis, focused checks, and remaining low-confidence review.\n\nThanks to xet7 !
2026-09-15 03:29:21 +03:00
Lauri Ojansivu 09b62ffa40 Fix Veps accessibility translations
Replace the Finnish accessibility family with a consistent Veps access-for-everyone draft across navigation, settings, fields, and the public empty state.\n\nThanks to xet7 !
2026-09-15 03:28:29 +03:00
Lauri Ojansivu a31eebdc39 Document Veps card loading translation repairs
Record the corrected card-loading semantics, native terminology basis, focused verification, and remaining low-confidence review in the audit and Upcoming changelog.\n\nThanks to xet7 !
2026-09-15 03:26:07 +03:00
Lauri Ojansivu 8480bee00b Fix Veps card loading translations
Replace wrong-language labels, stale manual loading guidance, and a Russian multi-selection hybrid with a coherent Veps card-loading group. Preserve the automatic threshold behavior and exact operator configuration literals.\n\nThanks to xet7 !
2026-09-15 03:25:01 +03:00
Lauri Ojansivu c4f049e320 Record Veps voting translation repairs
Update the audit, native evidence review, and Upcoming changelog with the verified voting-side repair and its remaining confidence limit.\n\nThanks to xet7 !
2026-09-15 03:19:14 +03:00
Lauri Ojansivu 8a66f4c746 Repair Veps voting-side translations
Replace four Finnish participant and action labels with Veps forms based on the native voting, support, defense, and opposition entries. Add semantic regression checks.\n\nThanks to xet7 !
2026-09-15 03:18:50 +03:00
Lauri Ojansivu 8061759d2c Record Veps Problems heading repairs
Update the short audit, detailed evidence, Veps review, and Upcoming changelog with the verified native heading evidence.\n\nThanks to xet7 !
2026-09-15 03:16:11 +03:00
Lauri Ojansivu 052937ff0a Repair Veps Problems page headings
Replace Tshivenda and Finnish headings with an attested Veps summary term and the locale's existing status label. Add exact regression checks.\n\nThanks to xet7 !
2026-09-15 03:15:49 +03:00
Lauri Ojansivu 3e0c124d4a Record Veps card-number translation repair
Update the short audit, detailed evidence, Veps review, and Upcoming changelog with the verified local repair and expanded wrong-language candidate scan.\n\nThanks to xet7 !
2026-09-15 03:15:07 +03:00
Lauri Ojansivu 21e43e8b56 Repair Veps card-number search translations
Replace Zulu card-number labels with Veps wording, preserve the search syntax placeholders, and add regression coverage for the complete search group.\n\nThanks to xet7 !
2026-09-15 03:14:23 +03:00
Lauri Ojansivu 832e44c7e9 Record Veps numeric addition repair and primary evidence 2026-09-15 03:11:15 +03:00
Lauri Ojansivu 7c17acd340 Replace wrong-language Veps numeric total description
Use the rendered native phrase for addition of numbers and preserve custom number fields marked for list top. Full compound and case grammar remains under review.
2026-09-15 03:10:54 +03:00
Lauri Ojansivu 3d47446dfe Record Veps date range repair and native interval evidence 2026-09-15 03:09:58 +03:00
Lauri Ojansivu 046830b355 Replace wrong-language Veps list date range description
Use rendered native time-interval noun; preserve custom date fields marked for list top. Full case and compound grammar remain low confidence.
2026-09-15 03:09:39 +03:00
Lauri Ojansivu 7dcdc054a4 Record Veps severity draft and technical review limits 2026-09-15 03:08:30 +03:00
Lauri Ojansivu 91d0cbf5ed Replace wrong-language Veps event severity label
Use rendered native noun forms in a direct severity-level draft. Technical harshness analogy and full compound remain low confidence and under review.
2026-09-15 03:08:09 +03:00
Lauri Ojansivu 9e5758a508 Verify native Veps abstract-level noun for severity review 2026-09-15 03:07:35 +03:00
Lauri Ojansivu dad7f2ae35 Verify rendered Veps hardness noun and limit severity inference 2026-09-15 03:06:44 +03:00
Lauri Ojansivu 99aeb90cdb Record Veps severity lexical evidence and excluded meanings 2026-09-15 03:06:02 +03:00
Lauri Ojansivu 10f1a4964b Record Veps backup scope repairs and terminology limits 2026-09-15 03:05:19 +03:00
Lauri Ojansivu cfed82e70c Replace wrong-language Veps backup scope text
Preserve organization boards and attachments, shared accounts/settings exclusions and restore ownership restriction. Whole-system paraphrase and full native grammar remain low confidence.
2026-09-15 03:04:59 +03:00
Lauri Ojansivu eb056cf59f Record Veps acknowledgment repairs and open grammar review 2026-09-15 03:04:15 +03:00
Lauri Ojansivu bc8988c9d7 Replace wrong-language Veps problem acknowledgment text
Preserve checked reviewed areas and resetting new-problem counts. Full plural, case and acknowledgment grammar remains low confidence.
2026-09-15 03:03:57 +03:00
Lauri Ojansivu ed2565e9b7 Record Veps CPU repairs and remaining core terminology review 2026-09-15 03:03:14 +03:00
Lauri Ojansivu 9e06803310 Replace wrong-language Veps CPU usage and load labels
Preserve current versus generic usage and average system load. Reuse local Veps terminology; full computing compounds and core vocabulary remain under review.
2026-09-15 03:02:55 +03:00
Lauri Ojansivu f46fb0272e Record Veps loading and status repairs with review limits 2026-09-15 03:02:14 +03:00
Lauri Ojansivu e8826e71a0 Replace wrong-language Veps loading and migration status
Preserve possible login delay, login-required message, loading indicator and CPU condition until background work finishes. Full computing terminology and grammar remain low confidence.
2026-09-15 03:01:55 +03:00
Lauri Ojansivu 4cf2381c66 Record Veps forecast repairs and remaining grammar review 2026-09-15 03:01:03 +03:00
Lauri Ojansivu 201f8d0a41 Replace wrong-language Veps chart forecast messages
Preserve zero remaining, missing recent completions, weekly pace and conditional completion date. Full projection, recency and count grammar remains low confidence.
2026-09-15 03:00:44 +03:00
Lauri Ojansivu b7a903473d Record Veps repair message corrections and grammar limits 2026-09-15 02:59:49 +03:00
Lauri Ojansivu f5d72bae8a Replace wrong-language Veps repair and restore messages
Preserve exact counters, missing-board explanation and automatic-repair limitation. Full count, passive and case grammar remains low confidence.
2026-09-15 02:59:29 +03:00
Lauri Ojansivu 6fd9eb88d3 Record Veps voting repairs and expanded review scope 2026-09-15 02:58:45 +03:00
Lauri Ojansivu 4b2009229c Fix Veps voting and event detail labels
Replace Tshivenda vote-sorting and detail text and Finnish voting heading with Veps vocabulary. Sorting case and full context terminology remain under review.
2026-09-15 02:58:23 +03:00
Lauri Ojansivu 5a62a6b3b1 Record native Veps software-key evidence and title repair 2026-09-15 02:57:43 +03:00
Lauri Ojansivu e722a6c17c Improve Veps synchronization title and software-key wording
Use native MediaWiki software sort-key evidence for the project-key analogy, preserving ID/path alternatives. Replace overlooked Tshivenda popup title. Full compound grammar remains low confidence.
2026-09-15 02:57:22 +03:00
Lauri Ojansivu 1aacb92a3b Record Veps two-factor instruction repairs and uncertainty 2026-09-15 02:56:38 +03:00
Lauri Ojansivu f9d9c454dc Replace wrong-language Veps two-factor setup and login text
Preserve QR and manual setup alternatives, six-digit codes, every-login requirement and invalid-code retry. Full computing compounds and native grammar remain low confidence.
2026-09-15 02:56:16 +03:00
Lauri Ojansivu c476aa4a10 Record Veps two-factor control repairs and open instructions 2026-09-15 02:55:29 +03:00
Lauri Ojansivu 7deff5697c Replace wrong-language Veps two-factor controls
Preserve enable and disable actions, popup title and account-specific enabled status. Full two-factor terminology and grammar remain low confidence; setup instructions still require repair.
2026-09-15 02:55:08 +03:00
Lauri Ojansivu 8e8150478f Record Veps identifier repair and terminology limits 2026-09-15 02:54:25 +03:00
Lauri Ojansivu 29f93a8886 Fix Veps multi-tracker project identifier label
Replace Tshivenda with a project-code paraphrase and retain ID and owner/repo alternatives. Native project and code vocabulary is attested; full multi-tracker terminology remains low confidence.
2026-09-15 02:54:03 +03:00
Lauri Ojansivu d84b5bb9be Record Veps sync instruction draft and remaining review 2026-09-15 02:52:37 +03:00
Lauri Ojansivu 25e6eefba0 Replace wrong-language Veps synchronization instructions
Preserve external tracker, background checks every 15 minutes, and the immediate manual action. Full draft grammar and computing loans remain low confidence.
2026-09-15 02:52:16 +03:00
Lauri Ojansivu c37bd8f962 Record Veps inactive sync repair and review limits 2026-09-15 02:51:34 +03:00
Lauri Ojansivu b30fa05a93 Fix Veps inactive synchronization source label
Replace the Tshivenda empty-source option with a Veps inactive-state paraphrase. Keep enabled, failed and never-synced states distinct. Derived noun and complete grammar remain low confidence.
2026-09-15 02:51:14 +03:00
Lauri Ojansivu 11b3061c98 Record Veps never-synced repair and primary native evidence 2026-09-15 02:48:10 +03:00
Lauri Ojansivu 81c17c1960 Fix Veps never-synced state with native adverb 2026-09-15 02:47:47 +03:00
Lauri Ojansivu 7e59bb8b63 Record Veps credential repairs and remaining language review 2026-09-15 02:47:08 +03:00
Lauri Ojansivu c117936edd Fix Veps synchronization credential labels and status messages
Preserve API token/password meaning and set versus not-yet-set state. Full status grammar and credential paraphrase remain low confidence.
2026-09-15 02:46:45 +03:00
Lauri Ojansivu d04457bb37 Record dated Veps optional-field repairs and review limits 2026-09-15 02:46:09 +03:00
Lauri Ojansivu 5d0583ef54 Fix Veps optional-field and synchronization username wording
Preserve the not-required qualification using a direct native-wording draft. Full contextual grammar remains low confidence.
2026-09-15 02:45:44 +03:00
Lauri Ojansivu 7cbef0b3c7 Record Veps source label repair and optional-field review 2026-09-15 02:45:10 +03:00
Lauri Ojansivu 0ca3422a46 Fix wrong-language Veps synchronization source label 2026-09-15 02:44:48 +03:00
Lauri Ojansivu be501c32fa Record Veps synchronization state repairs and remaining grammar 2026-09-15 02:44:14 +03:00
Lauri Ojansivu c379de7d7e Fix six Veps synchronization state and result translations
Preserve pending, success, error and stop meanings and the exact error placeholder. Derived synchronization noun and case grammar remain low confidence.
2026-09-15 02:43:51 +03:00
Lauri Ojansivu e7cecc9c7f Record five Veps synchronization repairs and remaining block 2026-09-15 02:43:12 +03:00
Lauri Ojansivu 93a48d724d Fix five wrong-language Veps synchronization labels
Reuse existing Veps wording and preserve literal project and credential examples. Full assembled synchronization grammar remains under review.
2026-09-15 02:42:49 +03:00
Lauri Ojansivu 7c540c5f5b Record dated Veps rule-state repairs and grammar limits 2026-09-15 02:41:59 +03:00
Lauri Ojansivu 3658f17556 Fix Tshivenda rule-state text in Veps translations
Keep both enable and disable actions and preserve the existing enabled label. Assembled Veps rule-object grammar remains low confidence.
2026-09-15 02:41:37 +03:00
Lauri Ojansivu 4f879334c9 Record Veps rules repair and additional mixed-language findings 2026-09-15 02:40:54 +03:00
Lauri Ojansivu 29bf7aa221 Fix unflagged Finnish rules heading in Veps translation 2026-09-15 02:40:32 +03:00
Lauri Ojansivu 84af30f9b5 Record dated Veps URL scheme repair and remaining review 2026-09-15 02:39:51 +03:00
Lauri Ojansivu f10fe2fa5b Fix Veps automatic URL scheme setting translation
Preserve automatic clickability and one scheme per line. Assembled grammar and singular scheme form remain low confidence.
2026-09-15 02:39:29 +03:00
Lauri Ojansivu be42c5771f Verify Veps button dictionary senses from rendered source 2026-09-15 02:38:40 +03:00
Lauri Ojansivu b60ea7bc12 Correct Veps dictionary search evidence for legacy PDF text 2026-09-15 02:38:09 +03:00
Lauri Ojansivu d0f721b481 Extend Veps shortcut review to untranslated popup title 2026-09-15 02:37:10 +03:00
Lauri Ojansivu b9dae272e7 Record dated resident-memory repair and remaining native review 2026-09-15 02:36:19 +03:00
Lauri Ojansivu ef5a6c5bad Fix Tamazight resident-memory diagnostic label
Use native memory-usage and size wording with the precise RSS acronym. Full computing grammar and native expansion of resident set remain under review.
2026-09-15 02:35:57 +03:00
Lauri Ojansivu d30a2f5737 Correct Tamazight memory review and preserve attested alternatives 2026-09-15 02:35:26 +03:00
Lauri Ojansivu efa6b0eb11 Record dated used-memory translation repair and terminology limits 2026-09-15 02:34:47 +03:00
Lauri Ojansivu 06be232017 Fix Tamazight actual used-memory diagnostic wording
Preserve the V8 used-memory scope. Computing memory adaptation, passive grammar and actual-use paraphrase remain low confidence.
2026-09-15 02:34:24 +03:00
Lauri Ojansivu 9570c3af3f Record dated Tamazight reminder repair and review limits 2026-09-15 02:33:33 +03:00
Lauri Ojansivu a6d77ba0e0 Fix Tamazight first due-reminder activity translation
Preserve named activity placeholders and first-reminder wording. Full deadline compound and possessive grammar remain low confidence.
2026-09-15 02:33:12 +03:00
Lauri Ojansivu 36f33b5304 Record CSV schema translation repair and remaining phrase review 2026-09-15 02:29:30 +03:00
Lauri Ojansivu 52b73cacc5 Repair Tamazight CSV and TSV schema warning 2026-09-15 02:29:06 +03:00
Lauri Ojansivu 3797e952ed Document JSON schema translation repair and remaining import terminology 2026-09-15 02:28:25 +03:00
Lauri Ojansivu ac95ce3aad Repair Tamazight JSON schema error wording 2026-09-15 02:28:02 +03:00
Lauri Ojansivu c3bc95dc3f Record accessibility translation scope and disabled page wording conflict 2026-09-15 02:27:04 +03:00
Lauri Ojansivu 68d7f2d899 Document logo wording repairs and remaining contextual review 2026-09-15 02:26:09 +03:00
Lauri Ojansivu 8d9facf9a8 Repair Tamazight logo height hide and navigation labels 2026-09-15 02:25:47 +03:00
Lauri Ojansivu 0c34382f87 Document logo URL translation repairs and remaining spatial review 2026-09-15 02:24:58 +03:00
Lauri Ojansivu ec1f2cb219 Repair Tamazight top left logo image and link URL labels 2026-09-15 02:24:36 +03:00
Lauri Ojansivu b31065a9d0 Document physical heap translation repair and remaining batch validation 2026-09-15 02:23:33 +03:00
Lauri Ojansivu 0b259c2d3d Repair Tamazight physical heap size diagnostic label 2026-09-15 02:23:10 +03:00
Lauri Ojansivu ddc8e9fcab Document V8 context translation repairs and borrowed qualifier limits 2026-09-15 02:22:35 +03:00
Lauri Ojansivu 0f4fc5d227 Repair Tamazight V8 context count diagnostic wording 2026-09-15 02:22:09 +03:00
Lauri Ojansivu 1951b0417a Document garbage flag translation repair and literal identifier rationale 2026-09-15 02:21:15 +03:00
Lauri Ojansivu 8516ab9a72 Repair Tamazight heap garbage diagnostic flag label 2026-09-15 02:20:52 +03:00
Lauri Ojansivu f194046ec2 Document heap capability translation repairs and review limits 2026-09-15 02:20:17 +03:00
Lauri Ojansivu 0f545fd8a7 Repair Tamazight available and executable heap diagnostic labels 2026-09-15 02:19:55 +03:00
Lauri Ojansivu 2f8b930391 Document malloc diagnostic translation repairs and paraphrase limits 2026-09-15 02:19:12 +03:00
Lauri Ojansivu 6481e8bbd6 Repair Tamazight malloc memory and peak diagnostic labels 2026-09-15 02:18:48 +03:00
Lauri Ojansivu dfbe6056fc Record heap limit translation repair and allocation wording review 2026-09-15 02:18:01 +03:00
Lauri Ojansivu 88add30060 Repair Tamazight heap size limit diagnostic 2026-09-15 02:17:39 +03:00
Lauri Ojansivu 9ab9db9611 Document heap diagnostic translation repairs and remaining metric distinctions 2026-09-15 02:16:51 +03:00
Lauri Ojansivu 0567c1aacc Repair Tamazight total and used heap size diagnostics 2026-09-15 02:16:24 +03:00
Lauri Ojansivu b8bffce9c3 Record account protection explanation repair and contextual limits 2026-09-15 02:15:20 +03:00
Lauri Ojansivu 5211bf3152 Repair Tamazight account protection explanatory text 2026-09-15 02:14:56 +03:00
Lauri Ojansivu 64b716d623 Document account protection translation repairs and grammar limits 2026-09-15 02:14:07 +03:00
Lauri Ojansivu 7c58d6c3df Repair Tamazight brute force settings heading and update confirmation 2026-09-15 02:13:44 +03:00
Lauri Ojansivu 4dad59ba12 Record failed attempts translation draft and remaining contextual review 2026-09-15 02:12:56 +03:00
Lauri Ojansivu bf9a929e13 Repair Tamazight failed attempts label with trial and failure terminology 2026-09-15 02:12:34 +03:00
Lauri Ojansivu b1ba19e837 Record native software evidence for Tamazight attempt wording 2026-09-15 02:11:58 +03:00
Lauri Ojansivu 3cc93cb240 Document locked users translation repair and remaining attempt terminology 2026-09-15 02:10:55 +03:00
Lauri Ojansivu e908ec0a2f Repair Tamazight locked users navigation label 2026-09-15 02:10:36 +03:00
Lauri Ojansivu 41dbd148c2 Document due search translation repair and source cutoff discrepancy 2026-09-15 02:09:46 +03:00
Lauri Ojansivu 64e524f27a Repair Tamazight due date search instruction 2026-09-15 02:09:25 +03:00
Lauri Ojansivu b347233c1b Document Tamazight search date hint repairs and contextual review limits 2026-09-15 02:08:34 +03:00
Lauri Ojansivu 66f2a8feed Repair Tamazight created and modified search date hints 2026-09-15 02:08:12 +03:00
Lauri Ojansivu 87323967b3 Record Tamazight drag handle terminology repair and review limits 2026-09-15 02:07:08 +03:00
Lauri Ojansivu b0ad9320f2 Repair Tamazight desktop drag handle label 2026-09-15 02:06:47 +03:00
Lauri Ojansivu 0f73724fa8 Document SMTP port translation repairs and retained terminology limits 2026-09-15 02:05:50 +03:00
Lauri Ojansivu e1c3720715 Repair Tamazight outgoing SMTP port description 2026-09-15 02:05:27 +03:00
Lauri Ojansivu 8f49df189a Record Tamazight SMTP translation repairs and remaining terminology review 2026-09-15 02:04:36 +03:00
Lauri Ojansivu 11fc595a00 Repair Tamazight SMTP labels and test email subject 2026-09-15 02:04:17 +03:00
Lauri Ojansivu cd895cfef7 Document Tamazight owner heading repair and review limits 2026-09-15 02:03:30 +03:00
Lauri Ojansivu 3da9c1f4ee Repair Tamazight card owner export heading 2026-09-15 02:03:11 +03:00
Lauri Ojansivu 8505afdf9e Document list warning repair and pending Transifex language support 2026-09-15 02:02:22 +03:00
Lauri Ojansivu 0f393c5c8f Repair Tamazight list deletion warning 2026-09-15 01:59:17 +03:00
Lauri Ojansivu f7b7da9c3f Document member removal translation repair and preserved placeholders 2026-09-15 01:58:39 +03:00
Lauri Ojansivu 3fd9413b3f Repair Tamazight member removal confirmation 2026-09-15 01:58:20 +03:00
Lauri Ojansivu a026b27dc5 Document Saudi calendar translation repair and sighting grammar limits 2026-09-15 01:57:35 +03:00
Lauri Ojansivu 103457ada4 Repair Tamazight Saudi sighting calendar label 2026-09-15 01:57:15 +03:00
Lauri Ojansivu 65b0fe0ab4 Record Tamazight tabular calendar qualifier evidence limits 2026-09-15 01:56:37 +03:00
Lauri Ojansivu 2c200ab5b9 Document Dzongkha epoch label repairs and native review limits 2026-09-15 01:55:53 +03:00
Lauri Ojansivu 1a174e357a Repair Dzongkha tabular Hijri calendar epoch labels 2026-09-15 01:55:32 +03:00
Lauri Ojansivu 87835255ae Verify Dzongkha epoch and start entries from rendered source 2026-09-15 01:54:51 +03:00
Lauri Ojansivu 1b10527d1b Verify Dzongkha tabular spelling from rendered dictionary page 2026-09-15 01:54:08 +03:00
Lauri Ojansivu fd0b18431f Verify Dzongkha tabular calendar epoch distinction against current CLDR 2026-09-15 01:52:50 +03:00
Lauri Ojansivu 39daf05c88 Document clipboard gesture translation repair and review limits 2026-09-15 01:52:06 +03:00
Lauri Ojansivu 047c860ea3 Repair Tamazight clipboard image gesture instruction 2026-09-15 01:51:47 +03:00
Lauri Ojansivu 29121d44c8 Record clipboard image gesture meaning for translation repair 2026-09-15 01:51:20 +03:00
Lauri Ojansivu aafcae48fb Document private page translation repair and remaining reviews 2026-09-15 01:50:39 +03:00
Lauri Ojansivu 27dbc30c22 Repair Tamazight private page login guidance 2026-09-15 01:50:21 +03:00
Lauri Ojansivu f2c6e77eb2 Document list dependency translation repair and contextual review limits 2026-09-15 01:49:37 +03:00
Lauri Ojansivu 18e1979477 Repair Tamazight linked card list deletion warning 2026-09-15 01:49:18 +03:00
Lauri Ojansivu 8cbcb52451 Document linked card warning repair and native grammar review 2026-09-15 01:48:45 +03:00
Lauri Ojansivu efdf49b29f Repair Tamazight linked card deletion warning 2026-09-15 01:48:26 +03:00
Lauri Ojansivu 9bd8e04d9f Record linked card deletion dependency direction for translation repair 2026-09-15 01:47:46 +03:00
Lauri Ojansivu 32b46051fa Document permanent attachment translation repair and grammar limits 2026-09-15 01:47:13 +03:00
Lauri Ojansivu ecbe3856d2 Repair Tamazight permanent attachment warning 2026-09-15 01:46:53 +03:00
Lauri Ojansivu 6eda842fea Record search limit grammar and parser distinction for translation review 2026-09-15 01:46:15 +03:00
Lauri Ojansivu 04a4f92b45 Document rule instruction repair and computing matching evidence 2026-09-15 01:45:34 +03:00
Lauri Ojansivu d90707d5dc Repair Tamazight blank rule field instruction 2026-09-15 01:45:13 +03:00
Lauri Ojansivu 0a1ce60ed7 Document mobile mode translation repairs and native review limits 2026-09-15 01:44:32 +03:00
Lauri Ojansivu 5f41f83ca3 Repair Tamazight mobile and desktop mode labels 2026-09-15 01:44:14 +03:00
Lauri Ojansivu 9774b20c12 Exclude misleading matching homographs from Tamazight rule repair 2026-09-15 01:43:40 +03:00
Lauri Ojansivu 2a3c8ad7b2 Record blank rule field wildcard meaning for translation repair 2026-09-15 01:42:56 +03:00
Lauri Ojansivu 0a333ce51a Document card export people translation repair and review limits 2026-09-15 01:42:11 +03:00
Lauri Ojansivu 897c89740d Repair Tamazight card export people label 2026-09-15 01:41:52 +03:00
Lauri Ojansivu 98bbc03fcf Record computing disk space translation evidence and limits 2026-09-15 01:41:15 +03:00
Lauri Ojansivu 343971eb86 Document automatic watching translation repair and audit progress 2026-09-15 01:40:39 +03:00
Lauri Ojansivu d0bf777156 Repair Tamazight automatic board watching instruction 2026-09-15 01:40:20 +03:00
Lauri Ojansivu 9a56d1720b Record imported member empty state translation constraints 2026-09-15 01:39:44 +03:00
Lauri Ojansivu b39e4e0ee2 Document due card translation repairs and pending native review 2026-09-15 01:39:11 +03:00
Lauri Ojansivu 3ce7ed2a04 Repair Tamazight due card empty states 2026-09-15 01:38:51 +03:00
Lauri Ojansivu 1a64d5a1fc Record Tamazight possessive placement constraint for notice acceptance 2026-09-15 01:38:08 +03:00
Lauri Ojansivu 61be887618 Verify generic Tamazight acceptance verb from dictionary source 2026-09-15 01:37:33 +03:00
Lauri Ojansivu f37ba5f581 Record missing ownership in legal notice acceptance translation 2026-09-15 01:36:40 +03:00
Lauri Ojansivu 89185d39ca Document legal notice translation repairs and review limits 2026-09-15 01:36:04 +03:00
Lauri Ojansivu 9baa8f69df Repair Tamazight legal notice labels 2026-09-15 01:35:47 +03:00
Lauri Ojansivu 74d2228fbd Document web manifest translation repairs and remaining review 2026-09-15 01:34:59 +03:00
Lauri Ojansivu 7c1c4623d3 Repair Tamazight custom web manifest labels 2026-09-15 01:34:42 +03:00
Lauri Ojansivu 0d6f145961 Document custom head-tag translation repair and audit progress 2026-09-15 01:34:13 +03:00
Lauri Ojansivu 8362a8a2eb Repair Tamazight custom head tag activation label 2026-09-15 01:33:55 +03:00
Lauri Ojansivu 2722961397 Record Tamazight folder evidence and ZIP import constraints 2026-09-15 01:33:15 +03:00
Lauri Ojansivu 8dee03d542 Record attachment permanence terminology evidence and review limits 2026-09-15 01:32:39 +03:00
Lauri Ojansivu 53a6891d59 Record Tamazight import translation repair and remaining review 2026-09-15 01:31:58 +03:00
Lauri Ojansivu cc2b110ba4 Repair Tamazight CSV and TSV import guidance
Preserve paste action and comma or tab separators; Tab loan and full grammar remain low confidence.

Thanks to xet7 !
2026-09-15 01:29:03 +03:00
Lauri Ojansivu 4065b7c91f Record Tamazight checklist terminology revisions
Update dated audit and Upcoming notes with evidence for the noun and remaining contextual limits.

Thanks to xet7 !
2026-09-15 01:28:24 +03:00
Lauri Ojansivu 5434775ba1 Repair Tamazight checklist verification terminology
Revise 49 prior checklist compounds with attested verification noun, preserving prose and placeholders. Full software compound remains low confidence.

Thanks to xet7 !
2026-09-15 01:27:46 +03:00
Lauri Ojansivu b7837bf05b Record Tamazight mapping repair and check spelling evidence
Update dated audit and Upcoming notes; retain prior checklist compounds for renewed terminology review.

Thanks to xet7 !
2026-09-15 01:26:48 +03:00
Lauri Ojansivu 4a28218359 Repair Tamazight import member mapping label
Use attested check verb distinct from light; mapping compound remains low confidence.

Thanks to xet7 !
2026-09-15 01:26:21 +03:00
Lauri Ojansivu f259be34a4 Record translation constraints for search date bounds
Verify inclusive created/modified lower bounds and keep uncertain quantitative Tamazight wording open.

Thanks to xet7 !
2026-09-15 01:25:25 +03:00
Lauri Ojansivu 47883aa91d Record Tamazight filename warning repair progress
Update dated audit and Upcoming notes with contextual uncertainty and lexical evidence.

Thanks to xet7 !
2026-09-15 01:23:53 +03:00
Lauri Ojansivu 327a35b82f Repair Tamazight invalid filename warning
Preserve conditional rejection and upload or rename cancellation; avoid physical invalidity vocabulary. Complete grammar remains low confidence.

Thanks to xet7 !
2026-09-15 01:23:28 +03:00
Lauri Ojansivu 5704470be8 Record newer Aromanian dictionary search results
Verify Bara search with a positive color entry; retain unresolved magenta without misclassifying missing results as language approval.

Thanks to xet7 !
2026-09-15 01:22:39 +03:00
Lauri Ojansivu 2b60bc6ce0 Record second Aromanian color dictionary review
Inspect Cunia dictionary entries and identify the newer Bara dictionary for unresolved magenta attestation. Preserve existing translation and counts.

Thanks to xet7 !
2026-09-15 01:21:41 +03:00
Lauri Ojansivu 8bc4426f53 Record Tamazight search guidance translation repair
Update dated audit and Upcoming notes with lexical evidence and contextual uncertainty.

Thanks to xet7 !
2026-09-15 01:18:15 +03:00
Lauri Ojansivu 35f74fd042 Repair Tamazight case-insensitive search guidance
Preserve letter-case distinction with an A/a example. Complete computing terminology and grammar remain low confidence.

Thanks to xet7 !
2026-09-15 01:17:41 +03:00
Lauri Ojansivu efe7146186 Record Tamazight watch translation repair progress
Update dated audit and concise Upcoming summary with source evidence and grammar review limits.

Thanks to xet7 !
2026-09-15 01:16:38 +03:00
Lauri Ojansivu 45d2b2b2e7 Repair Tamazight watching label and disabled warning
Preserve administrator action and board/card scope using IRCAM monitoring terminology. Complete grammar remains low confidence.

Thanks to xet7 !
2026-09-15 01:16:03 +03:00
Lauri Ojansivu 5104dbaf43 Record source review of Tamazight JSON schema warning
Identify the invalid watch-type caller and keep unverified format terminology open without changing translation counts.

Thanks to xet7 !
2026-09-15 01:15:18 +03:00
Lauri Ojansivu aed519ac5f Record Tamazight import guidance translation repair
Update dated audit and Upcoming notes with lexical evidence and contextual review limits.

Thanks to xet7 !
2026-09-15 01:14:29 +03:00
Lauri Ojansivu 40f06e1d8d Repair Tamazight import error guidance
Preserve possible successful import despite errors and the All Boards location. Probability paraphrase and complete grammar remain low confidence.

Thanks to xet7 !
2026-09-15 01:14:04 +03:00
Lauri Ojansivu 6ceeace0e7 Record Tamazight last administrator translation repair
Update dated audit, verified counts and Upcoming notes with contextual review limits.

Thanks to xet7 !
2026-09-15 01:13:17 +03:00
Lauri Ojansivu 14af25915c Repair Tamazight last administrator warning
Preserve the requirement for at least one administrator, replacing the wrong permission explanation. Complete grammar remains low confidence.

Thanks to xet7 !
2026-09-15 01:12:51 +03:00
Lauri Ojansivu 7ba4642883 Record Tamazight PDF warning translation repair
Update dated audit and Upcoming notes; retain accessibility and contextual grammar reviews.

Thanks to xet7 !
2026-09-15 01:12:07 +03:00
Lauri Ojansivu 9680e2393e Repair Tamazight PDF preview warning
Retain device capability failure and download alternative. Complete contextual grammar remains low confidence.

Thanks to xet7 !
2026-09-15 01:11:41 +03:00
Lauri Ojansivu 2e50c81154 Record Tamazight shortcut translation repair progress
Update dated audit and Upcoming notes with lexical evidence and contextual uncertainty.

Thanks to xet7 !
2026-09-15 01:10:48 +03:00
Lauri Ojansivu 260258983d Repair Tamazight keyboard shortcut status labels
Preserve current enabled/disabled state and opposite click action. Derived passive and complete grammar remain low confidence.

Thanks to xet7 !
2026-09-15 01:10:23 +03:00
Lauri Ojansivu 94549d762a Record Tamazight label warning repair evidence
Update dated audit progress and Upcoming notes, retaining native grammar review limits.

Thanks to xet7 !
2026-09-15 01:09:24 +03:00
Lauri Ojansivu 4f07f43d81 Repair Tamazight label deletion warning
Retain no undo, removal from all cards and destruction of label history. Complete grammatical composition remains low confidence.

Thanks to xet7 !
2026-09-15 01:09:00 +03:00
Lauri Ojansivu d7f32047fc Record Tamazight deletion warning repair progress
Update dated audit and Upcoming notes; distinguish legacy hard-delete wording from active attachment soft deletion.

Thanks to xet7 !
2026-09-15 01:08:06 +03:00
Lauri Ojansivu 53fba52404 Repair Tamazight Planning Poker deletion warning
Preserve irreversibility and loss of all associated actions. Complete contextual grammar remains low confidence.

Thanks to xet7 !
2026-09-15 01:07:42 +03:00
Lauri Ojansivu 884f040d64 Record Tamazight board action translation repairs
Update dated evidence, audit counts and Upcoming notes with contextual review limits.

Thanks to xet7 !
2026-09-15 01:06:46 +03:00
Lauri Ojansivu 7c6688b63e Repair Tamazight card movement and creation rule labels
Preserve destination and new-card semantics using existing terminology and IRCAM lexical evidence. Complete contextual grammar remains low confidence.

Thanks to xet7 !
2026-09-15 01:06:13 +03:00
Lauri Ojansivu 0245682e3e Record Tamazight checkbox-state repair evidence
Update dated audit, uncertainty limits and Upcoming release notes.

Thanks to xet7 !
2026-09-15 01:05:09 +03:00
github-actions[bot] 7b249fe551 Bump versions for v11.80 2026-09-14 22:04:52 +00:00
Lauri Ojansivu 4e8f1b7dde Repair Tamazight checklist trigger state labels
Replace French checked and unchecked labels with state phrases, keeping them distinct from imperative actions. Checkbox terminology and complete grammar remain low confidence.

Thanks to xet7 !
2026-09-15 01:04:29 +03:00
Lauri Ojansivu 723ffbd524 Reconcile dated Tamazight assignee repair audit
Record source commit, verified counts and remaining contextual grammar uncertainty.

Thanks to xet7 !
2026-09-15 01:03:39 +03:00
Lauri Ojansivu b58511dbaa Prepare v11.80 release 2026-09-15 01:02:52 +03:00
Lauri Ojansivu ecd273a7d6 Updated ChangeLog. 2026-09-15 01:02:44 +03:00
Lauri Ojansivu e2431f4d96 Updated audit results 2026-09-15 01:02:00 +03:00
Lauri Ojansivu 50b68ca45a Repair Tamazight assignee shortcut hint
Retain add/remove assignment, card scope, 1-9 and board-addition order. Complete contextual grammar remains low confidence.

Thanks to xet7 !
2026-09-15 01:00:15 +03:00
Lauri Ojansivu 02b5fa6daf Record dated selection translation repairs and support evidence
Update local repair counts and distinguish future catalogue support from native wording validation.

Thanks to xet7 !
2026-09-15 00:59:29 +03:00
Lauri Ojansivu 3a090333c5 Repair Tamazight multiselection and label shortcut text
Preserve label add/remove behavior, multiselection adds, and both 1-9 ranges. Reuse existing terminology; complete contextual grammar remains low confidence.

Thanks to xet7 !
2026-09-15 00:58:58 +03:00
Lauri Ojansivu 2fec4e7621 Record dated quick-access translation repair and terminology limits
Reconcile audit progress and preserve unresolved cybersecurity and software terminology review.

Thanks to xet7 !
2026-09-15 00:57:39 +03:00
Lauri Ojansivu 636dae2df1 Repair Tamazight quick-access star-board instruction
Replace Arabic with a Tamazight draft preserving star action and shortcut destination. Use contextual here rather than a physical bar noun. Software adaptation remains low confidence.

Thanks to xet7 !
2026-09-15 00:57:11 +03:00
Lauri Ojansivu c4c5a7496d Document checklist deadlines and multi-selection fixes in Upcoming
Record issue fixes, focused API/authorization checks, passing Chromium regressions and ongoing translation audit status.

Thanks to rmb82, AmigaAbattoir and xet7 !
2026-09-15 00:56:06 +03:00
Lauri Ojansivu 70202a849b Add checklist deadlines and expose checklist item dates in REST
Add optional checklist dueAt with the shared selected-calendar picker and badge. Return checklist and item deadlines from checklist and single-card GETs. Accept validated timezone-qualified ISO deadlines in checklist/item POST and PUT; null clears, omission preserves. Keep existing write permissions and ownership checks. Node regression and Chromium save/clear test pass.

Thanks to rmb82 and xet7 !

Fixes #6693,
2026-09-15 00:54:45 +03:00
Lauri Ojansivu a8226cc607 Use clicked label and member contexts for multi-selection
Read Blaze event data instead of surrounding template data. Chromium regression verifies mixed selections retain added labels and members; unit coverage distinguishes template and event contexts.

Thanks to AmigaAbattoir and xet7 !

Fixes #6694,
2026-09-15 00:54:07 +03:00
Lauri Ojansivu 059c3311de Fix multi-selection label and member popup actions
Correct reversed assign/unassign handlers, isolate bulk label selectors from the sidebar create-label action, stop propagation, await mutations and ignore repeated clicks in a double-click sequence. Behavioral regression verifies action direction and popup wiring.

Thanks to AmigaAbattoir and xet7 !

Fixes #6694,
2026-09-15 00:48:54 +03:00
Lauri Ojansivu c2ea7c6f18 Record Tamazight checklist terminology and audit progress
Document lexical components and continued contextual uncertainty.

Thanks to xet7 !
2026-09-15 00:48:05 +03:00
Lauri Ojansivu cda3ca9042 Align Tamazight checklist mark and unmark actions
Use IRCAM mark/sign terminology, preserving one/all distinctions. Software checkbox adaptation remains low confidence.

Thanks to xet7 !
2026-09-15 00:46:39 +03:00
Lauri Ojansivu 6523cd0955 Record Tamazight update terminology and repository review
Document bounded dictionary evidence, pending terminology and current audit counts.

Thanks to xet7 !
2026-09-15 00:45:27 +03:00
Lauri Ojansivu 52b264894b Repair Tamazight standalone update rule label
Use IRCAM's attested update noun as an action label without claiming an imperative. Contextual suitability remains low confidence.

Thanks to xet7 !
2026-09-15 00:45:04 +03:00
Lauri Ojansivu 00fd88b53f Document dated Tamazight popup warning repairs
Update audit totals and retain full phrase uncertainty.

Thanks to xet7 !
2026-09-15 00:44:24 +03:00
Lauri Ojansivu 7a51038bfb Repair Tamazight card and swimlane deletion popups
Preserve activity-feed removal, distinct reopening/recovery restrictions and no undo. Full contextual grammar remains low confidence.

Thanks to xet7 !
2026-09-15 00:44:01 +03:00
Lauri Ojansivu 37f94e1b25 Record dated Tamazight deletion warning repairs
Reconcile audit counts and preserve contextual grammar uncertainty.

Thanks to xet7 !
2026-09-15 00:43:11 +03:00
Lauri Ojansivu 9e26815db8 Repair Tamazight vote and card deletion notices
Preserve non-undoable deletion and loss of all related activities. Keep vote and card scopes distinct. Full contextual grammar remains low confidence.

Thanks to xet7 !
2026-09-15 00:42:49 +03:00
Lauri Ojansivu ba32c5f5c4 Document dated no-lost-items translation repair
Record lexical evidence, current queue counts and remaining agreement uncertainty.

Thanks to xet7 !
2026-09-15 00:41:56 +03:00
Lauri Ojansivu ab336422a0 Repair Tamazight no-lost-items restoration message
Preserve swimlane, list and card scope and negative restoration result. Full mixed-gender agreement remains low confidence.

Thanks to xet7 !
2026-09-15 00:41:34 +03:00
Lauri Ojansivu 6f531915a2 Record dated rescue-setting translation evidence
Update live audit counts and preserve native grammar uncertainty.

Thanks to xet7 !
2026-09-15 00:40:43 +03:00
Lauri Ojansivu c9f033fe36 Repair Tamazight unsaved-description rescue setting
Retain rescue dialogue before closing and unsaved card-description scope. Full contextual grammar remains low confidence.

Thanks to xet7 !
2026-09-15 00:40:19 +03:00
Lauri Ojansivu 15900b9597 Record Tamazight destination repairs and dated audit evidence
Keep the original pending queue and broader native-language uncertainty explicit.

Thanks to xet7 !
2026-09-15 00:39:17 +03:00
Lauri Ojansivu d9bcfcd2ff Repair Tamazight rule destinations and member fragments
Replace eight French fragments using existing native terminology. Preserve list ownership, list versus swimlane destinations, checklist identity and distinct add/remove actions. Complete contextual grammar remains low confidence.

Thanks to xet7 !
2026-09-15 00:38:55 +03:00
Lauri Ojansivu 9ce7d1369a Document Tamazight rule consistency repairs and remaining review
Update dated audit evidence and Upcoming release notes without treating structural checks as native fluency proof.

Thanks to xet7 !
2026-09-15 00:38:14 +03:00
Lauri Ojansivu 54218b150e Replace French Tamazight rule object and add-label wording
Reuse established card, checklist item and label terminology. Test distinct add/remove meanings and preserve translation tokens and human preference. Contextual phrasing remains low confidence.

Thanks to xet7 !
2026-09-15 00:37:50 +03:00
Lauri Ojansivu c224750b0e Record dated Tamazight checklist repairs and audit progress
Document dictionary evidence, full-phrase uncertainty and passing regression checks. Reconcile the live queue to 195 pending original findings.

Thanks to xet7 !
2026-09-15 00:37:12 +03:00
Lauri Ojansivu 35dcd699ab Repair Tamazight checklist item and comma instructions
Replace French rule labels using existing checklist terminology and the IRCAM punctuation-comma sense. Preserve the required comma-separated input instruction and regression coverage. Complete phrase grammar remains low confidence.

Thanks to xet7 !
2026-09-15 00:36:48 +03:00
Lauri Ojansivu 7f7ec51012 Document empty Wolaytta dictionary entries and reject unsupported terminology evidence 2026-09-15 00:33:14 +03:00
Lauri Ojansivu 27932bb15f Verify full native Wolaytta showing-word source and retain review limits 2026-09-15 00:31:53 +03:00
Lauri Ojansivu 79c1cf3d3b Record Wolaytta calendar-system draft and display-evidence limits 2026-09-15 00:30:54 +03:00
Lauri Ojansivu c5738aa535 Translate Wolaytta calendar-system date-display label 2026-09-15 00:30:25 +03:00
Lauri Ojansivu 9fbd3e3a22 Record Wolaytta Hijri drafts and remaining calendar qualifier review 2026-09-15 00:29:27 +03:00
Lauri Ojansivu ca3b8764b8 Translate Wolaytta generic and Umm al-Qura Hijri calendar labels 2026-09-15 00:29:01 +03:00
Lauri Ojansivu 7c44047568 Record Wolaytta named-calendar repairs and remaining compound review 2026-09-15 00:28:24 +03:00
Lauri Ojansivu af73885668 Repair Wolaytta Dangi and Minguo calendar labels 2026-09-15 00:28:00 +03:00
Lauri Ojansivu 80bc752794 Record Wolaytta Ethiopian calendar drafts and remaining native review 2026-09-15 00:27:10 +03:00
Lauri Ojansivu b7f18f9ce4 Translate Wolaytta Ethiopian calendar labels preserving Amete Alem 2026-09-15 00:26:45 +03:00
Lauri Ojansivu f51a2d9e2d Record Wolaytta calendar noun repairs and remaining system-label review 2026-09-15 00:25:57 +03:00
Lauri Ojansivu 12dfa02aeb Replace English Wolaytta calendar labels with native terminology 2026-09-15 00:25:29 +03:00
Lauri Ojansivu fe3d28048b Record Kashmiri tabular calendar repairs and remaining compound review 2026-09-15 00:24:35 +03:00
Lauri Ojansivu 59541a5ae9 Repair Kashmiri tabular Hijri calendar labels and distinguish epochs 2026-09-15 00:24:08 +03:00
Lauri Ojansivu ab415fa4fd Clarify Veps numerical-sum evidence and exclude prose-summary terminology 2026-09-15 00:22:57 +03:00
Lauri Ojansivu fe08f9334a Record migration help repair and individual-execution review limits 2026-09-15 00:21:37 +03:00
Lauri Ojansivu a00a983c12 Translate Tamazight migration help preserving individual execution 2026-09-15 00:21:14 +03:00
Lauri Ojansivu 08a286b983 Record description recovery translation and remaining native review 2026-09-15 00:20:05 +03:00
Lauri Ojansivu d9cebf2b08 Translate Tamazight card description recovery confirmation 2026-09-15 00:19:35 +03:00
Lauri Ojansivu 63ba71375e Record Tamazight unsaved-description repair and native review limits 2026-09-15 00:18:30 +03:00
Lauri Ojansivu ed8256d454 Translate Tamazight unsaved card description warning 2026-09-15 00:18:02 +03:00
Lauri Ojansivu dc61e2d512 Document verified Tamazight server wording and networking-port evidence limits 2026-09-15 00:16:59 +03:00
Lauri Ojansivu b18ccadae5 Record ordered duplicate-list confirmation translation and limits 2026-09-15 00:12:25 +03:00
Lauri Ojansivu 38c76afb79 Translate Tamazight ordered duplicate-list migration confirmation
Keep conversion before restricted deletion and preserve same-title populated counterpart and continuation question. Full compound grammar remains low confidence; removed migration behavior is unchanged.
2026-09-15 00:11:58 +03:00
Lauri Ojansivu 4f4aee90c2 Record empty-duplicate-list wording repair and remaining review 2026-09-15 00:10:46 +03:00
Lauri Ojansivu 8378f9f398 Translate Tamazight empty-duplicate-list repair description
Keep safety, only-empty-list restriction and same-title populated counterpart condition explicit. Full relative grammar remains low confidence; no removed migration is activated.
2026-09-15 00:10:20 +03:00
Lauri Ojansivu 82034901c7 Record duplicate-list confirmation repair and review limits 2026-09-15 00:09:19 +03:00
Lauri Ojansivu 8b44ebd33b Translate Tamazight duplicate-list deletion confirmation
Preserve certainty question and restriction to duplicate lists sharing a name and containing no cards. Full passive and shared-name grammar remain low confidence for native review.
2026-09-15 00:08:51 +03:00
Lauri Ojansivu 34f09318de Record missing-list confirmation repair and grammar limits 2026-09-15 00:07:40 +03:00
Lauri Ojansivu 8e7006cdec Translate Tamazight missing-list repair confirmation
Retain future discovery and repair statement with explicit continuation question. Match the description scope. Full question grammar and technical compounds remain low confidence; no removed migration is activated.
2026-09-15 00:07:15 +03:00
Lauri Ojansivu cf39983799 Record missing-list translation repair and unresolved confirmation 2026-09-15 00:06:20 +03:00
Lauri Ojansivu 59aa02a7ec Translate Tamazight missing-list repair description
Retain discovering and repairing missing or corrupted lists in board structure. Full passive grammar and computing adaptation remain low confidence. No removed migration is activated.
2026-09-15 00:05:53 +03:00
Lauri Ojansivu f4cfb898c3 Document remaining description terminology revisions 2026-09-15 00:04:43 +03:00
Lauri Ojansivu cb7df8bbca Distinguish Tamazight description wording in remaining field labels
Use IRCAM description noun in minicard-description and detailed-description labels while retaining summary and search shorthand. Surrounding phrase grammar remains under review; original ledger provenance is preserved.
2026-09-15 00:04:20 +03:00
Lauri Ojansivu 85994b6040 Record Tamazight bulk-card and description repairs 2026-09-15 00:03:34 +03:00
Lauri Ojansivu df50d9f6e2 Translate Tamazight bulk-card guidance and description terminology
Use dictionary-attested description wording distinct from summary. Preserve destination-card meaning and literal title/description JSON properties. Complete instruction grammar remains low confidence for native review.
2026-09-15 00:03:08 +03:00
Lauri Ojansivu 7a42706683 Record September 15 WIP translation repair and review limits 2026-09-15 00:01:56 +03:00
Lauri Ojansivu 414beceef5 Translate Tamazight WIP error recovery guidance
Preserve moving tasks out of this list or increasing the WIP limit. Avoid deletion wording from the French seed. Complete grammar, numerical-limit adaptation and politeness remain low confidence for native review.
2026-09-15 00:01:31 +03:00
Lauri Ojansivu bd5efc0563 Record Tamazight notification repairs and remaining wording review 2026-09-14 23:59:52 +03:00
Lauri Ojansivu 3eb7ae1030 Translate Tamazight participation and watch notification messages
Preserve distinct creator/member card scope and watched boards, lists or cards. Reuse notification wording and native watchlist components; complete passive and object agreement remain low confidence. No active client/model references were found for these catalogue keys.
2026-09-14 23:59:16 +03:00
Lauri Ojansivu c4b699b22b Record Kashmiri sighting draft and outstanding grammar review 2026-09-14 23:57:45 +03:00
Lauri Ojansivu 58809a7245 Translate Kashmiri Saudi moon-sighting calendar label
Replace English country-only wording with calendar, country and moon-seeing components. Complete nominalized phrase and grammatical agreement remain low confidence for native review.
2026-09-14 23:57:17 +03:00
Lauri Ojansivu 499f996a35 Record Fulah epoch repairs and remaining native wording review 2026-09-14 23:56:14 +03:00
Lauri Ojansivu 206859259f Translate Fulah tabular Hijri calendar epoch labels
Use dictionary-backed calculation, structured-table and beginning components. Retain distinct Julian epoch dates and existing sighting wording. Complete technical compounds and dialect consistency remain low confidence for native review.
2026-09-14 23:55:45 +03:00
Lauri Ojansivu 7850f41248 Link dated Fulah terminology evidence in audit and upcoming changelog 2026-09-14 23:55:04 +03:00
Lauri Ojansivu ee94227ea5 Document primary Fulah calendar component evidence and limits 2026-09-14 23:54:50 +03:00
Lauri Ojansivu b8e2f4a994 Document Quechua sighting terminology review 2026-09-14 23:53:26 +03:00
Lauri Ojansivu 3edd8d4996 Clarify Quechua Saudi moon-sighting calendar label
Use calendar and moon nouns with dictionary-attested sighting wording. Preserve distinct tabular calendar semantics and original correction provenance. Complete compound grammar remains low confidence for native review.
2026-09-14 23:53:03 +03:00
Lauri Ojansivu a55747c2aa Record Quechua epoch repairs and remaining native review 2026-09-14 23:52:20 +03:00
Lauri Ojansivu 963a3965b3 Distinguish Quechua tabular Hijri calendar epochs
Replace clock-only and English labels with calendar, table/count and beginning wording. Explicit Julian epoch dates retain the civil versus astronomical distinction. Complete technical compounds remain low confidence for native review.
2026-09-14 23:51:55 +03:00
Lauri Ojansivu 97729cc783 Record Tamazight notification repairs and remaining native review
Date source and dictionary evidence in audit and Upcoming changelog. Retain passive negation relative grammar and broader uncertain translation scope. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 23:47:42 +03:00
Lauri Ojansivu 3121eea2fc Replace French Tamazight muted and tracking notification instructions
Keep never-for-this-board and creator-or-member card notification scope distinct. Use IRCAM future negation and participant terms with existing notification wording. Four focused suites pass; passive inflection negation placement and complete relative grammar remain under native review.

Thanks to xet7.
2026-09-14 23:47:10 +03:00
Lauri Ojansivu bbec77a73e Record Tamazight reminder repairs and unresolved wording evidence
Date reminder-root and temporal evidence with source commit and passing checks. Keep aspect accessibility Aromanian and all broader uncertain findings in scope.

Thanks to xet7.
2026-09-14 23:45:54 +03:00
Lauri Ojansivu 6171a92af5 Replace French Tamazight due reminders with distinct sourced drafts
Preserve approaching now and past deadline meanings and exact placeholders. Use IRCAM reminder marked variant and approach/passage roots with existing deadline terminology. Four focused suites pass; inflection and temporal aspect remain under native review.

Thanks to xet7.
2026-09-14 23:45:15 +03:00
Lauri Ojansivu e2fa48fbf5 Record Tamazight uptime correction and unresolved diagnostic terminology
Date source and dictionary evidence and update Upcoming changelog. Retain native clause and platform/load-average review limits. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 23:43:21 +03:00
Lauri Ojansivu 2ad05d681d Replace Arabic Tamazight OS uptime label with elapsed-time draft
Describe time since operating-system start, matching os.uptime and the Information view. Use IRCAM beginning, passage and operating-system terms; avoid film runtime and physical platform senses. Four focused suites pass after removing a duplicate test constant. Relative clause and computing-startup adaptation remain under native review.

Thanks to xet7.
2026-09-14 23:42:45 +03:00
Lauri Ojansivu aec5334e76 Record attested Tamazight ordering wording and review limits
Date the source correction and primary dictionary/software evidence. Preserve remaining native grammar review scope and record passing audit and changelog checks.

Thanks to xet7.
2026-09-14 23:41:28 +03:00
Lauri Ojansivu 3e7b05f82c Use attested Tamazight ordering noun in migration description
Replace the speculative derived noun with IRCAM anmala, also attested in MediaWiki default-sort software wording. Preserve original ledger before-value and add negative regression for the superseded form. Four focused suites pass; full grammar and other technical compounds remain under review.

Thanks to xet7.
2026-09-14 23:40:59 +03:00
Lauri Ojansivu c7da5056ba Record Tamazight migration draft evidence and native-review limits
Update dated audit progress and Upcoming changelog with the source commit, lexical evidence and passing checks. Preserve low-confidence grammar and technical compounds in the full audit scope.

Thanks to xet7.
2026-09-14 23:40:01 +03:00
Lauri Ojansivu ef2b560fcb Replace French Tamazight migration description with sourced draft
Preserve board data integrity checks and repair scope, including list ordering card positioning and swimlane structure. Use IRCAM lexical evidence and record derived ordering noun, inflection and computing collocations as low confidence. Four focused suites pass after correcting the regression test root constant; removed migration code remains removed.

Thanks to xet7.
2026-09-14 23:39:30 +03:00
Lauri Ojansivu 2bed0f7506 Record Latin Uzbek regional and loading translation progress
Date source-backed automatic loading repairs and regional board terminology review. Preserve Arabic-script and broader native-review scope. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 23:37:43 +03:00
Lauri Ojansivu 11db754498 Repair Latin Uzbek regional board terms and current loading guidance
Translate automatic card loading, threshold, live count and exact operator environment overrides. Replace personal laziness sense with on-demand loading. Carry reviewed board forms into matching regional prose and review eight independent core roadmap clone and notification values. Five suites pass including 28 loading behavior checks; Arabic-script and native technical reviews remain open.

Thanks to xet7.
2026-09-14 23:37:15 +03:00
Lauri Ojansivu cf9c60bf9d Record Uzbek sentence repairs and unfinished technical translation review
Update dated audit progress and Upcoming changelog with source and morphology evidence. Record stale loading guidance as unfinished and retain all broader uncertain findings. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 23:35:40 +03:00
Lauri Ojansivu 51dd395230 Repair remaining Uzbek Kanban board terminology and cases
Review all council-term sentences against English and use the established taxta board noun. Preserve plural case and possessive morphology, with explicit selection schedule search invitation and multi-board corrections. Translate visibility with existing labels and preserve HTML. Five focused suites pass; stale loading instructions and remaining technical phrasing stay in scope.

Thanks to xet7.
2026-09-14 23:35:08 +03:00
Lauri Ojansivu 1c1036c795 Record Khmer sentence repairs and remaining translation review
Date the whole Khmer council-sense sweep and related semantic fixes. Update the short audit summary and Upcoming changelog with source commit and passing validation while retaining full technical review scope.

Thanks to xet7.
2026-09-14 23:33:53 +03:00
Lauri Ojansivu bc8d3b2330 Repair remaining Khmer Kanban board and related word senses
Review all council-term sentences against English and replace the governing body sense with the established board noun. Correct financial deposit, list purchasing, multi-board calendar and extra board in swimlane selection. Translate visibility terms using existing locale labels and preserve HTML. Five focused suites pass; full native technical compounds remain under review.

Thanks to xet7.
2026-09-14 23:33:24 +03:00
Lauri Ojansivu dc227197b7 Record Uzbek Khmer terminology repairs and remaining council wording
Update dated audit and Upcoming changelog with source evidence, alias correction and validation. Keep broader council-term sentences and native computing collocations under review. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 23:32:18 +03:00
Lauri Ojansivu ca9bf7a977 Correct Uzbek and Khmer Kanban board terminology and archive guidance
Distinguish Kanban boards from administrative councils in board labels and restore actions. Use Archive on All Boards in complete instructions. Preserve Khmer locale aliases and historical ledger before-values. Five focused suites pass after correcting alias bookkeeping; remaining council wording and native computing collocations stay under review.

Thanks to xet7.
2026-09-14 23:31:48 +03:00
Lauri Ojansivu 81a03829f6 Record eight-language archive repairs and remaining wording review
Update dated audit progress and Upcoming changelog with source commit and validation. Keep Uzbek Khmer remaining archive locales and native collocation reviews in scope. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 23:30:22 +03:00
Lauri Ojansivu 2070173c0a Correct archive navigation instructions in eight languages
Use existing Archive and All Boards labels in Malayalam Marathi Gujarati Punjabi Nepali Sinhala Mongolian and Kazakh. Preserve restoration terminology and replace obsolete header navigation, including the English Sinhala Archive label. Five focused suites pass; full native collocation review remains part of the broader audit.

Thanks to xet7.
2026-09-14 23:29:53 +03:00
Lauri Ojansivu cfe4db7aae Record archive translation repairs and remaining review scope
Date the Irish Serbian and Tagalog corrections, cite Irish dictionary evidence and preserve native-review limits. Update the short audit summary and Upcoming changelog with the local source commit. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 23:29:06 +03:00
Lauri Ojansivu 110c58002c Repair Irish Serbian and Tagalog archive guidance
Use the Archive section on All Boards and preserve existing locale labels. Choose the attested Irish bring-back sense, preserve Serbian board terminology, and replace mixed English in Tagalog. Full Irish navigation grammar remains a derived translation pending native review. Five focused suites pass.

Thanks to xet7.
2026-09-14 23:28:39 +03:00
Lauri Ojansivu bc8b765ca2 Verify RTL language marker placement in both browser directions
Accept template whitespace in the regional row assertion. Confirm both LTR and RTL Chromium layout tests pass and record the existing first-line marker fix under the Upcoming release.

Thanks to xet7.
2026-09-14 23:27:53 +03:00
Lauri Ojansivu df09cc36c3 Record additional multilingual archive translation repair progress
Update dated audit and Upcoming with 21-file repair and native terminology evidence. Preserve low-confidence computing phrases and remaining locale reviews. Three documentation suites pass.

Thanks to xet7.
2026-09-14 23:23:27 +03:00
Lauri Ojansivu 262f23764c Repair archive guidance in 21 additional languages and variants
Correct current Archive locations and Zulu place labels. Replace Bulgarian in Macedonian, phonetic English in Urdu and mixed English in Maltese. Five focused suites pass; Maltese/Zulu computing collocations remain low confidence and other locale reviews remain open.

Thanks to xet7.
2026-09-14 23:23:01 +03:00
Lauri Ojansivu 65b121aae2 Record multilingual archive guidance corrections and review progress
Update dated audit and Upcoming with 34-file repair, six consistent place labels and superseded Galician acceptance. Retain other locale and native/UI review limits. Three documentation suites pass.

Thanks to xet7.
2026-09-14 23:21:51 +03:00
Lauri Ojansivu 801dcf1a81 Repair archive guidance in 34 additional locale files
Replace obsolete locations and Persian-in-Arabic/Malay-in-Indonesian prose. Correct six base/regional Archive place labels, keeping guidance consistent. Supersede the Galician unchanged acceptance with its dated correction. Focused locale/menu suites pass; other languages and browser paths remain open.

Thanks to xet7.
2026-09-14 23:21:25 +03:00
Lauri Ojansivu 15fc53d551 Record additional archive translation repairs and progress
Document 21 repaired locale files, three Archive label corrections, independent regional review and remaining uncertainty. Update dated audit and Upcoming; three documentation suites pass.

Thanks to xet7.
2026-09-14 23:19:15 +03:00
Lauri Ojansivu f8708e3d2d Repair archive guidance in 21 more locale files
Correct obsolete locations and three Archive place labels. Review independent Argentine Spanish, Peruvian Spanish and Brazilian Portuguese guidance; update matching regional copies elsewhere. Five focused suites pass. Czech main-menu wording retained; Serbian terminology and other locales remain open.

Thanks to xet7.
2026-09-14 23:18:48 +03:00
Lauri Ojansivu e3c547b6b7 Record 27-locale archive guidance repair progress
Update dated audit and Upcoming with repaired languages, exact-copy regional handling and correct Swedish retention. Preserve other locale, native grammar and browser verification requirements. Three documentation suites pass.

Thanks to xet7.
2026-09-14 23:17:53 +03:00
Lauri Ojansivu f1c15bd0e9 Repair archive restoration guidance in 27 locale files
Replace obsolete header locations with current Archive section and All Boards page, using existing localized place labels. Update reviewed base languages and identical regional copies; retain correct Swedish main-menu wording. Five focused locale/menu suites pass; other locales and browser paths remain to review.

Thanks to xet7.
2026-09-14 23:17:26 +03:00
Lauri Ojansivu 590a7be901 Record archive guidance repairs and remaining multilingual review
Update dated progress and Upcoming with the source commit. Preserve native grammar, unexecuted restoration UI and other locale-location review requirements. Three documentation suites pass.

Thanks to xet7.
2026-09-14 23:16:24 +03:00
Lauri Ojansivu 1439654600 Correct board archive restoration guidance location
Replace outdated home-header button wording with the active Archive section on All Boards. Update English and six variants and replace complete French Tamazight prose. Five locale/menu suites pass. Tamazight full phrasing and other locale locations remain under review.

Thanks to xet7.
2026-09-14 23:15:57 +03:00
Lauri Ojansivu 56e6579639 Update archive source-guidance audit progress and Upcoming
Link the dated source review and retain English/locale wording repairs as unfinished. Three documentation suites pass.

Thanks to xet7.
2026-09-14 23:15:04 +03:00
Lauri Ojansivu de14ab2b60 Identify outdated archive location in translation source guidance
Record active All Boards Archive menu source and commented-out header control. Keep English and corresponding locale repairs open rather than reproducing obsolete navigation. Existing All Boards and audit suites pass; no browser execution or locale changes claimed.

Thanks to xet7.
2026-09-14 23:14:45 +03:00
Lauri Ojansivu 185a5033b5 Link Tamazight archive terminology review in audit and Upcoming
Record the local review commit while retaining unresolved full guidance and unchanged repair counts. Three documentation suites pass.

Thanks to xet7.
2026-09-14 23:13:34 +03:00
Lauri Ojansivu 1444c8f947 Review native Tamazight home and archive guidance terminology
Retain the native-supported home-page term. Distinguish plug and clothing-button senses from UI terminology and leave full French guidance unresolved. Record source evidence and next verification requirements without claiming fluency or browser execution. Three audit/changelog suites pass.

Thanks to xet7.
2026-09-14 23:13:18 +03:00
Lauri Ojansivu 15f674a5c9 Record Tamazight remaining-time repair and native review limits
Update dated audit and Upcoming with the source commit, primary dictionary entries and original-versus-unflagged counts. Preserve relative grammar and dormant-key browser verification limits. Three documentation suites pass.

Thanks to xet7.
2026-09-14 23:12:03 +03:00
Lauri Ojansivu 852861ce06 Replace French Tamazight remaining-time lockout label
Use IRCAM time/remain terminology in a full draft. Keep remaining duration distinct from configured lockout period and failure window. Four locale suites pass; relative verb and countdown collocation remain low confidence.

Thanks to xet7.
2026-09-14 23:11:32 +03:00
Lauri Ojansivu 27dd0ddb8f Record Tamazight locked-users catalogue repair progress
Document native wording evidence, full causal-phrase uncertainty and absence of browser rendering proof. Update dated audit counts and Upcoming with the exact source commit. Three documentation suites pass.

Thanks to xet7.
2026-09-14 23:10:34 +03:00
Lauri Ojansivu 8d3dca66a7 Replace French Tamazight locked-users description
Retain plural blocked users, current state and repeated login-failure reason in a full draft. Keep empty-state and individual lockout messages distinct. Four locale suites pass; native causal phrasing remains low confidence.

Thanks to xet7.
2026-09-14 23:10:07 +03:00
Lauri Ojansivu d5263b769b Record Tamazight temporary lockout repair and uncertainty
Update dated audit counts and Upcoming with the source commit. Record native vocabulary evidence, full-phrase review limits and unexecuted authentication UI coverage. Three audit and changelog suites pass.

Thanks to xet7.
2026-09-14 23:09:08 +03:00
Lauri Ojansivu b54bc8935e Replace French Tamazight temporary account lockout message
Preserve the temporary period, repeated failed logins and retry-later instruction in a complete draft. Four locale suites pass; full causal and temporal grammar remains low confidence.

Thanks to xet7.
2026-09-14 23:08:39 +03:00
Lauri Ojansivu d1262eeeb7 Record Tamazight archive label fixes and Chromium verification
Update dated audit and Upcoming with native restore terminology, exact source commit and successful archive-title cancellation test. Preserve native-compound and board-restoration verification limits. Three documentation suites pass.

Thanks to xet7.
2026-09-14 23:07:30 +03:00
Lauri Ojansivu 1e3ccd4f04 Repair Tamazight archive question and board restore action
Replace French and Arabic labels with native archive-list wording and the attested restore verb. Preserve distinct archive/restore actions. Four locale suites pass; Chromium verifies the archive title and cancellation (1 passed). Board restoration has source coverage; native computing compounds remain under review.

Thanks to xet7.
2026-09-14 23:07:00 +03:00
Lauri Ojansivu 12159a80cd Record Tamazight troubleshooting repair and remaining grammar review
Update dated audit progress and Upcoming with the source commit, native terminology references and command-preservation checks. Retain full-phrase uncertainty and unexecuted browser-path limits. Three audit and changelog suites pass.

Thanks to xet7.
2026-09-14 23:04:20 +03:00
Lauri Ojansivu 1f0d464940 Replace French Tamazight troubleshooting instructions
Translate the complete server-error message with native send/error and IRCAM server/installation terminology. Preserve both exact shell commands and separate Snap/Docker lines. Four locale suites pass; full clause grammar remains low confidence.

Thanks to xet7.
2026-09-14 23:03:53 +03:00
Lauri Ojansivu 8cd4ce84a7 Record Tamazight architecture repair and correct browser audit status
Document IRCAM terminology, CPU metric semantics and remaining uncertainty. Correct stale unrun-browser statements using the existing dated executions. Record the conference-reference check without treating French proceedings as native terminology evidence. Three audit and changelog suites pass.

Thanks to xet7.
2026-09-14 23:02:27 +03:00
Lauri Ojansivu 69d9adb6c3 Replace Arabic Tamazight architecture diagnostic label
Use IRCAM tamsdagt, attested for architecture and modular architecture. Preserve the os.arch CPU metric and its distinct OS type/platform meaning. Add positive and negative locale/source regressions; four suites pass. Computing specialization remains low confidence.

Thanks to xet7.
2026-09-14 23:01:52 +03:00
Lauri Ojansivu 4ae41fc190 Record Tamazight OS terminology repairs and verification limits
Document native sources, actual OS metric semantics and remaining low-confidence adaptations. Update translation progress and Upcoming with the source commit. Three documentation and changelog suites pass.

Thanks to xet7.
2026-09-14 22:59:50 +03:00
Lauri Ojansivu 163a755c0d Replace Arabic Tamazight OS release and type labels 2026-09-14 22:56:53 +03:00
Lauri Ojansivu 05fe6af8dd Record Tamazight memory repair sources and uncertainty 2026-09-14 22:55:56 +03:00
Lauri Ojansivu 1bfe768280 Replace Arabic Tamazight free-memory diagnostic label 2026-09-14 22:55:30 +03:00
Lauri Ojansivu 83fefedd5d Record Tamazight debug error repair and remaining native review 2026-09-14 22:54:07 +03:00
Lauri Ojansivu 138b1b0af3 Replace French Tamazight debug catalogue error 2026-09-14 22:53:42 +03:00
Lauri Ojansivu 44540b6091 Record Tamazight Excel repair and refreshed audit counts 2026-09-14 22:52:28 +03:00
Lauri Ojansivu 56c2c53314 Replace French Tamazight Excel field selection prompt 2026-09-14 22:52:04 +03:00
Lauri Ojansivu 6b9b59bc91 Record Tamazight Default repairs and verified lane rendering 2026-09-14 22:50:38 +03:00
Lauri Ojansivu 58169ab23e Replace French Tamazight Default labels with native default wording 2026-09-14 22:50:15 +03:00
Lauri Ojansivu 8a8fbba5c1 Record Tamazight board label repairs and native review limits 2026-09-14 22:48:37 +03:00
Lauri Ojansivu 1efbb9034f Verify repaired Tamazight board action titles in Chromium 2026-09-14 22:48:12 +03:00
Lauri Ojansivu 164268616f Replace Arabic and French Tamazight board control labels 2026-09-14 22:47:41 +03:00
Lauri Ojansivu b4828fb05b Record verified Tamazight conjunction repair and remaining scope 2026-09-14 22:46:34 +03:00
Lauri Ojansivu 4941f33fd6 Replace French conjunction in Tamazight sidebar alternatives 2026-09-14 22:46:09 +03:00
Lauri Ojansivu 4552421de2 Record successful Tamazight numeric tooltip browser verification 2026-09-14 22:45:04 +03:00
Lauri Ojansivu 75fbb698c6 Repair Tamazight total tooltip browser fixture settings and navigation 2026-09-14 22:44:44 +03:00
Lauri Ojansivu e1c0f45448 Record Ewe calendar source review and unresolved translation scope 2026-09-14 22:41:52 +03:00
Lauri Ojansivu e7d0f821cc Document unresolved Ewe calendar epoch terminology from primary CLDR source 2026-09-14 22:41:33 +03:00
Lauri Ojansivu 1427cbd215 Document direct native evidence for Veps linking action 2026-09-14 22:40:32 +03:00
Lauri Ojansivu 2dbc6ba3aa Use native Veps linking imperative instead of assembled draft 2026-09-14 22:40:11 +03:00
Lauri Ojansivu 3f7923ff0e Record Veps link draft evidence and remaining uncertainty 2026-09-14 22:38:51 +03:00
Lauri Ojansivu 3f83638368 Replace Finnish Veps link action with documented Veps draft 2026-09-14 22:38:28 +03:00
Lauri Ojansivu b98f6bfec5 Record successful Basque rule grammar browser verification 2026-09-14 22:37:07 +03:00
Lauri Ojansivu c9005ee0af Repair Basque rule grammar browser test fixtures and resumed navigation 2026-09-14 22:36:47 +03:00
Lauri Ojansivu 1f2eac8b9d Record Basque assignee control order repair and browser verification status 2026-09-14 22:30:17 +03:00
Lauri Ojansivu cff1fdc323 Apply Basque named subject order to the assignee rule control 2026-09-14 22:29:50 +03:00
Lauri Ojansivu 6a11dd75d1 Record dated Basque assignee repair and unresolved named row composition 2026-09-14 22:29:08 +03:00
Lauri Ojansivu 486be57435 Correct Basque assignee rule subject from imperative to noun phrase 2026-09-14 22:28:46 +03:00
Lauri Ojansivu e24479f67b Record dated Veps card display drafts and remaining phrase review 2026-09-14 22:27:17 +03:00
Lauri Ojansivu 3b12f68c71 Replace Finnish Veps card display labels with complete native drafts 2026-09-14 22:26:46 +03:00
Lauri Ojansivu 7c1091e127 Record dated Veps parent control drafts and native review limits 2026-09-14 22:25:55 +03:00
Lauri Ojansivu b479af98fa Repair Veps parent change and display controls with native drafts 2026-09-14 22:25:31 +03:00
Lauri Ojansivu b6f45414af Record dated Veps parent display draft and reconcile pending counts 2026-09-14 22:24:41 +03:00
Lauri Ojansivu e8692f14a6 Repair Veps parent display instruction with complete native wording draft 2026-09-14 22:24:14 +03:00
Lauri Ojansivu 8d0c2b2a96 Record dated Veps parent label draft and remaining native review 2026-09-14 22:23:19 +03:00
Lauri Ojansivu 439a18989e Replace Finnish Veps parent card label with native terminology draft 2026-09-14 22:22:48 +03:00
Lauri Ojansivu 6db84838e6 Record dated primary Veps arithmetic review and unresolved phrases 2026-09-14 22:22:12 +03:00
Lauri Ojansivu a9d68dc927 Verify primary Veps arithmetic addition vertical and top terminology 2026-09-14 22:21:47 +03:00
Lauri Ojansivu 2d31aab1ca Record dated Veps inheritance draft and remaining grammar review 2026-09-14 22:19:58 +03:00
Lauri Ojansivu 3ba133c106 Replace Venda seeded Veps inheritance instruction with native terminology draft 2026-09-14 22:19:31 +03:00
Lauri Ojansivu 8382f7c385 Record dated primary Veps inheritance evidence and open phrase review 2026-09-14 22:18:37 +03:00
Lauri Ojansivu e1ab5e4fa3 Document primary Veps inheritance verb and visual dictionary verification 2026-09-14 22:18:14 +03:00
Lauri Ojansivu 60ac57a36d Record dated Veps hide empty action repair and native review limits 2026-09-14 22:16:20 +03:00
Lauri Ojansivu 3a10fb9277 Correct reversed Veps hide empty lists label with native wording draft 2026-09-14 22:15:56 +03:00
Lauri Ojansivu f302d1c23f Record dated Veps filter drafts and unresolved native review 2026-09-14 22:15:02 +03:00
Lauri Ojansivu a60cf42adb Replace Finnish Veps filter headings with native terminology drafts 2026-09-14 22:14:33 +03:00
Lauri Ojansivu 0b142d43fb Record dated Veps popup title fixes and phrase research limits 2026-09-14 22:13:36 +03:00
Lauri Ojansivu 84bffe61ad Replace Finnish More popup titles with native Veps wording 2026-09-14 22:13:11 +03:00
Lauri Ojansivu 39e34b4be2 Document dated Veps terminology repairs and parser verification 2026-09-14 22:12:03 +03:00
Lauri Ojansivu 70d9264f1d Repair Veps title and page nouns and verify localized title searches 2026-09-14 22:11:38 +03:00
Lauri Ojansivu 8ec9a5bd8a Record dated Veps action label repairs and remaining audit work 2026-09-14 22:10:08 +03:00
Lauri Ojansivu 6c30c4cfcc Replace three Finnish Veps action labels with native wording 2026-09-14 22:09:41 +03:00
Lauri Ojansivu ba75b76d27 Record dated all locale formatting verification
Update audit scope and upcoming changelog without claiming native quality or browser completion. Documentation checks pass.

Thanks to xet7.
2026-09-14 22:05:14 +03:00
Lauri Ojansivu 55562f666a Verify positional limit error formatting across every locale file
Execute the actual translation method and installed formatter against all 246 locale files. Verify one percent placeholder and exact substitution of a value containing percent. Regression passes; this does not certify native fluency or lazy loading.

Thanks to xet7.
2026-09-14 22:04:51 +03:00
Lauri Ojansivu 2c0ad73e1e Record dated activity terminology revision and confidence limits
Update audit and upcoming changelog without double-counting revised corrections. Documentation checks pass.

Thanks to xet7.
2026-09-14 22:04:19 +03:00
Lauri Ojansivu e3ae37bc5d Revise received time activity drafts with primary reception term
Replace earlier derived reception noun in two Tamazight drafts while preserving time placeholders and original provenance history. Record remaining genitive and full-clause uncertainty. Four translation checks pass.

Thanks to xet7.
2026-09-14 22:03:56 +03:00
Lauri Ojansivu 357c1e75a7 Record dated received and due label draft progress
Update audit and upcoming changelog with semantic limits and unchanged original queue counts. Documentation checks pass.

Thanks to xet7.
2026-09-14 22:02:45 +03:00
Lauri Ojansivu 822d6dfb53 Draft consistent Tamazight received and due date labels
Replace three wrong-language field labels while preserving received/due distinctions and existing date terminology. Record software reception and deadline uncertainty. Four translation checks pass.

Thanks to xet7.
2026-09-14 22:02:20 +03:00
Lauri Ojansivu 30b0f35820 Record audit summary consolidation in upcoming changelog
Link the dated summary cleanup and verified scope without claiming additional translation repairs. Changelog checks pass.

Thanks to xet7.
2026-09-14 22:01:27 +03:00
Lauri Ojansivu 61484d5df4 Consolidate translation audit runtime progress summary
Keep current runtime coverage concise while preserving dated evidence and native/browser limitations. Revalidate live queue totals and confirm no localhost app is running. Audit regression passes; no translation counts are changed.

Thanks to xet7.
2026-09-14 22:01:16 +03:00
Lauri Ojansivu 8e047f0c0c Record dated creation label parser verification
Update audit and upcoming changelog with actual metadata dispatch coverage and native/browser limitations. Documentation checks pass.

Thanks to xet7.
2026-09-14 22:00:39 +03:00
Lauri Ojansivu 27f6c9d2ab Verify Tamazight creation filtering and sorting labels
Exercise actual translated creation date and ascending/descending sort queries; reject invalid date periods. Deterministic date helpers isolate parser metadata mapping. Focused regression passes.

Thanks to xet7.
2026-09-14 22:00:19 +03:00
Lauri Ojansivu a7942c44cf Record dated export label drafts and remaining semantic review
Refresh audit counts and upcoming changelog with full field-order evidence and software terminology limits. Documentation checks pass.

Thanks to xet7.
2026-09-14 21:59:21 +03:00
Lauri Ojansivu 49aec4fa92 Draft Tamazight export dates and creation labels
Replace French with complete five-field date export wording and creation search labels. Preserve field order and record software reception and deadline uncertainty. Four translation checks pass.

Thanks to xet7.
2026-09-14 21:58:53 +03:00
Lauri Ojansivu 246fde916e Record dated date predicate runtime verification
Update audit and upcoming changelog with real parser coverage and outstanding browser/native review. Documentation checks pass.

Thanks to xet7.
2026-09-14 21:57:56 +03:00
Lauri Ojansivu bc9860dffe Verify Tamazight start and end existence predicates
Exercise actual localized has queries for present and absent start/end dates and reject those predicates for sorting. Parser regression passes without changing query behavior.

Thanks to xet7.
2026-09-14 21:57:34 +03:00
Lauri Ojansivu fa7b93b797 Record dated date field repairs and remaining export review
Update audit and upcoming changelog with primary start/end terms and unchanged original queue counts. Documentation checks pass.

Thanks to xet7.
2026-09-14 21:57:08 +03:00
Lauri Ojansivu b0f447c578 Repair Tamazight start and end rule and predicate labels
Replace four Arabic values with existing primary-dictionary start/end terms and preserve date-field distinctions. Four translation checks pass. Record actual rule and search mappings without claiming browser validation.

Thanks to xet7.
2026-09-14 21:56:43 +03:00
Lauri Ojansivu 7e56bc7d32 Record dated spinner wording drafts and audit progress
Refresh reconciled counts and upcoming changelog with source evidence and native software compound uncertainty. Documentation checks pass.

Thanks to xet7.
2026-09-14 21:54:46 +03:00
Lauri Ojansivu aebb361d29 Draft Tamazight descriptions for four wait spinner styles
Replace French descriptions with native waiting-indicator terminology while preserving exact animation identifiers. Exclude textile spinning senses and record compound adaptation uncertainty. Four translation checks pass.

Thanks to xet7.
2026-09-14 21:54:12 +03:00
Lauri Ojansivu b8ee40567c Record dated invitation drafts and source confidence
Refresh audit counts and upcoming changelog, preserving secondary-source and native grammar limitations. Documentation checks pass.

Thanks to xet7.
2026-09-14 21:53:02 +03:00
Lauri Ojansivu a47e7141d6 Draft Tamazight invitation acceptance wording
Replace Arabic accept and French invitation status with complete drafts preserving not yet. Record secondary verb provenance and low-confidence passive grammar. Four focused translation checks pass.

Thanks to xet7.
2026-09-14 21:52:38 +03:00
Lauri Ojansivu 5accbf5f03 Record dated retained email review and invitation uncertainty
Update audit and upcoming changelog with contextual evidence while preserving unresolved wording and counts. Documentation checks pass.

Thanks to xet7.
2026-09-14 21:51:48 +03:00
Lauri Ojansivu 3eaad375b3 Review retained Tamazight email warning against native software
Attach Common Voice email-specific already-used predicate evidence to the prior correction without changing the translation. Preserve remaining agreement and browser limits and distinguish unrelated import uncertainties. Ledger check passes.

Thanks to xet7.
2026-09-14 21:51:25 +03:00
Lauri Ojansivu e7244c8e8b Record dated native corpus discovery and audit status
Refresh audit and upcoming changelog with usable source paths and unresolved terminology. Documentation checks pass.

Thanks to xet7.
2026-09-14 21:50:23 +03:00
Lauri Ojansivu 4659005b14 Locate current native Tamazight software corpus
Record current Common Voice translation resource paths and distinguish project metadata and obsolete URLs from native terminology evidence. Repository wording remains unresolved; no locale changes are claimed.

Thanks to xet7.
2026-09-14 21:49:58 +03:00
Lauri Ojansivu f35edb3e5a Record dated repository terminology review progress
Update the short translation audit and upcoming changelog while retaining unresolved complete wording. Documentation checks pass.

Thanks to xet7.
2026-09-14 21:48:20 +03:00
Lauri Ojansivu c831eb7e1d Review repository upload terminology and action semantics
Distinguish source repositories from data warehouses and update verbs from nouns. Record native software-message evidence and complete pending action requirements without falsely counting a repair.

Thanks to xet7.
2026-09-14 21:48:03 +03:00
Lauri Ojansivu c2bd01f653 Record dated relative syntax review and remaining uncertainty
Update translation audit progress and upcoming changelog without changing counts or claiming complete native validation. Documentation checks pass.

Thanks to xet7.
2026-09-14 21:47:12 +03:00
Lauri Ojansivu 44cb2f6ca1 Strengthen domain label provenance with relative syntax evidence
Record primary relative marker and possession studies directly in the correction ledger. Preserve original before and after values and retain plural-clause uncertainty. Ledger regression passes.

Thanks to xet7.
2026-09-14 21:46:50 +03:00
Lauri Ojansivu 2152708eb9 Record dated possession grammar review progress
Refresh the short audit and upcoming changelog with primary evidence and unresolved plural wording. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 21:46:00 +03:00
Lauri Ojansivu bc406fcae6 Review primary Amazigh possession syntax for domain label
Record Taifi prepositional possession evidence and distinguish it from unverified plural relative agreement and complete software wording. No locale is declared repaired by this review.

Thanks to xet7.
2026-09-14 21:45:43 +03:00
Lauri Ojansivu 27edeb340f Record dated conditional label draft and audit progress
Update reconciled translation audit counts and upcoming changelog with primary evidence and unresolved native grammar. Documentation checks pass.

Thanks to xet7.
2026-09-14 21:44:13 +03:00
Lauri Ojansivu 94205ae5fe Draft conditional Tamazight automatic user addition label
Replace Arabic with a complete users-with-domain-name draft and preserve automatic addition. Record primary terminology and assembled relative-clause uncertainty. Four focused translation checks pass.

Thanks to xet7.
2026-09-14 21:43:49 +03:00
Lauri Ojansivu aec19d0377 Record dated restoration title draft and audit counts
Update translation audit evidence and upcoming changelog with primary terminology and unresolved native agreement. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 21:43:03 +03:00
Lauri Ojansivu 73543f47ae Draft Tamazight lost card restoration title
Replace French stored title with complete restore, cards and lost components from the primary dictionary. Record adjective agreement and software metaphor uncertainty. Four focused translation checks pass; no migration implementation is restored.

Thanks to xet7.
2026-09-14 21:42:37 +03:00
Lauri Ojansivu a4901900bd Record dated positional formatting repair and verification
Update translation audit progress and upcoming changelog with actual formatter coverage and remaining native and browser limitations. Documentation checks pass.

Thanks to xet7.
2026-09-14 21:41:43 +03:00
Lauri Ojansivu c74009b21b Format direct positional translation arguments
Convert scalar TAPi18n arguments to sprintf options so search errors replace percent placeholders. Preserve named options, explicit format arrays and zero. Actual translation method and installed formatter regressions pass alongside parser and lazy-loading checks.

Thanks to xet7.
2026-09-14 21:41:20 +03:00
Lauri Ojansivu c62359895d Record parser verification and translation audit limits
Document real translated limit-query regressions and the zero-limit distinction without claiming browser interpolation or native acceptance. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 21:40:21 +03:00
Lauri Ojansivu 8715c094e1 Verify Tamazight limit errors through the search parser
Exercise negative and nonnumeric translated limit queries and preserve offending values for percent interpolation. Verify positive and zero-limit queries remain accepted. This checks parser dispatch rather than native fluency or browser rendering.

Thanks to xet7.
2026-09-14 21:40:00 +03:00
Lauri Ojansivu d32bd885d3 Record dated search limit draft and unresolved native review
Refresh reconciled audit counts and dated primary-source evidence. Preserve low-confidence grammar and browser limitations. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 21:39:23 +03:00
Lauri Ojansivu 10b47a7ed1 Draft complete Tamazight search limit validation error
Replace French with software validation wording and retain the positive integer condition and percent placeholder. Record native message and dictionary evidence with cross-variety grammar limits. Four focused translation checks pass.

Thanks to xet7.
2026-09-14 21:38:58 +03:00
Lauri Ojansivu 4cd4991d73 Record dated search limit terminology review progress
Refresh the audit summary and upcoming changelog with the primary terminology review, preserving all unresolved findings. Three audit and changelog checks pass.

Thanks to xet7.
2026-09-14 21:38:04 +03:00
Lauri Ojansivu 08df9a3479 Review Tamazight search limit error terminology
Document primary dictionary distinctions between computing validation and disability senses of invalid. Preserve the pending full error and percent placeholder rather than introduce a misleading literal substitution.

Thanks to xet7.
2026-09-14 21:37:44 +03:00
Lauri Ojansivu a60552f09b Record dated computing domain repair and matching semantics
Update the short audit summary and detailed evidence with terminology provenance, unchanged pending counts and the exact email-domain condition still needed in automatic-addition wording. Audit and changelog checks pass.

Thanks to xet7.
2026-09-14 21:36:52 +03:00
Lauri Ojansivu da45e203ac Correct Tamazight computing domain terminology
Use the documented computing-domain noun instead of geographic region in domain lists and board sharing. Preserve translation tokens and record primary lexicon provenance with native usage limits. Four focused translation checks pass.

Thanks to xet7.
2026-09-14 21:36:28 +03:00
Lauri Ojansivu ff196c5408 Record dated automatic width translation repairs and limits 2026-09-14 21:31:52 +03:00
Lauri Ojansivu 9978b92d2c Repair Arabic Tamazight automatic list width labels 2026-09-14 21:31:23 +03:00
Lauri Ojansivu 2c8bdf89e3 Record dated account tooltip repairs and grammar limits 2026-09-14 21:30:17 +03:00
Lauri Ojansivu 439ac57890 Repair French Tamazight account status and click tooltips 2026-09-14 21:29:54 +03:00
Lauri Ojansivu a7031c618f Record dated Greenlandic epoch repairs and validation limits 2026-09-14 21:28:41 +03:00
Lauri Ojansivu 3a6936cce7 Translate Greenlandic tabular Hijri labels with distinct epochs 2026-09-14 21:28:11 +03:00
Lauri Ojansivu 00fb2ae0c4 Update audit progress with Greenlandic epoch research 2026-09-14 21:27:19 +03:00
Lauri Ojansivu 8ba8134b93 Record Greenlandic tabular calendar and epoch evidence 2026-09-14 21:27:03 +03:00
Lauri Ojansivu c3c8fd4354 Record dated Greenlandic sighting repair and grammar limits 2026-09-14 21:25:54 +03:00
Lauri Ojansivu 602ea40906 Translate Greenlandic Saudi Hijri moon sighting label 2026-09-14 21:25:31 +03:00
Lauri Ojansivu bae4ca9a7d Record dated Greenlandic calendar terminology repair 2026-09-14 21:23:59 +03:00
Lauri Ojansivu f09b5d2649 Add Greenlandic calendar term to Coptic selection label 2026-09-14 21:23:32 +03:00
Lauri Ojansivu 590229e390 Record dated time translation repairs and review limits 2026-09-14 21:22:39 +03:00
Lauri Ojansivu e9ef2b88b4 Repair French duration and remaining time labels in Tamazight 2026-09-14 21:22:09 +03:00
Lauri Ojansivu b05a108535 Record dated shared list translation repair and review limits 2026-09-14 21:21:20 +03:00
Lauri Ojansivu 7817aa29f2 Repair French shared list conversion label in Tamazight 2026-09-14 21:20:50 +03:00
Lauri Ojansivu d6755413eb Record dated comprehensive migration title review 2026-09-14 21:19:43 +03:00
Lauri Ojansivu 4091c14e42 Repair French comprehensive migration title in Tamazight 2026-09-14 21:19:18 +03:00
Lauri Ojansivu d3685abc82 Record dated positive integer translation evidence and limits 2026-09-14 21:18:35 +03:00
Lauri Ojansivu 597098ac19 Translate Tamazight positive integer height error with reviewed evidence 2026-09-14 21:18:11 +03:00
Lauri Ojansivu 67b16e63c0 Record dated Planning Poker translation and integer review 2026-09-14 21:16:38 +03:00
Lauri Ojansivu 8d48c0e3e5 Repair French Planning Poker action labels in Tamazight 2026-09-14 21:16:17 +03:00
Lauri Ojansivu 8fc3de0ddd Record dated basic color translation repairs 2026-09-14 21:15:05 +03:00
Lauri Ojansivu 502c7e0cf8 Repair six wrong-language Tamazight basic color labels 2026-09-14 21:14:43 +03:00
Lauri Ojansivu acec6476ce Record dated currency code translation evidence 2026-09-14 21:13:56 +03:00
Lauri Ojansivu 356836c4fa Replace French currency code label with Tamazight terms 2026-09-14 21:13:34 +03:00
Lauri Ojansivu 77203f849b Record dated currency translation repair and integer evidence 2026-09-14 21:12:46 +03:00
Lauri Ojansivu 551e1ec047 Replace Arabic currency field type with attested Tamazight 2026-09-14 21:09:18 +03:00
Lauri Ojansivu db2d09423e Record dated subtask landing list repair 2026-09-14 21:08:12 +03:00
Lauri Ojansivu d968e4bb29 Repair Tamazight subtask landing list instruction 2026-09-14 21:07:43 +03:00
Lauri Ojansivu 603ab06656 Record dated subtask board translation progress 2026-09-14 21:06:38 +03:00
Lauri Ojansivu 9515511af1 Repair Tamazight subtask board description and deposit label 2026-09-14 21:06:16 +03:00
Lauri Ojansivu c6575fa58b Record dated task and subtask translation refinements 2026-09-14 21:05:23 +03:00
Lauri Ojansivu 8bf9f58cf4 Repair Tamazight task and subtask terminology 2026-09-14 21:04:55 +03:00
Lauri Ojansivu 40df92ad76 Record dated Tamazight task terminology refinement 2026-09-14 21:03:59 +03:00
Lauri Ojansivu a9406c2788 Use attested Tamazight task vocabulary in WIP messages 2026-09-14 21:03:35 +03:00
Lauri Ojansivu b731243f69 Record dated account status vocabulary review 2026-09-14 21:02:40 +03:00
Lauri Ojansivu ac5a9f69bb Review Tamazight account status terminology and exclude permanent wording 2026-09-14 21:02:20 +03:00
Lauri Ojansivu a69918aa9f Update dated audit for webhook qualifier repair 2026-09-14 21:01:28 +03:00
Lauri Ojansivu 5b89d51688 Repair Tamazight optional webhook authentication qualifier 2026-09-14 21:01:05 +03:00
Lauri Ojansivu 7e8cc02337 Record dated Tamazight optional label repair 2026-09-14 21:00:12 +03:00
Lauri Ojansivu 855219d708 Replace Arabic Optional label with attested Tamazight 2026-09-14 20:59:51 +03:00
Lauri Ojansivu 33743d87d3 Record dated Dzongkha ISO label repair and verification 2026-09-14 20:58:45 +03:00
Lauri Ojansivu 7dd8c10c90 Restore Dzongkha Gregorian and week components in ISO calendar label 2026-09-14 20:58:24 +03:00
Lauri Ojansivu 591ed8bc0a Record dated Dzongkha sighting repair and remaining epoch review 2026-09-14 20:57:38 +03:00
Lauri Ojansivu 98cf2cda5f Restore Dzongkha Hijri moon sighting calendar qualifier 2026-09-14 20:57:14 +03:00
Lauri Ojansivu 0d3af98274 Record dated successful error clearing translation repair 2026-09-14 20:55:55 +03:00
Lauri Ojansivu 233955a459 Restore Tamazight successful error clearing qualifier 2026-09-14 20:55:31 +03:00
Lauri Ojansivu 57913407f0 Update dated migration error terminology audit 2026-09-14 20:54:51 +03:00
Lauri Ojansivu 3d891b203c Repair Tamazight migration error heading and clear action 2026-09-14 20:54:28 +03:00
Lauri Ojansivu fdedc1ef0c Record dated primary plural error correction 2026-09-14 20:53:20 +03:00
Lauri Ojansivu a693a0093d Correct Tamazight plural error terminology from primary dictionary 2026-09-14 20:52:50 +03:00
Lauri Ojansivu 881a387e83 Record translation browser coverage and execution limits 2026-09-14 20:52:06 +03:00
Lauri Ojansivu c8bcfb258c Cover Tamazight numeric field tooltip and display selection in browser regression 2026-09-14 20:51:45 +03:00
Lauri Ojansivu f94d98ce28 Update dated audit for maximum WIP count repair 2026-09-14 20:50:38 +03:00
Lauri Ojansivu 6e1292cd0b Repair Tamazight maximum WIP count setting 2026-09-14 20:50:16 +03:00
Lauri Ojansivu 57119833a0 Update dated audit for exceeded WIP translation 2026-09-14 20:49:37 +03:00
Lauri Ojansivu fc73c77eb0 Repair Tamazight exceeded WIP warning 2026-09-14 20:49:15 +03:00
Lauri Ojansivu f1f3d1efae Record dated custom field activity translation repair 2026-09-14 20:48:27 +03:00
Lauri Ojansivu b2f5745363 Repair Tamazight custom field creation activity 2026-09-14 20:48:04 +03:00
Lauri Ojansivu ab635ffee4 Update dated audit for numeric field total wording 2026-09-14 20:47:23 +03:00
Lauri Ojansivu 318e5030bc Repair Tamazight numeric custom field total description 2026-09-14 20:46:59 +03:00
Lauri Ojansivu 6d44a4deaf Record Tamazight search translation repair and verification 2026-09-14 20:46:12 +03:00
Lauri Ojansivu d0175d46a0 Repair Tamazight custom field search operator 2026-09-14 20:45:51 +03:00
Lauri Ojansivu eccc9f67f3 Update dated audit for Tamazight rule destination repairs 2026-09-14 20:44:39 +03:00
Lauri Ojansivu a4439d400e Repair Tamazight top and bottom rule destinations 2026-09-14 20:44:13 +03:00
Lauri Ojansivu 9f5df126b8 Record dated Tamazight aggregate repair and audit progress 2026-09-14 20:43:32 +03:00
Lauri Ojansivu af4faeb706 Repair Tamazight field total checkbox translation 2026-09-14 20:43:07 +03:00
Lauri Ojansivu fe25938e7d Update dated translation audit with primary Kashmiri evidence 2026-09-14 20:42:09 +03:00
Lauri Ojansivu 3567bf197e Record primary Kashmiri moon and seeing grammar evidence 2026-09-14 20:41:43 +03:00
Lauri Ojansivu 38666984bd Record dated Kashmiri source review and unresolved calendar labels 2026-09-14 20:38:01 +03:00
Lauri Ojansivu 002e14d69e Review Kashmiri lunar spelling and reject redirected dictionary source 2026-09-14 20:37:43 +03:00
Lauri Ojansivu 0fb9c531f5 Record calendar-system heading repair and variety limitations 2026-09-14 20:36:38 +03:00
Lauri Ojansivu 06f88d5eda Restore Quechua calendar-system date-display heading 2026-09-14 20:36:12 +03:00
Lauri Ojansivu 5641cb9d3a Record dated calendar meaning repairs and native week evidence 2026-09-14 20:35:09 +03:00
Lauri Ojansivu 2307b8332c Restore Quechua Jalali and ISO-week calendar meanings 2026-09-14 20:34:42 +03:00
Lauri Ojansivu ebdc0c1b80 Record nine calendar noun repairs and retained naming review 2026-09-14 20:33:41 +03:00
Lauri Ojansivu 474a2909e6 Correct clock noun in nine Quechua calendar options
Use attested Watanqillqa while preserving names and qualifiers. Retained modifiers and full compounds remain explicitly low confidence for review.
2026-09-14 20:33:17 +03:00
Lauri Ojansivu 54cfbc60da Record dated threshold label repair and conditional grammar review 2026-09-14 20:31:51 +03:00
Lauri Ojansivu 529775d9c7 Repair Tamazight card-count threshold label 2026-09-14 20:31:26 +03:00
Lauri Ojansivu 3b7e157592 Record dated visibility wording repairs and native grammar limits 2026-09-14 20:30:42 +03:00
Lauri Ojansivu 267913e2f7 Repair Tamazight board visibility heading and private-only restriction 2026-09-14 20:30:17 +03:00
Lauri Ojansivu 71686563e3 Record dated hidden-activities repair and full validation limits 2026-09-14 20:29:26 +03:00
Lauri Ojansivu c0edf11047 Repair Arabic Tamazight hidden-activities notification 2026-09-14 20:29:03 +03:00
Lauri Ojansivu 75c4b1f975 Record dated support-page label repair and native grammar limits 2026-09-14 20:28:19 +03:00
Lauri Ojansivu 46090ad0e0 Repair French Tamazight support-page enabled label 2026-09-14 20:27:54 +03:00
Lauri Ojansivu 4af0bcdcc9 Record dated invitation-acceptance semantic review 2026-09-14 20:27:02 +03:00
Lauri Ojansivu ca3d7dc9e2 Reject kiss mistranslation for Tamazight invitation acceptance 2026-09-14 20:26:45 +03:00
Lauri Ojansivu 81bcc03778 Record dated invitation notification repair and open acceptance review 2026-09-14 20:25:59 +03:00
Lauri Ojansivu 7dfbbecbdd Repair French Tamazight new-board invitation notification 2026-09-14 20:25:32 +03:00
Lauri Ojansivu af3a9344bd Record dated Trello instruction repair and pending review 2026-09-14 20:24:30 +03:00
Lauri Ojansivu 91ebdcc27c Translate remaining Tamazight Trello import instructions 2026-09-14 20:24:04 +03:00
Lauri Ojansivu 0052c54e57 Record single-quote clarification and verified value vocabulary 2026-09-14 20:23:16 +03:00
Lauri Ojansivu d1214818b7 Clarify literal single quotation mark in Tamazight filter help 2026-09-14 20:22:54 +03:00
Lauri Ojansivu 63da282e80 Record punctuation terminology revision and native-review limits 2026-09-14 20:22:07 +03:00
Lauri Ojansivu ac4b1dcdc9 Distinguish native Tamazight quotation and parenthesis terms
Replace unsupported conflated forms with primary dictionary nouns and repair space wording; retain full grammatical/software adaptation review.
2026-09-14 20:21:44 +03:00
Lauri Ojansivu 1c86ed6234 Record full filter-help repair and restored completeness 2026-09-14 20:20:49 +03:00
Lauri Ojansivu 04aba67e0c Translate full Tamazight advanced-filter help and label
Preserve all operators, escaping and executable examples. Completeness passes again; technical terminology and complete native grammar remain explicitly low confidence for review.
2026-09-14 20:20:25 +03:00
Lauri Ojansivu 624e4d1a2a Record filter syntax repair and exposed untranslated-help failure 2026-09-14 20:19:10 +03:00
Lauri Ojansivu 72b212a5d4 Repair doubled escapes in Tamazight advanced-filter examples
Keep the English prose explicitly pending. Syntax, correction and review checks pass; completeness correctly exposes one untranslated Tamazight placeholder instead of accepting cosmetically different English.
2026-09-14 20:18:47 +03:00
Lauri Ojansivu 7861c517bf Record dated SMTP host label repair and port terminology review 2026-09-14 20:17:57 +03:00
Lauri Ojansivu eb710395b9 Repair Arabic Tamazight SMTP host label 2026-09-14 20:17:33 +03:00
Lauri Ojansivu 46021ba981 Record dated SMTP sentence repair and native validation limits 2026-09-14 20:16:58 +03:00
Lauri Ojansivu 584dbfc7c2 Repair French Tamazight SMTP host description
Use the verified electronic-correspondence plural and server-address components; retain low-confidence relative-clause and adjective review.
2026-09-14 20:16:34 +03:00
Lauri Ojansivu 18cd89b4d7 Record dated SMTP terminology review in audit summary 2026-09-14 20:15:48 +03:00
Lauri Ojansivu 42d65f377f Review Tamazight SMTP host address and management senses 2026-09-14 20:15:32 +03:00
Lauri Ojansivu 1d2ec5f7e7 Record dated minicard parent wording repair and pending audit 2026-09-14 20:14:44 +03:00
Lauri Ojansivu 89ebd29cc5 Repair French Tamazight show-parent minicard label 2026-09-14 20:14:21 +03:00
Lauri Ojansivu 99ab43eaac Record dated product-name repair and remaining native review 2026-09-14 20:13:33 +03:00
Lauri Ojansivu c4a40896ba Repair Tamazight custom product name and omitted product wording 2026-09-14 20:13:09 +03:00
Lauri Ojansivu 022981f9d8 Record dated WIP translation repair and native wording limits 2026-09-14 20:12:28 +03:00
Lauri Ojansivu a5edc6d3c6 Repair French Tamazight WIP activation label
Use attested activation and boundary components, preserve WIP, and track the numerical software-limit adaptation as low confidence.
2026-09-14 20:12:01 +03:00
Lauri Ojansivu 2c60571f08 Record dated custom assetlinks translation repair and remaining review 2026-09-14 20:11:19 +03:00
Lauri Ojansivu d6a3581602 Repair French Tamazight custom assetlinks labels
Preserve the assetlinks.json filename and JSON marker, distinguish activation from content, and record low-confidence custom terminology for native review.
2026-09-14 20:10:54 +03:00
Lauri Ojansivu 32319e20bc Record dated private-board wording repair and review limits 2026-09-14 20:06:15 +03:00
Lauri Ojansivu d7bdf6ac6a Repair Arabic Tamazight private-board description and missing actions 2026-09-14 20:05:52 +03:00
Lauri Ojansivu 8ac8dbec26 Record dated SMTP TLS repair and reconstructed translation progress 2026-09-14 20:04:27 +03:00
Lauri Ojansivu 086a027340 Repair Arabic Tamazight SMTP TLS description 2026-09-14 20:04:05 +03:00
Lauri Ojansivu a40ea09e65 Record dated Veps evidence review and remaining repairs 2026-09-14 20:02:58 +03:00
Lauri Ojansivu 726abda52a Expand Veps dictionary evidence and preserve software sense distinctions 2026-09-14 20:02:42 +03:00
Lauri Ojansivu d01d71f4d4 Record dated integer terminology review and unresolved repairs 2026-09-14 19:59:53 +03:00
Lauri Ojansivu e702bdf0bf Record primary-source limits for Tamazight integer constraints 2026-09-14 19:59:34 +03:00
Lauri Ojansivu d61139da6b Document dated audit updater repair and live progress 2026-09-14 19:57:32 +03:00
Lauri Ojansivu 9c7a845a31 Refresh translation audit locale counts with live totals 2026-09-14 19:57:12 +03:00
Lauri Ojansivu 96fd5d40bf Record dated height-label repairs and reconstructed audit counts 2026-09-14 19:56:10 +03:00
Lauri Ojansivu c986121af7 Repair three Arabic Tamazight swimlane-height labels 2026-09-14 19:54:43 +03:00
Lauri Ojansivu b3015bd348 Record dated approaching-deadline repair and migration-label gap 2026-09-14 19:53:31 +03:00
Lauri Ojansivu 4f99247e87 Replace French Tamazight approaching-deadline warning 2026-09-14 19:53:04 +03:00
Lauri Ojansivu 112ecad9f2 Record dated analysis-stage revision and unresolved integration 2026-09-14 19:51:47 +03:00
Lauri Ojansivu 776840a4c2 Use verified Moroccan analysis and structure terms for migration label 2026-09-14 19:51:24 +03:00
Lauri Ojansivu f282154255 Record dated Moroccan authentication repair and remaining uncertainties 2026-09-14 19:50:33 +03:00
Lauri Ojansivu 40491764c5 Use Moroccan authentication term in four Tamazight labels 2026-09-14 19:50:08 +03:00
Lauri Ojansivu f771fbbac9 Record dated card-control repairs and validation limits 2026-09-14 19:48:55 +03:00
Lauri Ojansivu f3d3aa4b2a Repair French Tamazight parent-change and card-display labels 2026-09-14 19:48:29 +03:00
Lauri Ojansivu 5e6f692830 Record dated multi-selection repairs and native validation limits 2026-09-14 19:47:29 +03:00
Lauri Ojansivu 027bdc4460 Repair five French Tamazight multi-selection labels 2026-09-14 19:47:03 +03:00
Lauri Ojansivu 79525861c1 Record dated parent-prefix repairs and native review limits 2026-09-14 19:45:45 +03:00
Lauri Ojansivu 16232ae092 Replace French Tamazight parent display-prefix options 2026-09-14 19:45:17 +03:00
Lauri Ojansivu 9bfebe978e Record dated full-path subtitle repair and review limits 2026-09-14 19:44:27 +03:00
Lauri Ojansivu 7acd0f72cd Replace French Tamazight full-path subtitle label 2026-09-14 19:44:01 +03:00
Lauri Ojansivu b69adf343d Record dated parent-subtitle repair and validation limits 2026-09-14 19:43:11 +03:00
Lauri Ojansivu b93379067b Replace French Tamazight parent-subtitle option 2026-09-14 19:42:47 +03:00
Lauri Ojansivu a3f7e85c9b Record dated debug terminology review and remaining translation work 2026-09-14 19:41:51 +03:00
Lauri Ojansivu 9669c2d84a Clarify Tamazight debug-predicate terminology evidence 2026-09-14 19:41:27 +03:00
Lauri Ojansivu 593999e2c0 Record dated existence-check translation repair and open validation 2026-09-14 19:37:36 +03:00
Lauri Ojansivu d32a967451 Replace French Tamazight existence-check error
Preserve the format token and specific check meaning. Adapted negative clause remains low confidence pending native grammar and browser validation.
2026-09-14 19:37:00 +03:00
Lauri Ojansivu 93a4ba4d61 Record dated parser-error terminology review and remaining requirements 2026-09-14 19:35:46 +03:00
Lauri Ojansivu e4fb6c394f Review Tamazight parser-error vocabulary and reject physical invalid senses 2026-09-14 19:35:16 +03:00
Lauri Ojansivu 1e4246680c Record dated overdue warning repair and current audit counts 2026-09-14 19:34:01 +03:00
Lauri Ojansivu ea286df3d9 Replace French Tamazight overdue-time warning
Preserve the percent-s placeholder. Adapted deadline compound and complete grammar remain low confidence pending native and browser validation.
2026-09-14 19:33:33 +03:00
Lauri Ojansivu c38876c573 Record dated audit summary reconciliation in upcoming changelog 2026-09-14 19:32:30 +03:00
Lauri Ojansivu 75b0a015b1 Consolidate translation audit summary and reconcile live locale counts 2026-09-14 19:32:08 +03:00
Lauri Ojansivu 181619d4e4 Record dated OIDC caption translation repair and open validation 2026-09-14 19:30:59 +03:00
Lauri Ojansivu 0ba2e0f6ca Replace French Tamazight OIDC caption setting label
Adapted interface-button metaphor and complete grammar remain low confidence pending native domain and browser validation. Preserve OIDC and reject unrelated pustule terms.
2026-09-14 19:30:28 +03:00
Lauri Ojansivu 983e13c1e3 Record dated computer-server translation repair and open TLS review 2026-09-14 19:29:31 +03:00
Lauri Ojansivu 5e2a932874 Use attested Tamazight computer-server terminology 2026-09-14 19:29:01 +03:00
Lauri Ojansivu 52c0ce1352 Record dated migration translation integration findings 2026-09-14 19:27:36 +03:00
Lauri Ojansivu 94c8857fd0 Trace untranslated active migration stages and unreachable legacy labels 2026-09-14 19:27:03 +03:00
Lauri Ojansivu 7f2d13424c Record dated orphaned-card translation repair and validation gaps 2026-09-14 19:25:55 +03:00
Lauri Ojansivu 2c38b996b8 Replace French Tamazight orphaned-card repair label
Adapted software metaphor and plural agreement remain low confidence pending native and browser validation.
2026-09-14 19:25:26 +03:00
Lauri Ojansivu c09b4acf3d Record dated migration message repair and remaining uncertainty 2026-09-14 19:24:14 +03:00
Lauri Ojansivu e424d4de61 Replace French Tamazight migration progress message
Adapted clause remains low confidence pending native grammar, courtesy and browser validation. Preserve wait, board transfer and latest structure meaning.
2026-09-14 19:23:49 +03:00
Lauri Ojansivu 26582efdfd Record dated daily schedule translation review and open validation 2026-09-14 19:22:40 +03:00
Lauri Ojansivu 947366780e Align Tamazight daily schedule wording with native references
Preserve the time placeholder. Adapted complete clause remains low confidence pending native grammar and browser validation.
2026-09-14 19:22:17 +03:00
Lauri Ojansivu 679b5c2aa0 Record dated Tamazight interval repairs and remaining validation 2026-09-14 19:21:17 +03:00
Lauri Ojansivu 23583a790e Replace French Tamazight numeric interval labels
Adapted recurrence phrases remain low confidence pending native grammar and browser validation. Preserve exact numeric intervals and distinct time units.
2026-09-14 19:20:51 +03:00
Lauri Ojansivu 8f3ed6f846 Update dated audit with primary IRCAM dictionary evidence 2026-09-14 19:19:39 +03:00
Lauri Ojansivu d1d06c706c Record independently read IRCAM dictionary entries for pending repairs 2026-09-14 19:19:16 +03:00
Lauri Ojansivu 94d225d20a Update dated audit with Tamazight button terminology findings 2026-09-14 19:17:48 +03:00
Lauri Ojansivu 555b6631d1 Record Tamazight interface-button sense mismatch and native source requirement 2026-09-14 19:17:25 +03:00
Lauri Ojansivu c7b111d7aa Record dated Quechua named-calendar progress and confidence limits 2026-09-14 19:16:12 +03:00
Lauri Ojansivu 6e3663c83b Correct Quechua named calendar nouns
Preserve Dangi, Minguo and Hijri names. Adapted compounds remain low confidence pending native phrase and browser validation.
2026-09-14 19:15:49 +03:00
Lauri Ojansivu 0898e6b2e4 Record dated Quechua day repairs and remaining audit work 2026-09-14 19:14:53 +03:00
Lauri Ojansivu 34dbfa64cb Repair Quechua day and daily recurrence labels from native vocabulary 2026-09-14 19:14:27 +03:00
Lauri Ojansivu 694ceb38e2 Record dated Quechua calendar repair and remaining validation 2026-09-14 19:13:09 +03:00
Lauri Ojansivu 5c5ee40b64 Repair Quechua generic calendar noun from native dictionary 2026-09-14 19:12:20 +03:00
Lauri Ojansivu 5fff622168 Update dated audit and upcoming changelog with Aromanian evidence 2026-09-14 19:10:08 +03:00
Lauri Ojansivu 4f63929ee8 Record primary Aromanian color evidence and unresolved magenta terminology 2026-09-14 19:09:43 +03:00
Lauri Ojansivu af27f700e7 Record dated saved-description verification and remaining audit gates 2026-09-14 19:05:10 +03:00
Lauri Ojansivu 0c51a3261f Join nonempty rule description fragments without browser globals 2026-09-14 19:04:42 +03:00
Lauri Ojansivu f332c63b47 Record dated Basque subject ordering repair and browser gate 2026-09-14 19:03:03 +03:00
Lauri Ojansivu 1e44111837 Order Basque named rule subjects before their final demonstrative 2026-09-14 19:02:40 +03:00
Lauri Ojansivu 0f07c684dd Record dated Basque integration review in audit and changelog 2026-09-14 19:00:20 +03:00
Lauri Ojansivu 209d1088bc Document confirmed Basque named-subject integration constraints 2026-09-14 19:00:02 +03:00
Lauri Ojansivu 1b5f65a9d5 Record dated Uzbek spelling repair and verification limits 2026-09-14 18:59:07 +03:00
Lauri Ojansivu b433730e36 Restore alif in Afghan Uzbek cancellation label 2026-09-14 18:58:42 +03:00
Lauri Ojansivu a1afa9f06f Record dated Basque subject review and group audit changelog entries 2026-09-14 18:56:50 +03:00
Lauri Ojansivu 946e1a29be Retain Basque generic member and attachment subjects 2026-09-14 18:56:06 +03:00
Lauri Ojansivu 7a9edbec6c Record dated Basque movement review and remaining repair counts 2026-09-14 18:55:00 +03:00
Lauri Ojansivu 2bb54a30b6 Retain restored Basque movement direction labels 2026-09-14 18:54:29 +03:00
Lauri Ojansivu 85621ce112 Record dated Tamazight recurrence repairs and review limits 2026-09-14 18:52:55 +03:00
Lauri Ojansivu 5b3ca809de Repair Tamazight one-unit recurrence labels 2026-09-14 18:52:35 +03:00
Lauri Ojansivu f23f01ffb8 Record dated Tamazight rule translation repairs 2026-09-14 18:51:04 +03:00
Lauri Ojansivu 7f3a0d7dbd Repair Tamazight generic rule name labels 2026-09-14 18:50:41 +03:00
Lauri Ojansivu 9ad49bcc15 Record dated calendar provenance review in translation progress 2026-09-14 18:49:07 +03:00
Lauri Ojansivu 5da10eee56 Record Tigre and Wolaytta calendar provenance gaps 2026-09-14 18:47:50 +03:00
Lauri Ojansivu f6e67998ab Record dated Inuktitut named calendar repairs and limits
Thanks to xet7 !
2026-09-14 18:43:42 +03:00
Lauri Ojansivu da6762a48c Repair Inuktitut Dangi and Minguo calendar labels
Preserve specific calendar names with the official native calendar noun. Low confidence combined naming remains under broader native and browser review.

Thanks to xet7 !
2026-09-14 18:43:12 +03:00
Lauri Ojansivu 68c9ac83b1 Record dated Tamazight national calendar repair and limits
Thanks to xet7 !
2026-09-14 18:42:18 +03:00
Lauri Ojansivu 7ba02a1794 Repair Tamazight Indian National Calendar label
Preserve the national qualifier with native component terminology. Low confidence full naming remains under broader native and browser review.

Thanks to xet7 !
2026-09-14 18:41:43 +03:00
Lauri Ojansivu 0b0555ec91 Record dated Tamazight Hebrew calendar repair and limits
Thanks to xet7 !
2026-09-14 18:40:46 +03:00
Lauri Ojansivu bd4a6a494b Repair Tamazight Hebrew calendar label
Compose native calendar noun with an attested Hebrew adjective. Low confidence full calendar naming still needs broader native and browser review.

Thanks to xet7 !
2026-09-14 18:40:16 +03:00
Lauri Ojansivu 163cb7241e Record dated Tamazight calendar adaptation and review limits
Thanks to xet7 !
2026-09-14 18:39:32 +03:00
Lauri Ojansivu 8422804a4c Repair Tamazight Buddhist calendar label
Compose native calendar noun with independently attested Buddhist adjective. Full label adapted; broader native and browser review remain open.

Thanks to xet7 !
2026-09-14 18:39:04 +03:00
Lauri Ojansivu bfe7b0d5be Record dated Basque checklist-item review and progress
Thanks to xet7 !
2026-09-14 18:37:57 +03:00
Lauri Ojansivu d36499d43a Validate Basque generic checklist-item trigger subject
Retain correct singular wording with check and uncheck temporal predicates; named-item order and live browser review remain open.

Thanks to xet7 !
2026-09-14 18:37:26 +03:00
Lauri Ojansivu 0ef147724d Record dated Inuktitut command repairs and verification
Thanks to xet7 !
2026-09-14 18:36:34 +03:00
Lauri Ojansivu b8e746289b Repair Inuktitut Edit and Delete command forms
Use native software guide imperatives instead of passive status wording. Preserve valid Roman orthography and all tokens.

Thanks to xet7 !
2026-09-14 18:36:10 +03:00
Lauri Ojansivu dc2c7aa191 Record dated Tamazight software-label repairs
Thanks to xet7 !
2026-09-14 18:35:08 +03:00
Lauri Ojansivu d5d2bf518a Repair Tamazight registration log and summary labels
Use native Moroccan software vocabulary; adapt summary punctuation to a heading. Preserve tokens and correct values.

Thanks to xet7 !
2026-09-14 18:34:45 +03:00
Lauri Ojansivu 1b484b1876 Record dated date-format translation repairs and verification
Thanks to xet7 !
2026-09-14 18:33:34 +03:00
Lauri Ojansivu b8c6fed390 Repair wrong-language date-format labels in six locales
Restore selectable format patterns in Akan, Bosnian, Slovenian, Breton and Tamazight labels. Preserve correct localized notation elsewhere and all placeholders.

Thanks to xet7 !
2026-09-14 18:32:52 +03:00
Lauri Ojansivu 55df5cb0a5 Record dated Basque incomplete status repair and remaining review
Thanks to xet7 !
2026-09-14 18:31:55 +03:00
Lauri Ojansivu 33cc02cedd Clarify Basque incomplete checklist status predicate
Distinguish marking incomplete from leaving work unfinished using an adapted native software status clause. Named-noun grammar and browser review remain open.

Thanks to xet7 !
2026-09-14 18:31:25 +03:00
Lauri Ojansivu 318266db3c Record dated Tamazight action repair and warning evidence
Thanks to xet7 !
2026-09-14 18:30:16 +03:00
Lauri Ojansivu 9024c6cf81 Repair Tamazight layout-change action label
Use the independently attested Moroccan software edit imperative. Preserve correct existing edit wording and tokens.

Thanks to xet7 !
2026-09-14 18:29:51 +03:00
Lauri Ojansivu 1d6157fa1f Record dated Breton string-template repair and evidence
Thanks to xet7 !
2026-09-14 18:28:07 +03:00
Lauri Ojansivu 65a0f76ab9 Repair Breton string-template field label
Use native software nouns for string and template in an adapted compound. Preserve neighboring formatter instructions and placeholders. Full compound and browser review remain open.

Thanks to xet7 !
2026-09-14 18:27:42 +03:00
Lauri Ojansivu 9dd8950bd7 Record dated Breton currency repairs and remaining review 2026-09-14 18:23:05 +03:00
Lauri Ojansivu f9e3111b09 Repair Breton currency field and code labels
Use native moneiz currency sense and an adapted code label, preserving the field/code distinction. Four translation suites pass; full compound/browser review remains open.
2026-09-14 18:22:37 +03:00
Lauri Ojansivu bb7e822a31 Record dated Breton zoom repairs and verification 2026-09-14 18:21:53 +03:00
Lauri Ojansivu 0aeac57446 Repair Breton zoom labels with opposing size verbs
Use native brasaat and bihanaat and existing local level wording. Focused checks preserve zoom direction and prompt consistency. Four translation suites pass; full phrase/browser review remains open.
2026-09-14 18:21:26 +03:00
Lauri Ojansivu 18e130e4c7 Record dated Breton field-type repairs and confidence limits 2026-09-14 18:20:38 +03:00
Lauri Ojansivu 3539edd8b2 Repair Breton custom-field type and option labels
Use TermBret checkbox vocabulary and existing Breton dropdown/custom-field terms. Preserve dropdown/multiselect consistency and checkbox distinction. Four translation suites pass; compound and browser review remain open.
2026-09-14 18:20:13 +03:00
Lauri Ojansivu 4b4efbecd5 Record dated Breton action repairs and remaining review 2026-09-14 18:19:21 +03:00
Lauri Ojansivu c8a14d2d0b Repair Breton preview, discard, remove and comment actions
Use native software action vocabulary; discard cancels unsaved description changes and remove clears custom color. The comment action uses an adapted add-comment phrase consistent with existing Breton comment terminology. Four translation suites pass; full phrase/browser review remains open.
2026-09-14 18:18:56 +03:00
Lauri Ojansivu 3127815329 Record dated Breton card and numeric-label repairs 2026-09-14 18:18:01 +03:00
Lauri Ojansivu 6962b2cc46 Repair Breton card type, singular count and number labels
Align French card labels with existing Breton kartenn vocabulary and use niver for numeric fields. Native definitions distinguish card and numeric meanings; focused checks preserve shared card labels and text/number distinction. Four translation suites pass.
2026-09-14 18:17:31 +03:00
Lauri Ojansivu ace382979f Record dated Breton field-label repairs and verification 2026-09-14 18:16:47 +03:00
Lauri Ojansivu b0f7f924fc Repair Breton empty selection, unknown value and color labels
Use native software vocabulary and preserve the distinction between no selection and an unknown stored value. Four translation suites pass.
2026-09-14 18:16:20 +03:00
Lauri Ojansivu 4e5c1273ad Record dated Breton navigation repairs and audit progress 2026-09-14 18:15:21 +03:00
Lauri Ojansivu bb65bf79dc Repair Breton navigation and template controls
Replace six French labels using native software return, home, default, text and template vocabulary. Preserve consistent template and text labels and distinguish return from home. Four translation suites pass.
2026-09-14 18:14:56 +03:00
Lauri Ojansivu 1b69c24928 Record dated Basque S3 review and reduced restored queue 2026-09-14 18:13:56 +03:00
Lauri Ojansivu 5bf97e219e Retain Basque S3 bucket label with native technical evidence
Native ZIUR Basque specifications explicitly use AWS S3 Bucket for storage. Preserve the restored label and test its bucket-name context and related description. The reference establishes terminology, not exact hyphenation. Three translation suites pass.
2026-09-14 18:13:25 +03:00
Lauri Ojansivu 82538d74ff Update dated translation audit with Basque status review 2026-09-14 18:12:39 +03:00
Lauri Ojansivu 7998e6aff6 Review Basque incomplete trigger against native completion-status guidance
Record independent native EHU software and dictionary evidence. Distinguish status transitions from leaving work unfinished and require both generic and named sentence contexts. No uncertain translation is accepted. Basque trigger and audit checks pass.
2026-09-14 18:12:21 +03:00
Lauri Ojansivu 39f5005a63 Record dated Breton white repair and verification progress 2026-09-14 18:11:22 +03:00
Lauri Ojansivu a123f94289 Repair Breton white palette label from native color usage
Replace French blanc with gwenn, attested in the native OPLB dictionary as the snow color and liv gwenn. Distinguish white from gray and silver in regression coverage. Four translation suites pass.
2026-09-14 18:10:55 +03:00
Lauri Ojansivu 0b342d8e69 Record dated Breton palette repairs and valid shared vocabulary
Update audit totals, source references and upcoming release notes for three palette repairs. Retain the native gray term and keep pending, restored, broader language and browser reviews open. Audit and changelog checks pass.
2026-09-14 18:10:16 +03:00
Lauri Ojansivu 2a86c331f0 Repair Breton palette labels using native color senses
Replace French dark green, gold and silver with dictionary-attested Breton. Preserve gris, which is also valid Breton, and distinguish the four palette names in regression coverage. All four focused translation suites pass.
2026-09-14 18:09:44 +03:00
Lauri Ojansivu f49dfc50c0 Record dated Breton control repairs and wider review progress
Link fourteen repairs in 092678576 and record 18627 correction values. Seven focused source and metadata checks pass. Pending and restored counts remain 288 and 12; unflagged candidate, native compound and browser review continue.

Thanks to xet7 !
2026-09-14 18:05:05 +03:00
Lauri Ojansivu 092678576e Repair Breton common controls and diagnostic labels
Replace fourteen unflagged French values with native Breton software vocabulary, keeping equivalent detail, file and confirmation labels consistent and translated text distinct from source text. Four translation suites pass. Adapted compounds and browser review remain open.

Thanks to xet7 !
2026-09-14 18:04:36 +03:00
Lauri Ojansivu df82b89e64 Record dated Moroccan reference review progress
Link native component cross-checks in 009fa7dde without changing pending or restored counts. Audit progress and changelog checks pass. Complete warning and technical phrase review remain open.

Thanks to xet7 !
2026-09-14 18:03:03 +03:00
Lauri Ojansivu 009fa7dde0 Cross-check Moroccan Tamazight dictionary component references
Read native Moroccan university calendar and software messages to independently verify calendar, user and click components. Record dictionary access limitations and full-phrase review requirements without accepting pending findings or invalidated Tuareg provenance. Audit progress checks pass.

Thanks to xet7 !
2026-09-14 18:02:42 +03:00
Lauri Ojansivu 6b55c03a1d Record dated Breton WIP action repairs and audit progress
Link four repairs in 0dc75532b and record 18613 correction values. Seven focused source and metadata suites pass. Pending and restored findings remain 288 and 12; full native phrases and browser review stay open.

Thanks to xet7 !
2026-09-14 18:00:05 +03:00
Lauri Ojansivu 0dc75532be Repair Breton WIP group creation and swimlane controls
Replace four French or mixed labels with Breton application, group creation and swimlane selection wording. Use native software apply terminology and existing locale nouns, preserving distinct actions and WIP identity. Four translation suites pass. Complete adapted compounds and browser review remain open.

Thanks to xet7 !
2026-09-14 17:59:36 +03:00
Lauri Ojansivu 23b92f217f Record dated Silesian vocabulary acceptance and audit progress
Link native shared-vocabulary review in a0aacc7a9. Current audit has 4169 retained reviews, 288 pending and 12 restored findings. Focused translation and metadata checks pass; broader language and browser review remain open.

Thanks to xet7 !
2026-09-14 17:57:39 +03:00
Lauri Ojansivu a0aacc7a9c Preserve shared native Silesian raw database terminology
Retain the raw MongoDB 3 files label after native Silesian vocabulary review, with exact value, technical identity and negative converted-export coverage. Four focused translation suites pass. Sources support the vocabulary rather than an exact standardized compound; browser and broader locale review remain open.

Thanks to xet7 !
2026-09-14 17:57:08 +03:00
Lauri Ojansivu 95c4398482 Record dated Basque completion acceptance and audit progress
Record the native completion review in 1e62fca35. Current totals are 4168 retained reviews, 12 restored findings and 289 pending. Focused translation and metadata checks pass; unresolved phrases and browser validation remain open.

Thanks to xet7 !
2026-09-14 17:55:06 +03:00
Lauri Ojansivu 1e62fca350 Retain native Basque checklist completion predicate
Validate Osatzen denean against native GNOME software completion usage and EHU list-completion vocabulary, checking actual generic trigger wiring and its distinct incomplete option. Four focused translation suites pass. Named clauses, incomplete transition, runtime discrepancy and browser validation remain open.

Thanks to xet7 !
2026-09-14 17:54:34 +03:00
Lauri Ojansivu 7c477b9647 Record dated Inuktitut recurrence review progress
Link semantic and native affix review in 5400a0ce9, keeping six uncertain phrases open and current counts unchanged. Audit progress and changelog checks pass.

Thanks to xet7 !
2026-09-14 17:53:31 +03:00
Lauri Ojansivu 5400a0ce98 Record Inuktitut recurrence and reset semantic review
Inspect fresh-card insertion and in-place checklist unchecking and read primary repeat/again affix sources. Record constraints for six still-open heading and off labels without certifying complete phrases from component words. Existing frequency and audit checks pass.

Thanks to xet7 !
2026-09-14 17:53:14 +03:00
Lauri Ojansivu c3566ac817 Record dated Inuktitut native label review progress
Link the unchanged New label review in 5bf34bc48 and retain current pending and restored counts. Audit progress and both changelog checks pass; browser and uncertain phrase review remain open.

Thanks to xet7 !
2026-09-14 17:51:28 +03:00
Lauri Ojansivu 5bf34bc481 Preserve native Inuktitut New label in admin creation controls
Review the existing syllabic value against the native Microsoft software guide and its actual standalone creation controls. Add focused value and context coverage. Latin orthography alone is not evidence of a wrong-language translation; uncertain phrases remain open.

Thanks to xet7 !
2026-09-14 17:51:01 +03:00
Lauri Ojansivu 1be541e7e4 Record dated Breton date activity and execution repairs
Record repairs in 1ba55107f and current translation audit progress. Focused source and metadata checks passed; native phrasing and browser review remain open.

Thanks to xet7 !
2026-09-14 17:49:37 +03:00
Lauri Ojansivu 1ba55107f4 Repair Breton modification activity and execution labels
Replace four French labels using native software modification terminology, native statistics last-activity wording and computing execution vocabulary. Preserve distinct label meanings. Adapted timestamp prefixes and browser formatting remain open for review. Four focused translation suites pass.

Thanks to xet7.
2026-09-14 17:46:41 +03:00
Lauri Ojansivu df9002fddf Record dated Inuktitut LDAP failure repair and reference limits
Record ea1df33fa, primary localization guide, 18605 corrections and 289 pending findings. Seven focused suites pass; full network terminology and browser validation remain open. Latin script alone is not wrong-language evidence.

Thanks to xet7.
2026-09-14 17:45:16 +03:00
Lauri Ojansivu ea1df33fa4 Repair Inuktitut LDAP connection failure message
Use the Microsoft Inuktitut guide failure term in a direct syllabic connection diagnostic and preserve %s exactly. Network-connection noun adaptation and full sentence grammar remain low confidence for native/browser review. Focused locale and placeholder suites pass.

Thanks to xet7.
2026-09-14 17:44:45 +03:00
Lauri Ojansivu 1f1e8e0093 Record dated Inuktitut rule toggle repair and confidence limits
Record 45d232fda, primary references, 18604 corrections and 290 pending findings. Seven focused translation and changelog suites pass; full native command and browser review remain open.

Thanks to xet7.
2026-09-14 17:42:24 +03:00
Lauri Ojansivu 45d232fdae Repair Inuktitut rule toggle tooltip with syllabic wording
Preserve this-rule scope and both enable/disable alternatives using existing local terminology and primary native rule/turn-off references. Full compound and command grammar are low confidence and remain open for native/browser review. Exact placeholder and focused locale checks pass.

Thanks to xet7.
2026-09-14 17:41:55 +03:00
Lauri Ojansivu 38cf848e44 Record dated Breton accessibility repairs and revised terminology
Record 669f0b31d, primary noun distinction and 18603 correction records. Seven focused suites pass; broader native grammar and browser review remain open.

Thanks to xet7.
2026-09-14 17:40:30 +03:00
Lauri Ojansivu 669f0b31d8 Repair Breton accessibility nouns and page field labels
Replace three French labels and correct two prior access-versus-accessibility terminology repairs using the native An Drouizig computing glossary. Preserve page title/body distinctions, enabled state and not-added-yet warning. Full adapted compounds and browser grammar review remain open. Four focused translation suites pass.

Thanks to xet7.
2026-09-14 17:39:57 +03:00
Lauri Ojansivu edc0fa2b34 Record dated Breton modification and access repairs
Record e3d6a1ace and 18600 exact correction entries with native references and access-label confidence limits. Seven focused translation and changelog suites pass; broader review remains open.

Thanks to xet7.
2026-09-14 17:38:47 +03:00
Lauri Ojansivu e3d6a1acec Repair Breton modification and last access labels
Replace four French values using native software modification terminology and the Ofis computing access noun. Keep last access time distinct from last modification. The access-time compound is adapted with incomplete native-label confidence; browser review remains open. Placeholder and focused locale checks pass.

Thanks to xet7.
2026-09-14 17:38:23 +03:00
Lauri Ojansivu 171c4ef2a0 Wrap Basque review changelog prose within 80 columns
Correct the overlong line found by changelogFormat after the previous metadata commit. Changelog format and release containment tests now pass.

Thanks to xet7.
2026-09-14 17:36:56 +03:00
Lauri Ojansivu f1b81d5dce Link dated Basque completion evidence review in audit and changelog
Record c4db1c19c and the unresolved semantic and runtime limits. Audit progress and changelog checks pass.

Thanks to xet7.
2026-09-14 17:36:25 +03:00
Lauri Ojansivu c4db1c19cf Record Basque completion evidence and runtime meaning discrepancy
Document primary completion and negation references, actual trigger actions and identical finished-state conditions in completion/incompletion publishers. Keep both completion phrases unaccepted pending full semantic review; queue counts unchanged.

Thanks to xet7.
2026-09-14 17:36:12 +03:00
Lauri Ojansivu aedde805d1 Record dated Basque checklist action review progress
Record 1439c4c61, primary evidence and 13 remaining restored findings. Seven focused translation and changelog suites pass; named-item grammar and browser checks remain open.

Thanks to xet7.
2026-09-14 17:34:26 +03:00
Lauri Ojansivu 1439c4c61c Validate restored Basque checklist check actions
Retain the distinct singular temporal checked and unchecked actions using actual generic trigger context, native software uncheck terminology and temporal grammar evidence. Named-item word order and browser review remain open.

Thanks to xet7.
2026-09-14 17:34:02 +03:00
Lauri Ojansivu f1c93824ca Document language picker RTL marker layout fix
Record bdf511a2b and verification limits in the Upcoming changelog.

Thanks to xet7.
2026-09-14 17:33:04 +03:00
Lauri Ojansivu bdf511a2b8 Keep language RTL marker on the first picker line
Place the nonwrapping direction marker beside the language name inside the main line, preserving the separate regional row. Add layout regressions for both UI directions and non-RTL entries. Focused Node checks pass; browser regression is syntax checked but not executed.

Thanks to xet7.
2026-09-14 17:32:54 +03:00
Lauri Ojansivu fcd3c45bdc Record dated Basque restored movement review progress
Record aba731e82, native references, 15 restored findings and 291 pending findings. Seven focused translation and changelog checks pass; browser and broader language review remain open.

Thanks to xet7.
2026-09-14 17:31:57 +03:00
Lauri Ojansivu aba731e822 Validate restored Basque generic card movement predicate
Retain the complete singular temporal clause after checking the actual generic movement row and native EHU dictionary and Euskadi grammar evidence. Directional fragments and live browser review remain open.

Thanks to xet7.
2026-09-14 17:31:34 +03:00
Lauri Ojansivu ccbcabd91e Document activity label badges and add browser palette coverage
Thanks to xet7.
2026-09-14 17:27:36 +03:00
Lauri Ojansivu 1896660a9a Render activity labels with matching card label badges
Preserve shared named palette classes, rounded badge styling and validated custom color contrast after sanitizing activity prose and rich label content. Global user CSS restrictions remain unchanged. Guard missing labels. Five positive/negative viewer checks passed; live browser rendering not verified.

Thanks to xet7.
2026-09-14 17:27:02 +03:00
Lauri Ojansivu 45e0dfdb91 Record dated Valencian restored color validation
Thanks to xet7.
2026-09-14 17:24:28 +03:00
Lauri Ojansivu 9f7f94825d Validate and retain native Valencian peach color label
Native Valencian color usage supports pressec for the actual pale-peach swatch. Keep the existing translation and CSS color unchanged. The source does not standardize CSS keyword translations; this review validates a descriptive palette label. Exact reviews and distinct-color checks passed.

Thanks to xet7.
2026-09-14 17:24:03 +03:00
Lauri Ojansivu e14467b102 Record dated Breton repository translation repairs
Thanks to xet7.
2026-09-14 17:23:05 +03:00
Lauri Ojansivu 7c2e8f8918 Repair Breton repository labels using software terminology
Replace French name, not-found and create labels. Synaptic native translation attests mirlech repository vocabulary; complete adapted phrases remain subject to native review. Exact ledger and focused checks passed.

Thanks to xet7.
2026-09-14 17:22:43 +03:00
Lauri Ojansivu d5ffeba209 Record primary Inuktitut calendar evidence and unresolved phrase review
Thanks to xet7.
2026-09-14 17:21:55 +03:00
Lauri Ojansivu 4177b62355 Document secure List picker rendering and keyboard controls
Thanks to xet7.
2026-09-14 17:21:07 +03:00
Lauri Ojansivu 95f0268890 Render opened card List dropdown titles with the secure viewer
Replace the native List select with a details-based picker rendering both current and available list titles through the shared viewer. Retain move behavior and authorization, with keyboard arrows, Home, End, Enter, Space and Escape. Eight focused checks passed. Browser policy cases syntax checked; no live application available.

Thanks to xet7.
2026-09-14 17:20:54 +03:00
Lauri Ojansivu c06c9744f9 Record Inuktitut rule state repair and remaining validation
Thanks to xet7.
2026-09-14 17:19:04 +03:00
Lauri Ojansivu 8f96ec2bc9 Repair Inuktitut rule state labels
Replace romanized status wording with native syllabic used/not-used forms for the enabled-state toggle. Primary software-use evidence supports the negative form. This is an adapted interface label with low confidence pending native UI review. Exact ledger and focused positive/negative checks passed.

Thanks to xet7.
2026-09-14 17:18:38 +03:00
Lauri Ojansivu 5eaceed480 Record card title Markdown rendering and size fixes
Thanks to xet7.
2026-09-14 17:17:59 +03:00
Lauri Ojansivu 4a01cc9beb Restore Markdown heading sizes in card titles
Override global and mobile font resets only for minicard and opened-card Markdown headings. Keep relative UI scaling and theme colors. Node checks passed; computed-size browser regression was syntax checked but not run.

Thanks to xet7.
2026-09-14 17:17:47 +03:00
Lauri Ojansivu bf207d4d27 Keep card numbers outside Markdown title source
Render minicard and opened-card numbers separately so heading syntax starts the Markdown source. Preserve the shared security-aware viewer. Renderer and source regressions passed; browser cases were syntax checked only.

Thanks to xet7.
2026-09-14 17:17:09 +03:00
Lauri Ojansivu 6c729e60e6 Cover minicard and opened card titles under security rendering policies
Both titles already use the shared viewer. Add opened-title regression coverage and browser cases for formatted content, plain links and plain source. Node checks passed; browser test syntax passed, but no local application is running.

Thanks to xet7.
2026-09-14 17:16:13 +03:00
Lauri Ojansivu e40566e42a Record dated Breton product name repair and validation progress
Thanks to xet7.
2026-09-14 17:14:39 +03:00
Lauri Ojansivu feab872406 Repair Breton custom product name label
Replace French wording and restore the omitted product qualifier using documented Breton vocabulary. The adapted compound still needs native phrase and browser validation.

Thanks to xet7.
2026-09-14 17:14:15 +03:00
Lauri Ojansivu ef69b4e0d8 Record dated Breton WIP and webhook translation repairs 2026-09-14 17:10:46 +03:00
Lauri Ojansivu a7e99aea54 Repair Breton WIP settings and webhook disable labels 2026-09-14 17:10:21 +03:00
Lauri Ojansivu bff8655462 Record dated Inuktitut weekly repairs and audit progress 2026-09-14 17:09:05 +03:00
Lauri Ojansivu 06af4a4a8e Repair Inuktitut weekly recurrence and checklist reset labels 2026-09-14 17:08:41 +03:00
Lauri Ojansivu 9982a90365 Record dated Inuktitut frequency repairs and remaining audit scope 2026-09-14 17:07:41 +03:00
Lauri Ojansivu 9a511101de Repair Inuktitut daily and monthly recurrence labels 2026-09-14 17:07:16 +03:00
Lauri Ojansivu 69099ce2fc Record Acehnese deadline repairs and confidence limits 2026-09-14 17:05:30 +03:00
Lauri Ojansivu e74dd20cc3 Use consistent Acehnese deadline labels
Replace Indonesian and Malay due-date labels and clarify the restored today label. Deadline compounds are adapted with low confidence and remain subject to native contextual review.
2026-09-14 17:04:47 +03:00
Lauri Ojansivu f1dc49b318 Record Thai linking-word validation and remaining translation work 2026-09-14 17:02:25 +03:00
Lauri Ojansivu 9e34218c72 Avoid redundant Thai equative copula in rule action phrases 2026-09-14 17:01:42 +03:00
Lauri Ojansivu 7acb6bc4a7 Document GitHub CLI mirror metadata preference 2026-09-14 17:00:41 +03:00
Lauri Ojansivu 93e61a1d68 Prefer authenticated GitHub CLI for mirror source metadata 2026-09-14 17:00:26 +03:00
Lauri Ojansivu 473c06b4e3 Record Basque actor repair and remaining rule case defects 2026-09-14 16:58:03 +03:00
Lauri Ojansivu 2cabcdb17a Replace Spanish rule actor label in Basque 2026-09-14 16:57:38 +03:00
Lauri Ojansivu 1fda6ec239 Record dated Breton optional and name translation repairs 2026-09-14 16:56:27 +03:00
Lauri Ojansivu 4b1c92cb5e Repair Breton optional and full display short name labels 2026-09-14 16:56:01 +03:00
Lauri Ojansivu 9b5ffb0b17 Record dated Breton settings translation repairs 2026-09-14 16:55:15 +03:00
Lauri Ojansivu 619eeb1c7e Repair Breton email, webhook name and server error labels 2026-09-14 16:54:51 +03:00
Lauri Ojansivu 17475fc8a0 Document mirror branch-link recovery exclusion 2026-09-14 16:54:06 +03:00
Lauri Ojansivu 7c98c00d9e Skip Wayback fallback for retired WeKan branch links 2026-09-14 16:53:55 +03:00
Lauri Ojansivu c5c64cadb4 Record Breton view translation repair progress
Date the verified source commit and native calendar/folding evidence, record 18565 exact correction entries, and keep all remaining restored, uncertain and browser work open.
2026-09-14 16:50:06 +03:00
Lauri Ojansivu 059d1fe4a1 Repair Breton board view and comment labels
Replace nine French-seeded board/calendar/list/table, fold/unfold and comment labels. Reuse existing local nouns and native Ofis calendar and folding terminology. Preserve opposite actions and literal Gantt/vendor names.

Exact correction/review ledgers, tokens, locale completeness and focused label regressions pass. Full contextual phrase and live browser validation remain open.
2026-09-14 16:49:28 +03:00
Lauri Ojansivu d00f40143a Record Breton diagnostic translation repair progress
Date the verified source commit, record native waiting/error/failure evidence and 18556 exact correction entries, and preserve all remaining restored, uncertain and browser validation work.
2026-09-14 16:48:23 +03:00
Lauri Ojansivu cdff2d19d5 Repair Breton diagnostic and migration statuses
Replace fourteen French-seeded diagnostic/status values. Preserve waiting, running, completed and failed distinctions; Pending no longer says in progress. Reuse existing terminology and native Ofis error/waiting and Kelennomp failure constructions.

Correction and review ledgers, tokens, locale completeness and status regressions pass. Full adapted phrase grammar and live browser validation remain open.
2026-09-14 16:47:50 +03:00
Lauri Ojansivu e6e975519f Record Breton entity translation repair progress
Date the verified source commit and native action evidence, record 18542 exact correction entries, and keep all remaining restored, uncertain and browser review open.
2026-09-14 16:46:01 +03:00
Lauri Ojansivu 9ccd4b8ce1 Repair Breton entity and lockout view labels
Replace fifteen French-seeded entity, archive, template, action and lockout labels using existing Breton terminology. Preserve the board and title placeholders and keep lockout wording distinct from enabled/disabled account status.

Exact correction/review inventories, placeholder preservation, locale completeness and focused regressions pass. Adapted phrase grammar and live browser validation remain open.
2026-09-14 16:45:28 +03:00
Lauri Ojansivu 3968afdfe9 Record Breton creation translation repair progress
Date the verified source commit and native direction/account evidence. Record 18527 exact correction entries while preserving the remaining uncertain, restored and browser review scope.
2026-09-14 16:44:27 +03:00
Lauri Ojansivu d95b0dd5c5 Repair Breton creation and movement labels
Replace fourteen French-seeded or mixed creation, movement and entity labels. Preserve card-to-board creation, opposite top/bottom and copy/move actions, account creation and related task/subtask names. Reuse local terminology and native Breton account-creation wording.

Exact correction/review ledgers, tokens, locale completeness and focused regressions pass. Adapted phrase grammar and live browser validation remain open.
2026-09-14 16:43:50 +03:00
Lauri Ojansivu 6c2b78bee9 Record Breton navigation translation repairs
Date the source commit and native terminology evidence, record 18513 exact correction entries, and keep the full remaining review scope open.
2026-09-14 16:42:40 +03:00
Lauri Ojansivu bb51e1fcfe Repair Breton navigation and export controls
Replace eighteen French-seeded close/open, import/export, viewer, checklist, attachment and cancellation labels. Reuse existing local nouns and terms with native Ofis computing verbs; preserve PDF, opposite actions and equivalent popup labels.

Exact correction/review inventories, token preservation, locale completeness and focused label regressions pass. Native whole-phrase grammar and live browser validation remain open.
2026-09-14 16:42:07 +03:00
Lauri Ojansivu 7acd56dc9f Record Breton filter translation repair progress
Date the verified source commit and native terminology evidence, record 18495 exact correction entries, and preserve all remaining uncertain, restored and browser validation work.
2026-09-14 16:41:00 +03:00
Lauri Ojansivu 961713c564 Repair Breton filter and account status labels
Replace eight French-seeded shortcut, advanced-filter, People status, generic active and migration-validation labels. People enabled/disabled options match loginDisabled rather than the separate lockout filter. Reuse existing Breton terms and native Ofis computing verbs.

Verify correction and review ledgers, exact enabled/disabled distinctions, shortcut labels and all-locale completeness. Adapted phrase grammar and live browser validation remain open.
2026-09-14 16:40:29 +03:00
Lauri Ojansivu 8a87f35673 Record Breton selection translation repairs and evidence
Date the verified repair commit, record ten additional unflagged corrections, and preserve the remaining native grammar, restored-value and browser review scope.
2026-09-14 16:39:21 +03:00
Lauri Ojansivu fb0b34b7dd Repair French-seeded Breton selection controls
Translate ten selection, filter, color, board and attachment labels using existing Breton terminology and Ofis computing action verbs. Filter-to-selection describes adding currently filtered cards to multiselection, as implemented by the sidebar handler.

Verify exact correction and review inventories, placeholder preservation and locale completeness. Extend regression coverage to preserve distinct copy/move commands and reject the French seed. Full adapted-phrase grammar and live browser validation remain open.
2026-09-14 16:38:49 +03:00
Lauri Ojansivu e09c0875de Record Danish age-label validation and current audit counts
Date the unchanged review with its source commit and dictionary evidence. Derive the complete Danish queue counts from the current audit classification, retaining 19 restored values and 299 pending findings for further review.
2026-09-14 16:37:00 +03:00
Lauri Ojansivu 824dd005ef Validate restored Danish age wording
Retain Dage gammel with Danish dictionary evidence and reject the Swedish pulled replacement in regression coverage. Current application source does not use the key, so no rendered UI validation is claimed. Exact review and correction ledgers pass.
2026-09-14 16:36:27 +03:00
Lauri Ojansivu 97ece442d1 Record Galician attachment translation repair progress
Date the exact correction and unchanged-review counts, link the verified source commit and dictionary evidence, and list all languages touched by the new attachment action keys. Keep remaining restored, uncertain, unflagged and browser review open.
2026-09-14 16:35:28 +03:00
Lauri Ojansivu bc26fa8904 Repair Galician attachment trigger agreement
Use masculine attachment-specific action labels while preserving feminine shared labels for other subjects. Reuse existing action translations in other locales. Replace Portuguese attachment/card fragments in the Galician regional locale.

Retain three correct original Galician fragments with their contextual explanation. Verify correction and review ledgers, all-locale label reuse, member agreement and real Jade compilation. Browser regression is added and syntax-checked; live browser and whole-language review remain open.
2026-09-14 16:34:35 +03:00
Lauri Ojansivu 0f550985a8 Record Basque rule grammar repair and remaining phrase review
Thanks to xet7.
2026-09-14 16:25:56 +03:00
Lauri Ojansivu afbff51dfb Repair Basque trigger linking-verb composition
Replace Spanish es with native Basque da and omit the separate linking verb in Basque trigger templates whose action labels already contain the temporal verb clause. Preserve other locales and language switching. Add positive, negative, helper-runtime and browser regression coverage. Node and Jade checks pass; browser execution and full Basque fluency review remain open.

Thanks to xet7.
2026-09-14 16:25:20 +03:00
Lauri Ojansivu a67a168cb3 Record Acehnese restored repairs and native-source limits
Thanks to xet7.
2026-09-14 16:22:54 +03:00
Lauri Ojansivu 6aa5991de4 Repair restored Acehnese authentication text and assignment meanings
Use native authentication cancellation, text and success vocabulary; distinguish a task assignee from questioning wording and repair the Malay filter label. Full connection/assignment phrase grammar and browser validation remain open.

Thanks to xet7.
2026-09-14 16:22:12 +03:00
Lauri Ojansivu d643fe977c Wrap Greenlandic calendar changelog entry at 80 columns
Thanks to xet7.
2026-09-14 16:20:35 +03:00
Lauri Ojansivu 25c66aa964 Record Greenlandic calendar repair and validation limits
Thanks to xet7.
2026-09-14 16:20:01 +03:00
Lauri Ojansivu 019040ce19 Repair Greenlandic Indian national calendar label
Translate the English label using native India, national and calendar vocabulary. Full compound inflection remains under review. Add structural and Member Settings UI regression coverage; browser test is syntax-checked but not yet run.

Thanks to xet7.
2026-09-14 16:19:25 +03:00
Lauri Ojansivu 92b32df3c2 Record native Veps and Valencian term review evidence
Thanks to xet7.
2026-09-14 16:17:41 +03:00
Lauri Ojansivu 39af6aae51 Preserve reviewed Veps and Valencian source-identical vocabulary
Native Veps uses server and Valencian uses errors. Protect these exact per-locale keys from placeholder filling, while testing that prose and other locales remain translatable. Update the completeness guard for the repaired Sardinian wording and reviewed native terms; language fluency review remains separate.

Thanks to xet7.
2026-09-14 16:16:55 +03:00
Lauri Ojansivu 9b67b11cb7 Record Breton rule-editor repairs and grammar review evidence
Thanks to xet7.
2026-09-14 16:15:14 +03:00
Lauri Ojansivu 49bd242c94 Repair Breton rule-editor fields and action language
Replace eight French field/action labels using existing Breton terminology and the Ofis computing glossary. Preserve recipient, date operation, color and swimlane contexts; complete shared grammar and browser review remain open.

Thanks to xet7.
2026-09-14 16:14:46 +03:00
Lauri Ojansivu 27fcc4ba5a Record Breton completion-state repairs and remaining review
Thanks to xet7.
2026-09-14 16:13:16 +03:00
Lauri Ojansivu a9ea9d4623 Repair Breton completion-state translation language
Use existing Breton completion and checklist-uncompletion vocabulary for three French-seeded labels. Shared trigger clause grammar and browser verification remain open.

Thanks to xet7.
2026-09-14 16:12:15 +03:00
Lauri Ojansivu d948b78098 Record dated Breton date-trigger translation repairs
Thanks to xet7.
2026-09-14 16:11:46 +03:00
Lauri Ojansivu 48c7e8aa41 Repair Breton date-change trigger labels
Replace mixed French labels with Breton clauses preserving set-or-changed behavior and each date field. Complete phrase fluency and browser rendering remain under review.

Thanks to xet7.
2026-09-14 16:11:18 +03:00
Lauri Ojansivu d145d17771 Record dated Breton restore translation repairs 2026-09-14 16:07:33 +03:00
Lauri Ojansivu ba815b5312 Repair French Breton restore controls 2026-09-14 16:07:10 +03:00
Lauri Ojansivu 56f6486640 Record dated Breton migration translation repairs 2026-09-14 16:06:29 +03:00
Lauri Ojansivu 698acc6667 Repair French Breton migration status and recurrence labels 2026-09-14 16:03:14 +03:00
Lauri Ojansivu 6c8bc3eb16 Record dated Breton list menu translation repairs 2026-09-14 16:02:26 +03:00
Lauri Ojansivu ed962d0269 Repair French Breton list name template and insertion labels 2026-09-14 16:02:02 +03:00
Lauri Ojansivu 068b99a634 Record dated Breton card and missing item translation repairs 2026-09-14 16:01:29 +03:00
Lauri Ojansivu 04510ecd2f Repair French Breton card controls and missing item messages 2026-09-14 16:01:03 +03:00
Lauri Ojansivu 026bf9dcbc Record dated Breton attachment translation repair progress 2026-09-14 16:00:11 +03:00
Lauri Ojansivu 0a3320e69a Repair French Breton attachment export and upload controls 2026-09-14 15:59:49 +03:00
Lauri Ojansivu 42b8c46d5e Record dated Breton board and filter translation repairs 2026-09-14 15:59:10 +03:00
Lauri Ojansivu e7f8f5a13e Repair Breton board privacy title and filter controls 2026-09-14 15:58:47 +03:00
Lauri Ojansivu 2311ade93e Record dated Breton account translation repair progress 2026-09-14 15:57:59 +03:00
Lauri Ojansivu 6af6d3ac3d Repair French Breton account login and password controls 2026-09-14 15:57:36 +03:00
Lauri Ojansivu 5b3c0f99c6 Record dated Breton date rule translation repair progress 2026-09-14 15:57:00 +03:00
Lauri Ojansivu 3bddd8e142 Repair French Breton date rule fields and activity text 2026-09-14 15:56:38 +03:00
Lauri Ojansivu 3d99eea4ba Record dated Breton voting translation repair progress 2026-09-14 15:55:42 +03:00
Lauri Ojansivu 9f4e6a56f8 Repair French Breton voting controls and public board message 2026-09-14 15:55:22 +03:00
Lauri Ojansivu ee980f3b8a Record dated Breton organization and watch translation repairs 2026-09-14 15:54:46 +03:00
Lauri Ojansivu 14cb8393b7 Repair French Breton organization watch and read controls 2026-09-14 15:54:26 +03:00
Lauri Ojansivu 35c4ec22a4 Record dated Breton sorting translation repair progress 2026-09-14 15:53:47 +03:00
Lauri Ojansivu dda942c11b Repair French Breton sorting controls and order labels 2026-09-14 15:53:26 +03:00
Lauri Ojansivu 30c305b22d Record dated Breton calendar navigation translation repairs 2026-09-14 15:50:39 +03:00
Lauri Ojansivu 66c45f6443 Repair French Breton calendar month navigation labels 2026-09-14 15:50:19 +03:00
Lauri Ojansivu 59c4d88b80 Record dated Breton removal and update translation repairs 2026-09-14 15:49:39 +03:00
Lauri Ojansivu c576850ef5 Repair French Breton removal and update action controls 2026-09-14 15:49:19 +03:00
Lauri Ojansivu 417467ef51 Record dated Breton automation translation repair progress 2026-09-14 15:48:41 +03:00
Lauri Ojansivu 000d7ee63e Repair French Breton automation rule and action labels 2026-09-14 15:48:04 +03:00
Lauri Ojansivu 1fc8ce939b Record dated Breton add item translation repairs 2026-09-14 15:47:22 +03:00
Lauri Ojansivu a4aa7e3e79 Repair French Breton add item and user selection controls 2026-09-14 15:46:33 +03:00
Lauri Ojansivu 8a1c564796 Record dated Breton avatar and profile translation repairs 2026-09-14 15:45:48 +03:00
Lauri Ojansivu 7c44e4f55d Repair French Breton avatar profile and notification controls 2026-09-14 15:45:25 +03:00
Lauri Ojansivu cd3f40d5b6 Record dated Breton settings and team translation repairs 2026-09-14 15:44:42 +03:00
Lauri Ojansivu 7223612e7a Repair French Breton settings permissions and team controls 2026-09-14 15:44:15 +03:00
Lauri Ojansivu 716e0d9701 Record dated Breton date validation translation repairs 2026-09-14 15:43:35 +03:00
Lauri Ojansivu 98947b8243 Repair French Breton date headings and validation controls 2026-09-14 15:43:09 +03:00
Lauri Ojansivu 28230bcf86 Record dated Breton date and duration translation progress 2026-09-14 15:42:25 +03:00
Lauri Ojansivu 787ffdf74b Repair French Breton date duration and filter controls 2026-09-14 15:41:51 +03:00
Lauri Ojansivu fbef64733d Record dated Breton deletion repair and remaining translation reviews 2026-09-14 15:41:12 +03:00
Lauri Ojansivu cd100eeaa6 Repair French swimlane deletion title in Breton 2026-09-14 15:40:51 +03:00
Lauri Ojansivu d440caf35a Record dated Breton copy and move translation repairs 2026-09-14 15:40:28 +03:00
Lauri Ojansivu 625436b63f Translate Breton copy move template checklist and account controls 2026-09-14 15:37:38 +03:00
Lauri Ojansivu 7ea860c261 Record dated Breton archive translation repairs and review limits 2026-09-14 15:36:37 +03:00
Lauri Ojansivu b1170bc338 Repair French Breton archive actions confirmations and states 2026-09-14 15:36:05 +03:00
Lauri Ojansivu f41cb3b5ab Record Galician trigger agreement repair and remaining audit work 2026-09-14 15:34:49 +03:00
Lauri Ojansivu a196c64eb8 Repair Galician member and assignee trigger subject agreement 2026-09-14 15:34:16 +03:00
Lauri Ojansivu acb2e390cb Record assigned-card shortcut review and regional style limits 2026-09-14 15:32:49 +03:00
Lauri Ojansivu 64f1d73678 Validate assigned-card shortcut meaning and preserve valid possessive 2026-09-14 15:32:21 +03:00
Lauri Ojansivu 7396c39ba9 Record provisional Bambara epoch fills and terminology review limits 2026-09-14 15:31:25 +03:00
Lauri Ojansivu a06bf0cca5 Fill Bambara Hijri epoch placeholders with provisional full labels 2026-09-14 15:30:56 +03:00
Lauri Ojansivu ced1b46323 Record Breton popup translation repairs and verification limits 2026-09-14 15:29:53 +03:00
Lauri Ojansivu 6db6c7b164 Translate French Breton board list label date and language popups 2026-09-14 15:29:28 +03:00
Lauri Ojansivu 76a707c11f Record dated Breton member and label translation repairs 2026-09-14 15:28:30 +03:00
Lauri Ojansivu b72b9d1fda Repair French member and label interface wording in Breton 2026-09-14 15:28:00 +03:00
Lauri Ojansivu 1147a57d50 Record Breton assignee translation repairs and audit progress 2026-09-14 15:26:53 +03:00
Lauri Ojansivu 87e2ed6fa8 Repair French assignee labels in Breton and validate absence wording 2026-09-14 15:26:29 +03:00
Lauri Ojansivu 30d63e856d Record Sardinian colour evidence and remaining translation review 2026-09-14 15:25:31 +03:00
Lauri Ojansivu 04711b646c Use attested Sardinian fuchsia label for CSS magenta colour 2026-09-14 15:25:03 +03:00
Lauri Ojansivu b0a1ec606b Record Greenlandic calendar fill provenance and remaining review 2026-09-14 15:23:30 +03:00
Lauri Ojansivu e4860ab8e9 Localize Greenlandic Buddhist calendar placeholder 2026-09-14 15:23:07 +03:00
Lauri Ojansivu 7974c130c1 Record dated Veps authentication wording repair and audit limits 2026-09-14 15:22:06 +03:00
Lauri Ojansivu 780f51f5df Use Veps authentication cancel wording consistent with native software 2026-09-14 15:21:29 +03:00
Lauri Ojansivu e82ffa7fd5 Document Nahuatl calendar reference distinctions and unresolved wording 2026-09-14 15:20:47 +03:00
Lauri Ojansivu 7daece578c Record dated Acehnese absence-label repair and review limits 2026-09-14 15:19:45 +03:00
Lauri Ojansivu 66a3da76c3 Repair Indonesian no-label filter in Acehnese and retain absence label 2026-09-14 15:19:22 +03:00
Lauri Ojansivu 88cdb4d9bb Record dated Valencian storage-description review progress 2026-09-14 15:18:06 +03:00
Lauri Ojansivu 4ddcb81c9c Validate Valencian S3 bucket endpoint and port descriptions 2026-09-14 15:17:43 +03:00
Lauri Ojansivu 9b044a637a Record provisional Manx calendar fill and remaining audit scope 2026-09-14 15:17:10 +03:00
Lauri Ojansivu c5c91129bc Fill Manx Coptic calendar placeholder with provisional terminology 2026-09-14 15:16:40 +03:00
Lauri Ojansivu d7e8058400 Record Galician action repairs in dated translation audit 2026-09-14 15:15:38 +03:00
Lauri Ojansivu f52ab6adf0 Repair Portuguese nouns in Galician card completion actions 2026-09-14 15:15:17 +03:00
Lauri Ojansivu a0e8727209 Record dated schedule and idle translation audit progress 2026-09-14 15:14:31 +03:00
Lauri Ojansivu 287e99dd23 Correct Galician schedule noun and validate idle-state labels 2026-09-14 15:13:47 +03:00
Lauri Ojansivu beea28ada9 Record dated completion reviews and Valencian error-count repair 2026-09-14 15:10:55 +03:00
Lauri Ojansivu 3b4941c345 Resolve completion-label context and correct Valencian error count 2026-09-14 15:10:30 +03:00
Lauri Ojansivu 675e463164 Record dated export-capacity translation review 2026-09-14 15:09:19 +03:00
Lauri Ojansivu 99a1e4835e Validate Danish Basque and Galician free disk-space labels 2026-09-14 15:08:55 +03:00
Lauri Ojansivu 306dddb3a8 Document corrected mirror checkout paths and cleanup 2026-09-14 15:07:46 +03:00
Lauri Ojansivu 23de748538 Reuse established mirror checkouts outside the content archive 2026-09-14 15:07:32 +03:00
Lauri Ojansivu fdb009d183 Record dated Basque ticket terminology review 2026-09-14 15:06:51 +03:00
Lauri Ojansivu 37a664a5cc Retain attested Basque ticket-number terminology 2026-09-14 15:06:31 +03:00
Lauri Ojansivu 53e62c0eab Record dated Valencian agreement repair and regional-review limits 2026-09-14 15:05:57 +03:00
Lauri Ojansivu c4e6aa1c0a Repair Valencian attachment-label gender agreement 2026-09-14 15:05:38 +03:00
Lauri Ojansivu bf97c6447d Record Silesian terminology evidence and avoid unverified replacements 2026-09-14 15:05:04 +03:00
Lauri Ojansivu 2b20b1b22f Document mirror Git progress and dated Acehnese review status 2026-09-14 15:04:13 +03:00
Lauri Ojansivu 567c770c8a Stream mirror Git command output and force transfer progress 2026-09-14 15:04:10 +03:00
Lauri Ojansivu c44dca1703 Retain dictionary-attested Acehnese more label 2026-09-14 15:03:00 +03:00
Lauri Ojansivu d08d0ffd13 Record dated Basque placement review and remaining audit work 2026-09-14 15:02:14 +03:00
Lauri Ojansivu 918d17c6ba Validate Basque rule placement and list ownership labels 2026-09-14 15:01:55 +03:00
Lauri Ojansivu d04f5623bb Record dated Basque archive repairs and remaining audit scope 2026-09-14 15:01:25 +03:00
Lauri Ojansivu 1b228a63f4 Use Basque archive terminology consistently in rule actions 2026-09-14 15:01:06 +03:00
Lauri Ojansivu 3a4b07831d Merge remote-tracking branch 'origin/main' 2026-09-14 15:01:02 +03:00
Lauri Ojansivu 2a67bc55cd Record dated Basque trigger repair and unresolved composition 2026-09-14 15:00:13 +03:00
Lauri Ojansivu e9d46cb113 Replace Spanish end-date fragment in Basque trigger 2026-09-14 14:59:52 +03:00
Lauri Ojansivu 89d7b5d5bd Record dated Esperanto color repair and remaining verification scope 2026-09-14 14:58:53 +03:00
Lauri Ojansivu d454a58fff Use explicit Esperanto lime-color terminology 2026-09-14 14:58:32 +03:00
Lauri Ojansivu 9f0d5cad80 Record inspected Tamazight wrong-language queue and dictionary leads 2026-09-14 14:57:41 +03:00
Lauri Ojansivu a7978038b5 Record dated Manx calendar repairs and provisional terminology 2026-09-14 14:56:37 +03:00
Lauri Ojansivu cc3e80e8bd Localize Manx tabular calendar variants with distinct epoch wording
Use dictionary-attested tabular, civil and astronomical vocabulary. Starting-date wording for epoch is provisional and requires native terminology review.
2026-09-14 14:56:13 +03:00
Lauri Ojansivu da6d127b04 Record dated Greenlandic seed repair and native-review limits 2026-09-14 14:55:16 +03:00
Lauri Ojansivu ed5a0d8792 Replace Azerbaijani seed in Greenlandic calendar setting
Use Greenlandic calendar arrangement and date-display wording. Compound grammar is provisional and needs native review; remaining calendar variants are still under audit.
2026-09-14 14:54:54 +03:00
Lauri Ojansivu 2c13f7fbc5 Record dated Valencian search-token verification 2026-09-14 14:54:05 +03:00
Lauri Ojansivu be334a5bf0 Verify and retain working Valencian checklist search tokens 2026-09-14 14:53:45 +03:00
Lauri Ojansivu fe2682ed01 Record dated Valencian color and account-action review 2026-09-14 14:53:12 +03:00
Lauri Ojansivu 5c71990507 Validate Valencian color names and contextual unlock-all scope 2026-09-14 14:52:51 +03:00
Lauri Ojansivu 86c6940248 Record dated cancellation-label review and unresolved translation scope 2026-09-14 14:52:09 +03:00
Lauri Ojansivu d3ad084e78 Retain attested Asturian and Turkmen cancellation labels 2026-09-14 14:51:49 +03:00
Lauri Ojansivu fafe1fd93d Record dated short-label translation review and remaining audit work 2026-09-14 14:51:16 +03:00
Lauri Ojansivu 69b8202ed3 Validate Asturian labels Tamil Telugu headings and Uyghur JSON example 2026-09-14 14:50:55 +03:00
Lauri Ojansivu 3891bbe686 Refresh Upcoming translation summary and remaining audit status 2026-09-14 14:50:26 +03:00
Lauri Ojansivu d7f9970c52 Record dated Swedish and Arabic translation review progress 2026-09-14 14:47:48 +03:00
Lauri Ojansivu 4da4c40e43 Validate Swedish role warnings and Arabic due-date and assignee labels 2026-09-14 14:47:24 +03:00
Lauri Ojansivu acd57f5e01 Record dated Swedish due-date translation repairs 2026-09-14 14:46:52 +03:00
Lauri Ojansivu 93f284c8a4 Correct Swedish Due Cards labels to include future deadlines 2026-09-14 14:46:26 +03:00
Lauri Ojansivu a319076e4d Record dated Thai translation review and remaining phrase work 2026-09-14 14:45:32 +03:00
Lauri Ojansivu 9111dcfbeb Validate Thai interface units search vocabulary and product names 2026-09-14 14:45:08 +03:00
Lauri Ojansivu 5a302f1fd7 Record dated Valencian accessibility and storage review progress 2026-09-14 14:44:05 +03:00
Lauri Ojansivu ff7e2b0828 Validate Valencian accessibility storage and interval labels 2026-09-14 14:43:40 +03:00
Lauri Ojansivu e0accf0a1d Record dated Valencian display and checked-item repair progress 2026-09-14 14:43:05 +03:00
Lauri Ojansivu aa10062078 Repair Valencian checked-item prose and validate display settings 2026-09-14 14:42:40 +03:00
Lauri Ojansivu fcb7a0af5f Record dated Valencian checklist repairs and remaining token review 2026-09-14 14:41:50 +03:00
Lauri Ojansivu e4a846162f Replace mixed English checklist prose in Valencian labels 2026-09-14 14:41:23 +03:00
Lauri Ojansivu cb4031487f Record dated Valencian lockout and migration review progress 2026-09-14 14:40:37 +03:00
github-actions[bot] 79fe622d20 Bump versions for v11.79 2026-09-14 11:40:29 +00:00
Lauri Ojansivu 25818620cf Validate Valencian lockout and migration outcome wording 2026-09-14 14:40:15 +03:00
Lauri Ojansivu 2dd63f3898 Record dated Valencian imperative repair and settings review 2026-09-14 14:39:35 +03:00
Lauri Ojansivu 264ca788cf Prepare v11.79 release 2026-09-14 14:38:57 +03:00
Lauri Ojansivu 8e98c53929 Merge remote-tracking branch 'origin/main' 2026-09-14 14:38:37 +03:00
Lauri Ojansivu 3f21ac57b2 Update upcoming changelog and dated translation repair progress 2026-09-14 14:38:08 +03:00
Lauri Ojansivu 12ba3ba1ae Validate Basque authentication and date-change activity wording 2026-09-14 14:37:28 +03:00
Lauri Ojansivu 710a2df539 Document release prepare parser fix in upcoming changelog 2026-09-14 14:36:24 +03:00
Lauri Ojansivu ac63da6d00 Recognize translation section headings without misreading release summary prose 2026-09-14 14:36:10 +03:00
Lauri Ojansivu bca63bad11 Record dated Basque storage and schedule translation review 2026-09-14 14:35:45 +03:00
Lauri Ojansivu 241fc457a0 Validate Basque storage connection and scheduled interval labels 2026-09-14 14:35:26 +03:00
Lauri Ojansivu ddfd158bb6 Record dated Basque search validation and legal translation review 2026-09-14 14:34:52 +03:00
Lauri Ojansivu fbf809882d Validate Basque search errors sort directions and legal acceptance labels 2026-09-14 14:34:32 +03:00
Lauri Ojansivu 01f2205bec Record dated Basque settings and search translation review 2026-09-14 14:33:59 +03:00
Lauri Ojansivu 097b04e1d3 Validate Basque weekday labels object errors and search vocabulary 2026-09-14 14:33:35 +03:00
Lauri OjansivuandCopilot Autofix powered by AI 55e4aec262 Potential fix for code scanning alert no. 541: Incomplete regular expression for hostnames
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-09-14 14:33:30 +03:00
Lauri Ojansivu 2a194cfb0a Update audit with Basque reminders and shared language flag verification 2026-09-14 14:32:59 +03:00
Lauri Ojansivu 685b50fe12 Validate Basque reminders deletion warnings and notification labels 2026-09-14 14:32:38 +03:00
Lauri Ojansivu 0397fc89b4 Verify language flags through the shared picker helper 2026-09-14 14:32:20 +03:00
Lauri Ojansivu 396f6d61a5 Record Veps server-error repair in new upcoming release and audit 2026-09-14 14:31:37 +03:00
Lauri Ojansivu 9f0f038cde Replace Finnish server error label with Veps wording 2026-09-14 14:30:42 +03:00
735 changed files with 76784 additions and 6609 deletions

No files matched your search

-1
View File
@@ -38,7 +38,6 @@ ENV \
AVATARS_UPLOAD_EXTERNAL_PROGRAM="" \
AVATARS_UPLOAD_MIME_TYPES="" \
AVATARS_UPLOAD_MAX_SIZE=0 \
RICHER_CARD_COMMENT_EDITOR=false \
CARD_OPENED_WEBHOOK_ENABLED=false \
MAX_IMAGE_PIXEL="" \
IMAGE_COMPRESS_RATIO="" \
-1
View File
@@ -29,7 +29,6 @@ services:
- MONGO_URL=mongodb://wekandb-dev:27017/wekan
- ROOT_URL=http://localhost:3000
- WITH_API=true
- RICHER_CARD_COMMENT_EDITOR=true
- BROWSER_POLICY_ENABLED=true
- WRITABLE_PATH=/data
depends_on:
@@ -150,7 +150,6 @@ jobs:
PORT=3000 \
WRITABLE_PATH="$PWD/wekan-writable" \
WITH_API=true \
RICHER_CARD_COMMENT_EDITOR=false \
node output/bundle/main.js > wekan-run.log 2>&1 &
# The production server serves the client JS statically, so once :3000
# responds the bundle is being served. Wait up to 10 minutes.
@@ -269,7 +268,6 @@ jobs:
PORT=3000 \
WRITABLE_PATH="$PWD/wekan-writable" \
WITH_API=true \
RICHER_CARD_COMMENT_EDITOR=false \
node output/bundle/main.js > wekan-run.log 2>&1 &
for i in $(seq 1 60); do
if curl -sf http://localhost:3000 > /dev/null; then
+103 -96
View File
@@ -3900,6 +3900,11 @@ jobs:
# continuation comments out the rest of the joined line, leaving
# `docker buildx build` with no platforms and no tags. This block is a
# shell script like any other, and it was written the wrong way first.
# Build once for Docker Hub and GHCR, then copy the published manifest
# to Quay in the next step. Quay can switch to read-only mode after
# this expensive build starts; a single --push across all three
# registries then reports the whole job failed even when the first
# two received a complete image.
# ONE IMAGE NAME, on three registries. wekan-ondra and wekan-gantt-gpl
# are SNAP names - they exist because a snap name cannot be changed once
# people have installed it - and there is nothing for them to be as
@@ -3921,8 +3926,6 @@ jobs:
--build-arg VERSION=${VERSION} \
-t wekanteam/wekan:v${VERSION} \
-t wekanteam/wekan:latest \
-t quay.io/wekan/wekan:v${VERSION} \
-t quay.io/wekan/wekan:latest \
-t ghcr.io/wekan/wekan:v${VERSION} \
-t ghcr.io/wekan/wekan:latest \
--push \
@@ -3960,8 +3963,7 @@ jobs:
# the image deliberately dropped.
want="${WANT}"
rc=0
for image in "wekanteam/wekan:v${VERSION}" "quay.io/wekan/wekan:v${VERSION}" \
"ghcr.io/wekan/wekan:v${VERSION}"; do
for image in "wekanteam/wekan:v${VERSION}" "ghcr.io/wekan/wekan:v${VERSION}"; do
# The format MUST carry the CPU variant. buildx builds linux/arm/v7,
# but the registry records that as architecture "arm" with variant
# "v7" in a SEPARATE field - so an OS/Architecture-only format prints
@@ -3990,6 +3992,45 @@ jobs:
done
exit $rc
- name: Copy published manifest to Quay
run: |
set -uo pipefail
# imagetools copies the existing multi-platform manifest without
# rebuilding every architecture. A Quay-wide read-only outage is
# temporary and affects every user; keep the completed publications
# on Docker Hub and GHCR. Any other refusal remains a real failure.
if output="$(docker buildx imagetools create \
-t "quay.io/wekan/wekan:v${VERSION}" \
-t "quay.io/wekan/wekan:latest" \
"ghcr.io/wekan/wekan:v${VERSION}" 2>&1)"; then
printf '%s\n' "$output"
echo "QUAY_PUBLISHED=true" >> "$GITHUB_ENV"
else
printf '%s\n' "$output"
if printf '%s' "$output" | grep -qi 'System is currently read-only.*write operations are currently suspended'; then
echo "::warning::Quay is in read-only mode; Docker Hub and GHCR were published and verified. Re-run this Docker job when Quay resumes writes to copy the same release manifest."
echo "QUAY_PUBLISHED=false" >> "$GITHUB_ENV"
else
echo "::error::Could not copy the published manifest to Quay; this is not the registry's read-only outage."
exit 1
fi
fi
- name: Verify Quay manifest platforms
if: env.QUAY_PUBLISHED == 'true'
run: |
set -euo pipefail
image="quay.io/wekan/wekan:v${VERSION}"
got="$(docker buildx imagetools inspect "$image" --format '{{range .Manifest.Manifests}}{{.Platform.OS}}/{{.Platform.Architecture}}{{if .Platform.Variant}}/{{.Platform.Variant}}{{end}} {{end}}')"
got="$(printf '%s' "$got" | sed 's#/v8 # #g')"
for plat in $WANT; do
case " $got " in
*" $plat "*) ;;
*) echo "::error::$image has no $plat in its manifest (it has:$got)."; exit 1 ;;
esac
done
echo "OK: $image carries:$got"
# PUSHED IS NOT THE SAME AS PULLABLE BY ANYONE.
#
# The check above asks the registries with the release's own credentials, so
@@ -4055,10 +4096,12 @@ jobs:
}
# The variant names are commented out with the -t lines they went with;
# nothing pushes them, so nothing checks them.
for image in "wekanteam/wekan:v${VERSION}" "quay.io/wekan/wekan:v${VERSION}" \
"ghcr.io/wekan/wekan:v${VERSION}"; do
for image in "wekanteam/wekan:v${VERSION}" "ghcr.io/wekan/wekan:v${VERSION}"; do
anon_check "$image"
done
if [ "${QUAY_PUBLISHED:-false}" = true ]; then
anon_check "quay.io/wekan/wekan:v${VERSION}"
fi
exit $rc
# Always, as the last step: the run summary then answers "what worked and what
@@ -4344,18 +4387,7 @@ jobs:
# one still upload cleanly.
up=("$asset")
[ -f "${asset}.sha256sum" ] && up+=("${asset}.sha256sum")
if ! gh release upload --repo "${GITHUB_REPOSITORY:-wekan/wekan}" "v${VERSION}" "${up[@]}" --clobber; then
echo "::error::Could not attach $asset to release v${VERSION}: the release must exist first (the release job), and GITHUB_TOKEN must be allowed to write releases here."
exit 1
fi
# Confirm from the OTHER side. An upload that reports success but leaves no
# asset behind is the failure nobody notices until a download 404s.
gh release view --repo "${GITHUB_REPOSITORY:-wekan/wekan}" "v${VERSION}" --json assets --jq '.assets[].name' > release-assets.txt
if ! grep -qxF "$(basename "$asset")" release-assets.txt; then
echo "::error::$asset is not listed in release v${VERSION} although the upload reported success. Re-run this job."
exit 1
fi
echo "OK: $(basename "$asset") is attached to release v${VERSION} ($(($(wc -c < "$asset")/1024/1024)) MiB)."
bash releases/github-release-upload.sh "${GITHUB_REPOSITORY:-wekan/wekan}" "v${VERSION}" "${up[@]}"
# Always, as the last step: the run summary then answers "what worked and what
# did not" for the whole release at a glance, instead of eighteen job logs. A
@@ -4412,7 +4444,7 @@ jobs:
# never cancels the others - each publishes the moment it finishes.
continue-on-error: true
# GitHub's hosted-job ceiling is six hours. The remote command below stops
# waiting after five hours on riscv64 and leaves the queued Launchpad build
# waiting after five hours across all attempts and leaves the Launchpad build
# alive, giving log collection and the summary a full hour to finish cleanly
# instead of having GitHub cancel the job at 360 minutes.
timeout-minutes: 360
@@ -4484,36 +4516,9 @@ jobs:
- name: Flatten history so the Launchpad push stays small
if: steps.bundle.outputs.available == 'true'
# snapcraft remote-build pushes the project's git repository to
# git.launchpad.net and builds it there. It rejects a SHALLOW clone
# (that is why the checkout above is fetch-depth: 0), but it does NOT
# need the history - and WeKan's full history is large enough that the
# push times out or is refused mid-upload:
# Git operation failed with: Could not push 'HEAD' to
# git.launchpad.net/.../+git/snapcraft-wekan-<hash>
# after ~4-5 minutes, three attempts running, which is how v10.55
# riscv64 and v10.64 ppc64el failed. Re-init the repo as ONE commit of
# the tagged tree: a COMPLETE repository (git rev-parse
# --is-shallow-repository is false, so remote-build accepts it), just
# without the history it pushes for nothing. The push is then the source
# tree (tens of MB) instead of the whole history (hundreds). The snap
# version comes from snapcraft.yaml (verified below), not git-describe,
# so dropping the history changes nothing about what is built.
run: |
set -euo pipefail
# remote-build derives its Launchpad recipe name from this commit.
# Preserve the tagged commit's timestamp so a re-run creates the SAME
# root commit and reconnects to the queued build instead of submitting
# another riscv64 build behind it.
snapshot_date="$(git show -s --format=%cI HEAD)"
rm -rf .git
git init -q
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add -A
GIT_AUTHOR_DATE="$snapshot_date" GIT_COMMITTER_DATE="$snapshot_date" \
git commit -q -m "WeKan ${VERSION} snapshot for Launchpad remote-build"
echo "Re-initialised as one commit; shallow: $(git rev-parse --is-shallow-repository)"
# Snapcraft hashes the project files, not only its commit. Use a complete
# one-commit source tree with Git metadata/logs outside the hashed tree.
run: bash releases/prepare-launchpad-source.sh "${{ matrix.arch }}"
- name: Install snapcraft
if: steps.bundle.outputs.available == 'true'
@@ -4588,6 +4593,34 @@ jobs:
}
echo "built=false" >> "$GITHUB_OUTPUT"
echo "pending=false" >> "$GITHUB_OUTPUT"
# A shared deadline, not five hours PER retry. Every architecture can
# queue (v11.85 ppc64el/s390x), and TLS recovery must not reset the budget.
deadline=$((SECONDS + 18000))
export TMPDIR="$PWD/.tools/tmp"
remote_wrapper="$PWD/releases/snapcraft-remote-compat.sh"
remote_source="$PWD/.tools/tmp/snap-launchpad-source"
remote_log="$PWD/.tools/tmp/remote-build-attempt.log"
run_remote_build() {
local remaining=$((deadline - SECONDS))
[ "$remaining" -gt 0 ] || return 124
# Isolate the local waiter, and kill it if it ignores TERM. Never
# cancel the remote build; a later run can recover the same recipe.
(
cd "$remote_source" || { echo "::error::Prepared Launchpad source is missing: $remote_source" >&2; exit 1; }
timeout --kill-after=30s "${remaining}s" bash "$remote_wrapper" remote-build --launchpad-accept-public-upload \
--build-for ${{ matrix.arch }} "$@"
) 2>&1 | tee "$remote_log"
local remote_rc=${PIPESTATUS[0]}
# Downloaded artifacts and build logs also change the project hash.
# Move them out before the next recovery attempt, keeping the logs
# where the existing diagnostics/artifact collection expect them.
local download
for download in "$remote_source"/*.snap "$remote_source"/snapcraft-wekan-*.txt; do
mv "$download" .
done
return "$remote_rc"
}
attempts=3
for i in $(seq 1 "$attempts"); do
# A partial file from a previous attempt must not be mistaken for
@@ -4595,22 +4628,13 @@ jobs:
# already has, so the truncated one would be uploaded again.
rm -f wekan_${VERSION}_${{ matrix.arch }}*.snap *_${{ matrix.arch }}.snap
echo "::group::Remote build ${{ matrix.arch }} attempt $i/$attempts"
if [ "${{ matrix.arch }}" = riscv64 ]; then
# Launchpad's riscv64 queue exceeded GitHub's six-hour job cap in
# v11.06. Stop only the LOCAL waiter after five hours; Launchpad
# keeps the named build, and the deterministic snapshot above lets
# a job re-run reconnect and download it when ready.
# Do not use --foreground here. GNU timeout then owns a separate
# process group and returns 124 to this shell when it expires.
# With --foreground, terminating snapcraft surfaced to Actions as
# "The operation was canceled", so the rc=124 pending branch
# below never ran and the otherwise healthy matrix leg was red.
timeout 300m snapcraft remote-build \
--launchpad-accept-public-upload \
--build-for ${{ matrix.arch }} && rc=0 || rc=$?
else
snapcraft remote-build --launchpad-accept-public-upload \
--build-for ${{ matrix.arch }} && rc=0 || rc=$?
# Always try recovery first, including a re-run of this matrix job.
# start_builds replaces the recipe; it does NOT resume polling after
# an SSL EOF. Only an explicitly absent recipe/repository permits a
# new submission. Authentication/network failures are not absence.
run_remote_build --recover && rc=0 || rc=$?
if [ "$rc" -ne 0 ] && grep -qE 'Could not find (snap recipe|repository at path)' "$remote_log"; then
run_remote_build && rc=0 || rc=$?
fi
echo "::endgroup::"
# A real glob, so nullglob can empty it, plus any name Launchpad chose -
@@ -4630,13 +4654,13 @@ jobs:
echo "built=true" >> "$GITHUB_OUTPUT"
exit 0
fi
if [ "${{ matrix.arch }}" = riscv64 ] && [ "$rc" -eq 124 ]; then
if [ "$rc" -eq 124 ] || [ "$SECONDS" -ge "$deadline" ]; then
echo "pending=true" >> "$GITHUB_OUTPUT"
echo "::warning::Launchpad riscv64 is still queued after five hours. Ending the local wait cleanly; re-run this matrix job later to reconnect to the same build and publish its snap."
echo "::warning::Launchpad ${{ matrix.arch }} has not produced a snap within the five-hour wait budget. Ending the local wait cleanly; re-run this matrix job later to reconnect to the same build and publish its snap."
exit 0
fi
if [ "$rc" -eq 0 ] && [ "${#snaps[@]}" -gt 0 ]; then
echo "::warning::Attempt $i produced ${snaps[0]}, but it is not a usable snap (see above). Deleting it and building again rather than handing it to the Snap Store."
echo "::warning::Attempt $i produced ${snaps[0]}, but it is not a usable snap (see above). Refusing to publish it; recovery must retrieve a valid artifact."
fi
if [ "$rc" -eq 0 ]; then
echo "Attempt $i: snapcraft exited 0 but produced NO .snap for ${{ matrix.arch }} - the Launchpad build did not finish (a 'Stopped' build downloads logs and no artifact). Everything in the directory:"
@@ -4675,12 +4699,12 @@ jobs:
echo "::endgroup::"
done
if [ "$i" -lt "$attempts" ]; then
# Start the next attempt from nothing. snapcraft keeps a local
# clone of the Launchpad repository under ~/.cache, and a retry
# that reuses a half-pushed one repeats the same failure - which is
# what three identical attempts sixteen minutes apart look like.
echo "Clearing snapcraft's remote-build cache before retrying."
rm -rf "$HOME/.cache/snapcraft/remote-build"
# Clear a half-pushed clone only when submission never reached
# monitoring. A failed poll must keep the running build intact.
if ! grep -qE 'Monitoring build|Recovering build' "$remote_log"; then
echo "Clearing snapcraft's remote-build cache before retrying submission."
rm -rf "$HOME/.cache/snapcraft/remote-build"
fi
echo "Retrying in 60s..."
sleep 60
fi
@@ -4762,7 +4786,7 @@ jobs:
# good builds were reported as FAILED by the step that saves their logs.
# The timestamp is worth keeping, so the colons become dashes rather
# than the name being thrown away.
for f in snapcraft-wekan-*.txt "$HOME"/.local/state/snapcraft/log/*.log; do
for f in snapcraft-wekan-*.txt .tools/tmp/remote-build-attempt.log "$HOME"/.local/state/snapcraft/log/*.log; do
[ -f "$f" ] || continue
base="$(basename "$f")"
cp -f "$f" "snap-logs/${base//:/-}" || true
@@ -4866,24 +4890,7 @@ jobs:
# attaching, which is the half people download from.
snaps=( $(printf '%s\n' wekan_${VERSION}_${{ matrix.arch }}*.snap *_${{ matrix.arch }}.snap | sort -u) )
if [ "${#snaps[@]}" -gt 0 ] && [ -s "${snaps[0]}" ]; then
if ! gh release upload --repo "${GITHUB_REPOSITORY:-wekan/wekan}" "v${VERSION}" "${snaps[@]}" --clobber; then
echo "::error::Could not attach ${snaps[*]} to release v${VERSION}. The snap BUILT and was published to the Snap Store by the step above, so this is the attaching alone - the half people download from."
exit 1
fi
# Confirm from the OTHER side, the way the native snap job does: an
# upload that reports success but leaves no asset behind is the
# failure nobody notices until a download 404s. v10.91 lost three
# architectures from the Release while every job that lost one had
# already said the snap was built and published.
gh release view --repo "${GITHUB_REPOSITORY:-wekan/wekan}" "v${VERSION}" \
--json assets --jq '.assets[].name' > release-assets.txt
for snap in "${snaps[@]}"; do
if ! grep -qxF "$(basename "$snap")" release-assets.txt; then
echo "::error::$(basename "$snap") is not listed in release v${VERSION} although the upload reported success. Re-run this job."
exit 1
fi
done
echo "OK: ${snaps[*]} attached to release v${VERSION}."
bash releases/github-release-upload.sh "${GITHUB_REPOSITORY:-wekan/wekan}" "v${VERSION}" "${snaps[@]}"
else
echo "No ${{ matrix.arch }} snap to attach - the build produced none."
fi
@@ -4892,14 +4899,14 @@ jobs:
# did not" for the whole release at a glance, instead of eighteen job logs. A
# step that failed has already printed an ::error:: saying why; this names the
# job it was in.
- name: Say what a queued riscv64 build leaves behind
- name: Say what an unfinished ${{ matrix.arch }} build leaves behind
if: steps.launchpad.outputs.pending == 'true'
run: |
echo "::warning::snap-launchpad riscv64 is still queued on Launchpad; this Actions job stopped waiting cleanly before GitHub's cap."
echo "::warning::snap-launchpad ${{ matrix.arch }} is unfinished on Launchpad; this Actions job stopped waiting cleanly before GitHub's cap."
echo "Re-run this matrix job after Launchpad finishes. Its deterministic snapshot reconnects to the same build, downloads the snap, and publishes it."
# An unexpected job-level cancellation is distinct from the deliberate,
# clean riscv64 waiter timeout above.
# clean waiter timeout above.
- name: Say what a cancelled ${{ matrix.arch }} job leaves behind
if: cancelled()
run: |
+6298 -17
View File
File diff suppressed because it is too large. Load diff
+1 -2
View File
@@ -20,7 +20,7 @@ LABEL org.opencontainers.image.source="https://github.com/wekan/wekan"
# TARGETARCH and TARGETVARIANT are automatically provided by Docker Buildx
ARG TARGETARCH
ARG TARGETVARIANT
ARG VERSION=11.78
ARG VERSION=11.87
ARG DEBIAN_FRONTEND=noninteractive
ENV BUILD_DEPS="apt-utils gnupg wget bzip2 g++ curl libarchive-tools build-essential git ca-certificates python3 unzip"
@@ -50,7 +50,6 @@ ENV \
AVATARS_UPLOAD_EXTERNAL_PROGRAM="" \
AVATARS_UPLOAD_MIME_TYPES="" \
AVATARS_UPLOAD_MAX_SIZE=72000 \
RICHER_CARD_COMMENT_EDITOR=false \
CARD_OPENED_WEBHOOK_ENABLED=false \
MAX_IMAGE_PIXEL="" \
IMAGE_COMPRESS_RATIO="" \
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v11.78.0"
appVersion: "v11.87.0"
files:
userUploads:
- README.md
+1 -3
View File
@@ -1491,7 +1491,6 @@ set "DDP_TRANSPORT=sockjs"
set "DEBUG=true"
set "WRITABLE_PATH=.."
set "WITH_API=true"
set "RICHER_CARD_COMMENT_EDITOR=false"
exit /b 0
:logdir
@@ -1827,11 +1826,10 @@ set "ROOT_URL=http://localhost:3000"
set "PORT=3000"
set "WRITABLE_PATH=%WRITABLE_ABS%"
set "WITH_API=true"
set "RICHER_CARD_COMMENT_EDITOR=false"
set "DEFAULT_METEOR_REACTIVITY_ORDER=changeStreams,oplog,polling"
echo ==^> Starting the WeKan test server on http://localhost:3000 from .build\bundle ^(precompiled - no rebuild^).
start "WekanTestServer" /MIN /D "%REPO%" cmd /c "(echo ===== WeKan test server [bundle node :3000 db :3001/meteor] started: %DATE% %TIME% =====) 1>%RUN_LOGDIR%\wekan-test-server.log 2>&1 & "%NODE_BIN%" "%REPO%\.build\bundle\main.js" 1>>%RUN_LOGDIR%\wekan-test-server.log 2>&1"
set "MONGO_URL=" & set "ROOT_URL=" & set "PORT=" & set "WRITABLE_PATH=" & set "WITH_API=" & set "RICHER_CARD_COMMENT_EDITOR=" & set "DEFAULT_METEOR_REACTIVITY_ORDER="
set "MONGO_URL=" & set "ROOT_URL=" & set "PORT=" & set "WRITABLE_PATH=" & set "WITH_API=" & set "DEFAULT_METEOR_REACTIVITY_ORDER="
REM 6) Wait for :3000 to answer (bundle boots in seconds; curl-timeout poll).
call :wait_server_ready
+8 -8
View File
@@ -1427,7 +1427,7 @@ function run_all_tests(){
# different one, so every test that needs seeded data fails.
{ echo "===== WeKan test server [bundle node :3000 db :$TEST_DB_PORT/meteor] - started $(date '+%Y-%m-%d %H:%M:%S %Z') ====="; echo; \
MONGO_URL="$TEST_MONGO_URL" ROOT_URL="http://localhost:3000" PORT=3000 \
WRITABLE_PATH="$WRITABLE_ABS" WITH_API=true RICHER_CARD_COMMENT_EDITOR=false \
WRITABLE_PATH="$WRITABLE_ABS" WITH_API=true \
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" \
NODE_OPTIONS="$TEST_NODE_OPTIONS" exec "$NODE_BIN" "$BUNDLE_DIR/main.js"; } >> "$RUN_LOGDIR/wekan-test-server.log" 2>&1 &
TEST_SERVER_PID=$!
@@ -2920,7 +2920,7 @@ for _once in 1; do
#---------------------------------------------------------------------
# Logging of terminal output to console and to .tools/log/wekan-log.log at end of this line: 2>&1 | tee "$(one_log dev-server)"
#WARN_WHEN_USING_OLD_API=true NODE_OPTIONS="--trace-warnings"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WRITABLE_PATH=.. WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://localhost:3000 meteor run --port 3000 2>&1 | tee "$(one_log dev-server)"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WRITABLE_PATH=.. WITH_API=true ROOT_URL=http://localhost:3000 meteor run --port 3000 2>&1 | tee "$(one_log dev-server)"
#---------------------------------------------------------------------
break
;;
@@ -2932,7 +2932,7 @@ for _once in 1; do
#Not in use, could increase RAM usage: NODE_OPTIONS="--max_old_space_size=4096"
#---------------------------------------------------------------------
# Logging of terminal output to console and to .tools/log/wekan-log.log at end of this line: 2>&1 | tee "$(one_log dev-server)"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WARN_WHEN_USING_OLD_API=true NODE_OPTIONS="--trace-warnings --max-old-space-size=$_heap_mb" WRITABLE_PATH=.. WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://localhost:3000 meteor run --port 3000 2>&1 | tee "$(one_log dev-server)"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WARN_WHEN_USING_OLD_API=true NODE_OPTIONS="--trace-warnings --max-old-space-size=$_heap_mb" WRITABLE_PATH=.. WITH_API=true ROOT_URL=http://localhost:3000 meteor run --port 3000 2>&1 | tee "$(one_log dev-server)"
#---------------------------------------------------------------------
break
;;
@@ -2944,7 +2944,7 @@ for _once in 1; do
#---------------------------------------------------------------------
#Logging of terminal output to console and to .tools/log/wekan-log.log at end of this line: 2>&1 | tee "$(one_log dev-server)"
#WARN_WHEN_USING_OLD_API=true NODE_OPTIONS="--trace-warnings"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WRITABLE_PATH=.. WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://localhost:3000 meteor run --port 3000 --extra-packages bundle-visualizer --production 2>&1 | tee "$(one_log dev-server)"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WRITABLE_PATH=.. WITH_API=true ROOT_URL=http://localhost:3000 meteor run --port 3000 --extra-packages bundle-visualizer --production 2>&1 | tee "$(one_log dev-server)"
#---------------------------------------------------------------------
break
;;
@@ -2963,7 +2963,7 @@ for _once in 1; do
#---------------------------------------------------------------------
#Logging of terminal output to console and to .tools/log/wekan-log.log at end of this line: 2>&1 | tee "$(one_log dev-server)"
#WARN_WHEN_USING_OLD_API=true NODE_OPTIONS="--trace-warnings"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WRITABLE_PATH=.. WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://$IPADDRESS:3000 meteor run --port 3000 2>&1 | tee "$(one_log dev-server)"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WRITABLE_PATH=.. WITH_API=true ROOT_URL=http://$IPADDRESS:3000 meteor run --port 3000 2>&1 | tee "$(one_log dev-server)"
#---------------------------------------------------------------------
break
;;
@@ -2982,7 +2982,7 @@ for _once in 1; do
#---------------------------------------------------------------------
#Logging of terminal output to console and to .tools/log/wekan-log.log at end of this line: 2>&1 | tee "$(one_log dev-server)"
#WARN_WHEN_USING_OLD_API=true NODE_OPTIONS="--trace-warnings"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true MONGO_URL=mongodb://127.0.0.1:27019/wekan WRITABLE_PATH=.. WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://$IPADDRESS:3000 meteor run --port 3000 2>&1 | tee "$(one_log dev-server)"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true MONGO_URL=mongodb://127.0.0.1:27019/wekan WRITABLE_PATH=.. WITH_API=true ROOT_URL=http://$IPADDRESS:3000 meteor run --port 3000 2>&1 | tee "$(one_log dev-server)"
#---------------------------------------------------------------------
break
;;
@@ -2996,7 +2996,7 @@ for _once in 1; do
# ROOT_URL differ. Logging of terminal output to console and to
# .tools/log/wekan-log.log at the end of the line: 2>&1 | tee "$(one_log dev-server)"
#---------------------------------------------------------------------
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WRITABLE_PATH=.. WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL="$DEV_ROOT_URL" meteor run --port "$DEV_PORT" 2>&1 | tee "$(one_log dev-server)"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WRITABLE_PATH=.. WITH_API=true ROOT_URL="$DEV_ROOT_URL" meteor run --port "$DEV_PORT" 2>&1 | tee "$(one_log dev-server)"
#---------------------------------------------------------------------
break
;;
@@ -3015,7 +3015,7 @@ for _once in 1; do
#---------------------------------------------------------------------
#Logging of terminal output to console and to .tools/log/wekan-log.log at end of this line: 2>&1 | tee "$(one_log dev-server)"
#WARN_WHEN_USING_OLD_API=true NODE_OPTIONS="--trace-warnings"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WRITABLE_PATH=.. WITH_API=true RICHER_CARD_COMMENT_EDITOR=false ROOT_URL=http://$IPADDRESS:$PORT meteor run --port $PORT 2>&1 | tee "$(one_log dev-server)"
DEFAULT_METEOR_REACTIVITY_ORDER="changeStreams,oplog,polling" DDP_TRANSPORT=sockjs DEBUG=true WRITABLE_PATH=.. WITH_API=true ROOT_URL=http://$IPADDRESS:$PORT meteor run --port $PORT 2>&1 | tee "$(one_log dev-server)"
#---------------------------------------------------------------------
break
;;
@@ -68,3 +68,8 @@
font-size: 0.8em;
color: #999;
}
/* The label chip uses the same card-label palette/contrast and radius as cards.
Keep rich label content compact inside activity prose. */
.activity .activity-label .viewer { display: inline; min-height: 0; }
.activity .activity-label p { display: inline; margin: 0; }
+2 -2
View File
@@ -148,10 +148,10 @@ template(name="activity")
//- label activity ------------------------------------------------------
if($eq activity.activityType 'addedLabel')
| {{{activityMessage 'activity-added-label' (activityValue lastLabel) cardLink}}}.
| {{{labelActivityMessage 'activity-added-label' cardLink}}}.
if($eq activity.activityType 'removedLabel')
| {{{activityMessage 'activity-removed-label' (activityValue lastLabel) cardLink}}}.
| {{{labelActivityMessage 'activity-removed-label' cardLink}}}.
//- list activity -------------------------------------------------------
if($neq mode 'card')
+22 -1
View File
@@ -8,6 +8,7 @@ import { sanitizeHTML } from '/imports/lib/secureDOMPurify';
import { TAPi18n } from '/imports/i18n';
import { Utils } from '/client/lib/utils';
import { getSidebarInstance } from '/client/features/sidebar/service';
import { isHexColor, contrastText } from '/models/lib/contrastColor';
import { activityCardLinkData } from '/models/lib/activityCardLink';
// #6480/#6481: 500 was far more than the sidebar/card activity feed ever shows
@@ -235,7 +236,8 @@ Template.activity.helpers({
if (!lastLabelId) return null;
const lastLabel = ReactiveCache.getBoard(
this.activity.boardId,
).getLabelById(lastLabelId);
)?.getLabelById(lastLabelId);
if (!lastLabel) return null;
if (lastLabel && (lastLabel.name === undefined || lastLabel.name === '')) {
return lastLabel.color;
} else if (lastLabel.name !== undefined && lastLabel.name !== '') {
@@ -329,6 +331,25 @@ Template.activity.helpers({
activityValue(value) {
return titleViewerHtml(value == null ? '' : String(value));
},
labelActivityMessage(key, cardLink) {
const label = ReactiveCache.getBoard(this.activity.boardId)?.getLabelById(this.activity.labelId);
const setting = ReactiveCache.getCurrentSetting();
const options = { stripLinks: !!(setting && setting.renderLinksAsPlainText) };
const marker = 'WEKAN_ACTIVITY_LABEL_BADGE';
const message = sanitizeHTML(TAPi18n.__(key, { sprintf: [marker, cardLink] }), options);
const color = String(label?.color || 'white');
const hex = isHexColor(color);
const attrs = {
class: 'card-label activity-label' + (!hex && /^[a-z]+$/.test(color) ? ` card-label-${color}` : ''),
...(hex ? { style: `background-color:${color};color:${contrastText(color)};` } : {}),
};
// Sanitize prose and viewer content first. Only the application-created
// badge wrapper retains trusted classes and validated color styles;
// the global sanitizer must keep forbidding user CSS/classes.
const content = sanitizeHTML(titleViewerHtml(label?.name || label?.color || ''), options);
const badge = Blaze.toHTML(HTML.SPAN(attrs, HTML.Raw(content)));
return message.split(marker).join(badge);
},
activityMessage(key, ...values) {
const setting = ReactiveCache.getCurrentSetting();
// Spacebars appends helper options; only rendered values belong in sprintf.
+1 -1
View File
@@ -90,7 +90,7 @@ template(name="commentReactions")
unless currentUser.isReadOnly
unless currentUser.isReadAssignedOnly
a.open-comment-reaction-popup(title="{{_ 'addReactionPopup-title'}}")
i.fa.fa-smile-o(title="{{_ 'reaction' }}")
i.fa.fa-smile-o(title="{{_ 'addReactionPopup-title' }}")
i.fa.fa-plus(title="{{_ 'add' }}")
template(name="addReactionPopup")
-1
View File
@@ -67,7 +67,6 @@ Template.commentForm.onDestroyed(function () {
// button, a route change); make sure the last keystrokes reach the draft.
flushCommentDraftSave();
commentFormIsOpen.set(false);
$('.note-popover').hide();
});
Template.commentForm.helpers({
+1 -1
View File
@@ -476,7 +476,7 @@ Template.boardBody.onRendered(function () {
el.setAttribute('role', 'button');
// Short, descriptive label for favorite/star toggle
if (el.classList.contains('js-favorite-toggle')) {
el.setAttribute('aria-label', TAPi18n.__('favorite-toggle-label'));
el.setAttribute('aria-label', `${TAPi18n.__('star-item')} / ${TAPi18n.__('unstar-item')}`);
} else {
el.setAttribute('aria-label', 'Toggle');
}
+2 -2
View File
@@ -774,7 +774,7 @@ Template.cardsSortPopup.events({
createdAt: 1,
};
setCardsSortBy(sortBy);
sortCardsBy.set(TAPi18n.__('date-created-newest-first'));
sortCardsBy.set(TAPi18n.__('created-at-newest-first'));
Popup.back();
},
'click .js-sort-created-desc'() {
@@ -782,7 +782,7 @@ Template.cardsSortPopup.events({
createdAt: -1,
};
setCardsSortBy(sortBy);
sortCardsBy.set(TAPi18n.__('date-created-oldest-first'));
sortCardsBy.set(TAPi18n.__('created-at-oldest-first'));
Popup.back();
},
// #3050: float highest-voted cards to the top of each list. `votes` is not
@@ -7,6 +7,7 @@ import { Meteor } from 'meteor/meteor';
import { Session } from 'meteor/session';
import { Accounts } from 'meteor/accounts-base';
import { TAPi18n } from '/imports/i18n';
import { cardDateFormat } from '/client/lib/exportLocale';
// ONE url builder for every chart export, every view. There used to be five
// copies of this (gantt.js, frappeGantt.js, dhtmlxGantt.js, timeView.js,
@@ -18,12 +19,11 @@ export function chartExportUrl(chartKey, format) {
const boardId = Session.get('currentBoard');
if (!boardId || !chartKey) return '';
const path = format === 'PDF' ? 'exportPDF' : 'exportExcel';
const user = Meteor.user();
const params = new URLSearchParams({
authToken: Accounts._storedLoginToken() || '',
lang: TAPi18n.getLanguage ? TAPi18n.getLanguage() : 'en',
tz: Intl.DateTimeFormat().resolvedOptions().timeZone || '',
dateFormat: (user && user.profile && user.profile.dateFormat) || 'YYYY-MM-DD',
dateFormat: cardDateFormat(),
});
return `/api/boards/${boardId}/charts/${chartKey}/${path}?${params.toString()}`;
}
+1 -1
View File
@@ -3,7 +3,7 @@ template(name="miniboard")
class="minicard-{{colorClass}}")
.minicard-title
.handle
span.drag-handle(title="{{_ 'dragBoard'}}")
span.drag-handle(title="{{_ 'drag-board'}}")
i.fa.fa-arrows
+viewer
= title
+2 -2
View File
@@ -25,9 +25,9 @@
}
.timeline-view .timeline-marker.is-selected {
background: #29a3a3;
background: #187575;
color: #fff;
border-color: #29a3a3;
border-color: #187575;
}
.timeline-view .timeline-view-asof {
+1 -1
View File
@@ -44,7 +44,7 @@ template(name="timelineView")
| {{this.memberNames}}
if this.dueAt
p.timeline-card-due
| {{_ 'card-due-date'}}: {{this.formattedDueAt}}
| {{_ 'due-date'}}: {{this.formattedDueAt}}
if selectedTimestamp
button.timeline-card-restore.js-restore-card-timeline.primary(type="button")
| {{_ 'board-view-timeline-restore'}}
+18
View File
@@ -44,9 +44,13 @@
.attachment-details-container {
display: block;
flex-grow: 1;
min-width: 0;
overflow-wrap: anywhere;
}
.attachment-details {
display: flex;
flex-wrap: wrap;
gap: 8px;
justify-content: space-between;
margin-inline-end: 25px; /* Make sure the icons are not to far to the right */
}
@@ -384,3 +388,17 @@
margin-top: 10px;
}
}
/* Native viewer controls retain the previous icon-only presentation. */
#viewer-close, #prev-attachment, #next-attachment {
background: transparent;
border: 0;
box-shadow: none;
padding: 0;
}
button.attachment-thumbnail-container {
padding: 0;
border: 0;
text-align: start;
font: inherit;
}
+6 -6
View File
@@ -33,14 +33,14 @@ template(name="attachmentDeletePopup")
button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
template(name="attachmentViewer")
#viewer-overlay.hidden
#viewer-overlay.hidden(role="dialog" aria-modal="true" aria-labelledby="attachment-name")
#viewer-top-bar
span#attachment-name
a#viewer-close
button#viewer-close(type="button" aria-label="{{_ 'close'}}")
i.fa.fa-times-thin
#viewer-container
i.fa.fa-caret-left#prev-attachment
button.fa.fa-caret-left#prev-attachment(type="button" aria-label="{{_ 'previous'}}")
#viewer-content
img#image-viewer.hidden
video#video-viewer.hidden(controls="true")
@@ -49,7 +49,7 @@ template(name="attachmentViewer")
span.pdf-preview-error {{_ 'preview-pdf-not-supported' }}
object#txt-viewer.hidden(type="text/plain")
#office-viewer.hidden
i.fa.fa-caret-right#next-attachment
button.fa.fa-caret-right#next-attachment(type="button" aria-label="{{_ 'next'}}")
template(name="attachmentGallery")
@@ -62,7 +62,7 @@ template(name="attachmentGallery")
each attachments
.attachment-item(class="{{#if isAttachmentMigrating _id}}migrating{{/if}}")
.attachment-thumbnail-container.open-preview(data-attachment-id="{{_id}}" data-card-id="{{ meta.cardId }}")
button.attachment-thumbnail-container.open-preview(type="button" aria-label="{{_ 'preview'}}: {{cleanFilename name}}" data-attachment-id="{{_id}}" data-card-id="{{ meta.cardId }}")
if link
if(isImage)
img.attachment-thumbnail(src="{{link}}" title="{{cleanFilename name}}" alt="{{cleanFilename name}}")
@@ -109,7 +109,7 @@ template(name="attachmentGallery")
.attachment-migration-overlay
.migration-spinner
i.fa.fa-cog.fa-spin
.migration-text {{_ 'migrating-attachment'}}
.migration-text {{_ 'attachment-migration'}}
template(name="attachmentActionsPopup")
ul.pop-over-list
+63 -31
View File
@@ -1,3 +1,5 @@
import { TAPi18n } from '/imports/i18n';
import { trapTabKey } from '/client/lib/accessibility';
import { formatDateForDisplay } from '/client/lib/dateDisplay';
import { ReactiveCache } from '/imports/reactiveCache';
import '/client/components/cards/attachments.jade';
@@ -21,6 +23,7 @@ import prettyMilliseconds from 'pretty-ms';
// We store current card ID and the ID of currently opened attachment in a
// global var. This is used so that we know what's the next attachment to open
// when the user clicks on the prev/next button in the attachment viewer.
let viewerOpener = null;
let cardId = null;
let openAttachmentId = null;
let slideshowAttachmentIds = null;
@@ -29,14 +32,13 @@ let slideshowAttachmentIds = null;
let touchStartCoords = null;
let touchEndCoords = null;
// Stores link to the attachment for which attachment actions popup was opened
let attachmentActionsLink = null;
let officePreview = null;
let officePreviewAbortController = null;
let officePreviewGeneration = 0;
Template.attachmentGallery.events({
'click .open-preview'(event) {
event.preventDefault();
openAttachmentId = $(event.currentTarget).attr("data-attachment-id");
cardId = $(event.currentTarget).attr("data-card-id");
@@ -51,9 +53,6 @@ Template.attachmentGallery.events({
event.stopPropagation();
},
'click .js-open-attachment-menu': Popup.open('attachmentActions'),
'mouseover .js-open-attachment-menu'(event) { // For some reason I cannot combine handlers for "click .js-open-attachment-menu" and "mouseover .js-open-attachment-menu" events so this is a quick workaround.
attachmentActionsLink = event.currentTarget.getAttribute("data-attachment-link");
},
'click .js-rename': Popup.open('attachmentRename'),
// History.md §12.1: Delete is a SOFT delete, done by the server. The method
// marks the attachment deleted, keeps the file, unsets the cover if this was
@@ -197,7 +196,10 @@ function openAttachmentViewer(attachmentId) {
// Show the cleaned name: URL-decoded, homoglyphs folded, invisible characters
// and exploit markup removed (plain text; .text() escapes, so never HTML).
$('#attachment-name').text(cleanFileName(attachment.name));
const opening = !viewerOpener;
if (opening) viewerOpener = document.activeElement;
$('#viewer-overlay').removeClass('hidden');
if (opening) document.getElementById('viewer-close')?.focus();
}
// Admin Panel / Files uses the same viewer as an opened card, but its next and
@@ -213,7 +215,7 @@ export function openAttachmentSlideshow(attachmentId, attachmentIds = []) {
openAttachmentViewer(attachmentId);
}
function closeAttachmentViewer() {
function closeAttachmentViewer(restoreFocus = true) {
officePreviewGeneration++;
if (officePreviewAbortController) {
officePreviewAbortController.abort();
@@ -224,8 +226,8 @@ function closeAttachmentViewer() {
officePreview = null;
}
const officeViewer = document.getElementById('office-viewer');
officeViewer.replaceChildren();
officeViewer.classList.add('hidden');
officeViewer?.replaceChildren();
officeViewer?.classList.add('hidden');
$("#viewer-overlay").addClass("hidden");
@@ -239,19 +241,23 @@ function closeAttachmentViewer() {
$("#txt-viewer").attr("data", "");
$("#txt-viewer").addClass("hidden");
$("#video-viewer").get(0).pause(); // Stop playback
$("#video-viewer").get(0).currentTime = 0;
$("#video-viewer").get(0)?.pause(); // Stop playback
if ($("#video-viewer").get(0)) $("#video-viewer").get(0).currentTime = 0;
$("#video-viewer").empty();
$("#video-viewer").addClass("hidden");
$("#audio-viewer").get(0).pause(); // Stop playback
$("#audio-viewer").get(0).currentTime = 0;
$("#audio-viewer").get(0)?.pause(); // Stop playback
if ($("#audio-viewer").get(0)) $("#audio-viewer").get(0).currentTime = 0;
$("#audio-viewer").empty();
$("#audio-viewer").addClass("hidden");
if (restoreFocus) {
if (viewerOpener?.isConnected) viewerOpener.focus();
viewerOpener = null;
}
}
function openNextAttachment() {
closeAttachmentViewer();
closeAttachmentViewer(false);
let i = 0;
// Find an attachment that can be opened
@@ -268,7 +274,7 @@ function openNextAttachment() {
}
function openPrevAttachment() {
closeAttachmentViewer();
closeAttachmentViewer(false);
let i = 0;
// Find an attachment that can be opened
@@ -306,7 +312,20 @@ function processTouch(){
}
Template.attachmentViewer.onDestroyed(function () {
closeAttachmentViewer();
});
Template.attachmentViewer.events({
'keydown #viewer-overlay'(event) {
if (event.key === 'Escape') {
event.preventDefault();
event.stopPropagation();
closeAttachmentViewer();
} else {
trapTabKey(event);
}
},
'touchstart #viewer-container'(event) {
touchStartCoords = {
x: event.changedTouches[0].screenX,
@@ -340,13 +359,16 @@ Template.attachmentViewer.events({
closeAttachmentViewer();
},
'click #viewer-close'() {
'click #viewer-close'(event) {
event.preventDefault();
closeAttachmentViewer();
},
'click #next-attachment'() {
'click #next-attachment'(event) {
event.preventDefault();
openNextAttachment();
},
'click #prev-attachment'() {
'click #prev-attachment'(event) {
event.preventDefault();
openPrevAttachment();
},
});
@@ -641,9 +663,8 @@ Template.attachmentActionsPopup.helpers({
return ret;
},
isBackgroundImage() {
//const currentBoard = Utils.getCurrentBoard();
//return currentBoard.backgroundImageURL === $(".attachment-thumbnail-img").attr("src");
return false;
const url = getAttachmentUrl(this);
return !!url && Utils.getCurrentBoard()?.backgroundImageURL === url;
},
});
@@ -656,20 +677,31 @@ Template.attachmentActionsPopup.events({
ReactiveCache.getCard(this.meta.cardId).unsetCover();
Popup.back();
},
'click .js-add-background-image'(event) {
const currentBoard = Utils.getCurrentBoard();
currentBoard.setBackgroundImageURL(attachmentActionsLink);
Utils.setBackgroundImage(attachmentActionsLink);
Popup.back();
async 'click .js-add-background-image'(event) {
event.preventDefault();
const currentBoard = Utils.getCurrentBoard();
const url = getAttachmentUrl(this);
if (!currentBoard || !url) return;
try {
if (await currentBoard.setBackgroundImageURL(url) === false) return;
Utils.setBackgroundImage(url);
Popup.back();
} catch (error) {
window.alert(TAPi18n.__('server-error'));
}
},
'click .js-remove-background-image'(event) {
const currentBoard = Utils.getCurrentBoard();
currentBoard.setBackgroundImageURL("");
Utils.setBackgroundImage("");
Popup.back();
Utils.reload();
async 'click .js-remove-background-image'(event) {
event.preventDefault();
const currentBoard = Utils.getCurrentBoard();
if (!currentBoard) return;
try {
if (await currentBoard.setBackgroundImageURL('') === false) return;
Utils.setBackgroundImage('');
Popup.back();
Utils.reload();
} catch (error) {
window.alert(TAPi18n.__('server-error'));
}
},
});
@@ -4,7 +4,6 @@ const descriptionFormIsOpen = new ReactiveVar(false);
Template.descriptionForm.onDestroyed(function () {
descriptionFormIsOpen.set(false);
$('.note-popover').hide();
});
Template.descriptionForm.helpers({
+21 -1
View File
@@ -1217,7 +1217,7 @@ body.mobile-mode .card-details .card-details-header .close-card-details-mobile-w
gone with the grouping; a field that is its own section is a group of one. */
.card-details .card-details-section-rule {
width: 100%;
margin: 14px 0 6px 0;
margin: calc(14px * min(1, var(--wekan-ui-font-scale, 1))) 0 calc(6px * min(1, var(--wekan-ui-font-scale, 1))) 0;
}
.card-details h3.card-details-item-title.js-toggle-card-section {
cursor: pointer;
@@ -1333,3 +1333,23 @@ body.mobile-mode .card-details .card-details-header .close-card-details-mobile-w
.card-details .custom-fields-layout-toggle:hover {
color: #000;
}
/* The global reset and mobile text normalization must not flatten Markdown
headings in the opened-card title. Keep theme colors and scaled base size. */
#content .card-details-title .viewer h1 { font-size: 2em !important; }
#content .card-details-title .viewer h2 { font-size: 1.5em !important; }
#content .card-details-title .viewer h3 { font-size: 1.25em !important; }
#content .card-details-title .viewer h4 { font-size: 1.125em !important; }
#content .card-details-title .viewer h5 { font-size: 1em !important; }
#content .card-details-title .viewer h6 { font-size: 0.875em !important; }
.card-details-list-picker { width: 100%; position: relative; }
.card-details-list-picker > summary {
cursor: pointer; padding: 0.5em; border: 1px solid currentColor;
border-radius: 4px;
}
.card-details-list-picker > summary .viewer { display: inline-block; min-height: 0; }
.card-details-list-options { max-height: 18em; overflow-y: auto; }
.card-details-list-options [role="option"] { padding: 0.5em; cursor: pointer; }
.card-details-list-options [aria-selected="true"] { font-weight: bold; }
.card-details-list-options [role="option"]:focus { outline: 2px solid currentColor; outline-offset: -2px; }
+270 -247
View File
@@ -3,8 +3,6 @@ template(name="cardDetailsPopup")
template(name="cardDetails")
+attachmentViewer
//- `card-details-with-handle` when drag handles are on, the same class the
minicard carries for the same reason: with a handle, the title is all edit
target; without one, half of it is what the window is dragged by.
@@ -28,7 +26,7 @@ template(name="cardDetails")
+editCardTitleForm
else
unless isMiniScreen
a.card-collapse-toggle.js-card-collapse-toggle(title="{{_ 'collapse-card'}}")
a.card-collapse-toggle.js-card-collapse-toggle(title="{{_ 'collapse'}}")
if cardCollapsed
i.fa.fa-caret-right
else
@@ -83,10 +81,10 @@ template(name="cardDetails")
class="{{#if canModifyCard}}is-editable{{/if}}")
if canModifyCard
a.card-details-title-edit-zone.js-open-inlined-form(title="{{_ 'edit'}}")
if currentBoard.allowsCardNumber
span.card-number
| ##{getCardNumber} &nbsp;
+viewer
if currentBoard.allowsCardNumber
span.card-number
| ##{getCardNumber} &nbsp;
= getTitle
if isWatching
i.card-details-watch
@@ -96,7 +94,7 @@ template(name="cardDetails")
| &nbsp; &gt; &nbsp;
a.js-parent-card(href=linkForCard) {{title}}
// else
{{_ 'top-level-card'}}
{{_ 'card'}}
if isLinkedCard
a.linked-card-location.js-go-to-linked-card
+viewer
@@ -173,8 +171,9 @@ template(name="cardDetails")
.card-checklist-attachmentGalleries
.card-checklist-attachmentGallery.card-checklists
if currentBoard.allowsChecklists
+cardSectionHeader(section="checklists" icon="fa-check" label="checklists")
if isSectionOpen "checklists"
unless $eq currentBoard.allowsChecklistTitle false
+cardSectionHeader(section="checklists" icon="fa-check" label="checklists")
if checklistSectionOpen
//- Total checklist item count (finished/total) shown above all
checklists. The board flag is a cheap boolean, so when it is off
the checklist counting below is never evaluated.
@@ -324,194 +323,200 @@ template(name="cardFieldSectionLabels")
+cardButtons(_id=_id boardId=boardId)
template(name="cardFieldSectionDates")
.card-details-group.card-details-group-date-format
hr.card-details-section-rule
.card-details-group-body
if currentBoard.hasAnyAllowsDate
.card-details-item.card-details-item-date-format
+cardSectionHeader(section="date-format" icon="fa-calendar" label="date-format" noRule=true)
if isSectionOpen "date-format"
.card-details-item-content
select.js-date-format-selector
option(value="YYYY-MM-DD" selected="{{#if isDateFormat 'YYYY-MM-DD'}}selected{{/if}}") {{_ 'date-format-yyyy-mm-dd'}}
option(value="DD-MM-YYYY" selected="{{#if isDateFormat 'DD-MM-YYYY'}}selected{{/if}}") {{_ 'date-format-dd-mm-yyyy'}}
option(value="MM-DD-YYYY" selected="{{#if isDateFormat 'MM-DD-YYYY'}}selected{{/if}}") {{_ 'date-format-mm-dd-yyyy'}}
if currentBoard.hasAnyAllowsDate
.card-details-group.card-details-group-date-format
hr.card-details-section-rule
.card-details-group-body
if currentBoard.hasAnyAllowsDate
.card-details-item.card-details-item-date-format
+cardSectionHeader(section="date-format" icon="fa-calendar" label=dateSectionLabel noRule=true)
if isSectionOpen "date-format"
unless isDateFormatForced
.card-details-item-content
select.js-date-format-selector
option(value="YYYY-MM-DD" selected="{{#if isDateFormat 'YYYY-MM-DD'}}selected{{/if}}") {{_ 'date-format-yyyy-mm-dd'}} · {{_ 'time'}}
option(value="DD-MM-YYYY" selected="{{#if isDateFormat 'DD-MM-YYYY'}}selected{{/if}}") {{_ 'date-format-dd-mm-yyyy'}} · {{_ 'time'}}
option(value="MM-DD-YYYY" selected="{{#if isDateFormat 'MM-DD-YYYY'}}selected{{/if}}") {{_ 'date-format-mm-dd-yyyy'}} · {{_ 'time'}}
option(value="YYYY-MM-DD-date-only" selected="{{#if isDateFormat 'YYYY-MM-DD-date-only'}}selected{{/if}}") {{_ 'date'}}: {{_ 'date-format-yyyy-mm-dd'}}
option(value="DD-MM-YYYY-date-only" selected="{{#if isDateFormat 'DD-MM-YYYY-date-only'}}selected{{/if}}") {{_ 'date'}}: {{_ 'date-format-dd-mm-yyyy'}}
option(value="MM-DD-YYYY-date-only" selected="{{#if isDateFormat 'MM-DD-YYYY-date-only'}}selected{{/if}}") {{_ 'date'}}: {{_ 'date-format-mm-dd-yyyy'}}
if isSectionOpen "date-format"
each field in orderedDatesFields
if $eq field "receivedDate"
if currentBoard.allowsReceivedDate
.card-details-item.card-details-item-received
h3.card-details-item-title
i.fa.fa-sign-out
| {{_ 'card-received'}}
if getReceived
+cardReceivedDate(card=this canModifyCard=canModifyCard)
else
if canModifyCard
unless currentUser.isWorker
a.card-label.add-label.js-received-date
i.fa.fa-plus
if isSectionOpen "date-format"
each field in orderedDatesFields
if $eq field "receivedDate"
if currentBoard.allowsReceivedDate
.card-details-item.card-details-item-received
h3.card-details-item-title
i.fa.fa-sign-out
| {{_ 'card-received'}}
if getReceived
+cardReceivedDate(card=this canModifyCard=canModifyCard)
else
if canModifyCard
unless currentUser.isWorker
a.card-label.add-label.js-received-date
i.fa.fa-plus
if $eq field "startDate"
if currentBoard.allowsStartDate
.card-details-item.card-details-item-start
h3.card-details-item-title
i.fa.fa-hourglass-start
| {{_ 'card-start'}}
if getStart
+cardStartDate(card=this canModifyCard=canModifyCard)
else
if canModifyCard
unless currentUser.isWorker
a.card-label.add-label.js-start-date
i.fa.fa-plus
if $eq field "startDate"
if currentBoard.allowsStartDate
.card-details-item.card-details-item-start
h3.card-details-item-title
i.fa.fa-hourglass-start
| {{_ 'card-start'}}
if getStart
+cardStartDate(card=this canModifyCard=canModifyCard)
else
if canModifyCard
unless currentUser.isWorker
a.card-label.add-label.js-start-date
i.fa.fa-plus
if $eq field "dueDate"
if currentBoard.allowsDueDate
.card-details-item.card-details-item-due
h3.card-details-item-title
i.fa.fa-clock-o
| {{_ 'card-due'}}
if getDue
+cardDueDate(card=this canModifyCard=canModifyCard)
else
if canModifyCard
unless currentUser.isWorker
a.card-label.add-label.js-due-date
i.fa.fa-plus
if dueDateChangeCount
.card-details-due-date-changes(title="{{_ 'due-date-changes'}}")
| {{_ 'due-date-changed-times' dueDateChangeCount}}
if $eq field "dueDate"
if currentBoard.allowsDueDate
.card-details-item.card-details-item-due
h3.card-details-item-title
i.fa.fa-clock-o
| {{_ 'card-due'}}
if getDue
+cardDueDate(card=this canModifyCard=canModifyCard)
else
if canModifyCard
unless currentUser.isWorker
a.card-label.add-label.js-due-date
i.fa.fa-plus
if dueDateChangeCount
.card-details-due-date-changes(title="{{_ 'due-date-changes'}}")
| {{_ 'due-date-changed-times' dueDateChangeCount}}
if $eq field "endDate"
if currentBoard.allowsEndDate
.card-details-item.card-details-item-end
h3.card-details-item-title
i.fa.fa-hourglass-end
| {{_ 'card-end'}}
if getEnd
+cardEndDate(card=this canModifyCard=canModifyCard)
else
if canModifyCard
unless currentUser.isWorker
a.card-label.add-label.js-end-date
i.fa.fa-plus
if $eq field "endDate"
if currentBoard.allowsEndDate
.card-details-item.card-details-item-end
h3.card-details-item-title
i.fa.fa-hourglass-end
| {{_ 'card-end'}}
if getEnd
+cardEndDate(card=this canModifyCard=canModifyCard)
else
if canModifyCard
unless currentUser.isWorker
a.card-label.add-label.js-end-date
i.fa.fa-plus
template(name="cardFieldSectionMembers")
.card-details-group.card-details-group-members
hr.card-details-section-rule
.card-details-group-body
if currentBoard.allowsMembers
.card-details-item.card-details-item-members
+cardSectionHeader(section="members" icon="fa-users" label="members" noRule=true)
if isSectionOpen "members"
each userId in getMembers
+userAvatar(userId=userId cardId=_id)
| {{! XXX Hack to hide syntaxic coloration /// }}
if canModifyCard
unless currentUser.isWorker
a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
i.fa.fa-plus
if isSectionOpen "members"
each field in orderedMembersFields
if $eq field "assignee"
if currentBoard.allowsAssignee
.card-details-item.card-details-item-assignees
h3.card-details-item-title
i.fa.fa-user
| {{_ 'assignee'}}
each userId in getAssignees
+userAvatar(userId=userId cardId=_id assignee=true)
| {{! XXX Hack to hide syntaxic coloration /// }}
if canModifyCard
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
if currentBoard.hasAnyAllowsUser
.card-details-group.card-details-group-members
hr.card-details-section-rule
.card-details-group-body
if currentBoard.allowsMembers
.card-details-item.card-details-item-members
+cardSectionHeader(section="members" icon="fa-users" label="members" noRule=true)
if isSectionOpen "members"
each userId in getMembers
+userAvatar(userId=userId cardId=_id)
| {{! XXX Hack to hide syntaxic coloration /// }}
if canModifyCard
unless currentUser.isWorker
a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
i.fa.fa-plus
if currentUser.isWorker
unless assigneeSelected
if isSectionOpen "members"
each field in orderedMembersFields
if $eq field "assignee"
if currentBoard.allowsAssignee
.card-details-item.card-details-item-assignees
h3.card-details-item-title
i.fa.fa-user
| {{_ 'assignee'}}
each userId in getAssignees
+userAvatar(userId=userId cardId=_id assignee=true)
| {{! XXX Hack to hide syntaxic coloration /// }}
if canModifyCard
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
i.fa.fa-plus
if currentUser.isWorker
unless assigneeSelected
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
i.fa.fa-plus
if $eq field "creator"
if currentBoard.allowsCreator
.card-details-item.card-details-item-creator
h3.card-details-item-title
i.fa.fa-user
| {{_ 'creator'}}
if $eq field "creator"
if currentBoard.allowsCreator
.card-details-item.card-details-item-creator
h3.card-details-item-title
i.fa.fa-user
| {{_ 'creator'}}
+userAvatar(userId=userId noRemove=true)
| {{! XXX Hack to hide syntaxic coloration /// }}
+userAvatar(userId=userId noRemove=true)
| {{! XXX Hack to hide syntaxic coloration /// }}
//.card-details-items
//if assigneeSelected
//.card-details-items
if $eq field "requestedBy"
if currentBoard.allowsRequestedBy
.card-details-item.card-details-item-name
h3.card-details-item-title
i.fa.fa-shopping-cart
| {{_ 'requested-by'}}
if canModifyCard
unless currentUser.isWorker
+inlinedForm(classNames="js-card-details-requester")
+editCardRequesterForm
else
each userId in getRequesters
+userAvatar(userId=userId cardId=_id noRemove=true)
if getRequestedBy
+viewer
= getRequestedBy
.card-details-person-controls
a.member.add-member.card-details-item-add-button.js-select-requester(title="{{_ 'requested-by'}}")
i.fa.fa-plus
a.js-open-inlined-form(
title="{{#if getRequestedBy}}{{_ 'edit'}}{{else}}{{_ 'add'}}{{/if}}"
aria-label="{{#if getRequestedBy}}{{_ 'edit'}}{{else}}{{_ 'add'}}{{/if}}")
if getRequestedBy
i.fa.fa-pencil-square-o(aria-hidden="true")
else
i.fa.fa-plus(aria-hidden="true")
else
each userId in getRequesters
+userAvatar(userId=userId noRemove=true)
if getRequestedBy
+viewer
= getRequestedBy
//.card-details-items
//if assigneeSelected
//.card-details-items
if $eq field "requestedBy"
if currentBoard.allowsRequestedBy
.card-details-item.card-details-item-name
h3.card-details-item-title
i.fa.fa-shopping-cart
| {{_ 'requested-by'}}
if canModifyCard
unless currentUser.isWorker
+inlinedForm(classNames="js-card-details-requester")
+editCardRequesterForm
else
each userId in getRequesters
+userAvatar(userId=userId cardId=_id noRemove=true)
if getRequestedBy
+viewer
= getRequestedBy
.card-details-person-controls
a.member.add-member.card-details-item-add-button.js-select-requester(title="{{_ 'requested-by'}}")
i.fa.fa-plus
a.js-open-inlined-form(
title="{{#if getRequestedBy}}{{_ 'edit'}}{{else}}{{_ 'add'}}{{/if}}"
aria-label="{{#if getRequestedBy}}{{_ 'edit'}}{{else}}{{_ 'add'}}{{/if}}")
if getRequestedBy
i.fa.fa-pencil-square-o(aria-hidden="true")
else
i.fa.fa-plus(aria-hidden="true")
else
each userId in getRequesters
+userAvatar(userId=userId noRemove=true)
if getRequestedBy
+viewer
= getRequestedBy
if $eq field "assignedBy"
if currentBoard.allowsAssignedBy
.card-details-item.card-details-item-name
h3.card-details-item-title
i.fa.fa-user-plus
| {{_ 'assigned-by'}}
if canModifyCard
unless currentUser.isWorker
+inlinedForm(classNames="js-card-details-assigner")
+editCardAssignerForm
else
each userId in getAssigners
+userAvatar(userId=userId cardId=_id noRemove=true)
if getAssignedBy
+viewer
= getAssignedBy
.card-details-person-controls
a.member.add-member.card-details-item-add-button.js-select-assigner(title="{{_ 'assigned-by'}}")
i.fa.fa-plus
a.js-open-inlined-form(
title="{{#if getAssignedBy}}{{_ 'edit'}}{{else}}{{_ 'add'}}{{/if}}"
aria-label="{{#if getAssignedBy}}{{_ 'edit'}}{{else}}{{_ 'add'}}{{/if}}")
if getAssignedBy
i.fa.fa-pencil-square-o(aria-hidden="true")
else
i.fa.fa-plus(aria-hidden="true")
else
each userId in getAssigners
+userAvatar(userId=userId noRemove=true)
if getAssignedBy
+viewer
= getAssignedBy
if $eq field "assignedBy"
if currentBoard.allowsAssignedBy
.card-details-item.card-details-item-name
h3.card-details-item-title
i.fa.fa-user-plus
| {{_ 'assigned-by'}}
if canModifyCard
unless currentUser.isWorker
+inlinedForm(classNames="js-card-details-assigner")
+editCardAssignerForm
else
each userId in getAssigners
+userAvatar(userId=userId cardId=_id noRemove=true)
if getAssignedBy
+viewer
= getAssignedBy
.card-details-person-controls
a.member.add-member.card-details-item-add-button.js-select-assigner(title="{{_ 'assigned-by'}}")
i.fa.fa-plus
a.js-open-inlined-form(
title="{{#if getAssignedBy}}{{_ 'edit'}}{{else}}{{_ 'add'}}{{/if}}"
aria-label="{{#if getAssignedBy}}{{_ 'edit'}}{{else}}{{_ 'add'}}{{/if}}")
if getAssignedBy
i.fa.fa-pencil-square-o(aria-hidden="true")
else
i.fa.fa-plus(aria-hidden="true")
else
each userId in getAssigners
+userAvatar(userId=userId noRemove=true)
if getAssignedBy
+viewer
= getAssignedBy
template(name="cardFieldSectionDependencies")
//- #6688: Board Settings / Card can hide the Dependencies section.
@@ -548,65 +553,80 @@ template(name="cardFieldSectionDependencies")
i.fa.fa-plus
| {{_ 'add-dependency'}}
template(name="cardFieldSectionSort")
.card-details-group.card-details-group-sort
hr.card-details-section-rule
.card-details-group-body
if currentBoard.allowsCardSortingByNumber
.card-details-item.card-details-sort-order
+cardSectionHeader(section="sort" icon="fa-sort-numeric-asc" label="sort" noRule=true)
if isSectionOpen "sort"
if canModifyCard
+inlinedForm(classNames="js-card-details-sort")
+editCardSortOrderForm
else
a.js-open-inlined-form
+viewer
= sort
if hasVisibleSortFields
.card-details-group.card-details-group-sort
hr.card-details-section-rule
.card-details-group-body
if currentBoard.allowsCardSortingByNumber
.card-details-item.card-details-sort-order
+cardSectionHeader(section="sort" icon="fa-sort-numeric-asc" label="sort" noRule=true)
if isSectionOpen "sort"
if canModifyCard
+inlinedForm(classNames="js-card-details-sort")
+editCardSortOrderForm
else
a.js-open-inlined-form
+viewer
= sort
if isSectionOpen "sort"
each field in orderedSortFields
if $eq field "showLists"
if currentBoard.allowsShowLists
.card-details-item.card-details-show-lists
h3.card-details-item-title
i.fa.fa-list
| {{_ 'list'}}
select.js-select-card-details-lists(disabled="{{#unless canModifyCard}}disabled{{/unless}}")
each currentSwimlaneListsSorted
option(value="{{_id}}" selected="{{#if isCurrentListId _id}}selected{{/if}}") {{title}}
//.card-details-items
if $eq field "spentTime"
if currentBoard.allowsSpentTime
if getSpentTime
.card-details-item.card-details-item-spent
if getIsOvertime
h3.card-details-item-title
| {{_ 'overtime-hours'}}
if isSectionOpen "sort"
each field in orderedSortFields
if $eq field "showLists"
if currentBoard.allowsShowLists
.card-details-item.card-details-show-lists
h3.card-details-item-title
i.fa.fa-list
| {{_ 'list'}}
if canModifyCard
details.card-details-list-picker
summary
each currentSwimlaneListsSorted
if isCurrentListId _id
+viewer
= title
div.card-details-list-options(role="listbox" aria-label="{{_ 'list'}}")
each currentSwimlaneListsSorted
div.js-select-card-details-list-option(role="option" tabindex="0" data-list-id="{{_id}}" aria-selected="{{#if isCurrentListId _id}}true{{else}}false{{/if}}")
+viewer
= title
else
h3.card-details-item-title
| {{_ 'spent-time-hours'}}
+cardSpentTime
each currentSwimlaneListsSorted
if isCurrentListId _id
+viewer
= title
//- #6688: the two timers each have a Board Settings / Card toggle,
like Spent time above; before they rendered on every card.
if $eq field "flowtime"
if currentBoard.allowsFlowtime
.card-details-item.card-details-item-flow
h3.card-details-item-title
i.fa.fa-bolt
| {{_ 'flowtime'}}
+cardFlowtime
//.card-details-items
if $eq field "spentTime"
if currentBoard.allowsSpentTime
if getSpentTime
.card-details-item.card-details-item-spent
if getIsOvertime
h3.card-details-item-title
| {{_ 'overtime-hours'}}
else
h3.card-details-item-title
| {{_ 'spent-time-hours'}}
+cardSpentTime
if $eq field "pomodoro"
if currentBoard.allowsPomodoro
.card-details-item.card-details-item-pomodoro
h3.card-details-item-title
i.fa.fa-clock-o
| {{_ 'pomodoro'}}
+cardPomodoro
//- #6688: the two timers each have a Board Settings / Card toggle,
like Spent time above; before they rendered on every card.
if $eq field "flowtime"
if currentBoard.allowsFlowtime
.card-details-item.card-details-item-flow
h3.card-details-item-title
i.fa.fa-bolt
| {{_ 'flowtime'}}
+cardFlowtime
//.card-details-items
if $eq field "pomodoro"
if currentBoard.allowsPomodoro
.card-details-item.card-details-item-pomodoro
h3.card-details-item-title
i.fa.fa-clock-o
| {{_ 'pomodoro'}}
+cardPomodoro
//.card-details-items
template(name="cardFieldSectionCustomFields")
//- The heading is here for EVERY card the reader may write to, not only
@@ -1234,23 +1254,23 @@ template(name="exportCardPopup")
which is the one holding the dialog. client/components/cards/cardDetails.js
template(name="cardDestinationPicker")
unless currentUser.isWorker
label {{_ 'boards'}}:
select.js-select-boards(autofocus)
label(for="{{pickerFieldId 'boards'}}") {{_ 'boards'}}:
select.js-select-boards(autofocus id="{{pickerFieldId 'boards'}}")
each boards
option(value="{{_id}}" selected="{{#if isSelectedBoardId _id}}selected{{/if}}") {{title}}
label {{_ 'swimlanes'}}:
select.js-select-swimlanes
label(for="{{pickerFieldId 'swimlanes'}}") {{_ 'swimlanes'}}:
select.js-select-swimlanes(id="{{pickerFieldId 'swimlanes'}}")
each swimlanes
option(value="{{_id}}" selected="{{#if isSelectedSwimlaneId _id}}selected{{/if}}") {{isTitleDefault title}}
label {{_ 'lists'}}:
select.js-select-lists
label(for="{{pickerFieldId 'lists'}}") {{_ 'lists'}}:
select.js-select-lists(id="{{pickerFieldId 'lists'}}")
each lists
option(value="{{_id}}" selected="{{#if isSelectedListId _id}}selected{{/if}}") {{title}}
label {{_ 'cards'}}:
select.js-select-cards
label(for="{{pickerFieldId 'cards'}}") {{_ 'cards'}}:
select.js-select-cards(id="{{pickerFieldId 'cards'}}")
each cards
option(value="{{_id}}" selected="{{#if isDialogOptionCardId _id}}selected{{/if}}") {{title}}
@@ -1261,8 +1281,11 @@ template(name="cardDestinationPicker")
input(type="radio" name="position" value="below" id="position-below" style="display: inline")
label(for="position-below") {{_ 'below-selected-card'}}
if destinationError
.warning.js-destination-error(role="alert") {{destinationError}}
.edit-controls.clearfix
button.primary.confirm.js-done {{_ 'done'}}
button.primary.confirm.js-done(type="button" disabled=destinationDisabled) {{_ 'done'}}
template(name="moveCardPopup")
label(for='move-card-title') {{_ 'title'}}:
@@ -1452,7 +1475,7 @@ template(name="setCardColorPopup")
label(for="cardColorWheel") {{_ 'custom-color'}}
input.js-card-color-wheel#cardColorWheel(type="color" value=currentColorHex title="{{_ 'custom-color'}}")
button.primary.confirm.js-submit {{_ 'save'}}
button.js-remove-color.negate.wide.right {{_ 'unset-color'}}
button.js-remove-color.negate.wide.right {{_ 'remove-btn'}}
template(name="cardDeletePopup")
p {{_ "card-delete-pop"}}
+81 -36
View File
@@ -1,3 +1,6 @@
import { relativeCardSort } from '/client/lib/relativeCardPosition';
import { Random } from 'meteor/random';
import { dateDisplayPreferences, isDateFormatForced } from '/client/lib/dateDisplay';
import { ReactiveCache } from '/imports/reactiveCache';
import { TAPi18n } from '/imports/i18n';
import { ReactiveDict } from 'meteor/reactive-dict';
@@ -770,6 +773,17 @@ Template.registerHelper('isCurrentListId', function isCurrentListId(listId) {
Template.registerHelper('orderedVoteAndPokerFields', sectionHelper('voteAndPoker'));
}
Template.cardFieldSectionSort.helpers({
hasVisibleSortFields() {
const board = this.board();
return !!(board && (
board.allowsCardSortingByNumber || board.allowsShowLists ||
board.allowsFlowtime || board.allowsPomodoro ||
(board.allowsSpentTime && this.getSpentTime())
));
},
});
Template.cardDetails.helpers({
// #4448: the order the reorderable card-detail sections (Labels, Dates,
// Members, Dependencies, Sort, Custom Fields, Vote/Poker, Description)
@@ -835,6 +849,10 @@ Template.cardDetails.helpers({
return user && user.isVerticalScrollbars();
},
checklistSectionOpen() {
return ReactiveCache.getBoard(this.boardId)?.allowsChecklistTitle === false || isCardSectionOpen('checklists');
},
isLoaded() {
return Template.instance().isLoaded;
},
@@ -1095,6 +1113,7 @@ Template.cardDetails.events({
}
},
'change .js-date-format-selector'(event) {
if (isDateFormatForced()) return;
const dateFormat = event.target.value;
if (Meteor.userId()) {
Meteor.call('changeDateFormat', dateFormat);
@@ -1194,12 +1213,42 @@ Template.cardDetails.events({
await card.move(card.boardId, card.swimlaneId, card.listId, sort);
}
},
async 'change .js-select-card-details-lists'(event, tpl) {
const listId = event.target.value;
let card = Template.currentData();
async 'click .js-select-card-details-list-option'(event, tpl) {
event.preventDefault();
event.stopPropagation();
if (!Utils.canModifyCard()) return;
const listId = event.currentTarget.dataset.listId;
const card = tpl.data;
if (!card || !listId || listId === card.listId) return;
const picker = event.currentTarget.closest('details');
const minOrder = await card.getMinSort(listId, card.swimlaneId);
await card.move(card.boardId, card.swimlaneId, listId, minOrder - 1);
if (picker) {
picker.open = false;
picker.querySelector('summary')?.focus();
}
},
'keydown .card-details-list-picker'(event) {
const picker = event.currentTarget;
if (event.key === 'Escape') {
event.preventDefault();
picker.open = false;
picker.querySelector('summary')?.focus();
return;
}
const options = [...picker.querySelectorAll('[role="option"]')];
const current = options.indexOf(event.target.closest('[role="option"]'));
if (['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) {
event.preventDefault();
picker.open = true;
const index = event.key === 'Home' ? 0 : event.key === 'End' ? options.length - 1 :
current < 0 ? (event.key === 'ArrowUp' ? options.length - 1 : 0) :
(current + (event.key === 'ArrowDown' ? 1 : -1) + options.length) % options.length;
options[index]?.focus();
} else if (current >= 0 && ['Enter', ' '].includes(event.key)) {
event.preventDefault();
options[current].click();
}
},
'click .js-go-to-linked-card'() {
const card = Template.currentData();
@@ -1494,13 +1543,11 @@ Template.cardDetails.events({
// function: isDateFormat" the instant that section rendered and broke
// opening the card popup entirely. Registered globally, like isSectionOpen
// just below, so every template can see it.
Template.registerHelper('isDateFormatForced', isDateFormatForced);
Template.registerHelper('dateSectionLabel', () => isDateFormatForced() ? 'date' : 'date-format');
Template.registerHelper('isDateFormat', function isDateFormat(format) {
const currentUser = ReactiveCache.getCurrentUser();
if (!currentUser) {
const stored = window.localStorage.getItem('dateFormat') || 'YYYY-MM-DD';
return format === stored;
}
return currentUser.getDateFormat() === format;
return dateDisplayPreferences().dateFormat === format;
});
Template.cardDetails.helpers({
@@ -2088,6 +2135,7 @@ Template.editCardAssignerForm.events({
// `each boards` the data context is a board, so a helper reaching into the
// context for it would find nothing there.
Template.cardDestinationPicker.onCreated(function () {
this.pickerId = Random.id();
this.autorun(() => {
const data = Template.currentData();
this.dialog = data && data.dialog;
@@ -2095,6 +2143,12 @@ Template.cardDestinationPicker.onCreated(function () {
});
Template.cardDestinationPicker.helpers({
pickerFieldId(field) { return `${Template.instance().pickerId}-${field}`; },
destinationError() { return Template.instance().dialog.error.get(); },
destinationDisabled() {
const dialog = Template.instance().dialog;
return dialog.loading.get() || dialog.saving.get() || !dialog.selectedSwimlaneId.get() || !dialog.selectedListId.get();
},
boards() {
return Template.instance().dialog.boards();
},
@@ -2156,7 +2210,9 @@ function registerCardDialogTemplate(templateName) {
Template[templateName].events({
async 'click .js-done'(event, tpl) {
event.preventDefault();
const dialog = tpl.dialog;
if (dialog.loading.get() || dialog.saving.get()) return;
// Read the target board/swimlane/list from the dialog's live reactive
// selection rather than the DOM <select> elements. A reactive re-render
// (e.g. the boards() helper transiently returning [] while a 'board'
@@ -2173,11 +2229,19 @@ function registerCardDialogTemplate(templateName) {
? cardSelect.options[cardSelect.selectedIndex].value
: null;
if (!boardId || !swimlaneId || !listId) return;
if (cardId && !dialog.cards().some(card => card._id === cardId)) return;
dialog.error.set('');
dialog.saving.set(true);
const options = { boardId, swimlaneId, listId, cardId };
try {
await dialog.setDone(cardId, options);
} catch (e) {
console.error('Error in card dialog operation:', e);
dialog.error.set(e.reason || e.message || TAPi18n.__('server-error'));
return;
} finally {
dialog.saving.set(false);
}
Popup.back(2);
},
@@ -2187,6 +2251,7 @@ function registerCardDialogTemplate(templateName) {
'change .js-select-swimlanes'(event, tpl) {
tpl.dialog.selectedSwimlaneId.set($(event.currentTarget).val());
tpl.dialog.setFirstListId();
tpl.dialog.selectedCardId?.set('');
},
'change .js-select-lists'(event, tpl) {
tpl.dialog.selectedListId.set($(event.currentTarget).val());
@@ -2229,12 +2294,7 @@ Template.moveCardPopup.onCreated(function () {
if (cardId) {
const targetCard = ReactiveCache.getCard(cardId);
if (targetCard) {
const targetSort = targetCard.sort || 0;
if (position === 'above') {
sortIndex = targetSort - 0.5;
} else {
sortIndex = targetSort + 0.5;
}
sortIndex = await relativeCardSort(targetCard, position, card._id);
}
} else {
const maxSort = await card.getMaxSort(options.listId, options.swimlaneId);
@@ -2283,12 +2343,7 @@ Template.copyCardPopup.onCreated(function () {
if (cardId) {
const targetCard = ReactiveCache.getCard(cardId);
if (targetCard) {
const targetSort = targetCard.sort || 0;
if (position === 'above') {
sortIndex = targetSort - 0.5;
} else {
sortIndex = targetSort + 0.5;
}
sortIndex = await relativeCardSort(targetCard, position, newCard._id);
}
} else {
const maxSort = await newCard.getMaxSort(options.listId, options.swimlaneId);
@@ -2337,8 +2392,7 @@ Template.linkCardToBoardPopup.onCreated(function () {
if (cardId) {
const targetCard = ReactiveCache.getCard(cardId);
if (targetCard) {
const targetSort = targetCard.sort || 0;
sortIndex = position === 'above' ? targetSort - 0.5 : targetSort + 0.5;
sortIndex = await relativeCardSort(targetCard, position, newCard._id);
}
} else {
const maxSort = await newCard.getMaxSort(options.listId, options.swimlaneId);
@@ -2384,12 +2438,7 @@ Template.convertChecklistItemToCardPopup.onCreated(function () {
if (cardId) {
const targetCard = ReactiveCache.getCard(cardId);
if (targetCard) {
const targetSort = targetCard.sort || 0;
if (position === 'above') {
sortIndex = targetSort - 0.5;
} else {
sortIndex = targetSort + 0.5;
}
sortIndex = await relativeCardSort(targetCard, position, newCard._id);
}
} else {
const maxSort = await newCard.getMaxSort(options.listId, options.swimlaneId);
@@ -2432,12 +2481,7 @@ Template.copyManyCardsPopup.onCreated(function () {
if (cardId) {
const targetCard = ReactiveCache.getCard(cardId);
if (targetCard) {
const targetSort = targetCard.sort || 0;
if (position === 'above') {
sortIndex = targetSort - 0.5;
} else {
sortIndex = targetSort + 0.5;
}
sortIndex = await relativeCardSort(targetCard, position, newCard._id);
}
} else {
const maxSort = await newCard.getMaxSort(options.listId, options.swimlaneId);
@@ -2445,6 +2489,7 @@ Template.copyManyCardsPopup.onCreated(function () {
}
await newCard.move(options.boardId, options.swimlaneId, options.listId, sortIndex);
if (position === 'below') cardId = newCardId;
}
// In case the filter is active we need to add the newly inserted card in
+6 -12
View File
@@ -9,6 +9,7 @@ function getCardId() {
Template.editCardSpentTimePopup.onCreated(function () {
this.error = new ReactiveVar('');
this.card = Cards.findOne(getCardId());
this.overtime = new ReactiveVar(this.card?.getIsOvertime() || false);
});
Template.editCardSpentTimePopup.helpers({
@@ -19,8 +20,7 @@ Template.editCardSpentTimePopup.helpers({
return Cards.findOne(getCardId());
},
getIsOvertime() {
const card = Cards.findOne(getCardId());
return card?.getIsOvertime ? card.getIsOvertime() : false;
return Template.instance().overtime.get();
},
});
@@ -32,10 +32,7 @@ Template.editCardSpentTimePopup.events({
if (!card) return;
const spentTime = parseFloat(evt.target.time.value);
let isOvertime = false;
if ($('#overtime').attr('class').indexOf('is-checked') >= 0) {
isOvertime = true;
}
const isOvertime = tpl.overtime.get();
if (spentTime >= 0) {
card.setSpentTime(spentTime);
card.setIsOvertime(isOvertime);
@@ -53,12 +50,9 @@ Template.editCardSpentTimePopup.events({
card.setIsOvertime(false);
Popup.back();
},
'click a.js-toggle-overtime'(evt) {
const card = Cards.findOne(getCardId());
if (!card) return;
card.setIsOvertime(!card.getIsOvertime());
$('#overtime .materialCheckBox').toggleClass('is-checked');
$('#overtime').toggleClass('is-checked');
'click a.js-toggle-overtime'(evt, tpl) {
evt.preventDefault();
tpl.overtime.set(!tpl.overtime.get());
},
});
+17 -3
View File
@@ -43,12 +43,13 @@ textarea.js-edit-checklist-item {
.checklist-progress-bar-container .checklist-progress-bar .checklist-progress {
color: #fff;
background-color: #666;
padding: 0.01em 16px;
padding: 0;
box-sizing: border-box;
border-radius: 16px;
height: 100%;
}
.checklist-title {
padding: 10px;
padding: calc(10px * min(1, var(--wekan-ui-font-scale, 1)));
}
.checklist-title .checkbox {
float: inline-start;
@@ -134,6 +135,8 @@ textarea.js-edit-checklist-item {
}
.checklist-item .item-title {
flex: 1;
min-width: 0;
overflow-wrap: anywhere;
}
.checklist-item .item-title.is-checked {
color: #8c8c8c;
@@ -143,7 +146,7 @@ textarea.js-edit-checklist-item {
.checklist-item .item-title .viewer p {
margin-bottom: 2px;
display: block;
word-wrap: break-word;
overflow-wrap: anywhere;
max-width: 420px;
}
.checklist-item span.fa.checklistitem-handle {
@@ -234,3 +237,14 @@ textarea.js-edit-checklist-item {
.checklist-title .checklist-collapse:focus-visible {
color: #2980b9;
}
.checklist-title .checklist-due-date-add {
float: inline-end;
width: auto;
min-width: 28px;
padding: 4px 6px;
margin: 0 4px;
background: transparent;
color: inherit;
border: 0;
}
+32 -14
View File
@@ -15,10 +15,10 @@ template(name="checklists")
.material-toggle-switch(title="{{_ 'hide-finished-checklist'}}")
//span.toggle-switch-title
if card.hideFinishedChecklistIfItemsAreHidden
input.toggle-switch(type="checkbox" id="toggleHideFinishedChecklist" checked="checked")
input.toggle-switch.js-toggle-hide-finished-checklist(type="checkbox" aria-label="{{_ 'hide-finished-checklist'}}" id="{{visibilitySwitchId}}" checked="checked")
else
input.toggle-switch(type="checkbox" id="toggleHideFinishedChecklist")
label.toggle-label(for="toggleHideFinishedChecklist")
input.toggle-switch.js-toggle-hide-finished-checklist(type="checkbox" aria-label="{{_ 'hide-finished-checklist'}}" id="{{visibilitySwitchId}}")
label.toggle-label(for="{{visibilitySwitchId}}")
.card-checklist-items
each checklist in checklists
@@ -53,13 +53,17 @@ template(name="checklistDetail")
title="{{#if checklistCollapsed}}{{_ 'expand-checklist'}}{{else}}{{_ 'collapse-checklist'}}{{/if}}"
role="button" tabindex="0"
aria-expanded="{{#if checklistCollapsed}}false{{else}}true{{/if}}")
unless $eq currentBoard.allowsChecklistDueDate false
unless checklist.getDue
if canModifyCard
+checklistDueDateAdd(checklist=checklist)
if canModifyCard
a.fa.fa-navicon.checklist-details-menu.js-open-checklist-details-menu(title="{{_ 'checklistActionsPopup-title'}}")
if canModifyCard
h4.title.js-open-inlined-form.is-editable
if isTouchScreenOrShowDesktopDragHandles
span.fa.checklist-handle(class="fa-arrows" title="{{_ 'dragChecklist'}}")
span.fa.checklist-handle(class="fa-arrows" title="{{_ 'moveChecklist'}}")
+viewer
= checklist.title
else
@@ -67,6 +71,10 @@ template(name="checklistDetail")
+viewer
= checklist.title
unless $eq currentBoard.allowsChecklistDueDate false
if checklist.getDue
+checklistDueDate(checklist=checklist canModifyCard=canModifyCard)
//- The progress bar stays visible when folded: it is the summary of what was
folded away, so hiding it too would leave a title that says nothing.
if $gt finishedPercent 0
@@ -94,12 +102,12 @@ template(name="addChecklistItemForm")
a.fa.fa-times-thin.js-close-inlined-form(title="{{_ 'close-add-checklist-item'}}")
if showNewlineBecomesNewChecklistItem
.material-toggle-switch(title="{{_ 'newlineBecomesNewChecklistItem'}}")
input.toggle-switch(type="checkbox" id="toggleNewlineBecomesNewChecklistItem")
input.toggle-switch(type="checkbox" aria-label="{{_ 'newlineBecomesNewChecklistItem'}}" id="toggleNewlineBecomesNewChecklistItem")
label.toggle-label(for="toggleNewlineBecomesNewChecklistItem")
| {{_ 'newLineNewItem'}}
if $eq position 'top'
.material-toggle-switch(title="{{_ 'newlineBecomesNewChecklistItemOriginOrder'}}")
input.toggle-switch(type="checkbox" id="toggleNewlineBecomesNewChecklistItemOriginOrder")
input.toggle-switch(type="checkbox" aria-label="{{_ 'newlineBecomesNewChecklistItemOriginOrder'}}" id="toggleNewlineBecomesNewChecklistItemOriginOrder")
label.toggle-label(for="toggleNewlineBecomesNewChecklistItemOriginOrder")
| {{_ 'originOrder'}}
@@ -160,7 +168,7 @@ template(name="checklistItems")
template(name='checklistItemDetail')
.js-checklist-item.checklist-item(class="{{#if item.isFinished }}is-checked{{#if checklist.isItemHidden item.isFinished}} invisible{{/if}}{{/if}}{{#if checklist.hideAllChecklistItems}} is-checked invisible{{/if}}"
role="checkbox" aria-checked="{{#if item.isFinished }}true{{else}}false{{/if}}" tabindex="0")
role="checkbox" aria-checked="{{#if item.isFinished }}true{{else}}false{{/if}}" aria-readonly="{{#if canCheckChecklistItem}}false{{else}}true{{/if}}" tabindex="{{#if canCheckChecklistItem}}0{{else}}-1{{/if}}")
//- #3307: checking off an item is a lower bar than editing/deleting one - a
Worker may do the former but not the latter, so the checkbox itself is
gated on canCheckChecklistItem while everything else here still needs
@@ -172,7 +180,7 @@ template(name='checklistItemDetail')
.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}")
if canModifyCard
if isTouchScreenOrShowDesktopDragHandles
span.fa.checklistitem-handle(class="fa-arrows" title="{{_ 'dragChecklistItem'}}")
span.fa.checklistitem-handle(class="fa-arrows" title="{{_ 'move-scope'}}")
.item-title.js-open-inlined-form.is-editable(class="{{#if item.isFinished }}is-checked{{/if}}")
+viewer
= item.title
@@ -234,18 +242,18 @@ template(name="checklistActionsPopup")
| {{_ "hideCheckedChecklistItems"}} ...
.material-toggle-switch(title="{{_ 'hide-checked-items'}}")
if checklist.hideCheckedState
input.toggle-switch(type="checkbox" id="toggleHideCheckedChecklistItems_{{checklist._id}}" checked="checked")
input.toggle-switch(type="checkbox" aria-label="{{_ 'hide-checked-items'}}" id="toggleHideCheckedChecklistItems_{{checklist._id}}" checked="checked")
else
input.toggle-switch(type="checkbox" id="toggleHideCheckedChecklistItems_{{checklist._id}}")
input.toggle-switch(type="checkbox" aria-label="{{_ 'hide-checked-items'}}" id="toggleHideCheckedChecklistItems_{{checklist._id}}")
label.toggle-label(for="toggleHideCheckedChecklistItems_{{checklist._id}}")
a.js-hide-all-checklist-items
i.fa.fa-ban
| {{_ "hideAllChecklistItems"}} ...
.material-toggle-switch(title="{{_ 'hideAllChecklistItems'}}")
if checklist.hideAllChecklistItems
input.toggle-switch(type="checkbox" id="toggleHideAllChecklistItems_{{checklist._id}}" checked="checked")
input.toggle-switch(type="checkbox" aria-label="{{_ 'hideAllChecklistItems'}}" id="toggleHideAllChecklistItems_{{checklist._id}}" checked="checked")
else
input.toggle-switch(type="checkbox" id="toggleHideAllChecklistItems_{{checklist._id}}")
input.toggle-switch(type="checkbox" aria-label="{{_ 'hideAllChecklistItems'}}" id="toggleHideAllChecklistItems_{{checklist._id}}")
label.toggle-label(for="toggleHideAllChecklistItems_{{checklist._id}}")
a.js-show-checklist-at-minicard
i.fa.fa-th-list
@@ -256,9 +264,9 @@ template(name="checklistActionsPopup")
because the board default (allowsChecklistsOnMinicard, on out of the
box) put it there - reported by email.
if shownAtMinicard
input.toggle-switch(type="checkbox" id="toggleShowChecklistAtMinicard_{{checklist._id}}" checked="checked")
input.toggle-switch(type="checkbox" aria-label="{{_ 'show-on-minicard'}}" id="toggleShowChecklistAtMinicard_{{checklist._id}}" checked="checked")
else
input.toggle-switch(type="checkbox" id="toggleShowChecklistAtMinicard_{{checklist._id}}")
input.toggle-switch(type="checkbox" aria-label="{{_ 'show-on-minicard'}}" id="toggleShowChecklistAtMinicard_{{checklist._id}}")
label.toggle-label(for="toggleShowChecklistAtMinicard_{{checklist._id}}")
//- #3818 / #4729: pick this checklist's automatic-reset interval (or 'none' to
@@ -330,3 +338,13 @@ template(name="editChecklistItemsAsTextPopup")
.edit-controls.clearfix
button.primary.confirm(type="submit") {{_ 'save'}}
a.fa.fa-times-thin.js-cancel-checklist-items-as-text(title="{{_ 'close-edit-checklist-item'}}")
template(name="checklistDueDate")
+dateBadgeBody(canModifyCard=canModifyCard baseClass="card-date due-date checklist-due-date" showTitle=showTitle classes=classes showISODate=showISODate showDate=showDate showWeekOfYear=showWeekOfYear showWeek=showWeek)
template(name="checklistDueDateAdd")
button.js-checklist-due-date.checklist-due-date-add(type="button" title="{{_ 'card-due'}}" aria-label="{{_ 'card-due'}}")
i.fa.fa-clock-o
template(name="editChecklistDueDatePopup")
+editDateForm(showDate=showDate showTime=showTime error=error datePicker=datePicker)
+131 -8
View File
@@ -1,3 +1,4 @@
import { Random } from 'meteor/random';
import { formatDateForDisplay } from '/client/lib/dateDisplay';
import { ReactiveCache } from '/imports/reactiveCache';
import { TAPi18n } from '/imports/i18n';
@@ -205,7 +206,12 @@ Template.checklistDetail.events({
},
});
Template.checklists.onCreated(function () {
this.visibilitySwitchId = `toggleHideFinishedChecklist_${Random.id()}`;
});
Template.checklists.helpers({
visibilitySwitchId() { return Template.instance().visibilitySwitchId; },
checklists() {
const card = ReactiveCache.getCard(this.cardId);
if (!card || typeof card.checklists !== 'function') {
@@ -221,9 +227,11 @@ Template.checklists.events({
// #4017: apply/append a template card's checklists onto this already
// existing card, alongside whatever checklists it already has.
'click .js-copy-checklist-from-template': Popup.open('copyChecklistFromTemplate'),
'submit .js-add-checklist'(event, tpl) {
async 'submit .js-add-checklist'(event, tpl) {
event.preventDefault();
const textarea = tpl.find('textarea.js-add-checklist-item');
const form = event.currentTarget;
if (form.dataset.submitting === 'true') return;
const textarea = form.querySelector('textarea.js-add-checklist-item');
const title = textarea.value.trim();
let cardId = Template.currentData().cardId;
const card = ReactiveCache.getCard(cardId);
@@ -242,11 +250,22 @@ Template.checklists.events({
}
if (title) {
Checklists.insert({
cardId,
title,
sort: sortIndex,
});
form.dataset.submitting = 'true';
try {
// Keep the client insert path used by this form; wait for the server
// acknowledgement before accepting another submission.
await new Promise((resolve, reject) => {
Checklists.insert({ cardId, title, sort: sortIndex }, (error, id) => {
if (error) reject(error);
else resolve(id);
});
});
} catch (error) {
delete form.dataset.submitting;
alert(error.reason || error.message || TAPi18n.__('server-error'));
return;
}
textarea.value = '';
tpl.$('.js-close-inlined-form').click();
setTimeout(() => {
tpl.$('.add-checklist-item')
@@ -389,7 +408,7 @@ Template.checklists.events({
'click .js-open-inlined-form'(event, tpl) {
tpl.$('.js-close-inlined-form').click();
},
'click #toggleHideFinishedChecklist'(event) {
'click .js-toggle-hide-finished-checklist'(event) {
event.preventDefault();
Template.currentData().card.toggleHideFinishedChecklist();
},
@@ -596,6 +615,13 @@ Template.checklistItemDetail.helpers({
});
Template.checklistItemDetail.events({
'keydown .js-checklist-item'(event) {
if (event.target !== event.currentTarget || event.repeat || event.originalEvent?.repeat || ![' ', 'Enter'].includes(event.key)) return;
if (event.currentTarget.getAttribute('aria-readonly') === 'true') return;
event.preventDefault();
event.stopPropagation();
event.currentTarget.querySelector('.check-box-container')?.click();
},
// #2422: open the checklist item's linked subtask card. Reuses the same
// navigation guard subtasks.js uses for its own "View it" button, so a
// subtask on another (not-yet-loaded) board resolves the same way.
@@ -900,3 +926,100 @@ Template.copyChecklistFromTemplatePopup.onCreated(function () {
});
});
registerChecklistDialogEvents('copyChecklistFromTemplatePopup');
// Checklist deadlines use the same calendar and date controls as items.
Template.checklistDueDate.onCreated(function () {
this.date = new ReactiveVar();
const dateNowTicker = subscribeDateNowTicker();
this.now = dateNowTicker.now;
this.view.onViewDestroyed(dateNowTicker.unsubscribe);
const self = this;
self.autorun(() => {
const checklist = Template.currentData().checklist;
self.date.set(new Date(checklist && checklist.getDue ? checklist.getDue() : undefined));
});
});
Template.checklistDueDate.helpers({
showWeek() {
// Checklist items are dense UI (see CLAUDE.md) - no ISO-week badge here.
return '';
},
showWeekOfYear() {
return false;
},
showDate() {
return formatDateForDisplay(Template.instance().date.get(), true);
},
showISODate() {
return Template.instance().date.get().toISOString();
},
classes() {
const tpl = Template.instance();
return dueDateClass(tpl.date.get(), tpl.now.get());
},
showTitle() {
const tpl = Template.instance();
const formattedDate = formatDateForDisplay(tpl.date.get(), true);
return `${TAPi18n.__('card-due-on')} ${formattedDate}`;
},
});
Template.checklistDueDate.events({
'click .js-edit-date'(event, tpl) {
event.preventDefault();
event.stopPropagation();
const checklist = Template.currentData().checklist;
if (checklist) {
// Reuse the card's own "Change due date" title (#4755) rather than
// adding a near-duplicate translation key to every locale file.
Popup.open('editChecklistDueDate', {
titleKey: 'editCardDueDatePopup-title',
}).call(checklist, event, tpl);
}
},
});
// editChecklistDueDatePopup - the popup form editing that badge. Reuses
// editDateForm - the same date/time-picker markup and submit/delete events
// (datePickerEvents(), registered once on Template.editDateForm) the card's
// own editCardDueDatePopup uses. Deliberately does NOT use setupDatePicker
// from /client/lib/datepicker: that helper resolves its `card` via
// getCurrentCardFromContext(), which - opened from inside an already-open
// card detail dialog - would find the CARD, not the checklist item, and
// silently save the due date on the wrong document.
Template.editChecklistDueDatePopup.onCreated(function () {
const checklist = Template.currentData();
const initialDate = checklist && checklist.getDue ? checklist.getDue() : undefined;
this.datePicker = {
error: new ReactiveVar(''),
card: checklist,
date: new ReactiveVar(
initialDate && isValidDate(new Date(initialDate))
? new Date(initialDate)
: new Date('invalid'),
),
defaultTime: '1970-01-01 17:00:00',
storeDate(date, currentChecklist) {
return currentChecklist.setDue(date);
},
deleteDate(currentChecklist) {
return currentChecklist.unsetDue();
},
};
});
Template.editChecklistDueDatePopup.onRendered(function () {
datePickerRendered(this);
});
Template.editChecklistDueDatePopup.helpers(datePickerHelpers());
Template.checklistDueDateAdd.events({
'click .js-checklist-due-date'(event, tpl) {
event.preventDefault();
event.stopPropagation();
Popup.open('editChecklistDueDate', { titleKey: 'editCardDueDatePopup-title' })
.call(Template.currentData().checklist, event, tpl);
},
});
+1 -1
View File
@@ -36,7 +36,7 @@ template(name="cardLabelsPopup")
li.js-card-label-item
a.card-label-edit-button.fa.fa-pencil.js-edit-label
if isTouchScreenOrShowDesktopDragHandles
span.fa.label-handle(class="fa-arrows" title="{{_ 'dragLabel'}}")
span.fa.label-handle(class="fa-arrows" title="{{_ 'move-scope'}}")
span.card-label.card-label-selectable.js-select-label.card-label-wrapper(class="{{labelColorClass color}}"
class="{{# if isLabelSelected ../_id }}active{{/if}}" style="{{labelColorStyle color}}")
+viewer
+19 -5
View File
@@ -309,9 +309,17 @@
/* #4990: the title text is the edit target. It is a block so that the whole
line, not only the words, is that target: a click on the empty space after a
short title is still a click on the title. */
.minicard .minicard-title-row {
display: flex;
align-items: center;
gap: 6px;
min-width: 0;
}
.minicard .minicard-title .minicard-title-text {
display: block;
position: relative;
flex: 1;
min-width: 0;
}
/* Direct title editing is disabled; the former editor styles are retained as
@@ -1070,11 +1078,8 @@
display: inline-flex;
align-items: center;
vertical-align: middle;
/* Nudge down so the checkmark sits at the vertical middle of the title text
(the checked materialCheckBox is shifted up 4px by its own positioning). */
position: relative;
top: 4px;
margin-inline-end: 6px;
flex-shrink: 0;
margin-inline-end: 0;
cursor: pointer;
}
@@ -1113,3 +1118,12 @@
.minicard.minicard-aging-3:hover {
opacity: 1;
}
/* Markdown title headings retain their hierarchy after the global reset and
mobile normal-text rules. Relative sizes follow the selected UI font scale. */
#content .minicard-title-text .viewer h1 { font-size: 2em !important; }
#content .minicard-title-text .viewer h2 { font-size: 1.5em !important; }
#content .minicard-title-text .viewer h3 { font-size: 1.25em !important; }
#content .minicard-title-text .viewer h4 { font-size: 1.125em !important; }
#content .minicard-title-text .viewer h5 { font-size: 1em !important; }
#content .minicard-title-text .viewer h6 { font-size: 0.875em !important; }
+42 -34
View File
@@ -38,40 +38,44 @@ template(name="minicard")
fold on purpose - they must always be reachable, collapsed or not - and
the title right after the caret is likewise unconditional: collapsed, the
minicard shows only the caret and the title.
a.fa.minicard-collapse.js-collapse-minicard(
class="{{#if minicardCollapsed}}fa-caret-right{{else}}fa-caret-down{{/if}}"
title="{{#if minicardCollapsed}}{{_ 'uncollapse'}}{{else}}{{_ 'collapse'}}{{/if}}"
aria-label="{{#if minicardCollapsed}}{{_ 'uncollapse'}}{{else}}{{_ 'collapse'}}{{/if}}"
role="button" tabindex="0"
aria-expanded="{{#if minicardCollapsed}}false{{else}}true{{/if}}")
if showCollapseControl
a.fa.minicard-collapse.js-collapse-minicard(
class="{{#if minicardCollapsed}}fa-caret-right{{else}}fa-caret-down{{/if}}"
title="{{#if minicardCollapsed}}{{_ 'uncollapse'}}{{else}}{{_ 'collapse'}}{{/if}}"
aria-label="{{#if minicardCollapsed}}{{_ 'uncollapse'}}{{else}}{{_ 'collapse'}}{{/if}}"
role="button" tabindex="0"
aria-expanded="{{#if minicardCollapsed}}false{{else}}true{{/if}}")
if showLabelsAboveTitle
+minicardLabels(show=showLabels labels=labels hideText=hiddenMinicardLabelText)
.minicard-title
if showDueComplete
if canModifyCard
a.minicard-complete-toggle.js-toggle-card-complete(title="{{#if getDueComplete}}{{_ 'card-mark-incomplete'}}{{else}}{{_ 'card-mark-complete'}}{{/if}}")
.materialCheckBox(class="{{#if getDueComplete}}is-checked{{/if}}")
if $eq 'prefix-with-full-path' currentBoard.presentParentTask
.parent-prefix
| {{ parentString ' > ' }}
if $eq 'prefix-with-parent' currentBoard.presentParentTask
.parent-prefix
| {{ parentCardName }}
if isLinkedBoard
a.js-linked-link
span.linked-icon
i.fa.fa-folder
else if isLinkedCard
a.js-linked-link
span.linked-icon
i.fa.fa-id-card
if getArchived
span.linked-icon.linked-archived
i.fa.fa-archive
span.minicard-title-text
+viewer
.minicard-title-row
if showDueComplete
if canModifyCard
a.minicard-complete-toggle.js-toggle-card-complete(title="{{#if getDueComplete}}{{_ 'card-mark-incomplete'}}{{else}}{{_ 'card-mark-complete'}}{{/if}}")
.materialCheckBox(class="{{#if getDueComplete}}is-checked{{/if}}")
if isLinkedBoard
a.js-linked-link
span.linked-icon
i.fa.fa-folder
else if isLinkedCard
a.js-linked-link
span.linked-icon
i.fa.fa-id-card
if getArchived
span.linked-icon.linked-archived
i.fa.fa-archive
span.minicard-title-text
if showCardNumber
span.card-number
| ##{getCardNumber} &nbsp;
= getTitle
+viewer
= getTitle
//- Everything under the title renders in the board's minicard order
(Board Settings / Card, "Show on Minicard"; board.minicardFieldOrder,
models/lib/cardFieldOrder.js): the sections top to bottom, and inside
@@ -143,16 +147,8 @@ template(name="minicard")
.minicard-cover(style="background-image: url('{{cover.link 'original'}}?dummyReloadAfterSessionEstablished={{sess}}');")
if $eq section "labels"
if showLabels
if labels
.minicard-labels(class="{{#if hiddenMinicardLabelText}}minicard-labels-no-text{{/if}}")
each labels
unless hiddenMinicardLabelText
span.js-card-label.card-label(class="{{labelColorClass color}}" style="{{labelColorStyle color}}" title=name)
+viewer
= name
if hiddenMinicardLabelText
.minicard-label(class="{{labelColorClass color}}" style="{{labelColorStyle color}}" title="{{name}}")
unless labelsAboveTitle
+minicardLabels(show=showLabels labels=labels hideText=hiddenMinicardLabelText)
if $eq section "customFields"
if showCustomFieldsOnMinicard
@@ -402,3 +398,15 @@ template(name="minicardChecklist")
else
a.add-checklist-item.js-open-inlined-form(title="{{_ 'add-checklist-item'}}")
i.fa.fa-plus
template(name="minicardLabels")
if show
if labels
.minicard-labels(class="{{#if hideText}}minicard-labels-no-text{{/if}}")
each label in labels
unless hideText
span.js-card-label.card-label(class="{{labelColorClass label.color}}" style="{{labelColorStyle label.color}}" title=label.name)
+viewer
= label.name
if hideText
.minicard-label(class="{{labelColorClass label.color}}" style="{{labelColorStyle label.color}}" title="{{label.name}}")
+18 -14
View File
@@ -1,3 +1,4 @@
import { relativeCardSort } from '/client/lib/relativeCardPosition';
import { ReactiveCache } from '/imports/reactiveCache';
import { TAPi18n } from '/imports/i18n';
import { CustomFieldStringTemplate } from '/client/lib/customFields';
@@ -40,8 +41,14 @@ function getMinicardFlag(board, onMinicardField, legacyField, defaultValue) {
Template.minicard.helpers({
// #1591: the whole-minicard fold, same shape as a list's collapsed() helper.
showCollapseControl() { return ReactiveCache.getBoard(this.boardId)?.allowsMinicardCollapse !== false; },
showLabelsAboveTitle() {
const board = ReactiveCache.getBoard(this.boardId);
return board?.labelsAboveTitleOnMinicard === true && (board.allowsMinicardCollapse === false || !Utils.getCardCollapseState(this));
},
labelsAboveTitle() { return ReactiveCache.getBoard(this.boardId)?.labelsAboveTitleOnMinicard === true; },
minicardCollapsed() {
return Utils.getCardCollapseState(this);
return ReactiveCache.getBoard(this.boardId)?.allowsMinicardCollapse !== false && Utils.getCardCollapseState(this);
},
// The minicard's field order from Board Settings / Card's "Show on
// Minicard" column (board.minicardFieldOrder): the sections top to bottom,
@@ -390,24 +397,21 @@ Template.minicard.helpers({
// #459: accessible reordering — keyboard/screen-reader users can move a card up
// or down within its list via sr-only buttons (no drag-and-drop required). The
// move swaps the card's sort value with its neighbour in the same list+swimlane.
function moveCardBy(card, delta) {
// move inserts beside its neighbor in the same list+swimlane, repairing ties.
async function moveCardBy(card, delta) {
const siblings = ReactiveCache.getCards(
{ listId: card.listId, swimlaneId: card.swimlaneId, archived: false },
{ sort: { sort: 1 } },
{ boardId: card.boardId, listId: card.listId, swimlaneId: card.swimlaneId, archived: false, deletedAt: null },
{ sort: { sort: 1, _id: 1 } },
);
const idx = siblings.findIndex(c => c._id === card._id);
const target = siblings[idx + delta];
if (idx < 0 || !target) return;
// Capture both sort values before either update; the docs are reactive and
// card.sort would otherwise change after the first move.
const cardSort = card.sort;
const targetSort = target.sort;
// Persist through the card model's move() mutation — the canonical client
// path (e.g. editCardSortOrderPopup). A raw Cards.update of `sort` is the
// wrong path here and would be reverted.
card.move(card.boardId, card.swimlaneId, card.listId, targetSort);
target.move(target.boardId, target.swimlaneId, target.listId, cardSort);
try {
const sort = await relativeCardSort(target, delta < 0 ? 'above' : 'below', card._id);
await card.move(card.boardId, card.swimlaneId, card.listId, sort);
} catch (error) {
window.alert(error.reason || error.message || TAPi18n.__('server-error'));
}
}
Template.minicard.events({
+1 -1
View File
@@ -93,7 +93,7 @@ template(name="subtasksItems")
else
a.add-subtask-item.js-open-inlined-form
i.fa.fa-plus
| {{_ 'add-subtask-item'}}...
| {{_ 'add-subtask'}}...
template(name='subtaskItemDetail')
.js-subtasks-item.subtasks-item
+15 -2
View File
@@ -807,8 +807,21 @@ button.loud-text-button:hover {
.toggle-switch:checked:disabled ~ .toggle-label:after {
background-color: #bcbdbc;
}
.toggle-switch {
display: none;
.material-toggle-switch input.toggle-switch[type="checkbox"] {
display: block;
visibility: visible;
position: absolute;
inset-inline-start: auto;
width: 1px;
height: 1px;
margin: 0;
padding: 0;
clip-path: inset(50%);
overflow: hidden;
}
.material-toggle-switch .toggle-switch:focus-visible ~ .toggle-label {
outline: 2px solid currentColor;
outline-offset: 4px;
}
.toggle-switch-title {
margin: 0 0.5em;
+15
View File
@@ -3,6 +3,21 @@
min-height: 80px;
}
.gantt-view .gantt-container {
font-size: calc(12px * var(--wekan-ui-font-scale, 1));
line-height: calc(14.5px * var(--wekan-ui-font-scale, 1));
}
.gantt-view .gantt-container .lower-text {
font-size: calc(12px * var(--wekan-ui-font-scale, 1));
}
.gantt-view .gantt-container .upper-text,
.gantt-view .gantt-container .side-header * {
font-size: calc(14px * var(--wekan-ui-font-scale, 1));
}
.gantt-view .gantt .bar-label {
font-size: calc(13px * var(--wekan-ui-font-scale, 1));
}
.frappe-gantt-empty {
color: #888;
}
+8
View File
@@ -1,3 +1,5 @@
import { Meteor } from 'meteor/meteor';
import { fontScaleValue } from '/models/lib/uiFonts';
import { titleViewerHtml, titleViewerSvgText } from '/client/lib/titleViewer';
import { formatDateForDisplay, dateDisplayPreferences } from '/client/lib/dateDisplay';
import { Template } from 'meteor/templating';
@@ -204,7 +206,13 @@ Template.frappeGanttView.onRendered(function() {
// observer below re-translates them whenever they reappear.
const viewModes = translatedViewModes(GanttLib);
translateFrappeChrome(container, templateInstance);
const fontScale = Number(fontScaleValue(Meteor.user()?.profile?.uiFontSize) || 1);
new GanttLib(container, tasks, {
// Scale geometry with SVG text, so the 150% preset still fits its bars
// and date headers rather than merely increasing the glyph sizes.
bar_height: 30 * fontScale,
upper_header_height: 45 * fontScale,
lower_header_height: 30 * fontScale,
view_modes: viewModes,
view_mode: viewModes.find(mode => mode._key === 'WEEK').name,
// Month names in the header come from Intl.DateTimeFormat(language);
+1 -1
View File
@@ -211,7 +211,7 @@ template(name="importMapMembersAddPopup")
p
| {{_ 'import-user-select'}}
.js-map-member
input.js-search-member-input(type="text" placeholder="{{_ 'search-users'}}")
input.js-search-member-input(type="text" placeholder="{{_ 'search'}}")
ul.pop-over-list
each searchResults
li.item.js-member-item
+19 -3
View File
@@ -281,6 +281,13 @@ Template.list.onCreated(function () {
// callback, we basically solve all issues related to reactive updates. A
// comment below provides further details.
Template.list.onRendered(function () {
this.initializeListResize();
});
// #6705: collapse removes listBody but keeps the parent list alive. Bind card
// widgets and their reactive work to the body so expansion initializes the new
// .js-minicards element, including lists that were collapsed on page load.
Template.listBody.onRendered(function () {
const boardBodyEl =
this.firstNode?.parentElement?.closest?.('.board-body') ||
document.querySelector('.board-body');
@@ -288,11 +295,10 @@ Template.list.onRendered(function () {
boardBodyEl && Blaze.getView(boardBodyEl, 'Template.boardBody');
const boardComponent = boardView?.templateInstance?.();
// Initialize list resize functionality immediately
this.initializeListResize();
const itemsSelector = '.js-minicard:not(.placeholder, .js-card-composer)';
const $cards = this.$('.js-minicards');
this.cardDragTargets = $cards;
this.cardDragDestroyed = false;
// Destroy any existing sortable before re-initializing. Without this, a
// re-render of the list (e.g. when a Card Details panel opens) binds a SECOND
@@ -668,6 +674,7 @@ Template.list.onRendered(function () {
// .droppable() on initialized elements is an idempotent option refresh.
ReactiveCache.getCards({ boardId: currentBoardId });
Tracker.afterFlush(() => {
if (this.cardDragDestroyed) return;
$cards.find(itemsSelector).droppable({
hoverClass: 'draggable-hover-card',
accept: '.js-member,.js-label',
@@ -688,6 +695,15 @@ Template.list.onRendered(function () {
});
});
Template.listBody.onDestroyed(function () {
this.cardDragDestroyed = true;
const $cards = this.cardDragTargets;
if ($cards && ($cards.data('uiSortable') || $cards.data('sortable'))) {
$cards.sortable('destroy');
}
this.cardDragTargets = null;
});
// A board-wide list (no swimlaneId of its own) renders once per swimlane in
// Swimlanes view - the SAME list document, one row per swimlane - so its
// collapse state must be resolved per-swimlane, or collapsing it in one
+5 -5
View File
@@ -131,7 +131,7 @@ template(name="listHeader")
unless currentUser.isReadOnly
unless currentUser.isReadAssignedOnly
if isTouchScreenOrShowDesktopDragHandles
a.list-header-handle-desktop.handle.nodragscroll.js-list-handle(title="{{_ 'drag-list'}}")
a.list-header-handle-desktop.handle.nodragscroll.js-list-handle(title="{{_ 'moveListPopup-title'}}")
i.fa.fa-arrows
unless collapsed
div.list-header-menu
@@ -142,7 +142,7 @@ template(name="listHeader")
//
a.fa.js-list-star.list-header-plus-top(class="fa-star{{#unless starred}}-o{{/unless}}")
if isTouchScreenOrShowDesktopDragHandles
a.list-header-handle-desktop.handle.nodragscroll.js-list-handle(title="{{_ 'drag-list'}}")
a.list-header-handle-desktop.handle.nodragscroll.js-list-handle(title="{{_ 'moveListPopup-title'}}")
i.fa.fa-arrows
if canSeeAddCard
a.js-add-card.list-header-plus-top(title="{{_ 'add-card-to-top-of-list'}}")
@@ -384,7 +384,7 @@ template(name="setListWidthPopup")
unless isAutoWidth
label {{_ 'set-list-width-value'}}
p
input.list-width-value(type="number" value="{{ listWidthValue }}" min="270")
input.list-width-value(type="number" value="{{ listWidthValue }}" min="{{ listWidthMinimum }}" step="1")
input.list-width-apply(type="submit" value="{{_ 'apply'}}")
input.list-width-error
if canChangeAutoWidth
@@ -398,7 +398,7 @@ template(name="setListWidthPopup")
template(name="listWidthErrorPopup")
.list-width-invalid
p {{_ 'list-width-error-message'}} '&gt;=270'
p {{_ 'list-width-error-message'}}
button.full.js-back-view(type="submit") {{_ 'cancel'}}
template(name="setListColorPopup")
@@ -413,7 +413,7 @@ template(name="setListColorPopup")
label(for="listColorWheel") {{_ 'custom-color'}}
input.js-list-color-wheel#listColorWheel(type="color" value=currentColorHex title="{{_ 'custom-color'}}")
button.primary.confirm.js-submit {{_ 'save'}}
button.js-remove-color.negate.wide.right {{_ 'unset-color'}}
button.js-remove-color.negate.wide.right {{_ 'remove-btn'}}
//- List sync settings (docs/Features/ImportExport/Sync.md). UI wiring only -
calls the EXISTING setListSyncSource/hasListSyncCredential/syncListNow
+24 -17
View File
@@ -1,3 +1,4 @@
import { relativePosition } from '/models/lib/relativePosition';
import { formatDateForDisplay } from '/client/lib/dateDisplay';
import { ReactiveCache } from '/imports/reactiveCache';
import Lists from '../../../models/lists';
@@ -23,6 +24,7 @@ import {
import {
DEFAULT_LIST_WIDTH,
MIN_LIST_WIDTH,
parseListWidthInput,
normalizeListWidth,
} from '/models/lib/listWidth';
// List sync (docs/Features/ImportExport/Sync.md): UI wiring only, calls the
@@ -341,24 +343,26 @@ Template.listHeader.onCreated(function () {
});
// #459: accessible reordering — move a list left/right via sr-only buttons by
// swapping its sort value with the adjacent list (no drag-and-drop required).
function moveListBy(list, delta) {
const siblings = ReactiveCache.getLists(
{ boardId: list.boardId, archived: false },
{ sort: { sort: 1 } },
);
// inserting beside an adjacent visible list (no drag-and-drop required).
async function moveListBy(list, delta) {
const swimlaneId = resolveContainerSwimlaneId(list);
const selector = { boardId: list.boardId, archived: false, deletedAt: null };
if (Utils.boardView() === 'board-view-swimlanes' && swimlaneId) {
selector.swimlaneId = { $in: [swimlaneId, null, ''] };
}
const siblings = ReactiveCache.getLists(selector, { sort: { sort: 1 } });
const idx = siblings.findIndex(l => l._id === list._id);
const target = siblings[idx + delta];
if (idx < 0 || !target) return;
// Capture both sort values before either update; the docs are reactive and
// list.sort would otherwise change after the first update.
const listSort = list.sort;
const targetSort = target.sort;
// Lists are a server-restricted collection; persist the swap through the
// updateListSort method — the same path the drag-and-drop reorder uses. A raw
// client Lists.update of `sort` is reverted by the server.
Meteor.call('updateListSort', list._id, list.boardId, { sort: targetSort });
Meteor.call('updateListSort', target._id, target.boardId, { sort: listSort });
try {
const plan = relativePosition(siblings, target._id, delta < 0 ? 'above' : 'below', list._id);
for (const update of plan.updates) {
await Meteor.callAsync('updateListSort', update.id, list.boardId, { sort: update.sort });
}
await Meteor.callAsync('updateListSort', list._id, list.boardId, { sort: plan.sort });
} catch (error) {
window.alert(error.reason || error.message || TAPi18n.__('server-error'));
}
}
Template.listHeader.events({
@@ -1094,6 +1098,9 @@ function setAnonFixedListWidth(boardId, width) {
}
Template.setListWidthPopup.helpers({
listWidthMinimum() {
return MIN_LIST_WIDTH;
},
listWidthValue() {
const list = Template.currentData();
// #5729 In fixed width mode the input edits the single per-board value.
@@ -1188,9 +1195,9 @@ Template.setListWidthPopup.events({
'click .list-width-apply'(event, tpl) {
const list = Template.currentData();
const boardId = list.boardId;
const width = parseInt(tpl.$('.list-width-value').val(), 10);
const width = parseListWidthInput(tpl.$('.list-width-value').val());
if (!width || width < MIN_LIST_WIDTH) {
if (width === null) {
tpl.$('.list-width-error').click();
return;
}
+1 -1
View File
@@ -3,7 +3,7 @@ template(name="minilist")
class="minicard-{{colorClass}}")
.minicard-title
.handle
span.drag-handle(title="{{_ 'dragList'}}")
span.drag-handle(title="{{_ 'moveListPopup-title'}}")
i.fa.fa-arrows
+viewer
= title
+6 -6
View File
@@ -1,18 +1,18 @@
template(name="bookmarks")
.panel
h2 {{_ 'bookmarks'}}
h2 {{_ 'starred-boards'}}
if currentUser
if hasStarredBoards
ul
each starredBoards
li
a(href="{{pathFor 'board' id=_id slug=slug}}")= title
a.js-toggle-star(title="{{_ 'star-board-short-unstar'}}")
a.js-toggle-star(title="{{_ 'unstar-item'}}")
i.fa.fa-star
else
p {{_ 'no-starred-boards'}}
p {{_ 'no-starred-items'}}
else
p {{_ 'please-sign-in'}}
p {{_ 'log-in'}}
// Desktop popup
template(name="bookmarksPopup")
@@ -23,7 +23,7 @@ template(name="bookmarksPopup")
a(href="{{pathFor 'board' id=_id slug=slug}}")
i.fa.fa-star
| #{title}
a.js-toggle-star.right(title="{{_ 'star-board-short-unstar'}}")
a.js-toggle-star.right(title="{{_ 'unstar-item'}}")
i.fa.fa-star
else
li {{_ 'no-starred-boards'}}
li {{_ 'no-starred-items'}}
+19 -235
View File
@@ -1,12 +1,25 @@
import { ReactiveCache } from '/imports/reactiveCache';
import { findWhere } from '/imports/lib/collectionHelpers';
import { TAPi18n } from '/imports/i18n';
import Attachments from '/models/attachments';
import { Markdown } from 'meteor/wekan-markdown';
import { Utils } from '/client/lib/utils';
import { memberMatchesTerm } from '/models/lib/memberAutocomplete';
import autosize from 'autosize';
var converter = require('@wekanteam/html-to-markdown');
function syncMarkdownExternalLinkPattern(setting) {
const pattern = {
prefix: (setting && setting.externalLinkPatternPrefix) || '',
urlTemplate: (setting && setting.externalLinkPatternUrl) || '',
};
const current = Markdown.externalLinkPattern.get();
// ReactiveVar compares objects by identity. Setting a new object on every
// viewer render would invalidate that viewer again indefinitely.
if (current?.prefix !== pattern.prefix || current?.urlTemplate !== pattern.urlTemplate) {
Markdown.externalLinkPattern.set(pattern);
}
}
const specialHandles = [
{userId: 'board_members', username: 'board_members'},
{userId: 'card_members', username: 'card_members'},
@@ -66,232 +79,9 @@ Template.editor.onRendered(function () {
},
];
const enableTextarea = function() {
const $textarea = tpl.$(textareaSelector);
autosize($textarea);
$textarea.escapeableTextComplete(mentions);
};
if (Meteor.settings.public.RICHER_CARD_COMMENT_EDITOR === true || Meteor.settings.public.RICHER_CARD_COMMENT_EDITOR === 'true') {
const isSmall = Utils.isMiniScreen();
const toolbar = isSmall
? [
['view', ['fullscreen']],
['table', ['table']],
['font', ['bold', 'underline']],
//['fontsize', ['fontsize']],
['color', ['color']],
]
: [
['style', ['style']],
['font', ['bold', 'underline', 'clear']],
['fontsize', ['fontsize']],
['fontname', ['fontname']],
['color', ['color']],
['para', ['ul', 'ol', 'paragraph']],
['table', ['table']],
//['insert', ['link', 'picture', 'video']], // iframe tag will be sanitized TODO if iframe[class=note-video-clip] can be added into safe list, insert video can be enabled
['insert', ['link']], //, 'picture']], // modal popup has issue somehow :(
['view', ['fullscreen', 'codeview', 'help']],
];
const cleanPastedHTML = function(input) {
const badTags = [
'style',
'script',
'applet',
'embed',
'noframes',
'noscript',
'meta',
'link',
'button',
'form',
].join('|');
const badPatterns = new RegExp(
`(?:${[
`<(${badTags})\\s*[^>][\\s\\S]*?<\\/\\1>`,
`<(${badTags})[^>]*?\\/>`,
].join('|')})`,
'gi',
);
let output = input;
// remove bad Tags
output = output.replace(badPatterns, '');
// remove attributes ' style="..."'
const badAttributes = new RegExp(
`(?:${[
'on\\S+=([\'\"]?).*?\\1',
'href=([\'\"]?)javascript:.*?\\2',
'style=([\'\"]?).*?\\3',
'target=\\S+',
].join('|')})`,
'gi',
);
output = output.replace(badAttributes, '');
output = output.replace(/(<a )/gi, '$1target=_ '); // always to new target
return output;
};
const editor = '.editor';
const selectors = [
`.js-new-description-form ${editor}`,
`.js-new-comment-form ${editor}`,
`.js-edit-comment ${editor}`,
].join(','); // only new comment and edit comment
const inputs = $(selectors);
if (inputs.length === 0) {
// only enable richereditor to new comment or edit comment no others
enableTextarea();
} else {
const placeholder = inputs.attr('placeholder') || '';
const mSummernotes = [];
const getSummernote = function(input) {
const idx = inputs.index(input);
if (idx > -1) {
return mSummernotes[idx];
}
return undefined;
};
inputs.each(function(idx, input) {
mSummernotes[idx] = $(input).summernote({
placeholder,
callbacks: {
onInit(object) {
const originalInput = this;
$(originalInput).on('submitted', function() {
// when comment is submitted, the original textarea will be set to '', so shall we
if (!this.value) {
const sn = getSummernote(this);
sn && sn.summernote('code', '');
}
});
const jEditor = object && object.editable;
const toolbar = object && object.toolbar;
if (jEditor !== undefined) {
jEditor.escapeableTextComplete(mentions);
}
if (toolbar !== undefined) {
const fBtn = toolbar.find('.btn-fullscreen');
fBtn.on('click', function() {
const $this = $(this),
isActive = $this.hasClass('active');
$('.minicards,#header-quick-access').toggle(!isActive); // mini card is still showing when editor is in fullscreen mode, we hide here manually
});
}
},
onImageUpload(files) {
const $summernote = getSummernote(this);
if (files && files.length > 0) {
const image = files[0];
const currentCard = Utils.getCurrentCard();
const MAX_IMAGE_PIXEL = Utils.MAX_IMAGE_PIXEL;
const COMPRESS_RATIO = Utils.IMAGE_COMPRESS_RATIO;
const processUpload = async function(file) {
const uploader = await Attachments.insertAsync(
{
file,
meta: Utils.getCommonAttachmentMetaFrom(currentCard),
chunkSize: 'dynamic',
},
false,
);
uploader.on('uploaded', (error, fileRef) => {
if (!error) {
if (fileRef.isImage) {
const img = document.createElement('img');
img.src = fileRef.link();
img.setAttribute('width', '100%');
$summernote.summernote('insertNode', img);
}
}
});
uploader.start();
};
if (MAX_IMAGE_PIXEL) {
const reader = new FileReader();
reader.onload = function(e) {
const dataurl = e && e.target && e.target.result;
if (dataurl !== undefined) {
// need to shrink image
Utils.shrinkImage({
dataurl,
maxSize: MAX_IMAGE_PIXEL,
ratio: COMPRESS_RATIO,
toBlob: true,
callback(blob) {
if (blob !== false) {
blob.name = image.name;
processUpload(blob);
}
},
});
}
};
reader.readAsDataURL(image);
} else {
processUpload(image);
}
}
},
onPaste(e) {
var clipboardData = e.clipboardData;
var pastedData = clipboardData.getData('Text');
//if pasted data is an image, exit
if (!pastedData.length) {
e.preventDefault();
return;
}
// clear up unwanted tag info when user pasted in text
const thisNote = this;
const updatePastedText = function(object) {
const someNote = getSummernote(object);
// Fix Pasting text into a card is adding a line before and after
// (and multiplies by pasting more) by changing paste "p" to "br".
// Fixes https://github.com/wekan/wekan/2890 .
// == Fix Start ==
someNote.execCommand('defaultParagraphSeparator', false, 'br');
// == Fix End ==
const original = someNote.summernote('code');
const cleaned = cleanPastedHTML(original); //this is where to call whatever clean function you want. I have mine in a different file, called CleanPastedHTML.
someNote.summernote('code', ''); //clear original
someNote.summernote('pasteHTML', cleaned); //this sets the displayed content editor to the cleaned pasted code.
};
setTimeout(function() {
//this kinda sucks, but if you don't do a setTimeout,
//the function is called before the text is really pasted.
updatePastedText(thisNote);
}, 10);
},
},
dialogsInBody: true,
spellCheck: true,
disableGrammar: false,
disableDragAndDrop: false,
toolbar,
popover: {
image: [
['imagesize', ['imageSize100', 'imageSize50', 'imageSize25']],
['float', ['floatLeft', 'floatRight', 'floatNone']],
['remove', ['removeMedia']],
],
link: [['link', ['linkDialogShow', 'unlink']]],
table: [
['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],
['delete', ['deleteRow', 'deleteCol', 'deleteTable']],
],
air: [
['color', ['color']],
['font', ['bold', 'underline', 'clear']],
],
},
height: 200,
});
});
}
} else {
enableTextarea();
}
enableTextarea();
const $textarea = tpl.$(textareaSelector);
autosize($textarea);
$textarea.escapeableTextComplete(mentions);
});
Template.editor.events({
@@ -373,10 +163,7 @@ Blaze.Template.registerHelper(
// wekan/wekan#3069: same same-render-pass reasoning as alwaysShowCodeAsText
// above, for the external issue-tracker autolink pattern.
if (typeof Markdown !== 'undefined' && Markdown.externalLinkPattern) {
Markdown.externalLinkPattern.set({
prefix: (setting && setting.externalLinkPatternPrefix) || '',
urlTemplate: (setting && setting.externalLinkPatternUrl) || '',
});
syncMarkdownExternalLinkPattern(setting);
}
let content = Blaze.toHTML(view.templateContentBlock);
// Admin Panel / Features: when "render links as plain text" is enabled, every
@@ -534,10 +321,7 @@ Meteor.startup(() => {
Markdown.alwaysShowCodeAsText.set(!!(setting && setting.alwaysShowCodeAsText));
}
if (typeof Markdown !== 'undefined' && Markdown.externalLinkPattern) {
Markdown.externalLinkPattern.set({
prefix: (setting && setting.externalLinkPatternPrefix) || '',
urlTemplate: (setting && setting.externalLinkPatternUrl) || '',
});
syncMarkdownExternalLinkPattern(setting);
}
});
-4
View File
@@ -1541,10 +1541,6 @@ body.mobile-mode #header-quick-access .allBoards {
margin: 7px;
padding: 0;
}
#headerIsSettingDatabaseCallDone {
display: none;
}
/* ── Small screens: home ICON only, never the "All Boards" label ─────────────
This block is last in the file on purpose.
+14 -13
View File
@@ -52,19 +52,20 @@ template(name="header")
= headerTitleText
// Logo - visible; on mobile constrained by CSS
unless currentSetting.hideLogo
if currentSetting.customTopLeftCornerLogoImageUrl
if currentSetting.customTopLeftCornerLogoLinkUrl
a.header-logo(href="{{currentSetting.customTopLeftCornerLogoLinkUrl}}" alt="{{currentSetting.productName}}" title="{{currentSetting.productName}}")
img(src="{{currentSetting.customTopLeftCornerLogoImageUrl}}" alt="{{currentSetting.productName}}" height="{{#if currentSetting.customTopLeftCornerLogoHeight}}#{currentSetting.customTopLeftCornerLogoHeight}{{else}}27{{/if}}" width="auto" margin="0" padding="0")
unless currentSetting.customTopLeftCornerLogoLinkUrl
img.header-logo(src="{{currentSetting.customTopLeftCornerLogoImageUrl}}" height="{{#if currentSetting.customTopLeftCornerLogoHeight}}#{currentSetting.customTopLeftCornerLogoHeight}{{else}}27{{/if}}" width="auto" margin="0" padding="0" alt="{{currentSetting.productName}}" title="{{currentSetting.productName}}")
unless currentSetting.customTopLeftCornerLogoImageUrl
//- `header-logo` on all three branches - a custom logo that links, one
that does not, and the stock one - so the bar can space the logo the
same way whichever is drawn. docs/Features/Page/Header.md
div#headerIsSettingDatabaseCallDone.header-logo
img(src="{{pathFor '/logo-header.png'}}" alt="{{headerLogoAlt}}" title="{{headerLogoAlt}}")
if logoSettingsReady
unless currentSetting.hideLogo
if currentSetting.customTopLeftCornerLogoImageUrl
if currentSetting.customTopLeftCornerLogoLinkUrl
a.header-logo(href="{{currentSetting.customTopLeftCornerLogoLinkUrl}}" alt="{{currentSetting.productName}}" title="{{currentSetting.productName}}")
img(src="{{currentSetting.customTopLeftCornerLogoImageUrl}}" alt="{{currentSetting.productName}}" height="{{#if currentSetting.customTopLeftCornerLogoHeight}}#{currentSetting.customTopLeftCornerLogoHeight}{{else}}27{{/if}}" width="auto" margin="0" padding="0")
unless currentSetting.customTopLeftCornerLogoLinkUrl
img.header-logo(src="{{currentSetting.customTopLeftCornerLogoImageUrl}}" height="{{#if currentSetting.customTopLeftCornerLogoHeight}}#{currentSetting.customTopLeftCornerLogoHeight}{{else}}27{{/if}}" width="auto" margin="0" padding="0" alt="{{currentSetting.productName}}" title="{{currentSetting.productName}}")
unless currentSetting.customTopLeftCornerLogoImageUrl
//- `header-logo` on all three branches - a custom logo that links, one
that does not, and the stock one - so the bar can space the logo the
same way whichever is drawn. docs/Features/Page/Header.md
div.header-logo
img(src="{{pathFor '/logo-header.png'}}" alt="{{headerLogoAlt}}" title="{{headerLogoAlt}}")
// Mobile/desktop mode toggle (swapped with zoom)
// #6680 follow-up: .js-header-collapsible-icon marks every icon the new
+4 -22
View File
@@ -66,6 +66,7 @@ Template.header.onCreated(function () {
const templateInstance = this;
templateInstance.currentSetting = new ReactiveVar();
templateInstance.isLoading = new ReactiveVar(false);
templateInstance.subscribe('setting');
// Publish the page's path so the browser tab can carry it too. Here rather
// than in `Utils`, because this is the one place that already works it out
@@ -74,30 +75,11 @@ Template.header.onCreated(function () {
headerPathVar.set(headerFullPath());
});
Meteor.subscribe('setting', {
onReady() {
templateInstance.currentSetting.set(ReactiveCache.getCurrentSetting());
let currSetting = templateInstance.currentSetting.curValue;
if (
currSetting &&
currSetting !== undefined &&
currSetting.customLoginLogoImageUrl !== undefined &&
document.getElementById('headerIsSettingDatabaseCallDone') != null
)
document.getElementById(
'headerIsSettingDatabaseCallDone',
).style.display = 'none';
else if (
document.getElementById('headerIsSettingDatabaseCallDone') != null
)
document.getElementById(
'headerIsSettingDatabaseCallDone',
).style.display = 'block';
return this.stop();
},
});
});
Template.header.helpers({
logoSettingsReady() {
return Template.instance().subscriptionsReady();
},
// The page's title, beside the house icon. A board's own title wherever there
// is a board; otherwise the page's, by route name. Two helpers rather than
// one string, because a translated title has to go through {{_ }} and a board
+18 -5
View File
@@ -19,10 +19,6 @@ table, tbody, td, tfoot, th, thread, tr, tt, ul, var {
font-size: 100%;
vertical-align: baseline;
}
.note-popover .popover-content .note-color-palette div .note-color-btn,
.panel-heading.note-toolbar .note-color-palette div .note-color-btn {
background: none;
}
a:focus {
outline: unset;
outline-offset: unset;
@@ -577,7 +573,24 @@ kbd {
cursor: grabbing;
}
.textcomplete-dropdown {
z-index: 2000 !important;
/* The menu is attached to body, above both card windows (2001) and
card-detail popups (100000). #6704 */
z-index: 100001 !important;
background: #fff;
color: #333;
list-style: none;
margin: 0;
padding: 4px 0;
border: 1px solid #ccc;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
}
.textcomplete-dropdown .textcomplete-item > span {
display: block;
padding: 4px 12px 4px 8px;
cursor: pointer;
}
.textcomplete-dropdown .textcomplete-item.active > span {
color: #fff;
}
.fa.fa-times-thin:before {
content: '\00d7';
+17 -15
View File
@@ -25,23 +25,24 @@ template(name="main")
template(name="userFormsLayout")
+recoveryMaintenance
section.auth-layout
if currentSetting.hideLogo
h1.at-form-landing-logo
br
br
unless currentSetting.hideLogo
h1.at-form-landing-logo
if currentSetting.customLoginLogoImageUrl
if currentSetting.customLoginLogoLinkUrl
a(href="{{currentSetting.customLoginLogoLinkUrl}}")
if logoSettingsReady
if currentSetting.hideLogo
h1.at-form-landing-logo
br
br
unless currentSetting.hideLogo
h1.at-form-landing-logo
if currentSetting.customLoginLogoImageUrl
if currentSetting.customLoginLogoLinkUrl
a(href="{{currentSetting.customLoginLogoLinkUrl}}")
img(src="{{currentSetting.customLoginLogoImageUrl}}" alt="{{currentSetting.productName}}" width="300" height="auto")
br
unless currentSetting.customLoginLogoLinkUrl
img(src="{{currentSetting.customLoginLogoImageUrl}}" alt="{{currentSetting.productName}}" width="300" height="auto")
br
else
img(src="{{pathFor '/wekan-logo.svg'}}" alt="" width="300" height="auto")
br
unless currentSetting.customLoginLogoLinkUrl
img(src="{{currentSetting.customLoginLogoImageUrl}}" alt="{{currentSetting.productName}}" width="300" height="auto")
br
else
img(src="{{pathFor '/wekan-logo.svg'}}" alt="" width="300" height="auto")
br
if currentSetting.textBelowCustomLoginLogo
hr
section.textBelowCustomLoginLogo
@@ -129,6 +130,7 @@ template(name="userFormsLayout")
.auth-bottom-space
template(name="defaultLayout")
+attachmentViewer
+recoveryMaintenance
//- Shared migration / board-repair progress dashboard. Mounted app-wide so it
//- shows for both a board-open repair AND an Admin Panel database migration.
+8 -6
View File
@@ -29,6 +29,11 @@ Template.userFormsLayout.onCreated(function () {
const templateInstance = this;
templateInstance.currentSetting = new ReactiveVar();
templateInstance.isLoading = new ReactiveVar(false);
templateInstance.subscribe('setting', {
onReady() {
templateInstance.currentSetting.set(ReactiveCache.getCurrentSetting());
},
});
// The Meteor accounts-* OAuth providers the server reports enabled (keys
// only) and whether e-mailed one-time-code login is on; both are filled by
// the getAuthenticationsEnabled call in onRendered.
@@ -64,12 +69,6 @@ Template.userFormsLayout.onCreated(function () {
}
});
Meteor.subscribe('setting', {
onReady() {
templateInstance.currentSetting.set(ReactiveCache.getCurrentSetting());
return this.stop();
},
});
}
});
@@ -272,6 +271,9 @@ Template.userFormsLayout.onDestroyed(() => {
});
Template.userFormsLayout.helpers({
logoSettingsReady() {
return Template.instance().subscriptionsReady();
},
// One entry per enabled Meteor accounts-* provider: key, icon class and the
// translated provider name for {{_ 'sign-in-with' label}}. No credential
// ever reaches this list - the server sends keys only.
+1 -1
View File
@@ -22,7 +22,7 @@ template(name="myAttachments")
= list.title
each card in list.myAttachmentCards
.my-attachments-card-wrapper
a.my-attachments-card-title.js-my-attachment-card(href=card.originRelativeUrl)
a.my-attachments-card-title.js-my-attachment-card(href=card.originRelativeUrl data-card-id=card._id data-board-id=card.boardId)
i.fa.fa-external-link
= card.title
.attachment-gallery.my-attachments-gallery
+5 -4
View File
@@ -205,11 +205,12 @@ Template.myAttachments.events({
// would navigate away from this page and lose the reader's place in a
// list that spans many boards.
'click .js-my-attachment-card'(evt) {
if (evt.button !== 0 || evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey) return;
// `each card in ...` binds a lexical variable, not a Blaze data context.
// Read the identifiers from the link even when its child was clicked (#6702).
const { cardId, boardId } = evt.currentTarget.dataset;
if (!cardId || !boardId) return;
evt.preventDefault();
const card = Blaze.getData(evt.currentTarget);
if (!card || !card._id) return;
const cardId = card._id;
const boardId = card.boardId;
Meteor.subscribe('popupCardData', cardId, {
onReady() {
Session.set('popupCardId', cardId);
+8 -8
View File
@@ -41,7 +41,7 @@ template(name="myCards")
= list.title
each card in list.myCards
.my-cards-card-wrapper
a.minicard-wrapper.js-minicard(href=card.originRelativeUrl)
a.minicard-wrapper.js-minicard(href=card.originRelativeUrl data-card-id=card._id data-board-id=card.boardId)
+minicard(card)
if $eq myCardsView 'table'
.wrapper
@@ -49,14 +49,14 @@ template(name="myCards")
caption.sr-only {{_ 'my-cards'}}
thead
tr
th(scope="col") {{_ "Card"}}
th(scope="col") {{_ "List"}}
th(scope="col") {{_ "Board"}}
th(scope="col") {{_ "Swimlane"}}
th(scope="col") {{_ "card"}}
th(scope="col") {{_ "list"}}
th(scope="col") {{_ "board"}}
th(scope="col") {{_ "swimlane"}}
unless isMiniScreen
th(scope="col") {{_ "Members"}}
th(scope="col") {{_ "Labels"}}
th(scope="col") {{_ "Due Date"}}
th(scope="col") {{_ "members"}}
th(scope="col") {{_ "labels"}}
th(scope="col") {{_ "due-date"}}
tbody
each board in myCardsList
each swimlane in board.mySwimlanes
+5 -4
View File
@@ -184,11 +184,12 @@ Template.myCards.events({
// tableView.js (Board Table view) already use: subscribe the popup-only
// publication, then open the shared `cardDetails` popup template.
'click .js-minicard'(evt) {
if (evt.button !== 0 || evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey) return;
// `each card in ...` binds a lexical variable, not a Blaze data context.
// Read the identifiers from the link even when its child was clicked (#6702).
const { cardId, boardId } = evt.currentTarget.dataset;
if (!cardId || !boardId) return;
evt.preventDefault();
const card = Blaze.getData(evt.currentTarget);
if (!card || !card._id) return;
const cardId = card._id;
const boardId = card.boardId;
Meteor.subscribe('popupCardData', cardId, {
onReady() {
Session.set('popupCardId', cardId);
+14 -6
View File
@@ -39,7 +39,7 @@
first row of a popup, and it must match the space beside it: `.content` has 18px of
side padding, so 6 + 12 = 18 makes the top gap and the left gutter the same. */
.pop-over .header {
height: 41px;
height: calc(41px * var(--wekan-ui-font-scale, 1));
position: relative;
margin-bottom: 6px;
background: #f7f7f7;
@@ -141,7 +141,7 @@
.pop-over[data-popup='memberMenuPopup'] > .content-wrapper {
/* The header is out of the flow here, so its height is padding instead: 41px of
header + its 1px bottom border + the same 6px gap every other popup has. */
padding-top: calc(41px + 1px + 6px);
padding-top: calc(41px * var(--wekan-ui-font-scale, 1) + 1px + 6px);
box-sizing: border-box;
}
@@ -883,7 +883,8 @@ html[dir='rtl'] .pop-over:has(.edit-date) > .js-date-popup-resize {
width: 50px;
}
.pop-over.miniprofile .miniprofile-header .info {
margin: 0 0 0 64px;
margin: 0;
margin-inline-start: 64px;
word-wrap: break-word;
}
.pop-over.miniprofile .miniprofile-header .info h3 a {
@@ -926,7 +927,7 @@ html[dir='rtl'] .pop-over:has(.edit-date) > .js-date-popup-resize {
force. The fallback is the stock WeKan blue, so an unthemed instance is
unchanged. */
background: var(--theme-accent, #2980b9);
height: 48px;
height: calc(48px * var(--wekan-ui-font-scale, 1));
padding: 0px 0px;
border: 0px;
margin: 0px 0px;
@@ -955,10 +956,10 @@ html[dir='rtl'] .pop-over:has(.edit-date) > .js-date-popup-resize {
}
.pop-over .content-wrapper {
width: 100%;
height: calc(100% - 48px);
height: calc(100% - 48px * var(--wekan-ui-font-scale, 1));
overflow-y: scroll;
overflow-x: hidden;
margin: 48px 0px 0px 0px;
margin: calc(48px * var(--wekan-ui-font-scale, 1)) 0 0;
}
.pop-over .content-container {
width: 100%;
@@ -1345,3 +1346,10 @@ body.mobile-mode .pop-over .content-wrapper {
overflow: auto;
padding-bottom: 20px;
}
/* Keep the direction marker with its language name, never in the region row. */
.pop-over[data-popup='changeLanguagePopup'] .language-rtl {
flex: 0 0 auto;
white-space: nowrap;
unicode-bidi: isolate;
}
@@ -9,8 +9,8 @@ template(name="boardActions")
option(value="bottom") {{_'r-bottom-of'}}
div.trigger-text
| {{_'r-its-list'}}
div.trigger-button.js-add-gen-move-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-gen-move-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -38,8 +38,8 @@ template(name="boardActions")
| {{_'r-in-swimlane'}}
div.trigger-dropdown
input(id="swimlaneName",type=text,placeholder="{{_'r-name'}}")
div.trigger-button.js-add-spec-move-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-spec-move-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -49,8 +49,8 @@ template(name="boardActions")
option(value="unarchive") {{_'r-unarchive'}}
div.trigger-text
| {{_'r-card'}}
div.trigger-button.js-add-arch-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-arch-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -58,8 +58,8 @@ template(name="boardActions")
| {{_'r-add-swimlane'}}
div.trigger-dropdown
input(id="swimlane-name",type=text,placeholder="{{_'r-name'}}")
div.trigger-button.js-add-swimlane-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-swimlane-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -75,8 +75,8 @@ template(name="boardActions")
| {{_'r-in-swimlane'}}
div.trigger-dropdown
input(id="swimlane-name2",type=text,placeholder="{{_'r-name'}}")
div.trigger-button.js-create-card-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-create-card-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -100,8 +100,8 @@ template(name="boardActions")
| {{_'r-in-swimlane'}}
div.trigger-dropdown
input(id="swimlaneName-link",type=text,placeholder="{{_'r-name'}}")
div.trigger-button.js-link-card-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-link-card-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -117,8 +117,8 @@ template(name="boardActions")
option(value="name") {{_'r-sort-name'}}
option(value="created") {{_'createdAt'}}
option(value="modified") {{_'modifiedAt'}}
div.trigger-button.js-sort-list-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-sort-list-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -130,8 +130,8 @@ template(name="boardActions")
| {{_'r-in-list'}}
div.trigger-dropdown
input(id="moveall-to-list",type=text,placeholder="{{_'r-list-name'}}")
div.trigger-button.js-move-all-cards-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-move-all-cards-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
@@ -38,7 +38,7 @@ Template.boardActions.helpers({
loadingBoardsLabel() {
try {
const txt = TAPi18n.__('loading-boards');
const txt = TAPi18n.__('loading');
if (txt && !txt.startsWith("key '")) return txt;
} catch (e) {
// ignore translation lookup errors
@@ -15,8 +15,8 @@ template(name="cardActions")
option(value="receivedAt") {{_'r-df-received-at'}}
div.trigger-text
| {{_'r-to-current-datetime'}}
div.trigger-button.js-set-date-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-set-date-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -29,8 +29,8 @@ template(name="cardActions")
option(value="dueAt") {{_'r-df-due-at'}}
option(value="endAt") {{_'r-df-end-at'}}
option(value="receivedAt") {{_'r-df-received-at'}}
div.trigger-button.js-remove-datevalue-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-remove-datevalue-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -45,8 +45,8 @@ template(name="cardActions")
each labels
option(value="#{_id}")
= name
div.trigger-button.js-add-label-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-label-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -58,29 +58,29 @@ template(name="cardActions")
| {{_'r-member'}}
div.trigger-dropdown
input(id="member-name",type=text,placeholder="{{_'r-name'}}")
div.trigger-button.js-add-member-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-member-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-add-actinguser-member'}}
div.trigger-button.js-add-actinguser-member-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-actinguser-member-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-remove-all'}}
div.trigger-button.js-add-removeall-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-removeall-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-remove-all-labels'}}
div.trigger-button.js-add-removealllabels-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-removealllabels-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -90,8 +90,8 @@ template(name="cardActions")
id="color-action"
class="card-details-{{cardColorButton}}")
| {{_ cardColorButtonText }}
div.trigger-button.js-set-color-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-set-color-action.js-goto-rules(type="button" aria-label="{{_ 'select-color'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -99,8 +99,8 @@ template(name="cardActions")
select(id="complete-action")
option(value="markCardComplete") {{_'r-mark-complete'}}
option(value="markCardIncomplete") {{_'r-mark-incomplete'}}
div.trigger-button.js-set-complete-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-set-complete-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -123,8 +123,8 @@ template(name="cardActions")
option(value="months") {{_'r-unit-months'}}
div.trigger-text
| {{_'r-later'}}
div.trigger-button.js-set-reldate-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-set-reldate-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
template(name="setCardActionsColorPopup")
form.edit-label
@@ -9,8 +9,8 @@ template(name="checklistActions")
| {{_'r-checklist'}}
div.trigger-dropdown
input(id="checklist-name",type=text,placeholder="{{_'r-name'}}")
div.trigger-button.js-add-checklist-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-checklist-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -22,8 +22,8 @@ template(name="checklistActions")
| {{_'r-items-check'}}
div.trigger-dropdown
input(id="checklist-name2",type=text,placeholder="{{_'r-name'}}")
div.trigger-button.js-add-checkall-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-checkall-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
@@ -40,8 +40,8 @@ template(name="checklistActions")
| {{_'r-of-checklist'}}
div.trigger-dropdown
input(id="checklist-name3",type=text,placeholder="{{_'r-name'}}")
div.trigger-button.js-add-check-item-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-check-item-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -53,8 +53,8 @@ template(name="checklistActions")
| {{_'r-with-items'}}
div.trigger-dropdown
input(id="checklist-items",type=text,placeholder="{{_'r-items-list'}}")
div.trigger-button.js-add-checklist-items-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.js-add-checklist-items-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -76,8 +76,8 @@ Template.checklistActions.events({
const data = Template.currentData();
const ruleName = data.ruleName.get();
const trigger = data.triggerVar.get();
const checkItemName = tpl.find('#checkitem-name');
const checklistName = tpl.find('#checklist-name3');
const checkItemName = tpl.find('#checkitem-name').value;
const checklistName = tpl.find('#checklist-name3').value;
const actionSelected = tpl.find('#check-item-action').value;
const boardId = Session.get('currentBoard');
const desc = Utils.getTriggerActionDesc(event, tpl);
@@ -9,5 +9,5 @@ template(name="mailActions")
textarea(id="email-msg")
div.trigger-hint.trigger-hint-email-vars
| {{_'r-email-vars-hint'}}
div.trigger-button.trigger-button-email.js-mail-action.js-goto-rules
i.fa.fa-plus
button.trigger-button.trigger-button-email.js-mail-action.js-goto-rules(type="button" aria-label="{{_ 'r-add-action'}}")
i.fa.fa-plus(aria-hidden="true")
@@ -6,7 +6,7 @@ template(name="boardTriggers")
div.trigger-inline-button.js-open-card-title-popup
i.fa.fa-search
div.trigger-text
| {{_'r-is'}}
| {{ruleTriggerCopula}}
div.trigger-text
| {{_'r-added-to'}}
div.trigger-text
@@ -17,15 +17,15 @@ template(name="boardTriggers")
| {{_'r-in-swimlane'}}
div.trigger-dropdown
input(id="create-swimlane-name",type=text,placeholder="{{_'r-swimlane-name'}}")
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-create-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-create-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item#trigger-three
div.trigger-content
@@ -35,15 +35,15 @@ template(name="boardTriggers")
i.fa.fa-search
div.trigger-text
| {{_'r-is-moved'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-gen-moved-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-gen-moved-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item#trigger-four
div.trigger-content
@@ -52,7 +52,7 @@ template(name="boardTriggers")
div.trigger-inline-button.js-open-card-title-popup
i.fa.fa-search
div.trigger-text
| {{_'r-is'}}
| {{ruleTriggerCopula}}
div.trigger-dropdown
select(id="move-action")
option(value="moved-to") {{_'r-moved-to'}}
@@ -65,15 +65,15 @@ template(name="boardTriggers")
| {{_'r-in-swimlane'}}
div.trigger-dropdown
input(id="create-swimlane-name-2",type=text,placeholder="{{_'r-swimlane-name'}}")
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-moved-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-moved-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item#trigger-five
div.trigger-content
@@ -82,20 +82,20 @@ template(name="boardTriggers")
div.trigger-inline-button.js-open-card-title-popup
i.fa.fa-search
div.trigger-text
| {{_'r-is'}}
| {{ruleTriggerCopula}}
div.trigger-dropdown
select(id="arch-action")
option(value="archived") {{_'r-archived'}}
option(value="unarchived") {{_'r-unarchived'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-arch-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-arch-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -9,5 +9,5 @@ template(name="buttonTriggers")
select#button-type.js-button-type
option(value="card" selected="selected") {{_'r-card-button'}}
option(value="board") {{_'r-board-button'}}
div.trigger-button.js-add-button-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-button-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
@@ -9,42 +9,46 @@ template(name="cardTriggers")
option(value="removed") {{_'r-removed-from'}}
div.trigger-text
| {{_'r-a-card'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-gen-label-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-gen-label-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-when-the-label'}}
unless ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-label'}}
div.trigger-dropdown
select(id="spec-label")
each labels
option(value="#{_id}" style="background-color: #{name}")
= translatedname
if ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-label'}}
div.trigger-text
| {{_'r-is'}}
| {{ruleTriggerCopula}}
div.trigger-dropdown
select(id="spec-label-action")
option(value="added") {{_'r-added-to'}}
option(value="removed") {{_'r-removed-from'}}
div.trigger-text
| {{_'r-a-card'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-spec-label-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-spec-label-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -56,40 +60,44 @@ template(name="cardTriggers")
option(value="removed") {{_'r-removed-from'}}
div.trigger-text
| {{_'r-a-card'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-gen-member-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-gen-member-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-when-the-member'}}
unless ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-member'}}
div.trigger-dropdown
input(id="spec-member",type=text,placeholder="{{_'r-name'}}")
if ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-member'}}
div.trigger-text
| {{_'r-is'}}
| {{ruleTriggerCopula}}
div.trigger-dropdown
select(id="spec-member-action")
option(value="added") {{_'r-added-to'}}
option(value="removed") {{_'r-removed-from'}}
div.trigger-text
| {{_'r-a-card'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-spec-member-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-spec-member-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -101,62 +109,66 @@ template(name="cardTriggers")
option(value="removed") {{_'r-removed-from'}}
div.trigger-text
| {{_'r-a-card'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-gen-assignee-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-gen-assignee-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-when-the-assignee'}}
unless ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-assignee'}}
div.trigger-dropdown
input(id="spec-assignee",type=text,placeholder="{{_'r-name'}}")
if ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-assignee'}}
div.trigger-text
| {{_'r-is'}}
| {{ruleTriggerCopula}}
div.trigger-dropdown
select(id="spec-assignee-action")
option(value="added") {{_'r-added-to'}}
option(value="removed") {{_'r-removed-from'}}
div.trigger-text
| {{_'r-a-card'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-spec-assignee-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-spec-assignee-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-when-a-attach'}}
div.trigger-text
| {{_'r-is'}}
| {{ruleTriggerCopula}}
div.trigger-dropdown
select(id="attach-action")
option(value="added") {{_'r-added-to'}}
option(value="removed") {{_'r-removed-from'}}
option(value="added") {{_'r-attachment-added-to'}}
option(value="removed") {{_'r-attachment-removed-from'}}
div.trigger-text
| {{_'r-a-card'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-attachment-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-attachment-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item(title="{{_'advanced-filter-description'}}")
div.trigger-content
@@ -164,8 +176,8 @@ template(name="cardTriggers")
| {{_'r-when-a-card-matches-advanced-filter'}}
div.trigger-dropdown
input(class="advanced-filter-trigger-value",type=text,placeholder="{{_'advanced-filter-label'}}")
div.trigger-button.js-add-advanced-filter-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-advanced-filter-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item(title="{{_'text-contains-trigger-description'}}")
div.trigger-content
@@ -173,61 +185,61 @@ template(name="cardTriggers")
| {{_'r-when-a-card-title-or-description-contains'}}
div.trigger-dropdown
input(class="text-contains-trigger-value",type=text,placeholder="{{_'text-contains-trigger-label'}}")
div.trigger-button.js-add-text-contains-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-text-contains-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-when-a-due-date-changed'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-due-date-changed-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-due-date-changed-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-when-a-start-date-changed'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-start-date-changed-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-start-date-changed-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-when-a-end-date-changed'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-end-date-changed-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-end-date-changed-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-when-a-received-date-changed'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-received-date-changed-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-received-date-changed-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
@@ -9,40 +9,44 @@ template(name="checklistTriggers")
option(value="removed") {{_'r-removed-from'}}
div.trigger-text
| {{_'r-a-card'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-gen-check-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-gen-check-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-when-the-checklist'}}
unless ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-checklist'}}
div.trigger-dropdown
input(id="check-name",type=text,placeholder="{{_'r-name'}}")
if ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-checklist'}}
div.trigger-text
| {{_'r-is'}}
| {{ruleTriggerCopula}}
div.trigger-dropdown
select(id="spec-check-action")
option(value="created") {{_'r-added-to'}}
option(value="removed") {{_'r-removed-from'}}
div.trigger-text
| {{_'r-a-card'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-spec-check-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-spec-check-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -52,37 +56,41 @@ template(name="checklistTriggers")
select(id="gen-comp-check-action")
option(value="completed") {{_'r-completed'}}
option(value="uncompleted") {{_'r-made-incomplete'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-gen-comp-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-gen-comp-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-when-the-checklist'}}
unless ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-checklist'}}
div.trigger-dropdown
input(id="spec-comp-check-name",type=text,placeholder="{{_'r-name'}}")
if ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-checklist'}}
div.trigger-text
| {{_'r-is'}}
| {{ruleTriggerCopula}}
div.trigger-dropdown
select(id="spec-comp-check-action")
option(value="completed") {{_'r-completed'}}
option(value="uncompleted") {{_'r-made-incomplete'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-spec-comp-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-spec-comp-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
@@ -92,34 +100,38 @@ template(name="checklistTriggers")
select(id="check-item-gen-action")
option(value="checked") {{_'r-checked'}}
option(value="unchecked") {{_'r-unchecked'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-gen-check-item-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-gen-check-item-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item
div.trigger-content
div.trigger-text
| {{_'r-when-the-item'}}
unless ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-item'}}
div.trigger-dropdown
input(id="check-item-name",type=text,placeholder="{{_'r-name'}}")
if ruleNameBeforeSubject
div.trigger-text
| {{_'r-when-the-item'}}
div.trigger-text
| {{_'r-is'}}
| {{ruleTriggerCopula}}
div.trigger-dropdown
select(id="check-item-spec-action")
option(value="checked") {{_'r-checked'}}
option(value="unchecked") {{_'r-unchecked'}}
div.trigger-button.trigger-button-person.js-show-user-field
i.fa.fa-user
button.trigger-button.trigger-button-person.js-show-user-field(type="button" aria-label="{{_ 'username'}}")
i.fa.fa-user(aria-hidden="true")
div.user-details.hide-element
div.trigger-text
| {{_'r-by'}}
div.trigger-dropdown
input(class="user-name",type=text,placeholder="{{_'username'}}")
div.trigger-button.js-add-spec-check-item-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-spec-check-item-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
@@ -39,8 +39,8 @@ template(name="scheduledTriggers")
| {{_'r-of-cards-in-list'}}
div.trigger-dropdown
input#schedule-list-name(type=text placeholder="{{_'r-list-name'}}")
div.trigger-button.js-add-scheduled-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-scheduled-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item#trigger-due
div.trigger-content
@@ -59,8 +59,8 @@ template(name="scheduledTriggers")
| {{_'r-schedule-at-time'}}
div.trigger-dropdown
+calendarTimeInput(inputId="due-time" value="09:00")
div.trigger-button.js-add-due-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-due-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
div.trigger-item#trigger-aging
div.trigger-content
@@ -76,5 +76,5 @@ template(name="scheduledTriggers")
| {{_'r-schedule-at-time'}}
div.trigger-dropdown
+calendarTimeInput(inputId="aging-time" value="09:00")
div.trigger-button.js-add-aging-trigger.js-goto-action
i.fa.fa-plus
button.trigger-button.js-add-aging-trigger.js-goto-action(type="button" aria-label="{{_ 'r-add-trigger'}}")
i.fa.fa-plus(aria-hidden="true")
@@ -1,5 +1,4 @@
template(name="adminProblems")
+attachmentViewer
.setting-content.admin-reports-content
unless currentUser.isAdmin
| {{_ 'error-notAuthorized'}}
@@ -19,19 +19,19 @@ template(name="notificationSettingsPopup")
| {{_ labelKey}}
.notification-settings-popup-options
if isAdminScope
a.flex.js-notify-option(data-service="{{service}}" data-value="true" class="{{#if onSelected}}is-checked{{/if}}")
.materialCheckBox
a.flex.js-notify-option(data-service="{{service}}" data-value="true")
.materialCheckBox(class="{{#if onSelected}}is-checked{{/if}}")
span {{_ 'yes'}}
a.flex.js-notify-option(data-service="{{service}}" data-value="false" class="{{#if offSelected}}is-checked{{/if}}")
.materialCheckBox
a.flex.js-notify-option(data-service="{{service}}" data-value="false")
.materialCheckBox(class="{{#if offSelected}}is-checked{{/if}}")
span {{_ 'no'}}
else
a.flex.js-notify-option(data-service="{{service}}" data-value="" class="{{#if inheritSelected}}is-checked{{/if}}")
.materialCheckBox
a.flex.js-notify-option(data-service="{{service}}" data-value="")
.materialCheckBox(class="{{#if inheritSelected}}is-checked{{/if}}")
span {{_ 'default'}}
a.flex.js-notify-option(data-service="{{service}}" data-value="true" class="{{#if onSelected}}is-checked{{/if}}")
.materialCheckBox
a.flex.js-notify-option(data-service="{{service}}" data-value="true")
.materialCheckBox(class="{{#if onSelected}}is-checked{{/if}}")
span {{_ 'yes'}}
a.flex.js-notify-option(data-service="{{service}}" data-value="false" class="{{#if offSelected}}is-checked{{/if}}")
.materialCheckBox
a.flex.js-notify-option(data-service="{{service}}" data-value="false")
.materialCheckBox(class="{{#if offSelected}}is-checked{{/if}}")
span {{_ 'no'}}
@@ -35,10 +35,10 @@ function currentValue(scope, service) {
Template.notificationSettingsPopup.helpers({
isAdminScope() {
return Template.currentData().scope === 'admin';
return Template.instance().data.scope === 'admin';
},
notifyServiceRows() {
const scope = Template.currentData().scope;
const scope = Template.instance().data.scope;
return Object.keys(NOTIFICATION_SERVICES).map(service => {
const value = currentValue(scope, service);
return {
@@ -60,7 +60,7 @@ Template.notificationSettingsPopup.events({
const service = target.dataset.service;
const rawValue = target.dataset.value;
const value = rawValue === 'true' ? true : rawValue === 'false' ? false : null;
const scope = Template.currentData().scope;
const scope = instance.data.scope;
if (scope === 'admin') {
// Inherit is not offered at admin scope - it IS the base default - so
+1 -1
View File
@@ -687,7 +687,7 @@ template(name="settingsOrgPopup")
//
i.fa.fa-user
//
| {{_ 'impersonate-org'}}
| {{_ 'impersonate-user'}}
//
//
+3 -17
View File
@@ -1,3 +1,4 @@
import { accountOperationErrorKey } from '/client/lib/accountOperationError';
import { formatDateForDisplay } from '/client/lib/dateDisplay';
import { ReactiveCache } from '/imports/reactiveCache';
import { TAPi18n } from '/imports/i18n';
@@ -2587,16 +2588,7 @@ Template.settingsUserPopup.events({
if (process.env.DEBUG === 'true') {
console.error('Error removing user:', error);
}
// Show error message to user
if (error.error === 'not-authorized') {
alert('You are not authorized to delete this user.');
} else if (error.error === 'user-not-found') {
alert('User not found.');
} else if (error.error === 'not-authorized' && error.reason === 'Cannot delete the last administrator') {
alert('Cannot delete the last administrator.');
} else {
alert('Error deleting user: ' + error.reason);
}
alert(TAPi18n.__(accountOperationErrorKey(error)));
} else {
if (process.env.DEBUG === 'true') {
console.log('User deleted successfully:', result);
@@ -2619,13 +2611,7 @@ Template.settingsUserPopup.events({
if (process.env.DEBUG === 'true') {
console.error('Error anonymizing user:', error);
}
if (error.error === 'not-authorized') {
alert('You are not authorized to anonymize this user.');
} else if (error.error === 'user-not-found') {
alert('User not found.');
} else {
alert('Error anonymizing user: ' + error.reason);
}
alert(TAPi18n.__(accountOperationErrorKey(error)));
} else {
if (process.env.DEBUG === 'true') {
console.log('User anonymized successfully:', result);
@@ -360,6 +360,17 @@ template(name='tableVisibilityModeSettings')
a.flex.js-toggle-all-boards-hide
.materialCheckBox#hide-board-member-list(class="{{#if currentSetting.hideBoardMemberList}}is-checked{{/if}}")
span {{_ 'board-member-list'}}
li.tableVisibilityMode-form
a.flex.js-toggle-all-boards-hide
.materialCheckBox#hide-date-format(class="{{#if currentSetting.hideDateFormat}}is-checked{{/if}}")
span {{_ 'date-format-for-everyone'}}:
select.wekan-form-control#global-date-format(aria-label="{{_ 'date-format-for-everyone'}}")
option(value="YYYY-MM-DD" selected="{{#if isGlobalDateFormat 'YYYY-MM-DD'}}selected{{/if}}") {{_ 'date-format-yyyy-mm-dd'}} · {{_ 'time'}}
option(value="DD-MM-YYYY" selected="{{#if isGlobalDateFormat 'DD-MM-YYYY'}}selected{{/if}}") {{_ 'date-format-dd-mm-yyyy'}} · {{_ 'time'}}
option(value="MM-DD-YYYY" selected="{{#if isGlobalDateFormat 'MM-DD-YYYY'}}selected{{/if}}") {{_ 'date-format-mm-dd-yyyy'}} · {{_ 'time'}}
option(value="YYYY-MM-DD-date-only" selected="{{#if isGlobalDateFormat 'YYYY-MM-DD-date-only'}}selected{{/if}}") {{_ 'date'}}: {{_ 'date-format-yyyy-mm-dd'}}
option(value="DD-MM-YYYY-date-only" selected="{{#if isGlobalDateFormat 'DD-MM-YYYY-date-only'}}selected{{/if}}") {{_ 'date'}}: {{_ 'date-format-dd-mm-yyyy'}}
option(value="MM-DD-YYYY-date-only" selected="{{#if isGlobalDateFormat 'MM-DD-YYYY-date-only'}}selected{{/if}}") {{_ 'date'}}: {{_ 'date-format-mm-dd-yyyy'}}
li.tableVisibilityMode-form
.title {{_ 'wait-spinner'}}
+selectSpinnerName(spinnerName=currentSetting.spinnerName)
@@ -487,6 +498,7 @@ template(name='tableVisibilityModeSettings')
.title {{_ 'custom-login-logo-image-url'}}
.form-group
input.wekan-form-control#custom-login-logo-image-url(type="text", placeholder="" value="{{currentSetting.customLoginLogoImageUrl}}")
input.js-site-logo-upload(type="file" data-kind="login" accept="image/png,image/jpeg,image/gif,image/webp" aria-label="{{_ 'upload'}} {{_ 'custom-login-logo-image-url'}}")
li.tableVisibilityMode-form
.title {{_ 'custom-login-logo-link-url'}}
.form-group
@@ -499,6 +511,9 @@ template(name='tableVisibilityModeSettings')
.title {{_ 'custom-top-left-corner-logo-image-url'}}
.form-group
input.wekan-form-control#custom-top-left-corner-logo-image-url(type="text", placeholder="" value="{{currentSetting.customTopLeftCornerLogoImageUrl}}")
input.js-site-logo-upload(type="file" data-kind="header" accept="image/png,image/jpeg,image/gif,image/webp" aria-label="{{_ 'upload'}} {{_ 'custom-top-left-corner-logo-image-url'}}")
li.tableVisibilityMode-form
span.js-site-logo-upload-status(role="status" aria-live="polite")
li.tableVisibilityMode-form
.title {{_ 'custom-top-left-corner-logo-link-url'}}
.form-group
+34
View File
@@ -901,6 +901,9 @@ Template.setting.events({
});
Template.tableVisibilityModeSettings.helpers({
isGlobalDateFormat(format) {
return (ReactiveCache.getCurrentSetting()?.globalDateFormat || 'YYYY-MM-DD') === format;
},
// Multitenancy option D: every group of this pane except "Change color" writes
// the INSTANCE settings, so only the site admin is shown them.
isSiteAdmin() {
@@ -947,6 +950,33 @@ function saveVisibilitySettings($set) {
}
Template.tableVisibilityModeSettings.events({
async 'change input.js-site-logo-upload'(event, tpl) {
const input = event.currentTarget;
const file = input.files?.[0];
if (!file) return;
const status = tpl.find('.js-site-logo-upload-status');
const kind = input.dataset.kind;
input.value = '';
if (file.size > 2 * 1024 * 1024 || !['image/png', 'image/jpeg', 'image/gif', 'image/webp'].includes(file.type)) {
if (status) status.textContent = 'Upload a PNG, JPEG, GIF or WebP image smaller than 2 MB';
return;
}
if (status) status.textContent = TAPi18n.__('upload') + '…';
try {
const base64 = await new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onerror = () => reject(reader.error);
reader.onload = () => resolve(String(reader.result).split(',')[1]);
reader.readAsDataURL(file);
});
const url = await Meteor.callAsync('uploadSiteLogo', kind, base64);
const field = tpl.find(kind === 'login' ? '#custom-login-logo-image-url' : '#custom-top-left-corner-logo-image-url');
if (field) field.value = url;
if (status) status.textContent = TAPi18n.__('save');
} catch (error) {
if (status) status.textContent = error.reason || error.message || 'Upload failed';
}
},
// ── All Boards ────────────────────────────────────────────────────────────
// Boards visibility, board activities, the two All Boards lists and the spinner.
//
@@ -982,11 +1012,15 @@ Template.tableVisibilityModeSettings.events({
['#hide-board-activities', 'hideBoardActivitiesOnAllBoards'],
['#hide-card-counter-list', 'hideCardCounterList'],
['#hide-board-member-list', 'hideBoardMemberList'],
['#hide-date-format', 'hideDateFormat'],
]) {
if ($(selector).length) {
$set[key] = $(selector).hasClass('is-checked');
}
}
if ($('#global-date-format').length) {
$set.globalDateFormat = visibilityText('#global-date-format');
}
if ($('#spinnerName').length) {
$set.spinnerName = visibilityText('#spinnerName');
}
@@ -57,7 +57,7 @@ template(name="newTranslationPopup")
label
| {{_ 'text'}}
span.error.hide.text-taken
| {{_ 'error-text-taken'}}
| {{_ 'editTranslationPopup-title'}}
input.js-translation-text(type="text" value="" required)
label
| {{_ 'translation-text'}}
@@ -1,3 +1,4 @@
import { TAPi18n } from '/imports/i18n';
import { ReactiveCache } from '/imports/reactiveCache';
import { buildHeader, pageInfo, TABLE_PAGE_ROWS_PER_PAGE } from '/models/lib/tablePage';
@@ -52,7 +53,7 @@ Template.translationSettings.onCreated(function () {
if (value === '') {
this.findTranslationsOptions.set({});
} else {
const regex = new RegExp(value, 'i');
const regex = new RegExp(value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i');
this.findTranslationsOptions.set({
$or: [
{ language: regex },
@@ -210,7 +211,9 @@ Template.newTranslationPopup.events({
if (error) {
const errorElement = error.error;
if (errorElement === 'text-already-taken') {
textMessageElement.show();
textMessageElement.text(`${TAPi18n.__('editTranslationPopup-title')}: ${text} (${language})`).show();
} else {
textMessageElement.text(TAPi18n.__('server-error')).show();
}
} else {
textMessageElement.hide();
@@ -218,7 +221,6 @@ Template.newTranslationPopup.events({
}
},
);
Popup.back();
},
});
+29 -3
View File
@@ -161,7 +161,7 @@
.card-field-order-columns {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-columns: repeat(2, minmax(0, 1fr));
column-gap: 18px;
align-items: start;
}
@@ -179,7 +179,7 @@
display: flex;
align-items: center;
gap: 6px;
padding: 4px 0;
padding: calc(4px * min(1, var(--wekan-ui-font-scale, 1))) 0;
border-bottom: 1px solid #eee;
}
@@ -190,7 +190,7 @@
.card-field-order-move.is-disabled {
opacity: 0.3;
pointer-events: none;
cursor: not-allowed;
}
.card-field-order-label {
@@ -765,4 +765,30 @@ body.sidebar-resizing-active {
.pop-over-list-subheading + .pop-over-list {
margin-top: 0;
}
/* #6699: this editor uses real, labelled checkboxes. Undo all three parts
of forms.css's material-checkbox hiding rule in this popup only. */
.wip-limit-groups input[type="checkbox"] {
display: inline-block;
visibility: visible;
position: static;
inset-inline-start: auto;
width: 16px;
height: 16px;
flex: 0 0 16px;
margin-inline-end: 6px;
appearance: auto;
cursor: pointer;
}
.wip-limit-groups label.flex {
align-items: center;
cursor: pointer;
}
/* Stack the two settings columns without changing single-side desktop headings. */
@media screen and (max-width: 800px) {
.card-field-order-columns { grid-template-columns: minmax(0, 1fr); }
}
.card-field-order-column { min-width: 0; }
.card-field-order-label { overflow-wrap: anywhere; }
+6 -6
View File
@@ -217,7 +217,7 @@ template(name="boardChangeBackgroundImagePopup")
Save it belongs beside.
.buttonsContainer.board-background-image-buttons
input.primary(type="submit" value="{{_ 'save'}}")
button.js-remove-background-image.negate.card-details-red(type="button") {{_ 'unset-color'}}
button.js-remove-background-image.negate.card-details-red(type="button") {{_ 'remove-background-image'}}
hr
//- ...and the same question answered from this machine instead of from a
URL, with what has been uploaded to this board under it - so an upload is
@@ -300,9 +300,9 @@ template(name="boardCardSettingsPopup")
a.flex.card-field-order-toggle(class=row.toggle class="{{#if row.checked}}is-checked{{/if}}" title="{{row.title}}")
i.fa(class="{{#if row.checked}}fa-check{{else}}fa-square-o{{/if}}")
if canModifyBoard
a.flex.card-field-order-move.js-card-field-order-up(href="#" role="button" class="{{#unless row.canMoveUp}}is-disabled{{/unless}}" title="{{_ 'card-field-order-move-up'}}" aria-label="{{_ 'card-field-order-move-up'}}")
a.flex.card-field-order-move.js-card-field-order-up(href="#" role="button" class="{{#unless row.canMoveUp}}is-disabled{{/unless}}" aria-disabled="{{#if row.canMoveUp}}false{{else}}true{{/if}}" title="{{#if row.canMoveUp}}{{_ 'card-field-order-move-up'}}{{else}}{{_ 'r-rule-disabled'}}{{/if}}" aria-label="{{_ 'card-field-order-move-up'}}")
i.fa.fa-arrow-up
a.flex.card-field-order-move.js-card-field-order-down(href="#" role="button" class="{{#unless row.canMoveDown}}is-disabled{{/unless}}" title="{{_ 'card-field-order-move-down'}}" aria-label="{{_ 'card-field-order-move-down'}}")
a.flex.card-field-order-move.js-card-field-order-down(href="#" role="button" class="{{#unless row.canMoveDown}}is-disabled{{/unless}}" aria-disabled="{{#if row.canMoveDown}}false{{else}}true{{/if}}" title="{{#if row.canMoveDown}}{{_ 'card-field-order-move-down'}}{{else}}{{_ 'r-rule-disabled'}}{{/if}}" aria-label="{{_ 'card-field-order-move-down'}}")
i.fa.fa-arrow-down
span.card-field-order-label
each icon in row.icons
@@ -326,9 +326,9 @@ template(name="boardCardSettingsPopup")
a.flex.card-field-order-toggle(class=row.toggle class="{{#if row.checked}}is-checked{{/if}}" title="{{row.title}}")
i.fa(class="{{#if row.checked}}fa-check{{else}}fa-square-o{{/if}}")
if canModifyBoard
a.flex.card-field-order-move.js-card-field-order-up(href="#" role="button" class="{{#unless row.canMoveUp}}is-disabled{{/unless}}" title="{{_ 'card-field-order-move-up'}}" aria-label="{{_ 'card-field-order-move-up'}}")
a.flex.card-field-order-move.js-card-field-order-up(href="#" role="button" class="{{#unless row.canMoveUp}}is-disabled{{/unless}}" aria-disabled="{{#if row.canMoveUp}}false{{else}}true{{/if}}" title="{{#if row.canMoveUp}}{{_ 'card-field-order-move-up'}}{{else}}{{_ 'r-rule-disabled'}}{{/if}}" aria-label="{{_ 'card-field-order-move-up'}}")
i.fa.fa-arrow-up
a.flex.card-field-order-move.js-card-field-order-down(href="#" role="button" class="{{#unless row.canMoveDown}}is-disabled{{/unless}}" title="{{_ 'card-field-order-move-down'}}" aria-label="{{_ 'card-field-order-move-down'}}")
a.flex.card-field-order-move.js-card-field-order-down(href="#" role="button" class="{{#unless row.canMoveDown}}is-disabled{{/unless}}" aria-disabled="{{#if row.canMoveDown}}false{{else}}true{{/if}}" title="{{#if row.canMoveDown}}{{_ 'card-field-order-move-down'}}{{else}}{{_ 'r-rule-disabled'}}{{/if}}" aria-label="{{_ 'card-field-order-move-down'}}")
i.fa.fa-arrow-down
span.card-field-order-label
each icon in row.icons
@@ -702,7 +702,7 @@ template(name="wipLimitGroupsPopup")
.wip-limit-group-name
input.js-wip-limit-group-name(type="text" value="{{name}}" placeholder="{{_ 'wip-limit-group-name-placeholder'}}")
.wip-limit-group-lists
each ../boardLists
each boardLists
label.flex
input.js-wip-limit-group-list-toggle(type="checkbox" data-list-id="{{_id}}" checked="{{isListInGroup _id ../listIds}}")
| {{title}}
+27 -2
View File
@@ -529,7 +529,7 @@ Template.boardMenuPopup.events({
'click .js-change-background-image': Popup.open('boardChangeBackgroundImage'),
'click .js-open-notification-settings': Popup.open('notificationSettings', {
titleKey: 'notifications',
scope: 'board',
dataContext: { scope: 'board' },
}),
'click .js-board-info-on-my-boards': Popup.open('boardInfoOnMyBoards'),
'click .js-change-language': Popup.open('changeLanguage'),
@@ -1836,7 +1836,7 @@ function buildCardSettingsRows(side, data) {
toggle: spec.toggle,
checked: typeof helper === 'function' ? Boolean(helper.call(data)) : false,
icons: row.icons,
title: row.label.map(k => TAPi18n.__(k)).join(' '),
title: row.label.map(k => TAPi18n.__(k)).join(row.labelSeparator || ' '),
personal: Boolean(spec.personal),
labelTextOverride: Boolean(spec.labelTextOverride),
canMoveUp: positioned && canMove(stored, layout, row.key, 'up'),
@@ -1852,6 +1852,10 @@ function buildCardSettingsRows(side, data) {
// allowsLabels}}` read, defaults and fallbacks included, without a second
// copy of that logic. Registered at the end of the object.
const boardCardSettingsHelpers = {
allowsMinicardCollapse() { return ReactiveCache.getBoard(Session.get('currentBoard'))?.allowsMinicardCollapse !== false; },
labelsAboveTitleOnMinicard() { return ReactiveCache.getBoard(Session.get('currentBoard'))?.labelsAboveTitleOnMinicard === true; },
allowsChecklistDueDate() { return ReactiveCache.getBoard(Session.get('currentBoard'))?.allowsChecklistDueDate !== false; },
allowsChecklistTitle() { return ReactiveCache.getBoard(Session.get('currentBoard'))?.allowsChecklistTitle !== false; },
// Board Settings / Card Settings shows both columns - "Show on Card" and
// "Show on Minicard" beside each other. The card's own menu and the
// minicard's menu open the SAME popup asking for one of them, and the other
@@ -2311,6 +2315,7 @@ Template.boardCardSettingsPopup.helpers(boardCardSettingsHelpers);
// board's setter, which normalises it. models/lib/cardFieldOrder.js
function moveCardSettingsRow(evt, direction) {
evt.preventDefault();
if (evt.currentTarget.classList.contains('is-disabled')) return;
const rowEl = evt.currentTarget.closest('.js-card-field-order-row');
if (!rowEl) return;
const { key, side } = rowEl.dataset;
@@ -2544,6 +2549,26 @@ Template.boardCardSettingsPopup.events({
const newValue = !tpl.currentBoard.allowsDescriptionText;
Boards.update(tpl.currentBoard._id, { $set: { allowsDescriptionText: newValue } });
},
'click .js-field-minicard-collapse'(evt, tpl) {
evt.preventDefault();
const value = tpl.currentBoard.allowsMinicardCollapse !== false;
Boards.update(tpl.currentBoard._id, { $set: { allowsMinicardCollapse: !value } });
},
'click .js-field-labels-above-title'(evt, tpl) {
evt.preventDefault();
const value = tpl.currentBoard.labelsAboveTitleOnMinicard === true;
Boards.update(tpl.currentBoard._id, { $set: { labelsAboveTitleOnMinicard: !value } });
},
'click .js-field-checklist-due-date'(evt, tpl) {
evt.preventDefault();
const value = tpl.currentBoard.allowsChecklistDueDate !== false;
Boards.update(tpl.currentBoard._id, { $set: { allowsChecklistDueDate: !value } });
},
'click .js-field-checklist-title'(evt, tpl) {
evt.preventDefault();
const value = tpl.currentBoard.allowsChecklistTitle !== false;
Boards.update(tpl.currentBoard._id, { $set: { allowsChecklistTitle: !value } });
},
'click .js-field-has-checklists'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsChecklists;
@@ -110,7 +110,7 @@ template(name="archivesSidebar")
+spinner
template(name="restoreArchivedCardToListPopup")
p {{_ 'no-list-found'}}, {{_ 'select-list'}}:
p {{_ 'error-list-doesNotExist'}}, {{_ 'list'}}:
select.js-select-restore-target-list(autofocus)
each availableLists
option(value="{{_id}}" selected="{{#if isSelectedList _id}}selected{{/if}}") {{add @index 1}}. {{title}}
@@ -119,7 +119,7 @@ template(name="restoreArchivedCardToListPopup")
button.primary.confirm.js-restore-card-to-list {{_ 'restore'}}
template(name="restoreArchivedListToSwimlanePopup")
p {{_ 'no-swimlane-found'}}, {{_ 'select-swimlane'}}:
p {{_ 'no-results'}}, {{_ 'wip-limit-group-select-swimlane'}}:
select.js-select-restore-target-swimlane(autofocus)
each availableSwimlanes
option(value="{{_id}}" selected="{{#if isSelectedSwimlane _id}}selected{{/if}}") {{add @index 1}}. {{isTitleDefault title}}
@@ -249,8 +249,8 @@ template(name="multiselectionSidebar")
template(name="disambiguateMultiLabelPopup")
p {{_ 'what-to-do'}}
button.wide.js-remove-label {{_ 'remove-label'}}
button.wide.js-add-label {{_ 'add-label'}}
button.wide.js-remove-selection-label {{_ 'remove-label'}}
button.wide.js-add-selection-label {{_ 'add-label'}}
template(name="disambiguateMultiMemberPopup")
p {{_ 'what-to-do'}}
@@ -313,4 +313,4 @@ template(name="setSelectionColorPopup")
if(isSelected color)
i.fa.fa-check
button.primary.confirm.js-submit {{_ 'save'}}
button.js-remove-color.negate.wide.right {{_ 'unset-color'}}
button.js-remove-color.negate.wide.right {{_ 'remove-btn'}}
+32 -18
View File
@@ -304,33 +304,39 @@ Template.multiselectionSidebar.helpers({
});
Template.multiselectionSidebar.events({
'click .js-toggle-label-multiselection'(evt) {
const labelId = Template.currentData()._id;
async 'click .js-toggle-label-multiselection'(evt) {
evt.preventDefault();
evt.stopPropagation();
if (evt.detail > 1) return;
const labelId = this._id;
const mappedSelection = mapSelection('label', labelId);
if (mappedSelection.every(Boolean)) {
mutateSelectedCards('removeLabel', labelId);
await mutateSelectedCards('removeLabel', labelId);
} else if (mappedSelection.every(bool => !bool)) {
mutateSelectedCards('addLabel', labelId);
await mutateSelectedCards('addLabel', labelId);
} else {
const popup = Popup.open('disambiguateMultiLabel');
// XXX We need to have a better integration between the popup and the
// UI components systems.
popup.call(Template.currentData(), evt);
popup.call(this, evt);
}
},
'click .js-toggle-member-multiselection'(evt) {
const memberId = Template.currentData()._id;
async 'click .js-toggle-member-multiselection'(evt) {
evt.preventDefault();
evt.stopPropagation();
if (evt.detail > 1) return;
const memberId = this._id;
const mappedSelection = mapSelection('member', memberId);
if (mappedSelection.every(Boolean)) {
mutateSelectedCards('unassignMember', memberId);
await mutateSelectedCards('unassignMember', memberId);
} else if (mappedSelection.every(bool => !bool)) {
mutateSelectedCards('assignMember', memberId);
await mutateSelectedCards('assignMember', memberId);
} else {
const popup = Popup.open('disambiguateMultiMember');
// XXX We need to have a better integration between the popup and the
// UI components systems.
popup.call(Template.currentData(), evt);
popup.call(this, evt);
}
},
'click .js-move-selection': Popup.open('moveSelection'),
@@ -354,23 +360,31 @@ Template.multiselectionSidebar.events({
});
Template.disambiguateMultiLabelPopup.events({
'click .js-remove-label'() {
mutateSelectedCards('removeLabel', this._id);
async 'click .js-remove-selection-label'(evt) {
evt.preventDefault();
evt.stopPropagation();
await mutateSelectedCards('removeLabel', this._id);
Popup.back();
},
'click .js-add-label'() {
mutateSelectedCards('addLabel', this._id);
async 'click .js-add-selection-label'(evt) {
evt.preventDefault();
evt.stopPropagation();
await mutateSelectedCards('addLabel', this._id);
Popup.back();
},
});
Template.disambiguateMultiMemberPopup.events({
'click .js-unassign-member'() {
mutateSelectedCards('assignMember', this._id);
async 'click .js-unassign-member'(evt) {
evt.preventDefault();
evt.stopPropagation();
await mutateSelectedCards('unassignMember', this._id);
Popup.back();
},
'click .js-assign-member'() {
mutateSelectedCards('unassignMember', this._id);
async 'click .js-assign-member'(evt) {
evt.preventDefault();
evt.stopPropagation();
await mutateSelectedCards('assignMember', this._id);
Popup.back();
},
});
@@ -164,7 +164,7 @@ template(name="setSwimlaneColorPopup")
// Buttons aligned left too
.flush-left
button.primary.confirm.js-submit(style="margin-inline-start:0") {{_ 'save'}}
button.js-remove-color.negate.wide.right(style="margin-inline-start:8px") {{_ 'unset-color'}}
button.js-remove-color.negate.wide.right(style="margin-inline-start:8px") {{_ 'remove-btn'}}
template(name="setSwimlaneHeightPopup")
.flush-left.swimlane-height-popup
+1 -1
View File
@@ -3,7 +3,7 @@ template(name='passwordInput')
label(for='at-field-{{_id}}') {{displayName}}
.password-input-container
input.password-field(type="{{type}}" placeholder="{{displayName}}" autocomplete="{{autocomplete}}" required="{{required}}")
button.password-toggle-btn.primary(type="button" tabindex="-1" aria-label="{{_ 'password'}}: {{_ 'visibility'}}" title="{{_ 'password'}}: {{_ 'visibility'}}")
button.password-toggle-btn.primary(type="button" aria-label="{{_ 'password'}}: {{_ 'visibility'}}" title="{{_ 'password'}}: {{_ 'visibility'}}")
i.fa.fa-eye.eye-icon(aria-hidden="true")
i.fa.fa-eye-slash.eye-slash-icon(aria-hidden="true")
if errs
+2 -2
View File
@@ -329,7 +329,7 @@ Template.changeAvatarPopup.events({
event.preventDefault();
event.stopPropagation();
if (this && typeof this.link === 'function') {
const avatarUrl = this.link();
const avatarUrl = `/cdn/storage/avatars/${this._id}`;
changeAvatarSetAvatar(tpl, avatarUrl);
}
},
@@ -495,7 +495,7 @@ Template.adminChangeAvatarPopup.events({
event.preventDefault();
event.stopPropagation();
if (this && typeof this.link === 'function') {
const avatarUrl = this.link();
const avatarUrl = `/cdn/storage/avatars/${this._id}`;
adminChangeAvatarSetAvatar(tpl, avatarUrl);
}
},
+3 -3
View File
@@ -247,6 +247,8 @@ template(name="changeLanguagePopup")
span.language-main-line
span.emoji-icon.language-flags(dir="ltr" aria-hidden="true") {{languageFlag}}
bdi.language-name {{languageName}}
if rtl
span.language-rtl(dir="ltr") (RTL)
if countryFlag
span.language-region
| (
@@ -255,8 +257,6 @@ template(name="changeLanguagePopup")
| &nbsp;
bdi {{regionName}}
| )
if rtl
| (RTL)
if isCurrentLanguage
i.fa.fa-check
@@ -295,7 +295,7 @@ template(name="changeFontPopup")
label {{_ 'text-color'}}
.color-wheel-wrap
input.js-ui-text-color(type="color" value=textColorHex title="{{_ 'text-color'}}")
a.js-reset-text-color(class="{{#unless hasTextColor}}disabled{{/unless}}") {{_ 'unset-color'}}
a.js-reset-text-color(class="{{#unless hasTextColor}}disabled{{/unless}}") {{_ 'remove-btn'}}
template(name="changeSettingsPopup")
ul.pop-over-list
+4 -3
View File
@@ -1,3 +1,4 @@
import { accountOperationErrorKey } from '/client/lib/accountOperationError';
import { languageFlags, languageLabelParts } from '/imports/i18n/languageFlags';
const { availableCalendarSystems } = require('/imports/lib/calendarSystems');
import { ReactiveCache } from '/imports/reactiveCache';
@@ -93,7 +94,7 @@ Template.memberMenuPopup.events({
'click .js-change-color': Popup.open('changeColor'),
'click .js-open-notification-settings': Popup.open('notificationSettings', {
titleKey: 'notifications',
scope: 'member',
dataContext: { scope: 'member' },
}),
'click .js-change-font': Popup.open('changeFont'),
'click .js-change-avatar': Popup.open('changeAvatar'),
@@ -258,7 +259,7 @@ Template.editProfilePopup.events({
if (process.env.DEBUG === 'true') {
console.error('Error removing user:', error);
}
alert('Error deleting account: ' + error.reason);
alert(TAPi18n.__(accountOperationErrorKey(error)));
} else {
if (process.env.DEBUG === 'true') {
console.log('User deleted successfully:', result);
@@ -277,7 +278,7 @@ Template.editProfilePopup.events({
if (process.env.DEBUG === 'true') {
console.error('Error anonymizing user:', error);
}
alert('Error anonymizing account: ' + error.reason);
alert(TAPi18n.__(accountOperationErrorKey(error)));
} else {
if (process.env.DEBUG === 'true') {
console.log('User anonymized successfully:', result);
+8
View File
@@ -0,0 +1,8 @@
// Keep server diagnostics in the console; show existing localized UI messages.
// The last-admin case must precede the general authorization failure.
export function accountOperationErrorKey(error) {
if (error?.error === 'not-authorized' && error.reason === 'Cannot delete the last administrator') return 'last-admin-desc';
if (error?.error === 'not-authorized') return 'error-notAllowed';
if (error?.error === 'user-not-found') return 'error-user-doesNotExist';
return 'server-error';
}
+10 -4
View File
@@ -1,3 +1,4 @@
const { resolveDateFormat } = require('/models/lib/dateFormatPolicy');
import { ReactiveCache } from '/imports/reactiveCache';
import { formatDateByUserPreference } from '/imports/lib/dateUtils';
import { formatJalaliDate, gregorianToJalali } from '/imports/lib/jalaliDate';
@@ -5,21 +6,26 @@ import { TAPi18n } from '/imports/i18n';
const { CALENDAR_SYSTEMS, formatNativeCalendarDate, nativeCalendarParts } = require('/imports/lib/calendarSystems');
const { calendarMonthRange, shiftedDay } = require('/imports/lib/calendarMonth');
export function isDateFormatForced() {
return !!ReactiveCache.getCurrentSetting()?.hideDateFormat;
}
export function dateDisplayPreferences() {
const setting = ReactiveCache.getCurrentSetting();
const user = ReactiveCache.getCurrentUser();
if (user) {
return {
calendarSystem: user.getCalendarSystem ? user.getCalendarSystem() : 'gregorian',
dateFormat: user.getDateFormat ? user.getDateFormat() : 'YYYY-MM-DD',
dateFormat: resolveDateFormat(user.getDateFormat ? user.getDateFormat() : null, setting),
};
}
try {
return {
calendarSystem: window.localStorage.getItem('calendarSystem') || 'gregorian',
dateFormat: window.localStorage.getItem('dateFormat') || 'YYYY-MM-DD',
dateFormat: resolveDateFormat(window.localStorage.getItem('dateFormat'), setting),
};
} catch (error) {
return { calendarSystem: 'gregorian', dateFormat: 'YYYY-MM-DD' };
return { calendarSystem: 'gregorian', dateFormat: resolveDateFormat(null, setting) };
}
}
@@ -46,7 +52,7 @@ export function formatDateForDisplay(date, includeTime = true, gregorianFormatte
);
if (system) return text || '';
}
return gregorianFormatter
return gregorianFormatter && !isDateFormatForced() && !dateFormat.endsWith('-date-only')
? gregorianFormatter(value)
: formatDateByUserPreference(value, dateFormat, includeTime);
}
+41 -11
View File
@@ -31,6 +31,15 @@ export class BoardSwimlaneListDialog {
this.selectedBoardId = new ReactiveVar(this.currentBoardId);
this.selectedSwimlaneId = new ReactiveVar('');
this.selectedListId = new ReactiveVar('');
this.loading = new ReactiveVar(true);
this.error = new ReactiveVar('');
this.saving = new ReactiveVar(false);
this._request = 0;
this.tpl.view?.onViewDestroyed(() => {
this._disposed = true;
this._request++;
this._boardSubscription?.stop();
});
this.setOption(this.currentBoardId);
}
@@ -99,7 +108,7 @@ export class BoardSwimlaneListDialog {
setFirstSwimlaneId() {
try {
const board = ReactiveCache.getBoard(this.selectedBoardId.get());
const swimlaneId = board.swimlanes()[0]._id;
const swimlaneId = board?.swimlanes()[0]?._id || '';
this.selectedSwimlaneId.set(swimlaneId);
} catch (e) {}
}
@@ -124,6 +133,7 @@ export class BoardSwimlaneListDialog {
const selector = {
boardId,
archived: false,
deletedAt: null,
};
if (swimlaneId) {
@@ -197,7 +207,7 @@ export class BoardSwimlaneListDialog {
/** returns all available swimlanes of the current board */
swimlanes() {
const board = ReactiveCache.getBoard(this.selectedBoardId.get());
return board.swimlanes();
return board?.swimlanes() || [];
}
/** returns all available lists of the current board */
@@ -233,16 +243,36 @@ export class BoardSwimlaneListDialog {
/** get the board data from the server */
getBoardData(boardId) {
const self = this;
Meteor.subscribe('board', boardId, false, {
onReady() {
const sameBoardId = self.selectedBoardId.get() == boardId;
self.selectedBoardId.set(boardId);
if (!sameBoardId) {
self.setFirstSwimlaneId();
self.setFirstListId();
const changed = this.selectedBoardId.get() !== boardId;
const request = ++this._request;
this._boardSubscription?.stop();
this.selectedBoardId.set(boardId);
this.loading.set(true);
this.error.set('');
if (changed) {
this.selectedSwimlaneId.set('');
this.selectedListId.set('');
this.selectedCardId?.set('');
}
if (!boardId) return;
this._boardSubscription = this.tpl.subscribe('board', boardId, false, {
onReady: () => {
if (this._disposed || request !== this._request) return;
const lanes = this.swimlanes();
if (!lanes.some(lane => lane._id === this.selectedSwimlaneId.get())) this.setFirstSwimlaneId();
if (!this.lists().some(list => list._id === this.selectedListId.get())) this.setFirstListId();
if (this.selectedCardId && !this.cards().some(card => card._id === this.selectedCardId.get())) {
this.selectedCardId.set('');
}
this.loading.set(false);
},
onStop: error => {
if (this._disposed || request !== this._request || !error) return;
this.selectedSwimlaneId.set('');
this.selectedListId.set('');
this.selectedCardId?.set('');
this.error.set(TAPi18n.__('server-error'));
this.loading.set(false);
},
});
}
+2 -22
View File
@@ -1,4 +1,3 @@
import { Meteor } from 'meteor/meteor';
import { ReactiveVar } from 'meteor/reactive-var';
import { ReactiveCache } from '/imports/reactiveCache';
import { BoardSwimlaneListDialog } from '/client/lib/dialogWithBoardSwimlaneList';
@@ -10,7 +9,7 @@ import { BoardSwimlaneListDialog } from '/client/lib/dialogWithBoardSwimlaneList
export class BoardSwimlaneListCardDialog extends BoardSwimlaneListDialog {
constructor(tpl, callbacks = {}) {
super(tpl, callbacks);
this.selectedCardId = new ReactiveVar('');
this.selectedCardId = new ReactiveVar(this.cardOption.cardId || '');
}
getDefaultOption() {
@@ -46,26 +45,7 @@ export class BoardSwimlaneListCardDialog extends BoardSwimlaneListDialog {
/** returns if the card id was the last confirmed one */
isDialogOptionCardId(cardId) {
return this.cardOption.cardId == cardId;
}
/** Override to also reset card id on board change */
getBoardData(boardId) {
const self = this;
Meteor.subscribe('board', boardId, false, {
onReady() {
const sameBoardId = self.selectedBoardId.get() == boardId;
self.selectedBoardId.set(boardId);
if (!sameBoardId) {
self.setFirstSwimlaneId();
self.setFirstListId();
if (self.selectedCardId) {
self.selectedCardId.set('');
}
}
},
});
return this.selectedCardId.get() === cardId;
}
}
+1 -1
View File
@@ -31,7 +31,7 @@ const MOVE_CANCEL_PX = 10; // finger moving this far before the hold = a scroll
// and jQuery-UI sortables (lists / swimlanes / cards) already have touch via
// touch-punch, so leave them to it.
const EXCLUDE =
'input, select, textarea, .note-editable, .ui-sortable, .ui-sortable-handle';
'input, select, textarea, .ui-sortable, .ui-sortable-handle';
function draggableAncestor(el) {
while (el && el !== document.body) {
+1 -1
View File
@@ -33,7 +33,7 @@ function isExcluded(target) {
// .js-list-handle) must be excluded too: those start a jQuery UI
// sortable reorder via touch-punch, and hijacking the touch to scroll
// here would block dragging the handle to reorder swimlanes/lists.
'input, select, textarea, .note-editable, .nodragscroll, .handle, .ui-sortable-handle',
'input, select, textarea, .nodragscroll, .handle, .ui-sortable-handle',
)
);
}
+5 -3
View File
@@ -1,3 +1,4 @@
const { resolveDateFormat } = require('/models/lib/dateFormatPolicy');
import { ReactiveCache } from '/imports/reactiveCache';
import { TAPi18n } from '/imports/i18n';
@@ -44,12 +45,13 @@ export function browserTimezone() {
// back to, which the server cannot see at all. An export of a card should print
// its dates the way the card prints them.
export function cardDateFormat() {
const setting = ReactiveCache.getCurrentSetting();
try {
const currentUser = ReactiveCache.getCurrentUser();
if (currentUser) return currentUser.getDateFormat();
return window.localStorage.getItem('dateFormat') || 'YYYY-MM-DD';
if (currentUser) return resolveDateFormat(currentUser.getDateFormat(), setting);
return resolveDateFormat(window.localStorage.getItem('dateFormat'), setting);
} catch (error) {
return 'YYYY-MM-DD';
return resolveDateFormat(null, setting);
}
}
+2 -1
View File
@@ -1,3 +1,4 @@
import { resolveDateFormat } from '/models/lib/dateFormatPolicy';
import { Blaze } from 'meteor/blaze';
import { Tracker } from 'meteor/tracker';
import { ReactiveCache } from '/imports/reactiveCache';
@@ -410,7 +411,7 @@ class AdvancedFilter {
user && typeof user.getDateFormat === 'function'
? user.getDateFormat()
: 'YYYY-MM-DD';
dayFirst = /^D/.test(dateFormat);
dayFirst = /^D/.test(resolveDateFormat(dateFormat, ReactiveCache.getCurrentSetting()));
} catch (error) {
dayFirst = false;
}
+1 -1
View File
@@ -40,7 +40,7 @@ function isExcluded(target) {
target.closest &&
// Form fields keep their own behaviour (the zoom-level input lives in the
// quick-access bar), and `.nodragscroll` opts an element out explicitly.
target.closest('input, select, textarea, .note-editable, .nodragscroll')
target.closest('input, select, textarea, .nodragscroll')
);
}
+8
View File
@@ -1,8 +1,16 @@
import { Meteor } from 'meteor/meteor';
import { Tracker } from 'meteor/tracker';
import { Template } from 'meteor/templating';
import { ReactiveCache } from '/imports/reactiveCache';
import { TAPi18n } from '/imports/i18n';
const { preferredLanguage } = require('/imports/i18n/browserLanguage');
const { ruleTriggerCopula, ruleNameBeforeSubject } = require('/imports/i18n/ruleGrammar');
Template.registerHelper('ruleTriggerCopula', () => ruleTriggerCopula(
TAPi18n.getLanguage(), TAPi18n.__('r-is'),
));
Template.registerHelper('ruleNameBeforeSubject', () => ruleNameBeforeSubject(TAPi18n.getLanguage()));
// We save the user language preference in the user profile, and use that to set
// the language reactively. If the user is not connected we use the language
+4
View File
@@ -83,6 +83,10 @@ Template.inlinedForm.events({
// in Member Settings submits on plain Enter (Shift+Enter for a newline).
const submitOnEnter = !!ReactiveCache.getCurrentUser()?.hasSubmitOnEnter?.();
if (isSubmitKey(evt, { submitOnEnter })) {
// #6700: the enclosing checklist has its own Enter handler. A handled
// submit key must not bubble to it and create a second document.
evt.preventDefault();
evt.stopPropagation();
tpl.find('button[type=submit]').click();
}
},
+5
View File
@@ -46,6 +46,9 @@ hotkeys.filter = (event) => {
if (currentElement instanceof HTMLInputElement || currentElement instanceof HTMLSelectElement || currentElement instanceof HTMLTextAreaElement)
return false;
if (currentElement.closest('button, a[href], summary, [role="button"], [role="tab"], [role="checkbox"]'))
return false;
// We can trigger events!
return true;
};
@@ -165,6 +168,7 @@ hotkeys(shiftNums, (event, handler) => {
}
const currentBoardId = Session.get('currentBoard');
const board = ReactiveCache.getBoard(currentBoardId);
if (!board) return;
const labels = board.labels;
if (MultiSelection.isActive()) {
const cardIds = MultiSelection.getSelectedCardIds();
@@ -188,6 +192,7 @@ hotkeys(nums, (event, handler) => {
return;
}
const board = ReactiveCache.getBoard(currentBoardId);
if (!board) return;
const labels = board.labels;
if (MultiSelection.isActive() && ReactiveCache.getCurrentUser().isBoardMember()) {
const cardIds = MultiSelection.getSelectedCardIds();
Loaded 100 of 735 files, more files were not shown because too many files have changed in this diff. Show more