From 1b0c5fdaafceb75ff9197ad5960d6a47e1a9e498 Mon Sep 17 00:00:00 2001 From: Yuki Takei Date: Mon, 9 Sep 2024 12:36:50 +0000 Subject: [PATCH 01/34] update mergify.yml --- .github/mergify.yml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/.github/mergify.yml b/.github/mergify.yml index ec9c30df50b..97d145409f0 100644 --- a/.github/mergify.yml +++ b/.github/mergify.yml @@ -3,19 +3,11 @@ queue_rules: allow_inplace_checks: false queue_conditions: - '#check-failure = 0' - - or: - - and: - - check-success ~= ci-slackbot-proxy- - - and: - - check-success ~= ci-app- + - check-success ~= ci-app- merge_conditions: - '#check-failure = 0' - - or: - - and: - - check-success ~= ci-slackbot-proxy- - - and: - - check-success ~= ci-app- - - check-success ~= test-prod-node20 / + - check-success ~= ci-app- + - check-success ~= test-prod-node20 / pull_request_rules: - name: Automatic queue to merge From bcef5586685e16ad0b24c1814e252c6ca253c959 Mon Sep 17 00:00:00 2001 From: GitHub Action <> Date: Mon, 9 Sep 2024 12:41:30 +0000 Subject: [PATCH 02/34] Bump version --- apps/app/package.json | 2 +- apps/slackbot-proxy/package.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/app/package.json b/apps/app/package.json index afb9f17a5d0..aaef901aac5 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -1,6 +1,6 @@ { "name": "@growi/app", - "version": "7.0.18", + "version": "7.0.19-RC.0", "license": "MIT", "private": "true", "scripts": { diff --git a/apps/slackbot-proxy/package.json b/apps/slackbot-proxy/package.json index e0526f3b240..e1ac72f4d46 100644 --- a/apps/slackbot-proxy/package.json +++ b/apps/slackbot-proxy/package.json @@ -1,6 +1,6 @@ { "name": "@growi/slackbot-proxy", - "version": "7.0.18-slackbot-proxy.0", + "version": "7.0.19-slackbot-proxy.0", "license": "MIT", "private": "true", "scripts": { diff --git a/package.json b/package.json index ea81fc02645..54d405a1716 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "growi", - "version": "7.0.18", + "version": "7.0.20-RC.0", "description": "Team collaboration software using markdown", "license": "MIT", "private": "true", From ca705935e322114cc3c4c1b820be15d32520d278 Mon Sep 17 00:00:00 2001 From: Yuki Takei Date: Mon, 9 Sep 2024 12:45:34 +0000 Subject: [PATCH 03/34] fix package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 54d405a1716..f4fbcc457d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "growi", - "version": "7.0.20-RC.0", + "version": "7.0.19-RC.0", "description": "Team collaboration software using markdown", "license": "MIT", "private": "true", From 6ba754ddd4720dac912acc5e3fc21c3bae50f3f5 Mon Sep 17 00:00:00 2001 From: Yuki Takei Date: Mon, 9 Sep 2024 12:58:02 +0000 Subject: [PATCH 04/34] fix error handling --- apps/app/src/client/components/PageComment.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/app/src/client/components/PageComment.tsx b/apps/app/src/client/components/PageComment.tsx index 55826a1a851..616f2b4594b 100644 --- a/apps/app/src/client/components/PageComment.tsx +++ b/apps/app/src/client/components/PageComment.tsx @@ -93,8 +93,12 @@ export const PageComment: FC = memo((props: PageCommentProps): onDeleteCommentAfterOperation(); } catch (error: unknown) { - setErrorMessageOnDelete(error as string); - toastError(`error: ${error}`); + const message = error instanceof Error + ? error.message + : (error as any).toString(); + + setErrorMessageOnDelete(message); + toastError(message); } }, [commentToBeDeleted, onDeleteCommentAfterOperation]); From b92e31de5a046f5a50d6ab0fb5d1de0a42f6db5e Mon Sep 17 00:00:00 2001 From: Yuki Takei Date: Mon, 9 Sep 2024 13:02:05 +0000 Subject: [PATCH 05/34] fix API route --- apps/app/src/server/routes/comment.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/app/src/server/routes/comment.js b/apps/app/src/server/routes/comment.js index 321a8796991..cbcf33261e4 100644 --- a/apps/app/src/server/routes/comment.js +++ b/apps/app/src/server/routes/comment.js @@ -1,4 +1,5 @@ +import { getIdStringForRef } from '@growi/core'; import { serializeUserSecurely } from '@growi/core/dist/models/serializers'; import { Comment, CommentEvent, commentEvent } from '~/features/comment/server'; @@ -56,7 +57,6 @@ module.exports = function(crowi, app) { const logger = loggerFactory('growi:routes:comment'); const User = crowi.model('User'); const Page = crowi.model('Page'); - const GlobalNotificationSetting = crowi.model('GlobalNotificationSetting'); const ApiResponse = require('../util/apiResponse'); const activityEvent = crowi.event('activity'); @@ -465,6 +465,7 @@ module.exports = function(crowi, app) { } try { + /** @type {import('mongoose').HydratedDocument} */ const comment = await Comment.findById(commentId).exec(); if (comment == null) { @@ -472,12 +473,12 @@ module.exports = function(crowi, app) { } // check whether accessible - const pageId = comment.page; + const pageId = getIdStringForRef(comment.page); const isAccessible = await Page.isAccessiblePageByViewer(pageId, req.user); if (!isAccessible) { throw new Error('Current user is not accessible to this page.'); } - if (req.user._id !== comment.creator.toString()) { + if (getIdStringForRef(req.user) !== getIdStringForRef(comment.creator)) { throw new Error('Current user is not operatable to this comment.'); } From 8fc33a0e9a0dfa1bf8b917ba04f69e3422e24491 Mon Sep 17 00:00:00 2001 From: Yuki Takei Date: Mon, 9 Sep 2024 13:25:38 +0000 Subject: [PATCH 06/34] improve grant data fetching --- apps/app/src/stores/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/app/src/stores/page.tsx b/apps/app/src/stores/page.tsx index 084d6033979..2181ecd5cf4 100644 --- a/apps/app/src/stores/page.tsx +++ b/apps/app/src/stores/page.tsx @@ -285,7 +285,7 @@ export const useSWRxCurrentGrantData = ( ? ['/page/grant-data', pageId] : null; - return useSWRImmutable( + return useSWR( key, ([endpoint, pageId]) => apiv3Get(endpoint, { pageId }).then(response => response.data), ); @@ -295,7 +295,7 @@ export const useSWRxApplicableGrant = ( pageId: string | null | undefined, ): SWRResponse => { - return useSWRImmutable( + return useSWR( pageId != null ? ['/page/applicable-grant', pageId] : null, ([endpoint, pageId]) => apiv3Get(endpoint, { pageId }).then(response => response.data), ); From c035c466b19217843ee7d835a8181ac41d736024 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 10 Sep 2024 03:54:49 +0000 Subject: [PATCH 07/34] bugFix --- apps/app/src/components/PageView/PageView.tsx | 2 ++ apps/app/src/pages/[[...path]].page.tsx | 5 ++++- apps/app/src/stores/page.tsx | 17 ++++++++++------- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/apps/app/src/components/PageView/PageView.tsx b/apps/app/src/components/PageView/PageView.tsx index b3e88d7759c..e9e77bc35ce 100644 --- a/apps/app/src/components/PageView/PageView.tsx +++ b/apps/app/src/components/PageView/PageView.tsx @@ -128,6 +128,8 @@ export const PageView = (props: Props): JSX.Element => { const markdown = page.revision.body; const rendererOptions = viewOptions ?? generateSSRViewOptions(rendererConfig, pagePath); + console.log('markdown', markdown); + return ( <> diff --git a/apps/app/src/pages/[[...path]].page.tsx b/apps/app/src/pages/[[...path]].page.tsx index 4dd4124783e..6fa37906512 100644 --- a/apps/app/src/pages/[[...path]].page.tsx +++ b/apps/app/src/pages/[[...path]].page.tsx @@ -190,6 +190,7 @@ type Props = CommonProps & { yjsData: CurrentPageYjsData, rendererConfig: RendererConfig, + isPastRevisionSelected: boolean, }; const Page: NextPageWithLayout = (props: Props) => { @@ -250,7 +251,7 @@ const Page: NextPageWithLayout = (props: Props) => { useCurrentPathname(props.currentPathname); - const { data: currentPage } = useSWRxCurrentPage(pageWithMeta?.data ?? null); // store initial data + const { data: currentPage } = useSWRxCurrentPage(pageWithMeta?.data ?? null, props.isPastRevisionSelected); // store initial data const { trigger: mutateCurrentPage } = useSWRMUTxCurrentPage(); const { trigger: mutateCurrentPageYjsDataFromApi } = useSWRMUTxCurrentPageYjsData(); @@ -432,6 +433,8 @@ async function injectPageData(context: GetServerSidePropsContext, props: Props): const { crowi } = req; const { revisionId } = req.query; + props.isPastRevisionSelected = revisionId != null; + const Page = crowi.model('Page') as PageModel; const PageRedirect = mongooseModel('PageRedirect') as PageRedirectModel; const { pageService, configManager } = crowi; diff --git a/apps/app/src/stores/page.tsx b/apps/app/src/stores/page.tsx index 084d6033979..47931d3c7a6 100644 --- a/apps/app/src/stores/page.tsx +++ b/apps/app/src/stores/page.tsx @@ -54,7 +54,9 @@ export const useTemplateBodyData = (initialData?: string): SWRResponse => { +export const useSWRxCurrentPage = ( + initialData?: IPagePopulatedToShowRevision|null, isPastRevisionSelected = false, +): SWRResponse => { const key = 'currentPage'; const { cache } = useSWRConfig(); @@ -81,23 +83,24 @@ export const useSWRxCurrentPage = (initialData?: IPagePopulatedToShowRevision|nu return true; } - // mutate When a different revision is opened - if (cachedData.revision?._id != null && initialData.revision?._id != null && cachedData.revision._id !== initialData.revision._id) { - return true; - } + // // mutate When a different revision is opened + // if (cachedData.revision?._id != null && initialData.revision?._id != null && cachedData.revision._id !== initialData.revision._id) { + // console.log('initialData', initialData); + // return true; + // } return false; })(); useEffect(() => { - if (shouldMutate) { + if (shouldMutate || isPastRevisionSelected) { mutate(key, initialData, { optimisticData: initialData, populateCache: true, revalidate: false, }); } - }, [initialData, key, shouldMutate]); + }, [initialData, isPastRevisionSelected, key, shouldMutate]); return useSWR(key, null, { keepPreviousData: true, From 9fb90c17d28472238d80ef63fa66a4caf3caa67f Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 10 Sep 2024 05:04:18 +0000 Subject: [PATCH 08/34] Use useIsLatestRevision() --- apps/app/src/components/PageView/PageView.tsx | 2 -- apps/app/src/pages/[[...path]].page.tsx | 5 +---- apps/app/src/stores/page.tsx | 22 ++++++++++--------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/apps/app/src/components/PageView/PageView.tsx b/apps/app/src/components/PageView/PageView.tsx index e9e77bc35ce..b3e88d7759c 100644 --- a/apps/app/src/components/PageView/PageView.tsx +++ b/apps/app/src/components/PageView/PageView.tsx @@ -128,8 +128,6 @@ export const PageView = (props: Props): JSX.Element => { const markdown = page.revision.body; const rendererOptions = viewOptions ?? generateSSRViewOptions(rendererConfig, pagePath); - console.log('markdown', markdown); - return ( <> diff --git a/apps/app/src/pages/[[...path]].page.tsx b/apps/app/src/pages/[[...path]].page.tsx index 6fa37906512..4dd4124783e 100644 --- a/apps/app/src/pages/[[...path]].page.tsx +++ b/apps/app/src/pages/[[...path]].page.tsx @@ -190,7 +190,6 @@ type Props = CommonProps & { yjsData: CurrentPageYjsData, rendererConfig: RendererConfig, - isPastRevisionSelected: boolean, }; const Page: NextPageWithLayout = (props: Props) => { @@ -251,7 +250,7 @@ const Page: NextPageWithLayout = (props: Props) => { useCurrentPathname(props.currentPathname); - const { data: currentPage } = useSWRxCurrentPage(pageWithMeta?.data ?? null, props.isPastRevisionSelected); // store initial data + const { data: currentPage } = useSWRxCurrentPage(pageWithMeta?.data ?? null); // store initial data const { trigger: mutateCurrentPage } = useSWRMUTxCurrentPage(); const { trigger: mutateCurrentPageYjsDataFromApi } = useSWRMUTxCurrentPageYjsData(); @@ -433,8 +432,6 @@ async function injectPageData(context: GetServerSidePropsContext, props: Props): const { crowi } = req; const { revisionId } = req.query; - props.isPastRevisionSelected = revisionId != null; - const Page = crowi.model('Page') as PageModel; const PageRedirect = mongooseModel('PageRedirect') as PageRedirectModel; const { pageService, configManager } = crowi; diff --git a/apps/app/src/stores/page.tsx b/apps/app/src/stores/page.tsx index 47931d3c7a6..957e99e3fb3 100644 --- a/apps/app/src/stores/page.tsx +++ b/apps/app/src/stores/page.tsx @@ -54,11 +54,11 @@ export const useTemplateBodyData = (initialData?: string): SWRResponse => { +export const useSWRxCurrentPage = (initialData?: IPagePopulatedToShowRevision|null): SWRResponse => { const key = 'currentPage'; + const { data: isLatestRevision } = useIsLatestRevision(); + const { cache } = useSWRConfig(); // Problem 1: https://github.com/weseek/growi/pull/7772/files#diff-4c1708c4f959974166c15435c6b35950ba01bbf35e7e4b8e99efeb125a8000a7 @@ -83,24 +83,26 @@ export const useSWRxCurrentPage = ( return true; } - // // mutate When a different revision is opened - // if (cachedData.revision?._id != null && initialData.revision?._id != null && cachedData.revision._id !== initialData.revision._id) { - // console.log('initialData', initialData); - // return true; - // } + // mutate When a different revision is opened + if (!isLatestRevision + && cachedData.revision?._id != null && initialData.revision?._id != null + && cachedData.revision._id !== initialData.revision._id + ) { + return true; + } return false; })(); useEffect(() => { - if (shouldMutate || isPastRevisionSelected) { + if (shouldMutate) { mutate(key, initialData, { optimisticData: initialData, populateCache: true, revalidate: false, }); } - }, [initialData, isPastRevisionSelected, key, shouldMutate]); + }, [initialData, key, shouldMutate]); return useSWR(key, null, { keepPreviousData: true, From 2fd6c1956a669f347e9dca9cea5370dbc8b2ef55 Mon Sep 17 00:00:00 2001 From: WNomunomu Date: Tue, 10 Sep 2024 05:08:42 +0000 Subject: [PATCH 09/34] add the new error code to PageUpdateErrorCode --- apps/app/src/interfaces/apiv3/page.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/app/src/interfaces/apiv3/page.ts b/apps/app/src/interfaces/apiv3/page.ts index 57e292a2775..bca4f78a059 100644 --- a/apps/app/src/interfaces/apiv3/page.ts +++ b/apps/app/src/interfaces/apiv3/page.ts @@ -42,4 +42,5 @@ export type IApiv3PageUpdateResponse = { export const PageUpdateErrorCode = { CONFLICT: 'conflict', + FORBIDDEN: 'forbidden', } as const; From 445ad7207b9821795e818c02e3c99d3cba792719 Mon Sep 17 00:00:00 2001 From: WNomunomu Date: Tue, 10 Sep 2024 05:09:38 +0000 Subject: [PATCH 10/34] change to return error when the restricted grant is tried to change via api --- .../src/server/routes/apiv3/page/update-page.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/apps/app/src/server/routes/apiv3/page/update-page.ts b/apps/app/src/server/routes/apiv3/page/update-page.ts index bf3db74c782..9e768065133 100644 --- a/apps/app/src/server/routes/apiv3/page/update-page.ts +++ b/apps/app/src/server/routes/apiv3/page/update-page.ts @@ -27,6 +27,8 @@ import { apiV3FormValidator } from '../../../middlewares/apiv3-form-validator'; import { excludeReadOnlyUser } from '../../../middlewares/exclude-read-only-user'; import type { ApiV3Response } from '../interfaces/apiv3-response'; +import { isTopPage, isUsersProtectedPages } from '@growi/core/dist/utils/page-path-utils'; + const logger = loggerFactory('growi:routes:apiv3:page:update-page'); @@ -119,7 +121,7 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => { return [ accessTokenParser, loginRequiredStrictly, excludeReadOnlyUser, addActivity, validator, apiV3FormValidator, - async(req: UpdatePageRequest, res: ApiV3Response) => { + async (req: UpdatePageRequest, res: ApiV3Response) => { const { pageId, revisionId, body, origin, } = req.body; @@ -160,6 +162,8 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => { return res.apiv3Err(new ErrorV3('Posted param "revisionId" is outdated.', PageUpdateErrorCode.CONFLICT, undefined, { returnLatestRevision }), 409); } + const isGrantImmutable = isTopPage(currentPage.path) || isUsersProtectedPages(currentPage.path); + let updatedPage: PageDocument; let previousRevision: IRevisionHasId | null; try { @@ -168,8 +172,13 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => { } = req.body; const options: IOptionsForUpdate = { overwriteScopesOfDescendants, origin, wip }; if (grant != null) { - options.grant = grant; - options.userRelatedGrantUserGroupIds = userRelatedGrantUserGroupIds; + if (isGrantImmutable) { + return res.apiv3Err(new ErrorV3('The grant settings for the specified page cannot be modified.', PageUpdateErrorCode.FORBIDDEN), 403); + } + else { + options.grant = grant; + options.userRelatedGrantUserGroupIds = userRelatedGrantUserGroupIds; + } } previousRevision = await Revision.findById(sanitizeRevisionId); updatedPage = await crowi.pageService.updatePage(currentPage, body, previousRevision?.body ?? null, req.user, options); From 0b8b57af81a1a9505b2a32d17946fc80f01c8a16 Mon Sep 17 00:00:00 2001 From: WNomunomu Date: Tue, 10 Sep 2024 05:18:26 +0000 Subject: [PATCH 11/34] fix for lint --- apps/app/src/server/routes/apiv3/page/update-page.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/app/src/server/routes/apiv3/page/update-page.ts b/apps/app/src/server/routes/apiv3/page/update-page.ts index 9e768065133..d9ee1e4fa57 100644 --- a/apps/app/src/server/routes/apiv3/page/update-page.ts +++ b/apps/app/src/server/routes/apiv3/page/update-page.ts @@ -175,10 +175,7 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => { if (isGrantImmutable) { return res.apiv3Err(new ErrorV3('The grant settings for the specified page cannot be modified.', PageUpdateErrorCode.FORBIDDEN), 403); } - else { - options.grant = grant; - options.userRelatedGrantUserGroupIds = userRelatedGrantUserGroupIds; - } + options.userRelatedGrantUserGroupIds = userRelatedGrantUserGroupIds; } previousRevision = await Revision.findById(sanitizeRevisionId); updatedPage = await crowi.pageService.updatePage(currentPage, body, previousRevision?.body ?? null, req.user, options); From 9c469ff08f49c511dc40b442ca154ea0672160ea Mon Sep 17 00:00:00 2001 From: WNomunomu Date: Tue, 10 Sep 2024 05:34:11 +0000 Subject: [PATCH 12/34] fix for lint --- apps/app/src/server/routes/apiv3/page/update-page.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/app/src/server/routes/apiv3/page/update-page.ts b/apps/app/src/server/routes/apiv3/page/update-page.ts index d9ee1e4fa57..d14a018bce7 100644 --- a/apps/app/src/server/routes/apiv3/page/update-page.ts +++ b/apps/app/src/server/routes/apiv3/page/update-page.ts @@ -4,6 +4,7 @@ import type { } from '@growi/core'; import { ErrorV3 } from '@growi/core/dist/models'; import { serializeUserSecurely } from '@growi/core/dist/models/serializers'; +import { isTopPage, isUsersProtectedPages } from '@growi/core/dist/utils/page-path-utils'; import type { Request, RequestHandler } from 'express'; import type { ValidationChain } from 'express-validator'; import { body } from 'express-validator'; @@ -27,7 +28,6 @@ import { apiV3FormValidator } from '../../../middlewares/apiv3-form-validator'; import { excludeReadOnlyUser } from '../../../middlewares/exclude-read-only-user'; import type { ApiV3Response } from '../interfaces/apiv3-response'; -import { isTopPage, isUsersProtectedPages } from '@growi/core/dist/utils/page-path-utils'; const logger = loggerFactory('growi:routes:apiv3:page:update-page'); @@ -121,7 +121,7 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => { return [ accessTokenParser, loginRequiredStrictly, excludeReadOnlyUser, addActivity, validator, apiV3FormValidator, - async (req: UpdatePageRequest, res: ApiV3Response) => { + async(req: UpdatePageRequest, res: ApiV3Response) => { const { pageId, revisionId, body, origin, } = req.body; From 35c38c9e294fc156ed08230c9bdf1455a776816f Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 10 Sep 2024 06:41:03 +0000 Subject: [PATCH 13/34] fix commet --- apps/app/src/stores/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/app/src/stores/page.tsx b/apps/app/src/stores/page.tsx index 957e99e3fb3..22d57c5174a 100644 --- a/apps/app/src/stores/page.tsx +++ b/apps/app/src/stores/page.tsx @@ -83,7 +83,7 @@ export const useSWRxCurrentPage = (initialData?: IPagePopulatedToShowRevision|nu return true; } - // mutate When a different revision is opened + // mutate when opening a previous revision. if (!isLatestRevision && cachedData.revision?._id != null && initialData.revision?._id != null && cachedData.revision._id !== initialData.revision._id From f22c5670b4271292dcda9691724a9bb5767ede16 Mon Sep 17 00:00:00 2001 From: WNomunomu Date: Tue, 10 Sep 2024 07:36:49 +0000 Subject: [PATCH 14/34] change to check for grant at an earlier stage --- .../src/server/routes/apiv3/page/update-page.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/app/src/server/routes/apiv3/page/update-page.ts b/apps/app/src/server/routes/apiv3/page/update-page.ts index d14a018bce7..2ab919159a3 100644 --- a/apps/app/src/server/routes/apiv3/page/update-page.ts +++ b/apps/app/src/server/routes/apiv3/page/update-page.ts @@ -123,7 +123,7 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => { validator, apiV3FormValidator, async(req: UpdatePageRequest, res: ApiV3Response) => { const { - pageId, revisionId, body, origin, + pageId, revisionId, body, origin, grant, } = req.body; const sanitizeRevisionId = revisionId == null ? undefined : generalXssFilter.process(revisionId); @@ -141,6 +141,12 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => { return res.apiv3Err(new ErrorV3(`Page('${pageId}' is not found or forbidden`, 'notfound_or_forbidden'), 400); } + const isGrantImmutable = isTopPage(currentPage.path) || isUsersProtectedPages(currentPage.path); + + if (grant && isGrantImmutable) { + return res.apiv3Err(new ErrorV3('The grant settings for the specified page cannot be modified.', PageUpdateErrorCode.FORBIDDEN), 403); + } + if (currentPage != null) { // Normalize the latest revision which was borken by the migration script '20211227060705-revision-path-to-page-id-schema-migration--fixed-7549.js' try { @@ -162,19 +168,15 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => { return res.apiv3Err(new ErrorV3('Posted param "revisionId" is outdated.', PageUpdateErrorCode.CONFLICT, undefined, { returnLatestRevision }), 409); } - const isGrantImmutable = isTopPage(currentPage.path) || isUsersProtectedPages(currentPage.path); - let updatedPage: PageDocument; let previousRevision: IRevisionHasId | null; try { const { - grant, userRelatedGrantUserGroupIds, overwriteScopesOfDescendants, wip, + userRelatedGrantUserGroupIds, overwriteScopesOfDescendants, wip, } = req.body; const options: IOptionsForUpdate = { overwriteScopesOfDescendants, origin, wip }; if (grant != null) { - if (isGrantImmutable) { - return res.apiv3Err(new ErrorV3('The grant settings for the specified page cannot be modified.', PageUpdateErrorCode.FORBIDDEN), 403); - } + options.grant = grant; options.userRelatedGrantUserGroupIds = userRelatedGrantUserGroupIds; } previousRevision = await Revision.findById(sanitizeRevisionId); From 33d314bce7cf62655674cd071bbcc23c2ec58071 Mon Sep 17 00:00:00 2001 From: WNomunomu Date: Tue, 10 Sep 2024 08:07:48 +0000 Subject: [PATCH 15/34] fix the conditional branch --- apps/app/src/server/routes/apiv3/page/update-page.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/app/src/server/routes/apiv3/page/update-page.ts b/apps/app/src/server/routes/apiv3/page/update-page.ts index 2ab919159a3..b13a29a69e8 100644 --- a/apps/app/src/server/routes/apiv3/page/update-page.ts +++ b/apps/app/src/server/routes/apiv3/page/update-page.ts @@ -143,7 +143,7 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => { const isGrantImmutable = isTopPage(currentPage.path) || isUsersProtectedPages(currentPage.path); - if (grant && isGrantImmutable) { + if (grant && grant !== currentPage.grant && isGrantImmutable) { return res.apiv3Err(new ErrorV3('The grant settings for the specified page cannot be modified.', PageUpdateErrorCode.FORBIDDEN), 403); } From 2457c2980dee911aad379f0ef6e9978d7f0d7ff1 Mon Sep 17 00:00:00 2001 From: WNomunomu Date: Tue, 10 Sep 2024 09:44:51 +0000 Subject: [PATCH 16/34] add null check to the conditional branch --- apps/app/src/server/routes/apiv3/page/update-page.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/app/src/server/routes/apiv3/page/update-page.ts b/apps/app/src/server/routes/apiv3/page/update-page.ts index b13a29a69e8..1c3dbb40974 100644 --- a/apps/app/src/server/routes/apiv3/page/update-page.ts +++ b/apps/app/src/server/routes/apiv3/page/update-page.ts @@ -143,7 +143,7 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => { const isGrantImmutable = isTopPage(currentPage.path) || isUsersProtectedPages(currentPage.path); - if (grant && grant !== currentPage.grant && isGrantImmutable) { + if (grant != null && grant !== currentPage.grant && isGrantImmutable) { return res.apiv3Err(new ErrorV3('The grant settings for the specified page cannot be modified.', PageUpdateErrorCode.FORBIDDEN), 403); } From 554ca25719ca1a87b57c9aeb650ee3aff01fd989 Mon Sep 17 00:00:00 2001 From: Yuki Takei Date: Tue, 10 Sep 2024 10:16:34 +0000 Subject: [PATCH 17/34] setup launch-dev --- .github/workflows/ci-app.yml | 4 ++-- apps/app/package.json | 2 +- apps/app/turbo.json | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci-app.yml b/.github/workflows/ci-app.yml index bb3f3014856..c943c797f16 100644 --- a/.github/workflows/ci-app.yml +++ b/.github/workflows/ci-app.yml @@ -206,11 +206,11 @@ jobs: yarn global add node-gyp yarn --frozen-lockfile - - name: turbo run dev:ci + - name: turbo run launch-dev:ci working-directory: ./apps/app run: | cp config/ci/.env.local.for-ci .env.development.local - turbo run dev:ci --env-mode=loose + turbo run launch-dev:ci --env-mode=loose env: MONGO_URI: mongodb://localhost:${{ job.services.mongodb.ports['27017'] }}/growi_dev diff --git a/apps/app/package.json b/apps/app/package.json index aaef901aac5..4357251a65d 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -26,7 +26,7 @@ "dev:migrate:up": "yarn dev:migrate-mongo up -f config/migrate-mongo-config.js", "dev:migrate:down": "yarn dev:migrate-mongo down -f config/migrate-mongo-config.js", "//// for CI": "", - "dev:ci": "yarn cross-env NODE_ENV=development yarn ts-node src/server/app.ts --ci", + "launch-dev:ci": "yarn cross-env NODE_ENV=development yarn dev:migrate && yarn ts-node src/server/app.ts --ci", "lint:typecheck": "npx -y tspc", "lint:eslint": "yarn eslint --quiet \"**/*.{js,jsx,ts,tsx}\"", "lint:styles": "stylelint \"src/**/*.scss\"", diff --git a/apps/app/turbo.json b/apps/app/turbo.json index 03a84546bc1..4b2b0557d79 100644 --- a/apps/app/turbo.json +++ b/apps/app/turbo.json @@ -49,8 +49,9 @@ "cache": false, "persistent": true }, - "dev:ci": { - "dependsOn": ["^dev", "dev:migrate", "dev:styles-prebuilt"], + + "launch-dev:ci": { + "dependsOn": ["^dev", "dev:styles-prebuilt"], "cache": false }, From 2c0cf9cff4c995b3d53fe31720baf7053f3feeeb Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 10 Sep 2024 10:35:45 +0000 Subject: [PATCH 18/34] Enabled to return sharedPage in GET /_api/v3/page --- apps/app/src/server/models/page.ts | 1 + apps/app/src/server/routes/apiv3/page/index.ts | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/app/src/server/models/page.ts b/apps/app/src/server/models/page.ts index 98fb82559ad..071e8622b5d 100644 --- a/apps/app/src/server/models/page.ts +++ b/apps/app/src/server/models/page.ts @@ -50,6 +50,7 @@ export interface PageDocument extends IPage, Document { [x:string]: any // for obsolete methods getLatestRevisionBodyLength(): Promise calculateAndUpdateLatestRevisionBodyLength(this: PageDocument): Promise + populateDataToShowRevision(shouldExcludeBody: boolean): Promise } diff --git a/apps/app/src/server/routes/apiv3/page/index.ts b/apps/app/src/server/routes/apiv3/page/index.ts index a20a3a08274..5f1cf800d90 100644 --- a/apps/app/src/server/routes/apiv3/page/index.ts +++ b/apps/app/src/server/routes/apiv3/page/index.ts @@ -20,6 +20,7 @@ import { excludeReadOnlyUser } from '~/server/middlewares/exclude-read-only-user import { GlobalNotificationSettingEvent } from '~/server/models/GlobalNotificationSetting'; import type { PageDocument, PageModel } from '~/server/models/page'; import { Revision } from '~/server/models/revision'; +import ShareLink from '~/server/models/share-link'; import Subscription from '~/server/models/subscription'; import { configManager } from '~/server/service/config-manager'; import type { IPageGrantService } from '~/server/service/page-grant'; @@ -202,6 +203,7 @@ module.exports = (crowi) => { query('pageId').optional().isString(), query('path').optional().isString(), query('findAll').optional().isBoolean(), + query('shareLinkId').optional().isMongoId(), ], likes: [ body('pageId').isString(), @@ -284,15 +286,26 @@ module.exports = (crowi) => { * $ref: '#/components/schemas/Page' */ router.get('/', certifySharedPage, accessTokenParser, loginRequired, validator.getPage, apiV3FormValidator, async(req, res) => { - const { user } = req; + const { user, isSharedPage } = req; const { - pageId, path, findAll, revisionId, + pageId, path, findAll, revisionId, shareLinkId, } = req.query; if (pageId == null && path == null) { return res.apiv3Err(new ErrorV3('Either parameter of path or pageId is required.', 'invalid-request')); } + if (isSharedPage) { + const shareLink = await ShareLink.findOne({ _id: shareLinkId }).populate('relatedPage'); + if (shareLink == null) { + return res.apiv3Err(new ErrorV3('ShareLink is not found'), 404); + } + + const relatedPage = await Page.findOne({ _id: getIdForRef(shareLink.relatedPage) }); + const pagePopulateDataToShowRevision = await relatedPage?.populateDataToShowRevision(false); + return res.apiv3({ page: pagePopulateDataToShowRevision }); + } + let page; let pages; try { From b4b6d45c8b929ef35fdfd6e98cb021749e6862be Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 10 Sep 2024 10:52:33 +0000 Subject: [PATCH 19/34] Make shouldExcludeBody optional --- apps/app/src/server/models/page.ts | 2 +- apps/app/src/server/routes/apiv3/page/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/app/src/server/models/page.ts b/apps/app/src/server/models/page.ts index 071e8622b5d..84e5f6f9296 100644 --- a/apps/app/src/server/models/page.ts +++ b/apps/app/src/server/models/page.ts @@ -50,7 +50,7 @@ export interface PageDocument extends IPage, Document { [x:string]: any // for obsolete methods getLatestRevisionBodyLength(): Promise calculateAndUpdateLatestRevisionBodyLength(this: PageDocument): Promise - populateDataToShowRevision(shouldExcludeBody: boolean): Promise + populateDataToShowRevision(shouldExcludeBody?: boolean): Promise } diff --git a/apps/app/src/server/routes/apiv3/page/index.ts b/apps/app/src/server/routes/apiv3/page/index.ts index 5f1cf800d90..75c305e9898 100644 --- a/apps/app/src/server/routes/apiv3/page/index.ts +++ b/apps/app/src/server/routes/apiv3/page/index.ts @@ -302,7 +302,7 @@ module.exports = (crowi) => { } const relatedPage = await Page.findOne({ _id: getIdForRef(shareLink.relatedPage) }); - const pagePopulateDataToShowRevision = await relatedPage?.populateDataToShowRevision(false); + const pagePopulateDataToShowRevision = await relatedPage?.populateDataToShowRevision(); return res.apiv3({ page: pagePopulateDataToShowRevision }); } From aa2a3437fdd2721a02b7bf2ca94d860f6fedda1f Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 11 Sep 2024 02:25:26 +0000 Subject: [PATCH 20/34] Add problems --- apps/app/src/stores/page.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/app/src/stores/page.tsx b/apps/app/src/stores/page.tsx index 22d57c5174a..906534bec74 100644 --- a/apps/app/src/stores/page.tsx +++ b/apps/app/src/stores/page.tsx @@ -63,6 +63,8 @@ export const useSWRxCurrentPage = (initialData?: IPagePopulatedToShowRevision|nu // Problem 1: https://github.com/weseek/growi/pull/7772/files#diff-4c1708c4f959974166c15435c6b35950ba01bbf35e7e4b8e99efeb125a8000a7 // Problem 2: https://redmine.weseek.co.jp/issues/141027 + // Problem 3: https://redmine.weseek.co.jp/issues/153618 + // Problem 4: https://redmine.weseek.co.jp/issues/153759 const shouldMutate = (() => { if (initialData === undefined) { return false; From 12f7061d7c6d61263b5448ca1449819fca493dd9 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 11 Sep 2024 04:59:53 +0000 Subject: [PATCH 21/34] fix validation --- .../app/src/server/routes/apiv3/page/index.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/app/src/server/routes/apiv3/page/index.ts b/apps/app/src/server/routes/apiv3/page/index.ts index 75c305e9898..0a3fa3e190a 100644 --- a/apps/app/src/server/routes/apiv3/page/index.ts +++ b/apps/app/src/server/routes/apiv3/page/index.ts @@ -291,25 +291,25 @@ module.exports = (crowi) => { pageId, path, findAll, revisionId, shareLinkId, } = req.query; - if (pageId == null && path == null) { - return res.apiv3Err(new ErrorV3('Either parameter of path or pageId is required.', 'invalid-request')); + if (isSharedPage && path != null) { + return res.apiv3Err(new ErrorV3('Either parameter of (pageId or path) or (pageId and shareLinkId) is required.', 'invalid-request')); } - if (isSharedPage) { - const shareLink = await ShareLink.findOne({ _id: shareLinkId }).populate('relatedPage'); - if (shareLink == null) { - return res.apiv3Err(new ErrorV3('ShareLink is not found'), 404); - } - - const relatedPage = await Page.findOne({ _id: getIdForRef(shareLink.relatedPage) }); - const pagePopulateDataToShowRevision = await relatedPage?.populateDataToShowRevision(); - return res.apiv3({ page: pagePopulateDataToShowRevision }); + if (!isSharedPage && (pageId == null && path == null)) { + return res.apiv3Err(new ErrorV3('Either parameter of (pageId or path) or (pageId and shareLinkId) is required.', 'invalid-request')); } let page; let pages; try { - if (pageId != null) { // prioritized + if (isSharedPage) { + const shareLink = await ShareLink.findOne({ _id: shareLinkId }).populate('relatedPage'); + if (shareLink == null) { + throw new Error('ShareLink is not found'); + } + page = await Page.findOne({ _id: getIdForRef(shareLink.relatedPage) }); + } + else if (pageId != null) { // prioritized page = await Page.findByIdAndViewer(pageId, user); } else if (!findAll) { From e7a94cb9902c556852144935d5a80a9631dd0b2f Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 11 Sep 2024 07:16:45 +0000 Subject: [PATCH 22/34] fix validation --- apps/app/src/server/routes/apiv3/page/index.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/app/src/server/routes/apiv3/page/index.ts b/apps/app/src/server/routes/apiv3/page/index.ts index 0a3fa3e190a..90668306e4e 100644 --- a/apps/app/src/server/routes/apiv3/page/index.ts +++ b/apps/app/src/server/routes/apiv3/page/index.ts @@ -291,12 +291,9 @@ module.exports = (crowi) => { pageId, path, findAll, revisionId, shareLinkId, } = req.query; - if (isSharedPage && path != null) { - return res.apiv3Err(new ErrorV3('Either parameter of (pageId or path) or (pageId and shareLinkId) is required.', 'invalid-request')); - } - - if (!isSharedPage && (pageId == null && path == null)) { - return res.apiv3Err(new ErrorV3('Either parameter of (pageId or path) or (pageId and shareLinkId) is required.', 'invalid-request')); + const isValid = (shareLinkId != null && pageId != null && path == null) || (shareLinkId == null && (pageId != null || path != null)); + if (!isValid) { + return res.apiv3Err(new Error('Either parameter of (pageId or path) or (pageId and shareLinkId) is required.'), 400); } let page; From d281014a67f14083da14ec0ebfbaadc7bc271903 Mon Sep 17 00:00:00 2001 From: shironegi39 Date: Wed, 11 Sep 2024 08:36:19 +0000 Subject: [PATCH 23/34] JP language support --- apps/app/public/static/locales/ja_JP/commons.json | 2 +- .../src/client/components/Admin/G2GDataTransfer.tsx | 10 +++++++++- apps/app/src/client/components/DataTransferForm.tsx | 9 ++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/apps/app/public/static/locales/ja_JP/commons.json b/apps/app/public/static/locales/ja_JP/commons.json index f85a86db4f9..1ef59c46ddc 100644 --- a/apps/app/public/static/locales/ja_JP/commons.json +++ b/apps/app/public/static/locales/ja_JP/commons.json @@ -159,6 +159,6 @@ "publish_transfer_key": "移行キーを発行する", "transfer_key_limit": "※ 移行キーの有効期限は発行から1時間となります。", "once_transfer_key_used": "※ 移行キーは一度移行に利用するとそれ以降はご利用いただけなくなります。", - "transfer_to_growi_cloud": "※ GROWI.cloud への移行を実施する場合はこちらをご確認ください。" + "transfer_to_growi_cloud": "※ 詳しくは こちら" } } diff --git a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx index a61650af4a8..1722ffaa594 100644 --- a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx +++ b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx @@ -8,6 +8,7 @@ import { useGenerateTransferKey } from '~/client/services/g2g-transfer'; import { apiv3Get, apiv3Post } from '~/client/util/apiv3-client'; import { toastError, toastSuccess } from '~/client/util/toastr'; import { G2G_PROGRESS_STATUS, type G2GProgress } from '~/interfaces/g2g-transfer'; +import { useGrowiCloudUri, useGrowiAppIdForGrowiCloud } from '~/stores-universal/context'; import { useAdminSocket } from '~/stores/socket-io'; import CustomCopyToClipBoard from '../Common/CustomCopyToClipBoard'; @@ -34,6 +35,8 @@ const G2GDataTransfer = (): JSX.Element => { mongo: G2G_PROGRESS_STATUS.PENDING, attachments: G2G_PROGRESS_STATUS.PENDING, }); + const { data: growiCloudUri } = useGrowiCloudUri(); + const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); // File upload settings // const [fileUploadType, setFileUploadType] = useState('aws'); @@ -123,6 +126,10 @@ const G2GDataTransfer = (): JSX.Element => { } }, [setTransferring, startTransferKey, selectedCollections, optionsMap]); + const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null + ? 'https://growi.cloud/help/ja/admin-guide/management-cookbook/g2g-transfer.html' + : 'https://docs.growi.org/ja/admin-guide/management-cookbook/g2g-transfer.html'; + // File upload // const onChangeFileUploadTypeHandler = useCallback((e: ChangeEvent, type: string) => { // setFileUploadType(type); @@ -275,7 +282,8 @@ const G2GDataTransfer = (): JSX.Element => {

{t('commons:g2g_data_transfer.transfer_key_limit')}

{t('commons:g2g_data_transfer.once_transfer_key_used')}

-

{t('commons:g2g_data_transfer.transfer_to_growi_cloud')}

+ {/* eslint-disable-next-line react/no-danger */} +

); diff --git a/apps/app/src/client/components/DataTransferForm.tsx b/apps/app/src/client/components/DataTransferForm.tsx index a5f7c18ed26..8d2362499d8 100644 --- a/apps/app/src/client/components/DataTransferForm.tsx +++ b/apps/app/src/client/components/DataTransferForm.tsx @@ -3,12 +3,18 @@ import React from 'react'; import { useTranslation } from 'next-i18next'; import { useGenerateTransferKey } from '~/client/services/g2g-transfer'; +import { useGrowiCloudUri, useGrowiAppIdForGrowiCloud } from '~/stores-universal/context'; import CustomCopyToClipBoard from './Common/CustomCopyToClipBoard'; const DataTransferForm = (): JSX.Element => { const { t } = useTranslation('commons'); const { transferKey, generateTransferKey } = useGenerateTransferKey(); + const { data: growiCloudUri } = useGrowiCloudUri(); + const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); + const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null + ? 'https://growi.cloud/help/ja/admin-guide/management-cookbook/g2g-transfer.html' + : 'https://docs.growi.org/ja/admin-guide/management-cookbook/g2g-transfer.html'; return (
@@ -33,7 +39,8 @@ const DataTransferForm = (): JSX.Element => {

{t('g2g_data_transfer.transfer_key_limit')}

{t('g2g_data_transfer.once_transfer_key_used')}

-

{t('g2g_data_transfer.transfer_to_growi_cloud')}

+ {/* eslint-disable-next-line react/no-danger */} +

); From 6a66a81851cdc4c5ba25b30fdb3b68745483f45f Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 11 Sep 2024 09:21:54 +0000 Subject: [PATCH 24/34] Add playwright test for data-transfer --- apps/app/playwright/40-admin/access-to-admin-page.spec.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/app/playwright/40-admin/access-to-admin-page.spec.ts b/apps/app/playwright/40-admin/access-to-admin-page.spec.ts index b7a05ce2ebb..854fd70d405 100644 --- a/apps/app/playwright/40-admin/access-to-admin-page.spec.ts +++ b/apps/app/playwright/40-admin/access-to-admin-page.spec.ts @@ -50,6 +50,12 @@ test('admin/export is successfully loaded', async({ page }) => { await expect(page.getByTestId('admin-export-archive-data')).toBeVisible(); }); +test('admin/data-transfer is successfully loaded', async({ page }) => { + await page.goto('/admin/data-transfer'); + + await expect(page.getByTestId('admin-export-archive-data')).toBeVisible(); +}); + test('admin/notification is successfully loaded', async({ page }) => { await page.goto('/admin/notification'); From 5670c27001548480341642356357ecde10139c09 Mon Sep 17 00:00:00 2001 From: shironegi39 Date: Wed, 11 Sep 2024 11:56:26 +0000 Subject: [PATCH 25/34] Change Variables --- apps/app/src/client/components/Admin/G2GDataTransfer.tsx | 4 +--- apps/app/src/client/components/DataTransferForm.tsx | 5 +---- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx index 1722ffaa594..8c06906782f 100644 --- a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx +++ b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx @@ -126,9 +126,7 @@ const G2GDataTransfer = (): JSX.Element => { } }, [setTransferring, startTransferKey, selectedCollections, optionsMap]); - const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null - ? 'https://growi.cloud/help/ja/admin-guide/management-cookbook/g2g-transfer.html' - : 'https://docs.growi.org/ja/admin-guide/management-cookbook/g2g-transfer.html'; + const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud' : 'docs.growi.org'; // File upload // const onChangeFileUploadTypeHandler = useCallback((e: ChangeEvent, type: string) => { diff --git a/apps/app/src/client/components/DataTransferForm.tsx b/apps/app/src/client/components/DataTransferForm.tsx index 8d2362499d8..8bbb96cb64a 100644 --- a/apps/app/src/client/components/DataTransferForm.tsx +++ b/apps/app/src/client/components/DataTransferForm.tsx @@ -12,10 +12,7 @@ const DataTransferForm = (): JSX.Element => { const { transferKey, generateTransferKey } = useGenerateTransferKey(); const { data: growiCloudUri } = useGrowiCloudUri(); const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); - const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null - ? 'https://growi.cloud/help/ja/admin-guide/management-cookbook/g2g-transfer.html' - : 'https://docs.growi.org/ja/admin-guide/management-cookbook/g2g-transfer.html'; - + const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud' : 'docs.growi.org'; return (

From e30356cded6d5ba369f60aa4568519594abb4977 Mon Sep 17 00:00:00 2001 From: shironegi39 Date: Wed, 11 Sep 2024 12:06:41 +0000 Subject: [PATCH 26/34] EN language support --- apps/app/public/static/locales/en_US/commons.json | 2 +- apps/app/src/client/components/Admin/G2GDataTransfer.tsx | 2 +- apps/app/src/client/components/DataTransferForm.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/app/public/static/locales/en_US/commons.json b/apps/app/public/static/locales/en_US/commons.json index eb6c0c50080..61b5f07335c 100644 --- a/apps/app/public/static/locales/en_US/commons.json +++ b/apps/app/public/static/locales/en_US/commons.json @@ -157,6 +157,6 @@ "publish_transfer_key": "Publish transfer key", "transfer_key_limit": "Transfer keys are valid for 1 hour after issuance.", "once_transfer_key_used": "Once the transfer key is used for transfer, it cannot be used for any other transfer.", - "transfer_to_growi_cloud": "If you wish to transfer to GROWI.cloud, please click here." + "transfer_to_growi_cloud": "For more details, please click here." } } diff --git a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx index 8c06906782f..8599300d5d9 100644 --- a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx +++ b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx @@ -126,7 +126,7 @@ const G2GDataTransfer = (): JSX.Element => { } }, [setTransferring, startTransferKey, selectedCollections, optionsMap]); - const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud' : 'docs.growi.org'; + const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud/help' : 'docs.growi.org'; // File upload // const onChangeFileUploadTypeHandler = useCallback((e: ChangeEvent, type: string) => { diff --git a/apps/app/src/client/components/DataTransferForm.tsx b/apps/app/src/client/components/DataTransferForm.tsx index 8bbb96cb64a..6fba545604c 100644 --- a/apps/app/src/client/components/DataTransferForm.tsx +++ b/apps/app/src/client/components/DataTransferForm.tsx @@ -12,7 +12,7 @@ const DataTransferForm = (): JSX.Element => { const { transferKey, generateTransferKey } = useGenerateTransferKey(); const { data: growiCloudUri } = useGrowiCloudUri(); const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); - const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud' : 'docs.growi.org'; + const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud/help' : 'docs.growi.org'; return (

From 7292c562b281ca25dae29afc87b84bf0b55d9f15 Mon Sep 17 00:00:00 2001 From: shironegi39 Date: Thu, 12 Sep 2024 05:34:09 +0000 Subject: [PATCH 27/34] Languages Support --- apps/app/public/static/locales/fr_FR/commons.json | 2 +- apps/app/public/static/locales/ja_JP/commons.json | 2 +- apps/app/public/static/locales/zh_CN/commons.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/app/public/static/locales/fr_FR/commons.json b/apps/app/public/static/locales/fr_FR/commons.json index 3771c037ee5..365feb89978 100644 --- a/apps/app/public/static/locales/fr_FR/commons.json +++ b/apps/app/public/static/locales/fr_FR/commons.json @@ -157,6 +157,6 @@ "publish_transfer_key": "Publier la clé de transfert", "transfer_key_limit": "Les clés de transfert sont valides durant une heure.", "once_transfer_key_used": "Les clés de transfert sont à usage unique.", - "transfer_to_growi_cloud": "Si vous souhaitez transférer depuis GROWI.cloud, cliquez ici." + "transfer_to_growi_cloud": "Pour plus de détails, veuillez cliquer ici." } } diff --git a/apps/app/public/static/locales/ja_JP/commons.json b/apps/app/public/static/locales/ja_JP/commons.json index 1ef59c46ddc..2c2a25c7521 100644 --- a/apps/app/public/static/locales/ja_JP/commons.json +++ b/apps/app/public/static/locales/ja_JP/commons.json @@ -159,6 +159,6 @@ "publish_transfer_key": "移行キーを発行する", "transfer_key_limit": "※ 移行キーの有効期限は発行から1時間となります。", "once_transfer_key_used": "※ 移行キーは一度移行に利用するとそれ以降はご利用いただけなくなります。", - "transfer_to_growi_cloud": "※ 詳しくは こちら" + "transfer_to_growi_cloud": "※ 詳しくは こちら" } } diff --git a/apps/app/public/static/locales/zh_CN/commons.json b/apps/app/public/static/locales/zh_CN/commons.json index 9108400f2d3..9711cf12c74 100644 --- a/apps/app/public/static/locales/zh_CN/commons.json +++ b/apps/app/public/static/locales/zh_CN/commons.json @@ -160,6 +160,6 @@ "publish_transfer_key": "发布迁移密钥", "transfer_key_limit": "迁移密钥在签发后一小时内有效。", "once_transfer_key_used": "一旦迁移密钥被用于迁移,它将不再可用于进一步的迁移。", - "transfer_to_growi_cloud": "如果您希望迁移到GROWI.cloud,请点击这里。" + "transfer_to_growi_cloud": "有关更多详情,请点击此处。" } } From f02b84c46f64c6529ca1fbf76fcd05cd2e1de3f3 Mon Sep 17 00:00:00 2001 From: shironegi39 Date: Thu, 12 Sep 2024 06:46:49 +0000 Subject: [PATCH 28/34] Variable Change --- apps/app/public/static/locales/en_US/commons.json | 2 +- apps/app/public/static/locales/fr_FR/commons.json | 2 +- apps/app/public/static/locales/ja_JP/commons.json | 2 +- apps/app/public/static/locales/zh_CN/commons.json | 2 +- apps/app/src/client/components/Admin/G2GDataTransfer.tsx | 4 ++-- apps/app/src/client/components/DataTransferForm.tsx | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/app/public/static/locales/en_US/commons.json b/apps/app/public/static/locales/en_US/commons.json index 61b5f07335c..4aad37987e1 100644 --- a/apps/app/public/static/locales/en_US/commons.json +++ b/apps/app/public/static/locales/en_US/commons.json @@ -157,6 +157,6 @@ "publish_transfer_key": "Publish transfer key", "transfer_key_limit": "Transfer keys are valid for 1 hour after issuance.", "once_transfer_key_used": "Once the transfer key is used for transfer, it cannot be used for any other transfer.", - "transfer_to_growi_cloud": "For more details, please click here." + "transfer_to_growi_cloud": "For more details, please click here." } } diff --git a/apps/app/public/static/locales/fr_FR/commons.json b/apps/app/public/static/locales/fr_FR/commons.json index 365feb89978..7328b4e9725 100644 --- a/apps/app/public/static/locales/fr_FR/commons.json +++ b/apps/app/public/static/locales/fr_FR/commons.json @@ -157,6 +157,6 @@ "publish_transfer_key": "Publier la clé de transfert", "transfer_key_limit": "Les clés de transfert sont valides durant une heure.", "once_transfer_key_used": "Les clés de transfert sont à usage unique.", - "transfer_to_growi_cloud": "Pour plus de détails, veuillez cliquer ici." + "transfer_to_growi_cloud": "Pour plus de détails, veuillez cliquer ici." } } diff --git a/apps/app/public/static/locales/ja_JP/commons.json b/apps/app/public/static/locales/ja_JP/commons.json index 2c2a25c7521..6077adc75bc 100644 --- a/apps/app/public/static/locales/ja_JP/commons.json +++ b/apps/app/public/static/locales/ja_JP/commons.json @@ -159,6 +159,6 @@ "publish_transfer_key": "移行キーを発行する", "transfer_key_limit": "※ 移行キーの有効期限は発行から1時間となります。", "once_transfer_key_used": "※ 移行キーは一度移行に利用するとそれ以降はご利用いただけなくなります。", - "transfer_to_growi_cloud": "※ 詳しくは こちら" + "transfer_to_growi_cloud": "※ 詳しくは こちら" } } diff --git a/apps/app/public/static/locales/zh_CN/commons.json b/apps/app/public/static/locales/zh_CN/commons.json index 9711cf12c74..5fb67e84a61 100644 --- a/apps/app/public/static/locales/zh_CN/commons.json +++ b/apps/app/public/static/locales/zh_CN/commons.json @@ -160,6 +160,6 @@ "publish_transfer_key": "发布迁移密钥", "transfer_key_limit": "迁移密钥在签发后一小时内有效。", "once_transfer_key_used": "一旦迁移密钥被用于迁移,它将不再可用于进一步的迁移。", - "transfer_to_growi_cloud": "有关更多详情,请点击此处。" + "transfer_to_growi_cloud": "有关更多详情,请点击此处。" } } diff --git a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx index 8599300d5d9..59f6c0a6d23 100644 --- a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx +++ b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx @@ -126,7 +126,7 @@ const G2GDataTransfer = (): JSX.Element => { } }, [setTransferring, startTransferKey, selectedCollections, optionsMap]); - const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud/help' : 'docs.growi.org'; + const growiHelpUrl = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud/help' : 'docs.growi.org'; // File upload // const onChangeFileUploadTypeHandler = useCallback((e: ChangeEvent, type: string) => { @@ -281,7 +281,7 @@ const G2GDataTransfer = (): JSX.Element => {

