Compare commits

...
116 Commits
Author SHA1 Message Date
github-actions[bot] 736d308860 Bump versions for v9.78 2026-07-06 09:03:57 +00:00
Lauri Ojansivu 9eca7a3941 Updated ChangeLog. 2026-07-06 11:54:17 +03:00
Lauri Ojansivu af436e16c4 Updated ChangeLog. 2026-07-06 11:52:49 +03:00
Lauri Ojansivu b1b414e850 - **Fix "Internal Server Error" when signing up despite the account being created**:
Registering a new account showed a red "Internal server error" on the sign-up form even
  though the account was created and could sign in — which typically happens when SMTP is not
  configured. Root cause: useraccounts' `ATCreateUserServer` creates the account and then
  calls `Accounts.sendVerificationEmail()` (because `sendVerificationEmail: true`); when SMTP
  is missing/misconfigured that send throws **after** the user row is inserted, and with no
  try/catch the exception leaves the createUser method as an opaque HTTP 500. The verification
  email is best-effort at sign-up, so `Accounts.sendVerificationEmail` is now wrapped to log
  and swallow a transport failure — registration completes and redirects to sign-in — while an
  "already verified" error is re-thrown so the resend-verification flow still reports it. This
  mirrors the [#5706](https://github.com/wekan/wekan/issues/5706) reset-password hardening.
  Covered by `tests/verificationEmail.test.cjs`.

Thanks to Firas-Git and xet7.

Fixes #5672
2026-07-06 11:50:28 +03:00
Lauri Ojansivu 57da3885a2 Updated ChangeLog. 2026-07-06 11:38:57 +03:00
Lauri Ojansivu cb9c897309 - **Fix can not add members to a Linked Card**:
A **linked card** (created by "Link card to this card") is only a placeholder on the board
  that links it — its members are stored on the **real card** it points at (`linkedId`), which
  lives on another board, and `Card.getMembers()` / `assignMember()` / `unassignMember()`
  already read and write that real card. But the member **picker** listed the members of the
  board you were *viewing* the linked card on, not the board the real card lives on. So on a
  board that links a card from another board, the picker offered the wrong set of members and
  toggling them did not behave as a consistent add/remove — "can not add members to the linked
  card". The picker now resolves a linked card to its real card's board and offers *that*
  board's active members (matching where the membership is actually stored), falling back to
  the current board for normal cards or when the real card isn't loaded yet. Extracted the
  target-card/target-board resolution into `models/lib/linkedCardMembers.js`, covered by
  `tests/linkedCardMembers.test.cjs`.

Thanks to ITT5 and xet7 !

Fixes #5676
2026-07-06 11:35:56 +03:00
Lauri Ojansivu 81f07baeb8 Updated ChangeLog. 2026-07-06 11:21:41 +03:00
Lauri Ojansivu 001c258f96 - **Fix can't search numbers in custom fields**:
Searching a board for the value of a **number** or **currency** custom field (e.g. a
  transaction number `2025001`, or a currency amount `123`) found nothing. Those field types
  store their value as a JS **Number** (the inputs save `parseInt(...)` / `Number(...)`), but
  `Board.searchCards()` only matched custom fields with `{ value: <regex> }` — and a MongoDB /
  Minimongo regex only matches **string** values, so it silently skipped every numeric custom
  field. The search now also adds an exact numeric-equality clause when the term is a plain
  number (a comma is accepted as a decimal separator, matching the currency input), so numeric
  custom fields match too; text/title/description matching is unchanged. Card search runs
  against Minimongo on the client, which — like MongoDB — cannot regex a numeric field, so
  equality is the correct cross-environment match. Covered by `tests/cardSearch.test.cjs`.

Thanks to MarcusDger and xet7.

Fixes #5680
2026-07-06 11:19:15 +03:00
Lauri Ojansivu 9d77b9d7b7 Updated ChangeLog. 2026-07-06 10:57:03 +03:00
Lauri Ojansivu 2242da4176 - **Fix "Removed nonexistent document" crash during notification_cleanup**:
The scheduled notification-tray cleanup logged `Exception in removed observeChanges
  callback: Error: Removed nonexistent document …`. The crash itself came from the old
  `cottz:publish-relations` package (since replaced by `reywood:publish-composite`), but the
  cleanup that provoked it still fired one **un-awaited** `removeNotification()` per expired
  notification — a separate `Users.update` `$pull` each time — so a user with K stale
  notifications produced K writes to the Users collection, and every publication that
  republishes user documents re-ran its observers K times in quick bursts (the churn that
  surfaced the removed-document error), while any rejected write went unhandled. The cleanup
  now scans only users that have notifications and prunes each user's stale notifications in a
  single awaited `$pull … $in`. It also removes an activity's notifications only when *every*
  entry for that activity is read and past its removal age (so a freshly re-created unread
  notification sharing an activity id is not dropped), and guards missing/invalid `read`
  timestamps. Covered by `tests/notificationCleanup.test.cjs`.

Thanks to xet7.

Fixes #5685
2026-07-06 10:55:29 +03:00
Lauri Ojansivu 0a3a28ef29 Updated ChangeLog. 2026-07-06 10:46:27 +03:00
Lauri Ojansivu dcf5aa65b0 - **Fix impossible to select another board in rules**:
In the IFTTT-Rules "Move card to the board" and "Link card to the board" actions, the
  board dropdown was empty for some users — the current board included — while colleagues
  in the same company could pick boards normally. Root cause: the dropdown filtered the
  (already access-scoped) client cache with `'members.userId': me`, i.e. it only kept boards
  where the user has a *direct* member entry. A user who reaches a board through an
  Organization, Team or email-domain share — but is not listed individually in
  `board.members` — matched nothing, so the whole selector came up empty. The dropdown now
  filters by the same visibility rule as `Boards.userBoards()` (public OR active member OR
  active org OR active team OR active domain), so org/team/domain-shared boards appear too,
  while archived boards, template containers, the user's templates board and internal helper
  boards stay excluded.

Thanks to Augustin356 and xet7 !

Fixes #5698
2026-07-06 10:43:26 +03:00
Lauri Ojansivu dd3be179ca Updated ChangeLog. 2026-07-06 10:33:15 +03:00
Lauri Ojansivu bc1f149ea3 - **Fix board disappeared after adding another user**:
A board admin adding another user could make the whole board silently vanish from a
  user's board list, with no archive and "nothing out of order" in the logs. Root cause:
  the `setBoardTeams` server method (used by the board Teams/Members management popups)
  blindly overwrote the board's entire `members` array with a snapshot sent by the client.
  When that client's board document was stale — e.g. a member had just been added via
  `inviteUserToBoard` on the server and the change had not yet propagated to the client —
  the overwrite dropped members, and in the worst case the board's own admin, so the board
  no longer matched the board-list publication (which requires an active membership) and
  disappeared. Because a wholesale `$set: { members }` never passes through
  `foreachRemovedMember()`, no `removeBoardMember` activity was logged and no
  card/watcher/star cleanup ran, which is why the logs looked normal. `setBoardTeams` now
  reconciles against the authoritative server-side members instead of trusting the client
  snapshot: it never drops an active admin, keeps every existing member the client still
  lists, adds the members the client introduces, and only removes non-admin members the
  client explicitly omitted (an intentional team-leave) — logging and cleaning up each such
  removal so it is auditable rather than silent.

Thanks to DVNBLMHC and xet7 !

Fixes #5730
2026-07-06 10:33:15 +03:00
github-actions[bot] 0dd11ea573 Bump versions for v9.77 2026-07-06 00:01:08 +00:00
Lauri Ojansivu 5feb83d919 Updated ChangeLog. 2026-07-06 02:51:25 +03:00
Lauri Ojansivu 8980668686 Updated ChangeLog. 2026-07-06 02:47:52 +03:00
Lauri Ojansivu 0d4e48ddd6 Retry snapcraft install in the release-all.yml snap job
The Snap Store intermittently rejects `sudo snap install snapcraft --classic`
with "error: cannot install snapcraft: too many requests" (a 429-style rate
limit) that instantly failed the whole snap job before any build ran. Retry up
to 5 times with 30s backoff so one transient store throttle no longer fails the
release, matching the remote-build retry already in the same job.
2026-07-06 02:47:32 +03:00
Lauri Ojansivu a01b175895 Updated ChangeLog. 2026-07-06 02:37:29 +03:00
Lauri Ojansivu 83f63c9efa Updated Code of Conduct.
Thanks to xet7 !
2026-07-06 02:37:28 +03:00
Lauri Ojansivu 3b031bd901 Updated Code of Conduct.
Thanks to xet7 !
2026-07-06 02:37:28 +03:00
github-actions[bot] e2a7e300c9 Bump versions for v9.76 2026-07-05 23:07:35 +00:00
Lauri Ojansivu 844f59e12e Updated ChangeLog. 2026-07-06 01:57:54 +03:00
Lauri Ojansivu 1a3d7b5da4 Updated translations. 2026-07-06 01:57:00 +03:00
Lauri Ojansivu 3d2bdf4f22 Updated ChangeLog. 2026-07-06 01:50:59 +03:00
Lauri Ojansivu b9fe1f1639 Updated ChangeLog. 2026-07-06 01:35:30 +03:00
Lauri Ojansivu a39a7b90b1 Updated ChangeLog.
Repoint the #6427 upcoming entry to its on-main commit (the old link was
malformed and pointed at an orphaned pre-rebase commit).
2026-07-06 01:28:24 +03:00
Lauri Ojansivu 5d1c979e3b Updated ChangeLog.
Link the #5808 and board-not-found-flicker upcoming entries to their commits.
2026-07-06 01:26:43 +03:00
Lauri Ojansivu d00dc6056b Fix the "Board not found" flicker (stale-while-revalidate for the client board cache)
The client board cache (imports/lib/dataCache.js) re-fetches its value inside a
reactive computation. When the board doc is briefly absent from minimongo (a
subscription stops and restarts, momentarily removing the doc), the empty value
was surfaced immediately, flashing the "Board not found" shell — and on WebKit
throwing a Blaze "Can't select in removed DomRange" error tearing down the card
view. It self-recovers when the doc is re-delivered, so it presents as a flicker,
reliably hit only on Firefox/WebKit timing (which is why it surfaced as
browser-specific Playwright failures in 14-voting-watchers and 24-feature-issues).

Fixed with an opt-in stale-while-revalidate mode on DataCache, enabled only for
getBoard: a transient miss over an already-cached board keeps the last value and
re-checks after a short delay, surfacing an empty result only if the board is
still gone then (a genuine deletion / access loss). First-ever loads and caches
that did not opt in are unchanged. Core decision extracted to the pure
shouldDeferCacheMiss helper with unit tests.

Also hardens the related Playwright specs: a retry in CardPage.openActionsMenu, a
longer visibility budget for the WebKit slow card-render in spec 16, and removes a
reload race in the move-list-right spec (moveListBy fires two un-awaited
updateListSort calls, so an immediate reload read a half-applied order).
2026-07-06 01:26:05 +03:00
Lauri Ojansivu 878a24f586 Fix #5808: linking a card to another linked card made both cards inaccessible
The "Link to this card" target picker only excluded template cards, so an
existing linked card (or a card that links back to the current board) could be
chosen as a link target. That builds a chain of linkedId pointers, but the card
helpers (getTitle/getBoardTitle/getRealId) resolve linkedId only one hop, so
such a card renders as an empty/broken pointer and becomes inaccessible (the
reported freeze). As the reporter suggested, prevent the configuration: only a
real card — not a linked card/linked board, not one of the linking board's own
cards, and not a card that links back to one of them — may be a link target.
Enforced in the picker query and re-checked at creation time via the pure
isLinkableCardTarget guard, mirroring the #3328 parent/subtask cycle guard.
2026-07-06 01:25:39 +03:00
Lauri Ojansivu 6d08181edd Updated ChangeLog. 2026-07-05 23:24:30 +03:00
Lauri Ojansivu d5596f05b7 - **Fix DEFAULT_AUTHENTICATION_METHOD env var ignored, and Admin Panel Layout save hanging.
Two related problems with the default login authentication method.
  - **Env var ignored:** the stored setting was only ever seeded as `password` and
    `DEFAULT_AUTHENTICATION_METHOD` was never applied, so operators setting it (e.g. Kubernetes/Helm
    `DEFAULT_AUTHENTICATION_METHOD: ldap`) saw no effect. Startup now applies the env var
    authoritatively: it seeds the value on a fresh install and, on existing installs, keeps the
    stored `defaultAuthenticationMethod` in sync with the env var on every boot (the operator's env
    is the source of truth), so the method can be configured entirely by env without the Admin Panel.
    The value is normalized (trimmed + lower-cased), so `DEFAULT_AUTHENTICATION_METHOD=LDAP` works.
  - **Layout save hanging / not persisting:** the authentication-method `<select>` is populated by an
    async `Meteor.call`, so clicking **Admin Panel > Layout > Save** before it loaded sent an empty
    value for the **required** `defaultAuthenticationMethod` field, which silently failed validation —
    the save looked stuck and nothing changed. The save now falls back to the currently stored method
    when the select is empty, so a real value is never overwritten by `''`.
  Both paths share one pure helper (`resolveDefaultAuthenticationMethod`) that never resolves to an
  empty string.

Thanks to joe-speedboat and xet7 !

