Wekan
Open source kanban board application built with Meteor
Alternative to: trello
v9.79
2026-07-06v9.79 2026-07-06 WeKan ® release
This release fixes the following bugs:
-
Fix #6439: Custom (drag order) sort on All Boards page now reorders via drag-and-drop: On the All Boards page the jQuery-ui sortable that reordered boards in the “Custom (drag order)” mode was removed when the page switched to HTML5 drag-and-drop for workspaces, and nothing replaced it, so dragging a board showed a not-allowed cursor and never updated
profile.boardSortIndex. Added HTML5dragover/dropreorder handlers on the board tiles inclient/components/boards/boardsList.js(active only in the custom sort mode), asetBoardSortIndexeshelper inmodels/users.jsto persist the new order in one write, a drop-hint style inclient/components/boards/boardsList.css, and extracted the reorder decision/index math into the pure, unit-testedmodels/lib/boardSortReorder.js. Covered bytests/boardSortReorder.test.cjs. Thanks to jullbo and xet7. -
Fix #6440: ’+’ add-item button on minicard checklist does nothing: On the minicard the checklist add-item
<form>is rendered inside thea.minicard-wrapperanchor, so the native formsubmitevent never reached the Blaze event map — the #5565 minicard-checklist work wired only asubmit .js-add-checklist-itemhandler (which never fires there) and gave the Save button no click handler, so clicking ”+” Save did nothing. Added an explicitclick .js-submit-add-checklist-item-formhandler inclient/components/cards/minicard.js(mirroring the working edit-item button) that inserts the item, with the blank-input guard and title parsing extracted into the pure, Meteor-freemodels/lib/checklistItemTitles.js. Card-detail checklists are unaffected. Covered bytests/checklistItemTitles.test.cjs. Thanks to jullbo and xet7. -
Fix #6441: label filter now applies board-wide across all swimlanes: A label filter hid non-matching cards in one swimlane (e.g. “Focus”) but left another swimlane (e.g. “Background”) unfiltered. Each list scopes its cards to the current swimlane while also showing shared/orphaned cards that have no swimlane; that fallback was written as a bare top-level
$or, which competes with the board Filter’s own top-level$or(label/member criteria) when the two selectors are combined — dropping the label criterion in every swimlane except the default one. The swimlane-membership fallback is now a singleswimlaneId: { $in: [id, null, ''] }clause (the same form already used insidebarFilters.js,cardDetails.jsanddialogWithBoardSwimlaneList.js), extracted to the pure, unit-testedmodels/lib/swimlaneFilter.jsand used byclient/components/lists/listBody.jsandmodels/lists.js, so no second$orexists and the filter is always$and-combined and applied board-wide. Covered bytests/swimlaneFilter.test.cjs. Thanks to jullbo and xet7. -
Fix flaky server-side Mocha test (i18n zh-CN “is not a spy”): The server-side Mocha suite intermittently reported “1 failing” on the #5756
imports/i18n/i18n.test.jsregion-tag test withTypeError: [Function] is not a spy. The assertion re-readTAPi18n.i18n.addResourceBundle, and the sinon-chai matcher (routed through chai-as-promised) could evaluate after this suite’safterEachhad already runsinon.restore()— at which point the property is the original function, not the stub. The.loadLanguagetests now assert on the captured stub reference (restore unwraps the property but leaves the spy intact), which is deterministic. Reproduced and verified with a standalone sinon/chai script. Thanks to xet7.