Merge branch 'develop' into feature/login-nextjs

This commit is contained in:
Timofey Boyko 2024-03-26 13:01:08 +03:00
commit 9fbfe2be15
10 changed files with 261 additions and 156 deletions

View File

@ -35,8 +35,8 @@ import { observer, inject } from "mobx-react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { GroupParams } from "./types";
import { createGroup } from "@docspace/shared/api/groups"; import { createGroup } from "@docspace/shared/api/groups";
import { GroupParams } from "./types";
import GroupNameParam from "./sub-components/GroupNameParam"; import GroupNameParam from "./sub-components/GroupNameParam";
import HeadOfGroup from "./sub-components/HeadOfGroupParam"; import HeadOfGroup from "./sub-components/HeadOfGroupParam";
import MembersParam from "./sub-components/MembersParam"; import MembersParam from "./sub-components/MembersParam";
@ -104,88 +104,88 @@ const CreateGroupDialog = ({
}); });
}; };
if (selectGroupMangerPanelIsVisible)
return (
<SelectGroupManagerPanel
isVisible={selectGroupMangerPanelIsVisible}
onClose={onHideSelectGroupManagerPanel}
onParentPanelClose={onClose}
setGroupManager={setGroupManager}
/>
);
if (selectMembersPanelIsVisible)
return (
<SelectGroupMembersPanel
isVisible={selectMembersPanelIsVisible}
onClose={onHideSelectMembersPanel}
onParentPanelClose={onClose}
groupManager={groupParams.groupManager}
groupMembers={groupParams.groupMembers}
setGroupMembers={setGroupMembers}
/>
);
return ( return (
<ModalDialog <>
displayType={ModalDialogType.aside} <ModalDialog
withBodyScroll displayType={ModalDialogType.aside}
visible={visible} withBodyScroll
onClose={onClose} visible={visible}
withFooterBorder onClose={onClose}
// isScrollLocked={isScrollLocked} withFooterBorder
// isOauthWindowOpen={isOauthWindowOpen} // isScrollLocked={isScrollLocked}
> // isOauthWindowOpen={isOauthWindowOpen}
<ModalDialog.Header> >
{t("PeopleTranslations:CreateGroup")} <ModalDialog.Header>
</ModalDialog.Header> {t("PeopleTranslations:CreateGroup")}
</ModalDialog.Header>
<ModalDialog.Body> <ModalDialog.Body>
<GroupNameParam <GroupNameParam
groupName={groupParams.groupName} groupName={groupParams.groupName}
onChangeGroupName={onChangeGroupName} onChangeGroupName={onChangeGroupName}
/> />
<HeadOfGroup <HeadOfGroup
groupManager={groupParams.groupManager} groupManager={groupParams.groupManager}
setGroupManager={setGroupManager}
groupMembers={groupParams.groupMembers}
setGroupMembers={setGroupMembers}
onShowSelectGroupManagerPanel={onShowSelectGroupManagerPanel}
/>
<MembersParam
groupManager={groupParams.groupManager}
groupMembers={groupParams.groupMembers}
setGroupMembers={setGroupMembers}
onShowSelectMembersPanel={onShowSelectMembersPanel}
/>
</ModalDialog.Body>
<ModalDialog.Footer>
<Button
id="create-group-modal_submit"
tabIndex={5}
label={t("Common:Create")}
size={ButtonSize.normal}
primary
scale
onClick={onCreateGroup}
isDisabled={
!groupParams.groupName ||
(!groupParams.groupManager && !groupParams.groupMembers.length)
}
isLoading={isLoading}
/>
<Button
id="create-group-modal_cancel"
tabIndex={5}
label={t("Common:CancelButton")}
size={ButtonSize.normal}
scale
isDisabled={isLoading}
onClick={onClose}
/>
</ModalDialog.Footer>
</ModalDialog>
{selectGroupMangerPanelIsVisible && (
<SelectGroupManagerPanel
isVisible={selectGroupMangerPanelIsVisible}
onClose={onHideSelectGroupManagerPanel}
onParentPanelClose={onClose}
setGroupManager={setGroupManager} setGroupManager={setGroupManager}
groupMembers={groupParams.groupMembers}
setGroupMembers={setGroupMembers}
onShowSelectGroupManagerPanel={onShowSelectGroupManagerPanel}
/> />
<MembersParam )}
{selectMembersPanelIsVisible && (
<SelectGroupMembersPanel
isVisible={selectMembersPanelIsVisible}
onClose={onHideSelectMembersPanel}
onParentPanelClose={onClose}
groupManager={groupParams.groupManager} groupManager={groupParams.groupManager}
groupMembers={groupParams.groupMembers} groupMembers={groupParams.groupMembers}
setGroupMembers={setGroupMembers} setGroupMembers={setGroupMembers}
onShowSelectMembersPanel={onShowSelectMembersPanel}
/> />
</ModalDialog.Body> )}
</>
<ModalDialog.Footer>
<Button
id="create-group-modal_submit"
tabIndex={5}
label={t("Common:Create")}
size={ButtonSize.normal}
primary
scale
onClick={onCreateGroup}
isDisabled={
!groupParams.groupName ||
(!groupParams.groupManager && !groupParams.groupMembers.length)
}
isLoading={isLoading}
/>
<Button
id="create-group-modal_cancel"
tabIndex={5}
label={t("Common:CancelButton")}
size={ButtonSize.normal}
scale
isDisabled={isLoading}
onClick={onClose}
/>
</ModalDialog.Footer>
</ModalDialog>
); );
}; };

View File

@ -155,87 +155,87 @@ const EditGroupDialog = ({
.finally(() => setFetchMembersIsLoading(false)); .finally(() => setFetchMembersIsLoading(false));
}, [group.id]); }, [group.id]);
if (selectGroupMangerPanelIsVisible)
return (
<SelectGroupManagerPanel
isVisible={selectGroupMangerPanelIsVisible}
onClose={onHideSelectGroupManagerPanel}
onParentPanelClose={onClose}
setGroupManager={setGroupManager}
/>
);
if (selectMembersPanelIsVisible)
return (
<SelectGroupMembersPanel
isVisible={selectMembersPanelIsVisible}
onClose={onHideSelectMembersPanel}
onParentPanelClose={onClose}
groupManager={groupParams.groupManager}
groupMembers={groupParams.groupMembers}
setGroupMembers={setGroupMembers}
/>
);
return ( return (
<ModalDialog <>
displayType="aside" <ModalDialog
withBodyScroll displayType="aside"
visible={visible} withBodyScroll
onClose={onClose} visible={visible}
withFooterBorder onClose={onClose}
// isScrollLocked={isScrollLocked} withFooterBorder
// isOauthWindowOpen={isOauthWindowOpen} // isScrollLocked={isScrollLocked}
> // isOauthWindowOpen={isOauthWindowOpen}
<ModalDialog.Header> >
{t("PeopleTranslations:EditGroup")} <ModalDialog.Header>
</ModalDialog.Header> {t("PeopleTranslations:EditGroup")}
</ModalDialog.Header>
<ModalDialog.Body> <ModalDialog.Body>
<GroupNameParam <GroupNameParam
groupName={groupParams.groupName} groupName={groupParams.groupName}
onChangeGroupName={onChangeGroupName} onChangeGroupName={onChangeGroupName}
/> />
<HeadOfGroup <HeadOfGroup
groupManager={groupParams.groupManager}
setGroupManager={setGroupManager}
groupMembers={groupParams.groupMembers}
setGroupMembers={setGroupMembers}
onShowSelectGroupManagerPanel={onShowSelectGroupManagerPanel}
/>
{!isFetchMembersLoading && (
<MembersParam
groupManager={groupParams.groupManager} groupManager={groupParams.groupManager}
setGroupManager={setGroupManager}
groupMembers={groupParams.groupMembers} groupMembers={groupParams.groupMembers}
setGroupMembers={setGroupMembers} setGroupMembers={setGroupMembers}
onShowSelectMembersPanel={onShowSelectMembersPanel} onShowSelectGroupManagerPanel={onShowSelectGroupManagerPanel}
/> />
)} {!isFetchMembersLoading && (
</ModalDialog.Body> <MembersParam
groupManager={groupParams.groupManager}
groupMembers={groupParams.groupMembers}
setGroupMembers={setGroupMembers}
onShowSelectMembersPanel={onShowSelectMembersPanel}
/>
)}
</ModalDialog.Body>
<ModalDialog.Footer> <ModalDialog.Footer>
<Button <Button
id="edit-group-modal_submit" id="edit-group-modal_submit"
tabIndex={5} tabIndex={5}
label={t("Common:SaveButton")} label={t("Common:SaveButton")}
size="normal" size="normal"
primary primary
scale scale
onClick={onEditGroup} onClick={onEditGroup}
isDisabled={notEnoughGroupParamsToEdit || groupParamsNotChanged} isDisabled={notEnoughGroupParamsToEdit || groupParamsNotChanged}
isLoading={isCreateGroupLoading} isLoading={isCreateGroupLoading}
/>
<Button
id="edit-group-modal_cancel"
tabIndex={5}
label={t("Common:CancelButton")}
size="normal"
scale
isDisabled={isCreateGroupLoading}
onClick={onClose}
/>
</ModalDialog.Footer>
</ModalDialog>
{selectGroupMangerPanelIsVisible && (
<SelectGroupManagerPanel
isVisible={selectGroupMangerPanelIsVisible}
onClose={onHideSelectGroupManagerPanel}
onParentPanelClose={onClose}
setGroupManager={setGroupManager}
/> />
<Button )}
id="edit-group-modal_cancel"
tabIndex={5} {selectMembersPanelIsVisible && (
label={t("Common:CancelButton")} <SelectGroupMembersPanel
size="normal" isVisible={selectMembersPanelIsVisible}
scale onClose={onHideSelectMembersPanel}
isDisabled={isCreateGroupLoading} onParentPanelClose={onClose}
onClick={onClose} groupManager={groupParams.groupManager}
groupMembers={groupParams.groupMembers}
setGroupMembers={setGroupMembers}
/> />
</ModalDialog.Footer> )}
</ModalDialog> </>
); );
}; };

View File

@ -59,8 +59,10 @@ const SelectGroupManagerPanel = ({
onParentPanelClose={onParentPanelClose} onParentPanelClose={onParentPanelClose}
setDataItems={onSelectGroupManager} setDataItems={onSelectGroupManager}
accessOptions={accessOptions} accessOptions={accessOptions}
isEncrypted={true} isEncrypted
defaultAccess={ShareAccessRights.FullAccess} defaultAccess={ShareAccessRights.FullAccess}
withoutBackground
withBlur={false}
/> />
} }
/> />

View File

@ -84,6 +84,8 @@ const SelectGroupMembersPanel = ({
withAccessRights={false} withAccessRights={false}
isEncrypted isEncrypted
defaultAccess={ShareAccessRights.FullAccess} defaultAccess={ShareAccessRights.FullAccess}
withoutBackground
withBlur={false}
/> />
} }
/> />

View File

@ -1798,6 +1798,14 @@ class ContextOptionsStore {
isSeparator: true, isSeparator: true,
disabled: !deleteItems || isRootThirdPartyFolder, disabled: !deleteItems || isRootThirdPartyFolder,
}, },
{
key: "remove-from-recent",
label: t("RemoveFromList"),
icon: RemoveOutlineSvgUrl,
onClick: () =>
this.filesActionsStore.onClickRemoveFromRecent(selection),
disabled: !this.treeFoldersStore.isRecentTab,
},
{ {
key: "delete", key: "delete",
label: t("Common:Delete"), label: t("Common:Delete"),

View File

@ -28,6 +28,10 @@
const path = require("path"); const path = require("path");
const pkg = require("./package.json"); const pkg = require("./package.json");
const BannerPlugin = require("webpack").BannerPlugin;
const TerserPlugin = require("terser-webpack-plugin");
const version = pkg.version;
const nextConfig = { const nextConfig = {
basePath: "/doceditor", basePath: "/doceditor",
@ -56,8 +60,52 @@ const nextConfig = {
}, },
}; };
const getBuildDate = () => {
const timeElapsed = Date.now();
const today = new Date(timeElapsed);
return JSON.stringify(today.toISOString().split(".")[0] + "Z");
};
const getBuildYear = () => {
const timeElapsed = Date.now();
const today = new Date(timeElapsed);
return today.getFullYear();
};
module.exports = { module.exports = {
webpack(config) { webpack(config) {
config.devtool = "source-map";
if (config.mode === "production") {
config.optimization = {
splitChunks: { chunks: "all" },
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
format: {
comments: /\*\s*\(c\)\s+Copyright\s+Ascensio\s+System\s+SIA/i,
},
},
extractComments: false,
}),
],
};
config.plugins.push(
new BannerPlugin({
raw: true,
banner: `/*
* (c) Copyright Ascensio System SIA 2009-${getBuildYear()}. All rights reserved
*
* https://www.onlyoffice.com/
*
* Version: ${version} (build: ${getBuildDate()})
*/`,
}),
);
}
// Grab the existing rule that handles SVG imports // Grab the existing rule that handles SVG imports
const fileLoaderRule = config.module.rules.find((rule) => const fileLoaderRule = config.module.rules.find((rule) =>
rule.test?.test?.(".svg"), rule.test?.test?.(".svg"),

View File

@ -122,7 +122,7 @@ const template: Template = (
const page = ` const page = `
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" translate="no">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title> ${documentTitle} </title> <title> ${documentTitle} </title>
@ -132,6 +132,7 @@ const template: Template = (
content="width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no, viewport-fit=cover" content="width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no, viewport-fit=cover"
/> />
<meta name="theme-color" content="#000000" /> <meta name="theme-color" content="#000000" />
<meta name="google" content="notranslate" />
<link rel="stylesheet preload" href=${fontsCssUrl} as="style" type="text/css" crossorigin/> <link rel="stylesheet preload" href=${fontsCssUrl} as="style" type="text/css" crossorigin/>
<link id="favicon" rel="shortcut icon" href=${favicon} /> <link id="favicon" rel="shortcut icon" href=${favicon} />

View File

@ -34,6 +34,7 @@ const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const ExternalTemplateRemotesPlugin = require("external-remotes-plugin"); const ExternalTemplateRemotesPlugin = require("external-remotes-plugin");
const CopyPlugin = require("copy-webpack-plugin"); const CopyPlugin = require("copy-webpack-plugin");
const TerserPlugin = require("terser-webpack-plugin"); const TerserPlugin = require("terser-webpack-plugin");
const BannerPlugin = require("webpack").BannerPlugin;
const minifyJson = require("@docspace/shared/utils/minifyJson"); const minifyJson = require("@docspace/shared/utils/minifyJson");
const sharedDeps = require("@docspace/shared/constants/sharedDependencies"); const sharedDeps = require("@docspace/shared/constants/sharedDependencies");
@ -42,6 +43,7 @@ const baseConfig = require("./webpack.base.js");
const runtime = require("../../runtime.json"); const runtime = require("../../runtime.json");
const pkg = require("../package.json"); const pkg = require("../package.json");
const deps = pkg.dependencies || {}; const deps = pkg.dependencies || {};
const version = pkg.version;
const dateHash = runtime?.date || ""; const dateHash = runtime?.date || "";
for (let dep in sharedDeps) { for (let dep in sharedDeps) {
@ -169,13 +171,35 @@ const clientConfig = {
], ],
}; };
const getBuildDate = () => {
const timeElapsed = Date.now();
const today = new Date(timeElapsed);
return JSON.stringify(today.toISOString().split(".")[0] + "Z");
};
const getBuildYear = () => {
const timeElapsed = Date.now();
const today = new Date(timeElapsed);
return today.getFullYear();
};
module.exports = (env, argv) => { module.exports = (env, argv) => {
if (argv.mode === "production") { if (argv.mode === "production") {
clientConfig.devtool = "source-map";
clientConfig.mode = "production"; clientConfig.mode = "production";
clientConfig.optimization = { clientConfig.optimization = {
splitChunks: { chunks: "all" }, splitChunks: { chunks: "all" },
minimize: !env.minimize, minimize: !env.minimize,
minimizer: [new TerserPlugin()], minimizer: [
new TerserPlugin({
terserOptions: {
format: {
comments: /\*\s*\(c\)\s+Copyright\s+Ascensio\s+System\s+SIA/i,
},
},
extractComments: false,
}),
],
}; };
} else { } else {
clientConfig.mode = "development"; clientConfig.mode = "development";
@ -200,6 +224,16 @@ module.exports = (env, argv) => {
}` }`
), ),
}), }),
new BannerPlugin({
raw: true,
banner: `/*
* (c) Copyright Ascensio System SIA 2009-${getBuildYear()}. All rights reserved
*
* https://www.onlyoffice.com/
*
* Version: ${version} (build: ${getBuildDate()})
*/`,
}),
]; ];
return merge(baseConfig, clientConfig); return merge(baseConfig, clientConfig);

View File

@ -146,6 +146,16 @@ const SubMenu = (props: {
if (subMenuRef.current) { if (subMenuRef.current) {
subMenuRef.current.style.top = "0px"; subMenuRef.current.style.top = "0px";
const submenuRects = subMenuRef.current.getBoundingClientRect();
if (submenuRects.bottom > viewport.height) {
const submenuMargin = 16;
const topOffset = submenuRects.bottom - viewport.height + submenuMargin;
subMenuRef.current.style.top = `${-1 * topOffset}px`;
}
if (isRtl) { if (isRtl) {
if (subListWidth < parseInt(`${containerOffset.left}`, 10)) { if (subListWidth < parseInt(`${containerOffset.left}`, 10)) {
subMenuRef.current.style.left = `${-1 * subListWidth}px`; subMenuRef.current.style.left = `${-1 * subListWidth}px`;

View File

@ -427,11 +427,11 @@ const FilterBlock = ({
const isEqualFilter = () => { const isEqualFilter = () => {
let isEqual = true; let isEqual = true;
if ( // if (
filterValues.length === 0 || // filterValues.length === 0 ||
selectedFilterValue.length > filterValues.length // selectedFilterValue.length > filterValues.length
) // )
return !isEqual; // return !isEqual;
if ( if (
(selectedFilterValue.length === 0 && filterValues.length > 0) || (selectedFilterValue.length === 0 && filterValues.length > 0) ||
@ -477,7 +477,7 @@ const FilterBlock = ({
return !isEqual; return !isEqual;
}; };
const showFooter = isEqualFilter(); const showFooter = isLoading ? false : isEqualFilter();
const filterBlockComponent = ( const filterBlockComponent = (
<> <>