Merge branch 'release/v1.2' into feature/smart-banner

This commit is contained in:
Alexey Safronov 2022-05-26 16:57:04 +03:00
commit dc7d837e46
26 changed files with 327 additions and 182 deletions

View File

@ -798,38 +798,66 @@
}, },
{ {
"Excludes": [ "Excludes": [
"A-Ω", "A-Ω",
"αδειάζοντάς", "αδειάζοντάς",
"Αζερική", "Αζερική",
"αναγνωσμένου", "αναγνωσμένου",
"αναγνωσμένων", "αναγνωσμένων",
"ανακατευθυνθείτε", "ανακατευθυνθείτε",
"αντιγράφηκαν", "αντιγράφηκαν",
"αντιγράφηκε", "αντιγράφηκε",
"Αντιγράφηκε", "Αντιγράφηκε",
"απενεργοποιημένοι", "απενεργοποιημένοι",
"Έκδ", "αποεπιλέξτε",
"επαληθευτή", "Αποθέστε",
"Επαληθευτής", "αυτοεγγραφή",
"Λαοτινή", "Έκδ",
"ΛΔΚ", "επαληθευτή",
"Λετονικά", "Επαληθευτής",
"λπ", "Επαναποστολή",
"Μεταφορτώθηκε", "Ξεκαρφίτσωμα",
"μεταφορτώνετε", "Λαοτινή",
"Ξεκαρφίτσωμα", "παρόχου",
"πάροχος", "ΛΔΚ",
"περιήγησής", "Λετονικά",
"προεπιλεγμένου", "λπ",
"Προεπισκόπηση", "ληγμένος",
"υποφάκελό", "πάροχος",
"υποφακέλους", "περιήγησής",
"ψήφιο", "προεπιλεγμένου",
"Ω-A", "Μεταφορτώθηκε",
"Desktop", "μεταφορτώνετε",
"Check-in", "Μεταφορτώθηκαν",
"Office", "mέλη",
"Enterprise" "Προεπισκόπηση",
"υποενότητα",
"υποφάκελό",
"υποφακέλους",
"ψήφιο",
"Ω-A",
"Check-in",
"Cloud",
"Desktop",
"domain",
"DOCXF",
"DropBox",
"com",
"Editors",
"Enterprise",
"GZ",
"Http",
"label",
"Linux",
"Mac",
"Nextcloud",
"Office",
"OS",
"PDF",
"SaaS",
"SSO",
"White",
"Play",
"Store"
], ],
"Language": "el" "Language": "el"
}, },
@ -1349,6 +1377,7 @@
"resetate", "resetate",
"SaaS", "SaaS",
"Saptamanal", "Saptamanal",
"servere",
"sînt", "sînt",
"SMS-ul", "SMS-ul",
"SSO", "SSO",

View File

@ -40,7 +40,6 @@ const Navigation = ({
isCurrentFolderInfo, isCurrentFolderInfo,
toggleInfoPanel, toggleInfoPanel,
isInfoPanelVisible, isInfoPanelVisible,
isShowRootFolder,
titles, titles,
...rest ...rest
}) => { }) => {
@ -190,7 +189,6 @@ const Navigation = ({
isRootFolder={isRootFolder} isRootFolder={isRootFolder}
toggleInfoPanel={toggleInfoPanel} toggleInfoPanel={toggleInfoPanel}
isInfoPanelVisible={isInfoPanelVisible} isInfoPanelVisible={isInfoPanelVisible}
isShowRootFolder={isShowRootFolder}
/> />
)} )}
</> </>

View File

