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

Merge branch 'master' into 148445-148447-upgrade-remark-growi-directive

reiji-h 1 год назад
Родитель
Сommit
11886e9e7d
100 измененных файлов с 212 добавлено и 82 удалено
  1. 0 5
      .changeset/tasty-baboons-burn.md
  2. 0 1
      .devcontainer/devcontainer.json
  3. 1 1
      .github/workflows/reusable-app-prod.yml
  4. 27 1
      CHANGELOG.md
  5. 0 2
      apps/app/.prettierignore
  6. 1 1
      apps/app/docker/README.md
  7. 4 6
      apps/app/package.json
  8. 36 35
      apps/app/playwright/20-basic-features/click-page-icons.spec.ts
  9. 47 0
      apps/app/playwright/20-basic-features/sticky-features.spec.ts
  10. 14 0
      apps/app/playwright/21-basic-features-for-guest/sticky-for-guest.spec.ts
  11. 37 0
      apps/app/playwright/22-sharelink/access-to-sharelink.spec.ts
  12. 5 20
      apps/app/playwright/auth.setup.ts
  13. 24 0
      apps/app/playwright/utils/Login.ts
  14. 1 0
      apps/app/playwright/utils/index.ts
  15. 5 0
      apps/app/src/client/components/.eslintrc.js
  16. 0 0
      apps/app/src/client/components/Admin/AdminHome/AdminHome.jsx
  17. 0 0
      apps/app/src/client/components/Admin/AdminHome/EnvVarsTable.tsx
  18. 0 0
      apps/app/src/client/components/Admin/AdminHome/SystemInfomationTable.tsx
  19. 0 0
      apps/app/src/client/components/Admin/App/AppSetting.jsx
  20. 0 0
      apps/app/src/client/components/Admin/App/AppSettingsPageContents.tsx
  21. 0 0
      apps/app/src/client/components/Admin/App/AwsSetting.tsx
  22. 0 0
      apps/app/src/client/components/Admin/App/AzureSetting.tsx
  23. 0 0
      apps/app/src/client/components/Admin/App/ConfirmModal.tsx
  24. 0 0
      apps/app/src/client/components/Admin/App/FileUploadSetting.tsx
  25. 0 0
      apps/app/src/client/components/Admin/App/GcsSetting.tsx
  26. 0 0
      apps/app/src/client/components/Admin/App/MailSetting.tsx
  27. 0 0
      apps/app/src/client/components/Admin/App/MaintenanceMode.tsx
  28. 0 0
      apps/app/src/client/components/Admin/App/MaskedInput.module.scss
  29. 0 0
      apps/app/src/client/components/Admin/App/MaskedInput.tsx
  30. 0 0
      apps/app/src/client/components/Admin/App/QuestionnaireSettings.tsx
  31. 0 0
      apps/app/src/client/components/Admin/App/SesSetting.tsx
  32. 0 0
      apps/app/src/client/components/Admin/App/SiteUrlSetting.tsx
  33. 0 0
      apps/app/src/client/components/Admin/App/SmtpSetting.tsx
  34. 1 1
      apps/app/src/client/components/Admin/App/V5PageMigration.tsx
  35. 0 0
      apps/app/src/client/components/Admin/AuditLog/ActivityTable.tsx
  36. 0 0
      apps/app/src/client/components/Admin/AuditLog/AuditLogDisableMode.tsx
  37. 1 1
      apps/app/src/client/components/Admin/AuditLog/AuditLogSettings.tsx
  38. 0 0
      apps/app/src/client/components/Admin/AuditLog/DateRangePicker.tsx
  39. 0 0
      apps/app/src/client/components/Admin/AuditLog/SearchUsernameTypeahead.tsx
  40. 0 0
      apps/app/src/client/components/Admin/AuditLog/SelectActionDropdown.tsx
  41. 1 1
      apps/app/src/client/components/Admin/AuditLogManagement.tsx
  42. 0 0
      apps/app/src/client/components/Admin/Common/Accordion.jsx
  43. 0 0
      apps/app/src/client/components/Admin/Common/AdminInstallButtonRow.tsx
  44. 0 0
      apps/app/src/client/components/Admin/Common/AdminUpdateButtonRow.tsx
  45. 0 0
      apps/app/src/client/components/Admin/Common/LabeledProgressBar.tsx
  46. 0 0
      apps/app/src/client/components/Admin/Customize/Customize.jsx
  47. 0 0
      apps/app/src/client/components/Admin/Customize/CustomizeCssSetting.tsx
  48. 0 0
      apps/app/src/client/components/Admin/Customize/CustomizeFunctionOption.tsx
  49. 0 0
      apps/app/src/client/components/Admin/Customize/CustomizeFunctionSetting.tsx
  50. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeLayoutSetting.tsx
  51. 2 2
      apps/app/src/client/components/Admin/Customize/CustomizeLogoSetting.tsx
  52. 0 0
      apps/app/src/client/components/Admin/Customize/CustomizeNoscriptSetting.tsx
  53. 0 0
      apps/app/src/client/components/Admin/Customize/CustomizePresentationSetting.tsx
  54. 0 0
      apps/app/src/client/components/Admin/Customize/CustomizeScriptSetting.tsx
  55. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeSidebarSetting.tsx
  56. 0 0
      apps/app/src/client/components/Admin/Customize/CustomizeThemeOptions.tsx
  57. 0 0
      apps/app/src/client/components/Admin/Customize/CustomizeThemeSetting.tsx
  58. 1 1
      apps/app/src/client/components/Admin/Customize/CustomizeTitle.tsx
  59. 0 0
      apps/app/src/client/components/Admin/Customize/PagingSizeUncontrolledDropdown.jsx
  60. 0 0
      apps/app/src/client/components/Admin/Customize/ThemeColorBox.module.scss
  61. 0 0
      apps/app/src/client/components/Admin/Customize/ThemeColorBox.tsx
  62. 1 1
      apps/app/src/client/components/Admin/ElasticsearchManagement/ElasticsearchManagement.tsx
  63. 0 0
      apps/app/src/client/components/Admin/ElasticsearchManagement/NormalizeIndicesControls.tsx
  64. 0 0
      apps/app/src/client/components/Admin/ElasticsearchManagement/RebuildIndexControls.jsx
  65. 0 0
      apps/app/src/client/components/Admin/ElasticsearchManagement/ReconnectControls.tsx
  66. 0 0
      apps/app/src/client/components/Admin/ElasticsearchManagement/StatusTable.jsx
  67. 0 0
      apps/app/src/client/components/Admin/ExportArchiveData/ArchiveFilesTable.tsx
  68. 0 0
      apps/app/src/client/components/Admin/ExportArchiveData/ArchiveFilesTableMenu.tsx
  69. 0 0
      apps/app/src/client/components/Admin/ExportArchiveData/SelectCollectionsModal.tsx
  70. 0 0
      apps/app/src/client/components/Admin/ExportArchiveDataPage.tsx
  71. 0 0
      apps/app/src/client/components/Admin/ForbiddenPage.tsx
  72. 0 0
      apps/app/src/client/components/Admin/FullTextSearchManagement.tsx
  73. 0 0
      apps/app/src/client/components/Admin/G2GDataTransfer.tsx
  74. 0 0
      apps/app/src/client/components/Admin/G2GDataTransferExportForm.tsx
  75. 0 0
      apps/app/src/client/components/Admin/G2GDataTransferStatusIcon.tsx
  76. 0 0
      apps/app/src/client/components/Admin/ImportData/GrowiArchive/ErrorViewer.tsx
  77. 0 0
      apps/app/src/client/components/Admin/ImportData/GrowiArchive/ImportCollectionConfigurationModal.jsx
  78. 0 0
      apps/app/src/client/components/Admin/ImportData/GrowiArchive/ImportCollectionItem.jsx
  79. 0 0
      apps/app/src/client/components/Admin/ImportData/GrowiArchive/ImportForm.jsx
  80. 0 0
      apps/app/src/client/components/Admin/ImportData/GrowiArchive/UploadForm.jsx
  81. 0 0
      apps/app/src/client/components/Admin/ImportData/GrowiArchiveSection.jsx
  82. 0 0
      apps/app/src/client/components/Admin/ImportData/ImportDataPageContents.jsx
  83. 0 0
      apps/app/src/client/components/Admin/LegacySlackIntegration/LegacySlackIntegration.jsx
  84. 0 0
      apps/app/src/client/components/Admin/LegacySlackIntegration/SlackConfiguration.jsx
  85. 0 0
      apps/app/src/client/components/Admin/ManageExternalAccount.tsx
  86. 0 0
      apps/app/src/client/components/Admin/MarkdownSetting/IndentForm.tsx
  87. 0 0
      apps/app/src/client/components/Admin/MarkdownSetting/LineBreakForm.jsx
  88. 0 0
      apps/app/src/client/components/Admin/MarkdownSetting/MarkDownSettingContents.tsx
  89. 0 0
      apps/app/src/client/components/Admin/MarkdownSetting/WhitelistInput.tsx
  90. 0 0
      apps/app/src/client/components/Admin/MarkdownSetting/XssForm.jsx
  91. 0 0
      apps/app/src/client/components/Admin/NotFoundPage.tsx
  92. 0 0
      apps/app/src/client/components/Admin/Notification/GlobalNotification.jsx
  93. 0 0
      apps/app/src/client/components/Admin/Notification/GlobalNotificationList.jsx
  94. 1 1
      apps/app/src/client/components/Admin/Notification/ManageGlobalNotification.tsx
  95. 0 0
      apps/app/src/client/components/Admin/Notification/NotificationDeleteModal.jsx
  96. 0 0
      apps/app/src/client/components/Admin/Notification/NotificationSetting.jsx
  97. 0 0
      apps/app/src/client/components/Admin/Notification/NotificationTypeIcon.tsx
  98. 0 0
      apps/app/src/client/components/Admin/Notification/TriggerEventCheckBox.jsx
  99. 0 0
      apps/app/src/client/components/Admin/Notification/UserNotificationRow.jsx
  100. 0 0
      apps/app/src/client/components/Admin/Notification/UserTriggerNotification.jsx

