Merge branch 'develop' of github.com:ONLYOFFICE/AppServer into develop

This commit is contained in:
Ilya Oleshko 2021-02-03 21:14:29 +03:00
commit 754759131f
15 changed files with 183 additions and 22 deletions

View File

@ -83,7 +83,9 @@ class DeleteDialogComponent extends React.Component {
fetchFiles, fetchFiles,
setUpdateTree, setUpdateTree,
} = this.props; } = this.props;
const successMessage = t("DeleteSelectedElem"); const successMessage = isRecycleBinFolder
? t("DeleteFromTrash")
: t("DeleteSelectedElem");
api.files api.files
.getProgress() .getProgress()
.then((res) => { .then((res) => {

View File

@ -11,5 +11,6 @@
"QuestionDeleteFolder": "Are you sure you want to delete this folder?", "QuestionDeleteFolder": "Are you sure you want to delete this folder?",
"QuestionDeleteElements": "Are you sure you want to delete these elements?", "QuestionDeleteElements": "Are you sure you want to delete these elements?",
"DeleteOperation": "Deleting", "DeleteOperation": "Deleting",
"DeleteSelectedElem": "Selected elements were successfully deleted" "DeleteSelectedElem": "Selected elements were successfully deleted",
"DeleteFromTrash": "Selected elements were successfully deleted from trash"
} }

View File

@ -12,5 +12,6 @@
"QuestionDeleteFolder": "Вы собираетесь удалить эту папку?", "QuestionDeleteFolder": "Вы собираетесь удалить эту папку?",
"QuestionDeleteElements": "Вы собираетесь удалить эти элементы?", "QuestionDeleteElements": "Вы собираетесь удалить эти элементы?",
"DeleteOperation": "Удаление", "DeleteOperation": "Удаление",
"DeleteSelectedElem": "Выбранные элементы успешно удалены" "DeleteSelectedElem": "Выбранные элементы успешно удалены",
"DeleteFromTrash": "Выбранные элементы успешно удалены из корзины"
} }

View File

@ -45,7 +45,7 @@ const EmptyTrashDialogComponent = (props) => {
const loopEmptyTrash = useCallback( const loopEmptyTrash = useCallback(
(id) => { (id) => {
const successMessage = "Success empty recycle bin"; const successMessage = t("SuccessEmptyTrash");
api.files api.files
.getProgress() .getProgress()
.then((res) => { .then((res) => {

View File

@ -5,5 +5,7 @@
"EmptyTrashDialogQuestion": "Are you sure you want to empty the recycle bin?", "EmptyTrashDialogQuestion": "Are you sure you want to empty the recycle bin?",
"EmptyTrashDialogMessage": "Note: This action can not be undone. Note: removal from your account can not be undone.", "EmptyTrashDialogMessage": "Note: This action can not be undone. Note: removal from your account can not be undone.",
"DeleteOperation": "Deleting" "DeleteOperation": "Deleting",
"SuccessEmptyTrash": "Success empty recycle bin"
} }

View File

@ -5,5 +5,6 @@
"EmptyTrashDialogQuestion": "Вы уверены, что хотите очистить корзину?", "EmptyTrashDialogQuestion": "Вы уверены, что хотите очистить корзину?",
"EmptyTrashDialogMessage": "Замечание: Это действие не может быть отменено.", "EmptyTrashDialogMessage": "Замечание: Это действие не может быть отменено.",
"DeleteOperation": "Удаление" "DeleteOperation": "Удаление",
"SuccessEmptyTrash": "Корзина успешно очищена"
} }

View File

@ -53,7 +53,7 @@ import EditingWrapperComponent from "./EditingWrapperComponent";
import { isMobile } from "react-device-detect"; import { isMobile } from "react-device-detect";
import { setEncryptionAccess } from "../../../../../helpers/desktop"; import { setEncryptionAccess } from "../../../../../helpers/desktop";
const { FileAction } = constants; const { FileAction, ShareAccessRights } = constants;
const sideColor = "#A3A9AE"; const sideColor = "#A3A9AE";
const { getSettings, isDesktopClient } = initStore.auth.selectors; const { getSettings, isDesktopClient } = initStore.auth.selectors;
const { getEncryptionAccess, replaceFileStream } = initStore.auth.actions; const { getEncryptionAccess, replaceFileStream } = initStore.auth.actions;
@ -534,6 +534,9 @@ class FilesRowContent extends React.PureComponent {
createdBy.displayName); createdBy.displayName);
const updatedDate = updated && this.getStatusByDate(); const updatedDate = updated && this.getStatusByDate();
const accessToEdit =
item.access === ShareAccessRights.FullAccess ||
item.access === ShareAccessRights.None; // TODO: fix access type for owner (now - None)
const isEdit = id === editingId && fileExst === fileAction.extension; const isEdit = id === editingId && fileExst === fileAction.extension;
const linkStyles = const linkStyles =
isTrashFolder || window.innerWidth <= 1024 isTrashFolder || window.innerWidth <= 1024
@ -614,7 +617,7 @@ class FilesRowContent extends React.PureComponent {
hoverColor="#3B72A7" hoverColor="#3B72A7"
/> />
)} */} )} */}
{canWebEdit && !isTrashFolder && ( {canWebEdit && !isTrashFolder && accessToEdit && (
<IconButton <IconButton
onClick={this.onFilesClick} onClick={this.onFilesClick}
iconName="AccessEditIcon" iconName="AccessEditIcon"

View File

@ -28,6 +28,8 @@ import {
setIsLoading, setIsLoading,
setSelected, setSelected,
setSharingPanelVisible, setSharingPanelVisible,
setTreeFolders,
setUpdateTree,
} from "../../../../../store/files/actions"; } from "../../../../../store/files/actions";
import { TIMEOUT } from "../../../../../helpers/constants"; import { TIMEOUT } from "../../../../../helpers/constants";
import { import {
@ -56,8 +58,13 @@ import {
getIsThirdPartySelection, getIsThirdPartySelection,
getIsPrivacyFolder, getIsPrivacyFolder,
getOnlyFoldersSelected, getOnlyFoldersSelected,
getSettingsTreeConfirmDelete,
loopTreeFolders,
getTreeFolders,
} from "../../../../../store/files/selectors"; } from "../../../../../store/files/selectors";
const { files } = api;
const { isAdmin, isDesktopClient, getIsTabletView } = store.auth.selectors; const { isAdmin, isDesktopClient, getIsTabletView } = store.auth.selectors;
const { FilterType, FileAction } = constants; const { FilterType, FileAction } = constants;
const { tablet, desktop } = utils.device; const { tablet, desktop } = utils.device;
@ -356,8 +363,128 @@ class SectionHeaderContent extends React.Component {
onOpenSharingPanel = () => onOpenSharingPanel = () =>
this.props.setSharingPanelVisible(!this.props.sharingPanelVisible); this.props.setSharingPanelVisible(!this.props.sharingPanelVisible);
onDeleteAction = () => loopDeleteOperation = (id) => {
const {
currentFolderId,
filter,
treeFolders,
setTreeFolders,
isRecycleBin,
setSecondaryProgressBarData,
clearSecondaryProgressData,
t,
fetchFiles,
setUpdateTree,
} = this.props;
const successMessage = isRecycleBin
? t("DeleteFromTrash")
: t("DeleteSelectedElem");
api.files
.getProgress()
.then((res) => {
const currentProcess = res.find((x) => x.id === id);
if (currentProcess && currentProcess.progress !== 100) {
setSecondaryProgressBarData({
icon: "trash",
percent: currentProcess.progress,
label: t("DeleteOperation"),
visible: true,
alert: false,
});
setTimeout(() => this.loopDeleteOperation(id), 1000);
} else {
setSecondaryProgressBarData({
icon: "trash",
percent: 100,
label: t("DeleteOperation"),
visible: true,
alert: false,
});
setTimeout(() => clearSecondaryProgressData(), TIMEOUT);
fetchFiles(currentFolderId, filter).then((data) => {
if (!isRecycleBin) {
const path = data.selectedFolder.pathParts.slice(0);
const newTreeFolders = treeFolders;
const folders = data.selectedFolder.folders;
const foldersCount = data.selectedFolder.foldersCount;
loopTreeFolders(path, newTreeFolders, folders, foldersCount);
setUpdateTree(true);
setTreeFolders(newTreeFolders);
}
toastr.success(successMessage);
});
}
})
.catch((err) => {
setSecondaryProgressBarData({
visible: true,
alert: true,
});
//toastr.error(err);
setTimeout(() => clearSecondaryProgressData(), TIMEOUT);
});
};
onDelete = () => {
const {
isRecycleBin,
isPrivacy,
t,
setSecondaryProgressBarData,
clearSecondaryProgressData,
selection,
} = this.props;
const deleteAfter = true; //Delete after finished
const immediately = isRecycleBin || isPrivacy ? true : false; //Don't move to the Recycle Bin
const folderIds = [];
const fileIds = [];
let i = 0;
while (selection.length !== i) {
if (selection[i].fileExst) {
fileIds.push(selection[i].id);
} else {
folderIds.push(selection[i].id);
}
i++;
}
if (folderIds.length || fileIds.length) {
setSecondaryProgressBarData({
icon: "trash",
visible: true,
label: t("DeleteOperation"),
percent: 0,
alert: false,
});
files
.removeFiles(folderIds, fileIds, deleteAfter, immediately)
.then((res) => {
const id = res[0] && res[0].id ? res[0].id : null;
this.loopDeleteOperation(id);
})
.catch((err) => {
setSecondaryProgressBarData({
visible: true,
alert: true,
});
//toastr.error(err);
setTimeout(() => clearSecondaryProgressData(), TIMEOUT);
});
}
};
onDeleteAction = () => {
//console.log(this.props.confirmDelete);
if (this.props.confirmDelete) {
this.setState({ showDeleteDialog: !this.state.showDeleteDialog }); this.setState({ showDeleteDialog: !this.state.showDeleteDialog });
} else {
this.onDelete();
}
};
onEmptyTrashAction = () => onEmptyTrashAction = () =>
this.setState({ showEmptyTrashDialog: !this.state.showEmptyTrashDialog }); this.setState({ showEmptyTrashDialog: !this.state.showEmptyTrashDialog });
@ -744,6 +871,8 @@ const mapStateToProps = (state) => {
isThirdPartySelection: getIsThirdPartySelection(state), isThirdPartySelection: getIsThirdPartySelection(state),
isOnlyFoldersSelected: getOnlyFoldersSelected(state), isOnlyFoldersSelected: getOnlyFoldersSelected(state),
isTabletView: getIsTabletView(state), isTabletView: getIsTabletView(state),
confirmDelete: getSettingsTreeConfirmDelete(state),
treeFolders: getTreeFolders(state),
}; };
}; };
@ -755,4 +884,6 @@ export default connect(mapStateToProps, {
fetchFiles, fetchFiles,
setSelected, setSelected,
setSharingPanelVisible, setSharingPanelVisible,
setTreeFolders,
setUpdateTree,
})(withTranslation()(withRouter(SectionHeaderContent))); })(withTranslation()(withRouter(SectionHeaderContent)));

