Просмотр исходного кода

Revert "Merge branch 'master' into feat/growi-ai-next"

This reverts commit a770ebbe0bb70758f10cd2239ac3ef7c0f99d1e3, reversing
changes made to a62c1c6a649f5bc70ec93b2f3f863c05ac4817e0.
Shun Miyazawa 1 год назад
Родитель
Сommit
db3f03f856
100 измененных файлов с 368 добавлено и 372 удалено
  1. 0 1
      .devcontainer/compose.yml
  2. 3 3
      .github/workflows/codeql-analysis.yml
  3. 2 2
      .github/workflows/release-rc-scheduled.yml
  4. 1 1
      .github/workflows/release-rc.yml
  5. 1 1
      .github/workflows/release-slackbot-proxy.yml
  6. 1 1
      .github/workflows/release.yml
  7. 1 1
      .github/workflows/reusable-app-create-manifests.yml
  8. 1 1
      .github/workflows/reusable-app-prod.yml
  9. 1 22
      CHANGELOG.md
  10. 10 0
      apps/app/.eslintrc.js
  11. 9 7
      apps/app/package.json
  12. 37 43
      apps/app/playwright/20-basic-features/comments.spec.ts
  13. 100 100
      apps/app/public/static/locales/fr_FR/admin.json
  14. 30 16
      apps/app/public/static/locales/fr_FR/commons.json
  15. 64 65
      apps/app/public/static/locales/fr_FR/translation.json
  16. 1 1
      apps/app/src/client/components/Admin/AdminHome/EnvVarsTable.tsx
  17. 1 1
      apps/app/src/client/components/Admin/App/AppSetting.jsx
  18. 1 1
      apps/app/src/client/components/Admin/App/AwsSetting.tsx
  19. 1 1
      apps/app/src/client/components/Admin/App/AzureSetting.tsx
  20. 2 2
      apps/app/src/client/components/Admin/App/FileUploadSetting.tsx
  21. 1 1
      apps/app/src/client/components/Admin/App/GcsSetting.tsx
  22. 1 1
      apps/app/src/client/components/Admin/App/MaskedInput.tsx
  23. 1 1
      apps/app/src/client/components/Admin/App/QuestionnaireSettings.tsx
  24. 1 1
      apps/app/src/client/components/Admin/Common/AdminInstallButtonRow.tsx
  25. 1 1
      apps/app/src/client/components/Admin/Common/AdminUpdateButtonRow.tsx
  26. 1 1
      apps/app/src/client/components/Admin/Common/LabeledProgressBar.tsx
  27. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeCssSetting.tsx
  28. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeFunctionOption.tsx
  29. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeFunctionSetting.tsx
  30. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeLayoutSetting.tsx
  31. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeLogoSetting.tsx
  32. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeNoscriptSetting.tsx
  33. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizePresentationSetting.tsx
  34. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeScriptSetting.tsx
  35. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeSidebarSetting.tsx
  36. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeThemeOptions.tsx
  37. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeThemeSetting.tsx
  38. 1 1
      apps/app/src/client/components/Admin/Customize/ThemeColorBox.tsx
  39. 1 1
      apps/app/src/client/components/Admin/ElasticsearchManagement/NormalizeIndicesControls.tsx
  40. 1 1
      apps/app/src/client/components/Admin/ElasticsearchManagement/ReconnectControls.tsx
  41. 1 1
      apps/app/src/client/components/Admin/ExportArchiveData/ArchiveFilesTable.tsx
  42. 1 1
      apps/app/src/client/components/Admin/ExportArchiveData/ArchiveFilesTableMenu.tsx
  43. 1 1
      apps/app/src/client/components/Admin/ExportArchiveData/SelectCollectionsModal.tsx
  44. 1 1
      apps/app/src/client/components/Admin/ExportArchiveDataPage.tsx
  45. 1 1
      apps/app/src/client/components/Admin/ForbiddenPage.tsx
  46. 1 1
      apps/app/src/client/components/Admin/FullTextSearchManagement.tsx
  47. 1 1
      apps/app/src/client/components/Admin/G2GDataTransfer.tsx
  48. 5 5
      apps/app/src/client/components/Admin/G2GDataTransferExportForm.tsx
  49. 1 1
      apps/app/src/client/components/Admin/G2GDataTransferStatusIcon.tsx
  50. 1 1
      apps/app/src/client/components/Admin/ImportData/GrowiArchive/ErrorViewer.tsx
  51. 1 1
      apps/app/src/client/components/Admin/ManageExternalAccount.tsx
  52. 1 1
      apps/app/src/client/components/Admin/MarkdownSetting/MarkDownSettingContents.tsx
  53. 1 1
      apps/app/src/client/components/Admin/MarkdownSetting/WhitelistInput.tsx
  54. 1 1
      apps/app/src/client/components/Admin/NotFoundPage.tsx
  55. 1 1
      apps/app/src/client/components/Admin/Notification/ManageGlobalNotification.tsx
  56. 1 1
      apps/app/src/client/components/Admin/Notification/NotificationTypeIcon.tsx
  57. 1 1
      apps/app/src/client/components/Admin/Security/LdapAuthTest.tsx
  58. 5 4
      apps/app/src/client/components/Admin/Security/SamlSecuritySettingContents.jsx
  59. 1 1
      apps/app/src/client/components/Admin/SlackIntegration/BotTypeCard.tsx
  60. 2 2
      apps/app/src/client/components/Admin/SlackIntegration/Bridge.tsx
  61. 1 1
      apps/app/src/client/components/Admin/SlackIntegration/CustomBotWithProxyConnectionStatus.tsx
  62. 1 1
      apps/app/src/client/components/Admin/SlackIntegration/CustomBotWithoutProxyConnectionStatus.tsx
  63. 1 1
      apps/app/src/client/components/Admin/SlackIntegration/SlackAppIntegrationControl.tsx
  64. 1 1
      apps/app/src/client/components/Admin/SlackIntegration/SlackIntegration.tsx
  65. 1 1
      apps/app/src/client/components/Admin/UserGroup/UserGroupTable.tsx
  66. 1 1
      apps/app/src/client/components/Admin/UserGroupDetail/UserGroupDetailPage.tsx
  67. 1 1
      apps/app/src/client/components/Admin/UserGroupDetail/UserGroupPageList.tsx
  68. 1 1
      apps/app/src/client/components/Admin/UserGroupDetail/UserGroupUserModal.tsx
  69. 1 1
      apps/app/src/client/components/Admin/UserGroupDetail/UserGroupUserTable.tsx
  70. 1 1
      apps/app/src/client/components/Admin/Users/ExternalAccountTable.tsx
  71. 1 1
      apps/app/src/client/components/Admin/Users/GrantAdminButton.tsx
  72. 1 1
      apps/app/src/client/components/Admin/Users/GrantReadOnlyButton.tsx
  73. 1 1
      apps/app/src/client/components/Admin/Users/RevokeAdminButton.tsx
  74. 2 2
      apps/app/src/client/components/Admin/Users/RevokeAdminMenuItem.tsx
  75. 1 1
      apps/app/src/client/components/Admin/Users/RevokeReadOnlyMenuItem.tsx
  76. 1 1
      apps/app/src/client/components/Admin/Users/SortIcons.tsx
  77. 2 2
      apps/app/src/client/components/Admin/Users/StatusSuspendMenuItem.tsx
  78. 1 1
      apps/app/src/client/components/AlertSiteUrlUndefined.tsx
  79. 4 6
      apps/app/src/client/components/AuthorInfo/AuthorInfo.tsx
  80. 1 1
      apps/app/src/client/components/Bookmarks/BookmarkFolderItemControl.tsx
  81. 1 1
      apps/app/src/client/components/Bookmarks/BookmarkFolderMenu.tsx
  82. 1 1
      apps/app/src/client/components/Bookmarks/BookmarkFolderNameInput.tsx
  83. 1 1
      apps/app/src/client/components/Bookmarks/BookmarkItem.tsx
  84. 1 1
      apps/app/src/client/components/Bookmarks/BookmarkItemRenameInput.tsx
  85. 1 1
      apps/app/src/client/components/Bookmarks/DragAndDropWrapper.tsx
  86. 1 1
      apps/app/src/client/components/Comments.tsx
  87. 1 1
      apps/app/src/client/components/Common/DrawerToggler/DrawerToggler.tsx
  88. 3 3
      apps/app/src/client/components/Common/Dropdown/PageItemControl.tsx
  89. 2 2
      apps/app/src/client/components/Common/LazyRenderer.tsx
  90. 1 1
      apps/app/src/client/components/ContentLinkButtons.tsx
  91. 4 4
      apps/app/src/client/components/CustomNavigation/CustomNav.tsx
  92. 1 1
      apps/app/src/client/components/CustomNavigation/CustomNavAndContents.tsx
  93. 1 1
      apps/app/src/client/components/CustomNavigation/CustomTabContent.tsx
  94. 1 1
      apps/app/src/client/components/DataTransferForm.tsx
  95. 2 2
      apps/app/src/client/components/DescendantsPageList.tsx
  96. 1 1
      apps/app/src/client/components/DescendantsPageListModal.tsx
  97. 1 1
      apps/app/src/client/components/EmptyTrashButton.tsx
  98. 1 1
      apps/app/src/client/components/ForbiddenPage.tsx
  99. 1 1
      apps/app/src/client/components/GrantedGroupsInheritanceSelectModal.tsx
  100. 1 1
      apps/app/src/client/components/Hotkeys/Subscribers/ShowShortcutsModal.tsx

+ 0 - 1
.devcontainer/compose.yml

@@ -7,7 +7,6 @@ services:
       - node_modules:/workspace/growi/node_modules
       - buildcache_app:/workspace/growi/apps/app/.next
       - ../../growi-docker-compose:/workspace/growi-docker-compose:delegated
-      - ../../share:/workspace/share:delegated
     tty: true
 
   mongo:

+ 3 - 3
.github/workflows/codeql-analysis.yml

@@ -47,7 +47,7 @@ jobs:
 
     # Initializes the CodeQL tools for scanning.
     - name: Initialize CodeQL
-      uses: github/codeql-action/init@v3
+      uses: github/codeql-action/init@v2
       with:
         languages: ${{ matrix.language }}
         # If you wish to specify custom queries, you can do so here or in a config file.
@@ -58,7 +58,7 @@ jobs:
     # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
     # If this step fails, then you should remove it and run the build manually (see below)
     - name: Autobuild
-      uses: github/codeql-action/autobuild@v3
+      uses: github/codeql-action/autobuild@v2
 
     # ℹ️ Command-line programs to run using the OS shell.
     # 📚 https://git.io/JvXDl
@@ -72,4 +72,4 @@ jobs:
     #   make release
 
     - name: Perform CodeQL Analysis
-      uses: github/codeql-action/analyze@v3
+      uses: github/codeql-action/analyze@v2

+ 2 - 2
.github/workflows/release-rc-scheduled.yml

@@ -27,7 +27,7 @@ jobs:
       id: package-json
 
     - name: Docker meta for docker.io
-      uses: docker/metadata-action@v5
+      uses: docker/metadata-action@v4
       id: meta
       with:
         images: docker.io/weseek/growi
@@ -36,7 +36,7 @@ jobs:
           type=raw,value=${{ steps.package-json.outputs.packageVersion }}.{{sha}}
 
     - name: Docker meta for ghcr.io
-      uses: docker/metadata-action@v5
+      uses: docker/metadata-action@v4
       id: meta-ghcr
       with:
         images: ghcr.io/weseek/growi

+ 1 - 1
.github/workflows/release-rc.yml

@@ -27,7 +27,7 @@ jobs:
       id: package-json
 
     - name: Docker meta for docker.io
-      uses: docker/metadata-action@v5
+      uses: docker/metadata-action@v4
       id: meta
       with:
         images: docker.io/weseek/growi

+ 1 - 1
.github/workflows/release-slackbot-proxy.yml

@@ -24,7 +24,7 @@ jobs:
 
     - name: Docker meta
       id: meta
-      uses: docker/metadata-action@v5
+      uses: docker/metadata-action@v4
       with:
         images: weseek/growi-slackbot-proxy,asia.gcr.io/${{ secrets.GCP_PRJ_ID_SLACKBOT_PROXY }}/growi-slackbot-proxy
         tags: |

+ 1 - 1
.github/workflows/release.yml

@@ -90,7 +90,7 @@ jobs:
       id: package-json
 
     - name: Docker meta for docker.io
-      uses: docker/metadata-action@v5
+      uses: docker/metadata-action@v4
       id: meta
       with:
         images: docker.io/weseek/growi

+ 1 - 1
.github/workflows/reusable-app-create-manifests.yml

@@ -29,7 +29,7 @@ jobs:
     steps:
     - name: Docker meta for extra-images
       id: meta-extra-images
-      uses: docker/metadata-action@v5
+      uses: docker/metadata-action@v4
       with:
         images: ${{ inputs.registry }}/${{ inputs.image-name }}
         sep-tags: ','

+ 1 - 1
.github/workflows/reusable-app-prod.yml

@@ -181,7 +181,7 @@ jobs:
     container:
       # Match the Playwright version
       # https://github.com/microsoft/playwright/issues/20010
-      image: mcr.microsoft.com/playwright:v1.49.1-jammy
+      image: mcr.microsoft.com/playwright:v1.46.0-jammy
 
     strategy:
       fail-fast: false

+ 1 - 22
CHANGELOG.md

@@ -1,30 +1,9 @@
 # Changelog
 
-## [Unreleased](https://github.com/weseek/growi/compare/v7.1.8...HEAD)
+## [Unreleased](https://github.com/weseek/growi/compare/v7.1.6...HEAD)
 
 *Please do not manually update this file. We've automated the process.*
 
