Compare commits
1 Commits
fix/api-ke
...
fix/delete
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5fcd0e8688 |
@@ -4,9 +4,8 @@ ARG PROJECT=@kan/web
|
|||||||
|
|
||||||
# 1. Alpine image
|
# 1. Alpine image
|
||||||
FROM node:${NODE_VERSION}-alpine AS alpine
|
FROM node:${NODE_VERSION}-alpine AS alpine
|
||||||
RUN apk update && \
|
RUN apk update
|
||||||
apk add --no-cache --virtual .build-deps libc6-compat python3 make g++ && \
|
RUN apk add --no-cache libc6-compat python3 make g++
|
||||||
rm -rf /var/cache/apk/* /tmp/* || true
|
|
||||||
|
|
||||||
# Setup pnpm and turbo on the alpine base
|
# Setup pnpm and turbo on the alpine base
|
||||||
FROM alpine AS base
|
FROM alpine AS base
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"version": 0,
|
"version": 0,
|
||||||
"locale": {
|
"locale": {
|
||||||
"source": "en",
|
"source": "en",
|
||||||
"targets": ["fr", "de", "es", "it", "nl", "ru", "pl", "ptbr"]
|
"targets": ["fr", "de", "es", "it", "nl", "ru", "pl"]
|
||||||
},
|
},
|
||||||
"buckets": {
|
"buckets": {
|
||||||
"po": {
|
"po": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import type { LinguiConfig } from "@lingui/conf";
|
import type { LinguiConfig } from "@lingui/conf";
|
||||||
|
|
||||||
const config: LinguiConfig = {
|
const config: LinguiConfig = {
|
||||||
locales: ["en", "fr", "de", "es", "it", "nl", "ru", "pl","ptbr"],
|
locales: ["en", "fr", "de", "es", "it", "nl", "ru", "pl"],
|
||||||
sourceLocale: "en",
|
sourceLocale: "en",
|
||||||
catalogs: [
|
catalogs: [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -26,10 +26,8 @@ const config = {
|
|||||||
],
|
],
|
||||||
|
|
||||||
/** We already do linting and typechecking as separate tasks in CI */
|
/** We already do linting and typechecking as separate tasks in CI */
|
||||||
typescript: { ignoreBuildErrors: true },
|
|
||||||
|
|
||||||
// temporarily ignore eslint errors during build until we fix all the errors sigh
|
|
||||||
eslint: { ignoreDuringBuilds: true },
|
eslint: { ignoreDuringBuilds: true },
|
||||||
|
typescript: { ignoreBuildErrors: true },
|
||||||
|
|
||||||
images: {
|
images: {
|
||||||
remotePatterns: (() => {
|
remotePatterns: (() => {
|
||||||
@@ -77,13 +75,12 @@ const config = {
|
|||||||
return patterns;
|
return patterns;
|
||||||
})(),
|
})(),
|
||||||
},
|
},
|
||||||
turbopack: {
|
webpack(config) {
|
||||||
rules: {
|
config.module.rules.push({
|
||||||
"*.svg": {
|
test: /\.svg$/,
|
||||||
loaders: ["@svgr/webpack"],
|
use: ["@svgr/webpack"],
|
||||||
as: "*.js",
|
});
|
||||||
},
|
return config;
|
||||||
},
|
|
||||||
},
|
},
|
||||||
experimental: {
|
experimental: {
|
||||||
// instrumentationHook: true,
|
// instrumentationHook: true,
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "pnpm with-env next build --turbo",
|
"build": "pnpm with-env next build",
|
||||||
"clean": "git clean -xdf .cache .next .turbo node_modules",
|
"clean": "git clean -xdf .cache .next .turbo node_modules",
|
||||||
"dev": "pnpm with-env next dev --turbo",
|
"dev": "pnpm with-env next dev",
|
||||||
"format": "prettier --check . --ignore-path ../../.gitignore",
|
"format": "prettier --check . --ignore-path ../../.gitignore",
|
||||||
"lint": "eslint",
|
"lint": "eslint",
|
||||||
"start": "pnpm with-env next start",
|
"start": "pnpm with-env next start",
|
||||||
@@ -47,10 +47,12 @@
|
|||||||
"date-fns": "^4.1.0",
|
"date-fns": "^4.1.0",
|
||||||
"geist": "^1.3.1",
|
"geist": "^1.3.1",
|
||||||
"jose": "^6.1.2",
|
"jose": "^6.1.2",
|
||||||
"next": "15.5.9",
|
"next": "^15.3.4",
|
||||||
|
"next-logger": "^5.0.1",
|
||||||
"next-runtime-env": "^1.7.2",
|
"next-runtime-env": "^1.7.2",
|
||||||
"next-themes": "^0.4.6",
|
"next-themes": "^0.4.6",
|
||||||
"nextjs-cors": "^2.2.0",
|
"nextjs-cors": "^2.2.0",
|
||||||
|
"pino": "^9.6.0",
|
||||||
"posthog-js": "^1.254.0",
|
"posthog-js": "^1.254.0",
|
||||||
"react": "catalog:react18",
|
"react": "catalog:react18",
|
||||||
"react-beautiful-dnd": "^13.1.1",
|
"react-beautiful-dnd": "^13.1.1",
|
||||||
@@ -84,6 +86,7 @@
|
|||||||
"dotenv-cli": "^7.4.4",
|
"dotenv-cli": "^7.4.4",
|
||||||
"eslint": "catalog:",
|
"eslint": "catalog:",
|
||||||
"jiti": "^1.21.6",
|
"jiti": "^1.21.6",
|
||||||
|
"pino-pretty": "^13.0.0",
|
||||||
"prettier": "catalog:",
|
"prettier": "catalog:",
|
||||||
"tailwindcss": "catalog:",
|
"tailwindcss": "catalog:",
|
||||||
"typescript": "catalog:"
|
"typescript": "catalog:"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
@@ -1,6 +1,6 @@
|
|||||||
import type { Locale as DateFnsLocale } from "date-fns";
|
import type { Locale as DateFnsLocale } from "date-fns";
|
||||||
import { useLingui } from "@lingui/react";
|
import { useLingui } from "@lingui/react";
|
||||||
import { de, enGB, es, fr, it, nl, pl, ru, ptBR} from "date-fns/locale";
|
import { de, enGB, es, fr, it, nl, pl, ru } from "date-fns/locale";
|
||||||
|
|
||||||
import type { Locale } from "~/locales";
|
import type { Locale } from "~/locales";
|
||||||
import { useLinguiContext } from "~/providers/lingui";
|
import { useLinguiContext } from "~/providers/lingui";
|
||||||
@@ -19,7 +19,6 @@ export function useLocalisation() {
|
|||||||
nl,
|
nl,
|
||||||
ru,
|
ru,
|
||||||
pl,
|
pl,
|
||||||
ptbr: ptBR,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const currentDateLocale = dateLocaleMap[locale] ?? enGB;
|
const currentDateLocale = dateLocaleMap[locale] ?? enGB;
|
||||||
|
|||||||
6
apps/web/src/instrumentation.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
export async function register() {
|
||||||
|
if (process.env.NEXT_RUNTIME === "nodejs") {
|
||||||
|
await require("pino");
|
||||||
|
await require("next-logger");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,7 +31,7 @@ msgstr "{0}"
|
|||||||
#. placeholder {1}: board?.name ?? t`Board`
|
#. placeholder {1}: board?.name ?? t`Board`
|
||||||
#. placeholder {1}: workspace.name ?? t`Workspace`
|
#. placeholder {1}: workspace.name ?? t`Workspace`
|
||||||
#: src/views/boards/index.tsx:33
|
#: src/views/boards/index.tsx:33
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ msgstr "Konto gelöscht"
|
|||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Aktionen"
|
msgstr "Aktionen"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:386
|
#: src/views/card/index.tsx:352
|
||||||
#: src/views/public/board/CardModal.tsx:158
|
#: src/views/public/board/CardModal.tsx:158
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Aktivität"
|
msgstr "Aktivität"
|
||||||
@@ -313,7 +313,7 @@ msgid "Blog Post"
|
|||||||
msgstr "Blogbeitrag"
|
msgstr "Blogbeitrag"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:386
|
#: src/views/board/index.tsx:386
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
#: src/views/public/board/index.tsx:113
|
#: src/views/public/board/index.tsx:113
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Board"
|
msgstr "Board"
|
||||||
@@ -395,12 +395,12 @@ msgstr "Fehlerbericht"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Abbrechen"
|
msgstr "Abbrechen"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "Card"
|
msgid "Card"
|
||||||
msgstr "Karte"
|
msgstr "Karte"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:306
|
#: src/views/card/index.tsx:272
|
||||||
#: src/views/card/index.tsx:342
|
#: src/views/card/index.tsx:308
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Karte nicht gefunden"
|
msgstr "Karte nicht gefunden"
|
||||||
|
|
||||||
@@ -1042,8 +1042,6 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
|||||||
msgstr "Für langfristige Nachhaltigkeit erkennen wir an, dass alle guten Open-Source-Projekte eine Einnahmequelle benötigen. Unsere stammt aus dem kostenpflichtigen Cloud-Angebot für Workspaces mit mehreren Benutzern und für benutzerdefinierte Workspace-Slugs. Es besteht keine Verpflichtung, es zu nutzen, und Sie können die Software kostenlos auf Ihrer eigenen Infrastruktur selbst hosten."
|
msgstr "Für langfristige Nachhaltigkeit erkennen wir an, dass alle guten Open-Source-Projekte eine Einnahmequelle benötigen. Unsere stammt aus dem kostenpflichtigen Cloud-Angebot für Workspaces mit mehreren Benutzern und für benutzerdefinierte Workspace-Slugs. Es besteht keine Verpflichtung, es zu nutzen, und Sie können die Software kostenlos auf Ihrer eigenen Infrastruktur selbst hosten."
|
||||||
|
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
#: src/views/pricing/components/Pricing.tsx:32
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Kostenlos"
|
msgstr "Kostenlos"
|
||||||
@@ -1739,8 +1737,7 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
|
|||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
#: src/views/card/components/NewChecklistForm.tsx:70
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/index.tsx:187
|
#: src/views/card/index.tsx:186
|
||||||
#: src/views/card/index.tsx:200
|
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:241
|
#: src/views/members/components/InviteMemberForm.tsx:241
|
||||||
@@ -2239,10 +2236,6 @@ msgstr "Checklistenelement kann nicht hinzugefügt werden"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Kommentar konnte nicht hinzugefügt werden"
|
msgstr "Kommentar konnte nicht hinzugefügt werden"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:199
|
|
||||||
msgid "Unable to add label"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:181
|
#: src/views/board/components/NewCardForm.tsx:181
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Karte konnte nicht erstellt werden"
|
msgstr "Karte konnte nicht erstellt werden"
|
||||||
@@ -2301,7 +2294,7 @@ msgid "Unable to update board visibility"
|
|||||||
msgstr "Board-Sichtbarkeit konnte nicht aktualisiert werden"
|
msgstr "Board-Sichtbarkeit konnte nicht aktualisiert werden"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:229
|
#: src/views/board/index.tsx:229
|
||||||
#: src/views/card/index.tsx:186
|
#: src/views/card/index.tsx:185
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Karte konnte nicht aktualisiert werden"
|
msgstr "Karte konnte nicht aktualisiert werden"
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ msgstr "{0}"
|
|||||||
#. placeholder {1}: board?.name ?? t`Board`
|
#. placeholder {1}: board?.name ?? t`Board`
|
||||||
#. placeholder {1}: workspace.name ?? t`Workspace`
|
#. placeholder {1}: workspace.name ?? t`Workspace`
|
||||||
#: src/views/boards/index.tsx:33
|
#: src/views/boards/index.tsx:33
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ msgstr "Account deleted"
|
|||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Actions"
|
msgstr "Actions"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:386
|
#: src/views/card/index.tsx:352
|
||||||
#: src/views/public/board/CardModal.tsx:158
|
#: src/views/public/board/CardModal.tsx:158
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Activity"
|
msgstr "Activity"
|
||||||
@@ -353,7 +353,7 @@ msgid "Blog Post"
|
|||||||
msgstr "Blog Post"
|
msgstr "Blog Post"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:386
|
#: src/views/board/index.tsx:386
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
#: src/views/public/board/index.tsx:113
|
#: src/views/public/board/index.tsx:113
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Board"
|
msgstr "Board"
|
||||||
@@ -452,12 +452,12 @@ msgstr "Bug Report"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancel"
|
msgstr "Cancel"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "Card"
|
msgid "Card"
|
||||||
msgstr "Card"
|
msgstr "Card"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:306
|
#: src/views/card/index.tsx:272
|
||||||
#: src/views/card/index.tsx:342
|
#: src/views/card/index.tsx:308
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Card not found"
|
msgstr "Card not found"
|
||||||
|
|
||||||
@@ -1868,8 +1868,7 @@ msgstr "Please select a file to upload."
|
|||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
#: src/views/card/components/NewChecklistForm.tsx:70
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/index.tsx:187
|
#: src/views/card/index.tsx:186
|
||||||
#: src/views/card/index.tsx:200
|
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:241
|
#: src/views/members/components/InviteMemberForm.tsx:241
|
||||||
@@ -2396,10 +2395,6 @@ msgstr "Unable to add checklist item"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Unable to add comment"
|
msgstr "Unable to add comment"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:199
|
|
||||||
msgid "Unable to add label"
|
|
||||||
msgstr "Unable to add label"
|
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:181
|
#: src/views/board/components/NewCardForm.tsx:181
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Unable to create card"
|
msgstr "Unable to create card"
|
||||||
@@ -2458,7 +2453,7 @@ msgid "Unable to update board visibility"
|
|||||||
msgstr "Unable to update board visibility"
|
msgstr "Unable to update board visibility"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:229
|
#: src/views/board/index.tsx:229
|
||||||
#: src/views/card/index.tsx:186
|
#: src/views/card/index.tsx:185
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Unable to update card"
|
msgstr "Unable to update card"
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ msgstr "{0}"
|
|||||||
#. placeholder {1}: board?.name ?? t`Board`
|
#. placeholder {1}: board?.name ?? t`Board`
|
||||||
#. placeholder {1}: workspace.name ?? t`Workspace`
|
#. placeholder {1}: workspace.name ?? t`Workspace`
|
||||||
#: src/views/boards/index.tsx:33
|
#: src/views/boards/index.tsx:33
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ msgstr "Cuenta eliminada"
|
|||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Acciones"
|
msgstr "Acciones"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:386
|
#: src/views/card/index.tsx:352
|
||||||
#: src/views/public/board/CardModal.tsx:158
|
#: src/views/public/board/CardModal.tsx:158
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Actividad"
|
msgstr "Actividad"
|
||||||
@@ -313,7 +313,7 @@ msgid "Blog Post"
|
|||||||
msgstr "Entrada de blog"
|
msgstr "Entrada de blog"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:386
|
#: src/views/board/index.tsx:386
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
#: src/views/public/board/index.tsx:113
|
#: src/views/public/board/index.tsx:113
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Tablero"
|
msgstr "Tablero"
|
||||||
@@ -395,12 +395,12 @@ msgstr "Informe de error"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "Card"
|
msgid "Card"
|
||||||
msgstr "Tarjeta"
|
msgstr "Tarjeta"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:306
|
#: src/views/card/index.tsx:272
|
||||||
#: src/views/card/index.tsx:342
|
#: src/views/card/index.tsx:308
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Tarjeta no encontrada"
|
msgstr "Tarjeta no encontrada"
|
||||||
|
|
||||||
@@ -1042,8 +1042,6 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
|||||||
msgstr "Para la sostenibilidad a largo plazo, reconocemos que todos los buenos proyectos de código abierto necesitan una fuente de ingresos. La nuestra proviene de la oferta de nube de pago para espacios de trabajo con múltiples usuarios y para slugs de espacio de trabajo personalizados. No hay obligación de usarla, y puedes alojar el software en tu propia infraestructura sin costo alguno."
|
msgstr "Para la sostenibilidad a largo plazo, reconocemos que todos los buenos proyectos de código abierto necesitan una fuente de ingresos. La nuestra proviene de la oferta de nube de pago para espacios de trabajo con múltiples usuarios y para slugs de espacio de trabajo personalizados. No hay obligación de usarla, y puedes alojar el software en tu propia infraestructura sin costo alguno."
|
||||||
|
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
#: src/views/pricing/components/Pricing.tsx:32
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratis"
|
msgstr "Gratis"
|
||||||
@@ -1739,8 +1737,7 @@ msgstr "Por favor selecciona un archivo para subir."
|
|||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
#: src/views/card/components/NewChecklistForm.tsx:70
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/index.tsx:187
|
#: src/views/card/index.tsx:186
|
||||||
#: src/views/card/index.tsx:200
|
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:241
|
#: src/views/members/components/InviteMemberForm.tsx:241
|
||||||
@@ -2239,10 +2236,6 @@ msgstr "No se puede añadir el elemento a la lista de verificación"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "No se puede añadir el comentario"
|
msgstr "No se puede añadir el comentario"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:199
|
|
||||||
msgid "Unable to add label"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:181
|
#: src/views/board/components/NewCardForm.tsx:181
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "No se puede crear la tarjeta"
|
msgstr "No se puede crear la tarjeta"
|
||||||
@@ -2301,7 +2294,7 @@ msgid "Unable to update board visibility"
|
|||||||
msgstr "No se puede actualizar la visibilidad del tablero"
|
msgstr "No se puede actualizar la visibilidad del tablero"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:229
|
#: src/views/board/index.tsx:229
|
||||||
#: src/views/card/index.tsx:186
|
#: src/views/card/index.tsx:185
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "No se puede actualizar la tarjeta"
|
msgstr "No se puede actualizar la tarjeta"
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ msgstr "{0}"
|
|||||||
#. placeholder {1}: board?.name ?? t`Board`
|
#. placeholder {1}: board?.name ?? t`Board`
|
||||||
#. placeholder {1}: workspace.name ?? t`Workspace`
|
#. placeholder {1}: workspace.name ?? t`Workspace`
|
||||||
#: src/views/boards/index.tsx:33
|
#: src/views/boards/index.tsx:33
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ msgstr "Compte supprimé"
|
|||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Actions"
|
msgstr "Actions"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:386
|
#: src/views/card/index.tsx:352
|
||||||
#: src/views/public/board/CardModal.tsx:158
|
#: src/views/public/board/CardModal.tsx:158
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Activité"
|
msgstr "Activité"
|
||||||
@@ -313,7 +313,7 @@ msgid "Blog Post"
|
|||||||
msgstr "Article de blog"
|
msgstr "Article de blog"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:386
|
#: src/views/board/index.tsx:386
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
#: src/views/public/board/index.tsx:113
|
#: src/views/public/board/index.tsx:113
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Tableau"
|
msgstr "Tableau"
|
||||||
@@ -395,12 +395,12 @@ msgstr "Rapport de bug"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuler"
|
msgstr "Annuler"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "Card"
|
msgid "Card"
|
||||||
msgstr "Carte"
|
msgstr "Carte"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:306
|
#: src/views/card/index.tsx:272
|
||||||
#: src/views/card/index.tsx:342
|
#: src/views/card/index.tsx:308
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Carte introuvable"
|
msgstr "Carte introuvable"
|
||||||
|
|
||||||
@@ -1042,8 +1042,6 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
|||||||
msgstr "Pour une durabilité à long terme, nous reconnaissons que tous les bons projets open source ont besoin d'une source de revenus. La nôtre provient de l'offre cloud payante pour les espaces de travail avec plusieurs utilisateurs et pour les slugs d'espace de travail personnalisés. Il n'y a aucune obligation de l'utiliser, et vous pouvez auto-héberger le logiciel sur votre propre infrastructure gratuitement."
|
msgstr "Pour une durabilité à long terme, nous reconnaissons que tous les bons projets open source ont besoin d'une source de revenus. La nôtre provient de l'offre cloud payante pour les espaces de travail avec plusieurs utilisateurs et pour les slugs d'espace de travail personnalisés. Il n'y a aucune obligation de l'utiliser, et vous pouvez auto-héberger le logiciel sur votre propre infrastructure gratuitement."
|
||||||
|
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
#: src/views/pricing/components/Pricing.tsx:32
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratuit"
|
msgstr "Gratuit"
|
||||||
@@ -1739,8 +1737,7 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
|
|||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
#: src/views/card/components/NewChecklistForm.tsx:70
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/index.tsx:187
|
#: src/views/card/index.tsx:186
|
||||||
#: src/views/card/index.tsx:200
|
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:241
|
#: src/views/members/components/InviteMemberForm.tsx:241
|
||||||
@@ -2239,10 +2236,6 @@ msgstr "Impossible d'ajouter l'élément à la liste de contrôle"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Impossible d'ajouter un commentaire"
|
msgstr "Impossible d'ajouter un commentaire"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:199
|
|
||||||
msgid "Unable to add label"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:181
|
#: src/views/board/components/NewCardForm.tsx:181
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Impossible de créer la carte"
|
msgstr "Impossible de créer la carte"
|
||||||
@@ -2301,7 +2294,7 @@ msgid "Unable to update board visibility"
|
|||||||
msgstr "Impossible de mettre à jour la visibilité du tableau"
|
msgstr "Impossible de mettre à jour la visibilité du tableau"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:229
|
#: src/views/board/index.tsx:229
|
||||||
#: src/views/card/index.tsx:186
|
#: src/views/card/index.tsx:185
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Impossible de mettre à jour la carte"
|
msgstr "Impossible de mettre à jour la carte"
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ export const locales = [
|
|||||||
"nl",
|
"nl",
|
||||||
"ru",
|
"ru",
|
||||||
"pl",
|
"pl",
|
||||||
"ptbr"
|
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export type Locale = (typeof locales)[number];
|
export type Locale = (typeof locales)[number];
|
||||||
@@ -23,5 +22,4 @@ export const localeNames: Record<Locale, string> = {
|
|||||||
nl: "Nederlands",
|
nl: "Nederlands",
|
||||||
ru: "Русский",
|
ru: "Русский",
|
||||||
pl: "Polski",
|
pl: "Polski",
|
||||||
ptbr: "Português",
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ msgstr "{0}"
|
|||||||
#. placeholder {1}: board?.name ?? t`Board`
|
#. placeholder {1}: board?.name ?? t`Board`
|
||||||
#. placeholder {1}: workspace.name ?? t`Workspace`
|
#. placeholder {1}: workspace.name ?? t`Workspace`
|
||||||
#: src/views/boards/index.tsx:33
|
#: src/views/boards/index.tsx:33
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ msgstr "Account eliminato"
|
|||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Azioni"
|
msgstr "Azioni"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:386
|
#: src/views/card/index.tsx:352
|
||||||
#: src/views/public/board/CardModal.tsx:158
|
#: src/views/public/board/CardModal.tsx:158
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Attività"
|
msgstr "Attività"
|
||||||
@@ -313,7 +313,7 @@ msgid "Blog Post"
|
|||||||
msgstr "Post del blog"
|
msgstr "Post del blog"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:386
|
#: src/views/board/index.tsx:386
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
#: src/views/public/board/index.tsx:113
|
#: src/views/public/board/index.tsx:113
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Bacheca"
|
msgstr "Bacheca"
|
||||||
@@ -395,12 +395,12 @@ msgstr "Segnalazione bug"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annulla"
|
msgstr "Annulla"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "Card"
|
msgid "Card"
|
||||||
msgstr "Carta"
|
msgstr "Carta"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:306
|
#: src/views/card/index.tsx:272
|
||||||
#: src/views/card/index.tsx:342
|
#: src/views/card/index.tsx:308
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Carta non trovata"
|
msgstr "Carta non trovata"
|
||||||
|
|
||||||
@@ -1042,8 +1042,6 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
|||||||
msgstr "Per la sostenibilità a lungo termine, riconosciamo che tutti i buoni progetti open source necessitano di una fonte di entrate. La nostra proviene dall'offerta cloud a pagamento per gli spazi di lavoro con più utenti e per gli slug personalizzati degli spazi di lavoro. Non c'è alcun obbligo di utilizzarla, e puoi ospitare autonomamente il software sulla tua infrastruttura gratuitamente."
|
msgstr "Per la sostenibilità a lungo termine, riconosciamo che tutti i buoni progetti open source necessitano di una fonte di entrate. La nostra proviene dall'offerta cloud a pagamento per gli spazi di lavoro con più utenti e per gli slug personalizzati degli spazi di lavoro. Non c'è alcun obbligo di utilizzarla, e puoi ospitare autonomamente il software sulla tua infrastruttura gratuitamente."
|
||||||
|
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
#: src/views/pricing/components/Pricing.tsx:32
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratuito"
|
msgstr "Gratuito"
|
||||||
@@ -1739,8 +1737,7 @@ msgstr "Seleziona un file da caricare."
|
|||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
#: src/views/card/components/NewChecklistForm.tsx:70
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/index.tsx:187
|
#: src/views/card/index.tsx:186
|
||||||
#: src/views/card/index.tsx:200
|
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:241
|
#: src/views/members/components/InviteMemberForm.tsx:241
|
||||||
@@ -2239,10 +2236,6 @@ msgstr "Impossibile aggiungere l'elemento della checklist"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Impossibile aggiungere il commento"
|
msgstr "Impossibile aggiungere il commento"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:199
|
|
||||||
msgid "Unable to add label"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:181
|
#: src/views/board/components/NewCardForm.tsx:181
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Impossibile creare la scheda"
|
msgstr "Impossibile creare la scheda"
|
||||||
@@ -2301,7 +2294,7 @@ msgid "Unable to update board visibility"
|
|||||||
msgstr "Impossibile aggiornare la visibilità della bacheca"
|
msgstr "Impossibile aggiornare la visibilità della bacheca"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:229
|
#: src/views/board/index.tsx:229
|
||||||
#: src/views/card/index.tsx:186
|
#: src/views/card/index.tsx:185
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Impossibile aggiornare la scheda"
|
msgstr "Impossibile aggiornare la scheda"
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ msgstr "{0}"
|
|||||||
#. placeholder {1}: board?.name ?? t`Board`
|
#. placeholder {1}: board?.name ?? t`Board`
|
||||||
#. placeholder {1}: workspace.name ?? t`Workspace`
|
#. placeholder {1}: workspace.name ?? t`Workspace`
|
||||||
#: src/views/boards/index.tsx:33
|
#: src/views/boards/index.tsx:33
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ msgstr "Account verwijderd"
|
|||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Acties"
|
msgstr "Acties"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:386
|
#: src/views/card/index.tsx:352
|
||||||
#: src/views/public/board/CardModal.tsx:158
|
#: src/views/public/board/CardModal.tsx:158
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Activiteit"
|
msgstr "Activiteit"
|
||||||
@@ -313,7 +313,7 @@ msgid "Blog Post"
|
|||||||
msgstr "Blogbericht"
|
msgstr "Blogbericht"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:386
|
#: src/views/board/index.tsx:386
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
#: src/views/public/board/index.tsx:113
|
#: src/views/public/board/index.tsx:113
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Bord"
|
msgstr "Bord"
|
||||||
@@ -395,12 +395,12 @@ msgstr "Bugrapport"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuleren"
|
msgstr "Annuleren"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "Card"
|
msgid "Card"
|
||||||
msgstr "Kaart"
|
msgstr "Kaart"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:306
|
#: src/views/card/index.tsx:272
|
||||||
#: src/views/card/index.tsx:342
|
#: src/views/card/index.tsx:308
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Kaart niet gevonden"
|
msgstr "Kaart niet gevonden"
|
||||||
|
|
||||||
@@ -1042,8 +1042,6 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
|||||||
msgstr "Voor duurzaamheid op lange termijn erkennen we dat alle goede open source projecten een inkomstenbron nodig hebben. De onze komt van de betaalde cloudoplossing voor werkruimtes met meerdere gebruikers en voor aangepaste werkruimte-slugs. Er is geen verplichting om het te gebruiken, en je kunt de software gratis op je eigen infrastructuur hosten."
|
msgstr "Voor duurzaamheid op lange termijn erkennen we dat alle goede open source projecten een inkomstenbron nodig hebben. De onze komt van de betaalde cloudoplossing voor werkruimtes met meerdere gebruikers en voor aangepaste werkruimte-slugs. Er is geen verplichting om het te gebruiken, en je kunt de software gratis op je eigen infrastructuur hosten."
|
||||||
|
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
#: src/views/pricing/components/Pricing.tsx:32
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Gratis"
|
msgstr "Gratis"
|
||||||
@@ -1739,8 +1737,7 @@ msgstr "Selecteer een bestand om te uploaden."
|
|||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
#: src/views/card/components/NewChecklistForm.tsx:70
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/index.tsx:187
|
#: src/views/card/index.tsx:186
|
||||||
#: src/views/card/index.tsx:200
|
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:241
|
#: src/views/members/components/InviteMemberForm.tsx:241
|
||||||
@@ -2239,10 +2236,6 @@ msgstr "Kan checklistitem niet toevoegen"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Kan geen reactie toevoegen"
|
msgstr "Kan geen reactie toevoegen"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:199
|
|
||||||
msgid "Unable to add label"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:181
|
#: src/views/board/components/NewCardForm.tsx:181
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Kan kaart niet aanmaken"
|
msgstr "Kan kaart niet aanmaken"
|
||||||
@@ -2301,7 +2294,7 @@ msgid "Unable to update board visibility"
|
|||||||
msgstr "Kan bordzichtbaarheid niet bijwerken"
|
msgstr "Kan bordzichtbaarheid niet bijwerken"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:229
|
#: src/views/board/index.tsx:229
|
||||||
#: src/views/card/index.tsx:186
|
#: src/views/card/index.tsx:185
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Kan kaart niet bijwerken"
|
msgstr "Kan kaart niet bijwerken"
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ msgstr "{0}"
|
|||||||
#. placeholder {1}: board?.name ?? t`Board`
|
#. placeholder {1}: board?.name ?? t`Board`
|
||||||
#. placeholder {1}: workspace.name ?? t`Workspace`
|
#. placeholder {1}: workspace.name ?? t`Workspace`
|
||||||
#: src/views/boards/index.tsx:33
|
#: src/views/boards/index.tsx:33
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ msgstr "Konto zostało usunięte"
|
|||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Działania"
|
msgstr "Działania"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:386
|
#: src/views/card/index.tsx:352
|
||||||
#: src/views/public/board/CardModal.tsx:158
|
#: src/views/public/board/CardModal.tsx:158
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Aktywność"
|
msgstr "Aktywność"
|
||||||
@@ -318,7 +318,7 @@ msgid "Blog Post"
|
|||||||
msgstr "Post na blogu"
|
msgstr "Post na blogu"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:386
|
#: src/views/board/index.tsx:386
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
#: src/views/public/board/index.tsx:113
|
#: src/views/public/board/index.tsx:113
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Tablica"
|
msgstr "Tablica"
|
||||||
@@ -400,12 +400,12 @@ msgstr "Zgłoszenie błędu"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Anuluj"
|
msgstr "Anuluj"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "Card"
|
msgid "Card"
|
||||||
msgstr "Karta"
|
msgstr "Karta"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:306
|
#: src/views/card/index.tsx:272
|
||||||
#: src/views/card/index.tsx:342
|
#: src/views/card/index.tsx:308
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Nie można było znaleźć karty"
|
msgstr "Nie można było znaleźć karty"
|
||||||
|
|
||||||
@@ -1047,8 +1047,6 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
|||||||
msgstr "Dla długoterminowej trwałości uznajemy, że wszystkie dobre projekty open source potrzebują źródła dochodu. Nasze pochodzi z płatnej oferty w chmurze dla przestrzeni roboczych z wieloma użytkownikami oraz dla niestandardowych nazw przestrzeni roboczych. Nie ma obowiązku korzystania z niej, a oprogramowanie można hostować samodzielnie na własnej infrastrukturze bezpłatnie."
|
msgstr "Dla długoterminowej trwałości uznajemy, że wszystkie dobre projekty open source potrzebują źródła dochodu. Nasze pochodzi z płatnej oferty w chmurze dla przestrzeni roboczych z wieloma użytkownikami oraz dla niestandardowych nazw przestrzeni roboczych. Nie ma obowiązku korzystania z niej, a oprogramowanie można hostować samodzielnie na własnej infrastrukturze bezpłatnie."
|
||||||
|
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
#: src/views/pricing/components/Pricing.tsx:32
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Darmowy"
|
msgstr "Darmowy"
|
||||||
@@ -1744,8 +1742,7 @@ msgstr "Proszę wybrać plik do przesłania."
|
|||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
#: src/views/card/components/NewChecklistForm.tsx:70
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/index.tsx:187
|
#: src/views/card/index.tsx:186
|
||||||
#: src/views/card/index.tsx:200
|
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:241
|
#: src/views/members/components/InviteMemberForm.tsx:241
|
||||||
@@ -2244,10 +2241,6 @@ msgstr "Nie można dodać elementu listy kontrolnej"
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Nie można dodać komentarza"
|
msgstr "Nie można dodać komentarza"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:199
|
|
||||||
msgid "Unable to add label"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:181
|
#: src/views/board/components/NewCardForm.tsx:181
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Nie można utworzyć karty"
|
msgstr "Nie można utworzyć karty"
|
||||||
@@ -2306,7 +2299,7 @@ msgid "Unable to update board visibility"
|
|||||||
msgstr "Nie można zaktualizować widoczności tablicy"
|
msgstr "Nie można zaktualizować widoczności tablicy"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:229
|
#: src/views/board/index.tsx:229
|
||||||
#: src/views/card/index.tsx:186
|
#: src/views/card/index.tsx:185
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Nie można zaktualizować karty"
|
msgstr "Nie można zaktualizować karty"
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ msgstr "{0}"
|
|||||||
#. placeholder {1}: board?.name ?? t`Board`
|
#. placeholder {1}: board?.name ?? t`Board`
|
||||||
#. placeholder {1}: workspace.name ?? t`Workspace`
|
#. placeholder {1}: workspace.name ?? t`Workspace`
|
||||||
#: src/views/boards/index.tsx:33
|
#: src/views/boards/index.tsx:33
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "{0} | {1}"
|
msgid "{0} | {1}"
|
||||||
msgstr "{0} | {1}"
|
msgstr "{0} | {1}"
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ msgstr "Аккаунт удалён"
|
|||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr "Действия"
|
msgstr "Действия"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:386
|
#: src/views/card/index.tsx:352
|
||||||
#: src/views/public/board/CardModal.tsx:158
|
#: src/views/public/board/CardModal.tsx:158
|
||||||
msgid "Activity"
|
msgid "Activity"
|
||||||
msgstr "Активность"
|
msgstr "Активность"
|
||||||
@@ -313,7 +313,7 @@ msgid "Blog Post"
|
|||||||
msgstr "Пост в блоге"
|
msgstr "Пост в блоге"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:386
|
#: src/views/board/index.tsx:386
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
#: src/views/public/board/index.tsx:113
|
#: src/views/public/board/index.tsx:113
|
||||||
msgid "Board"
|
msgid "Board"
|
||||||
msgstr "Доска"
|
msgstr "Доска"
|
||||||
@@ -395,12 +395,12 @@ msgstr "Отчет об ошибке"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Отмена"
|
msgstr "Отмена"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:272
|
#: src/views/card/index.tsx:238
|
||||||
msgid "Card"
|
msgid "Card"
|
||||||
msgstr "Карточка"
|
msgstr "Карточка"
|
||||||
|
|
||||||
#: src/views/card/index.tsx:306
|
#: src/views/card/index.tsx:272
|
||||||
#: src/views/card/index.tsx:342
|
#: src/views/card/index.tsx:308
|
||||||
msgid "Card not found"
|
msgid "Card not found"
|
||||||
msgstr "Карточка не найдена"
|
msgstr "Карточка не найдена"
|
||||||
|
|
||||||
@@ -1042,8 +1042,6 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
|||||||
msgstr "Для долгосрочной устойчивости мы признаем, что всем хорошим проектам с открытым исходным кодом необходим источник дохода. Наш доход поступает от платного облачного предложения для рабочих пространств с несколькими пользователями и для пользовательских идентификаторов рабочих пространств. Нет обязательства использовать его, и вы можете самостоятельно разместить программное обеспечение на своей инфраструктуре бесплатно."
|
msgstr "Для долгосрочной устойчивости мы признаем, что всем хорошим проектам с открытым исходным кодом необходим источник дохода. Наш доход поступает от платного облачного предложения для рабочих пространств с несколькими пользователями и для пользовательских идентификаторов рабочих пространств. Нет обязательства использовать его, и вы можете самостоятельно разместить программное обеспечение на своей инфраструктуре бесплатно."
|
||||||
|
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
#: src/views/pricing/components/Pricing.tsx:32
|
||||||
#: src/views/pricing/components/Pricing.tsx:32
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
|
||||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||||
msgid "Free"
|
msgid "Free"
|
||||||
msgstr "Бесплатно"
|
msgstr "Бесплатно"
|
||||||
@@ -1739,8 +1737,7 @@ msgstr "Пожалуйста, выберите файл для загрузки.
|
|||||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
#: src/views/card/components/NewChecklistForm.tsx:70
|
||||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
||||||
#: src/views/card/components/NewCommentForm.tsx:31
|
#: src/views/card/components/NewCommentForm.tsx:31
|
||||||
#: src/views/card/index.tsx:187
|
#: src/views/card/index.tsx:186
|
||||||
#: src/views/card/index.tsx:200
|
|
||||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||||
#: src/views/members/components/InviteMemberForm.tsx:241
|
#: src/views/members/components/InviteMemberForm.tsx:241
|
||||||
@@ -2239,10 +2236,6 @@ msgstr "Не удалось добавить элемент контрольно
|
|||||||
msgid "Unable to add comment"
|
msgid "Unable to add comment"
|
||||||
msgstr "Не удалось добавить комментарий."
|
msgstr "Не удалось добавить комментарий."
|
||||||
|
|
||||||
#: src/views/card/index.tsx:199
|
|
||||||
msgid "Unable to add label"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/views/board/components/NewCardForm.tsx:181
|
#: src/views/board/components/NewCardForm.tsx:181
|
||||||
msgid "Unable to create card"
|
msgid "Unable to create card"
|
||||||
msgstr "Не удалось создать карточку."
|
msgstr "Не удалось создать карточку."
|
||||||
@@ -2301,7 +2294,7 @@ msgid "Unable to update board visibility"
|
|||||||
msgstr "Не удалось обновить видимость доски"
|
msgstr "Не удалось обновить видимость доски"
|
||||||
|
|
||||||
#: src/views/board/index.tsx:229
|
#: src/views/board/index.tsx:229
|
||||||
#: src/views/card/index.tsx:186
|
#: src/views/card/index.tsx:185
|
||||||
msgid "Unable to update card"
|
msgid "Unable to update card"
|
||||||
msgstr "Не удалось обновить карточку"
|
msgstr "Не удалось обновить карточку"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { addDays, endOfDay, startOfDay } from "date-fns";
|
import { addDays, endOfDay, startOfDay } from "date-fns";
|
||||||
|
|
||||||
export type DueDateFilterKey =
|
type DueDateFilterKey =
|
||||||
| "overdue"
|
| "overdue"
|
||||||
| "today"
|
| "today"
|
||||||
| "tomorrow"
|
| "tomorrow"
|
||||||
@@ -9,8 +9,8 @@ export type DueDateFilterKey =
|
|||||||
| "no-due-date";
|
| "no-due-date";
|
||||||
|
|
||||||
export interface DueDateFilter {
|
export interface DueDateFilter {
|
||||||
startDate?: Date;
|
startDate?: string;
|
||||||
endDate?: Date;
|
endDate?: string;
|
||||||
hasNoDueDate?: boolean;
|
hasNoDueDate?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21,35 +21,35 @@ export const convertDueDateFiltersToRanges = (
|
|||||||
|
|
||||||
const today = startOfDay(new Date());
|
const today = startOfDay(new Date());
|
||||||
const tomorrow = addDays(today, 1);
|
const tomorrow = addDays(today, 1);
|
||||||
const nextWeekEnd = addDays(today, 8);
|
const nextWeekEnd = addDays(today, 8); // 7 days ahead
|
||||||
const nextMonthEnd = addDays(today, 31);
|
const nextMonthEnd = addDays(today, 31); // 30 days ahead
|
||||||
|
|
||||||
return filters.map((filter) => {
|
return filters.map((filter) => {
|
||||||
switch (filter) {
|
switch (filter) {
|
||||||
case "overdue":
|
case "overdue":
|
||||||
return {
|
return {
|
||||||
endDate: today,
|
endDate: today.toISOString(),
|
||||||
};
|
};
|
||||||
case "today":
|
case "today":
|
||||||
return {
|
return {
|
||||||
startDate: today,
|
startDate: today.toISOString(),
|
||||||
endDate: endOfDay(today),
|
endDate: endOfDay(today).toISOString(),
|
||||||
};
|
};
|
||||||
case "tomorrow":
|
case "tomorrow":
|
||||||
return {
|
return {
|
||||||
startDate: tomorrow,
|
startDate: tomorrow.toISOString(),
|
||||||
endDate: endOfDay(tomorrow),
|
endDate: endOfDay(tomorrow).toISOString(),
|
||||||
};
|
};
|
||||||
case "next-week": {
|
case "next-week": {
|
||||||
return {
|
return {
|
||||||
startDate: today,
|
startDate: today.toISOString(),
|
||||||
endDate: nextWeekEnd,
|
endDate: nextWeekEnd.toISOString(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case "next-month": {
|
case "next-month": {
|
||||||
return {
|
return {
|
||||||
startDate: nextWeekEnd,
|
startDate: nextWeekEnd.toISOString(),
|
||||||
endDate: nextMonthEnd,
|
endDate: nextMonthEnd.toISOString(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case "no-due-date":
|
case "no-due-date":
|
||||||
@@ -22,8 +22,6 @@ const loadMessages = async (locale: Locale) => {
|
|||||||
return (await import("~/locales/ru/messages")).messages;
|
return (await import("~/locales/ru/messages")).messages;
|
||||||
case "pl":
|
case "pl":
|
||||||
return (await import("~/locales/pl/messages")).messages;
|
return (await import("~/locales/pl/messages")).messages;
|
||||||
case "ptbr":
|
|
||||||
return (await import("~/locales/ptbr/messages")).messages;
|
|
||||||
default:
|
default:
|
||||||
return enMessages;
|
return enMessages;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import { useModal } from "~/providers/modal";
|
|||||||
import { usePopup } from "~/providers/popup";
|
import { usePopup } from "~/providers/popup";
|
||||||
import { useWorkspace } from "~/providers/workspace";
|
import { useWorkspace } from "~/providers/workspace";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
|
import { convertDueDateFiltersToRanges } from "~/utils/dueDateFilters";
|
||||||
import { formatToArray } from "~/utils/helpers";
|
import { formatToArray } from "~/utils/helpers";
|
||||||
import BoardDropdown from "./components/BoardDropdown";
|
import BoardDropdown from "./components/BoardDropdown";
|
||||||
import Card from "./components/Card";
|
import Card from "./components/Card";
|
||||||
@@ -96,17 +97,20 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
| "no-due-date"
|
| "no-due-date"
|
||||||
)[];
|
)[];
|
||||||
|
|
||||||
const boardType: "regular" | "template" = isTemplate ? "template" : "regular";
|
const queryParams: {
|
||||||
|
boardPublicId: string;
|
||||||
const queryParams = {
|
members: string[];
|
||||||
|
labels: string[];
|
||||||
|
lists: string[];
|
||||||
|
dueDate: ReturnType<typeof convertDueDateFiltersToRanges>;
|
||||||
|
type: "regular" | "template";
|
||||||
|
} = {
|
||||||
boardPublicId: boardId ?? "",
|
boardPublicId: boardId ?? "",
|
||||||
members: formatToArray(router.query.members),
|
members: formatToArray(router.query.members),
|
||||||
labels: formatToArray(router.query.labels),
|
labels: formatToArray(router.query.labels),
|
||||||
lists: formatToArray(router.query.lists),
|
lists: formatToArray(router.query.lists),
|
||||||
...(semanticFilters.length > 0 && {
|
dueDate: convertDueDateFiltersToRanges(semanticFilters),
|
||||||
dueDateFilters: semanticFilters,
|
type: isTemplate ? "template" : "regular",
|
||||||
}),
|
|
||||||
type: boardType,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import type { FC, SVGProps } from "react";
|
import type { FC, SVGProps } from "react";
|
||||||
import { Trans } from "@lingui/react/macro";
|
import { Trans } from "@lingui/react/macro";
|
||||||
|
|
||||||
import AirbusLogo from "~/assets/logos/airbus.svg";
|
import AirbusLogo from "/public/logos/airbus.svg";
|
||||||
import BitwardenLogo from "~/assets/logos/bitwarden.svg";
|
import BitwardenLogo from "/public/logos/bitwarden.svg";
|
||||||
import CouchbaseLogo from "~/assets/logos/couchbase.svg";
|
import CouchbaseLogo from "/public/logos/couchbase.svg";
|
||||||
import DeloitteLogo from "~/assets/logos/deloitte.svg";
|
import DeloitteLogo from "/public/logos/deloitte.svg";
|
||||||
import FastCompanyLogo from "~/assets/logos/fast_company.svg";
|
import FastCompanyLogo from "/public/logos/fast_company.svg";
|
||||||
import LegoLogo from "~/assets/logos/lego.svg";
|
import LegoLogo from "/public/logos/lego.svg";
|
||||||
import LinkedinLogo from "~/assets/logos/linkedin.svg";
|
import LinkedinLogo from "/public/logos/linkedin.svg";
|
||||||
import SanaLogo from "~/assets/logos/sana.svg";
|
import SanaLogo from "/public/logos/sana.svg";
|
||||||
import WakamLogo from "~/assets/logos/wakam.svg";
|
import WakamLogo from "/public/logos/wakam.svg";
|
||||||
|
|
||||||
type LogoComponent = FC<SVGProps<SVGSVGElement>>;
|
type LogoComponent = FC<SVGProps<SVGSVGElement>>;
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ export default function Logos() {
|
|||||||
<div className="absolute left-0 top-0 z-10 h-full w-8 bg-gradient-to-r from-white/60 to-transparent dark:from-dark-50" />
|
<div className="absolute left-0 top-0 z-10 h-full w-8 bg-gradient-to-r from-white/60 to-transparent dark:from-dark-50" />
|
||||||
<div className="absolute right-0 top-0 z-10 h-full w-8 bg-gradient-to-l from-white/60 to-transparent dark:from-dark-50" />
|
<div className="absolute right-0 top-0 z-10 h-full w-8 bg-gradient-to-l from-white/60 to-transparent dark:from-dark-50" />
|
||||||
|
|
||||||
<div className="flex animate-scroll" style={{ width: "max-content" }}>
|
<div className="animate-scroll flex" style={{ width: "max-content" }}>
|
||||||
<div className="flex flex-shrink-0 items-center space-x-12">
|
<div className="flex flex-shrink-0 items-center space-x-12">
|
||||||
{logos.map((logo) => {
|
{logos.map((logo) => {
|
||||||
const LogoComponent: LogoComponent = logo.component;
|
const LogoComponent: LogoComponent = logo.component;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import ThemeToggle from "~/components/ThemeToggle";
|
|||||||
import { useModal } from "~/providers/modal";
|
import { useModal } from "~/providers/modal";
|
||||||
import { usePopup } from "~/providers/popup";
|
import { usePopup } from "~/providers/popup";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
|
import { convertDueDateFiltersToRanges } from "~/utils/dueDateFilters";
|
||||||
import { formatToArray } from "~/utils/helpers";
|
import { formatToArray } from "~/utils/helpers";
|
||||||
import Card from "~/views/board/components/Card";
|
import Card from "~/views/board/components/Card";
|
||||||
import Filters from "~/views/board/components/Filters";
|
import Filters from "~/views/board/components/Filters";
|
||||||
@@ -54,9 +55,7 @@ export default function PublicBoardView() {
|
|||||||
members: formatToArray(router.query.members),
|
members: formatToArray(router.query.members),
|
||||||
labels: formatToArray(router.query.labels),
|
labels: formatToArray(router.query.labels),
|
||||||
lists: formatToArray(router.query.lists),
|
lists: formatToArray(router.query.lists),
|
||||||
...(dueDateFilters.length > 0 && {
|
dueDate: convertDueDateFiltersToRanges(dueDateFilters),
|
||||||
dueDateFilters: dueDateFilters,
|
|
||||||
}),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
enabled: router.isReady && !!boardSlug,
|
enabled: router.isReady && !!boardSlug,
|
||||||
|
|||||||
@@ -8,15 +8,17 @@ import * as labelRepo from "@kan/db/repository/label.repo";
|
|||||||
import * as listRepo from "@kan/db/repository/list.repo";
|
import * as listRepo from "@kan/db/repository/list.repo";
|
||||||
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
|
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
|
||||||
import { colours } from "@kan/shared/constants";
|
import { colours } from "@kan/shared/constants";
|
||||||
import {
|
import { generateSlug, generateUID } from "@kan/shared/utils";
|
||||||
convertDueDateFiltersToRanges,
|
|
||||||
generateSlug,
|
|
||||||
generateUID,
|
|
||||||
} from "@kan/shared/utils";
|
|
||||||
|
|
||||||
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
|
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
|
||||||
import { assertUserInWorkspace } from "../utils/auth";
|
import { assertUserInWorkspace } from "../utils/auth";
|
||||||
|
|
||||||
|
const dueDateFilterSchema = z.object({
|
||||||
|
startDate: z.string().datetime().optional(),
|
||||||
|
endDate: z.string().datetime().optional(),
|
||||||
|
hasNoDueDate: z.boolean().optional(),
|
||||||
|
});
|
||||||
|
|
||||||
export const boardRouter = createTRPCRouter({
|
export const boardRouter = createTRPCRouter({
|
||||||
all: protectedProcedure
|
all: protectedProcedure
|
||||||
.meta({
|
.meta({
|
||||||
@@ -83,18 +85,7 @@ export const boardRouter = createTRPCRouter({
|
|||||||
members: z.array(z.string().min(12)).optional(),
|
members: z.array(z.string().min(12)).optional(),
|
||||||
labels: z.array(z.string().min(12)).optional(),
|
labels: z.array(z.string().min(12)).optional(),
|
||||||
lists: z.array(z.string().min(12)).optional(),
|
lists: z.array(z.string().min(12)).optional(),
|
||||||
dueDateFilters: z
|
dueDate: z.array(dueDateFilterSchema).optional(),
|
||||||
.array(
|
|
||||||
z.enum([
|
|
||||||
"overdue",
|
|
||||||
"today",
|
|
||||||
"tomorrow",
|
|
||||||
"next-week",
|
|
||||||
"next-month",
|
|
||||||
"no-due-date",
|
|
||||||
]),
|
|
||||||
)
|
|
||||||
.optional(),
|
|
||||||
type: z.enum(["regular", "template"]).optional(),
|
type: z.enum(["regular", "template"]).optional(),
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
@@ -121,11 +112,6 @@ export const boardRouter = createTRPCRouter({
|
|||||||
|
|
||||||
await assertUserInWorkspace(ctx.db, userId, board.workspaceId);
|
await assertUserInWorkspace(ctx.db, userId, board.workspaceId);
|
||||||
|
|
||||||
// Convert semantic string filters to date ranges expected by the repo
|
|
||||||
const dueDateFilters = input.dueDateFilters
|
|
||||||
? convertDueDateFiltersToRanges(input.dueDateFilters)
|
|
||||||
: [];
|
|
||||||
|
|
||||||
const result = await boardRepo.getByPublicId(
|
const result = await boardRepo.getByPublicId(
|
||||||
ctx.db,
|
ctx.db,
|
||||||
input.boardPublicId,
|
input.boardPublicId,
|
||||||
@@ -133,7 +119,14 @@ export const boardRouter = createTRPCRouter({
|
|||||||
members: input.members ?? [],
|
members: input.members ?? [],
|
||||||
labels: input.labels ?? [],
|
labels: input.labels ?? [],
|
||||||
lists: input.lists ?? [],
|
lists: input.lists ?? [],
|
||||||
dueDate: dueDateFilters,
|
dueDate:
|
||||||
|
input.dueDate?.map((filter) => ({
|
||||||
|
startDate: filter.startDate
|
||||||
|
? new Date(filter.startDate)
|
||||||
|
: undefined,
|
||||||
|
endDate: filter.endDate ? new Date(filter.endDate) : undefined,
|
||||||
|
hasNoDueDate: filter.hasNoDueDate,
|
||||||
|
})) ?? [],
|
||||||
type: input.type,
|
type: input.type,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
@@ -167,18 +160,7 @@ export const boardRouter = createTRPCRouter({
|
|||||||
members: z.array(z.string().min(12)).optional(),
|
members: z.array(z.string().min(12)).optional(),
|
||||||
labels: z.array(z.string().min(12)).optional(),
|
labels: z.array(z.string().min(12)).optional(),
|
||||||
lists: z.array(z.string().min(12)).optional(),
|
lists: z.array(z.string().min(12)).optional(),
|
||||||
dueDateFilters: z
|
dueDate: z.array(dueDateFilterSchema).optional(),
|
||||||
.array(
|
|
||||||
z.enum([
|
|
||||||
"overdue",
|
|
||||||
"today",
|
|
||||||
"tomorrow",
|
|
||||||
"next-week",
|
|
||||||
"next-month",
|
|
||||||
"no-due-date",
|
|
||||||
]),
|
|
||||||
)
|
|
||||||
.optional(),
|
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.output(z.custom<Awaited<ReturnType<typeof boardRepo.getBySlug>>>())
|
.output(z.custom<Awaited<ReturnType<typeof boardRepo.getBySlug>>>())
|
||||||
@@ -194,11 +176,6 @@ export const boardRouter = createTRPCRouter({
|
|||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
});
|
});
|
||||||
|
|
||||||
// Convert semantic string filters to date ranges expected by the repo
|
|
||||||
const dueDateFilters = input.dueDateFilters
|
|
||||||
? convertDueDateFiltersToRanges(input.dueDateFilters)
|
|
||||||
: [];
|
|
||||||
|
|
||||||
const result = await boardRepo.getBySlug(
|
const result = await boardRepo.getBySlug(
|
||||||
ctx.db,
|
ctx.db,
|
||||||
input.boardSlug,
|
input.boardSlug,
|
||||||
@@ -207,7 +184,14 @@ export const boardRouter = createTRPCRouter({
|
|||||||
members: input.members ?? [],
|
members: input.members ?? [],
|
||||||
labels: input.labels ?? [],
|
labels: input.labels ?? [],
|
||||||
lists: input.lists ?? [],
|
lists: input.lists ?? [],
|
||||||
dueDate: dueDateFilters,
|
dueDate:
|
||||||
|
input.dueDate?.map((filter) => ({
|
||||||
|
startDate: filter.startDate
|
||||||
|
? new Date(filter.startDate)
|
||||||
|
: undefined,
|
||||||
|
endDate: filter.endDate ? new Date(filter.endDate) : undefined,
|
||||||
|
hasNoDueDate: filter.hasNoDueDate,
|
||||||
|
})) ?? [],
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -322,6 +306,12 @@ export const boardRouter = createTRPCRouter({
|
|||||||
sourceBoardId: sourceBoardInfo.id,
|
sourceBoardId: sourceBoardInfo.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!result)
|
||||||
|
throw new TRPCError({
|
||||||
|
message: `Failed to create board from source`,
|
||||||
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
|
});
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
},
|
},
|
||||||
"prettier": "@kan/prettier-config",
|
"prettier": "@kan/prettier-config",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@better-auth/stripe": "^1.4.6",
|
"@better-auth/stripe": "^1.3.7",
|
||||||
"better-auth": "^1.4.6"
|
"better-auth": "^1.3.7"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,8 @@ export const configuredProviders = socialProviderList.reduce<
|
|||||||
Object.keys(acc).includes("google") &&
|
Object.keys(acc).includes("google") &&
|
||||||
acc[provider]
|
acc[provider]
|
||||||
) {
|
) {
|
||||||
const allowed = process.env.BETTER_AUTH_ALLOWED_DOMAINS?.split(",")
|
const allowed = process.env.BETTER_AUTH_ALLOWED_DOMAINS
|
||||||
|
?.split(",")
|
||||||
.map((d) => d.trim().toLowerCase())
|
.map((d) => d.trim().toLowerCase())
|
||||||
.filter(Boolean);
|
.filter(Boolean);
|
||||||
if (allowed && allowed.length > 0) {
|
if (allowed && allowed.length > 0) {
|
||||||
@@ -298,8 +299,9 @@ export const initAuth = (db: dbClient) => {
|
|||||||
}),
|
}),
|
||||||
]
|
]
|
||||||
: []),
|
: []),
|
||||||
|
// @todo: hasing is disabled due to a bug in the api key plugin
|
||||||
apiKey({
|
apiKey({
|
||||||
enableSessionForAPIKeys: true,
|
disableKeyHashing: true,
|
||||||
rateLimit: {
|
rateLimit: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
timeWindow: 1000 * 60, // 1 minute
|
timeWindow: 1000 * 60, // 1 minute
|
||||||
@@ -363,7 +365,8 @@ export const initAuth = (db: dbClient) => {
|
|||||||
// Fall through to any additional checks below
|
// Fall through to any additional checks below
|
||||||
}
|
}
|
||||||
// Enforce allowed domains (OIDC/social) if configured
|
// Enforce allowed domains (OIDC/social) if configured
|
||||||
const allowed = process.env.BETTER_AUTH_ALLOWED_DOMAINS?.split(",")
|
const allowed = process.env.BETTER_AUTH_ALLOWED_DOMAINS
|
||||||
|
?.split(",")
|
||||||
.map((d) => d.trim().toLowerCase())
|
.map((d) => d.trim().toLowerCase())
|
||||||
.filter(Boolean);
|
.filter(Boolean);
|
||||||
if (allowed && allowed.length > 0) {
|
if (allowed && allowed.length > 0) {
|
||||||
|
|||||||
@@ -24,9 +24,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@novu/api": "^3.11.0",
|
"@novu/api": "^3.11.0",
|
||||||
"@react-email/components": "^1.0.1",
|
"@react-email/components": "^0.0.25",
|
||||||
"nodemailer": "^7.0.3",
|
"nodemailer": "^7.0.3",
|
||||||
"react-email": "^5.0.6"
|
"react-email": "^3.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@kan/eslint-config": "workspace:*",
|
"@kan/eslint-config": "workspace:*",
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
},
|
},
|
||||||
"prettier": "@kan/prettier-config",
|
"prettier": "@kan/prettier-config",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"date-fns": "^4.1.0",
|
|
||||||
"jose": "^6.1.2",
|
"jose": "^6.1.2",
|
||||||
"nanoid": "^5.0.9",
|
"nanoid": "^5.0.9",
|
||||||
"next-runtime-env": "^1.7.2"
|
"next-runtime-env": "^1.7.2"
|
||||||
|
|||||||
@@ -2,4 +2,3 @@ export * from "./generateUID";
|
|||||||
export * from "./generateSlug";
|
export * from "./generateSlug";
|
||||||
export * from "./subscriptions";
|
export * from "./subscriptions";
|
||||||
export * from "./email";
|
export * from "./email";
|
||||||
export * from "./dueDateFilters";
|
|
||||||
|
|||||||