Compare commits

...
17 Commits
Author SHA1 Message Date
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
23 changed files with 303 additions and 421 deletions

No files matched your search

+74
View File
@@ -41,6 +41,72 @@ them up next.
[#3823](https://github.com/wekan/wekan/issues/3823), [#3138](https://github.com/wekan/wekan/issues/3138),
[#2204](https://github.com/wekan/wekan/issues/2204) (restrict permanent delete to the Admin role).
# v9.73 2026-06-26 WeKan ® release
This release fixes the following bugs:
- [Mobile UI still too large at All Boards / iPhone 12 mini](https://github.com/wekan/wekan/issues/6426),
[#6426](https://github.com/wekan/wekan/issues/6426): the first revert only cleaned
`boardsList.css`, leaving the same forced "2x/3x bigger on mobile" rules in `header.css`
(`#header-quick-access` logo/quick-access bar) and `boardBody.css` (`#content` — which the
All Boards list and popups render inside) and the iPhone card-details body text. Those are now
neutralized to normal size too, and the iPhone-12-mini header blocks that had grown tall and
wrapped (to fit the 3x text) are back to a compact single row. The #6419 mobile touch-target
icon sizes in the card-details header are intentionally kept.
Fixed in [219ee659e](https://github.com/wekan/wekan/commit/219ee659e).
- Drag-to-scroll (dragscroll) not working on the Login, Register and All Boards pages: the page
helper tagged `<body>` with the `dragscroll` class, but on phones `body.mobile-mode` is
`position: fixed` and the real scroll container becomes `#content`, so tagging only `<body>`
could never scroll on those pages (Login/Register have no `#content` and correctly use
`<body>`). `enablePageDragscroll`/`disablePageDragscroll` now tag whichever element actually
scrolls — both `<body>` and `#content` when present — so only the overflowing one scrolls (no
double-scroll). Touch one-finger scrolling (`dragscrollTouch.js`) already picks the nearest
scrollable `.dragscroll` ancestor, so `#content` wins over `<body>` when both are tagged.
Fixed in [219ee659e](https://github.com/wekan/wekan/commit/219ee659e).
- Drag-to-scroll now works on **every** whole-page layout in both mobile and desktop modes, not
just All Boards / My Cards / Login / Register. It was wired into only those few templates, so
Due Cards, Global Search, Public, Bookmarks, Broken Cards, Settings, People, Admin Reports,
Attachments, Translation, Import, board Rules and the Not Found page had no page drag-scroll at
all. The per-template enable/disable calls (which also fought each other when navigating between
two non-board pages) were replaced by a single route-aware autorun in `defaultLayout` (the
persistent shell that owns `#content`): every non-board route tags the real scroll container
(`<body>` + `#content`), and the board-canvas routes (`board` / `board-short` / `card`) leave it
off so their own `.board-canvas.dragscroll` keeps handling the drag. Login / Register keep their
own enable/disable because they use `userFormsLayout` (no `#content`).
Fixed in [88f353dc1](https://github.com/wekan/wekan/commit/88f353dc1).
- Login / Register pages not scrollable on phones — the sign-up / sign-in link, legal notice and
language selector below the form were unreachable (and hidden behind the on-screen keyboard). On
mobile, `body.mobile-mode` pins `<body>` to `position: fixed` + `height: 100vh` (an iOS
board-view anti-bounce fix), but the auth pages have no inner `#content` scroller and their
`.auth-layout`/`.auth-dialog` were sized to the viewport height, so the page was trapped at
100vh. `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 layout/dialog growing to their content. Scoped to
`.userform-layout` so the board-view mobile lock is unchanged.
Fixed in [4a7df3745](https://github.com/wekan/wekan/commit/4a7df3745).
Thanks to above GitHub users for their contributions and translators for their translations.
# v9.72 2026-06-26 WeKan ® release
This release fixes the following bugs:
- Fixed `api.py` `addcustomfieldtoboard` crashing on an empty `settings` argument. The CLI did
`settings = str(json.loads(sys.argv[6]))`, so `json.loads('')` raised `JSONDecodeError` and
the command aborted before sending the request (a bug api.py's own header comment flagged).
Empty settings now default to `{}` and are sent as valid JSON via `json.dumps` instead of
`str(dict)` (which produced invalid JSON with single quotes). Verified that both empty and
object settings (e.g. `{"currencyCode":"EUR"}`) create the custom field.
Fixed in [487cf3f96](https://github.com/wekan/wekan/commit/487cf3f9632d747665bd14e4a0e43159760a49c6).
- [Mobile UI too large at All Boards and top bars](https://github.com/wekan/wekan/issues/6426),
[#6426](https://github.com/wekan/wekan/issues/6426): reverted the recent forced mobile
2x/3x UI scaling rules that made All Boards and quick-access/header controls render oversized,
while keeping the small-screen All Boards layout collapse so the left menu still stacks above
the board grid on narrow screens.
Fixed in [f7a2a3ace5ebc6ac2c8ecef10a2d0477ab7b3e2c](https://github.com/wekan/wekan/commit/f7a2a3ace5ebc6ac2c8ecef10a2d0477ab7b3e2c).
Thanks to above GitHub users for their contributions and translators for their translations.
# v9.71 2026-06-23 WeKan ® release
This release adds the following features:
@@ -122,6 +188,8 @@ and fixes the following bugs:
translating in the email notification, `EmailLocalization.sendEmail` and outgoing webhook paths.
Fixed in [22f996903](https://github.com/wekan/wekan/commit/22f996903b09d35e3aa959a9aa65b30204e12202).
Thanks to above GitHub users for their contributions and translators for their translations.
# v9.70 2026-06-23 WeKan ® release
This release fixes the following bugs:
@@ -232,6 +300,8 @@ reporter's data requested):
fixed by migrating math rendering from `markdown-it-mathjax3` (which emitted both SVG and MathML) to **Temml**, which
outputs MathML only (`packages/markdown/src/template-integration.js`).
Thanks to above GitHub users for their contributions and translators for their translations.
# v9.69 2026-06-23 WeKan ® release
This release fixes the following bugs:
@@ -304,6 +374,8 @@ reporter's data requested):
lost — the v2.27-era cascade described in the report no longer happens. (A dedicated way to view an archived
swimlane's cards before restoring would be a separate UX improvement.)
Thanks to above GitHub users for their contributions and translators for their translations.
# v9.68 2026-06-23 WeKan ® release
This release adds the following updates and developer tooling:
@@ -513,6 +585,8 @@ reporter's data requested):
renders `activity.createdAt` directly — so changing a due date inserts one new `a-dueAt` activity and cannot re-date
existing ones.
Thanks to above GitHub users for their contributions and translators for their translations.
# v9.67 2026-06-21 WeKan ® release
This release fixes the following bugs:
+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.73
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.73.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;
+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() {
+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 -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.73-win64.zip](https://github.com/wekan/wekan/releases/download/v9.73/wekan-9.73-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.73-win64.zip` , inside it is directory `bundle`, to it copy other files:
```
bundle (directory)
+13 -13
View File
@@ -1063,7 +1063,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": "כאשר כרטיס",
@@ -1793,30 +1793,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).",
+49 -49
View File
@@ -1,17 +1,17 @@
{
"accept": "接受",
"activity-changedTitle": "changed title to %s of %s",
"act-deleteCard": "deleted card __card__ from list __list__ at swimlane __swimlane__ at board __board__",
"act-removeBoard": "deleted board __board__",
"act-removeList": "deleted list __list__ at board __board__",
"act-removeSwimlane": "deleted swimlane __swimlane__ at board __board__",
"board-members-same-org-team-only": "Add board members only from the same Organization or Team",
"comment-in-reply-to": "In reply to",
"comment-reply": "Reply",
"restrict-comment-editing": "Restrict board admins from editing or deleting other users' comments",
"due-date-changes": "Due date changes",
"due-date-changed-times": "Due date changed %s times",
"error-user-notSameOrgOrTeam": "You can only add users from the same Organization or Team",
"activity-changedTitle": "已將標題改為「%s」,原為「%s」",
"act-deleteCard": "從泳道 __swimlane__ 中的看板 __board__ 所屬的清單 __list__ 中刪除了卡片 __card__",
"act-removeBoard": "刪除看板 __board__",
"act-removeList": "刪除了看板 __board__ 上的清單 __list__",
"act-removeSwimlane": "已刪除看板 __board__ 上的泳道 __swimlane__",
"board-members-same-org-team-only": "僅可新增來自同一組織或團隊的看板成員",
"comment-in-reply-to": "回覆",
"comment-reply": "回覆",
"restrict-comment-editing": "限制看板管理員編輯或刪除其他使用者的留言",
"due-date-changes": "截止日期變更",
"due-date-changed-times": "截止日期已變更 %s 次",
"error-user-notSameOrgOrTeam": "您只能新增來自同一組織或團隊的使用者",
"act-activity-notify": "活動通知",
"act-addAttachment": "附件 __attachment__ 已新增到卡片 __card__ 位於清單 __list__ 泳道 __swimlane__ 看板 __board__",
"act-deleteAttachment": "已刪除的附件__附件__卡片上__卡片__在清單__清單__at swimlane__swimlane__在看板__看板__",
@@ -117,18 +117,18 @@
"add-card-to-top-of-list": "新增卡片至清單頂部",
"add-card-to-bottom-of-list": "新增卡片至清單底部",
"addListPopup-title": "新增清單",
"setListWidthPopup-title": "Set width",
"set-list-width": "Set width",
"set-list-width-value": "List width (pixels)",
"list-width-error-message": "List width must be an integer greater than 270",
"list-width-shared-note": "This width is shared with everyone on this board.",
"list-width-personal-note": "This width is only for you.",
"personal-list-width": "Personal list widths",
"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.",
"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.",
"setListWidthPopup-title": "設定寬度",
"set-list-width": "設定寬度",
"set-list-width-value": "清單寬度(畫素)",
"list-width-error-message": "清單寬度必須為大於 270 的整數",
"list-width-shared-note": "此寬度與本看板的所有使用者共享。",
"list-width-personal-note": "此寬度僅適用於您。",
"personal-list-width": "個人清單寬度",
"personal-list-width-description": "開啟此功能時,每位使用者會保留自己的清單寬度設定;關閉此功能時,清單寬度設定將與該看板的所有使用者共用。",
"fixed-list-width": "所有清單的寬度均相同",
"click-to-enable-fixed-list-width": "已停用「所有清單寬度相同」功能。點擊以啟用。",
"click-to-disable-fixed-list-width": "已啟用「所有清單寬度相同」功能。點擊以停用。",
"fixed-list-width-note": "啟用此功能後,所有清單的寬度將統一,調整其中一個清單的寬度時,所有清單的寬度都會隨之調整。此設定僅對您本人生效。",
"keyboard-shortcuts-enabled": "已啟用鍵盤快捷鍵。點選以停用。",
"keyboard-shortcuts-disabled": "已停用鍵盤快捷鍵。點選以啟用。",
"setSwimlaneHeightPopup-title": "設定泳道高度",
@@ -209,7 +209,7 @@
"board-private-info": "此看板將被設為<strong>私有</strong>。",
"board-public-info": "此看板將被設為<strong>公開</strong>。",
"board-drag-drop-reorder-or-click-open": "拖放以重新排序看板圖示。點擊看板圖示開啟看板。",
"board-open-and-move-between-remaining-and-workspaces": "點擊以開啟看板。使用拖曳把手將看板分配給 __工作空間__(拖曳至側邊欄中的工作空間上)。",
"board-open-and-move-between-remaining-and-workspaces": "點擊以開啟看板。使用拖曳把手將看板分配給 __workspaces__(拖曳至側邊欄中的工作空間上)。",
"boardChangeColorPopup-title": "變更看板背景",
"boardChangeBackgroundImagePopup-title": "變更背景圖片",
"allBoardsChangeColorPopup-title": "變更顏色",
@@ -508,7 +508,7 @@
"error-csv-schema": "您的 CSV(逗號分隔值)/TSV(製表符分隔值)並未以正確的格式包含適合的資訊",
"error-import-empty-board": "此匯出檔不含看板內容(無泳道、清單或卡片)。此檔可能是由較舊的 WeKan 版本所建立,該版本存在已知的匯出錯誤。請使用最新版本重新匯出看板,並匯入新檔。",
"error-list-doesNotExist": "此清單不存在",
"error-user-disabled": "This user account is disabled",
"error-user-disabled": "此使用者帳號已停用",
"error-user-doesNotExist": "該使用者不存在",
"error-user-notAllowSelf": "不允許對自己執行此操作",
"error-user-notCreated": "該使用者未能成功新增",
@@ -517,7 +517,7 @@
"error-teamname-taken": "這個團隊名稱已被使用",
"error-email-taken": "Email 已被使用",
"export-board": "匯出看板",
"export-board-without-attachments": "without attachments",
"export-board-without-attachments": "無附件",
"user-can-not-export-excel": "使用者無法匯出至 Excel",
"export-card": "匯出卡片",
"export-card-pdf": "匯出卡片至 PDF",
@@ -747,7 +747,7 @@
"remove-label": "移除標籤",
"listDeletePopup-title": "刪除清單?",
"remove-member": "移除成員",
"deleted-user": "Deleted user",
"deleted-user": "已刪除的使用者",
"remove-member-from-card": "從該卡片中移除",
"remove-member-pop": "確定從 __boardTitle__ 中移除 __name__ (__username__) 嗎? 該成員將被從該看板的所有卡片中移除,同時他會收到一則提醒。",
"removeMemberPopup-title": "移除成員?",
@@ -847,7 +847,7 @@
"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.",
"avatars-upload-blocked-description": "禁止使用者上傳新大頭照(當大頭照從其他來源同步時,此功能相當實用)。預設情況下,大頭照功能是啟用的。",
"attachment-download-limit-label": "附件下載最大檔案大小",
"api-upload-limit-label": "API 上傳最大檔案大小",
"api-download-limit-label": "API 下載最大檔案大小",
@@ -928,12 +928,12 @@
"active": "啟用",
"active-team": "活躍團隊",
"active-org": "活躍組織",
"org-shared-templates": "Shared Templates",
"org-propagate-members-to-boards": "Propagate Members To Boards",
"org-sync-members-from-auth": "Sync Members From Auth Provider",
"team-shared-templates": "Shared Templates",
"team-propagate-members-to-boards": "Propagate Members To Boards",
"team-sync-members-from-auth": "Sync Members From Auth Provider",
"org-shared-templates": "共享範本",
"org-propagate-members-to-boards": "將成員複製到看板",
"org-sync-members-from-auth": "從身份驗證提供者同步成員",
"team-shared-templates": "共享範本",
"team-propagate-members-to-boards": "將成員複製到看板",
"team-sync-members-from-auth": "從身份驗證提供者同步成員",
"active-person": "活躍個人",
"card-received": "已接收",
"card-received-on": "接收於",
@@ -1280,14 +1280,14 @@
"organizations": "組織",
"teams": "團隊",
"domains": "網域",
"domain": "Domain",
"add-domain": "Add Domain",
"share-template-with": "Share template with",
"drag-template-here-to-share": "Drag a Template Board here to share it",
"remove-domain-from-board": "Are you sure you want to remove this domain from this board ?",
"invalid-domain": "Invalid domain. Use a domain like example.com (no @ or spaces).",
"domain-user-count": "Users",
"no-items-message": "No items.",
"domain": "網域",
"add-domain": "新增網域",
"share-template-with": "分享範本與",
"drag-template-here-to-share": "將範本看板拖曳至此處以分享",
"remove-domain-from-board": "您確定要將此網域從此看板中移除嗎?",
"invalid-domain": "網域名稱無效。請使用類似 example.com 的網域名稱(請勿包含 @ 或空格)。",
"domain-user-count": "使用者",
"no-items-message": "無項目。",
"shared-templates": "共享範本",
"shared-templates-info": "瀏覽使用者可分享的範本看板,這些看板依組織、團隊或電子郵件網域進行分組。請在下方選取一個或多個範圍,以顯示符合條件的共享範本。此處僅列出「範本」看板內容不為空的使用者。",
"shared-templates-select-scope": "請在上方選取範圍(組織、團隊或網域),以顯示共用範本。",
@@ -1447,11 +1447,11 @@
"label-names": "標籤名稱",
"archived-at": "封存於",
"sort-cards": "排序卡片",
"sort-boards": "Sort Boards",
"search-boards": "Search boards",
"sort-boards-custom": "Custom (drag order)",
"sort-boards-title-asc": "Title (A → Z)",
"sort-boards-title-desc": "Title (Z → A)",
"sort-boards": "排序看板",
"search-boards": "搜尋看板",
"sort-boards-custom": "自訂(拖曳順序)",
"sort-boards-title-asc": "標題 (A → Z)",
"sort-boards-title-desc": "標題 (Z → A)",
"sort-is-on": "開啟排序",
"cardsSortPopup-title": "排序卡片",
"due-date": "到期日",
@@ -1685,7 +1685,7 @@
"invalid-file": "若檔案名稱無效,則取消上傳或重新命名。",
"preview-pdf-not-supported": "您的裝置不支援預覽 PDF。請嘗試下載。",
"drag-board": "拖曳看板",
"drag-board-to-workspace": "拖曳看板以分配看板給 __工作空間__(拖曳至側邊欄中的工作空間上)。",
"drag-board-to-workspace": "拖曳看板以分配看板給 __workspaces__(拖曳至側邊欄中的工作空間上)。",
"translation-number": "自訂翻譯字串的數量為:",
"delete-translation-confirm-popup": "您確定您想要刪除此自訂翻譯字串嗎?此動作無法復原。",
"newTranslationPopup-title": "新的自訂翻譯字串",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "wekan",
"version": "v9.71.0",
"version": "v9.73.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "wekan",
"version": "v9.71.0",
"version": "v9.73.0",
"license": "MIT",
"dependencies": {
"@aws-sdk/client-s3": "^3.1071.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v9.71.0",
"version": "v9.73.0",
"description": "Open-Source kanban",
"private": true,
"repository": {
+3 -3
View File
@@ -3,7 +3,7 @@
<head>
<meta charset="utf8" />
<title>WeKan REST API v9.71</title>
<title>WeKan REST API v9.73</title>
<!-- needed for adaptive design -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
@@ -423,7 +423,7 @@ data-styled.g139[id="sc-iIvZUO"]{content:"kAmnlO,"}/*!sc*/
55.627 l 55.6165,55.627 -231.245496,231.24803 c -127.185,127.1864
-231.5279,231.248 -231.873,231.248 -0.3451,0 -104.688,
-104.0616 -231.873,-231.248 z
" fill="currentColor"></path></g></svg></div></div><div class="sc-jtyQFi ldXCvc api-content"><div class="sc-eCQgVK jleRXN"><div class="sc-iCECmn lhRBUS"><div class="sc-hKVpXn kktglN api-info"><h1 class="sc-fuztkK sc-ctiVdb eRMVDe cBgvIi">Wekan REST API<!-- --> <span>(<!-- -->v9.71<!-- -->)</span></h1><p>Download OpenAPI specification<!-- -->:</p><div class="sc-iJSMbW sc-cBEgGa fiNpIH ewCFMV"></div><div data-role="redoc-summary" html="" class="sc-iJSMbW sc-cBEgGa fiNpIH ewCFMV"></div><div data-role="redoc-description" html="&lt;p&gt;The REST API allows you to control and extend Wekan with ease.&lt;/p&gt;
" fill="currentColor"></path></g></svg></div></div><div class="sc-jtyQFi ldXCvc api-content"><div class="sc-eCQgVK jleRXN"><div class="sc-iCECmn lhRBUS"><div class="sc-hKVpXn kktglN api-info"><h1 class="sc-fuztkK sc-ctiVdb eRMVDe cBgvIi">Wekan REST API<!-- --> <span>(<!-- -->v9.73<!-- -->)</span></h1><p>Download OpenAPI specification<!-- -->:</p><div class="sc-iJSMbW sc-cBEgGa fiNpIH ewCFMV"></div><div data-role="redoc-summary" html="" class="sc-iJSMbW sc-cBEgGa fiNpIH ewCFMV"></div><div data-role="redoc-description" html="&lt;p&gt;The REST API allows you to control and extend Wekan with ease.&lt;/p&gt;
&lt;p&gt;If you are an end-user and not a dev or a tester, &lt;a href=&quot;https://github.com/wekan/wekan/issues/new&quot;&gt;create an issue&lt;/a&gt; to request new APIs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All API calls in the documentation are made using &lt;code&gt;curl&lt;/code&gt;. However, you are free to use Java / Python / PHP / Golang / Ruby / Swift / Objective-C / Rust / Scala / C# or any other programming languages.&lt;/p&gt;
@@ -1983,7 +1983,7 @@ comment-only / worker members are rejected).</p>
" class="sc-iJSMbW sc-cBEgGa sc-ciCrSJ fiNpIH dNfUH dDDioG"><p>Attachment not found</p>
</div></button></div></div></div><div class="sc-jSppWd sc-gKkgUA fpMlmc bdQQyo"><div class="sc-fXwuWv fYxpnv"><button class="sc-jWMFtl jzaJhV"><span type="delete" class="sc-eEFuoE iINwyG http-verb delete">delete</span><span class="sc-FpjRO dsIRaZ">/api/attachment/delete/{attachmentId}</span><svg class="sc-dYjPD bQKUih" style="margin-right:-25px" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></button><div aria-hidden="true" class="sc-fmtEmb tUxhh"><div class="sc-ljIcGq bAnPPh"><div html="" class="sc-iJSMbW sc-cBEgGa fiNpIH bAoMjv"></div><div tabindex="0" role="button"><div class="sc-jlJOIR PEJyb"><span></span>/api/attachment/delete/{attachmentId}</div></div></div></div></div></div></div></div></div><div class="sc-ekVkVN bjzTxL"></div></div></div>
<script>
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.0.0","info":{"title":"Wekan REST API","version":"v9.71","description":"The REST API allows you to control and extend Wekan with ease.\n\nIf you are an end-user and not a dev or a tester, [create an issue](https://github.com/wekan/wekan/issues/new) to request new APIs.\n\n> All API calls in the documentation are made using `curl`. However, you are free to use Java / Python / PHP / Golang / Ruby / Swift / Objective-C / Rust / Scala / C# or any other programming languages.\n\n# Production Security Concerns\nWhen calling a production Wekan server, ensure it is running via HTTPS and has a valid SSL Certificate. The login method requires you to post your username and password in plaintext, which is why we highly suggest only calling the REST login api over HTTPS. Also, few things to note:\n\n* Only call via HTTPS\n* Implement a timed authorization token expiration strategy\n* Ensure the calling user only has permissions for what they are calling and no more\n"},"paths":{"/users/login":{"post":{"operationId":"login","summary":"Login with REST API","tags":["Login"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}}},"description":"Login credentials","required":true},"responses":{"200":{"description":"Successful authentication","content":{"*/*":{"schema":{"type":"object","required":["id","token","tokenExpires"],"properties":{"id":{"type":"string","description":"User ID"},"token":{"type":"string","description":"Authentication token\n"},"tokenExpires":{"type":"string","format":"date-time","description":"Token expiration date\n"}}}}}},"400":{"description":"Error in authentication\n","content":{"*/*":{"schema":{"type":"object","properties":{"error":{"type":"string"},"reason":{"type":"string"}}}}}},"default":{"description":"Error in authentication\n"}}}},"/users/register":{"post":{"operationId":"register","summary":"Register with REST API","description":"Notes:\n - You will need to provide the token for any of the authenticated methods.\n","tags":["Login"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"},"email":{"description":"Your email\n","type":"string"}},"required":["username","password","email"]}}},"required":true},"responses":{"200":{"description":"Successful registration","content":{"*/*":{"schema":{"items":{"properties":{"id":{"type":"string"},"token":{"type":"string"},"tokenExpires":{"type":"string"}}}}}}},"400":{"description":"Error in registration\n","content":{"*/*":{"schema":{"items":{"properties":{"error":{"type":"number"},"reason":{"type":"string"}}}}}}},"default":{"description":"Error in registration\n"}}}},"/api/admin/attachment-settings":{"get":{"operationId":"get_attachment_settings","summary":"Get the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. Returns the Admin Panel >\n Attachments settings document, including `limitSettings.attachmentsUploadBlocked`\n and `limitSettings.avatarsUploadBlocked` plus the size limits. Cloud-storage\n secret keys (S3 secretAccessKey, Azure accountKey/connectionString, GCS\n credentials) are masked and never returned; a boolean `<field>Set` marker\n shows whether a value exists.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}},"put":{"operationId":"update_attachment_settings","summary":"Update the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. The request body is a\n partial settings object (for example\n `{\"limitSettings\": {\"avatarsUploadBlocked\": true}}`). It is applied through\n the same update path as the `updateAttachmentStorageSettings` Meteor method,\n so validation and `$set` semantics are identical: cloud-storage secrets left\n blank are preserved. The masked, updated settings document is returned.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}}},"/api/admin/domains":{"get":{"operationId":"get_admin_domains","summary":"List email domains with their user counts (GlobalAdmin)","description":"Only the gLine truncated
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.0.0","info":{"title":"Wekan REST API","version":"v9.73","description":"The REST API allows you to control and extend Wekan with ease.\n\nIf you are an end-user and not a dev or a tester, [create an issue](https://github.com/wekan/wekan/issues/new) to request new APIs.\n\n> All API calls in the documentation are made using `curl`. However, you are free to use Java / Python / PHP / Golang / Ruby / Swift / Objective-C / Rust / Scala / C# or any other programming languages.\n\n# Production Security Concerns\nWhen calling a production Wekan server, ensure it is running via HTTPS and has a valid SSL Certificate. The login method requires you to post your username and password in plaintext, which is why we highly suggest only calling the REST login api over HTTPS. Also, few things to note:\n\n* Only call via HTTPS\n* Implement a timed authorization token expiration strategy\n* Ensure the calling user only has permissions for what they are calling and no more\n"},"paths":{"/users/login":{"post":{"operationId":"login","summary":"Login with REST API","tags":["Login"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}}},"description":"Login credentials","required":true},"responses":{"200":{"description":"Successful authentication","content":{"*/*":{"schema":{"type":"object","required":["id","token","tokenExpires"],"properties":{"id":{"type":"string","description":"User ID"},"token":{"type":"string","description":"Authentication token\n"},"tokenExpires":{"type":"string","format":"date-time","description":"Token expiration date\n"}}}}}},"400":{"description":"Error in authentication\n","content":{"*/*":{"schema":{"type":"object","properties":{"error":{"type":"string"},"reason":{"type":"string"}}}}}},"default":{"description":"Error in authentication\n"}}}},"/users/register":{"post":{"operationId":"register","summary":"Register with REST API","description":"Notes:\n - You will need to provide the token for any of the authenticated methods.\n","tags":["Login"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"},"email":{"description":"Your email\n","type":"string"}},"required":["username","password","email"]}}},"required":true},"responses":{"200":{"description":"Successful registration","content":{"*/*":{"schema":{"items":{"properties":{"id":{"type":"string"},"token":{"type":"string"},"tokenExpires":{"type":"string"}}}}}}},"400":{"description":"Error in registration\n","content":{"*/*":{"schema":{"items":{"properties":{"error":{"type":"number"},"reason":{"type":"string"}}}}}}},"default":{"description":"Error in registration\n"}}}},"/api/admin/attachment-settings":{"get":{"operationId":"get_attachment_settings","summary":"Get the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. Returns the Admin Panel >\n Attachments settings document, including `limitSettings.attachmentsUploadBlocked`\n and `limitSettings.avatarsUploadBlocked` plus the size limits. Cloud-storage\n secret keys (S3 secretAccessKey, Azure accountKey/connectionString, GCS\n credentials) are masked and never returned; a boolean `<field>Set` marker\n shows whether a value exists.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}},"put":{"operationId":"update_attachment_settings","summary":"Update the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. The request body is a\n partial settings object (for example\n `{\"limitSettings\": {\"avatarsUploadBlocked\": true}}`). It is applied through\n the same update path as the `updateAttachmentStorageSettings` Meteor method,\n so validation and `$set` semantics are identical: cloud-storage secrets left\n blank are preserved. The masked, updated settings document is returned.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}}},"/api/admin/domains":{"get":{"operationId":"get_admin_domains","summary":"List email domains with their user counts (GlobalAdmin)","description":"Only the gLine truncated
var container = document.getElementById('redoc');
Redoc.hydrate(__redoc_state, container);
+1 -1
View File
@@ -1,7 +1,7 @@
swagger: '2.0'
info:
title: Wekan REST API
version: v9.71
version: v9.73
description: |
The REST API allows you to control and extend Wekan with ease.
+6 -6
View File
@@ -47,9 +47,9 @@ echo ""
echo "=== mongosh 2.8.2 (x64 for amd64/armhf/s390x/ppc64el via QEMU; arm64 native) ==="
check "mongosh 2.8.2 x64 (amd64 + armhf/s390x/ppc64el via QEMU)" \
"https://downloads.mongodb.com/compass/mongosh-2.8.3-linux-x64.tgz"
"https://downloads.mongodb.com/compass/mongosh-2.9.0-linux-x64.tgz"
check "mongosh 2.8.2 arm64" \
"https://downloads.mongodb.com/compass/mongosh-2.8.3-linux-arm64.tgz"
"https://downloads.mongodb.com/compass/mongosh-2.9.0-linux-arm64.tgz"
echo ""
echo "=== mongodb-database-tools 100.13.0 (x86_64 for amd64/armhf/s390x/ppc64el; arm64 native) ==="
@@ -61,13 +61,13 @@ echo ""
echo "=== Node.js 24.17.0 (snap architectures with upstream Node builds) ==="
check "Node.js 24.17.0 linux-x64 (amd64)" \
"https://nodejs.org/dist/v24.17.0/node-v24.17.0-linux-x64.tar.gz"
"https://nodejs.org/dist/v24.18.0/node-v24.18.0-linux-x64.tar.gz"
check "Node.js 24.17.0 linux-arm64 (arm64)" \
"https://nodejs.org/dist/v24.17.0/node-v24.17.0-linux-arm64.tar.gz"
"https://nodejs.org/dist/v24.18.0/node-v24.18.0-linux-arm64.tar.gz"
check "Node.js 24.17.0 linux-s390x (s390x)" \
"https://nodejs.org/dist/v24.17.0/node-v24.17.0-linux-s390x.tar.gz"
"https://nodejs.org/dist/v24.18.0/node-v24.18.0-linux-s390x.tar.gz"
check "Node.js 24.17.0 linux-ppc64le (ppc64el)" \
"https://nodejs.org/dist/v24.17.0/node-v24.17.0-linux-ppc64le.tar.gz"
"https://nodejs.org/dist/v24.18.0/node-v24.18.0-linux-ppc64le.tar.gz"
echo ""
echo "=== Results ==="
+1 -1
View File
@@ -209,7 +209,7 @@ update_releases_node_versions() {
echo "[DEBUG] Updating Node.js references in ${#files[@]} releases files..."
local f
for f in "${files[@]}"; do
# Update the explicit, stable Node.js dist path (e.g. nodejs.org/dist/v24.17.0).
# Update the explicit, stable Node.js dist path (e.g. nodejs.org/dist/v24.18.0).
# The old floating `latest-v24.x/` path is intentionally NOT handled here: it
# only ever holds the single newest v24 release, so a pinned filename under it
# 404s once upstream advances — that is what broke the snap build. snapcraft.yaml
+2 -2
View File
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
appTitle = (defaultText = "Wekan"),
# The name of the app as it is displayed to the user.
appVersion = 971,
appVersion = 973,
# Increment this for every release.
appMarketingVersion = (defaultText = "9.71~2026-06-23"),
appMarketingVersion = (defaultText = "9.73~2026-06-26"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
+5 -5
View File
@@ -1,5 +1,5 @@
name: wekan
version: '9.71'
version: '9.73'
base: core26
build-base: devel
confinement: strict
@@ -162,7 +162,7 @@ parts:
wekan:
source: .
plugin: npm
npm-node-version: 24.17.0
npm-node-version: 24.18.0
npm-include-node: true
build-packages:
- build-essential
@@ -194,14 +194,14 @@ parts:
exit 1
;;
esac
WEKAN_ZIP="wekan-9.71-${WEKAN_ARCH}.zip"
WEKAN_ZIP="wekan-9.73-${WEKAN_ARCH}.zip"
NODE_TAR="node-v24.17.0-linux-${NODE_ARCH}.tar.xz"
echo "Cleaning environment first"
rm -rf .build
mkdir .build
cd .build
#wget https://github.com/wekan/wekan/releases/download/v9.71/wekan-9.71-amd64.zip
wget "https://github.com/wekan/wekan/releases/download/v9.71/${WEKAN_ZIP}"
#wget https://github.com/wekan/wekan/releases/download/v9.73/wekan-9.73-amd64.zip
wget "https://github.com/wekan/wekan/releases/download/v9.73/${WEKAN_ZIP}"
unzip "${WEKAN_ZIP}"
rm "${WEKAN_ZIP}"
# Fix: bcrypt 5.0.1 (Meteor accounts-password) ships node-addon-api@3