Commit Graph

13873 Commits

Author SHA1 Message Date
Frederick [Bot] 3120c2b12c chore(i18n): update translations via Crowdin 2026-04-16 01:46:56 +00:00
kolaente 50465818ae refactor(frontend): drop Bulma components/media import
The .media / .media-left / .media-content classes are only used in
Comments.vue. Ports the relevant rules into its scoped <style> block
and drops the partial import.
2026-04-15 20:15:42 +00:00
kolaente 3c3b1820a1 refactor(frontend): port is-pulled-right locally and drop Bulma float helper
Only .is-pulled-right is used (3 callsites); .is-pulled-left and
.is-clearfix from Bulma's helpers/float partial have zero usage. Ports the
one needed rule into theme/helpers.scss so the Bulma import can go.
2026-04-15 20:12:45 +00:00
renovate[bot] 2ae194e943 chore(deps): update dependency postcss to v8.5.10 2026-04-15 16:25:26 +00:00
renovate[bot] 85dbef8330 chore(deps): update dependency stylelint to v17.8.0 2026-04-15 15:49:30 +00:00
kolaente d09ef36bd4 fix(frontend): guard Object.keys against null in refactored helpers
typeof null === 'object', so null slipped past the type guards in
objectToCamelCase/objectToSnakeCase/prepareParams. The original
for...in loops silently iterated nothing on null; Object.keys(null)
throws. Also guard saveCollapsedBucketState where state[projectId]
may be undefined.
2026-04-15 11:44:47 +00:00
kolaente dd83e0d42b refactor(frontend): replace reverse-index splice loops with findIndex/filter
Single-match removals use findIndex + splice; the reminder-null cleanup
uses filter since model.reminders is on a local shallow clone.
2026-04-15 11:44:47 +00:00
kolaente 2c6029eac4 refactor(frontend): replace for...in usages and forbid via lint rule
Replaces 33 for...in loops across 18 files with for...of + Object.keys/entries
or indexed for loops. for...in iterates enumerable string keys including
inherited ones, which is especially risky on reactive arrays (tasks, labels,
assignees, etc.) where polyfilled properties may appear.

Loops that mutate via splice during iteration now iterate backwards to avoid
index-shift bugs. Adds a no-restricted-syntax ESLint rule forbidding
ForInStatement to prevent regressions.

Closes #513
2026-04-15 11:44:47 +00:00
kolaente 95180a341d refactor(frontend): drop unused Bulma form/file partial import
Every file input in the codebase is hidden (via class="is-hidden" or
scoped display:none) and triggered programmatically by a custom XButton.
None of Bulma's .file / .file-label / .file-cta / .file-input / .file-name /
.file-icon classes are used anywhere in .vue files, so the partial is dead
code.
2026-04-15 11:06:11 +00:00
kolaente 39c804f460 refactor(frontend): drop unused Bulma modal partial import
Vikunja's Modal.vue uses a native <dialog> element with its own locally-
scoped classes (modal-dialog, modal-container, modal-content, modal-header).
None of Bulma's modal classes (.modal, .modal-background, .modal-card*) are
used anywhere in the app. The two CSS variables this partial provided
(--modal-card-head-padding, --modal-content-spacing-tablet) were inlined in
the two callers in the previous commits, so the whole partial is now dead
code.

