Merge branch 'develop' into release/1.0.0

This commit is contained in:
Ilya Oleshko 2021-09-01 16:08:41 +03:00
commit fa204303f5
27 changed files with 124 additions and 100 deletions

View File

@ -79,7 +79,6 @@ namespace ASC.Core.Data
MaxFileSize = GetInBytes(r.MaxFileSize),
MaxTotalSize = GetInBytes(r.MaxTotalSize),
Price = r.Price,
Price2 = r.Price2,
Visible = r.Visible
};
@ -127,7 +126,6 @@ namespace ASC.Core.Data
ActiveUsers = quota.ActiveUsers,
Features = quota.Features,
Price = quota.Price,
Price2 = quota.Price2,
AvangateId = quota.AvangateId,
Visible = quota.Visible
};

View File

@ -14,7 +14,6 @@ namespace ASC.Core.Common.EF
public int ActiveUsers { get; set; }
public string Features { get; set; }
public decimal Price { get; set; }
public decimal Price2 { get; set; }
public string AvangateId { get; set; }
public bool Visible { get; set; }
public override object[] GetKeys()
@ -30,7 +29,7 @@ namespace ASC.Core.Common.EF
.Add(MySqlAddDbQuota, Provider.MySql)
.Add(PgSqlAddDbQuota, Provider.Postgre)
.HasData(
new DbQuota { Tenant = -1, Name = "default", Description = null, MaxFileSize = 102400, MaxTotalSize = 10995116277760, ActiveUsers = 10000, Features = "domain,audit,controlpanel,healthcheck,ldap,sso,whitelabel,branding,ssbranding,update,support,portals:10000,discencryption,privacyroom,restore", Price = decimal.Parse("0,00"), Price2 = decimal.Parse("0,00"), AvangateId = "0", Visible = false }
new DbQuota { Tenant = -1, Name = "default", Description = null, MaxFileSize = 102400, MaxTotalSize = 10995116277760, ActiveUsers = 10000, Features = "domain,audit,controlpanel,healthcheck,ldap,sso,whitelabel,branding,ssbranding,update,support,portals:10000,discencryption,privacyroom,restore", Price = decimal.Parse("0,00"), AvangateId = "0", Visible = false }
);
return modelBuilder;
@ -81,10 +80,6 @@ namespace ASC.Core.Common.EF
.HasColumnName("price")
.HasColumnType("decimal(10,2)");
entity.Property(e => e.Price2)
.HasColumnName("price2")
.HasColumnType("decimal(10,2)");
entity.Property(e => e.Visible).HasColumnName("visible");
});
}
@ -131,11 +126,6 @@ namespace ASC.Core.Common.EF
.HasColumnType("numeric(10,2)")
.HasDefaultValueSql("0.00");
entity.Property(e => e.Price2)
.HasColumnName("price2")
.HasColumnType("numeric(10,2)")
.HasDefaultValueSql("0.00");
entity.Property(e => e.Visible).HasColumnName("visible");
});
}

View File

@ -657,10 +657,6 @@ namespace ASC.Core.Common.Migrations.MySql.CoreDbContextMySql
.HasColumnType("decimal(10,2)")
.HasColumnName("price");
b.Property<decimal>("Price2")
.HasColumnType("decimal(10,2)")
.HasColumnName("price2");
b.Property<bool>("Visible")
.HasColumnType("tinyint(1)")
.HasColumnName("visible");
@ -681,7 +677,6 @@ namespace ASC.Core.Common.Migrations.MySql.CoreDbContextMySql
MaxTotalSize = 10995116277760L,
Name = "default",
Price = 0.00m,
Price2 = 0.00m,
Visible = false
});
});

View File

@ -58,7 +58,6 @@ namespace ASC.Core.Common.Migrations.MySql.CoreDbContextMySql
features = table.Column<string>(type: "text", nullable: true, collation: "utf8_general_ci")
.Annotation("MySql:CharSet", "utf8"),
price = table.Column<decimal>(type: "decimal(10,2)", nullable: false),
price2 = table.Column<decimal>(type: "decimal(10,2)", nullable: false),
avangate_id = table.Column<string>(type: "varchar(128)", nullable: true, collation: "utf8_general_ci")
.Annotation("MySql:CharSet", "utf8"),
visible = table.Column<bool>(type: "tinyint(1)", nullable: false)
@ -181,8 +180,8 @@ namespace ASC.Core.Common.Migrations.MySql.CoreDbContextMySql
migrationBuilder.InsertData(
table: "tenants_quota",
columns: new[] { "tenant", "active_users", "avangate_id", "description", "features", "max_file_size", "max_total_size", "name", "price", "price2", "visible" },
values: new object[] { -1, 10000, "0", null, "domain,audit,controlpanel,healthcheck,ldap,sso,whitelabel,branding,ssbranding,update,support,portals:10000,discencryption,privacyroom,restore", 102400L, 10995116277760L, "default", 0.00m, 0.00m, false });
columns: new[] { "tenant", "active_users", "avangate_id", "description", "features", "max_file_size", "max_total_size", "name", "price", "visible" },
values: new object[] { -1, 10000, "0", null, "domain,audit,controlpanel,healthcheck,ldap,sso,whitelabel,branding,ssbranding,update,support,portals:10000,discencryption,privacyroom,restore", 102400L, 10995116277760L, "default", 0.00m, false });
migrationBuilder.CreateIndex(
name: "last_modified",

View File

@ -655,10 +655,6 @@ namespace ASC.Core.Common.Migrations.MySql.CoreDbContextMySql
.HasColumnType("decimal(10,2)")
.HasColumnName("price");
b.Property<decimal>("Price2")
.HasColumnType("decimal(10,2)")
.HasColumnName("price2");
b.Property<bool>("Visible")
.HasColumnType("tinyint(1)")
.HasColumnName("visible");
@ -679,7 +675,6 @@ namespace ASC.Core.Common.Migrations.MySql.CoreDbContextMySql
MaxTotalSize = 10995116277760L,
Name = "default",
Price = 0.00m,
Price2 = 0.00m,
Visible = false
});
});

View File

@ -652,12 +652,6 @@ namespace ASC.Core.Common.Migrations.Npgsql.CoreDbContextNpgsql
.HasColumnType("numeric(10,2)")
.HasDefaultValueSql("0.00");
b.Property<decimal>("Price2")
.ValueGeneratedOnAdd()
.HasColumnName("price2")
.HasColumnType("numeric(10,2)")
.HasDefaultValueSql("0.00");
b.Property<bool>("Visible")
.HasColumnName("visible")
.HasColumnType("boolean");

View File

@ -56,7 +56,6 @@ namespace ASC.Core.Common.Migrations.Npgsql.CoreDbContextNpgsql
active_users = table.Column<int>(nullable: false),
features = table.Column<string>(nullable: true),
price = table.Column<decimal>(type: "numeric(10,2)", nullable: false, defaultValueSql: "0.00"),
price2 = table.Column<decimal>(type: "numeric(10,2)", nullable: false, defaultValueSql: "0.00"),
avangate_id = table.Column<string>(maxLength: 128, nullable: true, defaultValueSql: "NULL"),
visible = table.Column<bool>(nullable: false)
},

View File

@ -650,12 +650,6 @@ namespace ASC.Core.Common.Migrations.Npgsql.CoreDbContextNpgsql
.HasColumnType("numeric(10,2)")
.HasDefaultValueSql("0.00");
b.Property<decimal>("Price2")
.ValueGeneratedOnAdd()
.HasColumnName("price2")
.HasColumnType("numeric(10,2)")
.HasDefaultValueSql("0.00");
b.Property<bool>("Visible")
.HasColumnName("visible")
.HasColumnType("boolean");
@ -676,7 +670,6 @@ namespace ASC.Core.Common.Migrations.Npgsql.CoreDbContextNpgsql
MaxTotalSize = 10995116277760L,
Name = "default",
Price = 0.00m,
Price2 = 0.00m,
Visible = false
});
});

View File

@ -55,8 +55,6 @@ namespace ASC.Core.Tenants
public decimal Price { get; set; }
public decimal Price2 { get; set; }
public string AvangateId { get; set; }
public bool Visible { get; set; }

View File

@ -2,6 +2,7 @@
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<ProduceReferenceAssembly>false</ProduceReferenceAssembly>
</PropertyGroup>
<ItemGroup>

View File

@ -2,6 +2,7 @@
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<ProduceReferenceAssembly>false</ProduceReferenceAssembly>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">

View File

