Compare commits

..

1 Commits

Author SHA1 Message Date
Henry
5fcd0e8688 fix: delete attachment from s3 2025-12-05 22:03:39 +00:00
48 changed files with 1315 additions and 4523 deletions

View File

@@ -4,9 +4,8 @@ ARG PROJECT=@kan/web
# 1. Alpine image
FROM node:${NODE_VERSION}-alpine AS alpine
RUN apk update && \
apk add --no-cache --virtual .build-deps libc6-compat python3 make g++ && \
rm -rf /var/cache/apk/* /tmp/* || true
RUN apk update
RUN apk add --no-cache libc6-compat python3 make g++
# Setup pnpm and turbo on the alpine base
FROM alpine AS base

View File

@@ -2,7 +2,7 @@
"version": 0,
"locale": {
"source": "en",
"targets": ["fr", "de", "es", "it", "nl", "ru", "pl", "ptbr"]
"targets": ["fr", "de", "es", "it", "nl", "ru", "pl"]
},
"buckets": {
"po": {

View File

@@ -1,7 +1,7 @@
import type { LinguiConfig } from "@lingui/conf";
const config: LinguiConfig = {
locales: ["en", "fr", "de", "es", "it", "nl", "ru", "pl","ptbr"],
locales: ["en", "fr", "de", "es", "it", "nl", "ru", "pl"],
sourceLocale: "en",
catalogs: [
{

View File

@@ -26,10 +26,8 @@ const config = {
],
/** 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 },
typescript: { ignoreBuildErrors: true },
images: {
remotePatterns: (() => {
@@ -77,13 +75,12 @@ const config = {
return patterns;
})(),
},
turbopack: {
rules: {
"*.svg": {
loaders: ["@svgr/webpack"],
as: "*.js",
},
},
webpack(config) {
config.module.rules.push({
test: /\.svg$/,
use: ["@svgr/webpack"],
});
return config;
},
experimental: {
// instrumentationHook: true,

View File

@@ -4,9 +4,9 @@
"private": true,
"type": "module",
"scripts": {
"build": "pnpm with-env next build --turbo",
"build": "pnpm with-env next build",
"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",
"lint": "eslint",
"start": "pnpm with-env next start",
@@ -47,10 +47,12 @@
"date-fns": "^4.1.0",
"geist": "^1.3.1",
"jose": "^6.1.2",
"next": "15.5.9",
"next": "^15.3.4",
"next-logger": "^5.0.1",
"next-runtime-env": "^1.7.2",
"next-themes": "^0.4.6",
"nextjs-cors": "^2.2.0",
"pino": "^9.6.0",
"posthog-js": "^1.254.0",
"react": "catalog:react18",
"react-beautiful-dnd": "^13.1.1",
@@ -84,6 +86,7 @@
"dotenv-cli": "^7.4.4",
"eslint": "catalog:",
"jiti": "^1.21.6",
"pino-pretty": "^13.0.0",
"prettier": "catalog:",
"tailwindcss": "catalog:",
"typescript": "catalog:"

View File

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,6 +1,6 @@
import type { Locale as DateFnsLocale } from "date-fns";
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 { useLinguiContext } from "~/providers/lingui";
@@ -19,7 +19,6 @@ export function useLocalisation() {
nl,
ru,
pl,
ptbr: ptBR,
};
const currentDateLocale = dateLocaleMap[locale] ?? enGB;

View File

@@ -0,0 +1,6 @@
export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
await require("pino");
await require("next-logger");
}
}

View File

@@ -31,7 +31,7 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -83,7 +83,7 @@ msgstr "Konto gelöscht"
msgid "Actions"
msgstr "Aktionen"
#: src/views/card/index.tsx:386
#: src/views/card/index.tsx:352
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Aktivität"
@@ -313,7 +313,7 @@ msgid "Blog Post"
msgstr "Blogbeitrag"
#: 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
msgid "Board"
msgstr "Board"
@@ -395,12 +395,12 @@ msgstr "Fehlerbericht"
msgid "Cancel"
msgstr "Abbrechen"
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "Card"
msgstr "Karte"
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:308
msgid "Card not found"
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."
#: 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
msgid "Free"
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/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:186
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -2239,10 +2236,6 @@ msgstr "Checklistenelement kann nicht hinzugefügt werden"
msgid "Unable to add comment"
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
msgid "Unable to create card"
msgstr "Karte konnte nicht erstellt werden"
@@ -2301,7 +2294,7 @@ msgid "Unable to update board visibility"
msgstr "Board-Sichtbarkeit konnte nicht aktualisiert werden"
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
#: src/views/card/index.tsx:185
msgid "Unable to update card"
msgstr "Karte konnte nicht aktualisiert werden"

File diff suppressed because one or more lines are too long

View File

@@ -31,7 +31,7 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -95,7 +95,7 @@ msgstr "Account deleted"
msgid "Actions"
msgstr "Actions"
#: src/views/card/index.tsx:386
#: src/views/card/index.tsx:352
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Activity"
@@ -353,7 +353,7 @@ msgid "Blog Post"
msgstr "Blog Post"
#: 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
msgid "Board"
msgstr "Board"
@@ -452,12 +452,12 @@ msgstr "Bug Report"
msgid "Cancel"
msgstr "Cancel"
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "Card"
msgstr "Card"
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:308
msgid "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/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:186
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -2396,10 +2395,6 @@ msgstr "Unable to add checklist item"
msgid "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
msgid "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"
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
#: src/views/card/index.tsx:185
msgid "Unable to update card"
msgstr "Unable to update card"

File diff suppressed because one or more lines are too long

View File

@@ -31,7 +31,7 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -83,7 +83,7 @@ msgstr "Cuenta eliminada"
msgid "Actions"
msgstr "Acciones"
#: src/views/card/index.tsx:386
#: src/views/card/index.tsx:352
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Actividad"
@@ -313,7 +313,7 @@ msgid "Blog Post"
msgstr "Entrada de blog"
#: 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
msgid "Board"
msgstr "Tablero"
@@ -395,12 +395,12 @@ msgstr "Informe de error"
msgid "Cancel"
msgstr "Cancelar"
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "Card"
msgstr "Tarjeta"
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:308
msgid "Card not found"
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."
#: 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
msgid "Free"
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/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:186
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: 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"
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
msgid "Unable to create card"
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"
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
#: src/views/card/index.tsx:185
msgid "Unable to update card"
msgstr "No se puede actualizar la tarjeta"

File diff suppressed because one or more lines are too long

View File

@@ -31,7 +31,7 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -83,7 +83,7 @@ msgstr "Compte supprimé"
msgid "Actions"
msgstr "Actions"
#: src/views/card/index.tsx:386
#: src/views/card/index.tsx:352
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Activité"
@@ -313,7 +313,7 @@ msgid "Blog Post"
msgstr "Article de blog"
#: 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
msgid "Board"
msgstr "Tableau"
@@ -395,12 +395,12 @@ msgstr "Rapport de bug"
msgid "Cancel"
msgstr "Annuler"
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "Card"
msgstr "Carte"
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:308
msgid "Card not found"
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."
#: 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
msgid "Free"
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/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:186
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: 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"
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
msgid "Unable to create card"
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"
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
#: src/views/card/index.tsx:185
msgid "Unable to update card"
msgstr "Impossible de mettre à jour la carte"

File diff suppressed because one or more lines are too long

View File

@@ -7,7 +7,6 @@ export const locales = [
"nl",
"ru",
"pl",
"ptbr"
] as const;
export type Locale = (typeof locales)[number];
@@ -23,5 +22,4 @@ export const localeNames: Record<Locale, string> = {
nl: "Nederlands",
ru: "Русский",
pl: "Polski",
ptbr: "Português",
};

View File

@@ -31,7 +31,7 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -83,7 +83,7 @@ msgstr "Account eliminato"
msgid "Actions"
msgstr "Azioni"
#: src/views/card/index.tsx:386
#: src/views/card/index.tsx:352
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Attività"
@@ -313,7 +313,7 @@ msgid "Blog Post"
msgstr "Post del blog"
#: 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
msgid "Board"
msgstr "Bacheca"
@@ -395,12 +395,12 @@ msgstr "Segnalazione bug"
msgid "Cancel"
msgstr "Annulla"
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "Card"
msgstr "Carta"
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:308
msgid "Card not found"
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."
#: 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
msgid "Free"
msgstr "Gratuito"
@@ -1739,8 +1737,7 @@ msgstr "Seleziona un file da caricare."
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:186
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -2239,10 +2236,6 @@ msgstr "Impossibile aggiungere l'elemento della checklist"
msgid "Unable to add comment"
msgstr "Impossibile aggiungere il commento"
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr ""
#: src/views/board/components/NewCardForm.tsx:181
msgid "Unable to create card"
msgstr "Impossibile creare la scheda"
@@ -2301,7 +2294,7 @@ msgid "Unable to update board visibility"
msgstr "Impossibile aggiornare la visibilità della bacheca"
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
#: src/views/card/index.tsx:185
msgid "Unable to update card"
msgstr "Impossibile aggiornare la scheda"

File diff suppressed because one or more lines are too long

View File

@@ -31,7 +31,7 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -83,7 +83,7 @@ msgstr "Account verwijderd"
msgid "Actions"
msgstr "Acties"
#: src/views/card/index.tsx:386
#: src/views/card/index.tsx:352
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Activiteit"
@@ -313,7 +313,7 @@ msgid "Blog Post"
msgstr "Blogbericht"
#: 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
msgid "Board"
msgstr "Bord"
@@ -395,12 +395,12 @@ msgstr "Bugrapport"
msgid "Cancel"
msgstr "Annuleren"
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "Card"
msgstr "Kaart"
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:308
msgid "Card not found"
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."
#: 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
msgid "Free"
msgstr "Gratis"
@@ -1739,8 +1737,7 @@ msgstr "Selecteer een bestand om te uploaden."
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:186
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -2239,10 +2236,6 @@ msgstr "Kan checklistitem niet toevoegen"
msgid "Unable to add comment"
msgstr "Kan geen reactie toevoegen"
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr ""
#: src/views/board/components/NewCardForm.tsx:181
msgid "Unable to create card"
msgstr "Kan kaart niet aanmaken"
@@ -2301,7 +2294,7 @@ msgid "Unable to update board visibility"
msgstr "Kan bordzichtbaarheid niet bijwerken"
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
#: src/views/card/index.tsx:185
msgid "Unable to update card"
msgstr "Kan kaart niet bijwerken"

File diff suppressed because one or more lines are too long

View File

@@ -36,7 +36,7 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -88,7 +88,7 @@ msgstr "Konto zostało usunięte"
msgid "Actions"
msgstr "Działania"
#: src/views/card/index.tsx:386
#: src/views/card/index.tsx:352
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Aktywność"
@@ -318,7 +318,7 @@ msgid "Blog Post"
msgstr "Post na blogu"
#: 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
msgid "Board"
msgstr "Tablica"
@@ -400,12 +400,12 @@ msgstr "Zgłoszenie błędu"
msgid "Cancel"
msgstr "Anuluj"
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "Card"
msgstr "Karta"
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:308
msgid "Card not found"
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."
#: 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
msgid "Free"
msgstr "Darmowy"
@@ -1744,8 +1742,7 @@ msgstr "Proszę wybrać plik do przesłania."
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:186
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -2244,10 +2241,6 @@ msgstr "Nie można dodać elementu listy kontrolnej"
msgid "Unable to add comment"
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
msgid "Unable to create card"
msgstr "Nie można utworzyć karty"
@@ -2306,7 +2299,7 @@ msgid "Unable to update board visibility"
msgstr "Nie można zaktualizować widoczności tablicy"
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
#: src/views/card/index.tsx:185
msgid "Unable to update card"
msgstr "Nie można zaktualizować karty"

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -31,7 +31,7 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "{0} | {1}"
msgstr "{0} | {1}"
@@ -83,7 +83,7 @@ msgstr "Аккаунт удалён"
msgid "Actions"
msgstr "Действия"
#: src/views/card/index.tsx:386
#: src/views/card/index.tsx:352
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Активность"
@@ -313,7 +313,7 @@ msgid "Blog Post"
msgstr "Пост в блоге"
#: 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
msgid "Board"
msgstr "Доска"
@@ -395,12 +395,12 @@ msgstr "Отчет об ошибке"
msgid "Cancel"
msgstr "Отмена"
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:238
msgid "Card"
msgstr "Карточка"
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
#: src/views/card/index.tsx:272
#: src/views/card/index.tsx:308
msgid "Card not found"
msgstr "Карточка не найдена"
@@ -1042,8 +1042,6 @@ msgid "For long-term sustainability, we recognise all good open source projects
msgstr "Для долгосрочной устойчивости мы признаем, что всем хорошим проектам с открытым исходным кодом необходим источник дохода. Наш доход поступает от платного облачного предложения для рабочих пространств с несколькими пользователями и для пользовательских идентификаторов рабочих пространств. Нет обязательства использовать его, и вы можете самостоятельно разместить программное обеспечение на своей инфраструктуре бесплатно."
#: 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
msgid "Free"
msgstr "Бесплатно"
@@ -1739,8 +1737,7 @@ msgstr "Пожалуйста, выберите файл для загрузки.
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:186
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -2239,10 +2236,6 @@ msgstr "Не удалось добавить элемент контрольно
msgid "Unable to add comment"
msgstr "Не удалось добавить комментарий."
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr ""
#: src/views/board/components/NewCardForm.tsx:181
msgid "Unable to create card"
msgstr "Не удалось создать карточку."
@@ -2301,7 +2294,7 @@ msgid "Unable to update board visibility"
msgstr "Не удалось обновить видимость доски"
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
#: src/views/card/index.tsx:185
msgid "Unable to update card"
msgstr "Не удалось обновить карточку"

File diff suppressed because one or more lines are too long

View File

@@ -88,7 +88,6 @@ export default async function handler(
const session = await stripe.checkout.sessions.create({
mode: "subscription",
payment_method_collection: "always",
line_items: [
{
price: process.env.STRIPE_PRO_PLAN_MONTHLY_PRICE_ID,

View File

@@ -1,6 +1,6 @@
import { addDays, endOfDay, startOfDay } from "date-fns";
export type DueDateFilterKey =
type DueDateFilterKey =
| "overdue"
| "today"
| "tomorrow"
@@ -9,8 +9,8 @@ export type DueDateFilterKey =
| "no-due-date";
export interface DueDateFilter {
startDate?: Date;
endDate?: Date;
startDate?: string;
endDate?: string;
hasNoDueDate?: boolean;
}
@@ -21,35 +21,35 @@ export const convertDueDateFiltersToRanges = (
const today = startOfDay(new Date());
const tomorrow = addDays(today, 1);
const nextWeekEnd = addDays(today, 8);
const nextMonthEnd = addDays(today, 31);
const nextWeekEnd = addDays(today, 8); // 7 days ahead
const nextMonthEnd = addDays(today, 31); // 30 days ahead
return filters.map((filter) => {
switch (filter) {
case "overdue":
return {
endDate: today,
endDate: today.toISOString(),
};
case "today":
return {
startDate: today,
endDate: endOfDay(today),
startDate: today.toISOString(),
endDate: endOfDay(today).toISOString(),
};
case "tomorrow":
return {
startDate: tomorrow,
endDate: endOfDay(tomorrow),
startDate: tomorrow.toISOString(),
endDate: endOfDay(tomorrow).toISOString(),
};
case "next-week": {
return {
startDate: today,
endDate: nextWeekEnd,
startDate: today.toISOString(),
endDate: nextWeekEnd.toISOString(),
};
}
case "next-month": {
return {
startDate: nextWeekEnd,
endDate: nextMonthEnd,
startDate: nextWeekEnd.toISOString(),
endDate: nextMonthEnd.toISOString(),
};
}
case "no-due-date":

View File

@@ -22,8 +22,6 @@ const loadMessages = async (locale: Locale) => {
return (await import("~/locales/ru/messages")).messages;
case "pl":
return (await import("~/locales/pl/messages")).messages;
case "ptbr":
return (await import("~/locales/ptbr/messages")).messages;
default:
return enMessages;
}

View File

@@ -29,6 +29,7 @@ import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { useWorkspace } from "~/providers/workspace";
import { api } from "~/utils/api";
import { convertDueDateFiltersToRanges } from "~/utils/dueDateFilters";
import { formatToArray } from "~/utils/helpers";
import BoardDropdown from "./components/BoardDropdown";
import Card from "./components/Card";
@@ -96,17 +97,20 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
| "no-due-date"
)[];
const boardType: "regular" | "template" = isTemplate ? "template" : "regular";
const queryParams = {
const queryParams: {
boardPublicId: string;
members: string[];
labels: string[];
lists: string[];
dueDate: ReturnType<typeof convertDueDateFiltersToRanges>;
type: "regular" | "template";
} = {
boardPublicId: boardId ?? "",
members: formatToArray(router.query.members),
labels: formatToArray(router.query.labels),
lists: formatToArray(router.query.lists),
...(semanticFilters.length > 0 && {
dueDateFilters: semanticFilters,
}),
type: boardType,
dueDate: convertDueDateFiltersToRanges(semanticFilters),
type: isTemplate ? "template" : "regular",
};
const {

View File

@@ -1,14 +1,15 @@
import type { FC, SVGProps } from "react";
import { Trans } from "@lingui/react/macro";
import AirbusLogo from "~/assets/logos/airbus.svg";
import CouchbaseLogo from "~/assets/logos/couchbase.svg";
import DeloitteLogo from "~/assets/logos/deloitte.svg";
import FastCompanyLogo from "~/assets/logos/fast_company.svg";
import LegoLogo from "~/assets/logos/lego.svg";
import LinkedinLogo from "~/assets/logos/linkedin.svg";
import SanaLogo from "~/assets/logos/sana.svg";
import WakamLogo from "~/assets/logos/wakam.svg";
import AirbusLogo from "/public/logos/airbus.svg";
import BitwardenLogo from "/public/logos/bitwarden.svg";
import CouchbaseLogo from "/public/logos/couchbase.svg";
import DeloitteLogo from "/public/logos/deloitte.svg";
import FastCompanyLogo from "/public/logos/fast_company.svg";
import LegoLogo from "/public/logos/lego.svg";
import LinkedinLogo from "/public/logos/linkedin.svg";
import SanaLogo from "/public/logos/sana.svg";
import WakamLogo from "/public/logos/wakam.svg";
type LogoComponent = FC<SVGProps<SVGSVGElement>>;
@@ -30,31 +31,36 @@ export default function Logos() {
},
{
id: 3,
component: BitwardenLogo as LogoComponent,
alt: "Bitwarden Logo",
},
{
id: 4,
component: CouchbaseLogo as LogoComponent,
alt: "Couchbase Logo",
},
{
id: 4,
id: 5,
component: LegoLogo as LogoComponent,
alt: "Lego Logo",
},
{
id: 5,
id: 6,
component: AirbusLogo as LogoComponent,
alt: "Airbus Logo",
},
{
id: 6,
id: 7,
component: DeloitteLogo as LogoComponent,
alt: "Deloitte Logo",
},
{
id: 7,
id: 8,
component: WakamLogo as LogoComponent,
alt: "Wakam Logo",
},
{
id: 8,
id: 9,
component: LinkedinLogo as LogoComponent,
alt: "Linked In Logo",
},
@@ -76,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 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">
{logos.map((logo) => {
const LogoComponent: LogoComponent = logo.component;

View File

@@ -15,6 +15,7 @@ import ThemeToggle from "~/components/ThemeToggle";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { convertDueDateFiltersToRanges } from "~/utils/dueDateFilters";
import { formatToArray } from "~/utils/helpers";
import Card from "~/views/board/components/Card";
import Filters from "~/views/board/components/Filters";
@@ -54,9 +55,7 @@ export default function PublicBoardView() {
members: formatToArray(router.query.members),
labels: formatToArray(router.query.labels),
lists: formatToArray(router.query.lists),
...(dueDateFilters.length > 0 && {
dueDateFilters: dueDateFilters,
}),
dueDate: convertDueDateFiltersToRanges(dueDateFilters),
},
{
enabled: router.isReady && !!boardSlug,

View File

@@ -8,15 +8,17 @@ import * as labelRepo from "@kan/db/repository/label.repo";
import * as listRepo from "@kan/db/repository/list.repo";
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
import { colours } from "@kan/shared/constants";
import {
convertDueDateFiltersToRanges,
generateSlug,
generateUID,
} from "@kan/shared/utils";
import { generateSlug, generateUID } from "@kan/shared/utils";
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
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({
all: protectedProcedure
.meta({
@@ -83,18 +85,7 @@ export const boardRouter = createTRPCRouter({
members: z.array(z.string().min(12)).optional(),
labels: z.array(z.string().min(12)).optional(),
lists: z.array(z.string().min(12)).optional(),
dueDateFilters: z
.array(
z.enum([
"overdue",
"today",
"tomorrow",
"next-week",
"next-month",
"no-due-date",
]),
)
.optional(),
dueDate: z.array(dueDateFilterSchema).optional(),
type: z.enum(["regular", "template"]).optional(),
}),
)
@@ -121,11 +112,6 @@ export const boardRouter = createTRPCRouter({
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(
ctx.db,
input.boardPublicId,
@@ -133,7 +119,14 @@ export const boardRouter = createTRPCRouter({
members: input.members ?? [],
labels: input.labels ?? [],
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,
},
);
@@ -167,18 +160,7 @@ export const boardRouter = createTRPCRouter({
members: z.array(z.string().min(12)).optional(),
labels: z.array(z.string().min(12)).optional(),
lists: z.array(z.string().min(12)).optional(),
dueDateFilters: z
.array(
z.enum([
"overdue",
"today",
"tomorrow",
"next-week",
"next-month",
"no-due-date",
]),
)
.optional(),
dueDate: z.array(dueDateFilterSchema).optional(),
}),
)
.output(z.custom<Awaited<ReturnType<typeof boardRepo.getBySlug>>>())
@@ -194,11 +176,6 @@ export const boardRouter = createTRPCRouter({
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(
ctx.db,
input.boardSlug,
@@ -207,7 +184,14 @@ export const boardRouter = createTRPCRouter({
members: input.members ?? [],
labels: input.labels ?? [],
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,
});
if (!result)
throw new TRPCError({
message: `Failed to create board from source`,
code: "INTERNAL_SERVER_ERROR",
});
return result;
}

View File

@@ -37,7 +37,7 @@
},
"prettier": "@kan/prettier-config",
"dependencies": {
"@better-auth/stripe": "^1.4.6",
"better-auth": "^1.4.6"
"@better-auth/stripe": "^1.3.7",
"better-auth": "^1.3.7"
}
}

View File

@@ -78,7 +78,8 @@ export const configuredProviders = socialProviderList.reduce<
Object.keys(acc).includes("google") &&
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())
.filter(Boolean);
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({
enableSessionForAPIKeys: true,
disableKeyHashing: true,
rateLimit: {
enabled: true,
timeWindow: 1000 * 60, // 1 minute
@@ -363,7 +365,8 @@ export const initAuth = (db: dbClient) => {
// Fall through to any additional checks below
}
// 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())
.filter(Boolean);
if (allowed && allowed.length > 0) {

View File

@@ -24,9 +24,9 @@
},
"dependencies": {
"@novu/api": "^3.11.0",
"@react-email/components": "^1.0.1",
"@react-email/components": "^0.0.25",
"nodemailer": "^7.0.3",
"react-email": "^5.0.6"
"react-email": "^3.0.1"
},
"devDependencies": {
"@kan/eslint-config": "workspace:*",

View File

@@ -36,7 +36,6 @@
},
"prettier": "@kan/prettier-config",
"dependencies": {
"date-fns": "^4.1.0",
"jose": "^6.1.2",
"nanoid": "^5.0.9",
"next-runtime-env": "^1.7.2"

View File

@@ -2,4 +2,3 @@ export * from "./generateUID";
export * from "./generateSlug";
export * from "./subscriptions";
export * from "./email";
export * from "./dueDateFilters";

2514
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff