Merge branch 'release/v1.2' of https://github.com/ONLYOFFICE/AppServer into release/v1.2

This commit is contained in:
Alexey Safronov 2022-06-21 10:10:12 +03:00
commit 18f944b2c6
12 changed files with 142 additions and 86 deletions

View File

@ -165,6 +165,7 @@ class ContextMenuButton extends React.Component {
isNew,
title,
zIndex,
usePortal,
} = this.props;
const { isOpen, displayType, offsetX, offsetY } = this.state;
@ -204,6 +205,7 @@ class ContextMenuButton extends React.Component {
columnCount={columnCount}
withBackdrop={!!isMobile}
zIndex={zIndex}
isDefaultMode={usePortal}
>
{this.state.data.map(
(item, index) =>
@ -316,6 +318,7 @@ ContextMenuButton.propTypes = {
/** Set the display type */
displayType: PropTypes.string,
isNew: PropTypes.bool,
usePortal: PropTypes.bool,
};
ContextMenuButton.defaultProps = {
@ -329,6 +332,7 @@ ContextMenuButton.defaultProps = {
isFill: false,
displayType: "dropdown",
isNew: false,
usePortal: true,
};
export default ContextMenuButton;

View File

@ -81,6 +81,7 @@ const ServiceItem = (props) => {
className,
getThirdPartyIcon,
serviceName,
serviceKey,
onClick,
} = props;
@ -93,7 +94,7 @@ const ServiceItem = (props) => {
"data-key": capabilityKey,
};
const src = getThirdPartyIcon(capabilityKey);
const src = getThirdPartyIcon(serviceKey || capabilityKey);
const capabilityName = connectedCloudsTypeTitleTranslation(capabilityKey, t);
@ -282,7 +283,8 @@ const ThirdPartyDialog = (props) => {
<ServiceItem
t={t}
serviceName="Nextcloud"
capability={webDavConnectItem}
serviceKey="NextCloud"
capability={nextCloudConnectItem}
onClick={onShowService}
getThirdPartyIcon={getThirdPartyIcon}
/>
@ -292,7 +294,8 @@ const ThirdPartyDialog = (props) => {
<ServiceItem
t={t}
serviceName="ownCloud"
capability={webDavConnectItem}
serviceKey="OwnCloud"
capability={ownCloudConnectItem}
onClick={onShowService}
getThirdPartyIcon={getThirdPartyIcon}
/>

View File

@ -373,7 +373,12 @@ class Tile extends React.PureComponent {
onFileClick = (e) => {
const { onSelect, item, checked, setSelection } = this.props;
if (e.detail === 1) {
if (
e.detail === 1 &&
!e.target.closest(".badge") &&
!e.target.closest(".item-file-name")
) {
if (e.target.nodeName === "INPUT" || e.target.nodeName === "rect") {
onSelect && onSelect(!checked, item);
} else {

View File

@ -1492,7 +1492,7 @@ class FilesStore {
if (items.length && items[0].id === -1) return; //TODO: if change media collection from state remove this;
const iconSize = this.viewAs === "tile" && isMobile ? 32 : 24;
const iconSize = this.viewAs === "table" ? 24 : 32;
const icon = extension
? getFileIcon(`.${extension}`, iconSize)
: getFolderIcon(null, iconSize);

View File

@ -28,6 +28,7 @@ using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
@ -43,7 +44,7 @@ using ASC.Files.Core.Data;
using ASC.Files.Core.Resources;
using ASC.Files.Core.Security;
using ASC.Web.Core;
using ASC.Web.Core.Files;
using ASC.Web.Core.Files;
using ASC.Web.Core.Users;
using ASC.Web.Core.WhiteLabel;
using ASC.Web.Files.Utils;
@ -592,10 +593,11 @@ namespace ASC.Web.Files.Classes
}
private async Task SaveStartDocumentAsync(FileMarker fileMarker, FolderDao folderDao, FileDao fileDao, int folderId, string path, IDataStore storeTemplate)
{
await foreach (var file in storeTemplate.ListFilesRelativeAsync("", path, "*", false))
{
var files = await storeTemplate.ListFilesRelativeAsync("", path, "*", false).ToListAsync();
foreach (var file in files)
{
await SaveFileAsync(fileMarker, fileDao, folderId, path + file, storeTemplate);
await SaveFileAsync(fileMarker, fileDao, folderId, path + file, storeTemplate, files);
}
await foreach (var folderName in storeTemplate.ListDirectoriesRelativeAsync(path, false))
@ -610,15 +612,18 @@ namespace ASC.Web.Files.Classes
}
}
private async Task SaveFileAsync(FileMarker fileMarker, FileDao fileDao, int folder, string filePath, IDataStore storeTemp)
private async Task SaveFileAsync(FileMarker fileMarker, FileDao fileDao, int folder, string filePath, IDataStore storeTemp, IEnumerable<string> files)
{
try
{
if (FileUtility.GetFileExtension(filePath) == "." + Global.ThumbnailExtension
&& await storeTemp.IsFileAsync("", Regex.Replace(filePath, "\\." + Global.ThumbnailExtension + "$", "")))
return;
var fileName = Path.GetFileName(filePath);
foreach (var ext in Enum.GetValues<ThumbnailExtension>())
{
if (FileUtility.GetFileExtension(filePath) == "." + ext
&& files.Contains(Regex.Replace(fileName, "\\." + ext + "$", "")))
return;
}
var file = ServiceProvider.GetService<File<int>>();
file.Title = fileName;
@ -631,21 +636,6 @@ namespace ASC.Web.Files.Classes
file = await fileDao.SaveFileAsync(file, stream, false);
}
foreach (var size in _thumbnailSettings.Sizes)
{
var pathThumb = $"{filePath}.{size.Width}x{size.Height}.{Global.ThumbnailExtension}";
if (await storeTemp.IsFileAsync("", pathThumb))
{
using (var streamThumb = await storeTemp.GetReadStreamAsync("", pathThumb))
{
await fileDao.SaveThumbnailAsync(file, streamThumb, size.Width, size.Height);
}
}
}
file.ThumbnailStatus = Thumbnail.Created;
await fileMarker.MarkAsNewAsync(file);
}
catch (Exception ex)

View File

@ -605,6 +605,12 @@
<None Update="DocStore\new\zh-CN\xlsx.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\de-DE\my\ONLYOFFICE Sample Form Template.docxf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\de-DE\my\ONLYOFFICE Sample Form.oform">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\de-DE\my\ONLYOFFICE-Musteraudio.mp3">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
@ -612,7 +618,7 @@
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\de-DE\my\ONLYOFFICE-Musterpraesentation.pptx.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\de-DE\my\ONLYOFFICE-Musterpräsentation.pptx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
@ -629,6 +635,12 @@
<None Update="DocStore\sample\en-US\my\ONLYOFFICE Sample Document.docx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\en-US\my\ONLYOFFICE Sample Form Template.docxf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\en-US\my\ONLYOFFICE Sample Form.oform">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\en-US\my\ONLYOFFICE Sample Presentation.pptx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
@ -644,6 +656,12 @@
<None Update="DocStore\sample\es-ES\my\ONLYOFFICE Sample Document.docx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\es-ES\my\ONLYOFFICE Sample Form Template.docxf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\es-ES\my\ONLYOFFICE Sample Form.oform">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\es-ES\my\ONLYOFFICE Sample Presentation.pptx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
@ -659,6 +677,12 @@
<None Update="DocStore\sample\fr-FR\my\ONLYOFFICE Sample Document.docx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\fr-FR\my\ONLYOFFICE Sample Form Template.docxf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\fr-FR\my\ONLYOFFICE Sample Form.oform">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\fr-FR\my\ONLYOFFICE Sample Presentation.pptx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
@ -674,6 +698,12 @@
<None Update="DocStore\sample\it-IT\my\ONLYOFFICE Sample Document.docx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\it-IT\my\ONLYOFFICE Sample Form Template.docxf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\it-IT\my\ONLYOFFICE Sample Form.oform">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\it-IT\my\ONLYOFFICE Sample Presentation.pptx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
@ -689,6 +719,12 @@
<None Update="DocStore\sample\ru-RU\my\ONLYOFFICE Sample Document.docx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\ru-RU\my\ONLYOFFICE Sample Form Template.docxf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\ru-RU\my\ONLYOFFICE Sample Form.oform">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="DocStore\sample\ru-RU\my\ONLYOFFICE Sample Presentation.pptx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>

View File

@ -310,17 +310,21 @@ class ProfileInfo extends React.PureComponent {
/>
</IconButtonWrapper>
)}
<Link
className="email-link"
type="page"
fontSize="13px"
isHovered={true}
title={email}
data-email={email}
onClick={this.onEmailClick}
>
{email}
</Link>
{isSelf ? (
<InfoItemValue>{email}</InfoItemValue>
) : (
<Link
className="email-link"
type="page"
fontSize="13px"
isHovered={true}
title={email}
data-email={email}
onClick={this.onEmailClick}
>
{email}
</Link>
)}
</>
</InfoItemValue>
</InfoItem>

View File

@ -516,7 +516,11 @@ class SectionBodyContent extends React.PureComponent {
{isSelf && (
<ToggleWrapper>
<ToggleContent label={t("InterfaceTheme")} isOpen={true}>
<ToggleContent
label={t("InterfaceTheme")}
isOpen={true}
enableToggle={false}
>
<RadioButtonGroup
orientation={"vertical"}
name={"interface-theme"}

View File

@ -475,6 +475,7 @@ class SectionHeaderContent extends React.PureComponent {
size={17}
getData={contextOptions}
isDisabled={false}
usePortal={false}
/>
)}
{visibleAvatarEditor && (

View File

@ -841,34 +841,35 @@ class UpdateUserForm extends React.Component {
maxLength={50}
maxLabelWidth={maxLabelWidth}
/>
{!personal && (
<DateField
calendarHeaderContent={`${t("CalendarSelectDate")}:`}
labelText={`${t("Translations:Birthdate")}:`}
inputName="birthday"
inputClassName="date-picker_input-birthday"
inputValue={birthdayDateValue}
inputIsDisabled={isLoading}
inputOnChange={this.onBirthdayDateChange}
inputTabIndex={6}
locale={language}
maxLabelWidth={maxLabelWidth}
/>
)}
<RadioField
labelText={`${t("Translations:Sex")}:`}
radioName="sex"
radioValue={profile.sex}
radioOptions={[
{ value: "male", label: t("Translations:MaleSexStatus") },
{ value: "female", label: t("Translations:FemaleSexStatus") },
]}
radioIsDisabled={isLoading}
radioOnChange={this.onInputChange}
maxLabelWidth={maxLabelWidth}
/>
{!personal && (
<>
<DateField
calendarHeaderContent={`${t("CalendarSelectDate")}:`}
labelText={`${t("Translations:Birthdate")}:`}
inputName="birthday"
inputClassName="date-picker_input-birthday"
inputValue={birthdayDateValue}
inputIsDisabled={isLoading}
inputOnChange={this.onBirthdayDateChange}
inputTabIndex={6}
locale={language}
maxLabelWidth={maxLabelWidth}
/>
<RadioField
labelText={`${t("Translations:Sex")}:`}
radioName="sex"
radioValue={profile.sex}
radioOptions={[
{ value: "male", label: t("Translations:MaleSexStatus") },
{
value: "female",
label: t("Translations:FemaleSexStatus"),
},
]}
radioIsDisabled={isLoading}
radioOnChange={this.onInputChange}
maxLabelWidth={maxLabelWidth}
/>
<RadioField
labelText={`${t("Common:Type")}:`}
radioName="isVisitor"

View File

@ -1,4 +1,4 @@
import React, { useEffect, useState } from "react";
import React, { useEffect } from "react";
import { Router, Switch, Route, Redirect } from "react-router-dom";
import { inject, observer } from "mobx-react";
import NavMenu from "./components/NavMenu";
@ -198,11 +198,8 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
roomsMode,
setSnackbarExist,
userTheme,
currentProductId,
} = rest;
const [isDocuments, setIsDocuments] = useState(false);
useEffect(() => {
try {
if (!window.AppServer) {
@ -429,14 +426,6 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
if (userTheme) setTheme(userTheme);
}, [userTheme]);
useEffect(() => {
if (window.location.pathname.toLowerCase().includes("files")) {
setIsDocuments(true);
} else {
setIsDocuments(false);
}
}, [currentProductId]);
const pathname = window.location.pathname.toLowerCase();
const isEditor = pathname.indexOf("doceditor") !== -1;
@ -522,7 +511,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
<Layout>
<Router history={history}>
<>
{isDocuments ? <ReactSmartBanner t={t} ready={ready} /> : <></>}
<ReactSmartBanner t={t} ready={ready} />
{isEditor ? <></> : <NavMenu />}
<ScrollToTop />
<Main isDesktop={isDesktop}>
@ -585,7 +574,6 @@ const ShellWrapper = inject(({ auth, backup }) => {
setSnackbarExist,
socketHelper,
setTheme,
currentProductId,
} = settingsStore;
const { setPreparationPortalDialogVisible } = backup;
@ -614,7 +602,6 @@ const ShellWrapper = inject(({ auth, backup }) => {
roomsMode,
setSnackbarExist,
userTheme: auth?.userStore?.user?.theme,
currentProductId,
};
})(observer(Shell));

View File

@ -10,9 +10,17 @@ const Wrapper = styled.div`
`;
const ReactSmartBanner = (props) => {
const { t, ready, isBannerVisible, setIsBannerVisible } = props;
const {
t,
ready,
isBannerVisible,
setIsBannerVisible,
currentProductId,
} = props;
const force = isIOS ? "ios" : "android";
const [isDocuments, setIsDocuments] = useState(false);
const getCookie = (name) => {
let matches = document.cookie.match(
new RegExp(
@ -34,6 +42,14 @@ const ReactSmartBanner = (props) => {
if (cookieClosed || cookieInstalled) hideBanner();
}, []);
useEffect(() => {
if (window.location.pathname.toLowerCase().includes("files")) {
setIsDocuments(true);
} else {
setIsDocuments(false);
}
}, [currentProductId]);
const storeText = {
ios: t("SmartBanner:AppStore"),
android: t("SmartBanner:GooglePlay"),
@ -60,7 +76,11 @@ const ReactSmartBanner = (props) => {
navigator.maxTouchPoints > 0 ||
navigator.msMaxTouchPoints > 0;
return isMobile && isBannerVisible && ready && isTouchDevice ? (
return isMobile &&
isBannerVisible &&
ready &&
isTouchDevice &&
isDocuments ? (
<Wrapper>
<SmartBanner
title={t("SmartBanner:AppName")}
@ -79,9 +99,10 @@ const ReactSmartBanner = (props) => {
);
};
export default inject(({ bannerStore }) => {
export default inject(({ auth, bannerStore }) => {
return {
isBannerVisible: bannerStore.isBannerVisible,
setIsBannerVisible: bannerStore.setIsBannerVisible,
currentProductId: auth.settingsStore.currentProductId,
};
})(observer(ReactSmartBanner));