diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 71fdfefd16..bdabd4ef77 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -54,8 +54,8 @@ dependencies: specifier: ^7.3.1 version: 7.5.1 '@playwright/test': - specifier: ^1.41.2 - version: 1.41.2 + specifier: ^1.47.2 + version: 1.47.2 '@rush-temp/account': specifier: file:./projects/account.tgz version: file:projects/account.tgz(@types/node@20.11.19)(esbuild@0.20.1)(ts-node@10.9.2) @@ -1376,9 +1376,12 @@ dependencies: '@vercel/webpack-asset-relocator-loader': specifier: ^1.7.3 version: 1.7.4 + allure-js-commons: + specifier: ^3.0.4 + version: 3.0.4(allure-playwright@3.0.4) allure-playwright: - specifier: ^2.9.2 - version: 2.12.2 + specifier: ^3.0.4 + version: 3.0.4(@playwright/test@1.47.2) autolinker: specifier: 4.0.0 version: 4.0.0 @@ -1724,6 +1727,9 @@ dependencies: pdfjs-dist: specifier: 2.12.313 version: 2.12.313 + pg: + specifier: 8.12.0 + version: 8.12.0 png-chunks-extract: specifier: ^1.0.0 version: 1.0.0 @@ -6060,12 +6066,12 @@ packages: dev: false optional: true - /@playwright/test@1.41.2: - resolution: {integrity: sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg==} - engines: {node: '>=16'} + /@playwright/test@1.47.2: + resolution: {integrity: sha512-jTXRsoSPONAs8Za9QEQdyjFn+0ZQFjCiIztAIF6bi1HqhBzG9Ma7g1WotyiGqFSBRZjIEqMdT8RUlbk1QVhzCQ==} + engines: {node: '>=18'} hasBin: true dependencies: - playwright: 1.41.2 + playwright: 1.47.2 dev: false /@polka/url@1.0.0-next.24: @@ -10563,17 +10569,25 @@ packages: require-from-string: 2.0.2 dev: false - /allure-js-commons@2.12.2: - resolution: {integrity: sha512-bapkOHuwOYFR62aeNNwFmf8+LZSchzQ4Q8cFXWvEqP5fBTgADA+GujsRl936gjmTmKWVmKYwQfUt+PZw6tgFzw==} + /allure-js-commons@3.0.4(allure-playwright@3.0.4): + resolution: {integrity: sha512-/UgTzpd7a16t8WpkA/25acmkk8xwwYUK3YDeVcZb1+3+7HHZRE943ZlKxUF/LCeLrZEFgYmOtma9xmaHagSddw==} + peerDependencies: + allure-playwright: 3.0.4 + peerDependenciesMeta: + allure-playwright: + optional: true dependencies: - properties: 1.2.1 - strip-ansi: 5.2.0 + allure-playwright: 3.0.4(@playwright/test@1.47.2) + md5: 2.3.0 dev: false - /allure-playwright@2.12.2: - resolution: {integrity: sha512-QvDyCHABYlZ02PyGevbBZc9tS+Li0zXhTaTC1IJ2wJrd8q9cSS3mUnzAJUjPUuCtofdLBwePd2AuzsYE2ZXEJQ==} + /allure-playwright@3.0.4(@playwright/test@1.47.2): + resolution: {integrity: sha512-P2QBUZfEtqof3PLonVXcO2BdaYmWKGRDy4Ehl4dcAGsXdfS5QdrNat+DmR5BMxBNQgvf1805fGBeZh2Zn0gagQ==} + peerDependencies: + '@playwright/test': '>=1.36.0' dependencies: - allure-js-commons: 2.12.2 + '@playwright/test': 1.47.2 + allure-js-commons: 3.0.4(allure-playwright@3.0.4) dev: false /ansi-colors@4.1.3: @@ -10604,11 +10618,6 @@ packages: engines: {node: '>=4'} dev: false - /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - dev: false - /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -11751,6 +11760,10 @@ packages: engines: {node: '>=10'} dev: false + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: false + /cheerio@0.22.0: resolution: {integrity: sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==} engines: {node: '>= 0.6'} @@ -12398,6 +12411,10 @@ packages: which: 2.0.2 dev: false + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: false + /crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} dev: false @@ -16391,6 +16408,10 @@ packages: has-tostringtag: 1.0.2 dev: false + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: false + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -18387,6 +18408,14 @@ packages: dev: false optional: true + /md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false + /mdast-util-definitions@4.0.0: resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} dependencies: @@ -20123,18 +20152,18 @@ packages: find-up: 3.0.0 dev: false - /playwright-core@1.41.2: - resolution: {integrity: sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==} - engines: {node: '>=16'} + /playwright-core@1.47.2: + resolution: {integrity: sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==} + engines: {node: '>=18'} hasBin: true dev: false - /playwright@1.41.2: - resolution: {integrity: sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==} - engines: {node: '>=16'} + /playwright@1.47.2: + resolution: {integrity: sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==} + engines: {node: '>=18'} hasBin: true dependencies: - playwright-core: 1.41.2 + playwright-core: 1.47.2 optionalDependencies: fsevents: 2.3.2 dev: false @@ -20501,11 +20530,6 @@ packages: react-is: 16.13.1 dev: false - /properties@1.2.1: - resolution: {integrity: sha512-qYNxyMj1JeW54i/EWEFsM1cVwxJbtgPp8+0Wg9XjNaK6VE/c4oRi6PNu5p7w1mNXEIQIjV5Wwn8v8Gz82/QzdQ==} - engines: {node: '>=0.10'} - dev: false - /prosemirror-changeset@2.2.1: resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} dependencies: @@ -22400,13 +22424,6 @@ packages: ansi-regex: 3.0.1 dev: false - /strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - dependencies: - ansi-regex: 4.1.1 - dev: false - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -24945,7 +24962,7 @@ packages: dev: false file:projects/account.tgz(@types/node@20.11.19)(esbuild@0.20.1)(ts-node@10.9.2): - resolution: {integrity: sha512-bbpUd2zTOQEGPo6LCVfEp6pEiTxJrOXKHPmgVroenH1xPt7DuZWb3HRVym5E39Acx4vUMd85ySKNlmJKMCE0ZQ==, tarball: file:projects/account.tgz} + resolution: {integrity: sha512-dp4BS+teiLPEg/gxddOhYSuaxjuzascxr49DMYfpm4OZEFHdTOHlO3bJXGddaDLgCbT4OcG77W0rdFo38T5/bA==, tarball: file:projects/account.tgz} id: file:projects/account.tgz name: '@rush-temp/account' version: 0.0.0 @@ -25099,7 +25116,7 @@ packages: dev: false file:projects/ai-bot-resources.tgz(@types/node@20.11.19)(esbuild@0.20.1)(postcss-load-config@4.0.2)(postcss@8.4.35)(ts-node@10.9.2): - resolution: {integrity: sha512-kUT09zDslxlN/ni38NdRvzE4WtOBOtKbqKqTNvTDP78hcjh7rT3CnWpMUQGnDNI5rzQWiVAaWoHKf2LAHFolRQ==, tarball: file:projects/ai-bot-resources.tgz} + resolution: {integrity: sha512-VUzWp9Le++agPkh/Sq5V8y1LHVSofd+WOJNwkYFDWlJH0+TKM1F88CFBANOYUlg2ZvhOQGyLCCFTcjbPohfnSQ==, tarball: file:projects/ai-bot-resources.tgz} id: file:projects/ai-bot-resources.tgz name: '@rush-temp/ai-bot-resources' version: 0.0.0 @@ -25384,7 +25401,7 @@ packages: dev: false file:projects/attachment-resources.tgz(@types/node@20.11.19)(esbuild@0.20.1)(postcss-load-config@4.0.2)(postcss@8.4.35)(ts-node@10.9.2): - resolution: {integrity: sha512-yEPWonMOvXhIk5+IaNQVsyw6wnfqdcB/4UsEh8BLCQwhpepBeVrNSXgS+mLspQaL9g15E81PHwyrWyF1OcqQOQ==, tarball: file:projects/attachment-resources.tgz} + resolution: {integrity: sha512-+/KTqroAiloV0TUV9iGmUInkS19oAY6pZ4cs/eeiOjX8ZIuLN/O7j1rbhldscXI1ZqmEYFtjTFKAxy7qMu21KQ==, tarball: file:projects/attachment-resources.tgz} id: file:projects/attachment-resources.tgz name: '@rush-temp/attachment-resources' version: 0.0.0 @@ -25430,7 +25447,7 @@ packages: dev: false file:projects/attachment.tgz(@types/node@20.11.19)(esbuild@0.20.1)(ts-node@10.9.2): - resolution: {integrity: sha512-WiT8xtpwwGxmbvGxcHOH8JGj7rZqvwEmaEdTQeHMv/i3fRzT082qjXooTEKrcuMS6e5t33YosRJlq1X1NypNKQ==, tarball: file:projects/attachment.tgz} + resolution: {integrity: sha512-AOC7vKQzBuyM3NGVPnc8wLlrnvf6ve7CT/v4pNBI3ZC5DLXRHkeu4EhUmEujtM0dSUWXukGFnTpgjBYxr2b8Ww==, tarball: file:projects/attachment.tgz} id: file:projects/attachment.tgz name: '@rush-temp/attachment' version: 0.0.0 @@ -26213,7 +26230,7 @@ packages: dev: false file:projects/contact-resources.tgz(@types/node@20.11.19)(esbuild@0.20.1)(postcss-load-config@4.0.2)(postcss@8.4.35)(ts-node@10.9.2): - resolution: {integrity: sha512-MzZXj700B09rHWIeXhV8qKlv9OTeZvERBG/Clv+H6OyU9CR03EZpiYEYM725EjYKMTvso1XWsYbjEBfwBi0LYg==, tarball: file:projects/contact-resources.tgz} + resolution: {integrity: sha512-sQ0Exvw6ccJ6ioZzPui/xPCWfHp/ogGskjbC/w4tjTZEE7Lwu+nDyt+QNZwC0rjRAu0FuZOGFsEc4JyWApez1w==, tarball: file:projects/contact-resources.tgz} id: file:projects/contact-resources.tgz name: '@rush-temp/contact-resources' version: 0.0.0 @@ -27678,7 +27695,7 @@ packages: dev: false file:projects/import-tool.tgz: - resolution: {integrity: sha512-8ZQpX7QgWZYBsG/Q307gT9dkAHebML7MeKTbOFsDRCcmj4lddBknHeP2m4LH2ZP7xk8dBuvnKR6SY0HwesLOrg==, tarball: file:projects/import-tool.tgz} + resolution: {integrity: sha512-QBo/RgAGnie95pESqQNJUQSCpQi1rEpXqZz1G1zZMfhAvisZtW2XutmaGMS1oDu2ZB05pk8WOO8x6bfdc+keZg==, tarball: file:projects/import-tool.tgz} name: '@rush-temp/import-tool' version: 0.0.0 dependencies: @@ -28289,7 +28306,7 @@ packages: dev: false file:projects/model-ai-bot.tgz: - resolution: {integrity: sha512-6ekOX88mYJEa+Lb+afb39noLVKRq935cP1EfVu9aqV5xbhFt6f1jKiDNz6eLtoR4zb/P8tBkFLfnu59rYMcIoA==, tarball: file:projects/model-ai-bot.tgz} + resolution: {integrity: sha512-tdvrfRa0PZZCWrUq5QqiZi4Bex97OgR7tMHVLMUJhhg7lJOnR9nyjFKn+X0lEI79pi0sllds53Ksdmi5Kd+OlQ==, tarball: file:projects/model-ai-bot.tgz} name: '@rush-temp/model-ai-bot' version: 0.0.0 dependencies: @@ -28348,7 +28365,7 @@ packages: dev: false file:projects/model-attachment.tgz: - resolution: {integrity: sha512-l6ido0KZWoQdDjZCYPzyauy2JZk04kXh48IpVSb4t4UwPfRXQKdKNZFecJxEyIkXW5T2uFYsWSpg+w7jYx85hw==, tarball: file:projects/model-attachment.tgz} + resolution: {integrity: sha512-DL/rIDjQ6d9r5gmpgzyLRkhlNNXE/3f0R5Ov5ZjvN4i6ghQSO5oeRW5qzm4MA3GtbIi6w8WOj8bSqJUW5hIsaw==, tarball: file:projects/model-attachment.tgz} name: '@rush-temp/model-attachment' version: 0.0.0 dependencies: @@ -28443,7 +28460,7 @@ packages: dev: false file:projects/model-contact.tgz: - resolution: {integrity: sha512-9JJBL0yu2LgUDzo51X9QPO+RyMeekvbXSIozSXKQR1ju3mYZoTlxsLPkqwh4qWYfUNYQyKCmyBtP7GlYsw27qw==, tarball: file:projects/model-contact.tgz} + resolution: {integrity: sha512-xIr8DSFUT2GSZ/4VvDc1zrlab+WhjCCM2tN/TNBEGroVUL2QW0/3VqODWs0UorvniaVWVoQNAj13cPZpE7yEfw==, tarball: file:projects/model-contact.tgz} name: '@rush-temp/model-contact' version: 0.0.0 dependencies: @@ -28520,7 +28537,7 @@ packages: dev: false file:projects/model-document.tgz: - resolution: {integrity: sha512-aQ1dqQdlY2Lc/HpchhCuHa3+9hqLhLA/I1OyVFBd1ap+qHLlLo5PyNnQE/laSmgW/3ULKXMG1xm3jRcmTT4VdA==, tarball: file:projects/model-document.tgz} + resolution: {integrity: sha512-tSr57oIXY1fECAB/axaDBJLSh/RVC4BXacjVHQ4wx3y+buoNngZoX9kpJsbNxEjCpW8yyhWwO1+sseyBi9RJdg==, tarball: file:projects/model-document.tgz} name: '@rush-temp/model-document' version: 0.0.0 dependencies: @@ -29679,7 +29696,7 @@ packages: dev: false file:projects/model-workbench.tgz: - resolution: {integrity: sha512-z/AtGaisKD57xttmNL8GsaX8ZvJ/LNqzZql5Kw9SDB1YKJIkICPGaT2WP+Os6mEd0B5dUHdrrfyxbVbXxPLyMA==, tarball: file:projects/model-workbench.tgz} + resolution: {integrity: sha512-V2NutYIJW4PcOf9i3vSpV5znaXD8SkItzvSnacTmbGWDjBkp7/pa8M5xFfoqoncMaGYerLAnsSlaxxw2k6i+TQ==, tarball: file:projects/model-workbench.tgz} name: '@rush-temp/model-workbench' version: 0.0.0 dependencies: @@ -30174,7 +30191,7 @@ packages: dev: false file:projects/pod-ai-bot.tgz(bufferutil@4.0.8)(utf-8-validate@6.0.4)(zod@3.23.8): - resolution: {integrity: sha512-5UmhFvpzsbI/QsMVitLsuANDxxsBo0me4HqpGVbAdMEUhTwaa1MvbCWCsWN8TQFlrEsRXv6iiv3ysiHi7LaWmA==, tarball: file:projects/pod-ai-bot.tgz} + resolution: {integrity: sha512-86BRJHqw7YBa4uTCvjyITwGUenWTJ6iSwZHZAI9Tf3gotChn1AhfK0HVVgGVQE+TGmW5R+oLx8s4NBMGBiZx1A==, tarball: file:projects/pod-ai-bot.tgz} id: file:projects/pod-ai-bot.tgz name: '@rush-temp/pod-ai-bot' version: 0.0.0 @@ -31463,17 +31480,18 @@ packages: dev: false file:projects/qms-tests-sanity.tgz: - resolution: {integrity: sha512-2NJnLTGNRdrMXybXslRQNNCyyDLmsA069UyXn8uBG/WQaMHzr9rTXvtRpltXSfgCn+WAc8VidyT68O6J8RAPQA==, tarball: file:projects/qms-tests-sanity.tgz} + resolution: {integrity: sha512-WH2sJcYUwJBzqHng4F/ceE1IkB4XD5HhfdsuSBgCSVD5jsqm+V39F0+AFmLhgQsJuvwd6D2rM/RaCE1hHmGxPw==, tarball: file:projects/qms-tests-sanity.tgz} name: '@rush-temp/qms-tests-sanity' version: 0.0.0 dependencies: '@faker-js/faker': 8.4.1 - '@playwright/test': 1.41.2 + '@playwright/test': 1.47.2 '@types/jest': 29.5.12 '@types/node': 20.11.19 '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - allure-playwright: 2.12.2 + allure-js-commons: 3.0.4(allure-playwright@3.0.4) + allure-playwright: 3.0.4(@playwright/test@1.47.2) cross-env: 7.0.3 dotenv: 16.0.3 eslint: 8.56.0 @@ -35014,17 +35032,18 @@ packages: dev: false file:projects/tests-sanity.tgz: - resolution: {integrity: sha512-w1P9UqT2V0jsmryhTVIu4kmS0zK+Sb7rMuJiJMdgYoXknh1eSjImVEcZgScK2O/ujQSBTlgEla6YFnuxaIbMTQ==, tarball: file:projects/tests-sanity.tgz} + resolution: {integrity: sha512-Ii9d6GDonR1QAp1S1uBqI6QdL7y/Xm3PC7W/HkwUtv8QTH1/gEslKOo6dXE7jxE1rHJigMWiy3ZP1+PHLFnuhg==, tarball: file:projects/tests-sanity.tgz} name: '@rush-temp/tests-sanity' version: 0.0.0 dependencies: '@faker-js/faker': 8.4.1 - '@playwright/test': 1.41.2 + '@playwright/test': 1.47.2 '@types/jest': 29.5.12 '@types/node': 20.11.19 '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - allure-playwright: 2.12.2 + allure-js-commons: 3.0.4(allure-playwright@3.0.4) + allure-playwright: 3.0.4(@playwright/test@1.47.2) cross-env: 7.0.3 dotenv: 16.0.3 eslint: 8.56.0 diff --git a/packages/platform/src/i18n.ts b/packages/platform/src/i18n.ts index e70869bde5..4534f01139 100644 --- a/packages/platform/src/i18n.ts +++ b/packages/platform/src/i18n.ts @@ -85,6 +85,25 @@ async function loadTranslationsForComponent (plugin: Plugin, locale: string): Pr } } +function getCachedTranslation (id: _IdInfo, locale: string): IntlString | Status | undefined { + const localtTanslations = translations.get(locale) + if (localtTanslations === undefined) { + return undefined + } + const messages = localtTanslations.get(id.component) + if (messages === undefined) { + return undefined + } + if (messages instanceof Status) { + return messages + } + if (id.kind !== undefined) { + if ((messages[id.kind] as Record)?.[id.name] !== undefined) { + return (messages[id.kind] as Record)?.[id.name] + } + } +} + async function getTranslation (id: _IdInfo, locale: string): Promise { try { const localtTanslations = translations.get(locale) ?? new Map>() @@ -152,7 +171,7 @@ export async function translate

> ( if (id.component === _EmbeddedId) { return id.name } - const translation = (await getTranslation(id, locale)) ?? message + const translation = getCachedTranslation(id, locale) ?? (await getTranslation(id, locale)) ?? message if (translation instanceof Status) { localCache.set(message, translation) return message @@ -162,9 +181,66 @@ export async function translate

> ( return compiled.format(params) } catch (err) { const status = unknownError(err) - await setPlatformStatus(status) + void setPlatformStatus(status) localCache.set(message, status) return message } } } +/** + * Will do a translation in case language file already in cache, a translate is called and Promise is returned overwise + */ +export function translateCB

> ( + message: IntlString

, + params: P, + language: string | undefined, + resolve: (value: string) => void +): void { + const locale = language ?? getMetadata(platform.metadata.locale) ?? 'en' + const localCache = cache.get(locale) ?? new Map() + if (!cache.has(locale)) { + cache.set(locale, localCache) + } + const compiled = localCache.get(message) + + if (compiled !== undefined) { + if (compiled instanceof Status) { + resolve(message) + return + } + resolve(compiled.format(params)) + } else { + let id: _IdInfo + try { + id = _parseId(message) + if (id.component === _EmbeddedId) { + resolve(id.name) + return + } + } catch (err) { + const status = unknownError(err) + void setPlatformStatus(status) + localCache.set(message, status) + resolve(message) + return + } + const translation = getCachedTranslation(id, locale) + if (translation === undefined || translation instanceof Status) { + void translate(message, params, language) + .then((res) => { + resolve(res) + }) + .catch((err) => { + const status = unknownError(err) + void setPlatformStatus(status) + localCache.set(message, status) + resolve(message) + }) + return + } + + const compiled = new IntlMessageFormat(translation, locale, undefined, { ignoreTag: true }) + localCache.set(message, compiled) + resolve(compiled.format(params)) + } +} diff --git a/packages/platform/src/resource.ts b/packages/platform/src/resource.ts index a48db31eb2..2152d003b0 100644 --- a/packages/platform/src/resource.ts +++ b/packages/platform/src/resource.ts @@ -70,9 +70,9 @@ function getLocation (plugin: Plugin): PluginLoader { return location } -const loading = new Map>() +const loading = new Map>() -async function loadPlugin (id: Plugin): Promise { +function loadPlugin (id: Plugin): Resources | Promise { let pluginLoader = loading.get(id) if (pluginLoader === undefined) { const status = new Status(Severity.INFO, platform.status.LoadingPlugin, { @@ -99,7 +99,7 @@ async function loadPlugin (id: Plugin): Promise { ) loading.set(id, pluginLoader) } - return await pluginLoader + return pluginLoader } const cachedResource = new Map() @@ -115,8 +115,12 @@ export async function getResource (resource: Resource): Promise { return cached } const info = _parseId(resource) - const resources = loading.get(info.component) ?? loadPlugin(info.component) - const value = (await resources)[info.kind]?.[info.name] + let resources = loading.get(info.component) ?? loadPlugin(info.component) + if (resources instanceof Promise) { + resources = await resources + loading.set(info.component, resources) + } + const value = resources[info.kind]?.[info.name] if (value === undefined) { throw new PlatformError(new Status(Severity.ERROR, platform.status.ResourceNotFound, { resource })) } @@ -124,6 +128,15 @@ export async function getResource (resource: Resource): Promise { return value } +/** + * @public + * @param resource - + * @returns + */ +export function getResourceP (resource: Resource): T | Promise { + return cachedResource.get(resource) ?? getResource(resource) +} + /** * @public */ diff --git a/packages/presentation/src/components/markup/Node.svelte b/packages/presentation/src/components/markup/Node.svelte index 16a62283e0..66e0d20b0f 100644 --- a/packages/presentation/src/components/markup/Node.svelte +++ b/packages/presentation/src/components/markup/Node.svelte @@ -25,7 +25,11 @@ {#if node} {@const marks = node.marks ?? []} - + {#if marks.length > 0} + + + + {:else} - + {/if} {/if} diff --git a/packages/presentation/src/components/markup/NodeContent.svelte b/packages/presentation/src/components/markup/NodeContent.svelte index db31fd0f8d..381b6c1155 100644 --- a/packages/presentation/src/components/markup/NodeContent.svelte +++ b/packages/presentation/src/components/markup/NodeContent.svelte @@ -16,9 +16,9 @@ import { Class, Doc, Ref } from '@hcengineering/core' import { AttrValue, MarkupNode, MarkupNodeType } from '@hcengineering/text' - import MarkupNodes from './Nodes.svelte' import CodeBlockNode from './CodeBlockNode.svelte' import ObjectNode from './ObjectNode.svelte' + import Node from './Node.svelte' export let node: MarkupNode export let preview = false @@ -52,16 +52,28 @@ {@const nodes = node.content ?? []} {#if node.type === MarkupNodeType.doc} - + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if} {:else if node.type === MarkupNodeType.text} {node.text} {:else if node.type === MarkupNodeType.paragraph}

- + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if}

{:else if node.type === MarkupNodeType.blockquote}
- + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if}
{:else if node.type === MarkupNodeType.horizontal_rule}
@@ -69,7 +81,11 @@ {@const level = toNumber(node.attrs?.level) ?? 1} {@const element = `h${level}`} - + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if} {:else if node.type === MarkupNodeType.code_block} @@ -88,22 +104,36 @@ {#if objectClass !== undefined && objectId !== undefined} - {:else} - + {:else if nodes.length > 0} + {#each nodes as node} + + {/each} {/if} {:else if node.type === MarkupNodeType.hard_break}
{:else if node.type === MarkupNodeType.ordered_list}
    - + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if}
{:else if node.type === MarkupNodeType.bullet_list}
    - + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if}
{:else if node.type === MarkupNodeType.list_item}
  • - + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if}
  • {:else if node.type === MarkupNodeType.taskList} @@ -111,33 +141,57 @@ {:else if node.type === MarkupNodeType.subLink} - + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if} {:else if node.type === MarkupNodeType.table} - + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if}
    {:else if node.type === MarkupNodeType.table_row} - + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if} {:else if node.type === MarkupNodeType.table_cell} {@const colspan = toNumber(attrs.colspan)} {@const rowspan = toNumber(attrs.rowspan)} - + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if} {:else if node.type === MarkupNodeType.table_header} {@const colspan = toNumber(attrs.colspan)} {@const rowspan = toNumber(attrs.rowspan)} - + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if} {:else} unknown node: "{node.type}" - + {#if nodes.length > 0} + {#each nodes as node} + + {/each} + {/if} {/if} {/if} diff --git a/packages/presentation/src/components/markup/Nodes.svelte b/packages/presentation/src/components/markup/Nodes.svelte deleted file mode 100644 index ed8c81f071..0000000000 --- a/packages/presentation/src/components/markup/Nodes.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - - -{#if nodes} - {#each nodes as node} - - {/each} -{/if} diff --git a/packages/ui/src/components/Component.svelte b/packages/ui/src/components/Component.svelte index c9b5756675..eeb4909f8d 100644 --- a/packages/ui/src/components/Component.svelte +++ b/packages/ui/src/components/Component.svelte @@ -13,7 +13,7 @@ // limitations under the License. --> -{#if _is} - {#await component} +{#if _is != null} + {#if loading} {#if showLoading} {/if} - {:then Ctor} - + {:else if Ctor != null} + {#if $$slots.default !== undefined} - - + {:else} - {/if} - {:catch err} -
    -      
    -    
    - - {/await} + {/if} +{/if} +{#if error != null} +
    +    
    +  
    {/if} diff --git a/packages/ui/src/components/DropdownPopup.svelte b/packages/ui/src/components/DropdownPopup.svelte index 3a30442b6e..bf75edb2c8 100644 --- a/packages/ui/src/components/DropdownPopup.svelte +++ b/packages/ui/src/components/DropdownPopup.svelte @@ -14,14 +14,14 @@ --> {#if text} diff --git a/packages/ui/src/components/ModeSelector.svelte b/packages/ui/src/components/ModeSelector.svelte index db8123ce27..62bfd1fecd 100644 --- a/packages/ui/src/components/ModeSelector.svelte +++ b/packages/ui/src/components/ModeSelector.svelte @@ -8,25 +8,30 @@ export let expansion: 'stretch' | 'default' = 'default' export let padding: string | undefined = undefined - $: modeList = props.config.map((c) => { - return { - id: c[0], - labelIntl: c[1], - labelParams: c[2], - action: () => { - props.onChange(c[0]) - } - } - }) + $: modeList = + props.config != null + ? props.config.map((c) => { + return { + id: c[0], + labelIntl: c[1], + labelParams: c[2], + action: () => { + props.onChange(c[0]) + } + } + }) + : [] - { - if (result.detail !== undefined && result.detail.action) result.detail.action() - }} -/> +{#if modeList.length > 0} + { + if (result.detail !== undefined && result.detail.action) result.detail.action() + }} + /> +{/if} diff --git a/packages/ui/src/components/ModernEditbox.svelte b/packages/ui/src/components/ModernEditbox.svelte index de5ce3564d..93b61e9467 100644 --- a/packages/ui/src/components/ModernEditbox.svelte +++ b/packages/ui/src/components/ModernEditbox.svelte @@ -4,11 +4,11 @@ // Licensed under the Eclipse Public License v2.0 (SPDX: EPL-2.0). // + import { IntlString, translateCB } from '@hcengineering/platform' import { createEventDispatcher, onMount } from 'svelte' - import { IntlString, translate } from '@hcengineering/platform' + import { themeStore } from '..' import { registerFocus } from '../focus' import Label from './Label.svelte' - import { themeStore } from '..' export let label: IntlString export let value: string | undefined = undefined @@ -28,7 +28,7 @@ $: maxlength = limit === 0 ? null : limit let placeholderStr: string = '' - $: ph = translate(label, {}, $themeStore.language).then((r) => { + $: translateCB(label, {}, $themeStore.language, (r) => { placeholderStr = r }) $: labeled = kind === 'default' && size === 'large' diff --git a/packages/ui/src/components/NumberInput.svelte b/packages/ui/src/components/NumberInput.svelte index d5df823ef4..7f1db1244b 100644 --- a/packages/ui/src/components/NumberInput.svelte +++ b/packages/ui/src/components/NumberInput.svelte @@ -14,16 +14,16 @@ --> { + $: translateCB(placeholder, {}, $themeStore.language, (res) => { phTranslate = res }) diff --git a/plugins/chunter-resources/src/components/ChannelScrollView.svelte b/plugins/chunter-resources/src/components/ChannelScrollView.svelte index 7d94424e32..fb8a9a5b97 100644 --- a/plugins/chunter-resources/src/components/ChannelScrollView.svelte +++ b/plugins/chunter-resources/src/components/ChannelScrollView.svelte @@ -635,15 +635,23 @@ loadMore() } + let timer: any + function saveScrollPosition (): void { if (!scrollElement) { return } - const { offsetHeight, scrollHeight, scrollTop } = scrollElement + prevScrollHeight = scrollElement.scrollHeight - prevScrollHeight = scrollHeight - isScrollAtBottom = scrollHeight <= Math.ceil(scrollTop + offsetHeight) + clearTimeout(timer) + setTimeout(() => { + if (!scrollElement) { + return + } + const { offsetHeight, scrollHeight, scrollTop } = scrollElement + isScrollAtBottom = scrollHeight <= Math.ceil(scrollTop + offsetHeight) + }, 15) } beforeUpdate(() => { diff --git a/plugins/client-resources/src/connection.ts b/plugins/client-resources/src/connection.ts index 030d7e1acb..b7ef6fbd8a 100644 --- a/plugins/client-resources/src/connection.ts +++ b/plugins/client-resources/src/connection.ts @@ -495,7 +495,7 @@ class Connection implements ClientConnection { } } - private async sendRequest (data: { + private sendRequest (data: { method: string params: any[] // If not defined, on reconnect with timeout, will retry automatically. @@ -505,7 +505,7 @@ class Connection implements ClientConnection { measure?: (time: number, result: any, serverTime: number, queue: number, toRecieve: number) => void allowReconnect?: boolean }): Promise { - return await this.ctx.newChild('send-request', {}).with(data.method, {}, async (ctx) => { + return this.ctx.newChild('send-request', {}).with(data.method, {}, async (ctx) => { if (this.closed) { throw new PlatformError(unknownError('connection closed')) } @@ -530,7 +530,7 @@ class Connection implements ClientConnection { await w } this.requests.set(id, promise) - const sendData = async (): Promise => { + const sendData = (): void => { if (this.websocket?.readyState === ClientSocketReadyState.OPEN) { promise.startTime = Date.now() @@ -553,23 +553,25 @@ class Connection implements ClientConnection { setTimeout(async () => { // In case we don't have response yet. if (this.requests.has(id) && ((await data.retry?.()) ?? true)) { - void sendData() + sendData() } }, 50) } } - void ctx.with('send-data', {}, () => sendData()) + ctx.withSync('send-data', {}, () => { + sendData() + }) void ctx.with('broadcast-event', {}, () => broadcastEvent(client.event.NetworkRequests, this.requests.size)) return await promise.promise }) } - async loadModel (last: Timestamp, hash?: string): Promise { - return await this.sendRequest({ method: 'loadModel', params: [last, hash] }) + loadModel (last: Timestamp, hash?: string): Promise { + return this.sendRequest({ method: 'loadModel', params: [last, hash] }) } - async getAccount (): Promise { - return await this.sendRequest({ method: 'getAccount', params: [] }) + getAccount (): Promise { + return this.sendRequest({ method: 'getAccount', params: [] }) } async findAll( diff --git a/plugins/contact-resources/src/components/ChannelEditor.svelte b/plugins/contact-resources/src/components/ChannelEditor.svelte index 33c6c6d26c..3af0c257d9 100644 --- a/plugins/contact-resources/src/components/ChannelEditor.svelte +++ b/plugins/contact-resources/src/components/ChannelEditor.svelte @@ -16,7 +16,7 @@ import { Channel } from '@hcengineering/contact' import { Data } from '@hcengineering/core' import type { IntlString } from '@hcengineering/platform' - import { translate } from '@hcengineering/platform' + import { translateCB } from '@hcengineering/platform' import { copyTextToClipboard } from '@hcengineering/presentation' import { Button, @@ -32,8 +32,8 @@ showPopup, themeStore } from '@hcengineering/ui' - import { ContextMenu } from '@hcengineering/view-resources' import view from '@hcengineering/view' + import { ContextMenu } from '@hcengineering/view-resources' import { afterUpdate, createEventDispatcher, onMount } from 'svelte' import plugin from '../plugin' import IconCopy from './icons/Copy.svelte' @@ -47,10 +47,10 @@ const dispatch = createEventDispatcher() let input: HTMLInputElement let phTranslate: string - $: translate(placeholder, {}, $themeStore.language).then((tr) => (phTranslate = tr)) + $: translateCB(placeholder, {}, $themeStore.language, (tr) => (phTranslate = tr)) let label: IntlString = plugin.string.CopyToClipboard let lTranslate: string - $: translate(label, {}, $themeStore.language).then((tr) => (lTranslate = tr)) + $: translateCB(label, {}, $themeStore.language, (tr) => (lTranslate = tr)) let show: boolean = false const copyChannel = (): void => { diff --git a/plugins/contact-resources/src/components/MembersPresenter.svelte b/plugins/contact-resources/src/components/MembersPresenter.svelte index 49cf08126a..9cf8e91525 100644 --- a/plugins/contact-resources/src/components/MembersPresenter.svelte +++ b/plugins/contact-resources/src/components/MembersPresenter.svelte @@ -13,12 +13,12 @@ // limitations under the License. -->