Merge branch 'feature/files' into feature/media-viewer
This commit is contained in:
commit
ea02ee9313
@ -13,7 +13,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.4" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@ -38,17 +38,17 @@ namespace ASC.Api.Core
|
||||
{
|
||||
public class ApiContext : ICloneable
|
||||
{
|
||||
public HttpContext HttpContext { get; set; }
|
||||
public IHttpContextAccessor HttpContextAccessor { get; set; }
|
||||
private Tenant tenant;
|
||||
public Tenant Tenant { get { return tenant ?? (tenant = TenantManager.GetCurrentTenant(HttpContext)); } }
|
||||
public Tenant Tenant { get { return tenant ?? (tenant = TenantManager.GetCurrentTenant(HttpContextAccessor.HttpContext)); } }
|
||||
|
||||
public ApiContext(IHttpContextAccessor httpContextAccessor, SecurityContext securityContext, TenantManager tenantManager)
|
||||
{
|
||||
if (httpContextAccessor == null || httpContextAccessor.HttpContext == null) return;
|
||||
HttpContext = httpContextAccessor.HttpContext;
|
||||
HttpContextAccessor = httpContextAccessor;
|
||||
|
||||
Count = 0;
|
||||
var query = HttpContext.Request.Query;
|
||||
var query = HttpContextAccessor.HttpContext.Request.Query;
|
||||
//Try parse values
|
||||
var count = query.GetRequestValue("count");
|
||||
if (!string.IsNullOrEmpty(count) && ulong.TryParse(count, out var countParsed))
|
||||
@ -188,13 +188,13 @@ namespace ASC.Api.Core
|
||||
{
|
||||
set
|
||||
{
|
||||
if (HttpContext.Items.ContainsKey(nameof(TotalCount)))
|
||||
if (HttpContextAccessor.HttpContext.Items.ContainsKey(nameof(TotalCount)))
|
||||
{
|
||||
HttpContext.Items[nameof(TotalCount)] = value;
|
||||
HttpContextAccessor.HttpContext.Items[nameof(TotalCount)] = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
HttpContext.Items.Add(nameof(TotalCount), value);
|
||||
HttpContextAccessor.HttpContext.Items.Add(nameof(TotalCount), value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -204,7 +204,7 @@ namespace ASC.Api.Core
|
||||
|
||||
public ApiContext SetCount(int count)
|
||||
{
|
||||
HttpContext.Items[nameof(Count)] = count;
|
||||
HttpContextAccessor.HttpContext.Items[nameof(Count)] = count;
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -221,7 +221,7 @@ namespace ASC.Api.Core
|
||||
|
||||
public void AuthByClaim()
|
||||
{
|
||||
var id = HttpContext.User.Claims.FirstOrDefault(r => r.Type == ClaimTypes.Sid);
|
||||
var id = HttpContextAccessor.HttpContext.User.Claims.FirstOrDefault(r => r.Type == ClaimTypes.Sid);
|
||||
if (Guid.TryParse(id?.Value, out var userId))
|
||||
{
|
||||
_ = SecurityContext.AuthenticateMe(userId);
|
||||
|
@ -28,7 +28,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="ARSoft.Tools.NetStandard.DXSdata" Version="1.0.0" />
|
||||
<PackageReference Include="Autofac" Version="5.1.2" />
|
||||
<PackageReference Include="Autofac" Version="5.2.0" />
|
||||
<PackageReference Include="Autofac.Configuration" Version="5.1.0" />
|
||||
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="6.0.0" />
|
||||
<PackageReference Include="Confluent.Kafka" Version="1.3.0" />
|
||||
@ -42,11 +42,11 @@
|
||||
<PackageReference Include="log4net" Version="2.0.8" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="3.1.4" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.4" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.4" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.4" />
|
||||
<PackageReference Include="Microsoft.Windows.Compatibility" Version="3.1.0" />
|
||||
<!-- <PackageReference Include="Microsoft.CodeQuality.Analyzers" Version="2.9.4">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
@ -56,10 +56,10 @@
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference> -->
|
||||
<PackageReference Include="MySql.Data" Version="8.0.19" />
|
||||
<PackageReference Include="MySql.Data" Version="8.0.20" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||
<PackageReference Include="NLog" Version="4.6.8" />
|
||||
<PackageReference Include="NLog.Web.AspNetCore" Version="4.9.0" />
|
||||
<PackageReference Include="NLog" Version="4.7.1" />
|
||||
<PackageReference Include="NLog.Web.AspNetCore" Version="4.9.2" />
|
||||
<PackageReference Include="NUnit" Version="3.12.0" />
|
||||
<PackageReference Include="NVelocity" Version="1.2.0" />
|
||||
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
|
||||
|
@ -43,19 +43,19 @@
|
||||
<None Remove="protos\UserPhotoCacheItem.proto" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AWSSDK.CloudFront" Version="3.3.101.101" />
|
||||
<PackageReference Include="AWSSDK.Core" Version="3.3.104.27" />
|
||||
<PackageReference Include="AWSSDK.S3" Version="3.3.110.25" />
|
||||
<PackageReference Include="AWSSDK.SimpleEmail" Version="3.3.101.105" />
|
||||
<PackageReference Include="AWSSDK.CloudFront" Version="3.3.101.146" />
|
||||
<PackageReference Include="AWSSDK.Core" Version="3.3.106.24" />
|
||||
<PackageReference Include="AWSSDK.S3" Version="3.3.110.70" />
|
||||
<PackageReference Include="AWSSDK.SimpleEmail" Version="3.3.101.150" />
|
||||
<PackageReference Include="Grpc.Tools" Version="2.27.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="MailKit" Version="2.5.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.4" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.4" />
|
||||
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.1.1" />
|
||||
<PackageReference Include="System.Text.Json" Version="4.7.1" />
|
||||
<PackageReference Include="System.Text.Json" Version="4.7.2" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Protobuf Include="protos\NotifyMessage.proto" />
|
||||
|
@ -36,8 +36,6 @@ using ASC.Common.Web;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
using HttpContext = Microsoft.AspNetCore.Http.HttpContext;
|
||||
|
||||
namespace ASC.Core.Common
|
||||
{
|
||||
public class CommonLinkUtilitySettings
|
||||
@ -53,7 +51,7 @@ namespace ASC.Core.Common
|
||||
private UriBuilder _serverRoot;
|
||||
private string _vpath;
|
||||
|
||||
public HttpContext HttpContext { get; set; }
|
||||
public IHttpContextAccessor HttpContextAccessor { get; set; }
|
||||
|
||||
public BaseCommonLinkUtility(
|
||||
CoreBaseSettings coreBaseSettings,
|
||||
@ -85,11 +83,11 @@ namespace ASC.Core.Common
|
||||
{
|
||||
try
|
||||
{
|
||||
HttpContext = httpContextAccessor?.HttpContext;
|
||||
HttpContextAccessor = httpContextAccessor;
|
||||
var uriBuilder = new UriBuilder(Uri.UriSchemeHttp, LOCALHOST);
|
||||
if (HttpContext?.Request != null)
|
||||
if (HttpContextAccessor?.HttpContext?.Request != null)
|
||||
{
|
||||
var u = HttpContext.Request.GetUrlRewriter();
|
||||
var u = HttpContextAccessor?.HttpContext.Request.GetUrlRewriter();
|
||||
uriBuilder = new UriBuilder(u.Scheme, LOCALHOST, u.Port);
|
||||
}
|
||||
_serverRoot = uriBuilder;
|
||||
@ -122,9 +120,9 @@ namespace ASC.Core.Common
|
||||
if (!string.IsNullOrEmpty(serverRootPath)) return serverRootPath;
|
||||
UriBuilder result;
|
||||
// first, take from current request
|
||||
if (HttpContext?.Request != null)
|
||||
if (HttpContextAccessor?.HttpContext?.Request != null)
|
||||
{
|
||||
var u = HttpContext.Request.GetUrlRewriter();
|
||||
var u = HttpContextAccessor?.HttpContext?.Request.GetUrlRewriter();
|
||||
result = new UriBuilder(u.Scheme, u.Host, u.Port);
|
||||
|
||||
if (CoreBaseSettings.Standalone && !result.Uri.IsLoopback)
|
||||
|
@ -79,7 +79,7 @@ namespace ASC.Core
|
||||
|
||||
public void Configure(TenantManager options)
|
||||
{
|
||||
options.HttpContext = HttpContextAccessor?.HttpContext;
|
||||
options.HttpContextAccessor = HttpContextAccessor;
|
||||
options.CoreBaseSettings = CoreBaseSettings;
|
||||
options.CoreSettings = CoreSettings;
|
||||
|
||||
@ -98,7 +98,7 @@ namespace ASC.Core
|
||||
|
||||
private static List<string> thisCompAddresses = new List<string>();
|
||||
|
||||
internal HttpContext HttpContext { get; set; }
|
||||
internal IHttpContextAccessor HttpContextAccessor { get; set; }
|
||||
internal CoreBaseSettings CoreBaseSettings { get; set; }
|
||||
internal CoreSettings CoreSettings { get; set; }
|
||||
|
||||
@ -146,7 +146,7 @@ namespace ASC.Core
|
||||
CoreBaseSettings coreBaseSettings,
|
||||
CoreSettings coreSettings) : this(tenantService, quotaService, tariffService, coreBaseSettings, coreSettings)
|
||||
{
|
||||
HttpContext = httpContextAccessor?.HttpContext;
|
||||
HttpContextAccessor = httpContextAccessor;
|
||||
}
|
||||
|
||||
|
||||
@ -258,7 +258,7 @@ namespace ASC.Core
|
||||
|
||||
public Tenant GetCurrentTenant(bool throwIfNotFound)
|
||||
{
|
||||
return GetCurrentTenant(throwIfNotFound, HttpContext);
|
||||
return GetCurrentTenant(throwIfNotFound, HttpContextAccessor.HttpContext);
|
||||
}
|
||||
|
||||
public void SetCurrentTenant(Tenant tenant)
|
||||
@ -266,9 +266,9 @@ namespace ASC.Core
|
||||
if (tenant != null)
|
||||
{
|
||||
CurrentTenant = tenant;
|
||||
if (HttpContext != null)
|
||||
if (HttpContextAccessor?.HttpContext != null)
|
||||
{
|
||||
HttpContext.Items[CURRENT_TENANT] = tenant;
|
||||
HttpContextAccessor.HttpContext.Items[CURRENT_TENANT] = tenant;
|
||||
}
|
||||
Thread.CurrentThread.CurrentCulture = tenant.GetCulture();
|
||||
Thread.CurrentThread.CurrentUICulture = tenant.GetCulture();
|
||||
|
@ -13,9 +13,9 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CommandLineParser" Version="2.7.82" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.4" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.4" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.4" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
|
@ -162,7 +162,11 @@ class PureArticleMainButtonContent extends React.Component {
|
||||
isLatestFile,
|
||||
indexOfFile
|
||||
)
|
||||
);
|
||||
)
|
||||
.catch((err) => {
|
||||
this.props.setProgressVisible(false, 0);
|
||||
toastr.error(err);
|
||||
});
|
||||
};
|
||||
|
||||
onFileChange = (e) => {
|
||||
|
@ -18,38 +18,10 @@ const DownloadContent = (props) => {
|
||||
onRowSelect,
|
||||
getItemIcon,
|
||||
titleFormat,
|
||||
getTitleLabel,
|
||||
type
|
||||
} = props;
|
||||
|
||||
const getTitleLabel = (format) => {
|
||||
switch (format) {
|
||||
case 0:
|
||||
return t("OriginalFormat");
|
||||
case 1:
|
||||
return ".txt";
|
||||
case 2:
|
||||
return ".docx";
|
||||
case 3:
|
||||
return ".odt";
|
||||
case 4:
|
||||
return ".ods";
|
||||
case 5:
|
||||
return ".odp";
|
||||
case 6:
|
||||
return ".pdf";
|
||||
case 7:
|
||||
return ".rtf";
|
||||
case 8:
|
||||
return ".xlsx";
|
||||
case 9:
|
||||
return ".pptx";
|
||||
case 10:
|
||||
return t("CustomFormat");
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
const getFormats = item => {
|
||||
|
||||
const documentFormats = [
|
||||
|
@ -14,7 +14,7 @@ import {
|
||||
import { ReactSVG } from "react-svg";
|
||||
import { withTranslation } from "react-i18next";
|
||||
import i18n from "./i18n";
|
||||
import { utils } from "asc-web-common";
|
||||
import { utils, api } from "asc-web-common";
|
||||
import {
|
||||
getFileIcon,
|
||||
getFolderIcon,
|
||||
@ -92,35 +92,87 @@ class DownloadDialogComponent extends React.Component {
|
||||
};
|
||||
}
|
||||
|
||||
onDownload = () => {
|
||||
getTitleLabel = (format) => {
|
||||
switch (format) {
|
||||
case 0:
|
||||
return this.props.t("OriginalFormat");
|
||||
case 1:
|
||||
return ".txt";
|
||||
case 2:
|
||||
return ".docx";
|
||||
case 3:
|
||||
return ".odt";
|
||||
case 4:
|
||||
return ".ods";
|
||||
case 5:
|
||||
return ".odp";
|
||||
case 6:
|
||||
return ".pdf";
|
||||
case 7:
|
||||
return ".rtf";
|
||||
case 8:
|
||||
return ".xlsx";
|
||||
case 9:
|
||||
return ".pptx";
|
||||
case 10:
|
||||
return this.props.t("CustomFormat");
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
getDownloadItems = () => {
|
||||
const { documents, spreadsheets, presentations, other } = this.state;
|
||||
const folderIds = [];
|
||||
const fileIds = [];
|
||||
const items = [];
|
||||
const folders = [];
|
||||
|
||||
for (let item of documents) {
|
||||
if (item.checked) {
|
||||
fileIds.push(item.id);
|
||||
const format = item.format === 0 ? item.fileExst : this.getTitleLabel(item.format);
|
||||
items.push({key: item.id, value: format});
|
||||
}
|
||||
}
|
||||
|
||||
for (let item of spreadsheets) {
|
||||
if (item.checked) {
|
||||
fileIds.push(item.id);
|
||||
const format = item.format === 0 ? item.fileExst : this.getTitleLabel(item.format);
|
||||
items.push({key: item.id, value: format});
|
||||
}
|
||||
}
|
||||
|
||||
for (let item of presentations) {
|
||||
if (item.checked) {
|
||||
fileIds.push(item.id);
|
||||
const format = item.format === 0 ? item.fileExst : this.getTitleLabel(item.format);
|
||||
items.push({key: item.id, value: format});
|
||||
}
|
||||
}
|
||||
|
||||
for (let item of other) {
|
||||
if (item.checked) {
|
||||
folderIds.push(item.id);
|
||||
if(item.fileExst) {
|
||||
const format = item.format === 0 ? item.fileExst : this.getTitleLabel(item.format);
|
||||
items.push({key: item.id, value: format});
|
||||
} else {
|
||||
folders.push(item.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
toastr.success("onDownload click");
|
||||
|
||||
return [items, folders];
|
||||
}
|
||||
|
||||
onDownload = () => {
|
||||
const { startUploadSession, closeUploadSession, onDownloadProgress, onClose } = this.props;
|
||||
|
||||
const downloadItems = this.getDownloadItems();
|
||||
const fileConvertIds = downloadItems[0];
|
||||
const folderIds = downloadItems[1];
|
||||
startUploadSession();
|
||||
|
||||
api.files
|
||||
.downloadFormatFiles(fileConvertIds, folderIds)
|
||||
.then(() => { onClose(); onDownloadProgress(false); })
|
||||
.catch(err => closeUploadSession(err));
|
||||
};
|
||||
|
||||
getItemIcon = (item) => {
|
||||
@ -411,6 +463,7 @@ class DownloadDialogComponent extends React.Component {
|
||||
onSelectFormat={this.onSelectFormat}
|
||||
onRowSelect={this.onRowSelect}
|
||||
getItemIcon={this.getItemIcon}
|
||||
getTitleLabel={this.getTitleLabel}
|
||||
titleFormat={documentsTitleFormat}
|
||||
type="document"
|
||||
/>
|
||||
@ -426,6 +479,7 @@ class DownloadDialogComponent extends React.Component {
|
||||
onSelectFormat={this.onSelectFormat}
|
||||
onRowSelect={this.onRowSelect}
|
||||
getItemIcon={this.getItemIcon}
|
||||
getTitleLabel={this.getTitleLabel}
|
||||
titleFormat={spreadsheetsTitleFormat}
|
||||
type="spreadsheet"
|
||||
/>
|
||||
@ -441,6 +495,7 @@ class DownloadDialogComponent extends React.Component {
|
||||
onSelectFormat={this.onSelectFormat}
|
||||
onRowSelect={this.onRowSelect}
|
||||
getItemIcon={this.getItemIcon}
|
||||
getTitleLabel={this.getTitleLabel}
|
||||
titleFormat={presentationsTitleFormat}
|
||||
type="presentation"
|
||||
/>
|
||||
|
@ -84,7 +84,13 @@ class SectionBodyContent extends React.Component {
|
||||
} */
|
||||
|
||||
shouldComponentUpdate(nextProps, nextStates) {
|
||||
return !isEqual(this.props, nextProps) || !isEqual(this.state.mediaViewerVisible, nextStates.mediaViewerVisible);
|
||||
if(this.state.showSharingPanel !== nextState.showSharingPanel) {
|
||||
return true;
|
||||
}
|
||||
if(!isEqual(this.props, nextProps) || !isEqual(this.state.mediaViewerVisible, nextStates.mediaViewerVisible)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
onClickRename = (item) => {
|
||||
@ -194,7 +200,7 @@ class SectionBodyContent extends React.Component {
|
||||
key: "sharing-settings",
|
||||
label: "Sharing settings",
|
||||
onClick: this.onClickShare.bind(this, item),
|
||||
disabled: item.access !== 1
|
||||
disabled: item.access !== 1 && item.access !== 0
|
||||
},
|
||||
isFile
|
||||
? {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import React from "react";
|
||||
import styled, { css } from "styled-components";
|
||||
import { withRouter } from "react-router";
|
||||
import { constants, Headline, store } from "asc-web-common";
|
||||
import { constants, Headline, store, api } from "asc-web-common";
|
||||
import { connect } from "react-redux";
|
||||
import { withTranslation } from "react-i18next";
|
||||
import {
|
||||
@ -166,7 +166,56 @@ class SectionHeaderContent extends React.Component {
|
||||
|
||||
copyAction = () => toastr.info("copyAction click");
|
||||
|
||||
downloadAction = () => toastr.info("downloadAction click");
|
||||
startUploadSession = () => {
|
||||
const { onLoading, t, setProgressLabel, setProgressVisible} = this.props;
|
||||
onLoading(true);
|
||||
setProgressLabel(t("ArchivingData"));
|
||||
setProgressVisible(true);
|
||||
}
|
||||
|
||||
closeUploadSession = (err) => {
|
||||
const timeout = err ? 0 : null;
|
||||
err && toastr.error(err);
|
||||
this.props.onLoading(false);
|
||||
this.props.setProgressVisible(false, timeout);
|
||||
}
|
||||
|
||||
loop = url => {
|
||||
api.files.getProgress().then(res => {
|
||||
if(!url) {
|
||||
this.props.setProgressValue(res[0].progress);
|
||||
setTimeout(() => this.loop(res[0].url), 1000);
|
||||
} else {
|
||||
this.closeUploadSession();
|
||||
return window.open(url, "_blank");
|
||||
}
|
||||
}).catch((err) => this.closeUploadSession(err));
|
||||
}
|
||||
|
||||
downloadAction = () => {
|
||||
const fileIds = [];
|
||||
const folderIds = [];
|
||||
const items = [];
|
||||
|
||||
for(let item of this.props.selection) {
|
||||
if(item.fileExst) {
|
||||
fileIds.push(item.id);
|
||||
items.push({id: item.id, fileExst: item.fileExst});
|
||||
} else {
|
||||
folderIds.push(item.id);
|
||||
items.push({id: item.id});
|
||||
}
|
||||
}
|
||||
|
||||
this.startUploadSession();
|
||||
|
||||
api.files
|
||||
.downloadFiles(fileIds, folderIds)
|
||||
.then(res => {
|
||||
this.loop(res[0].url);
|
||||
})
|
||||
.catch((err) => this.closeUploadSession(err));
|
||||
}
|
||||
|
||||
downloadAsAction = () => this.setState({ showDownloadDialog: !this.state.showDownloadDialog });
|
||||
|
||||
@ -441,6 +490,9 @@ class SectionHeaderContent extends React.Component {
|
||||
<DownloadDialog
|
||||
visible={showDownloadDialog}
|
||||
onClose={this.downloadAsAction}
|
||||
startUploadSession={this.startUploadSession}
|
||||
closeUploadSession={this.closeUploadSession}
|
||||
onDownloadProgress={this.loop}
|
||||
/>
|
||||
)}
|
||||
</StyledContainer>
|
||||
|
@ -100,9 +100,10 @@ class PureHome extends React.Component {
|
||||
this.setState({ isLoading: status });
|
||||
};
|
||||
|
||||
setProgressVisible = visible => {
|
||||
setProgressVisible = (visible, timeout) => {
|
||||
const newTimeout = timeout ? timeout : 10000;
|
||||
if(visible) {this.setState({ showProgressBar: visible })}
|
||||
else { setTimeout(() => this.setState({ showProgressBar: visible, progressBarValue: 0 }), 10000)};
|
||||
else { setTimeout(() => this.setState({ showProgressBar: visible, progressBarValue: 0 }), newTimeout)};
|
||||
};
|
||||
setProgressValue = value => this.setState({ progressBarValue: value });
|
||||
setProgressLabel = label => this.setState({ progressBarLabel: label });
|
||||
@ -171,7 +172,6 @@ class PureHome extends React.Component {
|
||||
onLoading={this.onLoading}
|
||||
setProgressVisible={this.setProgressVisible}
|
||||
setProgressValue={this.setProgressValue}
|
||||
setProgressContent={this.setProgressContent}
|
||||
setProgressLabel={this.setProgressLabel}
|
||||
/>}
|
||||
articleBodyContent={<ArticleBodyContent onLoading={this.onLoading} isLoading={isLoading} />}
|
||||
@ -184,6 +184,9 @@ class PureHome extends React.Component {
|
||||
onSelect={this.onSectionHeaderContentSelect}
|
||||
onClose={this.onClose}
|
||||
onLoading={this.onLoading}
|
||||
setProgressVisible={this.setProgressVisible}
|
||||
setProgressValue={this.setProgressValue}
|
||||
setProgressLabel={this.setProgressLabel}
|
||||
/>
|
||||
}
|
||||
sectionFilterContent={<SectionFilterContent onLoading={this.onLoading} />}
|
||||
|
@ -71,5 +71,6 @@
|
||||
"Filter": "Filter",
|
||||
"OverwriteSetting": "Overwrite existing file with the same name",
|
||||
"UploadOriginalFormatSetting": "Upload the documents in original format as well",
|
||||
"HideWindowSetting": "Show this window minimized"
|
||||
"HideWindowSetting": "Show this window minimized",
|
||||
"ArchivingData": "Archiving data"
|
||||
}
|
@ -71,5 +71,6 @@
|
||||
"Filter": "Фильтр",
|
||||
"OverwriteSetting": "Перезаписывать существующий файл с таким же именем",
|
||||
"UploadOriginalFormatSetting": "Сохранять также копию файла в исходном формате",
|
||||
"HideWindowSetting": "Показывать это окно минимизированным"
|
||||
"HideWindowSetting": "Показывать это окно минимизированным",
|
||||
"ArchivingData": "Архивирование данных"
|
||||
}
|
@ -20,11 +20,7 @@ import { withRouter } from "react-router";
|
||||
import { withTranslation } from "react-i18next";
|
||||
import { utils as commonUtils, constants, api } from "asc-web-common";
|
||||
import i18n from "./i18n";
|
||||
import {
|
||||
setSharedFolders,
|
||||
setSharedFiles,
|
||||
getShareUsers
|
||||
} from "../../../store/files/actions";
|
||||
import { getShareUsers, setShareFiles } from "../../../store/files/actions";
|
||||
import { getAccessOption } from '../../../store/files/selectors';
|
||||
import {
|
||||
StyledSharingPanel,
|
||||
@ -80,43 +76,54 @@ class SharingPanelComponent extends React.Component {
|
||||
//onKeyClick = () => console.log("onKeyClick");
|
||||
|
||||
onSaveClick = () => {
|
||||
toastr.success("onSaveClick");
|
||||
|
||||
const { baseShareData, isNotifyUsers, message } = this.state;
|
||||
const { shareDataItems, selectedItems, onClose } = this.props;
|
||||
const {
|
||||
baseShareData,
|
||||
isNotifyUsers,
|
||||
message,
|
||||
shareDataItems,
|
||||
} = this.state;
|
||||
const { selectedItems, onClose } = this.props;
|
||||
|
||||
const folderIds = [];
|
||||
const fileIds = [];
|
||||
|
||||
const shareTo = [];
|
||||
const access = [];
|
||||
const share = [];
|
||||
for (let item of shareDataItems) {
|
||||
const baseItem = baseShareData.find((x) => x.id === item.id);
|
||||
if (
|
||||
(baseItem && baseItem.rights.rights !== item.rights.rights) ||
|
||||
!baseItem
|
||||
) {
|
||||
shareTo.push(item.id);
|
||||
access.push(item.rights.accessNumber);
|
||||
share.push({ shareTo: item.id, access: item.rights.accessNumber });
|
||||
}
|
||||
}
|
||||
|
||||
const notify = isNotifyUsers;
|
||||
for (let item of baseShareData) {
|
||||
const baseItem = shareDataItems.find((x) => x.id === item.id);
|
||||
if (!baseItem) {
|
||||
share.push({ shareTo: item.id, access: 0});
|
||||
}
|
||||
}
|
||||
|
||||
for (let item of selectedItems) {
|
||||
if (item.fileExst) {
|
||||
fileIds.push(item.id);
|
||||
if (!selectedItems.length) {
|
||||
if (selectedItems.fileExst) {
|
||||
fileIds.push(selectedItems.id);
|
||||
} else {
|
||||
folderIds.push(item.id);
|
||||
folderIds.push(selectedItems.id);
|
||||
}
|
||||
} else {
|
||||
for (let item of selectedItems) {
|
||||
if (item.fileExst) {
|
||||
fileIds.push(item.id);
|
||||
} else {
|
||||
folderIds.push(item.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*folderIds.length > 0 &&
|
||||
setSharedFolders(folderIds, shareTo, access, notify, message);
|
||||
fileIds.length > 0 &&
|
||||
setSharedFiles(fileIds, shareTo, access, notify, message);*/
|
||||
|
||||
onClose();
|
||||
setShareFiles(folderIds, fileIds, share, isNotifyUsers, message)
|
||||
.catch((err) => toastr.error(err))
|
||||
.finally(() => onClose());
|
||||
};
|
||||
|
||||
onFullAccessClick = () => {
|
||||
|
@ -306,20 +306,17 @@ export function deleteFolder(folderId, deleteAfter, immediately) {
|
||||
}
|
||||
}
|
||||
|
||||
export function setSharedFolders(folderIds, shareTo, access, notify, sharingMessage) {
|
||||
const requests = folderIds.map((id) =>
|
||||
files.setShareFolder(id, shareTo, access, notify, sharingMessage)
|
||||
export function setShareFiles(folderIds, fileIds, share, notify, sharingMessage) {
|
||||
const foldersRequests = folderIds.map((id) =>
|
||||
files.setShareFolder(id, share, notify, sharingMessage)
|
||||
);
|
||||
|
||||
return axios.all(requests).then((res) => res);
|
||||
}
|
||||
|
||||
export function setSharedFiles(fileId, shareTo, access, notify, sharingMessage) {
|
||||
const requests = fileId.map((id) =>
|
||||
files.setShareFiles(id, shareTo, access, notify, sharingMessage)
|
||||
const filesRequests = fileIds.map((id) =>
|
||||
files.setShareFiles(id, share, notify, sharingMessage)
|
||||
);
|
||||
|
||||
return axios.all(requests).then((res) => res);
|
||||
const requests = [...foldersRequests, ...filesRequests];
|
||||
return axios.all(requests);
|
||||
}
|
||||
|
||||
export function getShareUsers(folderIds, fileIds) {
|
||||
|
@ -28,7 +28,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Box.V2.Core" Version="3.22.0" />
|
||||
<PackageReference Include="DocuSign.eSign.dll" Version="4.1.1" />
|
||||
<PackageReference Include="DocuSign.eSign.dll" Version="4.3.0" />
|
||||
<PackageReference Include="DotNetZip" Version="1.13.7" />
|
||||
<PackageReference Include="Dropbox.Api" Version="4.9.4" />
|
||||
<PackageReference Include="Google.Apis.Drive.v3" Version="1.44.1.1876" />
|
||||
@ -39,8 +39,8 @@
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.7" />
|
||||
<PackageReference Include="Microsoft.OneDriveSDK" Version="2.0.7" />
|
||||
<PackageReference Include="Microsoft.SharePoint.Client" Version="14.0.4762.1000" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.7.0" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.2" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.7.1" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\common\ASC.Api.Core\ASC.Api.Core.csproj" />
|
||||
|
@ -50,6 +50,7 @@ using ASC.Web.Studio.Core;
|
||||
using ASC.Web.Studio.UserControls.Statistics;
|
||||
using ASC.Web.Studio.Utility;
|
||||
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace ASC.Files.Core.Data
|
||||
@ -119,14 +120,14 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
public File<int> GetFile(int fileId)
|
||||
{
|
||||
var query = GetFileQuery(r => r.Id == fileId && r.CurrentVersion);
|
||||
return FromQueryWithShared(query).SingleOrDefault();
|
||||
var query = GetFileQuery(r => r.Id == fileId && r.CurrentVersion).AsNoTracking();
|
||||
return ToFile(FromQueryWithShared(query).SingleOrDefault());
|
||||
}
|
||||
|
||||
public File<int> GetFile(int fileId, int fileVersion)
|
||||
{
|
||||
var query = GetFileQuery(r => r.Id == fileId && r.Version == fileVersion);
|
||||
return FromQueryWithShared(query).SingleOrDefault();
|
||||
var query = GetFileQuery(r => r.Id == fileId && r.Version == fileVersion).AsNoTracking();
|
||||
return ToFile(FromQueryWithShared(query).SingleOrDefault());
|
||||
}
|
||||
|
||||
public File<int> GetFile(int parentId, string title)
|
||||
@ -134,14 +135,16 @@ namespace ASC.Files.Core.Data
|
||||
if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(title);
|
||||
|
||||
var query = GetFileQuery(r => r.Title == title && r.CurrentVersion == true && r.FolderId == parentId)
|
||||
.AsNoTracking()
|
||||
.OrderBy(r => r.CreateOn);
|
||||
|
||||
return FromQueryWithShared(query).FirstOrDefault();
|
||||
return ToFile(FromQueryWithShared(query).FirstOrDefault());
|
||||
}
|
||||
|
||||
public File<int> GetFileStable(int fileId, int fileVersion = -1)
|
||||
{
|
||||
var query = GetFileQuery(r => r.Id == fileId && r.Forcesave == ForcesaveType.None);
|
||||
var query = GetFileQuery(r => r.Id == fileId && r.Forcesave == ForcesaveType.None)
|
||||
.AsNoTracking();
|
||||
|
||||
if (fileVersion >= 0)
|
||||
{
|
||||
@ -150,30 +153,31 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
query = query.OrderByDescending(r => r.Version);
|
||||
|
||||
return FromQueryWithShared(query).SingleOrDefault();
|
||||
return ToFile(FromQueryWithShared(query).SingleOrDefault());
|
||||
}
|
||||
|
||||
public List<File<int>> GetFileHistory(int fileId)
|
||||
{
|
||||
var query = GetFileQuery(r => r.Id == fileId).OrderByDescending(r => r.Version);
|
||||
var query = GetFileQuery(r => r.Id == fileId).OrderByDescending(r => r.Version).AsNoTracking();
|
||||
|
||||
return FromQueryWithShared(query);
|
||||
return FromQueryWithShared(query).Select(ToFile).ToList();
|
||||
}
|
||||
|
||||
public List<File<int>> GetFiles(int[] fileIds)
|
||||
{
|
||||
if (fileIds == null || fileIds.Length == 0) return new List<File<int>>();
|
||||
|
||||
var query = GetFileQuery(r => fileIds.Any(a => a == r.Id) && r.CurrentVersion);
|
||||
var query = GetFileQuery(r => fileIds.Any(a => a == r.Id) && r.CurrentVersion)
|
||||
.AsNoTracking();
|
||||
|
||||
return FromQueryWithShared(query);
|
||||
return FromQueryWithShared(query).Select(ToFile).ToList();
|
||||
}
|
||||
|
||||
public List<File<int>> GetFilesForShare(int[] fileIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent)
|
||||
{
|
||||
if (fileIds == null || fileIds.Length == 0 || filterType == FilterType.FoldersOnly) return new List<File<int>>();
|
||||
|
||||
var query = GetFileQuery(r => fileIds.Any(a => a == r.Id) && r.CurrentVersion);
|
||||
var query = GetFileQuery(r => fileIds.Any(a => a == r.Id) && r.CurrentVersion).AsNoTracking();
|
||||
|
||||
if (!string.IsNullOrEmpty(searchText))
|
||||
{
|
||||
@ -220,15 +224,18 @@ namespace ASC.Files.Core.Data
|
||||
break;
|
||||
}
|
||||
|
||||
return FromQuery(query);
|
||||
return FromQuery(query).Select(ToFile).ToList();
|
||||
}
|
||||
|
||||
|
||||
public List<int> GetFiles(int parentId)
|
||||
{
|
||||
var query = GetFileQuery(r => r.FolderId == parentId && r.CurrentVersion).Select(r => r.Id);
|
||||
var query = GetFileQuery(r => r.FolderId == parentId && r.CurrentVersion)
|
||||
.AsNoTracking()
|
||||
.Select(r => r.Id);
|
||||
|
||||
return Query(FilesDbContext.Files)
|
||||
.AsNoTracking()
|
||||
.Where(r => r.FolderId == parentId && r.CurrentVersion)
|
||||
.Select(r => r.Id)
|
||||
.ToList();
|
||||
@ -240,12 +247,13 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
if (orderBy == null) orderBy = new OrderBy(SortedByType.DateAndTime, false);
|
||||
|
||||
var q = GetFileQuery(r => r.FolderId == parentId && r.CurrentVersion);
|
||||
var q = GetFileQuery(r => r.FolderId == parentId && r.CurrentVersion).AsNoTracking();
|
||||
|
||||
|
||||
if (withSubfolders)
|
||||
{
|
||||
q = GetFileQuery(r => r.CurrentVersion)
|
||||
.AsNoTracking()
|
||||
.Join(FilesDbContext.Tree, r => r.FolderId, a => a.FolderId, (file, tree) => new { file, tree })
|
||||
.Where(r => r.tree.ParentId == parentId)
|
||||
.Select(r => r.file);
|
||||
@ -320,7 +328,7 @@ namespace ASC.Files.Core.Data
|
||||
break;
|
||||
}
|
||||
|
||||
return FromQueryWithShared(q);
|
||||
return FromQueryWithShared(q).Select(ToFile).ToList();
|
||||
}
|
||||
|
||||
public Stream GetFileStream(File<int> file, long offset)
|
||||
@ -394,7 +402,6 @@ namespace ASC.Files.Core.Data
|
||||
if (file.CreateBy == default) file.CreateBy = AuthContext.CurrentAccount.ID;
|
||||
if (file.CreateOn == default) file.CreateOn = TenantUtil.DateTimeNow();
|
||||
|
||||
var fileIdString = file.ID.ToString();
|
||||
var toUpdate = FilesDbContext.Files
|
||||
.Where(r => r.Id == file.ID && r.CurrentVersion && r.TenantId == TenantID)
|
||||
.FirstOrDefault();
|
||||
@ -694,6 +701,7 @@ namespace ASC.Files.Core.Data
|
||||
public bool IsExist(string title, int folderId)
|
||||
{
|
||||
return Query(FilesDbContext.Files)
|
||||
.AsNoTracking()
|
||||
.Where(r => r.Title == title)
|
||||
.Where(r => r.FolderId == folderId)
|
||||
.Where(r => r.CurrentVersion)
|
||||
@ -870,6 +878,7 @@ namespace ASC.Files.Core.Data
|
||||
public void CompleteVersion(int fileId, int fileVersion)
|
||||
{
|
||||
var toUpdate = Query(FilesDbContext.Files)
|
||||
.AsNoTracking()
|
||||
.Where(r => r.Id == fileId)
|
||||
.Where(r => r.Version >= fileVersion);
|
||||
|
||||
@ -886,6 +895,7 @@ namespace ASC.Files.Core.Data
|
||||
using var tx = FilesDbContext.Database.BeginTransaction();
|
||||
|
||||
var versionGroup = Query(FilesDbContext.Files)
|
||||
.AsNoTracking()
|
||||
.Where(r => r.Id == fileId)
|
||||
.Where(r => r.Version == fileVersion)
|
||||
.Select(r => r.VersionGroup)
|
||||
@ -1017,7 +1027,6 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
public void ReassignFiles(int[] fileIds, Guid newOwnerId)
|
||||
{
|
||||
var fileIdsStrings = fileIds.Select(r => r.ToString()).ToList();
|
||||
var toUpdate = Query(FilesDbContext.Files)
|
||||
.Where(r => r.CurrentVersion)
|
||||
.Where(r => fileIds.Any(a => a == r.Id));
|
||||
@ -1034,8 +1043,8 @@ namespace ASC.Files.Core.Data
|
||||
{
|
||||
if (parentIds == null || parentIds.Length == 0 || filterType == FilterType.FoldersOnly) return new List<File<int>>();
|
||||
|
||||
var parentIdsStrings = parentIds.Select(r => r.ToString()).ToList();
|
||||
var q = GetFileQuery(r => r.CurrentVersion)
|
||||
.AsNoTracking()
|
||||
.Join(FilesDbContext.Tree, a => a.FolderId, t => t.FolderId, (file, tree) => new { file, tree })
|
||||
.Where(r => parentIds.Any(a => a == r.tree.ParentId))
|
||||
.Select(r => r.file);
|
||||
@ -1085,15 +1094,15 @@ namespace ASC.Files.Core.Data
|
||||
break;
|
||||
}
|
||||
|
||||
return FromQueryWithShared(q);
|
||||
return FromQueryWithShared(q).Select(ToFile).ToList();
|
||||
}
|
||||
|
||||
public IEnumerable<File<int>> Search(string searchText, bool bunch)
|
||||
{
|
||||
if (FactoryIndexer.TrySelectIds(s => s.MatchAll(searchText), out var ids))
|
||||
{
|
||||
var query = GetFileQuery(r => r.CurrentVersion && ids.Any(i => i == r.Id));
|
||||
return FromQueryWithShared(query)
|
||||
var query = GetFileQuery(r => r.CurrentVersion && ids.Any(i => i == r.Id)).AsNoTracking();
|
||||
return FromQueryWithShared(query).Select(ToFile)
|
||||
.Where(
|
||||
f =>
|
||||
bunch
|
||||
@ -1103,8 +1112,8 @@ namespace ASC.Files.Core.Data
|
||||
}
|
||||
else
|
||||
{
|
||||
var query = BuildSearch(GetFileQuery(r => r.CurrentVersion), searchText, SearhTypeEnum.Any);
|
||||
return FromQueryWithShared(query)
|
||||
var query = BuildSearch(GetFileQuery(r => r.CurrentVersion).AsNoTracking(), searchText, SearhTypeEnum.Any);
|
||||
return FromQueryWithShared(query).Select(ToFile)
|
||||
.Where(f =>
|
||||
bunch
|
||||
? f.RootFolderType == FolderType.BUNCH
|
||||
@ -1268,7 +1277,7 @@ namespace ASC.Files.Core.Data
|
||||
};
|
||||
}
|
||||
|
||||
protected List<File<int>> FromQueryWithShared(IQueryable<DbFile> dbFiles)
|
||||
protected IQueryable<DbFileQuery> FromQueryWithShared(IQueryable<DbFile> dbFiles)
|
||||
{
|
||||
return dbFiles
|
||||
.Select(r => new DbFileQuery
|
||||
@ -1287,13 +1296,10 @@ namespace ASC.Files.Core.Data
|
||||
.Where(x => x.EntryType == FileEntryType.File)
|
||||
.Where(x => x.EntryId == r.Id.ToString())
|
||||
.Any()
|
||||
})
|
||||
.ToList()
|
||||
.Select(ToFile)
|
||||
.ToList();
|
||||
});
|
||||
}
|
||||
|
||||
protected List<File<int>> FromQuery(IQueryable<DbFile> dbFiles)
|
||||
protected IQueryable<DbFileQuery> FromQuery(IQueryable<DbFile> dbFiles)
|
||||
{
|
||||
return dbFiles
|
||||
.Select(r => new DbFileQuery
|
||||
@ -1307,15 +1313,13 @@ namespace ASC.Files.Core.Data
|
||||
.Select(r => r.folder)
|
||||
.FirstOrDefault(),
|
||||
shared = true
|
||||
})
|
||||
.ToList()
|
||||
.Select(ToFile)
|
||||
.ToList();
|
||||
});
|
||||
}
|
||||
|
||||
public File<int> ToFile(DbFileQuery r)
|
||||
{
|
||||
var file = ServiceProvider.GetService<File<int>>();
|
||||
if (r == null) return null;
|
||||
file.ID = r.file.Id;
|
||||
file.Title = r.file.Title;
|
||||
file.FolderID = r.file.FolderId;
|
||||
|
@ -45,6 +45,7 @@ using ASC.Web.Studio.Core;
|
||||
using ASC.Web.Studio.UserControls.Statistics;
|
||||
using ASC.Web.Studio.Utility;
|
||||
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Storage;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
@ -105,49 +106,49 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
public Folder<int> GetFolder(int folderId)
|
||||
{
|
||||
var query = GetFolderQuery(r => r.Id == folderId);
|
||||
return FromQueryWithShared(query).SingleOrDefault();
|
||||
var query = GetFolderQuery(r => r.Id == folderId).AsNoTracking();
|
||||
return ToFolder(FromQueryWithShared(query).SingleOrDefault());
|
||||
}
|
||||
|
||||
public Folder<int> GetFolder(string title, int parentId)
|
||||
{
|
||||
if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(title);
|
||||
|
||||
var query = GetFolderQuery(r => r.Title == title && r.ParentId == parentId)
|
||||
var query = GetFolderQuery(r => r.Title == title && r.ParentId == parentId).AsNoTracking()
|
||||
.OrderBy(r => r.CreateOn);
|
||||
|
||||
return FromQueryWithShared(query).FirstOrDefault();
|
||||
return ToFolder(FromQueryWithShared(query).FirstOrDefault());
|
||||
}
|
||||
|
||||
public Folder<int> GetRootFolder(int folderId)
|
||||
{
|
||||
var id = FilesDbContext.Tree
|
||||
.AsNoTracking()
|
||||
.Where(r => r.FolderId == folderId)
|
||||
.OrderByDescending(r => r.Level)
|
||||
.Select(r => r.ParentId)
|
||||
.FirstOrDefault();
|
||||
|
||||
var query = GetFolderQuery(r => r.Id == id);
|
||||
var query = GetFolderQuery(r => r.Id == id).AsNoTracking();
|
||||
|
||||
return FromQueryWithShared(query).SingleOrDefault();
|
||||
return ToFolder(FromQueryWithShared(query).SingleOrDefault());
|
||||
}
|
||||
|
||||
public Folder<int> GetRootFolderByFile(int fileId)
|
||||
{
|
||||
var fileIdString = fileId.ToString();
|
||||
var subq = Query(FilesDbContext.Files)
|
||||
var subq = Query(FilesDbContext.Files).AsNoTracking()
|
||||
.Where(r => r.Id == fileId && r.CurrentVersion)
|
||||
.Select(r => r.FolderId)
|
||||
.Distinct();
|
||||
|
||||
var q = FilesDbContext.Tree
|
||||
var q = FilesDbContext.Tree.AsNoTracking()
|
||||
.Where(r => subq.Any(q => q == r.FolderId))
|
||||
.OrderByDescending(r => r.Level)
|
||||
.Select(r => r.ParentId)
|
||||
.FirstOrDefault();
|
||||
|
||||
var query = GetFolderQuery(r => r.Id == q);
|
||||
return FromQueryWithShared(query).SingleOrDefault();
|
||||
var query = GetFolderQuery(r => r.Id == q).AsNoTracking();
|
||||
return ToFolder(FromQueryWithShared(query).SingleOrDefault());
|
||||
}
|
||||
|
||||
public List<Folder<int>> GetFolders(int parentId)
|
||||
@ -165,11 +166,11 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
if (orderBy == null) orderBy = new OrderBy(SortedByType.DateAndTime, false);
|
||||
|
||||
var q = GetFolderQuery(r => r.ParentId == parentId);
|
||||
var q = GetFolderQuery(r => r.ParentId == parentId).AsNoTracking();
|
||||
|
||||
if (withSubfolders)
|
||||
{
|
||||
q = GetFolderQuery()
|
||||
q = GetFolderQuery().AsNoTracking()
|
||||
.Join(FilesDbContext.Tree, r => r.Id, a => a.FolderId, (folder, tree) => new { folder, tree })
|
||||
.Where(r => r.tree.ParentId == parentId && r.tree.Level != 0)
|
||||
.Select(r => r.folder);
|
||||
@ -219,7 +220,7 @@ namespace ASC.Files.Core.Data
|
||||
}
|
||||
}
|
||||
|
||||
return FromQueryWithShared(q);
|
||||
return FromQueryWithShared(q).Select(ToFolder).ToList();
|
||||
}
|
||||
|
||||
public List<Folder<int>> GetFolders(int[] folderIds, FilterType filterType = FilterType.None, bool subjectGroup = false, Guid? subjectID = null, string searchText = "", bool searchSubfolders = false, bool checkShare = true)
|
||||
@ -230,11 +231,12 @@ namespace ASC.Files.Core.Data
|
||||
|| filterType == FilterType.ArchiveOnly || filterType == FilterType.MediaOnly)
|
||||
return new List<Folder<int>>();
|
||||
|
||||
var q = GetFolderQuery(r => folderIds.Any(q => q == r.Id));
|
||||
var q = GetFolderQuery(r => folderIds.Any(q => q == r.Id)).AsNoTracking();
|
||||
|
||||
if (searchSubfolders)
|
||||
{
|
||||
q = GetFolderQuery()
|
||||
.AsNoTracking()
|
||||
.Join(FilesDbContext.Tree, r => r.Id, a => a.FolderId, (folder, tree) => new { folder, tree })
|
||||
.Where(r => folderIds.Any(q => q == r.folder.ParentId))
|
||||
.Select(r => r.folder);
|
||||
@ -270,18 +272,19 @@ namespace ASC.Files.Core.Data
|
||||
}
|
||||
}
|
||||
|
||||
return checkShare ? FromQueryWithShared(q) : FromQuery(q);
|
||||
return (checkShare ? FromQueryWithShared(q) : FromQuery(q)).Select(ToFolder).ToList();
|
||||
}
|
||||
|
||||
public List<Folder<int>> GetParentFolders(int folderId)
|
||||
{
|
||||
var q = GetFolderQuery()
|
||||
.AsNoTracking()
|
||||
.Join(FilesDbContext.Tree, r => r.Id, a => a.ParentId, (folder, tree) => new { folder, tree })
|
||||
.Where(r => r.tree.FolderId == folderId)
|
||||
.OrderByDescending(r => r.tree.Level)
|
||||
.Select(r => r.folder);
|
||||
|
||||
return FromQueryWithShared(q);
|
||||
return FromQueryWithShared(q).Select(ToFolder).ToList();
|
||||
}
|
||||
|
||||
public int SaveFolder(Folder<int> folder)
|
||||
@ -388,7 +391,7 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
private bool IsExist(int folderId)
|
||||
{
|
||||
return Query(FilesDbContext.Folders)
|
||||
return Query(FilesDbContext.Folders).AsNoTracking()
|
||||
.Where(r => r.Id == folderId)
|
||||
.Any();
|
||||
}
|
||||
@ -624,6 +627,7 @@ namespace ASC.Files.Core.Data
|
||||
foreach (var folderId in folderIds)
|
||||
{
|
||||
var exists = FilesDbContext.Tree
|
||||
.AsNoTracking()
|
||||
.Where(r => r.ParentId == folderId)
|
||||
.Where(r => r.FolderId == to)
|
||||
.Any();
|
||||
@ -634,11 +638,13 @@ namespace ASC.Files.Core.Data
|
||||
}
|
||||
|
||||
var title = Query(FilesDbContext.Folders)
|
||||
.AsNoTracking()
|
||||
.Where(r => r.Id == folderId)
|
||||
.Select(r => r.Title.ToLower())
|
||||
.FirstOrDefault();
|
||||
|
||||
var conflict = Query(FilesDbContext.Folders)
|
||||
.AsNoTracking()
|
||||
.Where(r => r.Title.ToLower() == title)
|
||||
.Where(r => r.ParentId == to)
|
||||
.Select(r => r.Id)
|
||||
@ -647,6 +653,7 @@ namespace ASC.Files.Core.Data
|
||||
if (conflict != 0)
|
||||
{
|
||||
FilesDbContext.Files
|
||||
.AsNoTracking()
|
||||
.Join(FilesDbContext.Files, f1 => f1.Title.ToLower(), f2 => f2.Title.ToLower(), (f1, f2) => new { f1, f2 })
|
||||
.Where(r => r.f1.TenantId == TenantID && r.f1.CurrentVersion && r.f1.FolderId == folderId)
|
||||
.Where(r => r.f2.TenantId == TenantID && r.f2.CurrentVersion && r.f2.FolderId == conflict)
|
||||
@ -655,6 +662,7 @@ namespace ASC.Files.Core.Data
|
||||
.ForEach(r => result[r.Id] = r.Title);
|
||||
|
||||
var childs = Query(FilesDbContext.Folders)
|
||||
.AsNoTracking()
|
||||
.Where(r => r.ParentId == folderId)
|
||||
.Select(r => r.Id);
|
||||
|
||||
@ -694,8 +702,8 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
private int GetFoldersCount(int parentId)
|
||||
{
|
||||
var parentIdString = parentId.ToString();
|
||||
var count = FilesDbContext.Tree
|
||||
.AsNoTracking()
|
||||
.Where(r => r.ParentId == parentId)
|
||||
.Where(r => r.Level > 0)
|
||||
.Count();
|
||||
@ -706,6 +714,7 @@ namespace ASC.Files.Core.Data
|
||||
private int GetFilesCount(int folderId)
|
||||
{
|
||||
var count = Query(FilesDbContext.Files)
|
||||
.AsNoTracking()
|
||||
.Distinct()
|
||||
.Where(r => FilesDbContext.Tree.Where(r => r.ParentId == folderId).Select(r => r.FolderId).Any(b => b == r.FolderId))
|
||||
.Count();
|
||||
@ -798,11 +807,11 @@ namespace ASC.Files.Core.Data
|
||||
if (FactoryIndexer.TrySelectIds(s => s.MatchAll(text), out var ids))
|
||||
{
|
||||
var q1 = GetFolderQuery(r => ids.Any(a => r.Id == a));
|
||||
return FromQueryWithShared(q1);
|
||||
return FromQueryWithShared(q1).Select(ToFolder).ToList();
|
||||
}
|
||||
|
||||
var q = BuildSearch(GetFolderQuery(), text, SearhTypeEnum.Any);
|
||||
return FromQueryWithShared(q);
|
||||
return FromQueryWithShared(q).Select(ToFolder).ToList();
|
||||
}
|
||||
|
||||
public IEnumerable<int> GetFolderIDs(string module, string bunch, IEnumerable<string> data, bool createIfNotExists)
|
||||
@ -813,6 +822,7 @@ namespace ASC.Files.Core.Data
|
||||
var keys = data.Select(id => string.Format("{0}/{1}/{2}", module, bunch, id)).ToArray();
|
||||
|
||||
var folderIdsDictionary = Query(FilesDbContext.BunchObjects)
|
||||
.AsNoTracking()
|
||||
.Where(r => keys.Length > 1 ? keys.Any(a => a == r.RightNode) : r.RightNode == keys[0])
|
||||
.ToDictionary(r => r.RightNode, r => r.LeftNode);
|
||||
|
||||
@ -977,7 +987,7 @@ namespace ASC.Files.Core.Data
|
||||
return q;
|
||||
}
|
||||
|
||||
protected List<Folder<int>> FromQueryWithShared(IQueryable<DbFolder> dbFiles)
|
||||
protected IQueryable<DbFolderQuery> FromQueryWithShared(IQueryable<DbFolder> dbFiles)
|
||||
{
|
||||
return dbFiles
|
||||
.Select(r => new DbFolderQuery
|
||||
@ -995,13 +1005,10 @@ namespace ASC.Files.Core.Data
|
||||
.Where(r => r.EntryType == FileEntryType.Folder)
|
||||
.Where(x => x.EntryId == r.Id.ToString())
|
||||
.Any()
|
||||
})
|
||||
.ToList()
|
||||
.Select(ToFolder)
|
||||
.ToList();
|
||||
});
|
||||
}
|
||||
|
||||
protected List<Folder<int>> FromQuery(IQueryable<DbFolder> dbFiles)
|
||||
protected IQueryable<DbFolderQuery> FromQuery(IQueryable<DbFolder> dbFiles)
|
||||
{
|
||||
return dbFiles
|
||||
.Select(r => new DbFolderQuery
|
||||
@ -1016,14 +1023,12 @@ namespace ASC.Files.Core.Data
|
||||
.Take(1)
|
||||
.FirstOrDefault(),
|
||||
shared = true
|
||||
})
|
||||
.ToList()
|
||||
.Select(ToFolder)
|
||||
.ToList();
|
||||
});
|
||||
}
|
||||
|
||||
public Folder<int> ToFolder(DbFolderQuery r)
|
||||
{
|
||||
if (r == null) return null;
|
||||
var result = ServiceProvider.GetService<Folder<int>>();
|
||||
result.ID = r.folder.Id;
|
||||
result.ParentFolderID = r.folder.ParentId;
|
||||
|
@ -267,7 +267,7 @@ namespace ASC.Files.Helpers
|
||||
request.ContentLength = 0;
|
||||
|
||||
// hack for uploader.onlyoffice.com in api requests
|
||||
var rewriterHeader = ApiContext.HttpContext.Request.Headers[HttpRequestExtensions.UrlRewriterHeader];
|
||||
var rewriterHeader = ApiContext.HttpContextAccessor.HttpContext.Request.Headers[HttpRequestExtensions.UrlRewriterHeader];
|
||||
if (!string.IsNullOrEmpty(rewriterHeader))
|
||||
{
|
||||
request.Headers[HttpRequestExtensions.UrlRewriterHeader] = rewriterHeader;
|
||||
|
@ -179,14 +179,10 @@ namespace ASC.Web.Files.Services.WCFService.FileOperations
|
||||
var finished1 = thirdpartyTask.GetProperty<string>(FINISHED);
|
||||
var finished2 = daoTask.GetProperty<string>(FINISHED);
|
||||
|
||||
if (!string.IsNullOrEmpty(finished1))
|
||||
if (!string.IsNullOrEmpty(finished1) && !string.IsNullOrEmpty(finished2))
|
||||
{
|
||||
TaskInfo.SetProperty(FINISHED, finished1);
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(finished2))
|
||||
{
|
||||
TaskInfo.SetProperty(FINISHED, finished2);
|
||||
}
|
||||
|
||||
successProcessed = thirdpartyTask.GetProperty<int>(PROCESSED) + daoTask.GetProperty<int>(PROCESSED);
|
||||
|
||||
@ -358,9 +354,9 @@ namespace ASC.Web.Files.Services.WCFService.FileOperations
|
||||
|
||||
protected void ProgressStep(TId folderId = default, TId fileId = default)
|
||||
{
|
||||
if (folderId == null && fileId == null
|
||||
|| folderId != null && Folders.Contains(folderId)
|
||||
|| fileId != null && Files.Contains(fileId))
|
||||
if (folderId.Equals(default(TId)) && fileId.Equals(default(TId))
|
||||
|| !folderId.Equals(default(TId)) && Folders.Contains(folderId)
|
||||
|| !fileId.Equals(default(TId)) && Files.Contains(fileId))
|
||||
{
|
||||
processed++;
|
||||
PublishTaskInfo();
|
||||
|
@ -751,10 +751,10 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
|
||||
[Create("{userid}/photo")]
|
||||
public People.Models.FileUploadResult UploadMemberPhoto(string userid, IFormCollection model)
|
||||
public FileUploadResult UploadMemberPhoto(string userid, IFormCollection model)
|
||||
{
|
||||
var result = new People.Models.FileUploadResult();
|
||||
bool autosave = Boolean.Parse(model["Autosave"]);
|
||||
var autosave = bool.Parse(model["Autosave"]);
|
||||
|
||||
try
|
||||
{
|
||||
@ -1423,7 +1423,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
if (!files.StartsWith("http://") && !files.StartsWith("https://"))
|
||||
{
|
||||
files = new Uri(ApiContext.HttpContext.Request.GetDisplayUrl()).GetLeftPart(UriPartial.Scheme | UriPartial.Authority) + "/" + files.TrimStart('/');
|
||||
files = new Uri(ApiContext.HttpContextAccessor.HttpContext.Request.GetDisplayUrl()).GetLeftPart(UriPartial.Scheme | UriPartial.Authority) + "/" + files.TrimStart('/');
|
||||
}
|
||||
var request = WebRequest.Create(files);
|
||||
using var response = (HttpWebResponse)request.GetResponse();
|
||||
|
@ -18,7 +18,7 @@
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.4" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
@ -24,8 +24,8 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.4" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@ -303,14 +303,12 @@ export function getShareFiles(fileId) {
|
||||
});
|
||||
}
|
||||
|
||||
export function setShareFolder(folderId, shareTo, access, notify, sharingMessage) {
|
||||
const share = [shareTo, access];
|
||||
export function setShareFolder(folderId, share, notify, sharingMessage) {
|
||||
const data = { share, notify, sharingMessage };
|
||||
return request({ method: "put", url: `/files/folder/${folderId}/share`, data });
|
||||
}
|
||||
|
||||
export function setShareFiles(fileId, shareTo, access, notify, sharingMessage) {
|
||||
const share = [shareTo, access];
|
||||
export function setShareFiles(fileId, share, notify, sharingMessage) {
|
||||
const data = { share, notify, sharingMessage };
|
||||
return request({ method: "put", url: `/files/file/${fileId}/share`, data });
|
||||
}
|
||||
@ -323,3 +321,17 @@ export function startUploadSession(folderId, fileName, fileSize, relativePath) {
|
||||
export function uploadFile(url, data) {
|
||||
return axios.post(url, data);
|
||||
}
|
||||
|
||||
export function downloadFiles(fileIds, folderIds) {
|
||||
const data = { fileIds, folderIds };
|
||||
return request({ method: "put", url: "/files/fileops/bulkdownload", data });
|
||||
}
|
||||
|
||||
export function downloadFormatFiles(fileConvertIds, folderIds) {
|
||||
const data = { folderIds, fileConvertIds };
|
||||
return request({ method: "put", url: "/files/fileops/bulkdownload", data });
|
||||
}
|
||||
|
||||
export function getProgress() {
|
||||
return request({ method: "get", url: "/files/fileops" });
|
||||
}
|
||||
|
@ -211,7 +211,7 @@
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="System.Resources.Extensions" Version="4.7.0" />
|
||||
<PackageReference Include="System.Resources.Extensions" Version="4.7.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -215,7 +215,7 @@ namespace ASC.Web.Studio.Utility
|
||||
{
|
||||
var productID = Guid.Empty;
|
||||
|
||||
if (HttpContext != null)
|
||||
if (HttpContextAccessor?.HttpContext != null)
|
||||
{
|
||||
GetLocationByRequest(out var product, out _);
|
||||
if (product != null) productID = product.ID;
|
||||
@ -228,9 +228,9 @@ namespace ASC.Web.Studio.Utility
|
||||
{
|
||||
var addonID = Guid.Empty;
|
||||
|
||||
if (HttpContext != null)
|
||||
if (HttpContextAccessor?.HttpContext != null)
|
||||
{
|
||||
var addonName = GetAddonNameFromUrl(HttpContext.Request.Url().AbsoluteUri);
|
||||
var addonName = GetAddonNameFromUrl(HttpContextAccessor.HttpContext.Request.Url().AbsoluteUri);
|
||||
|
||||
switch (addonName)
|
||||
{
|
||||
@ -254,9 +254,9 @@ namespace ASC.Web.Studio.Utility
|
||||
public void GetLocationByRequest(out IProduct currentProduct, out IModule currentModule)
|
||||
{
|
||||
var currentURL = string.Empty;
|
||||
if (HttpContext?.Request != null)
|
||||
if (HttpContextAccessor?.HttpContext?.Request != null)
|
||||
{
|
||||
currentURL = HttpContext.Request.GetUrlRewriter().AbsoluteUri;
|
||||
currentURL = HttpContextAccessor.HttpContext.Request.GetUrlRewriter().AbsoluteUri;
|
||||
|
||||
//TODO ?
|
||||
// http://[hostname]/[virtualpath]/[AjaxPro.Utility.HandlerPath]/[assembly],[classname].ashx
|
||||
|
@ -15,7 +15,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.2" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.4" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
Loading…
Reference in New Issue
Block a user