Web: Files: Fix canShare

This commit is contained in:
Alexey Safronov 2021-08-11 14:58:52 +03:00
parent 1d4cabe5b9
commit 3ce5c1eb2d
3 changed files with 226 additions and 18 deletions

View File

@ -7,6 +7,7 @@ import { FileAction, AppServerConfig } from "@appserver/common/constants";
import toastr from "studio/toastr";
import config from "../../package.json";
import { canShare } from "../helpers/utils";
export default function withContextOptions(WrappedComponent) {
class WithContextOptions extends React.Component {
@ -225,9 +226,29 @@ export default function withContextOptions(WrappedComponent) {
};
getFilesContextOptions = () => {
const { item, t, isThirdPartyFolder } = this.props;
const { access, contextOptions } = item;
const isSharable = access !== 1 && access !== 0;
const {
item,
t,
isThirdPartyFolder,
currentFolderId,
currentFolderAccess,
isDesktop,
isPersonal,
user,
isAdmin,
} = this.props;
const { contextOptions } = item;
const isShareable = canShare(
item,
currentFolderId,
currentFolderAccess,
user,
isAdmin,
isDesktop,
isPersonal
);
return contextOptions.map((option) => {
switch (option) {
case "open":
@ -291,7 +312,7 @@ export default function withContextOptions(WrappedComponent) {
label: t("SharingSettings"),
icon: "images/catalog.shared.react.svg",
onClick: this.onClickShare,
disabled: isSharable,
disabled: !isShareable,
};
case "send-by-email":
return {
@ -509,11 +530,17 @@ export default function withContextOptions(WrappedComponent) {
setDeleteDialogVisible,
setUnsubscribe,
} = dialogsStore;
const { isTabletView, isDesktopClient } = auth.settingsStore;
const { isTabletView, isDesktopClient, personal } = auth.settingsStore;
const { isAdmin } = auth;
const { user } = auth.userStore;
const { setIsVerHistoryPanel, fetchFileVersions } = versionHistoryStore;
const { setAction, type, extension, id } = fileActionStore;
const { setMediaViewerData } = mediaViewerDataStore;
const { isRootFolder } = selectedFolderStore;
const {
isRootFolder,
id: currentFolderId,
access: currentFolderAccess,
} = selectedFolderStore;
const { isRecycleBinFolder, isShare } = treeFoldersStore;
const isThirdPartyFolder = item.providerKey && isRootFolder;
@ -554,6 +581,11 @@ export default function withContextOptions(WrappedComponent) {
setDeleteDialogVisible,
setUnsubscribe,
isDesktop: isDesktopClient,
currentFolderId,
currentFolderAccess,
isPersonal: personal,
user,
isAdmin,
};
}
)(observer(WithContextOptions));

View File

@ -11,6 +11,7 @@ import { checkProtocol, createTreeFolders } from "../helpers/files-helpers";
import { AppServerConfig } from "@appserver/common/constants";
import { combineUrl } from "@appserver/common/utils";
import config from "../../package.json";
import { canShare } from "../helpers/utils";
const svgLoader = () => <div style={{ width: "24px" }}></div>;
export default function withFileActions(WrappedFileItem) {
@ -256,7 +257,7 @@ export default function withFileActions(WrappedFileItem) {
item,
isTrashFolder,
draggable,
canShare,
//canShare,
isPrivacy,
actionType,
actionExtension,
@ -268,6 +269,11 @@ export default function withFileActions(WrappedFileItem) {
isDesktop,
personal,
canWebEdit,
canViewedDocs,
currentFolderId,
currentFolderAccess,
user,
isAdmin,
} = this.props;
const { fileExst, access, contentLength, id, shared } = item;
@ -282,19 +288,29 @@ export default function withFileActions(WrappedFileItem) {
let value = fileExst || contentLength ? `file_${id}` : `folder_${id}`;
value += draggable ? "_draggable" : "";
const isShareable = canShare(
item,
currentFolderId,
currentFolderAccess,
user,
isAdmin,
isDesktop,
personal
);
const isMobile = sectionWidth < 500;
const displayShareButton = isMobile
? "26px"
: !canShare
: !isShareable
? "38px"
: "96px";
const showShare = isPrivacy && (!isDesktop || !fileExst) ? false : true;
//const showShare = isPrivacy && (!isDesktop || !fileExst) ? false : true;
const sharedButton =
!canShare ||
!showShare ||
(personal && !canWebEdit) ||
!isShareable ||
//!showShare ||
(personal && !canWebEdit && !canViewedDocs) ||
isEdit ||
id <= 0 ||
isMobile
@ -358,7 +374,11 @@ export default function withFileActions(WrappedFileItem) {
addExpandedKeys,
setExpandedKeys,
} = treeFoldersStore;
const { isRootFolder } = selectedFolderStore;
const {
isRootFolder,
id: currentFolderId,
access: currentFolderAccess,
} = selectedFolderStore;
const {
dragging,
setDragging,
@ -366,7 +386,7 @@ export default function withFileActions(WrappedFileItem) {
setTooltipPosition,
setStartDrag,
fileActionStore,
canShare,
//canShare,
isFileSelected,
filter,
setIsLoading,
@ -403,6 +423,9 @@ export default function withFileActions(WrappedFileItem) {
const canWebEdit = docserviceStore.canWebEdit(item.fileExst);
const canConvert = docserviceStore.canConvert(item.fileExst);
const { isAdmin } = auth;
const { user } = auth.userStore;
return {
t,
item,
@ -446,6 +469,10 @@ export default function withFileActions(WrappedFileItem) {
setConvertDialogVisible,
isDesktop: auth.settingsStore.isDesktopClient,
personal: auth.settingsStore.personal,
currentFolderId,
currentFolderAccess,
user,
isAdmin,
};
}
)(observer(WithFileActions));

View File

@ -1,11 +1,15 @@
import authStore from "@appserver/common/store/AuthStore";
import { AppServerConfig } from "@appserver/common/constants";
import {
AppServerConfig,
FolderType,
ShareAccessRights,
} from "@appserver/common/constants";
import config from "../../package.json";
import { combineUrl } from "@appserver/common/utils";
import {
addFileToRecentlyViewed,
} from "@appserver/common/api/files";
import { addFileToRecentlyViewed } from "@appserver/common/api/files";
import i18n from "./i18n";
import { canViewedDocs } from "../store/DocserviceStore";
export const setDocumentTitle = (subTitle = null) => {
const { isAuthenticated, settingsStore, product: currentModule } = authStore;
const { organizationName } = settingsStore;
@ -69,3 +73,148 @@ export const openDocEditor = async (
tab ? (tab.location = url) : window.open(url, "_blank")
);
};
export const accessEdit = (
entryData,
currentFolderId,
currentFolderAccess,
user,
isAdmin,
isDesktop,
restrictedEditing
) => {
if (!entryData) throw "entryData is undefined";
if (user.isOutsider) return false;
if (entryData.isFolder) {
if (entryData.id == FolderType.COMMON && !isAdmin) {
return false;
}
if (entryData.id == FolderType.SHARE) {
return false;
}
if (entryData.id == FolderType.Recent) {
return false;
}
if (entryData.id == FolderType.Favorites) {
return false;
}
if (entryData.id == FolderType.Templates) {
return false;
}
if (entryData.id == FolderType.TRASH) {
return false;
}
if (entryData.id == FolderType.Projects) {
return false;
}
if (!isDesktop && entryData.rootFolderType == FolderType.Privacy) {
return false;
}
}
var curAccess = entryData.access;
if (
entryData.isFolder &&
currentFolderId &&
currentFolderAccess &&
entryData.id == currentFolderId
) {
curAccess = currentFolderAccess;
}
switch (curAccess) {
case ShareAccessRights.None:
case ShareAccessRights.FullAccess:
return true;
case ShareAccessRights.ReadOnly:
case ShareAccessRights.DenyAccess:
return false;
case ShareAccessRights.CustomFilter:
case ShareAccessRights.Review:
case ShareAccessRights.FormFilling:
case ShareAccessRights.Comment:
return !!restrictedEditing;
default:
if (
entryData.isFolder &&
(entryData.id === FolderType.SHARE ||
entryData.id === FolderType.Recent ||
entryData.id === FolderType.Favorites ||
entryData.id === FolderType.Templates ||
entryData.id === FolderType.Projects ||
entryData.id === FolderType.TRASH)
) {
return false;
}
return isAdmin || entryData.createdBy == user.id;
}
};
export const canShare = (
entryData,
currentFolderId,
currentFolderAccess,
user,
isAdmin,
isDesktop,
isPersonal
) => {
let isShareable = true;
if (!entryData.isFolder) {
if (
entryData.encrypted &&
(entryData.rootFolderType != FolderType.Privacy ||
!isDesktop ||
//!ASC.Desktop.encryptionSupport() ||
isPersonal)
) {
isShareable = false;
} else if (isPersonal && !canViewedDocs(entryData.fileExst)) {
isShareable = false;
}
}
if (
isShareable &&
((entryData.rootFolderType == FolderType.SHARE &&
!accessEdit(
entryData,
currentFolderId,
currentFolderAccess,
user,
isAdmin,
isDesktop
)) ||
(entryData.rootFolderType == FolderType.Privacy &&
(entryData.isFolder ||
!accessEdit(
entryData,
currentFolderId,
currentFolderAccess,
user,
isAdmin,
isDesktop
))) ||
(isPersonal && entryData.isFolder) ||
user.isVisitor)
) {
isShareable = false;
}
//console.log("entry", entryData, "isShareable", isShareable);
return isShareable;
};