Merge branch 'develop' into feature/backup.core

# Conflicts:
#	common/services/ASC.Data.Backup/Program.cs
This commit is contained in:
pavelbannov 2021-09-05 12:50:05 +03:00
commit d099326e7f
19 changed files with 267 additions and 195 deletions

View File

@ -1,81 +1,81 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ASC.Data.Backup.Core {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class BackupResource {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal BackupResource() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASC.Data.Backup.Core.BackupResource", typeof(BackupResource).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to The backup file is invalid. Please, use a file created in ONLYOFFICE v11.5 or later..
/// </summary>
internal static string BackupNotFound {
get {
return ResourceManager.GetString("BackupNotFound", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Set Password.
/// </summary>
internal static string ButtonSetPassword {
get {
return ResourceManager.GetString("ButtonSetPassword", resourceCulture);
}
}
}
}
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ASC.Data.Backup.Core {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class BackupResource {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal BackupResource() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ASC.Data.Backup.Core.BackupResource", typeof(BackupResource).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to The backup file is invalid. Please, use a file created in ONLYOFFICE v11.5 or later..
/// </summary>
internal static string BackupNotFound {
get {
return ResourceManager.GetString("BackupNotFound", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Set Password.
/// </summary>
internal static string ButtonSetPassword {
get {
return ResourceManager.GetString("ButtonSetPassword", resourceCulture);
}
}
}
}

View File

@ -907,16 +907,19 @@ namespace ASC.Data.Storage.S3
return true;
}
catch (AmazonS3Exception ex)
catch (AggregateException agg)
{
if (string.Equals(ex.ErrorCode, "NoSuchBucket"))
if (agg.InnerException is AmazonS3Exception ex)
{
return false;
}
if (string.Equals(ex.ErrorCode, "NoSuchBucket"))
{
return false;
}
if (string.Equals(ex.ErrorCode, "NotFound"))
{
return false;
if (string.Equals(ex.ErrorCode, "NotFound"))
{
return false;
}
}
throw;

View File

@ -24,7 +24,7 @@ namespace ASC.Data.Backup
await host.RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSystemd()
.UseWindowsService()
@ -67,6 +67,7 @@ namespace ASC.Data.Backup
.AddJsonFile($"appsettings.{env}.json", true)
.AddJsonFile("storage.json")
.AddJsonFile("notify.json")
.AddJsonFile($"notify.{env}.json", true)
.AddJsonFile("backup.json")
.AddJsonFile("kafka.json")
.AddJsonFile($"kafka.{env}.json", true)

View File

@ -95,7 +95,8 @@ namespace ASC.Data.Storage.Encryption
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env}.json", true)
.AddJsonFile("storage.json")
.AddJsonFile("notify.json")
.AddJsonFile("notify.json")
.AddJsonFile($"notify.{env}.json", true)
.AddJsonFile("kafka.json")
.AddJsonFile($"kafka.{env}.json", true)
.AddEnvironmentVariables();

View File

@ -49,6 +49,7 @@ namespace ASC.Data.Storage.Migration
.AddJsonFile($"appsettings.services.json", true)
.AddJsonFile("storage.json")
.AddJsonFile("notify.json")
.AddJsonFile($"notify.{env}.json", true)
.AddJsonFile("kafka.json")
.AddJsonFile($"kafka.{env}.json", true)
.AddEnvironmentVariables()

View File

@ -100,7 +100,7 @@ namespace ASC.ElasticSearch
SearchSettingsHelper searchSettingsHelper,
FactoryIndexer factoryIndexer,
BaseIndexer<T> baseIndexer,
IServiceProvider serviceProvider,
IServiceProvider serviceProvider,
ICache cache)
{
Cache = cache;
@ -229,7 +229,7 @@ namespace ASC.ElasticSearch
{
Thread.Sleep(60000);
if (retry < 5)
{
{
Index(data, immediately, retry++);
return;
}
@ -558,7 +558,6 @@ namespace ASC.ElasticSearch
private readonly ICache cache;
private IServiceProvider ServiceProvider { get; }
private FactoryIndexerHelper FactoryIndexerHelper { get; }
internal static bool Init { get; set; }
public ILog Log { get; }
private Client Client { get; }
private CoreBaseSettings CoreBaseSettings { get; }
@ -568,7 +567,7 @@ namespace ASC.ElasticSearch
FactoryIndexerHelper factoryIndexerHelper,
Client client,
IOptionsMonitor<ILog> options,
CoreBaseSettings coreBaseSettings,
CoreBaseSettings coreBaseSettings,
ICache cache)
{
this.cache = cache;
@ -589,8 +588,6 @@ namespace ASC.ElasticSearch
public bool CheckState(bool cacheState = true)
{
if (!Init) return false;
const string key = "elasticsearch";
if (cacheState)
@ -633,8 +630,6 @@ namespace ASC.ElasticSearch
public async Task<bool> CheckStateAsync(bool cacheState = true)
{
if (!Init) return false;
const string key = "elasticsearch";
if (cacheState)

View File

@ -51,6 +51,7 @@ namespace ASC.Notify
.AddJsonFile($"appsettings.services.json", true)
.AddJsonFile("storage.json")
.AddJsonFile("notify.json")
.AddJsonFile($"notify.{env}.json", true)
.AddJsonFile("kafka.json")
.AddJsonFile($"kafka.{env}.json", true)
.AddEnvironmentVariables()

View File

@ -52,6 +52,7 @@ namespace ASC.Studio.Notify
.AddJsonFile($"appsettings.services.json", true)
.AddJsonFile("storage.json")
.AddJsonFile("notify.json")
.AddJsonFile($"notify.{env}.json", true)
.AddJsonFile("kafka.json")
.AddJsonFile($"kafka.{env}.json", true)
.AddEnvironmentVariables()

View File

@ -95,7 +95,8 @@ namespace ASC.TelegramService
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env}.json", true)
.AddJsonFile("storage.json")
.AddJsonFile("notify.json")
.AddJsonFile("notify.json")
.AddJsonFile($"notify.{env}.json", true)
.AddJsonFile("kafka.json")
.AddJsonFile($"kafka.{env}.json", true)
.AddEnvironmentVariables();

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

@ -54,7 +54,8 @@ namespace ASC.CRM.BackgroundTasks
.AddJsonFile($"appsettings.{env}.json", true)
.AddJsonFile($"appsettings.services.json", true)
.AddJsonFile("storage.json")
.AddJsonFile("notify.json")
.AddJsonFile("notify.json")
.AddJsonFile($"notify.{env}.json", true)
.AddJsonFile("kafka.json")
.AddJsonFile($"kafka.{env}.json", true)
.AddEnvironmentVariables()
@ -68,8 +69,8 @@ namespace ASC.CRM.BackgroundTasks
diHelper.TryAdd(typeof(ICacheNotify<>), typeof(KafkaCache<>));
diHelper.RegisterProducts(hostContext.Configuration, hostContext.HostingEnvironment.ContentRootPath);
diHelper.RegisterProducts(hostContext.Configuration, hostContext.HostingEnvironment.ContentRootPath);
services.AddHostedService<ServiceLauncher>();
diHelper.TryAdd<ServiceLauncher>();
diHelper.TryAdd<FactoryIndexerCase>();

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

@ -224,7 +224,8 @@ namespace ASC.Files.Core.Data
public List<Folder<int>> GetFolders(IEnumerable<int> folderIds, FilterType filterType = FilterType.None, bool subjectGroup = false, Guid? subjectID = null, string searchText = "", bool searchSubfolders = false, bool checkShare = true)
{
if (filterType == FilterType.FilesOnly || filterType == FilterType.ByExtension
if (!folderIds.Any()
|| filterType == FilterType.FilesOnly || filterType == FilterType.ByExtension
|| filterType == FilterType.DocumentsOnly || filterType == FilterType.ImagesOnly
|| filterType == FilterType.PresentationsOnly || filterType == FilterType.SpreadsheetsOnly
|| filterType == FilterType.ArchiveOnly || filterType == FilterType.MediaOnly)
@ -322,8 +323,8 @@ namespace ASC.Files.Core.Data
if (folder.FolderType == FolderType.DEFAULT || folder.FolderType == FolderType.BUNCH)
{
FactoryIndexer.IndexAsync(toUpdate);
}
FactoryIndexer.IndexAsync(toUpdate);
}
}
else
{
@ -345,7 +346,7 @@ namespace ASC.Files.Core.Data
FilesDbContext.SaveChanges();
if (folder.FolderType == FolderType.DEFAULT || folder.FolderType == FolderType.BUNCH)
{
FactoryIndexer.IndexAsync(newFolder);
FactoryIndexer.IndexAsync(newFolder);
}
folder.ID = newFolder.Id;
@ -703,10 +704,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 +712,11 @@ namespace ASC.Files.Core.Data
private int GetFilesCount(int folderId)
{
var count = Query(FilesDbContext.Files)
.AsNoTracking()
.Join(FilesDbContext.Tree, r => r.FolderId, r => r.FolderId, (file, tree) => new { tree, file })
.Where(r => r.tree.ParentId == folderId)
.Select(r => r.file.Id)
.Distinct()
.Count(r => FilesDbContext.Tree.Where(r => r.ParentId == folderId).Select(r => r.FolderId).Contains(r.FolderId));
.Count();
return count;
}
@ -764,9 +764,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

@ -82,7 +82,7 @@ namespace ASC.Files.Core.Data
var filesId = new HashSet<string>();
var foldersId = new HashSet<string>();
foreach(var f in fileEntries)
foreach (var f in fileEntries)
{
var id = MappingID(f.ID).ToString();
if (f.FileEntryType == FileEntryType.File)
@ -115,7 +115,7 @@ namespace ASC.Files.Core.Data
var filesId = new HashSet<string>();
var foldersId = new HashSet<string>();
foreach(var f in fileEntries)
foreach (var f in fileEntries)
{
var id = MappingID(f.ID).ToString();
if (f.FileEntryType == FileEntryType.File)
@ -127,22 +127,27 @@ namespace ASC.Files.Core.Data
foldersId.Add(id);
}
}
var q = Query(FilesDbContext.Tag)
.Where(r => tagType.Contains(r.Flag))
.Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link })
.Where(r => r.Link.TenantId == r.Tag.TenantId)
.Where(r => r.Link.EntryType == FileEntryType.File && filesId.Contains(r.Link.EntryId)
|| r.Link.EntryType == FileEntryType.Folder && foldersId.Contains(r.Link.EntryId));
if (subject != Guid.Empty)
if (fileEntries.Any())
{
q = q.Where(r => r.Link.CreateBy == subject);
var q = Query(FilesDbContext.Tag)
.Where(r => tagType.Contains(r.Flag))
.Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link })
.Where(r => r.Link.TenantId == r.Tag.TenantId)
.Where(r => r.Link.EntryType == FileEntryType.File && filesId.Contains(r.Link.EntryId)
|| r.Link.EntryType == FileEntryType.Folder && foldersId.Contains(r.Link.EntryId));
if (subject != Guid.Empty)
{
q = q.Where(r => r.Link.CreateBy == subject);
}
return FromQuery(q)
.GroupBy(r => r.EntryId)
.ToDictionary(r => r.Key, r => r.AsEnumerable());
}
return FromQuery(q)
.GroupBy(r=> r.EntryId)
.ToDictionary(r=> r.Key, r=> r.AsEnumerable());
return new Dictionary<object, IEnumerable<Tag>>();
}
public IEnumerable<Tag> GetTags(TagType tagType, IEnumerable<FileEntry<T>> fileEntries)
@ -412,7 +417,7 @@ namespace ASC.Files.Core.Data
if (tag == null) return;
var id = Query(FilesDbContext.Tag)
.Where(r => r.Name == tag.TagName &&
.Where(r => r.Name == tag.TagName &&
r.Owner == tag.Owner &&
r.Flag == tag.TagType)
.Select(r => r.Id)
@ -422,7 +427,7 @@ namespace ASC.Files.Core.Data
{
var entryId = MappingID(tag.EntryId).ToString();
var toDelete = Query(FilesDbContext.TagLink)
.Where(r => r.TagId == id &&
.Where(r => r.TagId == id &&
r.EntryId == entryId &&
r.EntryType == tag.EntryType);
@ -446,8 +451,7 @@ namespace ASC.Files.Core.Data
public IEnumerable<Tag> GetNewTags(Guid subject, IEnumerable<FileEntry<T>> fileEntries)
{
List<Tag> result;
var result = new List<Tag>();
var tags = new List<DbFilesTagLink>();
var entryIds = new HashSet<string>();
var entryTypes = new HashSet<int>();
@ -467,21 +471,24 @@ namespace ASC.Files.Core.Data
entryIds.Add(id);
entryTypes.Add((int)entryType);
}
var sqlQuery = Query(FilesDbContext.Tag)
.Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link })
.Where(r => r.Link.TenantId == r.Tag.TenantId)
.Where(r => r.Tag.Flag == TagType.New)
.Where(x => x.Link.EntryId != null)
//.Where(r => tags.Any(t => t.TenantId == r.Link.TenantId && t.EntryId == r.Link.EntryId && t.EntryType == (int)r.Link.EntryType)); ;
.Where(r => entryIds.Contains(r.Link.EntryId) && entryTypes.Contains((int)r.Link.EntryType));
if (subject != Guid.Empty)
{
sqlQuery = sqlQuery.Where(r => r.Tag.Owner == subject);
}
result = FromQuery(sqlQuery);
if (entryIds.Any())
{
var sqlQuery = Query(FilesDbContext.Tag)
.Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link })
.Where(r => r.Link.TenantId == r.Tag.TenantId)
.Where(r => r.Tag.Flag == TagType.New)
.Where(x => x.Link.EntryId != null)
//.Where(r => tags.Any(t => t.TenantId == r.Link.TenantId && t.EntryId == r.Link.EntryId && t.EntryType == (int)r.Link.EntryType)); ;
.Where(r => entryIds.Contains(r.Link.EntryId) && entryTypes.Contains((int)r.Link.EntryType));
if (subject != Guid.Empty)
{
sqlQuery = sqlQuery.Where(r => r.Tag.Owner == subject);
}
result = FromQuery(sqlQuery);
}
return result;
}
@ -551,7 +558,7 @@ namespace ASC.Files.Core.Data
r.tagLink,
root = FilesDbContext.Folders
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
.Where(x => x.folder.TenantId ==TenantID)
.Where(x => x.folder.TenantId == TenantID)
.Where(x => x.tree.FolderId == r.folder.ParentId)
.OrderByDescending(r => r.tree.Level)
.Select(r => r.folder)
@ -589,7 +596,7 @@ namespace ASC.Files.Core.Data
new Func<IQueryable<TagLinkData>>(() => getBaseSqlQuery().Where(
r => FilesDbContext.Security
.Any(a => a.TenantId == TenantID &&
a.EntryId == r.Link.EntryId &&
a.EntryId == r.Link.EntryId &&
a.EntryType == r.Link.EntryType)));
var tmpShareFileTags =
@ -643,8 +650,8 @@ namespace ASC.Files.Core.Data
{
var q = getBaseSqlQuery()
.Join(FilesDbContext.BunchObjects, r => r.Link.TenantId, r => r.TenantId, (tagLink, bunch) => new { tagLink, bunch })
.Where(r => r.bunch.LeftNode == r.tagLink.Link.EntryId &&
r.tagLink.Link.EntryType == FileEntryType.Folder &&
.Where(r => r.bunch.LeftNode == r.tagLink.Link.EntryId &&
r.tagLink.Link.EntryType == FileEntryType.Folder &&
r.bunch.RightNode.StartsWith("projects/project/"))
.Select(r => r.tagLink)
.Distinct();
@ -714,17 +721,20 @@ namespace ASC.Files.Core.Data
.Concat(folderIds.ConvertAll(r => $"spoint-{r}"))
.Concat(folderIds.ConvertAll(r => $"drive-{r}"))
.Concat(folderIds.ConvertAll(r => $"onedrive-{r}"));
var newTagsForSBox = getBaseSqlQuery()
.Join(FilesDbContext.ThirdpartyIdMapping, r => r.Link.EntryId, r => r.HashId, (tagLink, mapping) => new { tagLink, mapping })
.Where(r => r.mapping.TenantId == TenantID &&
thirdpartyFolderIds.Contains(r.mapping.Id) &&
r.tagLink.Tag.Owner == subject &&
r.tagLink.Link.EntryType == FileEntryType.Folder)
.Select(r => r.tagLink)
.Distinct();
result.AddRange(FromQuery(newTagsForSBox));
if (thirdpartyFolderIds.Any())
{
var newTagsForSBox = getBaseSqlQuery()
.Join(FilesDbContext.ThirdpartyIdMapping, r => r.Link.EntryId, r => r.HashId, (tagLink, mapping) => new { tagLink, mapping })
.Where(r => r.mapping.TenantId == TenantID &&
thirdpartyFolderIds.Contains(r.mapping.Id) &&
r.tagLink.Tag.Owner == subject &&
r.tagLink.Link.EntryType == FileEntryType.Folder)
.Select(r => r.tagLink)
.Distinct();
result.AddRange(FromQuery(newTagsForSBox));
}
}
return result;
@ -733,7 +743,7 @@ namespace ASC.Files.Core.Data
protected List<Tag> FromQuery(IQueryable<TagLinkData> dbFilesTags)
{
return dbFilesTags
.Select(r=> new TagLinkData()
.Select(r => new TagLinkData()
{
Tag = new DbFilesTag
{
@ -744,9 +754,9 @@ namespace ASC.Files.Core.Data
},
Link = new DbFilesTagLink
{
TagCount = r.Link.TagCount,
EntryId = r.Link.EntryId,
EntryType = r.Link.EntryType
TagCount = r.Link.TagCount,
EntryId = r.Link.EntryId,
EntryType = r.Link.EntryType
}
})
.AsEnumerable()

View File

@ -58,6 +58,7 @@ namespace ASC.Files.Service
.AddJsonFile($"appsettings.services.json", true)
.AddJsonFile("storage.json")
.AddJsonFile("notify.json")
.AddJsonFile($"notify.{env}.json", true)
.AddJsonFile("kafka.json")
.AddJsonFile($"kafka.{env}.json", true)
.AddJsonFile("elastic.json", true)

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";
@ -53,8 +53,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;
@ -113,6 +114,13 @@ const Editor = () => {
url: link.url,
});
};
const compareFiles = (link) => {
docEditor.setRevisedFile({
fileType: link.filetype,
url: link.url,
});
};
const updateFavorite = (favorite) => {
docEditor.setFavorite(favorite);
};
@ -442,7 +450,8 @@ const Editor = () => {
onRequestRename,
onRequestSaveAs,
onRequestInsertImage,
onRequestMailMergeRecipients;
onRequestMailMergeRecipients,
onRequestCompareFile;
if (isSharingAccess) {
onRequestSharingSettings = onSDKRequestSharingSettings;
@ -456,6 +465,7 @@ const Editor = () => {
onRequestSaveAs = onSDKRequestSaveAs;
onRequestInsertImage = onSDKRequestInsertImage;
onRequestMailMergeRecipients = onSDKRequestMailMergeRecipients;
onRequestCompareFile = onSDKRequestCompareFile;
}
const events = {
@ -473,6 +483,7 @@ const Editor = () => {
onRequestInsertImage,
onRequestSaveAs,
onRequestMailMergeRecipients,
onRequestCompareFile,
},
};
@ -599,11 +610,20 @@ const Editor = () => {
setIsFileDialogVisible(true);
};
const onSDKRequestCompareFile = () => {
setFilesType(compareFilesAction);
setIsFileDialogVisible(true);
};
const onSelectFile = async (file) => {
const link = await getPresignedUri(file.id);
try {
const link = await getPresignedUri(file.id);
if (filesType === insertImageAction) insertImage(link);
if (filesType === mailMergeAction) mailMerge(link);
if (filesType === insertImageAction) insertImage(link);
if (filesType === mailMergeAction) mailMerge(link);
if (filesType === compareFilesAction) compareFiles(link);
} catch (e) {
console.error(e);
}
};
const onCloseFileDialog = () => {
@ -642,6 +662,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,
};
@ -650,16 +696,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
@ -687,9 +738,7 @@ const Editor = () => {
isPanelVisible={isFileDialogVisible}
onClose={onCloseFileDialog}
foldersType="exceptTrashFolder"
{...(filesType === insertImageAction
? insertImageActionProps
: mailMergeActionProps)}
{...fileTypeDetection()}
header={<SelectFileHeader />}
headerName={i18n.t("SelectFileTitle")}
/>