Skip to content

v0.04

Choose a tag to compare

@github-actions github-actions released this 04 Oct 00:25
WeKan itself opens what Wena wrote: checked with WeKan's bundle on the same wekan-files
  • tools/wekan-ui/dropin.sh checks Wena as a drop-in with WeKan itself: a
    WeKan user is made through FerretDB on an empty wekan-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, allowsChecklists and 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's models/boards.js into
    server/wekan_defaults_data.h by scripts/generate_wekan_defaults.py,
    whose --check runs 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.language and 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.collapsedSwimlanes and
    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 db folder: it holds
    wekan.sqlite (and SQLite's -wal and -shm) only, which desktop checks.
  • 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-boards and --show open:BOARD (a tile chosen) with
    --screenshot or --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) and desktop (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_PATH when set - with files added unless it
    already ends in files or wekan-files, as WeKan's start-wekan.sh and
    .bat do - else wekan-files beside the program, as WeKan's Windows
    executable has it. It makes attachments, avatars and db, and keeps
    the board in db/wekan.sqlite: the file WeKan's FerretDB bundles
    (AppImage, Snap, Docker, Windows) open as database wekan.
  • That file is FerretDB's SQLite format, written directly with SQL
    (server/ferretdb_sqlite.c): the _ferretdb_collections table, one
    <collection>_<FNV-1a> table per collection with its _id_ index, byte
    for byte as FerretDB makes them, and documents with their $s type
    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 _id or username), else the first admin; a
    new file gets a user "admin" and a board "My board" with WeKan's
    "Default" swimlane. WENA_DATABASE and --database still open a Wena
    workspace file.
  • Tests: wekan-files, ferretdb-sqlite (DDL text, $s on insert, update,
    unset, delete), wekan-sync (import, changed fields only, WeKan's fields
    kept, new documents, deletes, rollback, the user) and ferretdb-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 include config/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-sources runs 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:LIST or
    sidebar with --screenshot renders each state WeKan's capture has, for
    comparison.
  • Fixed on the way: Nuklear's nk_spacing on 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 in card-move-reorder-sqlite; the composer, details header and
    sections, sidebar folds and chips are in card-create, board-feature,
    card-description, nuklear-checklist-contents and nuklear-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_WIDTH is 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-sync reads a list's width and refuses one out of range,
    and checks the new board's allowsChecklistsOnMinicard; 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's starredCount), 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 own stars count shows from 2, as
    WeKan shows it.
  • The star toggles profile.starredBoards in WeKan's file, so the board is
    starred in WeKan too.
  • Tests: wekan-sync reads the star state, count and board stars, with a
    user without stars, a missing user and missing arguments as negatives;
    board-feature clicks 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-o badge 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-sync checks that the card with a description is marked and
    the one without is not; board-feature draws 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's getInitials does (Latin-1 letters too), in place of the user
    icon. The board header and All Boards draw it the same way.
  • Tests: all-boards checks 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-selection with --screenshot renders the state.
  • Tests: card-selection selects 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-feature clicks 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.sh already 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-feature requires the list scrollbar to take no room and
    every style push to be popped (the fake Nuklear now counts them);
    desktop requires 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) and boards.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 visibility and --show watch render the popups for comparison.
  • Tests: wekan-sync reads and writes both, keeps another user's watcher,
    types permission as a string, and refuses values WeKan does not have
    and a missing board; board-feature clicks 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 searchLists and searchCards find: 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:TERM with --screenshot renders 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-feature clicks 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 sort renders the popup and --show sorted the sorted board.
  • Tests: board-feature sorts 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 view renders the popup and --show lists-view the Lists view.
  • Tests: wekan-sync reads and writes the view with its string type,
    treats an unknown view and a missing user as Swimlanes and refuses a
    missing user; board-feature draws 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.notifications and the
    activities they point to, an entry whose activity is gone left out as
    WeKan does (#5325). The read checkbox writes that entry's read as 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 notifications renders the drawer.
  • Tests: wekan-sync lists 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-drawer suite 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-selection requires 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-board renders the dialog over the board.
  • Tests: board-feature clicks 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/data at 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 %XX escapes. 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-catalog checks the new format, the English
    fallback for a wrong placeholder with its report, and a translated web
    address kept; the catalog readers in ui-contract and desktop read
    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 dueAt and createdAt - a
    card without the field first when ascending, last when descending - with
    the card's _id breaking 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, createdAt and vote are read in from wekan.sqlite
    for this; sorting stays for showing only, as in WeKan.
  • Tests: wekan-sync reads a due date and tells a missing one from 0;
    board-feature sorts a list each way, with a card missing a due date.

Thanks to xet7.