{t('commons:g2g_data_transfer.transfer_key_limit')}

{t('commons:g2g_data_transfer.once_transfer_key_used')}

{/* eslint-disable-next-line react/no-danger */} -

+

); diff --git a/apps/app/src/client/components/DataTransferForm.tsx b/apps/app/src/client/components/DataTransferForm.tsx index 6fba545604c..5aa84e8a831 100644 --- a/apps/app/src/client/components/DataTransferForm.tsx +++ b/apps/app/src/client/components/DataTransferForm.tsx @@ -12,7 +12,7 @@ const DataTransferForm = (): JSX.Element => { const { transferKey, generateTransferKey } = useGenerateTransferKey(); const { data: growiCloudUri } = useGrowiCloudUri(); const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); - const growiDataTransferHelpPage = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud/help' : 'docs.growi.org'; + const growiHelpUrl = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud/help' : 'docs.growi.org'; return (

@@ -37,7 +37,7 @@ const DataTransferForm = (): JSX.Element => {

{t('g2g_data_transfer.transfer_key_limit')}

{t('g2g_data_transfer.once_transfer_key_used')}

{/* eslint-disable-next-line react/no-danger */} -

+

); From 37c6ae602afd8d276ce93e1d6ba376d6747e7c5a Mon Sep 17 00:00:00 2001 From: shironegi39 Date: Thu, 12 Sep 2024 08:07:26 +0000 Subject: [PATCH 29/34] Change method to SWRHook --- .../client/components/Admin/G2GDataTransfer.tsx | 6 ++---- .../src/client/components/DataTransferForm.tsx | 7 +++---- apps/app/src/stores-universal/context.tsx | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx index 59f6c0a6d23..bc81750c711 100644 --- a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx +++ b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx @@ -8,7 +8,7 @@ import { useGenerateTransferKey } from '~/client/services/g2g-transfer'; import { apiv3Get, apiv3Post } from '~/client/util/apiv3-client'; import { toastError, toastSuccess } from '~/client/util/toastr'; import { G2G_PROGRESS_STATUS, type G2GProgress } from '~/interfaces/g2g-transfer'; -import { useGrowiCloudUri, useGrowiAppIdForGrowiCloud } from '~/stores-universal/context'; +import { useIsGrowiHelpUrl } from '~/stores-universal/context'; import { useAdminSocket } from '~/stores/socket-io'; import CustomCopyToClipBoard from '../Common/CustomCopyToClipBoard'; @@ -35,8 +35,6 @@ const G2GDataTransfer = (): JSX.Element => { mongo: G2G_PROGRESS_STATUS.PENDING, attachments: G2G_PROGRESS_STATUS.PENDING, }); - const { data: growiCloudUri } = useGrowiCloudUri(); - const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); // File upload settings // const [fileUploadType, setFileUploadType] = useState('aws'); @@ -126,7 +124,7 @@ const G2GDataTransfer = (): JSX.Element => { } }, [setTransferring, startTransferKey, selectedCollections, optionsMap]); - const growiHelpUrl = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud/help' : 'docs.growi.org'; + const { data: growiHelpUrl } = useIsGrowiHelpUrl(); // File upload // const onChangeFileUploadTypeHandler = useCallback((e: ChangeEvent, type: string) => { diff --git a/apps/app/src/client/components/DataTransferForm.tsx b/apps/app/src/client/components/DataTransferForm.tsx index 5aa84e8a831..ea2f72f5e40 100644 --- a/apps/app/src/client/components/DataTransferForm.tsx +++ b/apps/app/src/client/components/DataTransferForm.tsx @@ -3,16 +3,15 @@ import React from 'react'; import { useTranslation } from 'next-i18next'; import { useGenerateTransferKey } from '~/client/services/g2g-transfer'; -import { useGrowiCloudUri, useGrowiAppIdForGrowiCloud } from '~/stores-universal/context'; +import { useIsGrowiHelpUrl } from '~/stores-universal/context'; import CustomCopyToClipBoard from './Common/CustomCopyToClipBoard'; const DataTransferForm = (): JSX.Element => { const { t } = useTranslation('commons'); const { transferKey, generateTransferKey } = useGenerateTransferKey(); - const { data: growiCloudUri } = useGrowiCloudUri(); - const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); - const growiHelpUrl = growiCloudUri != null && growiAppIdForGrowiCloud != null ? 'growi.cloud/help' : 'docs.growi.org'; + const { data: growiHelpUrl } = useIsGrowiHelpUrl(); + return (

