Merge branch 'release/v1.2' of https://github.com/ONLYOFFICE/AppServer into release/v1.2
This commit is contained in:
commit
18f944b2c6
@ -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;
|
||||
|
@ -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}
|
||||
/>
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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"}
|
||||
|
@ -475,6 +475,7 @@ class SectionHeaderContent extends React.PureComponent {
|
||||
size={17}
|
||||
getData={contextOptions}
|
||||
isDisabled={false}
|
||||
usePortal={false}
|
||||
/>
|
||||
)}
|
||||
{visibleAvatarEditor && (
|
||||
|
@ -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"
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user