From fe7962e10a30d82966477dafd3d3b1177d2fb715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Maa=C3=9Fen?= Date: Tue, 7 Apr 2020 14:03:16 +0200 Subject: [PATCH 01/24] AD Simple Auth is working --- Dockerfile | 2 +- docker-compose.yml | 124 ++++++++++++++--------------- packages/wekan-ldap/server/ldap.js | 13 ++- 3 files changed, 70 insertions(+), 69 deletions(-) diff --git a/Dockerfile b/Dockerfile index d9ccfcda1..440d88da2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -132,7 +132,7 @@ RUN \ ln -sf $(which bsdtar) $(which tar) && \ \ # Download nodejs - wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ + wget https://npm.taobao.org/mirrors/node/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \ #--------------------------------------------------------------------------------------------- # Node Fibers 100% CPU usage issue: diff --git a/docker-compose.yml b/docker-compose.yml index 54e50ce2f..34251252e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -115,7 +115,8 @@ services: # NOTE: Quay is currently not updated, use Docker Hub image below c) # a) For Wekan Meteor 1.8.x version at master branch, # using https://quay.io/wekan/wekan automatic builds - image: quay.io/wekan/wekan + #image: quay.io/wekan/wekan + image: localhost/wekan:latest # b) Using specific Meteor 1.6.x version tag: # image: quay.io/wekan/wekan:v1.95 # c) Using Docker Hub automatic builds https://hub.docker.com/r/wekanteam/wekan @@ -424,157 +425,148 @@ services: # Note: Do not add single quotes '' to variables. Having spaces still works without quotes where required. # # The default authentication method used if a user does not exist to create and authenticate. Can be set as ldap. - #- DEFAULT_AUTHENTICATION_METHOD=ldap + - DEFAULT_AUTHENTICATION_METHOD=ldap # # Enable or not the connection by the LDAP - #- LDAP_ENABLE=true + - LDAP_ENABLE=true # # The port of the LDAP server - #- LDAP_PORT=389 + - LDAP_PORT=636 # # The host server for the LDAP server - #- LDAP_HOST=localhost + - LDAP_HOST=win100a002.verband.creditreform.de + + - LDAP_AD_SIMPLE_AUTH=true + - LDAP_USER_AUTHENTICATION=true # # The base DN for the LDAP Tree - #- LDAP_BASEDN=ou=user,dc=example,dc=org + - LDAP_BASEDN=OU=Benutzer,dc=verband,dc=creditreform,dc=de + #- LDAP_BASEDN=dc=verband,dc=creditreform,dc=de # # Fallback on the default authentication method - #- LDAP_LOGIN_FALLBACK=false + - LDAP_LOGIN_FALLBACK=true # # Reconnect to the server if the connection is lost - #- LDAP_RECONNECT=true + - LDAP_RECONNECT=true # # Overall timeout, in milliseconds - #- LDAP_TIMEOUT=10000 + - LDAP_TIMEOUT=10000 # # Specifies the timeout for idle LDAP connections in milliseconds - #- LDAP_IDLE_TIMEOUT=10000 + - LDAP_IDLE_TIMEOUT=10000 # # Connection timeout, in milliseconds - #- LDAP_CONNECT_TIMEOUT=10000 + - LDAP_CONNECT_TIMEOUT=10000 # # If the LDAP needs a user account to search - #- LDAP_AUTHENTIFICATION=true + - LDAP_AUTHENTIFICATION=true # - # The search user DN - You need quotes when you have spaces in parameters - # 2 examples: - #- LDAP_AUTHENTIFICATION_USERDN="CN=ldap admin,CN=users,DC=domainmatter,DC=lan" - #- LDAP_AUTHENTIFICATION_USERDN="CN=wekan_adm,OU=serviceaccounts,OU=admin,OU=prod,DC=mydomain,DC=com" + # The search user DN + #- LDAP_AUTHENTIFICATION_USERDN=maassens@verband.creditreform.de # # The password for the search user - #- LDAP_AUTHENTIFICATION_PASSWORD=pwd + #- LDAP_AUTHENTIFICATION_PASSWORD= # # Enable logs for the module - #- LDAP_LOG_ENABLED=true + - LDAP_LOG_ENABLED=true + - INTERNAL_LOG_LEVEL=DEBUG # # If the sync of the users should be done in the background - #- LDAP_BACKGROUND_SYNC=false + - LDAP_BACKGROUND_SYNC=false # - # At which interval does the background task sync. - # The format must be as specified in: - # https://bunkat.github.io/later/parsers.html#text - #- LDAP_BACKGROUND_SYNC_INTERVAL='every 1 hour' + # At which interval does the background task sync in milliseconds + - LDAP_BACKGROUND_SYNC_INTERVAL=2000 # - #- LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=false + - LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=true # - #- LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS=false + - LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS=true # - # If using LDAPS: LDAP_ENCRYPTION=ssl - #- LDAP_ENCRYPTION=false + # If using LDAPS: LDAP_ENCRYPTION=ssl / none + - LDAP_ENCRYPTION=ssl # # The certification for the LDAPS server. Certificate needs to be included in this docker-compose.yml file. #- LDAP_CA_CERT=-----BEGIN CERTIFICATE-----MIIE+G2FIdAgIC...-----END CERTIFICATE----- # # Reject Unauthorized Certificate - #- LDAP_REJECT_UNAUTHORIZED=false - # - # Option to login to the LDAP server with the user's own username and password, instead of an administrator key. Default: false (use administrator key). - #- LDAP_USER_AUTHENTICATION="true" - # - # Which field is used to find the user for the user authentication. Default: uid. - #- LDAP_USER_AUTHENTICATION_FIELD="uid" + - LDAP_REJECT_UNAUTHORIZED=false # # Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed - #- LDAP_USER_SEARCH_FILTER= + - LDAP_USER_SEARCH_FILTER=(objectClass=user) # # base (search only in the provided DN), one (search only in the provided DN and one level deep), or sub (search the whole subtree) - #- LDAP_USER_SEARCH_SCOPE=one + - LDAP_USER_SEARCH_SCOPE=one # # Which field is used to find the user, like uid / sAMAccountName - #- LDAP_USER_SEARCH_FIELD=sAMAccountName + - LDAP_USER_SEARCH_FIELD=sAMAccountName # # Used for pagination (0=unlimited) - #- LDAP_SEARCH_PAGE_SIZE=0 + - LDAP_SEARCH_PAGE_SIZE=0 # # The limit number of entries (0=unlimited) - #- LDAP_SEARCH_SIZE_LIMIT=0 + - LDAP_SEARCH_SIZE_LIMIT=0 # - # Enable group filtering. Note the authenticated ldap user must be able to query all relevant group data with own login data from ldap. - #- LDAP_GROUP_FILTER_ENABLE=false + # Enable group filtering + - LDAP_GROUP_FILTER_ENABLE=false # # The object class for filtering. Example: group - #- LDAP_GROUP_FILTER_OBJECTCLASS= + # - LDAP_GROUP_FILTER_OBJECTCLASS=person # - # The attribute of a group identifying it. Example: cn - #- LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE= + # - LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE=cn # - # The attribute inside a group object listing its members. Example: member - #- LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE= + # - LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE= # - # The format of the value of LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE. Example: 'dn' if the users dn ist saved as value into the attribute. - #- LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT= + # - LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT= # - # The group name (id) that matches all users. - #- LDAP_GROUP_FILTER_GROUP_NAME= + # - LDAP_GROUP_FILTER_GROUP_NAME= # # LDAP_UNIQUE_IDENTIFIER_FIELD : This field is sometimes class GUID (Globally Unique Identifier). Example: guid - #- LDAP_UNIQUE_IDENTIFIER_FIELD= + # - LDAP_UNIQUE_IDENTIFIER_FIELD= # # LDAP_UTF8_NAMES_SLUGIFY : Convert the username to utf8 #- LDAP_UTF8_NAMES_SLUGIFY=true # # LDAP_USERNAME_FIELD : Which field contains the ldap username. username / sAMAccountName - #- LDAP_USERNAME_FIELD=sAMAccountName + - LDAP_USERNAME_FIELD=sAMAccountName # # LDAP_FULLNAME_FIELD : Which field contains the ldap fullname. fullname / sAMAccountName - #- LDAP_FULLNAME_FIELD=fullname + - LDAP_FULLNAME_FIELD=cn # - #- LDAP_MERGE_EXISTING_USERS=false + - LDAP_MERGE_EXISTING_USERS=true # # Allow existing account matching by e-mail address when username does not match - #- LDAP_EMAIL_MATCH_ENABLE=true + - LDAP_EMAIL_MATCH_ENABLE=true # # LDAP_EMAIL_MATCH_REQUIRE : require existing account matching by e-mail address when username does match - #- LDAP_EMAIL_MATCH_REQUIRE=true + - LDAP_EMAIL_MATCH_REQUIRE=false # # LDAP_EMAIL_MATCH_VERIFIED : require existing account email address to be verified for matching - #- LDAP_EMAIL_MATCH_VERIFIED=true + - LDAP_EMAIL_MATCH_VERIFIED=false # # LDAP_EMAIL_FIELD : which field contains the LDAP e-mail address - #- LDAP_EMAIL_FIELD=mail + - LDAP_EMAIL_FIELD=mail #----------------------------------------------------------------- - #- LDAP_SYNC_USER_DATA=false + - LDAP_SYNC_USER_DATA=true # - #- LDAP_SYNC_USER_DATA_FIELDMAP={"cn":"name", "mail":"email"} + - LDAP_SYNC_USER_DATA_FIELDMAP={"cn":"name", "mail":"email"} # #- LDAP_SYNC_GROUP_ROLES='' # # The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP # example : - #- LDAP_DEFAULT_DOMAIN=mydomain.com + - LDAP_DEFAULT_DOMAIN=verband.creditreform.de # # Enable/Disable syncing of admin status based on ldap groups: - #- LDAP_SYNC_ADMIN_STATUS=true + - LDAP_SYNC_ADMIN_STATUS=false # # Comma separated list of admin group names to sync. #- LDAP_SYNC_ADMIN_GROUPS=group1,group2 #--------------------------------------------------------------------- # Login to LDAP automatically with HTTP header. # In below example for siteminder, at right side of = is header name. - #- HEADER_LOGIN_ID=HEADERUID - #- HEADER_LOGIN_FIRSTNAME=HEADERFIRSTNAME - #- HEADER_LOGIN_LASTNAME=HEADERLASTNAME - #- HEADER_LOGIN_EMAIL=HEADEREMAILADDRESS + #- HEADER_LOGIN_ID=BNPPUID + #- HEADER_LOGIN_FIRSTNAME=BNPPFIRSTNAME + #- HEADER_LOGIN_LASTNAME=BNPPLASTNAME + #- HEADER_LOGIN_EMAIL=BNPPEMAILADDRESS #--------------------------------------------------------------------- # ==== LOGOUT TIMER, probably does not work yet ==== # LOGOUT_WITH_TIMER : Enables or not the option logout with timer diff --git a/packages/wekan-ldap/server/ldap.js b/packages/wekan-ldap/server/ldap.js index f2d9a7b72..50f0daa88 100644 --- a/packages/wekan-ldap/server/ldap.js +++ b/packages/wekan-ldap/server/ldap.js @@ -40,6 +40,8 @@ export default class LDAP { group_filter_group_member_attribute: this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE'), group_filter_group_member_format : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT'), group_filter_group_name : this.constructor.settings_get('LDAP_GROUP_FILTER_GROUP_NAME'), + AD_Simple_Auth : this.constructor.settings_get('LDAP_AD_SIMPLE_AUTH'), + Default_Domain : this.constructor.settings_get('LDAP_DEFAULT_DOMAIN'), }; } @@ -225,9 +227,16 @@ export default class LDAP { } - if (!this.options.BaseDN) throw new Error('BaseDN is not provided'); + if (!this.options.BaseDN && !this.options.AD_Simple_Auth) throw new Error('BaseDN is not provided'); - const userDn = `${this.options.User_Authentication_Field}=${username},${this.options.BaseDN}`; + var userDn = ""; + if (this.options.AD_Simple_Auth === true) { + userDn = `${username}@${this.options.Default_Domain}`; + } else { + userDn = `${this.options.User_Authentication_Field}=${username},${this.options.BaseDN}`; + } + + log_info('Binding with User', userDn); this.bindSync(userDn, password); this.domainBinded = true; From 84801010d57ff6ceca7c5313bac0e599a714b117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Maa=C3=9Fen?= Date: Tue, 20 Jul 2021 13:34:22 +0200 Subject: [PATCH 02/24] merged with wekan master @ v5.38 --- build.sh | 3 +++ jsconfig.json | 8 ++++++++ 2 files changed, 11 insertions(+) create mode 100755 build.sh create mode 100644 jsconfig.json diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..d03517ebe --- /dev/null +++ b/build.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +podman build --force-rm -t localhost/wekan:v3.89-ad . diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 000000000..f8d34e8c9 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6" + }, + "exclude": ["node_modules", "**/node_modules/*"], + "include": ["server/**/*", "client/**/*","config/**/*", "packages/**/*"] +} From 4f0c2dafca8cacb29791120d75f85c8df5cd9bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Maa=C3=9Fen?= Date: Wed, 21 Jul 2021 10:13:39 +0200 Subject: [PATCH 03/24] removed unnecessary files --- build.sh | 3 -- docker-compose.yml | 106 ++++++++++++++++++++++++--------------------- 2 files changed, 56 insertions(+), 53 deletions(-) delete mode 100755 build.sh diff --git a/build.sh b/build.sh deleted file mode 100755 index d03517ebe..000000000 --- a/build.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -podman build --force-rm -t localhost/wekan:v3.89-ad . diff --git a/docker-compose.yml b/docker-compose.yml index aa4e0196d..790c4842d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -429,41 +429,43 @@ services: # Note: Do not add single quotes '' to variables. Having spaces still works without quotes where required. # # The default authentication method used if a user does not exist to create and authenticate. Can be set as ldap. - - DEFAULT_AUTHENTICATION_METHOD=ldap + #- DEFAULT_AUTHENTICATION_METHOD=ldap # # Enable or not the connection by the LDAP - - LDAP_ENABLE=true + #- LDAP_ENABLE=true # # The port of the LDAP server - - LDAP_PORT=636 + #- LDAP_PORT=389 # # The host server for the LDAP server - - LDAP_HOST=win100a002.verband.creditreform.de - + #- LDAP_HOST=localhost + # + # set to true, if you want to connect with Active Directory by Simple Authentication - LDAP_AD_SIMPLE_AUTH=true + # + # set to true, if the login user is used for binding - LDAP_USER_AUTHENTICATION=true # # The base DN for the LDAP Tree - - LDAP_BASEDN=OU=Benutzer,dc=verband,dc=creditreform,dc=de - #- LDAP_BASEDN=dc=verband,dc=creditreform,dc=de + #- LDAP_BASEDN=ou=user,dc=example,dc=org # # Fallback on the default authentication method - - LDAP_LOGIN_FALLBACK=true + #- LDAP_LOGIN_FALLBACK=false # # Reconnect to the server if the connection is lost - - LDAP_RECONNECT=true + #- LDAP_RECONNECT=true # # Overall timeout, in milliseconds - - LDAP_TIMEOUT=10000 + #- LDAP_TIMEOUT=10000 # # Specifies the timeout for idle LDAP connections in milliseconds - - LDAP_IDLE_TIMEOUT=10000 + #- LDAP_IDLE_TIMEOUT=10000 # # Connection timeout, in milliseconds - - LDAP_CONNECT_TIMEOUT=10000 + #- LDAP_CONNECT_TIMEOUT=10000 # # If the LDAP needs a user account to search - - LDAP_AUTHENTIFICATION=true + #- LDAP_AUTHENTIFICATION=true # # The search user DN - You need quotes when you have spaces in parameters # 2 examples: @@ -471,24 +473,25 @@ services: #- LDAP_AUTHENTIFICATION_USERDN=CN=wekan_adm,OU=serviceaccounts,OU=admin,OU=prod,DC=mydomain,DC=com # # The password for the search user - #- LDAP_AUTHENTIFICATION_PASSWORD= + #- LDAP_AUTHENTIFICATION_PASSWORD=pwd # # Enable logs for the module - - LDAP_LOG_ENABLED=true - - INTERNAL_LOG_LEVEL=DEBUG + #- LDAP_LOG_ENABLED=true # # If the sync of the users should be done in the background - - LDAP_BACKGROUND_SYNC=false + #- LDAP_BACKGROUND_SYNC=false # - # At which interval does the background task sync in milliseconds - - LDAP_BACKGROUND_SYNC_INTERVAL=2000 + # At which interval does the background task sync. + # The format must be as specified in: + # https://bunkat.github.io/later/parsers.html#text + #- LDAP_BACKGROUND_SYNC_INTERVAL='every 1 hour' # - - LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=true + #- LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=false # - - LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS=true + #- LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS=false # - # If using LDAPS: LDAP_ENCRYPTION=ssl / none - - LDAP_ENCRYPTION=ssl + # If using LDAPS: LDAP_ENCRYPTION=ssl + #- LDAP_ENCRYPTION=false # # The certification for the LDAPS server. Certificate needs to be included in this docker-compose.yml file. #- LDAP_CA_CERT=-----BEGIN CERTIFICATE-----MIIE+G2FIdAgIC...-----END CERTIFICATE----- @@ -503,83 +506,86 @@ services: #- LDAP_USER_AUTHENTICATION_FIELD=uid # # Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed - - LDAP_USER_SEARCH_FILTER=(objectClass=user) + #- LDAP_USER_SEARCH_FILTER= # # base (search only in the provided DN), one (search only in the provided DN and one level deep), or sub (search the whole subtree) - - LDAP_USER_SEARCH_SCOPE=one + #- LDAP_USER_SEARCH_SCOPE=one # # Which field is used to find the user, like uid / sAMAccountName - - LDAP_USER_SEARCH_FIELD=sAMAccountName + #- LDAP_USER_SEARCH_FIELD=sAMAccountName # # Used for pagination (0=unlimited) - - LDAP_SEARCH_PAGE_SIZE=0 + #- LDAP_SEARCH_PAGE_SIZE=0 # # The limit number of entries (0=unlimited) - - LDAP_SEARCH_SIZE_LIMIT=0 + #- LDAP_SEARCH_SIZE_LIMIT=0 # - # Enable group filtering - - LDAP_GROUP_FILTER_ENABLE=false + # Enable group filtering. Note the authenticated ldap user must be able to query all relevant group data with own login data from ldap. + #- LDAP_GROUP_FILTER_ENABLE=false # # The object class for filtering. Example: group - # - LDAP_GROUP_FILTER_OBJECTCLASS=person + #- LDAP_GROUP_FILTER_OBJECTCLASS= # - # - LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE=cn + # The attribute of a group identifying it. Example: cn + #- LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE= # - # - LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE= + # The attribute inside a group object listing its members. Example: member + #- LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE= # # The format of the value of LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE. Example: 'dn' if the users dn is saved as value into the attribute. #- LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT= # - # - LDAP_GROUP_FILTER_GROUP_NAME= + # The group name (id) that matches all users. + #- LDAP_GROUP_FILTER_GROUP_NAME= # # LDAP_UNIQUE_IDENTIFIER_FIELD : This field is sometimes class GUID (Globally Unique Identifier). Example: guid - # - LDAP_UNIQUE_IDENTIFIER_FIELD= + #- LDAP_UNIQUE_IDENTIFIER_FIELD= # # LDAP_UTF8_NAMES_SLUGIFY : Convert the username to utf8 #- LDAP_UTF8_NAMES_SLUGIFY=true # # LDAP_USERNAME_FIELD : Which field contains the ldap username. username / sAMAccountName - - LDAP_USERNAME_FIELD=sAMAccountName + #- LDAP_USERNAME_FIELD=sAMAccountName # # LDAP_FULLNAME_FIELD : Which field contains the ldap fullname. fullname / sAMAccountName - - LDAP_FULLNAME_FIELD=cn + #- LDAP_FULLNAME_FIELD=fullname # - - LDAP_MERGE_EXISTING_USERS=true + #- LDAP_MERGE_EXISTING_USERS=false # # Allow existing account matching by e-mail address when username does not match - - LDAP_EMAIL_MATCH_ENABLE=true + #- LDAP_EMAIL_MATCH_ENABLE=true # # LDAP_EMAIL_MATCH_REQUIRE : require existing account matching by e-mail address when username does match - - LDAP_EMAIL_MATCH_REQUIRE=false + #- LDAP_EMAIL_MATCH_REQUIRE=true # # LDAP_EMAIL_MATCH_VERIFIED : require existing account email address to be verified for matching - - LDAP_EMAIL_MATCH_VERIFIED=false + #- LDAP_EMAIL_MATCH_VERIFIED=true # # LDAP_EMAIL_FIELD : which field contains the LDAP e-mail address - - LDAP_EMAIL_FIELD=mail + #- LDAP_EMAIL_FIELD=mail #----------------------------------------------------------------- - - LDAP_SYNC_USER_DATA=true + #- LDAP_SYNC_USER_DATA=false # - - LDAP_SYNC_USER_DATA_FIELDMAP={"cn":"name", "mail":"email"} + #- LDAP_SYNC_USER_DATA_FIELDMAP={"cn":"name", "mail":"email"} # #- LDAP_SYNC_GROUP_ROLES= # # The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP # example : - - LDAP_DEFAULT_DOMAIN=verband.creditreform.de + #- LDAP_DEFAULT_DOMAIN=mydomain.com # # Enable/Disable syncing of admin status based on ldap groups: - - LDAP_SYNC_ADMIN_STATUS=false + #- LDAP_SYNC_ADMIN_STATUS=true # # Comma separated list of admin group names to sync. #- LDAP_SYNC_ADMIN_GROUPS=group1,group2 #--------------------------------------------------------------------- # Login to LDAP automatically with HTTP header. # In below example for siteminder, at right side of = is header name. - #- HEADER_LOGIN_ID=BNPPUID - #- HEADER_LOGIN_FIRSTNAME=BNPPFIRSTNAME - #- HEADER_LOGIN_LASTNAME=BNPPLASTNAME - #- HEADER_LOGIN_EMAIL=BNPPEMAILADDRESS + #- HEADER_LOGIN_ID=HEADERUID + #- HEADER_LOGIN_FIRSTNAME=HEADERFIRSTNAME + #- HEADER_LOGIN_LASTNAME=HEADERLASTNAME + #- HEADER_LOGIN_EMAIL=HEADEREMAILADDRESS #--------------------------------------------------------------------- # ==== LOGOUT TIMER, probably does not work yet ==== # LOGOUT_WITH_TIMER : Enables or not the option logout with timer From c1c2eb22baed514a5d7ea7a428127af29b3570a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Maa=C3=9Fen?= Date: Thu, 22 Jul 2021 10:28:37 +0200 Subject: [PATCH 04/24] removed unnecessary changes --- Dockerfile | 2 +- jsconfig.json | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 jsconfig.json diff --git a/Dockerfile b/Dockerfile index d3184c349..4cc43624d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -158,7 +158,7 @@ RUN \ ln -sf $(which bsdtar) $(which tar) && \ \ # Download nodejs - wget https://npm.taobao.org/mirrors/node/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ + wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \ wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \ #--------------------------------------------------------------------------------------------- # Node Fibers 100% CPU usage issue: diff --git a/jsconfig.json b/jsconfig.json deleted file mode 100644 index f8d34e8c9..000000000 --- a/jsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es6" - }, - "exclude": ["node_modules", "**/node_modules/*"], - "include": ["server/**/*", "client/**/*","config/**/*", "packages/**/*"] -} From 0555b7e34c0ca2b533d4a597e60c03ee64f7d919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Maa=C3=9Fen?= Date: Thu, 22 Jul 2021 10:35:12 +0200 Subject: [PATCH 05/24] added comment to clarify additional use case of LDAP_DEFAULT_DOMAIN --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 790c4842d..7d3701fa7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -571,6 +571,7 @@ services: #- LDAP_SYNC_GROUP_ROLES= # # The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP + # In case SimpleAuth with AD is configured, the default domain is appended to the given loginname for creating the correct username for the bind request to AD # example : #- LDAP_DEFAULT_DOMAIN=mydomain.com # From c0d1ed714ec62d2ebf341337b505708f35819c8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Maa=C3=9Fen?= Date: Thu, 22 Jul 2021 10:46:35 +0200 Subject: [PATCH 06/24] added comment because of change in configuration dependencies --- packages/wekan-ldap/server/ldap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wekan-ldap/server/ldap.js b/packages/wekan-ldap/server/ldap.js index 8a59ee7c3..d557d372b 100644 --- a/packages/wekan-ldap/server/ldap.js +++ b/packages/wekan-ldap/server/ldap.js @@ -226,7 +226,7 @@ export default class LDAP { return; } - + /* if SimpleAuth is configured, the BaseDN is not needed */ if (!this.options.BaseDN && !this.options.AD_Simple_Auth) throw new Error('BaseDN is not provided'); var userDn = ""; From 70265deb4720d658754ed1c46e375c8a46a86435 Mon Sep 17 00:00:00 2001 From: helioguardabaxo Date: Thu, 22 Jul 2021 22:44:40 -0300 Subject: [PATCH 07/24] Add Convert checklist item to card feature --- client/components/cards/cardDetails.js | 29 ++++++++++++++++ client/components/cards/checklists.jade | 32 +++++++++++++++++ client/components/cards/checklists.js | 46 +++++++++++++++++++++++++ client/components/cards/checklists.styl | 1 + i18n/en.i18n.json | 1 + 5 files changed, 109 insertions(+) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index ecc72f7c4..5396aa675 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -627,6 +627,7 @@ Template.cardDetailsActionsPopup.events({ 'click .js-spent-time': Popup.open('editCardSpentTime'), 'click .js-move-card': Popup.open('moveCard'), 'click .js-copy-card': Popup.open('copyCard'), + 'click .js-convert-checklist-item-to-card': Popup.open('convertChecklistItemToCard'), 'click .js-copy-checklist-cards': Popup.open('copyChecklistToManyCards'), 'click .js-set-card-color': Popup.open('setCardColor'), 'click .js-move-card-to-top'(event) { @@ -791,6 +792,34 @@ Template.copyCardPopup.events({ }, }); +Template.convertChecklistItemToCardPopup.events({ + 'click .js-done'() { + const card = Cards.findOne(Session.get('currentCard')); + const lSelect = $('.js-select-lists')[0]; + const listId = lSelect.options[lSelect.selectedIndex].value; + const slSelect = $('.js-select-swimlanes')[0]; + const swimlaneId = slSelect.options[slSelect.selectedIndex].value; + const bSelect = $('.js-select-boards')[0]; + const boardId = bSelect.options[bSelect.selectedIndex].value; + const textarea = $('#copy-card-title'); + const title = textarea.val().trim(); + + if (title) { + const _id = Cards.insert({ + title: title, + listId: listId, + boardId: boardId, + swimlaneId: swimlaneId, + sort: 0, + }); + Filter.addException(_id); + + Popup.close(); + + } + }, +}); + Template.copyChecklistToManyCardsPopup.events({ 'click .js-done'() { const card = Cards.findOne(Session.get('currentCard')); diff --git a/client/components/cards/checklists.jade b/client/components/cards/checklists.jade index 2614b5c1d..6c7b517c7 100644 --- a/client/components/cards/checklists.jade +++ b/client/components/cards/checklists.jade @@ -80,6 +80,9 @@ template(name="editChecklistItemForm") span(title=createdAt) {{ moment createdAt }} if canModifyCard a.js-delete-checklist-item {{_ "delete"}}... + a.js-convert-checklist-item-to-card + i.fa.fa-copy + | {{_ 'convertChecklistItemToCardPopup-title'}} template(name="checklistItems") .checklist-items.js-checklist-items @@ -110,3 +113,32 @@ template(name='checklistItemDetail') .item-title(class="{{#if item.isFinished }}is-checked{{/if}}") +viewer = item.title + +template(name="convertChecklistItemToCardPopup") + label(for='convert-checklist-item-to-card-title') {{_ 'title'}}: + textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus) + = item.title + +boardsSwimlanesAndLists + +template(name="boardsSwimlanesAndLists") + unless currentUser.isWorker + label {{_ 'boards'}}: + select.js-select-boards(autofocus) + each boards + if $eq _id currentBoard._id + option(value="{{_id}}" selected) {{_ 'current'}} + else + option(value="{{_id}}") {{title}} + + label {{_ 'swimlanes'}}: + select.js-select-swimlanes + each swimlanes + option(value="{{_id}}") {{title}} + + label {{_ 'lists'}}: + select.js-select-lists + each aBoardLists + option(value="{{_id}}") {{title}} + + .edit-controls.clearfix + button.primary.confirm.js-done {{_ 'done'}} diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js index 86f8c75f8..0141f8ed5 100644 --- a/client/components/cards/checklists.js +++ b/client/components/cards/checklists.js @@ -1,3 +1,7 @@ +import Cards from '/models/cards'; +import Boards from '/models/boards'; + +const subManager = new SubsManager(); const { calculateIndexData, capitalize } = Utils; function initSorting(items) { @@ -206,6 +210,7 @@ BlazeComponent.extendComponent({ 'submit .js-edit-checklist-title': this.editChecklist, 'submit .js-add-checklist-item': this.addChecklistItem, 'submit .js-edit-checklist-item': this.editChecklistItem, + 'click .js-convert-checklist-item-to-card': Popup.open('convertChecklistItemToCard'), 'click .js-delete-checklist-item': this.deleteItem, 'click .confirm-checklist-delete': this.deleteChecklist, 'focus .js-add-checklist-item': this.focusChecklistItem, @@ -215,6 +220,47 @@ BlazeComponent.extendComponent({ }, }).register('checklists'); +BlazeComponent.extendComponent({ + onCreated() { + subManager.subscribe('board', Session.get('currentBoard'), false); + this.selectedBoardId = new ReactiveVar(Session.get('currentBoard')); + }, + + boards() { + return Boards.find( + { + archived: false, + 'members.userId': Meteor.userId(), + _id: { $ne: Meteor.user().getTemplatesBoardId() }, + }, + { + sort: { sort: 1 /* boards default sorting */ }, + }, + ); + }, + + swimlanes() { + const board = Boards.findOne(this.selectedBoardId.get()); + return board.swimlanes(); + }, + + aBoardLists() { + const board = Boards.findOne(this.selectedBoardId.get()); + return board.lists(); + }, + + events() { + return [ + { + 'change .js-select-boards'(event) { + this.selectedBoardId.set($(event.currentTarget).val()); + subManager.subscribe('board', this.selectedBoardId.get(), false); + }, + }, + ]; + }, +}).register('boardsSwimlanesAndLists'); + Template.checklists.helpers({ hideCheckedItems() { const currentUser = Meteor.user(); diff --git a/client/components/cards/checklists.styl b/client/components/cards/checklists.styl index a356e3bd2..0e2b058b7 100644 --- a/client/components/cards/checklists.styl +++ b/client/components/cards/checklists.styl @@ -160,6 +160,7 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item padding-right: 10px; .js-delete-checklist-item +.js-convert-checklist-item-to-card margin: 0 0 0.5em 1.33em @extends .delete-text padding: 12px 0 0 0 diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index c1ae6f911..456ca5410 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", From 789d1d1d1cdfee9ee09565813112c586675ad491 Mon Sep 17 00:00:00 2001 From: Emile NDAGIJIMANA Date: Fri, 23 Jul 2021 10:39:42 +0200 Subject: [PATCH 08/24] =?UTF-8?q?=C2=AB=20All=20boards=20page=20=C2=BB=20o?= =?UTF-8?q?nly=20displays=20tables=20to=20which=20the=20current=20user=20h?= =?UTF-8?q?as=20access?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/components/boards/boardsList.js | 48 ++++++++++++++++++++++---- server/publications/boards.js | 30 ++++++++++++++-- server/publications/users.js | 4 +++ 3 files changed, 73 insertions(+), 9 deletions(-) diff --git a/client/components/boards/boardsList.js b/client/components/boards/boardsList.js index 0e0815b05..fba4820ed 100644 --- a/client/components/boards/boardsList.js +++ b/client/components/boards/boardsList.js @@ -87,16 +87,52 @@ BlazeComponent.extendComponent({ boards() { const query = { - archived: false, - //type: { $in: ['board','template-container'] }, - type: 'board', + //archived: false, + ////type: { $in: ['board','template-container'] }, + //type: 'board', + $and: [ + { archived: false }, + { type: 'board' }, + { $or:[] } + ] }; - if (FlowRouter.getRouteName() === 'home') - query['members.userId'] = Meteor.userId(); + if (FlowRouter.getRouteName() === 'home'){ + query.$and[2].$or.push({'members.userId': Meteor.userId()}); + + const currUser = Users.findOne(Meteor.userId()); + + // const currUser = Users.findOne(Meteor.userId(), { + // fields: { + // orgs: 1, + // teams: 1, + // }, + // }); + + let orgIdsUserBelongs = currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : ''; + if(orgIdsUserBelongs && orgIdsUserBelongs != ''){ + let orgsIds = orgIdsUserBelongs.split(','); + // for(let i = 0; i < orgsIds.length; i++){ + // query.$and[2].$or.push({'orgs.orgId': orgsIds[i]}); + // } + + //query.$and[2].$or.push({'orgs': {$elemMatch : {orgId: orgsIds[0]}}}); + query.$and[2].$or.push({'orgs.orgId': {$in : orgsIds}}); + } + + let teamIdsUserBelongs = currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : ''; + if(teamIdsUserBelongs && teamIdsUserBelongs != ''){ + let teamsIds = teamIdsUserBelongs.split(','); + // for(let i = 0; i < teamsIds.length; i++){ + // query.$or[2].$or.push({'teams.teamId': teamsIds[i]}); + // } + //query.$and[2].$or.push({'teams': { $elemMatch : {teamId: teamsIds[0]}}}); + query.$and[2].$or.push({'teams.teamId': {$in : teamsIds}}); + } + } else query.permission = 'public'; return Boards.find(query, { - sort: { sort: 1 /* boards default sorting */ }, + //sort: { sort: 1 /* boards default sorting */ }, }); }, isStarred() { diff --git a/server/publications/boards.js b/server/publications/boards.js index cfe93c0df..12a30e317 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -13,6 +13,17 @@ Meteor.publish('boards', function() { const { starredBoards = [] } = (Users.findOne(userId) || {}).profile || {}; check(starredBoards, [String]); + let currUser = Users.findOne(userId); + let orgIdsUserBelongs = currUser!== 'undefined' && currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : ''; + let teamIdsUserBelongs = currUser!== 'undefined' && currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : ''; + let orgsIds = []; + let teamsIds = []; + if(orgIdsUserBelongs && orgIdsUserBelongs != ''){ + orgsIds = orgIdsUserBelongs.split(','); + } + if(teamIdsUserBelongs && teamIdsUserBelongs != ''){ + teamsIds = teamIdsUserBelongs.split(','); + } return Boards.find( { archived: false, @@ -22,6 +33,8 @@ Meteor.publish('boards', function() { permission: 'public', }, { members: { $elemMatch: { userId, isActive: true } } }, + {'orgs.orgId': {$in : orgsIds}}, + {'teams.teamId': {$in : teamsIds}}, ], }, { @@ -82,11 +95,22 @@ Meteor.publishRelations('board', function(boardId, isArchived) { check(isArchived, Boolean); const thisUserId = this.userId; const $or = [{ permission: 'public' }]; + let currUser = (!Match.test(thisUserId, String) || !thisUserId) ? 'undefined' : Users.findOne(thisUserId); + let orgIdsUserBelongs = currUser!== 'undefined' && currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : ''; + let teamIdsUserBelongs = currUser!== 'undefined' && currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : ''; + let orgsIds = []; + let teamsIds = []; + if(orgIdsUserBelongs && orgIdsUserBelongs != ''){ + orgsIds = orgIdsUserBelongs.split(','); + } + if(teamIdsUserBelongs && teamIdsUserBelongs != ''){ + teamsIds = teamIdsUserBelongs.split(','); + } if (thisUserId) { - $or.push({ - members: { $elemMatch: { userId: thisUserId, isActive: true } }, - }); + $or.push({members: { $elemMatch: { userId: thisUserId, isActive: true } }}); + $or.push({'orgs.orgId': {$in : orgsIds}}); + $or.push({'teams.teamId': {$in : teamsIds}}); } this.cursor( diff --git a/server/publications/users.js b/server/publications/users.js index 152669064..fd6147d13 100644 --- a/server/publications/users.js +++ b/server/publications/users.js @@ -23,6 +23,8 @@ Meteor.publish('user-admin', function() { return Meteor.users.find(this.userId, { fields: { isAdmin: 1, + teams: 1, + orgs: 1, }, }); }); @@ -34,6 +36,8 @@ Meteor.publish('user-authenticationMethod', function(match) { { fields: { authenticationMethod: 1, + teams: 1, + orgs: 1, }, }, ); From fe40f35d6d9b6293f3bdbf5bc0f3e8e708c59518 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 24 Jul 2021 19:20:47 +0300 Subject: [PATCH 09/24] LDAP AD Simple Auth: Added settings for all Wekan Standalone (non-Sandstorm) platforms. Thanks to xet7 ! --- Dockerfile | 5 +- docker-compose.yml | 54 +++++++++---- packages/wekan-ldap/server/ldap.js | 2 +- snap-src/bin/config | 8 +- snap-src/bin/wekan-help | 21 +++-- start-wekan.bat | 48 ++++++++--- start-wekan.sh | 114 +++++++++++++++++++++++++-- torodb-postgresql/docker-compose.yml | 36 ++++++++- 8 files changed, 243 insertions(+), 45 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4cc43624d..3b64ac5e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -64,6 +64,9 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build- LDAP_ENABLE=false \ LDAP_PORT=389 \ LDAP_HOST="" \ + LDAP_AD_SIMPLE_AUTH="" \ + LDAP_USER_AUTHENTICATION=false \ + LDAP_USER_AUTHENTICATION_FIELD=uid \ LDAP_BASEDN="" \ LDAP_LOGIN_FALLBACK=false \ LDAP_RECONNECT=true \ @@ -81,8 +84,6 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build- LDAP_ENCRYPTION=false \ LDAP_CA_CERT="" \ LDAP_REJECT_UNAUTHORIZED=false \ - LDAP_USER_AUTHENTICATION=false \ - LDAP_USER_AUTHENTICATION_FIELD=uid \ LDAP_USER_SEARCH_FILTER="" \ LDAP_USER_SEARCH_SCOPE="" \ LDAP_USER_SEARCH_FIELD="" \ diff --git a/docker-compose.yml b/docker-compose.yml index 7d3701fa7..1a7620087 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -439,16 +439,48 @@ services: # # The host server for the LDAP server #- LDAP_HOST=localhost - # - # set to true, if you want to connect with Active Directory by Simple Authentication - - LDAP_AD_SIMPLE_AUTH=true # - # set to true, if the login user is used for binding - - LDAP_USER_AUTHENTICATION=true + #----------------------------------------------------------------- + # ==== LDAP AD Simple Auth ==== + # + # Set to true, if you want to connect with Active Directory by Simple Authentication. + # When using AD Simple Auth, LDAP_BASEDN is not needed. + # + # Example: + #- LDAP_AD_SIMPLE_AUTH=true + # + # === LDAP User Authentication === + # + # a) Option to login to the LDAP server with the user's own username and password, instead of + # an administrator key. Default: false (use administrator key). + # + # b) When using AD Simple Auth, set to true, when login user is used for binding, + # and LDAP_BASEDN is not needed. + # + # Example: + #- LDAP_USER_AUTHENTICATION=true + # + # Which field is used to find the user for the user authentication. Default: uid. + #- LDAP_USER_AUTHENTICATION_FIELD=uid + # + # === LDAP Default Domain === + # + # a) In case AD SimpleAuth is configured, the default domain is appended to the given + # loginname for creating the correct username for the bind request to AD. + # + # b) The default domain of the ldap it is used to create email if the field is not map + # correctly with the LDAP_SYNC_USER_DATA_FIELDMAP + # + # Example : + #- LDAP_DEFAULT_DOMAIN=mydomain.com + # + #----------------------------------------------------------------- + # ==== LDAP BASEDN Auth ==== # # The base DN for the LDAP Tree #- LDAP_BASEDN=ou=user,dc=example,dc=org # + #----------------------------------------------------------------- # Fallback on the default authentication method #- LDAP_LOGIN_FALLBACK=false # @@ -499,12 +531,6 @@ services: # Reject Unauthorized Certificate #- LDAP_REJECT_UNAUTHORIZED=false # - # Option to login to the LDAP server with the user's own username and password, instead of an administrator key. Default: false (use administrator key). - #- LDAP_USER_AUTHENTICATION=true - # - # Which field is used to find the user for the user authentication. Default: uid. - #- LDAP_USER_AUTHENTICATION_FIELD=uid - # # Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed #- LDAP_USER_SEARCH_FILTER= # @@ -570,10 +596,8 @@ services: # #- LDAP_SYNC_GROUP_ROLES= # - # The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP - # In case SimpleAuth with AD is configured, the default domain is appended to the given loginname for creating the correct username for the bind request to AD - # example : - #- LDAP_DEFAULT_DOMAIN=mydomain.com + # The default domain of the ldap it is used to create email if the field is not map correctly + # with the LDAP_SYNC_USER_DATA_FIELDMAP is defined in setting LDAP_DEFAULT_DOMAIN above. # # Enable/Disable syncing of admin status based on ldap groups: #- LDAP_SYNC_ADMIN_STATUS=true diff --git a/packages/wekan-ldap/server/ldap.js b/packages/wekan-ldap/server/ldap.js index d557d372b..11b629406 100644 --- a/packages/wekan-ldap/server/ldap.js +++ b/packages/wekan-ldap/server/ldap.js @@ -230,7 +230,7 @@ export default class LDAP { if (!this.options.BaseDN && !this.options.AD_Simple_Auth) throw new Error('BaseDN is not provided'); var userDn = ""; - if (this.options.AD_Simple_Auth === true) { + if (this.options.AD_Simple_Auth === true || this.options.AD_Simple_Auth === 'true') { userDn = `${username}@${this.options.Default_Domain}`; } else { userDn = `${this.options.User_Authentication_Field}=${username},${this.options.BaseDN}`; diff --git a/snap-src/bin/config b/snap-src/bin/config index 83ce687be..b1f56e61a 100755 --- a/snap-src/bin/config +++ b/snap-src/bin/config @@ -3,7 +3,7 @@ # All supported keys are defined here together with descriptions and default values # list of supported keys -keys="DEBUG MONGO_LOG_DESTINATION MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CA_CERT OAUTH2_LOGIN_STYLE OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS OAUTH2_ADFS_ENABLED LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD ATTACHMENTS_STORE_PATH PASSWORD_LOGIN_ENABLED CAS_ENABLED CAS_BASE_URL CAS_LOGIN_URL CAS_VALIDATE_URL SAML_ENABLED SAML_PROVIDER SAML_ENTRYPOINT SAML_ISSUER SAML_CERT SAML_IDPSLO_REDIRECTURL SAML_PRIVATE_KEYFILE SAML_PUBLIC_CERTFILE SAML_IDENTIFIER_FORMAT SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE SAML_ATTRIBUTES ORACLE_OIM_ENABLED RESULTS_PER_PAGE WAIT_SPINNER" +keys="DEBUG MONGO_LOG_DESTINATION MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CA_CERT OAUTH2_LOGIN_STYLE OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS OAUTH2_ADFS_ENABLED LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_AD_SIMPLE_AUTH LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD ATTACHMENTS_STORE_PATH PASSWORD_LOGIN_ENABLED CAS_ENABLED CAS_BASE_URL CAS_LOGIN_URL CAS_VALIDATE_URL SAML_ENABLED SAML_PROVIDER SAML_ENTRYPOINT SAML_ISSUER SAML_CERT SAML_IDPSLO_REDIRECTURL SAML_PRIVATE_KEYFILE SAML_PUBLIC_CERTFILE SAML_IDENTIFIER_FORMAT SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE SAML_ATTRIBUTES ORACLE_OIM_ENABLED RESULTS_PER_PAGE WAIT_SPINNER" # default values DESCRIPTION_DEBUG="Debug OIDC OAuth2 etc. Example: sudo snap set wekan debug='true'" @@ -256,6 +256,10 @@ DESCRIPTION_LDAP_HOST="The host server for the LDAP server" DEFAULT_LDAP_HOST="" KEY_LDAP_HOST="ldap-host" +DESCRIPTION_LDAP_AD_SIMPLE_AUTH="LDAP AD Simple Auth. When enabled, ldap-basedn is not needed, and also do set ldap-user-authentication='true'. Example: true" +DEFAULT_LDAP_AD_SIMPLE_AUTH="" +KEY_LDAP_AD_SIMPLE_AUTH="ldap-ad-simple-auth" + DESCRIPTION_LDAP_BASEDN="The base DN for the LDAP Tree" DEFAULT_LDAP_BASEDN="" KEY_LDAP_BASEDN="ldap-basedn" @@ -432,7 +436,7 @@ DESCRIPTION_LDAP_SYNC_ADMIN_GROUPS="Comma separated list of admin group names to DEFAULT_LDAP_SYNC_ADMIN_GROUPS="" KEY_LDAP_SYNC_ADMIN_GROUPS="ldap-sync-admin-groups" -DESCRIPTION_LDAP_DEFAULT_DOMAIN="The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP" +DESCRIPTION_LDAP_DEFAULT_DOMAIN="LDAP default domain. a) In case AD SimpleAuth is configured, the default domain is appended to the given loginname for creating the correct username for the bind request to AD. b) The default domain of the ldap it is used to create email if the field is not map correctly with the ldap-sync-user-data-fieldmap." DEFAULT_LDAP_DEFAULT_DOMAIN="" KEY_LDAP_DEFAULT_DOMAIN="ldap-default-domain" diff --git a/snap-src/bin/wekan-help b/snap-src/bin/wekan-help index 3f7a4c91c..574a6a434 100755 --- a/snap-src/bin/wekan-help +++ b/snap-src/bin/wekan-help @@ -297,6 +297,18 @@ echo -e "Ldap Port." echo -e "The port of the ldap server:" echo -e "\t$ snap set $SNAP_NAME ldap-port='12345'" echo -e "\n" +echo -e "LDAP AD Simple Auth. When enabled, ldap-basedn is not needed, and also do set ldap-user-autentication='true'. Example: true. Enable:" +echo -e "\t$ snap set $SNAP_NAME ldap-ad-simple-auth='true'" +echo -e "\t-Disable the LDAP AD Simple Auth of Wekan:" +echo -e "\t$ snap unset $SNAP_NAME ldap-ad-simple-auth" +echo -e "\n" +echo -e "a) Option to login to the LDAP server with the user's own username and password, instead of an administrator key. Default: false (use administrator key)." +echo -e "b) For LDAP AD Simple Auth, set to true." +echo -e "\t$ snap set $SNAP_NAME ldap-user-authentication='true'" +echo -e "\n" +echo -e "Which field is used to find the user for the user authentication. Default: uid." +echo -e "\t$ snap set $SNAP_NAME ldap-user-authentication-field='uid'" +echo -e "\n" echo -e "Ldap Host." echo -e "The host server for the LDAP server:" echo -e "\t$ snap set $SNAP_NAME ldap-host='localhost'" @@ -370,12 +382,6 @@ echo -e "Ldap Reject Unauthorized." echo -e "Reject Unauthorized Certificate:" echo -e "\t$ snap set $SNAP_NAME ldap-reject-unauthorized='true'" echo -e "\n" -echo -e "Option to login to the LDAP server with the user's own username and password, instead of an administrator key. Default: false (use administrator key)." -echo -e "\t$ snap set $SNAP_NAME ldap-user-authentication='true'" -echo -e "\n" -echo -e "Which field is used to find the user for the user authentication. Default: uid." -echo -e "\t$ snap set $SNAP_NAME ldap-user-authentication-field='uid'" -echo -e "\n" echo -e "Ldap User Search Filter." echo -e "Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed:" echo -e "\t$ snap set $SNAP_NAME ldap-user-search-filter=''" @@ -460,7 +466,8 @@ echo -e "Ldap Sync Group Roles." echo -e "\t$ snap set $SNAP_NAME ldap-sync-group-roles=''" echo -e "\n" echo -e "Ldap Default Domain." -echo -e "The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP:" +echo -e "a) In case AD SimpleAuth is configured, the default domain is appended to the given loginname for creating the correct username for the bind request to AD." +echo -e "b) The default domain of the ldap it is used to create email if the field is not map correctly with the ldap-sync-user-data-fieldmap." echo -e "\t$ snap set $SNAP_NAME ldap-default-domain=''" echo -e "\n" echo -e "Enable/Disable syncing of admin status based on LDAP groups." diff --git a/start-wekan.bat b/start-wekan.bat index 64eeb405d..0d7cf9f98 100644 --- a/start-wekan.bat +++ b/start-wekan.bat @@ -190,10 +190,45 @@ REM # LDAP_HOST : The host server for the LDAP server REM # example : LDAP_HOST=localhost REM SET LDAP_HOST= +REM #----------------------------------------------------------------- +REM # ==== LDAP AD Simple Auth ==== +REM # Set to true, if you want to connect with Active Directory by Simple Authentication. +REM # When using AD Simple Auth, LDAP_BASEDN is not needed. +REM SET LDAP_AD_SIMPLE_AUTH=true + +REM #----------------------------------------------------------------- +REM # === LDAP User Authentication === +REM # +REM # a) Option to login to the LDAP server with the user's own username and password, instead of +REM # an administrator key. Default: false (use administrator key). +REM # +REM # b) When using AD Simple Auth, set to true, when login user is used for binding, +REM # and LDAP_BASEDN is not needed. +REM # +REM # Example: +REM SET LDAP_USER_AUTHENTICATION=true + +REM # Which field is used to find the user for the user authentication. Default: uid. +REM SET LDAP_USER_AUTHENTICATION_FIELD=uid + +REM # === LDAP Default Domain === +REM # +REM # a) In case AD SimpleAuth is configured, the default domain is appended to the given +REM # loginname for creating the correct username for the bind request to AD. +REM # +REM # b) The default domain of the ldap it is used to create email if the field is not map +REM # correctly with the LDAP_SYNC_USER_DATA_FIELDMAP +REM # +REM # Example : +REM SET LDAP_DEFAULT_DOMAIN=mydomain.com + +REM #----------------------------------------------------------------- +REM # ==== LDAP BASEDN Auth ==== REM # LDAP_BASEDN : The base DN for the LDAP Tree REM # example : LDAP_BASEDN=ou=user,dc=example,dc=org REM SET LDAP_BASEDN= +REM #----------------------------------------------------------------- REM # LDAP_LOGIN_FALLBACK : Fallback on the default authentication method REM # example : LDAP_LOGIN_FALLBACK=true REM SET LDAP_LOGIN_FALLBACK=false @@ -265,12 +300,6 @@ REM # LDAP_REJECT_UNAUTHORIZED : Reject Unauthorized Certificate REM # example : LDAP_REJECT_UNAUTHORIZED=true REM SET LDAP_REJECT_UNAUTHORIZED=false -REM # Option to login to the LDAP server with the user's own username and password, instead of an administrator key. Default: false (use administrator key). -REM SET LDAP_USER_AUTHENTICATION=true - -REM # Which field is used to find the user for the user authentication. Default: uid. -REM SET LDAP_USER_AUTHENTICATION_FIELD=uid - REM # LDAP_USER_SEARCH_FILTER : Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed REM # example : LDAP_USER_SEARCH_FILTER= REM SET LDAP_USER_SEARCH_FILTER= @@ -355,14 +384,13 @@ REM # LDAP_SYNC_USER_DATA_FIELDMAP : REM # example : LDAP_SYNC_USER_DATA_FIELDMAP={"cn":"name", "mail":"email"} REM SET LDAP_SYNC_USER_DATA_FIELDMAP= +REM # The default domain of the ldap it is used to create email if the field is not map correctly +REM # with the LDAP_SYNC_USER_DATA_FIELDMAP is defined in setting LDAP_DEFAULT_DOMAIN above. + REM # LDAP_SYNC_GROUP_ROLES : REM # example : REM # SET LDAP_SYNC_GROUP_ROLES= -REM # LDAP_DEFAULT_DOMAIN : The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP -REM # example : -REM SET LDAP_DEFAULT_DOMAIN= - REM # Enable/Disable syncing of admin status based on ldap groups: REM SET LDAP_SYNC_ADMIN_STATUS=true diff --git a/start-wekan.sh b/start-wekan.sh index a4eeb31ae..d5f933f9c 100755 --- a/start-wekan.sh +++ b/start-wekan.sh @@ -111,6 +111,7 @@ ## The option that allows matomo to retrieve the username: # Example: export MATOMO_WITH_USERNAME=true #export MATOMO_WITH_USERNAME='false' + #--------------------------------------------- # Enable browser policy and allow one trusted URL that can have iframe that has Wekan embedded inside. # Setting this to false is not recommended, it also disables all other browser policy protections # and allows all iframing etc. See wekan/server/policy.js @@ -133,27 +134,36 @@ # 2) Configure the environment variables. This differs slightly # by installation type, but make sure you have the following: #export OAUTH2_ENABLED=true + # # Optional OAuth2 CA Cert, see https://github.com/wekan/wekan/issues/3299 #export OAUTH2_CA_CERT=ABCD1234 + # # Use OAuth2 ADFS additional changes. Also needs OAUTH2_ENABLED=true setting. #export OAUTH2_ADFS_ENABLED=false + # # OAuth2 docs: https://github.com/wekan/wekan/wiki/OAuth2 # OAuth2 login style: popup or redirect. #export OAUTH2_LOGIN_STYLE=redirect + # # Application GUID captured during app registration: #export OAUTH2_CLIENT_ID=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx + # # Secret key generated during app registration: #export OAUTH2_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx #export OAUTH2_SERVER_URL=https://login.microsoftonline.com/ #export OAUTH2_AUTH_ENDPOINT=/oauth2/v2.0/authorize #export OAUTH2_USERINFO_ENDPOINT=https://graph.microsoft.com/oidc/userinfo #export OAUTH2_TOKEN_ENDPOINT=/oauth2/v2.0/token + # # The claim name you want to map to the unique ID field: #export OAUTH2_ID_MAP=email + # # The claim name you want to map to the username field: #export OAUTH2_USERNAME_MAP=email + # # The claim name you want to map to the full name field: #export OAUTH2_FULLNAME_MAP=name + # # The claim name you want to map to the email field: #export OAUTH2_EMAIL_MAP=email #----------------------------------------------------------------- @@ -175,63 +185,124 @@ # https://github.com/wekan/wekan/wiki/OAuth2 # Enable the OAuth2 connection #export OAUTH2_ENABLED=true + # # OAuth2 login style: popup or redirect. #export OAUTH2_LOGIN_STYLE=redirect + # # OAuth2 Client ID. #export OAUTH2_CLIENT_ID=abcde12345 + # # OAuth2 Secret. #export OAUTH2_SECRET=54321abcde + # # OAuth2 Server URL. #export OAUTH2_SERVER_URL=https://chat.example.com + # # OAuth2 Authorization Endpoint. #export OAUTH2_AUTH_ENDPOINT=/oauth/authorize + # # OAuth2 Userinfo Endpoint. #export OAUTH2_USERINFO_ENDPOINT=/oauth/userinfo + # # OAuth2 Token Endpoint. #export OAUTH2_TOKEN_ENDPOINT=/oauth/token + # # OAUTH2 ID Token Whitelist Fields. #export OAUTH2_ID_TOKEN_WHITELIST_FIELDS=[] + # # OAUTH2 Request Permissions. #export OAUTH2_REQUEST_PERMISSIONS='openid profile email' + # # OAuth2 ID Mapping #export OAUTH2_ID_MAP= + # # OAuth2 Username Mapping #export OAUTH2_USERNAME_MAP= + # # OAuth2 Fullname Mapping #export OAUTH2_FULLNAME_MAP= + # # OAuth2 Email Mapping #export OAUTH2_EMAIL_MAP= #--------------------------------------------- # LDAP_ENABLE : Enable or not the connection by the LDAP # example : export LDAP_ENABLE=true #export LDAP_ENABLE=false + # # LDAP_PORT : The port of the LDAP server # example : export LDAP_PORT=389 #export LDAP_PORT=389 + # # LDAP_HOST : The host server for the LDAP server # example : export LDAP_HOST=localhost #export LDAP_HOST= + # + #----------------------------------------------------------------- + # ==== LDAP AD Simple Auth ==== + # + # Set to true, if you want to connect with Active Directory by Simple Authentication. + # When using AD Simple Auth, LDAP_BASEDN is not needed. + # + # Example: + #export LDAP_AD_SIMPLE_AUTH=true + # + # === LDAP User Authentication === + # + # a) Option to login to the LDAP server with the user's own username and password, instead of + # an administrator key. Default: false (use administrator key). + # + # b) When using AD Simple Auth, set to true, when login user is used for binding, + # and LDAP_BASEDN is not needed. + # + # Example: + #export LDAP_USER_AUTHENTICATION=true + # + # Which field is used to find the user for the user authentication. Default: uid. + #export LDAP_USER_AUTHENTICATION_FIELD=uid + # + # === LDAP Default Domain === + # + # a) In case AD SimpleAuth is configured, the default domain is appended to the given + # loginname for creating the correct username for the bind request to AD. + # + # b) The default domain of the ldap it is used to create email if the field is not map + # correctly with the LDAP_SYNC_USER_DATA_FIELDMAP + # + # Example : + #export LDAP_DEFAULT_DOMAIN=mydomain.com + # + #----------------------------------------------------------------- + # ==== LDAP BASEDN Auth ==== + # # LDAP_BASEDN : The base DN for the LDAP Tree # example : export LDAP_BASEDN=ou=user,dc=example,dc=org #export LDAP_BASEDN= + # + #--------------------------------------------- # LDAP_LOGIN_FALLBACK : Fallback on the default authentication method # example : export LDAP_LOGIN_FALLBACK=true #export LDAP_LOGIN_FALLBACK=false + # # LDAP_RECONNECT : Reconnect to the server if the connection is lost # example : export LDAP_RECONNECT=false #export LDAP_RECONNECT=true + # # LDAP_TIMEOUT : Overall timeout, in milliseconds # example : export LDAP_TIMEOUT=12345 #export LDAP_TIMEOUT=10000 + # # LDAP_IDLE_TIMEOUT : Specifies the timeout for idle LDAP connections in milliseconds # example : export LDAP_IDLE_TIMEOUT=12345 #export LDAP_IDLE_TIMEOUT=10000 + # # LDAP_CONNECT_TIMEOUT : Connection timeout, in milliseconds # example : export LDAP_CONNECT_TIMEOUT=12345 #export LDAP_CONNECT_TIMEOUT=10000 + # # LDAP_AUTHENTIFICATION : If the LDAP needs a user account to search # example : export LDAP_AUTHENTIFICATION=true #export LDAP_AUTHENTIFICATION=false + # # LDAP_AUTHENTIFICATION_USERDN : The search user DN # example : export LDAP_AUTHENTIFICATION_USERDN=cn=admin,dc=example,dc=org #---------------------------------------------------------------------------- @@ -243,110 +314,139 @@ # LDAP_AUTHENTIFICATION_PASSWORD : The password for the search user # example : AUTHENTIFICATION_PASSWORD=admin #export LDAP_AUTHENTIFICATION_PASSWORD= + # # LDAP_LOG_ENABLED : Enable logs for the module # example : export LDAP_LOG_ENABLED=true #export LDAP_LOG_ENABLED=false + # # LDAP_BACKGROUND_SYNC : If the sync of the users should be done in the background # example : export LDAP_BACKGROUND_SYNC=true #export LDAP_BACKGROUND_SYNC=false + # # LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds # At which interval does the background task sync in milliseconds. # Leave this unset, so it uses default, and does not crash. # https://github.com/wekan/wekan/issues/2354#issuecomment-515305722 export LDAP_BACKGROUND_SYNC_INTERVAL='' + # # LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED : # example : export LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=true #export LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=false + # # LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS : # example : export LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS=true #export LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS=false + # # LDAP_ENCRYPTION : If using LDAPS # example : export LDAP_ENCRYPTION=ssl #export LDAP_ENCRYPTION=false + # # LDAP_CA_CERT : The certification for the LDAPS server. Certificate needs to be included in this docker-compose.yml file. # example : export LDAP_CA_CERT=-----BEGIN CERTIFICATE-----MIIE+zCCA+OgAwIBAgIkAhwR/6TVLmdRY6hHxvUFWc0+Enmu/Hu6cj+G2FIdAgIC...-----END CERTIFICATE----- #export LDAP_CA_CERT= + # # LDAP_REJECT_UNAUTHORIZED : Reject Unauthorized Certificate # example : export LDAP_REJECT_UNAUTHORIZED=true #export LDAP_REJECT_UNAUTHORIZED=false - # Option to login to the LDAP server with the user's own username and password, instead of an administrator key. Default: false (use administrator key). - #export LDAP_USER_AUTHENTICATION=true - # Which field is used to find the user for the user authentication. Default: uid. - #export LDAP_USER_AUTHENTICATION_FIELD=uid + # # LDAP_USER_SEARCH_FILTER : Optional extra LDAP filters. Don't forget the outmost enclosing parentheses if needed # example : export LDAP_USER_SEARCH_FILTER= #export LDAP_USER_SEARCH_FILTER= + # # LDAP_USER_SEARCH_SCOPE : base (search only in the provided DN), one (search only in the provided DN and one level deep), or sub (search the whole subtree) # example : export LDAP_USER_SEARCH_SCOPE=one #export LDAP_USER_SEARCH_SCOPE= + # # LDAP_USER_SEARCH_FIELD : Which field is used to find the user # example : export LDAP_USER_SEARCH_FIELD=uid #export LDAP_USER_SEARCH_FIELD= + # # LDAP_SEARCH_PAGE_SIZE : Used for pagination (0=unlimited) # example : export LDAP_SEARCH_PAGE_SIZE=12345 #export LDAP_SEARCH_PAGE_SIZE=0 + # # LDAP_SEARCH_SIZE_LIMIT : The limit number of entries (0=unlimited) # example : export LDAP_SEARCH_SIZE_LIMIT=12345 #export LDAP_SEARCH_SIZE_LIMIT=0 + # # LDAP_GROUP_FILTER_ENABLE : Enable group filtering # example : export LDAP_GROUP_FILTER_ENABLE=true #export LDAP_GROUP_FILTER_ENABLE=false + # # LDAP_GROUP_FILTER_OBJECTCLASS : The object class for filtering # example : export LDAP_GROUP_FILTER_OBJECTCLASS=group #export LDAP_GROUP_FILTER_OBJECTCLASS= + # # LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE : # example : #export LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE= + # # LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE : # example : #export LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE= + # # LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT : # example : #export LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT= + # # LDAP_GROUP_FILTER_GROUP_NAME : # example : #export LDAP_GROUP_FILTER_GROUP_NAME= + # # LDAP_UNIQUE_IDENTIFIER_FIELD : This field is sometimes class GUID (Globally Unique Identifier) # example : export LDAP_UNIQUE_IDENTIFIER_FIELD=guid #export LDAP_UNIQUE_IDENTIFIER_FIELD= + # # LDAP_UTF8_NAMES_SLUGIFY : Convert the username to utf8 # example : export LDAP_UTF8_NAMES_SLUGIFY=false #export LDAP_UTF8_NAMES_SLUGIFY=true + # # LDAP_USERNAME_FIELD : Which field contains the ldap username # example : export LDAP_USERNAME_FIELD=username #export LDAP_USERNAME_FIELD= + # # LDAP_FULLNAME_FIELD : Which field contains the ldap fullname # example : export LDAP_FULLNAME_FIELD=fullname #export LDAP_FULLNAME_FIELD= + # # LDAP_MERGE_EXISTING_USERS : # example : export LDAP_MERGE_EXISTING_USERS=true #export LDAP_MERGE_EXISTING_USERS=false + # # LDAP_EMAIL_MATCH_ENABLE : allow existing account matching by e-mail address when username does not match # example: LDAP_EMAIL_MATCH_ENABLE=true #export LDAP_EMAIL_MATCH_ENABLE=false + # # LDAP_EMAIL_MATCH_REQUIRE : require existing account matching by e-mail address when username does match # example: LDAP_EMAIL_MATCH_REQUIRE=true #export LDAP_EMAIL_MATCH_REQUIRE=false + # # LDAP_EMAIL_MATCH_VERIFIED : require existing account email address to be verified for matching # example: LDAP_EMAIL_MATCH_VERIFIED=true #export LDAP_EMAIL_MATCH_VERIFIED=false + # # LDAP_EMAIL_FIELD : which field contains the LDAP e-mail address # example: LDAP_EMAIL_FIELD=mail #export LDAP_EMAIL_FIELD= + # # LDAP_SYNC_USER_DATA : # example : export LDAP_SYNC_USER_DATA=true #export LDAP_SYNC_USER_DATA=false + # # LDAP_SYNC_USER_DATA_FIELDMAP : # example : export LDAP_SYNC_USER_DATA_FIELDMAP={"cn":"name", "mail":"email"} #export LDAP_SYNC_USER_DATA_FIELDMAP= + # + # The default domain of the ldap it is used to create email if the field is not map correctly + # with the LDAP_SYNC_USER_DATA_FIELDMAP is defined in setting LDAP_DEFAULT_DOMAIN above. + # # LDAP_SYNC_GROUP_ROLES : # example : #export LDAP_SYNC_GROUP_ROLES= - # LDAP_DEFAULT_DOMAIN : The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP - # example : - #export LDAP_DEFAULT_DOMAIN= + # # Enable/Disable syncing of admin status based on ldap groups: #export LDAP_SYNC_ADMIN_STATUS=true + # # Comma separated list of admin group names to sync. #export LDAP_SYNC_ADMIN_GROUPS=group1,group2 #--------------------------------------------------------------------- diff --git a/torodb-postgresql/docker-compose.yml b/torodb-postgresql/docker-compose.yml index 29b7effc7..1a627df6c 100644 --- a/torodb-postgresql/docker-compose.yml +++ b/torodb-postgresql/docker-compose.yml @@ -372,10 +372,43 @@ services: # example : LDAP_HOST=localhost #- LDAP_HOST= # + #----------------------------------------------------------------- + # ==== LDAP AD Simple Auth ==== + # + # Set to true, if you want to connect with Active Directory by Simple Authentication. + # When using AD Simple Auth, LDAP_BASEDN is not needed. + #- LDAP_AD_SIMPLE_AUTH=true + # + # === Related settings ELSEWHERE IN THIS FILE, NOT HERE === + # + # Option to login to the LDAP server with the user's own username and password, instead of + # an administrator key. Default: false (use administrator key). When using AD Simple Auth, set to true. + # Set to true, if the login user is used for binding. Used with AD Simple Auth. + # When using AD Simple Auth, LDAP_BASEDN is not needed. + ##ELSEWHERE IN THIS SETTINGS FILE, NOT HERE: #- LDAP_USER_AUTHENTICATION=true + # + # Which field is used to find the user for the user authentication. Default: uid. + ##ELSEWHERE IN THIS SETTINGS FILE, NOT HERE:#- LDAP_USER_AUTHENTICATION_FIELD=uid + # + # === LDAP Default Domain: 2 different use cases, a/b === + # + # a) The default domain of the ldap it is used to create email if the field is not map + # correctly with the LDAP_SYNC_USER_DATA_FIELDMAP + # + # b) In case AD SimpleAuth is configured, the default domain is appended to the given + # loginname for creating the correct username for the bind request to AD. + # + # Example : + ##ELSEWHERE IN THIS SETTINGS FILE, NOT HERE:- LDAP_DEFAULT_DOMAIN=mydomain.com + # + #----------------------------------------------------------------- + # ==== LDAP BASEDN Auth ==== + # # LDAP_BASEDN : The base DN for the LDAP Tree # example : LDAP_BASEDN=ou=user,dc=example,dc=org #- LDAP_BASEDN= # + #----------------------------------------------------------------- # LDAP_LOGIN_FALLBACK : Fallback on the default authentication method # example : LDAP_LOGIN_FALLBACK=true #- LDAP_LOGIN_FALLBACK=false @@ -504,7 +537,7 @@ services: # LDAP_MERGE_EXISTING_USERS : # example : LDAP_MERGE_EXISTING_USERS=true #- LDAP_MERGE_EXISTING_USERS=false - #----------------------------------------------------------------- + # # LDAP_SYNC_USER_DATA : # example : LDAP_SYNC_USER_DATA=true #- LDAP_SYNC_USER_DATA=false @@ -520,6 +553,7 @@ services: # LDAP_DEFAULT_DOMAIN : The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP # example : #- LDAP_DEFAULT_DOMAIN= + # #--------------------------------------------------------------------- # ==== LOGOUT TIMER, probably does not work yet ==== # LOGOUT_WITH_TIMER : Enables or not the option logout with timer From fe25ed52024016457006832420209d8fdd45f9a3 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 24 Jul 2021 19:25:49 +0300 Subject: [PATCH 10/24] Updated ChangeLog. --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c487cc890..178a1d6ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,19 @@ Note: With Docker, please don't use latest tag. Only use release tags. See https://github.com/wekan/wekan/issues/3874 +# Upcoming Wekan release + +This release adds the following new features: + +- [LDAP AD Simple Auth](https://github.com/wekan/wekan/pull/3909). + Thanks to indika-dev. +- [LDAP AD Simple Auth: Added settings for all remainin Wekan Standalone (non-Sandstorm) + platforms](https://github.com/wekan/wekan/commit/fe40f35d6d9b6293f3bdbf5bc0f3e8e708c59518) + and Docs to https://github.com/wekan/wekan/wiki/LDAP-AD-Simple-Auth . + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v5.38 2021-07-18 Wekan release This release adds the following new features: From d7cb143b0a1624b9007b27dfae2cb2bf97c9033f Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 24 Jul 2021 19:35:24 +0300 Subject: [PATCH 11/24] Fix typo. --- client/components/cards/checklists.styl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/cards/checklists.styl b/client/components/cards/checklists.styl index 0e2b058b7..1b855d431 100644 --- a/client/components/cards/checklists.styl +++ b/client/components/cards/checklists.styl @@ -159,7 +159,7 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item padding-top: 2px padding-right: 10px; -.js-delete-checklist-item +.js-delete-checklist-item, .js-convert-checklist-item-to-card margin: 0 0 0.5em 1.33em @extends .delete-text From 542972fc5cfd738ff47e728289358315697eb668 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 24 Jul 2021 19:37:18 +0300 Subject: [PATCH 12/24] Updated ChangeLog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 178a1d6ed..804503fa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ This release adds the following new features: platforms](https://github.com/wekan/wekan/commit/fe40f35d6d9b6293f3bdbf5bc0f3e8e708c59518) and Docs to https://github.com/wekan/wekan/wiki/LDAP-AD-Simple-Auth . Thanks to xet7. +- [Convert Checklist Item to Card](https://github.com/wekan/wekan/pull/3910). + Thanks to helioguardabaxo. Thanks to above GitHub users for their contributions and translators for their translations. From ae73029dda63db361925e378202e6f8c137cf5bd Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sat, 24 Jul 2021 19:57:07 +0300 Subject: [PATCH 13/24] Added translation: English (Italy). Thanks to translators! --- .tx/config | 2 +- client/components/main/layouts.js | 2 + client/components/users/userHeader.js | 2 + i18n/ar-EG.i18n.json | 1 + i18n/ar.i18n.json | 1 + i18n/bg.i18n.json | 1 + i18n/br.i18n.json | 1 + i18n/ca.i18n.json | 1 + i18n/cs.i18n.json | 1 + i18n/da.i18n.json | 1 + i18n/de-CH.i18n.json | 1 + i18n/de.i18n.json | 1 + i18n/el.i18n.json | 1 + i18n/en-GB.i18n.json | 1 + i18n/en-IT.i18n.json | 1063 ++++++++++++++++++++ i18n/eo.i18n.json | 1 + i18n/es-AR.i18n.json | 1 + i18n/es-CL.i18n.json | 1 + i18n/es-LA.i18n.json | 1 + i18n/es-MX.i18n.json | 1 + i18n/es-PE.i18n.json | 1 + i18n/es-PY.i18n.json | 1 + i18n/es.i18n.json | 1 + i18n/eu.i18n.json | 1 + i18n/fa-IR.i18n.json | 1 + i18n/fa.i18n.json | 1 + i18n/fi.i18n.json | 1 + i18n/fr.i18n.json | 1 + i18n/gl.i18n.json | 1 + i18n/he.i18n.json | 1 + i18n/hi.i18n.json | 1 + i18n/hr.i18n.json | 1 + i18n/hu.i18n.json | 1 + i18n/hy.i18n.json | 1 + i18n/id.i18n.json | 1 + i18n/ig.i18n.json | 1 + i18n/it.i18n.json | 7 +- i18n/ja.i18n.json | 1 + i18n/ka.i18n.json | 1 + i18n/km.i18n.json | 1 + i18n/ko.i18n.json | 1 + i18n/lt.i18n.json | 1 + i18n/lv.i18n.json | 1 + i18n/mk.i18n.json | 1 + i18n/mn.i18n.json | 1 + i18n/nb.i18n.json | 1 + i18n/nl.i18n.json | 1 + i18n/oc.i18n.json | 1 + i18n/pa.i18n.json | 1 + i18n/pl.i18n.json | 1 + i18n/pt-BR.i18n.json | 1 + i18n/pt.i18n.json | 1 + i18n/ro.i18n.json | 1 + i18n/ru.i18n.json | 1 + i18n/sk.i18n.json | 1 + i18n/sl.i18n.json | 1 + i18n/sr.i18n.json | 1 + i18n/sv.i18n.json | 1 + i18n/sw.i18n.json | 1 + i18n/ta.i18n.json | 1 + i18n/th.i18n.json | 1 + i18n/tr.i18n.json | 1 + i18n/uk.i18n.json | 1 + i18n/vi.i18n.json | 1 + i18n/zh-CN.i18n.json | 63 +- i18n/zh-HK.i18n.json | 1 + i18n/zh-TW.i18n.json | 1 + releases/translations/pull-translations.sh | 3 + 68 files changed, 1168 insertions(+), 35 deletions(-) create mode 100644 i18n/en-IT.i18n.json diff --git a/.tx/config b/.tx/config index 8fb7d447b..7ff185a9e 100644 --- a/.tx/config +++ b/.tx/config @@ -39,7 +39,7 @@ host = https://www.transifex.com # tap:i18n requires us to use `-` separator in the language identifiers whereas # Transifex uses a `_` separator, without an option to customize it on one side # or the other, so we need to do a Manual mapping. -lang_map = ar_EG:ar-EG, bg_BG:bg, de_CH:de-CH, en_GB:en-GB, es_AR:es-AR, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el, fa_IR:fa-IR, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_HK:zh-HK +lang_map = ar_EG:ar-EG, bg_BG:bg, de_CH:de-CH, en_IT:en-IT, en_GB:en-GB, es_AR:es-AR, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el, fa_IR:fa-IR, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_HK:zh-HK [wekan.application] file_filter = i18n/.i18n.json diff --git a/client/components/main/layouts.js b/client/components/main/layouts.js index cb06804e3..bf290bd5a 100644 --- a/client/components/main/layouts.js +++ b/client/components/main/layouts.js @@ -92,6 +92,8 @@ Template.userFormsLayout.helpers({ name = 'Latviešu'; } else if (lang.name === 'latviešu valoda') { name = 'Latviešu'; + } else if (lang.name === 'en-IT') { + name = 'English (Italy)'; } else if (lang.name === 'Español') { name = 'español'; } else if (lang.name === 'es_419') { diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 1a12199a1..bf46b997a 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -186,6 +186,8 @@ Template.changeLanguagePopup.helpers({ name = 'Latviešu'; } else if (lang.name === 'latviešu valoda') { name = 'Latviešu'; + } else if (lang.name === 'en-IT') { + name = 'English (Italy)'; } else if (lang.name === 'Español') { name = 'español'; } else if (lang.name === 'es_419') { diff --git a/i18n/ar-EG.i18n.json b/i18n/ar-EG.i18n.json index f596968c0..76864a1c4 100644 --- a/i18n/ar-EG.i18n.json +++ b/i18n/ar-EG.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index da925a737..5f93b7c74 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "إضافة مهمة فرعية", "add-checklist": "إضافة قائمة تدقيق", "add-checklist-item": "إضافة عنصر إلى قائمة التحقق", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "إضافة غلاف", "add-label": "إضافة ملصق", "add-list": "إضافة قائمة", diff --git a/i18n/bg.i18n.json b/i18n/bg.i18n.json index fdee8fcdf..014cbca3d 100644 --- a/i18n/bg.i18n.json +++ b/i18n/bg.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Добави подзадача", "add-checklist": "Добави списък със задачи", "add-checklist-item": "Добави точка към списъка със задачи", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Добави корица", "add-label": "Добави етикет", "add-list": "Добави списък", diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index a3ed035b4..e0e728fca 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Ouzphenn ur golo", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index d171d017f..aae4661f7 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Afegir Subtasca", "add-checklist": "Afegeix checklist", "add-checklist-item": "Afegeix un ítem al checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Afegeix coberta", "add-label": "Afegeix etiqueta", "add-list": "Afegeix llista", diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index f3f8b1e4d..87681fa31 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Přidat Podúkol", "add-checklist": "Přidat zaškrtávací seznam", "add-checklist-item": "Přidat položku do zaškrtávacího seznamu", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Přidat obal", "add-label": "Přidat štítek", "add-list": "Přidat sloupec", diff --git a/i18n/da.i18n.json b/i18n/da.i18n.json index 83521b58b..223628316 100644 --- a/i18n/da.i18n.json +++ b/i18n/da.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Tilføj delopgave", "add-checklist": "Tilføj tjekliste", "add-checklist-item": "Tilføj et element til tjeklisten", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Tilføj omslag", "add-label": "Tilføj etikette", "add-list": "Tilføj liste", diff --git a/i18n/de-CH.i18n.json b/i18n/de-CH.i18n.json index f4ad5e955..04fb82ee0 100644 --- a/i18n/de-CH.i18n.json +++ b/i18n/de-CH.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Teilaufgabe hinzufügen", "add-checklist": "Checkliste hinzufügen", "add-checklist-item": "Element zu Checkliste hinzufügen", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Cover hinzufügen", "add-label": "Label hinzufügen", "add-list": "Liste hinzufügen", diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 03b689b35..099ec34fa 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Teilaufgabe hinzufügen", "add-checklist": "Checkliste hinzufügen", "add-checklist-item": "Element zu Checkliste hinzufügen", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Cover hinzufügen", "add-label": "Label hinzufügen", "add-list": "Liste hinzufügen", diff --git a/i18n/el.i18n.json b/i18n/el.i18n.json index a61701a9f..02eb3b240 100644 --- a/i18n/el.i18n.json +++ b/i18n/el.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Προσθήκη Υποεργασίας", "add-checklist": "Προσθήκη Λίστας ελέγχου", "add-checklist-item": "Προσθήκη ενός στοιχείου στη λίστα ελέγχου - checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Προσθήκη Ετικέτας", "add-list": "Προσθήκη Λίστας", diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json index bf5f8f711..e08df9f53 100644 --- a/i18n/en-GB.i18n.json +++ b/i18n/en-GB.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/en-IT.i18n.json b/i18n/en-IT.i18n.json new file mode 100644 index 000000000..76864a1c4 --- /dev/null +++ b/i18n/en-IT.i18n.json @@ -0,0 +1,1063 @@ +{ + "accept": "Accept", + "act-activity-notify": "Activity Notification", + "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createBoard": "created board __board__", + "act-createSwimlane": "created swimlane __swimlane__ to board __board__", + "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-createCustomField": "created custom field __customField__ at board __board__", + "act-deleteCustomField": "deleted custom field __customField__ at board __board__", + "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-createList": "added list __list__ to board __board__", + "act-addBoardMember": "added member __member__ to board __board__", + "act-archivedBoard": "Board __board__ moved to Archive", + "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", + "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", + "act-importBoard": "imported board __board__", + "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", + "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", + "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-removeBoardMember": "removed member __member__ from board __board__", + "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", + "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Actions", + "activities": "Activities", + "activity": "Activity", + "activity-added": "added %s to %s", + "activity-archived": "%s moved to Archive", + "activity-attached": "attached %s to %s", + "activity-created": "created %s", + "activity-customfield-created": "created custom field %s", + "activity-excluded": "excluded %s from %s", + "activity-imported": "imported %s into %s from %s", + "activity-imported-board": "imported %s from %s", + "activity-joined": "joined %s", + "activity-moved": "moved %s from %s to %s", + "activity-on": "on %s", + "activity-removed": "removed %s from %s", + "activity-sent": "sent %s to %s", + "activity-unjoined": "unjoined %s", + "activity-subtask-added": "added subtask to %s", + "activity-checked-item": "checked %s in checklist %s of %s", + "activity-unchecked-item": "unchecked %s in checklist %s of %s", + "activity-checklist-added": "added checklist to %s", + "activity-checklist-removed": "removed a checklist from %s", + "activity-checklist-completed": "completed checklist %s of %s", + "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", + "activity-checklist-item-added": "added checklist item to '%s' in %s", + "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", + "add": "Add", + "activity-checked-item-card": "checked %s in checklist %s", + "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "uncompleted the checklist %s", + "activity-editComment": "edited comment %s", + "activity-deleteComment": "deleted comment %s", + "activity-receivedDate": "edited received date to %s of %s", + "activity-startDate": "edited start date to %s of %s", + "activity-dueDate": "edited due date to %s of %s", + "activity-endDate": "edited end date to %s of %s", + "add-attachment": "Add Attachment", + "add-board": "Add Board", + "add-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "admin": "Admin", + "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", + "all-boards": "All boards", + "and-n-other-card": "And __count__ other card", + "and-n-other-card_plural": "And __count__ other cards", + "apply": "Apply", + "app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", + "archive": "Move to Archive", + "archive-all": "Move All to Archive", + "archive-board": "Move Board to Archive", + "archive-card": "Move Card to Archive", + "archive-list": "Move List to Archive", + "archive-swimlane": "Move Swimlane to Archive", + "archive-selection": "Move selection to Archive", + "archiveBoardPopup-title": "Move Board to Archive?", + "archived-items": "Archive", + "archived-boards": "Boards in Archive", + "restore-board": "Restore Board", + "no-archived-boards": "No Boards in Archive.", + "archives": "Archive", + "template": "Template", + "templates": "Templates", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "Assign member", + "attached": "attached", + "attachment": "Attachment", + "attachment-delete-pop": "Deleting an attachment is permanent. There is no undo.", + "attachmentDeletePopup-title": "Delete Attachment?", + "attachments": "Attachments", + "auto-watch": "Automatically watch boards when they are created", + "avatar-too-big": "The avatar is too large (520KB max)", + "back": "Back", + "board-change-color": "Change color", + "board-nb-stars": "%s stars", + "board-not-found": "Board not found", + "board-private-info": "This board will be private.", + "board-public-info": "This board will be public.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "Change Board Background", + "boardChangeTitlePopup-title": "Rename Board", + "boardChangeVisibilityPopup-title": "Change Visibility", + "boardChangeWatchPopup-title": "Change Watch", + "boardMenuPopup-title": "Board Settings", + "boardChangeViewPopup-title": "Board View", + "boards": "Boards", + "board-view": "Board View", + "board-view-cal": "Calendar", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Collapse", + "board-view-gantt": "Gantt", + "board-view-lists": "Lists", + "bucket-example": "Like “Bucket List” for example", + "cancel": "Cancel", + "card-archived": "This card is moved to Archive.", + "board-archived": "This board is moved to Archive.", + "card-comments-title": "This card has %s comment.", + "card-delete-notice": "Deleting is permanent. You will lose all actions associated with this card.", + "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.", + "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-due": "Due", + "card-due-on": "Due on", + "card-spent": "Spent Time", + "card-edit-attachments": "Edit attachments", + "card-edit-custom-fields": "Edit custom fields", + "card-edit-labels": "Edit labels", + "card-edit-members": "Edit members", + "card-labels-title": "Change the labels for the card.", + "card-members-title": "Add or remove members of the board from the card.", + "card-start": "Start", + "card-start-on": "Starts on", + "cardAttachmentsPopup-title": "Attach From", + "cardCustomField-datePopup-title": "Change date", + "cardCustomFieldsPopup-title": "Edit custom fields", + "cardStartVotingPopup-title": "Start a vote", + "positiveVoteMembersPopup-title": "Proponents", + "negativeVoteMembersPopup-title": "Opponents", + "card-edit-voting": "Edit voting", + "editVoteEndDatePopup-title": "Change vote end date", + "allowNonBoardMembers": "Allow all logged in users", + "vote-question": "Voting question", + "vote-public": "Show who voted what", + "vote-for-it": "for it", + "vote-against": "against", + "deleteVotePopup-title": "Delete vote?", + "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "casSignIn": "Sign In with CAS", + "cardType-card": "Card", + "cardType-linkedCard": "Linked Card", + "cardType-linkedBoard": "Linked Board", + "change": "Change", + "change-avatar": "Change Avatar", + "change-password": "Change Password", + "change-permissions": "Change permissions", + "change-settings": "Change Settings", + "changeAvatarPopup-title": "Change Avatar", + "changeLanguagePopup-title": "Change Language", + "changePasswordPopup-title": "Change Password", + "changePermissionsPopup-title": "Change Permissions", + "changeSettingsPopup-title": "Change Settings", + "subtasks": "Subtasks", + "checklists": "Checklists", + "click-to-star": "Click to star this board.", + "click-to-unstar": "Click to unstar this board.", + "clipboard": "Clipboard or drag & drop", + "close": "Close", + "close-board": "Close Board", + "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", + "close-card": "Close Card", + "color-black": "black", + "color-blue": "blue", + "color-crimson": "crimson", + "color-darkgreen": "darkgreen", + "color-gold": "gold", + "color-gray": "gray", + "color-green": "green", + "color-indigo": "indigo", + "color-lime": "lime", + "color-magenta": "magenta", + "color-mistyrose": "mistyrose", + "color-navy": "navy", + "color-orange": "orange", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "pink", + "color-plum": "plum", + "color-purple": "purple", + "color-red": "red", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "sky", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "yellow", + "unset-color": "Unset", + "comment": "Comment", + "comment-placeholder": "Write Comment", + "comment-only": "Comment only", + "comment-only-desc": "Can comment on cards only.", + "no-comments": "No comments", + "no-comments-desc": "Can not see comments and activities.", + "worker": "Worker", + "worker-desc": "Can only move cards, assign itself to card and comment.", + "computer": "Computer", + "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", + "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "linkCardPopup-title": "Link Card", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "Copy Card", + "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]", + "create": "Create", + "createBoardPopup-title": "Create Board", + "chooseBoardSourcePopup-title": "Import board", + "createLabelPopup-title": "Create Label", + "createCustomField": "Create Field", + "createCustomFieldPopup-title": "Create Field", + "current": "current", + "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", + "custom-field-checkbox": "Checkbox", + "custom-field-currency": "Currency", + "custom-field-currency-option": "Currency Code", + "custom-field-date": "Date", + "custom-field-dropdown": "Dropdown List", + "custom-field-dropdown-none": "(none)", + "custom-field-dropdown-options": "List Options", + "custom-field-dropdown-options-placeholder": "Press enter to add more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "Custom Fields", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteLabelPopup-title": "Delete Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate Member Action", + "discard": "Discard", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "Edit Profile", + "edit-wip-limit": "Edit WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "Edit Field", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "Edit Notification", + "editProfilePopup-title": "Edit Profile", + "email": "Email", + "email-enrollAccount-subject": "An account created for you on __siteName__", + "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", + "email-fail": "Sending email failed", + "email-fail-text": "Error trying to send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ sent you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.", + "email-resetPassword-subject": "Reset your password on __siteName__", + "email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.", + "email-sent": "Email sent", + "email-verifyEmail-subject": "Verify your email address on __siteName__", + "email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "This board does not exist", + "error-board-notAdmin": "You need to be admin of this board to do that", + "error-board-notAMember": "You need to be a member of this board to do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "Your JSON data does not include the proper information in the correct format", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-list-doesNotExist": "This list does not exist", + "error-user-doesNotExist": "This user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "This user is not created", + "error-username-taken": "This username is already taken", + "error-orgname-taken": "This organization name is already taken", + "error-teamname-taken": "This team name is already taken", + "error-email-taken": "Email has already been taken", + "export-board": "Export board", + "export-board-json": "Export board to JSON", + "export-board-csv": "Export board to CSV", + "export-board-tsv": "Export board to TSV", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "Export board to HTML", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sort-desc": "Click to Sort List", + "list-sort-by": "Sort the List By:", + "list-label-modifiedAt": "Last Access Time", + "list-label-title": "Name of the List", + "list-label-sort": "Your Manual Order", + "list-label-short-modifiedAt": "(L)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Filter Cards or Lists", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "filter-no-label": "No label", + "filter-member-label": "Filter by member", + "filter-no-member": "No member", + "filter-assignee-label": "Filter by assignee", + "filter-no-assignee": "No assignee", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No Custom Fields", + "filter-show-archive": "Show archived lists", + "filter-hide-empty": "Hide empty lists", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering cards on this board. Click here to edit filter.", + "filter-to-selection": "Filter to selection", + "other-filters-label": "Other Filters", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", + "fullname": "Full Name", + "header-logo-title": "Go back to your boards page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create Board", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import board", + "import-board-c": "Import board", + "import-board-title-trello": "Import board from Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "Import board from CSV/TSV", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "From CSV/TSV", + "import-board-instruction-trello": "In your Trello board, go to 'Menu', then 'More', 'Print and Export', 'Export JSON', and copy the resulting text.", + "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", + "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", + "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", + "import-json-placeholder": "Paste your valid JSON data here", + "import-csv-placeholder": "Paste your valid CSV/TSV data here", + "import-map-members": "Map members", + "import-members-map": "Your imported board has some members. Please map the members you want to import to your users", + "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-show-user-mapping": "Review members mapping", + "import-user-select": "Pick your existing user you want to use as this member", + "importMapMembersAddPopup-title": "Select member", + "info": "Version", + "initials": "Initials", + "invalid-date": "Invalid date", + "invalid-time": "Invalid time", + "invalid-user": "Invalid user", + "joined": "joined", + "just-invited": "You are just invited to this board", + "keyboard-shortcuts": "Keyboard shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. This will remove this label from all cards and destroy its history.", + "labels": "Labels", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave Board", + "leave-board-pop": "Are you sure you want to leave __boardTitle__? You will be removed from all cards on this board.", + "leaveBoardPopup-title": "Leave Board ?", + "link-card": "Link to this card", + "list-archive-cards": "Move all cards in this list to Archive", + "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", + "list-move-cards": "Move all cards in this list", + "list-select-cards": "Select all cards in this list", + "set-color-list": "Set Color", + "listActionPopup-title": "List Actions", + "settingsUserPopup-title": "User Settings", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "Swimlane Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import a Trello card", + "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listMorePopup-title": "More", + "link-list": "Link to this list", + "list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.", + "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "lists": "Lists", + "swimlanes": "Swimlanes", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "Member Settings", + "members": "Members", + "menu": "Menu", + "move-selection": "Move selection", + "moveCardPopup-title": "Move Card", + "moveCardToBottom-title": "Move to Bottom", + "moveCardToTop-title": "Move to Top", + "moveSelectionPopup-title": "Move selection", + "multi-selection": "Multi-Selection", + "multi-selection-label": "Set label for selection", + "multi-selection-member": "Set member for selection", + "multi-selection-on": "Multi-Selection is on", + "muted": "Muted", + "muted-info": "You will never be notified of any changes in this board", + "my-boards": "My Boards", + "name": "Name", + "no-archived-cards": "No cards in Archive.", + "no-archived-lists": "No lists in Archive.", + "no-archived-swimlanes": "No swimlanes in Archive.", + "no-results": "No results", + "normal": "Normal", + "normal-desc": "Can view and edit cards. Can't change settings.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates to any cards you participate as creater or member", + "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "This page may be private. You may be able to view it by logging in.", + "page-not-found": "Page not found.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "This board is private. Only people added to the board can view and edit it.", + "profile": "Profile", + "public": "Public", + "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", + "quick-access-description": "Star a board to add a shortcut in this bar.", + "remove-cover": "Remove Cover", + "remove-from-board": "Remove from Board", + "remove-label": "Remove Label", + "listDeletePopup-title": "Delete List ?", + "remove-member": "Remove Member", + "remove-member-from-card": "Remove from Card", + "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.", + "removeMemberPopup-title": "Remove Member?", + "rename": "Rename", + "rename-board": "Rename Board", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself to current card", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete members", + "shortcut-clear-filters": "Clear all filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my cards", + "shortcut-show-shortcuts": "Bring up this shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle Board Sidebar", + "show-cards-minimum-count": "Show cards count if list contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click to star this board. It will show up at top of your boards list.", + "starred-boards": "Starred Boards", + "starred-boards-description": "Starred boards show up at the top of your boards list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "this board", + "this-card": "this card", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime cards", + "has-spenttime-cards": "Has spent time cards", + "time": "Time", + "title": "Title", + "tracking": "Tracking", + "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", + "type": "Type", + "unassign-member": "Unassign member", + "unsaved-description": "You have an unsaved description.", + "unwatch": "Unwatch", + "upload": "Upload", + "upload-avatar": "Upload an avatar", + "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", + "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-link-url": "Custom Login Logo Link URL", + "text-below-custom-login-logo": "Text below Custom Login Logo", + "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", + "username": "Username", + "import-usernames": "Import Usernames", + "view-it": "View it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You will be notified of any change in this board", + "welcome-board": "Welcome Board", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "Card Templates", + "list-templates-swimlane": "List Templates", + "board-templates-swimlane": "Board Templates", + "what-to-do": "What do you want to do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.", + "admin-panel": "Admin Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To board(s)", + "email-addresses": "Email Addresses", + "smtp-host-description": "The address of the SMTP server that handles your emails.", + "smtp-port-description": "The port your SMTP server uses for outgoing emails.", + "smtp-tls-description": "Enable TLS support for SMTP server", + "smtp-host": "SMTP Host", + "smtp-port": "SMTP Port", + "smtp-username": "Username", + "smtp-password": "Password", + "smtp-tls": "TLS support", + "send-from": "From", + "send-smtp-test": "Send a test email to yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ sent you an invitation", + "email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.", + "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-text": "You have successfully sent an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized to view this page.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional for Authentication)", + "outgoing-webhooks": "Outgoing Webhooks", + "bidirectional-webhooks": "Two-Way Webhooks", + "outgoingWebhooksPopup-title": "Outgoing Webhooks", + "boardCardTitlePopup-title": "Card Title Filter", + "disable-webhook": "Disable This Webhook", + "global-webhook": "Global Webhooks", + "new-outgoing-webhook": "New Outgoing Webhook", + "no-name": "(Unknown)", + "Node_version": "Node version", + "Meteor_version": "Meteor version", + "MongoDB_version": "MongoDB version", + "MongoDB_storage_engine": "MongoDB storage engine", + "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "OS_Arch": "OS Arch", + "OS_Cpus": "OS CPU Count", + "OS_Freemem": "OS Free Memory", + "OS_Loadavg": "OS Load Average", + "OS_Platform": "OS Platform", + "OS_Release": "OS Release", + "OS_Totalmem": "OS Total Memory", + "OS_Type": "OS Type", + "OS_Uptime": "OS Uptime", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "show-field-on-card": "Show this field on card", + "automatically-field-on-card": "Add field to new cards", + "always-field-on-card": "Add field to all cards", + "showLabel-field-on-card": "Show field label on minicard", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "createdAt": "Created at", + "modifiedAt": "Modified at", + "verified": "Verified", + "active": "Active", + "card-received": "Received", + "card-received-on": "Received on", + "card-end": "End", + "card-end-on": "Ends on", + "editCardReceivedDatePopup-title": "Change received date", + "editCardEndDatePopup-title": "Change end date", + "setCardColorPopup-title": "Set color", + "setCardActionsColorPopup-title": "Choose a color", + "setSwimlaneColorPopup-title": "Choose a color", + "setListColorPopup-title": "Choose a color", + "assigned-by": "Assigned By", + "requested-by": "Requested By", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", + "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", + "boardDeletePopup-title": "Delete Board?", + "delete-board": "Delete Board", + "default-subtasks-board": "Subtasks for __board__ board", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks Settings", + "card-settings": "Card Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", + "boardCardSettingsPopup-title": "Card Settings", + "deposit-subtasks-board": "Deposit subtasks to this board:", + "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "show-parent-in-minicard": "Show parent in minicard:", + "prefix-with-full-path": "Prefix with full path", + "prefix-with-parent": "Prefix with parent", + "subtext-with-full-path": "Subtext with full path", + "subtext-with-parent": "Subtext with parent", + "change-card-parent": "Change card's parent", + "parent-card": "Parent card", + "source-board": "Source board", + "no-parent": "Don't show parent", + "activity-added-label": "added label '%s' to %s", + "activity-removed-label": "removed label '%s' from %s", + "activity-delete-attach": "deleted an attachment from %s", + "activity-added-label-card": "added label '%s'", + "activity-removed-label-card": "removed label '%s'", + "activity-delete-attach-card": "deleted an attachment", + "activity-set-customfield": "set custom field '%s' to '%s' in %s", + "activity-unset-customfield": "unset custom field '%s' in %s", + "r-rule": "Rule", + "r-add-trigger": "Add trigger", + "r-add-action": "Add action", + "r-board-rules": "Board rules", + "r-add-rule": "Add rule", + "r-view-rule": "View rule", + "r-delete-rule": "Delete rule", + "r-new-rule-name": "New rule title", + "r-no-rules": "No rules", + "r-trigger": "Trigger", + "r-action": "Action", + "r-when-a-card": "When a card", + "r-is": "is", + "r-is-moved": "is moved", + "r-added-to": "Added to", + "r-removed-from": "Removed from", + "r-the-board": "the board", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "Moved to", + "r-moved-from": "Moved from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a card", + "r-when-a-label-is": "When a label is", + "r-when-the-label": "When the label", + "r-list-name": "list name", + "r-when-a-member": "When a member is", + "r-when-the-member": "When the member", + "r-name": "name", + "r-when-a-attach": "When an attachment", + "r-when-a-checklist": "When a checklist is", + "r-when-the-checklist": "When the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "When a checklist item is", + "r-when-the-item": "When the checklist item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "Move card to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "Move to Archive", + "r-unarchive": "Restore from Archive", + "r-card": "card", + "r-add": "Add", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "Remove all members from the card", + "r-set-color": "Set color to", + "r-checklist": "checklist", + "r-check-all": "Check all", + "r-uncheck-all": "Uncheck all", + "r-items-check": "items of checklist", + "r-check": "Check", + "r-uncheck": "Uncheck", + "r-item": "item", + "r-of-checklist": "of checklist", + "r-send-email": "Send an email", + "r-to": "to", + "r-of": "of", + "r-subject": "subject", + "r-rule-details": "Rule details", + "r-d-move-to-top-gen": "Move card to top of its list", + "r-d-move-to-top-spec": "Move card to top of list", + "r-d-move-to-bottom-gen": "Move card to bottom of its list", + "r-d-move-to-bottom-spec": "Move card to bottom of list", + "r-d-send-email": "Send email", + "r-d-send-email-to": "to", + "r-d-send-email-subject": "subject", + "r-d-send-email-message": "message", + "r-d-archive": "Move card to Archive", + "r-d-unarchive": "Restore card from Archive", + "r-d-add-label": "Add label", + "r-d-remove-label": "Remove label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "Add member", + "r-d-remove-member": "Remove member", + "r-d-remove-all-member": "Remove all member", + "r-d-check-all": "Check all items of a list", + "r-d-uncheck-all": "Uncheck all items of a list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "Add checklist", + "r-d-remove-checklist": "Remove checklist", + "r-by": "by", + "r-add-checklist": "Add checklist", + "r-with-items": "with items", + "r-items-list": "item1,item2,item3", + "r-add-swimlane": "Add swimlane", + "r-swimlane-name": "swimlane name", + "r-board-note": "Note: leave a field empty to match every possible value.", + "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", + "r-when-a-card-is-moved": "When a card is moved to another list", + "r-set": "Set", + "r-update": "Update", + "r-datefield": "date field", + "r-df-start-at": "start", + "r-df-due-at": "due", + "r-df-end-at": "end", + "r-df-received-at": "received", + "r-to-current-datetime": "to current date/time", + "r-remove-value-from": "Remove value from", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentication method", + "authentication-type": "Authentication type", + "custom-product-name": "Custom Product Name", + "layout": "Layout", + "hide-logo": "Hide Logo", + "add-custom-html-after-body-start": "Add Custom HTML after start", + "add-custom-html-before-body-end": "Add Custom HTML before end", + "error-undefined": "Something went wrong", + "error-ldap-login": "An error occurred while trying to login", + "display-authentication-method": "Display Authentication Method", + "default-authentication-method": "Default Authentication Method", + "duplicate-board": "Duplicate Board", + "org-number": "The number of organizations is:", + "team-number": "The number of teams is:", + "people-number": "The number of people is:", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all", + "loading": "Loading, please wait.", + "previous_as": "last time was", + "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", + "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", + "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", + "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", + "a-dueAt": "modified due time to be", + "a-endAt": "modified ending time to be", + "a-startAt": "modified starting time to be", + "a-receivedAt": "modified received time to be", + "almostdue": "current due time %s is approaching", + "pastdue": "current due time %s is past", + "duenow": "current due time %s is today", + "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", + "act-withDue": "__list__/__card__ due reminders [__board__]", + "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", + "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", + "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", + "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", + "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "accounts-allowUserDelete": "Allow users to self delete their account", + "hide-minicard-label-text": "Hide minicard label text", + "show-desktop-drag-handles": "Show desktop drag handles", + "assignee": "Assignee", + "cardAssigneesPopup-title": "Assignee", + "addmore-detail": "Add a more detailed description", + "show-on-card": "Show on Card", + "new": "New", + "editOrgPopup-title": "Edit Organization", + "newOrgPopup-title": "New Organization", + "editTeamPopup-title": "Edit Team", + "newTeamPopup-title": "New Team", + "editUserPopup-title": "Edit User", + "newUserPopup-title": "New User", + "notifications": "Notifications", + "view-all": "View All", + "filter-by-unread": "Filter by Unread", + "mark-all-as-read": "Mark all as read", + "remove-all-read": "Remove all read", + "allow-rename": "Allow Rename", + "allowRenamePopup-title": "Allow Rename", + "start-day-of-week": "Set day of the week start", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Owner", + "last-modified-at": "Last modified at", + "last-activity": "Last activity", + "voting": "Voting", + "archived": "Archived", + "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", + "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", + "hide-checked-items": "Hide checked items", + "task": "Task", + "create-task": "Create Task", + "ok": "OK", + "organizations": "Organizations", + "teams": "Teams", + "displayName": "Display Name", + "shortName": "Short Name", + "website": "Website", + "person": "Person", + "my-cards": "My Cards", + "card": "Card", + "board": "Board", + "context-separator": "/", + "myCardsSortChange-title": "My Cards Sort", + "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-choice-board": "By Board", + "myCardsSortChange-choice-dueat": "By Due Date", + "dueCards-title": "Due Cards", + "dueCardsViewChange-title": "Due Cards View", + "dueCardsViewChangePopup-title": "Due Cards View", + "dueCardsViewChange-choice-me": "Me", + "dueCardsViewChange-choice-all": "All Users", + "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", + "broken-cards": "Broken Cards", + "board-title-not-found": "Board '%s' not found.", + "swimlane-title-not-found": "Swimlane '%s' not found.", + "list-title-not-found": "List '%s' not found.", + "label-not-found": "Label '%s' not found.", + "label-color-not-found": "Label color %s not found.", + "user-username-not-found": "Username '%s' not found.", + "comment-not-found": "Card with comment containing text '%s' not found.", + "globalSearch-title": "Search All Boards", + "no-cards-found": "No Cards Found", + "one-card-found": "One Card Found", + "n-cards-found": "%s Cards Found", + "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", + "operator-board": "board", + "operator-board-abbrev": "b", + "operator-swimlane": "swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "list", + "operator-list-abbrev": "l", + "operator-label": "label", + "operator-label-abbrev": "#", + "operator-user": "user", + "operator-user-abbrev": "@", + "operator-member": "member", + "operator-member-abbrev": "m", + "operator-assignee": "assignee", + "operator-assignee-abbrev": "a", + "operator-creator": "creator", + "operator-status": "status", + "operator-due": "due", + "operator-created": "created", + "operator-modified": "modified", + "operator-sort": "sort", + "operator-comment": "comment", + "operator-has": "has", + "operator-limit": "limit", + "predicate-archived": "archived", + "predicate-open": "open", + "predicate-ended": "ended", + "predicate-all": "all", + "predicate-overdue": "overdue", + "predicate-week": "week", + "predicate-month": "month", + "predicate-quarter": "quarter", + "predicate-year": "year", + "predicate-due": "due", + "predicate-modified": "modified", + "predicate-created": "created", + "predicate-attachment": "attachment", + "predicate-description": "description", + "predicate-checklist": "checklist", + "predicate-start": "start", + "predicate-end": "end", + "predicate-assignee": "assignee", + "predicate-member": "member", + "predicate-public": "public", + "predicate-private": "private", + "operator-unknown-error": "%s is not an operator", + "operator-number-expected": "operator __operator__ expected a number, got '__value__'", + "operator-sort-invalid": "sort of '%s' is invalid", + "operator-status-invalid": "'%s' is not a valid status", + "operator-has-invalid": "%s is not a valid existence check", + "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "next-page": "Next Page", + "previous-page": "Previous Page", + "heading-notes": "Notes", + "globalSearch-instructions-heading": "Search Instructions", + "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", + "globalSearch-instructions-operators": "Available operators:", + "globalSearch-instructions-operator-board": "`__operator_board__:` - cards in boards matching the specified *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", + "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", + "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", + "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", + "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", + "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", + "globalSearch-instructions-notes-1": "Multiple operators may be specified.", + "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", + "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", + "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", + "globalSearch-instructions-notes-4": "Text searches are case insensitive.", + "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "link-to-search": "Link to this search", + "excel-font": "Arial", + "number": "Number", + "label-colors": "Label Colors", + "label-names": "Label Names", + "archived-at": "archived at", + "sort-cards": "Sort Cards", + "cardsSortPopup-title": "Sort Cards", + "due-date": "Due Date", + "server-error": "Server Error", + "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", + "title-alphabetically": "Title (Alphabetically)", + "created-at-newest-first": "Created At (Newest First)", + "created-at-oldest-first": "Created At (Oldest First)", + "links-heading": "Links", + "hide-system-messages-of-all-users": "Hide system messages of all users", + "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", + "move-swimlane": "Move Swimlane", + "moveSwimlanePopup-title": "Move Swimlane", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "orphanedFilesReportTitle": "Orphaned Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" +} \ No newline at end of file diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json index 1ea858560..59c8fa538 100644 --- a/i18n/eo.i18n.json +++ b/i18n/eo.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json index 5482a9c41..e9b1deaf1 100644 --- a/i18n/es-AR.i18n.json +++ b/i18n/es-AR.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Agregar Subtarea", "add-checklist": "Agregar Lista de Tareas", "add-checklist-item": "Agregar ítem a lista de tareas", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Agregar Portadas", "add-label": "Agregar Etiqueta", "add-list": "Agregar Lista", diff --git a/i18n/es-CL.i18n.json b/i18n/es-CL.i18n.json index 3a69092a3..ee3e4627b 100644 --- a/i18n/es-CL.i18n.json +++ b/i18n/es-CL.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Añadir subtarea", "add-checklist": "Añadir una lista de verificación", "add-checklist-item": "Añadir un elemento a la lista de verificación", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Añadir portada", "add-label": "Añadir una etiqueta", "add-list": "Añadir una lista", diff --git a/i18n/es-LA.i18n.json b/i18n/es-LA.i18n.json index f596968c0..76864a1c4 100644 --- a/i18n/es-LA.i18n.json +++ b/i18n/es-LA.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/es-MX.i18n.json b/i18n/es-MX.i18n.json index 3b1175a3b..f7c1023b9 100644 --- a/i18n/es-MX.i18n.json +++ b/i18n/es-MX.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/es-PE.i18n.json b/i18n/es-PE.i18n.json index db3ca9a2d..5247d4d3b 100644 --- a/i18n/es-PE.i18n.json +++ b/i18n/es-PE.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Agregar subtarea", "add-checklist": "Agregar lista de comprobación", "add-checklist-item": "Agregar un elemento a la lista de comprobación", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Agregar portada", "add-label": "Agregar una etiqueta", "add-list": "Agregar una lista", diff --git a/i18n/es-PY.i18n.json b/i18n/es-PY.i18n.json index f596968c0..76864a1c4 100644 --- a/i18n/es-PY.i18n.json +++ b/i18n/es-PY.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index 558489a8e..b2a24f822 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Añadir subtarea", "add-checklist": "Añadir una lista de verificación", "add-checklist-item": "Añadir un elemento a la lista de verificación", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Añadir portada", "add-label": "Añadir una etiqueta", "add-list": "Añadir una lista", diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json index 67ad0de5c..c6e6a6c9a 100644 --- a/i18n/eu.i18n.json +++ b/i18n/eu.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Gehitu egiaztaketa zerrenda", "add-checklist-item": "Gehitu elementu bat egiaztaketa zerrendara", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Gehitu azala", "add-label": "Gehitu etiketa", "add-list": "Gehitu zerrenda", diff --git a/i18n/fa-IR.i18n.json b/i18n/fa-IR.i18n.json index 7ff3da221..adbd476c0 100644 --- a/i18n/fa-IR.i18n.json +++ b/i18n/fa-IR.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index b8b096be0..93937a9c7 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "افزودن زیر وظیفه", "add-checklist": "افزودن چک‌لیست", "add-checklist-item": "افزودن مورد به چک‌لیست", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "افزودن کاور", "add-label": "افزودن لیبل", "add-list": "افزودن لیست", diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index 19db3b57d..0c37889a2 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Lisää alitehtävä", "add-checklist": "Lisää tarkistuslista", "add-checklist-item": "Lisää kohta tarkistuslistaan", + "convertChecklistItemToCardPopup-title": "Muuta kortiksi", "add-cover": "Lisää kansi", "add-label": "Lisää nimilappu", "add-list": "Lisää lista", diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 4615fbb61..e807bae4a 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Ajouter une sous-tâche", "add-checklist": "Ajouter une checklist", "add-checklist-item": "Ajouter un élément à la checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Ajouter la couverture", "add-label": "Ajouter une étiquette", "add-list": "Ajouter une liste", diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json index e172d3b86..272baf07c 100644 --- a/i18n/gl.i18n.json +++ b/i18n/gl.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Engadir etiqueta", "add-list": "Engadir lista", diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index f2d24758f..b88044cca 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "הוסף תת משימה", "add-checklist": "הוספת רשימת מטלות", "add-checklist-item": "הוספת פריט לרשימת משימות", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "הוספת כיסוי", "add-label": "הוספת תווית", "add-list": "הוספת רשימה", diff --git a/i18n/hi.i18n.json b/i18n/hi.i18n.json index 68caeaf24..4a775d615 100644 --- a/i18n/hi.i18n.json +++ b/i18n/hi.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "उप कार्य जोड़ें", "add-checklist": "चिह्नांकन-सूची जोड़ें", "add-checklist-item": "चिह्नांकन-सूची विषय कोई तक जोड़ें", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "आवरण जोड़ें", "add-label": "नामपत्र जोड़ें", "add-list": "सूची जोड़ें", diff --git a/i18n/hr.i18n.json b/i18n/hr.i18n.json index 3caafdbe1..4dfffbb1b 100644 --- a/i18n/hr.i18n.json +++ b/i18n/hr.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Dodaj podzadatak", "add-checklist": "Dodaj listu provjere", "add-checklist-item": "Dodaj stavku listi provjere", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Dodaj naslovnicu", "add-label": "Dodaj oznaku", "add-list": "Dodaj listu", diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json index 009407dd5..dfdaa8761 100644 --- a/i18n/hu.i18n.json +++ b/i18n/hu.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Alfeladat hozzáadása", "add-checklist": "Ellenőrzőlista hozzáadása", "add-checklist-item": "Elem hozzáadása az ellenőrzőlistához", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Borító hozzáadása", "add-label": "Címke hozzáadása", "add-list": "Lista hozzáadása", diff --git a/i18n/hy.i18n.json b/i18n/hy.i18n.json index c006dcbd4..74470f28f 100644 --- a/i18n/hy.i18n.json +++ b/i18n/hy.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json index 8f68ceb70..8363f84e4 100644 --- a/i18n/id.i18n.json +++ b/i18n/id.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Tambahkan hal ke daftar periksa", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Tambahkan Sampul", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/ig.i18n.json b/i18n/ig.i18n.json index 683ce5eb1..9d04fcd3c 100644 --- a/i18n/ig.i18n.json +++ b/i18n/ig.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index d40ce3cef..672585f31 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -81,7 +81,7 @@ "activity-endDate": "ha modificato la data di fine a %s di %s ", "add-attachment": "Aggiungi allegato", "add-board": "Aggiungi bacheca", - "add-template": "Add Template", + "add-template": "Aggiungi Template", "add-card": "Aggiungi scheda", "add-card-to-top-of-list": "Aggiungi Scheda in cima alla Lista", "add-card-to-bottom-of-list": "Aggiungi Scheda in fondo alla Lista", @@ -89,6 +89,7 @@ "add-subtask": "Aggiungi sotto-compito", "add-checklist": "Aggiungi Checklist", "add-checklist-item": "Aggiungi un elemento alla checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Aggiungi copertina", "add-label": "Aggiungi etichetta", "add-list": "Aggiungi lista", @@ -120,8 +121,8 @@ "archives": "Archivio", "template": "Template", "templates": "Template", - "template-container": "Template Container", - "add-template-container": "Add Template Container", + "template-container": "Contenitore dei Template", + "add-template-container": "Aggiungi contenitore di Template", "assign-member": "Assegna a un membro", "attached": "allegato", "attachment": "Allegato", diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index c7c076e2a..d29a264bb 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "サブタスクを追加", "add-checklist": "チェックリストを追加", "add-checklist-item": "チェックリストに項目を追加", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "カバーの追加", "add-label": "ラベルを追加", "add-list": "リストを追加", diff --git a/i18n/ka.i18n.json b/i18n/ka.i18n.json index 7a95c2047..9b2e451d4 100644 --- a/i18n/ka.i18n.json +++ b/i18n/ka.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "ქვესაქმიანობის დამატება", "add-checklist": "კატალოგის დამატება", "add-checklist-item": "დაამატეთ საგანი ჩამონათვალს", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "გარეკანის დამატება", "add-label": "ნიშნის დამატება", "add-list": "ჩამონათვალის დამატება", diff --git a/i18n/km.i18n.json b/i18n/km.i18n.json index 4a4f61afb..1da694e3a 100644 --- a/i18n/km.i18n.json +++ b/i18n/km.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index 5ae09284d..a2875e6dc 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "체크리스트 추가", "add-checklist-item": "체크리스트에 항목 추가", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "커버 추가", "add-label": "라벨 추가", "add-list": "리스트 추가", diff --git a/i18n/lt.i18n.json b/i18n/lt.i18n.json index f596968c0..76864a1c4 100644 --- a/i18n/lt.i18n.json +++ b/i18n/lt.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json index b8e3cbeb5..e40d59bef 100644 --- a/i18n/lv.i18n.json +++ b/i18n/lv.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Pievienot apakšuzdevumu", "add-checklist": "Pievienot kontrolsarakstu", "add-checklist-item": "Pievienot elementu", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Pievienot vāku", "add-label": "Pievienot birku", "add-list": "Pievienot sarakstu", diff --git a/i18n/mk.i18n.json b/i18n/mk.i18n.json index 31aaf3ce0..47b390ed5 100644 --- a/i18n/mk.i18n.json +++ b/i18n/mk.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Додади подзадача", "add-checklist": "Додади список на задачи", "add-checklist-item": "Додади точка во списокот со задачи", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Додади корица", "add-label": "Додади етикета", "add-list": "Додади листа", diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json index f8adfa4a3..1f2b3a709 100644 --- a/i18n/mn.i18n.json +++ b/i18n/mn.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Чеклист нэмэх", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Шошго нэмэх", "add-list": "Жагсаалт нэмэх", diff --git a/i18n/nb.i18n.json b/i18n/nb.i18n.json index 55f0d5089..d29dc5b91 100644 --- a/i18n/nb.i18n.json +++ b/i18n/nb.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Legg til Underoppgave", "add-checklist": "Legg til Sjekkliste", "add-checklist-item": "Nytt punkt på sjekklisten", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Nytt omslag", "add-label": "Legg til Etikett", "add-list": "Legg til Liste", diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index 583c49ee7..800d2aeb1 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Subtaak Toevoegen", "add-checklist": "Checklist toevoegen", "add-checklist-item": "Voeg item toe aan checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Cover Toevoegen", "add-label": "Label Toevoegen", "add-list": "Lijst Toevoegen", diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json index c1cf1658b..b710db5ae 100644 --- a/i18n/oc.i18n.json +++ b/i18n/oc.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Apondre una jos-tasca", "add-checklist": "Apondre una checklist", "add-checklist-item": "Apondre un element a la checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Apondre una cobèrta", "add-label": "Apondre una etiqueta", "add-list": "Apondre una tièra", diff --git a/i18n/pa.i18n.json b/i18n/pa.i18n.json index f596968c0..76864a1c4 100644 --- a/i18n/pa.i18n.json +++ b/i18n/pa.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index 3c0e5dc18..1ae7f6879 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Dodaj podzadanie", "add-checklist": "Dodaj czeklistę", "add-checklist-item": "Dodaj element do czeklisty", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Dodaj okładkę", "add-label": "Dodaj etykietę", "add-list": "Dodaj listę", diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index f6222abe1..034dc1269 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Adicionar subtarefa", "add-checklist": "Adicionar lista de verificação", "add-checklist-item": "Adicionar um item à lista de verificação", + "convertChecklistItemToCardPopup-title": "Converter para Cartão", "add-cover": "Adicionar Capa", "add-label": "Adicionar Etiqueta", "add-list": "Adicionar Lista", diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index 865bb9b25..986195e1a 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Adicionar Sub-tarefa", "add-checklist": "Adicionar Lista de Verificação", "add-checklist-item": "Adicionar um item à lista de verificação", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Adicionar Capa", "add-label": "Adicionar Etiqueta", "add-list": "Adicionar Lista", diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index abb40c7f9..76a449c6a 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Adaugă Decor", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index a71229e93..4f79ddb24 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Добавить подзадачу", "add-checklist": "Добавить контрольный список", "add-checklist-item": "Добавить пункт в контрольный список", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Прикрепить", "add-label": "Добавить метку", "add-list": "Добавить простой список", diff --git a/i18n/sk.i18n.json b/i18n/sk.i18n.json index 660dea5a1..1ed21a1ba 100644 --- a/i18n/sk.i18n.json +++ b/i18n/sk.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Pridať Podúlohu", "add-checklist": "Pridať Checklist", "add-checklist-item": "Pridať novú položku do Checklistu", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Pridať obal", "add-label": "Pridať značku", "add-list": "Pridať zoznam", diff --git a/i18n/sl.i18n.json b/i18n/sl.i18n.json index 2e0afa106..0b897b0ea 100644 --- a/i18n/sl.i18n.json +++ b/i18n/sl.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Dodaj podopravilo", "add-checklist": "Dodaj kontrolni seznam", "add-checklist-item": "Dodaj postavko na kontrolni seznam", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Dodaj ovitek", "add-label": "Dodaj oznako", "add-list": "Dodaj seznam", diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index ab6c0dd30..6aa812da5 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Dodaj podzadatak", "add-checklist": "Add Checklist", "add-checklist-item": "Dodaj novu stavku u listu", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Dodaj zaglavlje", "add-label": "Dodaj oznaku", "add-list": "Dodaj Listu", diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json index a2ff0db42..adfc18f87 100644 --- a/i18n/sv.i18n.json +++ b/i18n/sv.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Lägg till deluppgift", "add-checklist": "Lägg till checklista", "add-checklist-item": "Lägg till objekt i checklista", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Lägg till omslag", "add-label": "Lägg till etikett", "add-list": "Lägg till lista", diff --git a/i18n/sw.i18n.json b/i18n/sw.i18n.json index 294229770..194b58ed3 100644 --- a/i18n/sw.i18n.json +++ b/i18n/sw.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json index 1c4882950..c3b817a63 100644 --- a/i18n/ta.i18n.json +++ b/i18n/ta.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json index e57a8dc52..51ed9b3c3 100644 --- a/i18n/th.i18n.json +++ b/i18n/th.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "เพิ่มรายการตรวจสอบ", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "เพิ่มหน้าปก", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index 46ae0b182..b9c529155 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Alt Görev Ekle", "add-checklist": "Yapılacak Listesi Ekle", "add-checklist-item": "Yapılacak listesine yeni bir öğe ekle", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Kapak resmi ekle", "add-label": "Etiket Ekle", "add-list": "Liste Ekle", diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json index 3ecdfe29f..8e3ac4384 100644 --- a/i18n/uk.i18n.json +++ b/i18n/uk.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Додати підзадачу", "add-checklist": "Add Checklist", "add-checklist-item": "Додати елемент в список", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Додати обкладинку", "add-label": "Додати мітку", "add-list": "Додати список", diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json index ef0f31829..7a36910df 100644 --- a/i18n/vi.i18n.json +++ b/i18n/vi.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Thêm Nhiệm vụ phụ", "add-checklist": "Thêm Danh Sách Kiểm Tra", "add-checklist-item": "Thêm Một Mục Vào Danh Sách Kiểm Tra", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Thêm Bìa", "add-label": "Thêm Nhãn", "add-list": "Thêm Danh Sách", diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index c49dfedea..ca3f39b96 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -81,14 +81,15 @@ "activity-endDate": "已将结束日期从 %s 修改为 %s", "add-attachment": "添加附件", "add-board": "添加看板", - "add-template": "Add Template", + "add-template": "新增模板", "add-card": "添加卡片", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "新增卡片到列表顶部", + "add-card-to-bottom-of-list": "新增卡片到列表底部", "add-swimlane": "添加泳道图", "add-subtask": "添加子任务", "add-checklist": "添加待办清单", "add-checklist-item": "扩充清单", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "添加封面", "add-label": "添加标签", "add-list": "添加列表", @@ -120,8 +121,8 @@ "archives": "归档", "template": "模板", "templates": "模板", - "template-container": "Template Container", - "add-template-container": "Add Template Container", + "template-container": "模板容器", + "add-template-container": "新增模板容器", "assign-member": "指派成员", "attached": "附加", "attachment": "附件", @@ -136,7 +137,7 @@ "board-not-found": "看板不存在", "board-private-info": "该看板将被设为 <strong>私有</strong>.", "board-public-info": "该看板将被设为 <strong>公开</strong>.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "对看板图标进行拖拽排序。点击看板图标打开看板。", "boardChangeColorPopup-title": "修改看板背景", "boardChangeTitlePopup-title": "重命名看板", "boardChangeVisibilityPopup-title": "更改可视级别", @@ -184,10 +185,10 @@ "vote-against": "反对", "deleteVotePopup-title": "删除投票?", "vote-delete-pop": "永久删除。此操作会将所有数据删除掉。", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", + "cardStartPlanningPokerPopup-title": "开始一次计划扑克", + "card-edit-planning-poker": "编辑计划扑克", + "editPokerEndDatePopup-title": "更改计划扑克投票截止日期", + "poker-question": "计划扑克", "poker-one": "1", "poker-two": "2", "poker-three": "3", @@ -197,14 +198,14 @@ "poker-twenty": "20", "poker-forty": "40", "poker-oneHundred": "100", - "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", + "poker-unsure": "?", + "poker-finish": "完成", + "poker-result-votes": "投票", + "poker-result-who": "何人", "poker-replay": "Replay", "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "deletePokerPopup-title": "删除计划扑克?", + "poker-delete-pop": "永久删除。对该计划扑克的所有操作记录将会丢失。", "cardDeletePopup-title": "彻底删除卡片?", "cardDetailsActionsPopup-title": "卡片操作", "cardLabelsPopup-title": "标签", @@ -236,7 +237,7 @@ "close": "关闭", "close-board": "关闭看板", "close-board-pop": "您可以通过主页头部的“归档”按钮,来恢复看板。", - "close-card": "Close Card", + "close-card": "关闭卡片", "color-black": "黑色", "color-blue": "蓝色", "color-crimson": "深红", @@ -361,11 +362,11 @@ "export-board-excel": "看板导出为Excel", "user-can-not-export-excel": "用户无法导出Excel", "export-board-html": "看板导出为HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "export-card": "导出卡片", + "export-card-pdf": "卡片导出为PDF", + "user-can-not-export-card-to-pdf": "用户无法将卡片导出为PDF", "exportBoardPopup-title": "导出看板", - "exportCardPopup-title": "Export card", + "exportCardPopup-title": "导出卡片", "sort": "排序", "sort-desc": "点此来将列表排序", "list-sort-by": "按此来将列表排序:", @@ -454,8 +455,8 @@ "set-color-list": "设置颜色", "listActionPopup-title": "列表操作", "settingsUserPopup-title": "用户设置", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", + "settingsTeamPopup-title": "团队设置", + "settingsOrgPopup-title": "组织设置", "swimlaneActionPopup-title": "泳道图操作", "swimlaneAddPopup-title": "在下面添加一个泳道", "listImportCardPopup-title": "导入 Trello 卡片", @@ -671,7 +672,7 @@ "setListColorPopup-title": "选择一种颜色", "assigned-by": "指派人", "requested-by": "需求人", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "根据编号对卡片排序", "board-delete-notice": "删除时永久操作,将会丢失此看板上的所有列表、卡片和动作。", "delete-board-confirm-popup": "所有列表、卡片、标签和活动都回被删除,将无法恢复看板内容。不支持撤销。", "boardDeletePopup-title": "删除看板?", @@ -853,8 +854,8 @@ "act-duenow": "__card__ 的当前到期提醒(__timeValue__) 现在到期", "act-atUserComment": "[__board__] __list__/__card__ 提到了您", "delete-user-confirm-popup": "确实要删除此帐户吗?此操作无法撤销。", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "delete-team-confirm-popup": "请确认是否删除此团队?此操作无法撤销。", + "delete-org-confirm-popup": "请确认是否删除此组织?此操作无法撤销。", "accounts-allowUserDelete": "允许用户自行删除其帐户", "hide-minicard-label-text": "隐藏迷你卡片标签文本", "show-desktop-drag-handles": "显示桌面拖放手柄", @@ -1045,7 +1046,7 @@ "rulesReportTitle": "规则报告", "copy-swimlane": "复制泳道", "copySwimlanePopup-title": "复制泳道", - "display-card-creator": "Display Card Creator", + "display-card-creator": "显示卡片创建者", "wait-spinner": "Wait Spinner", "Bounce": "Bounce Wait Spinner", "Cube": "Cube Wait Spinner", @@ -1055,8 +1056,8 @@ "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", - "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "maximize-card": "最大化卡片", + "minimize-card": "最小化卡片", + "delete-org-warning-message": "无法删除该组织,至少还有一个用户属于该组织。", + "delete-team-warning-message": "无法删除该团队,至少还有一个用户属于该团队。" } \ No newline at end of file diff --git a/i18n/zh-HK.i18n.json b/i18n/zh-HK.i18n.json index b8c19191f..94fd47fb5 100644 --- a/i18n/zh-HK.i18n.json +++ b/i18n/zh-HK.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index 77c26eeda..cf89f1ad2 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "新增子任務", "add-checklist": "新增待辦清單", "add-checklist-item": "新增項目", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "新增封面", "add-label": "新增標籤", "add-list": "新增清單", diff --git a/releases/translations/pull-translations.sh b/releases/translations/pull-translations.sh index 1d00db994..82c05c7c6 100755 --- a/releases/translations/pull-translations.sh +++ b/releases/translations/pull-translations.sh @@ -45,6 +45,9 @@ tx pull -f -l nl echo "Esperanto:" tx pull -f -l eo +echo "English (Italy):" +tx pull -f -l en_IT + echo "English (United Kingdom):" tx pull -f -l en_GB From 7c2ef6fbd599c6e0b047f9353c4fd27cc21c5767 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sat, 24 Jul 2021 19:58:59 +0300 Subject: [PATCH 14/24] Updated ChangeLog. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 804503fa9..3a1c21c24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,11 @@ This release adds the following new features: - [Convert Checklist Item to Card](https://github.com/wekan/wekan/pull/3910). Thanks to helioguardabaxo. +and adds the following new translations: + +- [English (Italy)](https://github.com/wekan/wekan/commit/ae73029dda63db361925e378202e6f8c137cf5bd). + Thanks to translators. + Thanks to above GitHub users for their contributions and translators for their translations. # v5.38 2021-07-18 Wekan release From e1f08b157b3602b7c368f8d555c8fa3719862118 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sat, 24 Jul 2021 21:18:06 +0300 Subject: [PATCH 15/24] Updated ChangeLog. --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a1c21c24..e4cfd52b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,9 @@ This release adds the following new features: Thanks to xet7. - [Convert Checklist Item to Card](https://github.com/wekan/wekan/pull/3910). Thanks to helioguardabaxo. +- [Organizations and Teams are taken into account when displaying board at + `All Boards` page](https://github.com/wekan/wekan/pull/3912). + Thanks to Emile840. and adds the following new translations: From e1de787f1962e41129c737f22b2c2e73b5485f71 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sat, 24 Jul 2021 23:27:34 +0300 Subject: [PATCH 16/24] Updated translations. Thanks to translators! --- i18n/he.i18n.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index b88044cca..8bdb87593 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -89,7 +89,7 @@ "add-subtask": "הוסף תת משימה", "add-checklist": "הוספת רשימת מטלות", "add-checklist-item": "הוספת פריט לרשימת משימות", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "המרה לכרטיס", "add-cover": "הוספת כיסוי", "add-label": "הוספת תווית", "add-list": "הוספת רשימה", From b3ba156d20cbf874c83bd16a6503295fae83c97e Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu <x@xet7.org> Date: Sat, 24 Jul 2021 23:38:10 +0300 Subject: [PATCH 17/24] v5.39 --- CHANGELOG.md | 2 +- Stackerfile.yml | 2 +- package-lock.json | 2 +- package.json | 2 +- public/api/wekan.html | 6 +++--- public/api/wekan.yml | 2 +- sandstorm-pkgdef.capnp | 4 ++-- snapcraft.yaml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4cfd52b7..c84a070ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ Note: With Docker, please don't use latest tag. Only use release tags. See https://github.com/wekan/wekan/issues/3874 -# Upcoming Wekan release +# v5.39 2021-07-24 Wekan release This release adds the following new features: diff --git a/Stackerfile.yml b/Stackerfile.yml index 117fd45c6..cf474c67b 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v5.38.0" +appVersion: "v5.39.0" files: userUploads: - README.md diff --git a/package-lock.json b/package-lock.json index 9c849f775..73a4f25a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v5.38.0", + "version": "v5.39.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c955e5560..3d4014bf9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v5.38.0", + "version": "v5.39.0", "description": "Open-Source kanban", "private": true, "repository": { diff --git a/public/api/wekan.html b/public/api/wekan.html index b3289fd3b..16e34bad9 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -7,7 +7,7 @@ <meta charset="utf-8"> <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> - <title>Wekan REST API v5.38 + Wekan REST API v5.39 @@ -1555,7 +1555,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
  • - Wekan REST API v5.38 + Wekan REST API v5.39
  • @@ -2128,7 +2128,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
    -

    Wekan REST API v5.38

    +

    Wekan REST API v5.39

    Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

    diff --git a/public/api/wekan.yml b/public/api/wekan.yml index 841885259..72c7924ff 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v5.38 + version: v5.39 description: | The REST API allows you to control and extend Wekan with ease. diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 21a369b46..843647288 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 538, + appVersion = 539, # Increment this for every release. - appMarketingVersion = (defaultText = "5.38.0~2021-07-18"), + appMarketingVersion = (defaultText = "5.39.0~2021-07-24"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/snapcraft.yaml b/snapcraft.yaml index 5d2c2562c..4e5d5b0fe 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '5.38' +version: '5.39' summary: The open-source kanban description: | Wekan is an open-source and collaborative kanban board application. From c65d8ed6a9898c3acecc80879e6473ca5da730e2 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 25 Jul 2021 00:00:55 +0300 Subject: [PATCH 18/24] Updated ChangeLog. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c84a070ef..4d1e53bc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ This release adds the following new features: - [LDAP AD Simple Auth](https://github.com/wekan/wekan/pull/3909). Thanks to indika-dev. -- [LDAP AD Simple Auth: Added settings for all remainin Wekan Standalone (non-Sandstorm) +- [LDAP AD Simple Auth: Added settings for all remaining Wekan Standalone (non-Sandstorm) platforms](https://github.com/wekan/wekan/commit/fe40f35d6d9b6293f3bdbf5bc0f3e8e708c59518) and Docs to https://github.com/wekan/wekan/wiki/LDAP-AD-Simple-Auth . Thanks to xet7. From 18b6381d790848062752b211d48c84a2de268bd0 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 25 Jul 2021 15:19:54 +0300 Subject: [PATCH 19/24] Fixed Delete of Planning Poker doesn't work. Thanks to xet7 ! Fixes #3915 --- client/components/cards/cardDetails.js | 1 - 1 file changed, 1 deletion(-) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 5396aa675..b0e1dba42 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -1326,7 +1326,6 @@ BlazeComponent.extendComponent({ Popup.close(); }, 'click .js-remove-poker': Popup.afterConfirm('deletePoker', (event) => { - event.preventDefault(); this.currentCard.unsetPoker(); Popup.close(); }), From 2b51afaedfb790021d63ce2d446b22cbf258c90d Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 25 Jul 2021 15:22:07 +0300 Subject: [PATCH 20/24] Updated ChangeLog. --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d1e53bc1..e072fc287 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,15 @@ Note: With Docker, please don't use latest tag. Only use release tags. See https://github.com/wekan/wekan/issues/3874 +# Upcoming Wekan release + +This release fixes the following bugs: + +- [Fixed Delete of Planning Poker doesn't work](https://github.com/wekan/wekan/commit/18b6381d790848062752b211d48c84a2de268bd0). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v5.39 2021-07-24 Wekan release This release adds the following new features: From db493f1571e963f278c58d5c99865112002ce939 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 25 Jul 2021 15:44:54 +0300 Subject: [PATCH 21/24] Updated translations. Thanks to translators! --- i18n/cs.i18n.json | 2 +- i18n/nl.i18n.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index 87681fa31..89d18f456 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -89,7 +89,7 @@ "add-subtask": "Přidat Podúkol", "add-checklist": "Přidat zaškrtávací seznam", "add-checklist-item": "Přidat položku do zaškrtávacího seznamu", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "Převést na kartu", "add-cover": "Přidat obal", "add-label": "Přidat štítek", "add-list": "Přidat sloupec", diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index 800d2aeb1..6a1931a09 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -89,7 +89,7 @@ "add-subtask": "Subtaak Toevoegen", "add-checklist": "Checklist toevoegen", "add-checklist-item": "Voeg item toe aan checklist", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "Converteer naar Kaart", "add-cover": "Cover Toevoegen", "add-label": "Label Toevoegen", "add-list": "Lijst Toevoegen", From 6d73618a486312aa7e66b24f3c64f534b11a38dc Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 25 Jul 2021 15:48:10 +0300 Subject: [PATCH 22/24] v5.40 --- CHANGELOG.md | 2 +- Stackerfile.yml | 2 +- package-lock.json | 2 +- package.json | 2 +- public/api/wekan.html | 6 +++--- public/api/wekan.yml | 2 +- sandstorm-pkgdef.capnp | 4 ++-- snapcraft.yaml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e072fc287..f4e0fb965 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ Note: With Docker, please don't use latest tag. Only use release tags. See https://github.com/wekan/wekan/issues/3874 -# Upcoming Wekan release +# v5.40 2021-07-25 Wekan release This release fixes the following bugs: diff --git a/Stackerfile.yml b/Stackerfile.yml index cf474c67b..cb167f982 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v5.39.0" +appVersion: "v5.40.0" files: userUploads: - README.md diff --git a/package-lock.json b/package-lock.json index 73a4f25a7..3bc3dd2d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v5.39.0", + "version": "v5.40.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3d4014bf9..14eb50b0c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v5.39.0", + "version": "v5.40.0", "description": "Open-Source kanban", "private": true, "repository": { diff --git a/public/api/wekan.html b/public/api/wekan.html index 16e34bad9..b652de25d 100644 --- a/public/api/wekan.html +++ b/public/api/wekan.html @@ -7,7 +7,7 @@ - Wekan REST API v5.39 + Wekan REST API v5.40 @@ -1555,7 +1555,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
    • - Wekan REST API v5.39 + Wekan REST API v5.40
    • @@ -2128,7 +2128,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
      -

      Wekan REST API v5.39

      +

      Wekan REST API v5.40

      Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

      diff --git a/public/api/wekan.yml b/public/api/wekan.yml index 72c7924ff..0c61cd736 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1,7 +1,7 @@ swagger: '2.0' info: title: Wekan REST API - version: v5.39 + version: v5.40 description: | The REST API allows you to control and extend Wekan with ease. diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 843647288..4a04fa61a 100644 --- a/sandstorm-pkgdef.capnp +++ b/sandstorm-pkgdef.capnp @@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Wekan"), # The name of the app as it is displayed to the user. - appVersion = 539, + appVersion = 540, # Increment this for every release. - appMarketingVersion = (defaultText = "5.39.0~2021-07-24"), + appMarketingVersion = (defaultText = "5.40.0~2021-07-25"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/snapcraft.yaml b/snapcraft.yaml index 4e5d5b0fe..7a3b8f5f6 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '5.39' +version: '5.40' summary: The open-source kanban description: | Wekan is an open-source and collaborative kanban board application. From 0fa8fc8b506831a60649d100ce93c96f8f7b76f5 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 26 Jul 2021 14:01:09 +0300 Subject: [PATCH 23/24] Fixed Wekan JSON import fails. Thanks to BartoszBroda and xet7 ! Fixes #3918 --- models/wekanCreator.js | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/models/wekanCreator.js b/models/wekanCreator.js index 2867b12f8..310230e7c 100644 --- a/models/wekanCreator.js +++ b/models/wekanCreator.js @@ -271,17 +271,21 @@ export class WekanCreator { }); }); } - boardToImport.labels.forEach(label => { - const labelToCreate = { - _id: Random.id(6), - color: label.color, - name: label.name, - }; - // We need to remember them by Wekan ID, as this is the only ref we have - // when importing cards. - this.labels[label._id] = labelToCreate._id; - boardToCreate.labels.push(labelToCreate); - }); + + if (boardToImport.labels) { + boardToImport.labels.forEach(label => { + const labelToCreate = { + _id: Random.id(6), + color: label.color, + name: label.name, + }; + // We need to remember them by Wekan ID, as this is the only ref we have + // when importing cards. + this.labels[label._id] = labelToCreate._id; + boardToCreate.labels.push(labelToCreate); + }); + } + const boardId = Boards.direct.insert(boardToCreate); Boards.direct.update(boardId, { $set: { From d30ce3c5cf00fe5758d9e49af7cc1826e0e179ae Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Mon, 26 Jul 2021 14:04:25 +0300 Subject: [PATCH 24/24] Updated ChangeLog. --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4e0fb965..aa90ef3f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,15 @@ Note: With Docker, please don't use latest tag. Only use release tags. See https://github.com/wekan/wekan/issues/3874 +# Upcoming Wekan release + +This release fixes the following bugs: + +- [Fixed Wekan JSON import fails](https://github.com/wekan/wekan/commit/0fa8fc8b506831a60649d100ce93c96f8f7b76f5). + Thanks to BartoszBroda and xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + # v5.40 2021-07-25 Wekan release This release fixes the following bugs: