Editor: delete that move to doceditor
This commit is contained in:
parent
38ef660aba
commit
e22bcc6e42
@ -17,11 +17,6 @@ import { ThemeProvider } from "@docspace/shared/components/theme-provider";
|
|||||||
|
|
||||||
const isDesktopEditor = window["AscDesktopEditor"] !== undefined;
|
const isDesktopEditor = window["AscDesktopEditor"] !== undefined;
|
||||||
|
|
||||||
import PresentationIcoUrl from "PUBLIC_DIR/images/presentation.ico";
|
|
||||||
import SpreadSheetIcoUrl from "PUBLIC_DIR/images/spreadsheet.ico";
|
|
||||||
import TextIcoUrl from "PUBLIC_DIR/images/text.ico";
|
|
||||||
import PDFIcoUrl from "PUBLIC_DIR/images/pdf.ico";
|
|
||||||
|
|
||||||
const App = ({
|
const App = ({
|
||||||
initialLanguage,
|
initialLanguage,
|
||||||
initialI18nStoreASC,
|
initialI18nStoreASC,
|
||||||
@ -35,73 +30,6 @@ const App = ({
|
|||||||
|
|
||||||
//console.log(rest);
|
//console.log(rest);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
let icon = "";
|
|
||||||
|
|
||||||
switch (rest?.config?.documentType) {
|
|
||||||
case "word":
|
|
||||||
icon =
|
|
||||||
rest?.config?.document?.fileType === "pdf" ? PDFIcoUrl : TextIcoUrl;
|
|
||||||
break;
|
|
||||||
case "slide":
|
|
||||||
icon = PresentationIcoUrl;
|
|
||||||
break;
|
|
||||||
case "cell":
|
|
||||||
icon = SpreadSheetIcoUrl;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
icon = TextIcoUrl;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (icon) {
|
|
||||||
const el = document.getElementById("favicon");
|
|
||||||
|
|
||||||
el.href = icon;
|
|
||||||
}
|
|
||||||
}, [rest?.config?.documentType]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (rest?.error?.errorStatus === 402) {
|
|
||||||
const portalUrl = window.location.origin;
|
|
||||||
|
|
||||||
history.pushState({}, null, portalUrl);
|
|
||||||
document.location.reload();
|
|
||||||
} else {
|
|
||||||
const tempElm = document.getElementById("loader");
|
|
||||||
const userTheme = rest.user?.theme;
|
|
||||||
if (userTheme) setTheme(userTheme);
|
|
||||||
|
|
||||||
const isLoadingDocumentError = rest.error !== null;
|
|
||||||
const isLoadedDocument = !rest.error && rest?.config?.editorUrl;
|
|
||||||
|
|
||||||
if (
|
|
||||||
tempElm &&
|
|
||||||
!rest.props?.needLoader &&
|
|
||||||
(isLoadingDocumentError || isLoadedDocument)
|
|
||||||
)
|
|
||||||
tempElm.outerHTML = "";
|
|
||||||
|
|
||||||
if (isLoadingDocumentError) frameCallCommand("setIsLoaded");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isRetina() && getCookie("is_retina") == null) {
|
|
||||||
setCookie("is_retina", true, { path: "/" });
|
|
||||||
}
|
|
||||||
|
|
||||||
getAppearanceTheme();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const onError = () => {
|
|
||||||
window.open(
|
|
||||||
combineUrl(
|
|
||||||
window.DocSpaceConfig?.proxy?.url,
|
|
||||||
rest.personal ? "sign-in" : "/login"
|
|
||||||
),
|
|
||||||
"_self"
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ErrorBoundary onError={onError}>
|
<ErrorBoundary onError={onError}>
|
||||||
<GlobalStyle />
|
<GlobalStyle />
|
||||||
|
@ -4,7 +4,7 @@ import { isMobile, isIOS, deviceType } from "react-device-detect";
|
|||||||
import { combineUrl } from "@docspace/shared/utils/combineUrl";
|
import { combineUrl } from "@docspace/shared/utils/combineUrl";
|
||||||
import { FolderType } from "@docspace/shared/enums";
|
import { FolderType } from "@docspace/shared/enums";
|
||||||
import { EDITOR_ID } from "@docspace/shared/constants";
|
import { EDITOR_ID } from "@docspace/shared/constants";
|
||||||
import throttle from "lodash/throttle";
|
|
||||||
import { Toast } from "@docspace/shared/components/toast";
|
import { Toast } from "@docspace/shared/components/toast";
|
||||||
import { toast } from "react-toastify";
|
import { toast } from "react-toastify";
|
||||||
import {
|
import {
|
||||||
@ -31,43 +31,11 @@ import {
|
|||||||
import { getEditorTheme } from "@docspace/shared/utils";
|
import { getEditorTheme } from "@docspace/shared/utils";
|
||||||
import { toastr } from "@docspace/shared/components/toast";
|
import { toastr } from "@docspace/shared/components/toast";
|
||||||
import { DocumentEditor } from "@onlyoffice/document-editor-react";
|
import { DocumentEditor } from "@onlyoffice/document-editor-react";
|
||||||
import ErrorContainer from "@docspace/shared/components/error-container/ErrorContainer";
|
|
||||||
import DeepLink from "./DeepLink";
|
import DeepLink from "./DeepLink";
|
||||||
import { getDeepLink } from "../helpers/deepLinkHelper";
|
import { getDeepLink } from "../helpers/deepLinkHelper";
|
||||||
|
|
||||||
toast.configure();
|
toast.configure();
|
||||||
|
|
||||||
const onSDKInfo = (event) => {
|
|
||||||
console.log(
|
|
||||||
"ONLYOFFICE Document Editor is opened in mode " + event.data.mode
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKWarning = (event) => {
|
|
||||||
frameCallCommand("setIsLoaded");
|
|
||||||
console.log(
|
|
||||||
"ONLYOFFICE Document Editor reports a warning: code " +
|
|
||||||
event.data.warningCode +
|
|
||||||
", description " +
|
|
||||||
event.data.warningDescription
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKError = (event) => {
|
|
||||||
frameCallCommand("setIsLoaded");
|
|
||||||
console.log(
|
|
||||||
"ONLYOFFICE Document Editor reports an error: code " +
|
|
||||||
event.data.errorCode +
|
|
||||||
", description " +
|
|
||||||
event.data.errorDescription
|
|
||||||
);
|
|
||||||
};
|
|
||||||
const ErrorContainerBody = styled(ErrorContainer)`
|
|
||||||
position: absolute;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
`;
|
|
||||||
|
|
||||||
let documentIsReady = false;
|
let documentIsReady = false;
|
||||||
let docSaved = null;
|
let docSaved = null;
|
||||||
let docTitle = null;
|
let docTitle = null;
|
||||||
@ -78,10 +46,6 @@ let documentserverUrl =
|
|||||||
let userAccessRights = {};
|
let userAccessRights = {};
|
||||||
let isArchiveFolderRoot = true;
|
let isArchiveFolderRoot = true;
|
||||||
let usersInRoom = [];
|
let usersInRoom = [];
|
||||||
let isZoom =
|
|
||||||
typeof window !== "undefined" &&
|
|
||||||
(window?.navigator?.userAgent?.includes("ZoomWebKit") ||
|
|
||||||
window?.navigator?.userAgent?.includes("ZoomApps"));
|
|
||||||
|
|
||||||
const constructTitle = (firstPart, secondPart, reverse = false) => {
|
const constructTitle = (firstPart, secondPart, reverse = false) => {
|
||||||
return !reverse
|
return !reverse
|
||||||
@ -93,7 +57,7 @@ const checkIfFirstSymbolInStringIsRtl = (str) => {
|
|||||||
if (!str) return;
|
if (!str) return;
|
||||||
|
|
||||||
const rtlRegexp = new RegExp(
|
const rtlRegexp = new RegExp(
|
||||||
/[\u04c7-\u0591\u05D0-\u05EA\u05F0-\u05F4\u0600-\u06FF]/
|
/[\u04c7-\u0591\u05D0-\u05EA\u05F0-\u05F4\u0600-\u06FF]/,
|
||||||
);
|
);
|
||||||
|
|
||||||
return rtlRegexp.test(str[0]);
|
return rtlRegexp.test(str[0]);
|
||||||
@ -105,26 +69,23 @@ function Editor({
|
|||||||
successAuth,
|
successAuth,
|
||||||
isSharingAccess,
|
isSharingAccess,
|
||||||
user,
|
user,
|
||||||
doc,
|
|
||||||
error,
|
error,
|
||||||
sharingDialog,
|
sharingDialog,
|
||||||
onSDKRequestSharingSettings,
|
onSDKRequestSharingSettings,
|
||||||
loadUsersRightsList,
|
|
||||||
isVisible,
|
isVisible,
|
||||||
selectFileDialog,
|
selectFileDialog,
|
||||||
onSDKRequestInsertImage,
|
|
||||||
onSDKRequestSelectSpreadsheet,
|
|
||||||
onSDKRequestSelectDocument,
|
|
||||||
onSDKRequestReferenceSource,
|
|
||||||
selectFolderDialog,
|
selectFolderDialog,
|
||||||
onSDKRequestSaveAs,
|
|
||||||
isDesktopEditor,
|
isDesktopEditor,
|
||||||
initDesktop,
|
initDesktop,
|
||||||
view,
|
view,
|
||||||
mfReady,
|
mfReady,
|
||||||
fileId,
|
fileId,
|
||||||
url,
|
url,
|
||||||
filesSettings,
|
|
||||||
logoUrls,
|
logoUrls,
|
||||||
currentColorScheme,
|
currentColorScheme,
|
||||||
portalSettings,
|
portalSettings,
|
||||||
@ -133,808 +94,19 @@ function Editor({
|
|||||||
|
|
||||||
const fileInfo = config?.file;
|
const fileInfo = config?.file;
|
||||||
|
|
||||||
isArchiveFolderRoot =
|
|
||||||
fileInfo && fileInfo.rootFolderType === FolderType.Archive;
|
|
||||||
|
|
||||||
const { t } = useTranslation(["Editor", "Common"]);
|
const { t } = useTranslation(["Editor", "Common"]);
|
||||||
|
|
||||||
if (fileInfo) {
|
|
||||||
userAccessRights = fileInfo.security;
|
|
||||||
}
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const androidID = portalSettings?.deepLink?.androidPackageName;
|
|
||||||
const iOSId = portalSettings?.deepLink?.iosPackageId;
|
|
||||||
const deepLinkUrl = portalSettings?.deepLink?.url;
|
|
||||||
const isAndroidWebView =
|
|
||||||
window.navigator.userAgent.includes("AscAndroidWebView");
|
|
||||||
|
|
||||||
const defaultOpenDocument = localStorage.getItem("defaultOpenDocument");
|
|
||||||
const params = new URLSearchParams(window.location.search);
|
|
||||||
const withoutRedirect = params.get("without_redirect");
|
|
||||||
|
|
||||||
if (
|
|
||||||
isMobile &&
|
|
||||||
!defaultOpenDocument &&
|
|
||||||
androidID &&
|
|
||||||
iOSId &&
|
|
||||||
deepLinkUrl &&
|
|
||||||
!withoutRedirect &&
|
|
||||||
!isAndroidWebView
|
|
||||||
) {
|
|
||||||
setIsShowDeepLink(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isMobile && defaultOpenDocument === "app") {
|
|
||||||
getDeepLink(
|
|
||||||
window.location.origin,
|
|
||||||
user.email,
|
|
||||||
fileInfo,
|
|
||||||
portalSettings?.deepLink,
|
|
||||||
window.location.href
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (error && mfReady) {
|
|
||||||
if (error?.unAuthorized) {
|
|
||||||
sessionStorage.setItem("referenceUrl", window.location.href);
|
|
||||||
window.open(
|
|
||||||
combineUrl(window.DocSpaceConfig?.proxy?.url, "/login"),
|
|
||||||
"_self"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, [mfReady, error]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!config) return;
|
|
||||||
|
|
||||||
setDocumentTitle(config?.document?.title);
|
|
||||||
|
|
||||||
if (isIOS && deviceType === "tablet") {
|
|
||||||
const vh = window.innerHeight * 0.01;
|
|
||||||
document.documentElement.style.setProperty("--vh", `${vh}px`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
!view &&
|
|
||||||
fileInfo &&
|
|
||||||
fileInfo.viewAccessibility.WebRestrictedEditing &&
|
|
||||||
fileInfo.security.FillForms &&
|
|
||||||
fileInfo.rootFolderType === FolderType.Rooms &&
|
|
||||||
!fileInfo.security.Edit &&
|
|
||||||
!config?.document?.isLinkedForMe
|
|
||||||
) {
|
|
||||||
try {
|
|
||||||
initForm();
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (view) {
|
|
||||||
config.editorConfig.mode = "view";
|
|
||||||
}
|
|
||||||
|
|
||||||
init();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (config) {
|
|
||||||
if (isDesktopEditor) {
|
|
||||||
initDesktop(config, user, fileId, t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, [isDesktopEditor]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
try {
|
|
||||||
const url = window.location.href;
|
|
||||||
|
|
||||||
if (
|
|
||||||
successAuth &&
|
|
||||||
url.indexOf("#message/") > -1 &&
|
|
||||||
fileInfo &&
|
|
||||||
fileInfo?.fileExst &&
|
|
||||||
fileInfo?.viewAccessibility?.MustConvert &&
|
|
||||||
fileInfo?.security?.Convert
|
|
||||||
) {
|
|
||||||
showDocEditorMessage(url);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
}
|
|
||||||
}, [url, fileInfo?.fileExst]);
|
|
||||||
|
|
||||||
const initForm = async () => {
|
|
||||||
const formUrl = await checkFillFormDraft(fileId);
|
|
||||||
history.pushState({}, null, formUrl);
|
|
||||||
|
|
||||||
document.location.reload();
|
|
||||||
};
|
|
||||||
|
|
||||||
const convertDocumentUrl = async () => {
|
|
||||||
const convert = await convertFile(fileId, null, true);
|
|
||||||
return convert && convert[0]?.result;
|
|
||||||
};
|
|
||||||
|
|
||||||
const showDocEditorMessage = async (url) => {
|
|
||||||
const result = await convertDocumentUrl();
|
|
||||||
const splitUrl = url.split("#message/");
|
|
||||||
|
|
||||||
if (result) {
|
|
||||||
const newUrl = `${result.webUrl}#message/${splitUrl[1]}`;
|
|
||||||
|
|
||||||
history.pushState({}, null, newUrl);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const getDefaultFileName = (withExt = false) => {
|
|
||||||
const documentType = config?.documentType;
|
|
||||||
|
|
||||||
const fileExt =
|
|
||||||
documentType === "word"
|
|
||||||
? "docx"
|
|
||||||
: documentType === "slide"
|
|
||||||
? "pptx"
|
|
||||||
: documentType === "cell"
|
|
||||||
? "xlsx"
|
|
||||||
: "docxf";
|
|
||||||
|
|
||||||
let fileName = t("Common:NewDocument");
|
|
||||||
|
|
||||||
switch (fileExt) {
|
|
||||||
case "xlsx":
|
|
||||||
fileName = t("Common:NewSpreadsheet");
|
|
||||||
break;
|
|
||||||
case "pptx":
|
|
||||||
fileName = t("Common:NewPresentation");
|
|
||||||
break;
|
|
||||||
case "docxf":
|
|
||||||
fileName = t("Common:NewMasterForm");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (withExt) {
|
|
||||||
fileName = `${fileName}.${fileExt}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return fileName;
|
|
||||||
};
|
|
||||||
|
|
||||||
const throttledChangeTitle = throttle(() => changeTitle(), 500);
|
|
||||||
|
|
||||||
const onSDKRequestHistoryClose = () => {
|
|
||||||
document.location.reload();
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKRequestEditRights = async () => {
|
|
||||||
console.log("ONLYOFFICE Document Editor requests editing rights");
|
|
||||||
const url = window.location.href;
|
|
||||||
|
|
||||||
const index = url.indexOf("&action=view");
|
|
||||||
|
|
||||||
if (index) {
|
|
||||||
let convertUrl = url.substring(0, index);
|
|
||||||
|
|
||||||
if (
|
|
||||||
fileInfo?.viewAccessibility?.MustConvert &&
|
|
||||||
fileInfo?.security?.Convert
|
|
||||||
) {
|
|
||||||
const newUrl = await convertDocumentUrl();
|
|
||||||
if (newUrl) {
|
|
||||||
convertUrl = newUrl.webUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
history.pushState({}, null, convertUrl);
|
|
||||||
document.location.reload();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKRequestReferenceData = async (event) => {
|
|
||||||
const referenceData = await getReferenceData(
|
|
||||||
event.data.referenceData ?? event.data
|
|
||||||
);
|
|
||||||
|
|
||||||
docEditor.setReferenceData(referenceData);
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKRequestOpen = async (event) => {
|
|
||||||
const windowName = event.data.windowName;
|
|
||||||
const reference = event.data;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const data = {
|
|
||||||
fileKey: reference.referenceData ? reference.referenceData.fileKey : "",
|
|
||||||
instanceId: reference.referenceData
|
|
||||||
? reference.referenceData.instanceId
|
|
||||||
: "",
|
|
||||||
fileId,
|
|
||||||
path: reference.path || "",
|
|
||||||
};
|
|
||||||
|
|
||||||
const result = await getReferenceData(data);
|
|
||||||
|
|
||||||
if (result.error) throw new Error(result.error);
|
|
||||||
|
|
||||||
var link = result.link;
|
|
||||||
window.open(link, windowName);
|
|
||||||
} catch (e) {
|
|
||||||
var winEditor = window.open("", windowName);
|
|
||||||
winEditor.close();
|
|
||||||
docEditor.showMessage(e?.message || t("ErrorConnectionLost"));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onMakeActionLink = (event) => {
|
|
||||||
const url = window.location.href;
|
|
||||||
const actionLink = config?.editorConfig?.actionLink;
|
|
||||||
|
|
||||||
const actionData = event.data;
|
|
||||||
|
|
||||||
const link = generateLink(actionData);
|
|
||||||
|
|
||||||
const urlFormation = !actionLink ? url : url.split("&anchor=")[0];
|
|
||||||
|
|
||||||
const linkFormation = `${urlFormation}&anchor=${link}`;
|
|
||||||
|
|
||||||
docEditor.setActionLink(linkFormation);
|
|
||||||
};
|
|
||||||
|
|
||||||
const generateLink = (actionData) => {
|
|
||||||
return encodeURIComponent(JSON.stringify(actionData));
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKRequestCreateNew = (event) => {
|
|
||||||
const defaultFileName = getDefaultFileName(true);
|
|
||||||
|
|
||||||
createFile(fileInfo.folderId, defaultFileName)
|
|
||||||
.then((newFile) => {
|
|
||||||
const newUrl = combineUrl(
|
|
||||||
window.DocSpaceConfig?.proxy?.url,
|
|
||||||
config.homepage,
|
|
||||||
`/doceditor?fileId=${encodeURIComponent(newFile.id)}`
|
|
||||||
);
|
|
||||||
window.open(
|
|
||||||
newUrl,
|
|
||||||
window.DocSpaceConfig?.editor?.openOnNewPage ? "_blank" : "_self"
|
|
||||||
);
|
|
||||||
})
|
|
||||||
.catch((e) => {
|
|
||||||
toastr.error(e);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKRequestRename = (event) => {
|
|
||||||
const title = event.data;
|
|
||||||
updateFile(fileInfo.id, title);
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKRequestRestore = async (event) => {
|
|
||||||
const restoreVersion = event.data.version;
|
|
||||||
try {
|
|
||||||
const updateVersions = await restoreDocumentsVersion(
|
|
||||||
fileId,
|
|
||||||
restoreVersion,
|
|
||||||
doc
|
|
||||||
);
|
|
||||||
const historyLength = updateVersions.length;
|
|
||||||
docEditor.refreshHistory({
|
|
||||||
currentVersion: getCurrentDocumentVersion(
|
|
||||||
updateVersions,
|
|
||||||
historyLength
|
|
||||||
),
|
|
||||||
history: getDocumentHistory(updateVersions, historyLength),
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
let errorMessage = "";
|
|
||||||
if (typeof error === "object") {
|
|
||||||
errorMessage =
|
|
||||||
error?.response?.data?.error?.message ||
|
|
||||||
error?.statusText ||
|
|
||||||
error?.message ||
|
|
||||||
"";
|
|
||||||
} else {
|
|
||||||
errorMessage = error;
|
|
||||||
}
|
|
||||||
|
|
||||||
docEditor.refreshHistory({
|
|
||||||
error: `${errorMessage}`, //TODO: maybe need to display something else.
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const getDocumentHistory = (fileHistory, historyLength) => {
|
|
||||||
let result = [];
|
|
||||||
|
|
||||||
for (let i = 0; i < historyLength; i++) {
|
|
||||||
const changes = fileHistory[i].changes;
|
|
||||||
const serverVersion = fileHistory[i].serverVersion;
|
|
||||||
const version = fileHistory[i].version;
|
|
||||||
const versionGroup = fileHistory[i].versionGroup;
|
|
||||||
|
|
||||||
let obj = {
|
|
||||||
...(changes.length !== 0 && { changes }),
|
|
||||||
created: `${new Date(fileHistory[i].created).toLocaleString(
|
|
||||||
config.editorConfig.lang
|
|
||||||
)}`,
|
|
||||||
...(serverVersion && { serverVersion }),
|
|
||||||
key: fileHistory[i].key,
|
|
||||||
user: {
|
|
||||||
id: fileHistory[i].user.id,
|
|
||||||
name: fileHistory[i].user.name,
|
|
||||||
},
|
|
||||||
version,
|
|
||||||
versionGroup,
|
|
||||||
};
|
|
||||||
|
|
||||||
result.push(obj);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
const getCurrentDocumentVersion = (fileHistory, historyLength) => {
|
|
||||||
return url.indexOf("&version=") !== -1
|
|
||||||
? +url.split("&version=")[1]
|
|
||||||
: fileHistory[historyLength - 1].version;
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKRequestHistory = async () => {
|
|
||||||
try {
|
|
||||||
const search = window.location.search;
|
|
||||||
const shareIndex = search.indexOf("share=");
|
|
||||||
const requestToken =
|
|
||||||
shareIndex > -1 ? search.substring(shareIndex + 6) : null;
|
|
||||||
|
|
||||||
const fileHistory = await getEditHistory(fileId, doc, requestToken);
|
|
||||||
const historyLength = fileHistory.length;
|
|
||||||
|
|
||||||
docEditor.refreshHistory({
|
|
||||||
currentVersion: getCurrentDocumentVersion(fileHistory, historyLength),
|
|
||||||
history: getDocumentHistory(fileHistory, historyLength),
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
let errorMessage = "";
|
|
||||||
if (typeof error === "object") {
|
|
||||||
errorMessage =
|
|
||||||
error?.response?.data?.error?.message ||
|
|
||||||
error?.statusText ||
|
|
||||||
error?.message ||
|
|
||||||
"";
|
|
||||||
} else {
|
|
||||||
errorMessage = error;
|
|
||||||
}
|
|
||||||
docEditor.refreshHistory({
|
|
||||||
error: `${errorMessage}`, //TODO: maybe need to display something else.
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKRequestHistoryData = async (event) => {
|
|
||||||
const version = event.data;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const search = window.location.search;
|
|
||||||
const shareIndex = search.indexOf("share=");
|
|
||||||
const requestToken =
|
|
||||||
shareIndex > -1 ? search.substring(shareIndex + 6) : null;
|
|
||||||
|
|
||||||
const versionDifference = await getEditDiff(
|
|
||||||
fileId,
|
|
||||||
version,
|
|
||||||
doc,
|
|
||||||
requestToken
|
|
||||||
);
|
|
||||||
const changesUrl = versionDifference.changesUrl;
|
|
||||||
const previous = versionDifference.previous;
|
|
||||||
const token = versionDifference.token;
|
|
||||||
|
|
||||||
docEditor.setHistoryData({
|
|
||||||
...(changesUrl && { changesUrl }),
|
|
||||||
key: versionDifference.key,
|
|
||||||
fileType: versionDifference.fileType,
|
|
||||||
...(previous && {
|
|
||||||
previous: {
|
|
||||||
fileType: previous.fileType,
|
|
||||||
key: previous.key,
|
|
||||||
url: previous.url,
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
...(token && { token }),
|
|
||||||
url: versionDifference.url,
|
|
||||||
version,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
let errorMessage = "";
|
|
||||||
if (typeof error === "object") {
|
|
||||||
errorMessage =
|
|
||||||
error?.response?.data?.error?.message ||
|
|
||||||
error?.statusText ||
|
|
||||||
error?.message ||
|
|
||||||
"";
|
|
||||||
} else {
|
|
||||||
errorMessage = error;
|
|
||||||
}
|
|
||||||
|
|
||||||
docEditor.setHistoryData({
|
|
||||||
error: `${errorMessage}`, //TODO: maybe need to display something else.
|
|
||||||
version,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onDocumentReady = () => {
|
|
||||||
console.log("onDocumentReady", arguments, { docEditor });
|
|
||||||
documentIsReady = true;
|
|
||||||
|
|
||||||
frameCallCommand("setIsLoaded");
|
|
||||||
|
|
||||||
config?.errorMessage && docEditor?.showMessage(config.errorMessage);
|
|
||||||
|
|
||||||
if (isSharingAccess) {
|
|
||||||
loadUsersRightsList(docEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
assign(window, ["ASC", "Files", "Editor", "docEditor"], docEditor); //Do not remove: it's for Back button on Mobile App
|
|
||||||
};
|
|
||||||
|
|
||||||
// const updateFavorite = (favorite) => {
|
|
||||||
// docEditor.setFavorite(favorite);
|
|
||||||
// };
|
|
||||||
|
|
||||||
const onMetaChange = (event) => {
|
|
||||||
const newTitle = event.data.title;
|
|
||||||
//const favorite = event.data.favorite;
|
|
||||||
|
|
||||||
if (newTitle && newTitle !== docTitle) {
|
|
||||||
setDocumentTitle(newTitle);
|
|
||||||
docTitle = newTitle;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (!newTitle) {
|
|
||||||
// const onlyNumbers = new RegExp("^[0-9]+$");
|
|
||||||
// const isFileWithoutProvider = onlyNumbers.test(fileId);
|
|
||||||
|
|
||||||
// const convertFileId = isFileWithoutProvider ? +fileId : fileId;
|
|
||||||
|
|
||||||
// favorite
|
|
||||||
// ? markAsFavorite([convertFileId])
|
|
||||||
// .then(() => updateFavorite(favorite))
|
|
||||||
// .catch((error) => console.log("error", error))
|
|
||||||
// : removeFromFavorite([convertFileId])
|
|
||||||
// .then(() => updateFavorite(favorite))
|
|
||||||
// .catch((error) => console.log("error", error));
|
|
||||||
// }
|
|
||||||
};
|
|
||||||
|
|
||||||
const setDocumentTitle = (subTitle = null) => {
|
|
||||||
//const { isAuthenticated, settingsStore, product: currentModule } = auth;
|
|
||||||
//const { organizationName } = settingsStore;
|
|
||||||
const organizationName = "ONLYOFFICE"; //TODO: Replace to API variant
|
|
||||||
const moduleTitle = "Documents"; //TODO: Replace to API variant
|
|
||||||
|
|
||||||
const isSubTitleRtl = checkIfFirstSymbolInStringIsRtl(subTitle);
|
|
||||||
const fileType = config?.document?.fileType;
|
|
||||||
|
|
||||||
// needs to reverse filename and extension for rtl mode
|
|
||||||
if (subTitle && fileType && isSubTitleRtl) {
|
|
||||||
subTitle = `${fileType}.${subTitle.replace(`.${fileType}`, "")}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
let title;
|
|
||||||
if (subTitle) {
|
|
||||||
if (successAuth && moduleTitle) {
|
|
||||||
title = constructTitle(subTitle, moduleTitle, isSubTitleRtl);
|
|
||||||
} else {
|
|
||||||
title = constructTitle(subTitle, organizationName, isSubTitleRtl);
|
|
||||||
}
|
|
||||||
} else if (moduleTitle && organizationName) {
|
|
||||||
title = constructTitle(moduleTitle, organizationName);
|
|
||||||
} else {
|
|
||||||
title = organizationName;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!documentIsReady) {
|
|
||||||
docTitle = title;
|
|
||||||
}
|
|
||||||
document.title = title;
|
|
||||||
};
|
|
||||||
|
|
||||||
const changeTitle = () => {
|
|
||||||
docSaved ? setDocumentTitle(docTitle) : setDocumentTitle(`*${docTitle}`);
|
|
||||||
};
|
|
||||||
|
|
||||||
const onDocumentStateChange = (event) => {
|
|
||||||
if (!documentIsReady) return;
|
|
||||||
|
|
||||||
docSaved = !event.data;
|
|
||||||
throttledChangeTitle();
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKAppReady = () => {
|
|
||||||
docEditor = window.DocEditor.instances[EDITOR_ID];
|
|
||||||
|
|
||||||
console.log("ONLYOFFICE Document Editor is ready", docEditor);
|
|
||||||
const url = window.location.href;
|
|
||||||
|
|
||||||
const index = url.indexOf("#message/");
|
|
||||||
|
|
||||||
if (index > -1) {
|
|
||||||
const splitUrl = url.split("#message/");
|
|
||||||
|
|
||||||
if (splitUrl.length === 2) {
|
|
||||||
const message = decodeURIComponent(splitUrl[1]).replace(/\+/g, " ");
|
|
||||||
|
|
||||||
docEditor.showMessage(message);
|
|
||||||
history.pushState({}, null, url.substring(0, index));
|
|
||||||
} else {
|
|
||||||
if (config?.Error) docEditor.showMessage(config.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKRequestUsers = async (event) => {
|
|
||||||
try {
|
|
||||||
const c = event?.data?.c;
|
|
||||||
const users = await (c == "protect"
|
|
||||||
? getProtectUsers(fileInfo.id)
|
|
||||||
: getSharedUsers(fileInfo.id));
|
|
||||||
|
|
||||||
if (c !== "protect") {
|
|
||||||
usersInRoom = users.map((item) => ({
|
|
||||||
email: item.email,
|
|
||||||
name: item.name,
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
docEditor.setUsers({
|
|
||||||
c,
|
|
||||||
users,
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
docEditor.showMessage(e?.message || t("ErrorConnectionLost"));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKRequestSendNotify = async (event) => {
|
|
||||||
const actionData = event.data.actionLink;
|
|
||||||
const comment = event.data.message;
|
|
||||||
const emails = event.data.emails;
|
|
||||||
|
|
||||||
try {
|
|
||||||
await sendEditorNotify(fileInfo.id, actionData, emails, comment);
|
|
||||||
|
|
||||||
if (usersInRoom.length === 0) return;
|
|
||||||
|
|
||||||
const usersNotFound = [...emails].filter((row) =>
|
|
||||||
usersInRoom.every((value) => {
|
|
||||||
return row !== value.email;
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
usersNotFound.length > 0 &&
|
|
||||||
docEditor.showMessage(
|
|
||||||
t("UsersWithoutAccess", {
|
|
||||||
users: usersNotFound,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
} catch (e) {
|
|
||||||
toastr.error(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSDKRequestClose = () => {
|
|
||||||
const search = window.location.search;
|
|
||||||
const editorGoBack = new URLSearchParams(search).get("editorGoBack");
|
|
||||||
|
|
||||||
if (editorGoBack === "event") {
|
|
||||||
frameCallEvent({ event: "onEditorCloseCallback" });
|
|
||||||
} else {
|
|
||||||
const backUrl = getBackUrl();
|
|
||||||
window.location.replace(backUrl);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const getBackUrl = () => {
|
|
||||||
if (!fileInfo) return;
|
|
||||||
const search = window.location.search;
|
|
||||||
const shareIndex = search.indexOf("share=");
|
|
||||||
const key = shareIndex > -1 ? search.substring(shareIndex + 6) : null;
|
|
||||||
|
|
||||||
let backUrl = "";
|
|
||||||
|
|
||||||
if (fileInfo.rootFolderType === FolderType.Rooms) {
|
|
||||||
if (key) {
|
|
||||||
backUrl = `/rooms/share?key=${key}`;
|
|
||||||
} else {
|
|
||||||
backUrl = `/rooms/shared/${fileInfo.folderId}/filter?folder=${fileInfo.folderId}`;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
backUrl = `/rooms/personal/filter?folder=${fileInfo.folderId}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
const url = window.location.href;
|
|
||||||
const origin = url.substring(0, url.indexOf("/doceditor"));
|
|
||||||
|
|
||||||
return `${combineUrl(origin, backUrl)}`;
|
|
||||||
};
|
|
||||||
|
|
||||||
const init = () => {
|
const init = () => {
|
||||||
try {
|
try {
|
||||||
if (isMobile) {
|
let onRequestSharingSettings;
|
||||||
config.type = "mobile";
|
|
||||||
}
|
|
||||||
|
|
||||||
let goBack;
|
|
||||||
|
|
||||||
if (fileInfo) {
|
|
||||||
const search = window.location.search;
|
|
||||||
const editorGoBack = new URLSearchParams(search).get("editorGoBack");
|
|
||||||
|
|
||||||
if (editorGoBack === "false") {
|
|
||||||
goBack = {};
|
|
||||||
} else if (editorGoBack === "event") {
|
|
||||||
goBack = {
|
|
||||||
requestClose: true,
|
|
||||||
text: t("FileLocation"),
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
goBack = {
|
|
||||||
requestClose: window.DocSpaceConfig?.editor?.requestClose ?? false,
|
|
||||||
text: t("FileLocation"),
|
|
||||||
};
|
|
||||||
if (!window.DocSpaceConfig?.editor?.requestClose) {
|
|
||||||
goBack.blank = window.DocSpaceConfig?.editor?.openOnNewPage ?? true;
|
|
||||||
goBack.url = getBackUrl();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
config.editorConfig.customization = {
|
|
||||||
...config.editorConfig.customization,
|
|
||||||
goback: { ...goBack },
|
|
||||||
};
|
|
||||||
|
|
||||||
config.editorConfig.customization.uiTheme = getEditorTheme(user?.theme);
|
|
||||||
|
|
||||||
config.document.info.favorite = null;
|
|
||||||
|
|
||||||
// if (personal && !fileInfo) {
|
|
||||||
// //TODO: add conditions for SaaS
|
|
||||||
// config.document.info.favorite = null;
|
|
||||||
// }
|
|
||||||
|
|
||||||
const url = window.location.href;
|
|
||||||
|
|
||||||
if (url.indexOf("anchor") !== -1) {
|
|
||||||
const splitUrl = url.split("anchor=");
|
|
||||||
const decodeURI = decodeURIComponent(splitUrl[1]);
|
|
||||||
const obj = JSON.parse(decodeURI);
|
|
||||||
|
|
||||||
config.editorConfig.actionLink = {
|
|
||||||
action: obj.action,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
let onRequestSharingSettings,
|
|
||||||
onRequestRename,
|
|
||||||
onRequestSaveAs,
|
|
||||||
onRequestInsertImage,
|
|
||||||
onRequestSelectSpreadsheet,
|
|
||||||
onRequestSelectDocument,
|
|
||||||
onRequestReferenceSource,
|
|
||||||
onRequestRestore,
|
|
||||||
onRequestHistory,
|
|
||||||
onRequestReferenceData,
|
|
||||||
onRequestOpen,
|
|
||||||
onRequestUsers,
|
|
||||||
onRequestSendNotify,
|
|
||||||
onRequestCreateNew,
|
|
||||||
onRequestClose;
|
|
||||||
|
|
||||||
if (successAuth && !user.isVisitor) {
|
|
||||||
if (
|
|
||||||
isDesktopEditor ||
|
|
||||||
window.DocSpaceConfig?.editor?.openOnNewPage === false
|
|
||||||
) {
|
|
||||||
onRequestCreateNew = onSDKRequestCreateNew;
|
|
||||||
} else {
|
|
||||||
//FireFox security issue fix (onRequestCreateNew will be blocked)
|
|
||||||
const documentType = config?.documentType || "word";
|
|
||||||
const defaultFileName = getDefaultFileName();
|
|
||||||
|
|
||||||
const url = new URL(
|
|
||||||
combineUrl(
|
|
||||||
window.location.origin,
|
|
||||||
window.DocSpaceConfig?.proxy?.url,
|
|
||||||
"/filehandler.ashx"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
url.searchParams.append("action", "create");
|
|
||||||
url.searchParams.append("doctype", documentType);
|
|
||||||
url.searchParams.append("title", defaultFileName);
|
|
||||||
|
|
||||||
config.editorConfig.createUrl = url.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isSharingAccess) {
|
if (isSharingAccess) {
|
||||||
onRequestSharingSettings = onSDKRequestSharingSettings;
|
onRequestSharingSettings = onSDKRequestSharingSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userAccessRights.Rename) {
|
|
||||||
onRequestRename = onSDKRequestRename;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (userAccessRights.ReadHistory) {
|
|
||||||
onRequestHistory = onSDKRequestHistory;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (successAuth && !user.isVisitor) {
|
|
||||||
onRequestSaveAs = onSDKRequestSaveAs;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (successAuth) {
|
|
||||||
onRequestInsertImage = onSDKRequestInsertImage;
|
|
||||||
onRequestSelectSpreadsheet = onSDKRequestSelectSpreadsheet;
|
|
||||||
onRequestSelectDocument = onSDKRequestSelectDocument;
|
|
||||||
onRequestReferenceSource = onSDKRequestReferenceSource;
|
|
||||||
|
|
||||||
if (fileInfo?.rootFolderType !== FolderType.USER) {
|
|
||||||
//TODO: remove condition for share in my
|
|
||||||
onRequestUsers = onSDKRequestUsers;
|
|
||||||
onRequestSendNotify = onSDKRequestSendNotify;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (userAccessRights.EditHistory) {
|
|
||||||
onRequestRestore = onSDKRequestRestore;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fileInfo?.providerKey) {
|
|
||||||
onRequestReferenceData = onSDKRequestReferenceData;
|
|
||||||
|
|
||||||
if (!isZoom) {
|
|
||||||
onRequestOpen = onSDKRequestOpen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window.DocSpaceConfig?.editor?.requestClose) {
|
|
||||||
onRequestClose = onSDKRequestClose;
|
|
||||||
}
|
|
||||||
|
|
||||||
const events = {
|
const events = {
|
||||||
events: {
|
events: {
|
||||||
onRequestReferenceData,
|
|
||||||
onRequestOpen,
|
|
||||||
onAppReady: onSDKAppReady,
|
|
||||||
onDocumentStateChange: onDocumentStateChange,
|
|
||||||
onMetaChange: onMetaChange,
|
|
||||||
onDocumentReady: onDocumentReady,
|
|
||||||
onInfo: onSDKInfo,
|
|
||||||
onWarning: onSDKWarning,
|
|
||||||
onError: onSDKError,
|
|
||||||
onRequestSharingSettings,
|
onRequestSharingSettings,
|
||||||
onRequestRename,
|
|
||||||
onMakeActionLink: onMakeActionLink,
|
|
||||||
onRequestInsertImage,
|
|
||||||
onRequestSaveAs,
|
|
||||||
onRequestSelectSpreadsheet,
|
|
||||||
onRequestSelectDocument,
|
|
||||||
onRequestReferenceSource,
|
|
||||||
onRequestEditRights: onSDKRequestEditRights,
|
|
||||||
onRequestHistory: onRequestHistory,
|
|
||||||
onRequestHistoryClose: onSDKRequestHistoryClose,
|
|
||||||
onRequestHistoryData: onSDKRequestHistoryData,
|
|
||||||
onRequestRestore,
|
|
||||||
onRequestUsers,
|
|
||||||
onRequestSendNotify,
|
|
||||||
onRequestCreateNew,
|
|
||||||
onRequestClose,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -944,13 +116,6 @@ function Editor({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const errorMessage = () => {
|
|
||||||
if (typeof error !== "string") return error.errorMessage;
|
|
||||||
|
|
||||||
if (error === "restore-backup") return t("Common:PreparationPortalTitle");
|
|
||||||
return error;
|
|
||||||
};
|
|
||||||
|
|
||||||
const additionalComponents =
|
const additionalComponents =
|
||||||
error && !error?.unAuthorized ? (
|
error && !error?.unAuthorized ? (
|
||||||
<ErrorContainerBody
|
<ErrorContainerBody
|
||||||
@ -965,18 +130,6 @@ function Editor({
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
if (isShowDeepLink)
|
|
||||||
return (
|
|
||||||
<DeepLink
|
|
||||||
fileInfo={fileInfo}
|
|
||||||
logoUrls={logoUrls}
|
|
||||||
userEmail={user.email}
|
|
||||||
setIsShowDeepLink={setIsShowDeepLink}
|
|
||||||
currentColorScheme={currentColorScheme}
|
|
||||||
deepLinkConfig={portalSettings?.deepLink}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<EditorWrapper isVisibleSharingDialog={isVisible}>
|
<EditorWrapper isVisibleSharingDialog={isVisible}>
|
||||||
{newConfig && (
|
{newConfig && (
|
||||||
|
@ -14,8 +14,8 @@ const renderApp = (i18n, initialState) => {
|
|||||||
<GlobalStyle />
|
<GlobalStyle />
|
||||||
<Editor {...initialState} />
|
<Editor {...initialState} />
|
||||||
</I18nextProvider>
|
</I18nextProvider>
|
||||||
</React.Suspense>
|
</React.Suspense>,
|
||||||
)
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
const styleTags = sheet.getStyleTags();
|
const styleTags = sheet.getStyleTags();
|
||||||
|
Loading…
Reference in New Issue
Block a user