-## [v7.1.8](https://github.com/weseek/growi/compare/v7.1.7...v7.1.8) - 2025-01-21
-
-### 🐛 Bug Fixes
-
-* fix: Escape page path when generating RegExp to find ancestors children (#9550) @yuki-takei
-
-## [v7.1.7](https://github.com/weseek/growi/compare/v7.1.6...v7.1.7) - 2025-01-16
-
-### 🐛 Bug Fixes
-
-* fix: Unable to select group viewing permissions (#9541) @miya
-* fix: Fix i18n of oidc settings (#9536) @ryu-sato
-
-### 🧰 Maintenance
-
-* support: Update Swagger documentation for the PUT endpoint to update a page (#9529) @tkfm1991
-* ci(deps): bump docker/metadata-action from 4 to 5 (#9181) @dependabot
-* ci(deps): bump github/codeql-action from 2 to 3 (#9180) @dependabot
-* ci(deps): bump next from 14.2.15 to 14.2.21 (#9538) @dependabot
-* ci(deps-dev): bump @marp-team/marp-core from 3.9.0 to 3.9.1 (#9530) @dependabot
-
 ## [v7.1.6](https://github.com/weseek/growi/compare/v7.1.5...v7.1.6) - 2024-12-26
 
 ### 💎 Features

+ 10 - 0
apps/app/.eslintrc.js

@@ -4,6 +4,7 @@ module.exports = {
     'weseek/react',
   ],
   plugins: [
+    'regex',
   ],
   settings: {
     // resolve path aliases by eslint-import-resolver-typescript
@@ -16,6 +17,15 @@ module.exports = {
       name: 'axios',
       message: 'Please use src/utils/axios instead.',
     }],
+    'regex/invalid': ['error', [
+      {
+        regex: '\\?\\<\\!',
+        message: 'Do not use any negative lookbehind',
+      }, {
+        regex: '\\?\\<\\=',
+        message: 'Do not use any Positive lookbehind',
+      },
+    ]],
     '@typescript-eslint/no-var-requires': 'off',
 
     // set 'warn' temporarily -- 2021.08.02 Yuki Takei

+ 9 - 7
apps/app/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/app",
-  "version": "7.1.9-RC.0",
+  "version": "7.1.7-RC.0",
   "license": "MIT",
   "private": "true",
   "scripts": {
@@ -114,6 +114,7 @@
     "ejs": "^3.1.10",
     "esa-node": "^0.2.2",
     "escape-string-regexp": "^4.0.0",
+    "eslint-plugin-regex": "^1.8.0",
     "expose-gc": "^1.0.0",
     "express": "^4.20.0",
     "express-bunyan-logger": "^1.3.3",
@@ -134,7 +135,7 @@
     "is-iso-date": "^0.0.1",
     "js-tiktoken": "^1.0.15",
     "js-yaml": "^4.1.0",
-    "katex": "^0.16.21",
+    "katex": "^0.16.11",
     "ldapjs": "^3.0.2",
     "lucene-query-parser": "^1.2.0",
     "markdown-table": "^3.0.3",
@@ -149,7 +150,7 @@
     "migrate-mongo": "^11.0.0",
     "mkdirp": "^1.0.3",
     "mongodb": "^4.17.2",
-    "mongoose": "^6.13.6",
+    "mongoose": "^6.11.3",
     "mongoose-gridfs": "^1.2.42",
     "mongoose-paginate-v2": "^1.3.9",
     "mongoose-unique-validator": "^2.0.3",
@@ -177,12 +178,12 @@
     "prop-types": "^15.8.1",
     "qs": "^6.11.1",
     "rate-limiter-flexible": "^2.3.7",
-    "react": "^18.3.0",
+    "react": "^18.2.0",
     "react-bootstrap-typeahead": "^6.3.2",
     "react-card-flip": "^1.0.10",
     "react-datepicker": "^4.7.0",
     "react-disable": "^0.1.1",
-    "react-dom": "^18.3.0",
+    "react-dom": "^18.2.0",
     "react-error-boundary": "^3.1.4",
     "react-i18next": "^15.1.1",
     "react-image-crop": "^8.3.0",
@@ -264,8 +265,8 @@
     "@types/ldapjs": "^2.2.5",
     "@types/mdast": "^4.0.4",
     "@types/node-cron": "^3.0.11",
-    "@types/react": "^18.3.0",
-    "@types/react-dom": "^18.3.0",
+    "@types/react": "^18.2.14",
+    "@types/react-dom": "^18.2.6",
     "@types/react-input-autosize": "^2.2.4",
     "@types/react-scroll": "^1.8.4",
     "@types/react-stickynode": "^4.0.3",
@@ -282,6 +283,7 @@
     "downshift": "^8.2.3",
     "eazy-logger": "^3.1.0",
     "eslint-plugin-jest": "^26.5.3",
+    "eslint-plugin-regex": "^1.8.0",
     "fslightbox-react": "^1.7.6",
     "handsontable": "=6.2.2",
     "happy-dom": "^15.7.4",

+ 37 - 43
apps/app/playwright/20-basic-features/comments.spec.ts

@@ -1,55 +1,49 @@
 import { test, expect } from '@playwright/test';
 
-test.describe('Comment', () => {
-
-  // make tests run in serial
-  test.describe.configure({ mode: 'serial' });
-
-  test('Create comment page', async({ page }) => {
-    await page.goto('/comment');
-    await page.getByTestId('editor-button').click();
-    await page.getByTestId('save-page-btn').click();
-    await expect(page.locator('.page-meta')).toBeVisible();
-  });
-
-  test('Successfully add comments', async({ page }) => {
-    const commentText = 'add comment';
-    await page.goto('/comment');
+test('Create comment page', async({ page }) => {
+  await page.goto('/comment');
+  await page.getByTestId('editor-button').click();
+  await page.getByTestId('save-page-btn').click();
+  await expect(page.locator('.page-meta')).toBeVisible();
+});
 
-    // Add comment
-    await page.getByTestId('page-comment-button').click();
-    await page.getByTestId('open-comment-editor-button').click();
-    await page.locator('.cm-content').fill(commentText);
-    await page.getByTestId('comment-submit-button').first().click();
+test('Successfully add comments', async({ page }) => {
+  const commentText = 'add comment';
+  await page.goto('/comment');
 
-    await expect(page.locator('.page-comment-body')).toHaveText(commentText);
-    await expect(page.getByTestId('page-comment-button').locator('.grw-count-badge')).toHaveText('1');
-  });
+  // Add comment
+  await page.getByTestId('page-comment-button').click();
+  await page.getByTestId('open-comment-editor-button').click();
+  await page.locator('.cm-content').fill(commentText);
+  await page.getByTestId('comment-submit-button').first().click();
 
-  test('Successfully reply comments', async({ page }) => {
-    const commentText = 'reply comment';
-    await page.goto('/comment');
+  await expect(page.locator('.page-comment-body')).toHaveText(commentText);
+  await expect(page.getByTestId('page-comment-button').locator('.grw-count-badge')).toHaveText('1');
+});
 
-    // Reply comment
-    await page.getByTestId('comment-reply-button').click();
-    await page.locator('.cm-content').fill(commentText);
-    await page.getByTestId('comment-submit-button').first().click();
+test('Successfully reply comments', async({ page }) => {
+  const commentText = 'reply comment';
+  await page.goto('/comment');
 
-    await expect(page.locator('.page-comment-body').nth(1)).toHaveText(commentText);
-    await expect(page.getByTestId('page-comment-button').locator('.grw-count-badge')).toHaveText('2');
-  });
+  // Reply comment
+  await page.getByTestId('page-comment-button').click();
+  await page.getByTestId('comment-reply-button').click();
+  await page.locator('.cm-content').fill(commentText);
+  await page.getByTestId('comment-submit-button').first().click();
 
-  // test('Successfully delete comments', async({ page }) => {
-  //   await page.goto('/comment');
+  await expect(page.locator('.page-comment-body').nth(1)).toHaveText(commentText);
+  await expect(page.getByTestId('page-comment-button').locator('.grw-count-badge')).toHaveText('2');
+});
 
-  //   await page.getByTestId('page-comment-button').click();
-  //   await page.getByTestId('comment-delete-button').first().click({ force: true });
-  //   await expect(page.getByTestId('page-comment-delete-modal')).toBeVisible();
-  //   await page.getByTestId('delete-comment-button').click();
+// test('Successfully delete comments', async({ page }) => {
+//   await page.goto('/comment');
 
-  //   await expect(page.getByTestId('page-comment-button').locator('.grw-count-badge')).toHaveText('0');
-  // });
+//   await page.getByTestId('page-comment-button').click();
+//   await page.getByTestId('comment-delete-button').first().click({ force: true });
+//   await expect(page.getByTestId('page-comment-delete-modal')).toBeVisible();
+//   await page.getByTestId('delete-comment-button').click();
 
-  // TODO: https://redmine.weseek.co.jp/issues/139520
+//   await expect(page.getByTestId('page-comment-button').locator('.grw-count-badge')).toHaveText('0');
+// });
 
-});
+// TODO: https://redmine.weseek.co.jp/issues/139520

+ 100 - 100
apps/app/public/static/locales/fr_FR/admin.json

@@ -3,7 +3,7 @@
     "display_name": "Français"
   },
   "last_login": "Dernière connexion",
-  "wiki_management_homepage": "Système",
+  "wiki_management_homepage": "Gestion du wiki",
   "public": "Public",
   "anyone_with_the_link": "Tous les utilisateurs disposant du lien",
   "specified_users": "Utilisateurs spécifiés",
@@ -11,7 +11,7 @@
   "only_inside_the_group": "Utilisateurs du groupe",
   "optional": "Optionnel",
   "security_settings": {
-    "security_settings": "Sécurité",
+    "security_settings": "Paramètres de sécurité",
     "scope_of_page_disclosure": "Confidentialité de la page",
     "set_point": "Valeur",
     "Guest Users Access": "Accès invité",
@@ -29,13 +29,13 @@
     "for_example": " Par exemple, pour restreindre l'inscription aux utilisateurs dans le domaine growi.org, ajouter ",
     "in_this_case": "; dans ce cas particulier, seul les utilisateurs du domaine growi.org peuvent s'inscrire.",
     "insert_single": "Insérer une adresse courriel par ligne",
-    "page_list_and_search_results": "Affichage des pages",
+    "page_list_and_search_results": "Liste et recherche de pages",
     "page_listing_1": "Liste et recherche de pages<br>restreint à 'Seulement moi'",
     "page_listing_1_desc": "Voir les pages restreintes à 'Seulement moi' lors de la recherche",
     "page_listing_2": "Liste et recherche de pages<br>restreint au groupe utilisateur",
     "page_listing_2_desc": "Voir les pages restreintes au groupe utilisateur lors de la recherche",
-    "page_access_rights": "Lecture",
-    "page_delete_rights": "Suppression",
+    "page_access_rights": "Droits de lecture",
+    "page_delete_rights": "Droits de suppression",
     "page_delete": "Suppression de page",
     "page_delete_completely": "Suppression complète de page",
     "comment_manage_rights": "Droits de gestion des commentaires",
@@ -52,8 +52,8 @@
     "anyone": "Tout le monde",
     "user_homepage_deletion": {
       "user_homepage_deletion": "Suppression de page d'accueil utilisateur",
-      "enable_user_homepage_deletion": "Suppression de page d'accueil utilisateur",
-      "enable_force_delete_user_homepage_on_user_deletion": "Supprimer la page d'accueil et ses pages enfants",
+      "enable_user_homepage_deletion": "Activer la suppression de page d'accueil utilisateur",
+      "enable_force_delete_user_homepage_on_user_deletion": "Lorsqu'un utilisateur est supprimé, sa page d'accueil et ses sous-pages sont supprimées.",
       "desc": "Les pages d'accueil utilisateurs pourront être supprimées."
     },
     "session": "Session",
@@ -88,8 +88,8 @@
       "readonly": "Autoriser (Lecture seule)"
     },
     "read_only_users_comment": {
-      "deny": "Ne peut pas commenter",
-      "accept": "Peut commenter"
+      "deny": "Refuser (Interdire la gestion des commentaires aux utilisateurs lecture seule)",
+      "accept": "Autoriser (Les utilisateurs lecture seule peuvent gérer les commentaires)"
     },
     "registration_mode": {
       "open": "Ouvert (Tout le monde peut s'inscrire)",
@@ -97,9 +97,9 @@
       "closed": "Fermé (Invitation seulement)"
     },
     "share_link_management": "Gestion des liens de partage",
-    "No_share_links": "Aucun liens de partage",
-    "share_link_notice": "Retirer les liens de partage",
-    "delete_all_share_links": "Supprimer tout les liens de partage",
+    "No_share_links":"Aucun liens de partage",
+    "share_link_notice":"Retirer les liens de partage",
+    "delete_all_share_links":"Supprimer tout les liens de partage",
     "share_link_rights": "Permissions de liens de partage",
     "enable_link_sharing": "Activer les liens de partage",
     "all_share_links": "Liens de partage",
@@ -232,7 +232,7 @@
     "prioritize_webhook_desc": "Activer cette option utilisera les webhook entrants plutôt que Slack.",
     "slack_app_configuration": "Configuration de l'application Slack",
     "slack_app_configuration_desc": "Cette méthode n'est pas recommandée, car trop complexe.",
-    "use_instead": "Utiliser plutôt les webhook entrants Slack",
+    "use_instead":"Utiliser plutôt les webhook entrants Slack",
     "how_to": {
       "header": "Comment configurer un webhook entrant?",
       "workspace": "(Dans le Workspace) Ajouter un webhook",
@@ -277,7 +277,7 @@
     "not_found_global_notification_triggerid": "ID global de notification introuvable"
   },
   "full_text_search_management": {
-    "full_text_search_management": "Moteur de recherche",
+    "full_text_search_management": "Configuration de la recherche",
     "elasticsearch_management": "Configuration Elasticsearch",
     "connection_status": "Statut",
     "connection_status_label_unconfigured": "UNCONFIGURED",
@@ -299,23 +299,23 @@
     "rebuild_description_1": "Reconstruire l'index est les données de pages",
     "rebuild_description_2": "Cela peut prendre un certain temps."
   },
-  "mailer_setup_required": "La <a href='/admin/app'>configuration du SMTP</a> est requise.",
+  "mailer_setup_required":"<a href='/admin/app'>Configuration Email</a> sont requis pour envoyer.",
   "admin_top": {
     "management_wiki": "Configuration du wiki",
     "system_information": "Information système",
-    "wiki_administrator": "Seuls les administrateurs peuvent accéder à cette page.",
+    "wiki_administrator": "Seuls les administrateurs peuvent accéder à cette page",
     "assign_administrator": "Il est possible d'assigner l'accès administrateur en utilisant le bouton 'Ajouter accès administrateur'",
     "package_name": "Nom du paquet",
     "specified_version": "Version spécifiée",
     "installed_version": "Version installée",
-    "list_of_env_vars": "Variables d'environnement",
-    "env_var_priority": "Les valeurs enregistrées dans la base de données sont priorisées.",
-    "about_security": "Pour les variables des paramètres de sécurité, consulter les <a href='/admin/security'>paramètres de sécurité.</a>",
+    "list_of_env_vars":"Variables d'environnement",
+    "env_var_priority": "Les valeurs de la base de données sont priorisées.",
+    "about_security": "Voir les <a href='/admin/security'>paramètres de sécurité</a> pour les variables d'environnement de sécurité.",
     "copy_prefilled_host_information": {
       "default": "Copier les informations",
       "done": "Copié dans le presse-papier!"
     },
-    "bug_report": "Informations de diagnostic",
+    "bug_report": "Soumettre un rapport de bogue",
     "submit_bug_report": "<a href='https://github.com/weseek/growi/issues/new?assignees=&labels=bug&template=bug-report.md&title=Bug%3A' target='_blank' rel='noreferrer'>soummettre ensuite sur GitHub.</a>"
   },
   "v5_page_migration": {
@@ -345,31 +345,31 @@
     "description": "Le mode maintenance restreint l'utilisation de GROWI. Toujours démarrer le mode maintenance avant l'\"import de données\" et la \"conversion vers la V5\"."
   },
   "app_setting": {
-    "site_name": "Nom",
+    "site_name": "Nom du site",
     "sitename_change": "Le nom du site utilisé dans l'en-tête et le titre HTML.",
     "header_content": "Le contenu entré ici sera affiché dans l'en-tête, etc. ",
     "site_url": {
-      "title": "Adresse publique",
-      "desc": "Adresse URL publique de l'application.",
-      "warn": "Certaines fonctionnalitées sont restreintes tant que l'URL du site n'est pas définie.",
-      "help": "URL complète démarrant par <code>http://</code> ou <code>https://</code>.",
+      "title": "Configuration de l'URL du site",
+      "desc": "Configuration de l'URL du site",
+      "warn": "Certaines fonctionnalitées peuvent ne pas fonctionner tant que l'URL du site n'est pas définie.",
+      "help": "URL complet du site démarrant par <code>http://</code> ou <code>https://</code>.",
       "note_for_the_only_env_option": "Les paramètres sont définis par des variables d'environnement.<br>Pour modifier ce paramètre, supprimer la variable d'environnement <code>{{env}}</code> ."
     },
-    "confidential_name": "Nom interne",
+    "confidential_name": "Nom confidentiel",
     "confidential_example": "ex): usage interne seulement",
     "default_language": "Langue par défaut",
-    "default_mail_visibility": "Mode d'affichage de l'adresse courriel",
+    "default_mail_visibility": "Afficher l'adresse courriel pour les nouveaux utilisateurs",
     "file_uploading": "Téléversement de fichiers",
-    "enable_files_except_image": "Autoriser tout les types de fichiers",
-    "attach_enable": "Autorise le téléversement de tout les types de fichiers.",
+    "enable_files_except_image": "Autorise le téléversement de fichiers de n'importe quel type. Lorsque désactivé, seul les fichiers de type image sont autorisés.",
+    "attach_enable": "Autorise le téléversement de fichiers de n'importe quel type",
     "update": "Sauvegarder",
-    "mail_settings": "SMTP",
-    "mailer_is_not_set_up": "Paramètres d'envoi de courriels non configurés.",
+    "mail_settings": "Configuration e-mail",
+    "mailer_is_not_set_up": "Paramètres e-mail non configurés.",
     "from_e-mail_address": "Adresse courriel <code>from</code>",
-    "transmission_method": "Mode",
-    "smtp_label": "SMTP",
-    "ses_label": "SES(AWS)",
-    "send_test_email": "Courriel d'essai",
+    "transmission_method":"Méthode de transmission",
+    "smtp_label":"SMTP",
+    "ses_label":"SES(AWS)",
+    "send_test_email": "Envoi d'un courriel d'essai",
     "success_to_send_test_email": "Courriel d'essai envoyé",
     "smtp_settings": "Configuration SMTP",
     "host": "Hôte",
@@ -378,13 +378,13 @@
     "initialize_mail_settings": "réinitialiser les paramètres e-mail",
     "initialize_mail_modal_header": "Réinitialiser les paramètres e-mail",
     "confirm_to_initialize_mail_settings": "Les valeurs existantes seront écrasées. Réinitialiser les paramètres e-mail?",
-    "file_upload_settings": "Téléversement de fichiers",
-    "file_upload_method": "Mode",
-    "file_delivery_method": "Méthode de récupération",
-    "file_delivery_method_redirect": "Rediriger",
-    "file_delivery_method_relay": "Relai interne du système",
-    "file_delivery_method_redirect_info": "Rediriger: Redirige vers une URL signé, performance excellente.",
-    "file_delivery_method_relay_info": "Relai interne du système: Le serveur GROWI sert les fichiers directement au client, sécurité complète.",
+    "file_upload_settings":"Configuration du téléversement",
+    "file_upload_method":"Méthode de téléversement",
+    "file_delivery_method":"Méthode de récupération",
+    "file_delivery_method_redirect":"Rediriger",
+    "file_delivery_method_relay":"Relai interne du système",
+    "file_delivery_method_redirect_info":"Rediriger: Redirige vers une URL signé, performance excellente.",
+    "file_delivery_method_relay_info":"Relai interne du système: Le serveur GROWI sert les fichiers directement au client, sécurité complète.",
     "fixed_by_env_var": "Défini par une variable d'environnement <code>FILE_UPLOAD={{fileUploadType}}</code>.",
     "gcs_label": "GCP(GCS)",
     "aws_label": "AWS(S3)",
@@ -410,7 +410,7 @@
     "disable": "Désactiver",
     "use_env_var_if_empty": "Si la valeur dans la base de données est vide, la valeur de variable d'environnement <code>{{variable}}</code> est utilisé.",
     "note_for_the_only_env_option": "Les paramètres sont définis par des variables d'environnement.<br>Pour modifier ce paramètre, supprimer la variable d'environnement <code>{{env}}</code> .",
-    "questionnaire_settings": "Sondages anonymes",
+    "questionnaire_settings": "Données analytiques",
     "questionnaire_settings_explanation": "Paramètres d'activation des données analytiques. L'utilisateur peut choisir ce paramètre individuellement dans \"Autres paramètres\".",
     "about_data_sent": "À propos",
     "docs_link": "https://docs.growi.org/en/admin-guide/management-cookbook/app-settings.html#questionnaire-settings",
@@ -422,46 +422,46 @@
     "enable_questionnaire": "Activer les données analytiques"
   },
   "markdown_settings": {
-    "markdown_settings": "Markdown",
-    "lineBreak_header": "Saut de ligne",
-    "lineBreak_desc": "Conversion du saut de ligne automatique.",
+    "markdown_settings": "Configuration Markdown",
+    "lineBreak_header": "Configuration du saut de ligne",
+    "lineBreak_desc": "Configuration du saut de ligne.",
     "lineBreak_options": {
-      "enable_lineBreak": "Saut de ligne",
+      "enable_lineBreak": "Activer le saut de ligne",
       "enable_lineBreak_desc": "Convertir le saut de ligne<code>&lt;br&gt;</code>en HTML",
-      "enable_lineBreak_for_comment": "Saut de ligne dans les commentaires",
+      "enable_lineBreak_for_comment": "Activer le saut de ligne dans les commentaires",
       "enable_lineBreak_for_comment_desc": "Convertir le saut de ligne dans les commentaires<code>&lt;br&gt;</code>en HTML"
     },
-    "indent_header": "Indentation",
-    "indent_desc": "Taille d'indentation dans une page.",
+    "indent_header": "Configuration de l'indentation",
+    "indent_desc": "Configuration de l'indentation",
     "indent_options": {
-      "indentSize": "Valeur par défaut",
+      "indentSize": "Taille par défaut",
       "indentSize_desc": "Taille par défaut de l'indentation dans l'éditeur Markdown",
-      "disallow_indent_change": "Empêcher la modification",
-      "disallow_indent_change_desc": "Impose l'usage de la valeur par défaut définie dans les paramètres"
+      "disallow_indent_change": "Empêcher le changement de taille d'indentation",
+      "disallow_indent_change_desc": "Forcer l'usage de la taille par défaut"
     },
-    "xss_header": "Prévention des attaques XSS",
+    "xss_header": "Configuration prévention XSS",
     "xss_desc": "Configuration de la prévention des attaques XSS (cross-site scripting).",
     "xss_options": {
-      "enable_xss_prevention": "Prévention XSS",
+      "enable_xss_prevention": "Activer prévention XSS",
       "remove_all_tags": "Retirer tout les tags",
       "remove_all_tags_desc": "Retire tout les tags HTML et CSS",
       "recommended_setting": "Paramètres recommandés",
       "custom_whitelist": "Liste autorisée",
       "tag_names": "Nom de tags",
       "tag_attributes": "Attributs de tags",
-      "import_recommended": "Importer {{target}}"
+      "import_recommended": "Importer les recommendations {{target}}"
     }
   },
   "customize_settings": {
-    "customize_settings": "Interface",
+    "customize_settings": "Personnalisation",
     "default_sidebar_mode": {
-      "title": "Barre latérale",
-      "desc": "Mode d'affichage et comportement par défaut de la barre latérale.",
+      "title": "Mode par défaut de la barre latérale",
+      "desc": "Le mode d'affichage par défaut de la barre latérale pour les utilisateurs.",
       "dock_mode_default_desc": "État initial de la barre latérale lorsque le mode Dock est sélectionné.",
       "dock_mode_default_open": "Afficher la page comme si elle était ouverte",
       "dock_mode_default_close": "Afficher la page comme si elle était fermée"
     },
-    "layout": "Largeur du contenu",
+    "layout": "Agencement",
     "layout_options": {
       "default": "Largeur par défaut",
       "expanded": "100%"
@@ -481,8 +481,8 @@
       "tab_switch": "Sauvegarder le changement d'onglets",
       "tab_switch_desc1": "Sauvegarde l'état de navigation dans le navigateur de l'utilisateur.",
       "tab_switch_desc2": "Lorsque désactivé, la navigation est forcé par l'interface.",
-      "attach_title_header": "Ajout automatique de titre",
-      "attach_title_header_desc": "Ajoute le chemin de la page en tant que titre de niveau 1 lors de création d'une page.",
+      "attach_title_header": "Ajouter automatiquement une section h1",
+      "attach_title_header_desc": "Ajoute le chemin de la page en tant que h1 lors de création d'une page.",
       "list_num_s": "Nombre de pages modales",
       "list_num_desc_s": "Nombre de pages affichées sur les modales",
       "list_num_m": "Nombre de pages articles",
@@ -491,20 +491,20 @@
       "list_num_desc_l": "Nombre de pages affichées lors de la recherche",
       "list_num_xl": "Nombre de pages articles",
       "list_num_desc_xl": "Nombre de pages affichées dans la 'corbeille' ou '404'.",
-      "stale_notification": "Anciennes notifications",
+      "stale_notification": "Afficher les anciennes notifications",
       "stale_notification_desc": "Affiche les notifications sur les pages mises à jour il y a plus d'un an",
       "show_all_reply_comments": "Afficher tout les commentaires",
       "show_all_reply_comments_desc": "Lorsque désactivé, seul les deux commentaires les plus récents sont affichés",
       "select_search_scope_children_as_default": "'Seulement enfant de ce chemin' lors de la recherche",
       "select_search_scope_children_as_default_desc": "Lorsque désactivé, utilise 'Toutes les pages' en portée de recherche."
     },
-    "presentation": "Présentation",
+      "presentation": "Présentation",
     "presentation_options": {
-      "enable_marp": "Marp",
-      "enable_marp_desc": "Marp est un syntaxe utilisable dans la visualisation de présentation. Potentiellement vulnérable aux attaques XSS.",
+      "enable_marp": "Activer Marp",
+      "enable_marp_desc": "Marp est utilisable dans la visualisation de présentation. Potentiellement vulnérable aux attaques XSS.",
       "marp_official_site": "Site officiel Marp",
       "marp_official_site_link": "https://marp.app",
-      "marp_in_growi": "GROWI Docs - Créer des présentations avec Marp",
+      "marp_in_growi" : "GROWI Docs - Créer des présentations avec Marp",
       "marp_in_growi_link": "https://docs.growi.org/en/guide/features/marp.html"
     },
     "custom_title": "Titre personnalisé",
@@ -518,10 +518,10 @@
     "write_css": "CSS personnalisé.",
     "ctrl_space": "Ctrl+Space pour l'autocomplétion",
     "custom_script": "Script personnalisé",
-    "custom_presentation": "Mode présentation",
+    "custom_presentation": "Presentation personnalisé",
     "write_java": "Code javascript qui sera appliqué au système entier.",
     "reflect_change": "Un rechargement de la page est nécessaire pour afficher les changements.",
-    "custom_logo": "Logo personnalisé",
+    "custom_logo" : "Logo personnalisé",
     "default_logo": "Logo par défaut",
     "upload_logo": "Téléverser un logo",
     "current_logo": "Logo actuel",
@@ -595,9 +595,9 @@
     },
     "import": "Importer",
     "skip_username_and_email_when_overlapped": "Passe le nom et adresse courriel exactes dans le nouvel environnement",
-    "prepare_new_account_for_migration": "Préparer le compte pour la migration",
-    "archive_data_import_detail": "En savoir plus",
-    "admin_archive_data_import_guide_url": "https://docs.growi.org/en/admin-guide/management-cookbook/import.html",
+    "prepare_new_account_for_migration":"Préparer le compte pour la migration",
+    "archive_data_import_detail":"En savoir plus",
+    "admin_archive_data_import_guide_url":"https://docs.growi.org/en/admin-guide/management-cookbook/import.html",
     "page_skip": "Les pages ayant le nom d'une page déjà existante ne seront pas importées.",
     "Directory_hierarchy_tag": "Tag de hiérarchie"
   },
@@ -667,7 +667,7 @@
     "delete": "Supprimer",
     "integration_procedure": "Procédure d'intégration",
     "custom_bot_without_proxy_settings": "Bot Personnalisé sans proxy",
-    "integration_failed": "Échec de l'intégration",
+    "integration_failed":"Échec de l'intégration",
     "reset": "Réinitialiser",
     "reset_all_settings": "Réinitialiser tout les paramètres",
     "delete_slackbot_settings": "Supprimer les paramètres du bot Slack",
@@ -714,7 +714,7 @@
       "allow_specified_long": "Autoriser sélectionnés (Depuis les canaux sélectionnés)",
       "test_connection": "Tester la connexion",
       "test_connection_by_pressing_button": "Cliquer sur le bouton pour tester la connexion",
-      "test_connection_only_public_channel": "Testez la connexion dans un canal publique.",
+      "test_connection_only_public_channel":"Testez la connexion dans un canal publique.",
       "error_check_logs_below": "Une erreur est survenue.",
       "send_message_to_slack_work_space": "Envoyer un message vers l'espace de travail Slack.",
       "add_slack_workspace": "Ajouter un espace de travail Slack"
@@ -743,16 +743,16 @@
     "alert_deplicated": "'Ancienne intégration Slack' sera discontinué dans le futur. Utiliser plutôt <a href='/admin/slack-integration'>les nouveaux paramètres</a> "
   },
   "user_management": {
-    "user_management": "Utilisateurs",
-    "invite_users": "Nouvel utilisateur temporaire",
+    "user_management": "Configuration des utilisateurs",
+    "invite_users": "Créer un nouvel utilisateur temporaire",
     "click_twice_same_checkbox": "Il est nécessaire de sélectionner une option.",
     "status": "Statut",
     "invite_modal": {
-      "emails": "Adresse(s) courriel(s) (Supporte l'usage de plusieurs lignes)",
-      "description1": "Créer des utilisateurs temporaires avec une adresse courriel.",
-      "description2": "Un mot de passe temporaire est généré automatiquement.",
-      "invite_thru_email": "Courriel d'invitation",
-      "mail_setting_link": "<span className='material-symbols-outlined me-2'>settings</span><a href='/admin/app'>Paramètres courriel</a>",
+      "emails": "Adresse Courriel (Supporte l'usage de plusieurs lignes)",
+      "description1":"Créer des utilisateurs temporaires avec une adresse courriel.",
+      "description2":"Un mot de passe temporaire sera généré..",
+      "invite_thru_email": "Envoyer courriel d'invitation",
+      "mail_setting_link":"<span className='material-symbols-outlined me-2'>settings</span><a href='/admin/app'>Paramètres courriel</a>",
       "valid_email": "Adresse courriel valide requise",
       "temporary_password": "Cette utilisateur a un mot de passe temporaire",
       "send_new_password": "Envoyez le nouveau mot de passe à l'utilisateur.",
@@ -774,7 +774,7 @@
       "cannot_revoke": "Vous ne pouvez pas révoquer votre propre permission d'administration",
       "grant_admin_access": "Ajouter permission administrateur",
       "revoke_read_only_access": "Révoquer permission de lecture",
-      "grant_read_only_access": "Permission de lecture-seule",
+      "grant_read_only_access": "Ajouter permission de lecture",
       "send_invitation_email": "Envoyer courriel d'invitation",
       "resend_invitation_email": "Renvoyer courriel d'invitation"
     },
@@ -787,10 +787,10 @@
       "new_password": "Nouveau mot de passe"
     },
     "external_account": "Configuration des comptes externes",
-    "external_accounts": "Comptes externes",
-    "create_external_account": "Créer compte externe",
+    "external_accounts":"Comptes externes",
+    "create_external_account":"Créer compte externe",
     "external_account_list": "Liste des comptes externes",
-    "external_account_none": "Pas de compte externe",
+    "external_account_none":"Pas de compte externe",
     "invite": "Inviter",
     "invited": "Utilisateur invité",
     "back_to_user_management": "Gestion des utilisateurs",
@@ -805,17 +805,17 @@
     "current_users": "Utilisateurs:"
   },
   "user_group_management": {
-    "user_group_management": "Gestion des groupes",
-    "create_group": "Nouveau groupe",
+    "user_group_management": "Configuration des groupes",
+    "create_group": "Créer nouveau groupe",
     "add_child_group": "Ajouter groupe enfant",
     "remove_child_group": "Retirer",
     "deny_create_group": "Les paramètres actuels ne permettent pas la création du groupe",
-    "group_name": "Nom",
+    "group_name": "Nom du groupe",
     "group_example": "e.g. : Group1",
     "child_user_group": "Groupe utilisateur enfant",
-    "parent_group": "Parent",
+    "parent_group": "Groupe parent",
     "select_parent_group": "Sélectionner groupe parent",
-    "release_parent_group": "Retirer groupe parent",
+    "release_parent_group": "Libérer groupe parent",
     "add_modal": {
       "description": "L'utilisateur sera ajouté au groupe parent.",
       "add_user": "Ajouter utilisateur au groupe",
@@ -825,14 +825,14 @@
       "partial_match": "Correspondance partielle",
       "backward_match": "Correspondance inversée"
     },
-    "group_list": "Groupes",
-    "child_group_list": "Groupes enfants",
+    "group_list": "Liste des groupes",
+    "child_group_list": "Liste des groupes enfants",
     "back_to_list": "Retour à la liste",
-    "basic_info": "Création du groupe",
-    "user_list": "Utilisateurs assignés",
+    "basic_info": "Information de base",
+    "user_list": "Liste des utilisateurs",
     "created_group": "Groupe crée",
     "is_loading_data": "Chargement...",
-    "no_pages": "Le groupe n'a pas de pages assignées.",
+    "no_pages": "Le groupe n'a pas la permission de voir la page.",
     "remove_from_group": "Retirer l'utilisateur",
     "delete_modal": {
       "header": "Supprimer groupe",
@@ -853,7 +853,7 @@
     }
   },
   "audit_log_management": {
-    "audit_log": "Audit",
+    "audit_log": "Journal d'audit",
     "audit_log_settings": "Configuration des journaux d'audit",
     "user": "Utilisateur",
     "username": "Nom d'utilisateur",
@@ -883,12 +883,12 @@
   },
   "plugins": {
     "plugins": "Plugins",
-    "plugin_installer": "Installer un plugin",
+    "plugin_installer": "Configuration de plugins",
     "form": {
       "label_url": "URL du plugin",
-      "desc_url": "URL vers le code source du plugin. L'URL doit être accessible publiquement.",
+      "desc_url": "Les plugins sont installables par URL",
       "label_branch": "Branche",
-      "desc_branch": "Nom de la branche du dépôt"
+      "desc_branch": "Spécification du nom de la branche. Par défaut: `main`"
     },
     "plugin_card": "Plugins",
     "plugin_is_not_installed": "Aucun plugins installés",
@@ -974,7 +974,7 @@
     "ADMIN_SITE_URL_UPDATE": "Modifier les paramètres d'URL",
     "ADMIN_MAIL_SMTP_UPDATE": "Modifier les paramètres d'e-mail",
     "ADMIN_MAIL_SES_UPDATE": "Modifier les paramètres d'e-mail (SES)",
-    "ADMIN_MAIL_TEST_SUBMIT": "Envoyer courriel de test",
+    "ADMIN_MAIL_TEST_SUBMIT" : "Envoyer courriel de test",
     "ADMIN_FILE_UPLOAD_CONFIG_UPDATE": "Modifier paramètres de téléversemetnt de fichiers",
     "ADMIN_PLUGIN_UPDATE": "Mettre à jour les paramètres de plugins",
     "ADMIN_MAINTENANCEMODE_ENABLED": "Activer mode maintenance",

+ 30 - 16
apps/app/public/static/locales/fr_FR/commons.json

@@ -7,6 +7,7 @@
   "Sign out": "Se déconnecter",
   "New": "Nouveau",
   "Delete": "Supprimer",
+
   "meta": {
     "display_name": "Français"
   },
@@ -27,8 +28,9 @@
     "email_is_already_in_use": "La configuration SMTP est déjà faite."
   },
   "headers": {
-    "app_settings": "Application"
+    "app_settings": "Paramètres de l'application"
   },
+
   "header_search_box": {
     "label": {
       "All pages": "Toutes les pages",
@@ -39,26 +41,30 @@
       "This tree": "Enfants de cette arbre"
     }
   },
+
   "search_method_menu_item": {
     "search_in_all": "Rechercher dans tout",
     "only_children_of_this_tree": "Enfants de cet arbre",
     "exact_mutch": "Correspondance exacte"
   },
+
   "share_links": {
     "Share Link": "Liens de partage",
     "Page Path": "Chemin de la page",
     "expire": "Expiration",
     "description": "Description"
   },
+
   "in_app_notification": {
     "notification_list": "Notifications d'application",
     "see_all": "Voir tout",
-    "no_notification": "Aucune notification.",
+    "no_notification": "Vous n'avez pas de notifications.",
     "all": "Toutes",
     "unopend": "Non-lues",
     "mark_all_as_read": "Tout marquer comme lu",
     "no_unread_messages": "aucun message non lu"
   },
+
   "personal_dropdown": {
     "home": "Accueil",
     "settings": "Paramètres",
@@ -66,21 +72,24 @@
     "sidebar_mode": "Navigation latérale",
     "sidebar_mode_editor": "Navigation latérale dans l'éditeur",
     "use_os_settings": "Utiliser les paramètres système",
-    "feedback": "Sondage"
+    "feedback": "Avis"
   },
+
+
   "create_page_dropdown": {
-    "new_page": "Nouvelle page",
-    "open_page_create_modal": "Modale de création de page",
+    "new_page": "Créer nouvelle page",
+    "open_page_create_modal": "Ouvrir une nouvelle page créer une fenêtre modale",
     "todays": {
-      "desc": "Mémo du jour",
+      "desc": "Créer le mémo du jour",
       "memo": "mémo"
     },
     "template": {
-      "desc": "Modèles",
-      "children": "Modèle pour page enfant",
-      "descendants": "Modèle pour page adjacentes"
+      "desc": "Créer/modifier page modèle",
+      "children": "Modèle page enfant",
+      "descendants": "Modèle pour descendants"
     }
   },
+
   "copy_to_clipboard": {
     "Copy to clipboard": "Copier dans le presse-papier",
     "Page path": "Chemin de la page",
@@ -90,27 +99,30 @@
     "Markdown link": "Lien Markdown",
     "Append params": "Affixer les paramètres"
   },
+
   "crop_image_modal": {
     "image_crop": "Recadrage d'image",
     "crop": "Recadrer",
     "save": "Sauvegarder",
     "cancel": "Annuler"
   },
+
   "handsontable_modal": {
-    "title": "Tableau",
-    "data_import": "Importer des données",
+    "title": "Modifier table",
+    "data_import": "Import de données",
     "save": "Sauvegarder",
     "cancel": "Annuler",
-    "done": "Mettre à jour",
+    "done": "Terminer",
     "data_import_form": {
-      "select_data_format": "Format",
-      "import_data": "Données du fichier",
-      "paste_table_data": "Coller les données de la fichier",
-      "parse_error": "Erreur lors de l'importation des données",
+      "select_data_format": "Sélectionner format de données",
+      "import_data": "Importer données",
+      "paste_table_data": "Coller les données de la table",
+      "parse_error": "Erreur d'analyse",
       "cancel": "Annuler",
       "import": "Importer"
     }
   },
+
   "questionnaire_modal": {
     "required": "Requis",
     "submit": "Soumettre",
@@ -134,9 +146,11 @@
     "successfully_submitted": "Questionnaire soumis.",
     "thanks_for_answering": "Merci pour votre avis."
   },
+
   "not_found_page": {
     "page_not_exist": "Cette page est introuvable."
   },
+
   "g2g_data_transfer": {
     "tab": "Transfert de données",
     "data_transfer": "Transfert de données",

+ 64 - 65
apps/app/public/static/locales/fr_FR/translation.json

@@ -3,7 +3,7 @@
     "display_name": "Français"
   },
   "Help": "Aide",
-  "View": "Voir",
+  "view": "Voir",
   "Edit": "Modifier",
   "Delete": "Supprimer",
   "delete_all": "Tout supprimer",
@@ -60,7 +60,7 @@
   "Timeline View": "Chronologie",
   "History": "Historique",
   "attachment_data": "Pièces jointes",
-  "No_attachments_yet": "Aucune pièce jointe.",
+  "No_attachments_yet": "Aucunes pièces jointes.",
   "Presentation Mode": "Mode présentation",
   "Not available for guest": "Indisponible pour les invités",
   "Not available in this version": "Indisponible dans cette version",
@@ -90,25 +90,24 @@
   "No diff": "Aucune différences",
   "Latest": "Dernière version",
   "User ID": "Identifiant utilisateur",
-  "User Settings": "Paramètres utilisateur",
-  "User Information": "Mon compte",
+  "User Information": "Informations utilisateur",
   "User Activation": "Activation utilisateur",
-  "Basic Info": "Informations du compte",
+  "Basic Info": "Informations de base",
   "Name": "Nom",
   "Email": "Adresse courriel",
   "Language": "Langue",
   "English": "Anglais",
   "Japanese": "Japonais",
-  "Set Profile Image": "Photo de profil",
-  "Upload Image": "Photo personalisée",
-  "Current Image": "Photo actuelle",
-  "Delete Image": "Supprimer photo",
-  "Delete this image?": "Supprimer cette photo?",
+  "Set Profile Image": "Sélectionner image de profil",
+  "Upload Image": "Téléverser image",
+  "Current Image": "Image actuelle",
+  "Delete Image": "Supprimer image",
+  "Delete this image?": "Supprimer cette image?",
   "Updated": "Modifié",
-  "Upload new image": "Téléverser une photo",
+  "Upload new image": "Téléverser nouvelle image",
   "Connected": "Connecté",
   "Loading": "Chargement...",
-  "Disclose E-mail": "Divulguer adresse courriel",
+  "Disclose E-mail": "Afficher adresse courriel",
   "page exists": "cette page est déjà existante",
   "Error occurred": "Une erreur est survenue",
   "Input page name": "Nom de la page",
@@ -123,21 +122,21 @@
   "UserGroup": "Groupe utilisateur",
   "Basic Settings": "Paramètres de base",
   "The contents entered here will be shown in the header etc": "Le contenu entré ici sera visible dans l'en-tête",
-  "Public": "Tout le monde",
+  "Public": "Public",
   "Anyone with the link": "Tous les utilisateurs disposant du lien",
   "Specified users only": "Utilisateurs spécifiés",
   "Only me": "Seulement moi",
   "Only inside the group": "Utilisateurs du groupe",
-  "page_list": "Pages enfants",
+  "page_list": "Liste de pages",
   "comments": "Commentaires",
   "Reselect the group": "Resélectionner ce groupe",
   "Shareable link": "Lien partageable",
   "The whitelist of registration permission E-mail address": "Les adresses courriel permises lors de l'inscription",
   "Add tags for this page": "Ajouter des étiquettes",
   "tag_list": "Étiquettes",
-  "popular_tags": "Étiquettes fréquentes",
-  "Check All tags": "Toutes les étiquettes",
-  "You have no tag, You can set tags on pages": "Aucune étiquette existante.",
+  "popular_tags": "Étiquettes populaires",
+  "Check All tags": "voir toutes les étiquettes",
+  "You have no tag, You can set tags on pages": "Vous n'avez aucunes étiquettes, vous pouvez assigner des étiquettes aux pages",
   "Show latest": "Voir le plus récent",
   "Load latest": "Charger le plus récent",
   "edited this page": "à modifié cette page.",
@@ -148,9 +147,9 @@
   "No bookmarks yet": "Aucuns favoris",
   "add_bookmark": "Ajouter aux favoris",
   "remove_bookmark": "Retirer des favoris",
-  "wide_view": "Affichage large",
+  "wide_view": "Vue élargie",
   "Recent Changes": "Modifications récentes",
-  "Page Tree": "Arborescence",
+  "Page Tree": "Arbre",
   "Bookmarks": "Favoris",
   "In-App Notification": "Notifications",
   "AI Assistant": "Assistant IA",
@@ -230,7 +229,7 @@
     "form_help": {}
   },
   "Password": "Mot de passe",
-  "Password Settings": "Sécurité",
+  "Password Settings": "Paramètres de mot passe",
   "personal_settings": {
     "disassociate_external_account": "Dissocier compte externe",
     "disassociate_external_account_desc": "Dissocier le compte externe <strong>{{providerType}}</strong> <strong>{{accountId}}</strong>?",
@@ -244,7 +243,7 @@
   "share_links": {
     "Shere this page link to public": "Partager cette page publiquement",
     "share_link_list": "Liens de partage",
-    "share_link_management": "Liens de partage",
+    "share_link_management": "Gestion des liens de partage",
     "delete_all_share_links": "Supprimer tout les liens de partage",
     "expire": "Expiration",
     "Days": "Jour",
@@ -257,23 +256,23 @@
     "Invalid_Number_of_Date": "Valeurs invalides",
     "link_sharing_is_disabled": "Le partage est désactivé"
   },
-  "API Settings": "API GROWI",
+  "API Settings": "Configuration API",
   "Other Settings": "Autres paramètres",
-  "API Token Settings": "Jetons d'API",
-  "Current API Token": "Mon jeton d'API",
-  "Update API Token": "Regénérer",
+  "API Token Settings": "Paramètres de jetons",
+  "Current API Token": "Jeton d'API actuel",
+  "Update API Token": "Modifier jeton",
   "in_app_notification_settings": {
-    "in_app_notification_settings": "Notifications",
+    "in_app_notification_settings": "Paramètres de notifications",
     "subscribe_settings": "Paramètres d'abonnement automatique aux notifications de pages",
     "default_subscribe_rules": {
-      "page_create": "S'abonner aux modifications d'une page lors de sa création."
+      "page_create": "S'abonner à la page lors de sa création."
     }
   },
   "ui_settings": {
-    "ui_settings": "Interface",
+    "ui_settings": "Paramètres UI",
     "side_bar_mode": {
       "settings": "Paramètres navigation latérale",
-      "side_bar_mode_setting": "Épingler la navigation latérale",
+      "side_bar_mode_setting": "Activer la navigation latérale",
       "description": "Activer pour toujours afficher la barre de navigation latérale lorsque l'écran est large. Si la largeur d'écran est faible, le cas inverse est applicable."
     }
   },
@@ -281,7 +280,7 @@
     "light": "Clair",
     "dark": "Sombre",
     "system": "Système",
-    "settings": "Thème",
+    "settings": "Paramètres de thème",
     "description": "Affichage en mode clair, sombre ou selon les paramètres système.<br>Seuls les thèmes supportés seront modifiés."
   },
   "editor_settings": {
@@ -334,17 +333,17 @@
   "page_edit": {
     "input_channels": "Canal Slack...",
     "theme": "Thème",
-    "keymap": "Raccourcis",
+    "keymap": "Touches",
     "indent": "Indentation",
     "paste": {
       "title": "Comportement du collage",
-      "both": "Texte et fichier",
+      "both": "Les deux",
       "text": "Texte seulement",
       "file": "Fichier seulement"
     },
-    "editor_config": "Préférences de l'éditeur",
-    "Show active line": "Surligner la ligne active",
-    "auto_format_table": "Formatter les tableaux",
+    "editor_config": "Configuration de l'éditeur",
+    "Show active line": "Montrer la ligne active",
+    "auto_format_table": "Formattage les tables",
     "overwrite_scopes": "{{operation}} et écraser les scopes des pages enfants",
     "notice": {
       "conflict": "Sauvegarde impossible, la page est en cours de modification par un autre utilisateur. Recharger la page."
@@ -373,28 +372,28 @@
   },
   "page_history": {
     "revision_list": "Historique des modifications",
-    "revision": "Révision",
+    "revision": "version",
     "comparing_source": "Source",
-    "comparing_target": "Cible",
+    "comparing_target": "Destination",
     "comparing_revisions": "Comparer les modifications",
     "compare_latest": "Comparer avec la version la plus récente",
-    "compare_previous": "Comparer avec la version précédente"
+    "compare_previous": "Compare avec une version précédente"
   },
   "modal_rename": {
     "label": {
       "Move/Rename page": "Déplacer/renommer page",
-      "New page name": "Nouveau chemin",
+      "New page name": "Nom de la page",
       "Failed to get subordinated pages": "échec de récupération des pages subordinnées",
       "Failed to get exist path": "échec de la récupération du chemin",
-      "Current page name": "Chemin actuel",
+      "Current page name": "Nom de la page courante",
       "Rename this page only": "Renommer cette page",
       "Force rename all child pages": "Forcer le renommage des pages",
       "Other options": "Autres options",
       "Do not update metadata": "Ne pas modifier les métadonnées",
-      "Redirect": "Redirection automatique"
+      "Redirect": "Rediriger"
     },
     "help": {
-      "redirect": "Redirige automatiquement vers le nouveau chemin de la page.",
+      "redirect": "Rediriger vers la nouvelle page",
       "metadata": "Conserve les métadonnées d'édition de la page",
       "recursive": "Déplacer/renommer les pages enfants récursivement"
     }
@@ -518,7 +517,7 @@
     "initialize_successed": "Initialisation de {{target}} réussie",
     "remove_share_link_success": "Suppression de {{shareLinkId}} réussie",
     "issue_share_link": "Lien de partage ajouté",
-    "remove_share_link": "{{count}} liens supprimés",
+    "remove_share_link": "{{count}} liens de partage supprimés",
     "switch_disable_link_sharing_success": "Paramètres des liens de partage modifiés",
     "failed_to_reset_password": "Échec de la réinitialisation du mot de passe",
     "save_succeeded": "Sauvegarde réussie"
@@ -747,9 +746,9 @@
     "select_page_to_see": "Sélectionner une page"
   },
   "user_group": {
-    "select_group": "Groupes autorisés",
-    "belonging_to_no_group": "Vous n'appartenez à aucun groupe.",
-    "manage_user_groups": "Gestion des groupes"
+    "select_group": "Sélectionner groupe",
+    "belonging_to_no_group": "Appartenance au groupe introuvable.",
+    "manage_user_groups": "Gestion des groupes utilisateurs"
   },
   "fix_page_grant": {
     "modal": {
@@ -780,11 +779,11 @@
   "tooltip": {
     "like": "Like!",
     "cancel_like": "Annuler",
-    "bookmark": "Ajouter aux favoris",
-    "cancel_bookmark": "Retirer des favoris",
-    "receive_notifications": "S'abonner",
-    "stop_notification": "Se désabonner",
-    "footprints": "Lecteurs",
+    "bookmark": "Favori",
+    "cancel_bookmark": "Annuler favori",
+    "receive_notifications": "Recevoir les notifications",
+    "stop_notification": "Stopper les notifications",
+    "footprints": "Visiteurs",
     "login_required": "Connexion requise",
     "operation": {
       "attention": {
@@ -798,7 +797,7 @@
   },
   "user_home_page": {
     "bookmarks": "Favoris",
-    "recently_created": "Page récentes"
+    "recently_created": "Crée récemment"
   },
   "bookmark_folder": {
     "bookmark_folder": "dossier de favoris",
@@ -831,18 +830,18 @@
     "disagree": "En désaccord",
     "answer": "Répondre",
     "no_answer": "Aucune réponse",
-    "settings": "Sondages anonymes",
-    "failed_to_send": "Échec de l'envoi du sondage",
-    "denied": "Les sondages ne seront plus affichés.",
-    "personal_settings_explanation": "Sondages de satisfaction anonymes.",
-    "enable_questionnaire": "Sondages anonymes",
-    "disabled_by_admin": "Sondages anonymes désactivés par l'administrateur"
+    "settings": "Configuration du questionnaire",
+    "failed_to_send": "Échec de l'envoi du questionnaire",
+    "denied": "Le questionnaire ne sera plus montré",
+    "personal_settings_explanation": "Les questionnaires de satisfaction seront actifs.",
+    "enable_questionnaire": "Activer questionnaire",
+    "disabled_by_admin": "Questionnaire désactivé par l'administrateur"
   },
   "tag_edit_modal": {
-    "edit_tags": "Étiquettes",
-    "done": "Mettre à jour",
+    "edit_tags": "Modifier étiquettes",
+    "done": "Terminer",
     "tags_input": {
-      "tag_name": "Choisir ou créer une étiquette"
+      "tag_name": "nom de l'étiquette"
     }
   },
   "delete_attachment_modal": {
@@ -869,11 +868,11 @@
     "size_l": "Taille: G"
   },
   "sync-latest-revision-body": {
-    "menuitem": "Synchroniser avec la dernière révision",
-    "confirm": "Supprime les données en brouillon et synchronise avec la dernière révision. Synchroniser?",
+    "menuitem": "Synchroniser le texte de l'éditeur avec le corps de la dernière révision",
+    "confirm": "Delete the draft data being entered into the editor and synchronize the latest text. Are you sure you want to run it?",
     "alert": "Il se peut que le texte le plus récent n'ait pas été synchronisé. Veuillez recharger et vérifier à nouveau.",
     "success-toaster": "Dernier texte synchronisé",
-    "skipped-toaster": "L'éditeur n'est pas actif. Synchronisation annulée.",
-    "error-toaster": "Synchronisation échouée"
+    "skipped-toaster": "Synchronisation ignorée car l'éditeur n'est pas activé. Ouvrir l'éditeur et réessayer.",
+    "error-toaster": "La synchronisation du dernier texte a échoué"
   }
 }

+ 1 - 1
apps/app/src/client/components/Admin/AdminHome/EnvVarsTable.tsx

@@ -5,7 +5,7 @@ type EnvVarsTableProps = {
 }
 
 export const EnvVarsTable: React.FC<EnvVarsTableProps> = (props: EnvVarsTableProps) => {
-  const envVarRows: React.ReactElement[] = [];
+  const envVarRows: JSX.Element[] = [];
 
   for (const [key, value] of Object.entries(props.envVars)) {
     if (value != null) {

+ 1 - 1
apps/app/src/client/components/Admin/App/AppSetting.jsx

@@ -40,7 +40,7 @@ const AppSetting = (props) => {
           <input
             className="form-control"
             type="text"
-            defaultValue={adminAppContainer.state.title || ''}
+            defaletValue={adminAppContainer.state.title || ''}
             onChange={(e) => {
               adminAppContainer.changeTitle(e.target.value);
             }}

+ 1 - 1
apps/app/src/client/components/Admin/App/AwsSetting.tsx

@@ -15,7 +15,7 @@ export type AwsSettingMoleculeProps = {
   onChangeS3SecretAccessKey: (val: string) => void
 };
 
-export const AwsSettingMolecule = (props: AwsSettingMoleculeProps): React.ReactElement => {
+export const AwsSettingMolecule = (props: AwsSettingMoleculeProps): JSX.Element => {
   const { t } = useTranslation();
 
   return (

+ 1 - 1
apps/app/src/client/components/Admin/App/AzureSetting.tsx

@@ -23,7 +23,7 @@ export type AzureSettingMoleculeProps = {
   onChangeAzureStorageContainerName: (val: string) => void
 };
 
-export const AzureSettingMolecule = (props: AzureSettingMoleculeProps): React.ReactElement => {
+export const AzureSettingMolecule = (props: AzureSettingMoleculeProps): JSX.Element => {
   const { t } = useTranslation();
 
   const {

+ 2 - 2
apps/app/src/client/components/Admin/App/FileUploadSetting.tsx

@@ -26,7 +26,7 @@ type FileUploadSettingMoleculeProps = {
   onChangeFileUploadType: (e: ChangeEvent, type: string) => void
 } & AwsSettingMoleculeProps & GcsSettingMoleculeProps & AzureSettingMoleculeProps;
 
-export const FileUploadSettingMolecule = React.memo((props: FileUploadSettingMoleculeProps): React.ReactElement => {
+export const FileUploadSettingMolecule = React.memo((props: FileUploadSettingMoleculeProps): JSX.Element => {
   const { t } = useTranslation(['admin', 'commons']);
 
   return (
@@ -136,7 +136,7 @@ type FileUploadSettingProps = {
   adminAppContainer: AdminAppContainer
 }
 
-const FileUploadSetting = (props: FileUploadSettingProps): React.ReactElement => {
+const FileUploadSetting = (props: FileUploadSettingProps): JSX.Element => {
   const { t } = useTranslation(['admin', 'commons']);
   const { adminAppContainer } = props;
 

+ 1 - 1
apps/app/src/client/components/Admin/App/GcsSetting.tsx

@@ -15,7 +15,7 @@ export type GcsSettingMoleculeProps = {
   onChangeGcsUploadNamespace: (val: string) => void
 };
 
-export const GcsSettingMolecule = (props: GcsSettingMoleculeProps): React.ReactElement => {
+export const GcsSettingMolecule = (props: GcsSettingMoleculeProps): JSX.Element => {
   const { t } = useTranslation();
 
   const {

+ 1 - 1
apps/app/src/client/components/Admin/App/MaskedInput.tsx

@@ -10,7 +10,7 @@ type Props = {
   tabIndex?: number | undefined
 };
 
-export default function MaskedInput(props: Props): React.ReactElement {
+export default function MaskedInput(props: Props): JSX.Element {
   const [passwordShown, setPasswordShown] = useState(false);
   const togglePassword = () => {
     setPasswordShown(!passwordShown);

+ 1 - 1
apps/app/src/client/components/Admin/App/QuestionnaireSettings.tsx

@@ -11,7 +11,7 @@ import { useSWRxAppSettings } from '~/stores/admin/app-settings';
 
 import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
 
-const QuestionnaireSettings = (): React.ReactElement => {
+const QuestionnaireSettings = (): JSX.Element => {
   const { t } = useTranslation(['admin', 'commons']);
 
   const { data, error, mutate } = useSWRxAppSettings();

+ 1 - 1
apps/app/src/client/components/Admin/Common/AdminInstallButtonRow.tsx

@@ -6,7 +6,7 @@ type Props = {
 
 }
 
-export const AdminInstallButtonRow = (props: Props): React.ReactElement => {
+export const AdminInstallButtonRow = (props: Props): JSX.Element => {
   return (
     <div className="row my-3">
       <div className="mx-auto">

+ 1 - 1
apps/app/src/client/components/Admin/Common/AdminUpdateButtonRow.tsx

@@ -7,7 +7,7 @@ type Props = {
   disabled?: boolean,
 }
 
-const AdminUpdateButtonRow = (props: Props): React.ReactElement => {
+const AdminUpdateButtonRow = (props: Props): JSX.Element => {
   const { t } = useTranslation('admin');
 
   return (

+ 1 - 1
apps/app/src/client/components/Admin/Common/LabeledProgressBar.tsx

@@ -9,7 +9,7 @@ type Props = {
   isInProgress?: boolean,
 }
 
-const LabeledProgressBar = (props: Props): React.ReactElement => {
+const LabeledProgressBar = (props: Props): JSX.Element => {
   const {
     header, currentCount, totalCount, isInProgress,
   } = props;

+ 1 - 1
apps/app/src/client/components/Admin/Customize/CustomizeCssSetting.tsx

@@ -13,7 +13,7 @@ type Props = {
   adminCustomizeContainer: AdminCustomizeContainer
 }
 
-const CustomizeCssSetting = (props: Props): React.ReactElement => {
+const CustomizeCssSetting = (props: Props): JSX.Element => {
 
   const { adminCustomizeContainer } = props;
   const { t } = useTranslation();

+ 1 - 1
apps/app/src/client/components/Admin/Customize/CustomizeFunctionOption.tsx

@@ -8,7 +8,7 @@ type Props = {
   children: React.ReactNode,
 }
 
-const CustomizeFunctionOption = (props: Props): React.ReactElement => {
+const CustomizeFunctionOption = (props: Props): JSX.Element => {
 
   const {
     optionId, label, isChecked, onChecked, children,

+ 1 - 1
apps/app/src/client/components/Admin/Customize/CustomizeFunctionSetting.tsx

@@ -16,7 +16,7 @@ type Props = {
   adminCustomizeContainer: AdminCustomizeContainer
 }
 
-const CustomizeFunctionSetting = (props: Props): React.ReactElement => {
+const CustomizeFunctionSetting = (props: Props): JSX.Element => {
 
   const { adminCustomizeContainer } = props;
   const { t } = useTranslation();

+ 1 - 1
apps/app/src/client/components/Admin/Customize/CustomizeLayoutSetting.tsx

@@ -24,7 +24,7 @@ const useIsContainerFluid = () => {
   };
 };
 
-const CustomizeLayoutSetting = (): React.ReactElement => {
+const CustomizeLayoutSetting = (): JSX.Element => {
   const { t } = useTranslation('admin');
 
   const { resolvedTheme } = useNextThemes();

+ 1 - 1
apps/app/src/client/components/Admin/Customize/CustomizeLogoSetting.tsx

@@ -15,7 +15,7 @@ import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
 const DEFAULT_LOGO = '/images/logo.svg';
 const CUSTOMIZED_LOGO = '/attachment/brand-logo';
 
-const CustomizeLogoSetting = (): React.ReactElement => {
+const CustomizeLogoSetting = (): JSX.Element => {
 
   const { t } = useTranslation();
   const { data: isDefaultLogo } = useIsDefaultLogo();

+ 1 - 1
apps/app/src/client/components/Admin/Customize/CustomizeNoscriptSetting.tsx

@@ -15,7 +15,7 @@ type Props = {
   adminCustomizeContainer: AdminCustomizeContainer
 }
 
-const CustomizeNoscriptSetting = (props: Props): React.ReactElement => {
+const CustomizeNoscriptSetting = (props: Props): JSX.Element => {
 
   const { adminCustomizeContainer } = props;
   const { t } = useTranslation();

+ 1 - 1
apps/app/src/client/components/Admin/Customize/CustomizePresentationSetting.tsx

@@ -14,7 +14,7 @@ type Props = {
   adminCustomizeContainer: AdminCustomizeContainer
 }
 
-const CustomizePresentationSetting = (props: Props): React.ReactElement => {
+const CustomizePresentationSetting = (props: Props): JSX.Element => {
   const { adminCustomizeContainer } = props;
   const { t } = useTranslation();
 

+ 1 - 1
apps/app/src/client/components/Admin/Customize/CustomizeScriptSetting.tsx

@@ -15,7 +15,7 @@ type Props = {
   adminCustomizeContainer: AdminCustomizeContainer
 }
 
-const CustomizeScriptSetting = (props: Props): React.ReactElement => {
+const CustomizeScriptSetting = (props: Props): JSX.Element => {
 
   const { adminCustomizeContainer } = props;
   const { t } = useTranslation();

+ 1 - 1
apps/app/src/client/components/Admin/Customize/CustomizeSidebarSetting.tsx

@@ -8,7 +8,7 @@ import { toastSuccess, toastError } from '~/client/util/toastr';
 import { useNextThemes } from '~/stores-universal/use-next-themes';
 import { useSWRxSidebarConfig } from '~/stores/admin/sidebar-config';
 
-const CustomizeSidebarsetting = (): React.ReactElement => {
+const CustomizeSidebarsetting = (): JSX.Element => {
   const { t } = useTranslation(['admin', 'commons']);
 
   const {

+ 1 - 1
apps/app/src/client/components/Admin/Customize/CustomizeThemeOptions.tsx

@@ -12,7 +12,7 @@ type Props = {
   onSelected?: (themeName: string) => void,
 };
 
-const CustomizeThemeOptions = (props: Props): React.ReactElement => {
+const CustomizeThemeOptions = (props: Props): JSX.Element => {
   const { t } = useTranslation('admin');
 
   const { availableThemes, selectedTheme, onSelected } = props;

+ 1 - 1
apps/app/src/client/components/Admin/Customize/CustomizeThemeSetting.tsx

@@ -16,7 +16,7 @@ type Props = {
 }
 
 // eslint-disable-next-line @typescript-eslint/no-unused-vars
-const CustomizeThemeSetting = (props: Props): React.ReactElement => {
+const CustomizeThemeSetting = (props: Props): JSX.Element => {
   const { t } = useTranslation();
 
   const { data, error, update } = useSWRxGrowiThemeSetting();

+ 1 - 1
apps/app/src/client/components/Admin/Customize/ThemeColorBox.tsx

@@ -13,7 +13,7 @@ type Props = {
   onSelected?: () => void,
 };
 
-export const ThemeColorBox = (props: Props): React.ReactElement => {
+export const ThemeColorBox = (props: Props): JSX.Element => {
 
   const {
     isSelected, metadata, onSelected,

+ 1 - 1
apps/app/src/client/components/Admin/ElasticsearchManagement/NormalizeIndicesControls.tsx

@@ -8,7 +8,7 @@ type Props = {
   isNormalized?: boolean,
 }
 
-const NormalizeIndicesControls = (props: Props): React.ReactElement => {
+const NormalizeIndicesControls = (props: Props): JSX.Element => {
   const { t } = useTranslation('admin');
   const { isNormalized, isRebuildingProcessing } = props;
 

+ 1 - 1
apps/app/src/client/components/Admin/ElasticsearchManagement/ReconnectControls.tsx

@@ -10,7 +10,7 @@ type Props = {
   onReconnectingRequested: () => void,
 }
 
-const ReconnectControls = (props: Props): React.ReactElement => {
+const ReconnectControls = (props: Props): JSX.Element => {
   const { t } = useTranslation('admin');
 
   const { isEnabled, isProcessing } = props;

+ 1 - 1
apps/app/src/client/components/Admin/ExportArchiveData/ArchiveFilesTable.tsx

@@ -10,7 +10,7 @@ type ArchiveFilesTableProps = {
   onZipFileStatRemove: (fileName: string) => void,
 }
 
-const ArchiveFilesTable = (props: ArchiveFilesTableProps): React.ReactElement => {
+const ArchiveFilesTable = (props: ArchiveFilesTableProps): JSX.Element => {
   const { t } = useTranslation();
 
   return (

+ 1 - 1
apps/app/src/client/components/Admin/ExportArchiveData/ArchiveFilesTableMenu.tsx

@@ -9,7 +9,7 @@ type ArchiveFilesTableMenuProps = {
   onZipFileStatRemove: (fileName: string) => void,
 }
 
-const ArchiveFilesTableMenu = (props: ArchiveFilesTableMenuProps): React.ReactElement => {
+const ArchiveFilesTableMenu = (props: ArchiveFilesTableMenuProps):JSX.Element => {
   const { t } = useTranslation();
 
   return (

+ 1 - 1
apps/app/src/client/components/Admin/ExportArchiveData/SelectCollectionsModal.tsx

@@ -32,7 +32,7 @@ type Props = {
   isAllChecked?: boolean,
 };
 
-const SelectCollectionsModal = (props: Props): React.ReactElement => {
+const SelectCollectionsModal = (props: Props): JSX.Element => {
   const { t } = useTranslation();
 
   const {

+ 1 - 1
apps/app/src/client/components/Admin/ExportArchiveDataPage.tsx

@@ -17,7 +17,7 @@ const IGNORED_COLLECTION_NAMES = [
   'sessions', 'rlflx', 'yjs-writings', 'transferkeys',
 ];
 
-const ExportArchiveDataPage = (): React.ReactElement => {
+const ExportArchiveDataPage = (): JSX.Element => {
   const { data: socket } = useAdminSocket();
   const { t } = useTranslation('admin');
 

+ 1 - 1
apps/app/src/client/components/Admin/ForbiddenPage.tsx

@@ -4,7 +4,7 @@ import DefaultErrorPage from 'next/error';
 import { useTranslation } from 'react-i18next';
 
 
-export const ForbiddenPage = (): React.ReactElement => {
+export const ForbiddenPage = (): JSX.Element => {
   const { t } = useTranslation('admin');
 
   const errorMessage = t('forbidden_page.do_not_have_admin_permission');

+ 1 - 1
apps/app/src/client/components/Admin/FullTextSearchManagement.tsx

@@ -4,7 +4,7 @@ import { useTranslation } from 'next-i18next';
 
 import ElasticsearchManagement from './ElasticsearchManagement/ElasticsearchManagement';
 
-export const FullTextSearchManagement = (): React.ReactElement => {
+export const FullTextSearchManagement = (): JSX.Element => {
   const { t } = useTranslation('admin');
 
   return (

+ 1 - 1
apps/app/src/client/components/Admin/G2GDataTransfer.tsx

@@ -21,7 +21,7 @@ const IGNORED_COLLECTION_NAMES = [
   'sessions', 'rlflx', 'activities', 'attachmentFiles.files', 'attachmentFiles.chunks',
 ];
 
-const G2GDataTransfer = (): React.ReactElement => {
+const G2GDataTransfer = (): JSX.Element => {
   const { data: socket } = useAdminSocket();
   const { t } = useTranslation(['admin', 'commons']);
 

+ 5 - 5
apps/app/src/client/components/Admin/G2GDataTransferExportForm.tsx

@@ -35,7 +35,7 @@ type Props = {
   updateOptionsMap: (newOptionsMap: any) => void,
 };
 
-const G2GDataTransferExportForm = (props: Props): React.ReactElement => {
+const G2GDataTransferExportForm = (props: Props): JSX.Element => {
   const { t } = useTranslation('admin');
 
   const {
@@ -66,7 +66,7 @@ const G2GDataTransferExportForm = (props: Props): React.ReactElement => {
     });
   }, [optionsMap, updateOptionsMap]);
 
-  const ImportItems = ({ collectionNames }): React.ReactElement => {
+  const ImportItems = ({ collectionNames }): JSX.Element => {
     const toggleCheckbox = (collectionName, bool) => {
       const collections = new Set(selectedCollections);
       if (bool) {
@@ -122,7 +122,7 @@ const G2GDataTransferExportForm = (props: Props): React.ReactElement => {
     );
   };
 
-  const WarnForGroups = ({ errors }: { errors: Error[] }): React.ReactElement => {
+  const WarnForGroups = ({ errors }: { errors: Error[] }): JSX.Element => {
     if (errors.length === 0) {
       return <></>;
     }
@@ -138,7 +138,7 @@ const G2GDataTransferExportForm = (props: Props): React.ReactElement => {
     );
   };
 
-  const GroupImportItems = ({ groupList, groupName, errors }): React.ReactElement => {
+  const GroupImportItems = ({ groupList, groupName, errors }): JSX.Element => {
     const collectionNames = groupList.filter((groupCollectionName) => {
       return allCollectionNames.includes(groupCollectionName);
     });
@@ -156,7 +156,7 @@ const G2GDataTransferExportForm = (props: Props): React.ReactElement => {
     );
   };
 
-  const OtherImportItems = (): React.ReactElement => {
+  const OtherImportItems = (): JSX.Element => {
     const collectionNames = allCollectionNames.filter((collectionName) => {
       return !ALL_GROUPED_COLLECTIONS.includes(collectionName);
     });

+ 1 - 1
apps/app/src/client/components/Admin/G2GDataTransferStatusIcon.tsx

@@ -15,7 +15,7 @@ interface Props extends ComponentPropsWithoutRef<'span'>{
 /**
  * Icon for G2G transfer status
  */
-const G2GDataTransferStatusIcon = ({ status, className, ...props }: Props): React.ReactElement => {
+const G2GDataTransferStatusIcon = ({ status, className, ...props }: Props): JSX.Element => {
   if (status === G2G_PROGRESS_STATUS.IN_PROGRESS) {
     return (
       <LoadingSpinner className={`${className}`} aria-label="in progress" {...props} />

+ 1 - 1
apps/app/src/client/components/Admin/ImportData/GrowiArchive/ErrorViewer.tsx

@@ -8,7 +8,7 @@ type ErrorViewerProps = {
   onClose: () => void,
 }
 
-const ErrorViewer = (props: ErrorViewerProps): React.ReactElement => {
+const ErrorViewer = (props: ErrorViewerProps): JSX.Element => {
   const { errors } = props;
 
   let value = '(no errors)';

+ 1 - 1
apps/app/src/client/components/Admin/ManageExternalAccount.tsx

@@ -15,7 +15,7 @@ type ManageExternalAccountProps = {
   adminExternalAccountsContainer: AdminExternalAccountsContainer,
 }
 
-const ManageExternalAccount = (props: ManageExternalAccountProps): React.ReactElement => {
+const ManageExternalAccount = (props: ManageExternalAccountProps): JSX.Element => {
 
   const { t } = useTranslation();
   const { adminExternalAccountsContainer } = props;

+ 1 - 1
apps/app/src/client/components/Admin/MarkdownSetting/MarkDownSettingContents.tsx

@@ -20,7 +20,7 @@ type Props ={
   adminMarkDownContainer: AdminMarkDownContainer
 }
 
-const MarkDownSettingContents = React.memo((props: Props): React.ReactElement => {
+const MarkDownSettingContents = React.memo((props: Props): JSX.Element => {
   const { t } = useTranslation('admin');
   const { adminMarkDownContainer } = props;
 

+ 1 - 1
apps/app/src/client/components/Admin/MarkdownSetting/WhitelistInput.tsx

@@ -9,7 +9,7 @@ type Props ={
   adminMarkDownContainer: AdminMarkDownContainer
 }
 
-export const WhitelistInput = (props: Props): React.ReactElement => {
+export const WhitelistInput = (props: Props): JSX.Element => {
 
   const { t } = useTranslation('admin');
   const { adminMarkDownContainer } = props;

+ 1 - 1
apps/app/src/client/components/Admin/NotFoundPage.tsx

@@ -2,7 +2,7 @@ import React from 'react';
 
 import { useTranslation } from 'next-i18next';
 
-export const AdminNotFoundPage = (): React.ReactElement => {
+export const AdminNotFoundPage = (): JSX.Element => {
   const { t } = useTranslation('commons');
 
   return (

+ 1 - 1
apps/app/src/client/components/Admin/Notification/ManageGlobalNotification.tsx

@@ -26,7 +26,7 @@ type Props = {
   globalNotificationId?: string,
 }
 
-const ManageGlobalNotification = (props: Props): React.ReactElement => {
+const ManageGlobalNotification = (props: Props): JSX.Element => {
 
   const [triggerPath, setTriggerPath] = useState('');
   const [notifyType, setNotifyType] = useState<NotifyType>(NotifyType.Email);

+ 1 - 1
apps/app/src/client/components/Admin/Notification/NotificationTypeIcon.tsx

@@ -12,7 +12,7 @@ type NotificationTypeIconProps = {
   notification: INotificationType
 }
 
-export const NotificationTypeIcon = (props: NotificationTypeIconProps): React.ReactElement => {
+export const NotificationTypeIcon = (props: NotificationTypeIconProps): JSX.Element => {
   const { __t, _id, provider } = props.notification;
 
   const type = __t != null && __t === 'mail' ? 'mail' : 'slack';

+ 1 - 1
apps/app/src/client/components/Admin/Security/LdapAuthTest.tsx

@@ -16,7 +16,7 @@ type LdapAuthTestProps = {
   onChangePassword: (password: string) => void,
 }
 
-export const LdapAuthTest = (props: LdapAuthTestProps): React.ReactElement => {
+export const LdapAuthTest = (props: LdapAuthTestProps): JSX.Element => {
   const {
     username, password, onChangeUsername, onChangePassword,
   } = props;

+ 5 - 4
apps/app/src/client/components/Admin/Security/SamlSecuritySettingContents.jsx

@@ -486,10 +486,11 @@ pWVdnzS1VCO8fKsJ7YYIr+JmHvseph3kFUOI5RqkCcMZlKUv83aUThsTHw==
                               aria-expanded="true"
                               aria-controls="ablchelp"
                             >
-                              <span className="material-symbols-outlined me-1">
-                                {this.state.isHelpOpened ? 'expand_more' : 'chevron_right'}
-                              </span>
-                              Show more...
+                              <span
+                                className="material-symbols-outlined me-1"
+                                small
+                              >{this.state.isHelpOpened ? 'expand_more' : 'chevron_right'}
+                              </span> Show more...
                             </button>
                           </h2>
                           <Collapse isOpen={this.state.isHelpOpened}>

+ 1 - 1
apps/app/src/client/components/Admin/SlackIntegration/BotTypeCard.tsx

@@ -36,7 +36,7 @@ type BotTypeCardProps = {
   onBotTypeSelectHandler: (botType: SlackbotType) => void,
 };
 
-export const BotTypeCard = (props: BotTypeCardProps): React.ReactElement => {
+export const BotTypeCard = (props: BotTypeCardProps): JSX.Element => {
   const { t } = useTranslation();
 
   const { isActive, botType, onBotTypeSelectHandler } = props;

+ 2 - 2
apps/app/src/client/components/Admin/SlackIntegration/Bridge.tsx

@@ -18,7 +18,7 @@ type BridgeCoreProps = {
   hrClass: string,
   withProxy?: boolean,
 }
-const BridgeCore = (props: BridgeCoreProps): React.ReactElement => {
+const BridgeCore = (props: BridgeCoreProps): JSX.Element => {
   const {
     description, iconClass, iconName, hrClass, withProxy,
   } = props;
@@ -55,7 +55,7 @@ type BridgeProps = {
   totalCount: number,
   withProxy?: boolean,
 }
-export const Bridge = (props: BridgeProps): React.ReactElement => {
+export const Bridge = (props: BridgeProps): JSX.Element => {
   const { t } = useTranslation();
   const { errorCount, totalCount, withProxy } = props;
 

+ 1 - 1
apps/app/src/client/components/Admin/SlackIntegration/CustomBotWithProxyConnectionStatus.tsx

@@ -11,7 +11,7 @@ type CustomBotWithProxyConnectionStatusProps = {
   connectionStatuses: any,
 }
 
-export const CustomBotWithProxyConnectionStatus = (props: CustomBotWithProxyConnectionStatusProps): React.ReactElement => {
+export const CustomBotWithProxyConnectionStatus = (props: CustomBotWithProxyConnectionStatusProps): JSX.Element => {
   const { siteName, connectionStatuses } = props;
 
   const connectionStatusValues: ConnectionStatus[] = Object.values(connectionStatuses);

+ 1 - 1
apps/app/src/client/components/Admin/SlackIntegration/CustomBotWithoutProxyConnectionStatus.tsx

@@ -10,7 +10,7 @@ type CustomBotWithoutProxyConnectionStatusProps = {
   connectionStatuses: any,
 }
 
-export const CustomBotWithoutProxyConnectionStatus = (props: CustomBotWithoutProxyConnectionStatusProps): React.ReactElement => {
+export const CustomBotWithoutProxyConnectionStatus = (props: CustomBotWithoutProxyConnectionStatusProps): JSX.Element => {
   const { siteName, connectionStatuses } = props;
 
   const connectionStatusValues: ConnectionStatus[] = Object.values(connectionStatuses);

+ 1 - 1
apps/app/src/client/components/Admin/SlackIntegration/SlackAppIntegrationControl.tsx

@@ -10,7 +10,7 @@ type Props = {
   onDeleteButtonClicked?: (slackAppIntegration: unknown) => void,
 }
 
-export const SlackAppIntegrationControl = (props: Props): React.ReactElement => {
+export const SlackAppIntegrationControl = (props: Props): JSX.Element => {
   const { t } = useTranslation();
 
   const { slackAppIntegration, onIsPrimaryChanged, onDeleteButtonClicked } = props;

+ 1 - 1
apps/app/src/client/components/Admin/SlackIntegration/SlackIntegration.tsx

@@ -20,7 +20,7 @@ import OfficialBotSettings from './OfficialBotSettings';
 
 const botTypes = Object.values(SlackbotType);
 
-export const SlackIntegration = (): React.ReactElement => {
+export const SlackIntegration = (): JSX.Element => {
 
   const { t } = useTranslation();
   const [currentBotType, setCurrentBotType] = useState<SlackbotType | undefined>();

+ 1 - 1
apps/app/src/client/components/Admin/UserGroup/UserGroupTable.tsx

@@ -64,7 +64,7 @@ type UserGroupEditLinkProps = {
   isExternalGroup:boolean,
 }
 
-const UserGroupEditLink = (props: UserGroupEditLinkProps): React.ReactElement => {
+const UserGroupEditLink = (props: UserGroupEditLinkProps): JSX.Element => {
   return (
     <Link
       href={`/admin/user-group-detail/${props.group._id}?isExternalGroup=${props.isExternalGroup}`}

+ 1 - 1
apps/app/src/client/components/Admin/UserGroupDetail/UserGroupDetailPage.tsx

@@ -50,7 +50,7 @@ type Props = {
   isExternalGroup: boolean,
 }
 
-const UserGroupDetailPage = (props: Props): React.ReactElement => {
+const UserGroupDetailPage = (props: Props): JSX.Element => {
   const { t } = useTranslation('admin');
   const router = useRouter();
   const { userGroupId: currentUserGroupId, isExternalGroup } = props;

+ 1 - 1
apps/app/src/client/components/Admin/UserGroupDetail/UserGroupPageList.tsx

@@ -16,7 +16,7 @@ type Props = {
   relatedPages?: IPageHasId[],
 }
 
-const UserGroupPageList = (props: Props): React.ReactElement => {
+const UserGroupPageList = (props: Props): JSX.Element => {
   const { t } = useTranslation('admin');
   const { userGroupId, relatedPages } = props;
 

+ 1 - 1
apps/app/src/client/components/Admin/UserGroupDetail/UserGroupUserModal.tsx

@@ -27,7 +27,7 @@ type Props = {
   onToggleIsAlsoNameSearched: () => void,
 }
 
-const UserGroupUserModal = (props: Props): React.ReactElement => {
+const UserGroupUserModal = (props: Props): JSX.Element => {
   const { t } = useTranslation();
   const {
     isOpen,

+ 1 - 1
apps/app/src/client/components/Admin/UserGroupDetail/UserGroupUserTable.tsx

@@ -13,7 +13,7 @@ type Props = {
   isExternalGroup?: boolean
 }
 
-export const UserGroupUserTable = (props: Props): React.ReactElement => {
+export const UserGroupUserTable = (props: Props): JSX.Element => {
   const { t } = useTranslation('admin');
 
   return (

+ 1 - 1
apps/app/src/client/components/Admin/Users/ExternalAccountTable.tsx

@@ -15,7 +15,7 @@ type ExternalAccountTableProps = {
   adminExternalAccountsContainer: AdminExternalAccountsContainer,
 }
 
-const ExternalAccountTable = (props: ExternalAccountTableProps): React.ReactElement => {
+const ExternalAccountTable = (props: ExternalAccountTableProps): JSX.Element => {
 
   const { t } = useTranslation('admin');
 

+ 1 - 1
apps/app/src/client/components/Admin/Users/GrantAdminButton.tsx

@@ -13,7 +13,7 @@ type GrantAdminButtonProps = {
   user: IUserHasId,
 }
 
-const GrantAdminButton = (props: GrantAdminButtonProps): React.ReactElement => {
+const GrantAdminButton = (props: GrantAdminButtonProps): JSX.Element => {
 
   const { t } = useTranslation('admin');
   const { adminUsersContainer, user } = props;

+ 1 - 1
apps/app/src/client/components/Admin/Users/GrantReadOnlyButton.tsx

@@ -11,7 +11,7 @@ import { withUnstatedContainers } from '../../UnstatedUtils';
 const GrantReadOnlyButton: React.FC<{
   adminUsersContainer: AdminUsersContainer,
   user: IUserHasId,
-}> = ({ adminUsersContainer, user }): React.ReactElement => {
+}> = ({ adminUsersContainer, user }): JSX.Element => {
   const { t } = useTranslation('admin');
 
   const onClickGrantReadOnlyBtnHandler = useCallback(async() => {

+ 1 - 1
apps/app/src/client/components/Admin/Users/RevokeAdminButton.tsx

@@ -14,7 +14,7 @@ type RevokeAdminButtonProps = {
   user: IUserHasId,
 }
 
-const RevokeAdminButton = (props: RevokeAdminButtonProps): React.ReactElement => {
+const RevokeAdminButton = (props: RevokeAdminButtonProps): JSX.Element => {
 
   const { t } = useTranslation('admin');
   const { data: currentUser } = useCurrentUser();

+ 2 - 2
apps/app/src/client/components/Admin/Users/RevokeAdminMenuItem.tsx

@@ -10,7 +10,7 @@ import { useCurrentUser } from '~/stores-universal/context';
 import { withUnstatedContainers } from '../../UnstatedUtils';
 
 
-const RevokeAdminAlert = React.memo((): React.ReactElement => {
+const RevokeAdminAlert = React.memo((): JSX.Element => {
   const { t } = useTranslation();
 
   return (
@@ -28,7 +28,7 @@ type Props = {
   user: IUserHasId,
 }
 
-const RevokeAdminMenuItem = (props: Props): React.ReactElement => {
+const RevokeAdminMenuItem = (props: Props): JSX.Element => {
   const { t } = useTranslation('admin');
 
   const { adminUsersContainer, user } = props;

+ 1 - 1
apps/app/src/client/components/Admin/Users/RevokeReadOnlyMenuItem.tsx

@@ -11,7 +11,7 @@ import { withUnstatedContainers } from '../../UnstatedUtils';
 const RevokeReadOnlyMenuItem: React.FC<{
   adminUsersContainer: AdminUsersContainer,
   user: IUserHasId,
-}> = ({ adminUsersContainer, user }): React.ReactElement => {
+}> = ({ adminUsersContainer, user }): JSX.Element => {
   const { t } = useTranslation('admin');
 
   const clickRevokeReadOnlyBtnHandler = useCallback(async() => {

+ 1 - 1
apps/app/src/client/components/Admin/Users/SortIcons.tsx

@@ -6,7 +6,7 @@ type SortIconsProps = {
   isAsc: boolean,
 }
 
-export const SortIcons = (props: SortIconsProps): React.ReactElement => {
+export const SortIcons = (props: SortIconsProps): JSX.Element => {
 
   const { onClick, isSelected, isAsc } = props;
 

+ 2 - 2
apps/app/src/client/components/Admin/Users/StatusSuspendMenuItem.tsx

@@ -9,7 +9,7 @@ import { toastSuccess, toastError } from '~/client/util/toastr';
 import { useCurrentUser } from '~/stores-universal/context';
 
 
-const SuspendAlert = React.memo((): React.ReactElement => {
+const SuspendAlert = React.memo((): JSX.Element => {
   const { t } = useTranslation();
 
   return (
@@ -27,7 +27,7 @@ type Props = {
   user: IUserHasId,
 }
 
-const StatusSuspendMenuItem = (props: Props): React.ReactElement => {
+const StatusSuspendMenuItem = (props: Props): JSX.Element => {
   const { t } = useTranslation('admin');
 
   const { adminUsersContainer, user } = props;

+ 1 - 1
apps/app/src/client/components/AlertSiteUrlUndefined.tsx

@@ -13,7 +13,7 @@ const isValidUrl = (str: string): boolean => {
   }
 };
 
-export const AlertSiteUrlUndefined = (): React.ReactElement => {
+export const AlertSiteUrlUndefined = (): JSX.Element => {
   const { t } = useTranslation('commons');
   const { data: siteUrl, error: errorSiteUrl } = useSiteUrl();
   const isLoadingSiteUrl = siteUrl === undefined && errorSiteUrl === undefined;

+ 4 - 6
apps/app/src/client/components/AuthorInfo/AuthorInfo.tsx

@@ -1,9 +1,7 @@
 import React from 'react';
 
-import {
-  isPopulated,
-  type IUser, type Ref, type IUserHasId,
-} from '@growi/core';
+import type { IUserHasId } from '@growi/core';
+import { isPopulated, type IUser, type Ref } from '@growi/core';
 import { pagePathUtils } from '@growi/core/dist/utils';
 import { UserPicture } from '@growi/ui/dist/components';
 import { format } from 'date-fns/format';
@@ -13,7 +11,7 @@ import Link from 'next/link';
 
 import styles from './AuthorInfo.module.scss';
 
-const UserLabel = ({ user }: { user: IUserHasId | Ref<IUser> }): React.ReactElement => {
+const UserLabel = ({ user }: { user: IUserHasId | Ref<IUser> }): JSX.Element => {
   if (isPopulated(user)) {
     return (
       <Link href={pagePathUtils.userHomepagePath(user)} prefetch={false}>
@@ -33,7 +31,7 @@ type AuthorInfoProps = {
   locate: 'subnav' | 'footer',
 }
 
-export const AuthorInfo = (props: AuthorInfoProps): React.ReactElement => {
+export const AuthorInfo = (props: AuthorInfoProps): JSX.Element => {
   const { t } = useTranslation();
   const {
     date, user, mode = 'create', locate = 'subnav',

+ 1 - 1
apps/app/src/client/components/Bookmarks/BookmarkFolderItemControl.tsx

@@ -15,7 +15,7 @@ export const BookmarkFolderItemControl: React.FC<{
   onClickMoveToRoot,
   onClickRename,
   onClickDelete,
-}): React.ReactElement => {
+}): JSX.Element => {
   const { t } = useTranslation();
   const [isOpen, setIsOpen] = useState(false);
 

+ 1 - 1
apps/app/src/client/components/Bookmarks/BookmarkFolderMenu.tsx

@@ -23,7 +23,7 @@ type BookmarkFolderMenuProps = {
   children?: React.ReactNode,
 }
 
-export const BookmarkFolderMenu = (props: BookmarkFolderMenuProps): React.ReactElement => {
+export const BookmarkFolderMenu = (props: BookmarkFolderMenuProps): JSX.Element => {
   const {
     isOpen, pageId, isBookmarked, onToggle, onUnbookmark, children,
   } = props;

+ 1 - 1
apps/app/src/client/components/Bookmarks/BookmarkFolderNameInput.tsx

@@ -15,7 +15,7 @@ import type { SubmittableInputProps } from '../Common/SubmittableInput/types';
 
 type Props = Pick<SubmittableInputProps<AutosizeInputProps>, 'value' | 'onSubmit' | 'onCancel'>;
 
-export const BookmarkFolderNameInput = (props: Props): React.ReactElement => {
+export const BookmarkFolderNameInput = (props: Props): JSX.Element => {
   const { t } = useTranslation();
 
   const { value, onSubmit, onCancel } = props;

+ 1 - 1
apps/app/src/client/components/Bookmarks/BookmarkItem.tsx

@@ -36,7 +36,7 @@ type Props = {
   bookmarkFolderTreeMutation: () => void,
 }
 
-export const BookmarkItem = (props: Props): React.ReactElement => {
+export const BookmarkItem = (props: Props): JSX.Element => {
   const BASE_FOLDER_PADDING = 15;
   const BASE_BOOKMARK_PADDING = 16;
 

+ 1 - 1
apps/app/src/client/components/Bookmarks/BookmarkItemRenameInput.tsx

@@ -15,7 +15,7 @@ import type { SubmittableInputProps } from '../Common/SubmittableInput/types';
 
 type Props = Pick<SubmittableInputProps<AutosizeInputProps>, 'value' | 'onSubmit' | 'onCancel'>;
 
-export const BookmarkItemRenameInput = (props: Props): React.ReactElement => {
+export const BookmarkItemRenameInput = (props: Props): JSX.Element => {
   const { t } = useTranslation();
 
   const { value, onSubmit, onCancel } = props;

+ 1 - 1
apps/app/src/client/components/Bookmarks/DragAndDropWrapper.tsx

@@ -14,7 +14,7 @@ type DragAndDropWrapperProps = {
   isDropable?:(item: Partial<DragItemDataType>, type: string | null | symbol) => boolean
 }
 
-export const DragAndDropWrapper = (props: DragAndDropWrapperProps): React.ReactElement => {
+export const DragAndDropWrapper = (props: DragAndDropWrapperProps): JSX.Element => {
   const {
     item, children, useDragMode, useDropMode, type, onDropItem, isDropable,
   } = props;

+ 1 - 1
apps/app/src/client/components/Comments.tsx

@@ -24,7 +24,7 @@ type CommentsProps = {
   onLoaded?: () => void,
 }
 
-export const Comments = (props: CommentsProps): React.ReactElement => {
+export const Comments = (props: CommentsProps): JSX.Element => {
 
   const {
     pageId, pagePath, revision, onLoaded,

+ 1 - 1
apps/app/src/client/components/Common/DrawerToggler/DrawerToggler.tsx

@@ -13,7 +13,7 @@ type Props = {
   children?: ReactNode,
 }
 
-export const DrawerToggler = (props: Props): React.ReactElement => {
+export const DrawerToggler = (props: Props): JSX.Element => {
 
   const { className, children } = props;
 

+ 3 - 3
apps/app/src/client/components/Common/Dropdown/PageItemControl.tsx

@@ -61,7 +61,7 @@ type DropdownMenuProps = CommonProps & {
   operationProcessData?: IPageOperationProcessData,
 }
 
-const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): React.ReactElement => {
+const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.Element => {
   const { t } = useTranslation('');
 
   const {
@@ -271,7 +271,7 @@ type PageItemControlSubstanceProps = CommonProps & {
   operationProcessData?: IPageOperationProcessData,
 }
 
-export const PageItemControlSubstance = (props: PageItemControlSubstanceProps): React.ReactElement => {
+export const PageItemControlSubstance = (props: PageItemControlSubstanceProps): JSX.Element => {
 
   const {
     pageId, pageInfo: presetPageInfo, children, onClickBookmarkMenuItem, onClickRenameMenuItem,
@@ -370,7 +370,7 @@ export type PageItemControlProps = CommonProps & {
   operationProcessData?: IPageOperationProcessData,
 }
 
-export const PageItemControl = (props: PageItemControlProps): React.ReactElement => {
+export const PageItemControl = (props: PageItemControlProps): JSX.Element => {
   const { pageId } = props;
 
   if (pageId == null) {

+ 2 - 2
apps/app/src/client/components/Common/LazyRenderer.tsx

@@ -2,10 +2,10 @@ import React, { useEffect, useState } from 'react';
 
 type Props = {
   shouldRender: boolean | (() => boolean),
-  children: React.ReactElement,
+  children: JSX.Element,
 }
 
-export const LazyRenderer = (props: Props): React.ReactElement => {
+export const LazyRenderer = (props: Props): JSX.Element => {
   const { shouldRender: _shouldRender, children } = props;
 
   const [isActivated, setActivated] = useState(false);

+ 1 - 1
apps/app/src/client/components/ContentLinkButtons.tsx

@@ -43,7 +43,7 @@ export type ContentLinkButtonsProps = {
   author?: IUserHasId,
 }
 
-export const ContentLinkButtons = (props: ContentLinkButtonsProps): React.ReactElement => {
+export const ContentLinkButtons = (props: ContentLinkButtonsProps): JSX.Element => {
   const { author } = props;
 
   if (author == null || author.status === USER_STATUS.DELETED) {

+ 4 - 4
apps/app/src/client/components/CustomNavigation/CustomNav.tsx

@@ -35,7 +35,7 @@ type CustomNavDropdownProps = {
   onNavSelected?: (selectedTabKey: string) => void,
 };
 
-export const CustomNavDropdown = (props: CustomNavDropdownProps): React.ReactElement => {
+export const CustomNavDropdown = (props: CustomNavDropdownProps): JSX.Element => {
   const {
     activeTab, navTabMapping, onNavSelected,
   } = props;
@@ -109,10 +109,10 @@ type CustomNavTabProps = {
   onNavSelected?: (selectedTabKey: string) => void,
   hideBorderBottom?: boolean,
   breakpointToHideInactiveTabsDown?: Breakpoint,
-  navRightElement?: React.ReactElement,
+  navRightElement?: JSX.Element,
 };
 
-export const CustomNavTab = (props: CustomNavTabProps): React.ReactElement => {
+export const CustomNavTab = (props: CustomNavTabProps): JSX.Element => {
   const [sliderWidth, setSliderWidth] = useState(0);
   const [sliderMarginLeft, setSliderMarginLeft] = useState(0);
 
@@ -224,7 +224,7 @@ type CustomNavProps = {
   breakpointToSwitchDropdownDown?: Breakpoint,
 };
 
-const CustomNav = (props: CustomNavProps): React.ReactElement => {
+const CustomNav = (props: CustomNavProps): JSX.Element => {
 
   const tabClassnames = ['d-none'];
   const dropdownClassnames = ['d-block'];

+ 1 - 1
apps/app/src/client/components/CustomNavigation/CustomNavAndContents.tsx

@@ -13,7 +13,7 @@ type CustomNavAndContentsProps = {
 }
 
 
-const CustomNavAndContents = (props: CustomNavAndContentsProps): React.ReactElement => {
+const CustomNavAndContents = (props: CustomNavAndContentsProps): JSX.Element => {
   const {
     navTabMapping, defaultTabIndex, navigationMode = 'tab', tabContentClasses = ['p-4'], breakpointToHideInactiveTabsDown, navRightElement,
   } = props;

+ 1 - 1
apps/app/src/client/components/CustomNavigation/CustomTabContent.tsx

@@ -15,7 +15,7 @@ type Props = {
   additionalClassNames?: string[],
 }
 
-const CustomTabContent = (props: Props): React.ReactElement => {
+const CustomTabContent = (props: Props): JSX.Element => {
 
   const { activeTab, navTabMapping, additionalClassNames } = props;
 

+ 1 - 1
apps/app/src/client/components/DataTransferForm.tsx

@@ -7,7 +7,7 @@ import { useGrowiDocumentationUrl } from '~/stores-universal/context';
 
 import CustomCopyToClipBoard from './Common/CustomCopyToClipBoard';
 
-const DataTransferForm = (): React.ReactElement => {
+const DataTransferForm = (): JSX.Element => {
   const { t } = useTranslation('commons');
   const { transferKey, generateTransferKey } = useGenerateTransferKey();
   const { data: documentationUrl } = useGrowiDocumentationUrl();

+ 2 - 2
apps/app/src/client/components/DescendantsPageList.tsx

@@ -34,7 +34,7 @@ const convertToIDataWithMeta = (page: IPageHasId): IDataWithMeta<IPageHasId> =>
   return { data: page };
 };
 
-const DescendantsPageListSubstance = (props: SubstanceProps): React.ReactElement => {
+const DescendantsPageListSubstance = (props: SubstanceProps): JSX.Element => {
 
   const { t } = useTranslation();
 
@@ -128,7 +128,7 @@ export type DescendantsPageListProps = {
   forceHideMenuItems?: ForceHideMenuItems,
 }
 
-export const DescendantsPageList = (props: DescendantsPageListProps): React.ReactElement => {
+export const DescendantsPageList = (props: DescendantsPageListProps): JSX.Element => {
   const { path, limit, forceHideMenuItems } = props;
 
   const [activePage, setActivePage] = useState(1);

+ 1 - 1
apps/app/src/client/components/DescendantsPageListModal.tsx

@@ -23,7 +23,7 @@ const DescendantsPageList = dynamic<DescendantsPageListProps>(() => import('./De
 
 const PageTimeline = dynamic(() => import('./PageTimeline').then(mod => mod.PageTimeline), { ssr: false });
 
-export const DescendantsPageListModal = (): React.ReactElement => {
+export const DescendantsPageListModal = (): JSX.Element => {
   const { t } = useTranslation();
 
   const [activeTab, setActiveTab] = useState('pagelist');

+ 1 - 1
apps/app/src/client/components/EmptyTrashButton.tsx

@@ -8,7 +8,7 @@ type EmptyTrashButtonProps = {
 };
 
 
-const EmptyTrashButton = (props: EmptyTrashButtonProps): React.ReactElement => {
+const EmptyTrashButton = (props: EmptyTrashButtonProps): JSX.Element => {
   const { onEmptyTrashButtonClick, disableEmptyButton } = props;
   const { t } = useTranslation();
 

+ 1 - 1
apps/app/src/client/components/ForbiddenPage.tsx

@@ -6,7 +6,7 @@ type Props = {
   isLinkSharingDisabled?: boolean,
 }
 
-const ForbiddenPage = React.memo((props: Props): React.ReactElement => {
+const ForbiddenPage = React.memo((props: Props): JSX.Element => {
   const { t } = useTranslation();
 
   return (

+ 1 - 1
apps/app/src/client/components/GrantedGroupsInheritanceSelectModal.tsx

@@ -7,7 +7,7 @@ import {
 
 import { useGrantedGroupsInheritanceSelectModal } from '~/stores/modal';
 
-const GrantedGroupsInheritanceSelectModal = (): React.ReactElement => {
+const GrantedGroupsInheritanceSelectModal = (): JSX.Element => {
   const { t } = useTranslation();
   const { data: modalData, close: closeModal } = useGrantedGroupsInheritanceSelectModal();
   const [onlyInheritUserRelatedGrantedGroups, setOnlyInheritUserRelatedGrantedGroups] = useState(false);

+ 1 - 1
apps/app/src/client/components/Hotkeys/Subscribers/ShowShortcutsModal.tsx

@@ -5,7 +5,7 @@ import { useShortcutsModal } from '~/stores/modal';
 type Props = {
   onDeleteRender: () => void,
 }
-const ShowShortcutsModal = (props: Props): React.ReactElement => {
+const ShowShortcutsModal = (props: Props): JSX.Element => {
 
   const { data: status, open } = useShortcutsModal();
 

Некоторые файлы не были показаны из-за большого количества измененных файлов