Compare commits

..

16 Commits

Author SHA1 Message Date
renovate 6b6d1badab chore(deps): update golangci/golangci-lint docker tag to v1.57.1
continuous-integration/drone/pr Build is pending Details
2024-03-20 17:05:22 +00:00
renovate 5e3616bda3 fix(deps): update dependency ufo to v1.5.3
continuous-integration/drone/push Build is passing Details
2024-03-20 16:32:22 +00:00
renovate 3e5ff77b91 fix(deps): update dependency express to v4.19.0
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build is failing Details
2024-03-20 16:05:36 +00:00
kolaente 403db6adbf
fix(reminder): do not close the popup directly after changing the value
continuous-integration/drone/push Build is passing Details
Fixes https://github.com/go-vikunja/vikunja/issues/225
2024-03-20 11:58:29 +01:00
kolaente fd4312382e
fix(kanban): remove unused function
continuous-integration/drone/push Build is failing Details
2024-03-20 11:46:36 +01:00
kolaente 2dcf6c6861
fix(kanban): do not use the bucket id saved on the task
continuous-integration/drone/push Build was killed Details
2024-03-20 11:36:54 +01:00
kolaente 8f85af07ca
fix(task): clear timeout for description save when closing the task detail 2024-03-20 11:26:54 +01:00
kolaente 9f89fbe5a6
fix(tests): do not try to create tasks with bucket_id
continuous-integration/drone/push Build is failing Details
2024-03-20 10:54:37 +01:00
kolaente 6ad83c0685
chore: do not import message dynamically
continuous-integration/drone/push Build is failing Details
Since it was not done consistently, it would not get imported dynamically anyway. This fixes the compile warnings.
2024-03-20 10:52:59 +01:00
kolaente 97b7592e7c
fix(views): do not map bucket id from xorm
continuous-integration/drone/push Build was killed Details
2024-03-20 10:41:58 +01:00
kolaente 19c9cd9bc2
fix(docker): don't install cypress in docker image
continuous-integration/drone/push Build is passing Details
2024-03-20 09:38:28 +01:00
Frederick [Bot] e53fcd3367 [skip ci] Updated swagger docs 2024-03-20 08:35:16 +00:00
kolaente d635fd2dd3
fix(projects): remove done bucket id field from projects struct
continuous-integration/drone/push Build is passing Details
2024-03-20 09:21:40 +01:00
renovate b8584301a3 fix(deps): update dependency @infectoone/vue-ganttastic to v2.3.1
continuous-integration/drone/push Build is passing Details
2024-03-20 08:01:25 +00:00
renovate 2bb4c31f20 chore(deps): update dev-dependencies
continuous-integration/drone/pr Build is passing Details
continuous-integration/drone/push Build is failing Details
2024-03-20 03:07:47 +00:00
Frederick [Bot] d22ebef0b3 chore(i18n): update translations via Crowdin
continuous-integration/drone/push Build is passing Details
2024-03-20 00:06:31 +00:00
19 changed files with 380 additions and 416 deletions

View File

@ -139,7 +139,7 @@ steps:
event: [ push, tag, pull_request ] event: [ push, tag, pull_request ]
- name: api-lint - name: api-lint
image: golangci/golangci-lint:v1.57.0 image: golangci/golangci-lint:v1.57.1
pull: always pull: always
environment: environment:
GOPROXY: 'https://goproxy.kolaente.de' GOPROXY: 'https://goproxy.kolaente.de'

View File

@ -5,6 +5,7 @@ WORKDIR /build
ENV PNPM_CACHE_FOLDER .cache/pnpm/ ENV PNPM_CACHE_FOLDER .cache/pnpm/
ENV PUPPETEER_SKIP_DOWNLOAD true ENV PUPPETEER_SKIP_DOWNLOAD true
ENV CYPRESS_INSTALL_BINARY 0
COPY frontend/ ./ COPY frontend/ ./

View File

@ -56,6 +56,6 @@
}, },
"dependencies": { "dependencies": {
"connect-history-api-fallback": "2.0.0", "connect-history-api-fallback": "2.0.0",
"express": "4.18.3" "express": "4.19.0"
} }
} }

