Merge branch 'develop' into feature/backup.core
# Conflicts: # common/services/ASC.Data.Backup/Program.cs
This commit is contained in:
commit
d099326e7f
162
common/ASC.Data.Backup.Core/BackupResource.Designer.cs
generated
162
common/ASC.Data.Backup.Core/BackupResource.Designer.cs
generated
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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();
|
||||
|
@ -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 != '') {
|
||||
|
@ -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>();
|
||||
|
@ -23,6 +23,7 @@ class SettingsStore {
|
||||
favoritesSection = null;
|
||||
recentSection = null;
|
||||
hideConfirmConvertSave = null;
|
||||
chunkUploadSize = 1024 * 1023; // 1024 * 1023; //~0.999mb
|
||||
|
||||
settingsIsLoaded = false;
|
||||
|
||||
|
@ -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++;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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"
|
||||
}
|
||||
|
@ -3,7 +3,9 @@
|
||||
"FileName": "Имя файла",
|
||||
"FolderForSave": "Папка для сохранения",
|
||||
"OpenSavedDocument": "Открыть сохраненный документ в новой вкладке",
|
||||
"ImageFileType": "Выбрать файлы типа: изображения",
|
||||
"SelectFilesType": "Выбрать файлы типа: {{fileType}}",
|
||||
"ImageFileType": "изображения",
|
||||
"DocumentsFileType": "документы",
|
||||
"MailMergeFileType": "Выбрать файлы в формате XLSX",
|
||||
"SelectFileTitle": "Выбрать источник данных"
|
||||
}
|
||||
|
@ -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")}
|
||||
/>
|
||||
|
Loading…
Reference in New Issue
Block a user