View File

@ -125,5 +125,7 @@
"EncryptedFileCreating": "File <strong>{{itemTitle}}</strong> successfully created", "EncryptedFileCreating": "File <strong>{{itemTitle}}</strong> successfully created",
"DeleteThirdParty": "Delete third party", "DeleteThirdParty": "Delete third party",
"ThirdPartyInfo": "Change the third party info", "ThirdPartyInfo": "Change the third party info",
"EmptyFile": "Empty file" "EmptyFile": "Empty file",
"DeleteSelectedElem": "Selected elements were successfully deleted",
"DeleteFromTrash": "Selected elements were successfully deleted from trash"
} }

View File

@ -125,5 +125,7 @@
"EncryptedFileCreating": "Создан новый файл <strong>{{itemTitle}}</strong>", "EncryptedFileCreating": "Создан новый файл <strong>{{itemTitle}}</strong>",
"DeleteThirdParty": "Отключить сторонний ресурс", "DeleteThirdParty": "Отключить сторонний ресурс",
"ThirdPartyInfo": "Изменить настройки подключения", "ThirdPartyInfo": "Изменить настройки подключения",
"EmptyFile": "Пустой файл" "EmptyFile": "Пустой файл",
"DeleteSelectedElem": "Выбранные элементы успешно удалены",
"DeleteFromTrash": "Выбранные элементы успешно удалены из корзины"
} }