View File

@ -581,10 +581,10 @@ cookie-signature@1.0.6:
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
cookie@0.5.0: cookie@0.6.0:
version "0.5.0" version "0.6.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
core-util-is@1.0.2: core-util-is@1.0.2:
version "1.0.2" version "1.0.2"
@ -830,17 +830,17 @@ etag@~1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
express@4.18.3: express@4.19.0:
version "4.18.3" version "4.19.0"
resolved "https://registry.yarnpkg.com/express/-/express-4.18.3.tgz#6870746f3ff904dee1819b82e4b51509afffb0d4" resolved "https://registry.yarnpkg.com/express/-/express-4.19.0.tgz#c9f689a62522f3399132d49eacd9af177d8ccb9e"
integrity sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw== integrity sha512-/ERliX0l7UuHEgAy7HU2FRsiz3ScIKNl/iwnoYzHTJC0Sqj3ctWDD3MQ9CbUEfjshvxXImWaeukD0Xo7a2lWLA==
dependencies: dependencies:
accepts "~1.3.8" accepts "~1.3.8"
array-flatten "1.1.1" array-flatten "1.1.1"
body-parser "1.20.2" body-parser "1.20.2"
content-disposition "0.5.4" content-disposition "0.5.4"
content-type "~1.0.4" content-type "~1.0.4"
cookie "0.5.0" cookie "0.6.0"
cookie-signature "1.0.6" cookie-signature "1.0.6"
debug "2.6.9" debug "2.6.9"
depd "2.0.0" depd "2.0.0"

View File

