diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index febfde53f..86bed1db5 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -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@5e57cd118135c172c3672efd75eb46360885c0ef + uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} diff --git a/.meteor/versions b/.meteor/versions index da76e4646..fe3bd637a 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -137,14 +137,14 @@ useraccounts:flow-routing-extra@1.1.0 useraccounts:unstyled@1.14.2 webapp@1.13.8 webapp-hashing@1.1.1 -wekan-accounts-cas@0.1.0 -wekan-accounts-lockout@1.0.0 +wekan-accounts-cas@0.2.0 +wekan-accounts-lockout@1.1.0 wekan-accounts-oidc@1.0.10 -wekan-accounts-sandstorm@0.8.0 +wekan-accounts-sandstorm@0.9.0 wekan-fontawesome@6.4.2 wekan-fullcalendar@3.10.5 wekan-ldap@0.0.2 wekan-markdown@1.0.9 -wekan-oidc@1.0.12 +wekan-oidc@1.1.0 yasaricli:slugify@0.0.7 zodern:types@1.0.13 diff --git a/CHANGELOG.md b/CHANGELOG.md index bd94ebbe6..7c3b37d1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,12 +24,126 @@ Those are fixed at WeKan 8.07 where database directory is back to /var/snap/weka WeKan 8.00-8.24 used Colorful Unicode Emoji Icons, versions before and after use mostly Font Awesome 4.7 icons. -# Upcoming WeKan ® release +# v8.32 2026-02-13 WeKan ® release + +This release adds the following updates: + +- [Migrate wekan-oidc to async API for Meteor 3.0](https://github.com/wekan/wekan/pull/6111). + Thanks to harryadel. +- [Migrate wekan-accounts-sandstorm to async API for Meteor 3.0](https://github.com/wekan/wekan/pull/6112). + Thanks to harryadel. +- [Migrate wekan-accounts-cas to async API for Meteor 3.0](https://github.com/wekan/wekan/pull/6114). + Thanks to harryadel. +- [Updated to MongoDB 7.0.30 at Snap Candidate](https://github.com/wekan/wekan/commit/fed2e9dd4e3c571795af24f60c6643a33bb5ecf9). + Thanks to MongoDB developers. +- [Updated MongoDB to 7.0.30 at Helm Chart](https://github.com/wekan/wekan/commit/commit/98f66a2b92f7a2c199135e8239133ef431c332b9). + Thanks to MongoDB developers. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v8.31 2026-02-08 WeKan ® release This release fixes the following bugs: +- [Fix Copy Card and Move Card](https://github.com/wekan/wekan/commit/f8aa487e9118264f4d96c4d0cde384bcaf05e0a0). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v8.30 2026-02-08 WeKan ® release + +This release reverts the following new features and adds the following fixes: + +- [Reverted New UI Design of WeKan v8.29 and added more fixes and performance improvements](https://github.com/wekan/wekan/commit/1b8b8d2eef5b56654026597ae445f3f20ad886b2). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v8.29 2026-02-07 WeKan ® release + +This release adds the following new features: + +- New UI Design. + [Part 1](https://github.com/wekan/wekan/pull/6131), + [Part 2](https://github.com/wekan/wekan/pull/6133). + Thanks to Chostakovitch. + +and fixes the following bugs: + +- [Fix List widths](https://github.com/wekan/wekan/pull/6129). + Thanks to KhaoulaMaleh. +- [Fix extra space at RTL need margin](https://github.com/wekan/wekan/commit/4456bc13609b2d0e944ee71a82df200060a601b2). + Thanks to mimZD and xet7. +- [Fix No Add Card + etc](https://github.com/wekan/wekan/commit/55710835fe8879775b73c8bc921bac5febf552a2). + Thanks to mimZD and xet7. +- [Removed extra file](https://github.com/wekan/wekan/commit/0987154a7fea89b0416f48d9bffd5fa7fba9908a). + Thanks to xet7. +- [Added missing linefeeds](https://github.com/wekan/wekan/commit/0ae9865fcbad42966988225393fa66bca49cf14e). + Thanks to xet7. +- [Fix Notifications from not allowed Boards](https://github.com/wekan/wekan/commit/0a92e896f8d2cf0677891857d163ada336a45c61). + Thanks to FK-PATZ3 and xet7. +- [Fix move and copy popup duplicate view](https://github.com/wekan/wekan/commit/631c250f403172937b76ddd37bab54bc9b6dbb78). + Thanks to mimZD and xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v8.28 2026-02-05 WeKan ® release + +This release adds the following updates: + +- [Bump docker/login-action from 3.6.0 to 3.7.0](https://github.com/wekan/wekan/pull/6122). + Thanks to dependabot. +- [Updated meteor-node-stubs](https://github.com/wekan/wekan/commit/6c2e2f271d6343b347224430a4eedfe54db2d838). + Thanks to Meteor developers. + +and fixes the following bugs: + +- [Fixed text truncation at quick-access board link bar](https://github.com/wekan/wekan/pull/6121). + Thanks to KhaoulaMaleh. +- [Improved cardDetails.css for better UI](https://github.com/wekan/wekan/pull/6124). + Thanks to AymenHassini19. +- [Fixed Jade syntax at header](https://github.com/wekan/wekan/commit/c31758960f5372e88f47e8d081404294751284c8). + Thanks to xet7. +- [Await async setDone before closing popup in copy/move dialogs](https://github.com/wekan/wekan/pull/6126). + Thanks to harryadel. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v8.27 2026-01-31 WeKan ® release + +This release adds the following updates: + +- [Updated MongoDB to 7.0.29 at Windows install docs](https://github.com/wekan/wekan/commit/b55e1bbd409f76bd0388d19d4d0a8420cee8df96). + Thanks to MongoDB developers. + +and fixes the following bugs: + +- [Fix async/await in copy/move card operations](https://github.com/wekan/wekan/pull/6120). + Thanks to harryadel. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v8.26 2026-01-31 WeKan ® release + +This release adds the following updates: + +- [Migrate wekan-accounts-lockout to async API for Meteor 3.0](https://github.com/wekan/wekan/pull/6113). + Thanks to harryadel. +- Added Docs: Spreadsheet vs Kanban. + [Part 1](https://github.com/wekan/wekan/commit/a0a8d0186cbc7fefe38f72244723bcff292ae2f4), + [Part 2](https://github.com/wekan/wekan/commit/37d0daee590ab48cbfa1672e4bc5efd95d341211). + Thanks to xet7. +- [Updated dependencies](https://github.com/wekan/wekan/commit/03439d1bccf82511870eed7301b621b1d495941b). + Thanks to developers of dependencies. + +and fixes the following bugs: + - [Reduce visual overflow in Member Settings menu by extending container height](https://github.com/wekan/wekan/pull/6104). Thanks to AymenHassini19. +- [Fix Card copy menu is not displayed](https://github.com/wekan/wekan/commit/0b891464b907b272e075d8aafd3ce29e704739cf). + Thanks to xet7. +- [Fix Bug: Rules view translation not is not shown correctly](https://github.com/wekan/wekan/commit/f73eab23f997efe5347aa1f06515bf355cfe7ed5). + Thanks to cactus7as and xet7. Thanks to above GitHub users for their contributions and translators for their translations. diff --git a/Dockerfile b/Dockerfile index 18148b61d..c97cbb66d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,6 +20,7 @@ ENV \ FIBERS_VERSION=4.0.1 \ SRC_PATH=./ \ WITH_API=true \ + MONGO_OPLOG_URL="" \ RESULTS_PER_PAGE="" \ DEFAULT_BOARD_ID="" \ ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE=3 \ @@ -196,9 +197,9 @@ ln -sf $(which bsdtar) $(which tar) # WeKan Bundle Installation mkdir -p /home/wekan/app cd /home/wekan/app -wget "https://github.com/wekan/wekan/releases/download/v8.25/wekan-8.25-${WEKAN_ARCH}.zip" -unzip "wekan-8.25-${WEKAN_ARCH}.zip" -rm "wekan-8.25-${WEKAN_ARCH}.zip" +wget "https://github.com/wekan/wekan/releases/download/v8.32/wekan-8.32-${WEKAN_ARCH}.zip" +unzip "wekan-8.32-${WEKAN_ARCH}.zip" +rm "wekan-8.32-${WEKAN_ARCH}.zip" mv /home/wekan/app/bundle /build # Restore original tar diff --git a/Stackerfile.yml b/Stackerfile.yml index 3f738fb05..f9c74b29a 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v8.25.0" +appVersion: "v8.32.0" files: userUploads: - README.md diff --git a/client/components/boardConversionProgress.css b/client/components/boardConversionProgress.css index fd186908f..7c17e561e 100644 --- a/client/components/boardConversionProgress.css +++ b/client/components/boardConversionProgress.css @@ -170,14 +170,14 @@ width: 95%; margin: 20px; } - + .board-conversion-header, .board-conversion-content, .board-conversion-footer { padding-left: 16px; padding-right: 16px; } - + .board-conversion-header h3 { font-size: 18px; } diff --git a/client/components/boardConversionProgress.jade b/client/components/boardConversionProgress.jade index 2ace5e05b..77b0321c0 100644 --- a/client/components/boardConversionProgress.jade +++ b/client/components/boardConversionProgress.jade @@ -6,21 +6,21 @@ template(name="boardConversionProgress") i.fa.fa-cog | {{_ 'converting-board'}} p {{_ 'converting-board-description'}} - + .board-conversion-content .conversion-progress .progress-bar .progress-fill(style="width: {{conversionProgress}}%") .progress-text {{conversionProgress}}% - + .conversion-status i.fa.fa-cog | {{conversionStatus}} - + .conversion-time(style="{{#unless conversionEstimatedTime}}display: none;{{/unless}}") i.fa.fa-clock-o | {{_ 'estimated-time-remaining'}}: {{conversionEstimatedTime}} - + .board-conversion-footer .conversion-info i.fa.fa-info-circle diff --git a/client/components/boardConversionProgress.js b/client/components/boardConversionProgress.js index 454df5006..4dd7bfb41 100644 --- a/client/components/boardConversionProgress.js +++ b/client/components/boardConversionProgress.js @@ -1,6 +1,6 @@ import { Template } from 'meteor/templating'; import { ReactiveVar } from 'meteor/reactive-var'; -import { +import { boardConverter, isConverting, conversionProgress, @@ -12,15 +12,15 @@ Template.boardConversionProgress.helpers({ isConverting() { return isConverting.get(); }, - + conversionProgress() { return conversionProgress.get(); }, - + conversionStatus() { return conversionStatus.get(); }, - + conversionEstimatedTime() { return conversionEstimatedTime.get(); } diff --git a/client/components/boards/boardBody.css b/client/components/boards/boardBody.css index b23d7f4d8..d8b13ba8c 100644 --- a/client/components/boards/boardBody.css +++ b/client/components/boards/boardBody.css @@ -293,7 +293,7 @@ body.mobile-mode.iphone-device .card-details .card-details-item-title { .board-wrapper .board-canvas .board-overlay { z-index: 17 !important; } - + /* In desktop mode on small screens, still keep overlay behind card */ body.desktop-mode .board-wrapper .board-canvas .board-overlay { z-index: 17 !important; diff --git a/client/components/boards/boardBody.jade b/client/components/boards/boardBody.jade index 4af638f08..271af09b4 100644 --- a/client/components/boards/boardBody.jade +++ b/client/components/boards/boardBody.jade @@ -1,5 +1,5 @@ template(name="board") - + if isConverting.get +boardConversionProgress else if isBoardReady.get diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js index a5d6b9760..735e83620 100644 --- a/client/components/boards/boardBody.js +++ b/client/components/boards/boardBody.js @@ -27,16 +27,16 @@ BlazeComponent.extendComponent({ this.autorun(() => { const currentBoardId = Session.get('currentBoard'); if (!currentBoardId) return; - + const handle = subManager.subscribe('board', currentBoardId, false); - + // Use a separate autorun for subscription ready state to avoid reactive loops this.subscriptionReadyAutorun = Tracker.autorun(() => { if (handle.ready()) { if (!this._boardProcessed || this._lastProcessedBoardId !== currentBoardId) { this._boardProcessed = true; this._lastProcessedBoardId = currentBoardId; - + // Ensure default swimlane exists (only once per board) this.ensureDefaultSwimlane(currentBoardId); // Check if board needs conversion @@ -67,7 +67,7 @@ BlazeComponent.extendComponent({ if (!board) return; const swimlanes = board.swimlanes(); - + if (swimlanes.length === 0) { // Check if any swimlane exists in the database to avoid race conditions const existingSwimlanes = ReactiveCache.getSwimlanes({ boardId }); @@ -221,9 +221,9 @@ BlazeComponent.extendComponent({ const popupObserver = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { mutation.addedNodes.forEach(function(node) { - if (node.nodeType === 1 && + if (node.nodeType === 1 && (node.classList.contains('popup') || node.classList.contains('modal') || node.classList.contains('menu')) && - !node.closest('.js-swimlanes') && + !node.closest('.js-swimlanes') && !node.closest('.swimlane') && !node.closest('.list') && !node.closest('.minicard')) { @@ -540,57 +540,57 @@ BlazeComponent.extendComponent({ isViewSwimlanes() { const currentUser = ReactiveCache.getCurrentUser(); let boardView; - + if (currentUser) { boardView = (currentUser.profile || {}).boardView; } else { boardView = window.localStorage.getItem('boardView'); } - + // If no board view is set, default to swimlanes if (!boardView) { boardView = 'board-view-swimlanes'; } - + return boardView === 'board-view-swimlanes'; }, isViewLists() { const currentUser = ReactiveCache.getCurrentUser(); let boardView; - + if (currentUser) { boardView = (currentUser.profile || {}).boardView; } else { boardView = window.localStorage.getItem('boardView'); } - + return boardView === 'board-view-lists'; }, isViewCalendar() { const currentUser = ReactiveCache.getCurrentUser(); let boardView; - + if (currentUser) { boardView = (currentUser.profile || {}).boardView; } else { boardView = window.localStorage.getItem('boardView'); } - + return boardView === 'board-view-cal'; }, isViewGantt() { const currentUser = ReactiveCache.getCurrentUser(); let boardView; - + if (currentUser) { boardView = (currentUser.profile || {}).boardView; } else { boardView = window.localStorage.getItem('boardView'); } - + return boardView === 'board-view-gantt'; }, @@ -602,7 +602,7 @@ BlazeComponent.extendComponent({ } return false; } - + try { const swimlanes = currentBoard.swimlanes(); const hasSwimlanes = swimlanes && swimlanes.length > 0; @@ -638,7 +638,7 @@ BlazeComponent.extendComponent({ const isBoardReady = this.isBoardReady.get(); const isConverting = this.isConverting.get(); const boardView = Utils.boardView(); - + if (process.env.DEBUG === 'true') { console.log('=== BOARD DEBUG STATE ==='); console.log('currentBoardId:', currentBoardId); @@ -648,7 +648,7 @@ BlazeComponent.extendComponent({ console.log('boardView:', boardView); console.log('========================'); } - + return { currentBoardId, hasCurrentBoard: !!currentBoard, diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade index 76fd8a25a..42cc8d592 100644 --- a/client/components/boards/boardHeader.jade +++ b/client/components/boards/boardHeader.jade @@ -93,9 +93,12 @@ template(name="boardHeaderBar") i.fa.fa-archive //if showSort - // a.board-header-btn.js-open-sort-view(title="{{_ 'sort-desc'}}") - // i.fa(class="{{directionClass}}") - // span {{_ 'sort'}}{{_ listSortShortDesc}} + // + a.board-header-btn.js-open-sort-view(title="{{_ 'sort-desc'}}") + // + i.fa(class="{{directionClass}}") + // + span {{_ 'sort'}}{{_ listSortShortDesc}} a.board-header-btn.js-open-filter-view( title="{{#if Filter.isActive}}{{_ 'filter-on-desc'}}{{else}}{{_ 'filter'}}{{/if}}" @@ -314,18 +317,30 @@ template(name="createTemplateContainerPopup") a.js-board-template {{_ 'template'}} //template(name="listsortPopup") -// h2 -// | {{_ 'list-sort-by'}} -// hr -// ul.pop-over-list -// each value in allowedSortValues -// li -// a.js-sort-by(name="{{value.name}}") -// if $eq sortby value.name -// | {{#if $eq Direction "fa-arrow-up"}}⬆️{{else}}⬇️{{/if}} -// | {{_ value.label }}{{_ value.shortLabel}} -// if $eq sortby value.name -// i.fa.fa-check +// + h2 +// + | {{_ 'list-sort-by'}} +// + hr +// + ul.pop-over-list +// + each value in allowedSortValues +// + li +// + a.js-sort-by(name="{{value.name}}") +// + if $eq sortby value.name +// + | {{#if $eq Direction "fa-arrow-up"}}⬆️{{else}}⬇️{{/if}} +// + | {{_ value.label }}{{_ value.shortLabel}} +// + if $eq sortby value.name +// + i.fa.fa-check template(name="boardChangeTitlePopup") form label diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index 7317a7501..5c37e19df 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -182,7 +182,7 @@ Template.boardHeaderBar.helpers({ if (!sortBy) { return '🃏'; // Card icon when nothing is selected } - + // Determine which sort option is active based on sortBy object if (sortBy.dueAt) { return '📅'; // Due date icon @@ -191,7 +191,7 @@ Template.boardHeaderBar.helpers({ } else if (sortBy.createdAt) { return sortBy.createdAt === 1 ? '⬆️' : '⬇️'; // Up/down arrow based on direction } - + return '🃏'; // Default card icon }, }); diff --git a/client/components/boards/boardsList.jade b/client/components/boards/boardsList.jade index aea3c2d8a..fc3ab582a 100644 --- a/client/components/boards/boardsList.jade +++ b/client/components/boards/boardsList.jade @@ -133,7 +133,7 @@ template(name="boardList") span.board-handle(title="{{_ 'drag-board'}}") span.emoji-icon i.fa.fa-arrows - + a.js-open-board(href="{{pathFor 'board' id=_id slug=slug}}") span.details span.board-list-item-name(title="{{_ 'template-container'}}") @@ -161,7 +161,7 @@ template(name="boardList") span.board-handle(title="{{_ 'drag-board'}}") span.emoji-icon i.fa.fa-arrows - + a.js-open-board(href="{{pathFor 'board' id=_id slug=slug}}") span.details span.board-list-item-name(title="{{_ 'board-drag-drop-reorder-or-click-open'}}") @@ -197,12 +197,18 @@ template(name="boardList") template(name="boardListHeaderBar") h1 {{_ title }} //.board-header-btns.right - // a.board-header-btn.js-open-archived-board - // i.fa.fa-archive - // span {{_ 'archives'}} - // a.board-header-btn(href="{{pathFor 'board' id=templatesBoardId slug=templatesBoardSlug}}") - // i.fa.fa-clone - // span {{_ 'templates'}} + // + a.board-header-btn.js-open-archived-board + // + i.fa.fa-archive + // + span {{_ 'archives'}} + // + a.board-header-btn(href="{{pathFor 'board' id=templatesBoardId slug=templatesBoardSlug}}") + // + i.fa.fa-clone + // + span {{_ 'templates'}} // Recursive template for workspaces tree template(name="workspaceTree") @@ -214,7 +220,7 @@ template(name="workspaceTree") span.workspace-drag-handle span.emoji-icon i.fa.fa-arrows - + a.js-select-workspace(data-id="{{id}}") span.workspace-icon if icon diff --git a/client/components/boards/originalPositionsView.css b/client/components/boards/originalPositionsView.css index ec3abd4c5..c2e1a3405 100644 --- a/client/components/boards/originalPositionsView.css +++ b/client/components/boards/originalPositionsView.css @@ -164,32 +164,32 @@ margin: 5px 0; padding: 10px; } - + .original-positions-header { flex-direction: column; align-items: stretch; gap: 8px; } - + .original-positions-header .btn { justify-content: center; } - + .original-positions-filters .btn-group { justify-content: center; } - + .original-position-item-header { flex-wrap: wrap; gap: 6px; } - + .entity-name { flex: 1; min-width: 0; word-break: break-word; } - + .original-position-item-details { margin-left: 0; margin-top: 8px; @@ -203,60 +203,60 @@ border-color: #4a5568; color: #e2e8f0; } - + .original-positions-content { background-color: #1a202c; border-color: #4a5568; } - + .original-position-item { background-color: #2d3748; border-color: #4a5568; color: #e2e8f0; } - + .original-position-item:hover { background-color: #4a5568; border-color: #718096; } - + .original-position-item-header { color: #e2e8f0; } - + .original-position-item-header i { color: #a0aec0; } - + .entity-name { color: #e2e8f0; } - + .entity-id { color: #a0aec0; } - + .original-position-description { color: #e2e8f0; } - + .original-title { background-color: #4a5568; color: #a0aec0; } - + .original-title strong { color: #e2e8f0; } - + .original-position-date { color: #a0aec0; } - + .no-original-positions { color: #a0aec0; } - + .no-original-positions i { color: #718096; } diff --git a/client/components/boards/originalPositionsView.html b/client/components/boards/originalPositionsView.html index 6a58beeb0..3bcc9fb06 100644 --- a/client/components/boards/originalPositionsView.html +++ b/client/components/boards/originalPositionsView.html @@ -5,7 +5,7 @@ {{#if isShowingOriginalPositions}}Hide{{else}}Show{{/if}} Original Positions - + {{#if isShowingOriginalPositions}} - - -