View File

@ -148,6 +148,7 @@ class AddGroupsPanelComponent extends React.Component {
<StyledBody ref={this.scrollRef}> <StyledBody ref={this.scrollRef}>
<GroupSelector <GroupSelector
className="groupSelector"
isOpen={visible} isOpen={visible}
isMultiSelect isMultiSelect
displayType="aside" displayType="aside"
@ -160,6 +161,7 @@ class AddGroupsPanelComponent extends React.Component {
directionX="right" directionX="right"
onAccessChange={this.onAccessChange} onAccessChange={this.onAccessChange}
accessOptions={accessOptions} accessOptions={accessOptions}
arrowIconColor="#000000"
/> />
} }
showCounter showCounter

View File

@ -140,6 +140,7 @@ class AddUsersPanelComponent extends React.Component {
directionX="right" directionX="right"
onAccessChange={this.onAccessChange} onAccessChange={this.onAccessChange}
accessOptions={accessOptions} accessOptions={accessOptions}
arrowIconColor="#000000"
/> />
), ),
} }
@ -180,6 +181,7 @@ class AddUsersPanelComponent extends React.Component {
<StyledBody ref={this.scrollRef}> <StyledBody ref={this.scrollRef}>
<PeopleSelector <PeopleSelector
className="peopleSelector"
role={isMultiSelect ? null : "user"} role={isMultiSelect ? null : "user"}
employeeStatus={1} employeeStatus={1}
displayType="aside" displayType="aside"

View File

@ -14,6 +14,7 @@ const AccessComboBox = (props) => {
itemId, itemId,
onAccessChange, onAccessChange,
t, t,
arrowIconColor,
} = props; } = props;
const { const {
FullAccess, FullAccess,
@ -100,12 +101,15 @@ const AccessComboBox = (props) => {
); );
const accessIcon = getAccessIcon(access); const accessIcon = getAccessIcon(access);
const selectedOption = arrowIconColor
? { key: 0, arrowIconColor }
: { key: 0 };
return ( return (
<ComboBox <ComboBox
advancedOptions={advancedOptions} advancedOptions={advancedOptions}
options={[]} options={[]}
selectedOption={{ key: 0 }} selectedOption={selectedOption}
size="content" size="content"
className="panel_combo-box" className="panel_combo-box"
scaled={false} scaled={false}

View File

@ -47,9 +47,11 @@ class LinkRow extends React.Component {
isDisabled={isDisabled} isDisabled={isDisabled}
/> />
) : ( ) : (
<Icons.AccessEditIcon <Icons.InvitationLinkIcon
size="medium" size="medium"
className="sharing_panel-owner-icon" className="sharing_panel-owner-icon"
isfill={true}
color="#A3A9AE"
/> />
) )
} }

View File

@ -7,14 +7,7 @@ const PanelStyles = css`
.optionalBlock { .optionalBlock {
margin-right: 4px; margin-right: 4px;
} display: flex;
&.add-groups {
.combo-buttons_arrow-icon {
flex: 0 0 5px;
width: 5px;
margin-top: 16px;
}
} }
.combo-button { .combo-button {
@ -26,6 +19,19 @@ const PanelStyles = css`
} }
} }
.groupSelector,
.peopleSelector {
.combo-buttons_arrow-icon {
flex: 0 0 6px;
width: 6px;
margin-top: auto;
margin-bottom: auto;
display: flex;
justify-content: center;
align-items: center;
}
}
.footer { .footer {
padding: 16px 0; padding: 16px 0;
width: calc(100% - 32px); width: calc(100% - 32px);