Compare commits

...

31 Commits

Author SHA1 Message Date
Maksim Eltyshev
71bc98c9b9 chore: Update version 2025-05-09 21:09:59 +02:00
Maksim Eltyshev
f9fcd02042 docs: Fix development section link 2025-04-29 22:29:41 +02:00
Maksim Eltyshev
fab56d020b docs: Update links 2025-04-29 21:33:03 +02:00
Christian T R
c34121557f fix: Update Danish translation (#1103) 2025-04-25 23:30:28 +02:00
dependabot[bot]
956b08d564 chore(deps): Bump @babel/runtime from 7.26.0 to 7.27.0 in /client (#1100)
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.26.0 to 7.27.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.0/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-version: 7.27.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-22 15:57:21 +02:00
Maksim Eltyshev
3664bdacc7 chore: Update version 2025-04-22 15:51:47 +02:00
Maksim Eltyshev
728aa901ef chore: Add LOG_LEVEL to environment samples 2025-04-22 15:41:01 +02:00
Maurice Faber
d9393879b5 fix: Allow specifying log level (#1099)
Closes #1098
2025-04-22 15:29:10 +02:00
Maksim Eltyshev
2c84390b8c chore: Update version 2025-04-21 01:31:41 +02:00
dependabot[bot]
08096e99b5 chore(deps): Bump path-to-regexp and @sailshq/router in /server (#1096)
Bumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) and [@sailshq/router](https://github.com/sailshq/router). These dependencies needed to be updated together.

Updates `path-to-regexp` from 0.1.11 to 1.9.0
- [Release notes](https://github.com/pillarjs/path-to-regexp/releases)
- [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md)
- [Commits](https://github.com/pillarjs/path-to-regexp/compare/v0.1.11...v1.9.0)

Updates `@sailshq/router` from 1.3.9 to 1.3.10
- [Changelog](https://github.com/sailshq/router/blob/master/HISTORY.md)
- [Commits](https://github.com/sailshq/router/compare/v1.3.9...v1.3.10)

---
updated-dependencies:
- dependency-name: path-to-regexp
  dependency-version: 1.9.0
  dependency-type: indirect
- dependency-name: "@sailshq/router"
  dependency-version: 1.3.10
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-21 01:15:16 +02:00
dependabot[bot]
73e2e19a6b chore(deps): Bump http-proxy-middleware from 2.0.7 to 2.0.9 in /client (#1095)
Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 2.0.7 to 2.0.9.
- [Release notes](https://github.com/chimurai/http-proxy-middleware/releases)
- [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md)
- [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.7...v2.0.9)

---
updated-dependencies:
- dependency-name: http-proxy-middleware
  dependency-version: 2.0.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-21 01:15:08 +02:00
dependabot[bot]
0749246b5b chore(deps): Bump @babel/runtime from 7.26.0 to 7.27.0 (#1094)
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.26.0 to 7.27.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.0/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-version: 7.27.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-21 01:14:58 +02:00
dependabot[bot]
91ad9a177a chore(deps): Bump cookie and sails-hook-sockets in /server (#1093)
Bumps [cookie](https://github.com/jshttp/cookie) to 0.7.2 and updates ancestor dependency [sails-hook-sockets](https://github.com/balderdashy/sails-hook-sockets). These dependencies need to be updated together.


Updates `cookie` from 0.4.2 to 0.7.2
- [Release notes](https://github.com/jshttp/cookie/releases)
- [Commits](https://github.com/jshttp/cookie/compare/v0.4.2...v0.7.2)

Updates `sails-hook-sockets` from 3.0.1 to 3.0.2
- [Release notes](https://github.com/balderdashy/sails-hook-sockets/releases)
- [Changelog](https://github.com/balderdashy/sails-hook-sockets/blob/master/CHANGELOG.md)
- [Commits](https://github.com/balderdashy/sails-hook-sockets/compare/v3.0.1...v3.0.2)

---
updated-dependencies:
- dependency-name: cookie
  dependency-version: 0.7.2
  dependency-type: indirect
- dependency-name: sails-hook-sockets
  dependency-version: 3.0.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-21 01:14:48 +02:00
dependabot[bot]
0df25c6a58 chore(deps): Bump @babel/helpers from 7.26.0 to 7.26.10 in /client (#1063)
Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.26.0 to 7.26.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-helpers)

---
updated-dependencies:
- dependency-name: "@babel/helpers"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-21 01:05:00 +02:00
dependabot[bot]
de128b3d18 chore(deps-dev): Bump axios from 1.7.7 to 1.8.2 in /client (#1062)
Bumps [axios](https://github.com/axios/axios) from 1.7.7 to 1.8.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.7...v1.8.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-21 01:04:52 +02:00
Kacy Luzzardi
3a01674ab6 feat: Ability to automatically initiate OIDC authentication (#1092)
Closes #1091
2025-04-21 01:04:20 +02:00
Weverton Carlos Silva
926b664433 docs: Add link to postman api (#1077) 2025-04-01 12:29:40 +02:00
grenagit
9ae9bd58f1 fix: Update French translation (#1068) 2025-03-26 19:05:16 +01:00
Maksim Eltyshev
dd3b7e0d32 chore: Update version 2025-03-16 22:50:30 +01:00
NavyStack
e6ad40e140 fix: Update Korean translation (#1060) 2025-03-16 21:21:40 +01:00
Blyamur
c764d479fd fix: Update Russian translation (#1056)
Corrections have been made in accordance with the content of the en_US language file
2025-03-11 23:22:35 +01:00
Leif-n
719e558f86 fix: Update Swedish translation (#1054) 2025-03-10 21:44:42 +01:00
Hannes
971aa6902e fix: Update German translation (#1049) 2025-03-05 19:57:16 +01:00
Maksim Eltyshev
fe8f7d172b chore: Update version 2025-03-01 22:10:49 +01:00
Nikhil Taneja
142f35d8a2 fix: Configurable database schema name (#1046) 2025-03-01 22:03:15 +01:00
Maksim Eltyshev
b88a2894b6 build: Pin pnpm version 2025-02-26 17:14:41 +01:00
Lukas Corona
2732570607 feat: Ability to set list color indicator (#1033)
Closes #840
2025-02-25 15:58:59 +01:00
dependabot[bot]
b0e9ed6162 chore(deps): Bump path-to-regexp and express in /client (#1013)
Bumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `path-to-regexp` from 0.1.10 to 0.1.12
- [Release notes](https://github.com/pillarjs/path-to-regexp/releases)
- [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md)
- [Commits](https://github.com/pillarjs/path-to-regexp/compare/v0.1.10...v0.1.12)

Updates `express` from 4.21.1 to 4.21.2
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.2/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.21.1...4.21.2)

---
updated-dependencies:
- dependency-name: path-to-regexp
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-13 16:20:25 +01:00
dependabot[bot]
8b99e38615 chore(deps): Bump path-to-regexp and sails in /server (#1012)
Bumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) to 1.9.0 and updates ancestor dependency [sails](https://github.com/balderdashy/sails). These dependencies need to be updated together.


Updates `path-to-regexp` from 0.1.11 to 1.9.0
- [Release notes](https://github.com/pillarjs/path-to-regexp/releases)
- [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md)
- [Commits](https://github.com/pillarjs/path-to-regexp/compare/v0.1.11...v1.9.0)

Updates `sails` from 1.5.13 to 1.5.14
- [Release notes](https://github.com/balderdashy/sails/releases)
- [Changelog](https://github.com/balderdashy/sails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/balderdashy/sails/compare/v1.5.13...v1.5.14)

---
updated-dependencies:
- dependency-name: path-to-regexp
  dependency-type: indirect
- dependency-name: sails
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-13 16:20:13 +01:00
dependabot[bot]
3bc6991002 chore(deps): Bump nanoid in /client (#1011)
Bumps  and [nanoid](https://github.com/ai/nanoid). These dependencies needed to be updated together.

Updates `nanoid` from 5.0.8 to 5.0.9
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/5.0.8...5.0.9)

Updates `nanoid` from 3.3.7 to 5.0.9
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/5.0.8...5.0.9)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: direct:production
- dependency-name: nanoid
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-13 16:20:04 +01:00
Marc-Andrieu
ff689b6273 fix: Update French translation (#1030) 2025-02-13 16:03:11 +01:00
49 changed files with 954 additions and 609 deletions

View File

@@ -16,7 +16,7 @@ jobs:
cache: 'npm' cache: 'npm'
- name: Workflow install pnpm - name: Workflow install pnpm
run: npm install pnpm -g run: npm install pnpm@9 -g
- name: Client install dependencies - name: Client install dependencies
run: pnpm install run: pnpm install

View File

@@ -1,15 +1,14 @@
FROM node:18-alpine AS server-dependencies FROM node:18-alpine AS server-dependencies
RUN apk -U upgrade \ RUN apk -U upgrade \
&& apk add build-base python3 \ && apk add build-base python3 --no-cache
--no-cache
WORKDIR /app WORKDIR /app
COPY server/package.json server/package-lock.json ./ COPY server/package.json server/package-lock.json ./
RUN npm install npm --global \ RUN npm install npm --global \
&& npm install pnpm --global \ && npm install pnpm@9 --global \
&& pnpm import \ && pnpm import \
&& pnpm install --prod && pnpm install --prod
@@ -17,28 +16,26 @@ FROM node:lts AS client
WORKDIR /app WORKDIR /app
COPY client/package.json client/package-lock.json ./ COPY client .
RUN npm install npm --global \ RUN npm install npm --global \
&& npm install pnpm --global \ && npm install pnpm@9 --global \
&& pnpm import \ && pnpm import \
&& pnpm install --prod && pnpm install --prod
COPY client .
RUN DISABLE_ESLINT_PLUGIN=true npm run build RUN DISABLE_ESLINT_PLUGIN=true npm run build
FROM node:18-alpine FROM node:18-alpine
RUN apk -U upgrade \ RUN apk -U upgrade \
&& apk add bash \ && apk add bash --no-cache
--no-cache
USER node USER node
WORKDIR /app WORKDIR /app
COPY --chown=node:node start.sh . COPY --chown=node:node start.sh .
COPY --chown=node:node server .
COPY --chown=node:node healthcheck.js . COPY --chown=node:node healthcheck.js .
COPY --chown=node:node server .
RUN mv .env.sample .env RUN mv .env.sample .env
@@ -56,5 +53,4 @@ EXPOSE 1337
HEALTHCHECK --interval=10s --timeout=2s --start-period=15s \ HEALTHCHECK --interval=10s --timeout=2s --start-period=15s \
CMD node ./healthcheck.js CMD node ./healthcheck.js
CMD ["./start.sh"]
CMD [ "bash", "start.sh" ]

View File

@@ -21,9 +21,9 @@
## How to deploy Planka ## How to deploy Planka
There are many ways to install Planka, [check them out](https://docs.planka.cloud/docs/intro). There are many ways to install Planka, [check them out](https://docs.planka.cloud/docs/welcome/).
For configuration, please see the [configuration section](https://docs.planka.cloud/docs/category/configuration). For configuration, please see the [configuration section](https://docs.planka.cloud/docs/category/configuration/).
## Mobile app ## Mobile app
@@ -33,6 +33,10 @@ Alternatively, you can download the [Android APK](https://github.com/LouisHDev/p
If you have an iOS device and would like to test the app, you can join [TestFlight](https://testflight.apple.com/join/Uwn41eY4) (limited to 200 participants). If you have an iOS device and would like to test the app, you can join [TestFlight](https://testflight.apple.com/join/Uwn41eY4) (limited to 200 participants).
## Planka postman api
For external access api use [postman](https://documenter.getpostman.com/view/3360622/2sB2cRCPpU#3caa89a9-995d-4c17-b4ae-5cd136bb713f).
## Contact ## Contact
- If you want to get a hosted version of Planka, you can contact us via email contact@planka.cloud - If you want to get a hosted version of Planka, you can contact us via email contact@planka.cloud
@@ -42,7 +46,7 @@ We do NOT offer any public support via email, please use GitHub.
## Development ## Development
See the [development section](https://docs.planka.cloud/docs/Development). See the [development section](https://docs.planka.cloud/docs/category/development/).
## Tech stack ## Tech stack

View File

@@ -15,13 +15,13 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/) # Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.2.20 version: 0.2.25
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using. # follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes. # It is recommended to use it with quotes.
appVersion: "1.24.4" appVersion: "1.26.2"
dependencies: dependencies:
- alias: postgresql - alias: postgresql

View File

@@ -14,7 +14,7 @@ If you want to fully uninstall this chart including the data, follow [these step
## Usage ## Usage
If you just want to spin up an instance using help, please see [these docs](https://docs.planka.cloud/docs/installation/kubernetes/helm_chart/). If you want to make changes to the chart locally, and deploy them, see the below section. If you just want to spin up an instance using help, please see [these docs](https://docs.planka.cloud/docs/installation/kubernetes/helm-chart/). If you want to make changes to the chart locally, and deploy them, see the below section.
## Local Building and Using the Chart ## Local Building and Using the Chart

View File

@@ -148,7 +148,7 @@ persistence:
## ##
## --------------- ## ---------------
## NOTE: A minimal configuration requires setting `clientId`, `clientSecret` and `issuerUrl`. (plus `admin.roles` for administrators) ## NOTE: A minimal configuration requires setting `clientId`, `clientSecret` and `issuerUrl`. (plus `admin.roles` for administrators)
## ref: https://docs.planka.cloud/docs/Configuration/OIDC ## ref: https://docs.planka.cloud/docs/configuration/oidc/
## ##
oidc: oidc:
## @param oidc.enabled Enable single sign-on (SSO) with OpenID Connect (OIDC) ## @param oidc.enabled Enable single sign-on (SSO) with OpenID Connect (OIDC)

View File

@@ -20,7 +20,7 @@
"linkify-react": "^4.1.4", "linkify-react": "^4.1.4",
"linkifyjs": "^4.1.4", "linkifyjs": "^4.1.4",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"nanoid": "^5.0.8", "nanoid": "^5.0.9",
"node-sass": "^9.0.0", "node-sass": "^9.0.0",
"photoswipe": "^5.4.4", "photoswipe": "^5.4.4",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
@@ -61,7 +61,7 @@
"@testing-library/jest-dom": "^6.6.3", "@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^15.0.7", "@testing-library/react": "^15.0.7",
"@testing-library/user-event": "^14.5.2", "@testing-library/user-event": "^14.5.2",
"axios": "^1.6.2", "axios": "^1.8.2",
"babel-preset-airbnb": "^5.0.0", "babel-preset-airbnb": "^5.0.0",
"chai": "^4.5.0", "chai": "^4.5.0",
"eslint": "8.57.0", "eslint": "8.57.0",
@@ -435,23 +435,25 @@
} }
}, },
"node_modules/@babel/helpers": { "node_modules/@babel/helpers": {
"version": "7.26.0", "version": "7.26.10",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz",
"integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==",
"license": "MIT",
"dependencies": { "dependencies": {
"@babel/template": "^7.25.9", "@babel/template": "^7.26.9",
"@babel/types": "^7.26.0" "@babel/types": "^7.26.10"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.26.2", "version": "7.26.10",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz",
"integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==",
"license": "MIT",
"dependencies": { "dependencies": {
"@babel/types": "^7.26.0" "@babel/types": "^7.26.10"
}, },
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
@@ -1974,9 +1976,10 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.26.0", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
"integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
"license": "MIT",
"dependencies": { "dependencies": {
"regenerator-runtime": "^0.14.0" "regenerator-runtime": "^0.14.0"
}, },
@@ -1985,13 +1988,14 @@
} }
}, },
"node_modules/@babel/template": { "node_modules/@babel/template": {
"version": "7.25.9", "version": "7.26.9",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
"integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
"license": "MIT",
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.25.9", "@babel/code-frame": "^7.26.2",
"@babel/parser": "^7.25.9", "@babel/parser": "^7.26.9",
"@babel/types": "^7.25.9" "@babel/types": "^7.26.9"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@@ -2015,9 +2019,10 @@
} }
}, },
"node_modules/@babel/types": { "node_modules/@babel/types": {
"version": "7.26.0", "version": "7.26.10",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz",
"integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==",
"license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-string-parser": "^7.25.9", "@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.25.9" "@babel/helper-validator-identifier": "^7.25.9"
@@ -5565,10 +5570,11 @@
} }
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.7.7", "version": "1.8.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz",
"integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.6", "follow-redirects": "^1.15.6",
"form-data": "^4.0.0", "form-data": "^4.0.0",
@@ -8875,9 +8881,10 @@
} }
}, },
"node_modules/express": { "node_modules/express": {
"version": "4.21.1", "version": "4.21.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
"integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"license": "MIT",
"dependencies": { "dependencies": {
"accepts": "~1.3.8", "accepts": "~1.3.8",
"array-flatten": "1.1.1", "array-flatten": "1.1.1",
@@ -8898,7 +8905,7 @@
"methods": "~1.1.2", "methods": "~1.1.2",
"on-finished": "2.4.1", "on-finished": "2.4.1",
"parseurl": "~1.3.3", "parseurl": "~1.3.3",
"path-to-regexp": "0.1.10", "path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7", "proxy-addr": "~2.0.7",
"qs": "6.13.0", "qs": "6.13.0",
"range-parser": "~1.2.1", "range-parser": "~1.2.1",
@@ -8913,6 +8920,10 @@
}, },
"engines": { "engines": {
"node": ">= 0.10.0" "node": ">= 0.10.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
} }
}, },
"node_modules/express/node_modules/debug": { "node_modules/express/node_modules/debug": {
@@ -10271,9 +10282,10 @@
} }
}, },
"node_modules/http-proxy-middleware": { "node_modules/http-proxy-middleware": {
"version": "2.0.7", "version": "2.0.9",
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz",
"integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==",
"license": "MIT",
"dependencies": { "dependencies": {
"@types/http-proxy": "^1.17.8", "@types/http-proxy": "^1.17.8",
"http-proxy": "^1.18.1", "http-proxy": "^1.18.1",
@@ -13927,15 +13939,16 @@
"integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw=="
}, },
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "5.0.8", "version": "5.0.9",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.8.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz",
"integrity": "sha512-TcJPw+9RV9dibz1hHUzlLVy8N4X9TnwirAjrU08Juo6BNKggzVfP2ZJ/3ZUSq15Xl5i85i+Z89XBO90pB2PghQ==", "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
"url": "https://github.com/sponsors/ai" "url": "https://github.com/sponsors/ai"
} }
], ],
"license": "MIT",
"bin": { "bin": {
"nanoid": "bin/nanoid.js" "nanoid": "bin/nanoid.js"
}, },
@@ -14772,9 +14785,10 @@
} }
}, },
"node_modules/path-to-regexp": { "node_modules/path-to-regexp": {
"version": "0.1.10", "version": "0.1.12",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
"integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"license": "MIT"
}, },
"node_modules/path-type": { "node_modules/path-type": {
"version": "4.0.0", "version": "4.0.0",

4
client/package.json Executable file → Normal file
View File

@@ -74,7 +74,7 @@
"linkify-react": "^4.1.4", "linkify-react": "^4.1.4",
"linkifyjs": "^4.1.4", "linkifyjs": "^4.1.4",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"nanoid": "^5.0.8", "nanoid": "^5.0.9",
"node-sass": "^9.0.0", "node-sass": "^9.0.0",
"photoswipe": "^5.4.4", "photoswipe": "^5.4.4",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
@@ -115,7 +115,7 @@
"@testing-library/jest-dom": "^6.6.3", "@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^15.0.7", "@testing-library/react": "^15.0.7",
"@testing-library/user-event": "^14.5.2", "@testing-library/user-event": "^14.5.2",
"axios": "^1.6.2", "axios": "^1.8.2",
"babel-preset-airbnb": "^5.0.0", "babel-preset-airbnb": "^5.0.0",
"chai": "^4.5.0", "chai": "^4.5.0",
"eslint": "8.57.0", "eslint": "8.57.0",

View File

@@ -0,0 +1,52 @@
import classNames from 'classnames';
import camelCase from 'lodash/camelCase';
import upperFirst from 'lodash/upperFirst';
import PropTypes from 'prop-types';
import React from 'react';
import { Button } from 'semantic-ui-react';
import { useTranslation } from 'react-i18next';
import globalStyles from '../../styles.module.scss';
import styles from './ColorPicker.module.scss';
const ColorPicker = React.memo(({ current, onChange, colors, allowDeletion }) => {
const { t } = useTranslation();
return (
<>
<div className={styles.colorButtons}>
{colors.map((color) => (
<Button
key={color}
type="button"
name="color"
value={color}
className={classNames(
styles.colorButton,
color === current && styles.colorButtonActive,
globalStyles[`background${upperFirst(camelCase(color))}`],
)}
onClick={onChange}
/>
))}
</div>
{current && allowDeletion && (
<Button fluid value={undefined} onClick={onChange} content={t('action.removeColor')} />
)}
</>
);
});
ColorPicker.propTypes = {
current: PropTypes.string,
colors: PropTypes.arrayOf(PropTypes.string).isRequired,
onChange: PropTypes.func,
allowDeletion: PropTypes.bool,
};
ColorPicker.defaultProps = {
current: undefined,
onChange: undefined,
allowDeletion: false,
};
export default ColorPicker;

View File

@@ -0,0 +1,40 @@
:global(#app) {
.colorButton {
float: left;
height: 40px;
margin: 4px;
padding: 0;
position: relative;
width: 49.6px;
&:hover {
opacity: 0.9;
}
}
.colorButtonActive:before {
bottom: 3px;
color: #ffffff;
content: 'Г';
font-size: 18px;
line-height: 36px;
position: absolute;
right: 6px;
text-align: center;
text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
top: 0;
transform: rotate(-135deg);
width: 36px;
}
.colorButtons {
margin: -4px;
padding-bottom: 16px;
&:after {
content: '';
display: table;
clear: both;
}
}
}

View File

@@ -0,0 +1,3 @@
import ColorPicker from './ColorPicker';
export default ColorPicker;

View File

@@ -1,16 +1,12 @@
import upperFirst from 'lodash/upperFirst';
import camelCase from 'lodash/camelCase';
import React, { useEffect, useRef } from 'react'; import React, { useEffect, useRef } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classNames from 'classnames';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Button } from 'semantic-ui-react';
import { Input } from '../../lib/custom-ui'; import { Input } from '../../lib/custom-ui';
import LabelColors from '../../constants/LabelColors'; import LabelColors from '../../constants/LabelColors';
import ColorPicker from '../ColorPicker';
import styles from './Editor.module.scss'; import styles from './Editor.module.scss';
import globalStyles from '../../styles.module.scss';
const Editor = React.memo(({ data, onFieldChange }) => { const Editor = React.memo(({ data, onFieldChange }) => {
const [t] = useTranslation(); const [t] = useTranslation();
@@ -33,22 +29,7 @@ const Editor = React.memo(({ data, onFieldChange }) => {
onChange={onFieldChange} onChange={onFieldChange}
/> />
<div className={styles.text}>{t('common.color')}</div> <div className={styles.text}>{t('common.color')}</div>
<div className={styles.colorButtons}> <ColorPicker colors={LabelColors} current={data.color} onChange={onFieldChange} />
{LabelColors.map((color) => (
<Button
key={color}
type="button"
name="color"
value={color}
className={classNames(
styles.colorButton,
color === data.color && styles.colorButtonActive,
globalStyles[`background${upperFirst(camelCase(color))}`],
)}
onClick={onFieldChange}
/>
))}
</div>
</> </>
); );
}); });

View File

@@ -1,43 +1,4 @@
:global(#app) { :global(#app) {
.colorButton {
float: left;
height: 40px;
margin: 4px;
padding: 0;
position: relative;
width: 49.6px;
&:hover {
opacity: 0.9;
}
}
.colorButtonActive:before {
bottom: 3px;
color: #ffffff;
content: "Г";
font-size: 18px;
line-height: 36px;
position: absolute;
right: 6px;
text-align: center;
text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
top: 0;
transform: rotate(-135deg);
width: 36px;
}
.colorButtons {
margin: -4px;
padding-bottom: 16px;
&:after {
content: "";
display: table;
clear: both;
}
}
.field { .field {
margin-bottom: 8px; margin-bottom: 8px;
} }

View File

@@ -4,7 +4,9 @@ import { useTranslation } from 'react-i18next';
import { Menu } from 'semantic-ui-react'; import { Menu } from 'semantic-ui-react';
import { Popup } from '../../lib/custom-ui'; import { Popup } from '../../lib/custom-ui';
import ListColors from '../../constants/ListColors';
import { useSteps } from '../../hooks'; import { useSteps } from '../../hooks';
import ColorPicker from '../ColorPicker';
import ListSortStep from '../ListSortStep'; import ListSortStep from '../ListSortStep';
import DeleteStep from '../DeleteStep'; import DeleteStep from '../DeleteStep';
@@ -13,93 +15,123 @@ import styles from './ActionsStep.module.scss';
const StepTypes = { const StepTypes = {
DELETE: 'DELETE', DELETE: 'DELETE',
SORT: 'SORT', SORT: 'SORT',
EDIT_COLOR: 'CHANGE_COLOR',
}; };
const ActionsStep = React.memo(({ onNameEdit, onCardAdd, onSort, onDelete, onClose }) => { const ActionsStep = React.memo(
const [t] = useTranslation(); ({ onNameEdit, onCardAdd, onSort, onDelete, onClose, onColorEdit, color }) => {
const [step, openStep, handleBack] = useSteps(); const [t] = useTranslation();
const [step, openStep, handleBack] = useSteps();
const handleEditNameClick = useCallback(() => {
onNameEdit();
onClose();
}, [onNameEdit, onClose]);
const handleAddCardClick = useCallback(() => {
onCardAdd();
onClose();
}, [onCardAdd, onClose]);
const handleSortClick = useCallback(() => {
openStep(StepTypes.SORT);
}, [openStep]);
const handleDeleteClick = useCallback(() => {
openStep(StepTypes.DELETE);
}, [openStep]);
const handleSortTypeSelect = useCallback(
(type) => {
onSort({
type,
});
const handleEditNameClick = useCallback(() => {
onNameEdit();
onClose(); onClose();
}, }, [onNameEdit, onClose]);
[onSort, onClose],
);
if (step && step.type) { const handleAddCardClick = useCallback(() => {
switch (step.type) { onCardAdd();
case StepTypes.SORT: onClose();
return <ListSortStep onTypeSelect={handleSortTypeSelect} onBack={handleBack} />; }, [onCardAdd, onClose]);
case StepTypes.DELETE:
return ( const handleSortClick = useCallback(() => {
<DeleteStep openStep(StepTypes.SORT);
title="common.deleteList" }, [openStep]);
content="common.areYouSureYouWantToDeleteThisList"
buttonContent="action.deleteList" const handleDeleteClick = useCallback(() => {
onConfirm={onDelete} openStep(StepTypes.DELETE);
onBack={handleBack} }, [openStep]);
/>
); const hanndleEditColorClick = useCallback(() => {
default: openStep(StepTypes.EDIT_COLOR);
}, [openStep]);
const handleSortTypeSelect = useCallback(
(type) => {
onSort({
type,
});
onClose();
},
[onSort, onClose],
);
if (step && step.type) {
switch (step.type) {
case StepTypes.SORT:
return <ListSortStep onTypeSelect={handleSortTypeSelect} onBack={handleBack} />;
case StepTypes.DELETE:
return (
<DeleteStep
title="common.deleteList"
content="common.areYouSureYouWantToDeleteThisList"
buttonContent="action.deleteList"
onConfirm={onDelete}
onBack={handleBack}
/>
);
case StepTypes.EDIT_COLOR:
return (
<>
<Popup.Header onBack={handleBack}>
{t('action.editColor', {
context: 'title',
})}
</Popup.Header>
<Popup.Content>
<ColorPicker
colors={ListColors}
current={color}
allowDeletion
onChange={(e) => onColorEdit(e.currentTarget.value)}
/>
</Popup.Content>
</>
);
default:
}
} }
}
return ( return (
<> <>
<Popup.Header> <Popup.Header>
{t('common.listActions', { {t('common.listActions', {
context: 'title', context: 'title',
})} })}
</Popup.Header> </Popup.Header>
<Popup.Content> <Popup.Content>
<Menu secondary vertical className={styles.menu}> <Menu secondary vertical className={styles.menu}>
<Menu.Item className={styles.menuItem} onClick={handleEditNameClick}> <Menu.Item className={styles.menuItem} onClick={handleEditNameClick}>
{t('action.editTitle', { {t('action.editTitle', {
context: 'title', context: 'title',
})} })}
</Menu.Item> </Menu.Item>
<Menu.Item className={styles.menuItem} onClick={handleAddCardClick}> <Menu.Item className={styles.menuItem} onClick={hanndleEditColorClick}>
{t('action.addCard', { {t('action.editColor', {
context: 'title', context: 'title',
})} })}
</Menu.Item> </Menu.Item>
<Menu.Item className={styles.menuItem} onClick={handleSortClick}> <Menu.Item className={styles.menuItem} onClick={handleAddCardClick}>
{t('action.sortList', { {t('action.addCard', {
context: 'title', context: 'title',
})} })}
</Menu.Item> </Menu.Item>
<Menu.Item className={styles.menuItem} onClick={handleDeleteClick}> <Menu.Item className={styles.menuItem} onClick={handleSortClick}>
{t('action.deleteList', { {t('action.sortList', {
context: 'title', context: 'title',
})} })}
</Menu.Item> </Menu.Item>
</Menu> <Menu.Item className={styles.menuItem} onClick={handleDeleteClick}>
</Popup.Content> {t('action.deleteList', {
</> context: 'title',
); })}
}); </Menu.Item>
</Menu>
</Popup.Content>
</>
);
},
);
ActionsStep.propTypes = { ActionsStep.propTypes = {
onNameEdit: PropTypes.func.isRequired, onNameEdit: PropTypes.func.isRequired,
@@ -107,6 +139,12 @@ ActionsStep.propTypes = {
onDelete: PropTypes.func.isRequired, onDelete: PropTypes.func.isRequired,
onSort: PropTypes.func.isRequired, onSort: PropTypes.func.isRequired,
onClose: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired,
onColorEdit: PropTypes.func.isRequired,
color: PropTypes.string,
};
ActionsStep.defaultProps = {
color: undefined,
}; };
export default ActionsStep; export default ActionsStep;

View File

@@ -1,25 +1,29 @@
import React, { useCallback, useEffect, useRef, useState } from 'react'; import React, { useCallback, useEffect, useRef, useState } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import camelCase from 'lodash/camelCase';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import upperFirst from 'lodash/upperFirst';
import { Draggable, Droppable } from 'react-beautiful-dnd'; import { Draggable, Droppable } from 'react-beautiful-dnd';
import { Button, Icon } from 'semantic-ui-react'; import { Button, Icon } from 'semantic-ui-react';
import { usePopup } from '../../lib/popup'; import { usePopup } from '../../lib/popup';
import DroppableTypes from '../../constants/DroppableTypes'; import DroppableTypes from '../../constants/DroppableTypes';
import CardContainer from '../../containers/CardContainer'; import CardContainer from '../../containers/CardContainer';
import NameEdit from './NameEdit';
import CardAdd from './CardAdd'; import CardAdd from './CardAdd';
import NameEdit from './NameEdit';
import ActionsStep from './ActionsStep'; import ActionsStep from './ActionsStep';
import { ReactComponent as PlusMathIcon } from '../../assets/images/plus-math-icon.svg'; import { ReactComponent as PlusMathIcon } from '../../assets/images/plus-math-icon.svg';
import styles from './List.module.scss'; import styles from './List.module.scss';
import globalStyles from '../../styles.module.scss';
const List = React.memo( const List = React.memo(
({ ({
id, id,
index, index,
name, name,
color,
isPersisted, isPersisted,
cardIds, cardIds,
canEdit, canEdit,
@@ -49,6 +53,15 @@ const List = React.memo(
[onUpdate], [onUpdate],
); );
const handleColorEdit = useCallback(
(newColor) => {
onUpdate({
color: newColor,
});
},
[onUpdate],
);
const handleAddCardClick = useCallback(() => { const handleAddCardClick = useCallback(() => {
setIsAddCardOpened(true); setIsAddCardOpened(true);
}, []); }, []);
@@ -118,7 +131,18 @@ const List = React.memo(
onClick={handleHeaderClick} onClick={handleHeaderClick}
> >
<NameEdit ref={nameEdit} defaultValue={name} onUpdate={handleNameUpdate}> <NameEdit ref={nameEdit} defaultValue={name} onUpdate={handleNameUpdate}>
<div className={styles.headerName}>{name}</div> <div className={styles.headerName}>
{color && (
<Icon
name="circle"
className={classNames(
styles.headerNameColor,
globalStyles[`color${upperFirst(camelCase(color))}`],
)}
/>
)}
{name}
</div>
</NameEdit> </NameEdit>
{isPersisted && canEdit && ( {isPersisted && canEdit && (
<ActionsPopup <ActionsPopup
@@ -126,6 +150,8 @@ const List = React.memo(
onCardAdd={handleCardAdd} onCardAdd={handleCardAdd}
onDelete={onDelete} onDelete={onDelete}
onSort={onSort} onSort={onSort}
color={color}
onColorEdit={handleColorEdit}
> >
<Button className={classNames(styles.headerButton, styles.target)}> <Button className={classNames(styles.headerButton, styles.target)}>
<Icon fitted name="pencil" size="small" /> <Icon fitted name="pencil" size="small" />
@@ -140,7 +166,7 @@ const List = React.memo(
<button <button
type="button" type="button"
disabled={!isPersisted} disabled={!isPersisted}
className={classNames(styles.addCardButton)} className={styles.addCardButton}
onClick={handleAddCardClick} onClick={handleAddCardClick}
> >
<PlusMathIcon className={styles.addCardButtonIcon} /> <PlusMathIcon className={styles.addCardButtonIcon} />
@@ -161,6 +187,7 @@ List.propTypes = {
id: PropTypes.string.isRequired, id: PropTypes.string.isRequired,
index: PropTypes.number.isRequired, index: PropTypes.number.isRequired,
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
color: PropTypes.string,
isPersisted: PropTypes.bool.isRequired, isPersisted: PropTypes.bool.isRequired,
cardIds: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types cardIds: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types
canEdit: PropTypes.bool.isRequired, canEdit: PropTypes.bool.isRequired,
@@ -170,4 +197,8 @@ List.propTypes = {
onCardCreate: PropTypes.func.isRequired, onCardCreate: PropTypes.func.isRequired,
}; };
List.defaultProps = {
color: undefined,
};
export default List; export default List;

View File

@@ -127,6 +127,11 @@
word-break: break-word; word-break: break-word;
} }
.headerNameColor {
line-height: 1;
margin-right: 6px;
}
.innerWrapper { .innerWrapper {
margin-right: 8px; margin-right: 8px;
width: 272px; width: 272px;

View File

@@ -159,7 +159,6 @@ const Login = React.memo(
<div> <div>
{message && ( {message && (
<Message <Message
// eslint-disable-next-line react/jsx-props-no-spreading
{...{ {...{
[message.type]: true, [message.type]: true,
}} }}

View File

@@ -1,18 +1,15 @@
import { dequal } from 'dequal'; import { dequal } from 'dequal';
import upperFirst from 'lodash/upperFirst';
import camelCase from 'lodash/camelCase';
import React, { useCallback, useEffect, useRef } from 'react'; import React, { useCallback, useEffect, useRef } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classNames from 'classnames';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Button, Image } from 'semantic-ui-react'; import { Button, Image } from 'semantic-ui-react';
import { FilePicker } from '../../lib/custom-ui'; import { FilePicker } from '../../lib/custom-ui';
import ProjectBackgroundGradients from '../../constants/ProjectBackgroundGradients'; import ProjectBackgroundGradients from '../../constants/ProjectBackgroundGradients';
import { ProjectBackgroundTypes } from '../../constants/Enums'; import { ProjectBackgroundTypes } from '../../constants/Enums';
import ColorPicker from '../ColorPicker';
import styles from './BackgroundPane.module.scss'; import styles from './BackgroundPane.module.scss';
import globalStyles from '../../styles.module.scss';
const BackgroundPane = React.memo( const BackgroundPane = React.memo(
({ item, imageCoverUrl, isImageUpdating, onUpdate, onImageUpdate, onImageDelete }) => { ({ item, imageCoverUrl, isImageUpdating, onUpdate, onImageUpdate, onImageDelete }) => {
@@ -68,23 +65,11 @@ const BackgroundPane = React.memo(
return ( return (
<> <>
<div className={styles.gradientButtons}> <div className={styles.gradientButtons}>
{ProjectBackgroundGradients.map((gradient) => ( <ColorPicker
<Button colors={ProjectBackgroundGradients}
key={gradient} current={item?.name}
type="button" onChange={handleGradientClick}
name="gradient" />
value={gradient}
className={classNames(
styles.gradientButton,
item &&
item.type === ProjectBackgroundTypes.GRADIENT &&
gradient === item.name &&
styles.gradientButtonActive,
globalStyles[`background${upperFirst(camelCase(gradient))}`],
)}
onClick={handleGradientClick}
/>
))}
</div> </div>
{imageCoverUrl && ( {imageCoverUrl && (
// TODO: wrap in button // TODO: wrap in button

View File

@@ -0,0 +1,12 @@
export default [
'berry-red',
'pumpkin-orange',
'lagoon-blue',
'pink-tulip',
'light-mud',
'orange-peel',
'bright-moss',
'antique-blue',
'dark-granite',
'lagune-blue',
];

View File

@@ -11,7 +11,7 @@ const makeMapStateToProps = () => {
const selectCardIdsByListId = selectors.makeSelectCardIdsByListId(); const selectCardIdsByListId = selectors.makeSelectCardIdsByListId();
return (state, { id, index }) => { return (state, { id, index }) => {
const { name, isPersisted } = selectListById(state, id); const { name, color, isPersisted } = selectListById(state, id);
const cardIds = selectCardIdsByListId(state, id); const cardIds = selectCardIdsByListId(state, id);
const currentUserMembership = selectors.selectCurrentUserMembershipForCurrentBoard(state); const currentUserMembership = selectors.selectCurrentUserMembershipForCurrentBoard(state);
@@ -22,6 +22,7 @@ const makeMapStateToProps = () => {
id, id,
index, index,
name, name,
color,
isPersisted, isPersisted,
cardIds, cardIds,
canEdit: isCurrentUserEditor, canEdit: isCurrentUserEditor,

View File

@@ -4,17 +4,18 @@ export default {
dateFns, dateFns,
format: { format: {
date: 'd/M/yyyy', date: 'dd.MM.yyyy',
time: 'p', time: 'HH.mm',
dateTime: '$t(format:date) $t(format:time)', dateTime: '$t(format:date) $t(format:time)',
longDate: 'MMM d', longDate: 'd. MMM',
longDateTime: "MMMM d 'at' p", longDateTime: "d. MMMM 'kl.' HH:mm",
fullDate: 'MMM d, y', fullDate: 'd. MMM y',
fullDateTime: "MMMM d, y 'a' p", fullDateTime: "d. MMMM y 'kl.' HH:mm",
}, },
translation: { translation: {
common: { common: {
aboutPlanka: 'Om Planka',
account: 'Konto', account: 'Konto',
actions: 'Handlinger', actions: 'Handlinger',
addAttachment_title: 'Vedhæft fil', addAttachment_title: 'Vedhæft fil',
@@ -25,94 +26,113 @@ export default {
administrator: 'Administrator', administrator: 'Administrator',
all: 'Alle', all: 'Alle',
allChangesWillBeAutomaticallySavedAfterConnectionRestored: allChangesWillBeAutomaticallySavedAfterConnectionRestored:
'Alle ændringer vil automatisk blive gemt<br />ved genforbindelse.', 'Alle ændringer vil automatisk blive gemt<br />ved genoprettelse af forbindelsen.',
areYouSureYouWantToDeleteThisAttachment: 'Vil du slette den vedhæftede fil?', areYouSureYouWantToDeleteThisAttachment:
areYouSureYouWantToDeleteThisBoard: 'Vil du slette dette bræt?', 'Er du sikker på at du vil slette denne vedhæftede fil?',
areYouSureYouWantToDeleteThisCard: 'Vil du slette dette kort?', areYouSureYouWantToDeleteThisBoard: 'Er du sikker på at du vil slette denne tavle?',
areYouSureYouWantToDeleteThisComment: 'Vil du slette denne kommentar?', areYouSureYouWantToDeleteThisCard: 'Er du sikker på at du vil slette dette kort?',
areYouSureYouWantToDeleteThisLabel: 'Vil du slette dette mærkat?', areYouSureYouWantToDeleteThisComment: 'Er du sikker på at du vil slette denne kommentar?',
areYouSureYouWantToDeleteThisList: 'Vil du slette denne liste?', areYouSureYouWantToDeleteThisLabel: 'Er du sikker på at du vil slette denne label?',
areYouSureYouWantToDeleteThisProject: 'Vil du slette dette projekt?', areYouSureYouWantToDeleteThisList: 'Er du sikker på at du vil slette denne liste?',
areYouSureYouWantToDeleteThisTask: 'Vil du slette denne opgave?', areYouSureYouWantToDeleteThisProject: 'Er du sikker på at du vil slette dette projekt?',
areYouSureYouWantToDeleteThisUser: 'Vil du slette denne bruger?', areYouSureYouWantToDeleteThisTask: 'Er du sikker på at du vil slette denne opgave?',
areYouSureYouWantToLeaveBoard: 'Vil du forlade dette bræt?', areYouSureYouWantToDeleteThisUser: 'Er du sikker på at du vil slette denne bruger?',
areYouSureYouWantToLeaveProject: 'Vil du forlade dette projekt?', areYouSureYouWantToLeaveBoard: 'Er du sikker på at du vil forlade denne tavle?',
areYouSureYouWantToLeaveProject: 'Er du sikker på at du vil forlade dette projekt?',
areYouSureYouWantToRemoveThisManagerFromProject: areYouSureYouWantToRemoveThisManagerFromProject:
'Vil du slette denne projektleder fra projektet?', 'Er du sikker på at du vil fjerne denne projektleder fra projektet?',
areYouSureYouWantToRemoveThisMemberFromBoard: 'Vil du slette dette medlem fra projektet?', areYouSureYouWantToRemoveThisMemberFromBoard:
attachment: 'Vedhæftede fil', 'Er du sikker på at du vil fjerne dette medlem fra tavlen?',
attachment: 'Vedhæft fil',
attachments: 'Vedhæftede filer', attachments: 'Vedhæftede filer',
authentication: 'Brugervalidering', authentication: 'Autentificering',
background: 'Baggrundsbillede', background: 'Baggrundsbillede',
board: 'Bræt', board: 'Tavle',
boardNotFound_title: 'Bræt ikke fundet', boardNotFound_title: 'Tavle ikke fundet',
canComment: 'Kan kommentere',
canEditContentOfBoard: 'Kan redigere indholdet af denne tavle.',
canOnlyViewBoard: 'Kan kun se denne tavle.',
cardActions_title: 'Korthandlinger', cardActions_title: 'Korthandlinger',
cardNotFound_title: 'Kort ikke fundet', cardNotFound_title: 'Kort ikke fundet',
cardOrActionAreDeleted: 'Kort eller handling er slettet.', cardOrActionAreDeleted: 'Kort eller handling er slettet.',
color: 'Farve', color: 'Farve',
createBoard_title: 'Opret bræt', copy_inline: 'kopier',
createLabel_title: 'Opret mærkat', createBoard_title: 'Opret tavle',
createNewOneOrSelectExistingOne: 'Lav en ny eller marker<br />en eksisterende.', createLabel_title: 'Opret label',
createNewOneOrSelectExistingOne: 'Lav en ny eller vælg<br />en eksisterende.',
createProject_title: 'Opret projekt', createProject_title: 'Opret projekt',
createTextFile_title: 'Opret tekstfil', createTextFile_title: 'Opret tekstfil',
currentPassword: 'Nuværende løsen', currentPassword: 'Nuværende adgangskode',
dangerZone_title: 'Farligt afsnit', dangerZone_title: 'Farezone',
date: 'Dato', date: 'Dato',
dueDate_title: 'Afleveringsfrist', dueDate: 'Frist',
deleteAttachment_title: 'Slet vedhæftning', dueDate_title: 'Frist',
deleteBoard_title: 'Slet bræt', deleteAttachment_title: 'Fjern vedhæftning',
deleteBoard_title: 'Slet tavle',
deleteCard_title: 'Slet kort', deleteCard_title: 'Slet kort',
deleteComment_title: 'Slet kommentar', deleteComment_title: 'Slet kommentar',
deleteLabel_title: 'Slet mærkat', deleteLabel_title: 'Slet label',
deleteList_title: 'Slet liste', deleteList_title: 'Slet liste',
deleteProject_title: 'Slet projekt', deleteProject_title: 'Slet projekt',
deleteTask_title: 'Slet opgave', deleteTask_title: 'Slet opgave',
deleteUser_title: 'Slet bruger', deleteUser_title: 'Slet bruger',
description: 'Beskrivelsen', description: 'Beskrivelse',
dropFileToUpload: 'Slip fil for at dele', detectAutomatically: 'Registrer automatisk',
editAttachment_title: 'Ændre vedhæftning', dropFileToUpload: 'Slip fil for at uploade',
editAvatar_title: 'Ændre profilbillede', editor: 'Redaktør',
editBoard_title: 'Ændre bræt', editAttachment_title: 'Rediger vedhæftning',
editDueDate_title: 'Ændre afleveringsfrist', editAvatar_title: 'Rediger profilbillede',
editEmail_title: 'Ændre E-mail', editBoard_title: 'Rediger tavle',
editLabel_title: 'ændre mærkat', editDueDate_title: 'Rediger frist',
editPassword_title: 'Ændre løsen', editEmail_title: 'Rediger E-mail',
editStopwatch_title: 'Ændre timer', editInformation_title: 'Rediger information',
editUsername_title: 'Ændre brugernavn', editLabel_title: 'Rediger label',
editPassword_title: 'Skift adgangskode',
editPermissions_title: 'Rediger tilladelser',
editStopwatch_title: 'Rediger stopur',
editUsername_title: 'Rediger brugernavn',
email: 'E-mail', email: 'E-mail',
emailAlreadyInUse: 'E-mail allerede i brug', emailAlreadyInUse: 'E-mail allerede i brug',
enterCardTitle: 'Angiv kortets overskrift...', enterCardTitle: 'Angiv kortets overskrift... [Ctrl+Enter] for at auto-åbne',
enterDescription: 'Angiv beskrivelsen...', enterDescription: 'Angiv beskrivelsen...',
enterFilename: 'Angiv filnavn', enterFilename: 'Angiv filnavn',
enterListTitle: 'Angiv listens overskrift...', enterListTitle: 'Angiv listens overskrift...',
enterProjectTitle: 'Angiv projektets titel', enterProjectTitle: 'Angiv projektets titel',
enterTaskDescription: 'Angiv opgavens beskrivelse...', enterTaskDescription: 'Angiv opgavens beskrivelse...',
filterByLabels_title: 'Filtrer på mærkater', filterByLabels_title: 'Filtrer labels',
filterByMembers_title: 'Filtrer medlemmer', filterByMembers_title: 'Filtrer medlemmer',
fromComputer_title: 'Fra computer', fromComputer_title: 'Fra computer',
fromTrello: 'Fra Trello',
general: 'Generelt', general: 'Generelt',
hours: 'Timer', hours: 'Timer',
invalidCurrentPassword: 'Nuværende adgangskode are ugyldig', importBoard_title: 'Importer tavle',
labels: 'Mærkater', invalidCurrentPassword: 'Nuværende adgangskode er ugyldig',
leaveBoard_title: 'Forlad bræt', labels: 'Labels',
language: 'Sprog',
leaveBoard_title: 'Forlad tavle',
leaveProject_title: 'Forlad projekt', leaveProject_title: 'Forlad projekt',
linkIsCopied: 'Link er kopieret',
list: 'Liste', list: 'Liste',
listActions_title: 'Listens handlinger', listActions_title: 'Listehandlinger',
managers: 'Projektledere', managers: 'Projektledere',
managerActions_title: 'Projektlederhandlinger',
members: 'Medlemmer', members: 'Medlemmer',
memberActions_title: 'Medlemshandlinger',
minutes: 'Minutter', minutes: 'Minutter',
moveCard_title: 'Flyt kort', moveCard_title: 'Flyt kort',
name: 'Navn', name: 'Navn',
newestFirst: 'Nyeste først',
newEmail: 'Ny e-mail', newEmail: 'Ny e-mail',
newPassword: 'Nyt løsen', newPassword: 'Ny adgangskode',
newUsername: 'Nyt brugernavn', newUsername: 'Nyt brugernavn',
noConnectionToServer: 'Ingen forbindelse til serveren', noConnectionToServer: 'Ingen forbindelse til serveren',
noBoards: 'Ingen brædder', noBoards: 'Ingen tavler',
noLists: 'Ingen lister', noLists: 'Ingen lister',
noProjects: 'Ingen projekter', noProjects: 'Ingen projekter',
notifications: 'Notifikationer', notifications: 'Notifikationer',
noUnreadNotifications: 'Ingen ulæste notifikationer.', noUnreadNotifications: 'Ingen ulæste notifikationer.',
openBoard_title: 'Åben bræt', oldestFirst: 'Ældste først',
openBoard_title: 'Åbn tavle',
optional_inline: 'valgfri', optional_inline: 'valgfri',
organization: 'Organisation', organization: 'Organisation',
phone: 'Telefon', phone: 'Telefon',
@@ -120,18 +140,26 @@ export default {
pressPasteShortcutToAddAttachmentFromClipboard: pressPasteShortcutToAddAttachmentFromClipboard:
'Tip: Tryk Ctrl-V (Cmd-V på Mac) for at vedhæfte direkte fra udklipsholder.', 'Tip: Tryk Ctrl-V (Cmd-V på Mac) for at vedhæfte direkte fra udklipsholder.',
project: 'Projekt', project: 'Projekt',
projectNotFound_title: 'Projekt ej fundet', projectNotFound_title: 'Projekt ikke fundet',
removeManager_title: 'Fjern projektleder', removeManager_title: 'Fjern projektleder',
removeMember_title: 'Fjern medlem', removeMember_title: 'Fjern medlem',
searchLabels: 'Søg efter labels...',
searchMembers: 'Søg efter medlemmer...',
searchUsers: 'Søg efter brugere...',
searchCards: 'Søg efter kort...',
seconds: 'Sekunder', seconds: 'Sekunder',
selectBoard: 'Vælg bræt', selectBoard: 'Vælg tavle',
selectList: 'Vælg liste', selectList: 'Vælg liste',
selectPermissions_title: 'Vælg tilladelser',
selectProject: 'Vælg projekt', selectProject: 'Vælg projekt',
settings: 'Indstillinger', settings: 'Indstillinger',
stopwatch: 'Tidsmåler', sortList_title: 'Sortér liste',
stopwatch: 'Stopur',
subscribeToMyOwnCardsByDefault: 'Abonnér på egne kort som standard', subscribeToMyOwnCardsByDefault: 'Abonnér på egne kort som standard',
taskActions_title: 'Opgave handlinger', taskActions_title: 'Opgave handlinger',
tasks: 'Opgaver', tasks: 'Opgaver',
thereIsNoPreviewAvailableForThisAttachment:
'Der er ingen forhåndsvisning tilgængelig for denne vedhæftning',
time: 'Tid', time: 'Tid',
title: 'Overskrift', title: 'Overskrift',
userActions_title: 'Brugerhandlinger', userActions_title: 'Brugerhandlinger',
@@ -144,6 +172,8 @@ export default {
username: 'Brugernavn', username: 'Brugernavn',
usernameAlreadyInUse: 'Brugernavn allerede i brug', usernameAlreadyInUse: 'Brugernavn allerede i brug',
users: 'Brugere', users: 'Brugere',
version: 'Version',
viewer: 'Læser',
writeComment: 'Skriv en kommentar...', writeComment: 'Skriv en kommentar...',
}, },
@@ -155,24 +185,26 @@ export default {
addCard_title: 'Tilføj kort', addCard_title: 'Tilføj kort',
addComment: 'Tilføj kommentar', addComment: 'Tilføj kommentar',
addList: 'Tilføj liste', addList: 'Tilføj liste',
addMember: 'Tilføj medlem',
addMoreDetailedDescription: 'Tilføj en uddybende beskrivelse', addMoreDetailedDescription: 'Tilføj en uddybende beskrivelse',
addTask: 'Tilføj opgave', addTask: 'Tilføj opgave',
addToCard: 'Tilføj til kort', addToCard: 'Tilføj til kort',
addUser: 'Tilføj bruger', addUser: 'Tilføj bruger',
createBoard: 'Opret bræt', copyLink_title: 'Kopier link',
createBoard: 'Opret tavle',
createFile: 'Opret fil', createFile: 'Opret fil',
createLabel: 'Opret mærkat', createLabel: 'Opret label',
createNewLabel: 'Opret nyt mærkat', createNewLabel: 'Opret ny label',
createProject: 'Opret projekt', createProject: 'Opret projekt',
delete: 'Slet', delete: 'Slet',
deleteAttachment: 'Slet vedhæftning', deleteAttachment: 'Slet vedhæftning',
deleteAvatar: 'Slet profilbillede', deleteAvatar: 'Slet profilbillede',
deleteBoard: 'Slet bræt', deleteBoard: 'Slet tavle',
deleteCard: 'Slet kort', deleteCard: 'Slet kort',
deleteCard_title: 'Slet kort', deleteCard_title: 'Slet kort',
deleteComment: 'Slet kommentar', deleteComment: 'Slet kommentar',
deleteImage: 'Slet profilbillede', deleteImage: 'Slet billede',
deleteLabel: 'Slet mærkat', deleteLabel: 'Slet label',
deleteList: 'Slet liste', deleteList: 'Slet liste',
deleteList_title: 'Slet liste', deleteList_title: 'Slet liste',
deleteNotifications: 'Slet notifikationer', deleteNotifications: 'Slet notifikationer',
@@ -181,30 +213,40 @@ export default {
deleteTask: 'Slet opgave', deleteTask: 'Slet opgave',
deleteTask_title: 'Slet opgave', deleteTask_title: 'Slet opgave',
deleteUser: 'Slet bruger', deleteUser: 'Slet bruger',
edit: 'Ændre', duplicate: 'Duplikér',
editDueDate_title: 'Ændre afleveringsfrist', duplicateCard_title: 'Duplikér kort',
editDescription_title: 'Ændre beskrivelse', edit: 'Rediger',
editEmail_title: 'Ændre e-mail', editColor_title: 'Rediger farve',
editPassword_title: 'Ændre Løsen', editDueDate_title: 'Rediger frist',
editStopwatch_title: 'Ændre tidstager', editDescription_title: 'Rediger beskrivelse',
editTitle_title: 'Ændre overskrift', editEmail_title: 'Rediger e-mail',
editUsername_title: 'Ændre brugernavn', editInformation_title: 'Rediger information',
leaveBoard: 'Forlad bræt', editPassword_title: 'Skift adgangskode',
editPermissions: 'Rediger tilladelser',
editStopwatch_title: 'Rediger stopur',
editTitle_title: 'Rediger overskrift',
editUsername_title: 'Rediger brugernavn',
hideDetails: 'Skjul detaljer',
import: 'Importer',
leaveBoard: 'Forlad tavle',
leaveProject: 'Forlad projekt', leaveProject: 'Forlad projekt',
logOut_title: 'Log ', logOut_title: 'Log ud',
makeCover_title: 'Gør til fremhævet billede', makeCover_title: 'Gør til coverbillede',
move: 'Flyt', move: 'Flyt',
moveCard_title: 'Flyt kort', moveCard_title: 'Flyt kort',
remove: 'Fjern', remove: 'Fjern',
removeBackground: 'Fjern baggrundsbillede', removeBackground: 'Fjern baggrund',
removeCover_title: 'Fjern fremhævet billede', removeColor: 'Fjern farve',
removeFromBoard: 'Fjern fra bræt', removeCover_title: 'Fjern som coverbillede',
removeFromBoard: 'Fjern fra tavle',
removeFromProject: 'Fjern fra projekt', removeFromProject: 'Fjern fra projekt',
removeManager: 'Fjern projektleder', removeManager: 'Fjern projektleder',
removeMember: 'Fjern medlem', removeMember: 'Fjern medlem',
save: 'Gem ændringer', save: 'Gem ændringer',
showAllAttachments: 'Vis alle vedhæftninger ({{hidden}} skjulte)', showAllAttachments: 'Vis alle vedhæftninger ({{hidden}} skjulte)',
showDetails: 'Vis detaljer',
showFewerAttachments: 'Vis færre vedhæftninger', showFewerAttachments: 'Vis færre vedhæftninger',
sortList_title: 'Sortér liste',
start: 'Start', start: 'Start',
stop: 'Stop', stop: 'Stop',
subscribe: 'Abonnér', subscribe: 'Abonnér',

View File

@@ -3,11 +3,11 @@ export default {
common: { common: {
emailOrUsername: 'E-mail eller brugernavn', emailOrUsername: 'E-mail eller brugernavn',
invalidEmailOrUsername: 'Ugyldig e-mail eller brugernavn', invalidEmailOrUsername: 'Ugyldig e-mail eller brugernavn',
invalidPassword: 'Ugyldig løsen', invalidPassword: 'Ugyldig adgangskode',
logInToPlanka: 'Log på Planka', logInToPlanka: 'Log på Planka',
noInternetConnection: 'Ingen forbindelse til internettet', noInternetConnection: 'Ingen forbindelse til internettet',
pageNotFound_title: 'Side ej fundet', pageNotFound_title: 'Side ikke fundet',
password: 'Løsen', password: 'Adgangskode',
projectManagement: 'Projektstyring', projectManagement: 'Projektstyring',
serverConnectionFailed: 'Ingen forbindelse til serveren', serverConnectionFailed: 'Ingen forbindelse til serveren',
unknownError: 'Ukendt fejl - prøv igen', unknownError: 'Ukendt fejl - prøv igen',

View File

@@ -15,6 +15,7 @@ export default {
translation: { translation: {
common: { common: {
aboutPlanka: 'Über Planka',
account: 'Konto', account: 'Konto',
actions: 'Aktionen', actions: 'Aktionen',
addAttachment_title: 'Anhang hinzufügen', addAttachment_title: 'Anhang hinzufügen',
@@ -51,10 +52,14 @@ export default {
background: 'Hintergrund', background: 'Hintergrund',
board: 'Board', board: 'Board',
boardNotFound_title: 'Board nicht gefunden', boardNotFound_title: 'Board nicht gefunden',
canComment: 'Kann kommentieren',
canEditContentOfBoard: 'Kann den Inhalt des Boards bearbeiten.',
canOnlyViewBoard: 'Kann das Board nur ansehen.',
cardActions_title: 'Kartenaktionen', cardActions_title: 'Kartenaktionen',
cardNotFound_title: 'Karte nicht gefunden', cardNotFound_title: 'Karte nicht gefunden',
cardOrActionAreDeleted: 'Karte oder Aktion wurden gelöscht.', cardOrActionAreDeleted: 'Karte oder Aktion wurden gelöscht.',
color: 'Farbe', color: 'Farbe',
copy_inline: 'kopieren',
createBoard_title: 'Board erstellen', createBoard_title: 'Board erstellen',
createLabel_title: 'Label erstellen', createLabel_title: 'Label erstellen',
createNewOneOrSelectExistingOne: createNewOneOrSelectExistingOne:
@@ -64,6 +69,7 @@ export default {
currentPassword: 'Derzeitiges Passwort', currentPassword: 'Derzeitiges Passwort',
dangerZone_title: 'Gefährlicher Bereich', dangerZone_title: 'Gefährlicher Bereich',
date: 'Datum', date: 'Datum',
dueDate: 'Fälligkeitsdatum',
dueDate_title: 'Fälligkeitsdatum', dueDate_title: 'Fälligkeitsdatum',
deleteAttachment_title: 'Anhang löschen', deleteAttachment_title: 'Anhang löschen',
deleteBoard_title: 'Board löschen', deleteBoard_title: 'Board löschen',
@@ -77,13 +83,16 @@ export default {
description: 'Beschreibung', description: 'Beschreibung',
detectAutomatically: 'Automatische Erkennung', detectAutomatically: 'Automatische Erkennung',
dropFileToUpload: 'Datei ablegen, um sie hochzuladen', dropFileToUpload: 'Datei ablegen, um sie hochzuladen',
editor: 'Bearbeiter',
editAttachment_title: 'Anhang bearbieten', editAttachment_title: 'Anhang bearbieten',
editAvatar_title: 'Avatar bearbeiten', editAvatar_title: 'Avatar bearbeiten',
editBoard_title: 'Board bearbeiten', editBoard_title: 'Board bearbeiten',
editDueDate_title: 'Fälligkeitsdatum bearbeiten', editDueDate_title: 'Fälligkeitsdatum bearbeiten',
editEmail_title: 'E-Mail-Adresse bearbeiten', editEmail_title: 'E-Mail-Adresse bearbeiten',
editInformation_title: 'Informationen bearbeiten',
editLabel_title: 'Label bearbeiten', editLabel_title: 'Label bearbeiten',
editPassword_title: 'Passwort ändern', editPassword_title: 'Passwort ändern',
editPermissions_title: 'Berechtigungen bearbeiten',
editStopwatch_title: 'Stoppuhr bearbeiten', editStopwatch_title: 'Stoppuhr bearbeiten',
editUsername_title: 'Benutzername ändern', editUsername_title: 'Benutzername ändern',
email: 'E-Mail-Adresse', email: 'E-Mail-Adresse',
@@ -97,8 +106,10 @@ export default {
filterByLabels_title: 'Nach Label filtern', filterByLabels_title: 'Nach Label filtern',
filterByMembers_title: 'Nach Mitgliedern filtern', filterByMembers_title: 'Nach Mitgliedern filtern',
fromComputer_title: 'Vom Computer', fromComputer_title: 'Vom Computer',
fromTrello: 'Von Trello',
general: 'Allgemein', general: 'Allgemein',
hours: 'Stunden', hours: 'Stunden',
importBoard_title: 'Board importieren',
invalidCurrentPassword: 'Das aktuelle Passwort ist falsch', invalidCurrentPassword: 'Das aktuelle Passwort ist falsch',
labels: 'Labels', labels: 'Labels',
language: 'Sprache', language: 'Sprache',
@@ -108,10 +119,13 @@ export default {
list: 'Listen', list: 'Listen',
listActions_title: 'Aufgaben auflisten', listActions_title: 'Aufgaben auflisten',
managers: 'Manager', managers: 'Manager',
managerActions_title: 'Manager-Aktionen',
members: 'Mitglieder', members: 'Mitglieder',
memberActions_title: 'Mitglieder-Aktionen',
minutes: 'Minuten', minutes: 'Minuten',
moveCard_title: 'Karte verschieben', moveCard_title: 'Karte verschieben',
name: 'Name', name: 'Name',
newestFirst: 'Neueste zuerst',
newEmail: 'Neue E-Mail-Adresse', newEmail: 'Neue E-Mail-Adresse',
newPassword: 'Neues Passwort', newPassword: 'Neues Passwort',
newUsername: 'Neuer Benutzername', newUsername: 'Neuer Benutzername',
@@ -121,6 +135,7 @@ export default {
noProjects: 'Keine Projekte', noProjects: 'Keine Projekte',
notifications: 'Benachrichtigungen', notifications: 'Benachrichtigungen',
noUnreadNotifications: 'Keine ungelesenen Benachrichtigungen.', noUnreadNotifications: 'Keine ungelesenen Benachrichtigungen.',
oldestFirst: 'Älteste zuerst',
openBoard_title: 'Board öffnen', openBoard_title: 'Board öffnen',
optional_inline: 'Optional', optional_inline: 'Optional',
organization: 'Organisation', organization: 'Organisation',
@@ -132,11 +147,17 @@ export default {
projectNotFound_title: 'Projekt nicht gefunden', projectNotFound_title: 'Projekt nicht gefunden',
removeManager_title: 'Manager entfernen', removeManager_title: 'Manager entfernen',
removeMember_title: 'Mitglied entfernen', removeMember_title: 'Mitglied entfernen',
searchLabels: 'Labels suchen...',
searchMembers: 'Mitglieder suchen...',
searchUsers: 'Benutzer suchen...',
searchCards: 'Karten durchsuchen...',
seconds: 'Sekunden', seconds: 'Sekunden',
selectBoard: 'Board auswählen', selectBoard: 'Board auswählen',
selectList: 'Liste auswählen', selectList: 'Liste auswählen',
selectPermissions_title: 'Berechtigungen auswählen',
selectProject: 'Projekt auswählen', selectProject: 'Projekt auswählen',
settings: 'Einstellungen', settings: 'Einstellungen',
sortList_title: 'Liste sortieren',
stopwatch: 'Stoppuhr', stopwatch: 'Stoppuhr',
subscribeToMyOwnCardsByDefault: 'Standardmäßig meine eigenen Karten abonnieren', subscribeToMyOwnCardsByDefault: 'Standardmäßig meine eigenen Karten abonnieren',
taskActions_title: 'Aufgabenaktionen', taskActions_title: 'Aufgabenaktionen',
@@ -155,6 +176,8 @@ export default {
username: 'Benutzername', username: 'Benutzername',
usernameAlreadyInUse: 'Benutzername wird bereits verwendet', usernameAlreadyInUse: 'Benutzername wird bereits verwendet',
users: 'Benutzer', users: 'Benutzer',
version: 'Version',
viewer: 'Betrachter',
writeComment: 'Kommentar verfassen...', writeComment: 'Kommentar verfassen...',
}, },
@@ -166,6 +189,7 @@ export default {
addCard_title: 'Karte hinzufügen', addCard_title: 'Karte hinzufügen',
addComment: 'Kommentar hinzufügen', addComment: 'Kommentar hinzufügen',
addList: 'Liste hinzufügen', addList: 'Liste hinzufügen',
addMember: 'Mitglied hinzufügen',
addMoreDetailedDescription: 'Eine detaillierte Beschreibung hinzufügen', addMoreDetailedDescription: 'Eine detaillierte Beschreibung hinzufügen',
addTask: 'Aufgabe hinzufügen', addTask: 'Aufgabe hinzufügen',
addToCard: 'Zu Karte hinzufügen', addToCard: 'Zu Karte hinzufügen',
@@ -196,14 +220,18 @@ export default {
duplicate: 'Kopieren', duplicate: 'Kopieren',
duplicateCard_title: 'Karte kopieren', duplicateCard_title: 'Karte kopieren',
edit: 'Bearbeiten', edit: 'Bearbeiten',
editColor_title: 'Farbe ändern',
editDueDate_title: 'Fälligkeitsdatum bearbeiten', editDueDate_title: 'Fälligkeitsdatum bearbeiten',
editDescription_title: 'Beschreibung ändern', editDescription_title: 'Beschreibung ändern',
editEmail_title: 'E-Mail-Adresse bearbeiten', editEmail_title: 'E-Mail-Adresse bearbeiten',
editInformation_title: 'Informationen bearbeiten',
editPassword_title: 'Passwort ändern', editPassword_title: 'Passwort ändern',
editPermissions: 'Berechtigungen bearbeiten',
editStopwatch_title: 'Stoppuhr bearbeiten', editStopwatch_title: 'Stoppuhr bearbeiten',
editTitle_title: 'Titel bearbeiten', editTitle_title: 'Titel bearbeiten',
editUsername_title: 'Benutzername ändern', editUsername_title: 'Benutzername ändern',
hideDetails: 'Details ausblenden', hideDetails: 'Details ausblenden',
import: 'Import',
leaveBoard: 'Board verlassen', leaveBoard: 'Board verlassen',
leaveProject: 'Projekt verlassen', leaveProject: 'Projekt verlassen',
logOut_title: 'Ausloggen', logOut_title: 'Ausloggen',
@@ -212,6 +240,7 @@ export default {
moveCard_title: 'Karte bewegen', moveCard_title: 'Karte bewegen',
remove: 'Löschen', remove: 'Löschen',
removeBackground: 'Hintergrund löschen', removeBackground: 'Hintergrund löschen',
removeColor: 'Farbe löschen',
removeCover_title: 'Vorschau löschen', removeCover_title: 'Vorschau löschen',
removeFromBoard: 'Vom Board entfernen', removeFromBoard: 'Vom Board entfernen',
removeFromProject: 'Vom Projekt entfernen', removeFromProject: 'Vom Projekt entfernen',
@@ -221,6 +250,7 @@ export default {
showAllAttachments: 'Alle Anhänge anzeigen ({{hidden}} versteckt)', showAllAttachments: 'Alle Anhänge anzeigen ({{hidden}} versteckt)',
showDetails: 'Details anzeigen', showDetails: 'Details anzeigen',
showFewerAttachments: 'Weniger Anhänge anzeigen', showFewerAttachments: 'Weniger Anhänge anzeigen',
sortList_title: 'Liste sortieren',
start: 'Start', start: 'Start',
stop: 'Stopp', stop: 'Stopp',
subscribe: 'Abonnieren', subscribe: 'Abonnieren',

View File

@@ -214,6 +214,7 @@ export default {
duplicate: 'Duplicate', duplicate: 'Duplicate',
duplicateCard_title: 'Duplicate Card', duplicateCard_title: 'Duplicate Card',
edit: 'Edit', edit: 'Edit',
editColor_title: 'Edit Color',
editDueDate_title: 'Edit Due Date', editDueDate_title: 'Edit Due Date',
editDescription_title: 'Edit Description', editDescription_title: 'Edit Description',
editEmail_title: 'Edit E-mail', editEmail_title: 'Edit E-mail',
@@ -233,6 +234,7 @@ export default {
moveCard_title: 'Move Card', moveCard_title: 'Move Card',
remove: 'Remove', remove: 'Remove',
removeBackground: 'Remove background', removeBackground: 'Remove background',
removeColor: 'Remove color',
removeCover_title: 'Remove Cover', removeCover_title: 'Remove Cover',
removeFromBoard: 'Remove from board', removeFromBoard: 'Remove from board',
removeFromProject: 'Remove from project', removeFromProject: 'Remove from project',

View File

@@ -210,6 +210,7 @@ export default {
duplicate: 'Duplicate', duplicate: 'Duplicate',
duplicateCard_title: 'Duplicate Card', duplicateCard_title: 'Duplicate Card',
edit: 'Edit', edit: 'Edit',
editColor_title: 'Edit Color',
editDueDate_title: 'Edit Due Date', editDueDate_title: 'Edit Due Date',
editDescription_title: 'Edit Description', editDescription_title: 'Edit Description',
editEmail_title: 'Edit E-mail', editEmail_title: 'Edit E-mail',
@@ -229,6 +230,7 @@ export default {
moveCard_title: 'Move Card', moveCard_title: 'Move Card',
remove: 'Remove', remove: 'Remove',
removeBackground: 'Remove background', removeBackground: 'Remove background',
removeColor: 'Remove color',
removeCover_title: 'Remove Cover', removeCover_title: 'Remove Cover',
removeFromBoard: 'Remove from board', removeFromBoard: 'Remove from board',
removeFromProject: 'Remove from project', removeFromProject: 'Remove from project',

View File

@@ -27,21 +27,22 @@ export default {
all: 'Tout', all: 'Tout',
allChangesWillBeAutomaticallySavedAfterConnectionRestored: allChangesWillBeAutomaticallySavedAfterConnectionRestored:
'Toutes les modifications seront automatiquement enregistrées<br />une fois la connexion rétablie.', 'Toutes les modifications seront automatiquement enregistrées<br />une fois la connexion rétablie.',
areYouSureYouWantToDeleteThisAttachment: 'Voulez-vous vraiment supprimer cette pièce jointe?', areYouSureYouWantToDeleteThisAttachment:
areYouSureYouWantToDeleteThisBoard: 'Êtes-vous sûr de vouloir supprimer ce tableau?', 'Êtes-vous sûr de vouloir supprimer cette pièce jointe ?',
areYouSureYouWantToDeleteThisCard: 'Voulez-vous vraiment supprimer cette carte?', areYouSureYouWantToDeleteThisBoard: 'Êtes-vous sûr de vouloir supprimer ce tableau ?',
areYouSureYouWantToDeleteThisComment: 'Êtes-vous sûr de vouloir supprimer ce commentaire?', areYouSureYouWantToDeleteThisCard: 'Êtes-vous sûr de vouloir supprimer cette carte ?',
areYouSureYouWantToDeleteThisLabel: 'Voulez-vous vraiment supprimer cette étiquette?', areYouSureYouWantToDeleteThisComment: 'Êtes-vous sûr de vouloir supprimer ce commentaire ?',
areYouSureYouWantToDeleteThisList: 'Êtes-vous sûr de vouloir supprimer cette liste?', areYouSureYouWantToDeleteThisLabel: 'Êtes-vous sûr de vouloir supprimer cette étiquette ?',
areYouSureYouWantToDeleteThisProject: 'Êtes-vous sûr de vouloir supprimer ce projet?', areYouSureYouWantToDeleteThisList: 'Êtes-vous sûr de vouloir supprimer cette liste ?',
areYouSureYouWantToDeleteThisTask: 'Êtes-vous sûr de vouloir supprimer cette tâche?', areYouSureYouWantToDeleteThisProject: 'Êtes-vous sûr de vouloir supprimer ce projet ?',
areYouSureYouWantToDeleteThisUser: 'Êtes-vous sûr de vouloir supprimer cet utilisateur?', areYouSureYouWantToDeleteThisTask: 'Êtes-vous sûr de vouloir supprimer cette tâche ?',
areYouSureYouWantToDeleteThisUser: 'Êtes-vous sûr de vouloir supprimer cet utilisateur ?',
areYouSureYouWantToLeaveBoard: 'Êtes-vous sûr de vouloir quitter ce tableau ?', areYouSureYouWantToLeaveBoard: 'Êtes-vous sûr de vouloir quitter ce tableau ?',
areYouSureYouWantToLeaveProject: 'Êtes-vous sûr de vouloir quitter ce projet ?', areYouSureYouWantToLeaveProject: 'Êtes-vous sûr de vouloir quitter ce projet ?',
areYouSureYouWantToRemoveThisManagerFromProject: areYouSureYouWantToRemoveThisManagerFromProject:
'Êtes-vous sûr de vouloir supprimer ce manager du projet ?', 'Êtes-vous sûr de vouloir supprimer ce manager du projet ?',
areYouSureYouWantToRemoveThisMemberFromProject: areYouSureYouWantToRemoveThisMemberFromBoard:
'Êtes-vous sûr de vouloir supprimer ce membre du projet?', 'Êtes-vous sûr de vouloir supprimer ce membre du tableau ?',
attachment: 'Pièce jointe', attachment: 'Pièce jointe',
attachments: 'Pièces jointes', attachments: 'Pièces jointes',
authentication: 'Authentification', authentication: 'Authentification',
@@ -49,11 +50,11 @@ export default {
board: 'Tableau', board: 'Tableau',
boardNotFound_title: 'Carte non trouvée', boardNotFound_title: 'Carte non trouvée',
canComment: 'Peut commenter', canComment: 'Peut commenter',
canEditContentOfBoard: 'Peut éditer le contenu du tableau.', canEditContentOfBoard: 'Peut éditer le contenu du tableau',
canOnlyViewBoard: 'Peut uniquement voir le tableau.', canOnlyViewBoard: 'Peut uniquement voir le tableau',
cardActions_title: 'Actions sur la carte', cardActions_title: 'Actions sur la carte',
cardNotFound_title: 'Carte non trouvée', cardNotFound_title: 'Carte non trouvée',
cardOrActionAreDeleted: "La carte ou l'action sont supprimées.", cardOrActionAreDeleted: "La carte ou l'action est supprimée.",
color: 'Couleur', color: 'Couleur',
copy_inline: 'copie', copy_inline: 'copie',
createBoard_title: 'Créer un tableau', createBoard_title: 'Créer un tableau',
@@ -80,10 +81,10 @@ export default {
dropFileToUpload: 'Déposer le fichier à télécharger', dropFileToUpload: 'Déposer le fichier à télécharger',
editor: 'Éditeur', editor: 'Éditeur',
editAttachment_title: 'Modifier la pièce jointe', editAttachment_title: 'Modifier la pièce jointe',
editAvatar_title: 'Modifier Avatar', editAvatar_title: "Modifier l'avatar",
editBoard_title: 'Modifier le tableau', editBoard_title: 'Modifier le tableau',
editDueDate_title: "Modifier la date d'échéance", editDueDate_title: "Modifier la date d'échéance",
editEmail_title: "Modifier l'email", editEmail_title: "Modifier l'e-mail",
editInformation_title: 'Modifier les informations', editInformation_title: 'Modifier les informations',
editLabel_title: "Modifier l'étiquette", editLabel_title: "Modifier l'étiquette",
editPassword_title: 'Modifier le mot de passe', editPassword_title: 'Modifier le mot de passe',
@@ -91,8 +92,8 @@ export default {
editStopwatch_title: 'Modifier la minuterie', editStopwatch_title: 'Modifier la minuterie',
editUsername_title: "Modifier le nom d'utilisateur", editUsername_title: "Modifier le nom d'utilisateur",
email: 'E-mail', email: 'E-mail',
emailAlreadyInUse: 'Email déjà utilisé', emailAlreadyInUse: 'E-mail déjà utilisé',
enterCardTitle: 'Saisir le titre de la carte... [Ctrl+Enter] pour ouvrir automatiquement', enterCardTitle: 'Saisir le titre de la carte... [Ctrl+Entrée] pour ouvrir automatiquement',
enterDescription: 'Saisir la description...', enterDescription: 'Saisir la description...',
enterFilename: 'Saisir le nom du fichier', enterFilename: 'Saisir le nom du fichier',
enterListTitle: 'Saisie le titre de la liste...', enterListTitle: 'Saisie le titre de la liste...',
@@ -121,13 +122,13 @@ export default {
moveCard_title: 'Déplacer la carte', moveCard_title: 'Déplacer la carte',
name: 'Nom', name: 'Nom',
newestFirst: 'Le plus récent en premier', newestFirst: 'Le plus récent en premier',
newEmail: 'Nouveau email', newEmail: 'Nouvel e-mail',
newPassword: 'Nouveau mot de passe', newPassword: 'Nouveau mot de passe',
newUsername: "Nouveau nom d'utilisateur", newUsername: "Nouveau nom d'utilisateur",
noConnectionToServer: 'Pas de connexion au serveur', noConnectionToServer: 'Pas de connexion au serveur',
noBoards: 'Pas de tableau', noBoards: 'Pas de tableau',
noLists: 'Pas de listes', noLists: 'Pas de liste',
noProjects: 'Pas de projets', noProjects: 'Pas de projet',
notifications: 'Notifications', notifications: 'Notifications',
noUnreadNotifications: 'Aucune notification non lue.', noUnreadNotifications: 'Aucune notification non lue.',
oldestFirst: 'Le plus ancien en premier', oldestFirst: 'Le plus ancien en premier',
@@ -154,11 +155,11 @@ export default {
settings: 'Réglages', settings: 'Réglages',
sortList_title: 'Trier la liste', sortList_title: 'Trier la liste',
stopwatch: 'Minuteur', stopwatch: 'Minuteur',
subscribeToMyOwnCardsByDefault: 'Abonnez-vous à mes propres cartes par défaut', subscribeToMyOwnCardsByDefault: "M'abonner à mes propres cartes par défaut",
taskActions_title: 'Actions de tâche', taskActions_title: 'Actions de tâche',
tasks: 'Tâches', tasks: 'Tâches',
thereIsNoPreviewAvailableForThisAttachment: thereIsNoPreviewAvailableForThisAttachment:
"Il n'y a pas de prévisualisation de disponible pour cette pièce jointe.", "Il n'y a pas d'aperçu disponible pour cette pièce jointe.",
time: 'Temps', time: 'Temps',
title: 'Titre', title: 'Titre',
userActions_title: "Actions de l'utilisateur", userActions_title: "Actions de l'utilisateur",
@@ -216,9 +217,10 @@ export default {
duplicate: 'Dupliquer', duplicate: 'Dupliquer',
duplicateCard_title: 'Dupliquer la carte', duplicateCard_title: 'Dupliquer la carte',
edit: 'Modifier', edit: 'Modifier',
editColor_title: 'Modifier la couleur',
editDueDate_title: "Modifier la date d'échéance", editDueDate_title: "Modifier la date d'échéance",
editDescription_title: 'Modifier la description', editDescription_title: 'Modifier la description',
editEmail_title: "Modifier l'email", editEmail_title: "Modifier l'e-mail",
editInformation_title: 'Modifier les informations', editInformation_title: 'Modifier les informations',
editPassword_title: 'Modifier le mot de passe', editPassword_title: 'Modifier le mot de passe',
editPermissions: 'Modifier les permissions', editPermissions: 'Modifier les permissions',
@@ -230,13 +232,14 @@ export default {
leaveBoard: 'Quitter le tableau', leaveBoard: 'Quitter le tableau',
leaveProject: 'Quitter le projet', leaveProject: 'Quitter le projet',
logOut_title: 'Se déconnecter', logOut_title: 'Se déconnecter',
makeCover_title: 'Faire la jaquette', makeCover_title: 'Faire la couverture',
move: 'Déplacer', move: 'Déplacer',
moveCard_title: 'Déplacer la carte', moveCard_title: 'Déplacer la carte',
remove: 'Supprimer', remove: 'Supprimer',
removeBackground: "Supprimer l'arrière-plan", removeBackground: "Supprimer l'arrière-plan",
removeCover_title: 'Supprimer la jaquette', removeColor: 'Supprimer la couleur',
removeFromBoard: 'Supprimer le tableau', removeCover_title: 'Supprimer la couverture',
removeFromBoard: 'Supprimer du tableau',
removeFromProject: 'Supprimer du projet', removeFromProject: 'Supprimer du projet',
removeManager: 'Supprimer le manager', removeManager: 'Supprimer le manager',
removeMember: 'Supprimer le membre', removeMember: 'Supprimer le membre',
@@ -245,7 +248,7 @@ export default {
showDetails: 'Afficher les détails', showDetails: 'Afficher les détails',
showFewerAttachments: 'Afficher moins de pièces jointes', showFewerAttachments: 'Afficher moins de pièces jointes',
sortList_title: 'Trier la liste', sortList_title: 'Trier la liste',
start: 'Début', start: 'Commencer',
stop: 'Arrêter', stop: 'Arrêter',
subscribe: "S'abonner", subscribe: "S'abonner",
unsubscribe: 'Se désabonner', unsubscribe: 'Se désabonner',

View File

@@ -1,16 +1,16 @@
export default { export default {
translation: { translation: {
common: { common: {
emailOrUsername: "Email ou nom d'utilisateur", emailOrUsername: "E-mail ou nom d'utilisateur",
invalidEmailOrUsername: "Email ou nom d'utilisateur invalide", invalidEmailOrUsername: "E-mail ou nom d'utilisateur invalide",
invalidCredentials: 'Identifiants invalides', invalidCredentials: 'Identifiants invalides',
invalidPassword: 'Mot de passe invalide', invalidPassword: 'Mot de passe invalide',
logInToPlanka: 'Se connecter à Planka', logInToPlanka: 'Se connecter à Planka',
noInternetConnection: 'Aucune connection internet', noInternetConnection: 'Aucune connexion Internet',
pageNotFound_title: 'Page non trouvée', pageNotFound_title: 'Page non trouvée',
password: 'Mot de passe', password: 'Mot de passe',
projectManagement: 'Gestion de projet', projectManagement: 'Gestion de projet',
serverConnectionFailed: 'Connection au serveur échouée', serverConnectionFailed: 'Échec de la connexion au serveur',
unknownError: 'Erreur inconnue, réessayez plus tard', unknownError: 'Erreur inconnue, réessayez plus tard',
useSingleSignOn: "Utiliser l'authentification unique", useSingleSignOn: "Utiliser l'authentification unique",
}, },

View File

@@ -4,64 +4,65 @@ export default {
dateFns, dateFns,
format: { format: {
date: 'yyyy/M/d', date: 'yyyy년 M월 d일',
time: 'a hh시 mm분', time: 'a h시 m분',
dateTime: '$t(format:date) $t(format:time)', dateTime: '$t(format:date) $t(format:time)',
longDate: "MMMMd'일'", longDate: 'M월 d일',
longDateTime: "MMMMd'일 ' a hh시 mm분", longDateTime: 'M월 d일 a h시 m분',
fullDate: 'yyyy년M월d일', fullDate: 'yyyy년 M월 d일',
fullDateTime: 'yyyy년M월d일 a hh시 mm분', fullDateTime: 'yyyy년 M월 d일 a h시 m분',
}, },
translation: { translation: {
common: { common: {
aboutPlanka: 'Planka에 대해서', aboutPlanka: 'Planka 소개',
account: '계정', account: '계정',
actions: '활동', actions: '작업',
addAttachment_title: '첨부 파일 추가', addAttachment_title: '첨부 파일 추가',
addComment: '댓글', addComment: '댓글 추가',
addManager_title: '매니저 추가', addManager_title: '관리자 추가',
addMember_title: '멤버 추가', addMember_title: '멤버 추가',
addUser_title: '사용자 추가', addUser_title: '사용자 추가',
administrator: '관리자', administrator: '관리자',
all: '모두', all: '전체',
allChangesWillBeAutomaticallySavedAfterConnectionRestored: allChangesWillBeAutomaticallySavedAfterConnectionRestored:
'연결이 복되면<br />모든 변경 사항이 자동으로 저장됩니다.', '연결이 복되면 모든 변경 사항이 자동으로 저장됩니다.',
areYouSureYouWantToDeleteThisAttachment: '해당하는 첨부 파일을 삭제하시겠습니까?', areYouSureYouWantToDeleteThisAttachment: ' 첨부 파일을 삭제하시겠습니까?',
areYouSureYouWantToDeleteThisBoard: '해당하는 보드를 삭제하시겠습니까?', areYouSureYouWantToDeleteThisBoard: ' 보드를 삭제하시겠습니까?',
areYouSureYouWantToDeleteThisCard: '해당하는 항목카드를 삭제하시겠습니까?', areYouSureYouWantToDeleteThisCard: '카드를 삭제하시겠습니까?',
areYouSureYouWantToDeleteThisComment: '해당하는 댓글을 삭제하시겠습니까?', areYouSureYouWantToDeleteThisComment: ' 댓글을 삭제하시겠습니까?',
areYouSureYouWantToDeleteThisLabel: '해당하는 라벨을 삭제하시겠습니까?', areYouSureYouWantToDeleteThisLabel: ' 라벨을 삭제하시겠습니까?',
areYouSureYouWantToDeleteThisList: '해당하는 목록 삭제하시겠습니까?', areYouSureYouWantToDeleteThisList: ' 목록 삭제하시겠습니까?',
areYouSureYouWantToDeleteThisProject: '해당하는 프로젝트를 삭제하시겠습니까?', areYouSureYouWantToDeleteThisProject: ' 프로젝트를 삭제하시겠습니까?',
areYouSureYouWantToDeleteThisTask: '해당하는 업무를 삭제하겠습니까?', areYouSureYouWantToDeleteThisTask: '이 작업을 삭제하겠습니까?',
areYouSureYouWantToDeleteThisUser: '해당하는 사용자를 삭제하겠습니까?', areYouSureYouWantToDeleteThisUser: ' 사용자를 삭제하겠습니까?',
areYouSureYouWantToLeaveBoard: '이 보드에서 나가시겠습니까?', areYouSureYouWantToLeaveBoard: '이 보드를 떠나시겠습니까?',
areYouSureYouWantToLeaveProject: '이 프로젝트에서 나가시겠습니까?', areYouSureYouWantToLeaveProject: '이 프로젝트를 떠나시겠습니까?',
areYouSureYouWantToRemoveThisManagerFromProject: areYouSureYouWantToRemoveThisManagerFromProject: '이 관리자를 프로젝트에서 제거하시겠습니까?',
'해당하는 프로젝트에서 매니저를 제거하시겠습니까?', areYouSureYouWantToRemoveThisMemberFromBoard: '이 멤버를 보드에서 제거하시겠습니까?',
areYouSureYouWantToRemoveThisMemberFromBoard: '해당하는 멤버를 보드에서 삭제하시겠습니까?', attachment: '첨부 파일',
attachment: '첨부', attachments: '첨부 파일들',
attachments: '첨부 파일',
authentication: '인증', authentication: '인증',
background: '배경', background: '배경',
board: '보드', board: '보드',
boardNotFound_title: '보드를 찾을 수 없습니다', boardNotFound_title: '보드를 찾을 수 없',
canComment: '댓글 작성할 수 있습니다', canComment: '댓글 작성 가능',
canEditContentOfBoard: '보드 콘텐츠를 수정할 수 있습니다.', canEditContentOfBoard: '보드의 내용을 편집할 수 있습니다.',
canOnlyViewBoard: '보드를 기만 할 수 있습니다.', canOnlyViewBoard: '보드를 기만 할 수 있습니다.',
cardActions_title: '카드 작업', cardActions_title: '카드 작업',
cardNotFound_title: '카드를 찾을 수 없습니다', cardNotFound_title: '카드를 찾을 수 없',
cardOrActionAreDeleted: '카드 또는 작업이 삭제되었습니다.', cardOrActionAreDeleted: '카드 또는 작업이 삭제되었습니다.',
color: '색상', color: '색상',
copy_inline: '복사',
createBoard_title: '보드 생성', createBoard_title: '보드 생성',
createLabel_title: '라벨 생성', createLabel_title: '라벨 생성',
createNewOneOrSelectExistingOne: '새로 생성하거나<br />기존 항목을 선택하세요.', createNewOneOrSelectExistingOne: '새로 만들거나 기존 을 선택하세요.',
createProject_title: '프로젝트 생성', createProject_title: '프로젝트 생성',
createTextFile_title: '텍스트 파일 생성', createTextFile_title: '텍스트 파일 생성',
currentPassword: '현재 비밀번호', currentPassword: '현재 비밀번호',
dangerZone_title: '위험 구역', dangerZone_title: '위험 구역',
date: '날짜', date: '날짜',
dueDate: '마감일',
dueDate_title: '마감일', dueDate_title: '마감일',
deleteAttachment_title: '첨부 파일 삭제', deleteAttachment_title: '첨부 파일 삭제',
deleteBoard_title: '보드 삭제', deleteBoard_title: '보드 삭제',
@@ -70,122 +71,130 @@ export default {
deleteLabel_title: '라벨 삭제', deleteLabel_title: '라벨 삭제',
deleteList_title: '목록 삭제', deleteList_title: '목록 삭제',
deleteProject_title: '프로젝트 삭제', deleteProject_title: '프로젝트 삭제',
deleteTask_title: '업 삭제', deleteTask_title: '업 삭제',
deleteUser_title: '사용자 삭제', deleteUser_title: '사용자 삭제',
description: '설명', description: '설명',
detectAutomatically: '자동으로 감지', detectAutomatically: '자동 감지',
dropFileToUpload: '업로드할 파일 놓기', dropFileToUpload: '업로드할 파일을 드롭하세요',
editor: '편집기', editor: '편집기',
editAttachment_title: '첨부 수정', editAttachment_title: '첨부 파일 편집',
editAvatar_title: '아바타 수정', editAvatar_title: '아바타 편집',
editBoard_title: '보드 수정', editBoard_title: '보드 편집',
editDueDate_title: '마감일 수정', editDueDate_title: '마감일 편집',
editEmail_title: '이메일 수정', editEmail_title: '이메일 편집',
editInformation_title: '정보 수정', editInformation_title: '정보 편집',
editLabel_title: '라벨 수정', editLabel_title: '라벨 편집',
editPassword_title: '비밀번호 수정', editPassword_title: '비밀번호 편집',
editPermissions_title: '권한 수정', editPermissions_title: '권한 편집',
editStopwatch_title: '스톱워치 수정', editStopwatch_title: '스톱워치 편집',
editUsername_title: '사용자 이름 수정', editUsername_title: '사용자 이름 편집',
email: '이메일', email: '이메일',
emailAlreadyInUse: '이미 사용 중인 이메일입니다', emailAlreadyInUse: '이미 사용 중인 이메일',
enterCardTitle: '카드 제목 입력... [Ctrl+Enter]로 자동으로 열 수 있습니다.', enterCardTitle: '카드 제목 입력... [Ctrl+Enter]로 자동 열기.',
enterDescription: '설명 입력...', enterDescription: '설명 입력...',
enterFilename: '파일 이름 입력', enterFilename: '파일 이름 입력',
enterListTitle: '목록 제목 입력...', enterListTitle: '목록 제목 입력...',
enterProjectTitle: '프로젝트 제목 입력', enterProjectTitle: '프로젝트 제목 입력',
enterTaskDescription: '업 설명 입력...', enterTaskDescription: '업 설명 입력...',
filterByLabels_title: '라벨 필터링', filterByLabels_title: '라벨 필터링',
filterByMembers_title: '멤버 필터링', filterByMembers_title: '멤버 필터링',
fromComputer_title: 'PC에서', fromComputer_title: '컴퓨터에서',
fromTrello: '트렐로에서', fromTrello: 'Trello에서',
general: '일반', general: '일반',
hours: '시', hours: '시',
importBoard_title: '보드 가져오기', importBoard_title: '보드 가져오기',
invalidCurrentPassword: '현재 비밀번호가 일치하지 않습니다', invalidCurrentPassword: '잘못된 현재 비밀번호',
labels: '라벨', labels: '라벨',
language: '언어', language: '언어',
leaveBoard_title: '보드 떠나기', leaveBoard_title: '보드 떠나기',
leaveProject_title: '프로젝트 떠나기', leaveProject_title: '프로젝트 떠나기',
linkIsCopied: '링크가 복사되었습니다',
list: '목록', list: '목록',
listActions_title: '목록 항목 조율', listActions_title: '목록 작업',
managers: '매니저', managers: '관리자',
managerActions_title: '관리자 작업',
members: '멤버', members: '멤버',
memberActions_title: '멤버 작업',
minutes: '분', minutes: '분',
moveCard_title: '카드 옮기기', moveCard_title: '카드 이동',
name: '이름', name: '이름',
newEmail: '새로운 이메일', newestFirst: '최신순',
newPassword: '새로운 비밀번호', newEmail: '새 이메일',
newUsername: '새로운 사용자 이름', newPassword: '새 비밀번호',
noConnectionToServer: '서버에 연결할 수 없습니다', newUsername: '새 사용자 이름',
noBoards: '보드가 존재하지 않습니다', noConnectionToServer: '서버에 연결되지 않음',
noLists: '목록이 존재하지 않습니다', noBoards: '보드 없음',
noProjects: '프로젝트가 존재하지 않습니다', noLists: '목록 없음',
noProjects: '프로젝트 없음',
notifications: '알림', notifications: '알림',
noUnreadNotifications: '확인하지 않은 알림습니다.', noUnreadNotifications: '지 않은 알림 없.',
oldestFirst: '오래된 순',
openBoard_title: '보드 열기', openBoard_title: '보드 열기',
optional_inline: '옵션', optional_inline: '선택 사항',
organization: '조직', organization: '조직',
phone: '전화번호', phone: '전화',
preferences: '환경설정', preferences: '환경 설정',
pressPasteShortcutToAddAttachmentFromClipboard: pressPasteShortcutToAddAttachmentFromClipboard:
'팁: 클립보드에서 첨부 파일을 추가하려면 Ctrl-V (Mac의 경우 Cmd-V)를 누릅니다.', '팁: Ctrl-V (Mac에서는 Cmd-V)를 눌러 클립보드에서 첨부 파일을 추가하세요.',
project: '프로젝트', project: '프로젝트',
projectNotFound_title: '프로젝트를 찾을 수 없습니다', projectNotFound_title: '프로젝트를 찾을 수 없',
removeManager_title: '매니저 삭제', removeManager_title: '관리자 제거',
removeMember_title: '멤버 제', removeMember_title: '멤버 제',
searchLabels: '라벨 검색...', searchLabels: '라벨 검색...',
searchMembers: '멤버 검색...', searchMembers: '멤버 검색...',
searchUsers: '사용자 검색...', searchUsers: '사용자 검색...',
searchCards: '카드 검색...',
seconds: '초', seconds: '초',
selectBoard: '보드 선택', selectBoard: '보드 선택',
selectList: '목록 선택', selectList: '목록 선택',
selectPermissions_title: '권한 선택', selectPermissions_title: '권한 선택',
selectProject: '프로젝트 선택', selectProject: '프로젝트 선택',
settings: '설정', settings: '설정',
sortList_title: '목록 정렬',
stopwatch: '스톱워치', stopwatch: '스톱워치',
subscribeToMyOwnCardsByDefault: '기본적으로 내 카드 구독합니다', subscribeToMyOwnCardsByDefault: '기본적으로 내 카드 구독',
taskActions_title: '업무 조율', taskActions_title: '작업 작업',
tasks: '업무', tasks: '작업들',
thereIsNoPreviewAvailableForThisAttachment: '이 첨부 파일은 미리 보기를 사용할 수 없습니다.', thereIsNoPreviewAvailableForThisAttachment:
'이 첨부 파일에 대한 미리보기를 사용할 수 없습니다.',
time: '시간', time: '시간',
title: '제목', title: '제목',
userActions_title: '사용자 조율', userActions_title: '사용자 작업',
userAddedThisCardToList: '<0>{{user}}</0>님이 <1>{{list}}에 카드를 추가했습니다</1>', userAddedThisCardToList: '<0>{{user}}</0><1>님이 이 카드를 {{list}}에 추가했습니다</1>',
userLeftNewCommentToCard: userLeftNewCommentToCard: '{{user}}님이 <2>{{card}}</2>에 새 댓글 «{{comment}}»을 남겼습니다',
'{{user}}님이 <2>{{card}}</2>에 «{{comment}}»라는 댓글을 남겼습니다',
userMovedCardFromListToList: userMovedCardFromListToList:
'{{user}}님이 {{fromList}}에서 {{toList}}로 <2>{{card}}</2>를 옮겼습니다', '{{user}}님이 <2>{{card}}</2>를 {{fromList}}에서 {{toList}}로 이동했습니다',
userMovedThisCardFromListToList: userMovedThisCardFromListToList:
'<0>{{user}}</0><1> 님이 {{fromList}}에서 {{toList}}로 이 카드를 옮겼습니다</1>', '<0>{{user}}</0><1>님이 이 카드를 {{fromList}}에서 {{toList}}로 이동했습니다</1>',
username: '사용자 이름', username: '사용자 이름',
usernameAlreadyInUse: '이미 사용중인 사용자 이름입니다', usernameAlreadyInUse: '이미 사용 중인 사용자 이름',
users: '사용자', users: '사용자',
version: '버전', version: '버전',
viewer: '열람자', viewer: '뷰어',
writeComment: '댓글 쓰기...', writeComment: '댓글 작성...',
}, },
action: { action: {
addAnotherCard: '다른 카드 추가', addAnotherCard: '카드 추가',
addAnotherList: '다른 목록 추가', addAnotherList: '목록 추가',
addAnotherTask: '다른 업무 추가', addAnotherTask: '작업 추가',
addCard: '카드 추가', addCard: '카드 추가',
addCard_title: '카드 추가', addCard_title: '카드 추가',
addComment: '댓글 추가', addComment: '댓글 추가',
addList: '목록 추가', addList: '목록 추가',
addMember: '멤버 추가', addMember: '멤버 추가',
addMoreDetailedDescription: '자세한 설명 추가', addMoreDetailedDescription: '자세한 설명 추가',
addTask: '업 추가', addTask: '업 추가',
addToCard: '카드에 추가', addToCard: '카드에 추가',
addUser: '사용자 추가', addUser: '사용자 추가',
copyLink_title: '링크 복사',
createBoard: '보드 생성', createBoard: '보드 생성',
createFile: '파일 생성', createFile: '파일 생성',
createLabel: '라벨 생성', createLabel: '라벨 생성',
createNewLabel: '새로운 라벨 생성', createNewLabel: '새 라벨 생성',
createProject: '프로젝트 생성', createProject: '프로젝트 생성',
delete: '삭제', delete: '삭제',
deleteAttachment: '첨부 삭제', deleteAttachment: '첨부 파일 삭제',
deleteAvatar: '아바타 삭제', deleteAvatar: '아바타 삭제',
deleteBoard: '보드 삭제', deleteBoard: '보드 삭제',
deleteCard: '카드 삭제', deleteCard: '카드 삭제',
@@ -195,47 +204,52 @@ export default {
deleteLabel: '라벨 삭제', deleteLabel: '라벨 삭제',
deleteList: '목록 삭제', deleteList: '목록 삭제',
deleteList_title: '목록 삭제', deleteList_title: '목록 삭제',
deleteNotifications: 'Dismiss all', deleteNotifications: '모두 해제',
deleteProject: '프로젝트 삭제', deleteProject: '프로젝트 삭제',
deleteProject_title: '프로젝트 삭제', deleteProject_title: '프로젝트 삭제',
deleteTask: '업 삭제', deleteTask: '업 삭제',
deleteTask_title: '업 삭제', deleteTask_title: '업 삭제',
deleteUser: '사용자 삭제', deleteUser: '사용자 삭제',
edit: '수정', duplicate: '복제',
editDueDate_title: '마감일 수정', duplicateCard_title: '카드 복제',
editDescription_title: '설명 수정', edit: '편집',
editEmail_title: '이메일 수정', editColor_title: '색상 편집',
editInformation_title: '정보 수정', editDueDate_title: '마감일 편집',
editPassword_title: '비밀번호 수정', editDescription_title: '설명 편집',
editPermissions: '권한 수정', editEmail_title: '이메일 편집',
editStopwatch_title: '스톱워치 수정', editInformation_title: '정보 편집',
editTitle_title: '제목 수정', editPassword_title: '비밀번호 편집',
editUsername_title: '사용자 이름 수정', editPermissions: '권한 편집',
editStopwatch_title: '스톱워치 편집',
editTitle_title: '제목 편집',
editUsername_title: '사용자 이름 편집',
hideDetails: '세부 사항 숨기기', hideDetails: '세부 사항 숨기기',
import: '가져오기', import: '가져오기',
leaveBoard: '보드 나기', leaveBoard: '보드 나기',
leaveProject: '프로젝트 나기', leaveProject: '프로젝트 나기',
logOut_title: '로그아웃', logOut_title: '로그아웃',
makeCover_title: '커버 만들기', makeCover_title: '커버 만들기',
move: '이동', move: '이동',
moveCard_title: '카드 이동', moveCard_title: '카드 이동',
remove: '제거', remove: '제거',
removeBackground: '배경 제거', removeBackground: '배경 제거',
removeColor: '색상 제거',
removeCover_title: '커버 제거', removeCover_title: '커버 제거',
removeFromBoard: '보드 제거', removeFromBoard: '보드에서 제거',
removeFromProject: '프로젝트 제거', removeFromProject: '프로젝트에서 제거',
removeManager: '매니저 제거', removeManager: '관리자 제거',
removeMember: '멤버 제거', removeMember: '멤버 제거',
save: '저장', save: '저장',
showAllAttachments: '모든 첨부 파일 표시 ({{hidden}} 숨겨짐)', showAllAttachments: '모든 첨부 파일 보기 ({{hidden}} 숨)',
showDetails: '세부 사항 표시', showDetails: '세부 사항 보기',
showFewerAttachments: '일부 첨부 파일만 표시', showFewerAttachments: '첨부 파일 적게 보기',
sortList_title: '목록 정렬',
start: '시작', start: '시작',
stop: '종료', stop: '중지',
subscribe: '구독', subscribe: '구독',
unsubscribe: '구독 취소', unsubscribe: '구독 취소',
uploadNewAvatar: '새로운 아바타 업로드', uploadNewAvatar: '새 아바타 업로드',
uploadNewImage: '새로운 이미지 업로드', uploadNewImage: '새 이미지 업로드',
}, },
}, },
}; };

View File

@@ -1,22 +1,23 @@
export default { export default {
translation: { translation: {
common: { common: {
emailOrUsername: '이메일 혹은 사용자 이름', emailOrUsername: '이메일 또는 사용자 이름',
invalidEmailOrUsername: '이메일 혹은 사용자 이름이 유효하지 않습니다', invalidEmailOrUsername: '잘못된 이메일 또는 사용자 이름',
invalidPassword: '유효하지 않은 비밀번호', invalidCredentials: '잘못된 자격 증명',
invalidPassword: '잘못된 비밀번호',
logInToPlanka: 'Planka에 로그인', logInToPlanka: 'Planka에 로그인',
noInternetConnection: '인터넷 연결 없음', noInternetConnection: '인터넷 연결 없음',
pageNotFound_title: '페이지를 찾을 수 없습니다', pageNotFound_title: '페이지를 찾을 수 없',
password: '비밀번호', password: '비밀번호',
projectManagement: '프로젝트 관리', projectManagement: '프로젝트 관리',
serverConnectionFailed: '서버 연결 실패', serverConnectionFailed: '서버 연결 실패',
unknownError: '알 수 없는 오류, 나중에 다시 시도하십시오', unknownError: '알 수 없는 오류, 나중에 다시 시도하세요',
useSingleSignOn: 'single sign-on(SSO) 사용', useSingleSignOn: 'Single Sign-On(SSO) 사용',
}, },
action: { action: {
logIn: '로그인', logIn: '로그인',
logInWithSSO: 'single sign-on(SSO)으로 로그인', logInWithSSO: 'SSO로 로그인',
}, },
}, },
}; };

View File

@@ -206,7 +206,7 @@ export default {
deleteLabel: 'Удалить метку', deleteLabel: 'Удалить метку',
deleteList: 'Удалить список', deleteList: 'Удалить список',
deleteList_title: 'Удалить список', deleteList_title: 'Удалить список',
deleteNotifications: 'Dismiss all', deleteNotifications: 'Отклонить все',
deleteProject: 'Удалить проект', deleteProject: 'Удалить проект',
deleteProject_title: 'Удалить проект', deleteProject_title: 'Удалить проект',
deleteTask: 'Удалить задачу', deleteTask: 'Удалить задачу',

View File

@@ -19,9 +19,9 @@ export default {
actions: 'Åtgärder', actions: 'Åtgärder',
addAttachment_title: 'Bifoga', addAttachment_title: 'Bifoga',
addComment: 'Kommentera', addComment: 'Kommentera',
addManager_title: 'Lägg till Projektledare', addManager_title: 'Lägg till projektledare',
addMember_title: 'Lägg till Medlem', addMember_title: 'Lägg till medlem',
addUser_title: 'Lägg till Användare', addUser_title: 'Lägg till användare',
administrator: 'Administratör', administrator: 'Administratör',
all: 'Alla', all: 'Alla',
allChangesWillBeAutomaticallySavedAfterConnectionRestored: allChangesWillBeAutomaticallySavedAfterConnectionRestored:
@@ -48,40 +48,40 @@ export default {
authentication: 'Autentisering', authentication: 'Autentisering',
background: 'Bakgrund', background: 'Bakgrund',
board: 'Tavla', board: 'Tavla',
boardNotFound_title: 'Tavla Ej Funnen', boardNotFound_title: 'Tavla hittades inte',
cardActions_title: 'Kortåtgärder', cardActions_title: 'Kortåtgärder',
cardNotFound_title: 'Kort Ej Funnet', cardNotFound_title: 'Kort hittades inte',
cardOrActionAreDeleted: 'Kort eller åtgärd är borttagen.', cardOrActionAreDeleted: 'Kort eller åtgärd är borttagen.',
color: 'Färg', color: 'Färg',
createBoard_title: 'Skapa Tavla', createBoard_title: 'Skapa tavla',
createLabel_title: 'Skapa Etikett', createLabel_title: 'Skapa etikett',
createNewOneOrSelectExistingOne: 'Skapa en ny eller välj<br />en redan existerande.', createNewOneOrSelectExistingOne: 'Skapa en ny eller välj<br />en redan existerande.',
createProject_title: 'Skapa Projekt', createProject_title: 'Skapa projekt',
createTextFile_title: 'Skapa Textfil', createTextFile_title: 'Skapa textfil',
currentPassword: 'Nuvarande lösenord', currentPassword: 'Nuvarande lösenord',
dangerZone_title: 'Farozon', dangerZone_title: 'Farozon',
date: 'Datum', date: 'Datum',
dueDate_title: 'Förfallodatum', dueDate_title: 'Förfallodatum',
deleteAttachment_title: 'Ta Bort Bilaga', deleteAttachment_title: 'Ta bort bilaga',
deleteBoard_title: 'Ta Bort Tavla', deleteBoard_title: 'Ta bort tavla',
deleteCard_title: 'Ta Bort Kort', deleteCard_title: 'Ta bort kort',
deleteComment_title: 'Ta Bort Kommentar', deleteComment_title: 'Ta bort kommentar',
deleteLabel_title: 'Ta Bort Etikett', deleteLabel_title: 'Ta bort etikett',
deleteList_title: 'Ta Bort Lista', deleteList_title: 'Ta bort lista',
deleteProject_title: 'Ta Bort Projekt', deleteProject_title: 'Ta bort projekt',
deleteTask_title: 'Ta Bort Uppgift', deleteTask_title: 'Ta bort uppgift',
deleteUser_title: 'Ta Bort Användare', deleteUser_title: 'Ta bort användare',
description: 'Beskrivning', description: 'Beskrivning',
dropFileToUpload: 'Släpp en fil för att ladda upp', dropFileToUpload: 'Släpp en fil för att ladda upp',
editAttachment_title: 'Redigera Bilaga', editAttachment_title: 'Redigera bilaga',
editAvatar_title: 'Redigera Avatar', editAvatar_title: 'Redigera avatar',
editBoard_title: 'Redigera Tavla', editBoard_title: 'Redigera tavla',
editDueDate_title: 'Redigera Förfallodatum', editDueDate_title: 'Redigera förfallodatum',
editEmail_title: 'Redigera E-mail', editEmail_title: 'Redigera e-mail',
editLabel_title: 'Redigera Etikett', editLabel_title: 'Redigera etikett',
editPassword_title: 'Redigera Lösenord', editPassword_title: 'Redigera lösenord',
editStopwatch_title: 'Redigera Timer', editStopwatch_title: 'Redigera timer',
editUsername_title: 'Redigera Användarnamn', editUsername_title: 'Redigera användarnamn',
email: 'E-mail', email: 'E-mail',
emailAlreadyInUse: 'E-mail används redan', emailAlreadyInUse: 'E-mail används redan',
enterCardTitle: 'Ange kortets titel...', enterCardTitle: 'Ange kortets titel...',
@@ -90,21 +90,21 @@ export default {
enterListTitle: 'Ange listans titel...', enterListTitle: 'Ange listans titel...',
enterProjectTitle: 'Ange projektets titel', enterProjectTitle: 'Ange projektets titel',
enterTaskDescription: 'Ange uppgiftsbeskrivning...', enterTaskDescription: 'Ange uppgiftsbeskrivning...',
filterByLabels_title: 'Filtrera Efter Etiketter', filterByLabels_title: 'Filtrera efter etiketter',
filterByMembers_title: 'Filtrera Efter Medlemmar', filterByMembers_title: 'Filtrera efter medlemmar',
fromComputer_title: 'Från dator', fromComputer_title: 'Från dator',
general: 'Allmänt', general: 'Allmänt',
hours: 'Timmar', hours: 'Timmar',
invalidCurrentPassword: 'Ogiltigt nuvarande lösenord', invalidCurrentPassword: 'Ogiltigt nuvarande lösenord',
labels: 'Etiketter', labels: 'Etiketter',
leaveBoard_title: 'Lämna Tavla', leaveBoard_title: 'Lämna tavla',
leaveProject_title: 'Lämna Projekt', leaveProject_title: 'Lämna projekt',
list: 'Lista', list: 'Lista',
listActions_title: 'Liståtgärder', listActions_title: 'Liståtgärder',
managers: 'Projektledare', managers: 'Projektledare',
members: 'Medlemmar', members: 'Medlemmar',
minutes: 'Minuter', minutes: 'Minuter',
moveCard_title: 'Flytta Kort', moveCard_title: 'Flytta kort',
name: 'Namn', name: 'Namn',
newEmail: 'Ny e-mail', newEmail: 'Ny e-mail',
newPassword: 'Nytt lösenord', newPassword: 'Nytt lösenord',
@@ -115,7 +115,7 @@ export default {
noProjects: 'Inga projekt', noProjects: 'Inga projekt',
notifications: 'Notifikationer', notifications: 'Notifikationer',
noUnreadNotifications: 'Inga olästa notifikationer.', noUnreadNotifications: 'Inga olästa notifikationer.',
openBoard_title: 'Öppna Tavla', openBoard_title: 'Öppna tavla',
optional_inline: 'valfri', optional_inline: 'valfri',
organization: 'Organisation', organization: 'Organisation',
phone: 'Telefon', phone: 'Telefon',
@@ -123,9 +123,9 @@ export default {
pressPasteShortcutToAddAttachmentFromClipboard: pressPasteShortcutToAddAttachmentFromClipboard:
'Tips: tryck på Ctrl-V (Cmd-V på Mac) för att lägga till en bilaga från urklipp.', 'Tips: tryck på Ctrl-V (Cmd-V på Mac) för att lägga till en bilaga från urklipp.',
project: 'Projekt', project: 'Projekt',
projectNotFound_title: 'Projekt Ej Funnet', projectNotFound_title: 'Projekt hittades inte',
removeManager_title: 'Ta Bort Projektledare', removeManager_title: 'Ta bort projektledare',
removeMember_title: 'Ta Bort Medlem', removeMember_title: 'Ta bort medlem',
seconds: 'Sekunder', seconds: 'Sekunder',
selectBoard: 'Välj tavla', selectBoard: 'Välj tavla',
selectList: 'Välj lista', selectList: 'Välj lista',
@@ -172,35 +172,35 @@ export default {
deleteAvatar: 'Ta bort avatar', deleteAvatar: 'Ta bort avatar',
deleteBoard: 'Ta bort tavla', deleteBoard: 'Ta bort tavla',
deleteCard: 'Ta bort kort', deleteCard: 'Ta bort kort',
deleteCard_title: 'Ta Bort Kort', deleteCard_title: 'Ta bort kort',
deleteComment: 'Ta bort kommentar', deleteComment: 'Ta bort kommentar',
deleteImage: 'Ta bort bild', deleteImage: 'Ta bort bild',
deleteLabel: 'Ta bort etikett', deleteLabel: 'Ta bort etikett',
deleteList: 'Ta bort lista', deleteList: 'Ta bort lista',
deleteList_title: 'Ta Bort Lista', deleteList_title: 'Ta bort lista',
deleteNotifications: 'Dismiss all', deleteNotifications: 'Avvisa alla',
deleteProject: 'Ta bort projekt', deleteProject: 'Ta bort projekt',
deleteProject_title: 'Ta Bort Projekt', deleteProject_title: 'Ta bort projekt',
deleteTask: 'Ta bort uppgift', deleteTask: 'Ta bort uppgift',
deleteTask_title: 'Ta Bort Uppgift', deleteTask_title: 'Ta bort uppgift',
deleteUser: 'Ta bort användare', deleteUser: 'Ta bort användare',
edit: 'Redigera', edit: 'Redigera',
editDueDate_title: 'Redigera Förfallodatum', editDueDate_title: 'Redigera förfallodatum',
editDescription_title: 'Redigera Beskrivning', editDescription_title: 'Redigera beskrivning',
editEmail_title: 'Redigera E-mail', editEmail_title: 'Redigera e-mail',
editPassword_title: 'Redigera Lösenord', editPassword_title: 'Redigera lösenord',
editStopwatch_title: 'Redigera Timer', editStopwatch_title: 'Redigera timer',
editTitle_title: 'Redigera Titel', editTitle_title: 'Redigera titel',
editUsername_title: 'Redigera Användarnamn', editUsername_title: 'Redigera användarnamn',
leaveBoard: 'Lämna tavla', leaveBoard: 'Lämna tavla',
leaveProject: 'Lämna projekt', leaveProject: 'Lämna projekt',
logOut_title: 'Logga ut', logOut_title: 'Logga ut',
makeCover_title: 'Skapa Omslagsbild', makeCover_title: 'Skapa omslagsbild',
move: 'Flytta', move: 'Flytta',
moveCard_title: 'Flytta Kort', moveCard_title: 'Flytta kort',
remove: 'Ta Bort', remove: 'Ta bort',
removeBackground: 'Ta bort bakgrund', removeBackground: 'Ta bort bakgrund',
removeCover_title: 'Ta Bort Omslagsbild', removeCover_title: 'Ta bort omslagsbild',
removeFromBoard: 'Ta bort from tavla', removeFromBoard: 'Ta bort from tavla',
removeFromProject: 'Ta bort from projekt', removeFromProject: 'Ta bort from projekt',
removeManager: 'Ta bort projektledare', removeManager: 'Ta bort projektledare',

View File

@@ -11,6 +11,7 @@ export default class extends BaseModel {
id: attr(), id: attr(),
position: attr(), position: attr(),
name: attr(), name: attr(),
color: attr(),
boardId: fk({ boardId: fk({
to: 'Board', to: 'Board',
as: 'board', as: 'board',

View File

@@ -1,7 +1,7 @@
import { call, put, select, take } from 'redux-saga/effects'; import { call, put, select, take } from 'redux-saga/effects';
import { push } from '../../../lib/redux-router'; import { push } from '../../../lib/redux-router';
import { authenticateUsingOidcCallback } from './login'; import { authenticateUsingOidc, authenticateUsingOidcCallback } from './login';
import selectors from '../../../selectors'; import selectors from '../../../selectors';
import ActionTypes from '../../../constants/ActionTypes'; import ActionTypes from '../../../constants/ActionTypes';
import Paths from '../../../constants/Paths'; import Paths from '../../../constants/Paths';
@@ -29,17 +29,33 @@ export function* handleLocationChange() {
yield call(goToLogin); yield call(goToLogin);
break; break;
case Paths.OIDC_CALLBACK: { default:
const isInitializing = yield select(selectors.selectIsInitializing); }
if (isInitializing) { const isInitializing = yield select(selectors.selectIsInitializing);
yield take(ActionTypes.LOGIN_INITIALIZE);
if (isInitializing) {
yield take(ActionTypes.LOGIN_INITIALIZE);
}
switch (pathsMatch.pattern.path) {
case Paths.LOGIN: {
const oidcConfig = yield select(selectors.selectOidcConfig);
if (oidcConfig) {
const params = new URLSearchParams(window.location.search);
if (params.has('authenticateWithOidc')) {
yield call(authenticateUsingOidc);
}
} }
yield call(authenticateUsingOidcCallback);
break; break;
} }
case Paths.OIDC_CALLBACK:
yield call(authenticateUsingOidcCallback);
break;
default: default:
} }
} }

View File

@@ -384,4 +384,46 @@
.backgroundRedCurtain { .backgroundRedCurtain {
background: radial-gradient(circle 371px at 2.9% 14.3%, rgba(255, 0, 102, 1) 0%, rgba(80, 5, 35, 1) 100.7%) !important; background: radial-gradient(circle 371px at 2.9% 14.3%, rgba(255, 0, 102, 1) 0%, rgba(80, 5, 35, 1) 100.7%) !important;
} }
/* Colors */
.colorBerryRed {
color: #e04556 !important;
}
.colorPumpkinOrange {
color: #f0982d !important;
}
.colorLagoonBlue {
color: #109dc0 !important;
}
.colorPinkTulip {
color: #f97394 !important;
}
.colorLightMud {
color: #c7a57b !important;
}
.colorOrangePeel {
color: #fab623 !important;
}
.colorBrightMoss {
color: #a5c261 !important;
}
.colorAntiqueBlue {
color: #6c99bb !important;
}
.colorDarkGranite {
color: #8b8680 !important;
}
.colorLaguneBlue {
color: #00b4b1 !important;
}
} }

View File

@@ -1 +1 @@
export default '1.24.4'; export default '1.26.2';

View File

@@ -1,18 +1,20 @@
FROM node:18-alpine AS server-dependencies FROM node:18-alpine AS server-dependencies
RUN apk -U upgrade \ RUN apk -U upgrade \
&& apk add build-base python3 \ && apk add build-base python3 --no-cache
--no-cache
WORKDIR /app/client WORKDIR /app/client
COPY package.json package-lock.json /app/client/
COPY package.json package-lock.json .
RUN npm install npm --global \ RUN npm install npm --global \
&& npm install pnpm --global \ && npm install pnpm@9 --global \
&& pnpm import \ && pnpm import \
&& pnpm install && pnpm install
WORKDIR /app
COPY ../../package.json ../../package-lock.json .
WORKDIR /app/
COPY ../../package.json ../../package-lock.json /app/
RUN pnpm import \ RUN pnpm import \
&& pnpm install && pnpm install

View File

@@ -1,14 +1,13 @@
FROM node:18-alpine AS server-dependencies FROM node:18-alpine AS server-dependencies
RUN apk -U upgrade \ RUN apk -U upgrade \
&& apk add build-base python3 \ && apk add build-base python3 --no-cache
--no-cache
WORKDIR /app WORKDIR /app
COPY package.json package-lock.json ./ COPY package.json package-lock.json .
RUN npm install npm --global \ RUN npm install npm --global \
&& npm install pnpm --global \ && npm install pnpm@9 --global \
&& pnpm import \ && pnpm import \
&& pnpm install && pnpm install

View File

@@ -13,6 +13,8 @@ services:
- DATABASE_URL=postgresql://user:password@postgres:5432/planka_db - DATABASE_URL=postgresql://user:password@postgres:5432/planka_db
- SECRET_KEY=notsecretkey - SECRET_KEY=notsecretkey
# - LOG_LEVEL=warn
# - TRUST_PROXY=0 # - TRUST_PROXY=0
# - TOKEN_EXPIRES_IN=365 # In days # - TOKEN_EXPIRES_IN=365 # In days

View File

@@ -15,6 +15,8 @@ services:
- DATABASE_URL=postgresql://postgres@postgres/planka - DATABASE_URL=postgresql://postgres@postgres/planka
- SECRET_KEY=notsecretkey - SECRET_KEY=notsecretkey
# - LOG_LEVEL=warn
# - TRUST_PROXY=0 # - TRUST_PROXY=0
# - TOKEN_EXPIRES_IN=365 # In days # - TOKEN_EXPIRES_IN=365 # In days

11
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "planka", "name": "planka",
"version": "1.24.4", "version": "1.26.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "planka", "name": "planka",
"version": "1.24.4", "version": "1.26.2",
"hasInstallScript": true, "hasInstallScript": true,
"license": "AGPL-3.0", "license": "AGPL-3.0",
"dependencies": { "dependencies": {
@@ -23,9 +23,10 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.26.0", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
"integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
"license": "MIT",
"dependencies": { "dependencies": {
"regenerator-runtime": "^0.14.0" "regenerator-runtime": "^0.14.0"
}, },

View File

@@ -1,6 +1,6 @@
{ {
"name": "planka", "name": "planka",
"version": "1.24.4", "version": "1.26.2",
"private": true, "private": true,
"homepage": "https://plankanban.github.io/planka", "homepage": "https://plankanban.github.io/planka",
"repository": { "repository": {

View File

@@ -6,6 +6,7 @@ SECRET_KEY=notsecretkey
## Optional ## Optional
# LOG_LEVEL=warn
# LOG_FILE= # LOG_FILE=
# TRUST_PROXY=0 # TRUST_PROXY=0

View File

@@ -21,6 +21,11 @@ module.exports = {
type: 'string', type: 'string',
isNotEmptyString: true, isNotEmptyString: true,
}, },
color: {
type: 'string',
isIn: List.COLORS,
allowNull: true,
},
}, },
exits: { exits: {
@@ -55,7 +60,7 @@ module.exports = {
throw Errors.NOT_ENOUGH_RIGHTS; throw Errors.NOT_ENOUGH_RIGHTS;
} }
const values = _.pick(inputs, ['position', 'name']); const values = _.pick(inputs, ['position', 'name', 'color']);
list = await sails.helpers.lists.updateOne.with({ list = await sails.helpers.lists.updateOne.with({
values, values,

View File

@@ -12,8 +12,22 @@ const SortTypes = {
CREATED_AT_DESC: 'createdAt_desc', CREATED_AT_DESC: 'createdAt_desc',
}; };
const COLORS = [
'berry-red',
'pumpkin-orange',
'lagoon-blue',
'pink-tulip',
'light-mud',
'orange-peel',
'bright-moss',
'antique-blue',
'dark-granite',
'lagune-blue',
];
module.exports = { module.exports = {
SortTypes, SortTypes,
COLORS,
attributes: { attributes: {
// ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦ ╦╔═╗╔═╗ // ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦ ╦╔═╗╔═╗
@@ -28,6 +42,11 @@ module.exports = {
type: 'string', type: 'string',
required: true, required: true,
}, },
color: {
type: 'string',
isIn: COLORS,
allowNull: true,
},
// ╔═╗╔╦╗╔╗ ╔═╗╔╦╗╔═╗ // ╔═╗╔╦╗╔╗ ╔═╗╔╦╗╔═╗
// ║╣ ║║║╠╩╗║╣ ║║╚═╗ // ║╣ ║║║╠╩╗║╣ ║║╚═╗

View File

@@ -48,5 +48,6 @@ module.exports.datastores = {
adapter: 'sails-postgresql', adapter: 'sails-postgresql',
url: process.env.DATABASE_URL, url: process.env.DATABASE_URL,
schemaName: process.env.DATABASE_SCHEMA,
}, },
}; };

View File

@@ -0,0 +1,17 @@
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.up = (knex) =>
knex.schema.alterTable('list', (table) => {
table.text('color');
});
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.down = (knex) =>
knex.schema.alterTable('list', (table) => {
table.dropColumn('color');
});

136
server/package-lock.json generated
View File

@@ -18,9 +18,9 @@
"nodemailer": "^6.9.16", "nodemailer": "^6.9.16",
"openid-client": "^5.7.1", "openid-client": "^5.7.1",
"rimraf": "^5.0.10", "rimraf": "^5.0.10",
"sails": "^1.5.13", "sails": "^1.5.14",
"sails-hook-orm": "^4.0.3", "sails-hook-orm": "^4.0.3",
"sails-hook-sockets": "^3.0.1", "sails-hook-sockets": "^3.0.2",
"sails-postgresql": "^5.0.1", "sails-postgresql": "^5.0.1",
"serve-static": "^1.13.1", "serve-static": "^1.13.1",
"sharp": "^0.33.5", "sharp": "^0.33.5",
@@ -1613,15 +1613,16 @@
"integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ=="
}, },
"node_modules/@sailshq/router": { "node_modules/@sailshq/router": {
"version": "1.3.9", "version": "1.3.10",
"resolved": "https://registry.npmjs.org/@sailshq/router/-/router-1.3.9.tgz", "resolved": "https://registry.npmjs.org/@sailshq/router/-/router-1.3.10.tgz",
"integrity": "sha512-giCbgFJSChKC1MP3JnbY5mqQmlsAmYh9oXmuiXsA553LVY8fcPiI5j7LCVrKFcJ+bsI0MRHwrZOvayfni4SIew==", "integrity": "sha512-6h5IE0PrSEkF03Fze1lUwnDMnYMbBPkUgKaUG/mkthHpiO/VDzbD0QJXyD7xmhlD05dEzuZnGqrrUeY5oZIMAg==",
"license": "MIT",
"dependencies": { "dependencies": {
"array-flatten": "3.0.0", "array-flatten": "3.0.0",
"debug": "2.6.9", "debug": "2.6.9",
"methods": "~1.1.2", "methods": "~1.1.2",
"parseurl": "~1.3.3", "parseurl": "~1.3.3",
"path-to-regexp": "0.1.11", "path-to-regexp": "0.1.12",
"setprototypeof": "1.2.0", "setprototypeof": "1.2.0",
"utils-merge": "1.0.1" "utils-merge": "1.0.1"
}, },
@@ -1651,9 +1652,10 @@
} }
}, },
"node_modules/@sailshq/router/node_modules/path-to-regexp": { "node_modules/@sailshq/router/node_modules/path-to-regexp": {
"version": "0.1.11", "version": "0.1.12",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.11.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
"integrity": "sha512-c0t+KCuUkO/YDLPG4WWzEwx3J5F/GHXsD1h/SNZfySqAIKe/BaP95x8fWtOfRJokpS5yYHRJjMtYlXD8jxnpbw==" "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"license": "MIT"
}, },
"node_modules/@smithy/abort-controller": { "node_modules/@smithy/abort-controller": {
"version": "3.1.8", "version": "3.1.8",
@@ -2298,17 +2300,14 @@
"node_modules/@socket.io/component-emitter": { "node_modules/@socket.io/component-emitter": {
"version": "3.1.2", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
"integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
}, "license": "MIT"
"node_modules/@types/cookie": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
"integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
}, },
"node_modules/@types/cors": { "node_modules/@types/cors": {
"version": "2.8.17", "version": "2.8.17",
"resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
"integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
"license": "MIT",
"dependencies": { "dependencies": {
"@types/node": "*" "@types/node": "*"
} }
@@ -2320,11 +2319,12 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.9.1", "version": "22.14.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz",
"integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==", "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==",
"license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.19.8" "undici-types": "~6.21.0"
} }
}, },
"node_modules/@types/triple-beam": { "node_modules/@types/triple-beam": {
@@ -2658,6 +2658,7 @@
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
"integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
"license": "MIT",
"engines": { "engines": {
"node": "^4.5.0 || >= 5.9" "node": "^4.5.0 || >= 5.9"
} }
@@ -3235,6 +3236,7 @@
"version": "0.5.4", "version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"license": "MIT",
"dependencies": { "dependencies": {
"safe-buffer": "5.2.1" "safe-buffer": "5.2.1"
}, },
@@ -3287,6 +3289,7 @@
"version": "2.8.5", "version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"license": "MIT",
"dependencies": { "dependencies": {
"object-assign": "^4", "object-assign": "^4",
"vary": "^1" "vary": "^1"
@@ -3621,16 +3624,16 @@
} }
}, },
"node_modules/engine.io": { "node_modules/engine.io": {
"version": "6.5.5", "version": "6.6.4",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz",
"integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==",
"license": "MIT",
"dependencies": { "dependencies": {
"@types/cookie": "^0.4.1",
"@types/cors": "^2.8.12", "@types/cors": "^2.8.12",
"@types/node": ">=10.0.0", "@types/node": ">=10.0.0",
"accepts": "~1.3.4", "accepts": "~1.3.4",
"base64id": "2.0.0", "base64id": "2.0.0",
"cookie": "~0.4.1", "cookie": "~0.7.2",
"cors": "~2.8.5", "cors": "~2.8.5",
"debug": "~4.3.1", "debug": "~4.3.1",
"engine.io-parser": "~5.2.1", "engine.io-parser": "~5.2.1",
@@ -3644,18 +3647,11 @@
"version": "5.2.3", "version": "5.2.3",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
"integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
"license": "MIT",
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"
} }
}, },
"node_modules/engine.io/node_modules/cookie": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
"integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/es-abstract": { "node_modules/es-abstract": {
"version": "1.23.5", "version": "1.23.5",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz",
@@ -4109,9 +4105,10 @@
} }
}, },
"node_modules/express": { "node_modules/express": {
"version": "4.21.1", "version": "4.21.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
"integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"license": "MIT",
"dependencies": { "dependencies": {
"accepts": "~1.3.8", "accepts": "~1.3.8",
"array-flatten": "1.1.1", "array-flatten": "1.1.1",
@@ -4132,7 +4129,7 @@
"methods": "~1.1.2", "methods": "~1.1.2",
"on-finished": "2.4.1", "on-finished": "2.4.1",
"parseurl": "~1.3.3", "parseurl": "~1.3.3",
"path-to-regexp": "0.1.10", "path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7", "proxy-addr": "~2.0.7",
"qs": "6.13.0", "qs": "6.13.0",
"range-parser": "~1.2.1", "range-parser": "~1.2.1",
@@ -4147,6 +4144,10 @@
}, },
"engines": { "engines": {
"node": ">= 0.10.0" "node": ">= 0.10.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
} }
}, },
"node_modules/express-session": { "node_modules/express-session": {
@@ -4196,12 +4197,14 @@
"node_modules/express/node_modules/array-flatten": { "node_modules/express/node_modules/array-flatten": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
"license": "MIT"
}, },
"node_modules/express/node_modules/cookie": { "node_modules/express/node_modules/cookie": {
"version": "0.7.1", "version": "0.7.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
"integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"license": "MIT",
"engines": { "engines": {
"node": ">= 0.6" "node": ">= 0.6"
} }
@@ -4209,12 +4212,14 @@
"node_modules/express/node_modules/cookie-signature": { "node_modules/express/node_modules/cookie-signature": {
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"license": "MIT"
}, },
"node_modules/express/node_modules/debug": { "node_modules/express/node_modules/debug": {
"version": "2.6.9", "version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"license": "MIT",
"dependencies": { "dependencies": {
"ms": "2.0.0" "ms": "2.0.0"
} }
@@ -4223,6 +4228,7 @@
"version": "1.3.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
"integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"license": "MIT",
"dependencies": { "dependencies": {
"debug": "2.6.9", "debug": "2.6.9",
"encodeurl": "~2.0.0", "encodeurl": "~2.0.0",
@@ -4240,6 +4246,7 @@
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"license": "MIT",
"dependencies": { "dependencies": {
"depd": "2.0.0", "depd": "2.0.0",
"inherits": "2.0.4", "inherits": "2.0.4",
@@ -4254,25 +4261,29 @@
"node_modules/express/node_modules/ms": { "node_modules/express/node_modules/ms": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
}, },
"node_modules/express/node_modules/parseurl": { "node_modules/express/node_modules/parseurl": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"license": "MIT",
"engines": { "engines": {
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/express/node_modules/path-to-regexp": { "node_modules/express/node_modules/path-to-regexp": {
"version": "0.1.10", "version": "0.1.12",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
"integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"license": "MIT"
}, },
"node_modules/express/node_modules/toidentifier": { "node_modules/express/node_modules/toidentifier": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"license": "MIT",
"engines": { "engines": {
"node": ">=0.6" "node": ">=0.6"
} }
@@ -4588,6 +4599,7 @@
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
"license": "MIT",
"engines": { "engines": {
"node": ">= 0.6" "node": ">= 0.6"
} }
@@ -5153,6 +5165,7 @@
"version": "1.9.1", "version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
"license": "MIT",
"engines": { "engines": {
"node": ">= 0.10" "node": ">= 0.10"
} }
@@ -6161,6 +6174,7 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
"integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"license": "MIT",
"funding": { "funding": {
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
@@ -7081,6 +7095,7 @@
"version": "2.0.7", "version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"license": "MIT",
"dependencies": { "dependencies": {
"forwarded": "0.2.0", "forwarded": "0.2.0",
"ipaddr.js": "1.9.1" "ipaddr.js": "1.9.1"
@@ -7590,9 +7605,10 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
}, },
"node_modules/sails": { "node_modules/sails": {
"version": "1.5.13", "version": "1.5.14",
"resolved": "https://registry.npmjs.org/sails/-/sails-1.5.13.tgz", "resolved": "https://registry.npmjs.org/sails/-/sails-1.5.14.tgz",
"integrity": "sha512-6XTlCnXPbQZuGlDE+ZqCbYCkbQrFDQGJP3tQ76xSQYX7kDJIzaYvcviPye0zWiZEWYtfZIku0kRAlaNWAgYBsA==", "integrity": "sha512-u4EOT94me18E2MRJtumorgRS+b0TiBLdnAj2WIKmy4mYvc/SNuzcs8Fd/HCmqw979MwQb8hYdwnpwaSBdNaIDg==",
"license": "MIT",
"dependencies": { "dependencies": {
"@sailshq/csurf": "1.11.1", "@sailshq/csurf": "1.11.1",
"@sailshq/lodash": "^3.10.6", "@sailshq/lodash": "^3.10.6",
@@ -7608,7 +7624,7 @@
"cookie-parser": "1.4.7", "cookie-parser": "1.4.7",
"cookie-signature": "1.1.0", "cookie-signature": "1.1.0",
"ejs": "3.1.10", "ejs": "3.1.10",
"express": "4.21.1", "express": "4.21.2",
"express-session": "1.18.1", "express-session": "1.18.1",
"flaverr": "^1.10.0", "flaverr": "^1.10.0",
"glob": "7.1.2", "glob": "7.1.2",
@@ -7874,9 +7890,10 @@
} }
}, },
"node_modules/sails-hook-sockets": { "node_modules/sails-hook-sockets": {
"version": "3.0.1", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/sails-hook-sockets/-/sails-hook-sockets-3.0.1.tgz", "resolved": "https://registry.npmjs.org/sails-hook-sockets/-/sails-hook-sockets-3.0.2.tgz",
"integrity": "sha512-d1LNW3h7T2xGEIHmf0btY2tcgK7EDqHZPyD3fpCx4Frhqx8n6MXdbbuKDdPx3c/h0inoJzZvkjtHNSovDk8hNQ==", "integrity": "sha512-qihISBhn0PIYf7pK0ZeRsS0Lo/McGtVYCNHaABBJ3Cc4LSsQQYqhv9erbapR53zVswn6tQsEIcOJbIFn/XA/zA==",
"license": "MIT",
"dependencies": { "dependencies": {
"@sailshq/lodash": "^3.10.2", "@sailshq/lodash": "^3.10.2",
"async": "2.6.4", "async": "2.6.4",
@@ -7885,7 +7902,7 @@
"machinepack-urls": "^6.0.2-0", "machinepack-urls": "^6.0.2-0",
"proxy-addr": "1.1.5", "proxy-addr": "1.1.5",
"semver": "7.5.2", "semver": "7.5.2",
"socket.io": "4.7.5", "socket.io": "4.8.1",
"uid2": "0.0.3" "uid2": "0.0.3"
} }
}, },
@@ -8472,15 +8489,16 @@
} }
}, },
"node_modules/socket.io": { "node_modules/socket.io": {
"version": "4.7.5", "version": "4.8.1",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz",
"integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==",
"license": "MIT",
"dependencies": { "dependencies": {
"accepts": "~1.3.4", "accepts": "~1.3.4",
"base64id": "~2.0.0", "base64id": "~2.0.0",
"cors": "~2.8.5", "cors": "~2.8.5",
"debug": "~4.3.2", "debug": "~4.3.2",
"engine.io": "~6.5.2", "engine.io": "~6.6.0",
"socket.io-adapter": "~2.5.2", "socket.io-adapter": "~2.5.2",
"socket.io-parser": "~4.2.4" "socket.io-parser": "~4.2.4"
}, },
@@ -8492,6 +8510,7 @@
"version": "2.5.5", "version": "2.5.5",
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
"integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
"license": "MIT",
"dependencies": { "dependencies": {
"debug": "~4.3.4", "debug": "~4.3.4",
"ws": "~8.17.1" "ws": "~8.17.1"
@@ -8501,6 +8520,7 @@
"version": "4.2.4", "version": "4.2.4",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
"integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
"license": "MIT",
"dependencies": { "dependencies": {
"@socket.io/component-emitter": "~3.1.0", "@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1" "debug": "~4.3.1"
@@ -9013,9 +9033,10 @@
"integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g=="
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "6.19.8", "version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"license": "MIT"
}, },
"node_modules/universalify": { "node_modules/universalify": {
"version": "2.0.1", "version": "2.0.1",
@@ -9639,6 +9660,7 @@
"version": "8.17.1", "version": "8.17.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"license": "MIT",
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"
}, },

View File

@@ -39,9 +39,9 @@
"nodemailer": "^6.9.16", "nodemailer": "^6.9.16",
"openid-client": "^5.7.1", "openid-client": "^5.7.1",
"rimraf": "^5.0.10", "rimraf": "^5.0.10",
"sails": "^1.5.13", "sails": "^1.5.14",
"sails-hook-orm": "^4.0.3", "sails-hook-orm": "^4.0.3",
"sails-hook-sockets": "^3.0.1", "sails-hook-sockets": "^3.0.2",
"sails-postgresql": "^5.0.1", "sails-postgresql": "^5.0.1",
"serve-static": "^1.13.1", "serve-static": "^1.13.1",
"sharp": "^0.33.5", "sharp": "^0.33.5",

View File

@@ -6,16 +6,13 @@ const winston = require('winston');
*/ */
const defaultLogTimestampFormat = 'YYYY-MM-DD HH:mm:ss'; const defaultLogTimestampFormat = 'YYYY-MM-DD HH:mm:ss';
const logfile =
'LOG_FILE' in process.env ? process.env.LOG_FILE : `${process.cwd()}/logs/planka.log`;
/** /**
* Log level for both console and file log sinks. * Log level for both console and file log sinks.
* *
* Refer {@link https://github.com/winstonjs/winston#logging here} * Refer {@link https://github.com/winstonjs/winston#logging here}
* for more information on Winston log levels. * for more information on Winston log levels.
*/ */
const logLevel = 'warn'; // process.env.NODE_ENV === 'production' ? 'info' : 'debug'; const logLevel = process.env.LOG_LEVEL || 'warn';
const logFormat = winston.format.combine( const logFormat = winston.format.combine(
winston.format.uncolorize(), winston.format.uncolorize(),
@@ -23,13 +20,15 @@ const logFormat = winston.format.combine(
winston.format.printf((log) => `${log.timestamp} [${log.level[0].toUpperCase()}] ${log.message}`), winston.format.printf((log) => `${log.timestamp} [${log.level[0].toUpperCase()}] ${log.message}`),
); );
const logFile = process.env.LOG_FILE || `${process.cwd()}/logs/planka.log`;
// eslint-disable-next-line new-cap // eslint-disable-next-line new-cap
const customLogger = new winston.createLogger({ const customLogger = new winston.createLogger({
transports: [ transports: [
new winston.transports.File({ new winston.transports.File({
level: logLevel, level: logLevel,
format: logFormat, format: logFormat,
filename: logfile, filename: logFile,
}), }),
new winston.transports.Console({ new winston.transports.Console({
level: logLevel, level: logLevel,