Modal.vue already had several 'reset bulma' overrides fighting the default
rules Bulma applied to .modal-content; those can be cleaned up in a
follow-up.
2026-04-15 10:56:48 +00:00
kolaente d05fd4dbb2 refactor(frontend): inline modal-content-spacing-tablet in PDF preview
The --modal-content-spacing-tablet CSS variable is provided by Bulma's
components/modal partial. Inlining Bulma's default (40px) lets us drop that
partial.
2026-04-15 10:56:48 +00:00
kolaente 0b2f625f06 refactor(frontend): inline modal-card-head-padding in Card footer
The --modal-card-head-padding CSS variable is provided by Bulma's
components/modal partial. Inlining Bulma's default (20px) lets us drop that
partial without needing a local redeclaration.
2026-04-15 10:56:48 +00:00
kolaente 35f183979c feat: add license comments for agents and humans 2026-04-15 10:32:37 +00:00
kolaente a82bea567a feat(db): add license_status table migration
Add database migration for the license_status table that stores instance
ID, cached license validation response, and validation timestamps.
2026-04-15 10:32:37 +00:00
kolaente 7dd664fdc4 feat(init): integrate license validation into startup and shutdown
Call license.Init() after database initialization and before the web
server starts. Call license.Shutdown() during graceful shutdown to stop
the background check goroutine.
2026-04-15 10:32:37 +00:00
kolaente ed2632ddb2 feat(license): add license key validation package
Implement the license validation system with:
- Server communication with retry logic and exponential backoff
- In-memory state management for feature flags and user limits
- Cached validation with 72h expiry stored in database
- Background goroutine with adaptive check intervals (24h/1h)
- Graceful degradation to community mode on failure
- Instance ID generation and persistence
2026-04-15 10:32:37 +00:00
kolaente ecc2243513 feat(config): add license.key configuration option
Add license key configuration under the license section. When empty or
absent, Vikunja runs in community mode with no licensed features.
2026-04-15 10:32:37 +00:00
kolaente 9899979ca7 docs(frontend): document styles architecture and token system 2026-04-15 10:02:39 +00:00
kolaente 02ae01ad80 chore(frontend): enable vue/multi-word-component-names with legacy allowlist 2026-04-15 09:58:55 +00:00
kolaente 21609127a1 fix(frontend): guard caldav and totp settings routes when disabled 2026-04-15 09:57:17 +00:00
kolaente 91d5cfb1c0 fix(frontend): render editor popups inside modal dialog top-layer
Native <dialog> elements opened with showModal() render in the browser's
top-layer. Popups appended to document.body end up behind the dialog
regardless of z-index, which broke the slash-command menu and the user
mention suggestion inside the task detail modal.