diff --git a/apps/app/src/stores-universal/context.tsx b/apps/app/src/stores-universal/context.tsx index c020cb75720..d1064013895 100644 --- a/apps/app/src/stores-universal/context.tsx +++ b/apps/app/src/stores-universal/context.tsx @@ -285,3 +285,18 @@ export const useAcceptedUploadFileType = (): SWRResponse => { + const { data: growiCloudUri } = useGrowiCloudUri(); + const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); + + return useSWRImmutable( + [growiCloudUri, growiAppIdForGrowiCloud], + ([growiCloudUri, growiAppIdForGrowiCloud]) => { + if (growiCloudUri != null && growiAppIdForGrowiCloud != null) { + return 'growi.cloud/help'; + } + return 'docs.growi.org'; + }, + ); +}; From 41ff64ea4e352f86c169e5aef5840969e8c038f8 Mon Sep 17 00:00:00 2001 From: shironegi39 Date: Thu, 12 Sep 2024 08:18:35 +0000 Subject: [PATCH 30/34] Change custom hook name --- apps/app/src/client/components/Admin/G2GDataTransfer.tsx | 4 ++-- apps/app/src/client/components/DataTransferForm.tsx | 4 ++-- apps/app/src/stores-universal/context.tsx | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx index bc81750c711..82ffaf7c25a 100644 --- a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx +++ b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx @@ -8,7 +8,7 @@ import { useGenerateTransferKey } from '~/client/services/g2g-transfer'; import { apiv3Get, apiv3Post } from '~/client/util/apiv3-client'; import { toastError, toastSuccess } from '~/client/util/toastr'; import { G2G_PROGRESS_STATUS, type G2GProgress } from '~/interfaces/g2g-transfer'; -import { useIsGrowiHelpUrl } from '~/stores-universal/context'; +import { useGrowiHelpUrl } from '~/stores-universal/context'; import { useAdminSocket } from '~/stores/socket-io'; import CustomCopyToClipBoard from '../Common/CustomCopyToClipBoard'; @@ -124,7 +124,7 @@ const G2GDataTransfer = (): JSX.Element => { } }, [setTransferring, startTransferKey, selectedCollections, optionsMap]); - const { data: growiHelpUrl } = useIsGrowiHelpUrl(); + const { data: growiHelpUrl } = useGrowiHelpUrl(); // File upload // const onChangeFileUploadTypeHandler = useCallback((e: ChangeEvent, type: string) => { diff --git a/apps/app/src/client/components/DataTransferForm.tsx b/apps/app/src/client/components/DataTransferForm.tsx index ea2f72f5e40..74d598ada35 100644 --- a/apps/app/src/client/components/DataTransferForm.tsx +++ b/apps/app/src/client/components/DataTransferForm.tsx @@ -3,14 +3,14 @@ import React from 'react'; import { useTranslation } from 'next-i18next'; import { useGenerateTransferKey } from '~/client/services/g2g-transfer'; -import { useIsGrowiHelpUrl } from '~/stores-universal/context'; +import { useGrowiHelpUrl } from '~/stores-universal/context'; import CustomCopyToClipBoard from './Common/CustomCopyToClipBoard'; const DataTransferForm = (): JSX.Element => { const { t } = useTranslation('commons'); const { transferKey, generateTransferKey } = useGenerateTransferKey(); - const { data: growiHelpUrl } = useIsGrowiHelpUrl(); + const { data: growiHelpUrl } = useGrowiHelpUrl(); return (

