Repository navigation
v0.04
WeKan itself opens what Wena wrote: checked with WeKan's bundle on the same wekan-files
tools/wekan-ui/dropin.shchecks Wena as a drop-in with WeKan itself: a
WeKan user is made through FerretDB on an emptywekan-files/db; Wena
opens those files as that user, makes its board and adds a list, a card,
a description and a checklist; then WeKan's own bundle serves the same
files through FerretDB, and its page (Playwright,dropin.e2e.js) shows
the board on All Boards, the list and card on it, and the card's details
with the description and the ticked checklist item. It passes.- What it found: a board WeKan makes carries its schema's defaults
(allowsDescriptionText,allowsChecklistsand 99 more Booleans), and
WeKan hides a part of the board whose field is missing. A board Wena makes
now carries them all, generated from WeKan'smodels/boards.jsinto
server/wekan_defaults_data.hbyscripts/generate_wekan_defaults.py,
whose--checkruns with every desktop build (and passes without a WeKan
checkout, when there is nothing to compare with).
Thanks to xet7.
The language and collapsed lists and swimlanes are the user's, where WeKan keeps them
- With WeKan's files, the language comes from the user's
profile.languageand the language picker writes it there, through a
store the picker can now be given instead of its settings file. A
language WeKan names that Wena does not have resolves to one it has. - Collapsed lists and swimlanes and swimlane heights are the user's
profile.collapsedLists,profile.collapsedSwimlanesand
profile.swimlaneHeights({board: {id: value}}): read when a board
opens and written when they change, the other boards' entries kept. - So nothing of Wena's goes into WeKan's
dbfolder: it holds
wekan.sqlite(and SQLite's -wal and -shm) only, whichdesktopchecks. - Tests:
language-picker(the store, a refused store changing nothing, an
unknown language),wekan-sync(profile.language, the per-board maps,
another board's map kept, only WeKan's fields).
Thanks to xet7.
Wena opens on WeKan's All Boards page, and goes from board to board in one window
- With WeKan's files, the first page is All Boards as WeKan draws it
(client/components/boards/all_boards.c, measured from WeKan's own page,
tests/fixtures/wekan-ui/00-all-boards.json): the header with the house
and the user, the left menu of sections - Remaining, Starred, Home,
Templates, Archive - with their counts, and the boards as tiles in their
board color, "Add Board" first, each with its star. - The boards are the user's from WeKan's documents: their own and template
containers, archived ones in Archive, starred ones from the user's
profile.starredBoards- which the star writes, one level into the
user's profile with FerretDB's types. "Add Board" makes a board as WeKan
does, with its "Default" swimlane and the user its admin. - A tile opens its board; the house before the board's title goes back.
Opening another board releases the board's state and starts its session
again in the same window, with the same database. --show all-boardsand--show open:BOARD(a tile chosen) with
--screenshotor--smoke.- Tests:
all-boards(sections, counts, open, star, Add Board, the archived
and Home negatives, colors),wekan-sync(the board list, stars, a new
board) anddesktop(the files layout, FerretDB's metadata, the first
run's admin and board, reopening, a board switch, All Boards drawn).
Thanks to xet7.
Wena keeps WeKan's own files: wekan-files/db/wekan.sqlite as FerretDB writes it, a drop-in for WeKan's bundles
- Opened without a workspace (double-clicked, or 2) Run), Wena uses WeKan's
files directory:WRITABLE_PATHwhen set - withfilesadded unless it
already ends infilesorwekan-files, as WeKan'sstart-wekan.shand
.batdo - elsewekan-filesbeside the program, as WeKan's Windows
executable has it. It makesattachments,avatarsanddb, and keeps
the board indb/wekan.sqlite: the file WeKan's FerretDB bundles
(AppImage, Snap, Docker, Windows) open as databasewekan. - That file is FerretDB's SQLite format, written directly with SQL
(server/ferretdb_sqlite.c): the_ferretdb_collectionstable, one
<collection>_<FNV-1a>table per collection with its_id_index, byte
for byte as FerretDB makes them, and documents with their$stype
schema. Wena reads it with double-quoted strings off, as release builds
of SQLite are. - WeKan's documents are read into Wena's tables in memory
(server/wekan_sync.c): users, boards with their members, labels and
settings, swimlanes and lists with archive state, color and WIP limit,
cards with description, labels, members, assignees and archive state,
checklists and their items. After each frame that changed something,
only the changed fields go back to WeKan's documents, each with its type,
so the fields of a document Wena does not show stay as they were; new
documents get the fields WeKan requires, and a title Wena had to shorten
is not written back unless it was edited. - The user is
WENA_USER(an_idor username), else the first admin; a
new file gets a user "admin" and a board "My board" with WeKan's
"Default" swimlane.WENA_DATABASEand--databasestill open a Wena
workspace file. - Tests:
wekan-files,ferretdb-sqlite(DDL text,$son insert, update,
unset, delete),wekan-sync(import, changed fields only, WeKan's fields
kept, new documents, deletes, rollback, the user) andferretdb-roundtrip,
which runs the FerretDB binary WeKan bundles: FerretDB serves through the
MongoDB driver what Wena wrote, and Wena reads, changes and adds to what
FerretDB wrote. Not yet run against a WeKan server itself.
Thanks to xet7.
The release builds again: v0.03 stopped on every platform on a stale compiled-in license file
- wena4 log: every job of the v0.03 release stopped before compiling with
client/platform/notices_data.h is stale. The licenses compiled into the
executable includeconfig/release-dependencies.json, which the AROS
rename (aros-x86 to aros-amd64) changed without regenerating them. The
current header matches its sources again. - New suite
generated-sourcesruns the checks every desktop build runs
first (scripts/check_desktop_sources.sh: pinned dependencies, SVGs,
migrations, translations, font and licenses), so a stale generated file
fails the test run instead of the release. Its negative case changes the
dependencies on a copy and requires the check to report the stale header.
Thanks to xet7.
Card details, Card Actions, the Add Card composer and the sidebar look and work like WeKan's
- Card details are WeKan's panel instead of a column of buttons: a header
with the caret that collapses it, the title (click it to edit, as in
WeKan), Card Actions, Maximize and Close Card, then the Labels,
Description and Checklists sections, each with WeKan's caret, icon and
16px gray heading and each foldable. They show the card's label chips, its
description and its checklists, whose items can be ticked there. - Card Actions (the hamburger on a minicard and in the details) is WeKan's
popup with the items Wena carries out, in WeKan's order and groups: Move to
Top, Move to Bottom, Move Card and Move Card to Archive. Move to Top and
Bottom are new: one version-checked reorder within the card's list. As in
WeKan, the minicard's hamburger no longer opens the details. - Add Card is WeKan's inline composer in the list: a white card with the
text box, the blue Add and the close cross, above the cards for Add Card
to Top of List and in place of "+ Add Card" for the bottom. Enter adds and
the composer stays for the next card; a card added to the top is moved
there, and a move that fails is reported. - The sidebar is WeKan's home view, 420px under the header: the close
cross, Board Settings, then foldable Members (the board's members and its
own user), Labels (WeKan's colored chips) and Activities, and the Archive. - Label chips on minicards and in the details are WeKan's: bold text on the
label's color, 4px rounded, side by side. Checklists show their title in
bold with a finished/total count, and items as WeKan's checkboxes. --show card:ID,card-menu:ID,list-menu:ID,add-card:LISTor
sidebarwith--screenshotrenders each state WeKan's capture has, for
comparison.- Fixed on the way: Nuklear's
nk_spacingon a one-column row starts a
new row, which left an empty row after each read-only checklist item;
raw colors in the look module were drawn black. - Tests:
card-actions(suite) drives the popup's items against SQLite,
with disabled items and unknown cards as negatives; move to top and bottom
are incard-move-reorder-sqlite; the composer, details header and
sections, sidebar folds and chips are incard-create,board-feature,
card-description,nuklear-checklist-contentsandnuklear-board.
Thanks to xet7.
A board from WeKan's file looks as WeKan draws it: list widths, checklists on minicards and the user's name
- Lists are as wide as WeKan keeps them: each list's
width(WeKan's
DEFAULT_LIST_WIDTHis 220) is read in, and the minicards in it are 34
narrower, as in WeKan. A list without a width of its own is 220 wide in
WeKan mode, 272 otherwise; a width outside WeKan's 100..1000 is not used. - Checklists on minicards follow WeKan's board field
allowsChecklistsOnMinicard(on unless the board turns it off), read in
and written back under that name; Wena wrote a field WeKan does not have.
A board made in Wena gets WeKan's default settings for this, card
collapse and the checklist count badge. - The header shows the user's name as WeKan does, not the user's
_id. - Tests:
wekan-syncreads a list's width and refuses one out of range,
and checks the new board'sallowsChecklistsOnMinicard;board-feature
checks the list's own width, the layout default and the fallback.
Thanks to xet7.
The board header has WeKan's star group: the starred count and the board's star
- After the board title, as WeKan's header: the caret with the number of
places the user keeps starred (boards, pages, swimlanes, lists and cards,
as WeKan'sstarredCount), which opens All Boards on Starred, then the
board's star, filled and darker when starred, with WeKan's "Click to
star/unstar this board." The board's ownstarscount shows from 2, as
WeKan shows it. - The star toggles
profile.starredBoardsin WeKan's file, so the board is
starred in WeKan too. - Tests:
wekan-syncreads the star state, count and board stars, with a
user without stars, a missing user and missing arguments as negatives;
board-featureclicks the star both ways and the count, and checks that
without star state no group is drawn.
Thanks to xet7.
Minicards show WeKan's description badge
- A card with a description shows WeKan's gray
fa-file-text-obadge in
the badges strip at the bottom of its minicard, as WeKan does by default
(allowsDescriptionBadgeOnMinicard). The board loader marks which cards
have a description; a database from before descriptions has none. - Tests:
wekan-syncchecks that the card with a description is marked and
the one without is not;board-featuredraws the badge only for a card
with a description.
Thanks to xet7.
The user is shown with WeKan's initials avatar on the board and All Boards
- Before the user's name, as in WeKan's header, a 24px gray circle with the
user's initials: the first letter of each word of the name, upper-cased
as WeKan'sgetInitialsdoes (Latin-1 letters too), in place of the user
icon. The board header and All Boards draw it the same way. - Tests:
all-boardschecks the initials of several names, whole UTF-8
letters and upper-casing, with no name, no room and an overlong result as
negatives, and that the page draws the avatar.
Thanks to xet7.
Multi-Selection is in the board header, as in WeKan, and opens as WeKan's sidebar
- WeKan's Multi-Selection button sits at the left of the header's second
row, darker while it is on. It turns multi-selection on for the whole
board with nothing picked yet, as WeKan does, and off again, clearing
what was picked. Select All then takes every active card of the board in
any list; from a list's menu it stays that list's cards. - The selection panel is WeKan's sidebar: 420px at the right under the
header, so the board stays beside it, where the window is wide enough
(640px); narrower windows keep the wide panel. --show multi-selectionwith--screenshotrenders the state.- Tests:
card-selectionselects a whole board without archived or other
boards' cards, and refuses missing arguments;nuklear-card-selection
opens it for the board, refuses another board, selects all across lanes
and turns it off;board-featureclicks the header button and checks it
is hidden when not given.
Thanks to xet7.
The drop-in check goes both ways: a board made in WeKan's own UI opens in Wena
tools/wekan-ui/dropin.shalready showed WeKan's bundle opening what Wena
wrote. Now WeKan's UI then makes a board "Made in WeKan" with a list and a
card through FerretDB, WeKan is stopped, and Wena reads that board in -
its title, swimlane, list and card, loaded as Wena's board view loads them- and opens it, with screenshots of both for comparison.
- WeKan's bundle runs as the shell's own process now, so stopping it stops
the server and not only its subshell.
Thanks to xet7.
Lists take their whole width as in WeKan, and Wena is checked to open on All Boards
- A list's header and its icons were 10px short of WeKan's, because the
list kept room for a scrollbar. WeKan's lists scroll with overlay
scrollbars that take no room, and so do Wena's now: the header spans the
list's whole width and List Actions sits where WeKan has it. - WeKan mode logs that it shows All Boards, the page it opens on, and the
desktop test requires it. - Tests:
board-featurerequires the list scrollbar to take no room and
every style push to be popped (the fake Nuklear now counts them);
desktoprequires the All Boards start.
Thanks to xet7.
The board header has WeKan's Private / Public and watch level buttons with their popups
- After the star group, as in WeKan's header: the board's visibility (a
lock and "Private", or a globe and "Public") and the user's watch level
("Watching", "Tracking" or "Muted" with WeKan's eye, bell or slashed
bell). Each opens WeKan's popup - Change Visibility, Change Watch - with
a check at the current choice. - They are WeKan's own fields in wekan.sqlite:
boards.permission(private
when not set) andboards.watchers, where muted, WeKan's default, removes
the user and the other users' entries stay as they were. - Popup items can carry WeKan's check mark;
--show visibilityand--show watchrender the popups for comparison. - Tests:
wekan-syncreads and writes both, keeps another user's watcher,
typespermissionas a string, and refuses values WeKan does not have
and a missing board;board-featureclicks both buttons in each state
and checks that they are hidden when not given or out of range.
Thanks to xet7.
WeKan's Search is in the board header, with its sidebar of lists and cards found
- Search sits last on the header's first row, as in WeKan, with Filter
before it. It opens WeKan's search sidebar: the field with WeKan's "Write
text you search and press Enter", then the Lists and Cards found, as
white minilists and minicards. A found card opens its details. - What is found is what WeKan's
searchListsandsearchCardsfind: this
board's lists and cards whose title - or card description - contains the
term, ignoring case, the term trimmed, newest first. LIKE's own%_
and\are searched for as themselves. --show search:TERMwith--screenshotrenders the sidebar with TERM
searched.- Tests:
board-search(new suite) covers titles and descriptions, case,
trimming, LIKE characters, another board's rows, an empty term, capacity
and missing arguments;search-sidebar(new suite) covers the field,
Enter, results by title, a vanished card left out, opening a card,
closing, and no context or room;board-featureclicks Search, and
Filter beside it.
Thanks to xet7.
WeKan's Sort Cards is in the board header, sorting cards by title for showing
- Sort Cards follows the watch level, as in WeKan, and opens WeKan's popup.
Title (Alphabetically) sorts each list's cards by title on screen only,
as WeKan's does; the header then says "Sort is on", darker, with WeKan's
cross that removes the sort. Moves and drops keep using the list's own
order. - Due Date and the two Created At choices are shown but cannot be chosen:
Wena keeps neither. WeKan's newer "Sort by votes" is left out because its
text is not in Wena's pinned translation catalog. --show sortrenders the popup and--show sortedthe sorted board.- Tests:
board-featuresorts a list by title and checks the unsorted
order as the negative, and clicks Sort Cards, "Sort is on" and the cross,
the cross only while a sort is on.
Thanks to xet7.
WeKan's board view switcher and Lists view, kept in the user's profile
- After Multi-Selection on the header's second row, as in WeKan: the caret,
the view's icon and its name, "Swimlanes" or "Lists", opening WeKan's
Board View popup with a check at the current view. Calendar, Gantt and
Table are listed but cannot be chosen: Wena does not draw them. - The Lists view is WeKan's: no swimlane bars, and each list shows its
cards of every swimlane, the rest of the window high. - The choice is WeKan's own
users.profile.boardView
("board-view-lists" or "board-view-swimlanes"), so WeKan and Wena open
the board in the same view; a view Wena does not draw opens as
Swimlanes. --show viewrenders the popup and--show lists-viewthe Lists view.- Tests:
wekan-syncreads and writes the view with its string type,
treats an unknown view and a missing user as Swimlanes and refuses a
missing user;board-featuredraws the Lists view without the swimlane
bar and with a card of another swimlane, the Swimlanes view without it,
and clicks the view button named by each view.
Thanks to xet7.
WeKan's Notifications button and drawer, from the user's own notifications
- After the board view on the header's second row, as in WeKan: the bell
and "Notifications", white while some are unread, darker while the drawer
is open. The drawer is at the right under the header: "Notifications"
with the unread count, Mark all as read, then each notification newest
first - its read checkbox, who did it and on which card (or board), and
when. - It is WeKan's own data:
users.profile.notificationsand the
activitiesthey point to, an entry whose activity is gone left out as
WeKan does (#5325). The read checkbox writes that entry'sreadas WeKan
does - now as a Date, or null - keeping the other entries and their
types; a file without activities has none, and Wena does not make that
collection. --show notificationsrenders the drawer.- Tests:
wekan-synclists them newest first without the gone one, with
who and which card or board, marks read and unread with the date type and
the entry's keys, and refuses an entry or user not there; the new
notifications-drawersuite covers the lines, the unread count, the
checkbox, Mark all as read, closing and the negatives;board-feature
clicks the bell.
Thanks to xet7.
The Multi-Selection panel looks like WeKan's sidebar
- WeKan's sidebar background and its "Multi-Selection" title, and WeKan's
sidebar buttons - an icon and the text, without a box - for Select all,
Select none, Archive selection, Labels, Move selection and Turn
Multi-Selection off. The one-card Move form keeps its own buttons. - Wena's list of the cards in scope, with their ids so that cards of the
same title can be told apart, stays where WeKan picks cards on the board
itself. - Tests:
nuklear-card-selectionrequires the title and draws the links
as text, clicking them by where their text is drawn.
Thanks to xet7.
WeKan's + after the star group adds a board from the board page too
- As in WeKan's header, a + after the star group opens Add Board - the
same dialog as on All Boards - and the new board, made as WeKan makes
one, opens. --show add-boardrenders the dialog over the board.- Tests:
board-featureclicks the + and checks it is hidden when not
given.
Thanks to xet7.
Translations copied from WeKan's current files: 3,894 texts in 246 languages
- Wena's translation catalog is regenerated from WeKan's
imports/i18n/dataat WeKan 9465382420, up from 2,417 texts to 3,894,
so every text of WeKan's current UI - Sort by votes and the board views
among them - is there in every language WeKan has. - The catalog is now LZMA-compressed (format
WENA-I18N-2): 7 MB instead
of the 17.5 MB zlib would make, inside the 12 MiB budget. Its readers
allow 128 MiB of uncompressed JSON (it is 71 MB). - A web address keeps its translated
%XXescapes. A value whose
placeholders differ from English (20 Blockly texts and one other in this
revision) uses English for that key in that language, and the generator
lists each one, instead of the whole catalog being refused; the fix
belongs in WeKan's locale file. - The runtime UI texts and the notices are regenerated from it.
- Tests:
generate-i18n-catalogchecks the new format, the English
fallback for a wrong placeholder with its report, and a translated web
address kept; the catalog readers inui-contractanddesktopread
LZMA.
Thanks to xet7.
Sort Cards sorts by due date, creation time and votes too, as WeKan does
- All of WeKan's Sort Cards choices work, in WeKan's order: Due Date,
Title (Alphabetically), Created At (Newest First), Created At (Oldest
First) and Sort by votes, each with a check when it is on. - They sort as WeKan's do: Mongo's order of
dueAtandcreatedAt- a
card without the field first when ascending, last when descending - with
the card's_idbreaking ties, and votes by score (positive minus
negative votes), highest first, keeping the list's own order for a tie.
The title sort now also breaks ties by_id. - WeKan's
dueAt,createdAtandvoteare read in from wekan.sqlite
for this; sorting stays for showing only, as in WeKan. - Tests:
wekan-syncreads a due date and tells a missing one from 0;
board-featuresorts a list each way, with a card missing a due date.
Thanks to xet7.