@ -5,13 +5,11 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\ASC.Core.Common\ASC.Core.Common.csproj" />
<PackageReference Include="NUnit" Version="3.12.0" />
</ItemGroup>
<ItemGroup>
<Reference Include="nunit.framework">
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft\Xamarin\NuGet\nunit\3.12.0\lib\netstandard2.0\nunit.framework.dll</HintPath>
</Reference>
<ProjectReference Include="..\..\ASC.Core.Common\ASC.Core.Common.csproj" />
</ItemGroup>
</Project>

View File

@ -4,15 +4,13 @@
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NUnit" Version="3.12.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\ASC.Core.Common\ASC.Core.Common.csproj" />
<ProjectReference Include="..\..\ASC.Notify.Textile\ASC.Notify.Textile.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="nunit.framework">
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft\Xamarin\NuGet\nunit\3.12.0\lib\netstandard2.0\nunit.framework.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@ -21,7 +21,7 @@
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.1.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="5.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="5.0.1" />
<PackageReference Include="WebSocketSharpNetStandart" Version="1.0.3-rc11" />
<PackageReference Include="WebSocketSharpNetStandart" Version="1.0.3-rc12" />
</ItemGroup>
<ItemGroup>

View File

@ -38,7 +38,7 @@ server {
etag on;
large_client_header_buffers 4 16k;
client_max_body_size 4G;
set $X_REWRITER_URL $the_scheme://$the_host;
if ($http_x_rewriter_url != '') {

View File

@ -23,6 +23,7 @@ class SettingsStore {
favoritesSection = null;
recentSection = null;
hideConfirmConvertSave = null;
chunkUploadSize = 1024 * 1023; // 1024 * 1023; //~0.999mb
settingsIsLoaded = false;

View File

@ -18,8 +18,6 @@ import {
moveToFolder,
} from "@appserver/common/api/files";
const chunkSize = 1024 * 1023; //~0.999mb
class UploadDataStore {
formatsStore;
treeFoldersStore;
@ -513,7 +511,9 @@ class UploadDataStore {
const { uploaded } = res.data.data;
const uploadedSize = uploaded ? fileSize : index * chunkSize;
const uploadedSize = uploaded
? fileSize
: index * this.settingsStore.chunkUploadSize;
const newPercent = this.getNewPercent(uploadedSize, indexOfFile);
@ -626,8 +626,10 @@ class UploadDataStore {
return Promise.resolve();
}
const { chunkUploadSize } = this.settingsStore;
const { file, toFolderId /*, action*/ } = item;
const chunks = Math.ceil(file.size / chunkSize, chunkSize);
const chunks = Math.ceil(file.size / chunkUploadSize, chunkUploadSize);
const fileName = file.name;
const fileSize = file.size;
const relativePath = file.path
@ -651,9 +653,9 @@ class UploadDataStore {
let chunk = 0;
while (chunk < chunks) {
const offset = chunk * chunkSize;
const offset = chunk * chunkUploadSize;
const formData = new FormData();
formData.append("file", file.slice(offset, offset + chunkSize));
formData.append("file", file.slice(offset, offset + chunkUploadSize));
requestsDataArray.push(formData);
chunk++;
}

View File

@ -31,6 +31,7 @@ using ASC.Common;
using ASC.Core;
using ASC.Core.Common.Settings;
using ASC.Files.Core;
using ASC.Web.Studio.Core;
namespace ASC.Web.Files.Classes
{
@ -115,11 +116,13 @@ namespace ASC.Web.Files.Classes
{
private SettingsManager SettingsManager { get; }
private CoreBaseSettings CoreBaseSettings { get; }
private SetupInfo SetupInfo { get; }
public FilesSettingsHelper(SettingsManager settingsManager, CoreBaseSettings coreBaseSettings)
public FilesSettingsHelper(SettingsManager settingsManager, CoreBaseSettings coreBaseSettings, SetupInfo setupInfo)
{
SettingsManager = settingsManager;
CoreBaseSettings = coreBaseSettings;
SetupInfo = setupInfo;
}
public bool ConfirmDelete
@ -285,6 +288,11 @@ namespace ASC.Web.Files.Classes
get => LoadForCurrentUser().DownloadTarGzSetting;
}
public long ChunkUploadSize
{
get => SetupInfo.ChunkUploadSize;
}
private FilesSettings LoadForCurrentUser()
{
return SettingsManager.LoadForCurrentUser<FilesSettings>();

View File

@ -703,10 +703,7 @@ namespace ASC.Files.Core.Data
private int GetFoldersCount(int parentId)
{
var count = FilesDbContext.Tree
.AsNoTracking()
.Where(r => r.ParentId == parentId)
.Where(r => r.Level > 0)
.Count();
.Count(r => r.ParentId == parentId && r.Level > 0);
return count;
}
@ -714,9 +711,8 @@ namespace ASC.Files.Core.Data
private int GetFilesCount(int folderId)
{
var count = Query(FilesDbContext.Files)
.AsNoTracking()
.Distinct()
.Count(r => FilesDbContext.Tree.Where(r => r.ParentId == folderId).Select(r => r.FolderId).Contains(r.FolderId));
.Count(r => FilesDbContext.Tree.Any(t => t.ParentId == folderId && t.FolderId == r.FolderId));
return count;
}
@ -764,9 +760,9 @@ namespace ASC.Files.Core.Data
private void RecalculateFoldersCount(int id)
{
var toUpdate = Query(FilesDbContext.Folders)
.Join(FilesDbContext.Tree, r=> r.Id, r=> r.ParentId,(file, tree) => new { file, tree })
.Join(FilesDbContext.Tree, r => r.Id, r => r.ParentId, (file, tree) => new { file, tree })
.Where(r => r.tree.FolderId == id)
.Select(r=> r.file)
.Select(r => r.file)
.ToList();
foreach (var f in toUpdate)

View File

@ -35,6 +35,11 @@ namespace ASC.Files
builder.ConfigureKestrel((hostingContext, serverOptions) =>
{
serverOptions.Limits.MaxRequestBodySize = 100 * 1024 * 1024;
serverOptions.Limits.MaxRequestBufferSize = 100 * 1024 * 1024;
serverOptions.Limits.MinRequestBodyDataRate = null;
serverOptions.Limits.MinResponseDataRate = null;
var kestrelConfig = hostingContext.Configuration.GetSection("Kestrel");
if (!kestrelConfig.Exists()) return;

View File

@ -24,7 +24,7 @@
<PackageProjectUrl>http://sta.github.io/websocket-sharp</PackageProjectUrl>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>1.0.3-rc11</Version>
<Version>1.0.3-rc12</Version>
<AssemblyVersion>1.0.2.59611</AssemblyVersion>
<FileVersion>1.0.2.59611</FileVersion>
<PackageLicenseExpression>MIT</PackageLicenseExpression>

View File

@ -153,7 +153,7 @@ namespace ASC.Web.Studio.Core
AvailableFileSize = GetAppSettings("web.available-file-size", 100L * 1024L * 1024L);
TeamlabSiteRedirect = GetAppSettings("web.teamlab-site", string.Empty);
ChunkUploadSize = GetAppSettings("files.uploader.chunk-size", 5 * 1024 * 1024);
ChunkUploadSize = GetAppSettings("files:uploader:chunk-size", 10 * 1024 * 1024);
ThirdPartyAuthEnabled = string.Equals(GetAppSettings("web.thirdparty-auth", "true"), "true");
ThirdPartyBannerEnabled = string.Equals(GetAppSettings("web.thirdparty-banner", "false"), "true");
NoTenantRedirectURL = GetAppSettings("web.notenant-url", "");

View File

@ -3,7 +3,9 @@
"FileName": "File name",
"FolderForSave": "Folder for save",
"OpenSavedDocument": "Open saved document in new tab",
"ImageFileType": "Select files of type: images",
"SelectFilesType": "Select files of type: {{fileType}}",
"ImageFileType": "images",
"DocumentsFileType": "documents",
"MailMergeFileType": "Select the file in XLSX format",
"SelectFileTitle": "Select Data Source"
}

View File

@ -3,7 +3,9 @@
"FileName": "Имя файла",
"FolderForSave": "Папка для сохранения",
"OpenSavedDocument": "Открыть сохраненный документ в новой вкладке",
"ImageFileType": "Выбрать файлы типа: изображения",
"SelectFilesType": "Выбрать файлы типа: {{fileType}}",
"ImageFileType": "изображения",
"DocumentsFileType": "документы",
"MailMergeFileType": "Выбрать файлы в формате XLSX",
"SelectFileTitle": "Выбрать источник данных"
}

View File

@ -3,7 +3,7 @@ import React, { useEffect, useState } from "react";
import Toast from "@appserver/components/toast";
import toastr from "studio/toastr";
import { toast } from "react-toastify";
import { Trans } from "react-i18next";
import Box from "@appserver/components/box";
import { regDesktop } from "@appserver/common/desktop";
import Loaders from "@appserver/common/components/Loaders";
@ -54,8 +54,9 @@ let documentIsReady = false;
const text = "text";
const spreadSheet = "spreadsheet";
const presentation = "presentation";
const insertImageAction = "imageType";
const mailMergeAction = "mailMergeType";
const insertImageAction = "imageFileType";
const mailMergeAction = "mailMergeFileType";
const compareFilesAction = "documentsFileType";
let docTitle = null;
let actionLink;
@ -115,6 +116,13 @@ const Editor = () => {
url: link.url,
});
};
const compareFiles = (link) => {
docEditor.setRevisedFile({
fileType: link.filetype,
url: link.url,
});
};
const updateFavorite = (favorite) => {
docEditor.setFavorite(favorite);
};
@ -436,7 +444,8 @@ const Editor = () => {
onRequestRename,
onRequestSaveAs,
onRequestInsertImage,
onRequestMailMergeRecipients;
onRequestMailMergeRecipients,
onRequestCompareFile;
if (isSharingAccess) {
onRequestSharingSettings = onSDKRequestSharingSettings;
@ -450,6 +459,7 @@ const Editor = () => {
onRequestSaveAs = onSDKRequestSaveAs;
onRequestInsertImage = onSDKRequestInsertImage;
onRequestMailMergeRecipients = onSDKRequestMailMergeRecipients;
onRequestCompareFile = onSDKRequestCompareFile;
}
const events = {
@ -467,6 +477,7 @@ const Editor = () => {
onRequestInsertImage,
onRequestSaveAs,
onRequestMailMergeRecipients,
onRequestCompareFile,
},
};
@ -593,11 +604,20 @@ const Editor = () => {
setIsFileDialogVisible(true);
};
const onSDKRequestCompareFile = () => {
setFilesType(compareFilesAction);
setIsFileDialogVisible(true);
};
const onSelectFile = async (file) => {
try {
const link = await getPresignedUri(file.id);
if (filesType === insertImageAction) insertImage(link);
if (filesType === mailMergeAction) mailMerge(link);
if (filesType === compareFilesAction) compareFiles(link);
} catch (e) {
console.error(e);
}
};
const onCloseFileDialog = () => {
@ -636,6 +656,32 @@ const Editor = () => {
setNewOpenTab(!openNewTab);
};
const getFileTypeTranslation = () => {
switch (filesType) {
case mailMergeAction:
return i18n.t("MailMergeFileType");
case insertImageAction:
return i18n.t("ImageFileType");
case compareFilesAction:
return i18n.t("DocumentsFileType");
}
};
const SelectFileHeader = () => {
return (
<StyledSelectFile>
<Text className="editor-select-file_text">
{filesType === mailMergeAction ? (
getFileTypeTranslation()
) : (
<Trans i18n={i18n} i18nKey="SelectFilesType" ns="Editor">
Select files of type: {{ fileType: getFileTypeTranslation() }}
</Trans>
)}
</Text>
</StyledSelectFile>
);
};
const insertImageActionProps = {
isImageOnly: true,
};
@ -644,16 +690,21 @@ const Editor = () => {
isTablesOnly: true,
searchParam: "xlsx",
};
const compareFilesActionProps = {
isDocumentsOnly: true,
};
const SelectFileHeader = () => (
<StyledSelectFile>
<Text className="editor-select-file_text">
{filesType === insertImageAction
? i18n.t("ImageFileType")
: i18n.t("MailMergeFileType")}
</Text>
</StyledSelectFile>
);
const fileTypeDetection = () => {
if (filesType === insertImageAction) {
return insertImageActionProps;
}
if (filesType === mailMergeAction) {
return mailMergeActionProps;
}
if (filesType === compareFilesAction) {
return compareFilesActionProps;
}
};
return (
<Box
@ -681,9 +732,7 @@ const Editor = () => {
isPanelVisible={isFileDialogVisible}
onClose={onCloseFileDialog}
foldersType="exceptTrashFolder"
{...(filesType === insertImageAction
? insertImageActionProps
: mailMergeActionProps)}
{...fileTypeDetection()}
header={<SelectFileHeader />}
headerName={i18n.t("SelectFileTitle")}
/>