diff --git a/apps/app/src/stores-universal/context.tsx b/apps/app/src/stores-universal/context.tsx index d1064013895..78c5a30b099 100644 --- a/apps/app/src/stores-universal/context.tsx +++ b/apps/app/src/stores-universal/context.tsx @@ -286,7 +286,7 @@ export const useAcceptedUploadFileType = (): SWRResponse => { +export const useGrowiHelpUrl = (): SWRResponse<'growi.cloud/help' | 'docs.growi.org', Error> => { const { data: growiCloudUri } = useGrowiCloudUri(); const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); From 7795fd538c7fc2cbaffab8d44e02842ff5a68a4a Mon Sep 17 00:00:00 2001 From: shironegi39 Date: Thu, 12 Sep 2024 08:29:29 +0000 Subject: [PATCH 31/34] Variable Change --- apps/app/public/static/locales/en_US/commons.json | 2 +- apps/app/public/static/locales/fr_FR/commons.json | 2 +- apps/app/public/static/locales/ja_JP/commons.json | 2 +- apps/app/public/static/locales/zh_CN/commons.json | 2 +- apps/app/src/client/components/Admin/G2GDataTransfer.tsx | 4 ++-- apps/app/src/client/components/DataTransferForm.tsx | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/app/public/static/locales/en_US/commons.json b/apps/app/public/static/locales/en_US/commons.json index 4aad37987e1..3e9e92d8e9c 100644 --- a/apps/app/public/static/locales/en_US/commons.json +++ b/apps/app/public/static/locales/en_US/commons.json @@ -157,6 +157,6 @@ "publish_transfer_key": "Publish transfer key", "transfer_key_limit": "Transfer keys are valid for 1 hour after issuance.", "once_transfer_key_used": "Once the transfer key is used for transfer, it cannot be used for any other transfer.", - "transfer_to_growi_cloud": "For more details, please click here." + "transfer_to_growi_cloud": "For more details, please click here." } } diff --git a/apps/app/public/static/locales/fr_FR/commons.json b/apps/app/public/static/locales/fr_FR/commons.json index 7328b4e9725..205f1532148 100644 --- a/apps/app/public/static/locales/fr_FR/commons.json +++ b/apps/app/public/static/locales/fr_FR/commons.json @@ -157,6 +157,6 @@ "publish_transfer_key": "Publier la clé de transfert", "transfer_key_limit": "Les clés de transfert sont valides durant une heure.", "once_transfer_key_used": "Les clés de transfert sont à usage unique.", - "transfer_to_growi_cloud": "Pour plus de détails, veuillez cliquer ici." + "transfer_to_growi_cloud": "Pour plus de détails, veuillez cliquer ici." } } diff --git a/apps/app/public/static/locales/ja_JP/commons.json b/apps/app/public/static/locales/ja_JP/commons.json index 6077adc75bc..cd201e5ec03 100644 --- a/apps/app/public/static/locales/ja_JP/commons.json +++ b/apps/app/public/static/locales/ja_JP/commons.json @@ -159,6 +159,6 @@ "publish_transfer_key": "移行キーを発行する", "transfer_key_limit": "※ 移行キーの有効期限は発行から1時間となります。", "once_transfer_key_used": "※ 移行キーは一度移行に利用するとそれ以降はご利用いただけなくなります。", - "transfer_to_growi_cloud": "※ 詳しくは こちら" + "transfer_to_growi_cloud": "※ 詳しくは こちら" } } diff --git a/apps/app/public/static/locales/zh_CN/commons.json b/apps/app/public/static/locales/zh_CN/commons.json index 5fb67e84a61..677f7c63bca 100644 --- a/apps/app/public/static/locales/zh_CN/commons.json +++ b/apps/app/public/static/locales/zh_CN/commons.json @@ -160,6 +160,6 @@ "publish_transfer_key": "发布迁移密钥", "transfer_key_limit": "迁移密钥在签发后一小时内有效。", "once_transfer_key_used": "一旦迁移密钥被用于迁移,它将不再可用于进一步的迁移。", - "transfer_to_growi_cloud": "有关更多详情,请点击此处。" + "transfer_to_growi_cloud": "有关更多详情,请点击此处。" } } diff --git a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx index 82ffaf7c25a..48ab8d88c5e 100644 --- a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx +++ b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx @@ -124,7 +124,7 @@ const G2GDataTransfer = (): JSX.Element => { } }, [setTransferring, startTransferKey, selectedCollections, optionsMap]); - const { data: growiHelpUrl } = useGrowiHelpUrl(); + const { data: growiHelpDomain } = useGrowiHelpUrl(); // File upload // const onChangeFileUploadTypeHandler = useCallback((e: ChangeEvent, type: string) => { @@ -279,7 +279,7 @@ const G2GDataTransfer = (): JSX.Element => {