Append the popups to the nearest open <dialog> ancestor of the editor
(falling back to document.body) so they join the same top-layer stacking
context.
2026-04-15 08:39:24 +00:00
kolaente a1fbc277be
fix(deps): patch follow-redirects and basic-ftp security vulnerabilities
Update follow-redirects to 1.16.0 (fixes auth header leak on cross-domain
redirects) and basic-ftp to 5.2.2 (fixes CRLF injection in FTP commands).
2026-04-14 20:49:42 +02:00
kolaente 0b45cff583
feat(ci): sign archlinux packages with GPG for pacman verification
Pacman verifies individual package signatures (.sig files). Add GPG
setup and detach-sign step for archlinux packages in the os-package
job. The .sig is uploaded alongside the package to S3.
2026-04-14 19:35:23 +02:00
kolaente c970f87e89
fix(ci): resolve symlinks before upload instead of deleting them
S3 can't store symlinks. Previously all symlinks were deleted, which
removed vikunja.db -> vikunja.db.tar.gz needed by pacman. Now resolve
symlinks into real file copies first, then delete package files.
2026-04-14 17:08:27 +02:00
kolaente fdeacd3eaf
fix(ci): write GPG key directly to file instead of importing and exporting
No need to import the key into GPG and then export it again. Just
write the secret key data directly to a file for nfpm to use.
2026-04-14 16:22:52 +02:00
kolaente f208279dd2 test(editor): add e2e for emoji autocomplete 2026-04-14 13:48:49 +00:00
kolaente c0f05b6277 feat(editor): register emoji autocomplete extension 2026-04-14 13:48:49 +00:00
kolaente 7ab2804129 feat(editor): add emoji TipTap extension 2026-04-14 13:48:49 +00:00
kolaente 02d4dd1631 feat(editor): add emoji suggestion handler 2026-04-14 13:48:49 +00:00
kolaente 88136ed45e feat(editor): add EmojiList popup component 2026-04-14 13:48:49 +00:00
kolaente 542cab5ef6 feat(editor): add lazy emoji data loader and filter 2026-04-14 13:48:49 +00:00
kolaente f6ec5d8e96
feat(ci): sign RPM packages with GPG via nfpm
Add GPG signing configuration to nfpm.yaml for rpm packages. The
os-package job now sets up GPG and exports the key for nfpm to use
during package creation.
2026-04-14 15:47:31 +02:00
kolaente 4d8c37f8ff
fix(ci): exclude package files from repo metadata upload
The dl.vikunja.io worker redirects package file requests under /repos/
to the existing artifacts, so uploading them again is redundant.
Remove .deb, .rpm, .apk, .archlinux, .pacman, .pkg.tar.zst files
and symlinks before uploading to R2.
2026-04-14 14:36:00 +02:00
kolaente 7227c59f5e test(e2e/kanban): seed the view only once with done_bucket_id 2026-04-14 11:32:14 +00:00
kolaente af6923524f test(e2e/kanban): cover recurring task drag to done bucket (#2618) 2026-04-14 11:32:14 +00:00
kolaente d389408618 test(kanban): cover moveTaskToBucket 2026-04-14 11:32:14 +00:00
kolaente 13c4aec461 fix(frontend/kanban): honor server bucket redirect on drag (#2618) 2026-04-14 11:32:14 +00:00
renovate[bot] c68649faf4 chore(deps): update dev-dependencies 2026-04-14 10:51:01 +00:00
kolaente 77167eb356
fix(ci): pin s3-action to main branch 2026-04-14 12:47:18 +02:00
kolaente 3d08a4f78f
fix(ci): update s3-action to skip directories during upload
The s3-action glob matched directories causing EISDIR errors. Fixed
the action to filter with fs.statSync().isFile(). Updated all
s3-action references to the new version.
2026-04-14 12:25:43 +02:00
kolaente 797c813091
fix(ci): revert S3 glob to **/* and clean up directories before upload
The **/*.* glob skipped extensionless files like Release, InRelease,
and Packages. Revert to **/* and instead remove reprepro's internal
db/conf directories and directory symlinks before uploading.
2026-04-14 10:02:50 +02:00
Frederick [Bot] 8bde434676 chore(i18n): update translations via Crowdin 2026-04-14 01:29:51 +00:00
Frederick [Bot] 88528d927e [skip ci] Updated swagger docs 2026-04-13 16:21:02 +00:00
kolaente 85836076be feat(migration/wekan): import attachments from board export
Parse the top-level `attachments` array in WeKan board JSON exports,
group them by card ID, base64-decode the payload, and attach the
resulting files to the generated tasks so they land in Vikunja as
task attachments. Orphaned attachments (cardId with no matching card)
are silently skipped; decode errors are logged and skipped.
2026-04-13 16:04:14 +00:00
kolaente cff690fb5f
fix(ci): skip desktop .apk in APK repo, not a valid Alpine package
The desktop .apk file from electron-builder is not an Alpine APK
package and causes apk index to fail with "v2 package format error".
2026-04-13 16:15:41 +02:00
kolaente a110642093
fix(ci): inline APK repo generation to avoid glibc binary on Alpine
The mage-static binary is compiled with glibc which can't run on
Alpine's musl. Instead of fighting compatibility, inline the APK
repo generation as shell commands since the logic is simple.
2026-04-13 15:18:08 +02:00
kolaente 1eafd31a2a
refactor(projects): use getAllProjectsForUser in getProjectsToDelete (#2616) 2026-04-13 12:32:32 +02:00
renovate[bot] a3ac01346a chore(deps): update dev-dependencies 2026-04-13 10:14:34 +00:00
kolaente 29098aee62
fix(ci): add libc6-compat for Alpine, fix S3 upload glob, add debug
- Install libc6-compat on Alpine so the glibc-linked mage binary runs
- Change S3 upload glob from **/* to **/*.* to skip directories
- Add debug step to inspect mage-static binary on Alpine
2026-04-13 12:13:05 +02:00
kolaente f3aaf27242
fix(ci): set RELEASE_VERSION to avoid git dependency in containers
The mage initVars calls git describe when RELEASE_VERSION is not
set. Setting it avoids needing git in the container images.
2026-04-13 11:45:37 +02:00