Merge branch 'develop' of github.com:ONLYOFFICE/AppServer into develop
This commit is contained in:
commit
754759131f
@ -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) => {
|
||||||
|
@ -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"
|
||||||
}
|
}
|
||||||
|
@ -12,5 +12,6 @@
|
|||||||
"QuestionDeleteFolder": "Вы собираетесь удалить эту папку?",
|
"QuestionDeleteFolder": "Вы собираетесь удалить эту папку?",
|
||||||
"QuestionDeleteElements": "Вы собираетесь удалить эти элементы?",
|
"QuestionDeleteElements": "Вы собираетесь удалить эти элементы?",
|
||||||
"DeleteOperation": "Удаление",
|
"DeleteOperation": "Удаление",
|
||||||
"DeleteSelectedElem": "Выбранные элементы успешно удалены"
|
"DeleteSelectedElem": "Выбранные элементы успешно удалены",
|
||||||
|
"DeleteFromTrash": "Выбранные элементы успешно удалены из корзины"
|
||||||
}
|
}
|
||||||
|
@ -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) => {
|
||||||
|
@ -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"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,5 +5,6 @@
|
|||||||
|
|
||||||
"EmptyTrashDialogQuestion": "Вы уверены, что хотите очистить корзину?",
|
"EmptyTrashDialogQuestion": "Вы уверены, что хотите очистить корзину?",
|
||||||
"EmptyTrashDialogMessage": "Замечание: Это действие не может быть отменено.",
|
"EmptyTrashDialogMessage": "Замечание: Это действие не может быть отменено.",
|
||||||
"DeleteOperation": "Удаление"
|
"DeleteOperation": "Удаление",
|
||||||
|
"SuccessEmptyTrash": "Корзина успешно очищена"
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
@ -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) => {
|
||||||
this.setState({ showDeleteDialog: !this.state.showDeleteDialog });
|
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 });
|
||||||
|
} 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)));
|
||||||
|
@ -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"
|
||||||
}
|
}
|
||||||
|
@ -125,5 +125,7 @@
|
|||||||
"EncryptedFileCreating": "Создан новый файл <strong>{{itemTitle}}</strong>",
|
"EncryptedFileCreating": "Создан новый файл <strong>{{itemTitle}}</strong>",
|
||||||
"DeleteThirdParty": "Отключить сторонний ресурс",
|
"DeleteThirdParty": "Отключить сторонний ресурс",
|
||||||
"ThirdPartyInfo": "Изменить настройки подключения",
|
"ThirdPartyInfo": "Изменить настройки подключения",
|
||||||
"EmptyFile": "Пустой файл"
|
"EmptyFile": "Пустой файл",
|
||||||
|
"DeleteSelectedElem": "Выбранные элементы успешно удалены",
|
||||||
|
"DeleteFromTrash": "Выбранные элементы успешно удалены из корзины"
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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"
|
||||||
|
@ -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}
|
||||||
|
@ -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"
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user