{t('commons:g2g_data_transfer.transfer_key_limit')}

{t('commons:g2g_data_transfer.once_transfer_key_used')}

{/* eslint-disable-next-line react/no-danger */} -

+

); diff --git a/apps/app/src/client/components/DataTransferForm.tsx b/apps/app/src/client/components/DataTransferForm.tsx index 74d598ada35..f5c576a21b7 100644 --- a/apps/app/src/client/components/DataTransferForm.tsx +++ b/apps/app/src/client/components/DataTransferForm.tsx @@ -10,7 +10,7 @@ import CustomCopyToClipBoard from './Common/CustomCopyToClipBoard'; const DataTransferForm = (): JSX.Element => { const { t } = useTranslation('commons'); const { transferKey, generateTransferKey } = useGenerateTransferKey(); - const { data: growiHelpUrl } = useGrowiHelpUrl(); + const { data: growiHelpDomain } = useGrowiHelpUrl(); return (
@@ -36,7 +36,7 @@ const DataTransferForm = (): JSX.Element => {

{t('g2g_data_transfer.transfer_key_limit')}

{t('g2g_data_transfer.once_transfer_key_used')}

{/* eslint-disable-next-line react/no-danger */} -

+

); From ada4bba4120f4694adb13e37c0781d9187a9a630 Mon Sep 17 00:00:00 2001 From: shironegi39 Date: Thu, 12 Sep 2024 08:31:03 +0000 Subject: [PATCH 32/34] Change custom hook name --- apps/app/src/client/components/Admin/G2GDataTransfer.tsx | 4 ++-- apps/app/src/client/components/DataTransferForm.tsx | 4 ++-- apps/app/src/stores-universal/context.tsx | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx index 48ab8d88c5e..515d1b6d0bc 100644 --- a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx +++ b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx @@ -8,7 +8,7 @@ import { useGenerateTransferKey } from '~/client/services/g2g-transfer'; import { apiv3Get, apiv3Post } from '~/client/util/apiv3-client'; import { toastError, toastSuccess } from '~/client/util/toastr'; import { G2G_PROGRESS_STATUS, type G2GProgress } from '~/interfaces/g2g-transfer'; -import { useGrowiHelpUrl } from '~/stores-universal/context'; +import { useGrowiHelpDomain } from '~/stores-universal/context'; import { useAdminSocket } from '~/stores/socket-io'; import CustomCopyToClipBoard from '../Common/CustomCopyToClipBoard'; @@ -124,7 +124,7 @@ const G2GDataTransfer = (): JSX.Element => { } }, [setTransferring, startTransferKey, selectedCollections, optionsMap]); - const { data: growiHelpDomain } = useGrowiHelpUrl(); + const { data: growiHelpDomain } = useGrowiHelpDomain(); // File upload // const onChangeFileUploadTypeHandler = useCallback((e: ChangeEvent, type: string) => { diff --git a/apps/app/src/client/components/DataTransferForm.tsx b/apps/app/src/client/components/DataTransferForm.tsx index f5c576a21b7..e52a0609f98 100644 --- a/apps/app/src/client/components/DataTransferForm.tsx +++ b/apps/app/src/client/components/DataTransferForm.tsx @@ -3,14 +3,14 @@ import React from 'react'; import { useTranslation } from 'next-i18next'; import { useGenerateTransferKey } from '~/client/services/g2g-transfer'; -import { useGrowiHelpUrl } from '~/stores-universal/context'; +import { useGrowiHelpDomain } from '~/stores-universal/context'; import CustomCopyToClipBoard from './Common/CustomCopyToClipBoard'; const DataTransferForm = (): JSX.Element => { const { t } = useTranslation('commons'); const { transferKey, generateTransferKey } = useGenerateTransferKey(); - const { data: growiHelpDomain } = useGrowiHelpUrl(); + const { data: growiHelpDomain } = useGrowiHelpDomain(); return (
diff --git a/apps/app/src/stores-universal/context.tsx b/apps/app/src/stores-universal/context.tsx index 78c5a30b099..c0c3046bede 100644 --- a/apps/app/src/stores-universal/context.tsx +++ b/apps/app/src/stores-universal/context.tsx @@ -286,7 +286,7 @@ export const useAcceptedUploadFileType = (): SWRResponse => { +export const useGrowiHelpDomain = (): SWRResponse<'growi.cloud/help' | 'docs.growi.org', Error> => { const { data: growiCloudUri } = useGrowiCloudUri(); const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); From 48ce1f6fa625c3caab45fc12cb6f90b06c4c48ab Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Thu, 12 Sep 2024 09:24:08 +0000 Subject: [PATCH 33/34] rm unnecessary populate --- apps/app/src/server/routes/apiv3/page/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/app/src/server/routes/apiv3/page/index.ts b/apps/app/src/server/routes/apiv3/page/index.ts index 90668306e4e..c0f4b363e2a 100644 --- a/apps/app/src/server/routes/apiv3/page/index.ts +++ b/apps/app/src/server/routes/apiv3/page/index.ts @@ -300,7 +300,7 @@ module.exports = (crowi) => { let pages; try { if (isSharedPage) { - const shareLink = await ShareLink.findOne({ _id: shareLinkId }).populate('relatedPage'); + const shareLink = await ShareLink.findOne({ _id: shareLinkId }); if (shareLink == null) { throw new Error('ShareLink is not found'); } From 5511beb789e5152090f5563bcacee3366acea281 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Thu, 12 Sep 2024 10:16:49 +0000 Subject: [PATCH 34/34] Revert "Merge pull request #9098 from weseek/imprv/144244-153642-corrected-wording-on-management-screeen" This reverts commit 26b62047636ec4041005b8445fb4fd3a514db21d, reversing changes made to 42a65bde4cd76dfbbb7aba97df180dcff1241c01. --- apps/app/public/static/locales/en_US/commons.json | 2 +- apps/app/public/static/locales/fr_FR/commons.json | 2 +- apps/app/public/static/locales/ja_JP/commons.json | 2 +- apps/app/public/static/locales/zh_CN/commons.json | 2 +- .../client/components/Admin/G2GDataTransfer.tsx | 6 +----- .../src/client/components/DataTransferForm.tsx | 5 +---- apps/app/src/stores-universal/context.tsx | 15 --------------- 7 files changed, 6 insertions(+), 28 deletions(-) diff --git a/apps/app/public/static/locales/en_US/commons.json b/apps/app/public/static/locales/en_US/commons.json index 3e9e92d8e9c..eb6c0c50080 100644 --- a/apps/app/public/static/locales/en_US/commons.json +++ b/apps/app/public/static/locales/en_US/commons.json @@ -157,6 +157,6 @@ "publish_transfer_key": "Publish transfer key", "transfer_key_limit": "Transfer keys are valid for 1 hour after issuance.", "once_transfer_key_used": "Once the transfer key is used for transfer, it cannot be used for any other transfer.", - "transfer_to_growi_cloud": "For more details, please click here." + "transfer_to_growi_cloud": "If you wish to transfer to GROWI.cloud, please click here." } } diff --git a/apps/app/public/static/locales/fr_FR/commons.json b/apps/app/public/static/locales/fr_FR/commons.json index 205f1532148..3771c037ee5 100644 --- a/apps/app/public/static/locales/fr_FR/commons.json +++ b/apps/app/public/static/locales/fr_FR/commons.json @@ -157,6 +157,6 @@ "publish_transfer_key": "Publier la clé de transfert", "transfer_key_limit": "Les clés de transfert sont valides durant une heure.", "once_transfer_key_used": "Les clés de transfert sont à usage unique.", - "transfer_to_growi_cloud": "Pour plus de détails, veuillez cliquer ici." + "transfer_to_growi_cloud": "Si vous souhaitez transférer depuis GROWI.cloud, cliquez ici." } } diff --git a/apps/app/public/static/locales/ja_JP/commons.json b/apps/app/public/static/locales/ja_JP/commons.json index cd201e5ec03..f85a86db4f9 100644 --- a/apps/app/public/static/locales/ja_JP/commons.json +++ b/apps/app/public/static/locales/ja_JP/commons.json @@ -159,6 +159,6 @@ "publish_transfer_key": "移行キーを発行する", "transfer_key_limit": "※ 移行キーの有効期限は発行から1時間となります。", "once_transfer_key_used": "※ 移行キーは一度移行に利用するとそれ以降はご利用いただけなくなります。", - "transfer_to_growi_cloud": "※ 詳しくは こちら" + "transfer_to_growi_cloud": "※ GROWI.cloud への移行を実施する場合はこちらをご確認ください。" } } diff --git a/apps/app/public/static/locales/zh_CN/commons.json b/apps/app/public/static/locales/zh_CN/commons.json index 677f7c63bca..9108400f2d3 100644 --- a/apps/app/public/static/locales/zh_CN/commons.json +++ b/apps/app/public/static/locales/zh_CN/commons.json @@ -160,6 +160,6 @@ "publish_transfer_key": "发布迁移密钥", "transfer_key_limit": "迁移密钥在签发后一小时内有效。", "once_transfer_key_used": "一旦迁移密钥被用于迁移,它将不再可用于进一步的迁移。", - "transfer_to_growi_cloud": "有关更多详情,请点击此处。" + "transfer_to_growi_cloud": "如果您希望迁移到GROWI.cloud,请点击这里。" } } diff --git a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx index 515d1b6d0bc..a61650af4a8 100644 --- a/apps/app/src/client/components/Admin/G2GDataTransfer.tsx +++ b/apps/app/src/client/components/Admin/G2GDataTransfer.tsx @@ -8,7 +8,6 @@ import { useGenerateTransferKey } from '~/client/services/g2g-transfer'; import { apiv3Get, apiv3Post } from '~/client/util/apiv3-client'; import { toastError, toastSuccess } from '~/client/util/toastr'; import { G2G_PROGRESS_STATUS, type G2GProgress } from '~/interfaces/g2g-transfer'; -import { useGrowiHelpDomain } from '~/stores-universal/context'; import { useAdminSocket } from '~/stores/socket-io'; import CustomCopyToClipBoard from '../Common/CustomCopyToClipBoard'; @@ -124,8 +123,6 @@ const G2GDataTransfer = (): JSX.Element => { } }, [setTransferring, startTransferKey, selectedCollections, optionsMap]); - const { data: growiHelpDomain } = useGrowiHelpDomain(); - // File upload // const onChangeFileUploadTypeHandler = useCallback((e: ChangeEvent, type: string) => { // setFileUploadType(type); @@ -278,8 +275,7 @@ const G2GDataTransfer = (): JSX.Element => {

