diff --git a/common/Tests/colors-test/.gitignore b/common/Tests/colors-test/.gitignore
new file mode 100644
index 0000000000..0b84df0f02
--- /dev/null
+++ b/common/Tests/colors-test/.gitignore
@@ -0,0 +1 @@
+*.html
\ No newline at end of file
diff --git a/common/Tests/colors-test/package.json b/common/Tests/colors-test/package.json
new file mode 100644
index 0000000000..a3d09b2c4c
--- /dev/null
+++ b/common/Tests/colors-test/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "colors-test",
+ "version": "1.0.0",
+ "main": "index.js",
+ "license": "MIT",
+ "type": "module",
+ "scripts": {
+ "start": "node src/index.js"
+ }
+}
diff --git a/common/Tests/colors-test/src/exclude.js b/common/Tests/colors-test/src/exclude.js
new file mode 100644
index 0000000000..3013d850e1
--- /dev/null
+++ b/common/Tests/colors-test/src/exclude.js
@@ -0,0 +1,39 @@
+// (c) Copyright Ascensio System SIA 2010-2024
+//
+// This program is a free software product.
+// You can redistribute it and/or modify it under the terms
+// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
+// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
+// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
+// any third-party rights.
+//
+// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
+// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+//
+// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
+//
+// The interactive user interfaces in modified source and object code versions of the Program must
+// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
+//
+// Pursuant to Section 7(b) of the License you must retain the original Product logo when
+// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
+// trademark law for use of our trademarks.
+//
+// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
+// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
+// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+
+export const excludeFiles = ["../../../packages/shared/utils/encoder.ts"];
+
+export const excludeDirs = [
+ "../../../packages/client/node_modules",
+ "../../../packages/shared/node_modules",
+ "../../../packages/login/node_modules",
+ "../../../packages/doceditor/node_modules",
+ "../../../packages/management/node_modules",
+ "../../../packages/doceditor/.next",
+ "../../../packages/login/.next",
+ "../../../packages/login/dist",
+ "../../../packages/shared/themes",
+];
diff --git a/common/Tests/colors-test/src/index.js b/common/Tests/colors-test/src/index.js
new file mode 100644
index 0000000000..7f3891ef24
--- /dev/null
+++ b/common/Tests/colors-test/src/index.js
@@ -0,0 +1,42 @@
+// (c) Copyright Ascensio System SIA 2010-2024
+//
+// This program is a free software product.
+// You can redistribute it and/or modify it under the terms
+// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
+// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
+// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
+// any third-party rights.
+//
+// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
+// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+//
+// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
+//
+// The interactive user interfaces in modified source and object code versions of the Program must
+// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
+//
+// Pursuant to Section 7(b) of the License you must retain the original Product logo when
+// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
+// trademark law for use of our trademarks.
+//
+// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
+// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
+// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+
+import fs from "fs";
+import { searchDirectoryForHexColors } from "./utils.js";
+import { excludeDirs, excludeFiles } from "./exclude.js";
+import { generateReport } from "./report.js";
+
+const directoryPath = "../../../packages";
+const reportName = `colors_report_${new Date().toJSON()}.html`;
+
+const hexColorsFound = searchDirectoryForHexColors(
+ directoryPath,
+ excludeFiles,
+ excludeDirs
+);
+
+const htmlReport = generateReport(hexColorsFound);
+fs.writeFileSync(reportName, htmlReport, "utf-8");
diff --git a/common/Tests/colors-test/src/report.js b/common/Tests/colors-test/src/report.js
new file mode 100644
index 0000000000..fcaf2328c6
--- /dev/null
+++ b/common/Tests/colors-test/src/report.js
@@ -0,0 +1,67 @@
+// (c) Copyright Ascensio System SIA 2010-2024
+//
+// This program is a free software product.
+// You can redistribute it and/or modify it under the terms
+// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
+// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
+// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
+// any third-party rights.
+//
+// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
+// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+//
+// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
+//
+// The interactive user interfaces in modified source and object code versions of the Program must
+// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
+//
+// Pursuant to Section 7(b) of the License you must retain the original Product logo when
+// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
+// trademark law for use of our trademarks.
+//
+// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
+// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
+// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+
+export function generateReport(hexColorsFound) {
+ let htmlReport = `
+
+
+
+
+
+ Colors report
+
+
+
+ Colors Report
+ Found colors in the following files:
+`;
+
+ Object.keys(hexColorsFound).forEach((file) => {
+ htmlReport += `File: ${file} `;
+ hexColorsFound[file].forEach((color) => {
+ htmlReport += `
+
+
+ ${color}
+ `;
+ });
+ htmlReport += " ";
+ });
+
+ htmlReport += `
+ Total files with colors: ${Object.keys(hexColorsFound).length}
+
+`;
+
+ return htmlReport;
+}
diff --git a/common/Tests/colors-test/src/utils.js b/common/Tests/colors-test/src/utils.js
new file mode 100644
index 0000000000..115adf2eb2
--- /dev/null
+++ b/common/Tests/colors-test/src/utils.js
@@ -0,0 +1,72 @@
+// (c) Copyright Ascensio System SIA 2010-2024
+//
+// This program is a free software product.
+// You can redistribute it and/or modify it under the terms
+// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
+// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
+// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
+// any third-party rights.
+//
+// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
+// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+//
+// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
+//
+// The interactive user interfaces in modified source and object code versions of the Program must
+// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
+//
+// Pursuant to Section 7(b) of the License you must retain the original Product logo when
+// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
+// trademark law for use of our trademarks.
+//
+// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
+// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
+// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+
+import path from "path";
+import fs from "fs";
+
+const hexColorPattern = /#(?:[0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})\b/g;
+
+export function findHexColorsInFile(filePath) {
+ const content = fs.readFileSync(filePath, "utf-8");
+ const matches = content.match(hexColorPattern);
+ return matches || [];
+}
+
+export function searchDirectoryForHexColors(
+ directory,
+ excludeFiles = [],
+ excludeDirs = []
+) {
+ let hexColors = {};
+
+ function walkDirectory(currentPath) {
+ const items = fs.readdirSync(currentPath);
+
+ items.forEach((item) => {
+ const fullPath = path.join(currentPath, item);
+ const isDirectory = fs.statSync(fullPath).isDirectory();
+
+ if (isDirectory) {
+ if (!excludeDirs.includes(fullPath)) {
+ walkDirectory(fullPath);
+ }
+ } else {
+ if (
+ !excludeFiles.includes(fullPath) &&
+ /\.(js|ts|jsx|tsx)$/.test(item)
+ ) {
+ const matches = findHexColorsInFile(fullPath);
+ if (matches.length > 0) {
+ hexColors[fullPath] = matches;
+ }
+ }
+ }
+ });
+ }
+
+ walkDirectory(directory);
+ return hexColors;
+}
diff --git a/common/Tests/colors-test/yarn.lock b/common/Tests/colors-test/yarn.lock
new file mode 100644
index 0000000000..fe2c2bb9f2
--- /dev/null
+++ b/common/Tests/colors-test/yarn.lock
@@ -0,0 +1,12 @@
+# This file is generated by running "yarn install" inside your project.
+# Manual changes might be lost - proceed with caution!
+
+__metadata:
+ version: 8
+ cacheKey: 10
+
+"colors-test@workspace:.":
+ version: 0.0.0-use.local
+ resolution: "colors-test@workspace:."
+ languageName: unknown
+ linkType: soft
diff --git a/i18next/client.babel b/i18next/client.babel
index 965782e07d..d9db8a8af7 100644
--- a/i18next/client.babel
+++ b/i18next/client.babel
@@ -47550,6 +47550,138 @@
+
+ PasswordProtectedFiles
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
PasswordSuccessfullyCopied
@@ -95506,6 +95638,138 @@
+
+ LdapQuotaInfo
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
LdapSecondName
@@ -100000,7 +100264,139 @@
MainBar
- ClickHere
+ ArchivedRoomsOrContact
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ ClickToUpgradeTariff
@@ -100395,6 +100791,402 @@
+
+ ContactToUpgradeTariff
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ PersonalQuotaHeader
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ PersonalQuotaHeaderForAdmins
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
PersonalUserQuotaAdminsDescription
@@ -100659,6 +101451,402 @@
+
+ RemoveFilesOrClickToUpgrade
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ RemoveFilesOrContactToUpgrade
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ RemoveFilesOrContactToUpgradeQuota
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
RequestActivation
@@ -101055,6 +102243,138 @@
+
+ RoomQuotaHeaderLimit
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
StorageAndRoomHeader
@@ -101187,6 +102507,138 @@
+
+ StorageAndRoomLimitHeader
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
StorageAndUserHeader
@@ -101320,7 +102772,7 @@
- StorageQuotaDescription
+ StorageAndUserTariffLimitHeader
@@ -101452,7 +102904,7 @@
- StorageQuotaExceeded
+ StorageLimitHeader
@@ -101715,138 +103167,6 @@
-
- StorageQuotaUserDescription
-
-
-
-
-
- ar-SA
- false
-
-
- az-Latn-AZ
- false
-
-
- bg-BG
- false
-
-
- cs-CZ
- false
-
-
- de-DE
- false
-
-
- el-GR
- false
-
-
- en-US
- false
-
-
- es-ES
- false
-
-
- fi-FI
- false
-
-
- fr-FR
- false
-
-
- hy-AM
- false
-
-
- it-IT
- false
-
-
- ja-JP
- false
-
-
- ko-KR
- false
-
-
- lo-LA
- false
-
-
- lv-LV
- false
-
-
- nl-NL
- false
-
-
- pl-PL
- false
-
-
- pt-BR
- false
-
-
- pt-PT
- false
-
-
- ro-RO
- false
-
-
- ru-RU
- false
-
-
- si-SI
- false
-
-
- sk-SK
- false
-
-
- sl-SI
- false
-
-
- sr-Cyrl-RS
- false
-
-
- sr-Latn-RS
- false
-
-
- tr-TR
- false
-
-
- uk-UA
- false
-
-
- vi-VN
- false
-
-
- zh-CN
- false
-
-
-
TenantCustomQuotaDescription
@@ -101980,7 +103300,7 @@
- UserQuotaDescription
+ UserQuotaHeader
@@ -102112,7 +103432,535 @@
- UserQuotaHeader
+ UserTariffAlmostReached
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ UserTariffAlmostReachedForAdmins
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ UserTariffLimitHeader
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ UserTariffReached
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ UserTariffReachedForAdmins
@@ -105294,6 +107142,402 @@
+
+ CannotCreateNewRoom
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ CannotCreatePaidUsers
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ CannotRestoreRoom
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
ChooseNewPayer
@@ -107010,6 +109254,666 @@
+
+ NewRoomWillExceedLimit
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ NewUsersWillExceedMembersLimit
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ NotPossibleRoomRestoring
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ NumberOfRoomsAccordingToTariff
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
+
+ NumberOfUsersAccordingToTariff
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
Pay
@@ -107406,138 +110310,6 @@
-
- PaymentOverdue
-
-
-
-
-
- ar-SA
- false
-
-
- az-Latn-AZ
- false
-
-
- bg-BG
- false
-
-
- cs-CZ
- false
-
-
- de-DE
- false
-
-
- el-GR
- false
-
-
- en-US
- false
-
-
- es-ES
- false
-
-
- fi-FI
- false
-
-
- fr-FR
- false
-
-
- hy-AM
- false
-
-
- it-IT
- false
-
-
- ja-JP
- false
-
-
- ko-KR
- false
-
-
- lo-LA
- false
-
-
- lv-LV
- false
-
-
- nl-NL
- false
-
-
- pl-PL
- false
-
-
- pt-BR
- false
-
-
- pt-PT
- false
-
-
- ro-RO
- false
-
-
- ru-RU
- false
-
-
- si-SI
- false
-
-
- sk-SK
- false
-
-
- sl-SI
- false
-
-
- sr-Cyrl-RS
- false
-
-
- sr-Latn-RS
- false
-
-
- tr-TR
- false
-
-
- uk-UA
- false
-
-
- vi-VN
- false
-
-
- zh-CN
- false
-
-
-
PriceCalculation
@@ -107934,6 +110706,138 @@
+
+ RoomsQuotaAlmostExhausted
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
StartupSuggestion
@@ -108726,138 +111630,6 @@
-
- UpgradePlanInfo
-
-
-
-
-
- ar-SA
- false
-
-
- az-Latn-AZ
- false
-
-
- bg-BG
- false
-
-
- cs-CZ
- false
-
-
- de-DE
- false
-
-
- el-GR
- false
-
-
- en-US
- false
-
-
- es-ES
- false
-
-
- fi-FI
- false
-
-
- fr-FR
- false
-
-
- hy-AM
- false
-
-
- it-IT
- false
-
-
- ja-JP
- false
-
-
- ko-KR
- false
-
-
- lo-LA
- false
-
-
- lv-LV
- false
-
-
- nl-NL
- false
-
-
- pl-PL
- false
-
-
- pt-BR
- false
-
-
- pt-PT
- false
-
-
- ro-RO
- false
-
-
- ru-RU
- false
-
-
- si-SI
- false
-
-
- sk-SK
- false
-
-
- sl-SI
- false
-
-
- sr-Cyrl-RS
- false
-
-
- sr-Latn-RS
- false
-
-
- tr-TR
- false
-
-
- uk-UA
- false
-
-
- vi-VN
- false
-
-
- zh-CN
- false
-
-
-
UserNotFound
@@ -109122,6 +111894,138 @@
+
+ UsersQuotaAlmostExhausted
+
+
+
+
+
+ ar-SA
+ false
+
+
+ az-Latn-AZ
+ false
+
+
+ bg-BG
+ false
+
+
+ cs-CZ
+ false
+
+
+ de-DE
+ false
+
+
+ el-GR
+ false
+
+
+ en-US
+ false
+
+
+ es-ES
+ false
+
+
+ fi-FI
+ false
+
+
+ fr-FR
+ false
+
+
+ hy-AM
+ false
+
+
+ it-IT
+ false
+
+
+ ja-JP
+ false
+
+
+ ko-KR
+ false
+
+
+ lo-LA
+ false
+
+
+ lv-LV
+ false
+
+
+ nl-NL
+ false
+
+
+ pl-PL
+ false
+
+
+ pt-BR
+ false
+
+
+ pt-PT
+ false
+
+
+ ro-RO
+ false
+
+
+ ru-RU
+ false
+
+
+ si-SI
+ false
+
+
+ sk-SK
+ false
+
+
+ sl-SI
+ false
+
+
+ sr-Cyrl-RS
+ false
+
+
+ sr-Latn-RS
+ false
+
+
+ tr-TR
+ false
+
+
+ uk-UA
+ false
+
+
+ vi-VN
+ false
+
+
+ zh-CN
+ false
+
+
+
YourPrice
@@ -113885,7 +116789,7 @@
PDFFormDialog
- PDFFormDialogTitle
+ PDFform
diff --git a/packages/client/public/index.html b/packages/client/public/index.html
index 0b3d4c57c9..5cbeef002a 100644
--- a/packages/client/public/index.html
+++ b/packages/client/public/index.html
@@ -19,6 +19,7 @@
href="/logo.ashx?logotype=3"
/>
+
diff --git a/packages/client/public/locales/ar-SA/MainBar.json b/packages/client/public/locales/ar-SA/MainBar.json
index 930faa48bf..ce753f8398 100644
--- a/packages/client/public/locales/ar-SA/MainBar.json
+++ b/packages/client/public/locales/ar-SA/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "انقر هنا",
"ConfirmEmailDescription": "استخدم الرابط الموجود في البريد الإلكتروني للتفعيل. لم تستلم بريدًا إلكترونيًا يحتوي على رابط التفعيل؟",
"ConfirmEmailHeader": "يرجى تنشيط بريدك الإلكتروني ({{email}}) للوصول إلى ميزات {{productName}}",
"PersonalUserQuotaAdminsDescription": "لتحميل وإنشاء ملفات ومجلدات جديدة ، يرجى تحرير مساحة على القرص، أو إدارة الحصة النسبية لكل مستخدم في <1>إعدادات إدارة التخزين.1>",
"PersonalUserQuotaDescription": "لتحميل وإنشاء ملفات ومجلدات جديدة، يرجى تحرير مساحة على القرص أو الاتصال بالمسؤول لزيادة حصة التخزين.",
"RequestActivation": "اطلب التفعيل مرة أخرى",
- "RoomQuotaDescription": "يمكنك أرشفة الغرف غير الضرورية أو <1> {{clickHere}}1> للعثور على خطة أسعار أكثر ملاءمة لـ {{productName}}",
"RoomQuotaHeader": "عدد الغرف على وشك أن يتجاوز: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "حدود مساحة التخزين والغرف على وشك أن يتم تجاوزها.",
"StorageAndUserHeader": "حدود مساحة التخزين والمشرفين / المستخدمين المتميزين على وشك أن يتم تجاوزها.",
- "StorageQuotaDescription": "يمكنك إزالة الملفات غير الضرورية أو <1> {{clickHere}}1> للعثور على خطة تسعير أكثر ملاءمة لـ {{productName}} الخاص بك.",
- "StorageQuotaExceeded": "تم تجاوز حصة التخزين",
"StorageQuotaHeader": "حجم مساحة التخزين على وشك أن يتم تجاوزها: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "يمكنك إزالة الملفات غير الضرورية لتحرير مساحة القرص.",
"TenantCustomQuotaDescription": "يمكنك إزالة الملفات غير الضرورية أو تغيير الحصة النسبية في <1> إعدادات إدارة التخزين.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> للعثور على خطة تسعير أفضل لـ {{productName}} الخاص بك.",
"UserQuotaHeader": "عدد المشرفين المستخدمين المتميزين على وشك أن يتم تجاوزه: {{currentValue}} / {{maxValue}}"
}
diff --git a/packages/client/public/locales/ar-SA/PDFFormDialog.json b/packages/client/public/locales/ar-SA/PDFFormDialog.json
index 55ab8f3599..935b077a73 100644
--- a/packages/client/public/locales/ar-SA/PDFFormDialog.json
+++ b/packages/client/public/locales/ar-SA/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "نموذج PDF جاهز للتعبئة",
"PDFFormEditDialogDescription": "هل تريد التبديل إلى وضع تحرير النموذج؟ يرجى ملاحظة أن النموذج لن يكون متاحًا لتعبئته بعد الآن وستحتاج إلى النقر على بدء التعبئة مرة أخرى بعد التحرير لتعبئته.",
"PDFFormEditDialogTitle": "تحرير النموذج",
"PDFFormIsReadyToast": "نموذج PDF <1>{{filename}}1> جاهز للتعبئة.",
diff --git a/packages/client/public/locales/ar-SA/Payments.json b/packages/client/public/locales/ar-SA/Payments.json
index ff6650c022..05652b317b 100644
--- a/packages/client/public/locales/ar-SA/Payments.json
+++ b/packages/client/public/locales/ar-SA/Payments.json
@@ -25,7 +25,6 @@
"Pay": "ادفع",
"Payer": "طريقة الدفع",
"PayerDescription": "هذا المستخدم لديه حق الوصول إلى تفاصيل الدفع وهو المستخدم الوحيد الذي يمكنه تعديل الحصة وإجراء المدفوعات. يمكن لمالك {{productName}} ، بالإضافة إلى مدير الدفع نفسه ، إعادة تعيين دور مدير الدفع باستخدام بوابة عملاء سترب.",
- "PaymentOverdue": "لا يمكن إضافة مستخدمين جدد.",
"PriceCalculation": "احسب سعرك",
"RenewSubscription": "تجديد الاشتراك في خطة {{planName}}",
"RoomManagerDescription": "إدارة الغرف والأرشفة ودعوة المستخدم وإدارتها. يمكن تعيين عدة مدراء للغرفة.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1> {{currencySymbol}} 1> <2> {{price}} 2> <3> / شهر 3>",
"UpgradeNow": "قم بالترقية الآن",
"UpgradePlan": "قم بالترقية إلى خطة جديدة",
- "UpgradePlanInfo": "عند إضافة مستخدمين جدد ستتجاوز الحد الأقصى لعدد أعضاء الغرف المسموح به في خطة التسعير الحالية الخاصة بك.",
"UserNotFound": "المستخدم <1> {{email}} 1> غير موجود.",
"UserNotFoundMatchingEmail": "لم نتمكن من العثور على المستخدم الذي يحمل نفس بريد سترب المطابق.",
"YourPrice": "سعرك"
diff --git a/packages/client/public/locales/az/MainBar.json b/packages/client/public/locales/az/MainBar.json
index bb8c0523de..9169a638d9 100644
--- a/packages/client/public/locales/az/MainBar.json
+++ b/packages/client/public/locales/az/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Buraya klikləyin",
"ConfirmEmailDescription": "Aktivləşdirmə e-məktubunda göndərilən keçiddən istifadə edin. Aktivləşdirmə linki olan e-məktub almamısınız?",
"ConfirmEmailHeader": "Lütfən, {{productName}} xüsusiyyətlərinə daxil olmaq üçün e-poçtunuzu ({{ email }}) aktiv edin.",
"PersonalUserQuotaAdminsDescription": "Yeni fayl və qovluqları yükləmək və yaratmaq üçün zəhmət olmasa, diskdə yer boşaldın və ya <1>Yaddaş idarəetmə parametrlərində1> hər istifadəçi kvotasını idarə edin.",
"PersonalUserQuotaDescription": "Yeni fayl və qovluqları yükləmək və yaratmaq üçün diskdə yer boşaldın və ya yaddaş kvotasını artırmaq üçün administratorla əlaqə saxlayın.",
"RequestActivation": "Yenidən aktivləşdirmə tələb edin",
- "RoomQuotaDescription": "{{productName}} üçün daha uyğun qiymət planı tapmaq üçün lazımsız otaqları arxivləşdirə və ya <1>{{clickHere}}1> edə bilərsiniz.",
"RoomQuotaHeader": "Otaqlar keçmək üzrədir: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Yaddaş və otaq limitləri aşmaq üzrədir.",
"StorageAndUserHeader": "Yaddaş və administratorlar/ekspert istifadəçilər limitləri aşmaq üzrədir.",
- "StorageQuotaDescription": "Siz lazımsız faylları silə və ya {{productName}} üçün daha uyğun qiymət planı tapmaq üçün <1>{{clickHere}}1> edə bilərsiniz.",
- "StorageQuotaExceeded": "Yaddaş kvotası limiti keçib",
"StorageQuotaHeader": "Yaddaş sahəsinin həcmi keçmək üzrədir : {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Diskdə yer boşaltmaq üçün lazımsız faylları silə bilərsiniz.",
"TenantCustomQuotaDescription": "<1>Yaddaş idarəetmə parametrlərində1> lazımsız faylları silə və ya kvotanı dəyişə bilərsiniz.",
- "UserQuotaDescription": "<1>{{clickHere}}1> məhsulunuz üçün daha yaxşı qiymət planı tapmaq üçün {{productName}}.",
"UserQuotaHeader": "Admin/ekspert istifadəçilərin sayı keçmək üzrədir: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/az/PDFFormDialog.json b/packages/client/public/locales/az/PDFFormDialog.json
index 15fe1ed5d9..1608bf4540 100644
--- a/packages/client/public/locales/az/PDFFormDialog.json
+++ b/packages/client/public/locales/az/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Doldurmağa hazır PDF forması",
"PDFFormEditDialogDescription": "Forma redaktə rejiminə keçmək istəyirsiniz? F Nəzərə alın ki, formanı artıq doldurmaq mümkün deyil və formanı doldurmaq üçün redaktə etdikdən sonra yenidən Doldurmağa başla düyməsini sıxmalısınız.",
"PDFFormEditDialogTitle": "Forma redaktə etmə",
"PDFFormIsReadyToast": "<1>{{filename}}1> PDF forması doldurulmağa hazırdır.",
diff --git a/packages/client/public/locales/az/Payments.json b/packages/client/public/locales/az/Payments.json
index 269fb3dd95..c2e37b7ec4 100644
--- a/packages/client/public/locales/az/Payments.json
+++ b/packages/client/public/locales/az/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Ödəyin",
"Payer": "Ödəyici",
"PayerDescription": "Bu istifadəçi ödəniş təfərrüatlarına daxil ola bilər və kvota təyin edib ödəniş edə bilən yeganə istifadəçidir. {{productName}} sahibi və ödəniş meneceri özləri Stripe müştəri portalından istifadə edərək ödəniş meneceri rolunu yenidən təyin edə bilərlər.",
- "PaymentOverdue": "Yeni istifadəçilər əlavə etmək mümkün deyil.",
"PriceCalculation": "Qiymətinizi hesablayın",
"RenewSubscription": "{{planName}} Plan abunəliyini yeniləyin",
"RoomManagerDescription": "Otağın idarə edilməsi və arxivləşdirilməsi, istifadəçi dəvəti və idarə edilməsi. Otağa bir neçə admin təyin edilə bilər.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/ay3>",
"UpgradeNow": "İndi yeniləyin",
"UpgradePlan": "Planı yeniləyin",
- "UpgradePlanInfo": "Yeni istifadəçilərin əlavə edilməsi cari qiymət planınızın icazə verdiyi otaq üzvlərinin maksimum sayını keçəcək.",
"UserNotFound": "İstifadəçi <1>{{email}}1> tapılmadı.",
"UserNotFoundMatchingEmail": "Uyğun Stripe e-poçtu olan istifadəçini tapa bilmədik.",
"YourPrice": "Qiymətiniz"
diff --git a/packages/client/public/locales/bg/MainBar.json b/packages/client/public/locales/bg/MainBar.json
index f2bee2f8a6..aef5fe57f0 100644
--- a/packages/client/public/locales/bg/MainBar.json
+++ b/packages/client/public/locales/bg/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Кликнете тук",
"ConfirmEmailDescription": "Използвайте линка, предоставен в имейла за активиране. Не сте получили имейл с линк за активиране?",
"ConfirmEmailHeader": "Моля, активирайте своя имейл ({{ email }}), за да получите достъп до функциите на {{productName}}.",
"PersonalUserQuotaAdminsDescription": "За да качите и създадете нови файлове и папки, моля, освободете място на диска или управлявайте квотата за потребител в <1>Настройки за управление на хранилището.1>",
"PersonalUserQuotaDescription": "За да качите и създадете нови файлове и папки, моля, освободете място на диска или се свържете с администратора, който да увеличи квотата за съхранение.",
"RequestActivation": "Отново заявете активиране",
- "RoomQuotaDescription": "Можете да архивирате ненужните стаи или <1>{{clickHere}}1>, за да намерите по-подходящ ценови план за вашия {{productName}}.",
"RoomQuotaHeader": "Стаите са на път да бъдат надвишени: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "На път сте да превишите ограниченията за съхранение и помещения.",
"StorageAndUserHeader": "На път сте да превишите ограниченията за съхранение и администратори/опитни потребители.",
- "StorageQuotaDescription": "Можете да премахнете ненужните файлове или <1>{{clickHere}}1>, за да намерите по-подходящ ценови план за вашия {{productName}}.",
- "StorageQuotaExceeded": "Квотата за съхранение е надвишена",
"StorageQuotaHeader": "Размерът на пространството за съхранение е на път да бъде надвишен: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Можете да премахнете ненужните файлове, за да освободите дисково пространство.",
"TenantCustomQuotaDescription": "Можете да премахнете ненужните файлове или да промените квотата от <1>Настройки за управление на хранилището.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1>, за да намерите по-добър абонаментен план за вашия {{productName}}.",
"UserQuotaHeader": "На път сте да превишите броят на администраторите/опитните потребители: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/bg/PDFFormDialog.json b/packages/client/public/locales/bg/PDFFormDialog.json
index 750bc17d50..114a588432 100644
--- a/packages/client/public/locales/bg/PDFFormDialog.json
+++ b/packages/client/public/locales/bg/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Готов за попълване PDF формуляр",
"PDFFormEditDialogDescription": "Искате ли да превключите на режим редактиране на формуляр? Молим да имате предвид, че формулярът вече няма да бъде достъпен за попълване и ще трябва да щракнете върху бутона Започни попълване отново след редактиране, за да го попълните.",
"PDFFormEditDialogTitle": "Редактиране на формуляр",
"PDFFormIsReadyToast": "PDF формуляр <1>{{filename}}1> е готов за попълване.",
diff --git a/packages/client/public/locales/bg/Payments.json b/packages/client/public/locales/bg/Payments.json
index 42828054bb..832f66ef71 100644
--- a/packages/client/public/locales/bg/Payments.json
+++ b/packages/client/public/locales/bg/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Плащане",
"Payer": "Платец",
"PayerDescription": "Този потребител има достъп до подробности за плащането и е единственият потребител, който може да коригира квотата и да извършва плащания. Собственикът на {{productName}}, както и самият управител на плащанията, могат да преназначат ролята на управител на плащанията с помощта на портала за клиенти на Stripe.",
- "PaymentOverdue": "Не могат да се добавят нови потребители.",
"PriceCalculation": "Изчислете цената си",
"RenewSubscription": "Подновете абонамента за плана {{planName}}",
"RoomManagerDescription": "Администриране и архивиране на стаи, покана и управление на потребители. За стаята могат да бъдат назначени няколко администратора.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/месец3>",
"UpgradeNow": "Надстройте сега",
"UpgradePlan": "Надграждане на абонамента",
- "UpgradePlanInfo": "Добавянето на нови потребители ще надвиши максималния брой членове на стаята, достъпен за текущия Ви абонаментен план.",
"UserNotFound": "Потребителят <1>{{email}}1> не е намерен.",
"UserNotFoundMatchingEmail": "Не можахме да намерим потребителя със съответстващия Stripe имейл.",
"YourPrice": "Вашата цена"
diff --git a/packages/client/public/locales/cs/MainBar.json b/packages/client/public/locales/cs/MainBar.json
index d9a758fdd3..488175fc54 100644
--- a/packages/client/public/locales/cs/MainBar.json
+++ b/packages/client/public/locales/cs/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Klikněte zde",
"ConfirmEmailDescription": "Použijte odkaz uvedený v aktivačním e-mailu. Neobdrželi jste e-mail s aktivačním odkazem?",
"ConfirmEmailHeader": "Pro získání přístupu k funkcím {{productName}} aktivujte svůj e-mail ({{ email }}).",
"PersonalUserQuotaAdminsDescription": "Chcete-li nahrávat a vytvářet nové soubory a složky, uvolněte místo na disku nebo spravujte kvótu pro uživatele v nastavení <1>Správa úložiště.1>",
"PersonalUserQuotaDescription": "Chcete-li nahrávat a vytvářet nové soubory a složky, uvolněte místo na disku nebo se obraťte na správce, aby zvýšil kvótu úložiště.",
"RequestActivation": "Znovu požádat o o aktivaci",
- "RoomQuotaDescription": "Nepotřebné místnosti můžete archivovat nebo <1>{{clickHere}}}1> pro nalezení vhodnějšího cenového tarifu pro váš {{productName}}.",
"RoomQuotaHeader": "Počet místností bude brzy překročen: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Limity úložiště a místností budou brzy překročeny.",
"StorageAndUserHeader": "Limity pro úložiště a správce/oprávněné uživatele budou brzy překročeny.",
- "StorageQuotaDescription": "Nepotřebné soubory můžete odstranit nebo <1>{{clickHere}}}1> pro nalezení vhodnějšího cenového tarifu pro váš {{productName}}.",
- "StorageQuotaExceeded": "Překročení kvóty úložiště",
"StorageQuotaHeader": "Množství úložného prostoru bude brzy překročeno: {{currentValue}} / {{maxValue}}.",
- "StorageQuotaUserDescription": "Nepotřebné soubory můžete odstranit a uvolnit tak místo na disku.",
"TenantCustomQuotaDescription": "Nepotřebné soubory můžete odstranit nebo změnit kvótu v <1>Nastavení správy úložiště.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> a najděte lepší cenový tarif pro svůj {{productName}}.",
"UserQuotaHeader": "Počet administrátorů/přístupných uživatelů bude brzy překročen: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/cs/PDFFormDialog.json b/packages/client/public/locales/cs/PDFFormDialog.json
index 0572895712..956ca29a88 100644
--- a/packages/client/public/locales/cs/PDFFormDialog.json
+++ b/packages/client/public/locales/cs/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "PDF formulář připravený k vyplnění",
"PDFFormEditDialogDescription": "Chcete přepnout do režimu úprav formuláře? Vezměte prosím na vědomí, že formulář již nebude k dispozici pro vyplnění a po úpravě bude nutné znovu kliknout na tlačítko Začít vyplňovat, abyste jej mohli vyplnit.",
"PDFFormEditDialogTitle": "Úprava formuláře",
"PDFFormIsReadyToast": "PDF formulář <1>{{filename}}1> je připraven k vyplnění.",
diff --git a/packages/client/public/locales/cs/Payments.json b/packages/client/public/locales/cs/Payments.json
index a2fbde6be4..853fcabaf7 100644
--- a/packages/client/public/locales/cs/Payments.json
+++ b/packages/client/public/locales/cs/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Platit",
"Payer": "Plátce",
"PayerDescription": "Tento uživatel má přístup k platebním údajům a je jediným uživatelem, který může upravovat kvóty a provádět platby. Vlastník {{productName}}, stejně jako samotný správce platby, může roli správce platby přeřadit pomocí zákaznického prostoru Stripe.",
- "PaymentOverdue": "Nelze přidávat nové uživatele.",
"PriceCalculation": "Vypočítejte si cenu",
"RenewSubscription": "Obnovit předplatné tarifu {{planName}}",
"RoomManagerDescription": "Správa a archivace místností, pozvání a správa uživatelů. K místnosti lze přiřadit několik správců.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/měsíc3>",
"UpgradeNow": "Aktualizovat nyní",
"UpgradePlan": "Plán aktualizace",
- "UpgradePlanInfo": "Přidáním nových uživatelů překročíte maximální počet členů místnosti povolený vaším aktuálním cenovým tarifem.",
"UserNotFound": "Uživatel <1>{{email}}1> nebyl nalezen.",
"UserNotFoundMatchingEmail": "Nepodařilo se nám najít uživatele s odpovídajícím e-mailem Stripe.",
"YourPrice": "Vaše cena"
diff --git a/packages/client/public/locales/de/MainBar.json b/packages/client/public/locales/de/MainBar.json
index c7815382a0..d876c7c8c1 100644
--- a/packages/client/public/locales/de/MainBar.json
+++ b/packages/client/public/locales/de/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Hier klicken",
"ConfirmEmailDescription": "Verwenden Sie den in der Aktivierungs-E-Mail angegebenen Link. Haben Sie keine E-Mail mit dem Aktivierungslink erhalten?",
"ConfirmEmailHeader": "Bitte aktivieren Sie Ihre E-Mail ({{ email }}), um Zugang zu den {{productName}}-Funktionen zu erhalten.",
"PersonalUserQuotaAdminsDescription": "Um neue Dateien und Ordner hochzuladen und zu erstellen, geben Sie bitte Speicherplatz frei oder verwalten Sie die Quote pro Benutzer in den <1>Speicherverwaltungseinstellungen1>",
"PersonalUserQuotaDescription": "Um neue Dateien und Ordner hochzuladen und zu erstellen, geben Sie bitte Speicherplatz frei oder wenden Sie sich an den Administrator, um die Speicherquote zu erhöhen.",
"RequestActivation": "Erneute Aktivierung anfordern",
- "RoomQuotaDescription": "Sie können die überflüssigen Räume archivieren oder <1>{{clickHere}}1> einen passenderen Preisplan für Ihren {{productName}} finden.",
"RoomQuotaHeader": "Die Anzahl von Räumen wird bald überschritten sein: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Die Speicher- und Raumlimits werden bald überschritten sein.",
"StorageAndUserHeader": "Limits für Speicherplatz und Admins/Power-User werden bald überschritten sein.",
- "StorageQuotaDescription": "Sie können die unerwünschten Dateien entfernen oder <1>{{{clickHere}}1> einen geeigneteren Preisplan für Ihren {{productName}} finden.",
- "StorageQuotaExceeded": "Speicherquote überschritten",
"StorageQuotaHeader": "Das Speicherplatzlimit wird bald überschritten: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Sie können die nicht benötigten Dateien entfernen, um Speicherplatz freizugeben.",
"TenantCustomQuotaDescription": "Sie können unnötige Dateien entfernen oder die Quote in den <1>Speicherverwaltungseinstellungen1> ändern",
- "UserQuotaDescription": "<1>{{clickHere}}1>, um einen besseren Preisplan für Ihr {{productName}} zu finden.",
"UserQuotaHeader": "Die Anzahl der Admins/Power-User wird bald überschritten sein: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/de/PDFFormDialog.json b/packages/client/public/locales/de/PDFFormDialog.json
index 50e9350f9f..e7de52429c 100644
--- a/packages/client/public/locales/de/PDFFormDialog.json
+++ b/packages/client/public/locales/de/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Ausfüllbares PDF-Formular",
"PDFFormEditDialogDescription": "Möchten Sie in den Modus der Formularbearbeitung wechseln? Bitte beachten Sie, dass das Formular dann nicht mehr zum Ausfüllen zur Verfügung steht und Sie nach der Bearbeitung erneut auf die Schaltfläche Ausfüllen beginnen klicken müssen, um es auszufüllen.",
"PDFFormEditDialogTitle": "Formularbearbeitung",
"PDFFormIsReadyToast": "Das PDF-Formular <1>{{filename}}1> ist bereit zum Ausfüllen.",
diff --git a/packages/client/public/locales/de/Payments.json b/packages/client/public/locales/de/Payments.json
index 66c8fd7c32..66f8db0b31 100644
--- a/packages/client/public/locales/de/Payments.json
+++ b/packages/client/public/locales/de/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Bezahlen",
"Payer": "Zahler",
"PayerDescription": "Dieser Benutzer hat Zugriff auf die Zahlungsdetails und ist der einzige Benutzer, der die Quote anpassen und Zahlungen vornehmen kann. Der {{productName}}-Besitzer sowie der zahlende Manager selbst können die Rolle des zahlenden Managers über das Stripe-Kundenportal neu zuweisen.",
- "PaymentOverdue": "Es können keine neuen Benutzer hinzugefügt werden.",
"PriceCalculation": "Berechnen Sie Ihren Preis",
"RenewSubscription": "Abonnement des {{planName}}-Plans erneuern",
"RoomManagerDescription": "Raumverwaltung und Archivierung, Benutzereinladung und -verwaltung. Dem Raum können mehrere Administratoren zugewiesen werden.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/Monat3>",
"UpgradeNow": "Jetzt upgraden",
"UpgradePlan": "Plan upgraden",
- "UpgradePlanInfo": "Das Hinzufügen neuer Benutzer überschreitet die maximale Anzahl von Raummitgliedern, die Ihr aktueller Preisplan zulässt.",
"UserNotFound": "Benutzer <1>{{email}}1> ist nicht gefunden.",
"UserNotFoundMatchingEmail": "Wir konnten den Benutzer mit der passenden Stripe-E-Mail nicht finden.",
"YourPrice": "Ihr Preis"
diff --git a/packages/client/public/locales/el-GR/MainBar.json b/packages/client/public/locales/el-GR/MainBar.json
index dfc0852561..5002732c64 100644
--- a/packages/client/public/locales/el-GR/MainBar.json
+++ b/packages/client/public/locales/el-GR/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "κάντε κλικ εδώ",
"ConfirmEmailDescription": "Χρησιμοποιήστε τον σύνδεσμο που παρέχεται στο email ενεργοποίησης. Δεν έχετε λάβει email με τον σύνδεσμο ενεργοποίησης;",
"ConfirmEmailHeader": "Ενεργοποιήστε το email ({{ email }}) σας για να αποκτήσετε πρόσβαση στις λειτουργίες του {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Για να μεταφορτώσετε και να δημιουργήσετε νέα αρχεία και φακέλους, ελευθερώστε χώρο στον δίσκο ή διαχειριστείτε την ποσόστωση ανά χρήστη στις <1>Ρυθμίσεις διαχείρισης αποθ. χώρου.1>",
"PersonalUserQuotaDescription": "Για να ανεβάσετε και να δημιουργήσετε νέα αρχεία και φακέλους, ελευθερώστε χώρο στον δίσκο ή επικοινωνήστε με τον διαχειριστή για να αυξήσετε την ποσόστωση αποθ. χώρου.",
"RequestActivation": "Ζητήστε εκ νέου ενεργοποίηση",
- "RoomQuotaDescription": "Μπορείτε να αρχειοθετήσετε τα περιττά δωμάτια ή <1>{{clickHere}}1> για να βρείτε ένα πιο κατάλληλο πρόγραμμα τιμολόγησης για το {{productName}} σας.",
"RoomQuotaHeader": "Πρόκειται να γίνει υπέρβαση ορίου για τα δωμάτια: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Τα όρια αποθηκευτικού χώρου και δωματίων πρόκειται να ξεπεραστούν.",
"StorageAndUserHeader": "Τα όρια αποθηκευτικού χώρου και διαχειριστών/χρηστών ισχύος πρόκειται να ξεπεραστούν.",
- "StorageQuotaDescription": "Μπορείτε να αφαιρέσετε τα περιττά αρχεία ή <1>{{clickHere}}1> για να βρείτε ένα πιο κατάλληλο πρόγραμμα τιμολόγησης για το {{productName}} σας.",
- "StorageQuotaExceeded": "Υπέρβαση ποσόστωσης αποθ. χώρου",
"StorageQuotaHeader": "Το ποσό του χώρου αποθήκευσης πρόκειται να ξεπεραστεί: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Μπορείτε να αφαιρέσετε τα περιττά αρχεία για να ελευθερώσετε χώρο στον δίσκο.",
"TenantCustomQuotaDescription": "Μπορείτε να αφαιρέσετε τα περιττά αρχεία ή να αλλάξετε την ποσόστωση στις <1>Ρυθμίσεις διαχείρισης αποθ. χώρου.1>",
- "UserQuotaDescription": "Κάντε κλικ εδώ <1>{{clickHere}}1> για να βρείτε ένα καλύτερο πρόγραμμα τιμολόγησης για την {{productName}} σας.",
"UserQuotaHeader": "Ο αριθμός των διαχειριστών/χρηστών ισχύος πρόκειται να ξεπεραστεί: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/el-GR/PDFFormDialog.json b/packages/client/public/locales/el-GR/PDFFormDialog.json
index 2a9968bb51..1fb7601a1d 100644
--- a/packages/client/public/locales/el-GR/PDFFormDialog.json
+++ b/packages/client/public/locales/el-GR/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Έτοιμη προς συμπλήρωση φόρμα PDF",
"PDFFormEditDialogDescription": "Θέλετε να μεταβείτε στη λειτουργία επεξεργασίας φόρμας; Λάβετε υπόψη ότι η φόρμα δεν θα είναι πλέον διαθέσιμη για συμπλήρωση και θα πρέπει να κάνετε ξανά κλικ στο κουμπί Έναρξη συμπλήρωσης μετά την επεξεργασία για να τη συμπληρώσετε.",
"PDFFormEditDialogTitle": "Επεξεργασία φόρμας",
"PDFFormIsReadyToast": "Η φόρμα PDF <1>{{filename}}1> είναι έτοιμη να συμπληρωθεί.",
diff --git a/packages/client/public/locales/el-GR/Payments.json b/packages/client/public/locales/el-GR/Payments.json
index cfc61d9fd7..3c41103267 100644
--- a/packages/client/public/locales/el-GR/Payments.json
+++ b/packages/client/public/locales/el-GR/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Πληρωμή",
"Payer": "Πληρωτής",
"PayerDescription": "Αυτός ο χρήστης έχει πρόσβαση στα στοιχεία πληρωμής και είναι ο μόνος χρήστης που μπορεί να προσαρμόσει την ποσόστωση και να πραγματοποιήσει πληρωμές. Ο ιδιοκτήτης του {{productName}}, καθώς και ο ίδιος ο διαχειριστής πληρωμών, μπορούν να αναθέσουν εκ νέου το ρόλο του διαχειριστή πληρωμών χρησιμοποιώντας την πύλη πελατών της Stripe.",
- "PaymentOverdue": "Δεν είναι δυνατή η προσθήκη νέων χρηστών.",
"PriceCalculation": "Υπολογίστε την τιμή σας",
"RenewSubscription": "Ανανεώστε τη συνδρομή στο πρόγραμμα {{planName}}",
"RoomManagerDescription": "Διαχείριση και αρχειοθέτηση δωματίων, πρόσκληση και διαχείριση χρηστών. Στο δωμάτιο μπορούν να οριστούν διάφοροι διαχειριστές.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/μήνα3>",
"UpgradeNow": "Αναβάθμιση τώρα",
"UpgradePlan": "Αναβάθμιση προγράμματος",
- "UpgradePlanInfo": "Η προσθήκη νέων χρηστών θα υπερβεί τον μέγιστο αριθμό μελών δωματίου που επιτρέπεται από το τρέχον τιμολογιακό σας πρόγραμμα.",
"UserNotFound": "Ο χρήστης <1>{{email}}1> δεν βρέθηκε.",
"UserNotFoundMatchingEmail": "Δεν μπορέσαμε να βρούμε τον χρήστη με το αντίστοιχο e-mail της Stripe.",
"YourPrice": "Η τιμή σας"
diff --git a/packages/client/public/locales/en/Files.json b/packages/client/public/locales/en/Files.json
index 1597d2ab33..3d8601db58 100644
--- a/packages/client/public/locales/en/Files.json
+++ b/packages/client/public/locales/en/Files.json
@@ -117,6 +117,7 @@
"OpenLocation": "Open location",
"PasswordAccess": "Password access",
"PasswordLink": "Add a password to protect your link.",
+ "PasswordProtectedFiles": "Please <0>enter a password0> for the protected files to continue",
"PasswordSuccessfullyCopied": "Password successfully copied",
"Pin": "Pin",
"PinToTop": "Pin to top",
diff --git a/packages/client/public/locales/en/Ldap.json b/packages/client/public/locales/en/Ldap.json
index 3b768ae259..f8eb100cce 100644
--- a/packages/client/public/locales/en/Ldap.json
+++ b/packages/client/public/locales/en/Ldap.json
@@ -36,6 +36,7 @@
"LdapPortNumber": "Port Number",
"LdapPortNumberTooltip": "Enter the port number for your LDAP server/Active Directory.",
"LdapQuota": "User quota",
+ "LdapQuotaInfo": "To be able to use this attribute, enable user quota in the <0>Storage management settings0>",
"LdapSecondName": "Second name",
"LdapSendWelcomeLetter": "Send welcome letter",
"LdapSendWelcomeLetterTooltip": "If checked all new users will receive welcome letter. Available only when Mail Attribute is mapped to LDAP.",
@@ -66,7 +67,7 @@
"LdapUserDNTooltip": "Enter the distinguished name to the directory containing users you want to add.",
"LdapUserFilter": "User Filter",
"LdapUserFilterTooltip": "Use the search LDAP filter to select the users who must be imported.",
- "LdapUserQuotaTooltip": "To set a storage quota for user, add an attribute in the LDAP directory (for example, DocSpaceQuota) and enter an integer value for this attribute. It will display the quota value in bytes. Here, specify the attribute name only. This attribute will be applied only during the first setup and can be later changed manually in the Accounts section.",
+ "LdapUserQuotaTooltip": "To set a storage quota for user, add an attribute in the LDAP directory (for example, UsersQuotaLimit) and enter an integer value for this attribute. It will display the quota value in bytes. Here, specify the attribute name only. This attribute will be applied only during the first setup and can be later changed manually in the Accounts section.",
"LdapUsersType": "Users type",
"LdapUsersTypeInfo": "Users can only access the rooms they are invited to by admins, and can't create own rooms, folders or files. Select another type below to provide more permissions. Otherwise, you can change the type manually in the Accounts section.",
"LdapUserTypeTooltip": "All users will be added to {{productName}} with the selected type."
diff --git a/packages/client/public/locales/en/MainBar.json b/packages/client/public/locales/en/MainBar.json
index 8b4e267a9e..8c76a500aa 100644
--- a/packages/client/public/locales/en/MainBar.json
+++ b/packages/client/public/locales/en/MainBar.json
@@ -1,19 +1,31 @@
{
- "ClickHere": "Click here",
+ "ArchivedRoomsOrContact": "You can archived the unnecessary rooms or contact the {{productName}} administrator to upgrade the tariff plan.",
+ "ClickToUpgradeTariff": "<1>Click here1> to upgrade your tariff plan.",
"ConfirmEmailDescription": "Use the link provided in the activation email. Haven't received an email with the activation link?",
"ConfirmEmailHeader": "Please activate your email ({{ email }}) to get access to the {{productName}} features.",
+ "ContactToUpgradeTariff": "Contact the {{productName}} administrator to upgrade the tariff plan.",
+ "PersonalQuotaHeader": "Your personal storage quota exceeded",
+ "PersonalQuotaHeaderForAdmins": "Storage quota per user exceeded",
"PersonalUserQuotaAdminsDescription": "To upload and create new files and folders, please free up disk space, or manage quota per user in the <1>Storage management settings.1>",
- "PersonalUserQuotaDescription": "To upload and create new files and folders, please free up disk space, or contact the administrator to increase the storage quota.",
+ "PersonalUserQuotaDescription": "To upload and create new files and folders, please free up disk space, or contact the {{productName}} administrator to increase the storage quota.",
+ "RemoveFilesOrClickToUpgrade": "Remove the unnecessary files or <1>click here1> to upgrade your tariff plan.",
+ "RemoveFilesOrContactToUpgrade": "Remove the unnecessary files or contact the {{productName}} administrator to upgrade the tariff plan.",
+ "RemoveFilesOrContactToUpgradeQuota": "Remove the unnecessary files or contact the {{productName}} administrator to increase the storage quota.",
"RequestActivation": "Request activation once again",
- "RoomQuotaDescription": "You can archive the unnecessary rooms or <1>{{clickHere}}1> to find a more suitable pricing plan for your {{productName}}.",
+ "RoomQuotaDescription": "You can archive the unnecessary rooms or <1>click here1> to find a more suitable pricing plan for your {{productName}}.",
"RoomQuotaHeader": "The number of rooms is about to be exceeded: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Storage and rooms limits are about to be exceeded.",
- "StorageAndUserHeader": "Storage and admins/power users limits are about to be exceeded.",
- "StorageQuotaDescription": "You can remove the unnecessary files or <1>{{clickHere}}1> to find a more suitable pricing plan for your {{productName}}.",
- "StorageQuotaExceeded": "Storage quota exceeded",
+ "RoomQuotaHeaderLimit": "The limit is reached for the number of rooms: {{currentValue}} / {{maxValue}}",
+ "StorageAndRoomHeader": "The limit for storage space and the number of rooms is about to be exceeded",
+ "StorageAndRoomLimitHeader": "The limit is reached for storage space and the number of rooms",
+ "StorageAndUserHeader": "The limit for storage space and the number of admins/power users is about to be exceeded",
+ "StorageAndUserTariffLimitHeader": "The limit is reached for storage space and the number of admins/power users",
+ "StorageLimitHeader": "The limit is reached for storage space: {{currentValue}} / {{maxValue}}",
"StorageQuotaHeader": "Storage space amount is about to be exceeded: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "You can remove the unnecessary files to free up disk space.",
"TenantCustomQuotaDescription": "You can remove the unnecessary files or change quota in the <1>Storage management settings.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> to find a better pricing plan for your {{productName}}.",
- "UserQuotaHeader": "The number of admins/power users is about to be exceeded: {{currentValue}} / {{maxValue}}."
+ "UserQuotaHeader": "The number of admins/power users is about to be exceeded: {{currentValue}} / {{maxValue}}",
+ "UserTariffAlmostReached": "Once the limit is reached, all users will be added with User permissions only. To be able to add further admins/power users, contact the {{productName}} administrator to upgrade the tariff plan.",
+ "UserTariffAlmostReachedForAdmins": "Once the limit is reached, all users will be added with User permissions only. To be able to add further admins/power users, <1>click here1> to upgrade your tariff plan.",
+ "UserTariffLimitHeader": "The limit is reached for the number of admins/power users: {{currentValue}} / {{maxValue}}",
+ "UserTariffReached": "All users will be added with User permissions only. To be able to add further admins/power users, contact the {{productName}} administrator to upgrade the tariff plan.",
+ "UserTariffReachedForAdmins": "All users will be added with User permissions only. To be able to add further admins/power users, <1>click here1> to upgrade your tariff plan."
}
diff --git a/packages/client/public/locales/en/PDFFormDialog.json b/packages/client/public/locales/en/PDFFormDialog.json
index 93408f6085..784ade7520 100644
--- a/packages/client/public/locales/en/PDFFormDialog.json
+++ b/packages/client/public/locales/en/PDFFormDialog.json
@@ -1,5 +1,5 @@
{
- "PDFFormDialogTitle": "Ready-to-fill-out PDF form",
+ "PDFform": "PDF form",
"PDFFormEditDialogDescription": "Do you want to switch to the form editing mode? Please note that the form will no longer be available for filling out and you will need to click the Start filling button again after editing to fill it out.",
"PDFFormEditDialogTitle": "Form editing",
"PDFFormIsReadyToast": "PDF form <1>{{filename}}1> is ready to be filled out.",
diff --git a/packages/client/public/locales/en/Payments.json b/packages/client/public/locales/en/Payments.json
index 1f32a18430..52ba68f8e7 100644
--- a/packages/client/public/locales/en/Payments.json
+++ b/packages/client/public/locales/en/Payments.json
@@ -9,6 +9,9 @@
"BusinessSuggestion": "Customize your {{planName}} plan",
"BusinessTitle": "You are using {{planName}} plan",
"BusinessUpdated": "{{planName}} plan updated",
+ "CannotCreateNewRoom": "Room cannot be created",
+ "CannotCreatePaidUsers": "Paid users cannot be added",
+ "CannotRestoreRoom": "Room cannot be restored",
"ChooseNewPayer": "Choose a new Payer",
"ChooseNewPlan": "Would you like to choose a new pricing plan?",
"ContactUs": "For sales questions, contact us at",
@@ -22,21 +25,26 @@
"InvalidEmailWithoutActiveSubscription": "We recommend choosing a new Payer who gets access to subscription settings in {{productName}}.",
"InvalidEmailWithoutActiveSubscriptionByAdmin": "We recommend contacting the {{productName}} owner to choose a new Payer.",
"ManagerTypesDescription": "Admin account types and their privileges",
+ "NewRoomWillExceedLimit": "Creating this room is not possible since the limit is reached for the number of rooms included in your current plan.",
+ "NewUsersWillExceedMembersLimit": "Adding new paid users is not possible since the limit is reached for the number of admins included in your current plan.",
+ "NotPossibleRoomRestoring": "Restoring this room is not possible since the limit is reached for the number of rooms included in your current plan.",
+ "NumberOfRoomsAccordingToTariff": "Number of rooms according to your tariff plan: {{currentValue}}/{{maxValue}}",
+ "NumberOfUsersAccordingToTariff": "Number of admins/power users according to your tariff plan: {{currentValue}}/{{maxValue}}",
"Pay": "Pay",
"Payer": "Payer",
"PayerDescription": "This user has access to payment details and is the only user who can adjust the quota and make payments. The {{productName}} owner, as well as the paying manager themselves, can reassign the paying manager role using the Stripe customer portal.",
- "PaymentOverdue": "Cannot add new users.",
"PriceCalculation": "Calculate your price",
"RenewSubscription": "Renew subscription to {{planName}} plan",
"RoomManagerDescription": "Room administration and archiving, user invitation and management. Several admins can be assigned to the room.",
+ "RoomsQuotaAlmostExhausted": "The quota of rooms is almost exhausted.",
"StartupSuggestion": "Do more with {{planName}} plan",
"StartupTitle": "You are using free {{planName}} plan",
"StripeCustomerPortal": "go to the Stripe customer portal",
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/month3>",
"UpgradeNow": "Upgrade now",
"UpgradePlan": "Upgrade plan",
- "UpgradePlanInfo": "By adding new users you will exceed the maximum number of room members allowed by your current pricing plan.",
"UserNotFound": "User <1>{{email}}1> is not found.",
"UserNotFoundMatchingEmail": "We couldn’t find the user with the matching Stripe e-mail.",
+ "UsersQuotaAlmostExhausted": "The quota of paid users is almost exhausted.",
"YourPrice": "Your price"
}
diff --git a/packages/client/public/locales/es/MainBar.json b/packages/client/public/locales/es/MainBar.json
index 76df9a5987..58b9e6b755 100644
--- a/packages/client/public/locales/es/MainBar.json
+++ b/packages/client/public/locales/es/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Haga clic aquí",
"ConfirmEmailDescription": "Utilice el enlace proporcionado en el correo electrónico de activación. ¿No ha recibido el correo electrónico con el enlace de activación?",
"ConfirmEmailHeader": "Por favor, active su correo electrónico ({{ email }}) para obtener acceso a las características de {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Para cargar y crear nuevos archivos y carpetas, libere espacio en el disco o administre la cuota por usuario en la <1>Configuración de administración de almacenamiento1>.",
"PersonalUserQuotaDescription": "Para cargar y crear nuevos archivos y carpetas, libere espacio en el disco o contacte con el administrador para aumentar la cuota de almacenamiento.",
"RequestActivation": "Volver a solicitar la activación",
- "RoomQuotaDescription": "Puede archivar las salas innecesarias o <1>{{clickHere}}1> para encontrar un plan de precios más adecuado para su {{productName}}.",
"RoomQuotaHeader": "Las salas están a punto de excederse: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Los límites de almacenamiento y de salas están a punto de excederse.",
"StorageAndUserHeader": "Los límites de almacenamiento y de administradores/usuarios avanzados están a punto de excederse.",
- "StorageQuotaDescription": "Puede eliminar los archivos innecesarios o <1>{{clickHere}}1> para encontrar un plan de precios más adecuado para su {{productName}}.",
- "StorageQuotaExceeded": "Se ha superado la cuota de almacenamiento",
"StorageQuotaHeader": "La cantidad de espacio de almacenamiento está a punto de excederse: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Puede eliminar los archivos innecesarios para liberar espacio en disco.",
"TenantCustomQuotaDescription": "Puede eliminar los archivos innecesarios o cambiar la cuota en la <1>Configuración de administración de almacenamiento1>.",
- "UserQuotaDescription": "<1>{{clickHere}}1> para encontrar un mejor plan de precios para su {{productName}}.",
"UserQuotaHeader": "El número de administradores/usuarios avanzados está a punto de excederse: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/es/PDFFormDialog.json b/packages/client/public/locales/es/PDFFormDialog.json
index 2a8edf1d43..c4e3653bf5 100644
--- a/packages/client/public/locales/es/PDFFormDialog.json
+++ b/packages/client/public/locales/es/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Formulario PDF listo para rellenar",
"PDFFormEditDialogDescription": "¿Desea cambiar al modo de edición de formularios? Por favor, tenga en cuenta que el formulario ya no estará disponible para rellenarlo y tendrá que volver a hacer clic en el botón Empezar a rellenar después de editarlo para rellenarlo.",
"PDFFormEditDialogTitle": "Edición del formulario",
"PDFFormIsReadyToast": "El formulario PDF <1>{{filename}}1> está listo para ser rellenado.",
diff --git a/packages/client/public/locales/es/Payments.json b/packages/client/public/locales/es/Payments.json
index 0ac4d2c5f7..d134259af5 100644
--- a/packages/client/public/locales/es/Payments.json
+++ b/packages/client/public/locales/es/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Pagar",
"Payer": "Pagador",
"PayerDescription": "Este usuario tiene acceso a los detalles de pago y es el único que puede ajustar la cuota y realizar pagos. El propietario de {{productName}}, así como el propio gestor de pagos, pueden reasignar el rol de gestor de pagos mediante el portal de cliente de Stripe.",
- "PaymentOverdue": "No se puede añadir nuevos usuarios.",
"PriceCalculation": "Calcule su precio",
"RenewSubscription": "Renovar suscripción al plan {{planName}}",
"RoomManagerDescription": "Administración y archivado de salas, invitación y gestión de usuarios. Se pueden asignar varios administradores a la sala.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/mes3>",
"UpgradeNow": "Actualizar ahora",
"UpgradePlan": "Actualizar plan",
- "UpgradePlanInfo": "La adición de nuevos usuarios excederá el número máximo de miembros de la sala permitidos por su plan de precios actual.",
"UserNotFound": "No se ha encontrado el usuario <1>{{email}}1>.",
"UserNotFoundMatchingEmail": "No hemos podido encontrar al usuario con el correo electrónico de Stripe correspondiente.",
"YourPrice": "Su precio"
diff --git a/packages/client/public/locales/fi/MainBar.json b/packages/client/public/locales/fi/MainBar.json
index e078ac33e2..c27eba1263 100644
--- a/packages/client/public/locales/fi/MainBar.json
+++ b/packages/client/public/locales/fi/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Klikkaa tästä",
"ConfirmEmailDescription": "Käytä aktivointisähköpostissa annettua linkkiä. Etkö ole saanut aktivointilinkkiä sähköpostilla?",
"ConfirmEmailHeader": "Ole hyvä ja aktivoi sähköpostisi ({{ email }}) saadaksesi {{productName}}:n ominaisuudet käyttöön.",
"PersonalUserQuotaAdminsDescription": "Ole hyvä ja vapauta levytilaa ladataksesi ja luodaksesi uusia tiedostoja ja kansioita, tai hallitaksesi kiintiötä per käyttäjä <1>Muistinhallinta-asetuksissa. 1>",
"PersonalUserQuotaDescription": "Ole hyvä ja vapauta levytilaa ladataksesi ja luodaksesi tiedostoja ja kansioita tai ota yhteyttä järjestelmänvalvojaan lisätäksesi muistin kiintiötä.",
"RequestActivation": "Pyydä aktivointia vielä kerran",
- "RoomQuotaDescription": "Voit arkistoida huoneita, joita et käytä tai <1>{{clickHere}}1> löytääksesi sopivamman hinnoitteluohjelman {{productName}}-llesi.",
"RoomQuotaHeader": "Huoneet täyttyvät pian {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Muisti ja huoneiden määrän raja on ylittymässä. ",
"StorageAndUserHeader": "Muisti ja ylläpitäjien/tehokäyttäjien määrän raja on ylittymässä.",
- "StorageQuotaDescription": "Voit poistaa tarpeettomat tiedostot tai <1>{{clickHere}}1> löytääksesi sopivamman hintaohjelman {{productName}}-llesi.",
- "StorageQuotaExceeded": "Muistin kiintiö ylitetty",
"StorageQuotaHeader": "Tallennustilan määrä on ylittymässä: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Voit poistaa tarpeettomat tiedostot vapauttaaksesi levytilaa.",
"TenantCustomQuotaDescription": "Voit poistaa tarpeettomat tiedostot tai muuttaa kiintiötä <1>Muistinhallinta-asetuksissa.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> löytääksesi {{productName}}-llesi sopivamman hinnoitteluohjelman.",
"UserQuotaHeader": "Ylläpitäjien/tehokäyttäjien määrän raja on ylittymässä: {{currentValue}} / {{maxValue}}"
}
diff --git a/packages/client/public/locales/fi/PDFFormDialog.json b/packages/client/public/locales/fi/PDFFormDialog.json
index ff1a5cb431..77a3880373 100644
--- a/packages/client/public/locales/fi/PDFFormDialog.json
+++ b/packages/client/public/locales/fi/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Lomakepohja",
"PDFFormEditDialogDescription": "Haluatko vaihtaa lomakkeen muokkaustilaan? Huomioithan, että lomake ei ole enää täytettävissä ja sinun tulee klikata Aloita täyttäminen-painiketta jälleen muokkauksen jälkeen alkaessasi täyttää sitä.",
"PDFFormEditDialogTitle": "Lomakkeen muokkaus",
"PDFFormIsReadyToast": "PDF-lomake <1>{{filename}}1> on valmiina täytettäväksi.",
diff --git a/packages/client/public/locales/fi/Payments.json b/packages/client/public/locales/fi/Payments.json
index ea16547d45..dc870d12f7 100644
--- a/packages/client/public/locales/fi/Payments.json
+++ b/packages/client/public/locales/fi/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Maksa",
"Payer": "Maksaja",
"PayerDescription": "Tällä käyttäjällä on pääsy maksutietoihin ja on ainoa käyttäjä, joka voi muokata kiintiötä ja suorittaa maksuja. {{productName}}-n omistaja ja maksava johtaja voivat määrätä uudelleen maksavan johtajan rooliin käyttäen Stripe-asiakasportaalia.",
- "PaymentOverdue": "Et voi lisätä uusia käyttäjiä.",
"PriceCalculation": "Laske hintasi",
"RenewSubscription": "Uusi tilaus {{planName}} ohjelmaan",
"RoomManagerDescription": "Huoneen hallinto ja arkistointi, käyttäjien kutsuminen ja hallinta. Useita järjestelmänvalvojia voi olla määrättynä huoneeseen.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/kuukausi3>",
"UpgradeNow": "Päivitä nyt",
"UpgradePlan": "Päivitä ohjelma",
- "UpgradePlanInfo": "Uusien käyttäjien lisääminen ylittää huoneen jäsenien maksimimäärän, jonka tämänhetkinen hinnoitteluohjelma sallii.",
"UserNotFound": "Käyttäjän <1>{{email}}1> ei löydy.",
"UserNotFoundMatchingEmail": "Käyttäjää vastaavalla Stripe-sähköpostilla ei löytynyt.",
"YourPrice": "Hintasi"
diff --git a/packages/client/public/locales/fr/MainBar.json b/packages/client/public/locales/fr/MainBar.json
index 77a980d913..7aec9a4979 100644
--- a/packages/client/public/locales/fr/MainBar.json
+++ b/packages/client/public/locales/fr/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Cliquer ici",
"ConfirmEmailDescription": "Utilisez le lien fourni dans l’e-mail d’activation. Vous n’avez pas reçu d’e-mail contenant le lien d’activation ?",
"ConfirmEmailHeader": "Veuillez activer votre adresse e-mail ({{ email }}) pour accéder aux fonctionnalités de {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Pour télécharger et créer de nouveaux fichiers et dossiers, veuillez libérer l'espace de stockage ou gérez des quotas d'utilisateurs à partir de la section <1>Paramètres de gestion du stockage.1>",
"PersonalUserQuotaDescription": "Pour télécharger et créer de nouveaux fichiers et dossiers, veuillez libérer l'espace de stockage ou contactez l'administrateur pour augmenter le quota de stockage.",
"RequestActivation": "Demander à nouveau l’activation",
- "RoomQuotaDescription": "Vous pouvez archiver les salles inutiles ou <1>{{clickHere}}1> pour trouver un plan tarifaire plus adapté à votre {{productName}}.",
"RoomQuotaHeader": "Salles est sur le point d’être dépassée : {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Les limites de stockage et de salles sont sur le point d’être dépassées.",
"StorageAndUserHeader": "Les limites de stockage et d'administrateurs/utilisateurs avancés sont sur le point d'être dépassées.",
- "StorageQuotaDescription": "Vous pouvez supprimer les fichiers inutiles ou <1>{{clickHere}}1> pour trouver un plan tarifaire plus adapté à votre {{productName}}.",
- "StorageQuotaExceeded": "Quota de stockage est dépassé",
"StorageQuotaHeader": "L’espace de stockage est sur le point d’être dépassé : {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Vous pouvez supprimer les fichiers inutiles pour libérer de l'espace disque.",
"TenantCustomQuotaDescription": "Vous pouvez supprimer les fichiers inutiles ou modifier le quota dans la section <1>Paramètres de gestion du stockage.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> pour trouver un meilleur plan tarifaire pour votre {{productName}}.",
"UserQuotaHeader": "Le nombre d'administrateurs/utilisateurs avancés est sur le point d'être dépassé : {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/fr/PDFFormDialog.json b/packages/client/public/locales/fr/PDFFormDialog.json
index ed80b0a90f..343cd5bd31 100644
--- a/packages/client/public/locales/fr/PDFFormDialog.json
+++ b/packages/client/public/locales/fr/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Formulaire PDF prêt à remplir",
"PDFFormEditDialogDescription": "Souhaitez-vous passer au mode d'édition du formulaire ? Veuillez noter que le formulaire ne sera plus disponible pour être rempli et que vous devrez cliquer à nouveau sur le bouton Commencer à remplir après l'édition pour le remplir.",
"PDFFormEditDialogTitle": "Édition de formulaires",
"PDFFormIsReadyToast": "Le formulaire PDF <1>{{filename}}1> est prêt à être rempli.",
diff --git a/packages/client/public/locales/fr/Payments.json b/packages/client/public/locales/fr/Payments.json
index c477f7d41c..83df6c471a 100644
--- a/packages/client/public/locales/fr/Payments.json
+++ b/packages/client/public/locales/fr/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Payer",
"Payer": "Payeur",
"PayerDescription": "Cet utilisateur a accès aux détails des paiements et est le seul à pouvoir ajuster le quota et effectuer des paiements. Le propriétaire de {{productName}}, ainsi que le gestionnaire de paiement lui-même, peuvent réattribuer le rôle de gestionnaire de paiement en utilisant le portail client Stripe.",
- "PaymentOverdue": "Impossible d’ajouter de nouveaux utilisateurs.",
"PriceCalculation": "Calculez votre prix",
"RenewSubscription": "Renouveler l’abonnement au plan tarifaire {{planName}}",
"RoomManagerDescription": "Administration et archivage des salles, invitation et gestion des utilisateurs. Plusieurs administrateurs peuvent être affectés à la salle.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/mois3>",
"UpgradeNow": "Mettre à jour maintenant",
"UpgradePlan": "Mettre à jour le plan tarifaire",
- "UpgradePlanInfo": "L’ajout de nouveaux utilisateurs dépassera le nombre maximum de membres de la salle autorisé par votre plan tarifaire actuel.",
"UserNotFound": "L’utilisateur <1>{{email}}1> est introuvable.",
"UserNotFoundMatchingEmail": "Nous n’avons pas trouvé l’utilisateur avec l’e-mail Stripe correspondant.",
"YourPrice": "Votre prix"
diff --git a/packages/client/public/locales/hy-AM/MainBar.json b/packages/client/public/locales/hy-AM/MainBar.json
index 15841056b3..06a2b162d7 100644
--- a/packages/client/public/locales/hy-AM/MainBar.json
+++ b/packages/client/public/locales/hy-AM/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Կտտացրեք այստեղ",
"ConfirmEmailDescription": "Օգտագործեք ակտիվացման նամակում նշված հղումը: Ակտիվացման հղումով նամակ չե՞ք ստացել:",
"ConfirmEmailHeader": "Խնդրում ենք ակտիվացնել ձեր էլ ({{ email }})․ հասցեն՝ {{productName}}-ի գործառույթներին հասանելիություն ստանալու համար։",
"PersonalUserQuotaAdminsDescription": "Նոր ֆայլեր և պանակներ վերբեռնելու և ստեղծելու համար խնդրում ենք ազատեք սկավառակի տարածքը կամ կառավարեք յուրաքանչյուր օգտատիրոջ չափաբաժինը <1>Storage management settings.1>",
"PersonalUserQuotaDescription": "Նոր ֆայլեր և թղթապանակներ վերբեռնելու և ստեղծելու համար խնդրում ենք ազատեք սկավառակի տարածքը կամ կապվեք ադմինիստրատորի հետ՝ պահեստավորման քվոտան մեծացնելու համար:",
"RequestActivation": "Խնդրեք ակտիվացում ևս մեկ անգամ",
- "RoomQuotaDescription": "Դուք կարող եք արխիվացնել ավելորդ սենյակները կամ <1>{{clickHere}}1>՝ ձեր {{productName}}-ի համար ավելի հարմար գնային պլան գտնելու համար:",
"RoomQuotaHeader": "Սենյակները շուտով գերազանցելու են՝ {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Պահեստի և սենյակների սահմանաչափերը շուտով կգերազանցվեն:",
"StorageAndUserHeader": "Պահպանման և ադմինիստրատորների/հզոր օգտագործողների սահմանաչափերը շուտով կգերազանցվեն:",
- "StorageQuotaDescription": "Դուք կարող եք հեռացնել ավելորդ ֆայլերը կամ <1>{{clickHere}}1>՝ ձեր {{productName}}-ի համար ավելի հարմար գնային պլան գտնելու համար:",
- "StorageQuotaExceeded": "Պահպանման սահմանաչափը գերազանցվել է",
"StorageQuotaHeader": "Պահեստային տարածքի քանակը քիչ է մնում գերազանցվի՝ {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Դուք կարող եք հեռացնել ավելորդ ֆայլերը՝ սկավառակի տարածքը ազատելու համար:",
"TenantCustomQuotaDescription": "Դուք կարող եք հեռացնել ավելորդ ֆայլերը կամ փոխել սահմանաչափը <1>Պահպանման կառավարման կարգավորումներ:1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> ձեր {{productName}}-ի համար ավելի լավ գնային փաթեթ գտնելու համար:",
"UserQuotaHeader": "Ադմինիստրատորների/հզոր օգտատերերի թիվը պատրաստվում է գերազանցել՝ {{currentValue}} / {{maxValue}}:"
}
diff --git a/packages/client/public/locales/hy-AM/PDFFormDialog.json b/packages/client/public/locales/hy-AM/PDFFormDialog.json
index 21a7076df0..f22950ae71 100644
--- a/packages/client/public/locales/hy-AM/PDFFormDialog.json
+++ b/packages/client/public/locales/hy-AM/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Լրացման պատրաստի PDF ձև",
"PDFFormEditDialogDescription": "Ցանկանու՞մ եք անցնել ձևի խմբագրման ռեժիմին: Խնդրում ենք նկատի ունենալ, որ ձևն այլևս հասանելի չի լինի լրացնելու համար, և այն լրացնելու համար անհրաժեշտ է խմբագրելուց հետո նորից սեղմել Սկսել լրացնել կոճակը:",
"PDFFormEditDialogTitle": "Ձևի խմբագրում",
"PDFFormIsReadyToast": "PDF ձև <1>{{filename}}1> պատրաստ է լրացման։",
diff --git a/packages/client/public/locales/hy-AM/Payments.json b/packages/client/public/locales/hy-AM/Payments.json
index 3d64485ff7..5c06cc36e1 100644
--- a/packages/client/public/locales/hy-AM/Payments.json
+++ b/packages/client/public/locales/hy-AM/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Վճարել",
"Payer": "Վճարող",
"PayerDescription": "Այս օգտվողին հասանելի են վճարման մանրամասները և միակ օգտվողն է, ով կարող է կարգավորել քվոտան և կատարել վճարումներ: {{productName}}-ի սեփականատերը, ինչպես նաև իրենք՝ վճարող կառավարիչը, կարող են վերահանձնել վճարող մենեջերի դերը՝ օգտագործելով Stripe հաճախորդների պորտալը:",
- "PaymentOverdue": "Հնարավոր չէ ավելացնել նոր օգտվողներ:",
"PriceCalculation": "Հաշվարկեք ձեր արժեքը",
"RenewSubscription": "Թարմացրեք {{planName}} պլանի բաժանորդագրությունը",
"RoomManagerDescription": "Սենյակի կառավարում և արխիվացում, օգտատերերի հրավեր և կառավարում: Սենյակում կարող են նշանակվել մի քանի ադմիններ:",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/ամիս3>",
"UpgradeNow": "Թարմացնել հիմա",
"UpgradePlan": "Թարմացման պլան",
- "UpgradePlanInfo": "Նոր օգտվողների ավելացումը կգերազանցի սենյակի անդամների առավելագույն թիվը, որը թույլատրվում է ձեր ընթացիկ գնային պլանով:",
"UserNotFound": "<1>{{email}}1> օգտվողը չի գտնվել:",
"UserNotFoundMatchingEmail": "Մենք չկարողացանք գտնել համապատասխան Stripe էլ․ հասցեով օգտվողին:",
"YourPrice": "Ձեր գինը"
diff --git a/packages/client/public/locales/it/MainBar.json b/packages/client/public/locales/it/MainBar.json
index d762e8f603..deb6118bff 100644
--- a/packages/client/public/locales/it/MainBar.json
+++ b/packages/client/public/locales/it/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Clicca qui",
"ConfirmEmailDescription": "Utilizza il collegamento fornito nell’e-mail di attivazione. Non hai ricevuto un’e-mail con il link di attivazione?",
"ConfirmEmailHeader": "Ti preghiamo di attivare la tua e-mail ({{ email }}) per accedere alle funzionalità di {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Per caricare e creare nuovi file e cartelle, libera spazio su disco o gestisci la quota per utente nelle <1>Impostazioni di gestione dello spazio di archiviazione.1>",
"PersonalUserQuotaDescription": "Per caricare e creare nuovi file e cartelle, libera spazio su disco o contatta l'amministratore per aumentare la quota di archiviazione.",
"RequestActivation": "Richiedi l’attivazione ancora una volta",
- "RoomQuotaDescription": "Puoi archiviare le stanze non necessarie o <1>{{clickHere}}1> per trovare un piano tariffario più adatto per il tuo {{productName}}.",
"RoomQuotaHeader": "Sta per essere superato il limite di stanze: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "I limiti di spazio di archiviazione e stanze stanno per essere superati.",
"StorageAndUserHeader": "I limiti di spazio di archiviazione e amministratori/utenti esperti stanno per essere superati.",
- "StorageQuotaDescription": "Puoi rimuovere i file non necessari o <1>{{clickHere}}1> per trovare un piano tariffario più adatto per il tuo {{productName}}.",
- "StorageQuotaExceeded": "Quota di archiviazione superata",
"StorageQuotaHeader": "Lo spazio di archiviazione sta per essere esaurito: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Puoi rimuovere i file non necessari per liberare spazio sul disco.",
"TenantCustomQuotaDescription": "Puoi rimuovere i file non necessari o modificare la quota nelle <1>mpostazioni di gestione dello spazio di archiviazione.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> per trovare un piano tariffario migliore per il tuo {{productName}}.",
"UserQuotaHeader": "Il numero di amministratori/utenti esperti sta per essere superato: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/it/PDFFormDialog.json b/packages/client/public/locales/it/PDFFormDialog.json
index 4d5cc29a84..86923ea167 100644
--- a/packages/client/public/locales/it/PDFFormDialog.json
+++ b/packages/client/public/locales/it/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Modulo PDF pronto da compilare",
"PDFFormEditDialogDescription": "Vuoi passare alla modalità di modifica del modulo? Tieni presente che il modulo non sarà più disponibile per la compilazione e dovrai fare nuovamente clic sul pulsante Inizia compilazione dopo la modifica per compilarlo.",
"PDFFormEditDialogTitle": "Modifica del modulo",
"PDFFormIsReadyToast": "Il modulo PDF <1>{{filename}}1> è pronto per essere compilato.",
diff --git a/packages/client/public/locales/it/Payments.json b/packages/client/public/locales/it/Payments.json
index 3f33861d78..662f01d08b 100644
--- a/packages/client/public/locales/it/Payments.json
+++ b/packages/client/public/locales/it/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Paga",
"Payer": "Pagatore",
"PayerDescription": "Questo utente ha accesso ai dettagli di pagamento ed è l’unico utente che può modificare la quota ed effettuare pagamenti. Il proprietario di {{productName}}, così come lo stesso gestore dei pagamenti, può riassegnare il ruolo di responsabile dei pagamenti utilizzando il portale clienti Stripe.",
- "PaymentOverdue": "Impossibile aggiungere nuovi utenti.",
"PriceCalculation": "Calcola il tuo prezzo",
"RenewSubscription": "Rinnova la sottoscrizione al piano {{planName}}",
"RoomManagerDescription": "Amministrazione e archiviazione delle stanze, invito e gestione degli utenti. È possibile assegnare più amministratori alla stanza.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/mese3>",
"UpgradeNow": "Aggiorna ora",
"UpgradePlan": "Aggiorna il piano",
- "UpgradePlanInfo": "Aggiungendo nuovi utenti supererai il numero massimo di membri della stanza consentito dal tuo attuale piano tariffario.",
"UserNotFound": "L’utente <1>{{email}}1> non è stato trovato.",
"UserNotFoundMatchingEmail": "Non siamo riusciti a trovare l'utente con l'e-mail Stripe corrispondente.",
"YourPrice": "Il tuo prezzo"
diff --git a/packages/client/public/locales/ja-JP/MainBar.json b/packages/client/public/locales/ja-JP/MainBar.json
index 31c39c3f5e..76d84473d2 100644
--- a/packages/client/public/locales/ja-JP/MainBar.json
+++ b/packages/client/public/locales/ja-JP/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "ここをクリック",
"ConfirmEmailDescription": "アクティベーションメールに記載されているリンクを使用してください。アクティベーション用リンクが記載されたメールが届いていませんか?",
"ConfirmEmailHeader": "{{productName}}の機能を利用するために、メール({{ email }})を有効にしてください。",
"PersonalUserQuotaAdminsDescription": "新しいファイルやフォルダをアップロードしたり作成したりするには、<1>ストレージ管理設定1>でディスク領域を解放するか、ユーザーごとに容量制限を管理してください。",
"PersonalUserQuotaDescription": "新しいファイルやフォルダをアップロードしたり作成したりするには、ディスクの空き容量を確保するか、管理者に連絡してストレージの容量制限を増やしてください。",
"RequestActivation": "もう一度アクティベーションを要求する",
- "RoomQuotaDescription": "不要なルームをアーカイブしたり、<1>{{clickHere}}1>して、{{productName}}にもっと適した料金プランを見つけることができます。",
"RoomQuotaHeader": "このルームは、もうすぐ制限を超えます:{{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "ストレージやルームの制限を超えそうです。",
"StorageAndUserHeader": "ストレージと管理者/パワーユーザーの制限を超えそうです。",
- "StorageQuotaDescription": "不要なファイルを削除するか、<1>{{clickHere}}1>して、{{productName}}に適した料金プランを見つけることができます。",
- "StorageQuotaExceeded": "ストレージ容量制限を超えています",
"StorageQuotaHeader": "ストレージのスペースは、もうすぐサイズ上限を超えます:{{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "不要なファイルを削除して、ディスク領域を確保できます。",
"TenantCustomQuotaDescription": "不要ファイルを削除するか、<1>ストレージ管理設定1>で容量制限の変更ができます。",
- "UserQuotaDescription": "お使いの{{productName}}に適した料金プランを選択するには、<1>{{clickHere}}1>。",
"UserQuotaHeader": "管理者/パワーユーザー数を超えそうです:{{currentValue}} / {{maxValue}}"
}
diff --git a/packages/client/public/locales/ja-JP/PDFFormDialog.json b/packages/client/public/locales/ja-JP/PDFFormDialog.json
index 783bc769f3..51f6231422 100644
--- a/packages/client/public/locales/ja-JP/PDFFormDialog.json
+++ b/packages/client/public/locales/ja-JP/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "すぐに使えるPDFフォーム",
"PDFFormEditDialogDescription": "フォーム編集モードに切り替えますか?この場合、フォームの入力はできなくなり、編集後に再度「記入開始」ボタンをクリックして入力する必要がありますのでご注意ください。",
"PDFFormEditDialogTitle": "フォーム編集",
"PDFFormIsReadyToast": "PDFフォーム<1>{{filename}}1>の記入準備が整いました。",
diff --git a/packages/client/public/locales/ja-JP/Payments.json b/packages/client/public/locales/ja-JP/Payments.json
index 113c0de4ee..a8cad0d2f3 100644
--- a/packages/client/public/locales/ja-JP/Payments.json
+++ b/packages/client/public/locales/ja-JP/Payments.json
@@ -25,7 +25,6 @@
"Pay": "支払",
"Payer": "支払人",
"PayerDescription": "このユーザーは、支払いの詳細へのアクセス権を持ち、クォータの調整と支払いを行うことができる唯一のユーザーです。{{productName}}の所有者だけでなく、支払いマネージャー自身も、Stripeカスタマーポータルを使用してペイイングマネージャーの役割を再割り当てすることができます。",
- "PaymentOverdue": "新しいユーザーを追加することができません。",
"PriceCalculation": "価格を計算する",
"RenewSubscription": "{{planName}}プランの契約を更新する",
"RoomManagerDescription": "ルームの管理・アーカイブ、ユーザーの招待・管理。ルームに複数の管理者を割り当てることができます。",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/月3>",
"UpgradeNow": "今すぐアップグレードする",
"UpgradePlan": "プランのアップグレード",
- "UpgradePlanInfo": "新しいユーザーを追加すると、現在の料金プランで許可されているルームメンバーの最大数を超えます。",
"UserNotFound": "<1>{{email}}1>ユーザーが見つかりません。",
"UserNotFoundMatchingEmail": "我们无法找到与Stripe电子邮件匹配的用户。",
"YourPrice": "価格"
diff --git a/packages/client/public/locales/ko-KR/MainBar.json b/packages/client/public/locales/ko-KR/MainBar.json
index dfb25b21b9..94d84e2c16 100644
--- a/packages/client/public/locales/ko-KR/MainBar.json
+++ b/packages/client/public/locales/ko-KR/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "여기를 클릭",
"ConfirmEmailDescription": "활성화 이메일에 첨부된 링크를 사용하세요. 활성화 링크가 첨부된 이메일을 받지 못하셨나요?",
"ConfirmEmailHeader": "{{productName}} 기능에 액세스하려면 ({{ email }})이메일을 활성화하세요.",
"PersonalUserQuotaAdminsDescription": "새 파일 및 폴더를 업로드하거나 생성하려면 디스크 공간을 확보하거나 <1>스토리지 관리 설정1>에서 사용자당 할당량을 관리하세요.",
"PersonalUserQuotaDescription": "새 파일 및 폴더를 업로드하거나 생성하려면 디스크 공간을 확보하거나 스토리지 할당량을 늘리세요.",
"RequestActivation": "다시 한 번 활성화 요청",
- "RoomQuotaDescription": "불필요한 방을 아카이브하거나 <1>{{clickHere}}1>하여 더 적합한 {{productName}} 요금제를 찾으세요.",
"RoomQuotaHeader": "방이 곧 초과될 예정입니다: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "곧 저장 용량 및 방 한도를 초과하게 됩니다.",
"StorageAndUserHeader": "곧 저장 용량 및 관리자/고급 사용자 수 한도를 초과하게 됩니다.",
- "StorageQuotaDescription": "불필요한 파일을 삭제하거나 <1>{{clickHere}}1>하여 더 적합한 {{productName}} 요금제를 찾으세요.",
- "StorageQuotaExceeded": "스토리지 할당량을 초과했습니다",
"StorageQuotaHeader": "저장 공간 용량이 곧 초과될 예정입니다: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "불필요한 파일을 제거하여 디스크 공간을 확보할 수 있습니다.",
"TenantCustomQuotaDescription": "<1>스토리지 관리 설정1>에서 할당량을 변경하거나 불필요한 파일을 삭제하세요.",
- "UserQuotaDescription": "<1>{{clickHere}}1>하여{{productName}}에 대한 더 나은 요금제를 찾으세요.",
"UserQuotaHeader": "곧 관리자/고급 사용자 수 한도를 초과하게 됩니다: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/ko-KR/PDFFormDialog.json b/packages/client/public/locales/ko-KR/PDFFormDialog.json
index 32a012ac8d..49c1b8e2cc 100644
--- a/packages/client/public/locales/ko-KR/PDFFormDialog.json
+++ b/packages/client/public/locales/ko-KR/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "즉시 작성 가능한 PDF 양식",
"PDFFormEditDialogDescription": "양식 편집 모드로 전환하시겠습니까? 해당 양식은 더 이상 작성할 수 없으며 양식을 작성하려면 편집 후 작성 시작 버튼을 다시 클릭해야 한다는 점을 참고하세요.",
"PDFFormEditDialogTitle": "양식 편집",
"PDFFormIsReadyToast": "<1>{{filename}}1> PDF 양식을 작성할 준비가 되었습니다.",
diff --git a/packages/client/public/locales/ko-KR/Payments.json b/packages/client/public/locales/ko-KR/Payments.json
index cbe1063cc7..e7ce3db788 100644
--- a/packages/client/public/locales/ko-KR/Payments.json
+++ b/packages/client/public/locales/ko-KR/Payments.json
@@ -25,7 +25,6 @@
"Pay": "지불",
"Payer": "지불자",
"PayerDescription": "이 사용자는 결제 세부 정보에 액세스할 수 있으며 할당량을 조정하고 결제할 수 있는 유일한 사용자입니다. {{productName}} 소유자와 결제 관리자는 Stripe 고객 포털을 사용하여 결제 관리자 역할을 재할당할 수 있습니다.",
- "PaymentOverdue": "새 사용자를 추가할 수 없습니다.",
"PriceCalculation": "요금 계산",
"RenewSubscription": "{{planName}} 요금제 구독 갱신",
"RoomManagerDescription": "방 관리 및 아카이브, 사용자 초대 및 관리. 여러 관리자를 방에 할당할 수 있습니다.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/월3>",
"UpgradeNow": "지금 업그레이드",
"UpgradePlan": "요금제 업그레이드",
- "UpgradePlanInfo": "새 사용자를 추가하면 현재 요금제에서 허용하는 최대 방 회원 수를 초과하게 됩니다.",
"UserNotFound": "<1>{{email}}1> 사용자를 찾지 못했습니다.",
"UserNotFoundMatchingEmail": "Stripe 이메일이 일치하는 사용자를 찾을 수 없습니다.",
"YourPrice": "내 요금"
diff --git a/packages/client/public/locales/lo-LA/MainBar.json b/packages/client/public/locales/lo-LA/MainBar.json
index 1fbacf1160..b86af07e3c 100644
--- a/packages/client/public/locales/lo-LA/MainBar.json
+++ b/packages/client/public/locales/lo-LA/MainBar.json
@@ -1,16 +1,11 @@
{
- "ClickHere": "ກົດບ່ອນນີ້",
"ConfirmEmailDescription": "ໃຊ້ລິ້ງທີ່ລະບຸໄວ້ໃນອີເມວການເປີດໃຊ້ງານ. ຍັງບໍ່ໄດ້ຮັບອີເມວທີ່ມີລິ້ງເປີດໃຊ້ງານບໍ?",
"ConfirmEmailHeader": "ກະລຸນາເປີດໃຊ້ອີເມວ ({{ email }}) ຂອງທ່ານເພື່ອເຂົ້າເຖິງ ຄຸນສົມບັດ {{productName}}.",
"PersonalUserQuotaAdminsDescription": "ເພື່ອອັບໂຫລດ ແລະສ້າງໄຟລ໌ ແລະໂຟນເດີໃໝ່, ກະລຸນາສ້າງພື້ນທີ່ຫວ່າງໃນດິສກ໌ ຫຼືຈັດການໂຄຕ້າຕໍ່ຜູ້ໃຊ້ໃນ <1>ການຕັ້ງຄ່າການຈັດການບ່ອນເກັບຂໍ້ມູນ.1>",
"PersonalUserQuotaDescription": "ເພື່ອອັບໂຫຼດ ແລະສ້າງໄຟລ໌ ແລະໂຟນເດີ້ໃໝ່, ກະລຸນາສ້າງພື້ນທີ່ຫວ່າງໃນດິສກ໌ ຫຼືຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບເພື່ອເພີ່ມໂຄຕ້າບ່ອນຈັດເກັບຂໍ້ມູນ.",
"RequestActivation": "ຮ້ອງຂໍການເປີດໃຊ້ອີກເທື່ອຫນຶ່ງ",
- "RoomQuotaDescription": "ທ່ານສາມາດຈັດເກັບຫ້ອງທີ່ບໍ່ຈໍາເປັນໄວ້ ຫຼື <1 >{{clickHere}}1> ເພື່ອຊອກຫາແຜນລາຄາທີ່ເໝາະສົມກວ່າສໍາລັບ {{productName}} ຂອງທ່ານ.",
"RoomQuotaHeader": "ຫ້ອງກຳລັງຈະເກີນ: {{ currentValue }} / {{ maxValue }}",
- "StorageAndRoomHeader": "ກໍາລັງຈະເກີນຂີດຈຳກັດບ່ອນຈັດເກັບຂໍ້ມູນ ແລະຫ້ອງ.",
"StorageAndUserHeader": "ບ່ອນຈັດເກັບຂໍ້ມູນ ແລະ ຜູ້ເບິ່ງແຍງລະບົບ/ຜູ້ໃຊ້ກຳລັງຈະເກີນຂີດຈຳກັດ.",
- "StorageQuotaDescription": "ທ່ານສາມາດລຶບໄຟລ໌ທີ່ບໍ່ຈໍາເປັນອອກ ຫຼື <1 >{{clickHere}}1> ເພື່ອຊອກຫາແຜນລາຄາທີ່ເໝາະສົມກວ່າສໍາລັບ {{productName}} ຂອງທ່ານ.",
- "StorageQuotaExceeded": "ເກີນໂຄຕ້າບ່ອນຈັດເກັບຂໍ້ມູນ",
"StorageQuotaHeader": "ຈຳນວນພື້ນທີ່ຈັດເກັບກຳລັງຈະເກີນ: {{ currentValue }} / {{ maxValue }}",
"TenantCustomQuotaDescription": "ທ່ານສາມາດລຶບໄຟລ໌ທີ່ບໍ່ຈໍາເປັນອອກ ຫຼືປ່ຽນໂຄຕ້າໄດ້ໃນ <1>ການຕັ້ງຄ່າການຈັດການບ່ອນເກັບຂໍ້ມູນ.1>",
"UserQuotaHeader": "ຈຳນວນຜູ້ເບິ່ງແຍງລະບົບ/ຜູ້ໃຊ້ກຳລັງຈະເກີນ: {{ currentValue }} / {{ maxValue }}."
diff --git a/packages/client/public/locales/lo-LA/Payments.json b/packages/client/public/locales/lo-LA/Payments.json
index 465438c6bc..be0cbea345 100644
--- a/packages/client/public/locales/lo-LA/Payments.json
+++ b/packages/client/public/locales/lo-LA/Payments.json
@@ -25,7 +25,6 @@
"Pay": "ຈ່າຍ",
"Payer": "ຜູ້ຈ່າຍເງິນ",
"PayerDescription": "ຜູ້ໃຊ້ນີ້ມີການເຂົ້າເຖິງລາຍລະອຽດການຈ່າຍເງິນ ແລະເປັນຜູ້ໃຊ້ດຽວທີ່ສາມາດປັບໂຄຕ້າ ແລະຊໍາລະໄດ້. ເຈົ້າ ຂອງ {{productName}} , ເຊັ່ນດຽວກັນກັບຜູ້ຈັດການການຊໍາລະດ້ວຍຕົນເອງ, ສາມາດມອບຫມາຍຫນ້າທີ່ການຊໍາລະເງິນຄືນໃຫມ່ໂດຍໃຊ້ປະຕູລູກຄ້າ Stripe.",
- "PaymentOverdue": "ບໍ່ສາມາດເພີ່ມຜູ້ໃຊ້ໃໝ່ໄດ້.",
"PriceCalculation": "Calcule o seu preço",
"RenewSubscription": "ຕໍ່ອາຍຸການສະໝັກໃຊ້ແຜນການ {{ planName }}",
"RoomManagerDescription": "ການບໍລິຫານຫ້ອງແລະການເກັບຮັກສາ, ການເຊື້ອເຊີນຜູ້ໃຊ້ແລະການຄຸ້ມຄອງ. ຜູ້ເບິ່ງແຍງຫຼາຍຄົນສາມາດຖືກມອບຫມາຍໃຫ້ຫ້ອງ.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/ເດືອນ3>",
"UpgradeNow": "ອັບເກຣດດຽວນີ້",
"UpgradePlan": "ແຜນການຍົກລະດັບ",
- "UpgradePlanInfo": "ການເພີ່ມຜູ້ໃຊ້ໃໝ່ຈະເກີນຈຳນວນສູງສຸດຂອງສະມາຊິກຫ້ອງທີ່ອະນຸຍາດໂດຍແຜນລາຄາປັດຈຸບັນຂອງທ່ານ.",
"UserNotFound": "ບໍ່ພົບຜູ້ໃຊ້ <1>{{email}}1>.",
"UserNotFoundMatchingEmail": "ພວກເຮົາບໍ່ສາມາດຊອກຫາຜູ້ໃຊ້ທີ່ມີອີເມວ Stripe ທີ່ກົງກັນໄດ້.",
"YourPrice": "ລາຄາຂອງເຈົ້າ"
diff --git a/packages/client/public/locales/lv/MainBar.json b/packages/client/public/locales/lv/MainBar.json
index 88d36f761f..fcfbd557db 100644
--- a/packages/client/public/locales/lv/MainBar.json
+++ b/packages/client/public/locales/lv/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Noklikšķiniet šeit",
"ConfirmEmailDescription": "Izmantojiet aktivizēšanas e-pasta ziņojumā norādīto saiti. Vai neesat saņēmis e-pasta ziņojumu ar aktivizēšanas saiti?",
"ConfirmEmailHeader": "Lūdzu, aktivizējiet savu e-pastu ({{ email }}), lai piekļūtu {{productName}} funkcijām.",
"PersonalUserQuotaAdminsDescription": "Lai augšupielādētu un izveidotu jaunus failus un mapes, atbrīvojiet vietu diskā vai pārvaldiet kvotu katram lietotājam <1>Krātuves pārvaldības iestatījumos.1>",
"PersonalUserQuotaDescription": "Lai augšupielādētu un izveidotu jaunus failus un mapes, atbrīvojiet vietu diskā vai sazinieties ar administratoru, lai palielinātu krātuves kvotu.",
"RequestActivation": "Vēreiz pieprasīt aktivizāciju",
- "RoomQuotaDescription": "Varat arhivēt nevajadzīgās telpas vai <1>{{clickHere}}1>, lai atrastu savam {{productName}} piemērotāku cenu plānu.",
"RoomQuotaHeader": "Tūlīt tiks pārsniegtas telpas: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Drīz tiks pārsniegti krātuves un telpu ierobežojumi.",
"StorageAndUserHeader": "Tūlīt tiks pārsniegti krātuves un administratoru/prasmīgo lietotāju ierobežojumi.",
- "StorageQuotaDescription": "Varat noņemt nevajadzīgos failus vai <1>{{clickHere}}1>, lai atrastu savam {{productName}} piemērotāku cenu plānu.",
- "StorageQuotaExceeded": "Pārsniegta krātuves kvota",
"StorageQuotaHeader": "Tūlīt tiks pārsniegts krātuves vietas apjoms: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Jūs varat noņemt nevajadzīgos failus, lai atbrīvotu vietu diskā.",
"TenantCustomQuotaDescription": "Jūs varat noņemt nevajadzīgos failus vai mainīt kvotu <1>Krātuves pārvaldības iestatījumos.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1>, lai atrastu labāku cenu plānu savam {{productName}}.",
"UserQuotaHeader": "Tūlīt tiks pārsniegts administratoru/prasmīgo lietotāju skaits:{{currentValue}}/{{maxValue}}."
}
diff --git a/packages/client/public/locales/lv/PDFFormDialog.json b/packages/client/public/locales/lv/PDFFormDialog.json
index f9fc7553e5..2aa21ecae7 100644
--- a/packages/client/public/locales/lv/PDFFormDialog.json
+++ b/packages/client/public/locales/lv/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Aizpildīšanai gatava PDF veidlapa",
"PDFFormEditDialogDescription": "Vai vēlaties pārslēgties uz veidlapas rediģēšanas režīmu? Ņemiet vērā, ka veidlapa vairs nebūs pieejama aizpildīšanai, un pēc rediģēšanas jums būs vēlreiz jānoklikšķina uz pogas Sākt aizpildīšanu, lai to aizpildītu.",
"PDFFormEditDialogTitle": "Veidlapas rediģēšana",
"PDFFormIsReadyToast": "PDF veidlapa <1>{{filename}}1> ir gatava aizpildīšanai.",
diff --git a/packages/client/public/locales/lv/Payments.json b/packages/client/public/locales/lv/Payments.json
index c6351de3ce..5bc40a8189 100644
--- a/packages/client/public/locales/lv/Payments.json
+++ b/packages/client/public/locales/lv/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Maksāt",
"Payer": "Maksātājs",
"PayerDescription": "Šim lietotājam ir piekļuve maksājuma informācijai, un tas ir vienīgais lietotājs, kas var pielāgot kvotu un veikt maksājumus. {{productName}} īpašnieks, kā arī pats maksājumu pārvaldnieks var atkārtoti piešķirt maksājumu pārvaldnieka lomu, izmantojot Stripe klientu portālu.",
- "PaymentOverdue": "Nevar pievienot jaunus lietotājus.",
"PriceCalculation": "Aprēķināt cenu",
"RenewSubscription": "Atjaunot {{planName}} plāna abonementu",
"RoomManagerDescription": "Telpu administrēšana un arhivēšana, lietotāju uzaicināšana un pārvaldība. Telpai var piešķirt vairākus administratorus.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/mēnesī3>",
"UpgradeNow": "Atjaunot tagad",
"UpgradePlan": "Jaunināt plānu",
- "UpgradePlanInfo": "Pievienojot jaunus lietotājus, jūs pārsniegsiet jūsu pašreizējo cenu noteikšanas plānā atļauto maksimālo telpas dalībnieku skaitu.",
"UserNotFound": "Lietotājs <1>{{email}}1> nav atrasts.",
"UserNotFoundMatchingEmail": "Nevarēja atrast lietotāju ar atbilstošo Stripe e-pastu.",
"YourPrice": "Jūsu cena"
diff --git a/packages/client/public/locales/nl/MainBar.json b/packages/client/public/locales/nl/MainBar.json
index 242c8ec468..cee3806d68 100644
--- a/packages/client/public/locales/nl/MainBar.json
+++ b/packages/client/public/locales/nl/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Klik hier",
"ConfirmEmailDescription": "Gebruik de link in de activeringsmail. Hebt u geen e-mail ontvangen met de activeringslink?",
"ConfirmEmailHeader": "Activeer uw e-mail ({{ email }}) om toegang te krijgen tot de {{productName}} functies.",
"PersonalUserQuotaAdminsDescription": "Om nieuwe bestanden en mappen te uploaden en aan te maken, moet u schijfruimte vrijmaken of quota per gebruiker beheren in de <1>Instellingen voor opslagbeheer.1>",
"PersonalUserQuotaDescription": "Om nieuwe bestanden en mappen te uploaden en aan te maken, moet u schijfruimte vrijmaken of contact opnemen met de beheerder om de opslagquota te verhogen.",
"RequestActivation": "Activatie opnieuw aanvragen",
- "RoomQuotaDescription": "U kunt de overbodige kamers archiveren of <1>{{clickHere}}1> om een meer geschikt prijsplan voor uw {{productName}} te vinden.",
"RoomQuotaHeader": "Kamers staat op het punt overschreden te worden: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Opslag- en kamerlimieten staan op het punt overschreden te worden.",
"StorageAndUserHeader": "De beperkingen voor opslag en beheerders/power users worden binnenkort overschreden.",
- "StorageQuotaDescription": "U kunt de overbodige bestanden verwijderen of <1>{{clickHere}}1> om een meer geschikt prijsplan voor uw {{productName}} te vinden.",
- "StorageQuotaExceeded": "Opslagquota overschreden",
"StorageQuotaHeader": "De hoeveelheid opslagruimte staat op het punt overschreden te worden: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "U kunt de onnodige bestanden verwijderen om schijfruimte vrij te maken.",
"TenantCustomQuotaDescription": "U kunt de onnodige bestanden verwijderen of de quota wijzigen in de <1>Instellingen voor opslagbeheer.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> om een beter prijsplan voor uw {{productName}} te vinden.",
"UserQuotaHeader": "Het aantal beheerders/power users staan op het punt overschreden te worden: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/nl/PDFFormDialog.json b/packages/client/public/locales/nl/PDFFormDialog.json
index fc1d686628..c9ca56f4b7 100644
--- a/packages/client/public/locales/nl/PDFFormDialog.json
+++ b/packages/client/public/locales/nl/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Klaar om in te vullen PDF formulier",
"PDFFormEditDialogDescription": "Wilt u overschakelen naar de bewerkingsmodus voor formulieren? Houd er rekening mee dat het formulier niet langer beschikbaar is om in te vullen en dat u na het bewerken opnieuw op de knop Start vullen moet klikken om het in te vullen.",
"PDFFormEditDialogTitle": "Formulier bewerken",
"PDFFormIsReadyToast": "PDF formulier <1>{{filename}}1> is klaar om ingevuld te worden.",
diff --git a/packages/client/public/locales/nl/Payments.json b/packages/client/public/locales/nl/Payments.json
index 312ee073f9..b773622774 100644
--- a/packages/client/public/locales/nl/Payments.json
+++ b/packages/client/public/locales/nl/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Betaal",
"Payer": "Betaler",
"PayerDescription": "Deze gebruiker heeft toegang tot de betalingsgegevens en is de enige gebruiker die de quota kan aanpassen en betalingen kan verrichten. De {{productName}}-eigenaar, evenals de betalende beheerder zelf, kan de rol van betalende beheerder opnieuw toewijzen via het Stripe klantenportaal.",
- "PaymentOverdue": "Kan geen nieuwe gebruikers toevoegen.",
"PriceCalculation": "Bereken uw prijs",
"RenewSubscription": "Verleng abonnement op {{planName}} plan",
"RoomManagerDescription": "Ruimtebeheer en archivering, uitnodiging en beheer van gebruikers. Er kunnen meerdere beheerders aan de kamer worden toegewezen.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/maand3>",
"UpgradeNow": "Upgrade nu",
"UpgradePlan": "Upgrade plan",
- "UpgradePlanInfo": "Nieuwe gebruikers toevoegen betekent dat het maximum aantal leden van de kamer dat in uw huidige tariefplan is toegestaan, wordt overschreden.",
"UserNotFound": "Gebruiker <1>{{email}}1> is niet gevonden.",
"UserNotFoundMatchingEmail": "We konden de gebruiker met de overeenkomende Stripe e-mail niet vinden.",
"YourPrice": "Uw prijs"
diff --git a/packages/client/public/locales/pl/MainBar.json b/packages/client/public/locales/pl/MainBar.json
index fce55c18ac..618f55de2d 100644
--- a/packages/client/public/locales/pl/MainBar.json
+++ b/packages/client/public/locales/pl/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Kliknij tutaj",
"ConfirmEmailDescription": "Użyj linku otrzymanego w e-mailu aktywacyjnym. E-mail z linkiem aktywacyjnym nie dotarł?",
"ConfirmEmailHeader": "Aktywuj swój adres e-mail ({{ email }}), aby uzyskać dostęp do funkcji {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Aby móc przesyłać i tworzyć nowe pliki oraz katalogi, zwolnij miejsce na dysku lub zmień limit pamięci na użytkownika w <1>ustawieniach zarządzania pamięcią.1>",
"PersonalUserQuotaDescription": "Aby móc przesyłać i tworzyć nowe pliki oraz katalogi, zwolnij miejsce na dysku lub skontaktuj się z administratorem, aby zwiększyć limit pamięci.",
"RequestActivation": "Poproś o aktywację jeszcze raz",
- "RoomQuotaDescription": "Możesz zarchiwizować niepotrzebne pokoje lub <1>{{clickHere}}1>, aby znaleźć bardziej odpowiedni plan cenowy dla swojego konta {{productName}}.",
"RoomQuotaHeader": "Liczba pokoi zostanie niedługo przekroczona: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Limity pamięci i pokoi zostaną wkrótce przekroczone.",
"StorageAndUserHeader": "Limity pamięci/użytkowników z większą liczbą uprawnień zostaną wkrótce przekroczone.",
- "StorageQuotaDescription": "Możesz usunąć niepotrzebne pliki lub <1>{{clickHere}}1>, aby znaleźć bardziej odpowiedni plan cenowy dla swojego konta {{productName}}.",
- "StorageQuotaExceeded": "Przekroczono limit pamięci",
"StorageQuotaHeader": "Ilość miejsca w pamięci zostanie wkrótce przekroczona: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Możesz usunąć niepotrzebne pliki, aby zwolnić miejsce na dysku.",
"TenantCustomQuotaDescription": "Możesz usunąć niepotrzebne pliki lub zmienić limit w <1>ustawieniach zarządzania pamięcią.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1>, aby znaleźć lepszy plan cenowy dla swojego {{productName}}.",
"UserQuotaHeader": "Liczba administratorów/użytkowników z większą liczbą uprawnień zostanie wkrótce przekroczona: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/pl/PDFFormDialog.json b/packages/client/public/locales/pl/PDFFormDialog.json
index 95394fba21..360afda09c 100644
--- a/packages/client/public/locales/pl/PDFFormDialog.json
+++ b/packages/client/public/locales/pl/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Gotowy do wypełnienia formularz PDF",
"PDFFormEditDialogDescription": "Czy chcesz przejść do trybu edycji formularza? Należy pamiętać, że formularz przestanie być dostępny do wypełnienia i po jego edycji trzeba będzie ponownie kliknąć przycisk Rozpocznij wypełnianie, aby go uzupełnić.",
"PDFFormEditDialogTitle": "Edycja formularza",
"PDFFormIsReadyToast": "Formularz PDF <1>{{filename}}1> jest gotowy do wypełnienia.",
diff --git a/packages/client/public/locales/pl/Payments.json b/packages/client/public/locales/pl/Payments.json
index 1ec01993e7..622636afd3 100644
--- a/packages/client/public/locales/pl/Payments.json
+++ b/packages/client/public/locales/pl/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Zapłać",
"Payer": "Płatnik",
"PayerDescription": "Dany użytkownik ma dostęp do szczegółów płatności i jest jedynym użytkownikiem, który może dostosować limit oraz dokonać płatności. Właściciel {{productName}} i sam płacący menedżer mogą przypisać lub przekazać rolę płacącego menedżera za pomocą portalu klienta Stripe.",
- "PaymentOverdue": "Nie można dodać nowych użytkowników.",
"PriceCalculation": "Oblicz swoją cenę",
"RenewSubscription": "Odnów subskrypcję planu {{planName}}",
"RoomManagerDescription": "Administracja i archiwizowanie pokoi, zapraszanie i zarządzanie użytkownikami. Do pokoju można przypisać kilku administratorów.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/miesięcznie3>",
"UpgradeNow": "Uaktualnij teraz",
"UpgradePlan": "Uaktualnij plan",
- "UpgradePlanInfo": "Dodanie nowych użytkowników spowoduje przekroczenie maksymalnej liczby członków pokoju dozwoloną przez Twój bieżący plan cenowy.",
"UserNotFound": "Nie znaleziono użytkownika <1>{{email}}1>.",
"UserNotFoundMatchingEmail": "Nie udało się znaleźć użytkownika z pasującym adresem e-mail Stripe.",
"YourPrice": "Twoja cena"
diff --git a/packages/client/public/locales/pt-BR/MainBar.json b/packages/client/public/locales/pt-BR/MainBar.json
index d06110117c..558a9e854d 100644
--- a/packages/client/public/locales/pt-BR/MainBar.json
+++ b/packages/client/public/locales/pt-BR/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Clique aqui",
"ConfirmEmailDescription": "Use o link fornecido no e-mail de ativação. Não recebeu um e-mail com o link de ativação?",
"ConfirmEmailHeader": "Favor ativar seu e-mail ({{ email }}) para ter acesso às características do {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Para fazer upload e criar novos arquivos e pastas, libere espaço em disco ou gerencie a cota por usuário nas <1>Configurações de gerenciamento de armazenamento.1>",
"PersonalUserQuotaDescription": "Para fazer upload e criar novos arquivos e pastas, libere espaço em disco ou entre em contato com o administrador para aumentar a cota de armazenamento.",
"RequestActivation": "Solicitar ativação mais uma vez",
- "RoomQuotaDescription": "Você pode arquivar as salas desnecessárias ou <1>{{clickHere}}1> para encontrar um plano de preços mais adequado para o seu {{productName}}.",
"RoomQuotaHeader": "As salas estão prestes a ser excedidos: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Os limites de armazenamento e salas estão prestes a ser excedidos.",
"StorageAndUserHeader": "Os limites de armazenamento e administradores/usuários avançados estão prestes a ser excedidos.",
- "StorageQuotaDescription": "Você pode remover os arquivos desnecessários ou <1>{{clickHere}}1> para encontrar um plano de preços mais adequado para o seu {{productName}}.",
- "StorageQuotaExceeded": "Cota de armazenamento excedida",
"StorageQuotaHeader": "A quantidade de espaço de armazenamento está prestes a ser excedida: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Você pode remover os arquivos desnecessários para liberar espaço em disco.",
"TenantCustomQuotaDescription": "Você pode remover os arquivos desnecessários ou alterar a cota nas <1>Configurações de gerenciamento de armazenamento.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> para encontrar um plano de preços melhor para o seu {{productName}}.",
"UserQuotaHeader": "O número de administradores/usuários avançados está prestes a ser excedido: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/pt-BR/PDFFormDialog.json b/packages/client/public/locales/pt-BR/PDFFormDialog.json
index a7a47e1b70..aea4355758 100644
--- a/packages/client/public/locales/pt-BR/PDFFormDialog.json
+++ b/packages/client/public/locales/pt-BR/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Formulário PDF pronto para preencher",
"PDFFormEditDialogDescription": "Deseja mudar para o modo de edição de formulário? Observe que o formulário não estará mais disponível para preenchimento e você precisará clicar novamente no botão Iniciar preenchimento após a edição para preenchê-lo.",
"PDFFormEditDialogTitle": "Edição de formulário",
"PDFFormIsReadyToast": "O formulário PDF <1>{{filename}}1> está pronto para ser preenchido.",
diff --git a/packages/client/public/locales/pt-BR/Payments.json b/packages/client/public/locales/pt-BR/Payments.json
index cf05414e6f..5764b2afe3 100644
--- a/packages/client/public/locales/pt-BR/Payments.json
+++ b/packages/client/public/locales/pt-BR/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Pagar",
"Payer": "Pagador",
"PayerDescription": "Este usuário tem acesso aos detalhes de pagamento e é o único usuário que pode ajustar a cota e efetuar pagamentos. O proprietário do {{productName}}, bem como o próprio gerente pagador, pode reatribuir a função de gerente pagador usando o portal do cliente Stripe.",
- "PaymentOverdue": "Não é possível adicionar novos usuários.",
"PriceCalculation": "Calcule seu preço",
"RenewSubscription": "Renove a assinatura do plano {{planName}}",
"RoomManagerDescription": "Administração e arquivo de salas, convite e gestão de utilizadores. Vários administradores podem ser atribuídos à sala.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/mês3>",
"UpgradeNow": "Atualize agora",
"UpgradePlan": "Plano de atualização",
- "UpgradePlanInfo": "A adição de novos usuários excederá o número máximo de membros da sala permitido pelo seu plano de preços atual.",
"UserNotFound": "O usuário <1>{{email}}1> não foi encontrado.",
"UserNotFoundMatchingEmail": "Não foi possível encontrar o usuário com o e-mail Stripe correspondente.",
"YourPrice": "Seu preço"
diff --git a/packages/client/public/locales/pt/MainBar.json b/packages/client/public/locales/pt/MainBar.json
index 44c4273333..a7337a647c 100644
--- a/packages/client/public/locales/pt/MainBar.json
+++ b/packages/client/public/locales/pt/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Clique aqui",
"ConfirmEmailDescription": "Utilizar a ligação fornecida no e-mail de ativação. Ainda não recebeu um e-mail com o link de ativação?",
"ConfirmEmailHeader": "Por favor, confirme o seu email ({{ email }}) para ter acesso às funcionalidades do {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Para fazer upload e criar novos arquivos e pastas, libere espaço em disco ou gerencie a cota por usuário nas <1>Configurações de gerenciamento de armazenamento.1>",
"PersonalUserQuotaDescription": "Para fazer upload e criar novos arquivos e pastas, libere espaço em disco ou entre em contato com o administrador para aumentar a cota de armazenamento.",
"RequestActivation": "Solicitar a ativação novamente",
- "RoomQuotaDescription": "Pode arquivar as salas desnecessárias ou <1>{{clickHere}}1> para encontrar um plano de preços mais adequado para o seu {{productName}}.",
"RoomQuotaHeader": "Salas que estão prestes a ser excedidas: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Os limites de armazenamento e de salas estão prestes a ser excedidos.",
"StorageAndUserHeader": "Os limites para o armazenamento e para o número de administradores/utilizadores com poder estão prestes a ser excedidos.",
- "StorageQuotaDescription": "Pode remover os ficheiros desnecessários ou <1>{{clickHere}}1> para encontrar um plano de preços mais adequado para o seu {{productName}}.",
- "StorageQuotaExceeded": "Cota de armazenamento excedida",
"StorageQuotaHeader": "A capacidade de armazenamento do espaço está prestes a ser excedida: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Você pode remover os arquivos desnecessários para liberar espaço em disco.",
"TenantCustomQuotaDescription": "Você pode remover os arquivos desnecessários ou alterar a cota nas <1>Configurações de gerenciamento de armazenamento.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> para encontrar um plano de preços melhor para o seu {{productName}}.",
"UserQuotaHeader": "O número de administradores/utilizadores com poder está prestes a ser excedido: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/pt/PDFFormDialog.json b/packages/client/public/locales/pt/PDFFormDialog.json
index a7a47e1b70..aea4355758 100644
--- a/packages/client/public/locales/pt/PDFFormDialog.json
+++ b/packages/client/public/locales/pt/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Formulário PDF pronto para preencher",
"PDFFormEditDialogDescription": "Deseja mudar para o modo de edição de formulário? Observe que o formulário não estará mais disponível para preenchimento e você precisará clicar novamente no botão Iniciar preenchimento após a edição para preenchê-lo.",
"PDFFormEditDialogTitle": "Edição de formulário",
"PDFFormIsReadyToast": "O formulário PDF <1>{{filename}}1> está pronto para ser preenchido.",
diff --git a/packages/client/public/locales/pt/Payments.json b/packages/client/public/locales/pt/Payments.json
index ca46f38a4b..d5f0616463 100644
--- a/packages/client/public/locales/pt/Payments.json
+++ b/packages/client/public/locales/pt/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Pagar",
"Payer": "Pagador",
"PayerDescription": "Este utilizador tem acesso aos detalhes de pagamento e é o único utilizador que pode ajustar a quota e fazer pagamentos. O proprietário do {{productName}}, bem como o próprio gestor de pagamentos, pode reatribuir o papel de gestor de pagamentos utilizando o portal de clientes Stripe.",
- "PaymentOverdue": "Não é possível adicionar novos utilizadores.",
"PriceCalculation": "Calcule o seu preço",
"RenewSubscription": "Renovar subscrição para o plano {{planName}}",
"RoomManagerDescription": "Administração e arquivação de salas, convite e gestão de utilizadores. Vários administradores podem ser designados para a sala.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/mês 3>",
"UpgradeNow": "Aumentar agora",
"UpgradePlan": "Aumentar o plano",
- "UpgradePlanInfo": "Adicionar novos utilizadores vai exceder o número máximo de membros presentes na sala permitido pelo seu plano de preços.",
"UserNotFound": "O <1>{{email}}1> do utilizador não foi encontrado.",
"UserNotFoundMatchingEmail": "Não foi possível encontrar o utilizador com o email de Stripe correspondente.",
"YourPrice": "O seu preço"
diff --git a/packages/client/public/locales/ro/MainBar.json b/packages/client/public/locales/ro/MainBar.json
index 6498868bac..864bcfd44f 100644
--- a/packages/client/public/locales/ro/MainBar.json
+++ b/packages/client/public/locales/ro/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Apăsaţi aici",
"ConfirmEmailDescription": "Utilizaţi linkul de activare din email. Nu aţi primit un email cu link-ul de activare?",
"ConfirmEmailHeader": "Activați adresa de email ({{ email }}) pentru a avea acces la funcţiile {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Pentru a încărca și a crea fișiere și dosare noi, eliberați spațiu de stocare sau gestionați cota de stocare pentru fiecare utilizator din secțiunea <1>Setările de gestionare a spațiului de stocare.1>.",
"PersonalUserQuotaDescription": "Pentru a încărca și a crea fișiere și dosare noi, eliberați spațiu de stocare sau contactați administratorul pentru a majora capacităţile de stocare.",
"RequestActivation": "Solicitaţi activarea din nou",
- "RoomQuotaDescription": "Puteţi arhiva sălile inutile sau <1>{{clickHere}}1> pentru a găsi un abonament mai potrivit pentru spaţiul dvs {{productName}}.",
"RoomQuotaHeader": "Cota sălilor este pe punctul de a fi depăşită: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Limite de stocare și cota sălilor sunt pe punctul de a fi depăşiti.",
"StorageAndUserHeader": "Limite de stocare pentru administratori/utilizatori avansați sunt pe punctul de a fi depăşiti.",
- "StorageQuotaDescription": "Puteţi elimina fişierele inutile sau <1>{{{clickHere}}1> pentru a găsi un abonament mai potrivit pentru spaţiul dvs {{productName}}.",
- "StorageQuotaExceeded": "Cotă de stocare a fost depășită",
"StorageQuotaHeader": "Cota spaţiului de stocare este pe punctul de a fi depăşită: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Puteți elimina fișiere inutile pentru a elibera spațiu de stocare.",
"TenantCustomQuotaDescription": "Puteţi elimina fişierele inutile sau modifica cotă de stocare din secțiunea <1>Setările de gestionare a spațiului de stocare.1>.",
- "UserQuotaDescription": "<1>{{clickHere}}1> pentru a găsi cea mai bună ofertă pentru spațiul dvs {{productName}}.",
"UserQuotaHeader": "Numărul maxim de administratori/utilizatori avansați este pe punctul de a fi depăşit. {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/ro/PDFFormDialog.json b/packages/client/public/locales/ro/PDFFormDialog.json
index bf2e82b870..c03610bb29 100644
--- a/packages/client/public/locales/ro/PDFFormDialog.json
+++ b/packages/client/public/locales/ro/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Formular PDF gata de completare",
"PDFFormEditDialogDescription": "Doriți să comutați la modul de editare a formularului? Vă rugăm să rețineți că formularul nu va mai fi disponibil pentru completare și odată ce formularul este editat, trebuie să faceți din nou un clic pe Începe completarea pentru a-l completa.",
"PDFFormEditDialogTitle": "Editare formular",
"PDFFormIsReadyToast": "Formularul PDF <1>{{filename}}1> este gata să fie completat.",
diff --git a/packages/client/public/locales/ro/Payments.json b/packages/client/public/locales/ro/Payments.json
index 558d477c62..b7c64ba1ee 100644
--- a/packages/client/public/locales/ro/Payments.json
+++ b/packages/client/public/locales/ro/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Plată",
"Payer": "Plătitor",
"PayerDescription": "Acest utilizator are acces la detalii de plată şi este singurul utilizator care poate seta cota şi efectua plăţi. Proprietarul {{productName}}, precum şi mesagerul plătitor, pot reatribui rolul de manager plătitor folosind portalul de client Stripe.",
- "PaymentOverdue": "Imposibil de adăugat utilizatori noi.",
"PriceCalculation": "Calculaţi preţul",
"RenewSubscription": "Reînnoiți abonamentul {{planName}}",
"RoomManagerDescription": "Administrarea şi arhivarea sălii, invitaţia şi gestionarea utilizatorilor. Mai mulţi administratori pot fi desemnaţi pentru o sală.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/lună3>",
"UpgradeNow": "Upgrade acum",
"UpgradePlan": "Actualizare abonament",
- "UpgradePlanInfo": "Dacă adăugaţi noi utilizatori, va depăşi numărul maxim permis de vizitatori într-o sală conform planului tarifar al abonamentului dvs.",
"UserNotFound": "Utilizatorul <1>{{email}}1> nu a fost găsit.",
"UserNotFoundMatchingEmail": "Nu s-a găsit utilizatorul cu un e-mail Stripe potrivit.",
"YourPrice": "Preţul dvs."
diff --git a/packages/client/public/locales/ru/MainBar.json b/packages/client/public/locales/ru/MainBar.json
index 6b24b1c949..1b1e52899b 100644
--- a/packages/client/public/locales/ru/MainBar.json
+++ b/packages/client/public/locales/ru/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Кликните сюда",
"ConfirmEmailDescription": "Используйте ссылку, указанную в письме активации. Не получили письмо со ссылкой для активации?",
"ConfirmEmailHeader": "Пожалуйста, активируйте свою электронную почту ({{ email }}), чтобы получить доступ ко всем функциям {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Чтобы загружать и создавать новые файлы и папки, освободите место на диске или измените квоту для каждого пользователя в <1>Настройках управления хранилищем.1>",
"PersonalUserQuotaDescription": "Чтобы загружать и создавать новые файлы и папки, освободите место на диске или обратитесь к администратору для увеличения квоты хранилища.",
"RequestActivation": "Запросить активацию еще раз",
- "RoomQuotaDescription": "Вы можете заархивировать ненужные комнаты или <1>{{clickHere}}1> , чтобы найти лучший тарифный план для {{productName}}.",
"RoomQuotaHeader": "Количество комнат скоро будет превышено: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Объем дискового пространства и количество комнат скоро будут превышены.",
"StorageAndUserHeader": "Объем дискового пространства и количество администраторов/опытных пользователей скоро будут превышены. ",
- "StorageQuotaDescription": "Вы можете удалить ненужные файлы или <1>{{clickHere}}1>, чтобы найти лучший тарифный план для {{productName}}.",
- "StorageQuotaExceeded": "Превышена квота хранилища",
"StorageQuotaHeader": "Объем дискового пространства скоро будет превышен: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Вы можете удалить ненужные файлы, чтобы освободить место на диске.",
"TenantCustomQuotaDescription": "Удалить ненужные файлы или изменить квоту можно в <1>Настройках управления хранилищем1>.",
- "UserQuotaDescription": "<1>{{clickHere}}1>, чтобы найти лучший тарифный план для {{productName}}.",
"UserQuotaHeader": "Количество администраторов/опытных пользователей скоро будет превышено: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/ru/PDFFormDialog.json b/packages/client/public/locales/ru/PDFFormDialog.json
index 5c6dca00cc..07d6e172b1 100644
--- a/packages/client/public/locales/ru/PDFFormDialog.json
+++ b/packages/client/public/locales/ru/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Готовая к заполнению форма PDF",
"PDFFormEditDialogDescription": "Хотите переключиться в режим редактирования формы? Обратите внимание, что форма больше не будет доступна для заполнения и вам нужно будет снова нажать кнопку Начать заполнение после редактирования, чтобы заполнить ее.",
"PDFFormEditDialogTitle": "Редактирование формы",
"PDFFormIsReadyToast": "PDF-форма <1>{{filename}}1> готова к заполнению.",
diff --git a/packages/client/public/locales/ru/Payments.json b/packages/client/public/locales/ru/Payments.json
index e69da54bb4..bd1f24d757 100644
--- a/packages/client/public/locales/ru/Payments.json
+++ b/packages/client/public/locales/ru/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Оплатить",
"Payer": "Плательщик",
"PayerDescription": "Данный пользователь осуществляет оплату за тарифный план. Никто, кроме него, не может настраивать и оплачивать квоту. Сменить плательщика может владелец {{productName}}, а также сам плательщик через клиентский портал Stripe.",
- "PaymentOverdue": "Невозможно добавить новых пользователей.",
"PriceCalculation": "Рассчитайте свою цену",
"RenewSubscription": "Продлить подписку на {{planName}} тариф",
"RoomManagerDescription": "Администрирование и архивирование комнат, приглашение пользователей и управление ими. В комнату могут быть назначены несколько администраторов.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/месяц3>",
"UpgradeNow": "Обновить прямо сейчас",
"UpgradePlan": "Обновить план",
- "UpgradePlanInfo": "Добавление новых пользователей приведет к превышению максимального количества участников комнаты, разрешенного вашим текущим тарифным планом.",
"UserNotFound": "Пользователь <1>{{email}}1> не найден.",
"UserNotFoundMatchingEmail": "Мы не смогли найти пользователя с соответствующим адресом электронной почты Stripe.",
"YourPrice": "Ваша стоимость"
diff --git a/packages/client/public/locales/si/MainBar.json b/packages/client/public/locales/si/MainBar.json
index ca07b2a6b1..76d04de6e0 100644
--- a/packages/client/public/locales/si/MainBar.json
+++ b/packages/client/public/locales/si/MainBar.json
@@ -1,18 +1,12 @@
{
- "ClickHere": "මෙතන ඔබන්න",
"ConfirmEmailDescription": "සක්රියන වි-තැපෑලෙහි දී ඇති සබැඳිය භාවිතා කරන්න. සක්රියන සබැඳියක් සහිත වි-තැපෑලක් ලැබුණේ නැද්ද?",
"ConfirmEmailHeader": "{{productName}} විශේෂාංග වෙත ප්රවේශය ලැබීමට ඔබගේ ({{ email }}) වි-තැපෑල සක්රිය කරගන්න.",
"PersonalUserQuotaAdminsDescription": "නව ගොනු සහ බහාලුම් උඩුගත කිරීමට සහ සෑදීමට කරුණාකර තැටියේ ඉඩක් ලබා ගන්න හෝ <1>ආචයන කළමනාකරණ සැකසුම්1> මගින් එක් අයෙකුට වෙන්වන සලාකය කළමනාකරණය කරන්න.",
"PersonalUserQuotaDescription": "නව ගොනු සහ බහාලුම් උඩුගත කිරීමට සහ සෑදීමට කරුණාකර තැටියේ ඉඩක් ලබා ගන්න හෝ ආචයක සලාකය වැඩි කර ගැනීමට පරිපාලක අමතන්න.",
"RequestActivation": "නැවත වරක් සක්රියනය ඉල්ලන්න",
- "RoomQuotaDescription": "ඔබට අනවශ්ය කාමර සංරක්ෂණය කිරීමට හැකිය හෝ ඔබගේ {{productName}} සඳහා වඩාත් සුදුසු මිලකරණ සැලසුමක් සොයා ගැනීමට <1>{{clickHere}}1>.",
"RoomQuotaHeader": "කාමර ගණන ඉක්මවීමට ආසන්නයි: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "ආචයනය සහ කාමර සීමා ඉක්මවා යාමට ආසන්නයි.",
"StorageAndUserHeader": "ආචයනය සහ පරිපාලකයින්/බලවත් පරිශ්රීලකයින්ගේ සීමා ඉක්මවා යාමට ආසන්නයි.",
- "StorageQuotaDescription": "ඔබට අනවශ්ය ගොනු ඉවත් කිරීමට හැකිය හෝ ඔබගේ {{productName}} සඳහා වඩාත් සුදුසු මිලකරණ සැලසුමක් සොයා ගැනීමට <1>{{clickHere}}1>.",
- "StorageQuotaExceeded": "ආචයන සලාකය ඉක්මවා ඇත",
"StorageQuotaHeader": "ආචයනයේ ඉඩ ඉක්මවීමට ආසන්නයි: {{currentValue}} / {{maxValue}}",
"TenantCustomQuotaDescription": "ඔබට <1>ආචයන කළමනාකරණ සැකසුම්1> මගින් අනවශ්ය ගොනු ඉවත් කිරීමට හෝ සලාකය වෙනස් කිරීමට හැකිය.",
- "UserQuotaDescription": "ඔබගේ {{productName}} සඳහා වඩාත් සුදුසු මිලකරණ සැලසුමක් සොයා ගැනීමට <1>{{clickHere}}1>",
"UserQuotaHeader": "පරිපාලකයින්/බලවත් පරිශ්රීලකයින් ගණන ඉක්මවීමට ආසන්නයි: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/si/Payments.json b/packages/client/public/locales/si/Payments.json
index 52c05e3e33..ba34347657 100644
--- a/packages/client/public/locales/si/Payments.json
+++ b/packages/client/public/locales/si/Payments.json
@@ -25,7 +25,6 @@
"Pay": "ගෙවන්න",
"Payer": "ගෙවන්නා",
"PayerDescription": "මෙම පරිශ්රීලකයාට ගෙවීමේ විස්තර වෙත ප්රවේශය තිබෙන අතර සලාකය සකස් කර ගෙවීමට හැකි එකම පුද්ගලයා වේ. {{productName}} හිමිකරුට සහ ගෙවන කළමණාකරුට ස්ට්රයිප් පාරිභෝගික ද්වාරය හරහා ගෙවන කළමනාකරුගේ භූමිකාව අන් අයට පැවරීමට හැකිය.",
- "PaymentOverdue": "නව පරිශ්රීලකයින් යෙදීමට නොහැකිය.",
"PriceCalculation": "මිල ගණනය කරන්න",
"RenewSubscription": "{{planName}} සැලසුමට දායකත්වය අළුත් කරන්න",
"RoomManagerDescription": "කාමර පරිපාලනය හා සංරක්ෂණය, පරිශ්රීලකයින්ට ආරාධනය හා කළමනාකරණය මෙන්ම කාමරයට පරිපාලකයින් කිහිප දෙනෙකු පත් කිරීමට හැකිය.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/මාසයකට3>",
"UpgradeNow": "උත්ශ්රේණි කරන්න",
"UpgradePlan": "සැලසුම උත්ශ්රේණි කරන්න",
- "UpgradePlanInfo": "නව පරිශ්රීලකයින් එක් කිරීමෙන් ඔබගේ වත්මන් මිලකරණ සැලසුමට යටත් වන කාමරයක උපරිම සාමාජිකයින් ගණන ඉක්මවා යයි.",
"UserNotFound": "<1>{{email}}1> පරිශ්රීලකයා හමු නොවිණි.",
"UserNotFoundMatchingEmail": "අපට ස්ට්රයිප් වි-තැපෑලට ගැළපෙන පරිශ්රීලකයෙකු හමු නොවිණි.",
"YourPrice": "ඔබගේ මිල"
diff --git a/packages/client/public/locales/sk/MainBar.json b/packages/client/public/locales/sk/MainBar.json
index f8faa75d13..8ba46e5a08 100644
--- a/packages/client/public/locales/sk/MainBar.json
+++ b/packages/client/public/locales/sk/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Kliknite tu",
"ConfirmEmailDescription": "Použite odkaz uvedený v aktivačnom liste. Nedostali ste e-mail s aktivačným odkazom?",
"ConfirmEmailHeader": "Ak chcete získať prístup k funkciám {{productName}}, aktivujte svoj e-mail ({{ email }}).",
"PersonalUserQuotaAdminsDescription": "Ak chcete nahrávať a vytvárať nové súbory a priečinky, uvoľnite miesto na disku alebo spravujte používateľské kvóty v <1> Nastaveniach spravovania úložiska.1>",
"PersonalUserQuotaDescription": "Ak chcete nahrávať a vytvárať nové súbory a priečinky, uvoľnite miesto na disku alebo kontaktujte administrátora, aby zvýšil kvótu úložiska.",
"RequestActivation": "Požiadať o aktiváciu ešte raz",
- "RoomQuotaDescription": "Miestnosti, ktore nepotrebujete môžete archivovať alebo <1>{{clickHere}}1> nájsť lepší plán pre svoj {{productName}}.",
"RoomQuotaHeader": "Počet miestností bude čoskoro prekročený: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Limity úložísk a miestností budú čoskoro prekročené.",
"StorageAndUserHeader": "Objem úložísk a maximálny počet administrátorov/pokročilých používateľov budú čoskoro prekročené.",
- "StorageQuotaDescription": "Môžete odstrániť súbory, ktore nepotrebujete alebo <1>{{clickHere}}1> nájsť lepší plán pre svoj {{productName}}.",
- "StorageQuotaExceeded": "Kvóta úložiska prekročená",
"StorageQuotaHeader": "Veľkosť úložného priestoru bude čoskoro prekročená: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Nepotrebné súbory môžete odstrániť, aby ste uvoľnili miesto na disku.",
"TenantCustomQuotaDescription": "Nepotrebné súbory môžete odstrániť alebo zmeniť kvótu v <1> Nastaveniach spravovania úložísk.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> a nájdite najlepší cenový plán pre váš {{productName}}.",
"UserQuotaHeader": "Maximálny počet administrátorov/pokročilých používateľov bude čoskoro prekročený: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/sk/PDFFormDialog.json b/packages/client/public/locales/sk/PDFFormDialog.json
index 97aa14ad5f..413ca676df 100644
--- a/packages/client/public/locales/sk/PDFFormDialog.json
+++ b/packages/client/public/locales/sk/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Formulár PDF pripravený na vyplnenie",
"PDFFormEditDialogDescription": "Chcete sa prepnúť do režimu úpravy formulára? Upozorňujeme, že formulár už nebude k dispozícii na vyplnenie a po úprave budete musieť znova kliknúť na tlačidlo Spustiť vyplnenie, aby ste ho mohli vyplniť.",
"PDFFormEditDialogTitle": "Úprava formulára",
"PDFFormIsReadyToast": "PDF formulár <1>{{filename}}1> je pripravený na vyplnenie.",
diff --git a/packages/client/public/locales/sk/Payments.json b/packages/client/public/locales/sk/Payments.json
index dbe16956c8..d9187cff4c 100644
--- a/packages/client/public/locales/sk/Payments.json
+++ b/packages/client/public/locales/sk/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Zaplatiť",
"Payer": "Platiteľ",
"PayerDescription": "Tento používateľ má prístup k detailom platby a je jediným používateľom, ktorý môže nastaviť kvótu a vykonávať platby. Vlastník {{productName}}, ako aj samotný správca platieb, môže rolu správcu platieb zmeniť pomocou zákazníckeho portálu Stripe.",
- "PaymentOverdue": "Nie je možné pridávať nových používateľov.",
"PriceCalculation": "Vypočítajte svoju cenu",
"RenewSubscription": "Obnovte predplatné plánu {{planName}}",
"RoomManagerDescription": "Administrácia a archivácia miestností, pozývanie a správa užívateľov. K miestnosti je možné priradiť niekoľko administrátorov.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/mesiac3>",
"UpgradeNow": "Aktualizovať teraz",
"UpgradePlan": "Aktualizovať plán",
- "UpgradePlanInfo": "Pridaním nových používateľov prekročíte maximálny počet členov v miestnosti povolený vaším aktuálnym cenovým plánom.",
"UserNotFound": "Používateľ <1>{{email}}1> sa nenašiel.",
"UserNotFoundMatchingEmail": "Nepodarilo sa nám nájsť používateľa so zodpovedajúcou e-mailovou adresou Stripe.",
"YourPrice": "Vaša cena"
diff --git a/packages/client/public/locales/sl/MainBar.json b/packages/client/public/locales/sl/MainBar.json
index 001bda017f..6e971e5252 100644
--- a/packages/client/public/locales/sl/MainBar.json
+++ b/packages/client/public/locales/sl/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Klikni tukaj",
"ConfirmEmailDescription": "Uporabite povezavo v aktivacijskem e-mail sporočilu. Niste prejeli e-maila z aktivacijsko povezavo?",
"ConfirmEmailHeader": "Aktiviraj svoj e-mail ({{ email }}) naslov za dostop do funkcij {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Če želite naložiti in ustvariti nove datoteke in mape, sprostite prostor na disku ali upravljajte s kvoto na uporabnika v <1>nastavitvah upravljanja shrambe.1>",
"PersonalUserQuotaDescription": "Če želite naložiti in ustvariti nove datoteke in mape, sprostite prostor na disku ali se obrnite na skrbnika, da poveča kvoto za shranjevanje.",
"RequestActivation": "Ponovno zahtevaj aktivacijo",
- "RoomQuotaDescription": "Nepotrebne sobe lahko arhivirate ali <1>{{clickHere}}1> poiščete primerjenši finančni paket za vaš {{productName}}.",
"RoomQuotaHeader": "Sobe bodo kmalu presežene: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Omejitve prostora za shranjevanje in število sob bodo kmalu presežene.",
"StorageAndUserHeader": "Omejitve prostora za shranjevanje in število skrbnikov/naprednih uporabnikov bodo kmalu presežene.",
- "StorageQuotaDescription": "Nepotrebne datoteke lahko odstranite ali <1>{{clickHere}}1> poiščete primernejši finančni paket za vaš {{productName}}.",
- "StorageQuotaExceeded": "Kvota prostora za shranjevanje je presežena",
"StorageQuotaHeader": "Dovoljen prostor za shranjevanje bo kmalu presežen: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Nepotrebne datoteke lahko odstraniš, da sprostiš prostor na disku.",
"TenantCustomQuotaDescription": "Nepotrebne datoteke lahko odstranite ali spremenite kvoto v <1>Nastavitvah upravljanja shrambe.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> Poiščite primernejši finančni načrt za svoj {{productName}}.",
"UserQuotaHeader": "Število skrbnikov/naprednih uporabnikov bo kmalu preseženo: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/sl/PDFFormDialog.json b/packages/client/public/locales/sl/PDFFormDialog.json
index 91ed18439b..6e977377a0 100644
--- a/packages/client/public/locales/sl/PDFFormDialog.json
+++ b/packages/client/public/locales/sl/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Obrazec PDF, pripravljen za izpolnjevanje",
"PDFFormEditDialogDescription": "Ali želiš preklopiti v način za urejanje obrazcev? Obrazec ne bo več na voljo za izpolnjevanje in bo potrebno po urejanju znova klikniti gumb Začni izpolnjevati.",
"PDFFormEditDialogTitle": "Urejanje obrazca",
"PDFFormIsReadyToast": "PDF obrazec <1>{{filename}}1> je pripravljen za izpolnjevanje.",
diff --git a/packages/client/public/locales/sl/Payments.json b/packages/client/public/locales/sl/Payments.json
index 91f80d947c..c6eda80c80 100644
--- a/packages/client/public/locales/sl/Payments.json
+++ b/packages/client/public/locales/sl/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Plačaj",
"Payer": "Plačnik",
"PayerDescription": "Ta uporabnik ima dostop do podrobnosti plačila in je edini uporabnik, ki lahko prilagaja račun in izvaja plačila. Lastnik {{productName}} in sam upravitelj plačevanja lahko prerazporedita vlogo upravitelja plačevanja prek portala za stranke Stripe.",
- "PaymentOverdue": "Novih uporabnikov ni mogoče dodati.",
"PriceCalculation": "Izračunajte vašo ceno",
"RenewSubscription": "Obnovi naročnino na {{planName}} paket",
"RoomManagerDescription": "Administracija in arhiviranje sobe, vabljenje in vodenje uporabnikov. Sobi je mogoče dodeliti več skrbnikov.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/mesec3>",
"UpgradeNow": "Nadgradi zdaj",
"UpgradePlan": "Načrt nadgradnje",
- "UpgradePlanInfo": "Dodajanje novih uporabnikov bo preseglo največje število članov sobe, ki jih omogoča vaš trenutni naročniški paket.",
"UserNotFound": "Uporabnik <1>{{email}}1> ni najden.",
"UserNotFoundMatchingEmail": "Nismo našli uporabnika z ujemajočim se Stripe e-mail naslovom.",
"YourPrice": "Vaša cena"
diff --git a/packages/client/public/locales/sr-Cyrl-RS/MainBar.json b/packages/client/public/locales/sr-Cyrl-RS/MainBar.json
index 91545b62ff..ba469d6b69 100644
--- a/packages/client/public/locales/sr-Cyrl-RS/MainBar.json
+++ b/packages/client/public/locales/sr-Cyrl-RS/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Кликните овде",
"ConfirmEmailDescription": "Користите везу дату у емаил-у за активацију. Нисте добили емаил са линком за активацију?",
"ConfirmEmailHeader": "Активирајте своју емаил ({{ email }}) да бисте добили приступ функцијама {{productName}}-а.",
"PersonalUserQuotaAdminsDescription": "Да бисте отпремили и креирали нове датотеке и фолдере, ослободите простор на диску или управљајте квотом по кориснику у <1>Storage management settings.1>",
"PersonalUserQuotaDescription": "Да бисте отпремили и креирали нове датотеке и фасцикле, ослободите простор на диску или контактирајте администратора да повец́а квоту за складиштење.",
"RequestActivation": "Затражи активацију још једном",
- "RoomQuotaDescription": "Можете да архивирате непотребне собе или <1>{{clickHere}}1> да бисте пронашли прикладнији план цена за ваш {{productName}}.",
"RoomQuotaHeader": "Број соба ц́е ускоро бити прекорачен: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Ограничења складишта и соба ће ускоро бити прекорачена.",
"StorageAndUserHeader": "Ограничења складишта и администратора/напредних корисника ће ускоро бити прекорачена.",
- "StorageQuotaDescription": "Можете да уклоните непотребне датотеке или <1>{{clickHere}}1> да бисте пронашли прикладнији план цена за ваш {{productName}}.",
- "StorageQuotaExceeded": "Квота складишта прекорачена",
"StorageQuotaHeader": "Количина меморијског простора ц́е ускоро бити прекорачена: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Можете уклонити непотребне датотеке да бисте ослободили простор на диску.",
"TenantCustomQuotaDescription": "Можете уклонити непотребне датотеке или променити квоту у <1>Storage management settings.1>",
- "UserQuotaDescription": "<1>{{clickHere }}1> да бисте пронашли бољи план цена за свој {{productName}}.",
"UserQuotaHeader": "Број администратора/напредних корисника ће ускоро бити прекорачен: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/sr-Cyrl-RS/PDFFormDialog.json b/packages/client/public/locales/sr-Cyrl-RS/PDFFormDialog.json
index ea4a2dcc08..f8ac65277e 100644
--- a/packages/client/public/locales/sr-Cyrl-RS/PDFFormDialog.json
+++ b/packages/client/public/locales/sr-Cyrl-RS/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Спреман-за-попуњавање PDF формулар",
"PDFFormEditDialogDescription": "Да ли желите да пређете на режим за уређивање обрасца? Имајте на уму да образац више нец́е бити доступан за попуњавање и да ц́ете морати поново да кликнете на дугме Започни попуњавање након уређивања да бисте га попунили.",
"PDFFormEditDialogTitle": "Уређивање формулара",
"PDFFormIsReadyToast": "PDF формулар <1>{{filename}}1> је спреман да буде попуњен.",
diff --git a/packages/client/public/locales/sr-Cyrl-RS/Payments.json b/packages/client/public/locales/sr-Cyrl-RS/Payments.json
index fd4ee93138..c0cddfaa1a 100644
--- a/packages/client/public/locales/sr-Cyrl-RS/Payments.json
+++ b/packages/client/public/locales/sr-Cyrl-RS/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Плати",
"Payer": "Платилац",
"PayerDescription": "Овај корисник има приступ детаљима плац́ања и једини је корисник који може да прилагоди квоту и изврши плац́ања. Власник {{productName}}-а, као и сам менаџер плац́ања, могу да поново доделе улогу менаџера плац́ања користец́и портал за кориснике Stripe.",
- "PaymentOverdue": "Немогуће додати нове кориснике.",
"PriceCalculation": "Израчунај своју цену",
"RenewSubscription": "Обновите претплату на план {{planName}}",
"RoomManagerDescription": "Администрација и архивирање просторија, позивање корисника и управљање. Неколико администратора може бити додељено соби.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/месец3>",
"UpgradeNow": "Надогради сада",
"UpgradePlan": "План надоградње",
- "UpgradePlanInfo": "Додајући нове кориснике прекорачићете максимални број дозвољених чланова собе по вашем тренутном ценовном плану.",
"UserNotFound": "Корисник <1>{{email}}1> није пронађен.",
"UserNotFoundMatchingEmail": "Нисмо могли да пронађемо корисника са поклапајућим Stripe емаил-ом.",
"YourPrice": "Ваша цена"
diff --git a/packages/client/public/locales/sr-Latn-RS/MainBar.json b/packages/client/public/locales/sr-Latn-RS/MainBar.json
index 1b64cf352e..496d9d8101 100644
--- a/packages/client/public/locales/sr-Latn-RS/MainBar.json
+++ b/packages/client/public/locales/sr-Latn-RS/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Kliknite ovde",
"ConfirmEmailDescription": "Koristite vezu datu u email-u za aktivaciju. Niste dobili email sa linkom za aktivaciju?",
"ConfirmEmailHeader": "Aktivirajte svoju email ({{ email }}) da biste dobili pristup funkcijama {{productName}}-a.",
"PersonalUserQuotaAdminsDescription": "Da biste otpremili i kreirali nove datoteke i foldere, oslobodite prostor na disku ili upravljajte kvotom po korisniku u <1>Storage management settings1>",
"PersonalUserQuotaDescription": "Da biste otpremili i kreirali nove datoteke i fascikle, oslobodite prostor na disku ili kontaktirajte administratora da poveća kvotu za skladištenje.",
"RequestActivation": "Zatraži aktivaciju još jednom",
- "RoomQuotaDescription": "Možete da arhivirate nepotrebne sobe ili <1>{{clickHere}}1> da biste pronašli prikladniji plan cena za vaš {{productName}}.",
"RoomQuotaHeader": "Broj soba će uskoro biti prekoračen: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Ograničenja skladišta i soba će uskoro biti prekoračena.",
"StorageAndUserHeader": "Ograničenja skladišta i administratora/naprednih korisnika će uskoro biti prekoračena.",
- "StorageQuotaDescription": "Možete da uklonite nepotrebne datoteke ili <1>{{clickHere}}1> da biste pronašli prikladniji plan cena za vaš {{productName}}.",
- "StorageQuotaExceeded": "Kvota skladišta prekoračena",
"StorageQuotaHeader": "Količina memorijskog prostora će uskoro biti prekoračena: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Možete ukloniti nepotrebne datoteke da biste oslobodili prostor na disku.",
"TenantCustomQuotaDescription": "Možete ukloniti nepotrebne datoteke ili promeniti kvotu u <1>Storage management settings.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> da biste pronašli bolji plan cena za svoj {{productName}}.",
"UserQuotaHeader": "Broj administratora/naprednih korisnika će uskoro biti prekoračen: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/sr-Latn-RS/PDFFormDialog.json b/packages/client/public/locales/sr-Latn-RS/PDFFormDialog.json
index c5e4933142..9221c5ca6c 100644
--- a/packages/client/public/locales/sr-Latn-RS/PDFFormDialog.json
+++ b/packages/client/public/locales/sr-Latn-RS/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Spreman-za-popunjavanje PDF formular",
"PDFFormEditDialogDescription": "Da li želite da pređete na režim za uređivanje obrasca? Imajte na umu da obrazac više neće biti dostupan za popunjavanje i da ćete morati ponovo da kliknete na dugme Započni popunjavanje nakon uređivanja da biste ga popunili.",
"PDFFormEditDialogTitle": "Uređivanje Formulara",
"PDFFormIsReadyToast": "PDF formular <1>{{filename}}1> je spreman da bude popunjen.",
diff --git a/packages/client/public/locales/sr-Latn-RS/Payments.json b/packages/client/public/locales/sr-Latn-RS/Payments.json
index 4335e1c4d3..d5dd3f0faf 100644
--- a/packages/client/public/locales/sr-Latn-RS/Payments.json
+++ b/packages/client/public/locales/sr-Latn-RS/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Plati",
"Payer": "Platilac",
"PayerDescription": "Ovaj korisnik ima pristup detaljima plaćanja i jedini je korisnik koji može da prilagodi kvotu i izvrši plaćanja. Vlasnik {{productName}}-a, kao i sam menadžer plaćanja, mogu da ponovo dodele ulogu menadžera plaćanja koristeći portal za korisnike Stripe.",
- "PaymentOverdue": "Nemoguće dodati nove korisnike.",
"PriceCalculation": "Izračunaj svoju cenu",
"RenewSubscription": "Obnovite pretplatu na plan {{planName}}",
"RoomManagerDescription": "Administracija i arhiviranje prostorija, pozivanje korisnika i upravljanje. Nekoliko administratora može biti dodeljeno sobi.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/mesec3>",
"UpgradeNow": "Nadogradi sada",
"UpgradePlan": "Plan nadogradnje",
- "UpgradePlanInfo": "Dodajući nove korisnike prekoračićete maksimalni broj dozvoljenih članova sobe po vašem trenutnom cenovnom planu.",
"UserNotFound": "Korisnik <1>{{email}}1> nije pronađen.",
"UserNotFoundMatchingEmail": "Nismo mogli da pronađemo korisnika sa poklapajućim Stripe email-om.",
"YourPrice": "Vaša cena"
diff --git a/packages/client/public/locales/tr/MainBar.json b/packages/client/public/locales/tr/MainBar.json
index 89345a1cfe..2d5ab3f9cf 100644
--- a/packages/client/public/locales/tr/MainBar.json
+++ b/packages/client/public/locales/tr/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Buraya tıklayın",
"ConfirmEmailDescription": "Aktivasyon e-postasında verilen bağlantıyı kullanın. Etkinleştirme bağlantısını içeren bir e-posta almadınız mı?",
"ConfirmEmailHeader": "{{productName}} özelliklerine erişmek için lütfen e-postanızı ({{ email }}) etkinleştirin.",
"PersonalUserQuotaAdminsDescription": "Yeni dosya ve klasörler yüklemek ve oluşturmak için lütfen disk alanını boşaltın veya <1>Depolama yönetimi ayarlarında1> kullanıcı başına kotayı yönetin.",
"PersonalUserQuotaDescription": "Yeni dosya ve klasörler yüklemek ve oluşturmak için lütfen disk alanını boşaltın veya depolama kotasını artırmak için yöneticiyle iletişime geçin.",
"RequestActivation": "Tekrar aktivasyon iste",
- "RoomQuotaDescription": "Gereksiz odaları arşivleyebilirsiniz veya <1>{{clickHere}}1> ile {{productName}}'iniz için daha uygun bir fiyatlandırma planı bulabilirsiniz.",
"RoomQuotaHeader": "Odalar aşılmak üzere: {{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Depolama ve oda limitleri aşılmak üzere.",
"StorageAndUserHeader": "Depolama ve yöneticiler/uzman kullanıcılar limitleri aşılmak üzere.",
- "StorageQuotaDescription": "Gereksiz dosyaları arşivleyebilirsiniz veya <1>{{clickHere}}1> ile {{productName}}'iniz için daha uygun bir fiyatlandırma planı bulabilirsiniz.",
- "StorageQuotaExceeded": "Depolama kotası aşıldı",
"StorageQuotaHeader": "Depolama alanı miktarı aşılmak üzere: {{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Disk alanını boşaltmak için gereksiz dosyaları kaldırabilirsiniz.",
"TenantCustomQuotaDescription": "Gereksiz dosyaları kaldırabilir veya <1>Depolama yönetimi ayarlarından1> kotayı değiştirebilirsiniz.",
- "UserQuotaDescription": "{{productName}} alanınız için daha iyi bir fiyatlandırma planı bulmak için <1>{{clickHere}}1>.",
"UserQuotaHeader": "Yönetici/uzman kullanıcı sayısı aşılmak üzere: {{currentValue}} / {{maxValue}}."
}
diff --git a/packages/client/public/locales/tr/PDFFormDialog.json b/packages/client/public/locales/tr/PDFFormDialog.json
index 737ae5b363..c86c8c8f72 100644
--- a/packages/client/public/locales/tr/PDFFormDialog.json
+++ b/packages/client/public/locales/tr/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Doldurulmaya hazır PDF formu",
"PDFFormEditDialogDescription": "Form düzenleme moduna geçmek istiyor musunuz? Lütfen formun artık doldurulamayacağını ve doldurmak için düzenledikten sonra Doldurmaya başla düğmesine tekrar tıklamanız gerekeceğini unutmayın.",
"PDFFormEditDialogTitle": "Form düzenleme",
"PDFFormIsReadyToast": "PDF formu <1>{{filename}}1> doldurulmaya hazır.",
diff --git a/packages/client/public/locales/tr/Payments.json b/packages/client/public/locales/tr/Payments.json
index 6c424201ab..b91e8010ce 100644
--- a/packages/client/public/locales/tr/Payments.json
+++ b/packages/client/public/locales/tr/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Öde",
"Payer": "Ödeyen",
"PayerDescription": "Bu kullanıcının ödeme detaylarına erişimi vardır ve kotayı ayarlayıp ödeme yapabilen tek kullanıcıdır. {{productName}} sahibi ve ödeme yöneticisinin kendisi, Stripe müşteri portalını kullanarak ödeme yöneticisi rolünü yeniden atayabilir.",
- "PaymentOverdue": "Yeni kullanıcılar eklenemiyor.",
"PriceCalculation": "Fiyatını hesapla",
"RenewSubscription": "{{planName}} planı aboneliğini yenile",
"RoomManagerDescription": "Oda yönetimi ve arşivleme, kullanıcı daveti ve yönetimi. Odaya birkaç yönetici atanabilir.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/ay3>",
"UpgradeNow": "Şimdi Yükselt",
"UpgradePlan": "Yükseltme planı",
- "UpgradePlanInfo": "Yeni kullanıcılar eklemek, mevcut fiyatlandırma planınızın izin verdiği maksimum oda üyesi sayısını aşacaktır.",
"UserNotFound": "<1>{{email}}1> kullanıcısı bulunamad.",
"UserNotFoundMatchingEmail": "Eşleşen Stripe e-postasına sahip kullanıcıyı bulamadık.",
"YourPrice": "Ücret"
diff --git a/packages/client/public/locales/uk-UA/MainBar.json b/packages/client/public/locales/uk-UA/MainBar.json
index ffc4e77bbe..648835a380 100644
--- a/packages/client/public/locales/uk-UA/MainBar.json
+++ b/packages/client/public/locales/uk-UA/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Натисніть тут",
"ConfirmEmailDescription": "Скористайтеся посиланням, наданим в активувальному листі. Не отримали листа з посиланням для активації?",
"ConfirmEmailHeader": "Активуйте свою адресу електронної пошти ({{ email }}), щоб отримати доступ до функцій {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Щоб вивантажити та створити нові файли й папки, звільніть місце на диску або керуйте квотою користувача в <1>Параметрах керування сховищем1>.",
"PersonalUserQuotaDescription": "Щоб вивантажити та створити нові файли й папки, звільніть місце на диску або зверніться до адміністратора, аби збільшити квоту сховища.",
"RequestActivation": "Запитати активацію ще раз",
- "RoomQuotaDescription": "Ви можете архівувати непотрібні кімнати або <1>{{clickHere}}1>, щоб знайти більш підходящий тарифний план для вашого {{productName}}.",
"RoomQuotaHeader": "Кількість кімнат скоро буде перевищено: {{currentValue}}/{{maxValue}}",
- "StorageAndRoomHeader": "Обмеження сховища та кількості кімнат скоро буде перевищено.",
"StorageAndUserHeader": "Обмеження сховища та обмеження для адміністраторів / досвідчених користувачів скоро буде перевищено.",
- "StorageQuotaDescription": "Ви можете видалити непотрібні файли, або <1>{{clickHere}}1>, щоб знайти більш підходящий тарифний план для вашого {{productName}}.",
- "StorageQuotaExceeded": "Квоту сховища перевищено",
"StorageQuotaHeader": "Обсяг сховища скоро буде перевищено: {{currentValue}}/{{maxValue}}",
- "StorageQuotaUserDescription": "Ви можете видалити непотрібні файли, щоб звільнити місце на диску.",
"TenantCustomQuotaDescription": "Ви можете видалити непотрібні файли або змінити квоту в <1>Параметрах керування сховищем1>.",
- "UserQuotaDescription": "<1>{{clickHere}}1>, щоб знайти кращий тарифний план для вашого {{productName}}.",
"UserQuotaHeader": "Кількість адміністраторів / досвідчених користувачів скоро буде перевищено: {{currentValue}}/{{maxValue}}."
}
diff --git a/packages/client/public/locales/uk-UA/PDFFormDialog.json b/packages/client/public/locales/uk-UA/PDFFormDialog.json
index 5fa3302fc5..b70f859b48 100644
--- a/packages/client/public/locales/uk-UA/PDFFormDialog.json
+++ b/packages/client/public/locales/uk-UA/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Готова до заповнення PDF-форма",
"PDFFormEditDialogDescription": "Хочете перемкнутися на режим редагування форми? Зверніть увагу, що форма більше не буде доступна для заповнення. Щоб її заповнити, після редагування вам потрібно буде знову натиснути кнопку «Почати заповнення».",
"PDFFormEditDialogTitle": "Редагування форми",
"PDFFormIsReadyToast": "PDF-форма <1>{{filename}}1> готова до заповнення.",
diff --git a/packages/client/public/locales/uk-UA/Payments.json b/packages/client/public/locales/uk-UA/Payments.json
index 23c8ec76aa..333acbfcbd 100644
--- a/packages/client/public/locales/uk-UA/Payments.json
+++ b/packages/client/public/locales/uk-UA/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Оплатити",
"Payer": "Платник",
"PayerDescription": "Цей користувач має доступ до платіжних даних і є єдиним користувачем, який може регулювати квоту та здійснювати платежі. Власник {{productName}}, а також сам менеджер з оплати можуть змінити менеджера з оплати за допомогою порталу клієнтів Stripe.",
- "PaymentOverdue": "Неможливо додати нових користувачів.",
"PriceCalculation": "Розрахуйте вашу ціну",
"RenewSubscription": "Поновити підписку на план {{planName}}",
"RoomManagerDescription": "Адміністрування та архівування кімнати, запрошення користувачів та керування ними. Для кімнати можна призначити кількох адміністраторів.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<2>{{price}}2><1>{{currencySymbol}}1><3> на місяць3>",
"UpgradeNow": "Підвищити зараз",
"UpgradePlan": "Підвищити план",
- "UpgradePlanInfo": "У разі додавання нових користувачів буде перевищено максимальну кількість учасників кімнати, дозволену вашим поточним тарифним планом.",
"UserNotFound": "Користувача <1>{{email}}1> не знайдено.",
"UserNotFoundMatchingEmail": "Нам не вдалося знайти користувача з відповідною електронною адресою Stripe.",
"YourPrice": "Ваша ціна"
diff --git a/packages/client/public/locales/vi/MainBar.json b/packages/client/public/locales/vi/MainBar.json
index 9865075e68..cc19199baf 100644
--- a/packages/client/public/locales/vi/MainBar.json
+++ b/packages/client/public/locales/vi/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "Nhấp vào đây",
"ConfirmEmailDescription": "Sử dụng liên kết được cung cấp trong email kích hoạt. Bạn chưa nhận được email chứa liên kết kích hoạt?",
"ConfirmEmailHeader": "Xin vui lòng kích hoạt email ({{ email }}) của bạn để có quyền truy cập vào các tính năng {{productName}}.",
"PersonalUserQuotaAdminsDescription": "Để tải lên và tạo các tập tin và thư mục mới, vui lòng giải phóng dung lượng đĩa hoặc quản lý hạn mức cho mỗi người dùng trong <1> cài đặt Quản lý lưu trữ.1>",
"PersonalUserQuotaDescription": "Để tải lên và tạo các tập tin và thư mục mới, vui lòng giải phóng dung lượng đĩa hoặc liên hệ với quản trị viên để tăng hạn mức lưu trữ.",
"RequestActivation": "Yêu cầu kích hoạt lại",
- "RoomQuotaDescription": "Bạn có thể sao lưu các phòng không cần thiết hoặc <1>{{clickHere}}1> để tìm gói dịch vụ có giá phù hợp hơn cho {{productName}} của mình.",
"RoomQuotaHeader": "Phòng sắp vượt quá:{{currentValue}} / {{maxValue}}",
- "StorageAndRoomHeader": "Sắp vượt quá giới hạn lưu trữ và phòng.",
"StorageAndUserHeader": "Sắp vượt quá giới hạn lưu trữ và quản trị viên/người dùng cấp cao.",
- "StorageQuotaDescription": "Bạn có thể xóa các tập tin không cần thiết hoặc <1>{{clickHere}}1> để tìm gói dịch vụ có giá phù hợp hơn cho {{productName}} của mình.",
- "StorageQuotaExceeded": "Đã vượt quá hạn mức lưu trữ",
"StorageQuotaHeader": "Dung lượng lưu trữ sắp vượt quá:{{currentValue}} / {{maxValue}}",
- "StorageQuotaUserDescription": "Bạn có thể xóa các tập tin không cần thiết để giải phóng dung lượng ổ đĩa.",
"TenantCustomQuotaDescription": "Bạn có thể xóa các tập tin không cần thiết hoặc thay đổi hạn mức trong cài đặt Quản lý lưu trữ <1>.1>",
- "UserQuotaDescription": "<1>{{clickHere}}1> để tìm gói dịch vụ có giá tốt hơn cho {{productName}} của bạn.",
"UserQuotaHeader": "Sắp vượt quá số lượng quản trị viên/người dùng cấp cao:{{currentValue}}/{{maxValue}}."
}
diff --git a/packages/client/public/locales/vi/PDFFormDialog.json b/packages/client/public/locales/vi/PDFFormDialog.json
index 5b59cd5ba4..9c5b70304f 100644
--- a/packages/client/public/locales/vi/PDFFormDialog.json
+++ b/packages/client/public/locales/vi/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "Mẫu PDF sẵn sàng để điền",
"PDFFormEditDialogDescription": "Bạn có muốn chuyển sang chế độ chỉnh sửa biểu mẫu không? Xin lưu ý rằng biểu mẫu sẽ không còn khả dụng để điền và bạn sẽ cần nhấp lại vào nút Bắt đầu điền sau khi chỉnh sửa để điền vào.",
"PDFFormEditDialogTitle": "Chỉnh sửa biểu mẫu",
"PDFFormIsReadyToast": "Biểu mẫu PDF <1>{{filename}} 1> đã sẵn sàng để được điền.",
diff --git a/packages/client/public/locales/vi/Payments.json b/packages/client/public/locales/vi/Payments.json
index 57cbceea45..e0ca8ca22b 100644
--- a/packages/client/public/locales/vi/Payments.json
+++ b/packages/client/public/locales/vi/Payments.json
@@ -25,7 +25,6 @@
"Pay": "Thanh toán",
"Payer": "Người thanh toán",
"PayerDescription": "Người dùng này có quyền truy cập vào thông tin thanh toán và là người dùng duy nhất có thể điều chỉnh định mức và thực hiện thanh toán. Chủ sở hữu {{productName}}, cũng như chính người quản lý thanh toán, có thể chỉ định lại vai trò người quản lý thanh toán bằng cổng thông tin khách hàng Stripe.",
- "PaymentOverdue": "Không thể thêm người dùng mới.",
"PriceCalculation": "Tính phí của bạn",
"RenewSubscription": "Gia hạn gói dịch vụ {{planName}}",
"RoomManagerDescription": "Quản trị và lưu trữ phòng, mời và quản lý người dùng. Một số quản trị viên có thể được chỉ định vào phòng.",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}} 1><2>{{price}} 2><3>/tháng3>",
"UpgradeNow": "Nâng cấp ngay",
"UpgradePlan": "Nâng cấp gói dịch vụ",
- "UpgradePlanInfo": "Việc thêm người dùng mới sẽ vượt quá số lượng thành viên tối đa được phép trong phòng theo gói dịch vụ hiện tại của bạn.",
"UserNotFound": "Không tìm thấy người dùng<1>{{email}}1>.",
"UserNotFoundMatchingEmail": "Chúng tôi không thể tìm thấy người dùng có e-mail Stripe phù hợp.",
"YourPrice": "Phí thanh toán của bạn"
diff --git a/packages/client/public/locales/zh-CN/Files.json b/packages/client/public/locales/zh-CN/Files.json
index 961faaec34..9414afc428 100644
--- a/packages/client/public/locales/zh-CN/Files.json
+++ b/packages/client/public/locales/zh-CN/Files.json
@@ -7,7 +7,7 @@
"AppointNewOwner": "您已指定一个新的所有者。",
"ArchiveAction": "清空归档",
"ArchivedRoomsAction": "房间已归档",
- "ArchiveEmptyScreen": " 您可以随时存档不使用的房间并在{{productName}}中恢复它们,也可以永久删除它们。这些房间将显示在此处。",
+ "ArchiveEmptyScreen": " 您可以随时存档不使用的房间并在{{productName}}中恢复它们,也可以永久删除它们。这些房间将显示在此处。",
"ArchiveEmptyScreenHeader": "此处暂无已归档房间",
"ArchiveEmptyScreenUser": "已归档房间将出现在此处。",
"Archives": "归档",
diff --git a/packages/client/public/locales/zh-CN/MainBar.json b/packages/client/public/locales/zh-CN/MainBar.json
index 31f5698f0d..207f3e04b4 100644
--- a/packages/client/public/locales/zh-CN/MainBar.json
+++ b/packages/client/public/locales/zh-CN/MainBar.json
@@ -1,19 +1,12 @@
{
- "ClickHere": "点击此处",
"ConfirmEmailDescription": "使用激活邮件中提供的链接。没有收到包含激活链接的邮件?",
"ConfirmEmailHeader": "请激活您的电子邮件 ({{ email }}) 以访问{{productName}}功能。",
"PersonalUserQuotaAdminsDescription": "如要上传和创建新文件和文件夹,请释放磁盘空间,或在<1>存储空间管理设置1>中管理每位用户的配额。",
"PersonalUserQuotaDescription": "如要上传和创建新文件和文件夹,请释放磁盘空间,或联系管理员增加存储空间配额。",
"RequestActivation": "请求再次激活",
- "RoomQuotaDescription": "您可以存档不必要的房间或<1>{{clickHere}}1>为您的{{productName}}找到更合适的定价计划。",
"RoomQuotaHeader": "房间数量即将超出限制:{{currentValue}}/{{maxValue}}",
- "StorageAndRoomHeader": "存储和房间的限制即将被超过。",
"StorageAndUserHeader": "存储和管理员/高级用户的数量限制即将被超过。",
- "StorageQuotaDescription": "您可以删除不必要的文件或 <1>{{clickHere}}1>为您的{{productName}}找到更合适的定价计划。",
- "StorageQuotaExceeded": "超出存储空间配额",
"StorageQuotaHeader": "存储空间数量即将超出限制:{{currentValue}}/{{maxValue}}",
- "StorageQuotaUserDescription": "您可以删除不必要的文件以释放磁盘空间。",
"TenantCustomQuotaDescription": "您可以在<1>存储空间管理设置1>中删除不必要的文件,或更改配额。",
- "UserQuotaDescription": "<1>{{clickHere}}1>为您的{{productName}}找到更好的定价计划。",
"UserQuotaHeader": "管理员/高级用户的数量即将超过限制: {{currentValue}} / {{maxValue}}"
}
diff --git a/packages/client/public/locales/zh-CN/PDFFormDialog.json b/packages/client/public/locales/zh-CN/PDFFormDialog.json
index 630f37d226..57e170926c 100644
--- a/packages/client/public/locales/zh-CN/PDFFormDialog.json
+++ b/packages/client/public/locales/zh-CN/PDFFormDialog.json
@@ -1,5 +1,4 @@
{
- "PDFFormDialogTitle": "随时可填写的 PDF 表单",
"PDFFormEditDialogDescription": "您想切换到表单编辑模式吗?请注意,表单将不再可供填写,编辑后您需要再次单击“开始填写”按钮才能填写。",
"PDFFormEditDialogTitle": "表单编辑",
"PDFFormIsReadyToast": "PDF 表单 <1>{{filename}}}1> 已准备好填写。",
diff --git a/packages/client/public/locales/zh-CN/Payments.json b/packages/client/public/locales/zh-CN/Payments.json
index aff5eadd87..0263a5c87d 100644
--- a/packages/client/public/locales/zh-CN/Payments.json
+++ b/packages/client/public/locales/zh-CN/Payments.json
@@ -25,7 +25,6 @@
"Pay": "付款",
"Payer": "付款者",
"PayerDescription": "此用户可以访问付款详情,并且是唯一可以调整配额和付款的用户。{{productName}}所有者以及付款经理本人可以使用 Stripe 客户门户重新分配付款经理角色。",
- "PaymentOverdue": "无法添加新用户。",
"PriceCalculation": "计算价格",
"RenewSubscription": "将订阅更新至{{planName}}版本",
"RoomManagerDescription": "房间管理和归档,用户邀请和管理可为房间指派多名管理员。",
@@ -35,7 +34,6 @@
"TotalPricePerMonth": "<1>{{currencySymbol}}1><2>{{price}}2><3>/月3>",
"UpgradeNow": "立即升级",
"UpgradePlan": "升级版本",
- "UpgradePlanInfo": "新用户添加后将超出您当前版本允许的最大房间数或成员数限制。",
"UserNotFound": "未找到用户 <1>{{email}}1>。",
"UserNotFoundMatchingEmail": "我们无法找到与Stripe电子邮件匹配的用户。",
"YourPrice": "您的价格"
diff --git a/packages/client/src/App.js b/packages/client/src/App.js
index dc628cc5d1..9c67ffd4bb 100644
--- a/packages/client/src/App.js
+++ b/packages/client/src/App.js
@@ -33,7 +33,7 @@ import { Provider as MobxProvider } from "mobx-react";
import ThemeProvider from "./components/ThemeProviderWrapper";
import ErrorBoundary from "./components/ErrorBoundaryWrapper";
-import store from "client/store";
+import store from "SRC_DIR/store";
import i18n from "./i18n";
import "@docspace/shared/polyfills/broadcastchannel";
diff --git a/packages/client/src/HOCs/withFileActions.js b/packages/client/src/HOCs/withFileActions.js
index a6aea017c0..cc0d12e076 100644
--- a/packages/client/src/HOCs/withFileActions.js
+++ b/packages/client/src/HOCs/withFileActions.js
@@ -62,21 +62,14 @@ export default function withFileActions(WrappedFileItem) {
};
onDropZoneUpload = (files, uploadToFolder) => {
- const { t, dragging, setDragging, startUpload, uploadEmptyFolders } =
+ const { t, dragging, setDragging, startUpload, createFoldersTree } =
this.props;
dragging && setDragging(false);
- const emptyFolders = files.filter((f) => f.isEmptyDirectory);
-
- if (emptyFolders.length > 0) {
- uploadEmptyFolders(emptyFolders, uploadToFolder).then(() => {
- const onlyFiles = files.filter((f) => !f.isEmptyDirectory);
- if (onlyFiles.length > 0) startUpload(onlyFiles, uploadToFolder, t);
- });
- } else {
- startUpload(files, uploadToFolder, t);
- }
+ createFoldersTree(files, uploadToFolder).then((f) => {
+ if (f.length > 0) startUpload(f, null, t);
+ });
};
onDrop = (items) => {
@@ -167,7 +160,7 @@ export default function withFileActions(WrappedFileItem) {
if (
e.target?.tagName === "INPUT" ||
- e.target?.tagName === "SPAN" ||
+ // e.target?.tagName === "SPAN" ||
e.target?.tagName === "A" ||
e.target.closest(".checkbox") ||
e.target.closest(".table-container_row-checkbox") ||
@@ -277,12 +270,12 @@ export default function withFileActions(WrappedFileItem) {
isRecentTab,
canDrag,
} = this.props;
- const { access, id } = item;
+ const { id, security } = item;
const isDragging =
!isDisabledDropItem &&
isFolder &&
- access < 2 &&
+ security?.MoveTo &&
!isTrashFolder &&
!isPrivacy;
@@ -371,7 +364,7 @@ export default function withFileActions(WrappedFileItem) {
onSelectItem,
//setNewBadgeCount,
openFileAction,
- uploadEmptyFolders,
+ createFoldersTree,
} = filesActionsStore;
const { setSharingPanelVisible } = dialogsStore;
const {
@@ -475,7 +468,7 @@ export default function withFileActions(WrappedFileItem) {
dragging,
setDragging,
startUpload,
- uploadEmptyFolders,
+ createFoldersTree,
draggable,
setTooltipPosition,
setStartDrag,
diff --git a/packages/client/src/HOCs/withHotkeys.js b/packages/client/src/HOCs/withHotkeys.js
index 76c7b0c3aa..042d03ff2b 100644
--- a/packages/client/src/HOCs/withHotkeys.js
+++ b/packages/client/src/HOCs/withHotkeys.js
@@ -83,8 +83,8 @@ const withHotkeys = (Component) => {
isVisitor,
deleteRooms,
archiveRooms,
- isGracePeriod,
- setInviteUsersWarningDialogVisible,
+ isWarningRoomsDialog,
+ setQuotaWarningDialogVisible,
security,
copyToClipboard,
@@ -158,8 +158,8 @@ const withHotkeys = (Component) => {
const onCreateRoom = () => {
if (!isVisitor && isRoomsFolder && security?.Create) {
- if (isGracePeriod) {
- setInviteUsersWarningDialogVisible(true);
+ if (isWarningRoomsDialog) {
+ setQuotaWarningDialogVisible(true);
return;
}
@@ -169,6 +169,10 @@ const withHotkeys = (Component) => {
};
const onPaste = async (e) => {
+ const someDialogIsOpen = checkDialogsOpen();
+
+ if (someDialogIsOpen) return;
+
uploadClipboardFiles(t, e);
};
@@ -436,7 +440,7 @@ const withHotkeys = (Component) => {
treeFoldersStore,
selectedFolderStore,
userStore,
- currentTariffStatusStore,
+ currentQuotaStore,
}) => {
const {
setSelected,
@@ -473,7 +477,7 @@ const withHotkeys = (Component) => {
const {
setDeleteDialogVisible,
setSelectFileDialogVisible,
- setInviteUsersWarningDialogVisible,
+ setQuotaWarningDialogVisible,
} = dialogsStore;
const {
isAvailableOption,
@@ -487,7 +491,6 @@ const withHotkeys = (Component) => {
const { visible: mediaViewerIsVisible } = mediaViewerDataStore;
const { setHotkeyPanelVisible } = settingsStore;
- const { isGracePeriod } = currentTariffStatusStore;
const isVisitor = userStore.user?.isVisitor;
@@ -499,6 +502,8 @@ const withHotkeys = (Component) => {
isRoomsFolder,
} = treeFoldersStore;
+ const { isWarningRoomsDialog } = currentQuotaStore;
+
const security = selectedFolderStore.security;
const isFormRoom = selectedFolderStore.roomType === RoomsType.FormRoom;
const isParentFolderFormRoom =
@@ -553,8 +558,8 @@ const withHotkeys = (Component) => {
deleteRooms,
archiveRooms,
- isGracePeriod,
- setInviteUsersWarningDialogVisible,
+ isWarningRoomsDialog,
+ setQuotaWarningDialogVisible,
security,
copyToClipboard,
diff --git a/packages/client/src/components/AccessSelector/index.tsx b/packages/client/src/components/AccessSelector/index.tsx
index 127938ec6b..3a72a8c990 100644
--- a/packages/client/src/components/AccessSelector/index.tsx
+++ b/packages/client/src/components/AccessSelector/index.tsx
@@ -52,6 +52,9 @@ interface AccessSelectorProps {
isDisabled?: boolean;
directionX?: string;
directionY?: string;
+ isSelectionDisabled?: boolean;
+ selectionErrorText: React.ReactNode;
+ availableAccess?: number[];
}
const AccessSelector: React.FC = ({
@@ -72,6 +75,9 @@ const AccessSelector: React.FC = ({
isDisabled,
directionX = "right",
directionY = "bottom",
+ isSelectionDisabled,
+ selectionErrorText,
+ availableAccess,
}) => {
const [horizontalOrientation, setHorizontalOrientation] = useState(false);
const [width, setWidth] = useState(manualWidth || 0);
@@ -133,6 +139,9 @@ const AccessSelector: React.FC = ({
setIsOpenItemAccess={setIsOpenItemAccess}
hideMobileView={isMobileHorizontalOrientation}
isDisabled={isDisabled}
+ isSelectionDisabled={isSelectionDisabled}
+ selectionErrorText={selectionErrorText}
+ availableAccess={availableAccess}
/>
)}
@@ -155,6 +164,9 @@ const AccessSelector: React.FC = ({
withBackground={!isMobileView}
withBlur={isMobileView}
isDisabled={isDisabled}
+ isSelectionDisabled={isSelectionDisabled}
+ selectionErrorText={selectionErrorText}
+ availableAccess={availableAccess}
/>
)}
diff --git a/packages/client/src/components/Article/Body/Items.js b/packages/client/src/components/Article/Body/Items.js
index f4b212e4fa..e06439b783 100644
--- a/packages/client/src/components/Article/Body/Items.js
+++ b/packages/client/src/components/Article/Body/Items.js
@@ -68,7 +68,7 @@ const Item = ({
onBadgeClick,
showDragItems,
startUpload,
- uploadEmptyFolders,
+ createFoldersTree,
setDragging,
showBadge,
labelBadge,
@@ -86,18 +86,12 @@ const Item = ({
const onDropZoneUpload = React.useCallback(
(files, uploadToFolder) => {
dragging && setDragging(false);
- const emptyFolders = files.filter((f) => f.isEmptyDirectory);
- if (emptyFolders.length > 0) {
- uploadEmptyFolders(emptyFolders, uploadToFolder).then(() => {
- const onlyFiles = files.filter((f) => !f.isEmptyDirectory);
- if (onlyFiles.length > 0) startUpload(onlyFiles, uploadToFolder, t);
- });
- } else {
- startUpload(files, uploadToFolder, t);
- }
+ createFoldersTree(files, uploadToFolder).then((f) => {
+ if (f.length > 0) startUpload(f, null, t);
+ });
},
- [t, dragging, setDragging, startUpload, uploadEmptyFolders],
+ [t, dragging, setDragging, startUpload, createFoldersTree],
);
const onDrop = React.useCallback(
@@ -193,7 +187,7 @@ const Items = ({
dragging,
setDragging,
startUpload,
- uploadEmptyFolders,
+ createFoldersTree,
isVisitor,
isCollaborator,
isAdmin,
@@ -326,7 +320,7 @@ const Items = ({
t={t}
setDragging={setDragging}
startUpload={startUpload}
- uploadEmptyFolders={uploadEmptyFolders}
+ createFoldersTree={createFoldersTree}
item={item}
setBufferSelection={setBufferSelection}
dragging={dragging}
@@ -388,7 +382,7 @@ const Items = ({
showText,
setDragging,
startUpload,
- uploadEmptyFolders,
+ createFoldersTree,
trashIsEmpty,
isAdmin,
isVisitor,
@@ -449,7 +443,7 @@ export default inject(
const { id, access: folderAccess } = selectedFolderStore;
const {
moveDragItems,
- uploadEmptyFolders,
+ createFoldersTree,
deleteAction,
emptyTrashInProgress,
} = filesActionsStore;
@@ -478,7 +472,7 @@ export default inject(
setBufferSelection,
deleteAction,
startUpload,
- uploadEmptyFolders,
+ createFoldersTree,
setEmptyTrashDialogVisible,
trashIsEmpty,
diff --git a/packages/client/src/components/Article/MainButton/index.js b/packages/client/src/components/Article/MainButton/index.js
index b41c36fa83..afdc951222 100644
--- a/packages/client/src/components/Article/MainButton/index.js
+++ b/packages/client/src/components/Article/MainButton/index.js
@@ -70,6 +70,7 @@ import { resendInvitesAgain } from "@docspace/shared/api/people";
import { ArticleButtonLoader } from "@docspace/shared/skeletons/article";
import { isMobile, isTablet } from "react-device-detect";
import { globalColors } from "@docspace/shared/themes";
+import getFilesFromEvent from "@docspace/shared/components/drag-and-drop/get-files-from-event";
const StyledButton = styled(Button)`
font-weight: 700;
@@ -171,8 +172,7 @@ const ArticleMainButtonContent = (props) => {
copyPanelVisible,
security,
- isGracePeriod,
- setInviteUsersWarningDialogVisible,
+ setQuotaWarningDialogVisible,
currentDeviceType,
isFrame,
@@ -180,6 +180,9 @@ const ArticleMainButtonContent = (props) => {
parentRoomType,
isFolder,
+ createFoldersTree,
+ showWarningDialog,
+ isWarningRoomsDialog,
} = props;
const navigate = useNavigate();
@@ -218,14 +221,14 @@ const ArticleMainButtonContent = (props) => {
);
const onCreateRoom = React.useCallback(() => {
- if (isGracePeriod) {
- setInviteUsersWarningDialogVisible(true);
+ if (isWarningRoomsDialog) {
+ setQuotaWarningDialogVisible(true);
return;
}
const event = new Event(Events.ROOM_CREATE);
window.dispatchEvent(event);
- }, []);
+ }, [isWarningRoomsDialog]);
const onShowSelectFileDialog = React.useCallback(() => {
setSelectFileDialogVisible(true);
@@ -239,8 +242,12 @@ const ArticleMainButtonContent = (props) => {
);
const onFileChange = React.useCallback(
- (e) => {
- startUpload(e.target.files, null, t);
+ async (e) => {
+ const files = await getFilesFromEvent(e);
+
+ createFoldersTree(files).then((f) => {
+ if (f.length > 0) startUpload(f, null, t);
+ });
},
[startUpload, t],
);
@@ -249,7 +256,7 @@ const ArticleMainButtonContent = (props) => {
if (isPrivacy) {
encryptionUploadDialog((encryptedFile, encrypted) => {
encryptedFile.encrypted = encrypted;
- startUpload([encryptedFile], null, t);
+ startUpload([encryptedFile], null, t); // TODO: createFoldersTree
});
} else {
inputFilesElement.current.click();
@@ -283,8 +290,8 @@ const ArticleMainButtonContent = (props) => {
const onInvite = React.useCallback((e) => {
const type = e.action;
- if (isGracePeriod) {
- setInviteUsersWarningDialogVisible(true);
+ if (showWarningDialog(type)) {
+ setQuotaWarningDialogVisible(true);
return;
}
@@ -901,6 +908,8 @@ export default inject(
versionHistoryStore,
userStore,
currentTariffStatusStore,
+ filesActionsStore,
+ currentQuotaStore,
}) => {
const { showArticleLoader } = clientLoadingStore;
const { mainButtonMobileVisible } = filesStore;
@@ -917,7 +926,7 @@ export default inject(
const {
setSelectFileDialogVisible,
setInvitePanelOptions,
- setInviteUsersWarningDialogVisible,
+ setQuotaWarningDialogVisible,
copyPanelVisible,
moveToPanelVisible,
restorePanelVisible,
@@ -938,16 +947,18 @@ export default inject(
const isFolder = selectedFolderStore.isFolder;
const { isAdmin, isOwner, isRoomAdmin } = userStore.user;
- const { isGracePeriod } = currentTariffStatusStore;
+
+ const { showWarningDialog, isWarningRoomsDialog } = currentQuotaStore;
const { setOformFromFolderId, oformsFilter } = oformsStore;
const { mainButtonItemsList } = pluginStore;
const { frameConfig, isFrame } = settingsStore;
+ const { createFoldersTree } = filesActionsStore;
+
return {
- isGracePeriod,
- setInviteUsersWarningDialogVisible,
+ setQuotaWarningDialogVisible,
showText: settingsStore.showText,
isMobileArticle: settingsStore.isMobileArticle,
@@ -997,6 +1008,10 @@ export default inject(
isFolder,
selectFileFormRoomDialogVisible,
setSelectFileFormRoomDialogVisible,
+ createFoldersTree,
+
+ showWarningDialog,
+ isWarningRoomsDialog,
};
},
)(
diff --git a/packages/client/src/components/EmptyContainer/index.js b/packages/client/src/components/EmptyContainer/index.js
index 956a768482..3abb285a6b 100644
--- a/packages/client/src/components/EmptyContainer/index.js
+++ b/packages/client/src/components/EmptyContainer/index.js
@@ -52,10 +52,11 @@ const EmptyContainer = ({
sectionWidth,
isRoomNotFoundOrMoved,
isGracePeriod,
- setInviteUsersWarningDialogVisible,
+ setQuotaWarningDialogVisible,
isRoot,
isPublicRoom,
isEmptyPage,
+ isWarningRoomsDialog,
}) => {
//const location = useLocation();
@@ -79,8 +80,8 @@ const EmptyContainer = ({
};
const onCreateRoom = (e) => {
- if (isGracePeriod) {
- setInviteUsersWarningDialogVisible(true);
+ if (isWarningRoomsDialog) {
+ setQuotaWarningDialogVisible(true);
return;
}
@@ -126,7 +127,7 @@ export default inject(
settingsStore,
filesStore,
dialogsStore,
-
+ currentQuotaStore,
selectedFolderStore,
clientLoadingStore,
currentTariffStatusStore,
@@ -137,13 +138,14 @@ export default inject(
const { isGracePeriod } = currentTariffStatusStore;
- const { setInviteUsersWarningDialogVisible } = dialogsStore;
+ const { setQuotaWarningDialogVisible } = dialogsStore;
const { isPublicRoom } = publicRoomStore;
const isRoomNotFoundOrMoved =
isFiltered === null && isErrorRoomNotAvailable;
const isRoot = selectedFolderStore.pathParts?.length === 1;
+ const { isWarningRoomsDialog } = currentQuotaStore;
return {
theme: settingsStore.theme,
@@ -153,10 +155,11 @@ export default inject(
parentId: selectedFolderStore.parentId,
isRoomNotFoundOrMoved,
isGracePeriod,
- setInviteUsersWarningDialogVisible,
+ setQuotaWarningDialogVisible,
type: selectedFolderStore.type,
isRoot,
isPublicRoom,
+ isWarningRoomsDialog,
};
},
)(observer(EmptyContainer));
diff --git a/packages/client/src/components/FilesPanels/index.js b/packages/client/src/components/FilesPanels/index.js
index 776209ee9e..edce96ce7a 100644
--- a/packages/client/src/components/FilesPanels/index.js
+++ b/packages/client/src/components/FilesPanels/index.js
@@ -54,7 +54,7 @@ import {
ConflictResolveDialog,
ConvertDialog,
CreateRoomDialog,
- InviteUsersWarningDialog,
+ InviteQuotaWarningDialog,
CreateRoomConfirmDialog,
ChangeUserTypeDialog,
SubmitToFormGallery,
@@ -81,6 +81,7 @@ import { PDFFormEditingDialog } from "../dialogs/PDFFormEditingDialog";
import { SharePDFFormDialog } from "../dialogs/SharePDFFormDialog";
import { FillPDFDialog } from "../dialogs/FillPDFDialog";
import { ShareCollectSelector } from "../ShareCollectSelector";
+import { saveToLocalStorage } from "SRC_DIR/pages/PortalSettings/utils";
const Panels = (props) => {
const {
@@ -114,7 +115,7 @@ const Panels = (props) => {
confirmDialogIsLoading,
restoreAllPanelVisible,
archiveDialogVisible,
- inviteUsersWarningDialogVisible,
+ inviteQuotaWarningDialogVisible,
preparationPortalDialogVisible,
changeUserTypeDialogVisible,
restoreRoomDialogVisible,
@@ -137,6 +138,10 @@ const Panels = (props) => {
selectFileFormRoomOpenRoot,
fillPDFDialogData,
shareCollectSelector,
+
+ setQuotaWarningDialogVisible,
+ resetQuotaItem,
+ isShowWarningDialog,
} = props;
const [sharePDFForm, setSharePDFForm] = useState({
@@ -192,6 +197,17 @@ const Panels = (props) => {
};
}, [handleSharePDFForm]);
+ useEffect(() => {
+ if (isShowWarningDialog) {
+ setQuotaWarningDialogVisible(true);
+
+ resetQuotaItem();
+ }
+ return () => {
+ resetQuotaItem();
+ };
+ }, [isShowWarningDialog]);
+
return [
settingsPluginDialogVisible && (
{
),
archiveDialogVisible && ,
restoreRoomDialogVisible && ,
- inviteUsersWarningDialogVisible && (
-
+ inviteQuotaWarningDialogVisible && (
+
),
preparationPortalDialogVisible && (
@@ -330,7 +346,7 @@ export default inject(
backup,
createEditRoomStore,
pluginStore,
- filesStore,
+ currentQuotaStore,
filesActionsStore,
}) => {
const {
@@ -363,7 +379,7 @@ export default inject(
selectFileFormRoomFilterParam,
setSelectFileFormRoomDialogVisible,
invitePanelOptions,
- inviteUsersWarningDialogVisible,
+ inviteQuotaWarningDialogVisible,
changeUserTypeDialogVisible,
changeQuotaDialogVisible,
submitToGalleryDialogVisible,
@@ -380,6 +396,12 @@ export default inject(
selectFileFormRoomOpenRoot,
fillPDFDialogData,
shareCollectSelector,
+
+ setQuotaWarningDialogVisible,
+ setIsNewRoomByCurrentUser,
+ setIsNewUserByCurrentUser,
+ isNewUserByCurrentUser,
+ isNewRoomByCurrentUser,
} = dialogsStore;
const { preparationPortalDialogVisible } = backup;
@@ -389,6 +411,8 @@ export default inject(
const { isVisible: versionHistoryPanelVisible } = versionHistoryStore;
const { hotkeyPanelVisible } = settingsStore;
const { confirmDialogIsLoading } = createEditRoomStore;
+ const { isRoomsTariffAlmostLimit, isUserTariffAlmostLimit } =
+ currentQuotaStore;
const {
settingsPluginDialogVisible,
@@ -396,6 +420,22 @@ export default inject(
pluginDialogVisible,
} = pluginStore;
+ const isAccounts = window.location.href.indexOf("accounts/people") !== -1;
+ const resetQuotaItem = () => {
+ if (isNewUserByCurrentUser) setIsNewUserByCurrentUser(false);
+ if (isNewRoomByCurrentUser) setIsNewRoomByCurrentUser(false);
+ };
+
+ const closeItems = JSON.parse(localStorage.getItem("warning-dialog")) || [];
+
+ const isShowWarningDialog = isAccounts
+ ? isUserTariffAlmostLimit &&
+ !closeItems.includes("user-quota") &&
+ isNewUserByCurrentUser
+ : isRoomsTariffAlmostLimit &&
+ !closeItems.includes("room-quota") &&
+ isNewRoomByCurrentUser;
+
return {
preparationPortalDialogVisible,
uploadPanelVisible,
@@ -427,7 +467,7 @@ export default inject(
restoreAllPanelVisible,
invitePanelVisible: invitePanelOptions.visible,
archiveDialogVisible,
- inviteUsersWarningDialogVisible,
+ inviteQuotaWarningDialogVisible,
confirmDialogIsLoading,
changeUserTypeDialogVisible,
restoreRoomDialogVisible,
@@ -450,6 +490,10 @@ export default inject(
selectFileFormRoomOpenRoot,
fillPDFDialogData,
shareCollectSelector,
+
+ setQuotaWarningDialogVisible,
+ resetQuotaItem,
+ isShowWarningDialog,
};
},
)(observer(Panels));
diff --git a/packages/client/src/components/GlobalEvents/ChangeUserTypeEvent.js b/packages/client/src/components/GlobalEvents/ChangeUserTypeEvent.js
index 8c3182abfc..ab3530ae60 100644
--- a/packages/client/src/components/GlobalEvents/ChangeUserTypeEvent.js
+++ b/packages/client/src/components/GlobalEvents/ChangeUserTypeEvent.js
@@ -24,17 +24,13 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
-import React, { useState, useEffect } from "react";
+import { useEffect } from "react";
import { inject, observer } from "mobx-react";
import { useTranslation } from "react-i18next";
import { useNavigate } from "react-router-dom";
import { ChangeUserTypeDialog } from "../dialogs";
import { toastr } from "@docspace/shared/components/toast";
-import { Link } from "@docspace/shared/components/link";
-import { Text } from "@docspace/shared/components/text";
-import { combineUrl } from "@docspace/shared/utils/combineUrl";
-import { globalColors } from "@docspace/shared/themes";
const ChangeUserTypeEvent = ({
setVisible,
@@ -47,7 +43,6 @@ const ChangeUserTypeEvent = ({
getPeopleListItem,
setInfoPanelSelection,
needResetUserSelection,
- isRoomAdmin,
}) => {
const { toType, fromType, userIDs, successCallback, abortCallback } =
peopleDialogData;
@@ -77,16 +72,6 @@ const ChangeUserTypeEvent = ({
};
}, [peopleDialogData]);
- const onClickPayments = () => {
- const paymentPageUrl = combineUrl(
- "/portal-settings",
- "/payments/portal-payments",
- );
-
- toastr.clear();
- navigate(paymentPageUrl);
- };
-
const onChangeUserType = () => {
onClosePanel();
updateUserType(toType, userIDs, peopleFilter, fromType)
@@ -102,24 +87,7 @@ const ChangeUserTypeEvent = ({
successCallback && successCallback(users);
})
.catch((err) => {
- toastr.error(
- <>
- {t("Common:QuotaPaidUserLimitError")}
- {!isRoomAdmin && (
-
- {t("Common:PaymentsTitle")}
-
- )}
- >,
- false,
- 0,
- true,
- true,
- );
+ toastr.error( , false, 0, true, true);
abortCallback && abortCallback();
})
@@ -175,7 +143,7 @@ export default inject(
changeUserTypeDialogVisible: visible,
setChangeUserTypeDialogVisible: setVisible,
} = dialogsStore;
- const { isRoomAdmin } = authStore;
+
const { setInfoPanelSelection } = infoPanelStore;
const { dialogStore, filterStore, usersStore } = peopleStore;
@@ -185,7 +153,6 @@ export default inject(
usersStore;
const { setSelected } = peopleStore.selectionStore;
return {
- isRoomAdmin,
needResetUserSelection,
getPeopleListItem,
setInfoPanelSelection,
diff --git a/packages/client/src/components/MainBar/Bar.js b/packages/client/src/components/MainBar/Bar.js
index 018b5a8cd3..da93e3852b 100644
--- a/packages/client/src/components/MainBar/Bar.js
+++ b/packages/client/src/components/MainBar/Bar.js
@@ -67,28 +67,38 @@ const Bar = (props) => {
maxCountManagersByQuota,
addedManagersCount,
- showRoomQuotaBar,
- showStorageQuotaBar,
- showUserQuotaBar,
+ isStorageTariffAlmostLimit,
+ isUserTariffAlmostLimit,
currentColorScheme,
setMainBarVisible,
- showUserPersonalQuotaBar,
+ isPersonalQuotaLimit,
tenantCustomQuota,
- showTenantCustomQuotaBar,
+ isStorageTariffLimit,
+ isUserTariffLimit,
+ isStorageQuotaAlmostLimit,
+ isStorageQuotaLimit,
+ isRoomsTariffAlmostLimit,
+ isRoomsTariffLimit,
} = props;
const navigate = useNavigate();
const [barVisible, setBarVisible] = useState({
- roomQuota: false,
+ roomsTariff: false,
+ roomsTariffLimit: false,
+ storageTariff: false,
+ storageTariffLimit: false,
storageQuota: false,
- tenantCustomQuota: false,
- userQuota: false,
- storageAndUserQuota: false,
- storageAndRoomQuota: false,
+ storageQuotaLimit: false,
+ usersTariff: false,
+ usersTariffLimit: false,
+ storageAndUserTariff: false,
+ storageAndUserTariffLimit: false,
+ roomsAndStorageTariff: false,
+ roomsAndStorageTariffLimit: false,
confirmEmail: false,
personalUserQuota: false,
});
@@ -116,24 +126,38 @@ const Bar = (props) => {
}
if (closed) {
- if (isAdmin) {
+ if (isAdmin || isRoomAdmin) {
setBarVisible((value) => ({
...value,
- roomQuota: !closed.includes(QuotaBarTypes.RoomQuota),
- userQuota: !closed.includes(QuotaBarTypes.UserQuota),
- storageAndRoomQuota: !closed.includes(
- QuotaBarTypes.UserAndStorageQuota,
+ roomsTariff: !closed.includes(QuotaBarTypes.RoomsTariff),
+ roomsTariffLimit: !closed.includes(QuotaBarTypes.RoomsTariffLimit),
+ usersTariffLimit: !closed.includes(QuotaBarTypes.UsersTariffLimit),
+ usersTariff: !closed.includes(QuotaBarTypes.UsersTariff),
+ storageAndUserTariff: !closed.includes(
+ QuotaBarTypes.UserAndStorageTariff,
),
- storageAndUserQuota: !closed.includes(
- QuotaBarTypes.RoomAndStorageQuota,
+ roomsAndStorageTariff: closed.includes(
+ QuotaBarTypes.RoomsAndStorageTariff,
+ ),
+ roomsAndStorageTariffLimit: closed.includes(
+ QuotaBarTypes.RoomsAndStorageTariffLimit,
+ ),
+ storageAndUserTariffLimit: !closed.includes(
+ QuotaBarTypes.UserAndStorageTariffLimit,
),
}));
}
+
if (isAdmin || isPowerUser || isRoomAdmin) {
setBarVisible((value) => ({
...value,
+ storageTariff: !closed.includes(QuotaBarTypes.StorageTariff),
+ storageTariffLimit: !closed.includes(
+ QuotaBarTypes.StorageTariffLimit,
+ ),
storageQuota: !closed.includes(QuotaBarTypes.StorageQuota),
- tenantCustomQuota: !closed.includes(QuotaBarTypes.TenantCustomQuota),
+ storageQuotaLimit: !closed.includes(QuotaBarTypes.StorageQuotaLimit),
+ personalUserQuota: !closed.includes(QuotaBarTypes.PersonalUserQuota),
}));
}
@@ -145,14 +169,20 @@ const Bar = (props) => {
}
} else {
setBarVisible({
- roomQuota: isAdmin,
+ roomsTariff: isAdmin || isRoomAdmin,
+ roomsTariffLimit: isAdmin || isRoomAdmin,
+ storageTariff: isAdmin || isPowerUser || isRoomAdmin,
+ storageTariffLimit: isAdmin || isPowerUser || isRoomAdmin,
storageQuota: isAdmin || isPowerUser || isRoomAdmin,
- tenantCustomQuota: isAdmin || isPowerUser || isRoomAdmin,
- userQuota: isAdmin,
- storageAndUserQuota: isAdmin,
- storageAndRoomQuota: isAdmin,
+ storageQuotaLimit: isAdmin || isPowerUser || isRoomAdmin,
+ usersTariff: isAdmin || isRoomAdmin,
+ usersTariffLimit: isAdmin || isRoomAdmin,
+ storageAndUserTariff: isAdmin || isRoomAdmin,
+ roomsAndStorageTariff: isAdmin || isRoomAdmin,
+ roomsAndStorageTariffLimit: isAdmin || isRoomAdmin,
+ storageAndUserTariffLimit: isAdmin || isRoomAdmin,
confirmEmail: true,
- personalUserQuota: true,
+ personalUserQuota: isAdmin || isPowerUser || isRoomAdmin,
});
}
@@ -197,7 +227,7 @@ const Bar = (props) => {
};
const onClickQuota = (type, e) => {
- type === QuotaBarTypes.TenantCustomQuota ||
+ type === QuotaBarTypes.StorageQuota ||
type === QuotaBarTypes.PersonalUserQuota
? onClickTenantCustomQuota()
: onPaymentsClick(e);
@@ -225,23 +255,53 @@ const Bar = (props) => {
localStorage.setItem("barClose", JSON.stringify(closed));
switch (currentBar) {
- case QuotaBarTypes.RoomQuota:
- setBarVisible((value) => ({ ...value, roomQuota: false }));
+ case QuotaBarTypes.RoomsTariff:
+ setBarVisible((value) => ({ ...value, roomsTariff: false }));
+ break;
+ case QuotaBarTypes.RoomsTariffLimit:
+ setBarVisible((value) => ({ ...value, roomsTariffLimit: false }));
+ break;
+ case QuotaBarTypes.StorageTariff:
+ setBarVisible((value) => ({ ...value, storageTariff: false }));
+ break;
+ case QuotaBarTypes.StorageTariffLimit:
+ setBarVisible((value) => ({ ...value, storageTariffLimit: false }));
break;
case QuotaBarTypes.StorageQuota:
setBarVisible((value) => ({ ...value, storageQuota: false }));
break;
- case QuotaBarTypes.TenantCustomQuota:
- setBarVisible((value) => ({ ...value, tenantCustomQuota: false }));
+ case QuotaBarTypes.StorageQuotaLimit:
+ setBarVisible((value) => ({ ...value, storageQuotaLimit: false }));
break;
- case QuotaBarTypes.UserQuota:
- setBarVisible((value) => ({ ...value, userQuota: false }));
+ case QuotaBarTypes.UsersTariff:
+ setBarVisible((value) => ({
+ ...value,
+ usersTariff: false,
+ }));
break;
- case QuotaBarTypes.UserAndStorageQuota:
- setBarVisible((value) => ({ ...value, storageAndUserQuota: false }));
+ case QuotaBarTypes.UsersTariffLimit:
+ setBarVisible((value) => ({
+ ...value,
+ usersTariffLimit: false,
+ }));
break;
- case QuotaBarTypes.RoomAndStorageQuota:
- setBarVisible((value) => ({ ...value, storageAndRoomQuota: false }));
+ case QuotaBarTypes.UserAndStorageTariff:
+ setBarVisible((value) => ({ ...value, storageAndUserTariff: false }));
+ break;
+ case QuotaBarTypes.UserAndStorageTariffLimit:
+ setBarVisible((value) => ({
+ ...value,
+ storageAndUserTariffLimit: false,
+ }));
+ break;
+ case QuotaBarTypes.RoomsAndStorageTariff:
+ setBarVisible((value) => ({ ...value, roomsAndStorageTariff: false }));
+ break;
+ case QuotaBarTypes.RoomsAndStorageTariffLimit:
+ setBarVisible((value) => ({
+ ...value,
+ roomsAndStorageTariffLimit: false,
+ }));
break;
case QuotaBarTypes.PersonalUserQuota:
setBarVisible((value) => ({ ...value, personalUserQuota: false }));
@@ -266,63 +326,120 @@ const Bar = (props) => {
const getCurrentBar = () => {
if (
- showRoomQuotaBar &&
- showStorageQuotaBar &&
- barVisible.storageAndRoomQuota
+ isRoomsTariffAlmostLimit &&
+ isStorageTariffAlmostLimit &&
+ barVisible.roomsAndStorageTariff
) {
return {
- type: QuotaBarTypes.RoomAndStorageQuota,
- maxValue: null,
- currentValue: null,
- };
- }
- if (
- showUserQuotaBar &&
- showStorageQuotaBar &&
- barVisible.storageAndUserQuota
- ) {
- return {
- type: QuotaBarTypes.UserAndStorageQuota,
+ type: QuotaBarTypes.RoomsAndStorageTariff,
maxValue: null,
currentValue: null,
};
}
- if (showRoomQuotaBar && barVisible.roomQuota) {
+ if (
+ isRoomsTariffLimit &&
+ isStorageTariffLimit &&
+ barVisible.roomsAndStorageTariffLimit
+ ) {
return {
- type: QuotaBarTypes.RoomQuota,
+ type: QuotaBarTypes.RoomsAndStorageTariffLimit,
+ maxValue: null,
+ currentValue: null,
+ };
+ }
+
+ if (
+ isUserTariffAlmostLimit &&
+ isStorageTariffAlmostLimit &&
+ barVisible.storageAndUserTariff
+ ) {
+ return {
+ type: QuotaBarTypes.UserAndStorageTariff,
+ maxValue: null,
+ currentValue: null,
+ };
+ }
+
+ if (
+ isUserTariffLimit &&
+ isStorageTariffLimit &&
+ barVisible.storageAndUserTariffLimit
+ ) {
+ return {
+ type: QuotaBarTypes.UserAndStorageTariffLimit,
+ maxValue: null,
+ currentValue: null,
+ };
+ }
+ if (isRoomsTariffAlmostLimit && barVisible.roomsTariff) {
+ return {
+ type: QuotaBarTypes.RoomsTariff,
maxValue: maxCountRoomsByQuota,
currentValue: usedRoomsCount,
};
}
- if (showStorageQuotaBar && barVisible.storageQuota) {
+ if (isRoomsTariffLimit && barVisible.roomsTariffLimit) {
return {
- type: QuotaBarTypes.StorageQuota,
- maxValue: getConvertedSize(t, maxTotalSizeByQuota),
- currentValue: getConvertedSize(t, usedTotalStorageSizeCount),
+ type: QuotaBarTypes.RoomsTariffLimit,
+ maxValue: maxCountRoomsByQuota,
+ currentValue: usedRoomsCount,
};
}
- if (showTenantCustomQuotaBar && barVisible.tenantCustomQuota) {
+ if (isStorageQuotaAlmostLimit && barVisible.storageQuota) {
return {
- type: QuotaBarTypes.TenantCustomQuota,
+ type: QuotaBarTypes.StorageQuota,
maxValue: getConvertedSize(t, tenantCustomQuota),
currentValue: getConvertedSize(t, usedTotalStorageSizeCount),
};
}
- if (showUserQuotaBar && barVisible.userQuota) {
+ if (isStorageQuotaLimit && barVisible.storageQuotaLimit) {
return {
- type: QuotaBarTypes.UserQuota,
+ type: QuotaBarTypes.StorageQuotaLimit,
+ maxValue: getConvertedSize(t, tenantCustomQuota),
+ currentValue: getConvertedSize(t, usedTotalStorageSizeCount),
+ };
+ }
+
+ if (isStorageTariffAlmostLimit && barVisible.storageTariff) {
+ return {
+ type: QuotaBarTypes.StorageTariff,
+ maxValue: getConvertedSize(t, maxTotalSizeByQuota),
+ currentValue: getConvertedSize(t, usedTotalStorageSizeCount),
+ };
+ }
+
+ if (isStorageTariffLimit && barVisible.storageTariffLimit) {
+ return {
+ type: QuotaBarTypes.StorageTariffLimit,
+ maxValue: getConvertedSize(t, maxTotalSizeByQuota),
+ currentValue: getConvertedSize(t, usedTotalStorageSizeCount),
+ };
+ }
+
+ if (isUserTariffLimit && barVisible.usersTariffLimit) {
+ return {
+ type: QuotaBarTypes.UsersTariffLimit,
maxValue: maxCountManagersByQuota,
currentValue: addedManagersCount,
};
}
- if (showUserPersonalQuotaBar && barVisible.personalUserQuota) {
+ if (isUserTariffAlmostLimit && barVisible.usersTariff) {
+ return {
+ type: QuotaBarTypes.UsersTariff,
+ maxValue: maxCountManagersByQuota,
+ currentValue: addedManagersCount,
+ };
+ }
+
+ if (isPersonalQuotaLimit && barVisible.personalUserQuota) {
return {
type: QuotaBarTypes.PersonalUserQuota,
};
}
+
return null;
};
@@ -394,12 +511,16 @@ export default inject(
maxCountManagersByQuota,
addedManagersCount,
- showRoomQuotaBar,
- showStorageQuotaBar,
- showUserQuotaBar,
- showUserPersonalQuotaBar,
+ isStorageTariffAlmostLimit,
+ isUserTariffAlmostLimit,
+ isPersonalQuotaLimit,
tenantCustomQuota,
- showTenantCustomQuotaBar,
+ isStorageTariffLimit,
+ isUserTariffLimit,
+ isStorageQuotaAlmostLimit,
+ isStorageQuotaLimit,
+ isRoomsTariffAlmostLimit,
+ isRoomsTariffLimit,
} = currentQuotaStore;
const { currentColorScheme, setMainBarVisible } = settingsStore;
@@ -423,16 +544,20 @@ export default inject(
maxCountManagersByQuota,
addedManagersCount,
- showRoomQuotaBar,
- showStorageQuotaBar,
- showUserQuotaBar,
+ isStorageTariffAlmostLimit,
+ isUserTariffAlmostLimit,
currentColorScheme,
setMainBarVisible,
- showUserPersonalQuotaBar,
+ isPersonalQuotaLimit,
tenantCustomQuota,
- showTenantCustomQuotaBar,
+ isStorageTariffLimit,
+ isUserTariffLimit,
+ isStorageQuotaAlmostLimit,
+ isStorageQuotaLimit,
+ isRoomsTariffAlmostLimit,
+ isRoomsTariffLimit,
};
},
)(withTranslation(["Profile", "Common"])(observer(Bar)));
diff --git a/packages/client/src/components/MainBar/QuotasBar.js b/packages/client/src/components/MainBar/QuotasBar.js
index 7414faca8f..7586344647 100644
--- a/packages/client/src/components/MainBar/QuotasBar.js
+++ b/packages/client/src/components/MainBar/QuotasBar.js
@@ -26,7 +26,6 @@
import React from "react";
import { withTranslation, Trans } from "react-i18next";
-import styled, { css } from "styled-components";
import { SnackBar } from "@docspace/shared/components/snackbar";
@@ -53,30 +52,8 @@ const QuotasBar = ({
onClose && onClose(type);
};
- const getStorageQuotaDescription = () => {
- if (!isAdmin) return t("StorageQuotaUserDescription");
-
- return (
-
- You can remove the unnecessary files or
-
- {{ clickHere: t("ClickHere").toLowerCase() }}
- {" "}
- to find a better pricing plan for your portal.
-
- );
- };
const getTenantCustomQuota = () => {
- if (!isAdmin) return t("StorageQuotaUserDescription");
+ if (!isAdmin) return t("RemoveFilesOrContactToUpgradeQuota");
return (
@@ -92,14 +69,19 @@ const QuotasBar = ({
);
};
- const getUserQuotaDescription = () => {
+
+ const getUserTariffAlmostLimit = () => {
+ if (!isAdmin)
+ return t("UserTariffAlmostReached", {
+ productName: t("Common:ProductName"),
+ });
+
return (
);
};
+
+ const getUserTariffLimit = () => {
+ if (!isAdmin) return t("UserTariffReached");
+
+ return (
+
+ ),
+ }}
+ />
+ );
+ };
+
+ const getStorageTariffDescription = () => {
+ if (!isAdmin)
+ return t("RemoveFilesOrContactToUpgrade", {
+ productName: t("Common:ProductName"),
+ });
+
+ return (
+
+ ),
+ }}
+ />
+ );
+ };
+
+ const getPersonalQuotaDescription = () => {
+ if (!isAdmin)
+ return t("PersonalUserQuotaDescription", {
+ productName: t("Common:ProductName"),
+ });
+
+ return (
+
+ ),
+ }}
+ />
+ );
+ };
+
+ const getPersonalQuotaHeader = () => {
+ if (!isAdmin) return t("PersonalQuotaHeader");
+ return t("PersonalQuotaHeaderForAdmins");
+ };
+
+ const getUpgradeTariffDescription = () => {
+ if (!isAdmin)
+ return t("ContactToUpgradeTariff", {
+ productName: t("Common:ProductName"),
+ });
+
+ return (
+
+ ),
+ }}
+ />
+ );
+ };
+
+ const getRoomsTariffDescription = () => {
+ if (!isAdmin)
+ return t("ArchivedRoomsOrContact", {
+ productName: t("Common:ProductName"),
+ });
+
+ return (
+
+ ),
+ }}
+ />
+ );
+ };
const getQuotaInfo = () => {
switch (type) {
- case QuotaBarTypes.RoomQuota:
+ case QuotaBarTypes.RoomsTariff:
return {
header: t("RoomQuotaHeader", { currentValue, maxValue }),
- description: (
-
- You can archived the unnecessary rooms or
-
- {{ clickHere: t("ClickHere").toLowerCase() }}
- {" "}
- to find a better pricing plan for your portal.
-
- ),
+ description: getRoomsTariffDescription(),
+ };
+ case QuotaBarTypes.RoomsTariffLimit:
+ return {
+ header: t("RoomQuotaHeaderLimit", { currentValue, maxValue }),
+ description: getRoomsTariffDescription(),
+ };
+ case QuotaBarTypes.StorageTariff:
+ return {
+ header: t("StorageQuotaHeader", { currentValue, maxValue }),
+ description: getStorageTariffDescription(),
+ };
+ case QuotaBarTypes.StorageTariffLimit:
+ return {
+ header: t("StorageLimitHeader", { currentValue, maxValue }),
+ description: getStorageTariffDescription(),
};
case QuotaBarTypes.StorageQuota:
- return {
- header: t("StorageQuotaHeader", { currentValue, maxValue }),
- description: getStorageQuotaDescription(),
- };
- case QuotaBarTypes.TenantCustomQuota:
return {
header: t("StorageQuotaHeader", { currentValue, maxValue }),
description: getTenantCustomQuota(),
};
- case QuotaBarTypes.UserQuota:
+ case QuotaBarTypes.StorageQuotaLimit:
+ return {
+ header: t("StorageLimitHeader", { currentValue, maxValue }),
+ description: getTenantCustomQuota(),
+ };
+ case QuotaBarTypes.UsersTariff:
return {
header: t("UserQuotaHeader", { currentValue, maxValue }),
- description: getUserQuotaDescription(),
+ description: getUserTariffAlmostLimit(),
};
-
- case QuotaBarTypes.UserAndStorageQuota:
+ case QuotaBarTypes.UsersTariffLimit:
return {
- header: t("StorageAndUserHeader", { currentValue, maxValue }),
- description: getUserQuotaDescription(),
+ header: t("UserTariffLimitHeader", { currentValue, maxValue }),
+ description: getUserTariffLimit(),
};
- case QuotaBarTypes.RoomAndStorageQuota:
+ case QuotaBarTypes.UserAndStorageTariff:
return {
- header: t("StorageAndRoomHeader", { currentValue, maxValue }),
- description: getUserQuotaDescription(),
+ header: t("StorageAndUserHeader"),
+ description: getUpgradeTariffDescription(),
+ };
+ case QuotaBarTypes.UserAndStorageTariffLimit:
+ return {
+ header: t("StorageAndUserTariffLimitHeader"),
+ description: getUpgradeTariffDescription(),
+ };
+ case QuotaBarTypes.RoomsAndStorageTariff:
+ return {
+ header: t("StorageAndRoomHeader"),
+ description: getUpgradeTariffDescription(),
+ };
+ case QuotaBarTypes.RoomsAndStorageTariffLimit:
+ return {
+ header: t("StorageAndRoomLimitHeader"),
+ description: getUpgradeTariffDescription(),
};
case QuotaBarTypes.PersonalUserQuota:
- const description = !isAdmin ? (
- t("PersonalUserQuotaDescription")
- ) : (
-
- To upload and create new files and folders, please free up disk
- space, or manage quota per user in the
-
- Storage management settings.
-
-
- );
return {
- header: t("StorageQuotaExceeded"),
- description,
+ header: getPersonalQuotaHeader(),
+ description: getPersonalQuotaDescription(),
};
default:
diff --git a/packages/client/src/components/PaidQuotaLimitError/index.js b/packages/client/src/components/PaidQuotaLimitError/index.js
new file mode 100644
index 0000000000..0cb8791277
--- /dev/null
+++ b/packages/client/src/components/PaidQuotaLimitError/index.js
@@ -0,0 +1,78 @@
+// (c) Copyright Ascensio System SIA 2009-2024
+//
+// This program is a free software product.
+// You can redistribute it and/or modify it under the terms
+// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
+// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
+// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
+// any third-party rights.
+//
+// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
+// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+//
+// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
+//
+// The interactive user interfaces in modified source and object code versions of the Program must
+// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
+//
+// Pursuant to Section 7(b) of the License you must retain the original Product logo when
+// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
+// trademark law for use of our trademarks.
+//
+// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
+// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
+// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+import { useTranslation } from "react-i18next";
+import { inject, observer } from "mobx-react";
+
+import { Text } from "@docspace/shared/components/text";
+import { Link } from "@docspace/shared/components/link";
+import { toastr } from "@docspace/shared/components/toast";
+import { combineUrl } from "@docspace/shared/utils/combineUrl";
+
+const PaidQuotaLimitError = ({
+ isRoomAdmin,
+ setInvitePanelOptions,
+ invitePanelVisible,
+}) => {
+ const { t } = useTranslation();
+
+ const onClickPayments = () => {
+ const paymentPageUrl = combineUrl(
+ "/portal-settings",
+ "/payments/portal-payments",
+ );
+
+ toastr.clear();
+ window.DocSpace.navigate(paymentPageUrl);
+
+ invitePanelVisible &&
+ setInvitePanelOptions({
+ visible: false,
+ hideSelector: false,
+ defaultAccess: 1,
+ });
+ };
+
+ return (
+ <>
+ {t("Common:QuotaPaidUserLimitError")}
+ {!isRoomAdmin && (
+
+ {t("Common:PaymentsTitle")}
+
+ )}
+ >
+ );
+};
+
+export default inject(({ authStore, dialogsStore }) => {
+ const { isRoomAdmin } = authStore;
+ const { setInvitePanelOptions, invitePanelOptions } = dialogsStore;
+ return {
+ isRoomAdmin,
+ setInvitePanelOptions,
+ invitePanelVisible: invitePanelOptions.visible,
+ };
+})(observer(PaidQuotaLimitError));
diff --git a/packages/client/src/components/dialogs/ChangeUserStatusDialog/index.js b/packages/client/src/components/dialogs/ChangeUserStatusDialog/index.js
index 678370f0a8..93fa28c558 100644
--- a/packages/client/src/components/dialogs/ChangeUserStatusDialog/index.js
+++ b/packages/client/src/components/dialogs/ChangeUserStatusDialog/index.js
@@ -24,23 +24,21 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
-import React, { memo } from "react";
+import React from "react";
import PropTypes from "prop-types";
import { ModalDialog } from "@docspace/shared/components/modal-dialog";
import { Button } from "@docspace/shared/components/button";
import { Text } from "@docspace/shared/components/text";
-import { Link } from "@docspace/shared/components/link";
import { toastr } from "@docspace/shared/components/toast";
-import { combineUrl } from "@docspace/shared/utils/combineUrl";
-
import { withTranslation } from "react-i18next";
import { EmployeeStatus } from "@docspace/shared/enums";
import ModalDialogContainer from "../ModalDialogContainer";
import { inject, observer } from "mobx-react";
-import { globalColors } from "@docspace/shared/themes";
+
+import PaidQuotaLimitError from "SRC_DIR/components/PaidQuotaLimitError";
class ChangeUserStatusDialogComponent extends React.Component {
constructor(props) {
@@ -49,15 +47,6 @@ class ChangeUserStatusDialogComponent extends React.Component {
this.state = { isRequestRunning: false };
}
- onClickPayments = () => {
- const paymentPageUrl = combineUrl(
- "/portal-settings",
- "/payments/portal-payments",
- );
-
- toastr.clear();
- window.DocSpace.navigate(paymentPageUrl);
- };
onChangeUserStatus = () => {
const {
updateUserStatus,
@@ -84,22 +73,7 @@ class ChangeUserStatusDialogComponent extends React.Component {
toastr.success(t("PeopleTranslations:SuccessChangeUserStatus"));
})
.catch((err) => {
- toastr.error(
- <>
- {t("Common:QuotaPaidUserLimitError")}
-
- {t("Common:PaymentsTitle")}
-
- >,
- false,
- 0,
- true,
- true,
- );
+ toastr.error( , false, 0, true, true);
})
.finally(() => {
this.setState({ isRequestRunning: false }, () => {
diff --git a/packages/client/src/components/dialogs/ConnectDialog/index.js b/packages/client/src/components/dialogs/ConnectDialog/index.js
index e6f1814fc8..f82f1516b0 100644
--- a/packages/client/src/components/dialogs/ConnectDialog/index.js
+++ b/packages/client/src/components/dialogs/ConnectDialog/index.js
@@ -170,7 +170,7 @@ const PureConnectDialogContainer = (props) => {
provider_id,
)
.then(async () => {
- await setThirdPartyAccountsInfo();
+ await setThirdPartyAccountsInfo(t);
})
.catch((err) => {
toastr.error(err);
diff --git a/packages/client/src/components/dialogs/CreateEditRoomDialog/sub-components/ThirdPartyStorage/ThirdPartyComboBox.js b/packages/client/src/components/dialogs/CreateEditRoomDialog/sub-components/ThirdPartyStorage/ThirdPartyComboBox.js
index 2bedf80e36..02c6b0fbf5 100644
--- a/packages/client/src/components/dialogs/CreateEditRoomDialog/sub-components/ThirdPartyStorage/ThirdPartyComboBox.js
+++ b/packages/client/src/components/dialogs/CreateEditRoomDialog/sub-components/ThirdPartyStorage/ThirdPartyComboBox.js
@@ -24,18 +24,23 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
-import React, { useEffect, useState, useRef } from "react";
+import { useEffect, useState } from "react";
import styled from "styled-components";
-
+import { ReactSVG } from "react-svg";
import { isMobileOnly, isMobile } from "react-device-detect";
import { Button } from "@docspace/shared/components/button";
+import { DropDownItem } from "@docspace/shared/components/drop-down-item";
+import { Text } from "@docspace/shared/components/text";
+import { Tooltip } from "@docspace/shared/components/tooltip";
import { connectedCloudsTypeTitleTranslation as ProviderKeyTranslation } from "@docspace/client/src/helpers/filesUtils";
import { Base } from "@docspace/shared/themes";
import { toastr } from "@docspace/shared/components/toast";
import { ComboBox } from "@docspace/shared/components/combobox";
import ExternalLinkReactSvgUrl from "PUBLIC_DIR/images/external.link.react.svg?url";
+import { ThirdPartyServicesUrlName } from "../../../../../helpers/constants";
+import { isDesktop } from "@docspace/shared/utils";
const StyledStorageLocation = styled.div`
display: flex;
@@ -91,16 +96,29 @@ const StyledStorageLocation = styled.div`
StyledStorageLocation.defaultProps = { theme: Base };
-const services = {
- GoogleDrive: "google",
- Box: "box",
- Dropbox: "dropbox",
- OneDrive: "skydrive",
- Nextcloud: "nextcloud",
- kDrive: "kdrive",
- ownCloud: "owncloud",
- WebDav: "webdav",
-};
+const StyledComboBoxItem = styled.div`
+ display: flex;
+
+ .drop-down-item_text {
+ color: ${({ theme, isDisabled }) =>
+ isDisabled ? theme.dropDownItem.disableColor : theme.dropDownItem.color};
+ }
+ .drop-down-item_icon {
+ display: flex;
+ align-items: center;
+
+ div {
+ display: flex;
+ }
+
+ margin-inline-start: auto;
+
+ svg {
+ min-height: 16px;
+ min-width: 16px;
+ }
+ }
+`;
const ThirdPartyComboBox = ({
t,
@@ -124,15 +142,16 @@ const ThirdPartyComboBox = ({
isDisabled,
setIsScrollLocked,
+ isAdmin,
}) => {
- const deafultSelectedItem = {
+ const defaultSelectedItem = {
key: "length",
label:
storageLocation?.provider?.title ||
t("ThirdPartyStorageComboBoxPlaceholder"),
};
- const [selectedItem, setSelectedItem] = useState(deafultSelectedItem);
+ const [selectedItem, setSelectedItem] = useState(defaultSelectedItem);
const thirdparties = connectItems.map((item) => ({
...item,
@@ -142,7 +161,7 @@ const ThirdPartyComboBox = ({
const setStorageLocaiton = (thirparty, isConnected) => {
if (!isConnected) {
window.open(
- `/portal-settings/integration/third-party-services?service=${services[thirparty.id]}`,
+ `/portal-settings/integration/third-party-services?service=${ThirdPartyServicesUrlName[thirparty.id]}`,
"_blank",
);
return;
@@ -207,35 +226,79 @@ const ThirdPartyComboBox = ({
setSaveThirdpartyResponse(null);
}, [saveThirdpartyResponse]);
- const options = thirdparties
- .sort((storage) => (storage.isConnected ? -1 : 1))
- .map((item) => ({
- label:
- item.title + (item.isConnected ? "" : ` (${t("ActivationRequired")})`),
- title: item.title,
- key: item.id,
- icon: item.isConnected ? undefined : ExternalLinkReactSvgUrl,
- className: item.isConnected ? "" : "storage-unavailable",
- }));
+ const onSelect = (event) => {
+ const data = event.currentTarget.dataset;
- const onSelect = (elem) => {
const thirdparty = thirdparties.find((t) => {
- return elem.key === t.id;
+ return t.id === data.thirdPartyId;
});
thirdparty && setStorageLocaiton(thirdparty, thirdparty.isConnected);
thirdparty.isConnected
- ? setSelectedItem(elem)
- : setSelectedItem({ ...deafultSelectedItem });
+ ? setSelectedItem({ key: thirdparty.id, label: thirdparty.title })
+ : setSelectedItem({ ...defaultSelectedItem });
};
+ const getTextTooltip = () => {
+ return (
+
+ {t("Common:EnableThirdPartyIntegration")}
+
+ );
+ };
+
+ const advancedOptions = thirdparties
+ .sort((storage) => (storage.isConnected ? -1 : 1))
+ ?.map((item) => {
+ const isDisabled = !item.isConnected && !isAdmin;
+ const itemLabel =
+ item.title + (item.isConnected ? "" : ` (${t("ActivationRequired")})`);
+
+ const disabledData = isDisabled
+ ? { "data-tooltip-id": "file-links-tooltip", "data-tip": "tooltip" }
+ : {};
+
+ return (
+
+
+
+ {itemLabel}
+
+
+ {!isDisabled && !item.isConnected ? (
+
+ ) : (
+ <>>
+ )}
+
+ {isDisabled && (
+
+ )}
+
+ );
+ });
+
return (
)}
@@ -213,7 +215,7 @@ export default inject(
const connectItems = thirdPartyStore.connectingStorages;
- const { isRoomAdmin } = authStore;
+ const { isRoomAdmin, isAdmin } = authStore;
return {
connectItems,
@@ -232,6 +234,7 @@ export default inject(
getOAuthToken,
currentColorScheme,
isRoomAdmin,
+ isAdmin,
fetchConnectingStorages: thirdPartyStore.fetchConnectingStorages,
};
},
diff --git a/packages/client/src/components/dialogs/CreatedPDFFormDialog/CreatedPDFFormDialog.tsx b/packages/client/src/components/dialogs/CreatedPDFFormDialog/CreatedPDFFormDialog.tsx
index 2a97e2e06c..7945ddf7b3 100644
--- a/packages/client/src/components/dialogs/CreatedPDFFormDialog/CreatedPDFFormDialog.tsx
+++ b/packages/client/src/components/dialogs/CreatedPDFFormDialog/CreatedPDFFormDialog.tsx
@@ -84,7 +84,7 @@ export const CreatedPDFFormDialog = inject
(
onClose={onClose}
displayType={ModalDialogType.modal}
>
- {t("PDFFormDialogTitle")}
+ {t("PDFform")}
{theme.isBase ? : }
@@ -104,15 +104,12 @@ export const CreatedPDFFormDialog = inject(
size={ButtonSize.normal}
label={primaryButtonLabel}
onClick={onSubmit}
- // isLoading={isLoading}
/>
diff --git a/packages/client/src/components/dialogs/DeleteProfileEverDialog/index.js b/packages/client/src/components/dialogs/DeleteProfileEverDialog/index.js
index d2cad67e5d..a39e2119a5 100644
--- a/packages/client/src/components/dialogs/DeleteProfileEverDialog/index.js
+++ b/packages/client/src/components/dialogs/DeleteProfileEverDialog/index.js
@@ -26,16 +26,18 @@
import React from "react";
import PropTypes from "prop-types";
+import { matchPath } from "react-router";
+import { withTranslation } from "react-i18next";
+
import { Button } from "@docspace/shared/components/button";
import { toastr } from "@docspace/shared/components/toast";
import { ModalDialog } from "@docspace/shared/components/modal-dialog";
-import { withTranslation } from "react-i18next";
+import { mobileMore } from "@docspace/shared/utils";
import api from "@docspace/shared/api";
import ModalDialogContainer from "../ModalDialogContainer";
import { inject, observer } from "mobx-react";
import styled, { css } from "styled-components";
-import { mobileMore } from "@docspace/shared/utils";
import BodyComponent from "./sub-components/BodyComponent";
const { deleteUser } = api.people;
@@ -108,6 +110,7 @@ const DeleteProfileEverDialogComponent = (props) => {
removeUser,
userIds,
filter,
+ refreshInsideGroup,
setSelected,
deleteWithoutReassign,
onlyOneUser,
@@ -123,15 +126,22 @@ const DeleteProfileEverDialogComponent = (props) => {
const areUsersOnly = usersToDelete.every((user) => user.isVisitor);
+ const isInsideGroup = matchPath(
+ "/accounts/groups/:groupId/filter",
+ location.pathname,
+ );
+
const onDeleteUser = (id) => {
setIsRequestRunning(true);
deleteUser(id)
+ .then(() => {
+ return isInsideGroup
+ ? refreshInsideGroup()
+ : getUsersList(filter, true);
+ })
.then(() => {
toastr.success(t("SuccessfullyDeleteUserInfoMessage"));
- getUsersList(filter, true);
-
- return;
})
.catch((error) => toastr.error(error))
.finally(() => {
@@ -142,7 +152,7 @@ const DeleteProfileEverDialogComponent = (props) => {
};
const onDeleteUsers = (ids) => {
setIsRequestRunning(true);
- removeUser(ids, filter)
+ removeUser(ids, filter, isInsideGroup)
.then(() => {
toastr.success(t("DeleteGroupUsersSuccessMessage"));
})
@@ -239,6 +249,7 @@ DeleteProfileEverDialog.propTypes = {
export default inject(({ peopleStore }, { users }) => {
const { dialogStore, selectionStore, filterStore, usersStore } = peopleStore;
+ const { refreshInsideGroup } = peopleStore.groupsStore;
const { getUsersList, needResetUserSelection } = peopleStore.usersStore;
@@ -272,6 +283,7 @@ export default inject(({ peopleStore }, { users }) => {
removeUser: usersStore.removeUser,
needResetUserSelection,
filter: filterStore.filter,
+ refreshInsideGroup,
getUsersList,
deleteWithoutReassign,
onlyOneUser,
diff --git a/packages/client/src/components/dialogs/InviteUsersWarningDialog/index.js b/packages/client/src/components/dialogs/InviteQuotaWarningDialog/index.js
similarity index 67%
rename from packages/client/src/components/dialogs/InviteUsersWarningDialog/index.js
rename to packages/client/src/components/dialogs/InviteQuotaWarningDialog/index.js
index ce65ad9d9c..87cea09f1d 100644
--- a/packages/client/src/components/dialogs/InviteUsersWarningDialog/index.js
+++ b/packages/client/src/components/dialogs/InviteQuotaWarningDialog/index.js
@@ -27,15 +27,17 @@
import React, { useState, useEffect } from "react";
import { inject, observer } from "mobx-react";
import { withTranslation, Trans } from "react-i18next";
-import { useNavigate } from "react-router-dom";
+import { useNavigate, useLocation } from "react-router-dom";
import moment from "moment-timezone";
import { ModalDialog } from "@docspace/shared/components/modal-dialog";
import { Button } from "@docspace/shared/components/button";
import { Text } from "@docspace/shared/components/text";
-
import { getDaysRemaining } from "@docspace/shared/utils/common";
-const InviteUsersWarningDialog = (props) => {
+import RoomsContent from "./sub-components/RoomsContent";
+import UsersContent from "./sub-components/UsersContent";
+
+const InviteQuotaWarningDialog = (props) => {
const {
t,
tReady,
@@ -51,6 +53,8 @@ const InviteUsersWarningDialog = (props) => {
} = props;
const navigate = useNavigate();
+ const location = useLocation();
+ const isAccounts = location.pathname.includes("accounts/people");
const [datesData, setDatesData] = useState({});
@@ -74,7 +78,21 @@ const InviteUsersWarningDialog = (props) => {
});
};
- const onClose = () => setIsVisible(false);
+ const onClose = () => {
+ if (!isGracePeriod) {
+ const closeItems =
+ JSON.parse(localStorage.getItem("warning-dialog")) || [];
+
+ const warningItem = isAccounts ? "user-quota" : "room-quota";
+
+ const closed =
+ closeItems.length > 0 ? [...closeItems, warningItem] : [warningItem];
+ console.log("closed", closed);
+ localStorage.setItem("warning-dialog", JSON.stringify(closed));
+ }
+
+ setIsVisible(false);
+ };
const onUpgradePlan = () => {
onClose();
@@ -84,6 +102,28 @@ const InviteUsersWarningDialog = (props) => {
navigate(paymentPageUrl);
};
+ const contentForGracePeriod = (
+ <>
+
+ {t("BusinessPlanPaymentOverdue", {
+ planName: currentTariffPlanTitle,
+ })}
+
+
+
+
+ Grace period activated
+
+ from {{ fromDate }} to {{ byDate }}
+
+ (days remaining: {{ delayDaysCount }})
+
+
+
+ {t("GracePeriodActivatedDescription")}
+ >
+ );
+
return (
{
visible={visible}
onClose={onClose}
displayType="modal"
+ autoMaxHeight
>
{t("Common:Warning")}
{isGracePeriod ? (
- <>
-
- {t("BusinessPlanPaymentOverdue", {
- planName: currentTariffPlanTitle,
- })}
-
-
-
-
- Grace period activated
-
- from {{ fromDate }} to {{ byDate }}
-
- (days remaining: {{ delayDaysCount }})
-
-
-
- {t("GracePeriodActivatedDescription")}
- >
+ contentForGracePeriod
+ ) : isAccounts ? (
+
) : (
- <>
-
- {t("PaymentOverdue")}
-
-
- {t("UpgradePlanInfo")}
-
- {t("ChooseNewPlan")}
- >
+
)}
@@ -135,17 +152,16 @@ const InviteUsersWarningDialog = (props) => {
size="normal"
primary
onClick={isPaymentPageAvailable ? onUpgradePlan : onClose}
- scale={isPaymentPageAvailable}
+ scale
+ />
+
+
- {isPaymentPageAvailable && (
-
- )}
);
@@ -162,20 +178,18 @@ export default inject(
const { dueDate, delayDueDate, isGracePeriod } = currentTariffStatusStore;
const { currentTariffPlanTitle } = currentQuotaStore;
- const {
- inviteUsersWarningDialogVisible,
- setInviteUsersWarningDialogVisible,
- } = dialogsStore;
+ const { inviteQuotaWarningDialogVisible, setQuotaWarningDialogVisible } =
+ dialogsStore;
return {
isPaymentPageAvailable,
currentTariffPlanTitle,
language: authStore.language,
- visible: inviteUsersWarningDialogVisible,
- setIsVisible: setInviteUsersWarningDialogVisible,
+ visible: inviteQuotaWarningDialogVisible,
+ setIsVisible: setQuotaWarningDialogVisible,
dueDate,
delayDueDate,
isGracePeriod,
};
},
-)(observer(withTranslation(["Payments", "Common"])(InviteUsersWarningDialog)));
+)(observer(withTranslation(["Payments", "Common"])(InviteQuotaWarningDialog)));
diff --git a/packages/client/src/components/dialogs/InviteQuotaWarningDialog/sub-components/RoomsContent.tsx b/packages/client/src/components/dialogs/InviteQuotaWarningDialog/sub-components/RoomsContent.tsx
new file mode 100644
index 0000000000..8f62f88dc4
--- /dev/null
+++ b/packages/client/src/components/dialogs/InviteQuotaWarningDialog/sub-components/RoomsContent.tsx
@@ -0,0 +1,109 @@
+// (c) Copyright Ascensio System SIA 2009-2024
+//
+// This program is a free software product.
+// You can redistribute it and/or modify it under the terms
+// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
+// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
+// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
+// any third-party rights.
+//
+// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
+// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+//
+// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
+//
+// The interactive user interfaces in modified source and object code versions of the Program must
+// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
+//
+// Pursuant to Section 7(b) of the License you must retain the original Product logo when
+// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
+// trademark law for use of our trademarks.
+//
+// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
+// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
+// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+
+import { inject, observer } from "mobx-react";
+import { useTranslation } from "react-i18next";
+
+import { Text } from "@docspace/shared/components/text";
+
+export interface RoomsContentProps {
+ isRoomsTariffLimit: boolean;
+ maxCountRoomsByQuota: number;
+ usedRoomsCount: number;
+ isPaymentPageAvailable: boolean;
+ isArchiveFolderRoot: boolean;
+}
+
+const RoomsContent = ({
+ isRoomsTariffLimit,
+ maxCountRoomsByQuota,
+ usedRoomsCount,
+ isPaymentPageAvailable,
+ isArchiveFolderRoot,
+}: RoomsContentProps) => {
+ const { t } = useTranslation(["Payments", "Common", "MainBar"]);
+
+ const chooseNewPlan = (
+
+ {isPaymentPageAvailable
+ ? t("ChooseNewPlan")
+ : t("MainBar:ContactToUpgradeTariff", {
+ productName: t("Common:ProductName"),
+ })}
+
+ );
+
+ if (isRoomsTariffLimit)
+ return (
+ <>
+
+ {isArchiveFolderRoot
+ ? t("CannotRestoreRoom")
+ : t("CannotCreateNewRoom")}
+
+
+
+ {isArchiveFolderRoot
+ ? t("NotPossibleRoomRestoring")
+ : t("NewRoomWillExceedLimit")}
+
+
+ {chooseNewPlan}
+ >
+ );
+
+ return (
+ <>
+ {t("RoomsQuotaAlmostExhausted")}
+
+
+ {t("NumberOfRoomsAccordingToTariff", {
+ currentValue: usedRoomsCount,
+ maxValue: maxCountRoomsByQuota,
+ })}
+
+
+ {chooseNewPlan}
+ >
+ );
+};
+
+export default inject(({ currentQuotaStore, authStore, treeFoldersStore }) => {
+ const { isRoomsTariffLimit, maxCountRoomsByQuota, usedRoomsCount } =
+ currentQuotaStore;
+
+ const { isPaymentPageAvailable } = authStore;
+
+ const { isArchiveFolderRoot } = treeFoldersStore;
+
+ return {
+ isRoomsTariffLimit,
+ maxCountRoomsByQuota,
+ usedRoomsCount,
+ isPaymentPageAvailable,
+ isArchiveFolderRoot,
+ };
+})(observer(RoomsContent));
diff --git a/packages/client/src/components/dialogs/InviteQuotaWarningDialog/sub-components/UsersContent.tsx b/packages/client/src/components/dialogs/InviteQuotaWarningDialog/sub-components/UsersContent.tsx
new file mode 100644
index 0000000000..457bbe1314
--- /dev/null
+++ b/packages/client/src/components/dialogs/InviteQuotaWarningDialog/sub-components/UsersContent.tsx
@@ -0,0 +1,125 @@
+// (c) Copyright Ascensio System SIA 2009-2024
+//
+// This program is a free software product.
+// You can redistribute it and/or modify it under the terms
+// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
+// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
+// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
+// any third-party rights.
+//
+// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
+// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+//
+// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
+//
+// The interactive user interfaces in modified source and object code versions of the Program must
+// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
+//
+// Pursuant to Section 7(b) of the License you must retain the original Product logo when
+// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
+// trademark law for use of our trademarks.
+//
+// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
+// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
+// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+
+// (c) Copyright Ascensio System SIA 2009-2024
+//
+// This program is a free software product.
+// You can redistribute it and/or modify it under the terms
+// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
+// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
+// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
+// any third-party rights.
+//
+// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
+// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+//
+// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
+//
+// The interactive user interfaces in modified source and object code versions of the Program must
+// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
+//
+// Pursuant to Section 7(b) of the License you must retain the original Product logo when
+// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
+// trademark law for use of our trademarks.
+//
+// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
+// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
+// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+
+import { inject, observer } from "mobx-react";
+import { useTranslation } from "react-i18next";
+
+import { Text } from "@docspace/shared/components/text";
+
+export interface UsersContentProps {
+ isUserTariffLimit: boolean;
+ isPaymentPageAvailable: boolean;
+ addedManagersCount: number;
+ maxCountManagersByQuota: number;
+}
+
+const UsersContent = ({
+ isUserTariffLimit,
+ isPaymentPageAvailable,
+ addedManagersCount,
+ maxCountManagersByQuota,
+}: UsersContentProps) => {
+ const { t } = useTranslation(["Payments", "Common", "MainBar"]);
+
+ const chooseNewPlan = (
+
+ {isPaymentPageAvailable
+ ? t("ChooseNewPlan")
+ : t("MainBar:ContactToUpgradeTariff", {
+ productName: t("Common:ProductName"),
+ })}
+
+ );
+
+ if (isUserTariffLimit)
+ return (
+ <>
+ {t("CannotCreatePaidUsers")}
+
+ {t("NewUsersWillExceedMembersLimit")}
+
+ {chooseNewPlan}
+ >
+ );
+
+ return (
+ <>
+ {t("UsersQuotaAlmostExhausted")}
+
+
+ {t("NumberOfUsersAccordingToTariff", {
+ currentValue: addedManagersCount,
+ maxValue: maxCountManagersByQuota,
+ })}
+
+
+ {chooseNewPlan}
+ >
+ );
+};
+
+export default inject(({ currentQuotaStore, authStore }) => {
+ const {
+ isUserTariffLimit,
+
+ addedManagersCount,
+ maxCountManagersByQuota,
+ } = currentQuotaStore;
+ const { isPaymentPageAvailable } = authStore;
+
+ return {
+ isUserTariffLimit,
+ isPaymentPageAvailable,
+ addedManagersCount,
+ maxCountManagersByQuota,
+ };
+})(observer(UsersContent));
diff --git a/packages/client/src/components/dialogs/index.js b/packages/client/src/components/dialogs/index.js
index 945cd960d4..0509f6178a 100644
--- a/packages/client/src/components/dialogs/index.js
+++ b/packages/client/src/components/dialogs/index.js
@@ -49,7 +49,7 @@ import ChangePortalOwnerDialog from "./ChangePortalOwnerDialog";
import ChangeNameDialog from "./ChangeNameDialog";
import AvatarEditorDialog from "./AvatarEditorDialog";
import DeletePortalDialog from "./DeletePortalDialog";
-import InviteUsersWarningDialog from "./InviteUsersWarningDialog";
+import InviteQuotaWarningDialog from "./InviteQuotaWarningDialog";
import LogoutSessionDialog from "./LogoutSessionDialog";
import LogoutAllSessionDialog from "./LogoutAllSessionDialog";
import CreateRoomConfirmDialog from "./CreateRoomConfirmDialog";
@@ -98,7 +98,7 @@ export {
AvatarEditorDialog,
DeletePortalDialog,
LogoutSessionDialog,
- InviteUsersWarningDialog,
+ InviteQuotaWarningDialog,
LogoutAllSessionDialog,
PortalRenamingDialog,
DataReassignmentDialog,
diff --git a/packages/client/src/components/panels/InvitePanel/StyledInvitePanel.js b/packages/client/src/components/panels/InvitePanel/StyledInvitePanel.js
index cfaf7d7c74..203cff307e 100644
--- a/packages/client/src/components/panels/InvitePanel/StyledInvitePanel.js
+++ b/packages/client/src/components/panels/InvitePanel/StyledInvitePanel.js
@@ -56,7 +56,6 @@ const StyledInvitePanel = styled.div`
height: auto;
width: auto;
background: ${(props) => props.theme.infoPanel.blurColor};
- backdrop-filter: blur(3px);
z-index: 309;
position: fixed;
inset: 0;
@@ -182,7 +181,7 @@ const StyledRow = styled.div`
}
.combo-button-label {
- color: ${(props) => props.theme.text.disableColor};
+ color: ${(props) => props.theme.accessRightSelect.descriptionColor};
}
.combo-buttons_expander-icon path {
fill: ${(props) => props.theme.text.disableColor};
diff --git a/packages/client/src/components/panels/InvitePanel/index.js b/packages/client/src/components/panels/InvitePanel/index.js
index 7633df58a1..29047271a8 100644
--- a/packages/client/src/components/panels/InvitePanel/index.js
+++ b/packages/client/src/components/panels/InvitePanel/index.js
@@ -32,7 +32,7 @@ import React, {
useRef,
} from "react";
import { observer, inject } from "mobx-react";
-import { withTranslation } from "react-i18next";
+import { withTranslation, Trans } from "react-i18next";
import { DeviceType, EmployeeType } from "@docspace/shared/enums";
import { LOADER_TIMEOUT } from "@docspace/shared/constants";
@@ -60,6 +60,10 @@ import { Scrollbar } from "@docspace/shared/components/scrollbar";
import InfoBar from "./sub-components/InfoBar";
import InvitePanelLoader from "./sub-components/InvitePanelLoader";
+import { Link } from "@docspace/shared/components/link";
+import { Text } from "@docspace/shared/components/text";
+import { combineUrl } from "@docspace/shared/utils/combineUrl";
+import { ColorTheme, ThemeId } from "@docspace/shared/components/color-theme";
const InvitePanel = ({
folders,
@@ -81,6 +85,11 @@ const InvitePanel = ({
getUsersList,
filter,
currentDeviceType,
+ isRoomAdmin,
+ maxCountManagersByQuota,
+ invitePaidUsersCount,
+ setIsNewUserByCurrentUser,
+ setInvitePaidUsersCount,
}) => {
const [invitePanelIsLoding, setInvitePanelIsLoading] = useState(
roomId !== -1,
@@ -245,6 +254,55 @@ const InvitePanel = ({
return () => document.removeEventListener("keyup", onKeyPress);
});
+ const onClickPayments = () => {
+ const paymentPageUrl = combineUrl(
+ "/portal-settings",
+ "/payments/portal-payments",
+ );
+
+ toastr.clear();
+
+ window.DocSpace.navigate(paymentPageUrl);
+
+ setInvitePanelOptions({
+ visible: false,
+ hideSelector: false,
+ defaultAccess: 1,
+ });
+ };
+
+ const getError = () => {
+ const paymentLink = (
+
+ ),
+ }}
+ />
+ );
+
+ return (
+ <>
+
+ {t("Common:PaidUsersExceedsLimit", {
+ count: maxCountManagersByQuota + invitePaidUsersCount,
+ limit: maxCountManagersByQuota,
+ })}
+
+
+ {!isRoomAdmin && paymentLink}
+ >
+ );
+ };
const onClickSend = async (e) => {
const invitations = inviteItems.map((item) => {
let newItem = {};
@@ -276,7 +334,11 @@ const InvitePanel = ({
? await inviteUsers(data)
: await setRoomSecurity(roomId, data);
+ if (!isRooms) {
+ setIsNewUserByCurrentUser(true);
+ }
setIsLoading(false);
+ setInvitePaidUsersCount(0);
onClose();
toastr.success(t("Common:UsersInvited"));
@@ -289,7 +351,13 @@ const InvitePanel = ({
updateInfoPanelMembers(t);
}
} catch (err) {
- toastr.error(err);
+ let error = err;
+
+ if (err?.response?.status === 402) {
+ error = getError();
+ }
+
+ toastr.error(error);
setIsLoading(false);
} finally {
if (roomId === -1) {
@@ -462,6 +530,8 @@ export default inject(
filesStore,
dialogsStore,
infoPanelStore,
+ authStore,
+ currentQuotaStore,
}) => {
const { theme, currentDeviceType } = settingsStore;
@@ -480,11 +550,18 @@ export default inject(
setInviteItems,
setInvitePanelOptions,
setInviteLanguage,
+ invitePaidUsersCount,
+ setIsNewUserByCurrentUser,
+ setInvitePaidUsersCount,
} = dialogsStore;
const { getFolderInfo, setRoomSecurity, getRoomSecurityInfo, folders } =
filesStore;
+ const { isRoomAdmin } = authStore;
+
+ const { maxCountManagersByQuota } = currentQuotaStore;
+
return {
folders,
setInviteLanguage,
@@ -506,6 +583,11 @@ export default inject(
getUsersList,
filter,
currentDeviceType,
+ isRoomAdmin,
+ maxCountManagersByQuota,
+ invitePaidUsersCount,
+ setIsNewUserByCurrentUser,
+ setInvitePaidUsersCount,
};
},
)(
diff --git a/packages/client/src/components/panels/InvitePanel/sub-components/ExternalLinks.js b/packages/client/src/components/panels/InvitePanel/sub-components/ExternalLinks.js
index f2532fd9d1..885f3a57c4 100644
--- a/packages/client/src/components/panels/InvitePanel/sub-components/ExternalLinks.js
+++ b/packages/client/src/components/panels/InvitePanel/sub-components/ExternalLinks.js
@@ -38,9 +38,12 @@ import { IconButton } from "@docspace/shared/components/icon-button";
import { DropDown } from "@docspace/shared/components/drop-down";
import { DropDownItem } from "@docspace/shared/components/drop-down-item";
import { getDefaultAccessUser } from "@docspace/shared/utils/getDefaultAccessUser";
+import { ShareAccessRights } from "@docspace/shared/enums";
+import { Link } from "@docspace/shared/components/link";
+import { Text } from "@docspace/shared/components/text";
import AccessSelector from "../../../AccessSelector";
-
+import PaidQuotaLimitError from "../../../PaidQuotaLimitError";
import {
StyledBlock,
StyledSubHeader,
@@ -51,6 +54,8 @@ import {
} from "../StyledInvitePanel";
import { globalColors } from "@docspace/shared/themes";
+import { getFreeUsersRoleArray, getFreeUsersTypeArray } from "../utils";
+
const ExternalLinks = ({
t,
roomId,
@@ -66,6 +71,7 @@ const ExternalLinks = ({
activeLink,
isMobileView,
getPortalInviteLink,
+ isUserTariffLimit,
}) => {
const [isLinksToggling, setIsLinksToggling] = useState(false);
@@ -89,7 +95,7 @@ const ExternalLinks = ({
copyLink(link.shareLink);
}
} else {
- !externalLinksVisible ? editLink() : disableLink();
+ !externalLinksVisible ? await editLink() : await disableLink();
}
onChangeExternalLinksVisible(!externalLinksVisible);
} catch (error) {
@@ -99,9 +105,10 @@ const ExternalLinks = ({
}
};
- const disableLink = () => {
- setInvitationLinks(roomId, "Invite", 0, shareLinks[0].id);
- setShareLinks([]);
+ const disableLink = async () => {
+ shareLinks?.length &&
+ (await setInvitationLinks(roomId, "Invite", 0, shareLinks[0].id));
+ return setShareLinks([]);
};
const editLink = async () => {
@@ -121,19 +128,21 @@ const ExternalLinks = ({
copyLink(shareLink);
setShareLinks([activeLink]);
- setActiveLink(activeLink);
+ return setActiveLink(activeLink);
};
const onSelectAccess = async (access) => {
let link = null;
- if (roomId === -1) {
- link = shareLinks.find((l) => l.access === access.access);
+ const selectedAccess = access.access;
- link.shareLink = await getPortalInviteLink(access.access);
+ if (roomId === -1) {
+ link = shareLinks.find((l) => l.access === selectedAccess);
+
+ link.shareLink = await getPortalInviteLink(selectedAccess);
setActiveLink(link);
} else {
- setInvitationLinks(roomId, "Invite", +access.access, shareLinks[0].id);
+ setInvitationLinks(roomId, "Invite", +selectedAccess, shareLinks[0].id);
link = shareLinks[0];
setActiveLink(shareLinks[0]);
@@ -200,6 +209,9 @@ const ExternalLinks = ({
[closeActionLinks],
);
+ const availableAccess =
+ roomId === -1 ? getFreeUsersTypeArray() : getFreeUsersRoleArray();
+
return (
@@ -268,6 +280,9 @@ const ExternalLinks = ({
containerRef={inputsRef}
isOwner={isOwner}
isMobileView={isMobileView}
+ isSelectionDisabled={isUserTariffLimit}
+ selectionErrorText={ }
+ availableAccess={availableAccess}
/>
)}
@@ -276,12 +291,13 @@ const ExternalLinks = ({
};
export default inject(
- ({ userStore, dialogsStore, filesStore, peopleStore }) => {
+ ({ userStore, dialogsStore, filesStore, peopleStore, currentQuotaStore }) => {
const { isOwner } = userStore.user;
const { invitePanelOptions } = dialogsStore;
const { setInvitationLinks } = filesStore;
const { roomId, hideSelector, defaultAccess } = invitePanelOptions;
const { getPortalInviteLink } = peopleStore.inviteLinksStore;
+ const { isUserTariffLimit } = currentQuotaStore;
return {
setInvitationLinks,
@@ -290,6 +306,7 @@ export default inject(
defaultAccess,
isOwner,
getPortalInviteLink,
+ isUserTariffLimit,
};
},
)(observer(ExternalLinks));
diff --git a/packages/client/src/components/panels/InvitePanel/sub-components/InviteInput.js b/packages/client/src/components/panels/InvitePanel/sub-components/InviteInput.js
index ba84904bda..12ed29495f 100644
--- a/packages/client/src/components/panels/InvitePanel/sub-components/InviteInput.js
+++ b/packages/client/src/components/panels/InvitePanel/sub-components/InviteInput.js
@@ -42,6 +42,7 @@ import BetaBadge from "../../../BetaBadgeWrapper";
import { getMembersList } from "@docspace/shared/api/people";
import {
AccountsSearchArea,
+ EmployeeType,
RoomsType,
ShareAccessRights,
} from "@docspace/shared/enums";
@@ -50,7 +51,7 @@ import { isBetaLanguage } from "@docspace/shared/utils";
import { checkIfAccessPaid } from "SRC_DIR/helpers";
import AddUsersPanel from "../../AddUsersPanel";
-import { getAccessOptions, getTopFreeRole } from "../utils";
+import { getAccessOptions, getTopFreeRole, isPaidUserRole } from "../utils";
import AccessSelector from "../../../AccessSelector";
import {
@@ -68,6 +69,7 @@ import {
import AtReactSvgUrl from "PUBLIC_DIR/images/@.react.svg?url";
import ArrowIcon from "PUBLIC_DIR/images/arrow.right.react.svg";
+import PaidQuotaLimitError from "SRC_DIR/components/PaidQuotaLimitError";
const minSearchValue = 2;
@@ -92,6 +94,9 @@ const InviteInput = ({
i18n,
setCultureKey,
standalone,
+ isPaidUserAccess,
+ setInvitePaidUsersCount,
+ isUserTariffLimit,
}) => {
const isPublicRoomType = roomType === RoomsType.PublicRoom;
@@ -131,24 +136,66 @@ const InviteInput = ({
const toUserItems = (query) => {
const addresses = parseAddresses(query);
const uid = () => Math.random().toString(36).slice(-6);
+ let userAccess = selectedAccess;
+
+ const isAccounts = roomId === -1;
+ const isPaidAccess = isAccounts
+ ? isPaidUserAccess(userAccess)
+ : isPaidUserRole(userAccess);
if (addresses.length > 1) {
- return addresses.map((address) => {
+ let isShowErrorToast = false;
+
+ const itemsArray = addresses.map((address) => {
+ if (isPaidAccess) {
+ if (isUserTariffLimit) {
+ const FreeUser = isAccounts
+ ? EmployeeType.Guest
+ : getTopFreeRole(t, roomType)?.access;
+
+ if (FreeUser) {
+ userAccess = FreeUser;
+ isShowErrorToast = true;
+ }
+ } else {
+ setInvitePaidUsersCount();
+ }
+ }
+
return {
email: address.email,
id: uid(),
- access: selectedAccess,
+ access: userAccess,
displayName: address.email,
errors: address.parseErrors,
isEmailInvite: true,
};
});
+
+ if (isShowErrorToast) toastr.error( );
+
+ return itemsArray;
+ }
+
+ if (isPaidAccess) {
+ if (isUserTariffLimit) {
+ const FreeUser = isAccounts
+ ? EmployeeType.Guest
+ : getTopFreeRole(t, roomType)?.access;
+
+ if (FreeUser) {
+ userAccess = FreeUser;
+ toastr.error( );
+ }
+ } else {
+ setInvitePaidUsersCount();
+ }
}
return {
email: addresses[0].email,
id: uid(),
- access: selectedAccess,
+ access: userAccess,
displayName: addresses[0].email,
errors: addresses[0].parseErrors,
isEmailInvite: true,
@@ -219,10 +266,15 @@ const InviteInput = ({
};
const removeExist = (items) => {
- const filtered = items.reduce((unique, o) => {
- !unique.some((obj) =>
- obj.isGroup ? obj.id === o.id : obj.email === o.email,
- ) && unique.push(o);
+ const filtered = items.reduce((unique, current) => {
+ const isUnique = !unique.some((obj) =>
+ obj.isGroup ? obj.id === current.id : obj.email === current.email,
+ );
+
+ if (!isUnique && isPaidUserAccess(current.access))
+ setInvitePaidUsersCount(-1);
+
+ isUnique && unique.push(current);
return unique;
}, []);
@@ -260,6 +312,18 @@ const InviteInput = ({
});
}
+ if (
+ isUserTariffLimit &&
+ item.isVisitor &&
+ isPaidUserRole(item.access)
+ ) {
+ const freeRole = getTopFreeRole(t, roomType)?.access;
+
+ if (freeRole) {
+ item.access = freeRole;
+ toastr.error( );
+ }
+ }
const items = removeExist([item, ...inviteItems]);
setInviteItems(items);
}
@@ -320,6 +384,19 @@ const InviteInput = ({
roleName: topFreeRole.label,
});
}
+
+ if (
+ isUserTariffLimit &&
+ (!u.avatar || u.isVisitor) &&
+ isPaidUserRole(u.access)
+ ) {
+ const freeRole = getTopFreeRole(t, roomType)?.access;
+
+ if (freeRole) {
+ u.access = freeRole;
+ toastr.error( );
+ }
+ }
});
const items = [...users, ...inviteItems];
@@ -551,6 +628,10 @@ const InviteInput = ({
containerRef={inputsRef}
isOwner={isOwner}
isMobileView={isMobileView}
+ {...(roomId === -1 && {
+ isSelectionDisabled: isUserTariffLimit,
+ selectionErrorText: ,
+ })}
/>
{!hideSelector && addUsersPanelVisible && (
@@ -578,31 +659,38 @@ const InviteInput = ({
);
};
-export default inject(({ settingsStore, dialogsStore, userStore }) => {
- const { isOwner } = userStore.user;
- const {
- invitePanelOptions,
- setInviteItems,
- inviteItems,
- setInviteLanguage,
- culture,
- } = dialogsStore;
+export default inject(
+ ({ settingsStore, dialogsStore, userStore, currentQuotaStore }) => {
+ const { isOwner } = userStore.user;
+ const {
+ invitePanelOptions,
+ setInviteItems,
+ inviteItems,
+ setInviteLanguage,
+ culture,
+ setInvitePaidUsersCount,
+ isPaidUserAccess,
+ } = dialogsStore;
- const { culture: language, standalone } = settingsStore;
-
- return {
- language,
- setInviteLanguage,
- setInviteItems,
- inviteItems,
- culture,
- roomId: invitePanelOptions.roomId,
- hideSelector: invitePanelOptions.hideSelector,
- defaultAccess: invitePanelOptions.defaultAccess,
- isOwner,
- standalone,
- };
-})(
+ const { culture: language, standalone } = settingsStore;
+ const { isUserTariffLimit } = currentQuotaStore;
+ return {
+ language,
+ setInviteLanguage,
+ setInviteItems,
+ inviteItems,
+ culture,
+ roomId: invitePanelOptions.roomId,
+ hideSelector: invitePanelOptions.hideSelector,
+ defaultAccess: invitePanelOptions.defaultAccess,
+ isOwner,
+ standalone,
+ isPaidUserAccess,
+ setInvitePaidUsersCount,
+ isUserTariffLimit,
+ };
+ },
+)(
withCultureNames(
withTranslation(["InviteDialog", "Common", "Translations"])(
observer(InviteInput),
diff --git a/packages/client/src/components/panels/InvitePanel/sub-components/Item.js b/packages/client/src/components/panels/InvitePanel/sub-components/Item.js
index 166401fc6a..cdede230f0 100644
--- a/packages/client/src/components/panels/InvitePanel/sub-components/Item.js
+++ b/packages/client/src/components/panels/InvitePanel/sub-components/Item.js
@@ -27,14 +27,20 @@
import InfoEditReactSvgUrl from "PUBLIC_DIR/images/info.edit.react.svg?url";
import AtReactSvgUrl from "PUBLIC_DIR/images/@.react.svg?url";
import AlertSvgUrl from "PUBLIC_DIR/images/icons/12/alert.react.svg?url";
+
import React, { useState, useEffect } from "react";
+import { inject, observer } from "mobx-react";
+
import { Avatar } from "@docspace/shared/components/avatar";
import { Text } from "@docspace/shared/components/text";
-
import { parseAddresses } from "@docspace/shared/utils";
-import { getAccessOptions } from "../utils";
import { getUserTypeLabel } from "@docspace/shared/utils/common";
+import {
+ getAccessOptions,
+ getFreeUsersRoleArray,
+ getFreeUsersTypeArray,
+} from "../utils";
import {
StyledEditInput,
StyledEditButton,
@@ -47,6 +53,8 @@ import {
import { filterGroupRoleOptions, filterUserRoleOptions } from "SRC_DIR/helpers";
import AccessSelector from "../../../AccessSelector";
+import PaidQuotaLimitError from "SRC_DIR/components/PaidQuotaLimitError";
+
const Item = ({
t,
item,
@@ -61,6 +69,10 @@ const Item = ({
setIsOpenItemAccess,
isMobileView,
standalone,
+ isPaidUserAccess,
+ setInvitePaidUsersCount,
+ isUserTariffLimit,
+ roomId,
}) => {
const {
avatar,
@@ -72,6 +84,7 @@ const Item = ({
isGroup,
name: groupName,
warning,
+ isVisitor,
} = item;
const name = isGroup
@@ -162,7 +175,9 @@ const Item = ({
const errors = !!parseErrors.length ? parseErrors : [];
setParseErrors(errors);
- changeInviteItem({ id, email: value, errors }).then(() => errorsInList());
+ changeInviteItem({ id, email: value, errors, access }).then(() =>
+ errorsInList(),
+ );
};
const changeValue = (e) => {
@@ -176,6 +191,8 @@ const Item = ({
const removeItem = () => {
const newItems = inviteItems.filter((item) => item.id !== id);
+ if (isPaidUserAccess(item.access)) setInvitePaidUsersCount(-1);
+
setInviteItems(newItems);
};
@@ -187,6 +204,9 @@ const Item = ({
const textProps = !!avatar || isGroup ? {} : { onClick: onEdit };
+ const availableAccess =
+ roomId === -1 ? getFreeUsersTypeArray() : getFreeUsersRoleArray();
+
const displayBody = (
<>
@@ -247,6 +267,11 @@ const Item = ({
setIsOpenItemAccess={setIsOpenItemAccess}
isMobileView={isMobileView}
noBorder
+ {...((roomId === -1 || !avatar || isVisitor) && {
+ isSelectionDisabled: isUserTariffLimit,
+ selectionErrorText: ,
+ availableAccess,
+ })}
/>
>
)}
@@ -278,4 +303,15 @@ const Item = ({
);
};
-export default Item;
+export default inject(({ dialogsStore, currentQuotaStore }) => {
+ const { isPaidUserAccess, setInvitePaidUsersCount, invitePanelOptions } =
+ dialogsStore;
+ const { isUserTariffLimit } = currentQuotaStore;
+
+ return {
+ isPaidUserAccess,
+ setInvitePaidUsersCount,
+ isUserTariffLimit,
+ roomId: invitePanelOptions.roomId,
+ };
+})(observer(Item));
diff --git a/packages/client/src/components/panels/InvitePanel/utils/index.js b/packages/client/src/components/panels/InvitePanel/utils/index.js
index a08e7d37a4..08aa895e86 100644
--- a/packages/client/src/components/panels/InvitePanel/utils/index.js
+++ b/packages/client/src/components/panels/InvitePanel/utils/index.js
@@ -259,3 +259,25 @@ export const getTopFreeRole = (t, roomType) => {
);
return freeAccesses[0];
};
+
+export const isPaidUserRole = (selectedAccess) => {
+ return (
+ selectedAccess === ShareAccessRights.FullAccess ||
+ selectedAccess === ShareAccessRights.Collaborator ||
+ selectedAccess === ShareAccessRights.RoomManager
+ );
+};
+
+export const getFreeUsersTypeArray = () => {
+ return [EmployeeType.Guest];
+};
+
+export const getFreeUsersRoleArray = () => {
+ return [
+ ShareAccessRights.Comment,
+ ShareAccessRights.Editing,
+ ShareAccessRights.FormFilling,
+ ShareAccessRights.ReadOnly,
+ ShareAccessRights.Review,
+ ];
+};
diff --git a/packages/client/src/helpers/confirmRoute.js b/packages/client/src/helpers/confirmRoute.js
deleted file mode 100644
index 0a3a784f9f..0000000000
--- a/packages/client/src/helpers/confirmRoute.js
+++ /dev/null
@@ -1,258 +0,0 @@
-// (c) Copyright Ascensio System SIA 2009-2024
-//
-// This program is a free software product.
-// You can redistribute it and/or modify it under the terms
-// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
-// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
-// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
-// any third-party rights.
-//
-// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
-// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
-// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
-//
-// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
-//
-// The interactive user interfaces in modified source and object code versions of the Program must
-// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
-//
-// Pursuant to Section 7(b) of the License you must retain the original Product logo when
-// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
-// trademark law for use of our trademarks.
-//
-// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
-// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
-// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
-
-import React from "react";
-import { useLocation, Navigate } from "react-router-dom";
-import { inject, observer } from "mobx-react";
-import { useTranslation } from "react-i18next";
-
-import { Loader } from "@docspace/shared/components/loader";
-import Section from "@docspace/shared/components/section";
-import { checkConfirmLink } from "@docspace/shared/api/user"; //TODO: Move AuthStore
-import { getObjectByLocation } from "@docspace/shared/utils/common";
-import { combineUrl } from "@docspace/shared/utils/combineUrl";
-
-import SectionWrapper from "SRC_DIR/components/Section";
-import { AuthenticatedAction, ValidationResult } from "SRC_DIR/helpers/enums";
-import { getCookie } from "@docspace/shared/utils";
-import { LANGUAGE } from "@docspace/shared/constants";
-
-const ConfirmRoute = ({
- doAuthenticated,
- isAuthenticated,
- storeIsLoaded,
- logout,
- defaultPage,
- children,
- culture,
-}) => {
- const { i18n } = useTranslation(["Confirm", "Common", "Wizard"]);
-
- const [state, setState] = React.useState({
- linkData: {},
- isLoaded: false,
- roomData: {},
- });
-
- React.useEffect(() => {
- if (location.search.includes("culture")) return;
- const lng = getCookie(LANGUAGE);
-
- storeIsLoaded && i18n.changeLanguage(lng);
- }, [storeIsLoaded]);
-
- const location = useLocation();
-
- const getData = React.useCallback(() => {
- const queryParams = getObjectByLocation(location);
- const url = location.pathname;
- const posSeparator = url.lastIndexOf("/");
-
- const type = !!posSeparator ? url?.slice(posSeparator + 1) : "";
- const confirmLinkData = Object.assign({ type }, queryParams);
-
- return { type, confirmLinkData };
- }, [location.pathname]);
-
- const { type, confirmLinkData } = getData();
-
- if (!type && confirmLinkData.type)
- return (
-
- );
-
- React.useEffect(() => {
- if (!storeIsLoaded) return;
-
- if (isAuthenticated && doAuthenticated != AuthenticatedAction.None) {
- if (doAuthenticated == AuthenticatedAction.Redirect)
- return window.location.replace(defaultPage);
-
- if (doAuthenticated == AuthenticatedAction.Logout) logout(false);
- }
-
- const { search } = location;
-
- const { confirmLinkData } = getData();
-
- let path = "";
- if (!isAuthenticated) {
- path = "/login";
- }
-
- checkConfirmLink(confirmLinkData)
- .then((res) => {
- const validationResult = res.result;
-
- switch (validationResult) {
- case ValidationResult.Ok:
- const confirmHeader = search.slice(1);
- const linkData = {
- ...confirmLinkData,
- confirmHeader,
- };
-
- const roomData = {
- roomId: res?.roomId,
- title: res?.title,
- };
-
- console.log("checkConfirmLink", {
- confirmLinkData,
- validationResult,
- linkData,
- });
-
- setState((val) => ({ ...val, isLoaded: true, linkData, roomData }));
- break;
- case ValidationResult.UserExisted:
- const finalUrl = res?.roomId
- ? `/rooms/shared/${res?.roomId}/filter?folder=${res?.roomId}`
- : defaultPage;
-
- console.log("user already exists", {
- confirmLinkData,
- validationResult,
- finalUrl,
- });
-
- window.location.replace(finalUrl);
- break;
- case ValidationResult.Invalid:
- console.error("invalid link", {
- confirmLinkData,
- validationResult,
- });
- window.location.href = combineUrl(
- window.ClientConfig?.proxy?.url,
- path,
- "/error?messageKey=21",
- );
-
- break;
- case ValidationResult.Expired:
- console.error("expired link", {
- confirmLinkData,
- validationResult,
- });
- window.location.href = combineUrl(
- window.ClientConfig?.proxy?.url,
- path,
- "/error",
- );
- break;
- case ValidationResult.TariffLimit:
- console.error("tariff limit", {
- confirmLinkData,
- validationResult,
- });
- window.location.href = combineUrl(
- window.ClientConfig?.proxy?.url,
- path,
- "/error?messageKey=20",
- );
- break;
- case ValidationResult.QuotaFailed:
- console.error("access below quota", {
- confirmLinkData,
- validationResult,
- });
- window.location.href = combineUrl(
- window.ClientConfig?.proxy?.url,
- path,
- "/error",
- );
- break;
- case ValidationResult.UserExcluded:
- console.error("user excluded", {
- confirmLinkData,
- validationResult,
- });
- window.location.replace(defaultPage);
- break;
- default:
- console.error("unknown link", {
- confirmLinkData,
- validationResult,
- });
- window.location.href = combineUrl(
- window.ClientConfig?.proxy?.url,
- path,
- "/error",
- );
- break;
- }
- })
- .catch((error) => {
- if (error?.response?.status === 403) {
- window.DocSpace.navigate("/access-restricted", {
- state: { isRestrictionError: true },
- replace: true,
- });
-
- return;
- }
-
- console.error("FAILED checkConfirmLink", { error, confirmLinkData });
- window.location.href = combineUrl(
- window.ClientConfig?.proxy?.url,
- path,
- "/error",
- );
- });
- }, [getData, doAuthenticated, isAuthenticated, storeIsLoaded, logout]);
-
- // console.log(`ConfirmRoute render`, this.props, this.state);
-
- return !state.isLoaded ? (
-
-
-
-
-
- ) : (
- React.cloneElement(children, {
- linkData: state.linkData,
- roomData: state.roomData,
- })
- );
-};
-
-ConfirmRoute.defaultProps = {
- doAuthenticated: AuthenticatedAction.None,
-};
-
-export default inject(({ authStore, settingsStore }) => {
- const { isAuthenticated, logout, isLoaded } = authStore;
- const { defaultPage, culture } = settingsStore;
- return {
- isAuthenticated,
- logout,
- storeIsLoaded: isLoaded,
- defaultPage,
- culture,
- };
-})(observer(ConfirmRoute));
diff --git a/packages/client/src/helpers/constants.js b/packages/client/src/helpers/constants.js
index c40d85552f..4d7dff3c61 100644
--- a/packages/client/src/helpers/constants.js
+++ b/packages/client/src/helpers/constants.js
@@ -85,7 +85,7 @@ export const TableVersions = Object.freeze({
Files: "3",
People: "3",
Trash: "4",
- Groups: "5",
+ Groups: "6",
InsideGroup: "6",
Recent: "1",
});
@@ -96,13 +96,19 @@ export const TableVersions = Object.freeze({
*/
export const QuotaBarTypes = Object.freeze({
ConfirmEmail: "confirm-email",
- RoomQuota: "room-quota",
- StorageQuota: "storage-quota",
- UserQuota: "user-quota",
- UserAndStorageQuota: "user-storage-quota",
- RoomAndStorageQuota: "room-storage-quota",
+ RoomsTariff: "room-quota",
+ RoomsTariffLimit: "room-quota-limit",
+ StorageTariff: "storage-quota",
+ StorageTariffLimit: "storage-quota-limit",
+ UsersTariff: "user-quota",
+ UsersTariffLimit: "user-quota-limit",
+ UserAndStorageTariff: "user-storage-quota",
+ UserAndStorageTariffLimit: "user-storage-quota-limit",
+ RoomsAndStorageTariff: "room-storage-quota",
+ RoomsAndStorageTariffLimit: "room-storage-quota-limit",
PersonalUserQuota: "personal-user-quota",
- TenantCustomQuota: "tenant-custom-quota",
+ StorageQuota: "tenant-custom-quota",
+ StorageQuotaLimit: "tenant-custom-quota-limit",
});
export const BINDING_POST = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST";
@@ -163,3 +169,14 @@ export const SortByFieldName = Object.freeze({
LastOpened: "LastOpened",
UsedSpace: "usedspace",
});
+
+export const ThirdPartyServicesUrlName = Object.freeze({
+ GoogleDrive: "google",
+ Box: "box",
+ Dropbox: "dropbox",
+ OneDrive: "skydrive",
+ Nextcloud: "nextcloud",
+ kDrive: "kdrive",
+ ownCloud: "owncloud",
+ WebDav: "webdav",
+});
diff --git a/packages/client/src/pages/About/AboutContent.js b/packages/client/src/pages/About/AboutContent.js
index 4b0e27285f..eb462d49c1 100644
--- a/packages/client/src/pages/About/AboutContent.js
+++ b/packages/client/src/pages/About/AboutContent.js
@@ -125,7 +125,7 @@ const AboutContent = (props) => {
? previewData.address
: companyInfoSettingsData?.address;
- const logo = getLogoUrl(WhiteLabelLogoType.AboutPage, !theme.isBase);
+ const logo = getLogoUrl(WhiteLabelLogoType.AboutPage, !theme.isBase, true);
return (
companyInfoSettingsData && (
diff --git a/packages/client/src/pages/Home/Hooks/useFiles.js b/packages/client/src/pages/Home/Hooks/useFiles.js
index 2f7ac09b6e..f4e4a4baae 100644
--- a/packages/client/src/pages/Home/Hooks/useFiles.js
+++ b/packages/client/src/pages/Home/Hooks/useFiles.js
@@ -52,7 +52,7 @@ const useFiles = ({
dragging,
setDragging,
disableDrag,
- uploadEmptyFolders,
+ createFoldersTree,
startUpload,
fetchFiles,
@@ -118,16 +118,9 @@ const useFiles = ({
if (disableDrag) return;
- const emptyFolders = files.filter((f) => f.isEmptyDirectory);
-
- if (emptyFolders.length > 0) {
- uploadEmptyFolders(emptyFolders, uploadToFolder).then(() => {
- const onlyFiles = files.filter((f) => !f.isEmptyDirectory);
- if (onlyFiles.length > 0) startUpload(onlyFiles, uploadToFolder, t);
- });
- } else {
- startUpload(files, uploadToFolder, t);
- }
+ createFoldersTree(files, uploadToFolder).then((f) => {
+ if (f.length > 0) startUpload(f, null, t);
+ });
};
React.useEffect(() => {
diff --git a/packages/client/src/pages/Home/Hooks/useOperations.js b/packages/client/src/pages/Home/Hooks/useOperations.js
index 0448db8116..31682866cb 100644
--- a/packages/client/src/pages/Home/Hooks/useOperations.js
+++ b/packages/client/src/pages/Home/Hooks/useOperations.js
@@ -41,7 +41,7 @@ const useOperations = ({
itemsSelectionTitle,
secondaryProgressDataStoreIcon,
itemsSelectionLength,
-
+ disableUploadPanelOpen,
setItemsSelectionTitle,
}) => {
const prevProps = React.useRef({
@@ -74,6 +74,7 @@ const useOperations = ({
}, [isProgressFinished]);
const showUploadPanel = () => {
+ if (disableUploadPanelOpen) return;
setUploadPanelVisible(true);
if (primaryProgressDataVisible && uploaded && converted)
diff --git a/packages/client/src/pages/Home/InfoPanel/Body/styles/common.js b/packages/client/src/pages/Home/InfoPanel/Body/styles/common.js
index 974322015f..099337881c 100644
--- a/packages/client/src/pages/Home/InfoPanel/Body/styles/common.js
+++ b/packages/client/src/pages/Home/InfoPanel/Body/styles/common.js
@@ -242,7 +242,6 @@ const StyledProperties = styled.div`
gap: 4px;
.property-tag {
- background: red;
max-width: 195px;
margin: 0;
background: ${(props) => props.theme.infoPanel.details.tagBackground};
diff --git a/packages/client/src/pages/Home/InfoPanel/Body/sub-components/ItemTitle/Rooms/index.js b/packages/client/src/pages/Home/InfoPanel/Body/sub-components/ItemTitle/Rooms/index.js
index d96f23599d..8731e1039b 100644
--- a/packages/client/src/pages/Home/InfoPanel/Body/sub-components/ItemTitle/Rooms/index.js
+++ b/packages/client/src/pages/Home/InfoPanel/Body/sub-components/ItemTitle/Rooms/index.js
@@ -47,7 +47,7 @@ const RoomsItemHeader = ({
setIsMobileHidden,
isGracePeriod,
setInvitePanelOptions,
- setInviteUsersWarningDialogVisible,
+ setQuotaWarningDialogVisible,
roomsView,
setSelection,
setBufferSelection,
@@ -86,7 +86,7 @@ const RoomsItemHeader = ({
const parentRoomId = infoPanelSelection.id;
if (isGracePeriod) {
- setInviteUsersWarningDialogVisible(true);
+ setQuotaWarningDialogVisible(true);
return;
}
@@ -188,8 +188,7 @@ export default inject(
isGracePeriod: currentTariffStatusStore.isGracePeriod,
setInvitePanelOptions: dialogsStore.setInvitePanelOptions,
- setInviteUsersWarningDialogVisible:
- dialogsStore.setInviteUsersWarningDialogVisible,
+ setQuotaWarningDialogVisible: dialogsStore.setQuotaWarningDialogVisible,
setSelection: filesStore.setSelection,
setBufferSelection: filesStore.setBufferSelection,
diff --git a/packages/client/src/pages/Home/InfoPanel/Body/views/History/HistoryBlockContent/ItemList.tsx b/packages/client/src/pages/Home/InfoPanel/Body/views/History/HistoryBlockContent/ItemList.tsx
index f26e217408..44d887c91f 100644
--- a/packages/client/src/pages/Home/InfoPanel/Body/views/History/HistoryBlockContent/ItemList.tsx
+++ b/packages/client/src/pages/Home/InfoPanel/Body/views/History/HistoryBlockContent/ItemList.tsx
@@ -69,9 +69,10 @@ export const HistoryItemList = ({
getInfoPanelItemIcon,
checkAndOpenLocationAction,
}: HistoryItemListProps) => {
- const [isExpanded, setIsExpanded] = useState(
- 1 + feed.related.length <= EXPANSION_THRESHOLD,
- );
+ const totalItems = feed.related.length + 1;
+ const isExpandable = totalItems > EXPANSION_THRESHOLD;
+ const [isExpanded, setIsExpanded] = useState(!isExpandable);
+
const onExpand = () => setIsExpanded(true);
const items = [
@@ -151,7 +152,7 @@ export const HistoryItemList = ({
)}
- {!isExpanded && (
+ {isExpandable && !isExpanded && (
{
fetchPublicRoom,
isPublicRoom,
openUrl,
+ autoPlay,
} = props;
const navigate = useNavigate();
@@ -285,6 +286,7 @@ const FilesMediaViewer = (props) => {
files={files}
getIcon={getIcon}
visible={visible}
+ autoPlay={autoPlay}
playlist={playlist}
prevMedia={prevMedia}
nextMedia={nextMedia}
@@ -379,6 +381,7 @@ export default inject(
nextMedia,
prevMedia,
changeUrl,
+ autoPlay,
} = mediaViewerDataStore;
const { deleteItemAction } = filesActionsStore;
const { getIcon, extsImagePreviewed, extsMediaPreviewed } =
@@ -423,6 +426,7 @@ export default inject(
return {
files,
+ autoPlay,
playlist,
currentPostionIndex,
nextMedia,
diff --git a/packages/client/src/pages/Home/Section/AccountsBody/EmptyScreen.js b/packages/client/src/pages/Home/Section/AccountsBody/EmptyScreen.js
index d5a86b17cf..9394d1ecb4 100644
--- a/packages/client/src/pages/Home/Section/AccountsBody/EmptyScreen.js
+++ b/packages/client/src/pages/Home/Section/AccountsBody/EmptyScreen.js
@@ -42,6 +42,7 @@ const EmptyScreen = ({
resetInsideGroupFilter,
setIsLoading,
theme,
+ isEmptyGroup = false,
}) => {
const { t } = useTranslation(["People", "Common"]);
const isPeopleAccounts = window.location.pathname.includes("accounts/people");
@@ -57,6 +58,17 @@ const EmptyScreen = ({
const imageSrc = theme.isBase
? EmptyScreenPersonSvgUrl
: EmptyScreenPersonSvgDarkUrl;
+
+ if (isEmptyGroup) {
+ return (
+
+ );
+ }
+
return (
<>
+ {peopleAccountsGroupsColumnIsEnabled ? (
+
+
+ {item.membersCount}
+
+
+ ) : (
+
+ )}
+
{managerAccountsGroupsColumnIsEnabled ? (
{
const ref = useRef(null);
@@ -110,6 +111,9 @@ const GroupsTableView = ({
managerAccountsGroupsColumnIsEnabled={
managerAccountsGroupsColumnIsEnabled
}
+ peopleAccountsGroupsColumnIsEnabled={
+ peopleAccountsGroupsColumnIsEnabled
+ }
/>
))}
@@ -155,7 +159,10 @@ export default inject(
const { isVisible: infoPanelVisible } = infoPanelStore;
- const { managerAccountsGroupsColumnIsEnabled } = tableStore;
+ const {
+ managerAccountsGroupsColumnIsEnabled,
+ peopleAccountsGroupsColumnIsEnabled,
+ } = tableStore;
return {
groups,
@@ -177,6 +184,7 @@ export default inject(
groupsIsFiltered,
groupsFilterTotal,
+ peopleAccountsGroupsColumnIsEnabled,
managerAccountsGroupsColumnIsEnabled,
};
},
diff --git a/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/RowView/PeopleRowContainer.js b/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/RowView/PeopleRowContainer.js
index ecf5f6dc21..85a56d7d50 100644
--- a/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/RowView/PeopleRowContainer.js
+++ b/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/RowView/PeopleRowContainer.js
@@ -85,6 +85,7 @@ const PeopleRowContainer = ({
infoPanelVisible,
withPaging,
currentDeviceType,
+ insideGroupIsFiltered,
}) => {
useViewEffect({
view: accountsViewAs,
@@ -113,7 +114,7 @@ const PeopleRowContainer = ({
))}
) : (
-
+
);
};
@@ -126,7 +127,7 @@ export default inject(({ peopleStore, filesStore, settingsStore }) => {
} = peopleStore;
const { theme, withPaging, currentDeviceType } = settingsStore;
const { isVisible: infoPanelVisible } = infoPanelStore;
- const { currentGroup } = peopleStore.groupsStore;
+ const { currentGroup, insideGroupIsFiltered } = peopleStore.groupsStore;
const { peopleList } = usersStore;
return {
@@ -138,5 +139,6 @@ export default inject(({ peopleStore, filesStore, settingsStore }) => {
infoPanelVisible,
withPaging,
currentDeviceType,
+ insideGroupIsFiltered,
};
})(observer(PeopleRowContainer));
diff --git a/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/TableView/TableContainer.js b/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/TableView/TableContainer.js
index 14b763f321..398f0cb764 100644
--- a/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/TableView/TableContainer.js
+++ b/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/TableView/TableContainer.js
@@ -141,6 +141,7 @@ const Table = ({
insideGroupIsLoading,
fetchMoreInsideGroupUsers,
insideGroupFilterTotal,
+ insideGroupIsFiltered,
hasMoreInsideGroupUsers,
}) => {
const ref = useRef(null);
@@ -161,7 +162,7 @@ const Table = ({
const isEmptyPage = !insideGroupIsLoading && peopleList.length === 0;
return isEmptyPage ? (
-
+
) : (
{
getHeaderOptions,
setBufferSelection,
setGroupsBufferSelection,
+ createFoldersTree,
} = props;
const location = useLocation();
@@ -221,8 +223,12 @@ const SectionHeaderContent = (props) => {
const isSettingsPage = location.pathname.includes("/settings");
const onFileChange = React.useCallback(
- (e) => {
- startUpload(e.target.files, null, t);
+ async (e) => {
+ const files = await getFilesFromEvent(e);
+
+ createFoldersTree(files).then((f) => {
+ if (f.length > 0) startUpload(f, null, t);
+ });
},
[startUpload, t],
);
@@ -621,6 +627,7 @@ export default inject(
moveToRoomsPage,
onClickBack,
moveToPublicRoom,
+ createFoldersTree,
} = filesActionsStore;
const { setIsVisible, isVisible } = infoPanelStore;
@@ -784,6 +791,7 @@ export default inject(
getHeaderOptions,
setBufferSelection,
setGroupsBufferSelection,
+ createFoldersTree,
};
},
)(
diff --git a/packages/client/src/pages/Home/index.js b/packages/client/src/pages/Home/index.js
index bb2eccef04..0e745dab0f 100644
--- a/packages/client/src/pages/Home/index.js
+++ b/packages/client/src/pages/Home/index.js
@@ -82,7 +82,7 @@ const PureHome = (props) => {
startUpload,
setDragging,
dragging,
- uploadEmptyFolders,
+ createFoldersTree,
disableDrag,
uploaded,
converted,
@@ -160,7 +160,9 @@ const PureHome = (props) => {
getFolderModel,
scrollToTop,
isEmptyGroups,
+ isCurrentGroupEmpty,
wsCreatedPDFForm,
+ disableUploadPanelOpen,
} = props;
//console.log(t("ComingSoon"))
@@ -175,14 +177,18 @@ const PureHome = (props) => {
const isPeopleAccounts = location.pathname.includes("accounts/people");
const isGroupsAccounts =
location.pathname.includes("accounts/groups") && !groupId;
- const isAccountsEmptyFilter = isGroupsAccounts && isEmptyGroups;
+ const isInsideGroup =
+ location.pathname.includes("accounts/groups") && groupId;
+ const isAccountsEmptyFilter =
+ (isGroupsAccounts && isEmptyGroups) ||
+ (isInsideGroup && isCurrentGroupEmpty);
const { onDrop } = useFiles({
t,
dragging,
setDragging,
disableDrag,
- uploadEmptyFolders,
+ createFoldersTree,
startUpload,
fetchFiles,
fetchRooms,
@@ -222,7 +228,7 @@ const PureHome = (props) => {
itemsSelectionTitle,
secondaryProgressDataStoreIcon,
itemsSelectionLength,
-
+ disableUploadPanelOpen,
setItemsSelectionTitle,
});
@@ -526,6 +532,7 @@ export const Component = inject(
percent: primaryProgressDataPercent,
icon: primaryProgressDataIcon,
alert: primaryProgressDataAlert,
+ disableUploadPanelOpen,
clearPrimaryProgressData,
} = primaryProgressDataStore;
@@ -543,7 +550,7 @@ export const Component = inject(
const { setUploadPanelVisible, startUpload, uploaded, converted } =
uploadDataStore;
- const { uploadEmptyFolders, onClickBack } = filesActionsStore;
+ const { createFoldersTree, onClickBack } = filesActionsStore;
const selectionLength = isProgressFinished ? selection.length : null;
const selectionTitle = isProgressFinished
@@ -572,6 +579,7 @@ export const Component = inject(
fetchGroup,
groups,
groupsIsFiltered,
+ isCurrentGroupEmpty,
} = groupsStore;
const isEmptyGroups =
!groupsIsFiltered &&
@@ -602,6 +610,7 @@ export const Component = inject(
primaryProgressDataIcon,
primaryProgressDataAlert,
clearPrimaryProgressData,
+ disableUploadPanelOpen,
clearUploadedFilesHistory,
@@ -635,7 +644,7 @@ export const Component = inject(
setUploadPanelVisible,
startUpload,
- uploadEmptyFolders,
+ createFoldersTree,
setToPreviewFile,
setIsPreview,
@@ -689,6 +698,7 @@ export const Component = inject(
getFolderModel,
scrollToTop,
isEmptyGroups,
+ isCurrentGroupEmpty,
wsCreatedPDFForm,
};
},
diff --git a/packages/client/src/pages/PortalSettings/categories/common/Branding/WhiteLabelWrapper.js b/packages/client/src/pages/PortalSettings/categories/common/Branding/WhiteLabelWrapper.js
index f2b4533f36..a0b4cdd9f5 100644
--- a/packages/client/src/pages/PortalSettings/categories/common/Branding/WhiteLabelWrapper.js
+++ b/packages/client/src/pages/PortalSettings/categories/common/Branding/WhiteLabelWrapper.js
@@ -26,7 +26,7 @@
import React, { useEffect } from "react";
import { Provider as MobxProvider } from "mobx-react";
-import store from "client/store";
+import store from "SRC_DIR/store";
import CommonWhiteLabel from "./CommonWhiteLabel";
const { authStore } = store;
diff --git a/packages/client/src/pages/PortalSettings/categories/common/Branding/whitelabel.js b/packages/client/src/pages/PortalSettings/categories/common/Branding/whitelabel.js
index c600ec5de4..312a14635e 100644
--- a/packages/client/src/pages/PortalSettings/categories/common/Branding/whitelabel.js
+++ b/packages/client/src/pages/PortalSettings/categories/common/Branding/whitelabel.js
@@ -85,6 +85,7 @@ const WhiteLabelComponent = (props) => {
const [isEmpty, setIsEmpty] = useState(isWhitelableLoaded && !logoText);
const isMobileView = deviceType === DeviceType.mobile;
+ const showAbout = standalone && isManagement();
const init = async () => {
const isWhiteLabelPage = standalone
@@ -170,6 +171,9 @@ const WhiteLabelComponent = (props) => {
logoUrlsWhiteLabel[i].size.width,
logoUrlsWhiteLabel[i].size.height,
);
+
+ if (!showAbout && logoUrlsWhiteLabel[i].name === "AboutPage") continue;
+
const isDocsEditorName = logoUrlsWhiteLabel[i].name === "DocsEditor";
const logoLight = generateLogo(
@@ -448,39 +452,42 @@ const WhiteLabelComponent = (props) => {
-
-
- {t("LogoAbout")} ({logoUrlsWhiteLabel[6].size.width}x
- {logoUrlsWhiteLabel[6].size.height})
-
-
-
-
-
-
-
+ {showAbout && (
+ <>
+
+
+ {t("LogoAbout")} ({logoUrlsWhiteLabel[6].size.width}x
+ {logoUrlsWhiteLabel[6].size.height})
+
+
+
+
+
+
+ >
+ )}
{
const getCurrentTabId = () => {
const path = location.pathname;
const currentTab = data.find((item) => path.includes(item.id));
- return currentTab !== -1 && data.length ? currentTab.id : data[0].id;
+ return currentTab && data.length ? currentTab.id : data[0].id;
};
const currentTabId = getCurrentTabId();
diff --git a/packages/client/src/pages/PortalSettings/categories/data-management/backup/StyledBackup.js b/packages/client/src/pages/PortalSettings/categories/data-management/backup/StyledBackup.js
index 11f634d1a2..e4fe340c51 100644
--- a/packages/client/src/pages/PortalSettings/categories/data-management/backup/StyledBackup.js
+++ b/packages/client/src/pages/PortalSettings/categories/data-management/backup/StyledBackup.js
@@ -496,6 +496,12 @@ const StyledBackup = styled.div`
}
.backup_third-party-context {
margin-top: 4px;
+
+ svg {
+ width: 16px;
+ height: 16px;
+ padding: 7px;
+ }
}
`;
const StyledBackupList = styled.div`
@@ -603,6 +609,31 @@ const StyledSettingsHeader = styled.div`
margin: auto 0;
}
`;
+
+const StyledComboBoxItem = styled.div`
+ display: flex;
+
+ .drop-down-item_text {
+ color: ${({ theme, isDisabled }) =>
+ isDisabled ? theme.dropDownItem.disableColor : theme.dropDownItem.color};
+ }
+ .drop-down-item_icon {
+ display: flex;
+ align-items: center;
+
+ div {
+ display: flex;
+ }
+
+ margin-inline-start: auto;
+
+ svg {
+ min-height: 16px;
+ min-width: 16px;
+ }
+ }
+`;
+
export {
StyledModules,
StyledRestoreBackup,
@@ -613,4 +644,5 @@ export {
StyledAutoBackup,
StyledStoragesModule,
StyledSettingsHeader,
+ StyledComboBoxItem,
};
diff --git a/packages/client/src/pages/PortalSettings/categories/data-management/backup/common-container/DirectThirdPartyConnection.js b/packages/client/src/pages/PortalSettings/categories/data-management/backup/common-container/DirectThirdPartyConnection.js
index 8e4586a12f..2af8bc6b78 100644
--- a/packages/client/src/pages/PortalSettings/categories/data-management/backup/common-container/DirectThirdPartyConnection.js
+++ b/packages/client/src/pages/PortalSettings/categories/data-management/backup/common-container/DirectThirdPartyConnection.js
@@ -27,10 +27,15 @@
import VerticalDotsReactSvgUrl from "PUBLIC_DIR/images/vertical-dots.react.svg?url";
import RefreshReactSvgUrl from "PUBLIC_DIR/images/refresh.react.svg?url";
import AccessNoneReactSvgUrl from "PUBLIC_DIR/images/access.none.react.svg?url";
-import React, { useEffect, useReducer } from "react";
+import ExternalLinkReactSvgUrl from "PUBLIC_DIR/images/external.link.react.svg?url";
+
+import { useEffect, useReducer } from "react";
+import { ReactSVG } from "react-svg";
import { Button } from "@docspace/shared/components/button";
+import { DropDownItem } from "@docspace/shared/components/drop-down-item";
+import { Text } from "@docspace/shared/components/text";
import { saveSettingsThirdParty } from "@docspace/shared/api/files";
-import { StyledBackup } from "../StyledBackup";
+import { StyledBackup, StyledComboBoxItem } from "../StyledBackup";
import { ComboBox } from "@docspace/shared/components/combobox";
import { toastr } from "@docspace/shared/components/toast";
import { inject, observer } from "mobx-react";
@@ -39,6 +44,7 @@ import DeleteThirdPartyDialog from "../../../../../../components/dialogs/DeleteT
import { getOAuthToken } from "@docspace/shared/utils/common";
import FilesSelectorInput from "SRC_DIR/components/FilesSelectorInput";
import { useTranslation } from "react-i18next";
+import { ThirdPartyServicesUrlName } from "../../../../../../helpers/constants";
const initialState = {
folderList: {},
@@ -83,7 +89,7 @@ const DirectThirdPartyConnection = (props) => {
const onSetSettings = async () => {
try {
- await setThirdPartyAccountsInfo();
+ await setThirdPartyAccountsInfo(t);
setState({
isLoading: false,
@@ -157,7 +163,7 @@ const DirectThirdPartyConnection = (props) => {
provider_id,
);
- await setThirdPartyAccountsInfo();
+ await setThirdPartyAccountsInfo(t);
} catch (e) {
toastr.error(e);
}
@@ -165,9 +171,24 @@ const DirectThirdPartyConnection = (props) => {
setState({ isLoading: false, isUpdatingInfo: false });
};
- const onSelectAccount = (options) => {
- const key = options.key;
- setSelectedThirdPartyAccount({ ...accounts[+key] });
+ const onSelectAccount = (event) => {
+ const data = event.currentTarget.dataset;
+
+ const account = accounts.find((t) => t.key === data.thirdPartyKey);
+
+ if (!account.connected) {
+ setSelectedThirdPartyAccount({
+ key: 0,
+ label: selectedThirdPartyAccount?.label,
+ });
+
+ return window.open(
+ `/portal-settings/integration/third-party-services?service=${ThirdPartyServicesUrlName[data.thirdPartyKey]}`,
+ "_blank",
+ );
+ }
+
+ setSelectedThirdPartyAccount(account);
};
const onDisconnect = () => {
@@ -187,7 +208,7 @@ const DirectThirdPartyConnection = (props) => {
key: "Disconnect-settings",
label: t("Common:Disconnect"),
onClick: onDisconnect,
- disabled: selectedThirdPartyAccount?.connected ? false : true,
+ disabled: selectedThirdPartyAccount?.storageIsConnected ? false : true,
icon: AccessNoneReactSvgUrl,
},
];
@@ -201,6 +222,33 @@ const DirectThirdPartyConnection = (props) => {
const isDisabledSelector = isLoading || isDisabled;
const folderList = connectedThirdPartyAccount ?? {};
+
+ const advancedOptions = accounts?.map((item) => {
+ return (
+
+
+
+ {item.title}
+
+
+ {!item.disabled && !item.connected ? (
+
+ ) : (
+ <>>
+ )}
+
+
+ );
+ });
+
return (
{
>
diff --git a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/ScopesBlock.tsx b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/ScopesBlock.tsx
index aaed917132..3d5598a209 100644
--- a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/ScopesBlock.tsx
+++ b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/ClientForm/components/ScopesBlock.tsx
@@ -56,6 +56,8 @@ const ScopesBlock = ({
) => {
const isChecked = checkedScopes.includes(name);
+ const isWrite = type === "write";
+
if (!isChecked) {
setFilteredScopes((val) => {
val[group].isChecked = true;
@@ -88,6 +90,8 @@ const ScopesBlock = ({
setCheckedScopes((val) => val.filter((v) => v !== name));
}
+ if (isWrite) onAddScope("scopes", name.replace("write", "read"));
+
onAddScope("scopes", name);
};
diff --git a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/GenerateDeveloperTokenDialog.tsx b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/GenerateDeveloperTokenDialog.tsx
index 569a2bcdc1..cf6294935b 100644
--- a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/GenerateDeveloperTokenDialog.tsx
+++ b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/GenerateDeveloperTokenDialog.tsx
@@ -156,6 +156,7 @@ const GenerateDeveloperTokenDialog = ({
iconName={CopyReactSvgUrl}
onIconClick={onCopyClick}
type={InputType.text}
+ maxLength={10000}
/>
Created: {dates.created}
diff --git a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/InfoDialog.tsx b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/InfoDialog.tsx
index a37c7c1cbe..4949b15a3e 100644
--- a/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/InfoDialog.tsx
+++ b/packages/client/src/pages/PortalSettings/categories/developer-tools/OAuth/sub-components/InfoDialog.tsx
@@ -25,6 +25,7 @@ import { TTranslation } from "@docspace/shared/types";
import { ContextMenuModel } from "@docspace/shared/components/context-menu";
import { OAuthStoreProps } from "SRC_DIR/store/OAuthStore";
+import { Tag } from "@docspace/shared/components/tag";
const StyledContainer = styled.div<{
showDescription: boolean;
@@ -118,6 +119,23 @@ const StyledContainer = styled.div<{
background: ${(props) => props.theme.oauth.infoDialog.separatorColor};
}
}
+
+ .property-tag_list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 4px;
+
+ .property-tag {
+ max-width: 195px;
+ margin: 0;
+ background: ${(props) => props.theme.infoPanel.details.tagBackground};
+ p {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ }
+ }
`;
StyledContainer.defaultProps = { theme: Base };
@@ -288,7 +306,6 @@ const InfoDialog = ({
)}
>
)}
-
{t("Common:Website")}
-
{client?.websiteUrl}
-
+
+ {t("Scopes")}
+ {" "}
+
{t("Access")}
-
+
+ {client?.scopes.map((scope) => (
+
+ ))}
+
{isProfile && (
<>
>
)}
-
{t("SupportAndLegalInfo")}
-
(null);
+
const onRevoke = async () => {
- if (!token || !client || requestRunning) return;
+ if (!token || !isValidToken || !client || requestRunning) return;
try {
const { clientId, clientSecret } = client;
@@ -62,9 +72,42 @@ const GenerateDeveloperTokenDialog = ({
}
};
- const onChange = (e: React.ChangeEvent) => {
+ const onChange = async (e: React.ChangeEvent) => {
const value = e.target.value;
+ if (timerRef.current) {
+ clearTimeout(timerRef.current);
+ }
+
+ if (!value) {
+ setIsValidToken(false);
+ setTokenError("");
+ setToken("");
+ return;
+ }
+
+ timerRef.current = setTimeout(async () => {
+ try {
+ const data = await introspectDeveloperToken(value);
+
+ if (!data) return;
+
+ const { active, client_id: clientId } = data;
+
+ if (active && clientId === client?.clientId) {
+ setIsValidToken(true);
+ setTokenError("");
+ return;
+ }
+
+ setIsValidToken(false);
+ setTokenError("Invalid token");
+ } catch (err) {
+ setIsValidToken(false);
+ setTokenError("Invalid token");
+ }
+ }, 200);
+
setToken(value);
};
@@ -85,15 +128,23 @@ const GenerateDeveloperTokenDialog = ({
Revoke developer token
- Warning text
-
+ Warning text
+
+
+
@@ -102,7 +153,7 @@ const GenerateDeveloperTokenDialog = ({
primary
scale
onClick={onRevoke}
- isDisabled={!token}
+ isDisabled={!token || !isValidToken}
isLoading={requestRunning}
size={ButtonSize.small}
/>
diff --git a/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/AttributeMapping.js b/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/AttributeMapping.js
index 3505190b34..4254f9f825 100644
--- a/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/AttributeMapping.js
+++ b/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/AttributeMapping.js
@@ -26,7 +26,8 @@
import React, { useRef } from "react";
import { inject, observer } from "mobx-react";
-import { useTranslation } from "react-i18next";
+import { Trans, useTranslation } from "react-i18next";
+import { useNavigate } from "react-router-dom";
import { Box } from "@docspace/shared/components/box";
import { TextInput } from "@docspace/shared/components/text-input";
@@ -39,6 +40,8 @@ import { FieldContainer } from "@docspace/shared/components/field-container";
import AccessSelector from "SRC_DIR/components/AccessSelector";
import { isMobile } from "@docspace/shared/utils";
import LdapFieldComponent from "./LdapFieldComponent";
+import { Link } from "@docspace/shared/components/link";
+import { globalColors } from "@docspace/shared/themes";
const FIRST_NAME = "firstName",
SECOND_NAME = "secondName",
@@ -68,10 +71,14 @@ const AttributeMapping = (props) => {
isLdapEnabled,
isUIDisabled,
+
+ isDefaultUsersQuotaSet,
} = props;
const { t } = useTranslation("Ldap");
+ const navigate = useNavigate();
+
const inputsRef = useRef();
const onChangeValue = (e) => {
@@ -100,6 +107,10 @@ const AttributeMapping = (props) => {
setUserType(option.access);
};
+ const goToStarageManagement = () => {
+ navigate("/portal-settings/management/disk-space");
+ };
+
return (
<>
@@ -202,9 +213,32 @@ const AttributeMapping = (props) => {
onChange={onChangeValue}
value={userQuotaLimit}
scale
- isDisabled={!isLdapEnabled || isUIDisabled}
+ isDisabled={
+ !isDefaultUsersQuotaSet || !isLdapEnabled || isUIDisabled
+ }
tabIndex={11}
/>
+ {!isDefaultUsersQuotaSet && (
+
+ ,
+ ]}
+ />
+
+ )}
@@ -250,7 +284,7 @@ const AttributeMapping = (props) => {
);
};
-export default inject(({ ldapStore }) => {
+export default inject(({ ldapStore, currentQuotaStore }) => {
const {
setMail,
setFirstName,
@@ -274,6 +308,8 @@ export default inject(({ ldapStore }) => {
userType,
} = requiredSettings;
+ const { isDefaultUsersQuotaSet } = currentQuotaStore;
+
return {
setFirstName,
setSecondName,
@@ -292,5 +328,7 @@ export default inject(({ ldapStore }) => {
errors,
isLdapEnabled,
isUIDisabled,
+
+ isDefaultUsersQuotaSet,
};
})(observer(AttributeMapping));
diff --git a/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/AuthenticationContainer.js b/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/AuthenticationContainer.js
index 7466f19375..180b7ff02b 100644
--- a/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/AuthenticationContainer.js
+++ b/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/AuthenticationContainer.js
@@ -32,6 +32,7 @@ import { HelpButton } from "@docspace/shared/components/help-button";
import { FieldContainer } from "@docspace/shared/components/field-container";
import { ToggleButton } from "@docspace/shared/components/toggle-button";
import LdapFieldComponent from "./LdapFieldComponent";
+import { InputSize, InputType } from "@docspace/shared/components/text-input";
const LOGIN = "login",
PASSWORD = "password";
@@ -109,6 +110,7 @@ const AuthenticationContainer = ({
isRequired
>
diff --git a/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/LdapFieldComponent.js b/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/LdapFieldComponent.js
index 7e09c9a9a6..ccb0ff1dc1 100644
--- a/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/LdapFieldComponent.js
+++ b/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/LdapFieldComponent.js
@@ -28,6 +28,7 @@ import React from "react";
import { inject, observer } from "mobx-react";
import { TextInput } from "@docspace/shared/components/text-input";
import { Textarea } from "@docspace/shared/components/textarea";
+import { PasswordInput } from "@docspace/shared/components/password-input";
const LdapFieldComponent = (props) => {
const {
@@ -37,6 +38,7 @@ const LdapFieldComponent = (props) => {
setErrorField,
name,
onChange,
+ isPassword,
...prop
} = props;
@@ -68,6 +70,17 @@ const LdapFieldComponent = (props) => {
if (isTextArea)
return
;
+ if (isPassword)
+ return (
+
+ );
+
return (
{
resetForm,
confirmationResetModal,
isSubmitLoading,
- hasErrors,
- hasChanges,
isLoadingXml,
- enableSso,
isSSOAvailable,
closeResetModal,
confirmReset,
+ isDisabledSaveButton,
} = props;
return (
@@ -62,9 +60,7 @@ const SubmitResetButtons = (props) => {
displaySettings={true}
hasScroll={true}
isSaving={isSubmitLoading}
- saveButtonDisabled={
- !enableSso || hasErrors || !hasChanges || isLoadingXml
- }
+ saveButtonDisabled={isDisabledSaveButton}
disableRestoreToDefault={
isSubmitLoading || isLoadingXml || !isSSOAvailable
}
@@ -90,12 +86,10 @@ export default inject(({ ssoStore, currentQuotaStore }) => {
resetForm,
confirmationResetModal,
isSubmitLoading,
- hasErrors,
- hasChanges,
isLoadingXml,
- enableSso,
closeResetModal,
confirmReset,
+ isDisabledSaveButton,
} = ssoStore;
const { isSSOAvailable } = currentQuotaStore;
@@ -106,12 +100,10 @@ export default inject(({ ssoStore, currentQuotaStore }) => {
resetForm,
confirmationResetModal,
isSubmitLoading,
- hasErrors,
- hasChanges,
isLoadingXml,
- enableSso,
isSSOAvailable,
closeResetModal,
confirmReset,
+ isDisabledSaveButton,
};
})(observer(SubmitResetButtons));
diff --git a/packages/client/src/pages/PortalSettings/categories/integration/SingleSignOn/styled-containers/StyledSsoPageContainer.js b/packages/client/src/pages/PortalSettings/categories/integration/SingleSignOn/styled-containers/StyledSsoPageContainer.js
index 4b8a01996c..2e6b3b76d6 100644
--- a/packages/client/src/pages/PortalSettings/categories/integration/SingleSignOn/styled-containers/StyledSsoPageContainer.js
+++ b/packages/client/src/pages/PortalSettings/categories/integration/SingleSignOn/styled-containers/StyledSsoPageContainer.js
@@ -51,16 +51,6 @@ const StyledSsoPage = styled.div`
margin-bottom: 4px;
}
- .field-label {
- display: flex;
- align-items: center;
- height: auto;
- font-weight: 600;
- line-height: 20px;
- overflow: visible;
- white-space: normal;
- }
-
.xml-input {
.field-label-icon {
margin-bottom: 8px;
diff --git a/packages/client/src/store/AccountsHotkeysStore.ts b/packages/client/src/store/AccountsHotkeysStore.ts
index 6320e49d08..d8a669658c 100644
--- a/packages/client/src/store/AccountsHotkeysStore.ts
+++ b/packages/client/src/store/AccountsHotkeysStore.ts
@@ -28,7 +28,7 @@ import { makeAutoObservable } from "mobx";
import { isMobile } from "@docspace/shared/utils";
import { checkDialogsOpen } from "@docspace/shared/utils/checkDialogsOpen";
import { TUser, TUserGroup } from "@docspace/shared/api/people/types";
-import { TABLE_HEADER_HEIGHT } from "@docspace/shared/utils/device";
+import { TABLE_HEADER_HEIGHT } from "@docspace/shared/components/table/Table.constants";
type AccountsType = TUser | TUserGroup;
diff --git a/packages/client/src/store/BackupStore.js b/packages/client/src/store/BackupStore.js
index 5546423f34..f030f4da5f 100644
--- a/packages/client/src/store/BackupStore.js
+++ b/packages/client/src/store/BackupStore.js
@@ -37,13 +37,16 @@ import { combineUrl } from "@docspace/shared/utils/combineUrl";
import config from "PACKAGE_FILE";
import {
getSettingsThirdParty,
- getThirdPartyCapabilities,
uploadBackup,
} from "@docspace/shared/api/files";
-import i18n from "../i18n";
+import { connectedCloudsTypeTitleTranslation } from "../helpers/filesUtils.js";
+
const { EveryDayType, EveryWeekType } = AutoBackupPeriod;
class BackupStore {
+ authStore = null;
+ thirdPartyStore = null;
+
restoreResource = null;
backupSchedule = {};
@@ -100,11 +103,13 @@ class BackupStore {
selectedThirdPartyAccount = null;
connectedThirdPartyAccount = null;
accounts = [];
- capabilities = [];
connectedAccount = [];
- constructor() {
+ constructor(authStore, thirdPartyStore) {
makeAutoObservable(this);
+
+ this.authStore = authStore;
+ this.thirdPartyStore = thirdPartyStore;
}
setConnectedThirdPartyAccount = (account) => {
@@ -195,37 +200,20 @@ class BackupStore {
return false;
}
- setThirdPartyAccountsInfo = async () => {
- const [connectedAccount, capabilities] = await Promise.all([
+ setThirdPartyAccountsInfo = async (t) => {
+ const [connectedAccount, providers] = await Promise.all([
getSettingsThirdParty(),
- getThirdPartyCapabilities(),
+ this.thirdPartyStore.fetchConnectingStorages(),
]);
- this.setCapabilities(capabilities);
this.setConnectedThirdPartyAccount(connectedAccount);
- const providerNames = [
- ["GoogleDrive", i18n.t("Translations:TypeTitleGoogle")],
- ["Box", i18n.t("Translations:TypeTitleBoxNet")],
- ["DropboxV2", i18n.t("Translations:TypeTitleDropBox")],
- ["SharePoint", i18n.t("Translations:TypeTitleSharePoint")],
- ["OneDrive", i18n.t("Translations:TypeTitleSkyDrive")],
- ["WebDav", "Nextcloud"],
- ["WebDav", "ownCloud"],
- ["kDrive", i18n.t("Translations:TypeTitlekDrive")],
- ["Yandex", i18n.t("Translations:TypeTitleYandex")],
- ["WebDav", i18n.t("Translations:TypeTitleWebDav")],
- ];
-
let accounts = [],
selectedAccount = {};
let index = 0;
- providerNames.map((item) => {
- const { account, isConnected } = this.getThirdPartyAccount(
- item[0],
- item[1],
- index,
- );
+
+ providers.map((item) => {
+ const { account, isConnected } = this.getThirdPartyAccount(item, t);
if (!account) return;
@@ -237,51 +225,53 @@ class BackupStore {
index++;
});
+ accounts = accounts.sort((storage) => (storage.connected ? -1 : 1));
+
this.setThirdPartyAccounts(accounts);
console.log(selectedAccount, accounts);
+ const connectedThirdPartyAccount = accounts.findLast((a) => a.connected);
this.setSelectedThirdPartyAccount(
Object.keys(selectedAccount).length !== 0
? selectedAccount
- : { ...accounts[0] },
+ : connectedThirdPartyAccount,
);
};
- getThirdPartyAccount = (providerKey, serviceTitle, index) => {
- const accountIndex =
- this.capabilities &&
- this.capabilities.findIndex((x) => x[0] === providerKey);
-
- if (accountIndex === -1) return { account: null, isConnected: false };
+ getThirdPartyAccount = (provider, t) => {
+ const serviceTitle = connectedCloudsTypeTitleTranslation(provider.name, t);
+ const serviceLabel = provider.connected
+ ? serviceTitle
+ : `${serviceTitle} (${t("CreateEditRoomDialog:ActivationRequired")})`;
const isConnected =
this.connectedThirdPartyAccount?.providerKey === "WebDav"
? serviceTitle === this.connectedThirdPartyAccount?.title
- : this.capabilities[accountIndex][0] ===
- this.connectedThirdPartyAccount?.providerKey;
+ : provider.key === this.connectedThirdPartyAccount?.providerKey;
+
+ const isDisabled = !provider.connected && !this.authStore.isAdmin;
const account = {
- key: index.toString(),
- label: serviceTitle,
- title: serviceTitle,
- provider_key: this.capabilities[accountIndex][0],
- ...(this.capabilities[accountIndex][1] && {
- provider_link: this.capabilities[accountIndex][1],
+ key: provider.name,
+ label: serviceLabel,
+ title: serviceLabel,
+ provider_key: provider.key,
+ ...(provider.clientId && {
+ provider_link: provider.clientId,
}),
- connected: isConnected,
+ storageIsConnected: isConnected,
+ connected: provider.connected,
...(isConnected && {
provider_id: this.connectedThirdPartyAccount?.providerId,
id: this.connectedThirdPartyAccount.id,
}),
+ disabled: isDisabled,
};
return { account, isConnected };
};
- setCapabilities = (capabilities) => {
- this.capabilities = capabilities;
- };
setThirdPartyAccounts = (accounts) => {
this.accounts = accounts;
};
diff --git a/packages/client/src/store/ContextOptionsStore.js b/packages/client/src/store/ContextOptionsStore.js
index 45381b7aa9..6964870b22 100644
--- a/packages/client/src/store/ContextOptionsStore.js
+++ b/packages/client/src/store/ContextOptionsStore.js
@@ -139,6 +139,7 @@ class ContextOptionsStore {
pluginStore;
infoPanelStore;
currentTariffStatusStore;
+ currentQuotaStore;
userStore;
clientLoadingStore;
@@ -160,6 +161,7 @@ class ContextOptionsStore {
pluginStore,
infoPanelStore,
currentTariffStatusStore,
+ currentQuotaStore,
userStore,
clientLoadingStore,
) {
@@ -179,6 +181,7 @@ class ContextOptionsStore {
this.pluginStore = pluginStore;
this.infoPanelStore = infoPanelStore;
this.currentTariffStatusStore = currentTariffStatusStore;
+ this.currentQuotaStore = currentQuotaStore;
this.userStore = userStore;
this.clientLoadingStore = clientLoadingStore;
}
@@ -556,16 +559,12 @@ class ContextOptionsStore {
this.dialogsStore.setDownloadDialogVisible(true);
};
- onClickCreateRoom = (item) => {
- this.filesActionsStore.setProcessCreatingRoomFromData(true);
- const event = new Event(Events.ROOM_CREATE);
- if (item && item.isFolder) {
- event.title = item.title;
- }
- window.dispatchEvent(event);
- };
-
onDuplicate = (item) => {
+ if (this.currentQuotaStore.isWarningRoomsDialog) {
+ this.dialogsStore.setQuotaWarningDialogVisible(true);
+ return;
+ }
+
this.filesActionsStore.duplicateAction(item);
};
@@ -862,7 +861,7 @@ class ContextOptionsStore {
const { isGracePeriod } = this.currentTariffStatusStore;
if (isGracePeriod) {
- this.dialogsStore.setInviteUsersWarningDialogVisible(true);
+ this.dialogsStore.setQuotaWarningDialogVisible(true);
} else {
this.dialogsStore.setInvitePanelOptions({
visible: true,
@@ -883,15 +882,15 @@ class ContextOptionsStore {
onClickArchive = (e) => {
const data = (e.currentTarget && e.currentTarget.dataset) || e;
const { action } = data;
- const { isGracePeriod } = this.currentTariffStatusStore;
+ const { isWarningRoomsDialog } = this.currentQuotaStore;
const {
setArchiveDialogVisible,
setRestoreRoomDialogVisible,
- setInviteUsersWarningDialogVisible,
+ setQuotaWarningDialogVisible,
} = this.dialogsStore;
- if (action === "unarchive" && isGracePeriod) {
- setInviteUsersWarningDialogVisible(true);
+ if (action === "unarchive" && isWarningRoomsDialog) {
+ setQuotaWarningDialogVisible(true);
return;
}
@@ -1105,7 +1104,7 @@ class ContextOptionsStore {
onRestoreAllArchiveAction = () => {
const { activeFiles, activeFolders } = this.filesStore;
const {
- setInviteUsersWarningDialogVisible,
+ setQuotaWarningDialogVisible,
setRestoreAllArchive,
setRestoreRoomDialogVisible,
} = this.dialogsStore;
@@ -1114,8 +1113,8 @@ class ContextOptionsStore {
if (isExistActiveItems) return;
- if (this.currentTariffStatusStore.isGracePeriod) {
- setInviteUsersWarningDialogVisible(true);
+ if (this.currentQuotaStore.isWarningRoomsDialog) {
+ setQuotaWarningDialogVisible(true);
return;
}
@@ -1667,7 +1666,7 @@ class ContextOptionsStore {
key: "create-room",
label: t("Files:CreateRoom"),
icon: CatalogRoomsReactSvgUrl,
- onClick: () => this.onClickCreateRoom(item),
+ onClick: () => this.onCreateRoom(item, true),
disabled: !item.security?.CreateRoomFrom,
},
{
@@ -1980,7 +1979,7 @@ class ContextOptionsStore {
key: "create-room",
label: t("Files:CreateRoom"),
icon: CatalogRoomsReactSvgUrl,
- onClick: this.onClickCreateRoom,
+ onClick: () => this.onCreateRoom(null, true),
disabled: !selection.security?.CreateRoomFrom,
},
{
@@ -2077,13 +2076,13 @@ class ContextOptionsStore {
};
onInvite = (e) => {
- const { setInviteUsersWarningDialogVisible, setInvitePanelOptions } =
+ const { setQuotaWarningDialogVisible, setInvitePanelOptions } =
this.dialogsStore;
const type = e.item["data-type"];
- if (this.currentTariffStatusStore.isGracePeriod) {
- setInviteUsersWarningDialogVisible(true);
+ if (this.currentQuotaStore.showWarningDialog(type)) {
+ setQuotaWarningDialogVisible(true);
return;
}
@@ -2108,13 +2107,22 @@ class ContextOptionsStore {
window.dispatchEvent(event);
};
- onCreateRoom = () => {
- if (this.currentTariffStatusStore.isGracePeriod) {
- this.dialogsStore.setInviteUsersWarningDialogVisible(true);
+ onCreateRoom = (item, fromItem) => {
+ if (this.currentQuotaStore.isWarningRoomsDialog) {
+ this.dialogsStore.setQuotaWarningDialogVisible(true);
return;
}
+ if (fromItem) {
+ this.filesActionsStore.setProcessCreatingRoomFromData(true);
+ }
+
const event = new Event(Events.ROOM_CREATE);
+
+ if (item && item.isFolder) {
+ event.title = item.title;
+ }
+
window.dispatchEvent(event);
};
diff --git a/packages/client/src/store/CreateEditRoomStore.js b/packages/client/src/store/CreateEditRoomStore.js
index 49b0bd9bb5..b9afd866e0 100644
--- a/packages/client/src/store/CreateEditRoomStore.js
+++ b/packages/client/src/store/CreateEditRoomStore.js
@@ -46,6 +46,7 @@ class CreateEditRoomStore {
settingsStore = null;
infoPanelStore = null;
currentQuotaStore = null;
+ dialogsStore = null;
constructor(
filesStore,
@@ -57,6 +58,7 @@ class CreateEditRoomStore {
infoPanelStore,
currentQuotaStore,
clientLoadingStore,
+ dialogsStore,
) {
makeAutoObservable(this);
@@ -69,6 +71,7 @@ class CreateEditRoomStore {
this.infoPanelStore = infoPanelStore;
this.currentQuotaStore = currentQuotaStore;
this.clientLoadingStore = clientLoadingStore;
+ this.dialogsStore = dialogsStore;
}
setRoomParams = (roomParams) => {
@@ -87,8 +90,8 @@ class CreateEditRoomStore {
this.onClose = onClose;
};
- setRoomIsCreated = (onClose) => {
- this.onClose = onClose;
+ setIsRoomCreatedByCurrentUser = (value) => {
+ this.isRoomCreatedByCurrentUser = value;
};
onCreateRoom = async (withConfirm = false, t) => {
@@ -152,6 +155,8 @@ class CreateEditRoomStore {
? await createRoomInThirdpary(storageFolderId, createRoomData)
: await createRoom(createRoomData);
+ this.dialogsStore.setIsNewRoomByCurrentUser(true);
+
room.isLogoLoading = true;
const actions = [];
diff --git a/packages/client/src/store/DialogsStore.js b/packages/client/src/store/DialogsStore.js
index 59bd7784f8..6d0ee66d28 100644
--- a/packages/client/src/store/DialogsStore.js
+++ b/packages/client/src/store/DialogsStore.js
@@ -26,6 +26,7 @@
import { getNewFiles } from "@docspace/shared/api/files";
import {
+ EmployeeType,
FilesSelectorFilterTypes,
FilterType,
ShareAccessRights,
@@ -58,7 +59,7 @@ class DialogsStore {
selectFileDialogVisible = false;
selectFileFormRoomDialogVisible = false;
convertPasswordDialogVisible = false;
- inviteUsersWarningDialogVisible = false;
+ inviteQuotaWarningDialogVisible = false;
changeQuotaDialogVisible = false;
unsavedChangesDialogVisible = false;
moveToPublicRoomVisible = false;
@@ -129,6 +130,8 @@ class DialogsStore {
};
warningQuotaDialogVisible = false;
+ invitePaidUsersCount = 0;
+ isNewQuotaItemsByCurrentUser = false;
constructor(
authStore,
@@ -435,15 +438,48 @@ class DialogsStore {
this.inviteItems = inviteItems;
};
+ setInvitePaidUsersCount = (modifier = 1) => {
+ this.invitePaidUsersCount = this.invitePaidUsersCount + modifier;
+ if (this.invitePaidUsersCount === -1) this.invitePaidUsersCount = 0;
+ };
+
+ isPaidUserAccess = (selectedAccess) => {
+ return (
+ selectedAccess === EmployeeType.Admin ||
+ selectedAccess === EmployeeType.Collaborator ||
+ selectedAccess === EmployeeType.User
+ );
+ };
+
changeInviteItem = async (item) =>
runInAction(() => {
const index = this.inviteItems.findIndex((iItem) => iItem.id === item.id);
+ const isPrevAccessPaid = this.isPaidUserAccess(
+ this.inviteItems[index].access,
+ );
+ const isCurrAccessPaid = this.isPaidUserAccess(item.access);
+
+ let modifier = 0;
+
+ if (isPrevAccessPaid && !isCurrAccessPaid) modifier = -1;
+ if (!isPrevAccessPaid && isCurrAccessPaid) modifier = 1;
+
+ this.setInvitePaidUsersCount(modifier);
+
this.inviteItems[index] = { ...this.inviteItems[index], ...item };
});
- setInviteUsersWarningDialogVisible = (inviteUsersWarningDialogVisible) => {
- this.inviteUsersWarningDialogVisible = inviteUsersWarningDialogVisible;
+ setQuotaWarningDialogVisible = (inviteQuotaWarningDialogVisible) => {
+ this.inviteQuotaWarningDialogVisible = inviteQuotaWarningDialogVisible;
+ };
+
+ setIsNewRoomByCurrentUser = (value) => {
+ this.isNewRoomByCurrentUser = value;
+ };
+
+ setIsNewUserByCurrentUser = (value) => {
+ this.isNewUserByCurrentUser = value;
};
setCreateRoomDialogVisible = (createRoomDialogVisible) => {
diff --git a/packages/client/src/store/FilesActionsStore.js b/packages/client/src/store/FilesActionsStore.js
index 1349a9ec62..2d5ad5ba02 100644
--- a/packages/client/src/store/FilesActionsStore.js
+++ b/packages/client/src/store/FilesActionsStore.js
@@ -229,17 +229,21 @@ class FilesActionStore {
let level = { result };
try {
folders.forEach((folder) => {
- folder.path
- .split("/")
- .filter((name) => name !== "")
- .reduce((r, name, i, a) => {
- if (!r[name]) {
- r[name] = { result: [] };
- r.result.push({ name, children: r[name].result });
- }
+ const folderPath = folder.path.split("/").filter((name) => name !== "");
- return r[name];
- }, level);
+ folderPath.reduce((r, name, i, a) => {
+ if (!r[name]) {
+ r[name] = { result: [] };
+ r.result.push({
+ name,
+ children: r[name].result,
+ isFile: folderPath.length - 1 === i && !folder.isEmptyDirectory,
+ file: folder,
+ });
+ }
+
+ return r[name];
+ }, level);
});
} catch (e) {
console.error("convertToTree", e);
@@ -247,52 +251,71 @@ class FilesActionStore {
return result;
};
- createFolderTree = async (treeList, parentFolderId) => {
+ createFolderTree = async (treeList, parentFolderId, filesList) => {
if (!treeList || !treeList.length) return;
for (let i = 0; i < treeList.length; i++) {
const treeNode = treeList[i];
+ const isFile = treeList[i].isFile;
// console.log(
// `createFolderTree parent id = ${parentFolderId} name '${treeNode.name}': `,
// treeNode.children
// );
+ if (isFile) {
+ treeList[i].file.parentFolderId = parentFolderId;
+ filesList.push(treeList[i].file);
+ continue;
+ }
+
const folder = await createFolder(parentFolderId, treeNode.name);
const parentId = folder.id;
if (treeNode.children.length == 0) continue;
- await this.createFolderTree(treeNode.children, parentId);
+ await this.createFolderTree(treeNode.children, parentId, filesList);
}
+
+ return treeList;
};
- uploadEmptyFolders = async (emptyFolders, folderId) => {
- //console.log("uploadEmptyFolders", emptyFolders, folderId);
+ createFoldersTree = async (files, folderId) => {
+ //console.log("createFoldersTree", files, folderId);
- const { secondaryProgressDataStore } = this.uploadDataStore;
- const { setSecondaryProgressBarData, clearSecondaryProgressData } =
- secondaryProgressDataStore;
+ const { primaryProgressDataStore } = this.uploadDataStore;
+
+ const { setPrimaryProgressBarData, clearPrimaryProgressData } =
+ primaryProgressDataStore;
const operationId = uniqueid("operation_");
const toFolderId = folderId ? folderId : this.selectedFolderStore.id;
- setSecondaryProgressBarData({
- icon: "file",
+ const pbData = {
+ icon: "upload",
visible: true,
percent: 0,
label: "",
alert: false,
- operationId,
- });
+ };
- const tree = this.convertToTree(emptyFolders);
- await this.createFolderTree(tree, toFolderId);
+ setPrimaryProgressBarData({ ...pbData, disableUploadPanelOpen: true });
+
+ const tree = this.convertToTree(files);
+
+ const filesList = [];
+ await this.createFolderTree(tree, toFolderId, filesList);
this.updateCurrentFolder(null, [folderId], null, operationId);
- setTimeout(() => clearSecondaryProgressData(operationId), TIMEOUT);
+ if (!filesList.length) {
+ setTimeout(() => clearPrimaryProgressData(), TIMEOUT);
+ } else {
+ setPrimaryProgressBarData({ ...pbData, disableUploadPanelOpen: false });
+ }
+
+ return filesList;
};
updateFilesAfterDelete = (operationId) => {
@@ -1796,13 +1819,14 @@ class FilesActionStore {
archiveRooms = (action) => {
const {
setArchiveDialogVisible,
- setInviteUsersWarningDialogVisible,
+ setQuotaWarningDialogVisible,
setRestoreRoomDialogVisible,
} = this.dialogsStore;
- const { isGracePeriod } = this.currentTariffStatusStore;
- if (action === "unarchive" && isGracePeriod) {
- setInviteUsersWarningDialogVisible(true);
+ const { isWarningRoomsDialog } = this.currentQuotaStore;
+
+ if (action === "unarchive" && isWarningRoomsDialog) {
+ setQuotaWarningDialogVisible(true);
return;
}
@@ -2452,7 +2476,15 @@ class FilesActionStore {
? getObjectByLocation(shareWebUrl)?.share
: "";
- return openDocEditor(id, false, shareKey);
+ const isPDF = item.fileExst === ".pdf";
+
+ const canEditForm =
+ isPDF &&
+ item.isPDFForm &&
+ item.security?.EditForm &&
+ !item.startFilling;
+
+ return openDocEditor(id, false, shareKey, canEditForm);
}
if (isMediaOrImage) {
diff --git a/packages/client/src/store/GroupsStore.ts b/packages/client/src/store/GroupsStore.ts
index 28a14c28b2..ca184a7265 100644
--- a/packages/client/src/store/GroupsStore.ts
+++ b/packages/client/src/store/GroupsStore.ts
@@ -152,6 +152,24 @@ class GroupsStore {
return false;
}
+ get insideGroupIsFiltered() {
+ return (
+ this.insideGroupFilter.activationStatus ||
+ this.insideGroupFilter.employeeStatus ||
+ this.insideGroupFilter.payments ||
+ this.insideGroupFilter.search ||
+ this.insideGroupFilter.role ||
+ this.insideGroupFilter.accountLoginType
+ );
+ }
+
+ get isCurrentGroupEmpty() {
+ return (
+ !this.insideGroupIsFiltered &&
+ this.peopleStore.usersStore.peopleList.length === 0
+ );
+ }
+
// Inside Group Filter
setInsideGroupFilter = (filter) => {
@@ -282,6 +300,7 @@ class GroupsStore {
filter,
updateFilter = false,
withFilterLocalStorage = false,
+ updateCurrentGroup = false,
) => {
this.setInsideGroupLoading(true);
@@ -309,7 +328,7 @@ class GroupsStore {
requests.push(api.people.getUserList(filterData));
- if (groupId !== this.currentGroup?.id) {
+ if (updateCurrentGroup || groupId !== this.currentGroup?.id) {
requests.push(groupsApi.getGroupById(groupId));
}
@@ -329,6 +348,18 @@ class GroupsStore {
return Promise.resolve(filteredMembersRes.items);
};
+ refreshInsideGroup = async () => {
+ if (!this.currentGroup) return;
+
+ await this.fetchGroup(
+ this.currentGroup.id,
+ this.insideGroupFilter,
+ true,
+ false,
+ true,
+ );
+ };
+
get hasMoreInsideGroupUsers() {
return (
this.peopleStore.usersStore.users.length < this.insideGroupFilter.total
@@ -662,10 +693,12 @@ class GroupsStore {
}
if (getIsInsideGroup() && this.currentGroup?.id === groupId) {
+ const filter = this.insideGroupFilter.clone();
+
this.setCurrentGroup(res);
- const members = await api.people.getUserList(
- this.insideGroupFilter.clone(),
- );
+ const members = await api.people.getUserList(filter);
+ filter.total = members.total;
+ this.setInsideGroupFilter(filter);
this.peopleStore.usersStore.setUsers(members.items);
this.setInsideGroupTempTitle(res.name);
}
diff --git a/packages/client/src/store/HotkeyStore.js b/packages/client/src/store/HotkeyStore.js
index 46ed343cdb..80c747e88b 100644
--- a/packages/client/src/store/HotkeyStore.js
+++ b/packages/client/src/store/HotkeyStore.js
@@ -37,7 +37,7 @@ import getFilesFromEvent from "@docspace/shared/components/drag-and-drop/get-fil
import config from "PACKAGE_FILE";
import { getCategoryUrl } from "SRC_DIR/helpers/utils";
import { encryptionUploadDialog } from "../helpers/encryptionUploadDialog";
-import { TABLE_HEADER_HEIGHT } from "@docspace/shared/utils/device";
+import { TABLE_HEADER_HEIGHT } from "@docspace/shared/components/table/Table.constants";
class HotkeyStore {
filesStore;
@@ -683,9 +683,8 @@ class HotkeyStore {
};
uploadClipboardFiles = async (t, event) => {
- const { uploadEmptyFolders } = this.filesActionsStore;
+ const { createFoldersTree } = this.filesActionsStore;
const { startUpload } = this.uploadDataStore;
- const currentFolderId = this.selectedFolderStore.id;
if (this.filesStore.hotkeysClipboard.length) {
return this.moveFilesFromClipboard(t);
@@ -693,16 +692,9 @@ class HotkeyStore {
const files = await getFilesFromEvent(event);
- const emptyFolders = files.filter((f) => f.isEmptyDirectory);
-
- if (emptyFolders.length > 0) {
- uploadEmptyFolders(emptyFolders, currentFolderId).then(() => {
- const onlyFiles = files.filter((f) => !f.isEmptyDirectory);
- if (onlyFiles.length > 0) startUpload(onlyFiles, currentFolderId, t);
- });
- } else {
- startUpload(files, currentFolderId, t);
- }
+ createFoldersTree(files, uploadToFolder).then((f) => {
+ if (f.length > 0) startUpload(f, null, t);
+ });
};
get countTilesInRow() {
diff --git a/packages/client/src/store/LdapFormStore.js b/packages/client/src/store/LdapFormStore.js
index 17a374eb53..650c1a9b48 100644
--- a/packages/client/src/store/LdapFormStore.js
+++ b/packages/client/src/store/LdapFormStore.js
@@ -432,10 +432,10 @@ class LdapFormStore {
scrollToField = () => {
for (let key in this.errors) {
- const element = document.getElementsByName(key)[0];
+ const element = document.getElementsByName(key)?.[0];
- element.focus();
- element.blur();
+ element?.focus();
+ element?.blur();
return;
}
};
diff --git a/packages/client/src/store/MediaViewerDataStore.js b/packages/client/src/store/MediaViewerDataStore.js
index 9127e55e8c..610a18ce31 100644
--- a/packages/client/src/store/MediaViewerDataStore.js
+++ b/packages/client/src/store/MediaViewerDataStore.js
@@ -47,6 +47,8 @@ class MediaViewerDataStore {
publicRoomStore;
+ autoPlay = true;
+
id = null;
visible = false;
previewFile = null;
@@ -60,9 +62,14 @@ class MediaViewerDataStore {
this.publicRoomStore = publicRoomStore;
}
+ setAutoPlay = (value) => {
+ this.autoPlay = value;
+ };
+
setMediaViewerData = (mediaData) => {
this.id = mediaData.id;
this.visible = mediaData.visible;
+ this.setAutoPlay(true);
if (!mediaData.visible) this.setCurrentItem(null);
};
@@ -109,6 +116,7 @@ class MediaViewerDataStore {
)
return;
+ this.setAutoPlay(false);
this.previewFile = file;
this.id = file.id;
this.visible = visible;
@@ -167,6 +175,9 @@ class MediaViewerDataStore {
if (postionIndex === 0) {
return;
}
+
+ this.setAutoPlay(false);
+
const currentFileId = this.playlist[postionIndex].fileId;
const targetFile = files.find((item) => item.id === currentFileId);
@@ -187,6 +198,8 @@ class MediaViewerDataStore {
return;
}
+ this.setAutoPlay(false);
+
const currentFileId = this.playlist[currentPlaylistPos].fileId;
const targetFile = files.find((item) => item.id === currentFileId);
diff --git a/packages/client/src/store/PrimaryProgressDataStore.js b/packages/client/src/store/PrimaryProgressDataStore.js
index 3230bc1132..345724c93e 100644
--- a/packages/client/src/store/PrimaryProgressDataStore.js
+++ b/packages/client/src/store/PrimaryProgressDataStore.js
@@ -24,7 +24,7 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
-import { makeObservable, action, observable } from "mobx";
+import { makeAutoObservable } from "mobx";
class PrimaryProgressDataStore {
percent = 0;
@@ -34,21 +34,10 @@ class PrimaryProgressDataStore {
alert = false;
loadingFile = null;
errors = 0;
+ disableUploadPanelOpen = false;
constructor() {
- makeObservable(this, {
- percent: observable,
- label: observable,
- visible: observable,
- icon: observable,
- alert: observable,
- loadingFile: observable,
- errors: observable,
-
- setPrimaryProgressBarData: action,
- clearPrimaryProgressData: action,
- setPrimaryProgressBarErrors: action,
- });
+ makeAutoObservable(this);
}
setPrimaryProgressBarData = (primaryProgressData) => {
@@ -66,6 +55,7 @@ class PrimaryProgressDataStore {
icon: "",
alert: false,
errors: 0,
+ disableUploadPanelOpen: false,
});
};
diff --git a/packages/client/src/store/SsoFormStore.js b/packages/client/src/store/SsoFormStore.js
index 3ba3500ef1..8b92d653d7 100644
--- a/packages/client/src/store/SsoFormStore.js
+++ b/packages/client/src/store/SsoFormStore.js
@@ -388,11 +388,11 @@ class SsoFormStore {
this.isSubmitLoading = true;
try {
- await submitSsoForm(data);
+ const res = await submitSsoForm(data);
toastr.success(t("Settings:SuccessfullySaveSettingsMessage"));
this.isSubmitLoading = false;
this.setSpMetadata(true);
- this.setDefaultSettings(settings);
+ this.setDefaultSettings(res);
this.setIsSsoEnabled(settings.enableSso);
} catch (err) {
toastr.error(err);
@@ -406,6 +406,7 @@ class SsoFormStore {
const config = await resetSsoForm();
this.setFields(config);
+ this.hideErrors();
} catch (err) {
toastr.error(err);
console.error(err);
@@ -902,8 +903,14 @@ class SsoFormStore {
checkRequiredFields = () => {
this.setError("entityId", this.entityId);
- this.setError("ssoUrlPost", this.ssoUrlPost);
- this.setError("sloUrlPost", this.sloUrlPost);
+ this.ssoBinding === BINDING_POST &&
+ this.setError("ssoUrlPost", this.ssoUrlPost);
+ this.ssoBinding === BINDING_REDIRECT &&
+ this.setError("ssoUrlRedirect", this.ssoUrlRedirect);
+ this.sloBinding === BINDING_POST &&
+ this.setError("sloUrlPost", this.sloUrlPost);
+ this.sloBinding === BINDING_REDIRECT &&
+ this.setError("sloUrlRedirect", this.sloUrlRedirect);
this.setError("firstName", this.firstName);
this.setError("lastName", this.lastName);
this.setError("email", this.email);
@@ -946,13 +953,40 @@ class SsoFormStore {
);
}
+ get isDisabledSaveButton() {
+ return (
+ !this.enableSso ||
+ this.hasErrors ||
+ !this.hasChanges ||
+ this.isLoadingXml ||
+ this.isRequiredFieldsEmpty
+ );
+ }
+
+ get isRequiredFieldsEmpty() {
+ return (
+ this.entityId.trim().length === 0 ||
+ (this.ssoBinding === BINDING_POST &&
+ this.ssoUrlPost.trim().length === 0) ||
+ (this.sloBinding === BINDING_POST &&
+ this.sloUrlPost.trim().length === 0) ||
+ (this.ssoBinding === BINDING_REDIRECT &&
+ this.ssoUrlRedirect.trim().length === 0) ||
+ (this.sloBinding === BINDING_REDIRECT &&
+ this.sloUrlRedirect.trim().length === 0) ||
+ this.firstName.trim().length === 0 ||
+ this.lastName.trim().length === 0 ||
+ this.email.trim().length === 0
+ );
+ }
+
scrollToField = () => {
for (let key in this) {
if (key.includes("HasError") && this[key] !== false) {
const name = key.replace("HasError", "");
- const element = document.getElementsByName(name)[0];
- element.focus();
- element.blur();
+ const element = document.getElementsByName(name)?.[0];
+ element?.focus();
+ element?.blur();
return;
}
}
diff --git a/packages/client/src/store/TableStore.js b/packages/client/src/store/TableStore.js
index 498c38a41b..c84e55d006 100644
--- a/packages/client/src/store/TableStore.js
+++ b/packages/client/src/store/TableStore.js
@@ -78,6 +78,7 @@ class TableStore {
emailAccountsColumnIsEnabled = true;
storageAccountsColumnIsEnabled = true;
+ peopleAccountsGroupsColumnIsEnabled = true;
managerAccountsGroupsColumnIsEnabled = true;
typeAccountsInsideGroupColumnIsEnabled = true;
@@ -157,6 +158,8 @@ class TableStore {
setAccountsColumnStorage = (enable) =>
(this.storageAccountsColumnIsEnabled = enable);
+ setAccountsGroupsColumnPeople = (enable) =>
+ (this.peopleAccountsGroupsColumnIsEnabled = enable);
setAccountsGroupsColumnManager = (enable) =>
(this.managerAccountsGroupsColumnIsEnabled = enable);
@@ -204,6 +207,7 @@ class TableStore {
}
if (getIsAccountsGroups()) {
+ this.setAccountsGroupsColumnPeople(splitColumns.includes("People"));
this.setAccountsGroupsColumnManager(
splitColumns.includes("Head of Group"),
);
@@ -337,6 +341,12 @@ class TableStore {
: this.setRoomColumnQuota(!this.roomQuotaColumnIsEnable);
return;
+ case "People":
+ this.setAccountsGroupsColumnPeople(
+ !this.peopleAccountsGroupsColumnIsEnabled,
+ );
+ return;
+
case "Head of Group":
this.setAccountsGroupsColumnManager(
!this.managerAccountsGroupsColumnIsEnabled,
diff --git a/packages/client/src/store/ThirdPartyStore.js b/packages/client/src/store/ThirdPartyStore.js
index dfc240167c..06d978b81b 100644
--- a/packages/client/src/store/ThirdPartyStore.js
+++ b/packages/client/src/store/ThirdPartyStore.js
@@ -84,7 +84,10 @@ class ThirdPartyStore {
oauthHref: storage.redirectUrl,
category: storage.name,
requiredConnectionUrl: storage.requiredConnectionUrl,
+ clientId: storage.clientId,
}));
+
+ return res;
};
saveThirdParty = (
diff --git a/packages/client/src/store/UploadDataStore.js b/packages/client/src/store/UploadDataStore.js
index fb1331c616..305ce7c1ed 100644
--- a/packages/client/src/store/UploadDataStore.js
+++ b/packages/client/src/store/UploadDataStore.js
@@ -25,9 +25,11 @@
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
import { makeAutoObservable, runInAction } from "mobx";
+import { Trans } from "react-i18next";
import { TIMEOUT } from "@docspace/client/src/helpers/filesConstants";
import uniqueid from "lodash/uniqueId";
import sumBy from "lodash/sumBy";
+import uniqBy from "lodash/uniqBy";
import { ConflictResolveType } from "@docspace/shared/enums";
import {
getFileInfo,
@@ -57,6 +59,8 @@ import {
getCategoryTypeByFolderType,
getCategoryUrl,
} from "SRC_DIR/helpers/utils";
+import { Link } from "@docspace/shared/components/link";
+import { globalColors } from "@docspace/shared/themes";
class UploadDataStore {
settingsStore;
@@ -636,7 +640,7 @@ class UploadDataStore {
if (this.uploaded || (this.isParallel && allFilesIsUploaded)) {
this.setConversionPercent(100);
- this.finishUploadFiles();
+ this.finishUploadFiles(t);
} else {
runInAction(() => {
this.converted = true;
@@ -773,7 +777,8 @@ class UploadDataStore {
file: file,
uniqueId: uniqueid("download_row-key_"),
fileId: null,
- toFolderId,
+ // toFolderId,
+ toFolderId: file.parentFolderId,
action: "upload",
error: file.size ? null : t("Files:EmptyFile"),
fileInfo: null,
@@ -1267,7 +1272,7 @@ class UploadDataStore {
let files = this.files;
if (files.length === 0 || this.filesSize === 0) {
- return this.finishUploadFiles();
+ return this.finishUploadFiles(t);
}
const progressData = {
@@ -1314,7 +1319,7 @@ class UploadDataStore {
}
if (!this.filesToConversion.length) {
- this.finishUploadFiles();
+ this.finishUploadFiles(t);
} else {
runInAction(() => {
this.uploaded = true;
@@ -1376,7 +1381,7 @@ class UploadDataStore {
toFolderId,
fileName,
fileSize,
- relativePath,
+ "", // relativePath,
file.encrypted,
file.lastModifiedDate,
createNewIfExist,
@@ -1516,7 +1521,7 @@ class UploadDataStore {
if (allFilesIsUploaded) {
if (!this.filesToConversion.length) {
- this.finishUploadFiles();
+ this.finishUploadFiles(t);
} else {
runInAction(() => {
this.uploaded = true;
@@ -1546,7 +1551,7 @@ class UploadDataStore {
});
};
- finishUploadFiles = () => {
+ finishUploadFiles = (t) => {
const { fetchFiles, filter } = this.filesStore;
const { withPaging } = this.settingsStore;
@@ -1558,7 +1563,7 @@ class UploadDataStore {
this.asyncUploadObj = {};
for (let item of this.tempFiles) {
- const { uploadFiles, folderId, t } = item;
+ const { uploadFiles, folderId } = item;
this.startUpload(uploadFiles, folderId, t);
}
this.tempFiles = [];
@@ -1566,12 +1571,36 @@ class UploadDataStore {
return;
}
- const totalErrorsCount = sumBy(this.files, (f) => {
- f.error && toastr.error(f.error);
- return f.error ? 1 : 0;
- });
+ const filesWithErrors = this.files.filter((f) => f.error);
+
+ const totalErrorsCount = filesWithErrors.length;
if (totalErrorsCount > 0) {
+ const uniqErrors = uniqBy(filesWithErrors, "error");
+ uniqErrors.forEach((f) =>
+ f.error.indexOf("password") > -1
+ ? toastr.warning(
+ {
+ toastr.clear();
+ this.setUploadPanelVisible(true);
+ }}
+ />,
+ ]}
+ />,
+ null,
+ 60000,
+ true,
+ )
+ : toastr.error(f.error),
+ );
+
this.primaryProgressDataStore.setPrimaryProgressBarShowError(true); // for empty file
this.primaryProgressDataStore.setPrimaryProgressBarErrors(
totalErrorsCount,
diff --git a/packages/client/src/store/UsersStore.js b/packages/client/src/store/UsersStore.js
index 6d5bf98f91..fec925f401 100644
--- a/packages/client/src/store/UsersStore.js
+++ b/packages/client/src/store/UsersStore.js
@@ -149,9 +149,14 @@ class UsersStore {
return Promise.resolve(result);
};
- removeUser = async (userId, filter) => {
+ removeUser = async (userId, filter, isInsideGroup) => {
+ const { refreshInsideGroup } = this.peopleStore.groupsStore;
+
await api.people.deleteUsers(userId);
- await this.getUsersList(filter, true);
+
+ isInsideGroup
+ ? await refreshInsideGroup()
+ : await this.getUsersList(filter, true);
};
get needResetUserSelection() {
diff --git a/packages/client/src/store/index.js b/packages/client/src/store/index.js
index b011fd0096..7893d982e2 100644
--- a/packages/client/src/store/index.js
+++ b/packages/client/src/store/index.js
@@ -102,7 +102,7 @@ const paymentStore = new PaymentStore(
);
const wizardStore = new WizardStore();
const confirmStore = new ConfirmStore();
-const backupStore = new BackupStore();
+const backupStore = new BackupStore(authStore, thirdPartyStore);
const commonStore = new CommonStore(settingsStore);
const ssoStore = new SsoFormStore();
@@ -239,6 +239,7 @@ const contextOptionsStore = new ContextOptionsStore(
pluginStore,
infoPanelStore,
currentTariffStatusStore,
+ currentQuotaStore,
userStore,
clientLoadingStore,
);
@@ -291,6 +292,7 @@ const createEditRoomStore = new CreateEditRoomStore(
infoPanelStore,
currentQuotaStore,
clientLoadingStore,
+ dialogsStore,
);
const webhooksStore = new WebhooksStore(settingsStore);
diff --git a/packages/client/webpack.config.js b/packages/client/webpack.config.js
index fb772dc9b1..2f7f9de839 100644
--- a/packages/client/webpack.config.js
+++ b/packages/client/webpack.config.js
@@ -324,16 +324,11 @@ module.exports = (env, argv) => {
};
}
- const remotes = {
- client: "client@/remoteEntry.js",
- login: "login@/login/remoteEntry.js",
- };
-
config.plugins.push(
new ModuleFederationPlugin({
name: "client",
filename: "remoteEntry.js",
- remotes: remotes,
+ remotes: [],
exposes: {
"./shell": "./src/Shell",
"./store": "./src/store",
diff --git a/packages/doceditor/src/app/(root)/page.tsx b/packages/doceditor/src/app/(root)/page.tsx
index c7652637a4..553af8bbe3 100644
--- a/packages/doceditor/src/app/(root)/page.tsx
+++ b/packages/doceditor/src/app/(root)/page.tsx
@@ -24,16 +24,17 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
-import type { Metadata } from "next";
import { headers } from "next/headers";
+import Script from "next/script";
import { getSelectorsByUserAgent } from "react-device-detect";
+import { ValidationStatus } from "@docspace/shared/enums";
+
import { getData, validatePublicRoomKey } from "@/utils/actions";
import { RootPageProps } from "@/types";
import Root from "@/components/Root";
import FilePassword from "@/components/file-password";
-import { ValidationStatus } from "@docspace/shared/enums";
const initialSearchParams: RootPageProps["searchParams"] = {
fileId: undefined,
@@ -71,8 +72,6 @@ async function Page({ searchParams }: RootPageProps) {
}
}
- const startDate = new Date();
-
const data = await getData(
fileId ?? fileid ?? "",
version,
@@ -82,13 +81,22 @@ async function Page({ searchParams }: RootPageProps) {
type,
);
- const timer = new Date().getTime() - startDate.getTime();
-
if (data.error?.status === "not-found" && error) {
data.error.message = error;
}
- return ;
+ let url = data.config?.editorUrl ?? data.error?.editorUrl;
+
+ if (url && !url.endsWith("/")) url += "/";
+
+ const docApiUrl = `${url}web-apps/apps/api/documents/api.js`;
+
+ return (
+ <>
+
+
+ >
+ );
}
export default Page;
diff --git a/packages/doceditor/src/components/Scripts.tsx b/packages/doceditor/src/components/Scripts.tsx
index f6ce4d74bf..e5f8e1a0be 100644
--- a/packages/doceditor/src/components/Scripts.tsx
+++ b/packages/doceditor/src/components/Scripts.tsx
@@ -24,6 +24,8 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+/* eslint-disable @next/next/no-before-interactive-script-outside-document */
+
import Script from "next/script";
import runtime from "../../../runtime.json";
@@ -35,9 +37,11 @@ const Scripts = () => {
<>
-