+ 0 - 5
.changeset/tasty-baboons-burn.md

@@ -1,5 +0,0 @@
----
-'@growi/pluginkit': patch
----
-
-Update tsconfig.json module setting

+ 0 - 1
.devcontainer/devcontainer.json

@@ -23,7 +23,6 @@
     "msjsdiag.debugger-for-chrome",
     "msjsdiag.debugger-for-chrome",
     "firefox-devtools.vscode-firefox-debug",
     "firefox-devtools.vscode-firefox-debug",
     "editorconfig.editorconfig",
     "editorconfig.editorconfig",
-    "esbenp.prettier-vscode",
     "shinnn.stylelint",
     "shinnn.stylelint",
     "stylelint.vscode-stylelint",
     "stylelint.vscode-stylelint",
     "vitest.explorer",
     "vitest.explorer",

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

@@ -213,7 +213,7 @@ jobs:
       fail-fast: false
       fail-fast: false
       matrix:
       matrix:
         # List string expressions that is comma separated ids of tests in "test/cypress/integration"
         # List string expressions that is comma separated ids of tests in "test/cypress/integration"
-        spec-group: ['20', '21', '22', '23', '30', '50']
+        spec-group: ['20', '21', '23', '30', '50']
 
 
     services:
     services:
       mongodb:
       mongodb:

+ 27 - 1
CHANGELOG.md

@@ -1,9 +1,35 @@
 # Changelog
 # Changelog
 
 
-## [Unreleased](https://github.com/weseek/growi/compare/v7.0.10...HEAD)
+## [Unreleased](https://github.com/weseek/growi/compare/v7.0.11...HEAD)
 
 
 *Please do not manually update this file. We've automated the process.*
 *Please do not manually update this file. We've automated the process.*
 
 
+## [v7.0.11](https://github.com/weseek/growi/compare/v7.0.10...v7.0.11) - 2024-06-25
+
+### 💎 Features
+
+### 🚀 Improvement
+
+* imprv: New marker color (#8891) @satof3
+* imprv: SSR performance (#8916) @yuki-takei
+
+### 🐛 Bug Fixes
+
+* fix: Vim keymap works correctly (#8901) @reiji-h
+* fix: Readonly editor prevents ctrl+v and paste. (#8902) @reiji-h
+* fix: Missing HTTP Response in SAML Login With ABLC Callback (#8879) @maeshinshin
+* fix: Set `z-0` to correct navbar and header overlap when the anchor is specified (#8905) @yuki-takei
+* fix: Minimum number of characters in password cannot be changed (#8896) @miya
+
+### 🧰 Maintenance
+
+* support: Replace tests with playwright (20-basic-features/20-basic-features--click-page-icons) (#8903) @miya
+* support: Relocate components dir (#8917) @yuki-takei
+* ci(deps): bump ws from 8.11.0 to 8.17.1 (#8906) @dependabot
+* support: Update module resolution settings (#8898) @yuki-takei
+* support: Decrease max SSR body length (#8895) @yuki-takei
+* support: Use typescript-transform-paths instead of tsconfig-paths (#8892) @yuki-takei
+
 ## [v7.0.10](https://github.com/weseek/growi/compare/v7.0.9...v7.0.10) - 2024-06-13
 ## [v7.0.10](https://github.com/weseek/growi/compare/v7.0.9...v7.0.10) - 2024-06-13
 
 
 ### 💎 Features
 ### 💎 Features

+ 0 - 2
apps/app/.prettierignore

@@ -1,2 +0,0 @@
-src/client/styles/bootstrap4/
-src/client/styles/scss/_override-bootstrap-variables.scss

+ 1 - 1
apps/app/docker/README.md

@@ -10,7 +10,7 @@ GROWI Official docker image
 Supported tags and respective Dockerfile links
 Supported tags and respective Dockerfile links
 ------------------------------------------------
 ------------------------------------------------
 
 
-* [`7.0.10`, `7.0`, `7`, `latest` (Dockerfile)](https://github.com/weseek/growi/blob/v7.0.10/apps/app/docker/Dockerfile)
+* [`7.0.11`, `7.0`, `7`, `latest` (Dockerfile)](https://github.com/weseek/growi/blob/v7.0.11/apps/app/docker/Dockerfile)
 * [`6.3.2`, `6.3`, `6` (Dockerfile)](https://github.com/weseek/growi/blob/v6.3.2/apps/app/docker/Dockerfile)
 * [`6.3.2`, `6.3`, `6` (Dockerfile)](https://github.com/weseek/growi/blob/v6.3.2/apps/app/docker/Dockerfile)
 * [`6.2.4`, `6.2` (Dockerfile)](https://github.com/weseek/growi/blob/v6.2.4/apps/app/docker/Dockerfile)
 * [`6.2.4`, `6.2` (Dockerfile)](https://github.com/weseek/growi/blob/v6.2.4/apps/app/docker/Dockerfile)
 * [`6.1.15`, `6.1` (Dockerfile)](https://github.com/weseek/growi/blob/v6.1.15/apps/app/docker/Dockerfile)
 * [`6.1.15`, `6.1` (Dockerfile)](https://github.com/weseek/growi/blob/v6.1.15/apps/app/docker/Dockerfile)

+ 4 - 6
apps/app/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "@growi/app",
   "name": "@growi/app",
-  "version": "7.0.11-RC.0",
+  "version": "7.0.12-RC.0",
   "license": "MIT",
   "license": "MIT",
   "private": "true",
   "private": "true",
   "scripts": {
   "scripts": {
@@ -72,6 +72,7 @@
     "@google-cloud/storage": "^5.8.5",
     "@google-cloud/storage": "^5.8.5",
     "@growi/core": "link:../../packages/core",
     "@growi/core": "link:../../packages/core",
     "@growi/pluginkit": "link:../../packages/pluginkit",
     "@growi/pluginkit": "link:../../packages/pluginkit",
+    "@growi/presentation": "link:../../packages/presentation",
     "@growi/preset-templates": "link:../../packages/preset-templates",
     "@growi/preset-templates": "link:../../packages/preset-templates",
     "@growi/preset-themes": "link:../../packages/preset-themes",
     "@growi/preset-themes": "link:../../packages/preset-themes",
     "@growi/remark-attachment-refs": "link:../../packages/remark-attachment-refs",
     "@growi/remark-attachment-refs": "link:../../packages/remark-attachment-refs",
@@ -143,6 +144,7 @@
     "multer-autoreap": "^1.0.3",
     "multer-autoreap": "^1.0.3",
     "mustache": "^4.2.0",
     "mustache": "^4.2.0",
     "next": "^14.1.3",
     "next": "^14.1.3",
+    "next-dynamic-loading-props": "^0.1.1",
     "next-i18next": "^15.2.0",
     "next-i18next": "^15.2.0",
     "next-superjson": "^0.0.4",
     "next-superjson": "^0.0.4",
     "next-themes": "^0.2.1",
     "next-themes": "^0.2.1",
@@ -205,7 +207,7 @@
     "url-join": "^4.0.0",
     "url-join": "^4.0.0",
     "usehooks-ts": "^2.6.0",
     "usehooks-ts": "^2.6.0",
     "validator": "^13.7.0",
     "validator": "^13.7.0",
-    "ws": "^8.3.0",
+    "ws": "^8.17.1",
     "xss": "^1.0.14",
     "xss": "^1.0.14",
     "y-mongodb-provider": "^0.1.10",
     "y-mongodb-provider": "^0.1.10",
     "y-socket.io": "^1.1.3",
     "y-socket.io": "^1.1.3",
@@ -220,7 +222,6 @@
     "@growi/core-styles": "link:../../packages/core-styles",
     "@growi/core-styles": "link:../../packages/core-styles",
     "@growi/custom-icons": "link:../../packages/custom-icons",
     "@growi/custom-icons": "link:../../packages/custom-icons",
     "@growi/editor": "link:../../packages/editor",
     "@growi/editor": "link:../../packages/editor",
-    "@growi/presentation": "link:../../packages/presentation",
     "@growi/ui": "link:../../packages/ui",
     "@growi/ui": "link:../../packages/ui",
     "@handsontable/react": "=2.1.0",
     "@handsontable/react": "=2.1.0",
     "@next/bundle-analyzer": "^14.1.3",
     "@next/bundle-analyzer": "^14.1.3",
@@ -237,8 +238,6 @@
     "@types/throttle-debounce": "^5.0.1",
     "@types/throttle-debounce": "^5.0.1",
     "@types/unzip-stream": "^0.3.4",
     "@types/unzip-stream": "^0.3.4",
     "@types/url-join": "^4.0.2",
     "@types/url-join": "^4.0.2",
-    "@vitejs/plugin-react": "^4.3.0",
-    "@vitest/coverage-v8": "^0.34.6",
     "babel-loader": "^8.2.5",
     "babel-loader": "^8.2.5",
     "bootstrap": "=5.3.2",
     "bootstrap": "=5.3.2",
     "connect-browser-sync": "^2.1.0",
     "connect-browser-sync": "^2.1.0",
@@ -265,7 +264,6 @@
     "morgan": "^1.10.0",
     "morgan": "^1.10.0",
     "null-loader": "^4.0.1",
     "null-loader": "^4.0.1",
     "plantuml-encoder": "^1.2.5",
     "plantuml-encoder": "^1.2.5",
-    "prettier": "^1.19.1",
     "pretty-bytes": "^6.1.1",
     "pretty-bytes": "^6.1.1",
     "react-codemirror2": "^6.0.0",
     "react-codemirror2": "^6.0.0",
     "react-copy-to-clipboard": "^5.0.1",
     "react-copy-to-clipboard": "^5.0.1",

+ 36 - 35
apps/app/playwright/20-basic-features/click-page-icons.spec.ts

@@ -1,49 +1,50 @@
 import { test, expect } from '@playwright/test';
 import { test, expect } from '@playwright/test';
 
 
-test('Successfully Subscribe/Unsubscribe a page', async({ page }) => {
-  await page.goto('/Sandbox');
-  const subscribeButton = page.locator('.btn-subscribe');
+test.describe('Click page icons', () => {
+  test.beforeEach(async({ page }) => {
+    await page.goto('/Sandbox');
+  });
 
 
-  // Subscribe
-  await subscribeButton.click();
-  await expect(subscribeButton).toHaveClass(/active/);
+  test('Successfully Subscribe/Unsubscribe a page', async({ page }) => {
+    const subscribeButton = page.locator('.btn-subscribe');
 
 
-  // Unsubscribe
-  await subscribeButton.click();
-  await expect(subscribeButton).not.toHaveClass(/active/);
-});
+    // Subscribe
+    await subscribeButton.click();
+    await expect(subscribeButton).toHaveClass(/active/);
 
 
-test('Successfully Like/Unlike a page', async({ page }) => {
-  await page.goto('/Sandbox');
-  const likeButton = page.locator('.btn-like').first();
+    // Unsubscribe
+    await subscribeButton.click();
+    await expect(subscribeButton).not.toHaveClass(/active/);
+  });
 
 
-  // Like
-  await likeButton.click();
-  await expect(likeButton).toHaveClass(/active/);
+  test('Successfully Like/Unlike a page', async({ page }) => {
+    const likeButton = page.locator('.btn-like').first();
 
 
-  // Unlike
-  await likeButton.click();
-  await expect(likeButton).not.toHaveClass(/active/);
-});
+    // Like
+    await likeButton.click();
+    await expect(likeButton).toHaveClass(/active/);
 
 
-test('Successfully Bookmark / Unbookmark a page', async({ page }) => {
-  await page.goto('/Sandbox');
-  const bookmarkButton = page.locator('.btn-bookmark').first();
+    // Unlike
+    await likeButton.click();
+    await expect(likeButton).not.toHaveClass(/active/);
+  });
 
 
-  // Bookmark
-  await bookmarkButton.click();
-  await expect(bookmarkButton).toHaveClass(/active/);
+  test('Successfully Bookmark / Unbookmark a page', async({ page }) => {
+    const bookmarkButton = page.locator('.btn-bookmark').first();
 
 
-  // Unbookmark
-  await page.locator('.grw-bookmark-folder-menu-item').click();
-  await expect(bookmarkButton).not.toHaveClass(/active/);
-});
+    // Bookmark
+    await bookmarkButton.click();
+    await expect(bookmarkButton).toHaveClass(/active/);
 
 
-test('Successfully display list of "seen by user"', async({ page }) => {
-  await page.goto('/Sandbox');
+    // Unbookmark
+    await page.locator('.grw-bookmark-folder-menu-item').click();
+    await expect(bookmarkButton).not.toHaveClass(/active/);
+  });
 
 
-  await page.locator('.btn-seen-user').click();
+  test('Successfully display list of "seen by user"', async({ page }) => {
+    await page.locator('.btn-seen-user').click();
 
 
-  const imgCount = await page.locator('.user-list-content').locator('img').count();
-  expect(imgCount).toBe(1);
+    const imgCount = await page.locator('.user-list-content').locator('img').count();
+    expect(imgCount).toBe(1);
+  });
 });
 });

+ 47 - 0
apps/app/playwright/20-basic-features/sticky-features.spec.ts

@@ -0,0 +1,47 @@
+import { test, expect } from '@playwright/test';
+
+test.describe('Sticky features', () => {
+  test.beforeEach(async({ page }) => {
+    await page.goto('/');
+  });
+
+  test('Subnavigation displays changes on scroll down and up', async({ page }) => {
+    // Scroll down to trigger sticky effect
+    await page.evaluate(() => window.scrollTo(0, 250));
+    await expect(page.locator('.sticky-outer-wrapper').first()).toHaveClass(/active/);
+
+    // Scroll back to top
+    await page.evaluate(() => window.scrollTo(0, 0));
+    await expect(page.locator('.sticky-outer-wrapper').first()).not.toHaveClass(/active/);
+  });
+
+  test('Subnavigation is not displayed when move to other pages', async({ page }) => {
+    // Scroll down to trigger sticky effect
+    await page.evaluate(() => window.scrollTo(0, 250));
+    await expect(page.locator('.sticky-outer-wrapper').first()).toHaveClass(/active/);
+
+    // Move to /Sandbox page
+    await page.goto('/Sandbox');
+    await expect(page.locator('.sticky-outer-wrapper').first()).not.toHaveClass(/active/);
+  });
+
+  test('Able to click buttons on subnavigation switcher when sticky', async({ page }) => {
+    // Scroll down to trigger sticky effect
+    await page.evaluate(() => window.scrollTo(0, 250));
+    await expect(page.locator('.sticky-outer-wrapper').first()).toHaveClass(/active/);
+
+    // Click editor button
+    await page.getByTestId('editor-button').click();
+    await expect(page.locator('.layout-root')).toHaveClass(/editing/);
+  });
+
+  test('Subnavigation is sticky when on small window', async({ page }) => {
+    // Scroll down to trigger sticky effect
+    await page.evaluate(() => window.scrollTo(0, 500));
+    await expect(page.locator('.sticky-outer-wrapper').first()).toHaveClass(/active/);
+
+    // Set viewport to small size
+    await page.setViewportSize({ width: 600, height: 1024 });
+    await expect(page.getByTestId('grw-contextual-sub-nav').getByTestId('grw-page-editor-mode-manager')).toBeVisible();
+  });
+});

+ 14 - 0
apps/app/playwright/21-basic-features-for-guest/sticky-for-guest.spec.ts

@@ -0,0 +1,14 @@
+import { test, expect } from '@playwright/test';
+
+
+test('Sub navigation sticky changes when scrolling down and up', async({ page }) => {
+  await page.goto('/Sandbox');
+
+  // Sticky
+  await page.evaluate(() => window.scrollTo(0, 250));
+  await expect(page.locator('.sticky-outer-wrapper').first()).toHaveClass(/active/);
+
+  // Not sticky
+  await page.evaluate(() => window.scrollTo(0, 0));
+  await expect(page.locator('.sticky-outer-wrapper').first()).not.toHaveClass(/active/);
+});

+ 37 - 0
apps/app/playwright/22-sharelink/access-to-sharelink.spec.ts

@@ -0,0 +1,37 @@
+import { test, expect } from '@playwright/test';
+
+import { login } from '../utils/Login';
+
+test.describe.serial('Access to sharelink by guest', () => {
+  let createdSharelink: string | null;
+
+  test('Prepare sharelink', async({ page }) => {
+    await page.goto('/Sandbox/Bootstrap5');
+
+    // Create Sharelink
+    await page.getByTestId('open-page-item-control-btn').click();
+    await page.getByTestId('open-page-accessories-modal-btn-with-share-link-management-data-tab').click();
+    await page.getByTestId('btn-sharelink-toggleform').click();
+    await page.getByTestId('btn-sharelink-issue').click();
+
+    // Get ShareLink
+    createdSharelink = await page.getByTestId('share-link').textContent();
+    expect(createdSharelink).toHaveLength(24);
+  });
+
+  test('The sharelink page is successfully loaded', async({ page }) => {
+    await page.goto('/');
+
+    // Logout
+    await page.getByTestId('personal-dropdown-button').click();
+    await expect(page.getByTestId('logout-button')).toBeVisible();
+    await page.getByTestId('logout-button').click();
+    await page.waitForURL('http://localhost:3000/login');
+
+    // Access sharelink
+    await page.goto(`/share/${createdSharelink}`);
+    await expect(page.locator('.page-meta')).toBeVisible();
+
+    await login(page);
+  });
+});

+ 5 - 20
apps/app/playwright/auth.setup.ts

@@ -1,24 +1,9 @@
-import path from 'node:path';
+import { test as setup } from '@playwright/test';
 
 
-import { test as setup, expect } from '@playwright/test';
-
-const authFile = path.resolve(__dirname, './.auth/admin.json');
+import { login } from './utils/Login';
 
 
+// Commonised login process for use elsewhere
+// see: https://github.com/microsoft/playwright/issues/22114
 setup('Authenticate as the "admin" user', async({ page }) => {
 setup('Authenticate as the "admin" user', async({ page }) => {
-  // Perform authentication steps. Replace these actions with your own.
-  await page.goto('/admin');
-
-  const loginForm = await page.$('form#login-form');
-
-  if (loginForm != null) {
-    await page.getByLabel('Username or E-mail').fill('admin');
-    await page.getByLabel('Password').fill('adminadmin');
-    await page.locator('[type=submit]').filter({ hasText: 'Login' }).click();
-  }
-
-  await page.waitForURL('/admin');
-  await expect(page).toHaveTitle(/Wiki Management Homepage/);
-
-  // End of authentication steps.
-  await page.context().storageState({ path: authFile });
+  await login(page);
 });
 });

+ 24 - 0
apps/app/playwright/utils/Login.ts

@@ -0,0 +1,24 @@
+import path from 'node:path';
+
+import { expect, type Page } from '@playwright/test';
+
+const authFile = path.resolve(__dirname, '../.auth/admin.json');
+
+export const login = async(page: Page): Promise<void> => {
+  // Perform authentication steps. Replace these actions with your own.
+  await page.goto('/admin');
+
+  const loginForm = await page.$('form#login-form');
+
+  if (loginForm != null) {
+    await page.getByLabel('Username or E-mail').fill('admin');
+    await page.getByLabel('Password').fill('adminadmin');
+    await page.locator('[type=submit]').filter({ hasText: 'Login' }).click();
+  }
+
+  await page.waitForURL('/admin');
+  await expect(page).toHaveTitle(/Wiki Management Homepage/);
+
+  // End of authentication steps.
+  await page.context().storageState({ path: authFile });
+};

+ 1 - 0
apps/app/playwright/utils/index.ts

@@ -1 +1,2 @@
 export * from './CollapseSidebar';
 export * from './CollapseSidebar';
+export * from './Login';

+ 5 - 0
apps/app/src/client/components/.eslintrc.js

@@ -0,0 +1,5 @@
+module.exports = {
+  extends: '../../../.eslintrc.js',
+  rules: {
+  },
+};

+ 0 - 0
apps/app/src/components/Admin/AdminHome/AdminHome.jsx → apps/app/src/client/components/Admin/AdminHome/AdminHome.jsx


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


+ 0 - 0
apps/app/src/components/Admin/AdminHome/SystemInfomationTable.tsx → apps/app/src/client/components/Admin/AdminHome/SystemInfomationTable.tsx


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


+ 0 - 0
apps/app/src/components/Admin/App/AppSettingsPageContents.tsx → apps/app/src/client/components/Admin/App/AppSettingsPageContents.tsx


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


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


+ 0 - 0
apps/app/src/components/Admin/App/ConfirmModal.tsx → apps/app/src/client/components/Admin/App/ConfirmModal.tsx


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


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


+ 0 - 0
apps/app/src/components/Admin/App/MailSetting.tsx → apps/app/src/client/components/Admin/App/MailSetting.tsx


+ 0 - 0
apps/app/src/components/Admin/App/MaintenanceMode.tsx → apps/app/src/client/components/Admin/App/MaintenanceMode.tsx


+ 0 - 0
apps/app/src/components/Admin/App/MaskedInput.module.scss → apps/app/src/client/components/Admin/App/MaskedInput.module.scss


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


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


+ 0 - 0
apps/app/src/components/Admin/App/SesSetting.tsx → apps/app/src/client/components/Admin/App/SesSetting.tsx


+ 0 - 0
apps/app/src/components/Admin/App/SiteUrlSetting.tsx → apps/app/src/client/components/Admin/App/SiteUrlSetting.tsx


+ 0 - 0
apps/app/src/components/Admin/App/SmtpSetting.tsx → apps/app/src/client/components/Admin/App/SmtpSetting.tsx


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

@@ -10,7 +10,7 @@ import {
 } from '~/interfaces/websocket';
 } from '~/interfaces/websocket';
 import { useGlobalAdminSocket } from '~/stores/websocket';
 import { useGlobalAdminSocket } from '~/stores/websocket';
 
 
-import AdminAppContainer from '../../../client/services/AdminAppContainer';
+import AdminAppContainer from '../../../services/AdminAppContainer';
 import { withUnstatedContainers } from '../../UnstatedUtils';
 import { withUnstatedContainers } from '../../UnstatedUtils';
 import LabeledProgressBar from '../Common/LabeledProgressBar';
 import LabeledProgressBar from '../Common/LabeledProgressBar';
 
 

+ 0 - 0
apps/app/src/components/Admin/AuditLog/ActivityTable.tsx → apps/app/src/client/components/Admin/AuditLog/ActivityTable.tsx


+ 0 - 0
apps/app/src/components/Admin/AuditLog/AuditLogDisableMode.tsx → apps/app/src/client/components/Admin/AuditLog/AuditLogDisableMode.tsx


+ 1 - 1
apps/app/src/components/Admin/AuditLog/AuditLogSettings.tsx → apps/app/src/client/components/Admin/AuditLog/AuditLogSettings.tsx

@@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next';
 import { Collapse } from 'reactstrap';
 import { Collapse } from 'reactstrap';
 
 
 import { AllSupportedActions } from '~/interfaces/activity';
 import { AllSupportedActions } from '~/interfaces/activity';
-import { useActivityExpirationSeconds, useAuditLogAvailableActions } from '~/stores/context';
+import { useActivityExpirationSeconds, useAuditLogAvailableActions } from '~/stores-universal/context';
 
 
 export const AuditLogSettings: FC = () => {
 export const AuditLogSettings: FC = () => {
   const { t } = useTranslation();
   const { t } = useTranslation();

+ 0 - 0
apps/app/src/components/Admin/AuditLog/DateRangePicker.tsx → apps/app/src/client/components/Admin/AuditLog/DateRangePicker.tsx


+ 0 - 0
apps/app/src/components/Admin/AuditLog/SearchUsernameTypeahead.tsx → apps/app/src/client/components/Admin/AuditLog/SearchUsernameTypeahead.tsx


+ 0 - 0
apps/app/src/components/Admin/AuditLog/SelectActionDropdown.tsx → apps/app/src/client/components/Admin/AuditLog/SelectActionDropdown.tsx


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

@@ -8,8 +8,8 @@ import { useTranslation } from 'react-i18next';
 import type { IClearable } from '~/client/interfaces/clearable';
 import type { IClearable } from '~/client/interfaces/clearable';
 import { toastError } from '~/client/util/toastr';
 import { toastError } from '~/client/util/toastr';
 import type { SupportedActionType } from '~/interfaces/activity';
 import type { SupportedActionType } from '~/interfaces/activity';
+import { useAuditLogEnabled, useAuditLogAvailableActions } from '~/stores-universal/context';
 import { useSWRxActivity } from '~/stores/activity';
 import { useSWRxActivity } from '~/stores/activity';
-import { useAuditLogEnabled, useAuditLogAvailableActions } from '~/stores/context';
 
 
 import PaginationWrapper from '../PaginationWrapper';
 import PaginationWrapper from '../PaginationWrapper';
 
 

+ 0 - 0
apps/app/src/components/Admin/Common/Accordion.jsx → apps/app/src/client/components/Admin/Common/Accordion.jsx


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


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


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


+ 0 - 0
apps/app/src/components/Admin/Customize/Customize.jsx → apps/app/src/client/components/Admin/Customize/Customize.jsx


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


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


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


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

@@ -6,8 +6,8 @@ import { LoadingSpinner } from '@growi/ui/dist/components';
 import { useTranslation } from 'next-i18next';
 import { useTranslation } from 'next-i18next';
 
 
 import { toastSuccess, toastError } from '~/client/util/toastr';
 import { toastSuccess, toastError } from '~/client/util/toastr';
+import { useNextThemes } from '~/stores-universal/use-next-themes';
 import { useSWRxLayoutSetting } from '~/stores/admin/customize';
 import { useSWRxLayoutSetting } from '~/stores/admin/customize';
-import { useNextThemes } from '~/stores/use-next-themes';
 
 
 const useIsContainerFluid = () => {
 const useIsContainerFluid = () => {
   const { data: layoutSetting, update: updateLayoutSetting } = useSWRxLayoutSetting();
   const { data: layoutSetting, update: updateLayoutSetting } = useSWRxLayoutSetting();

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

@@ -2,12 +2,12 @@ import React, { useCallback, useState } from 'react';
 
 
 import { useTranslation } from 'react-i18next';
 import { useTranslation } from 'react-i18next';
 
 
+import ImageCropModal from '~/client/components/Common/ImageCropModal';
 import {
 import {
   apiv3Delete, apiv3PostForm, apiv3Put,
   apiv3Delete, apiv3PostForm, apiv3Put,
 } from '~/client/util/apiv3-client';
 } from '~/client/util/apiv3-client';
 import { toastError, toastSuccess } from '~/client/util/toastr';
 import { toastError, toastSuccess } from '~/client/util/toastr';
-import ImageCropModal from '~/components/Common/ImageCropModal';
-import { useIsDefaultLogo, useIsCustomizedLogoUploaded } from '~/stores/context';
+import { useIsDefaultLogo, useIsCustomizedLogoUploaded } from '~/stores-universal/context';
 
 
 import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
 import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
 
 

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


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


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


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

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

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


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


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

@@ -6,7 +6,7 @@ import { Card, CardBody } from 'reactstrap';
 
 
 import { apiv3Put } from '~/client/util/apiv3-client';
 import { apiv3Put } from '~/client/util/apiv3-client';
 import { toastSuccess, toastError } from '~/client/util/toastr';
 import { toastSuccess, toastError } from '~/client/util/toastr';
-import { useCustomizeTitle } from '~/stores/context';
+import { useCustomizeTitle } from '~/stores-universal/context';
 
 
 import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
 import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
 
 

+ 0 - 0
apps/app/src/components/Admin/Customize/PagingSizeUncontrolledDropdown.jsx → apps/app/src/client/components/Admin/Customize/PagingSizeUncontrolledDropdown.jsx


+ 0 - 0
apps/app/src/components/Admin/Customize/ThemeColorBox.module.scss → apps/app/src/client/components/Admin/Customize/ThemeColorBox.module.scss


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


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

@@ -6,7 +6,7 @@ import { useTranslation } from 'next-i18next';
 import { apiv3Get, apiv3Post, apiv3Put } from '~/client/util/apiv3-client';
 import { apiv3Get, apiv3Post, apiv3Put } from '~/client/util/apiv3-client';
 import { toastSuccess, toastError } from '~/client/util/toastr';
 import { toastSuccess, toastError } from '~/client/util/toastr';
 import { SocketEventName } from '~/interfaces/websocket';
 import { SocketEventName } from '~/interfaces/websocket';
-import { useIsSearchServiceReachable } from '~/stores/context';
+import { useIsSearchServiceReachable } from '~/stores-universal/context';
 import { useAdminSocket } from '~/stores/socket-io';
 import { useAdminSocket } from '~/stores/socket-io';
 
 
 import NormalizeIndicesControls from './NormalizeIndicesControls';
 import NormalizeIndicesControls from './NormalizeIndicesControls';

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


+ 0 - 0
apps/app/src/components/Admin/ElasticsearchManagement/RebuildIndexControls.jsx → apps/app/src/client/components/Admin/ElasticsearchManagement/RebuildIndexControls.jsx


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


+ 0 - 0
apps/app/src/components/Admin/ElasticsearchManagement/StatusTable.jsx → apps/app/src/client/components/Admin/ElasticsearchManagement/StatusTable.jsx


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


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


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


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


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


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


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


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


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


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


+ 0 - 0
apps/app/src/components/Admin/ImportData/GrowiArchive/ImportCollectionConfigurationModal.jsx → apps/app/src/client/components/Admin/ImportData/GrowiArchive/ImportCollectionConfigurationModal.jsx


+ 0 - 0
apps/app/src/components/Admin/ImportData/GrowiArchive/ImportCollectionItem.jsx → apps/app/src/client/components/Admin/ImportData/GrowiArchive/ImportCollectionItem.jsx


+ 0 - 0
apps/app/src/components/Admin/ImportData/GrowiArchive/ImportForm.jsx → apps/app/src/client/components/Admin/ImportData/GrowiArchive/ImportForm.jsx


+ 0 - 0
apps/app/src/components/Admin/ImportData/GrowiArchive/UploadForm.jsx → apps/app/src/client/components/Admin/ImportData/GrowiArchive/UploadForm.jsx


+ 0 - 0
apps/app/src/components/Admin/ImportData/GrowiArchiveSection.jsx → apps/app/src/client/components/Admin/ImportData/GrowiArchiveSection.jsx


+ 0 - 0
apps/app/src/components/Admin/ImportData/ImportDataPageContents.jsx → apps/app/src/client/components/Admin/ImportData/ImportDataPageContents.jsx


+ 0 - 0
apps/app/src/components/Admin/LegacySlackIntegration/LegacySlackIntegration.jsx → apps/app/src/client/components/Admin/LegacySlackIntegration/LegacySlackIntegration.jsx


+ 0 - 0
apps/app/src/components/Admin/LegacySlackIntegration/SlackConfiguration.jsx → apps/app/src/client/components/Admin/LegacySlackIntegration/SlackConfiguration.jsx


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


+ 0 - 0
apps/app/src/components/Admin/MarkdownSetting/IndentForm.tsx → apps/app/src/client/components/Admin/MarkdownSetting/IndentForm.tsx


+ 0 - 0
apps/app/src/components/Admin/MarkdownSetting/LineBreakForm.jsx → apps/app/src/client/components/Admin/MarkdownSetting/LineBreakForm.jsx


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


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


+ 0 - 0
apps/app/src/components/Admin/MarkdownSetting/XssForm.jsx → apps/app/src/client/components/Admin/MarkdownSetting/XssForm.jsx


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


+ 0 - 0
apps/app/src/components/Admin/Notification/GlobalNotification.jsx → apps/app/src/client/components/Admin/Notification/GlobalNotification.jsx


+ 0 - 0
apps/app/src/components/Admin/Notification/GlobalNotificationList.jsx → apps/app/src/client/components/Admin/Notification/GlobalNotificationList.jsx


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

@@ -9,7 +9,7 @@ import { useRouter } from 'next/router';
 import { NotifyType, TriggerEventType } from '~/client/interfaces/global-notification';
 import { NotifyType, TriggerEventType } from '~/client/interfaces/global-notification';
 import { apiv3Post } from '~/client/util/apiv3-client';
 import { apiv3Post } from '~/client/util/apiv3-client';
 import { toastError } from '~/client/util/toastr';
 import { toastError } from '~/client/util/toastr';
-import { useIsMailerSetup } from '~/stores/context';
+import { useIsMailerSetup } from '~/stores-universal/context';
 import { useSWRxGlobalNotification } from '~/stores/global-notification';
 import { useSWRxGlobalNotification } from '~/stores/global-notification';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 

+ 0 - 0
apps/app/src/components/Admin/Notification/NotificationDeleteModal.jsx → apps/app/src/client/components/Admin/Notification/NotificationDeleteModal.jsx


+ 0 - 0
apps/app/src/components/Admin/Notification/NotificationSetting.jsx → apps/app/src/client/components/Admin/Notification/NotificationSetting.jsx


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


+ 0 - 0
apps/app/src/components/Admin/Notification/TriggerEventCheckBox.jsx → apps/app/src/client/components/Admin/Notification/TriggerEventCheckBox.jsx


+ 0 - 0
apps/app/src/components/Admin/Notification/UserNotificationRow.jsx → apps/app/src/client/components/Admin/Notification/UserNotificationRow.jsx


+ 0 - 0
apps/app/src/components/Admin/Notification/UserTriggerNotification.jsx → apps/app/src/client/components/Admin/Notification/UserTriggerNotification.jsx


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