{t('commons:g2g_data_transfer.transfer_key_limit')}

{t('commons:g2g_data_transfer.once_transfer_key_used')}

- {/* eslint-disable-next-line react/no-danger */} -

+

{t('commons:g2g_data_transfer.transfer_to_growi_cloud')}

); diff --git a/apps/app/src/client/components/DataTransferForm.tsx b/apps/app/src/client/components/DataTransferForm.tsx index e52a0609f98..a5f7c18ed26 100644 --- a/apps/app/src/client/components/DataTransferForm.tsx +++ b/apps/app/src/client/components/DataTransferForm.tsx @@ -3,14 +3,12 @@ import React from 'react'; import { useTranslation } from 'next-i18next'; import { useGenerateTransferKey } from '~/client/services/g2g-transfer'; -import { useGrowiHelpDomain } from '~/stores-universal/context'; import CustomCopyToClipBoard from './Common/CustomCopyToClipBoard'; const DataTransferForm = (): JSX.Element => { const { t } = useTranslation('commons'); const { transferKey, generateTransferKey } = useGenerateTransferKey(); - const { data: growiHelpDomain } = useGrowiHelpDomain(); return (
@@ -35,8 +33,7 @@ const DataTransferForm = (): JSX.Element => {

{t('g2g_data_transfer.transfer_key_limit')}

{t('g2g_data_transfer.once_transfer_key_used')}

- {/* eslint-disable-next-line react/no-danger */} -

+

{t('g2g_data_transfer.transfer_to_growi_cloud')}

); diff --git a/apps/app/src/stores-universal/context.tsx b/apps/app/src/stores-universal/context.tsx index c0c3046bede..c020cb75720 100644 --- a/apps/app/src/stores-universal/context.tsx +++ b/apps/app/src/stores-universal/context.tsx @@ -285,18 +285,3 @@ export const useAcceptedUploadFileType = (): SWRResponse => { - const { data: growiCloudUri } = useGrowiCloudUri(); - const { data: growiAppIdForGrowiCloud } = useGrowiAppIdForGrowiCloud(); - - return useSWRImmutable( - [growiCloudUri, growiAppIdForGrowiCloud], - ([growiCloudUri, growiAppIdForGrowiCloud]) => { - if (growiCloudUri != null && growiAppIdForGrowiCloud != null) { - return 'growi.cloud/help'; - } - return 'docs.growi.org'; - }, - ); -};