@ -39,8 +39,7 @@ const StyledContainer = styled.div`
`; `;
const StyledInfoPanelToggleWrapper = styled.div` const StyledInfoPanelToggleWrapper = styled.div`
display: ${(props) => display: ${(props) => (props.isInfoPanelVisible ? "none" : "flex")};
props.isInfoPanelVisible && !props.isShowRootFolder ? "none" : "flex"};
align-items: center; align-items: center;
align-self: center; align-self: center;
@ -87,13 +86,11 @@ const ToggleInfoPanelButton = ({
isRootFolder, isRootFolder,
isInfoPanelVisible, isInfoPanelVisible,
toggleInfoPanel, toggleInfoPanel,
isShowRootFolder,
}) => { }) => {
return ( return (
<StyledInfoPanelToggleWrapper <StyledInfoPanelToggleWrapper
isRootFolder={isRootFolder} isRootFolder={isRootFolder}
isInfoPanelVisible={isInfoPanelVisible} isInfoPanelVisible={isInfoPanelVisible}
isShowRootFolder={isShowRootFolder}
> >
<div className="info-panel-toggle-bg"> <div className="info-panel-toggle-bg">
<IconButton <IconButton

View File

@ -133,22 +133,8 @@ const StyledCrossIcon = styled(CrossIcon)`
StyledCrossIcon.defaultProps = { theme: Base }; StyledCrossIcon.defaultProps = { theme: Base };
const InfoPanel = ({ const InfoPanel = ({ children, isVisible, setIsVisible, viewAs }) => {
children,
isVisible,
setIsVisible,
viewAs,
isRootFolder,
selectedItems,
isShowRootFolder,
setIsShowRootFolder,
}) => {
if (isRootFolder && selectedItems.length === 0) setIsShowRootFolder(true);
else setIsShowRootFolder(false);
if (!isVisible) return null; if (!isVisible) return null;
if (isShowRootFolder) return null;
const closeInfoPanel = () => setIsVisible(false); const closeInfoPanel = () => setIsVisible(false);
@ -196,44 +182,17 @@ StyledInfoPanelWrapper.defaultProps = { theme: Base };
StyledInfoPanel.defaultProps = { theme: Base }; StyledInfoPanel.defaultProps = { theme: Base };
InfoPanel.defaultProps = { theme: Base }; InfoPanel.defaultProps = { theme: Base };
export default inject(({ infoPanelStore, selectedFolderStore, filesStore }) => { export default inject(({ infoPanelStore }) => {
let isVisible = false, let isVisible = false;
isRootFolder = false, let setIsVisible = () => {};
setIsVisible = () => {},
selection = [],
bufferSelection = null,
isShowRootFolder = false,
setIsShowRootFolder = () => {};
if (infoPanelStore) { if (infoPanelStore) {
isVisible = infoPanelStore.isVisible; isVisible = infoPanelStore.isVisible;
setIsVisible = infoPanelStore.setIsVisible; setIsVisible = infoPanelStore.setIsVisible;
isShowRootFolder = infoPanelStore.isShowRootFolder;
setIsShowRootFolder = infoPanelStore.setIsShowRootFolder;
} }
if (selectedFolderStore) {
isRootFolder = selectedFolderStore.isRootFolder;
}
if (filesStore) {
selection = filesStore.selection;
bufferSelection = filesStore.bufferSelection;
}
const selectedItems =
selection?.length > 0
? [...selection]
: bufferSelection
? [bufferSelection]
: [];
return { return {
isVisible, isVisible,
setIsVisible, setIsVisible,
isRootFolder,
selectedItems,
isShowRootFolder,
setIsShowRootFolder,
}; };
})(InfoPanel); })(InfoPanel);

View File

@ -1,62 +1,67 @@
import React from "react"; import React, { useRef } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { StyledTextarea, StyledScrollbar } from "./styled-textarea"; import { StyledTextarea, StyledScrollbar } from "./styled-textarea";
// eslint-disable-next-line react/prop-types, no-unused-vars // eslint-disable-next-line react/prop-types, no-unused-vars
class Textarea extends React.PureComponent { const Textarea = ({
render() { className,
// console.log('Textarea render'); id,
const { isDisabled,
className, isReadOnly,
id, hasError,
isDisabled, heightScale,
isReadOnly, maxLength,
hasError, name,
heightScale, onChange,
maxLength, placeholder,
name, style,
onChange, tabIndex,
placeholder, value,
style, fontSize,
tabIndex, heightTextArea,
value, color,
fontSize, theme,
heightTextArea, autoFocus,
color, areaSelect,
theme, }) => {
autoFocus, const areaRef = useRef(null);
} = this.props;
return ( React.useEffect(() => {
<StyledScrollbar if (areaSelect && areaRef.current) {
className={className} areaRef.current.select();
style={style} }
stype="preMediumBlack" }, [areaRef.current]);
return (
<StyledScrollbar
className={className}
style={style}
stype="preMediumBlack"
isDisabled={isDisabled}
hasError={hasError}
heightScale={heightScale}
heighttextarea={heightTextArea}
>
<StyledTextarea
id={id}
placeholder={placeholder}
onChange={(e) => onChange && onChange(e)}
maxLength={maxLength}
name={name}
tabIndex={tabIndex}
isDisabled={isDisabled} isDisabled={isDisabled}
hasError={hasError} disabled={isDisabled}
heightScale={heightScale} readOnly={isReadOnly}
heighttextarea={heightTextArea} value={value}
> fontSize={fontSize}
<StyledTextarea color={color}
id={id} autoFocus={autoFocus}
placeholder={placeholder} ref={areaRef}
onChange={(e) => onChange && onChange(e)} />
maxLength={maxLength} </StyledScrollbar>
name={name} );
tabIndex={tabIndex} };
isDisabled={isDisabled}
disabled={isDisabled}
readOnly={isReadOnly}
value={value}
fontSize={fontSize}
color={color}
autoFocus={autoFocus}
/>
</StyledScrollbar>
);
}
}
Textarea.propTypes = { Textarea.propTypes = {
/** Class name */ /** Class name */
@ -92,6 +97,7 @@ Textarea.propTypes = {
/** Specifies the text color */ /** Specifies the text color */
color: PropTypes.string, color: PropTypes.string,
autoFocus: PropTypes.bool, autoFocus: PropTypes.bool,
areaSelect: PropTypes.bool,
}; };
Textarea.defaultProps = { Textarea.defaultProps = {
@ -105,6 +111,7 @@ Textarea.defaultProps = {
value: "", value: "",
fontSize: 13, fontSize: 13,
isAutoFocussed: false, isAutoFocussed: false,
areaSelect: false,
}; };
export default Textarea; export default Textarea;

View File

@ -40,13 +40,11 @@ StyledScrollbar.defaultProps = {
}; };
// eslint-disable-next-line react/prop-types, no-unused-vars // eslint-disable-next-line react/prop-types, no-unused-vars
const ClearTextareaAutosize = ({ const ClearTextareaAutosize = React.forwardRef(
isDisabled, ({ isDisabled, heightScale, hasError, color, ...props }, ref) => (
heightScale, <TextareaAutosize {...props} ref={ref} />
hasError, )
color, );
...props
}) => <TextareaAutosize {...props} />;
const StyledTextarea = styled(ClearTextareaAutosize).attrs((props) => ({ const StyledTextarea = styled(ClearTextareaAutosize).attrs((props) => ({
autoFocus: props.autoFocus, autoFocus: props.autoFocus,

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -76,7 +76,7 @@
"TrashEmptyDescription": "Όλα τα διαγραμμένα αρχεία μεταφέρονται στον Κάδο ανακύκλωσης. Επαναφέρετε τα αρχεία που διαγράφηκαν κατά λάθος ή διαγράψτε τα οριστικά. Λάβετε υπόψη ότι τα αρχεία που έχουν διαγραφεί από τον Κάδο ανακύκλωσης δεν μπορούν πλέον να ανακτηθούν", "TrashEmptyDescription": "Όλα τα διαγραμμένα αρχεία μεταφέρονται στον Κάδο ανακύκλωσης. Επαναφέρετε τα αρχεία που διαγράφηκαν κατά λάθος ή διαγράψτε τα οριστικά. Λάβετε υπόψη ότι τα αρχεία που έχουν διαγραφεί από τον Κάδο ανακύκλωσης δεν μπορούν πλέον να ανακτηθούν",
"UnblockVersion": "Αναίρεση αποκλεισμού / Check-in", "UnblockVersion": "Αναίρεση αποκλεισμού / Check-in",
"UploadToFolder": "Μεταφόρτωση σε φάκελο", "UploadToFolder": "Μεταφόρτωση σε φάκελο",
"VersionBadge": "V.{{version}}", "VersionBadge": "Έκδ.{{version}}",
"VersionHistory": "Ιστορικό Εκδόσεων", "VersionHistory": "Ιστορικό Εκδόσεων",
"ViewList": "Λίστα", "ViewList": "Λίστα",
"ViewTiles": "Πλακίδια" "ViewTiles": "Πλακίδια"

View File

@ -8,5 +8,6 @@
"SystemProperties": "System properties", "SystemProperties": "System properties",
"Versions": "Versions", "Versions": "Versions",
"ViewDetails": "View Details", "ViewDetails": "View Details",
"WhoHasAccess": "Who has access" "WhoHasAccess": "Who has access",
"EmptyScreenText": "See file and folder details here"
} }

View File

@ -8,5 +8,6 @@
"SystemProperties": "Системные свойства", "SystemProperties": "Системные свойства",
"Versions": "Версии", "Versions": "Версии",
"ViewDetails": "Просмотреть подробную информацию", "ViewDetails": "Просмотреть подробную информацию",
"WhoHasAccess": "У кого есть доступ" "WhoHasAccess": "У кого есть доступ",
"EmptyScreenText": "Здесь будут представлены свойства файлов и папок"
} }

View File

@ -89,13 +89,13 @@ class Tile extends React.PureComponent {
onCreateForm = () => { onCreateForm = () => {
const { match, history } = this.props; const { match, history } = this.props;
const { setInfoPanelVisible } = this.props; const { setIsInfoPanelVisible } = this.props;
const filter = FilesFilter.getDefault(); const filter = FilesFilter.getDefault();
filter.folder = match.params.folderId; filter.folder = match.params.folderId;
const urlFilter = filter.toUrlParams(); const urlFilter = filter.toUrlParams();
setInfoPanelVisible(false); setIsInfoPanelVisible(false);
history.push( history.push(
combineUrl( combineUrl(
@ -108,7 +108,7 @@ class Tile extends React.PureComponent {
onShowTemplateInfo = () => { onShowTemplateInfo = () => {
if (!this.props.isInfoPanelVisible) { if (!this.props.isInfoPanelVisible) {
this.props.setInfoPanelVisible(true); this.props.setIsInfoPanelVisible(true);
} }
}; };
@ -212,7 +212,7 @@ export default inject(
({ filesStore, settingsStore, infoPanelStore }, { item }) => { ({ filesStore, settingsStore, infoPanelStore }, { item }) => {
const { gallerySelected, setGallerySelected } = filesStore; const { gallerySelected, setGallerySelected } = filesStore;
const { getIcon } = settingsStore; const { getIcon } = settingsStore;
const { setIsVisible, isVisible } = infoPanelStore; const { isVisible, setIsVisible } = infoPanelStore;
const isSelected = item.id === gallerySelected?.id; const isSelected = item.id === gallerySelected?.id;
@ -220,7 +220,7 @@ export default inject(
isSelected, isSelected,
setGallerySelected, setGallerySelected,
getIcon, getIcon,
setInfoPanelVisible: setIsVisible, setIsInfoPanelVisible: setIsVisible,
isInfoPanelVisible: isVisible, isInfoPanelVisible: isVisible,
}; };
} }

View File

@ -0,0 +1,39 @@
import React from "react";
import styled from "styled-components";
import { withTranslation } from "react-i18next";
const EmptyScreenContainer = styled.div`
margin: 80px auto;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 32px;
.empty-screen-text {
font-family: "Open Sans";
font-style: normal;
font-weight: 600;
font-size: 14px;
line-height: 16px;
text-align: center;
}
`;
const EmptyScreen = ({ t }) => {
return (
<EmptyScreenContainer>
<div className="no-thumbnail-img-wrapper">
<img
size="96px"
className="no-thumbnail-img"
src="images/empty_screen_info_panel.png"
/>
</div>
<div className="empty-screen-text">{t("EmptyScreenText")}</div>
</EmptyScreenContainer>
);
};
export default withTranslation(["InfoPanel"])(EmptyScreen);

View File

@ -28,6 +28,7 @@ const SingleItem = (props) => {
dontShowSize, dontShowSize,
dontShowLocation, dontShowLocation,
dontShowAccess, dontShowAccess,
dontShowOwner,
personal, personal,
createThumbnail, createThumbnail,
culture, culture,
@ -161,6 +162,7 @@ const SingleItem = (props) => {
}, },
]; ];
if (dontShowOwner) result.shift();
if (item.isFolder) return result; if (item.isFolder) return result;
result.splice(3, 0, { result.splice(3, 0, {

View File

@ -8,6 +8,7 @@ import GalleryItem from "./GalleryItem";
import GalleryEmptyScreen from "./GalleryEmptyScreen"; import GalleryEmptyScreen from "./GalleryEmptyScreen";
import { StyledInfoRoomBody } from "./styles/styles.js"; import { StyledInfoRoomBody } from "./styles/styles.js";
import { Base } from "@appserver/components/themes"; import { Base } from "@appserver/components/themes";
import EmptyScreen from "./EmptyScreen";
const InfoPanelBodyContent = ({ const InfoPanelBodyContent = ({
t, t,
@ -19,9 +20,13 @@ const InfoPanelBodyContent = ({
getShareUsers, getShareUsers,
onSelectItem, onSelectItem,
setSharingPanelVisible, setSharingPanelVisible,
isRootFolder,
isRecycleBinFolder, isRecycleBinFolder,
isRecentFolder, isRecentFolder,
isFavoritesFolder, isFavoritesFolder,
isShareFolder,
isCommonFolder,
isPrivacyFolder,
isGallery, isGallery,
gallerySelected, gallerySelected,
personal, personal,
@ -29,13 +34,14 @@ const InfoPanelBodyContent = ({
culture, culture,
}) => { }) => {
const singleItem = (item) => { const singleItem = (item) => {
const dontShowLocation = item.isFolder && item.parentId === 0; const dontShowLocation = isRootFolder;
const dontShowSize = item.isFolder && (isFavoritesFolder || isRecentFolder); const dontShowSize = item.isFolder && (isFavoritesFolder || isRecentFolder);
const dontShowAccess = const dontShowAccess =
isRecycleBinFolder || isRecycleBinFolder ||
(item.isFolder && item.parentId === 0) || isRootFolder ||
item.rootFolderId === 7 || item.rootFolderId === 7 ||
(item.isFolder && item.pathParts && item.pathParts[0] === 7); (item.isFolder && item.pathParts && item.pathParts[0] === 7);
const dontShowOwner = isRootFolder && (isFavoritesFolder || isRecentFolder);
return ( return (
<SingleItem <SingleItem
@ -50,6 +56,7 @@ const InfoPanelBodyContent = ({
dontShowLocation={dontShowLocation} dontShowLocation={dontShowLocation}
dontShowSize={dontShowSize} dontShowSize={dontShowSize}
dontShowAccess={dontShowAccess} dontShowAccess={dontShowAccess}
dontShowOwner={dontShowOwner}
personal={personal} personal={personal}
culture={culture} culture={culture}
createThumbnail={createThumbnail} createThumbnail={createThumbnail}
@ -69,10 +76,21 @@ const InfoPanelBodyContent = ({
<StyledInfoRoomBody> <StyledInfoRoomBody>
<> <>
{selectedItems.length === 0 ? ( {selectedItems.length === 0 ? (
singleItem({ // Can get future changes, currently only "My documents" displays its info
...selectedFolder, isRootFolder &&
isFolder: true, (isRecycleBinFolder ||
}) isRecentFolder ||
isFavoritesFolder ||
isShareFolder ||
isCommonFolder ||
isPrivacyFolder) ? (
<EmptyScreen />
) : (
singleItem({
...selectedFolder,
isFolder: true,
})
)
) : selectedItems.length === 1 ? ( ) : selectedItems.length === 1 ? (
singleItem(selectedItems[0]) singleItem(selectedItems[0])
) : ( ) : (
@ -108,10 +126,14 @@ export default inject(
const { getIcon, getFolderIcon } = settingsStore; const { getIcon, getFolderIcon } = settingsStore;
const { onSelectItem } = filesActionsStore; const { onSelectItem } = filesActionsStore;
const { setSharingPanelVisible } = dialogsStore; const { setSharingPanelVisible } = dialogsStore;
const { isRootFolder } = selectedFolderStore;
const { const {
isRecycleBinFolder, isRecycleBinFolder,
isRecentFolder, isRecentFolder,
isFavoritesFolder, isFavoritesFolder,
isShareFolder,
isCommonFolder,
isPrivacyFolder,
} = treeFoldersStore; } = treeFoldersStore;
const selectedItems = const selectedItems =
@ -130,9 +152,15 @@ export default inject(
getFolderIcon, getFolderIcon,
onSelectItem, onSelectItem,
setSharingPanelVisible, setSharingPanelVisible,
isRootFolder,
isRecycleBinFolder, isRecycleBinFolder,
isRecentFolder, isRecentFolder,
isFavoritesFolder, isFavoritesFolder,
isShareFolder,
isCommonFolder,
isPrivacyFolder,
gallerySelected, gallerySelected,
personal, personal,
createThumbnail, createThumbnail,

View File

@ -362,7 +362,6 @@ class SectionHeaderContent extends React.Component {
isHeaderIndeterminate, isHeaderIndeterminate,
showText, showText,
toggleInfoPanel, toggleInfoPanel,
isShowRootFolder,
} = this.props; } = this.props;
const menuItems = this.getMenuItems(); const menuItems = this.getMenuItems();
const isLoading = !title || !tReady; const isLoading = !title || !tReady;
@ -420,7 +419,6 @@ class SectionHeaderContent extends React.Component {
onBackToParentFolder={this.onBackToParentFolder} onBackToParentFolder={this.onBackToParentFolder}
toggleInfoPanel={toggleInfoPanel} toggleInfoPanel={toggleInfoPanel}
isInfoPanelVisible={isInfoPanelVisible} isInfoPanelVisible={isInfoPanelVisible}
isShowRootFolder={isShowRootFolder}
titles={{ titles={{
trash: t("EmptyRecycleBin"), trash: t("EmptyRecycleBin"),
}} }}
@ -485,7 +483,7 @@ export default inject(
backToParentFolder, backToParentFolder,
} = filesActionsStore; } = filesActionsStore;
const { isVisible, isShowRootFolder, toggleIsVisible } = infoPanelStore; const { toggleIsVisible, isVisible } = infoPanelStore;
return { return {
showText: auth.settingsStore.showText, showText: auth.settingsStore.showText,
@ -498,7 +496,6 @@ export default inject(
canCreate, canCreate,
toggleInfoPanel: toggleIsVisible, toggleInfoPanel: toggleIsVisible,
isInfoPanelVisible: isVisible, isInfoPanelVisible: isVisible,
isShowRootFolder,
isHeaderVisible, isHeaderVisible,
isHeaderIndeterminate, isHeaderIndeterminate,
isHeaderChecked, isHeaderChecked,

View File

@ -173,6 +173,7 @@ const VersionRow = (props) => {
value={commentValue} value={commentValue}
isDisabled={isSavingComment} isDisabled={isSavingComment}
autoFocus={true} autoFocus={true}
areaSelect={true}
/> />
</> </>
)} )}

View File

@ -2,7 +2,6 @@ import { makeAutoObservable } from "mobx";
class InfoPanelStore { class InfoPanelStore {
isVisible = false; isVisible = false;
isShowRootFolder = false;
constructor() { constructor() {
makeAutoObservable(this); makeAutoObservable(this);
@ -12,17 +11,13 @@ class InfoPanelStore {
this.isVisible = !this.isVisible; this.isVisible = !this.isVisible;
}; };
setVisible = () => {
this.isVisible = true;
};
setIsVisible = (bool) => { setIsVisible = (bool) => {
this.isVisible = bool; this.isVisible = bool;
}; };
setIsToggleVisible = (bool) => {
this.isToggleVisible = bool;
};
setIsShowRootFolder = (bool) => {
this.isShowRootFolder = bool;
};
} }
export default InfoPanelStore; export default InfoPanelStore;

View File

@ -0,0 +1,42 @@
{
"count": 1,
"response": {
"files": [],
"folders": [],
"current": {
"parentId": 0,
"filesCount": 6390,
"foldersCount": 40,
"new": 0,
"id": 8,
"rootFolderId": 8,
"canShare": false,
"canEdit": false,
"title": "Trash",
"access": 0,
"shared": false,
"created": "2021-09-16T12:09:15.0000000Z",
"createdBy": {
"id": "fcfa85e3-15fc-11ec-8f4f-80ce62334fc7",
"displayName": "Administrator ",
"avatarSmall": "/images/default_user_photo_size_32-32.png",
"profileUrl": "http://localhost:8092/products/people/view/administrator"
},
"updated": "2021-09-16T12:09:15.0000000Z",
"rootFolderType": 3,
"updatedBy": {
"id": "fcfa85e3-15fc-11ec-8f4f-80ce62334fc7",
"displayName": "Administrator ",
"avatarSmall": "/images/default_user_photo_size_32-32.png",
"profileUrl": "http://localhost:8092/products/people/view/administrator"
}
},
"pathParts": [8],
"startIndex": 0,
"count": 1,
"total": 1,
"new": 0
},
"status": 0,
"statusCode": 200
}

View File

@ -139,7 +139,15 @@ namespace ASC.Web.Files.Services.WCFService.FileOperations
else if (!string.IsNullOrEmpty(error2)) else if (!string.IsNullOrEmpty(error2))
{ {
Error = error2; Error = error2;
} }
var finished1 = thirdpartyTask.GetProperty<bool?>(FINISHED);
var finished2 = daoTask.GetProperty<bool?>(FINISHED);
if (finished1 != null && finished2 != null)
{
TaskInfo.SetProperty(FINISHED, finished1);
}
successProcessed = thirdpartyTask.GetProperty<int>(PROCESSED) + daoTask.GetProperty<int>(PROCESSED); successProcessed = thirdpartyTask.GetProperty<int>(PROCESSED) + daoTask.GetProperty<int>(PROCESSED);

View File

@ -19,6 +19,7 @@
"i18next": "^21.6.5", "i18next": "^21.6.5",
"prop-types": "^15.7.2", "prop-types": "^15.7.2",
"react": "^17.0.1", "react": "^17.0.1",
"react-device-detect": "^2.2.2",
"react-dom": "^17.0.1", "react-dom": "^17.0.1",
"react-helmet": "^6.1.0", "react-helmet": "^6.1.0",
"react-i18next": "^11.15.3", "react-i18next": "^11.15.3",

View File

@ -9,7 +9,10 @@ import {
SectionContent, SectionContent,
SectionHeader, SectionHeader,
SectionWrapper, SectionWrapper,
StyledIframe } from "./styled-section"; StyledIframe,
StyledAction } from "./styled-section";
import cross from './images/cross.react.svg'
export const Section = ({name, origin, lang}) => { export const Section = ({name, origin, lang}) => {
@ -31,8 +34,11 @@ export const Section = ({name, origin, lang}) => {
} }
return <StyledSection> return <StyledSection>
<div> <div style={{position: "relative"}}>
<StyledIframe scrolling="no" className="iframe" src={url} /> <StyledIframe scrolling="no" className="iframe" src={url} />
<StyledAction>
<img style={{width: "16px"}} src={cross} />
</StyledAction>
</div> </div>
<SectionWrapper> <SectionWrapper>
<SectionHeader>My documents</SectionHeader> <SectionHeader>My documents</SectionHeader>

View File

@ -0,0 +1,3 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.76288 6.35869C7.56764 6.16343 7.56764 5.84687 7.76288 5.65161L10.9493 2.46498C11.1445 2.26973 11.1445 1.95316 10.9493 1.75791L10.2422 1.05077C10.0469 0.855489 9.73031 0.855489 9.53504 1.05077L6.34878 4.23729C6.15352 4.43257 5.83691 4.43257 5.64165 4.23729L2.46017 1.05556C2.26491 0.860275 1.9483 0.860275 1.75304 1.05556L1.04596 1.76269C0.850716 1.95795 0.850716 2.27451 1.04596 2.46977L4.22755 5.65161C4.42279 5.84687 4.42279 6.16343 4.22755 6.35869L1.0501 9.53639C0.854858 9.73165 0.854858 10.0482 1.0501 10.2435L1.75718 10.9506C1.95245 11.1459 2.26905 11.1459 2.46432 10.9506L5.64165 7.77302C5.83691 7.57774 6.15352 7.57774 6.34878 7.77302L9.5309 10.9554C9.72616 11.1507 10.0428 11.1507 10.238 10.9554L10.9451 10.2483C11.1404 10.053 11.1404 9.73644 10.9451 9.54118L7.76288 6.35869Z" fill="#999976"/>
</svg>

After

Width:  |  Height:  |  Size: 958 B

View File

@ -1,4 +1,5 @@
import styled from "styled-components"; import styled, { css } from "styled-components";
import { isMobile } from "react-device-detect";
const StyledSection = styled.div` const StyledSection = styled.div`
width: 100%; width: 100%;
@ -50,5 +51,21 @@ const StyledIframe = styled.iframe`
width: 100%; width: 100%;
`; `;
const StyledAction = styled.div`
position: absolute;
right: 8px;
top: 10px;
background: inherit;
display: inline-block;
border: none;
font-size: inherit;
color: "#333";
cursor: pointer;
text-decoration: underline;
${isMobile &&
css`
right: 14px;
`};
`;
export {StyledSection, Icon, Name, MainLoader, FilterLoader, SectionContent, SectionHeader, SectionWrapper, StyledIframe} export {StyledSection, Icon, Name, MainLoader, FilterLoader, SectionContent, SectionHeader, SectionWrapper, StyledIframe, StyledAction}

View File

@ -15028,6 +15028,13 @@ react-dev-utils@^11.0.4:
strip-ansi "6.0.0" strip-ansi "6.0.0"
text-table "0.2.0" text-table "0.2.0"
react-device-detect@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/react-device-detect/-/react-device-detect-2.2.2.tgz#dbabbce798ec359c83f574c3edb24cf1cca641a5"
integrity sha512-zSN1gIAztUekp5qUT/ybHwQ9fmOqVT1psxpSlTn1pe0CO+fnJHKRLOWWac5nKxOxvOpD/w84hk1I+EydrJp7SA==
dependencies:
ua-parser-js "^1.0.2"
react-docgen-typescript@^2.0.0: react-docgen-typescript@^2.0.0:
version "2.2.2" version "2.2.2"
resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz#4611055e569edc071204aadb20e1c93e1ab1659c" resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz#4611055e569edc071204aadb20e1c93e1ab1659c"
@ -17435,6 +17442,11 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
ua-parser-js@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.2.tgz#e2976c34dbfb30b15d2c300b2a53eac87c57a775"
integrity sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==
uglify-js@^3.1.4: uglify-js@^3.1.4:
version "3.15.5" version "3.15.5"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.5.tgz#2b10f9e0bfb3f5c15a8e8404393b6361eaeb33b3" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.5.tgz#2b10f9e0bfb3f5c15a8e8404393b6361eaeb33b3"

View File

@ -14,7 +14,7 @@
"AdministratorsAddedSuccessfully": "Οι διαχειριστές προστέθηκαν με επιτυχία", "AdministratorsAddedSuccessfully": "Οι διαχειριστές προστέθηκαν με επιτυχία",
"AdministratorsRemovedSuccessfully": "Οι διαχειριστές καταργήθηκαν επιτυχώς", "AdministratorsRemovedSuccessfully": "Οι διαχειριστές καταργήθηκαν επιτυχώς",
"Admins": "Διαχειριστές", "Admins": "Διαχειριστές",
"AllDomains": "Οποιoδήποτε domain", "AllDomains": "Οποιοιδήποτε domain",
"AutoBackup": "Αυτόματα αντίγραφα ασφαλείας", "AutoBackup": "Αυτόματα αντίγραφα ασφαλείας",
"AutoBackupDescription": "Χρησιμοποιήστε αυτήν την επιλογή για να δημιουργήσετε αυτόματα αντίγραφα ασφαλείας των δεδομένων της πύλης.", "AutoBackupDescription": "Χρησιμοποιήστε αυτήν την επιλογή για να δημιουργήσετε αυτόματα αντίγραφα ασφαλείας των δεδομένων της πύλης.",
"AutoBackupHelp": "Η επιλογή <strong>Αυτόματα αντίγραφα ασφαλείας</strong> χρησιμοποιείται για την αυτοματοποίηση της διαδικασίας δημιουργίας αντιγράφων ασφαλείας των δεδομένων της πύλης, ώστε να είναι δυνατή η επαναφορά τους αργότερα σε έναν τοπικό διακομιστή.", "AutoBackupHelp": "Η επιλογή <strong>Αυτόματα αντίγραφα ασφαλείας</strong> χρησιμοποιείται για την αυτοματοποίηση της διαδικασίας δημιουργίας αντιγράφων ασφαλείας των δεδομένων της πύλης, ώστε να είναι δυνατή η επαναφορά τους αργότερα σε έναν τοπικό διακομιστή.",
@ -23,7 +23,7 @@
"AutoSavePeriodHelp": "Η ώρα που εμφανίζεται παρακάτω αντιστοιχεί στη ζώνη ώρας που έχει οριστεί στην πύλη.", "AutoSavePeriodHelp": "Η ώρα που εμφανίζεται παρακάτω αντιστοιχεί στη ζώνη ώρας που έχει οριστεί στην πύλη.",
"Backup": "Αντίγραφα ασφαλείας", "Backup": "Αντίγραφα ασφαλείας",
"BackupCreatedError": "Προέκυψε σφάλμα. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας.", "BackupCreatedError": "Προέκυψε σφάλμα. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας.",
"BackupCreatedSuccess": "Το εφερδρικό αντίγραφο έχει δημιουργηθεί επιτυχώς.", "BackupCreatedSuccess": "Το εφεδρικό αντίγραφο έχει δημιουργηθεί επιτυχώς.",
"BackupList": "Εφεδρική λίστα", "BackupList": "Εφεδρική λίστα",
"BackupListWarningText": "Εάν διαγράψετε στοιχεία από τη λίστα, θα διαγραφούν και τα αντίστοιχα αρχεία τους. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Για να διαγράψετε όλα τα αρχεία, χρησιμοποιήστε τον σύνδεσμο:", "BackupListWarningText": "Εάν διαγράψετε στοιχεία από τη λίστα, θα διαγραφούν και τα αντίστοιχα αρχεία τους. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Για να διαγράψετε όλα τα αρχεία, χρησιμοποιήστε τον σύνδεσμο:",
"BrowserNoCanvasSupport": "Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα καμβά HTML5.", "BrowserNoCanvasSupport": "Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα καμβά HTML5.",
@ -146,7 +146,7 @@
"ThirdPartyStorageDescription": "Το αντίγραφο ασφαλείας μπορεί να αποθηκευτεί σε αποθηκευτικό χώρο τρίτου μέρους. Πριν από αυτό, πρέπει να συνδέσετε την αντίστοιχη υπηρεσία στην ενότητα 'Ενοποίηση'. Διαφορετικά, οι παρακάτω ρυθμίσεις θα είναι ανενεργές.", "ThirdPartyStorageDescription": "Το αντίγραφο ασφαλείας μπορεί να αποθηκευτεί σε αποθηκευτικό χώρο τρίτου μέρους. Πριν από αυτό, πρέπει να συνδέσετε την αντίστοιχη υπηρεσία στην ενότητα 'Ενοποίηση'. Διαφορετικά, οι παρακάτω ρυθμίσεις θα είναι ανενεργές.",
"ThirdPartyTitleDescription": "Με τα κλειδιά εξουσιοδότησης, μπορείτε να συνδέσετε υπηρεσίες τρίτων μερών στην πύλη σας. Συνδεθείτε εύκολα με το Facebook, το Twitter ή το LinkedIn, προσθέστε το Dropbox, το OneDrive κ.λπ. για να εργάζεστε με αρχεία που είναι αποθηκευμένα εκεί από την ενότητα Έγγραφα.", "ThirdPartyTitleDescription": "Με τα κλειδιά εξουσιοδότησης, μπορείτε να συνδέσετε υπηρεσίες τρίτων μερών στην πύλη σας. Συνδεθείτε εύκολα με το Facebook, το Twitter ή το LinkedIn, προσθέστε το Dropbox, το OneDrive κ.λπ. για να εργάζεστε με αρχεία που είναι αποθηκευμένα εκεί από την ενότητα Έγγραφα.",
"TimeZone": "Ζώνη ώρας", "TimeZone": "Ζώνη ώρας",
"TrustedMail": "Ρυθμίσεις Αξιόπιστου Mail Domain", "TrustedMail": "Ρυθμίσεις τομέα αξιόπιστης αλληλογραφίας",
"TrustedMailDescription": "Οι ρυθμίσεις τομέα αξιόπιστης αλληλογραφίας είναι ένας τρόπος για να καθορίσετε τους διακομιστές αλληλογραφίας που χρησιμοποιούνται για την αυτοεγγραφή των χρηστών.", "TrustedMailDescription": "Οι ρυθμίσεις τομέα αξιόπιστης αλληλογραφίας είναι ένας τρόπος για να καθορίσετε τους διακομιστές αλληλογραφίας που χρησιμοποιούνται για την αυτοεγγραφή των χρηστών.",
"TrustedMailHelper": "Μπορείτε είτε να επιλέξετε το Προσαρμοσμένοι τομείς και να εισάγετε τον διακομιστή αξιόπιστης αλληλογραφίας στο παρακάτω πεδίο, ώστε ένα άτομο που έχει λογαριασμό σε αυτόν να μπορεί να εγγραφεί μόνο του κάνοντας κλικ στον σύνδεσμο Συμμετοχή στη σελίδα Είσοδος, είτε να απενεργοποιήσετε αυτήν την επιλογή.", "TrustedMailHelper": "Μπορείτε είτε να επιλέξετε το Προσαρμοσμένοι τομείς και να εισάγετε τον διακομιστή αξιόπιστης αλληλογραφίας στο παρακάτω πεδίο, ώστε ένα άτομο που έχει λογαριασμό σε αυτόν να μπορεί να εγγραφεί μόνο του κάνοντας κλικ στον σύνδεσμο Συμμετοχή στη σελίδα Είσοδος, είτε να απενεργοποιήσετε αυτήν την επιλογή.",
"TwoFactorAuth": "Έλεγχος ταυτότητας δύο παραγόντων", "TwoFactorAuth": "Έλεγχος ταυτότητας δύο παραγόντων",

View File

@ -36,12 +36,16 @@ const StyledAboutBody = styled.div`
} }
.logo-theme { .logo-theme {
#svg_4-4 { svg {
fill: ${(props) => props.theme.studio.about.logoColor}; g:nth-child(2) {
} path:nth-child(5) {
fill: ${(props) => props.theme.studio.about.logoColor};
}
#svg_5-5 { path:nth-child(6) {
fill: ${(props) => props.theme.studio.about.logoColor}; fill: ${(props) => props.theme.studio.about.logoColor};
}
}
} }
} }
`; `;