Compare commits

..

3 Commits
main ... main

Author SHA1 Message Date
Daniel Pantle
fc967884d5 refactor: move editor cancelling into function
All checks were successful
continuous-integration/drone/pr Build is passing
2024-10-01 16:14:57 +02:00
Daniel Pantle
360a72d639 Merge branch 'main' of ssh://kolaente.dev:9022/DanielPantle/vikunja
Some checks failed
continuous-integration/drone/pr Build is failing
2024-10-01 07:21:53 +02:00
Daniel Pantle
0938edc995 feat(frontend): cancel editing task title with escape 2024-10-01 07:03:51 +02:00
164 changed files with 4234 additions and 8151 deletions

View File

@ -363,7 +363,7 @@ steps:
- api-build
- name: frontend-dependencies
image: node:22.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -377,7 +377,7 @@ steps:
# - restore-cache
- name: frontend-lint
image: node:22.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -389,7 +389,7 @@ steps:
- frontend-dependencies
- name: frontend-build-prod
image: node:22.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -401,7 +401,7 @@ steps:
- frontend-dependencies
- name: frontend-test-unit
image: node:22.11.0-alpine
image: node:20.16.0-alpine
pull: always
commands:
- cd frontend
@ -412,7 +412,7 @@ steps:
- name: frontend-typecheck
failure: ignore
image: node:22.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -543,7 +543,7 @@ steps:
- git fetch --tags
- name: frontend-dependencies
image: node:22.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -555,7 +555,7 @@ steps:
- pnpm install --fetch-timeout 100000
- name: frontend-build
image: node:22.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -589,13 +589,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja
bucket: vikunja-releases
access_key:
from_secret: hetzner_access_key_id
from_secret: aws_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
source: config.yml.sample
target: /vikunja/unstable/
@ -610,13 +610,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja
bucket: vikunja-releases
access_key:
from_secret: hetzner_access_key_id
from_secret: aws_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
source: config.yml.sample
target: /vikunja/${DRONE_TAG##v}/
@ -626,7 +626,7 @@ steps:
depends_on: [ generate-config-yaml ]
- name: before-static-build
image: ghcr.io/techknowlogick/xgo:go-1.23.x
image: techknowlogick/xgo:latest
pull: always
commands:
- export PATH=$PATH:$GOPATH/bin
@ -635,7 +635,7 @@ steps:
depends_on: [ fetch-tags, mage ]
- name: static-build-windows
image: ghcr.io/techknowlogick/xgo:go-1.23.x
image: techknowlogick/xgo:latest
pull: always
environment:
# This path does not exist. However, when we set the gopath to /go, the build fails. Not sure why.
@ -651,7 +651,7 @@ steps:
- frontend-build
- name: static-build-linux
image: ghcr.io/techknowlogick/xgo:go-1.23.x
image: techknowlogick/xgo:latest
pull: always
environment:
# This path does not exist. However, when we set the gopath to /go, the build fails. Not sure why.
@ -667,7 +667,7 @@ steps:
- frontend-build
- name: static-build-darwin
image: ghcr.io/techknowlogick/xgo:go-1.23.x
image: techknowlogick/xgo:latest
pull: always
environment:
# This path does not exist. However, when we set the gopath to /go, the build fails. Not sure why.
@ -693,7 +693,7 @@ steps:
- ./mage-static release:compress
- name: after-build-static
image: ghcr.io/techknowlogick/xgo:go-1.23.x
image: techknowlogick/xgo:latest
pull: always
depends_on:
- after-build-compress
@ -723,13 +723,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja
bucket: vikunja-releases
access_key:
from_secret: hetzner_access_key_id
from_secret: aws_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: dist/zip/
source: dist/zip/*
@ -745,13 +745,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja
bucket: vikunja-releases
access_key:
from_secret: hetzner_access_key_id
from_secret: aws_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: dist/zip/
source: dist/zip/*
@ -763,7 +763,7 @@ steps:
# Build os packages and push it to our bucket
- name: build-os-packages-unstable
image: goreleaser/nfpm:v2.41.0
image: goreleaser/nfpm:v2.40.0
pull: always
commands:
- apk add git go
@ -779,7 +779,7 @@ steps:
depends_on: [ after-build-compress ]
- name: build-os-packages-version
image: goreleaser/nfpm:v2.41.0
image: goreleaser/nfpm:v2.40.0
pull: always
commands:
- apk add git go
@ -797,13 +797,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja
bucket: vikunja-releases
access_key:
from_secret: hetzner_access_key_id
from_secret: aws_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: dist/os-packages/
source: dist/os-packages/*
@ -819,13 +819,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja
bucket: vikunja-releases
access_key:
from_secret: hetzner_access_key_id
from_secret: aws_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: dist/os-packages/
source: dist/os-packages/*
@ -884,6 +884,7 @@ steps:
repo: vikunja/vikunja
tags: unstable
platforms:
- linux/386
- linux/amd64
- linux/arm/v6
- linux/arm/v7
@ -915,6 +916,7 @@ steps:
from_secret: docker_password
repo: vikunja/vikunja
platforms:
- linux/386
- linux/amd64
- linux/arm/v6
- linux/arm/v7
@ -946,7 +948,7 @@ steps:
- git fetch --tags
- name: build
image: node:22.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -976,13 +978,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja
bucket: vikunja-releases
access_key:
from_secret: hetzner_access_key_id
from_secret: aws_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
source: frontend/vikunja-frontend-unstable.zip
target: /
@ -1007,7 +1009,7 @@ steps:
- git fetch --tags
- name: build
image: node:22.11.0-alpine
image: node:20.16.0-alpine
pull: always
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -1035,13 +1037,13 @@ steps:
image: plugins/s3
pull: always
settings:
bucket: vikunja
bucket: vikunja-releases
access_key:
from_secret: hetzner_access_key_id
from_secret: aws_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
source: frontend/vikunja-frontend-${DRONE_TAG##v}.zip
target: /
@ -1140,15 +1142,15 @@ steps:
# settings:
# restore: true
# bucket: kolaente.dev-drone-dependency-cache
# endpoint: https://fsn1.your-objectstorage.com
# region: fsn1
# endpoint: https://s3.fr-par.scw.cloud
# region: fr-par
# path_style: true
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
# mount:
# - '.cache'
- name: build
image: electronuserland/builder:wine
image: electronuserland/builder:wine-mono
pull: true
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -1179,8 +1181,8 @@ steps:
# settings:
# rebuild: true
# bucket: kolaente.dev-drone-dependency-cache
# endpoint: https://fsn1.your-objectstorage.com
# region: fsn1
# endpoint: https://s3.fr-par.scw.cloud
# region: fr-par
# path_style: true
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
# mount:
@ -1222,15 +1224,15 @@ steps:
# settings:
# restore: true
# bucket: kolaente.dev-drone-dependency-cache
# endpoint: https://fsn1.your-objectstorage.com
# region: fsn1
# endpoint: https://s3.fr-par.scw.cloud
# region: fr-par
# path_style: true
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
# mount:
# - '.cache'
- name: build
image: electronuserland/builder:wine
image: electronuserland/builder:wine-mono
pull: true
environment:
PNPM_CACHE_FOLDER: .cache/pnpm
@ -1261,8 +1263,8 @@ steps:
# settings:
# rebuild: true
# bucket: kolaente.dev-drone-dependency-cache
# endpoint: https://fsn1.your-objectstorage.com
# region: fsn1
# endpoint: https://s3.fr-par.scw.cloud
# region: fr-par
# path_style: true
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
# mount:
@ -1287,13 +1289,13 @@ steps:
image: plugins/s3
pull: true
settings:
bucket: vikunja
bucket: vikunja-releases
access_key:
from_secret: hetzner_access_key_id
from_secret: aws_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: desktop/dist/
source: desktop/dist/Vikunja-Desktop*
@ -1309,13 +1311,13 @@ steps:
image: plugins/s3
pull: true
settings:
bucket: vikunja
bucket: vikunja-releases
access_key:
from_secret: hetzner_access_key_id
from_secret: aws_access_key_id
secret_key:
from_secret: hetzner_secret_access_key
endpoint: https://fsn1.your-objectstorage.com
region: fsn1
from_secret: aws_secret_access_key
endpoint: https://s3.fr-par.scw.cloud
region: fr-par
path_style: true
strip_prefix: desktop/dist/
source: desktop/dist/*
@ -1344,9 +1346,9 @@ steps:
# - name: build
# environment:
# ACCESS_KEY:
# from_secret: hetzner_access_key_id
# from_secret: aws_access_key_id
# SECRET_KEY:
# from_secret: hetzner_secret_access_key
# from_secret: aws_secret_access_key
# commands:
# - git fetch --tags
# - export VERSION=${DRONE_TAG##v}
@ -1359,9 +1361,9 @@ steps:
# - sed -i '' "s/\$${version}/$$VERSION/g" package.json
# - yarn install
# - yarn dist --mac
# - mc config host add scw-fsn1 https://fsn1.your-objectstorage.com $ACCESS_KEY $SECRET_KEY --api S3v4
# - mc cp ./dist/*.dmg scw-fsn1/vikunja/desktop/$VERSION/
# - mc cp ./dist/*.dmg.blockmap scw-fsn1/vikunja/desktop/$VERSION/
# - mc config host add scw-fr-par https://s3.fr-par.scw.cloud $ACCESS_KEY $SECRET_KEY --api S3v4
# - mc cp ./dist/*.dmg scw-fr-par/vikunja-releases/desktop/$VERSION/
# - mc cp ./dist/*.dmg.blockmap scw-fr-par/vikunja-releases/desktop/$VERSION/
---
kind: pipeline
@ -1398,6 +1400,6 @@ steps:
- failure
---
kind: signature
hmac: 7fc1cb2b0cfdc84d7eda25ce75dd56446fc01060c03af89c91043f095e92a2b3
hmac: 804713cb1e91adcbf32b18dbc0ca05b84d2c29b463e2d89b1ab3e5b678fdaf3a
...

View File

@ -7,24 +7,6 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
All releases can be found on https://code.vikunja.io/vikunja/releases.
## [0.24.5] - 2024-11-21
### Bug Fixes
* *(attachments)* Check permissions when accessing all attachments
* *(saved filters)* Check permissions when accessing tasks of a filter
* Pin xgo to 1.22.x ([87b2aac](87b2aaccb8cdcbe1ecb6092951a0bfe224ad7006))
* Upgrade xgo ([19b63c8](19b63c86c51f67614b867c75a58cda1774685edd))
* Upgrade xgo docker image everywhere ([04b40f8](04b40f8a7dcd01a86ddb8b27596073d1e50f9e97))
* *(ci)* Do not build linux 368 docker images
* Disable 368 releases ([73db10f](73db10fb02268e07d29842493df55f4d645ac503))
- **BREAKING**: disable 368 releases
### Miscellaneous Tasks
* Sign drone config ([17c4878](17c487875b5771c0971ee8bf030807171de2dddc))
* Go mod tidy ([9639025](96390257e0911089ae33a9565e8be7fa954c772c))
## [0.24.4] - 2024-09-29
### Bug Fixes

View File

@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM node:22.11.0-alpine AS frontendbuilder
FROM --platform=$BUILDPLATFORM node:20.16.0-alpine AS frontendbuilder
WORKDIR /build
@ -13,7 +13,7 @@ RUN corepack enable && \
pnpm install && \
pnpm run build
FROM --platform=$BUILDPLATFORM ghcr.io/techknowlogick/xgo:go-1.23.x AS apibuilder
FROM --platform=$BUILDPLATFORM techknowlogick/xgo:go-1.21.x AS apibuilder
RUN go install github.com/magefile/mage@latest && \
mv /go/bin/mage /usr/local/go/bin
@ -53,5 +53,3 @@ ENV VIKUNJA_DATABASE_PATH=/db/vikunja.db
COPY --from=apibuilder /build/vikunja-* vikunja
COPY --from=apibuilder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
HEALTHCHECK --interval=5s --timeout=30s --start-period=10s --retries=3 \
CMD [ "/app/vikunja/vikunja", "healthcheck" ]

View File

@ -2,7 +2,7 @@
[![Build Status](https://drone.kolaente.de/api/badges/vikunja/vikunjaa/status.svg)](https://drone.kolaente.de/vikunja/vikunja)
[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE)
[![Install](https://img.shields.io/badge/download-v0.24.5-brightgreen.svg)](https://vikunja.io/docs/installing)
[![Install](https://img.shields.io/badge/download-v0.24.4,brightgreen.svg)](https://vikunja.io/docs/installing)
[![Docker Pulls](https://img.shields.io/docker/pulls/vikunja/vikunja.svg)](https://hub.docker.com/r/vikunja/vikunja/)
[![Swagger Docs](https://img.shields.io/badge/swagger-docs-brightgreen.svg)](https://try.vikunja.io/api/v1/docs)
[![Go Report Card](https://goreportcard.com/badge/kolaente.dev/vikunja/vikunja)](https://goreportcard.com/report/kolaente.dev/vikunja/vikunja)

View File

@ -17,7 +17,6 @@ body = """
{% raw %} {% endraw %}- **BREAKING**: {{commit.breaking_description}}
{%- endif -%}
{%- endfor -%}
{% raw %}\n{% endraw %}\
{%- for commit in commits %}
{%- if commit.scope -%}
{% else -%}
@ -57,3 +56,4 @@ commit_parsers = [
{ body = ".*security", group = "Security"},
{ message = ".*", group = "Other", default_scope = "other"}, # Everything that's not a conventional commit goes into the "Other" category
]

View File

@ -127,16 +127,6 @@
"key": "enablepublicteams",
"default_value": "false",
"comment": "Enables the public team feature. If enabled, it is possible to configure teams to be public, which makes them\ndiscoverable when sharing a project, therefore not only showing teams the user is member of."
},
{
"key": "bcryptrounds",
"default_value": "11",
"comment": "The number of bcrypt rounds to use during registration. Each increment of this number doubles the computational cost. You probably don't need to change this value."
},
{
"key": "enableopenidteamusersearch",
"default_value": "false",
"comment": "If enabled, users will only find other users who are part of an existing team when they are searching for a user by their partial name. The other existing team may be created from openid. It is still possible to add users to teams with their exact email address even when this is enabled."
}
]
},
@ -665,10 +655,9 @@
},
{
"key": "providers",
"comment": "A list of enabled providers. You can freely choose the `<provider key>`. Note that you must add at least one key to a config file if you want to read values from an environment variable as the provider won't be known to Vikunja otherwise.",
"comment": "A list of enabled providers. This expects an array, which means you cannot use enviroment variables.",
"children": [
{
"key": "<provider key>",
"children": [
{
"key": "name",

View File

@ -51,11 +51,11 @@
}
},
"devDependencies": {
"electron": "33.2.1",
"electron-builder": "25.1.8"
"electron": "29.4.6",
"electron-builder": "24.13.3"
},
"dependencies": {
"connect-history-api-fallback": "2.0.0",
"express": "4.21.1"
"express": "4.21.0"
}
}

1089
desktop/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -3,10 +3,11 @@
"devenv": {
"locked": {
"dir": "src/modules",
"lastModified": 1730028891,
"lastModified": 1726063457,
"owner": "cachix",
"repo": "devenv",
"rev": "a337f8862efa9bde348c48a48b5b943f710604dd",
"rev": "39bf6ce569103c9390d37322daa59468c31b3ce7",
"treeHash": "839747a1cb35ba6d5b36cce9a739ab2ba5e4a5d4",
"type": "github"
},
"original": {
@ -23,6 +24,7 @@
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"treeHash": "2addb7b71a20a25ea74feeaf5c2f6a6b30898ecb",
"type": "github"
},
"original": {
@ -43,6 +45,7 @@
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"treeHash": "ca14199cabdfe1a06a7b1654c76ed49100a689f9",
"type": "github"
},
"original": {
@ -57,6 +60,7 @@
"owner": "cachix",
"repo": "devenv-nixpkgs",
"rev": "4267e705586473d3e5c8d50299e71503f16a6fb6",
"treeHash": "6d9f1f7ca0faf1bc2eeb397c78a49623260d3412",
"type": "github"
},
"original": {
@ -68,10 +72,11 @@
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1729973466,
"lastModified": 1725930920,
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "cd3e8833d70618c4eea8df06f95b364b016d4950",
"rev": "44a71ff39c182edaf25a7ace5c9454e7cba2c658",
"treeHash": "56e93544112b7bb7aa0c3093d537295683ef9148",
"type": "github"
},
"original": {
@ -83,10 +88,11 @@
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1729880355,
"lastModified": 1725983898,
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "18536bf04cd71abd345f9579158841376fdd0c5a",
"rev": "1355a0cbfeac61d785b7183c0caaec1f97361b43",
"treeHash": "d8ce0c1af7690da6161f0991484661331f5bc999",
"type": "github"
},
"original": {
@ -106,10 +112,11 @@
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1729104314,
"lastModified": 1725513492,
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"rev": "3c3e88f0f544d6bb54329832616af7eb971b6be6",
"rev": "7570de7b9b504cfe92025dd1be797bf546f66528",
"treeHash": "4b46d77870afecd8f642541cb4f4927326343b59",
"type": "github"
},
"original": {

View File

@ -27,7 +27,6 @@ in {
go = {
enable = true;
enableHardeningWorkaround = true;
};
};

63
frontend/.eslintrc.cjs Normal file
View File

@ -0,0 +1,63 @@
/* eslint-env node */
require('@rushstack/eslint-patch/modern-module-resolution')
module.exports = {
'root': true,
'env': {
'browser': true,
'es2022': true,
'node': true,
},
'extends': [
'eslint:recommended',
'plugin:vue/vue3-recommended',
'@vue/eslint-config-typescript/recommended',
],
'rules': {
'quotes': ['error', 'single'],
'comma-dangle': ['error', 'always-multiline'],
'semi': ['error', 'never'],
'vue/v-on-event-hyphenation': ['warn', 'never', { 'autofix': true }],
'vue/multi-word-component-names': 'off',
// uncategorized rules:
'vue/component-api-style': ['error', ['script-setup']],
'vue/component-name-in-template-casing': ['error', 'PascalCase', {
'globals': ['RouterView', 'RouterLink', 'Icon', 'Notifications', 'Modal', 'Card'],
}],
'vue/custom-event-name-casing': ['error', 'camelCase'],
'vue/define-macros-order': 'error',
'vue/match-component-file-name': ['error', {
'extensions': ['.js', '.jsx', '.ts', '.tsx', '.vue'],
'shouldMatchCase': true,
}],
'vue/no-boolean-default': ['warn', 'default-false'],
'vue/match-component-import-name': 'error',
'vue/prefer-separate-static-class': 'warn',
'vue/padding-line-between-blocks': 'error',
'vue/next-tick-style': ['error', 'promise'],
'vue/block-lang': [
'error',
{ 'script': { 'lang': 'ts' } },
],
'vue/no-duplicate-attr-inheritance': 'error',
'vue/no-empty-component-block': 'error',
'vue/html-indent': ['error', 'tab'],
// vue3
'vue/no-ref-object-reactivity-loss': 'error',
'vue/no-setup-props-reactivity-loss': 'warn', // TODO: switch to error after vite `propsDestructure` is removed
},
'parser': 'vue-eslint-parser',
'parserOptions': {
'parser': '@typescript-eslint/parser',
'ecmaVersion': 'latest',
'tsconfigRootDir': __dirname,
},
'ignorePatterns': [
'*.test.*',
'cypress/*',
],
}

View File

@ -1 +1 @@
22.11.0
20.16.0

View File

@ -9,7 +9,7 @@ export class LinkShareFactory extends Factory {
return {
id: '{increment}',
hash: faker.lorem.word(32),
hash: faker.random.word(32),
project_id: 1,
right: 0,
sharing_type: 0,

View File

@ -10,7 +10,7 @@ export class UserFactory extends Factory {
return {
id: '{increment}',
username: faker.lorem.word(10) + faker.string.uuid(),
username: faker.lorem.word(10) + faker.datatype.uuid(),
password: '$2a$14$dcadBoMBL9jQoOcZK8Fju.cy0Ptx2oZECkKLnaa8ekRoTFe1w7To.', // 1234
status: 0,
issuer: 'local',

View File

@ -1,88 +0,0 @@
import pluginVue from 'eslint-plugin-vue'
import js from '@eslint/js'
import vueTsEslintConfig from '@vue/eslint-config-typescript'
export default [
js.configs.recommended,
...pluginVue.configs['flat/recommended'],
...vueTsEslintConfig(),
{
ignores: [
'**/*.test.ts',
'./cypress',
],
},
{
rules: {
'quotes': ['error', 'single'],
'comma-dangle': ['error', 'always-multiline'],
'semi': ['error', 'never'],
'vue/v-on-event-hyphenation': ['warn', 'never', {'autofix': true}],
'vue/multi-word-component-names': 'off',
// uncategorized rules:
'vue/component-api-style': ['error', ['script-setup']],
'vue/component-name-in-template-casing': ['error', 'PascalCase', {
'globals': ['RouterView', 'RouterLink', 'Icon', 'Notifications', 'Modal', 'Card'],
}],
'vue/custom-event-name-casing': ['error', 'camelCase'],
'vue/define-macros-order': 'error',
'vue/match-component-file-name': ['error', {
'extensions': ['.js', '.jsx', '.ts', '.tsx', '.vue'],
'shouldMatchCase': true,
}],
'vue/no-boolean-default': ['warn', 'default-false'],
'vue/match-component-import-name': 'error',
'vue/prefer-separate-static-class': 'warn',
'vue/padding-line-between-blocks': 'error',
'vue/next-tick-style': ['error', 'promise'],
'vue/block-lang': [
'error',
{'script': {'lang': 'ts'}},
],
'vue/no-duplicate-attr-inheritance': 'error',
'vue/no-empty-component-block': 'error',
'vue/html-indent': ['error', 'tab'],
// vue3
'vue/no-ref-object-reactivity-loss': 'error',
'vue/no-setup-props-reactivity-loss': 'warn', // TODO: switch to error after vite `propsDestructure` is removed
'@typescript-eslint/no-unused-vars': [
'error',
{
// 'args': 'all',
// 'argsIgnorePattern': '^_',
'caughtErrors': 'all',
'caughtErrorsIgnorePattern': '^_',
// 'destructuredArrayIgnorePattern': '^_',
'varsIgnorePattern': '^_',
'ignoreRestSiblings': true,
},
],
},
// files: ['*.vue', '**/*.vue'],
languageOptions: {
parserOptions: {
parser: '@typescript-eslint/parser',
ecmaVersion: 'latest',
tsconfigRootDir: '.',
},
},
// 'parser': 'vue-eslint-parser',
// 'parserOptions': {
// 'parser': '@typescript-eslint/parser',
// 'ecmaVersion': 'latest',
// 'tsconfigRootDir': __dirname,
// },
// 'ignorePatterns': [
// 'cypress/*',
// ],
},
]

View File

@ -13,7 +13,7 @@
},
"homepage": "https://vikunja.io/",
"funding": "https://opencollective.com/vikunja",
"packageManager": "pnpm@9.14.4",
"packageManager": "pnpm@9.11.0",
"keywords": [
"todo",
"productivity",
@ -50,59 +50,59 @@
"story:preview": "histoire preview"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "6.7.1",
"@fortawesome/free-regular-svg-icons": "6.7.1",
"@fortawesome/free-solid-svg-icons": "6.7.1",
"@fortawesome/fontawesome-svg-core": "6.6.0",
"@fortawesome/free-regular-svg-icons": "6.6.0",
"@fortawesome/free-solid-svg-icons": "6.6.0",
"@fortawesome/vue-fontawesome": "3.0.8",
"@github/hotkey": "3.1.1",
"@infectoone/vue-ganttastic": "2.3.2",
"@intlify/unplugin-vue-i18n": "6.0.0",
"@kyvg/vue3-notification": "3.4.1",
"@intlify/unplugin-vue-i18n": "5.2.0",
"@kyvg/vue3-notification": "3.3.0",
"@sentry/tracing": "7.114.0",
"@sentry/vue": "8.42.0",
"@tiptap/core": "2.10.3",
"@tiptap/extension-blockquote": "2.10.3",
"@tiptap/extension-bold": "2.10.3",
"@tiptap/extension-bullet-list": "2.10.3",
"@tiptap/extension-code": "2.10.3",
"@tiptap/extension-code-block": "2.10.3",
"@tiptap/extension-code-block-lowlight": "2.10.3",
"@tiptap/extension-document": "2.10.3",
"@tiptap/extension-dropcursor": "2.10.3",
"@tiptap/extension-gapcursor": "2.10.3",
"@tiptap/extension-hard-break": "2.10.3",
"@tiptap/extension-heading": "2.10.3",
"@tiptap/extension-history": "2.10.3",
"@tiptap/extension-horizontal-rule": "2.10.3",
"@tiptap/extension-image": "2.10.3",
"@tiptap/extension-italic": "2.10.3",
"@tiptap/extension-link": "2.10.3",
"@tiptap/extension-list-item": "2.10.3",
"@tiptap/extension-ordered-list": "2.10.3",
"@tiptap/extension-paragraph": "2.10.3",
"@tiptap/extension-placeholder": "2.10.3",
"@tiptap/extension-strike": "2.10.3",
"@tiptap/extension-table": "2.10.3",
"@tiptap/extension-table-cell": "2.10.3",
"@tiptap/extension-table-header": "2.10.3",
"@tiptap/extension-table-row": "2.10.3",
"@tiptap/extension-task-item": "2.10.3",
"@tiptap/extension-task-list": "2.10.3",
"@tiptap/extension-text": "2.10.3",
"@tiptap/extension-typography": "2.10.3",
"@tiptap/extension-underline": "2.10.3",
"@tiptap/pm": "2.10.3",
"@tiptap/suggestion": "2.10.3",
"@tiptap/vue-3": "2.10.3",
"@vueuse/core": "12.0.0",
"@vueuse/router": "12.0.0",
"axios": "1.7.8",
"@sentry/vue": "8.32.0",
"@tiptap/core": "2.8.0",
"@tiptap/extension-blockquote": "2.8.0",
"@tiptap/extension-bold": "2.8.0",
"@tiptap/extension-bullet-list": "2.8.0",
"@tiptap/extension-code": "2.8.0",
"@tiptap/extension-code-block": "2.8.0",
"@tiptap/extension-code-block-lowlight": "2.8.0",
"@tiptap/extension-document": "2.8.0",
"@tiptap/extension-dropcursor": "2.8.0",
"@tiptap/extension-gapcursor": "2.8.0",
"@tiptap/extension-hard-break": "2.8.0",
"@tiptap/extension-heading": "2.8.0",
"@tiptap/extension-history": "2.8.0",
"@tiptap/extension-horizontal-rule": "2.8.0",
"@tiptap/extension-image": "2.8.0",
"@tiptap/extension-italic": "2.8.0",
"@tiptap/extension-link": "2.8.0",
"@tiptap/extension-list-item": "2.8.0",
"@tiptap/extension-ordered-list": "2.8.0",
"@tiptap/extension-paragraph": "2.8.0",
"@tiptap/extension-placeholder": "2.8.0",
"@tiptap/extension-strike": "2.8.0",
"@tiptap/extension-table": "2.8.0",
"@tiptap/extension-table-cell": "2.8.0",
"@tiptap/extension-table-header": "2.8.0",
"@tiptap/extension-table-row": "2.8.0",
"@tiptap/extension-task-item": "2.8.0",
"@tiptap/extension-task-list": "2.8.0",
"@tiptap/extension-text": "2.8.0",
"@tiptap/extension-typography": "2.8.0",
"@tiptap/extension-underline": "2.8.0",
"@tiptap/pm": "2.8.0",
"@tiptap/suggestion": "2.8.0",
"@tiptap/vue-3": "2.8.0",
"@vueuse/core": "11.1.0",
"@vueuse/router": "11.1.0",
"axios": "1.7.7",
"blurhash": "2.0.5",
"bulma-css-variables": "0.9.33",
"change-case": "5.4.4",
"date-fns": "4.1.0",
"dayjs": "1.11.13",
"dompurify": "3.2.2",
"dompurify": "3.1.7",
"fast-deep-equal": "3.1.3",
"flatpickr": "4.6.13",
"flexsearch": "0.7.43",
@ -110,70 +110,72 @@
"is-touch-device": "1.0.1",
"klona": "2.0.6",
"lowlight": "2.9.0",
"pinia": "2.2.8",
"pinia": "2.2.3",
"register-service-worker": "1.7.2",
"sortablejs": "1.15.6",
"tailwindcss": "3.4.16",
"sortablejs": "1.15.3",
"tailwindcss": "3.4.13",
"tippy.js": "6.3.7",
"ufo": "1.5.4",
"vue": "3.5.13",
"vue": "3.5.10",
"vue-advanced-cropper": "2.8.9",
"vue-flatpickr-component": "11.0.5",
"vue-i18n": "10.0.5",
"vue-router": "4.5.0",
"vue-i18n": "10.0.3",
"vue-router": "4.4.5",
"vuemoji-picker": "0.3.1",
"workbox-precaching": "7.3.0",
"workbox-precaching": "7.1.0",
"zhyswan-vuedraggable": "4.1.3"
},
"devDependencies": {
"@4tw/cypress-drag-drop": "2.2.5",
"@cypress/vite-dev-server": "5.2.1",
"@cypress/vite-dev-server": "5.2.0",
"@cypress/vue": "6.0.1",
"@faker-js/faker": "9.3.0",
"@faker-js/faker": "8.4.1",
"@histoire/plugin-screenshot": "0.17.17",
"@histoire/plugin-vue": "0.17.17",
"@tsconfig/node22": "22.0.0",
"@rushstack/eslint-patch": "1.10.4",
"@tsconfig/node20": "20.1.4",
"@types/codemirror": "5.60.15",
"@types/dompurify": "3.2.0",
"@types/dompurify": "3.0.5",
"@types/flexsearch": "0.7.6",
"@types/is-touch-device": "1.0.3",
"@types/lodash.clonedeep": "4.5.9",
"@types/node": "22.10.1",
"@types/node": "20.16.10",
"@types/sortablejs": "1.15.8",
"@typescript-eslint/eslint-plugin": "8.17.0",
"@typescript-eslint/parser": "8.17.0",
"@vitejs/plugin-legacy": "6.0.0",
"@vitejs/plugin-vue": "5.2.1",
"@vue/eslint-config-typescript": "14.1.4",
"@typescript-eslint/eslint-plugin": "7.18.0",
"@typescript-eslint/parser": "7.18.0",
"@vitejs/plugin-legacy": "5.4.2",
"@vitejs/plugin-vue": "5.1.4",
"@vue/eslint-config-typescript": "13.0.0",
"@vue/test-utils": "2.4.6",
"@vue/tsconfig": "0.7.0",
"@vue/tsconfig": "0.5.1",
"autoprefixer": "10.4.20",
"browserslist": "4.24.2",
"caniuse-lite": "1.0.30001686",
"browserslist": "4.24.0",
"caniuse-lite": "1.0.30001664",
"csstype": "3.1.3",
"cypress": "13.16.0",
"cypress": "13.15.0",
"esbuild": "0.24.0",
"eslint": "9.16.0",
"eslint-plugin-vue": "9.32.0",
"happy-dom": "15.11.7",
"eslint": "8.57.1",
"eslint-plugin-vue": "9.28.0",
"happy-dom": "14.12.3",
"histoire": "0.17.17",
"postcss": "8.4.49",
"postcss": "8.4.47",
"postcss-easing-gradients": "3.0.1",
"postcss-preset-env": "10.1.1",
"rollup": "4.28.0",
"postcss-easings": "4.0.0",
"postcss-preset-env": "9.6.0",
"rollup": "4.22.5",
"rollup-plugin-visualizer": "5.12.0",
"sass-embedded": "1.81.1",
"sass": "1.79.4",
"start-server-and-test": "2.0.8",
"typescript": "5.7.2",
"unplugin-inject-preload": "3.0.0",
"vite": "6.0.2",
"vite-plugin-pwa": "0.21.1",
"typescript": "5.6.2",
"unplugin-inject-preload": "2.0.5",
"vite": "5.4.8",
"vite-plugin-pwa": "0.20.5",
"vite-plugin-sentry": "1.4.0",
"vite-svg-loader": "5.1.0",
"vitest": "2.1.8",
"vue-tsc": "2.1.10",
"wait-on": "8.0.1",
"workbox-cli": "7.3.0"
"vitest": "1.6.0",
"vue-tsc": "2.1.6",
"wait-on": "7.2.0",
"workbox-cli": "7.1.0"
},
"pnpm": {
"patchedDependencies": {

6537
frontend/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -102,4 +102,6 @@ setLanguage(authStore.settings.language)
useColorScheme()
</script>
<style lang="scss" src="@/styles/global.scss" />
<style lang="scss">
@import '@/styles/global.scss';
</style>

View File

@ -73,7 +73,6 @@ function getHeight(el: HTMLElement) {
* https://gist.github.com/paulirish/5d52fb081b3570c81e3a
*/
function forceLayout(el: HTMLElement) {
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
el.offsetTop
}
@ -134,16 +133,11 @@ function removeHeight(el: HTMLElement) {
<style lang="scss" scoped>
$transition-time: 300ms;
// https://easings.net/#easeInQuint
$ease-in-quint: cubic-bezier(0.64, 0, 0.78, 0);
// https://easings.net/#easeInOutQuint
$ease-in-out-quint: cubic-bezier(0.83, 0, 0.17, 1);
.expandable-slide-enter-active,
.expandable-slide-leave-active {
transition:
opacity $transition-time $ease-in-quint,
height $transition-time $ease-in-out-quint;
opacity $transition-time ease-in-quint,
height $transition-time ease-in-out-quint;
overflow: hidden;
}

View File

@ -36,9 +36,9 @@
</p>
<p>{{ $t('misc.forExample') }}</p>
<ul>
<li><code>+1d</code>: {{ $t('input.datemathHelp.add1Day') }}</li>
<li><code>-1d</code>: {{ $t('input.datemathHelp.minus1Day') }}</li>
<li><code>/d</code>: {{ $t('input.datemathHelp.roundDay') }}</li>
<li><code>+1d</code> {{ $t('input.datemathHelp.add1Day') }}</li>
<li><code>-1d</code> {{ $t('input.datemathHelp.minus1Day') }}</li>
<li><code>/d</code> {{ $t('input.datemathHelp.roundDay') }}</li>
</ul>
<h3>{{ $t('input.datemathHelp.supportedUnits') }}</h3>
<table class="table">

View File

@ -28,9 +28,10 @@ const enabled = computed(() => configStore.demoModeEnabled && !hide.value)
<style scoped lang="scss">
.demo-mode-banner {
position: sticky;
position: fixed;
bottom: 0;
inset-inline: 0;
left: 0;
right: 0;
background: var(--danger);
z-index: 100;
padding: .5rem;

View File

@ -9,7 +9,7 @@
</template>
<script setup lang="ts">
import {computed} from 'vue'
import {computed, defineProps} from 'vue'
import BaseButton from '@/components/base/BaseButton.vue'
import {POWERED_BY as poweredByUrl} from '@/urls'

View File

@ -25,7 +25,7 @@
/>
<div
class="color-bubble-handle-wrapper"
:class="{'is-draggable': project.id > 0 && project.maxRight > RIGHTS.READ}"
:class="{'is-draggable': project.id > 0}"
>
<ColorBubble
v-if="project.hexColor !== ''"
@ -38,7 +38,7 @@
<Icon icon="filter" />
</span>
<span
v-if="project.id > 0 && project.maxRight > RIGHTS.READ"
v-if="project.id > 0"
class="icon menu-item-icon handle"
:class="{'has-color-bubble': project.hexColor !== ''}"
>
@ -48,7 +48,7 @@
<span class="project-menu-title">{{ getProjectTitle(project) }}</span>
</BaseButton>
<BaseButton
v-if="project.id > 0 && project.maxRight > RIGHTS.READ"
v-if="project.id > 0"
class="favorite"
:class="{'is-favorite': project.isFavorite}"
@click="projectStore.toggleProjectFavorite(project)"