Fixes #5879
2026-07-05 23:22:16 +03:00
Lauri Ojansivu 22b280a18e Updated ChangeLog. 2026-07-05 23:13:36 +03:00
Lauri Ojansivu 2e7c4ede2a - **[Reduce card flicker on drag by only writing changed fields on a card move](https://github.com/wekan/wekan/issues/6430)** (#6430):
`Card.move()` wrote `boardId`/`swimlaneId`/`listId` into the update unconditionally, even for a
  same-board drag to another list (the reported case). Keeping `boardId` in the `$set` on every drag
  re-ran the `boardId`-gated `Cards.after.update` hook that re-syncs the card's checklists and
  checklist items via `multi` updates, ran the cross-board consistency guard and the
  `denyCrossBoardMove` deny-rule DB lookup, and invalidated more reactive dependents than
  necessary — server work and reactivity churn that contributed to a ~1s card flicker on large
  boards. `Card.move()` now writes **only the fields that actually change** (via the pure
  `computeCardMoveModifier` helper) and skips the write entirely when a card is dropped back in the
  same place, so a same-board move no longer touches boardId or the cross-board hooks. The
  `moveCard`/`moveCardBoard` activity generators already re-check `doc.X !== oldX`, so trimming the
  modifier does not drop any activity. Note: this reduces the drag-time work behind the flicker; the
  residual reactive re-render cost on very large boards is a separate performance topic.

Thanks to mimZD and xet7 !

Fixes #6430
2026-07-05 23:12:16 +03:00
Lauri Ojansivu ed77abd90d Updated ChangeLog. 2026-07-05 22:56:01 +03:00
Lauri Ojansivu 45fb547947 - **Fix thousands of unsolicited empty "Default" swimlanes created on some boards**:
`Board.getDefaultSwimline()`/`getDefaultSwimlineAsync()` self-heal a missing default swimlane by
  reading the board's swimlanes and inserting one if none exist. That check-then-insert is a race:
  concurrent or repeated server calls for a swimlane-less board each saw zero swimlanes and each
  inserted a new one, so some boards accumulated 30 000+ empty "Default" swimlanes and became
  unloadable (the `key 'default (en)' returned an object instead of string` log is a harmless i18n
  side effect — the title correctly falls back to the string `Default`). Follow-up to the
  client-side [#6382](https://github.com/wekan/wekan/issues/6382) fix, which only stopped the
  browser from auto-creating them. Fixed by making the server self-heal **idempotent**: the default
  swimlane is now upserted with a deterministic `_id` (`<boardId>-default`), so the `_id` unique
  index guarantees at most one default swimlane per board no matter how many times, or how
  concurrently, the getters run. `archived`/`type` are set explicitly in the `$setOnInsert` because
  their schema autoValue/defaultValue only fire on insert, not upsert. Note: this prevents new
  duplicates; boards that already accumulated thousands still need a one-off cleanup.

Thanks to brlin-tw and xet7 !

Fixes #6429
2026-07-05 22:54:13 +03:00
Lauri Ojansivu 477ad737d3 Updated ChangeLog. 2026-07-05 22:30:37 +03:00
Lauri Ojansivu a2802a850b - **Release workflow: publish the Helm chart only after the Docker image is pushed**:
In `.github/workflows/release-all.yml` the `charts` job now depends on the `docker` job
  (`needs: docker`) instead of running in parallel right after `bump`. GitHub Actions runs a job
  only when all of its `needs` jobs succeed, so the wekan/charts Helm chart is published only after
  the multi-arch image is live on Docker Hub / Quay.io / GHCR (and is skipped if `docker` fails).
  This prevents ArtifactHub from scanning a freshly published chart whose image tag does not exist
  yet and emailing the maintainer about the missing Docker image.

Thanks to xet7 !
2026-07-05 22:29:23 +03:00
Lauri Ojansivu 5cbe27be7e Updated ChangeLog. 2026-07-05 22:23:36 +03:00
Lauri Ojansivu 8b21158736 - **Fix [#6427](https://github.com/wekan/wekan/issues/6427): notification emails linked to
`/b/undefined/board/<cardId>` instead of the real board.** On the server
  `ReactiveCache.getBoard()` is async and returns a Promise, but `Cards.board()` did not await it,
  so the synchronous `Card.originRelativeUrl()`/`absoluteUrl()` interpolated a Promise —
  `board._id` and `board.slug` were `undefined`, producing `/b/undefined/board/<cardId>` in
  card activity notification emails (the client UI was unaffected because `this.board()` is
  synchronous there). Fixed by making `Card.originRelativeUrl(board)`/`absoluteUrl(board)` accept an
  already-resolved board and fall back to `this.boardId` (always available synchronously) when the
  board is a Promise, and by passing the awaited board from `server/models/activities.js` so the
  correct board id and slug are used.

Thanks to titver968 and xet7 !

Fixes #6427
2026-07-05 22:23:36 +03:00
github-actions[bot] 651c6f8fb6 Bump versions for v9.75 2026-07-05 19:05:05 +00:00
Lauri Ojansivu 5b67312f0f Updated ChangeLog. 2026-07-05 21:55:15 +03:00
Lauri Ojansivu 1a222c4477 - **[ScannerBleed](https://github.com/wekan/wekan/security/advisories/GHSA-x3xm-pxrv-jg7p)
— shell injection (RCE) via a malicious upload filename in the external antivirus scanner command path**
  ([GHSA-x3xm-pxrv-jg7p](https://github.com/wekan/wekan/security/advisories/GHSA-x3xm-pxrv-jg7p),
  CWE-78 OS Command Injection). Same RCE class as
  [AvatarBleed](https://wekan.fi/hall-of-fame/avatarbleed/) (CVE-2026-52891, GHSA-35j7-h385-2q9g)
  and its follow-up regression (CVE-2026-53447 / GHSA-qfqv-42qw-vvwh area), but in a code path that
  was **never** covered by those fixes.
  In `models/fileValidation.js`, when an admin has configured an external scanner (antivirus)
  command line with a `{file}` placeholder, the uploaded file path was interpolated into the command
  and run through `asyncExec` (`promisify(exec)`), which spawns `/bin/sh -c` and interprets **all**
  shell metacharacters:
  ```js
  await asyncExec(externalCommandLine.replace("{file}", '"' + fileObj.path + '"'));
  ```
  Wrapping the path in double quotes is not a shell boundary — inside double quotes the shell still
  expands `$(...)`, backticks and `\`, so a filename such as `` a`id`.png `` or `$(touch /tmp/pwn).png`
  escaped the argument and executed as the Wekan server process. Any **authenticated** user who can
  upload an attachment could trigger it, on servers that have an external scanner configured. Unlike
  the sibling MIME-detection path (`detectMimeFromFile`, which already uses `execFile` with no shell)
  and unlike the AvatarBleed fix (which strips non-alphanumeric characters from the filename), this
  scanner path had **zero** sanitization.
  - **Fixed** by POSIX single-quote-escaping the interpolated file path via a new `shellQuote()`
    helper (wrap in single quotes, escape embedded `'` as `'\''`). Inside single quotes the shell
    interprets no metacharacters, so a malicious filename can no longer break out of the argument or
    inject commands, while the admin's arbitrary command line and the exact on-disk path are both
    preserved. CVSS:3.1 9.9 Critical (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H).
  - Affected Wekan v9.06 and earlier through the current release; fixed at the upcoming WeKan release.
    Reported by **DavidCarliez**.

Thanks to DavidCarliez and xet7 !
2026-07-05 21:55:15 +03:00
github-actions[bot] ca9bcfa4ee Bump versions for v9.74 2026-07-05 15:08:00 +00:00
Lauri Ojansivu 4da5b4eb96 Updated ChangeLog. 2026-07-05 17:55:45 +03:00
Lauri Ojansivu 8c4044ce6c Updated ChangeLog. 2026-07-05 17:53:28 +03:00
Lauri Ojansivu b46d9588c7 Fix translations at Login and Register pages.
Thanks to xet7 !
2026-07-05 17:52:05 +03:00
Lauri Ojansivu 96773e7b1d Updated ChangeLog. 2026-07-05 16:51:28 +03:00
Lauri OjansivuandClaude Opus 4.8 5a80f4f6ce Updated ChangeLog.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 16:49:23 +03:00
Lauri OjansivuandClaude Opus 4.8 b9f9390d04 Server-side Mocha suite: fixed a startup crash and the 44 latent failures it had been hiding
- imports/i18n/i18n.test.js crashed the whole run at load: chai 6.x plugins (sinon-chai,
  chai-as-promised) are ESM-only, so use(require('sinon-chai')) handed chai.use() a module
  namespace instead of the plugin function ("fn is not a function"). Now imports the default
  export.
- That unmasked a second load crash - PositionHistory.helpers is not a function: the
  meteor test entry (server/lib/tests/index.js) never ran the .helpers / .attachSchema shim
  that server/main.js bootstraps, so the first model to call Collection.helpers({...}) threw.
  The shim is now imported first in the test entry.
- With the suite finally running, 44 server tests failed because meteor test only loads what
  the specs import (not the app's /server/imports). The specs now import the files that
  register the methods / globals under test (cards.vote / cards.pokerVote, api.attachment.*,
  cloneBoard, getBackgroundImageURL, applyListWidth, updateListSort, moveChecklist,
  userPositionHistory.*, archiveBoard, sendSMTPTestEmail, and the Attachments global). Also
  fixed genuine test bugs: the cards.vote / cards.pokerVote specs were written synchronously
  against async methods; the header-login trust specs restored env vars with
  process.env.X = undefined (which stores the string "undefined" and shadowed the trusted-IP
  allowlist, making every trusted source read as untrusted); the DnsBleed decimal-loopback
  matcher assumed the integer host survived URL normalisation; and the dependencies-OpenAPI
  spec could not locate its source file from the built bundle. The two cards.archive /
  cards.move specs tested Meteor methods that do not exist (archive / move are Minimongo
  document helpers secured by Cards.allow / Cards.deny, already covered by the cards security
  tests) and were removed. Server-side Mocha is now 409 passing, 0 failing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 16:48:58 +03:00
Lauri OjansivuandClaude Opus 4.8 f5a4ece294 Playwright E2E: fixed three cross-process-contention flakes in the parallel run
The Chromium / Firefox / WebKit browser jobs run as separate processes against ONE
shared server + DB, so specs that used fixed identifiers or global cleanups raced
each other:

- 26-shared-templates.e2e.js seeded a fixed email domain (usera@acme-e2e.invalid) in
  all three browsers, hitting E11000 duplicate key on the unique emails.address index.
  Now uses a unique-per-run token for the org / team / domain and template titles.
- 38-impersonation.e2e.js cleaned up with a global
  deleteMany({ reason: 'clickedImpersonate' }) that deleted another browser's in-flight
  audit record mid-poll. Scoped the cleanup to the test's own adminId.
- 32-org-team-feature-toggles.e2e.js exercises setAllOrgsFeature / setAllTeamsFeature,
  which do a global updateMany({}) across every org / team, so two browsers clobbered
  each other's rows. These browser-agnostic server-method tests now run in a single
  project (Chromium); Firefox / WebKit skip them.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 16:48:50 +03:00
Lauri Ojansivu c1ddf989a2 Updated ChangeLog. 2026-07-05 14:52:10 +03:00
Lauri Ojansivu c48ecb1d88 Fix tests.
Thanks to xet7 !
2026-07-05 14:50:59 +03:00
Lauri Ojansivu c664fe863c Updated translations. 2026-07-05 14:11:44 +03:00
Lauri Ojansivu 38f571b388 Updated ChangeLog. 2026-07-05 14:10:42 +03:00
Lauri Ojansivu 1e7de6d776 Card Settings popup options combined to same lines, and added more options.
Thanks to xet7 !
2026-07-05 14:09:38 +03:00
Lauri Ojansivu 6d47dc3f4a Updated translations. 2026-07-05 13:30:49 +03:00
Lauri Ojansivu 4756ca4226 Updated ChangeLog. 2026-07-05 13:27:46 +03:00
Lauri Ojansivu bb440b0d7b Board Settings / Card Settings / Checklist item count (0/0) on minicard. Default: Off.
Thanks to carl-unique and xet7 !

Fixes #6431
2026-07-05 13:25:00 +03:00
Lauri Ojansivu 89cfe1529f Updated ChangeLog. 2026-07-05 12:50:30 +03:00
Lauri Ojansivu 236fdf9338 Each run all tests now has logs at ../log/YYYY-MM-DD_HH-MM-SS/
Thanks to xet7 !
2026-07-05 12:48:21 +03:00
Lauri Ojansivu 5c36b2292b Updated ChangeLog. 2026-07-05 12:29:14 +03:00
Lauri Ojansivu 4eebdb4278 Fix tests.
Thanks to xet7 !
2026-07-05 12:21:47 +03:00
Lauri Ojansivu 4533268418 Update vscode sandbox.
Thanks to xet7 !
2026-07-05 12:12:24 +03:00
Lauri Ojansivu c997c12f88 Updated tests 2026-07-05 11:52:12 +03:00
Lauri Ojansivu 36efd9c988 Fix parallel tests.
Thanks to xet7 !
2026-07-05 11:30:26 +03:00
Lauri Ojansivu 267bfc7229 Script to be executeable 2026-07-05 11:03:13 +03:00
Lauri Ojansivu 405a7b72e9 Updated ChangeLog. 2026-07-05 11:02:01 +03:00
Lauri Ojansivu 7d416cc7cc Run all tests at parallel or sequential.
Thanks to xet7 !
2026-07-05 11:00:43 +03:00
Lauri Ojansivu 7929ab27cb Updated ChangeLog. 2026-07-05 10:21:20 +03:00
Lauri Ojansivu 7bbd1a3fad Fix ExcelBleed.
Thanks to sec-reex and xet7 !
2026-07-05 10:20:08 +03:00
Lauri Ojansivu 0f9bd4f9f9 Reverted JQuery 4.0.0 that did not work back to JQuery 3.7.1.
Thanks to xet7 !
2026-07-05 10:02:37 +03:00
Lauri Ojansivu a7ce6690a5 Merge pull request #6415 from wekan/dependabot/npm_and_yarn/babel/runtime-8.0.0
build(deps): bump @babel/runtime from 7.29.7 to 8.0.0
2026-07-05 09:56:51 +03:00
dependabot[bot] 82bd4ff39d build(deps): bump @babel/runtime from 7.29.7 to 8.0.0
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.29.7 to 8.0.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v8.0.0/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-05 06:55:17 +00:00
Lauri Ojansivu 721c61bef5 Merge pull request #6417 from wekan/dependabot/npm_and_yarn/jquery-4.0.0
Bump jquery from 3.7.1 to 4.0.0
2026-07-05 09:54:49 +03:00
Lauri Ojansivu 7a25546da7 Merge pull request #6435 from wekan/dependabot/npm_and_yarn/i18next-26.3.4
build(deps): bump i18next from 25.10.10 to 26.3.4
2026-07-05 09:53:13 +03:00
Lauri Ojansivu 2c1d3a3922 Merge pull request #6414 from wekan/dependabot/npm_and_yarn/tweedegolf/sab-adapter-amazon-s3-3.0.4
Bump @tweedegolf/sab-adapter-amazon-s3 from 1.0.20 to 3.0.4
2026-07-05 09:52:52 +03:00
Lauri Ojansivu b4d6cc741c Merge pull request #6438 from wekan/dependabot/npm_and_yarn/azure/storage-blob-12.33.0
build(deps): bump @azure/storage-blob from 12.32.0 to 12.33.0
2026-07-05 09:49:31 +03:00
Lauri Ojansivu 5311f80711 Merge pull request #6436 from wekan/dependabot/npm_and_yarn/tests/playwright/playwright/test-1.61.1
build(deps-dev): bump @playwright/test from 1.61.0 to 1.61.1 in /tests/playwright
2026-07-05 09:48:19 +03:00
Lauri Ojansivu abed969a96 Merge pull request #6437 from wekan/dependabot/npm_and_yarn/tests/playwright/mongodb-7.4.0
build(deps): bump mongodb from 7.3.0 to 7.4.0 in /tests/playwright
2026-07-05 09:47:58 +03:00
Lauri Ojansivu 36e3cf30d3 Merge pull request #6428 from wekan/dependabot/github_actions/actions/cache-6
build(deps): bump actions/cache from 5 to 6
2026-07-05 09:47:10 +03:00
Lauri Ojansivu eaadbc6dd1 Merge pull request #6434 from wekan/dependabot/github_actions/docker/build-push-action-7.3.0
build(deps): bump docker/build-push-action from 7.2.0 to 7.3.0
2026-07-05 09:46:41 +03:00
Lauri Ojansivu 0aacc989b7 Merge pull request #6433 from wekan/dependabot/github_actions/docker/metadata-action-6.2.0
build(deps): bump docker/metadata-action from 6.1.0 to 6.2.0
2026-07-05 09:46:32 +03:00
Lauri Ojansivu 77adfb28c9 Merge pull request #6432 from wekan/dependabot/github_actions/docker/login-action-4.4.0
build(deps): bump docker/login-action from 4.2.0 to 4.4.0
2026-07-05 09:46:23 +03:00
Lauri Ojansivu a9d8261d80 Updated ChangeLog. 2026-07-05 09:38:48 +03:00
Lauri Ojansivu df3f519e99 Update to Meteor 3.5.
Thanks to Meteor developers !
2026-07-05 09:36:34 +03:00
Lauri Ojansivu d68364befe Updated translations. 2026-07-05 09:35:02 +03:00
Lauri Ojansivu 6094979d4e Updated ChangeLog. 2026-07-05 09:33:14 +03:00
Lauri Ojansivu ef845fe4a0 Fix DnsBleed.
Thanks to 4n207 and xet7 !
2026-07-05 09:30:12 +03:00
dependabot[bot] ce8fc8e392 build(deps): bump @azure/storage-blob from 12.32.0 to 12.33.0
Bumps [@azure/storage-blob](https://github.com/Azure/azure-sdk-for-js/tree/HEAD/sdk/storage/storage-blob) from 12.32.0 to 12.33.0.
- [Release notes](https://github.com/Azure/azure-sdk-for-js/releases)
- [Changelog](https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/storage/storage-blob/CHANGELOG.md)
- [Commits](https://github.com/Azure/azure-sdk-for-js/commits/@azure/storage-blob_12.33.0/sdk/storage/storage-blob)

---
updated-dependencies:
- dependency-name: "@azure/storage-blob"
  dependency-version: 12.33.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-04 20:32:53 +00:00
dependabot[bot] 402b79c340 build(deps): bump mongodb from 7.3.0 to 7.4.0 in /tests/playwright
Bumps [mongodb](https://github.com/mongodb/node-mongodb-native) from 7.3.0 to 7.4.0.
- [Release notes](https://github.com/mongodb/node-mongodb-native/releases)
- [Changelog](https://github.com/mongodb/node-mongodb-native/blob/main/HISTORY.md)
- [Commits](https://github.com/mongodb/node-mongodb-native/compare/v7.3.0...v7.4.0)

---
updated-dependencies:
- dependency-name: mongodb
  dependency-version: 7.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-04 20:32:51 +00:00
dependabot[bot] 08ba9b02f2 build(deps-dev): bump @playwright/test in /tests/playwright
Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.61.0 to 1.61.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.61.0...v1.61.1)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.61.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-04 20:32:44 +00:00
dependabot[bot] 3a016be97d build(deps): bump i18next from 25.10.10 to 26.3.4
Bumps [i18next](https://github.com/i18next/i18next) from 25.10.10 to 26.3.4.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v25.10.10...v26.3.4)

---
updated-dependencies:
- dependency-name: i18next
  dependency-version: 26.3.4
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-04 20:32:38 +00:00
dependabot[bot] 56b09f9102 build(deps): bump docker/build-push-action from 7.2.0 to 7.3.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 7.2.0 to 7.3.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/f9f3042f7e2789586610d6e8b85c8f03e5195baf...53b7df96c91f9c12dcc8a07bcb9ccacbed38856a)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 7.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-04 20:32:31 +00:00
dependabot[bot] dccf16647a build(deps): bump docker/metadata-action from 6.1.0 to 6.2.0
Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 6.1.0 to 6.2.0.
- [Release notes](https://github.com/docker/metadata-action/releases)
- [Commits](https://github.com/docker/metadata-action/compare/80c7e94dd9b9319bd5eb7a0e0fe9291e23a2a2e9...dc802804100637a589fabce1cb79ff13a1411302)

---
updated-dependencies:
- dependency-name: docker/metadata-action
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-04 20:32:23 +00:00
dependabot[bot] 9c2ff81b12 build(deps): bump docker/login-action from 4.2.0 to 4.4.0
Bumps [docker/login-action](https://github.com/docker/login-action) from 4.2.0 to 4.4.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/650006c6eb7dba73a995cc03b0b2d7f5ca915bee...af1e73f918a031802d376d3c8bbc3fe56130a9b0)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-04 20:32:19 +00:00
dependabot[bot] af8bba27c0 build(deps): bump actions/cache from 5 to 6
Bumps [actions/cache](https://github.com/actions/cache) from 5 to 6.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-27 20:32:19 +00:00
github-actions[bot] 8f83ece2ed Bump versions for v9.73 2026-06-26 03:18:47 +00:00
Lauri Ojansivu ac8e39daca Updated ChangeLog. 2026-06-26 06:13:08 +03:00
Lauri OjansivuandClaude Opus 4.8 3c07777722 docs(changelog): repoint #6426/dragscroll links to post-rebase hashes
A git pull --rebase inserted upstream commit 17c62ccdf (Bump versions for
v9.72) under this session's work, rewriting its commit hashes. The CHANGELOG
still linked the pre-rebase hashes (37ac65e37, a4cce9a53), now orphaned and
not on main. Repoint to the rebased commits 219ee659e and 88f353dc1.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 05:08:35 +03:00
Lauri OjansivuandClaude Opus 4.8 0e10d24bef docs(changelog): add login/register mobile-scroll fix entry (4a7df3745)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 05:07:38 +03:00
Lauri OjansivuandClaude Opus 4.8 4a7df37459 fix: login/register page not scrollable on mobile — sign-up link unreachable
On phones body.mobile-mode pins <body> to position:fixed + height:100vh (an
iOS board-view anti-bounce fix). The auth pages (userFormsLayout) have no
inner #content scroller, and .auth-layout/.auth-dialog were sized to the
viewport height, so the page was trapped at 100vh: the content below the
form — the sign-up/sign-in link, legal notice and language selector — could
not be scrolled into view, and the on-screen keyboard covered it.

userFormsLayout now tags <body> with .userform-layout while mounted, and CSS
lets those pages scroll as a normal document on mobile (position:static,
height:auto, min-height:100vh) with the auth layout/dialog growing to their
content. Scoped to .userform-layout so the board-view mobile lock is
unchanged. Removed on destroy.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 05:07:22 +03:00
Lauri OjansivuandClaude Opus 4.8 f9b5de0e8e docs(changelog): link all-pages dragscroll entry to fix commit a4cce9a53
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 04:55:26 +03:00
Lauri OjansivuandClaude Opus 4.8 88f353dc1f fix: drag-to-scroll on all pages via central route-aware autorun
Page drag-to-scroll was wired into only boardsList (All Boards), myCards and
userFormsLayout (Login/Register). Every other defaultLayout page — Due Cards,
Global Search, Public, Bookmarks, Broken Cards, Settings, People, Admin
Reports, Attachments, Translation, Import, board Rules, Not Found — had no
page drag-scroll, and the per-template enable/disable calls fought each other
when navigating between two non-board pages (one template's onDestroyed
removed the class the next template's onRendered expected).

Replace them with a single route-aware autorun in defaultLayout (the
persistent shell that owns #content): non-board routes tag the real scroll
container (<body> + #content, so it works in both desktop and mobile mode),
and board-canvas routes (board/board-short/card) leave page tagging off so
their own .board-canvas.dragscroll handles dragging without double-scrolling
#content. Login/Register keep their own enable/disable (userFormsLayout has
no #content).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 04:55:26 +03:00
Lauri OjansivuandClaude Opus 4.8 50525f6fd1 docs(changelog): link Upcoming #6426 + dragscroll entries to fix commit 37ac65e37
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 04:55:26 +03:00
Lauri OjansivuandClaude Opus 4.8 219ee659e9 fix: finish reverting oversized mobile UI (#6426) + fix page dragscroll
#6426: the first revert only cleaned boardsList.css. The same forced
"2x/3x bigger on mobile" rules remained in header.css (#header-quick-access
logo/quick-access bar) and boardBody.css (#content — which the All Boards
list and the board view render inside) plus the iPhone card-details body
text. All neutralized to normal size; the iPhone-12-mini header blocks that
had grown tall/wrapped to fit 3x text are back to a compact single row. The
#6419 mobile touch-target icon sizes in the card-details header are kept.

dragscroll: enablePageDragscroll/disablePageDragscroll tagged only <body>,
but on phones body.mobile-mode is position:fixed and the real scroll
container becomes #content, so Login/Register/All Boards could not drag-
scroll. Now tag whichever element actually scrolls — both <body> and
#content when present — so only the overflowing one scrolls. The touch
helper already prefers the nearer #content.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 04:55:26 +03:00
github-actions[bot] 17c62ccdf6 Bump versions for v9.72 2026-06-25 23:26:37 +00:00
Lauri Ojansivu 14de82ad2d Updated ChangeLog. 2026-06-26 02:15:49 +03:00
Lauri Ojansivu e92f4f9819 Updated translations. 2026-06-26 02:12:33 +03:00
Lauri Ojansivu 08aac777fb docs(changelog): generalize #6426 wording to mobile UI scope 2026-06-26 02:10:26 +03:00
Lauri Ojansivu b84caaad26 docs(changelog): link #6426 entry to fix commit\n\nFixes #6426 2026-06-26 02:09:06 +03:00
Lauri Ojansivu f7a2a3ace5 fix: revert oversized mobile All Boards/iPhone 12 mini UI\n\nFixes #6426 2026-06-26 02:08:49 +03:00
Lauri OjansivuandClaude Opus 4.8 88a2e96db3 CHANGELOG: Upcoming — api.py addcustomfieldtoboard empty-settings fix
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 03:05:02 +03:00
Lauri OjansivuandClaude Opus 4.8 487cf3f963 api.py: fix addcustomfieldtoboard crash on empty settings
json.loads('') on an empty settings argument raised JSONDecodeError before the
request was sent (a bug api.py's own header flagged). Default empty settings to
{} and send it as valid JSON via json.dumps instead of str(dict) (which produced
invalid JSON with single quotes). Verified: both empty and object settings create
the custom field.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 03:03:10 +03:00
dependabot[bot] f188572b70 Bump jquery from 3.7.1 to 4.0.0
Bumps [jquery](https://github.com/jquery/jquery) from 3.7.1 to 4.0.0.
- [Release notes](https://github.com/jquery/jquery/releases)
- [Changelog](https://github.com/jquery/jquery/blob/main/changelog.md)
- [Commits](https://github.com/jquery/jquery/compare/3.7.1...4.0.0)

---
updated-dependencies:
- dependency-name: jquery
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-22 09:06:11 +00:00
dependabot[bot] fb9380c0d0 Bump @tweedegolf/sab-adapter-amazon-s3 from 1.0.20 to 3.0.4
Bumps [@tweedegolf/sab-adapter-amazon-s3](https://github.com/tweedegolf/storage-abstraction) from 1.0.20 to 3.0.4.
- [Release notes](https://github.com/tweedegolf/storage-abstraction/releases)
- [Changelog](https://github.com/tweedegolf/storage-abstraction/blob/master/changelog.md)
- [Commits](https://github.com/tweedegolf/storage-abstraction/commits/v3.0.4)

---
updated-dependencies:
- dependency-name: "@tweedegolf/sab-adapter-amazon-s3"
  dependency-version: 3.0.4
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-22 08:33:08 +00:00
252 changed files with 5525 additions and 1433 deletions

No files matched your search

+3 -3
View File
@@ -38,7 +38,7 @@ jobs:
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
@@ -48,14 +48,14 @@ jobs:
# https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@80c7e94dd9b9319bd5eb7a0e0fe9291e23a2a2e9
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
+6 -6
View File
@@ -27,14 +27,14 @@ jobs:
cache: 'npm'
- name: Cache Meteor installation
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.meteor
key: meteor-${{ hashFiles('.meteor/release') }}-${{ hashFiles('.meteor/packages') }}
restore-keys: meteor-
- name: Cache Meteor build (.meteor/local)
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: .meteor/local
key: meteor-local-unit-${{ hashFiles('.meteor/versions') }}
@@ -98,14 +98,14 @@ jobs:
cache: 'npm'
- name: Cache Meteor installation
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.meteor
key: meteor-${{ hashFiles('.meteor/release') }}-${{ hashFiles('.meteor/packages') }}
restore-keys: meteor-
- name: Cache Meteor build (.meteor/local)
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: .meteor/local
key: meteor-local-e2e-${{ hashFiles('.meteor/versions') }}
@@ -227,14 +227,14 @@ jobs:
cache: 'npm'
- name: Cache Meteor installation
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.meteor
key: meteor-${{ hashFiles('.meteor/release') }}-${{ hashFiles('.meteor/packages') }}
restore-keys: meteor-
- name: Cache Meteor build (.meteor/local)
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: .meteor/local
key: meteor-local-regression-${{ hashFiles('.meteor/versions') }}
+25 -8
View File
@@ -22,7 +22,9 @@ name: Release All Platforms
# commits and pushes the bump to wekan/wekan main
# - prepare: tags the bumped main as v<new_version> and extracts release notes
# - website: updates the wekan/wekan.fi repo (install page + API docs) and pushes
# - charts: updates and publishes the wekan/charts Helm chart and pushes
# - charts: updates and publishes the wekan/charts Helm chart and pushes,
# only AFTER the `docker` job has published the image (skipped if
# docker fails)
# - build-*: builds the amd64 bundle (full Meteor 3 build), then rebuilds native
# modules for arm64 from that amd64 base
# - release: creates the GitHub Release with the newest CHANGELOG.md notes and
@@ -210,12 +212,14 @@ jobs:
cd ..
./wekan/releases/release-website.sh "${{ inputs.old_version }}" "${{ inputs.new_version }}"
# ─── 1c. Update and publish the Helm chart repo (parallel) ──────────────────
# ─── 1c. Update and publish the Helm chart repo (after docker) ──────────────
# Bumps the WeKan version in wekan/charts, packages the chart and publishes it
# to the gh-pages Helm index, then pushes both branches. Runs in parallel with
# the platform builds; packaging the chart does not need the built artifacts.
# to the gh-pages Helm index, then pushes both branches. Runs only AFTER the
# `docker` job succeeds: the chart points users at the freshly published
# multi-arch image, so we don't advertise a new chart version until that image
# is actually on the registries. If `docker` fails, this job is skipped.
charts:
needs: bump
needs: docker
runs-on: ubuntu-latest
steps:
- name: Checkout wekan repo (for releases/release-charts.sh + version refs)
@@ -265,14 +269,14 @@ jobs:
ref: refs/tags/v${{ needs.prepare.outputs.version }}
- name: Cache Meteor installation
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.meteor
key: meteor-${{ hashFiles('.meteor/release') }}-${{ hashFiles('.meteor/packages') }}
restore-keys: meteor-
- name: Cache npm packages
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.npm
key: npm-${{ hashFiles('package-lock.json') }}
@@ -796,7 +800,20 @@ jobs:
fetch-depth: 0
- name: Install snapcraft
run: sudo snap install snapcraft --classic
# The Snap Store intermittently rejects the install with
# 'error: cannot install "snapcraft": too many requests' (a 429-style
# rate limit) that instantly fails the whole snap job before any build.
# Retry a few times so one transient store throttle does not fail the
# release (same spirit as the remote-build retry below).
run: |
set -uo pipefail
for i in 1 2 3 4 5; do
sudo snap install snapcraft --classic && exit 0
echo "snapcraft install attempt $i/5 failed (Snap Store throttle?); retrying in 30s..."
sleep 30
done
echo "::error::snapcraft install failed after 5 attempts (Snap Store rate limit)."
exit 1
- name: Provide Launchpad credentials for remote-build
env:
+8 -8
View File
@@ -6,7 +6,7 @@
meteor-base@1.5.2
# Build system
ecmascript@0.18.1-rc350.0
ecmascript@0.18.1
standard-minifier-js@3.2.0
rspack@1.1.0
@@ -16,11 +16,11 @@ blaze@3.0.2
aldeed:collection2
aldeed:schema-index@4.0.0-beta.5
reywood:publish-composite
mongo@2.4.0-rc350.2
mongo@2.4.0
# Account system
accounts-password@3.3.0-rc350.2
accounts-express@1.0.0-rc350.2
accounts-password@3.3.0
accounts-express@1.0.0
communitypackages:core
communitypackages:unstyled
communitypackages:flow-routing
@@ -37,7 +37,7 @@ wekan-accounts-oidc
check@1.5.0
random@1.2.2
reactive-dict@1.3.2
session@1.2.3-rc350.2
session@1.2.3
tracker@1.3.4
audit-argument-checks@1.0.8
@@ -45,7 +45,7 @@ audit-argument-checks@1.0.8
ostrio:i18n
reactive-var@1.0.13
shell-server@0.7.0
email@3.2.0-rc350.2
email@3.2.0
dynamic-import@0.7.4
wekan-markdown
quave:synced-cron
@@ -55,8 +55,8 @@ ostrio:files
meteortesting:mocha@3.0.0
matb33:collection-hooks
service-configuration@1.3.5
minifier-css@2.0.2-rc350.2
ejson@1.2.0-rc350.2
minifier-css@2.0.2
ejson@1.2.0
logging@1.3.6
wekan-fullcalendar
wekan-fontawesome
+1 -1
View File
@@ -1 +1 @@
METEOR@3.5-rc.2
METEOR@3.5
+28 -28
View File
@@ -1,44 +1,44 @@
accounts-base@3.3.0-rc350.2
accounts-express@1.0.0-rc350.2
accounts-oauth@1.4.7-rc350.2
accounts-password@3.3.0-rc350.2
accounts-base@3.3.0
accounts-express@1.0.0
accounts-oauth@1.4.7
accounts-password@3.3.0
aldeed:collection2@4.2.0
aldeed:schema-index@4.0.0
aldeed:simple-schema@1.13.1
allow-deny@2.1.0
audit-argument-checks@1.0.8
autoupdate@2.0.1
babel-compiler@7.14.1-rc350.0
babel-compiler@7.14.1
babel-runtime@1.5.2
base64@1.0.14-rc350.2
binary-heap@1.0.13-rc350.2
base64@1.0.14
binary-heap@1.0.13
blaze@3.0.3
blaze-tools@2.0.1
boilerplate-generator@2.1.0
caching-compiler@2.0.1
caching-html-compiler@2.0.1
callback-hook@1.8.0-rc350.2
callback-hook@1.8.0
check@1.5.0
communitypackages:core@2.0.3
communitypackages:flow-routing@2.1.0
communitypackages:unstyled@2.0.1
core-runtime@1.0.0
ddp@1.4.2
ddp-client@3.3.0-rc350.2
ddp-common@1.4.5-rc350.2
ddp-rate-limiter@1.3.0-rc350.2
ddp-server@3.3.0-rc350.2
ddp-client@3.3.0
ddp-common@1.4.5
ddp-rate-limiter@1.3.0
ddp-server@3.3.0
diff-sequence@1.1.3
dynamic-import@0.7.4
ecmascript@0.18.1-rc350.0
ecmascript@0.18.1
ecmascript-runtime@0.8.3
ecmascript-runtime-client@0.13.0
ecmascript-runtime-server@0.11.1
ejson@1.2.0-rc350.2
email@3.2.0-rc350.2
ejson@1.2.0
email@3.2.0
es5-shim@4.8.1
facts-base@1.0.2
fetch@0.2.0-rc350.2
fetch@0.2.0
geojson-utils@1.0.12
hot-code-push@1.0.5
html-tools@2.0.1
@@ -53,23 +53,23 @@ lai:collection-extensions@1.0.0
localstorage@1.2.1
logging@1.3.6
matb33:collection-hooks@2.1.0
meteor@2.3.1-rc350.2
meteor@2.3.1
meteor-base@1.5.2
meteortesting:browser-tests@1.8.0
meteortesting:mocha@3.3.0
meteortesting:mocha-core@8.2.0
minifier-css@2.0.2-rc350.2
minifier-js@3.2.1-rc350.0
minimongo@2.2.0-rc350.2
minifier-css@2.0.2
minifier-js@3.2.1
minimongo@2.2.0
modern-browsers@0.2.3
modules@0.20.3
modules-runtime@0.13.2
mongo@2.4.0-rc350.2
mongo@2.4.0
mongo-decimal@0.2.0
mongo-dev-server@1.1.1
mongo-id@1.0.9
npm-mongo@6.16.1
oauth@3.0.4-rc350.2
oauth@3.0.4
oauth2@1.3.3
observe-sequence@2.0.1
ordered-dict@1.2.0
@@ -82,7 +82,7 @@ promise@1.0.0
quave:synced-cron@2.4.0
raix:eventemitter@1.0.0
random@1.2.2
rate-limit@1.2.0-rc350.2
rate-limit@1.2.0
react-fast-refresh@0.3.0
reactive-dict@1.3.2
reactive-var@1.0.13
@@ -92,10 +92,10 @@ reywood:publish-composite@1.9.0
routepolicy@1.1.2
rspack@1.1.0
service-configuration@1.3.5
session@1.2.3-rc350.2
session@1.2.3
sha@1.0.10
shell-server@0.7.0
socket-stream-client@0.7.0-rc350.2
socket-stream-client@0.7.0
spacebars@2.0.1
spacebars-compiler@2.0.1
standard-minifier-js@3.2.0
@@ -105,9 +105,9 @@ templating-runtime@2.0.2
templating-tools@2.0.1
tools-core@1.1.0
tracker@1.3.4
typescript@5.10.1-rc350.0
url@1.3.6-rc350.2
webapp@2.2.0-rc350.2
typescript@5.10.1
url@1.3.6
webapp@2.2.0
webapp-hashing@1.1.2
wekan-accounts-cas@0.2.0
wekan-accounts-lockout@1.1.0
+8 -1
View File
@@ -1,2 +1,9 @@
npm-packages/
tests/
# Root tests/ holds Playwright specs, Node E2E and node-based unit tests - none
# of it is Meteor code, and Meteor's file watcher otherwise churns on the
# tests/playwright/test-results/ tree (inotify errors). The leading slash anchors
# this to the repo root only, so it does NOT match server/lib/tests/ or
# client/lib/tests/ (the Mocha suites, loaded via meteor.testModule in
# package.json). A naked "tests/" would match a dir named tests at any depth and
# would hide those suites, making `meteor test` report "0 passing".
/tests/
+600 -142
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -2,10 +2,10 @@
For all code at WeKan GitHub Organization https://github.com/wekan
- For pull requests, mention only those participants that are **human**.
- All code in pull requests need to have permission already to add it to WeKan with MIT license, and will become MIT license.
- For any dependencies, permissive licenses like https://copyfree.org are preferred
- For anything currently that is non-permissive (like GPL, AGPL, SSPL), those will be replaced with permissive-licensed alternatives
- Any intelligence allowed: Human, AI or any other. No discrimination, please have world peace. Mentioning participants optional.
- All code is checked and validated by xet7 and many different security AI. If code is real working fix or feature, it usually will be merged.
- All known vulnerabilities have been fixed at newest WeKan, please upgrade https://wekan.fi/upgrade/
- There is no known backdoors. If WeKan is installed by someone else, first registered user is Admin and has Admin Panel access.
+2 -2
View File
@@ -7,14 +7,14 @@ 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=9.71
ARG VERSION=9.78
ARG DEBIAN_FRONTEND=noninteractive
ENV BUILD_DEPS="apt-utils gnupg wget bzip2 g++ curl libarchive-tools build-essential git ca-certificates python3 unzip"
ENV \
DEBUG=false \
NODE_VERSION=v24.17.0 \
NODE_VERSION=v24.18.0 \
METEOR_RELEASE=METEOR@3.5-rc.2 \
USE_EDGE=false \
NPM_VERSION=11.12.1 \
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v9.71.0"
appVersion: "v9.78.0"
files:
userUploads:
- README.md
+4 -5
View File
@@ -265,10 +265,9 @@ if arguments == 10:
boardid = sys.argv[3]
name = sys.argv[4]
type1 = sys.argv[5]
settings = str(json.loads(sys.argv[6]))
# There is error: Settings must be object. So this does not work yet.
#settings = {'currencyCode': 'EUR'}
print(type(settings))
settings_arg = sys.argv[6]
# settings is optional; an empty arg -> {} (avoids json.loads('') crashing).
settings = json.loads(settings_arg) if settings_arg.strip() else {}
showoncard = sys.argv[7]
automaticallyoncard = sys.argv[8]
showlabelonminicard = sys.argv[9]
@@ -276,7 +275,7 @@ if arguments == 10:
customfieldtoboard = wekanurl + apiboards + boardid + s + cf
# Add Custom Field to Board
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
post_data = {'authorId': '{}'.format(authorid), 'name': '{}'.format(name), 'type': '{}'.format(type1), 'settings': '{}'.format(settings), 'showoncard': '{}'.format(showoncard), 'automaticallyoncard': '{}'.format(automaticallyoncard), 'showlabelonminicard': '{}'.format(showlabelonminicard), 'showsumattopoflist': '{}'.format(showsumattopoflist)}
post_data = {'authorId': '{}'.format(authorid), 'name': '{}'.format(name), 'type': '{}'.format(type1), 'settings': json.dumps(settings), 'showoncard': '{}'.format(showoncard), 'automaticallyoncard': '{}'.format(automaticallyoncard), 'showlabelonminicard': '{}'.format(showlabelonminicard), 'showsumattopoflist': '{}'.format(showsumattopoflist)}
body = requests.post(customfieldtoboard, data=post_data, headers=headers)
print(body.text)
# ------- ADD CUSTOM FIELD TO BOARD END -----------
+6 -6
View File
@@ -107,17 +107,17 @@
overflow-y: scroll !important;
}
/* Mobile - make all text 2x bigger inside #content by default (icons stay same size) */
/* Mobile - keep #content text at normal size (reverted #6426 oversizing) */
@media screen and (max-width: 800px),
screen and (max-device-width: 800px),
screen and (-webkit-min-device-pixel-ratio: 2) and (max-width: 800px),
screen and (max-width: 800px) and (orientation: portrait),
screen and (max-width: 800px) and (orientation: landscape) {
#content {
font-size: 2em !important; /* 2x bigger base font size for content area */
font-size: 1em !important; /* Normal size (reverted #6426 oversizing) */
}
/* Make all text elements 2x bigger */
/* Keep all text elements at normal size */
#content h1, #content h2, #content h3, #content h4, #content h5, #content h6,
#content p, #content span, #content div, #content a, #content button,
#content .minicard, #content .list-header-name, #content .board-header-btn,
@@ -186,7 +186,7 @@
/* Fallback for iPhone devices using JavaScript detection */
.iphone-device #content {
font-size: 2em !important; /* 2x bigger base font size for content area */
font-size: 1em !important; /* Normal size (reverted #6426 oversizing) */
}
.iphone-device #content h1, .iphone-device #content h2, .iphone-device #content h3, .iphone-device #content h4, .iphone-device #content h5, .iphone-device #content h6,
@@ -231,9 +231,9 @@
font-size: 1em !important; /* Keep original icon size */
}
/* Mobile iPhone: scale card details text and icons to 2x */
/* Mobile iPhone: keep card details text/icons at normal size (reverted #6426 oversizing) */
body.mobile-mode.iphone-device .card-details {
font-size: 2em !important;
font-size: 1em !important;
}
body.mobile-mode.iphone-device .card-details .fa,
body.mobile-mode.iphone-device .card-details .icon,
+1 -246
View File
@@ -1002,21 +1002,13 @@ body.grey-icons-enabled .checkmark-no-grey {
}
}
/* Mobile - make all text and icons 2x bigger above #content on All Boards page */
/* Mobile All Boards layout fixes */
@media screen and (max-width: 800px),
screen and (max-device-width: 800px),
screen and (-webkit-min-device-pixel-ratio: 2) and (max-width: 800px),
screen and (max-width: 800px) and (orientation: portrait),
screen and (max-width: 800px) and (orientation: landscape),
screen and (max-device-width: 932px) and (-webkit-min-device-pixel-ratio: 3) {
.wrapper {
font-size: 2em !important; /* 2x bigger base font size for All Boards page */
}
.wrapper * {
font-size: inherit !important; /* Inherit the 2x scaling */
}
/* Stack the two-column All Boards layout on small screens. The fixed
"260px 1fr" grid had no mobile collapse, so on narrow non-iPhone browsers
(Fairphone Firefox ESR / Ubuntu Touch Morph, narrow desktop) it overflowed
@@ -1032,243 +1024,6 @@ body.grey-icons-enabled .checkmark-no-grey {
padding-inline-end: 0 !important;
padding-bottom: 12px;
}
.wrapper .fa, .wrapper .icon {
font-size: 2em !important; /* 2x bigger icons */
}
.board-list-header {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.board-list-header h1 {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.AllBoardTeamsOrgs {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.AllBoardTeamsOrgs select {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.AllBoardTeamsOrgs input {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.AllBoardTeamsOrgs .fa {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.board-list {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.board-list .board-list-item {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.board-list .board-list-item-name {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.board-list .board-list-item-desc {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.board-list .minicard-members {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.board-list .minicard-lists {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.board-list .fa {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.board-list .board-handle {
font-size: 1em !important; /* Use inherited 2x scaling */
}
}
/* Fallback for iPhone devices using JavaScript detection - All Boards page */
.iphone-device .wrapper {
font-size: 2em !important; /* 2x bigger base font size for All Boards page */
}
.iphone-device .wrapper * {
font-size: inherit !important; /* Inherit the 2x scaling */
}
.iphone-device .wrapper .fa, .iphone-device .wrapper .icon {
font-size: 2em !important; /* 2x bigger icons */
}
.iphone-device .board-list-header {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .board-list-header h1 {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .AllBoardTeamsOrgs {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .AllBoardTeamsOrgs select {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .AllBoardTeamsOrgs input {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .AllBoardTeamsOrgs .fa {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .board-list {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .board-list .board-list-item {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .board-list .board-list-item-name {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .board-list .board-list-item-desc {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .board-list .minicard-members {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .board-list .minicard-lists {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .board-list .fa {
font-size: 1em !important; /* Use inherited 2x scaling */
}
.iphone-device .board-list .board-handle {
font-size: 1em !important; /* Use inherited 2x scaling */
}
/* iPhone 12 Mini and very small screens - make everything much larger */
@media screen and (max-width: 400px) and (max-height: 900px) {
.board-list {
height: calc(100vh - 120px) !important;
overflow-y: scroll !important;
overflow-x: hidden !important;
-webkit-overflow-scrolling: touch;
padding: 0 0.5rem;
}
.board-list li {
width: 100% !important;
float: none !important;
display: block !important;
margin-bottom: 1.5rem !important;
}
.board-list .board-list-item {
height: 12rem !important; /* Much taller */
width: 100% !important;
margin: 0 !important;
padding: 1rem !important; /* More padding */
font-size: 18px !important; /* Much larger text */
line-height: 1.4 !important;
}
.board-list .board-list-item .board-list-item-name {
font-size: 20px !important; /* Larger board names */
font-weight: bold !important;
margin-bottom: 0.5rem !important;
}
.board-list .board-list-item .board-list-item-desc {
font-size: 16px !important; /* Larger descriptions */
line-height: 1.3 !important;
}
.board-list .board-list-item .minicard-members {
font-size: 14px !important; /* Larger member avatars */
}
.board-list .board-list-item .minicard-lists {
font-size: 14px !important; /* Larger list counters */
}
.board-list .board-handle {
position: absolute;
padding: 10px !important;
top: 50%;
transform: translateY(-50%);
inset-inline-end: 15px !important;
font-size: 28px !important; /* Much larger drag handle */
color: #fff;
background: rgba(0,0,0,0.4) !important;
border-radius: 50%;
width: 50px !important; /* Larger handle */
height: 50px !important;
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
transition: background-color 0.2s ease;
}
.board-list .board-handle:hover {
background: rgba(255, 255, 0, 0.8) !important; /* Yellow hover */
}
/* Force scrollbar to be visible and larger */
.board-list::-webkit-scrollbar {
width: 16px !important; /* Much wider scrollbar */
display: block !important;
visibility: visible !important;
}
.board-list::-webkit-scrollbar-track {
background: #f1f1f1 !important;
border-radius: 8px !important;
display: block !important;
visibility: visible !important;
}
.board-list::-webkit-scrollbar-thumb {
background: #666 !important; /* Darker for better visibility */
border-radius: 8px !important;
display: block !important;
visibility: visible !important;
min-height: 50px !important; /* Minimum thumb size */
}
.board-list::-webkit-scrollbar-thumb:hover {
background: #333 !important;
}
/* Ensure scrollbar is always visible */
.board-list {
scrollbar-gutter: stable;
scrollbar-width: auto !important;
min-height: 100vh !important;
}
.board-list::after {
content: '';
display: block;
height: 200px !important; /* More space to ensure scrolling */
}
}
.AllBoardTeamsOrgs {
list-style-type: none;
+3 -15
View File
@@ -2,8 +2,6 @@ import { ReactiveCache } from '/imports/reactiveCache';
import { TAPi18n } from '/imports/i18n';
import { FlowRouter } from 'meteor/ostrio:flow-router-extra';
import getSlug from 'limax';
import '/client/lib/dragscrollTouch';
import { enablePageDragscroll, disablePageDragscroll } from '/client/lib/pageDragscroll';
import TableVisibilityModeSettings from '/models/tableVisibilityModeSettings';
import { BoardMultiSelection } from '/client/lib/boardMultiSelection';
import { EscapeActions } from '/client/lib/escapeActions';
@@ -329,12 +327,9 @@ Template.boardList.onCreated(function () {
});
Template.boardList.onRendered(function () {
// Enable drag-to-scroll on the All Boards page the same way the board
// canvas/swimlanes do. On desktop the page scroll container is <body>, so we
// tag it via enablePageDragscroll(); the .board-list.dragscroll element only
// becomes a scroll container in mobile view, where its own class handles it.
// Finger drag-scrolling is handled by dragscrollTouch.js.
enablePageDragscroll();
// Drag-to-scroll on the All Boards page is handled centrally for all
// non-board pages by defaultLayout's route-aware autorun
// (see client/components/main/layouts.js).
// jQuery sortable is disabled in favor of HTML5 drag-and-drop for space management
// The old sortable code has been removed to prevent conflicts
@@ -380,13 +375,6 @@ Template.boardList.onRendered(function () {
*/
});
Template.boardList.onDestroyed(function () {
// Stop tagging <body> as drag-scrollable when leaving the All Boards page so
// other layouts (e.g. a board view, whose canvas does its own dragscroll) are
// not affected.
disablePageDragscroll();
});
Template.boardList.helpers({
userHasTeams() {
if (ReactiveCache.getCurrentUser()?.teams?.length > 0) return true;
+11
View File
@@ -1087,3 +1087,14 @@ body.mobile-mode .card-details .card-details-header .close-card-details-mobile-w
line-height: 1;
box-sizing: border-box;
}
/* #6431 follow-up: cover image on the opened card (Card Settings > Cover image
on card, opt-in). Mirrors the minicard cover but taller. */
.card-details-cover {
background-position: center;
background-repeat: no-repeat;
background-size: contain;
height: 200px;
user-select: none;
margin: 8px 0;
}
+15
View File
@@ -112,6 +112,11 @@ template(name="cardDetails")
i.fa.fa-check
span {{_ 'upload-completed'}}
//- #6431 follow-up: cover image on the opened card (opt-in, OFF by default).
if currentBoard.allowsCoverAttachmentOnCard
if cover
.card-details-cover(style="background-image: url('{{cover.link 'original'}}');")
.card-details-left
.card-details-items
@@ -684,6 +689,14 @@ template(name="cardDetails")
.card-checklist-attachmentGallery.card-checklists
if currentBoard.allowsChecklists
hr
//- 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.
if currentBoard.allowsChecklistCountBadgeOnCard
if checklists.length
h3.card-details-item-title
i.fa.fa-check-square-o
| {{checklistFinishedCount}}/{{checklistItemCount}}
+checklists(cardId = _id card = this)
if currentBoard.allowsSubtasks
hr
@@ -693,6 +706,8 @@ template(name="cardDetails")
h3.card-details-item-title
i.fa.fa-paperclip
| {{_ 'attachments'}}
if currentBoard.allowsAttachmentCountOnCard
| ({{attachments.length}})
if Meteor.settings.public.attachmentsUploadMaxSize
| {{_ 'max-upload-filesize'}} {{Meteor.settings.public.attachmentsUploadMaxSize}}
br
+20 -1
View File
@@ -51,6 +51,7 @@ import Lists from '/models/lists';
import CardComments from '/models/cardComments';
import { ALLOWED_COLORS } from '/config/const';
import { uniqBy } from '/imports/lib/collectionHelpers';
import { memberTargetBoardId } from '/models/lib/linkedCardMembers';
import { UserAvatar } from '../users/userAvatar';
import { Filter } from '/client/lib/filter';
import { BoardSwimlaneListCardDialog } from '/client/lib/dialogWithBoardSwimlaneListCard';
@@ -1657,7 +1658,25 @@ Template.cardLocationsPopup.events({
});
const filterMembers = (filterTerm) => {
let currBoard = Utils.getCurrentBoard();
// #5676: for a linked card the members live on the REAL card it points at,
// which may be on another board (that is what getMembers()/toggleMember() act
// on). Offer that board's members instead of the viewing board's, so the
// picker is consistent with where membership is actually stored. Falls back to
// the current board for normal cards or when the real card isn't loaded yet.
const card = getCurrentCardFromContext();
let currBoard = null;
if (card) {
const boardId = memberTargetBoardId(card, id => ReactiveCache.getCard(id));
if (boardId) {
currBoard = ReactiveCache.getBoard(boardId);
}
}
if (!currBoard) {
currBoard = Utils.getCurrentBoard();
}
if (!currBoard) {
return [];
}
let members = currBoard.activeMembers();
if (filterTerm) {
+9
View File
@@ -215,6 +215,15 @@ template(name="minicard")
i.fa.fa-globe
span.badge-text.check-list-text {{subtasksFinishedCount}}/{{allSubtasksCount}}
//{{subtasksFinishedCount}}/{{subtasksCount}} does not work because when a subtaks is archived, the count goes down
//- #6431: compact checklist item-count badge (finished/total). The outer
guard is a cheap boolean, so when the setting is off the checklist
counting below never runs.
if showChecklistCountBadge
if checklists.length
.badge(class="{{#if checklistFinished}}is-finished{{/if}}" title="{{_ 'checklists'}}")
span.badge-icon
i.fa.fa-check-square-o
span.badge-text.check-list-text {{checklistFinishedCount}}/{{checklistItemCount}}
if currentBoard.allowsCardSortingByNumber
if currentBoard.allowsCardSortingByNumberOnMinicard
.badge
+8
View File
@@ -144,6 +144,14 @@ Template.minicard.helpers({
const board = this.board();
return getMinicardFlag(board, 'allowsSubtasksOnMinicard', 'allowsSubtasks', true);
},
// #6431: compact checklist item-count badge (finished/total) on the minicard.
// Opt-in, OFF by default. Only a cheap boolean read here; the actual checklist
// counting (checklistFinishedCount/checklistItemCount) is gated behind this in
// the template, so a board with the badge off spends no resources counting.
showChecklistCountBadge() {
const board = this.board();
return !!(board && board.allowsChecklistCountBadgeOnMinicard);
},
hiddenMinicardLabelText() {
const currentUser = ReactiveCache.getCurrentUser();
+16 -1
View File
@@ -9,6 +9,7 @@ import Swimlanes from '/models/swimlanes';
import { Filter } from '/client/lib/filter';
import { MultiSelection } from '/client/lib/multiSelection';
import { Utils } from '/client/lib/utils';
import { isLinkableCardTarget } from '/models/lib/linkedCardTarget';
import autosize from 'autosize';
// SubsManager removed for Meteor 3 migration
@@ -706,7 +707,10 @@ Template.linkCardPopup.helpers({
archived: false,
linkedId: { $nin: ownCardsIds },
_id: { $nin: ownCardsIds },
type: { $nin: ['template-card'] },
// #5808: never offer an existing linked card/board as a link target —
// linking to one builds a chain of linkedId pointers that renders the
// card inaccessible. Only real cards may be linked.
type: { $nin: ['template-card', 'cardType-linkedCard', 'cardType-linkedBoard'] },
};
if (tpl.selectedBoardId.get()) selector.boardId = tpl.selectedBoardId.get();
if (tpl.selectedSwimlaneId.get()) selector.swimlaneId = tpl.selectedSwimlaneId.get();
@@ -790,6 +794,17 @@ Template.linkCardPopup.events({
Popup.back();
return;
}
// #5808: refuse to link to a linked card/board or to a card that links back
// to this board — those build a chain/cycle of linkedId pointers that renders
// the cards inaccessible. The <select> already filters these out, but its
// options can be stale, so re-check the resolved target here.
const targetCard = ReactiveCache.getCard(linkedId);
const ownCardsIds = tpl.board.cards().map(card => card.getRealId());
if (!isLinkableCardTarget(targetCard, ownCardsIds)) {
alert(TAPi18n.__('error-linked-card-not-allowed'));
Popup.back();
return;
}
const nextCardNumber = await tpl.board.getNextCardNumber();
const sortIndex = tpl.getSortIndex();
const _id = Cards.insert({
+37 -37
View File
@@ -558,7 +558,7 @@ body:not(.board-view) #header #header-main-bar h1 {
}
}
/* Mobile - make all text and icons 2x bigger above #content by default */
/* Mobile - keep header text/icons at normal size (reverted #6426 oversizing) */
@media screen and (max-width: 800px),
screen and (max-device-width: 800px),
screen and (-webkit-min-device-pixel-ratio: 2) and (max-width: 800px),
@@ -573,7 +573,7 @@ body:not(.board-view) #header #header-main-bar h1 {
overflow: hidden !important; /* Prevent content overflow */
}
#header-quick-access {
font-size: 2em !important; /* 2x bigger base font size */
font-size: 1em !important; /* Normal size (reverted #6426 oversizing) */
}
#header-quick-access * {
@@ -582,7 +582,7 @@ body:not(.board-view) #header #header-main-bar h1 {
#header-quick-access .fa,
#header-quick-access .icon {
font-size: 2em !important; /* 2x bigger icons */
font-size: 1em !important; /* Normal icon size (reverted #6426 oversizing) */
}
#header-quick-access .home-icon a {
@@ -652,7 +652,7 @@ body:not(.board-view) #header #header-main-bar h1 {
}
}
/* Mobile All Boards page - make logo row elements 2x bigger */
/* Mobile All Boards page - keep logo row at normal size (reverted #6426 oversizing) */
@media screen and (max-width: 800px),
screen and (max-device-width: 800px),
screen and (-webkit-min-device-pixel-ratio: 2) and (max-width: 800px),
@@ -660,16 +660,16 @@ body:not(.board-view) #header #header-main-bar h1 {
screen and (max-width: 800px) and (orientation: landscape) {
.wrapper ~ #header-quick-access,
body:not(.board-view) #header-quick-access {
font-size: 2em !important; /* 2x bigger base font size for logo row */
font-size: 1em !important; /* Normal size (reverted #6426 oversizing) */
}
/* iPhone 12 Mini specific - 3x bigger for All Boards page */
/* iPhone 12 Mini specific - keep All Boards logo row at normal size (reverted #6426) */
@media screen and (device-width: 375px) and (device-height: 812px), /* iPhone 12 Mini exact */
screen and (max-width: 375px) and (max-height: 812px), /* iPhone 12 Mini viewport */
screen and (-webkit-min-device-pixel-ratio: 3) and (max-width: 375px) /* iPhone 12 Mini Retina */ {
.wrapper ~ #header-quick-access,
body:not(.board-view) #header-quick-access {
font-size: 3em !important; /* 3x bigger base font size for iPhone 12 Mini All Boards page */
font-size: 1em !important; /* Normal size (reverted #6426 oversizing) */
}
}
@@ -682,7 +682,7 @@ body:not(.board-view) #header #header-main-bar h1 {
.wrapper ~ #header-quick-access .icon,
body:not(.board-view) #header-quick-access .fa,
body:not(.board-view) #header-quick-access .icon {
font-size: 2em !important; /* 2x bigger icons in logo row */
font-size: 1em !important; /* Normal icon size (reverted #6426 oversizing) */
}
.wrapper ~ #header-quick-access .home-icon a,
@@ -741,19 +741,19 @@ body:not(.board-view) #header #header-main-bar h1 {
}
}
/* iPhone 12 Mini specific - make header elements 3x bigger */
/* iPhone 12 Mini specific - keep the header a normal compact single row */
@media screen and (device-width: 375px) and (device-height: 812px), /* iPhone 12 Mini exact */
screen and (max-width: 375px) and (max-height: 812px), /* iPhone 12 Mini viewport */
screen and (-webkit-min-device-pixel-ratio: 3) and (max-width: 375px), /* iPhone 12 Mini Retina */
screen and (max-width: 375px) and (orientation: portrait), /* iPhone 12 Mini portrait */
screen and (max-width: 375px) and (orientation: landscape) /* iPhone 12 Mini landscape */ {
#header-quick-access {
font-size: 3em !important; /* 3x bigger base font size for iPhone 12 Mini */
height: auto !important; /* Allow height to grow */
min-height: 84px !important; /* Much taller minimum height for iPhone 12 Mini */
flex-wrap: wrap !important; /* Force wrapping */
align-items: flex-start !important; /* Align to top when wrapping */
padding: 18px 0px !important; /* More padding for iPhone 12 Mini */
font-size: 1em !important; /* Normal size (reverted #6426 oversizing) */
height: 48px !important;
min-height: 48px !important;
flex-wrap: nowrap !important;
align-items: center !important;
padding: 8px 0px !important;
}
#header-quick-access * {
@@ -762,7 +762,7 @@ body:not(.board-view) #header #header-main-bar h1 {
#header-quick-access .fa,
#header-quick-access .icon {
font-size: 3em !important; /* 3x bigger icons for iPhone 12 Mini */
font-size: 1em !important; /* Normal icon size (reverted #6426 oversizing) */
}
#header-quick-access .home-icon a {
@@ -848,7 +848,7 @@ body:not(.board-view) #header #header-main-bar h1 {
}
}
/* iPhone 12 Mini and very small screens - make header elements much larger */
/* iPhone 12 Mini and very small screens - header element sizing */
@media screen and (max-width: 400px) and (max-height: 900px),
screen and (max-device-width: 400px) and (max-device-height: 900px),
screen and (-webkit-min-device-pixel-ratio: 2) and (max-width: 400px),
@@ -912,12 +912,12 @@ body:not(.board-view) #header #header-main-bar h1 {
/* Fallback for iPhone devices using JavaScript detection */
.iphone-device #header-quick-access {
font-size: 2em !important; /* 2x bigger base font size */
height: auto !important; /* Allow height to grow */
min-height: 48px !important; /* Minimum height for mobile */
flex-wrap: wrap !important; /* Force wrapping */
align-items: flex-start !important; /* Align to top when wrapping */
padding: 8px 0px !important; /* Adjust padding for mobile */
font-size: 1em !important; /* Normal size (reverted #6426 oversizing) */
height: 48px !important;
min-height: 48px !important;
flex-wrap: nowrap !important;
align-items: center !important;
padding: 8px 0px !important;
}
.iphone-device #header-quick-access * {
@@ -926,7 +926,7 @@ body:not(.board-view) #header #header-main-bar h1 {
.iphone-device #header-quick-access .fa,
.iphone-device #header-quick-access .icon {
font-size: 2em !important; /* 2x bigger icons */
font-size: 1em !important; /* Normal icon size (reverted #6426 oversizing) */
}
.iphone-device #header-quick-access .home-icon a {
@@ -995,14 +995,14 @@ body:not(.board-view) #header #header-main-bar h1 {
width: auto !important;
}
/* iPhone 12 Mini specific - JavaScript detection fallback */
/* iPhone 12 Mini specific - JavaScript detection fallback (normal compact row) */
.iphone-device #header-quick-access {
font-size: 3em !important; /* 3x bigger base font size for iPhone 12 Mini */
height: auto !important; /* Allow height to grow */
min-height: 84px !important; /* Much taller minimum height for iPhone 12 Mini */
flex-wrap: wrap !important; /* Force wrapping */
align-items: flex-start !important; /* Align to top when wrapping */
padding: 18px 0px !important; /* More padding for iPhone 12 Mini */
font-size: 1em !important; /* Normal size (reverted #6426 oversizing) */
height: 48px !important;
min-height: 48px !important;
flex-wrap: nowrap !important;
align-items: center !important;
padding: 8px 0px !important;
}
.iphone-device #header-quick-access * {
@@ -1011,7 +1011,7 @@ body:not(.board-view) #header #header-main-bar h1 {
.iphone-device #header-quick-access .fa,
.iphone-device #header-quick-access .icon {
font-size: 3em !important; /* 3x bigger icons for iPhone 12 Mini */
font-size: 1em !important; /* Normal icon size (reverted #6426 oversizing) */
}
.iphone-device #header-quick-access .home-icon a {
@@ -1096,10 +1096,10 @@ body:not(.board-view) #header #header-main-bar h1 {
width: auto !important;
}
/* iPhone 12 Mini All Boards page - make logo row elements 3x bigger */
/* iPhone 12 Mini All Boards page - keep logo row at normal size (reverted #6426) */
.iphone-device .wrapper ~ #header-quick-access,
.iphone-device body:not(.board-view) #header-quick-access {
font-size: 3em !important; /* 3x bigger base font size for logo row */
font-size: 1em !important; /* Normal size (reverted #6426 oversizing) */
}
.iphone-device .wrapper ~ #header-quick-access *,
@@ -1111,7 +1111,7 @@ body:not(.board-view) #header #header-main-bar h1 {
.iphone-device .wrapper ~ #header-quick-access .icon,
.iphone-device body:not(.board-view) #header-quick-access .fa,
.iphone-device body:not(.board-view) #header-quick-access .icon {
font-size: 2em !important; /* 2x bigger icons in logo row */
font-size: 1em !important; /* Normal icon size (reverted #6426 oversizing) */
}
.iphone-device .wrapper ~ #header-quick-access .home-icon a,
@@ -1209,7 +1209,7 @@ body:not(.board-view) #header #header-main-bar h1 {
.iphone-device #header-quick-access,
.iphone-device .wrapper ~ #header-quick-access,
.iphone-device body:not(.board-view) #header-quick-access {
font-size: 1.2em !important;
font-size: 1em !important;
}
body:not(.board-view) #header-quick-access .fa,
body:not(.board-view) #header-quick-access .icon,
@@ -1221,7 +1221,7 @@ body:not(.board-view) #header #header-main-bar h1 {
.iphone-device .wrapper ~ #header-quick-access .icon,
.iphone-device body:not(.board-view) #header-quick-access .fa,
.iphone-device body:not(.board-view) #header-quick-access .icon {
font-size: 1.5em !important;
font-size: 1.2em !important;
}
/* Zoom (100%), drag-handle toggle and mobile/desktop toggle 30% smaller than
the other quick-access controls at small width — for all browsers. */
+33
View File
@@ -52,6 +52,13 @@ Template.userFormsLayout.onRendered(() => {
// gesture works the same as on the board swimlanes view.
enablePageDragscroll();
// Mark the auth pages so CSS can let <body> scroll as a normal document.
// body.mobile-mode locks <body> to position:fixed/100vh (an iOS board-view
// anti-bounce fix); without an inner #content scroller that traps these pages
// at viewport height, hiding the sign-up link / language selector below the
// form (and they sit behind the on-screen keyboard). See userForm.css.
document.body.classList.add('userform-layout');
Meteor.call('getAuthenticationsEnabled', (_, result) => {
let enabledAuthenticationMethods = ['password']; // we show/hide this based on isPasswordLoginEnabled
@@ -200,6 +207,7 @@ Template.userFormsLayout.onDestroyed(() => {
// Stop drag-scrolling <body> after leaving login / register (e.g. once logged
// in) so other layouts keep their normal behaviour.
disablePageDragscroll();
document.body.classList.remove('userform-layout');
});
Template.userFormsLayout.helpers({
@@ -314,6 +322,31 @@ Template.defaultLayout.onRendered(function () {
}
});
});
// Drag-to-scroll for every whole-page layout rendered inside defaultLayout
// (All Boards, My Cards, Due Cards, Global Search, Public, Bookmarks, Broken
// Cards, Settings, People, Admin, Import, board Rules, …). These pages scroll
// <body> on desktop and #content in mobile mode (where <body> is
// position:fixed), so enablePageDragscroll() tags whichever element actually
// scrolls. The board-canvas pages are the exception: their own
// `.board-canvas.dragscroll` handles dragging, and the canvas does its own
// vertical/horizontal scroll, so page-level tagging is turned off there to
// avoid scrolling #content and the canvas at the same time. defaultLayout is
// persistent (only its `content` swaps), so this single autorun covers every
// route without per-template wiring. Login / Register use userFormsLayout and
// keep their own enable/disable. Works the same in mobile and desktop mode.
const boardCanvasRoutes = ['board', 'board-short', 'card'];
this.autorun(() => {
FlowRouter.watchPathChange();
const onBoardCanvas = boardCanvasRoutes.includes(FlowRouter.getRouteName());
Tracker.afterFlush(() => {
if (onBoardCanvas) {
disablePageDragscroll();
} else {
enablePageDragscroll();
}
});
});
});
async function authentication(event, templateInstance) {
+2 -10
View File
@@ -1,6 +1,5 @@
import { CardSearchPaged } from '../../lib/cardSearch';
import { Utils } from '/client/lib/utils';
import { enablePageDragscroll, disablePageDragscroll } from '/client/lib/pageDragscroll';
Template.myCardsHeaderBar.helpers({
myCardsSort() {
@@ -41,15 +40,8 @@ Template.myCards.onCreated(function () {
Meteor.subscribe('setting');
});
Template.myCards.onRendered(function () {
// My Cards renders into <body>'s page scroll area (.wrapper inside #content),
// so enable drag-to-scroll on <body> like the All Boards page does.
enablePageDragscroll();
});
Template.myCards.onDestroyed(function () {
disablePageDragscroll();
});
// Drag-to-scroll is handled centrally for all non-board pages by
// defaultLayout's route-aware autorun (see client/components/main/layouts.js).
Template.myCards.helpers({
userId() {
@@ -4,6 +4,7 @@ import Actions from '/models/actions';
import Rules from '/models/rules';
import Triggers from '/models/triggers';
import { Utils } from '/client/lib/utils';
import { canSelectBoardInRules } from '/models/lib/rulesBoardSelector';
Template.boardActions.onCreated(function () {
this.subscribe('boards');
@@ -11,19 +12,30 @@ Template.boardActions.onCreated(function () {
Template.boardActions.helpers({
boards() {
const ret = ReactiveCache.getBoards(
{
archived: false,
'members.userId': Meteor.userId(),
_id: {
$ne: ReactiveCache.getCurrentUser().getTemplatesBoardId(),
},
},
// #5698: don't restrict to boards where the user is a DIRECT member — that
// hid every board reached through an Organization / Team / email-domain
// share (the reporter's whole board dropdown was empty, current board
// included). Filter the already access-scoped client cache with the same
// visibility rule as Boards.userBoards() so org/team/domain boards show too.
const user = ReactiveCache.getCurrentUser();
if (!user) return [];
const ctx = {
userId: user._id,
orgIds: typeof user.orgIds === 'function' ? user.orgIds() : [],
teamIds: typeof user.teamIds === 'function' ? user.teamIds() : [],
emailDomains:
typeof user.emailDomains === 'function' ? user.emailDomains() : [],
};
const templatesBoardId = user.getTemplatesBoardId();
const boards = ReactiveCache.getBoards(
{ archived: false },
{
sort: { sort: 1 /* boards default sorting */ },
},
);
return ret;
return boards.filter(board =>
canSelectBoardInRules(board, ctx, templatesBoardId),
);
},
loadingBoardsLabel() {
+12 -1
View File
@@ -6,6 +6,7 @@ import AccessibilitySettings from '/models/accessibilitySettings';
import AccountSettings from '/models/accountSettings';
import Announcements from '/models/announcements';
import Settings from '/models/settings';
import { resolveDefaultAuthenticationMethod } from '/models/lib/authenticationMethod';
import TableVisibilityModeSettings from '/models/tableVisibilityModeSettings';
// import {
// cronMigrationProgress,
@@ -803,7 +804,17 @@ Template.setting.events({
$('input[name=hideBoardMemberList]:checked').val() === 'true';
const displayAuthenticationMethod =
$('input[name=displayAuthenticationMethod]:checked').val() === 'true';
const defaultAuthenticationMethod = $('#defaultAuthenticationMethod').val();
// #5879: the <select> options are populated by an async Meteor.call, so its
// value can still be '' / null when Save is clicked. Saving that empty value
// over the required `defaultAuthenticationMethod` string silently failed
// validation, so the Layout save looked like it hung / did nothing. Fall back
// to the currently stored method so a real value is never overwritten by ''.
const currentDefaultAuthenticationMethod =
ReactiveCache.getCurrentSetting()?.defaultAuthenticationMethod;
const defaultAuthenticationMethod = resolveDefaultAuthenticationMethod(
$('#defaultAuthenticationMethod').val(),
currentDefaultAuthenticationMethod,
);
const spinnerName = ($('#spinnerName').val() || '').trim();
try {
+8
View File
@@ -82,6 +82,14 @@ body.grey-icons-enabled .boardSubtaskSettingsPopup .materialCheckBox.is-checked
grid-template-columns: 1fr 1fr 2fr;
gap: 10px;
margin-bottom: 10px;
/* Keep the "Show on Card / Show on Minicard / Description" titles visible
while the rows below scroll (the popup scrolls in .pop-over .content-wrapper). */
position: sticky;
top: 0;
z-index: 2;
background: #fff;
padding: 5px 0;
border-bottom: 2px solid #ddd;
}
.card-settings-row {
+25 -39
View File
@@ -315,21 +315,12 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-creator(title="{{_ 'creator'}}" class="{{#if allowsCreator}}is-checked{{/if}}")
i.fa(class="{{#if allowsCreator}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
.card-settings-column
span
i.fa.fa-user
| {{_ 'creator'}}
.card-settings-row
.card-settings-column
span
.card-settings-column
a.flex.js-field-has-creator-on-minicard(title="{{_ 'creator-on-minicard'}}" class="{{#if allowsCreatorOnMinicard}}is-checked{{/if}}")
a.flex.js-field-has-creator-on-minicard(title="{{_ 'creator'}}" class="{{#if allowsCreatorOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsCreatorOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-user
| {{_ 'creator-on-minicard'}}
| {{_ 'creator'}}
.card-settings-row
.card-settings-column
a.flex.js-field-has-assignee(title="{{_ 'assignee'}}" class="{{#if allowsAssignee}}is-checked{{/if}}")
@@ -369,27 +360,19 @@ template(name="boardCardSettingsPopup")
a.flex.js-field-has-card-sorting-by-number(title="{{_ 'card-sorting-by-number'}}" class="{{#if allowsCardSortingByNumber}}is-checked{{/if}}")
i.fa(class="{{#if allowsCardSortingByNumber}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
a.flex.js-field-has-card-sorting-by-number-on-minicard(title="{{_ 'card-sorting-by-number'}}" class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsCardSortingByNumberOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-sort-numeric-asc
| {{_ 'card-sorting-by-number'}}
.card-settings-row
.card-settings-column
span
.card-settings-column
a.flex.js-field-has-card-sorting-by-number-on-minicard(title="{{_ 'card-sorting-by-number-on-minicard'}}" class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsCardSortingByNumberOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-sort-numeric-asc
| {{_ 'card-sorting-by-number-on-minicard'}}
.card-settings-row
.card-settings-column
a.flex.js-field-has-card-show-lists(title="{{_ 'card-show-lists'}}" class="{{#if allowsShowLists}}is-checked{{/if}}")
i.fa(class="{{#if allowsShowLists}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
a.flex.js-field-has-card-show-lists-on-minicard(title="{{_ 'card-show-lists'}}" class="{{#if allowsShowListsOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsShowListsOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-list
@@ -405,16 +388,6 @@ template(name="boardCardSettingsPopup")
span
i.fa.fa-tag
| {{_ 'labels'}}
.card-settings-row
.card-settings-column
span
.card-settings-column
a.flex.js-field-has-card-show-lists-on-minicard(title="{{_ 'card-show-lists-on-minicard'}}" class="{{#if allowsShowListsOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsShowListsOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-list
| {{_ 'card-show-lists-on-minicard'}}
.card-settings-row
.card-settings-column
a.flex.js-field-has-card-number(title="{{_ 'card'}} {{_ 'number'}}" class="{{#if allowsCardNumber}}is-checked{{/if}}")
@@ -462,6 +435,17 @@ template(name="boardCardSettingsPopup")
span
i.fa.fa-check
| {{_ 'checklists'}}
.card-settings-row
.card-settings-column
a.flex.js-field-has-checklist-count(title="{{_ 'checklist-count'}}" class="{{#if allowsChecklistCountBadgeOnCard}}is-checked{{/if}}")
i.fa(class="{{#if allowsChecklistCountBadgeOnCard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-checklist-count-on-minicard(title="{{_ 'checklist-count'}}" class="{{#if allowsChecklistCountBadgeOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsChecklistCountBadgeOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-check-square-o
| {{_ 'checklist-count'}}
.card-settings-row
.card-settings-column
a.flex.js-field-has-subtasks(title="{{_ 'subtasks'}}" class="{{#if allowsSubtasks}}is-checked{{/if}}")
@@ -486,24 +470,26 @@ template(name="boardCardSettingsPopup")
| {{_ 'attachments'}}
.card-settings-row
.card-settings-column
span
a.flex.js-field-has-attachment-count(title="{{_ 'attachment-count'}}" class="{{#if allowsAttachmentCountOnCard}}is-checked{{/if}}")
i.fa(class="{{#if allowsAttachmentCountOnCard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-badge-attachment-on-minicard(title="{{_ 'badge-attachment-on-minicard'}}" class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}")
a.flex.js-field-has-badge-attachment-on-minicard(title="{{_ 'attachment-count'}}" class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsBadgeAttachmentOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-paperclip
| {{_ 'badge-attachment-on-minicard'}}
| {{_ 'attachment-count'}}
.card-settings-row
.card-settings-column
span
a.flex.js-field-has-cover-attachment-on-card(title="{{_ 'cover-image'}}" class="{{#if allowsCoverAttachmentOnCard}}is-checked{{/if}}")
i.fa(class="{{#if allowsCoverAttachmentOnCard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
a.flex.js-field-has-cover-attachment-on-minicard(title="{{_ 'cover-attachment-on-minicard'}}" class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}")
a.flex.js-field-has-cover-attachment-on-minicard(title="{{_ 'cover-image'}}" class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}")
i.fa(class="{{#if allowsCoverAttachmentOnMinicard}}fa-check{{else}}fa-square-o{{/if}}")
.card-settings-column
span
i.fa.fa-picture-o
| {{_ 'cover-attachment-on-minicard'}}
| {{_ 'cover-image'}}
//div.check-div
//
a.flex.js-field-has-comments(class="{{#if allowsComments}}is-checked{{/if}}")
+42
View File
@@ -1496,6 +1496,28 @@ Template.boardCardSettingsPopup.helpers({
const currentBoard = ReactiveCache.getBoard(boardId);
return getMinicardSetting(currentBoard, 'allowsChecklistsOnMinicard', 'allowsChecklists', true);
},
// #6431: compact checklist count badge on minicard, opt-in and OFF by default.
allowsChecklistCountBadgeOnMinicard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsChecklistCountBadgeOnMinicard : false;
},
// #6431 follow-up: new opt-in (OFF by default) card-side options.
allowsChecklistCountBadgeOnCard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsChecklistCountBadgeOnCard : false;
},
allowsAttachmentCountOnCard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsAttachmentCountOnCard : false;
},
allowsCoverAttachmentOnCard() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
return currentBoard ? currentBoard.allowsCoverAttachmentOnCard : false;
},
allowsAttachments() {
const boardId = Session.get('currentBoard');
const currentBoard = ReactiveCache.getBoard(boardId);
@@ -1790,6 +1812,26 @@ Template.boardCardSettingsPopup.events({
const newValue = !tpl.currentBoard.allowsChecklistsOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsChecklistsOnMinicard: newValue } });
},
'click .js-field-has-checklist-count-on-minicard'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsChecklistCountBadgeOnMinicard;
Boards.update(tpl.currentBoard._id, { $set: { allowsChecklistCountBadgeOnMinicard: newValue } });
},
'click .js-field-has-checklist-count'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsChecklistCountBadgeOnCard;
Boards.update(tpl.currentBoard._id, { $set: { allowsChecklistCountBadgeOnCard: newValue } });
},
'click .js-field-has-attachment-count'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsAttachmentCountOnCard;
Boards.update(tpl.currentBoard._id, { $set: { allowsAttachmentCountOnCard: newValue } });
},
'click .js-field-has-cover-attachment-on-card'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsCoverAttachmentOnCard;
Boards.update(tpl.currentBoard._id, { $set: { allowsCoverAttachmentOnCard: newValue } });
},
'click .js-field-has-attachments'(evt, tpl) {
evt.preventDefault();
const newValue = !tpl.currentBoard.allowsAttachments;
+23
View File
@@ -113,6 +113,21 @@ body.mobile-mode .auth-layout .auth-dialog .at-form .password-input-container .p
width: 100%;
margin-top: 10px;
}
/* Auth pages (login / register) must scroll as a normal document on mobile so
the content below the form — the sign-up / sign-in link, legal notice and
language selector — is reachable, including when the on-screen keyboard is
open. body.mobile-mode otherwise locks <body> to position:fixed + 100vh (an
iOS board-view anti-bounce fix); the auth layout has no inner #content
scroller, so that lock traps the page at viewport height and the on-screen
keyboard hides the bottom. .userform-layout is added by userFormsLayout while
these pages are mounted (see layouts.js). */
body.mobile-mode.userform-layout {
position: static !important;
height: auto !important;
min-height: 100vh;
overflow-y: auto !important;
}
@media screen and (max-width: 800px) {
.auth-layout {
width: 100%;
@@ -120,6 +135,14 @@ body.mobile-mode .auth-layout .auth-dialog .at-form .password-input-container .p
margin: 0px;
padding: 0px;
}
/* Let the auth layout/dialog grow to their content instead of being pinned to
the viewport height, so everything below the form scrolls into view. */
body.userform-layout .auth-layout {
height: auto;
}
body.userform-layout .auth-layout .auth-dialog {
height: auto;
}
.auth-layout .at-form-landing-logo {
width: 125px;
position: absolute;
+32 -14
View File
@@ -1,27 +1,45 @@
import dragscroll from '@wekanteam/dragscroll';
import '/client/lib/dragscrollTouch';
// Enable / disable mouse drag-to-scroll for whole-page layouts.
// Enable / disable mouse drag-to-scroll for whole-page layouts (All Boards,
// My Cards, Login, Register).
//
// On pages like All Boards, Login and Register the scroll container is the
// <body> element itself (it has `overflow-y: auto; height: 100vh`), not an
// inner board canvas or swimlane. The dragscroll library scrolls whichever
// element carries the `dragscroll` class and has a dedicated `el ==
// document.body` branch that also scrolls document.documentElement, so tagging
// <body> makes dragging empty page space scroll the page — the same gesture
// that already works on the board swimlanes view.
// The dragscroll library scrolls whichever element carries the `dragscroll`
// class AND is the actual scroll container. Which element that is depends on
// the layout and on mobile vs desktop mode:
//
// The class is toggled per template (onRendered / onDestroyed) so it only
// applies on those pages; dragscroll.reset() re-scans the DOM and (re)binds the
// mouse listeners after the class is added or removed. Touch (one-finger)
// scrolling is handled separately by client/lib/dragscrollTouch.js.
// * Login / Register (userFormsLayout) have no `#content`; the page scroll
// container is `<body>` in both modes (it has `overflow-y: auto` and a
// `100vh` height).
// * All Boards / My Cards (defaultLayout) render inside `#content`. On
// desktop the scroll container is `<body>`; in mobile mode `<body>` becomes
// `position: fixed` and `#content` becomes the scroller
// (`overflow-y: auto; height: calc(100vh - 48px)`), so tagging only
// `<body>` would never scroll on a phone.
//
// To cover every case we tag BOTH `<body>` and `#content` (when present). Only
// the element that actually overflows scrolls, so there is no double-scroll:
// on desktop `<body>` scrolls and `#content` (no vertical overflow) is a no-op;
// in mobile mode `#content` scrolls and `<body>` (fixed, no overflow) is a
// no-op. dragscroll has a dedicated `el == document.body` branch for the body
// case. dragscroll.reset() re-scans the DOM and (re)binds the mouse listeners.
// One-finger touch scrolling is handled by client/lib/dragscrollTouch.js, which
// picks the nearest scrollable `.dragscroll` ancestor (so `#content` wins over
// `<body>` when both are tagged).
function pageScrollEls() {
const els = [document.body];
const content = document.getElementById('content');
if (content) els.push(content);
return els;
}
export function enablePageDragscroll() {
document.body.classList.add('dragscroll');
pageScrollEls().forEach(el => el.classList.add('dragscroll'));
dragscroll.reset();
}
export function disablePageDragscroll() {
document.body.classList.remove('dragscroll');
pageScrollEls().forEach(el => el.classList.remove('dragscroll'));
dragscroll.reset();
}
+2
View File
@@ -1,3 +1,5 @@
// i18n (TAPi18n) tests, run on the client as the old tests/main.js did.
import '/imports/i18n/i18n.test.js';
import './Utils.tests';
import './filter.dependencies.tests';
import './dueDateColor.tests';
+86 -1
View File
@@ -1,9 +1,28 @@
import { TAPi18n } from '/imports/i18n';
import { FlowRouter } from 'meteor/ostrio:flow-router-extra';
// Readiness-aware, reactive translation — mirrors the `{{_}}` Blaze helper
// (imports/i18n/blaze.js). A bare TAPi18n.__() returns the raw key on the initial
// (English) render because the language bundle loads asynchronously, and it never
// re-runs once ready. Depending on TAPi18n.current / TAPi18n.ready makes the
// account-form labels/placeholders re-render as soon as i18n is loaded and on every
// language change.
function tr(key) {
TAPi18n.current.get();
TAPi18n.ready.get();
if (!TAPi18n.i18n || !TAPi18n.ready.get()) {
return key;
}
return TAPi18n.__(key);
}
const passwordField = AccountsTemplates.removeField('password');
passwordField.autocomplete = 'current-password';
passwordField.template = 'passwordInput';
// Translate the field label/placeholder via WeKan i18n — see the note below the
// addFields() call. Set before re-adding the field so it is present when useraccounts
// registers it.
passwordField.displayName = () => tr('password');
const emailField = AccountsTemplates.removeField('email');
// Don't add current_password to global fields - it should only be used for change password
@@ -75,7 +94,7 @@ AccountsTemplates.addFields([
{
_id: 'password_again',
type: 'password',
displayName: 'Password (again)',
displayName: () => tr('password-again'),
required: true,
minLength: 6,
autocomplete: 'new-password',
@@ -91,6 +110,57 @@ AccountsTemplates.addFields([
},
]);
// The sign-in / register form field labels and placeholders were rendered through
// accounts-t9n (`T9n.get`), whose per-language coverage is incomplete, and
// useraccounts' `getPlaceholder()` never invokes a function placeholder (unlike
// `getDisplayName()`) — so several placeholders (Username, Email, Password
// (again)) and the Email / Password (again) labels showed untranslated English.
// Translate the account-form fields through WeKan's own i18n (TAPi18n) instead,
// which has complete data/<lang>.i18n.json coverage.
//
// Password fields (password, password_again) use WeKan's passwordInput template,
// which renders {{displayName}} for both its label and its placeholder. Their
// field-level displayName functions (set above / in addFields) are invoked both by
// getDisplayName() and by Blaze, so they translate regardless of when useraccounts
// wires up per-template helpers. Username / email use the atTextInput override below.
if (Meteor.isClient) {
const { Template } = require('meteor/templating');
const { T9n } = require('meteor/communitypackages:core');
// Fields WeKan translates itself (complete data/<lang>.i18n.json coverage), keyed
// by field id. Other account-form text inputs — notably the sign-in combined
// "username_and_email" field and current_password — keep their built-in
// accounts-t9n translation, because WeKan has no key for them and accounts-t9n
// already ships one (e.g. "usernameOrEmail").
const WEKAN_FIELD_KEY = { username: 'username', email: 'email' };
function fieldText(field, original) {
TAPi18n.current.get();
TAPi18n.ready.get();
const key = WEKAN_FIELD_KEY[field._id];
if (key && TAPi18n.i18n && TAPi18n.ready.get()) {
const translated = TAPi18n.__(key);
if (translated !== key) {
return translated;
}
}
// Fall back to useraccounts' own accounts-t9n translation. The field's
// displayName/placeholder is an accounts-t9n key (e.g. "usernameOrEmail").
return T9n.get(original, false);
}
// The unstyled package registers these helpers on Template.atTextInput at load
// time, so this app-startup override wins.
Template.atTextInput.helpers({
displayName() {
return fieldText(this, this.getDisplayName());
},
placeholder() {
if (!AccountsTemplates.options.showPlaceholders) {
return undefined;
}
return fieldText(this, this.getPlaceholder());
},
});
}
AccountsTemplates.configure({
defaultLayout: 'userFormsLayout',
defaultContentRegion: 'content',
@@ -230,4 +300,19 @@ if (Meteor.isServer) {
Accounts.sendResetPasswordEmail,
(code, message) => new Meteor.Error(code, message),
);
// #5672: "Internal Server Error When Signing Up Despite Successful Account
// Creation". useraccounts' ATCreateUserServer creates the account and then
// calls Accounts.sendVerificationEmail(); when SMTP is not configured that
// send throws AFTER the user is inserted, so the createUser method returns a
// raw HTTP 500 even though the account exists and can sign in. The
// verification email is best-effort at sign-up, so swallow + log a transport
// failure (registration then completes and redirects to sign-in). An
// "already verified" error is re-thrown so ATResendVerificationEmail still
// reports it. Unit-tested in tests/verificationEmail.test.cjs.
const { wrapSendVerificationEmail } = require('/server/lib/verificationEmail');
Accounts.sendVerificationEmail = wrapSendVerificationEmail(
Accounts.sendVerificationEmail,
message => console.warn(message),
);
}
+2 -2
View File
@@ -10,7 +10,7 @@ This is without container (without Docker or Snap).
Right click and download files 1-4:
1. [wekan-9.71-win64.zip](https://github.com/wekan/wekan/releases/download/v9.71/wekan-9.71-win64.zip) or newest available at https://github.com/wekan/wekan/releases/
1. [wekan-9.78-win64.zip](https://github.com/wekan/wekan/releases/download/v9.78/wekan-9.78-win64.zip) or newest available at https://github.com/wekan/wekan/releases/
2. [node.exe](https://nodejs.org/dist/latest-v24.x/win-x64/node.exe)
@@ -22,7 +22,7 @@ Right click and download files 1-4:
6. Double click `mongodb-windows-x86_64-7.0.34-signed.msi` . In installer, uncheck downloading MongoDB compass.
7. Unzip `wekan-9.71-win64.zip` , inside it is directory `bundle`, to it copy other files:
7. Unzip `wekan-9.78-win64.zip` , inside it is directory `bundle`, to it copy other files:
```
bundle (directory)
+16
View File
@@ -0,0 +1,16 @@
# Reset previous attempts
sudo flatpak override --reset com.visualstudio.code
# Block EVERYTHING except the display and the wekan folder
sudo flatpak override com.visualstudio.code \
--nofilesystem=home \
--nofilesystem=host \
--nofilesystem=xdg-run/gvfs \
--nofilesystem=xdg-run/gvfsd \
--filesystem=~/repos/wekan:rw \
--filesystem=~/repos/log:rw \
--filesystem=~/repos/w/wekan.fi:rw \
--device=all \
--socket=wayland \
--socket=x11 \
--share=network
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "CSV anda(Nilai yang dipisahkan koma)/TSV (Nilai yang dipisahkan tab) tidak termasuk informasi yang tepat dalam format yang benar",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Daftar ini tidak ada",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Nama pengguna ini tidak ada",
"error-user-notAllowSelf": "Anda tidak bisa mengundang diri sendiri",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Gambar sampul untuk kartu kecil",
"badge-attachment-on-minicard": "Menghitung lampiran pada kartu kecil",
"card-sorting-by-number-on-minicard": "Kartu disaring dengan nomor pada kartu kecil",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "rintisan dengan prefix",
"prefix-with-parent": "Induk dnegan prefix",
"subtext-with-full-path": "Subtext dengan rintisan lengkap",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Jou CSV (Comma Separated Values)/TSV (Tab Separated Values) sluit nie die korrekte inligting in die korrekte formaat in nie",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Hierdie lys bestaan ​​nie",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Hierdie gebruiker bestaan ​​nie",
"error-user-notAllowSelf": "Jy kan nie jouself nooi nie",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Omslagprent op minikaart",
"badge-attachment-on-minicard": "Telling van aanhegsels op minikaart",
"card-sorting-by-number-on-minicard": "Kaart sorteer volgens nommer op minikaart",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Voorvoegsel met volle pad",
"prefix-with-parent": "Voorvoegsel met ouer",
"subtext-with-full-path": "Subteks met volle pad",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Jou CSV (Comma Separated Values)/TSV (Tab Separated Values) sluit nie die korrekte inligting in die korrekte formaat in nie",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Hierdie lys bestaan ​​nie",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Hierdie gebruiker bestaan ​​nie",
"error-user-notAllowSelf": "Jy kan nie jouself nooi nie",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Omslagprent op minikaart",
"badge-attachment-on-minicard": "Telling van aanhegsels op minikaart",
"card-sorting-by-number-on-minicard": "Kaart sorteer volgens nommer op minikaart",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Voorvoegsel met volle pad",
"prefix-with-parent": "Voorvoegsel met ouer",
"subtext-with-full-path": "Subteks met volle pad",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "لا يتضمن ملف CSV (القيم المفصولة بفواصل)/TSV (القيم المفصولة بعلامات التبويب) الخاص بك المعلومات الصحيحة بالتنسيق الصحيح",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "این لیست موجود نیست",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "این کاربر وجود ندارد",
"error-user-notAllowSelf": "لا يمكنك دعوة نفسك",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "صورة الغلاف على البطاقة الصغيرة",
"badge-attachment-on-minicard": "عدد المرفقات على البطاقة الصغيرة",
"card-sorting-by-number-on-minicard": "رز البطاقات حسب الرقم على البطاقة الصغيرة",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "پیشوند با مسیر کامل",
"prefix-with-parent": "پیشوند با خانواده",
"subtext-with-full-path": "زیرنویس با مسیر کامل",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "لا يتضمن ملف CSV (القيم المفصولة بفواصل)/TSV (القيم المفصولة بعلامات التبويب) الخاص بك المعلومات الصحيحة بالتنسيق الصحيح",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "این لیست موجود نیست",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "این کاربر وجود ندارد",
"error-user-notAllowSelf": "لا يمكنك دعوة نفسك",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "صورة الغلاف على البطاقة الصغيرة",
"badge-attachment-on-minicard": "عدد المرفقات على البطاقة الصغيرة",
"card-sorting-by-number-on-minicard": "رز البطاقات حسب الرقم على البطاقة الصغيرة",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "پیشوند با مسیر کامل",
"prefix-with-parent": "پیشوند با خانواده",
"subtext-with-full-path": "زیرنویس با مسیر کامل",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "لا يتضمن ملف CSV (القيم المفصولة بفواصل)/TSV (القيم المفصولة بعلامات التبويب) الخاص بك المعلومات الصحيحة بالتنسيق الصحيح",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "این لیست موجود نیست",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "این کاربر وجود ندارد",
"error-user-notAllowSelf": "لا يمكنك دعوة نفسك",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "صورة الغلاف على البطاقة الصغيرة",
"badge-attachment-on-minicard": "عدد المرفقات على البطاقة الصغيرة",
"card-sorting-by-number-on-minicard": "رز البطاقات حسب الرقم على البطاقة الصغيرة",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "پیشوند با مسیر کامل",
"prefix-with-parent": "پیشوند با خانواده",
"subtext-with-full-path": "زیرنویس با مسیر کامل",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "لا يتضمن ملف CSV (القيم المفصولة بفواصل)/TSV (القيم المفصولة بعلامات التبويب) الخاص بك المعلومات الصحيحة بالتنسيق الصحيح",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "این لیست موجود نیست",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "این کاربر وجود ندارد",
"error-user-notAllowSelf": "لا يمكنك دعوة نفسك",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "صورة الغلاف على البطاقة الصغيرة",
"badge-attachment-on-minicard": "عدد المرفقات على البطاقة الصغيرة",
"card-sorting-by-number-on-minicard": "رز البطاقات حسب الرقم على البطاقة الصغيرة",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "پیشوند با مسیر کامل",
"prefix-with-parent": "پیشوند با خانواده",
"subtext-with-full-path": "زیرنویس با مسیر کامل",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Su CSV(Valores separados por coma)/TSV(Valores separados por tab) no incluyen la información apropiada en el formato correcto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "La lista no existe",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "El usuario no existe",
"error-user-notAllowSelf": "No puedes invitarte a ti mismo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagen de portada de la minitarjeta",
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefijo con ruta completa",
"prefix-with-parent": "Prefijo con el padre",
"subtext-with-full-path": "Subtexto con ruta completa",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Sizin CSV(Vergüllə Ayrılmış Dəyərlər)/TSV (Vergüllə Ayrılmış Dəyərlər) düzgün formatda düzgün məlumatları ehtiva etmir",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Bu siyahı mövcud deyil",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Bu istifadəçi mövcud deyil",
"error-user-notAllowSelf": "Özünüzü dəvət edə bilməzsiniz",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Minikartda örtük şəkli",
"badge-attachment-on-minicard": "Minikartdakı qoşmaların sayı",
"card-sorting-by-number-on-minicard": "Minikartda nömrəyə görə kartın çeşidlənməsi",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Tam yolu olan prefiks",
"prefix-with-parent": "Valideyn ilə prefiks",
"subtext-with-full-path": "Tam yolu olan alt mətn",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Sizin CSV(Vergüllə Ayrılmış Dəyərlər)/TSV (Vergüllə Ayrılmış Dəyərlər) düzgün formatda düzgün məlumatları ehtiva etmir",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Bu siyahı mövcud deyil",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Bu istifadəçi mövcud deyil",
"error-user-notAllowSelf": "Özünüzü dəvət edə bilməzsiniz",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Minikartda örtük şəkli",
"badge-attachment-on-minicard": "Minikartdakı qoşmaların sayı",
"card-sorting-by-number-on-minicard": "Minikartda nömrəyə görə kartın çeşidlənməsi",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Tam yolu olan prefiks",
"prefix-with-parent": "Valideyn ilə prefiks",
"subtext-with-full-path": "Tam yolu olan alt mətn",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Sizin CSV(Vergüllə Ayrılmış Dəyərlər)/TSV (Vergüllə Ayrılmış Dəyərlər) düzgün formatda düzgün məlumatları ehtiva etmir",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Bu siyahı mövcud deyil",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Bu istifadəçi mövcud deyil",
"error-user-notAllowSelf": "Özünüzü dəvət edə bilməzsiniz",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Minikartda örtük şəkli",
"badge-attachment-on-minicard": "Minikartdakı qoşmaların sayı",
"card-sorting-by-number-on-minicard": "Minikartda nömrəyə görə kartın çeşidlənməsi",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Tam yolu olan prefiks",
"prefix-with-parent": "Valideyn ilə prefiks",
"subtext-with-full-path": "Tam yolu olan alt mətn",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Ваш CSV(Вредности раздвојене зарезом)/TSV (Вредности раздвојене табулатором) не укључује исправну информацију у предвиђеном облику",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Този списък не съществува",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Този потребител не съществува",
"error-user-notAllowSelf": "Не можете да поканите себе си",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Мотив из предметне грађе",
"badge-attachment-on-minicard": "Број поред спајалице",
"card-sorting-by-number-on-minicard": "Бројчана ознака за редослед",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Представка с пълен път",
"prefix-with-parent": "Представка с източник",
"subtext-with-full-path": "Под-текст с пълен път",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Votre fichier CSV (valeurs séparées par des virgules) / TSV (valeurs séparées par des tabulations) ne contient pas d'informations au bon format",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Cette liste n'existe pas",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Cet utilisateur n'existe pas",
"error-user-notAllowSelf": "Vous ne pouvez pas vous inviter vous-même",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Vignette sur la mini-carte",
"badge-attachment-on-minicard": "Compteur de pièces jointes sur la mini-carte",
"card-sorting-by-number-on-minicard": "Tri numérique des cartes sur la mini-carte",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Préfixer avec le chemin complet",
"prefix-with-parent": "Préfixer avec le parent",
"subtext-with-full-path": "Sous-titre avec le chemin complet",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "El teu CSV no inclou la informació en el format correcte.",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "La llista no existeix",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "L'usuari no existeix",
"error-user-notAllowSelf": "No et pots convidar a la teva matriu",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix amb camí complet",
"prefix-with-parent": "Prefix amb el pare",
"subtext-with-full-path": "Subtext amb camí complet",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "El teu CSV no inclou la informació en el format correcte.",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "La llista no existeix",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "L'usuari no existeix",
"error-user-notAllowSelf": "No et pots convidar a la teva matriu",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagen de portada de la minitarjeta",
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix amb camí complet",
"prefix-with-parent": "Prefix amb el pare",
"subtext-with-full-path": "Subtext amb camí complet",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "El teu CSV no inclou la informació en el format correcte.",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "La llista no existeix",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "L'usuari no existeix",
"error-user-notAllowSelf": "No et pots convidar a la teva matriu",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix amb camí complet",
"prefix-with-parent": "Prefix amb el pare",
"subtext-with-full-path": "Subtext amb camí complet",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "您的 CSV(逗号分隔值)/TSV(制表符分隔值)未包含格式正确的正确信息",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "该列表不存在",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "该用户不存在",
"error-user-notAllowSelf": "您不能邀请自己",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "迷你卡上的封面图片",
"badge-attachment-on-minicard": "迷你卡上的附件计数",
"card-sorting-by-number-on-minicard": "按迷你卡上的编号对卡片进行分类",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "带完整路径的前缀",
"prefix-with-parent": "带有父级的前缀",
"subtext-with-full-path": "带有完整路径的副文本",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Váš CSV (Comma Separated Values)/TSV (Tab Separated Values) neobsahuje správné informace ve správném formátu.",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Tento sloupec ;neexistuje",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Tento uživatel neexistuje",
"error-user-notAllowSelf": "Nemůžeš pozvat sám sebe",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Titulní obrázek na minikartě",
"badge-attachment-on-minicard": "Počet příloh na minikartě",
"card-sorting-by-number-on-minicard": "Řazení karet podle čísla na minikartě",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix s celou cestou",
"prefix-with-parent": "Prefix s předkem",
"subtext-with-full-path": "Podtext s celou cestou",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Váš CSV (Comma Separated Values)/TSV (Tab Separated Values) neobsahuje správné informace ve správném formátu.",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Tento sloupec ;neexistuje",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Tento uživatel neexistuje",
"error-user-notAllowSelf": "Nemůžeš pozvat sám sebe",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Titulní obrázek na minikartě",
"badge-attachment-on-minicard": "Počet příloh na minikartě",
"card-sorting-by-number-on-minicard": "Řazení karet podle čísla na minikartě",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix s celou cestou",
"prefix-with-parent": "Prefix s předkem",
"subtext-with-full-path": "Podtext s celou cestou",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Nid yw eich CSV(Comma Separated Values)/TSV (Tab Separated Values) yn cynnwys y wybodaeth gywir yn y fformat cywir",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Nid yw'r rhestr hon yn bodoli",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Nid yw'r defnyddiwr hwn yn bodoli",
"error-user-notAllowSelf": "Ni allwch wahodd eich hun",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Llun clawr ar minicard",
"badge-attachment-on-minicard": "Cyfrif yr atodiadau ar miniard",
"card-sorting-by-number-on-minicard": "Didoli cardiau yn ôl rhif ar minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Rhagddodiad gyda llwybr llawn",
"prefix-with-parent": "Rhagddodiad gyda rhiant",
"subtext-with-full-path": "Is-destun gyda llwybr llawn",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Nid yw eich CSV(Comma Separated Values)/TSV (Tab Separated Values) yn cynnwys y wybodaeth gywir yn y fformat cywir",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Nid yw'r rhestr hon yn bodoli",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Nid yw'r defnyddiwr hwn yn bodoli",
"error-user-notAllowSelf": "Ni allwch wahodd eich hun",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Llun clawr ar minicard",
"badge-attachment-on-minicard": "Cyfrif yr atodiadau ar miniard",
"card-sorting-by-number-on-minicard": "Didoli cardiau yn ôl rhif ar minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Rhagddodiad gyda llwybr llawn",
"prefix-with-parent": "Rhagddodiad gyda rhiant",
"subtext-with-full-path": "Is-destun gyda llwybr llawn",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Din CSV (Comma Separated Values)/TSV (Tab Separated Values) indeholder ikke gyldig information i korrekt format",
"error-import-empty-board": "Denne eksport indeholder intet tavleindhold (ingen svømmebaner, lister eller kort). Den kan være oprettet af en ældre WeKan-version med en kendt eksportfejl. Eksporter tavlen igen med den aktuelle version, og importer den nye fil.",
"error-list-doesNotExist": "Listen findes ikke",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Brugeren findes ikke",
"error-user-notAllowSelf": "Du kan ikke invitere dig selv",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Omslagsbild på minikort",
"badge-attachment-on-minicard": "Antal bilagor på minikort",
"card-sorting-by-number-on-minicard": "Sortering av kort efter nummer på minikort",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Præfiks med fuld sti",
"prefix-with-parent": "Præfiks med overordnede",
"subtext-with-full-path": "Undertekst med fuld sti",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Deine CSV(Kommatgetrennte Werte)/TSV (Tab getrennte Werte) enthält keine korrekten Informationen im geforderten Format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Diese Liste existiert nicht",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Dieser Nutzer existiert nicht",
"error-user-notAllowSelf": "Sie können sich nicht selbst einladen.",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover Bild auf Minikarte",
"badge-attachment-on-minicard": "Anzahl der Anhänge auf Minikarte",
"card-sorting-by-number-on-minicard": "Kartensortierung nach Nummer auf Minikarte",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Vollständiger Pfad über Titel",
"prefix-with-parent": "Über Titel",
"subtext-with-full-path": "Vollständiger Pfad unter Titel",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Deine CSV(Kommatgetrennte Werte)/TSV (Tab getrennte Werte) enthält keine korrekten Informationen im geforderten Format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Diese Liste existiert nicht",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Dieser Nutzer existiert nicht",
"error-user-notAllowSelf": "Sie können sich nicht selbst einladen.",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover Bild auf Minikarte",
"badge-attachment-on-minicard": "Anzahl der Anhänge auf Minikarte",
"card-sorting-by-number-on-minicard": "Kartensortierung nach Nummer auf Minikarte",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Vollständiger Pfad über Titel",
"prefix-with-parent": "Über Titel",
"subtext-with-full-path": "Vollständiger Pfad unter Titel",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Deine CSV(Kommatgetrennte Werte)/TSV (Tab getrennte Werte) enthält keine korrekten Informationen im geforderten Format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Diese Liste existiert nicht",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Dieser Nutzer existiert nicht",
"error-user-notAllowSelf": "Sie können sich nicht selbst einladen.",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover Bild auf Minikarte",
"badge-attachment-on-minicard": "Anzahl der Anhänge auf Minikarte",
"card-sorting-by-number-on-minicard": "Kartensortierung nach Nummer auf Minikarte",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Vollständiger Pfad über Titel",
"prefix-with-parent": "Über Titel",
"subtext-with-full-path": "Vollständiger Pfad unter Titel",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Deine CSV(Kommatgetrennte Werte)/TSV (Tab getrennte Werte) enthält keine korrekten Informationen im geforderten Format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Diese Liste existiert nicht",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Dieser Nutzer existiert nicht",
"error-user-notAllowSelf": "Sie können sich nicht selbst einladen.",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover Bild auf Minikarte",
"badge-attachment-on-minicard": "Anzahl der Anhänge auf Minikarte",
"card-sorting-by-number-on-minicard": "Kartensortierung nach Nummer auf Minikarte",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Vollständiger Pfad über Titel",
"prefix-with-parent": "Über Titel",
"subtext-with-full-path": "Vollständiger Pfad unter Titel",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Il tuo file CSV (Comma Separated Values) / TSV (Tab Separated Values) non contiene le giuste informazioni nel formato corretto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Η λίστα δεν υπάρχει",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Ο χρήστης δεν υπάρχει",
"error-user-notAllowSelf": "Δε μπορείτε να αυτοπροσκληθείτε",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Immagine di copertina su minicard",
"badge-attachment-on-minicard": "Conteggio degli allegati sulla minicard",
"card-sorting-by-number-on-minicard": "La scheda viene ordinata per numero sulla minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefisso con percorso completo",
"prefix-with-parent": "Prefisso con genitore",
"subtext-with-full-path": "Sottotesto con percorso completo",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Il tuo file CSV (Comma Separated Values) / TSV (Tab Separated Values) non contiene le giuste informazioni nel formato corretto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Η λίστα δεν υπάρχει",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Ο χρήστης δεν υπάρχει",
"error-user-notAllowSelf": "Δε μπορείτε να αυτοπροσκληθείτε",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Immagine di copertina su minicard",
"badge-attachment-on-minicard": "Conteggio degli allegati sulla minicard",
"card-sorting-by-number-on-minicard": "La scheda viene ordinata per numero sulla minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefisso con percorso completo",
"prefix-with-parent": "Prefisso con genitore",
"subtext-with-full-path": "Sottotesto con percorso completo",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "This list does not exist",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Su CSV(Valores separados por coma)/TSV(Valores separados por tab) no incluyen la información apropiada en el formato correcto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Tio listo ne ekzistas",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Tio uzanto ne ekzistas",
"error-user-notAllowSelf": "No puedes invitarte a ti mismo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagen de portada de la minitarjeta",
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefijo con ruta completa",
"prefix-with-parent": "Prefijo con el padre",
"subtext-with-full-path": "Subtexto con ruta completa",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Su CSV(Valores separados por coma)/TSV(Valores separados por tab) no incluyen la información apropiada en el formato correcto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Esta lista no existe",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Este usuario no existe",
"error-user-notAllowSelf": "No podés invitarte a vos mismo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagen de portada de la minitarjeta",
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefijo con ruta completa",
"prefix-with-parent": "Prefijo con el padre",
"subtext-with-full-path": "Subtexto con ruta completa",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Su CSV(Valores separados por coma)/TSV(Valores separados por tab) no incluyen la información apropiada en el formato correcto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "La lista no existe",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "El usuario no existe",
"error-user-notAllowSelf": "No puedes invitarte a ti mismo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagen de portada de la minitarjeta",
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefijo con ruta completa",
"prefix-with-parent": "Prefijo con el padre",
"subtext-with-full-path": "Subtexto con ruta completa",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Su CSV(Valores separados por coma)/TSV(Valores separados por tab) no incluyen la información apropiada en el formato correcto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "La lista no existe",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "El usuario no existe",
"error-user-notAllowSelf": "No puedes invitarte a ti mismo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagen de portada de la minitarjeta",
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefijo con ruta completa",
"prefix-with-parent": "Prefijo con el padre",
"subtext-with-full-path": "Subtexto con ruta completa",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Su CSV(Valores separados por coma)/TSV(Valores separados por tab) no incluyen la información apropiada en el formato correcto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "La lista no existe",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "El usuario no existe",
"error-user-notAllowSelf": "No puedes invitarte a ti mismo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagen de portada de la minitarjeta",
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefijo con ruta completa",
"prefix-with-parent": "Prefijo con el padre",
"subtext-with-full-path": "Subtexto con ruta completa",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Su CSV(Valores separados por coma)/TSV(Valores separados por tab) no incluyen la información apropiada en el formato correcto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "La lista no existe",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "El usuario no existe",
"error-user-notAllowSelf": "No se puede invitar a sí mismo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagen de portada de la minitarjeta",
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefijo con ruta completa",
"prefix-with-parent": "Prefijo con el padre",
"subtext-with-full-path": "Subtexto con ruta completa",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Su CSV(Valores separados por coma)/TSV(Valores separados por tab) no incluyen la información apropiada en el formato correcto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "La lista no existe",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "El usuario no existe",
"error-user-notAllowSelf": "No puedes invitarte a ti mismo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagen de portada de la minitarjeta",
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefijo con ruta completa",
"prefix-with-parent": "Prefijo con el padre",
"subtext-with-full-path": "Subtexto con ruta completa",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Su CSV(Valores separados por coma)/TSV(Valores separados por tab) no incluyen la información apropiada en el formato correcto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "La lista no existe",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "El usuario no existe",
"error-user-notAllowSelf": "No puedes invitarte a ti mismo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagen de portada de la minitarjeta",
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefijo con ruta completa",
"prefix-with-parent": "Prefijo con el padre",
"subtext-with-full-path": "Subtexto con ruta completa",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Su CSV(Valores separados por coma)/TSV(Valores separados por tab) no incluyen la información apropiada en el formato correcto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "La lista no existe",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "El usuario no existe",
"error-user-notAllowSelf": "No puedes invitarte a ti mismo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagen de portada de la minitarjeta",
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefijo con ruta completa",
"prefix-with-parent": "Prefijo con el padre",
"subtext-with-full-path": "Subtexto con ruta completa",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Seda nimekirja ei ole olemas",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Seda kasutajat ei ole olemas",
"error-user-notAllowSelf": "Te ei saa ennast kutsuda",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Täieliku teekonna eesliide",
"prefix-with-parent": "Esileht koos vanemaga",
"subtext-with-full-path": "Täieliku teekonnaga alltekst",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Zure CSV (komaz bereizitako balioak)/TSV (tabulazio bereizitako balioak) ez du informazio egokia formatu egokian sartzen",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Zerrenda hau ez da existitzen",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Erabiltzaile hau ez da existitzen",
"error-user-notAllowSelf": "Ezin duzu zure burua gonbidatu",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "minitxartelaren azalaren irudia",
"badge-attachment-on-minicard": "Eranskinen kopurua minitxartelean",
"card-sorting-by-number-on-minicard": "Txartelak zenbakien arabera ordenatzea minitxartelean",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefijo con ruta completa",
"prefix-with-parent": "Prefijo con el padre",
"subtext-with-full-path": "Subtexto con ruta completa",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "لا يتضمن ملف CSV (القيم المفصولة بفواصل)/TSV (القيم المفصولة بعلامات التبويب) الخاص بك المعلومات الصحيحة بالتنسيق الصحيح",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "این لیست موجود نیست",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "این کاربر وجود ندارد",
"error-user-notAllowSelf": "عدم امکان دعوت خود",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "عکس کاور بر روی مینی کارت",
"badge-attachment-on-minicard": "شمارنده ضمائم بر روی مینی کارت",
"card-sorting-by-number-on-minicard": "مرتب سازی کارت با شماره بر روی مینی کارت",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "پیشوند با مسیر کامل",
"prefix-with-parent": "پیشوند با خانواده",
"subtext-with-full-path": "زیرنویس با مسیر کامل",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "لا يتضمن ملف CSV (القيم المفصولة بفواصل)/TSV (القيم المفصولة بعلامات التبويب) الخاص بك المعلومات الصحيحة بالتنسيق الصحيح",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "این لیست موجود نیست",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "این کاربر وجود ندارد",
"error-user-notAllowSelf": "عدم امکان دعوت خود",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "عکس کاور بر روی مینی کارت",
"badge-attachment-on-minicard": "شمارنده ضمائم بر روی مینی کارت",
"card-sorting-by-number-on-minicard": "مرتب سازی کارت با شماره بر روی مینی کارت",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "پیشوند با مسیر کامل",
"prefix-with-parent": "پیشوند با خانواده",
"subtext-with-full-path": "زیرنویس با مسیر کامل",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Sinun CSV(pilkulla erotetut arvot)/TSV(tabilla erotetut arvot) ei sisällä oikeita tietoja oikeassa muodossa",
"error-import-empty-board": "Tämä vienti ei sisällä taulun sisältöä (ei uimaratoja, listoja tai kortteja). Se on saatettu luoda vanhemmalla WeKan-versiolla, jossa oli tunnettu vientivirhe. Vie taulu uudelleen nykyisellä versiolla ja tuo uusi tiedosto.",
"error-list-doesNotExist": "Tätä listaa ei ole olemassa",
"error-linked-card-not-allowed": "Voit linkittää vain tavalliseen korttiin. Linkittäminen toiseen linkitettyyn korttiin tai korttiin, joka linkittää takaisin tälle taululle, ei ole sallittua, koska se tekisi korteista käyttökelvottomia.",
"error-user-disabled": "Tämä käyttäjätili on poistettu käytöstä",
"error-user-doesNotExist": "Tätä käyttäjää ei ole olemassa",
"error-user-notAllowSelf": "Et voi kutsua itseäsi",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Kansikuva minikortilla",
"badge-attachment-on-minicard": "Liitteiden määrä minikortilla",
"card-sorting-by-number-on-minicard": "Korttien lajittelu minikortin numeroiden mukaan",
"checklist-count-on-minicard": "Tarkistuslista kohteiden määrä (0/0) minikortilla",
"checklist-count": "Tarkistuslista kohteiden määrä (0/0)",
"attachment-count": "Liitteiden määrä",
"cover-image": "Kansikuva",
"prefix-with-full-path": "Etuliite koko polulla",
"prefix-with-parent": "Etuliite ylätehtävällä",
"subtext-with-full-path": "Aliteksti koko polulla",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Votre fichier CSV (valeurs séparées par des virgules) / TSV (valeurs séparées par des tabulations) ne contient pas d'informations au bon format",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Cette liste n'existe pas",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Cet utilisateur n'existe pas",
"error-user-notAllowSelf": "Vous ne pouvez pas vous inviter vous-même",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Vignette sur la mini-carte",
"badge-attachment-on-minicard": "Compteur de pièces jointes sur la mini-carte",
"card-sorting-by-number-on-minicard": "Tri numérique des cartes sur la mini-carte",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Préfixer avec le chemin complet",
"prefix-with-parent": "Préfixer avec le parent",
"subtext-with-full-path": "Sous-titre avec le chemin complet",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Votre fichier CSV (valeurs séparées par des virgules) / TSV (valeurs séparées par des tabulations) ne contient pas d'informations au bon format",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Cette liste n'existe pas",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Cet utilisateur n'existe pas",
"error-user-notAllowSelf": "Vous ne pouvez pas vous inviter vous-même",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Vignette sur la mini-carte",
"badge-attachment-on-minicard": "Compteur de pièces jointes sur la mini-carte",
"card-sorting-by-number-on-minicard": "Tri numérique des cartes sur la mini-carte",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Préfixer avec le chemin complet",
"prefix-with-parent": "Préfixer avec le parent",
"subtext-with-full-path": "Sous-titre avec le chemin complet",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Votre fichier CSV (valeurs séparées par des virgules) / TSV (valeurs séparées par des tabulations) ne contient pas d'informations au bon format",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Cette liste n'existe pas",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Cet utilisateur n'existe pas",
"error-user-notAllowSelf": "Vous ne pouvez pas vous inviter vous-même",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Vignette sur la mini-carte",
"badge-attachment-on-minicard": "Compteur de pièces jointes sur la mini-carte",
"card-sorting-by-number-on-minicard": "Tri numérique des cartes sur la mini-carte",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Préfixer avec le chemin complet",
"prefix-with-parent": "Préfixer avec le parent",
"subtext-with-full-path": "Sous-titre avec le chemin complet",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Jo CSV (Comma Separated Values)/TSV (Tab Separated Values) befettet net de juste ynformaasje yn it juste formaat",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Dizze list bestiet net",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Dizze brûker bestiet net",
"error-user-notAllowSelf": "Jo kinne net útnoegje dysels",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover ôfbylding op minicard",
"badge-attachment-on-minicard": "Telling fan taheaksels op minicard",
"card-sorting-by-number-on-minicard": "Kaart sortearje op nûmer op minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix mei folslein paad",
"prefix-with-parent": "Prefix mei âlder",
"subtext-with-full-path": "Subtekst mei folslein paad",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "Jo CSV (Comma Separated Values)/TSV (Tab Separated Values) befettet net de juste ynformaasje yn it juste formaat",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Dizze list bestiet net",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Dizze brûker bestiet net",
"error-user-notAllowSelf": "Jo kinne net útnoegje dysels",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Cover ôfbylding op minicard",
"badge-attachment-on-minicard": "Telling fan taheaksels op minicard",
"card-sorting-by-number-on-minicard": "Kaart sortearje op nûmer op minicard",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefix mei folslein paad",
"prefix-with-parent": "Prefix mei âlder",
"subtext-with-full-path": "Subtekst mei folslein paad",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "O CSV(Comma Separated Values)/TSV (Tab Separated Values) não inclui a informação adequada no formato correto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Esta lista non existe",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Este usuario non existe",
"error-user-notAllowSelf": "Non é posíbel convidarse a un mesmo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagem de capa no mini cartão",
"badge-attachment-on-minicard": "Contador de anexos no mini cartão",
"card-sorting-by-number-on-minicard": "Número de ordenação do cartão no mini cartão",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefixar com o caminho completo",
"prefix-with-parent": "Prefixar com o pai",
"subtext-with-full-path": "Sub-texto com o caminho completo",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "O CSV(Comma Separated Values)/TSV (Tab Separated Values) não inclui a informação adequada no formato correto",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "Esta lista non existe",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "Este usuario non existe",
"error-user-notAllowSelf": "Non é posíbel convidarse a un mesmo",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "Imagem de capa no mini cartão",
"badge-attachment-on-minicard": "Contador de anexos no mini cartão",
"card-sorting-by-number-on-minicard": "Número de ordenação do cartão no mini cartão",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "Prefixar com o caminho completo",
"prefix-with-parent": "Prefixar com o pai",
"subtext-with-full-path": "Sub-texto com o caminho completo",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "તમારા CSV(કોમા સેપરેટેડ વેલ્યુઝ)/TSV (ટૅબ સેપરેટેડ વેલ્યુઝ)માં યોગ્ય ફોર્મેટમાં યોગ્ય માહિતી શામેલ નથી",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "આ સૂચિ અસ્તિત્વમાં નથી",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "આ વપરાશકર્તા અસ્તિત્વમાં નથી",
"error-user-notAllowSelf": "તમે તમારી જાતને આમંત્રિત કરી શકતા નથી",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "મિનીકાર્ડ પર કવર છબી",
"badge-attachment-on-minicard": "મિનીકાર્ડ પર જોડાણોની ગણતરી",
"card-sorting-by-number-on-minicard": "મિનીકાર્ડ પર નંબર દ્વારા કાર્ડનું વર્ગીકરણ",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "સંપૂર્ણ પાથ સાથે ઉપસર્ગ",
"prefix-with-parent": "પિતૃ સાથે ઉપસર્ગ",
"subtext-with-full-path": "સંપૂર્ણ પાથ સાથે સબટેક્સ્ટ",
+5
View File
@@ -508,6 +508,7 @@
"error-csv-schema": "קובץ ה־CSV(ערכים מופרדים בפסיקים)/TSV(ערכים מופרדים בטאבים) לא מכילים את המידע הנכון בצורה הנכונה",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "רשימה זו לא קיימת",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "This user account is disabled",
"error-user-doesNotExist": "משתמש זה לא קיים",
"error-user-notAllowSelf": "אינך יכול להזמין את עצמך",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "תמונת כותרת על כרטיסון",
"badge-attachment-on-minicard": "כמות הצרופות בכרטיסון",
"card-sorting-by-number-on-minicard": "מיון כרטיסים לפי מספר בכרטיסון",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "קידומת עם נתיב מלא",
"prefix-with-parent": "קידומת עם הורה",
"subtext-with-full-path": "טקסט סמוי עם נתיב מלא",
+25 -20
View File
@@ -125,8 +125,8 @@
"list-width-personal-note": "הרוחב הזה הוא רק בשבילך.",
"personal-list-width": "רוחבי רשימות אישיות",
"personal-list-width-description": "When on, each user keeps their own list widths. When off, list widths are shared with everyone on the board.",
"fixed-list-width": "Same width for all lists",
"click-to-enable-fixed-list-width": "Same width for all lists disabled. Click to enable.",
"fixed-list-width": "אותו רוחב לכל הרשימות",
"click-to-enable-fixed-list-width": "אותו רוחב לכל הרשימות הושבת. יש ללחוץ כדי להפעיל.",
"click-to-disable-fixed-list-width": "Same width for all lists enabled. Click to disable.",
"fixed-list-width-note": "When on, all lists have the same width, and resizing one list resizes all lists. This setting is only for you.",
"keyboard-shortcuts-enabled": "קיצורי מקלדת פעילים. לחיצה תשבית אותם.",
@@ -508,6 +508,7 @@
"error-csv-schema": "קובץ ה־CSV(ערכים מופרדים בפסיקים)/TSV(ערכים מופרדים בטאבים) לא מכילים את המידע הנכון בצורה הנכונה",
"error-import-empty-board": "This export contains no board content (no swimlanes, lists or cards). It may have been created by an older WeKan version with a known export bug. Please re-export the board with the current version and import the new file.",
"error-list-doesNotExist": "רשימה זו לא קיימת",
"error-linked-card-not-allowed": "You can only link to a normal card. Linking to another linked card, or to a card that links back to this board, is not allowed because it would make the cards inaccessible.",
"error-user-disabled": "חשבון המשתמש הזה מושבת",
"error-user-doesNotExist": "משתמש זה לא קיים",
"error-user-notAllowSelf": "אינך יכול להזמין את עצמך",
@@ -844,13 +845,13 @@
"attachment-transfer-limits-description": "Configure maximum file size limits for uploads and downloads. API transfer buffering has separate server-side safety caps.",
"attachment-transfer-limits-saved": "Attachment transfer limits saved.",
"attachment-transfer-limits-save-failed": "Failed to save attachment transfer limits",
"attachment-transfer-limits-invalid-value": "Please enter a valid positive limit value",
"attachment-upload-limit-label": "Attachments upload max file size",
"attachment-transfer-limits-invalid-value": "נא למלא ערך גבול חיובי תקף",
"attachment-upload-limit-label": "גודל קובץ מרבי להעלאת צרופות",
"avatars-upload-blocked-label": "תמונות ייצוגיות",
"avatars-upload-blocked-description": "Block users from uploading new avatars (useful when avatars are synced from another source). Avatars are enabled by default.",
"attachment-download-limit-label": "Attachments download max file size",
"api-upload-limit-label": "API upload max file size",
"api-download-limit-label": "API download max file size",
"api-upload-limit-label": "גודל קובץ מרבי להעלאה דרך API",
"api-download-limit-label": "גודל קובץ מרבי להורדה דרך API",
"attachment-limit-mode-unlimited": "לא מוגבל",
"attachment-limit-mode-max-size": "גודל קובץ מרבי",
"attachment-limit-mode-blocked": "חסום",
@@ -974,6 +975,10 @@
"cover-attachment-on-minicard": "תמונת כותרת על כרטיסון",
"badge-attachment-on-minicard": "כמות הצרופות בכרטיסון",
"card-sorting-by-number-on-minicard": "מיון כרטיסים לפי מספר בכרטיסון",
"checklist-count-on-minicard": "Checklist item count (0/0) on minicard",
"checklist-count": "Checklist item count (0/0)",
"attachment-count": "Count of attachments",
"cover-image": "Cover image",
"prefix-with-full-path": "קידומת עם נתיב מלא",
"prefix-with-parent": "קידומת עם הורה",
"subtext-with-full-path": "טקסט סמוי עם נתיב מלא",
@@ -1063,7 +1068,7 @@
"r-mark-complete": "Mark card complete",
"r-mark-incomplete": "Mark card incomplete",
"r-move-all-cards": "Move all cards in list",
"r-set-date-relative": "Set date relative to now",
"r-set-date-relative": "הגדרת התאריך ביחס לעכשיו",
"r-trigger": "הקפצה",
"r-action": "פעולה",
"r-when-a-card": "כאשר כרטיס",
@@ -1636,7 +1641,7 @@
"default-save-storage": "Default Save Storage",
"default-save-storage-description": "Choose the storage backend where newly uploaded attachments are saved.",
"default-save-storage-saved": "Default save storage saved",
"default-save-storage-save-failed": "Failed to save default storage",
"default-save-storage-save-failed": "שמירת אחסון ברירת המחדל נכשלה",
"move-progress-file": "קובץ",
"move-progress-pause": "השהיה",
"move-progress-resume": "Resume",
@@ -1793,30 +1798,30 @@
"filesystem-enabled-description": "להשתמש במערכת הקבצים המקומית לאחסון קבצים",
"storage-read": "Read",
"storage-enabled": "פעיל",
"s3-minio-storage-description": "S3-compatible object storage: AWS S3, MinIO, Cloudflare R2, Backblaze B2, Wasabi, DigitalOcean Spaces and others.",
"s3-force-path-style": "Force path-style URLs",
"s3-force-path-style-description": "Required by MinIO and most non-AWS S3-compatible servers.",
"s3-minio-storage-description": "אחסון עצמים תואם S3‏: AWS S3,‏ MinIO,‏ Cloudflare R2,‏ Backblaze B2,‏ Wasabi,‏ DigitalOcean Spaces ואחרים.",
"s3-force-path-style": "אילוץ כתובות סגנון נתיב",
"s3-force-path-style-description": "נדרש על ידי MinIO ורוב השרתים תואמי S3 שאינם AWS.",
"azure-blob-storage": "Azure Blob Storage",
"azure-blob-storage-description": "Microsoft Azure Blob Storage.",
"azure-account-name": "שם חשבון",
"azure-account-key": "מפתח חשבון",
"azure-connection-string": "מחרוזת חיבור",
"azure-connection-string-description": "Optional: use a full connection string instead of account name and key.",
"azure-container": "Container",
"azure-connection-string-description": "רשות: אפשר להשתמש במחרוזת החיבור המלאה במקום בשם החשבון והמפתח.",
"azure-container": "מכולה",
"gcs-storage": "Google Cloud Storage",
"gcs-storage-description": "Google Cloud Storage.",
"gcs-project-id": "מזהה מיזם",
"gcs-bucket": "Bucket",
"gcs-key-filename": "Service account key file path",
"gcs-key-filename-description": "Optional: path to a service account JSON key file on the server.",
"gcs-credentials": "Service account credentials (JSON)",
"gcs-credentials-description": "Optional: paste the service account JSON key. Leave blank to use the key file or default credentials.",
"gcs-key-filename": "נתיב קובץ מפתח חשבון שירות",
"gcs-key-filename-description": "רשות: נתיב לקובץ מפתח JSON לחשבון שירות בשרת.",
"gcs-credentials": "פרטי גישה לחשבון שירות (JSON)",
"gcs-credentials-description": "רשות: להדביק את מפתח ה־JSON של חשבון השירות. אפשר להשאיר ריק כדי להשתמש בקובץ המפתח או בפרטי הגישה כברירת המחדל.",
"gcs-permissions-note": "Give WeKan's service account read/write access to the bucket: Google Cloud Console → Cloud Storage → Buckets → your bucket → Permissions → Grant access. In \"New principals\", paste the service account email — the \"client_email\" value from your JSON key — then choose the role \"Storage Object Admin\" and Save.",
"cloud-secret-keep-blank": "Leave blank to keep the current value.",
"azure-account-name-description": "The name of your Azure Storage account.",
"cloud-secret-keep-blank": "אפשר להשאיר ריק כדי לשמר את הערך הנוכחי.",
"azure-account-name-description": "שם החשבון שלך ב־Azure Storage.",
"azure-container-description": "The blob container to store files in.",
"gcs-project-id-description": "Your Google Cloud project id.",
"gcs-bucket-description": "The name of the Cloud Storage bucket to store files in.",
"gcs-bucket-description": "שם הדלי באחסון הענן לאחסון קבצים.",
"s3-endpoint-menu-path": "AWS: leave blank (uses the region endpoint). S3-compatible: the Endpoint URL from your MinIO / Cloudflare R2 / Backblaze B2 / Wasabi / DigitalOcean Spaces console.",
"s3-region-menu-path": "AWS Console → S3 → Buckets → your bucket → Properties → AWS Region.",
"s3-bucket-menu-path": "AWS Console → S3 → Buckets → your bucket name (or Create bucket → Bucket name).",
Loaded 100 of 252 files, more files were not shown because too many files have changed in this diff. Show more