@ -20,7 +20,6 @@ function createSingleTaskInBucket(count = 1, attrs = {}) {
}) })
const tasks = TaskFactory.create(count, { const tasks = TaskFactory.create(count, {
project_id: projects[0].id, project_id: projects[0].id,
bucket_id: buckets[0].id,
...attrs, ...attrs,
}) })
TaskBucketFactory.create(1, { TaskBucketFactory.create(1, {

View File

@ -467,7 +467,6 @@ describe('Task', () => {
const tasks = TaskFactory.create(1, { const tasks = TaskFactory.create(1, {
id: 1, id: 1,
project_id: projects[0].id, project_id: projects[0].id,
bucket_id: buckets[0].id,
}) })
const labels = LabelFactory.create(1) const labels = LabelFactory.create(1)
LabelTaskFactory.truncate() LabelTaskFactory.truncate()
@ -834,7 +833,6 @@ describe('Task', () => {
const tasks = TaskFactory.create(1, { const tasks = TaskFactory.create(1, {
id: 1, id: 1,
project_id: projects[0].id, project_id: projects[0].id,
bucket_id: buckets[0].id,
}) })
const labels = LabelFactory.create(1) const labels = LabelFactory.create(1)
LabelTaskFactory.truncate() LabelTaskFactory.truncate()

View File

@ -55,7 +55,7 @@
"@fortawesome/free-solid-svg-icons": "6.5.1", "@fortawesome/free-solid-svg-icons": "6.5.1",
"@fortawesome/vue-fontawesome": "3.0.6", "@fortawesome/vue-fontawesome": "3.0.6",
"@github/hotkey": "3.1.0", "@github/hotkey": "3.1.0",
"@infectoone/vue-ganttastic": "2.2.0", "@infectoone/vue-ganttastic": "2.3.1",
"@intlify/unplugin-vue-i18n": "3.0.1", "@intlify/unplugin-vue-i18n": "3.0.1",
"@kyvg/vue3-notification": "3.2.1", "@kyvg/vue3-notification": "3.2.1",
"@sentry/tracing": "7.107.0", "@sentry/tracing": "7.107.0",
@ -117,7 +117,7 @@
"snake-case": "3.0.4", "snake-case": "3.0.4",
"sortablejs": "1.15.2", "sortablejs": "1.15.2",
"tippy.js": "6.3.7", "tippy.js": "6.3.7",
"ufo": "1.5.2", "ufo": "1.5.3",
"vue": "3.4.21", "vue": "3.4.21",
"vue-advanced-cropper": "2.8.8", "vue-advanced-cropper": "2.8.8",
"vue-flatpickr-component": "11.0.5", "vue-flatpickr-component": "11.0.5",
@ -134,7 +134,7 @@
"@faker-js/faker": "8.4.1", "@faker-js/faker": "8.4.1",
"@histoire/plugin-screenshot": "0.17.14", "@histoire/plugin-screenshot": "0.17.14",
"@histoire/plugin-vue": "0.17.14", "@histoire/plugin-vue": "0.17.14",
"@rushstack/eslint-patch": "1.7.2", "@rushstack/eslint-patch": "1.8.0",
"@tsconfig/node18": "18.2.2", "@tsconfig/node18": "18.2.2",
"@types/codemirror": "5.60.15", "@types/codemirror": "5.60.15",
"@types/dompurify": "3.0.5", "@types/dompurify": "3.0.5",
@ -142,7 +142,7 @@
"@types/is-touch-device": "1.0.2", "@types/is-touch-device": "1.0.2",
"@types/lodash.debounce": "4.0.9", "@types/lodash.debounce": "4.0.9",
"@types/marked": "5.0.2", "@types/marked": "5.0.2",
"@types/node": "20.11.29", "@types/node": "20.11.30",
"@types/postcss-preset-env": "7.7.0", "@types/postcss-preset-env": "7.7.0",
"@types/sortablejs": "1.15.8", "@types/sortablejs": "1.15.8",
"@typescript-eslint/eslint-plugin": "7.3.1", "@typescript-eslint/eslint-plugin": "7.3.1",
@ -163,7 +163,7 @@
"eslint-plugin-vue": "9.23.0", "eslint-plugin-vue": "9.23.0",
"happy-dom": "14.0.0", "happy-dom": "14.0.0",
"histoire": "0.17.14", "histoire": "0.17.14",
"postcss": "8.4.36", "postcss": "8.4.37",
"postcss-easing-gradients": "3.0.1", "postcss-easing-gradients": "3.0.1",
"postcss-easings": "4.0.0", "postcss-easings": "4.0.0",
"postcss-focus-within": "8.0.1", "postcss-focus-within": "8.0.1",
@ -175,7 +175,7 @@
"typescript": "5.4.2", "typescript": "5.4.2",
"vite": "5.1.6", "vite": "5.1.6",
"vite-plugin-inject-preload": "1.3.3", "vite-plugin-inject-preload": "1.3.3",
"vite-plugin-pwa": "0.19.4", "vite-plugin-pwa": "0.19.5",
"vite-plugin-sentry": "1.4.0", "vite-plugin-sentry": "1.4.0",
"vite-svg-loader": "5.1.0", "vite-svg-loader": "5.1.0",
"vitest": "1.4.0", "vitest": "1.4.0",

File diff suppressed because it is too large Load Diff

View File

@ -47,7 +47,7 @@ import AddToHomeScreen from '@/components/home/AddToHomeScreen.vue'
import DemoMode from '@/components/home/DemoMode.vue' import DemoMode from '@/components/home/DemoMode.vue'
const importAccountDeleteService = () => import('@/services/accountDelete') const importAccountDeleteService = () => import('@/services/accountDelete')
const importMessage = () => import('@/message') import {success} from '@/message'
const baseStore = useBaseStore() const baseStore = useBaseStore()
const authStore = useAuthStore() const authStore = useAuthStore()
@ -69,11 +69,9 @@ watch(accountDeletionConfirm, async (accountDeletionConfirm) => {
return return
} }
const messageP = importMessage()
const AccountDeleteService = (await importAccountDeleteService()).default const AccountDeleteService = (await importAccountDeleteService()).default
const accountDeletionService = new AccountDeleteService() const accountDeletionService = new AccountDeleteService()
await accountDeletionService.confirm(accountDeletionConfirm) await accountDeletionService.confirm(accountDeletionConfirm)
const {success} = await messageP
success({message: t('user.deletion.confirmSuccess')}) success({message: t('user.deletion.confirmSuccess')})
authStore.refreshUserInfo() authStore.refreshUserInfo()
}, { immediate: true }) }, { immediate: true })

View File

@ -37,7 +37,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref, computed, watch} from 'vue' import {ref, computed, watch, onBeforeUnmount} from 'vue'
import CustomTransition from '@/components/misc/CustomTransition.vue' import CustomTransition from '@/components/misc/CustomTransition.vue'
import Editor from '@/components/input/AsyncEditor' import Editor from '@/components/input/AsyncEditor'
@ -88,6 +88,12 @@ async function saveWithDelay() {
}, 5000) }, 5000)
} }
onBeforeUnmount(() => {
if (changeTimeout.value !== null) {
clearTimeout(changeTimeout.value)
}
})
async function save() { async function save() {
if (changeTimeout.value !== null) { if (changeTimeout.value !== null) {
clearTimeout(changeTimeout.value) clearTimeout(changeTimeout.value)

View File

@ -47,7 +47,6 @@
<ReminderPeriod <ReminderPeriod
v-if="activeForm === 'relative'" v-if="activeForm === 'relative'"
v-model="reminder" v-model="reminder"
@update:modelValue="updateDataAndMaybeClose(close)"
/> />
<DatepickerInline <DatepickerInline

View File

@ -57,11 +57,11 @@
"logout": "Wyloguj", "logout": "Wyloguj",
"emailInvalid": "Proszę podać poprawny adres e-mail.", "emailInvalid": "Proszę podać poprawny adres e-mail.",
"usernameRequired": "Proszę podać nazwę użytkownika.", "usernameRequired": "Proszę podać nazwę użytkownika.",
"usernameMustNotContainSpace": "The username must not contain spaces.", "usernameMustNotContainSpace": "Nazwa użytkownika nie może zawierać spacji.",
"usernameMustNotLookLikeUrl": "The username must not look like a URL.", "usernameMustNotLookLikeUrl": "Nazwa użytkownika nie może wyglądać jak adres URL.",
"passwordRequired": "Proszę podać hasło.", "passwordRequired": "Proszę podać hasło.",
"passwordNotMin": "Password must have at least 8 characters.", "passwordNotMin": "Hasło musi zawierać co najmniej 8 znaków.",
"passwordNotMax": "Password must have at most 250 characters.", "passwordNotMax": "Hasło musi zawierać co najwyżej 250 znaków.",
"showPassword": "Pokaż hasło", "showPassword": "Pokaż hasło",
"hidePassword": "Ukryj hasło", "hidePassword": "Ukryj hasło",
"noAccountYet": "Nie masz jeszcze konta?", "noAccountYet": "Nie masz jeszcze konta?",
@ -248,7 +248,7 @@
"text2": "Dotyczy to wszystkich zadań i tego NIE DA SIĘ COFNĄĆ!", "text2": "Dotyczy to wszystkich zadań i tego NIE DA SIĘ COFNĄĆ!",
"success": "Projekt został pomyślnie usunięty.", "success": "Projekt został pomyślnie usunięty.",
"tasksToDelete": "To nieodwracalnie usunie około {count} zadań.", "tasksToDelete": "To nieodwracalnie usunie około {count} zadań.",
"tasksAndChildProjectsToDelete": "This will irrevocably remove approx. {tasks} tasks and {projects} projects.", "tasksAndChildProjectsToDelete": "To nieodwracalnie usunie ok. {tasks} zadań i {projects} projektów.",
"noTasksToDelete": "Ten projekt nie zawiera żadnych zadań, więc można go bezpiecznie usunąć." "noTasksToDelete": "Ten projekt nie zawiera żadnych zadań, więc można go bezpiecznie usunąć."
}, },
"duplicate": { "duplicate": {
@ -386,7 +386,7 @@
"filters": { "filters": {
"title": "Filtry", "title": "Filtry",
"clear": "Wyczyść filtry", "clear": "Wyczyść filtry",
"showResults": "Show results", "showResults": "Wyświetl wyniki",
"attributes": { "attributes": {
"title": "Tytuł", "title": "Tytuł",
"titlePlaceholder": "Tu wpisz tytuł filtra stałego…", "titlePlaceholder": "Tu wpisz tytuł filtra stałego…",
@ -419,48 +419,48 @@
"success": "Filtr został pomyślnie zapisany." "success": "Filtr został pomyślnie zapisany."
}, },
"query": { "query": {
"title": "Query", "title": "Zapytanie",
"placeholder": "Type a search or filter query…", "placeholder": "Wpisz zapytanie wyszukiwania lub filtruj…",
"help": { "help": {
"intro": "To filter tasks, you can use a query syntax similar to SQL. The available fields for filtering include:", "intro": "Aby filtrować zadania, możesz użyć składni zapytań podobnej do SQL. Pola dostępne do filtrowania to:",
"link": "How does this work?", "link": "Jak to działa?",
"canUseDatemath": "You can date math to set relative dates. Click on the date value in a query to find out more.", "canUseDatemath": "Możesz użyć matematyki dat, aby ustawić daty względne. Kliknij wartość daty w zapytaniu, aby dowiedzieć się więcej.",
"fields": { "fields": {
"done": "Whether the task is completed or not", "done": "Czy zadanie zostało zakończone, czy nie",
"priority": "The priority level of the task (1-5)", "priority": "Priorytet zadania (1-5)",
"percentDone": "The percentage of completion for the task (0-100)", "percentDone": "Procent ukończenia zadania (0-100)",
"dueDate": "The due date of the task", "dueDate": "Termin wykonania zadania",
"startDate": "The start date of the task", "startDate": "Data rozpoczęcia zadania",
"endDate": "The end date of the task", "endDate": "Data zakończenia zadania",
"doneAt": "The date and time when the task was completed", "doneAt": "Data i czas ukończenia zadania",
"assignees": "The assignees of the task", "assignees": "Osoby przypisane do zadania",
"labels": "The labels associated with the task", "labels": "Etykiety przypisane do zadania",
"project": "The project the task belongs to (only available for saved filters, not on a project level)" "project": "Projekt, do którego należy zadanie (dostępne tylko dla zapisanych filtrów, nie na poziomie projektu)"
}, },
"operators": { "operators": {
"intro": "The available operators for filtering include:", "intro": "Dostępne operatory do filtrowania to:",
"notEqual": "Not equal to", "notEqual": "Nie równa się",
"equal": "Equal to", "equal": "Równa się",
"greaterThan": "Greater than", "greaterThan": "Większe niż",
"greaterThanOrEqual": "Greater than or equal to", "greaterThanOrEqual": "Większe niż lub równe",
"lessThan": "Less than", "lessThan": "Mniejsze niż",
"lessThanOrEqual": "Less than or equal to", "lessThanOrEqual": "Mniejsze niż lub równe",
"like": "Matches a pattern (using wildcard %)", "like": "Pasuje do wzorca (używając symbolu %)",
"in": "Matches any value in a comma-seperated list of values" "in": "Dopasuje dowolną wartość z listy wartości oddzielonych przecinkami"
}, },
"logicalOperators": { "logicalOperators": {
"intro": "To combine multiple conditions, you can use the following logical operators:", "intro": "Aby połączyć wiele warunków, możesz użyć następujących operatorów logicznych:",
"and": "AND operator, matches if all conditions are true", "and": "Operator AND, dopasowuje, jeśli wszystkie warunki są prawdziwe",
"or": "OR operator, matches if any of the conditions are true", "or": "Operator OR, dopasowuje, jeśli którykolwiek z warunków jest spełniony",
"parentheses": "Parentheses for grouping conditions" "parentheses": "Nawiasy do grupowania warunków"
}, },
"examples": { "examples": {
"intro": "Here are some examples of filter queries:", "intro": "Oto kilka przykładów zapytań filtrujących:",
"priorityEqual": "Matches tasks with priority level 4", "priorityEqual": "Dopasowuje zadania z priorytetem 4",
"dueDatePast": "Matches tasks with a due date in the past", "dueDatePast": "Dopasowuje zadania z terminem wykonania w przeszłości",
"undoneHighPriority": "Matches undone tasks with priority level 3 or higher", "undoneHighPriority": "Dopasowuje niewykonane zadania z poziomem 3 lub wyższym",
"assigneesIn": "Matches tasks assigned to either \"user1\" or \"user2\"", "assigneesIn": "Dopasowuje zadania przypisane do \"user1\" lub \"user2\"",
"priorityOneOrTwoPastDue": "Matches tasks with priority level 1 or 2 and a due date in the past" "priorityOneOrTwoPastDue": "Dopasowuje zadania z poziomem 1 lub 2 i terminem wykonania w przeszłości"
} }
} }
} }
@ -632,7 +632,7 @@
"to": "Do", "to": "Do",
"from": "Od", "from": "Od",
"fromto": "{from} do {to}", "fromto": "{from} do {to}",
"date": "Date", "date": "Data",
"ranges": { "ranges": {
"today": "Dziś", "today": "Dziś",
"thisWeek": "W tym tygodniu", "thisWeek": "W tym tygodniu",
@ -649,25 +649,25 @@
"restOfThisYear": "Reszta tego roku" "restOfThisYear": "Reszta tego roku"
}, },
"values": { "values": {
"now": "Now", "now": "Teraz",
"startOfToday": "Start of today", "startOfToday": "Początek dzisiejszego dnia",
"endOfToday": "End of today", "endOfToday": "Koniec dzisiejszego dnia",
"beginningOflastWeek": "Beginning of last week", "beginningOflastWeek": "Początek zeszłego tygodnia",
"endOfLastWeek": "End of last week", "endOfLastWeek": "Koniec zeszłego tygodnia",
"beginningOfThisWeek": "Beginning of this week", "beginningOfThisWeek": "Początek tego tygodnia",
"endOfThisWeek": "End of this week", "endOfThisWeek": "Koniec tego tygodnia",
"startOfNextWeek": "Start of next week", "startOfNextWeek": "Początek następnego tygodnia",
"endOfNextWeek": "End of next week", "endOfNextWeek": "Koniec następnego tygodnia",
"in7Days": "In 7 days", "in7Days": "Za 7 dni",
"beginningOfLastMonth": "Beginning of last month", "beginningOfLastMonth": "Początek zeszłego miesiąca",
"endOfLastMonth": "End of last month", "endOfLastMonth": "Koniec zeszłego miesiąca",
"startOfThisMonth": "Start of this month", "startOfThisMonth": "Początek tego miesiąca",
"endOfThisMonth": "End of this month", "endOfThisMonth": "Koniec tego miesiąca",
"startOfNextMonth": "Start of next month", "startOfNextMonth": "Początek następnego miesiąca",
"endOfNextMonth": "End of next month", "endOfNextMonth": "Koniec następnego miesiąca",
"in30Days": "In 30 days", "in30Days": "Za 30 dni",
"startOfThisYear": "Beginning of this year", "startOfThisYear": "Początek tego roku",
"endOfThisYear": "End of this year" "endOfThisYear": "Koniec tego roku"
} }
}, },
"datemathHelp": { "datemathHelp": {
@ -783,7 +783,7 @@
"startDate": "Data rozpoczęcia", "startDate": "Data rozpoczęcia",
"title": "Tytuł", "title": "Tytuł",
"updated": "Zaktualizowano", "updated": "Zaktualizowano",
"doneAt": "Done At" "doneAt": "Wykonano"
}, },
"subscription": { "subscription": {
"subscribedTaskThroughParentProject": "Nie możesz zrezygnować z subskrypcji, ponieważ subskrybujesz to zadanie poprzez jego projekt.", "subscribedTaskThroughParentProject": "Nie możesz zrezygnować z subskrypcji, ponieważ subskrybujesz to zadanie poprzez jego projekt.",
@ -987,8 +987,8 @@
"descriptionPlaceholder": "Opisz tutaj zespół, naciśnij '/' aby uzyskać więcej opcji…", "descriptionPlaceholder": "Opisz tutaj zespół, naciśnij '/' aby uzyskać więcej opcji…",
"admin": "Administrator", "admin": "Administrator",
"member": "Członek", "member": "Członek",
"isPublic": "Public Team", "isPublic": "Publiczny zespół",
"isPublicDescription": "Make the team publicly discoverable. When enabled, anyone can share projects with this team even when not being a direct member." "isPublicDescription": "Udostępnij zespół publicznie. Gdy ta opcja jest włączona, każdy może udostępniać projekty temu zespołowi, nawet nie będąc jego bezpośrednim członkiem."
} }
}, },
"keyboardShortcuts": { "keyboardShortcuts": {
@ -1047,8 +1047,8 @@
"share": "Udostępnij", "share": "Udostępnij",
"newProject": "Nowy projekt", "newProject": "Nowy projekt",
"createProject": "Utwórz projekt", "createProject": "Utwórz projekt",
"cantArchiveIsDefault": "You cannot archive this because it is your default project.", "cantArchiveIsDefault": "Nie możesz tego zarchiwizować, ponieważ jest to twój domyślny projekt.",
"cantDeleteIsDefault": "You cannot delete this because it is your default project." "cantDeleteIsDefault": "Nie możesz tego usunąć, ponieważ jest to twój domyślny projekt."
}, },
"apiConfig": { "apiConfig": {
"url": "URL Vikunji", "url": "URL Vikunji",
@ -1096,10 +1096,10 @@
"altFormatShort": "j M Y" "altFormatShort": "j M Y"
}, },
"reaction": { "reaction": {
"reactedWith": "{user} reacted with {value}", "reactedWith": "{user} zareagował z {value}",
"reactedWithAnd": "{users} and {lastUser} reacted with {value}", "reactedWithAnd": "{users} i {lastUser} zareagowali z {value}",
"reactedWithAndMany": "{users} and {num} more reacted reacted with {value}", "reactedWithAndMany": "{users} i {num} innych osób zareagowali z {value}",
"add": "Add your reaction" "add": "Dodaj swoją reakcję"
}, },
"error": { "error": {
"error": "Błąd", "error": "Błąd",
@ -1174,7 +1174,7 @@
}, },
"about": { "about": {
"title": "O aplikacji", "title": "O aplikacji",
"version": "Version: {version}" "version": "Wersja: {version}"
}, },
"time": { "time": {
"units": { "units": {

View File

@ -348,7 +348,6 @@ const router = createRouter({
name: 'project.index', name: 'project.index',
redirect(to) { redirect(to) {
const viewId = getProjectViewId(Number(to.params.projectId as string)) const viewId = getProjectViewId(Number(to.params.projectId as string))
console.log(viewId)
if (viewId) { if (viewId) {
console.debug('Replaced list view with', viewId) console.debug('Replaced list view with', viewId)

View File

@ -30,15 +30,6 @@ function getTaskIndicesById(buckets: IBucket[], taskId: ITask['id']) {
} }
} }
const addTaskToBucketAndSort = (buckets: IBucket[], task: ITask) => {
const bucketIndex = findIndexById(buckets, task.bucketId)
if (typeof buckets[bucketIndex] === 'undefined') {
return
}
buckets[bucketIndex].tasks.push(task)
buckets[bucketIndex].tasks.sort((a, b) => a.kanbanPosition > b.kanbanPosition ? 1 : -1)
}
/** /**
* This store is intended to hold the currently active kanban view. * This store is intended to hold the currently active kanban view.
* It should hold only the current buckets. * It should hold only the current buckets.
@ -131,11 +122,6 @@ export const useKanbanStore = defineStore('kanban', () => {
const bucket = buckets.value[b] const bucket = buckets.value[b]
bucket.tasks[t] = task bucket.tasks[t] = task
if (bucket.id !== task.bucketId) {
bucket.tasks.splice(t, 1)
addTaskToBucketAndSort(buckets.value, task)
}
buckets.value[b] = bucket buckets.value[b] = bucket
found = true found = true
@ -144,15 +130,6 @@ export const useKanbanStore = defineStore('kanban', () => {
} }
} }
for (const b in buckets.value) {
if (buckets.value[b].id === task.bucketId) {
findAndUpdate(b)
if (found) {
return
}
}
}
for (const b in buckets.value) { for (const b in buckets.value) {
findAndUpdate(b) findAndUpdate(b)
if (found) { if (found) {
@ -198,7 +175,6 @@ export const useKanbanStore = defineStore('kanban', () => {
if ( if (
bucketIndex === null || bucketIndex === null ||
buckets.value[bucketIndex]?.id !== task.bucketId ||
taskIndex === null || taskIndex === null ||
(buckets.value[bucketIndex]?.tasks[taskIndex]?.id !== task.id) (buckets.value[bucketIndex]?.tasks[taskIndex]?.id !== task.id)
) { ) {

View File

@ -52,9 +52,6 @@ type Project struct {
ParentProjectID int64 `xorm:"bigint INDEX null" json:"parent_project_id"` ParentProjectID int64 `xorm:"bigint INDEX null" json:"parent_project_id"`
ParentProject *Project `xorm:"-" json:"-"` ParentProject *Project `xorm:"-" json:"-"`
// Deprecated: If tasks are moved to the done bucket, they are marked as done. If they are marked as done individually, they are moved into the done bucket.
DoneBucketID int64 `xorm:"bigint INDEX null" json:"done_bucket_id"`
// The user who created this project. // The user who created this project.
Owner *user.User `xorm:"-" json:"owner" valid:"-"` Owner *user.User `xorm:"-" json:"owner" valid:"-"`

View File

@ -114,7 +114,7 @@ type Task struct {
// The bucket id. Will only be populated when the task is accessed via a view with buckets. // The bucket id. Will only be populated when the task is accessed via a view with buckets.
// Can be used to move a task between buckets. In that case, the new bucket must be in the same view as the old one. // Can be used to move a task between buckets. In that case, the new bucket must be in the same view as the old one.
BucketID int64 `xorm:"<-" json:"bucket_id"` BucketID int64 `xorm:"-" json:"bucket_id"`
// The position of the task - any task project can be sorted as usual by this parameter. // The position of the task - any task project can be sorted as usual by this parameter.
// When accessing tasks via views with buckets, this is primarily used to sort them based on a range. // When accessing tasks via views with buckets, this is primarily used to sort them based on a range.

View File

@ -8178,10 +8178,6 @@ const docTemplate = `{
"description": "The description of the project.", "description": "The description of the project.",
"type": "string" "type": "string"
}, },
"done_bucket_id": {
"description": "Deprecated: If tasks are moved to the done bucket, they are marked as done. If they are marked as done individually, they are moved into the done bucket.",
"type": "integer"
},
"hex_color": { "hex_color": {
"description": "The hex color of this project", "description": "The hex color of this project",
"type": "string", "type": "string",

View File

@ -8170,10 +8170,6 @@
"description": "The description of the project.", "description": "The description of the project.",
"type": "string" "type": "string"
}, },
"done_bucket_id": {
"description": "Deprecated: If tasks are moved to the done bucket, they are marked as done. If they are marked as done individually, they are moved into the done bucket.",
"type": "integer"
},
"hex_color": { "hex_color": {
"description": "The hex color of this project", "description": "The hex color of this project",
"type": "string", "type": "string",

View File

@ -431,11 +431,6 @@ definitions:
description: description:
description: The description of the project. description: The description of the project.
type: string type: string
done_bucket_id:
description: 'Deprecated: If tasks are moved to the done bucket, they are
marked as done. If they are marked as done individually, they are moved
into the done bucket.'
type: integer
hex_color: hex_color:
description: The hex color of this project description: The hex color of this project
maxLength: 7 maxLength: 7