|
@@ -2,7 +2,6 @@ import React, {
|
|
|
useState, useEffect, useCallback, useMemo,
|
|
useState, useEffect, useCallback, useMemo,
|
|
|
} from 'react';
|
|
} from 'react';
|
|
|
|
|
|
|
|
-
|
|
|
|
|
import { pagePathUtils } from '@growi/core';
|
|
import { pagePathUtils } from '@growi/core';
|
|
|
import { useTranslation } from 'react-i18next';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
import {
|
|
import {
|
|
@@ -51,6 +50,7 @@ const PageRenameModal = (): JSX.Element => {
|
|
|
|
|
|
|
|
const [subordinatedPages, setSubordinatedPages] = useState([]);
|
|
const [subordinatedPages, setSubordinatedPages] = useState([]);
|
|
|
const [existingPaths, setExistingPaths] = useState<string[]>([]);
|
|
const [existingPaths, setExistingPaths] = useState<string[]>([]);
|
|
|
|
|
+ const [canRename, setCanRename] = useState(false);
|
|
|
const [isRenameRecursively, setIsRenameRecursively] = useState(true);
|
|
const [isRenameRecursively, setIsRenameRecursively] = useState(true);
|
|
|
const [isRenameRedirect, setIsRenameRedirect] = useState(false);
|
|
const [isRenameRedirect, setIsRenameRedirect] = useState(false);
|
|
|
const [isRemainMetadata, setIsRemainMetadata] = useState(false);
|
|
const [isRemainMetadata, setIsRemainMetadata] = useState(false);
|
|
@@ -82,7 +82,7 @@ const PageRenameModal = (): JSX.Element => {
|
|
|
}, [isOpened, page, updateSubordinatedList]);
|
|
}, [isOpened, page, updateSubordinatedList]);
|
|
|
|
|
|
|
|
const rename = useCallback(async() => {
|
|
const rename = useCallback(async() => {
|
|
|
- if (page == null) {
|
|
|
|
|
|
|
+ if (page == null || !canRename) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -117,7 +117,7 @@ const PageRenameModal = (): JSX.Element => {
|
|
|
catch (err) {
|
|
catch (err) {
|
|
|
setErrs(err);
|
|
setErrs(err);
|
|
|
}
|
|
}
|
|
|
- }, [closeRenameModal, isRemainMetadata, isRenameRecursively, isRenameRedirect, page, pageNameInput, renameModalData?.opts?.onRenamed]);
|
|
|
|
|
|
|
+ }, [closeRenameModal, canRename, isRemainMetadata, isRenameRecursively, isRenameRedirect, page, pageNameInput, renameModalData?.opts?.onRenamed]);
|
|
|
|
|
|
|
|
const checkExistPaths = useCallback(async(fromPath, toPath) => {
|
|
const checkExistPaths = useCallback(async(fromPath, toPath) => {
|
|
|
if (page == null) {
|
|
if (page == null) {
|
|
@@ -125,8 +125,11 @@ const PageRenameModal = (): JSX.Element => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- const res = await apiv3Get<{ existPaths: string[] }>('/page/exist-paths', { fromPath, toPath });
|
|
|
|
|
|
|
+ const res = await apiv3Get<{ existPaths: string[]}>('/page/exist-paths', { fromPath, toPath });
|
|
|
const { existPaths } = res.data;
|
|
const { existPaths } = res.data;
|
|
|
|
|
+ if (existPaths.length === 0) {
|
|
|
|
|
+ setCanRename(true);
|
|
|
|
|
+ }
|
|
|
setExistingPaths(existPaths);
|
|
setExistingPaths(existPaths);
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
@@ -154,6 +157,10 @@ const PageRenameModal = (): JSX.Element => {
|
|
|
}
|
|
}
|
|
|
}, [pageNameInput, subordinatedPages, checkExistPathsDebounce, page, checkIsUsersHomePageDebounce]);
|
|
}, [pageNameInput, subordinatedPages, checkExistPathsDebounce, page, checkIsUsersHomePageDebounce]);
|
|
|
|
|
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ setCanRename(false);
|
|
|
|
|
+ }, [pageNameInput]);
|
|
|
|
|
+
|
|
|
|
|
|
|
|
function ppacInputChangeHandler(value) {
|
|
function ppacInputChangeHandler(value) {
|
|
|
setErrs(null);
|
|
setErrs(null);
|
|
@@ -200,6 +207,9 @@ const PageRenameModal = (): JSX.Element => {
|
|
|
if (isMatchedWithUserHomePagePath) {
|
|
if (isMatchedWithUserHomePagePath) {
|
|
|
submitButtonDisabled = true;
|
|
submitButtonDisabled = true;
|
|
|
}
|
|
}
|
|
|
|
|
+ else if (!canRename) {
|
|
|
|
|
+ submitButtonDisabled = true;
|
|
|
|
|
+ }
|
|
|
else if (isV5Compatible(page.meta)) {
|
|
else if (isV5Compatible(page.meta)) {
|
|
|
submitButtonDisabled = existingPaths.length !== 0; // v5 data
|
|
submitButtonDisabled = existingPaths.length !== 0; // v5 data
|
|
|
}
|
|
}
|