Merge branch 'release/rc-v1.2.0' of github.com:ONLYOFFICE/DocSpace into release/rc-v1.2.0
This commit is contained in:
commit
846aa53583
@ -108,11 +108,11 @@ public class EmployeeDtoHelper
|
||||
result.Title = userInfo.Title;
|
||||
}
|
||||
|
||||
var userInfoLM = userInfo.LastModified.GetHashCode();
|
||||
// var userInfoLM = userInfo.LastModified.GetHashCode();
|
||||
|
||||
if (_httpContext.Check("avatarSmall"))
|
||||
{
|
||||
result.AvatarSmall = (await _userPhotoManager.GetSmallPhotoURL(userInfo.Id)) + $"?_={userInfoLM}";
|
||||
result.AvatarSmall = (await _userPhotoManager.GetSmallPhotoURL(userInfo.Id));// + $"?_={userInfoLM}";
|
||||
}
|
||||
|
||||
if (result.Id != Guid.Empty)
|
||||
|
@ -239,21 +239,21 @@ public class EmployeeFullDtoHelper : EmployeeDtoHelper
|
||||
FillConacts(result, userInfo);
|
||||
FillGroups(result, userInfo);
|
||||
|
||||
var userInfoLM = userInfo.LastModified.GetHashCode();
|
||||
// var userInfoLM = userInfo.LastModified.GetHashCode();
|
||||
|
||||
if (_context.Check("avatarMax"))
|
||||
{
|
||||
result.AvatarMax = await _userPhotoManager.GetMaxPhotoURL(userInfo.Id) + $"?_={userInfoLM}";
|
||||
result.AvatarMax = await _userPhotoManager.GetMaxPhotoURL(userInfo.Id);// + $"?_={userInfoLM}";
|
||||
}
|
||||
|
||||
if (_context.Check("avatarMedium"))
|
||||
{
|
||||
result.AvatarMedium = await _userPhotoManager.GetMediumPhotoURL(userInfo.Id) + $"?_={userInfoLM}";
|
||||
result.AvatarMedium = await _userPhotoManager.GetMediumPhotoURL(userInfo.Id);// + $"?_={userInfoLM}";
|
||||
}
|
||||
|
||||
if (_context.Check("avatar"))
|
||||
{
|
||||
result.Avatar = await _userPhotoManager.GetBigPhotoURL(userInfo.Id) + $"?_={userInfoLM}";
|
||||
result.Avatar = await _userPhotoManager.GetBigPhotoURL(userInfo.Id);// + $"?_={userInfoLM}";
|
||||
}
|
||||
|
||||
if (_context.Check("listAdminModules"))
|
||||
|
@ -59,7 +59,7 @@ public static class DbQuotaExtension
|
||||
Tenant = -1,
|
||||
Name = "trial",
|
||||
Description = null,
|
||||
Features = "trial,audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:100,manager:1",
|
||||
Features = "trial,audit,ldap,sso,whitelabel,thirdparty,restore,total_size:107374182400,file_size:100,manager:1",
|
||||
Price = 0,
|
||||
ProductId = null,
|
||||
Visible = false
|
||||
@ -69,7 +69,7 @@ public static class DbQuotaExtension
|
||||
Tenant = -2,
|
||||
Name = "admin",
|
||||
Description = null,
|
||||
Features = "audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:1024,manager:1",
|
||||
Features = "audit,ldap,sso,whitelabel,thirdparty,restore,total_size:107374182400,file_size:1024,manager:1",
|
||||
Price = 30,
|
||||
ProductId = "1002",
|
||||
Visible = true
|
||||
@ -79,7 +79,7 @@ public static class DbQuotaExtension
|
||||
Tenant = -3,
|
||||
Name = "startup",
|
||||
Description = null,
|
||||
Features = "free,total_size:2147483648,manager:1,room:12,usersInRoom:3",
|
||||
Features = "free,thirdparty,total_size:2147483648,manager:1,room:12,usersInRoom:3",
|
||||
Price = 0,
|
||||
ProductId = null,
|
||||
Visible = false
|
||||
|
@ -33,6 +33,7 @@ public abstract class BaseStorage : IDataStore
|
||||
public virtual bool IsSupportedPreSignedUri => true;
|
||||
public virtual bool IsSupportChunking => false;
|
||||
internal string Modulename { get; set; }
|
||||
internal bool Cache { get; set; }
|
||||
internal DataList DataList { get; set; }
|
||||
internal string Tenant { get; set; }
|
||||
internal Dictionary<string, TimeSpan> DomainsExpires { get; set; }
|
||||
@ -347,6 +348,8 @@ public abstract class BaseStorage : IDataStore
|
||||
return "/" + str.TrimStart('/');
|
||||
}
|
||||
|
||||
public abstract Task<string> GetFileEtagAsync(string domain, string path);
|
||||
|
||||
internal class MonoUri : Uri
|
||||
{
|
||||
public MonoUri(Uri baseUri, string relativeUri)
|
||||
|
@ -97,5 +97,6 @@ public class Module
|
||||
public bool Count { get; set; } = true;
|
||||
public bool DisabledEncryption { get; set; }
|
||||
public IEnumerable<Module> Domain { get; set; }
|
||||
public bool Cache { get; set; }
|
||||
}
|
||||
|
||||
|
@ -760,4 +760,15 @@ public class DiscDataStore : BaseStorage
|
||||
throw new FileNotFoundException("file not found", target);
|
||||
}
|
||||
}
|
||||
|
||||
public override Task<string> GetFileEtagAsync(string domain, string path)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(path);
|
||||
|
||||
var target = GetTarget(domain, path);
|
||||
var lastModificationDate = File.Exists(target) ? File.GetLastWriteTimeUtc(target) : throw new FileNotFoundException("File not found" + target);
|
||||
var etag = '"' + lastModificationDate.Ticks.ToString("X8", CultureInfo.InvariantCulture) + '"';
|
||||
|
||||
return Task.FromResult(etag);
|
||||
}
|
||||
}
|
||||
|
@ -854,4 +854,17 @@ public class GoogleCloudStorage : BaseStorage
|
||||
return _moduleAcl;
|
||||
}
|
||||
|
||||
public override async Task<string> GetFileEtagAsync(string domain, string path)
|
||||
{
|
||||
var storage = GetStorage();
|
||||
var objectName = MakePath(domain, path);
|
||||
|
||||
var obj = await storage.GetObjectAsync(_bucket, objectName);
|
||||
|
||||
var lastModificationDate = obj == null ? throw new FileNotFoundException("File not found" + objectName) : obj.Updated ?? obj.TimeCreated ?? DateTime.MinValue;
|
||||
|
||||
var etag = '"' + lastModificationDate.Ticks.ToString("X8", CultureInfo.InvariantCulture) + '"';
|
||||
|
||||
return etag;
|
||||
}
|
||||
}
|
||||
|
@ -309,4 +309,6 @@ public interface IDataStore
|
||||
|
||||
string GetPostParams(string domain, string directoryPath, long maxUploadSize, string contentType,
|
||||
string contentDisposition);
|
||||
|
||||
Task<string> GetFileEtagAsync(string domain, string path);
|
||||
}
|
||||
|
@ -751,4 +751,18 @@ public class RackspaceCloudStorage : BaseStorage
|
||||
}
|
||||
return _moduleAcl;
|
||||
}
|
||||
|
||||
public override Task<string> GetFileEtagAsync(string domain, string path)
|
||||
{
|
||||
var client = GetClient();
|
||||
var prefix = MakePath(domain, path);
|
||||
|
||||
var obj = client.ListObjects(_private_container, null, null, null, prefix, _region).FirstOrDefault();
|
||||
|
||||
var lastModificationDate = obj == null ? throw new FileNotFoundException("File not found" + prefix) : obj.LastModified.UtcDateTime;
|
||||
|
||||
var etag = '"' + lastModificationDate.Ticks.ToString("X8", CultureInfo.InvariantCulture) + '"';
|
||||
|
||||
return Task.FromResult(etag);
|
||||
}
|
||||
}
|
||||
|
@ -1443,6 +1443,21 @@ public class S3Storage : BaseStorage
|
||||
return method;
|
||||
}
|
||||
|
||||
public override async Task<string> GetFileEtagAsync(string domain, string path)
|
||||
{
|
||||
using var client = GetClient();
|
||||
|
||||
var getObjectMetadataRequest = new GetObjectMetadataRequest
|
||||
{
|
||||
BucketName = _bucket,
|
||||
Key = MakePath(domain, path)
|
||||
};
|
||||
|
||||
var el = await client.GetObjectMetadataAsync(getObjectMetadataRequest);
|
||||
|
||||
return el.ETag;
|
||||
}
|
||||
|
||||
private enum EncryptionMethod
|
||||
{
|
||||
None,
|
||||
|
@ -85,7 +85,9 @@ public class StorageHandler
|
||||
|
||||
var headers = header.Length > 0 ? header.Split('&').Select(HttpUtility.UrlDecode) : Array.Empty<string>();
|
||||
|
||||
if (storage.IsSupportInternalUri)
|
||||
const int bigSize = 5 * 1024 * 1024;
|
||||
|
||||
if (storage.IsSupportInternalUri && bigSize < await storage.GetFileSizeAsync(_domain, path))
|
||||
{
|
||||
var uri = await storage.GetInternalUriAsync(_domain, path, TimeSpan.FromMinutes(15), headers);
|
||||
|
||||
@ -97,7 +99,24 @@ public class StorageHandler
|
||||
return;
|
||||
}
|
||||
|
||||
if (!String.IsNullOrEmpty(context.Request.Query["_"]))
|
||||
{
|
||||
context.Response.Headers["Cache-Control"] = "public, max-age=31536000";
|
||||
}
|
||||
|
||||
var etag = await storage.GetFileEtagAsync(_domain, path);
|
||||
|
||||
if (string.Equals(context.Request.Headers["If-None-Match"], etag))
|
||||
{
|
||||
context.Response.StatusCode = (int)HttpStatusCode.NotModified;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
context.Response.Headers.ETag = etag;
|
||||
|
||||
string encoding = null;
|
||||
|
||||
if (storage is DiscDataStore && await storage.IsFileAsync(_domain, path + ".gz"))
|
||||
{
|
||||
path += ".gz";
|
||||
|
@ -73,8 +73,6 @@ public class MigrationCreator
|
||||
_moduleProvider = moduleProvider;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public async Task<string> Create(int tenant, string userName, string toRegion)
|
||||
{
|
||||
Init(tenant, userName, toRegion);
|
||||
@ -122,7 +120,8 @@ public class MigrationCreator
|
||||
using (var connection = _dbFactory.OpenConnection())
|
||||
{
|
||||
foreach (var table in tablesToProcess)
|
||||
{
|
||||
{
|
||||
Console.WriteLine($"backup table {table.Name}");
|
||||
using (var data = new DataTable(table.Name))
|
||||
{
|
||||
ActionInvoker.Try(
|
||||
@ -170,7 +169,7 @@ public class MigrationCreator
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void ChangeAlias(DataTable data)
|
||||
{
|
||||
@ -211,10 +210,12 @@ public class MigrationCreator
|
||||
}
|
||||
|
||||
private async Task DoMigrationStorage(Guid id, IDataWriteOperator writer)
|
||||
{
|
||||
{
|
||||
Console.WriteLine($"start backup storage");
|
||||
var fileGroups = await GetFilesGroup(id);
|
||||
foreach (var group in fileGroups)
|
||||
{
|
||||
{
|
||||
Console.WriteLine($"start backup fileGroup: {group}");
|
||||
foreach (var file in group)
|
||||
{
|
||||
var storage = _storageFactory.GetStorage(_tenant, group.Key);
|
||||
@ -225,8 +226,8 @@ public class MigrationCreator
|
||||
using var fileStream = storage.GetReadStreamAsync(f.Domain, f.Path).Result;
|
||||
writer.WriteEntry(file1.GetZipKey(), fileStream);
|
||||
}, file, 5);
|
||||
|
||||
}
|
||||
}
|
||||
Console.WriteLine($"end backup fileGroup: {group}");
|
||||
}
|
||||
|
||||
var restoreInfoXml = new XElement(
|
||||
@ -239,7 +240,8 @@ public class MigrationCreator
|
||||
{
|
||||
restoreInfoXml.WriteTo(tmpFile);
|
||||
writer.WriteEntry(KeyHelper.GetStorageRestoreInfoZipKey(), tmpFile);
|
||||
}
|
||||
}
|
||||
Console.WriteLine($"end backup storage");
|
||||
}
|
||||
|
||||
private async Task<List<IGrouping<string, BackupFileInfo>>> GetFilesGroup(Guid id)
|
||||
|
@ -66,14 +66,17 @@ public class MigrationRunner
|
||||
_region = region;
|
||||
_modules = _moduleProvider.AllModules.Where(m => _namesModules.Contains(m.ModuleName)).ToList();
|
||||
_backupFile = backupFile;
|
||||
var columnMapper = new ColumnMapper();
|
||||
var columnMapper = new ColumnMapper();
|
||||
|
||||
using (var dataReader = new ZipReadOperator(_backupFile))
|
||||
{
|
||||
foreach (var module in _modules)
|
||||
{
|
||||
{
|
||||
Console.WriteLine($"start restore module: {module}");
|
||||
var restoreTask = new RestoreDbModuleTask(_logger, module, dataReader, columnMapper, _dbFactory, false, false, _region, _storageFactory, _storageFactoryConfig, _moduleProvider);
|
||||
|
||||
await restoreTask.RunJob();
|
||||
await restoreTask.RunJob();
|
||||
Console.WriteLine($"end restore module: {module}");
|
||||
}
|
||||
|
||||
await DoRestoreStorage(dataReader, columnMapper);
|
||||
@ -87,7 +90,8 @@ public class MigrationRunner
|
||||
var fileGroups = GetFilesToProcess(dataReader).GroupBy(file => file.Module).ToList();
|
||||
|
||||
foreach (var group in fileGroups)
|
||||
{
|
||||
{
|
||||
Console.WriteLine($"start restore fileGroup: {group}");
|
||||
foreach (var file in group)
|
||||
{
|
||||
var storage = _storageFactory.GetStorage(columnMapper.GetTenantMapping(), group.Key, _region);
|
||||
@ -112,7 +116,8 @@ public class MigrationRunner
|
||||
{
|
||||
storage.SetQuotaController(quotaController);
|
||||
}
|
||||
}
|
||||
}
|
||||
Console.WriteLine($"end restore fileGroup: {group}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -87,12 +87,14 @@ builder.WebHost.ConfigureServices((hostContext, services) =>
|
||||
});
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
Console.WriteLine("backup start");
|
||||
var migrationCreator = app.Services.GetService<MigrationCreator>();
|
||||
var fileName = await migrationCreator.Create(param.Tenant, param.UserName, param.ToRegion);
|
||||
|
||||
Console.WriteLine("backup was success");
|
||||
Console.WriteLine("restore start");
|
||||
var migrationRunner = app.Services.GetService<MigrationRunner>();
|
||||
await migrationRunner.Run(fileName, param.ToRegion);
|
||||
Console.WriteLine("restore was success");
|
||||
|
||||
Directory.GetFiles(AppContext.BaseDirectory).Where(f => f.Equals(fileName)).ToList().ForEach(File.Delete);
|
||||
|
||||
|
@ -24,6 +24,7 @@ map $request_uri $header_x_frame_options {
|
||||
|
||||
map $request_uri $cache_control {
|
||||
default "no-cache, no-store, must-revalidate";
|
||||
~*\/(storage\/room_logos\/root\/|storage\/userPhotos\/root\/) "public, no-transform, max-age=15, s-maxage=3153600";
|
||||
~*\/(api\/2\.0.*|storage|login\.ashx|products\/.+\/httphandlers\/filehandler\.ashx|ChunkedUploader.ashx|ThirdPartyAppHandler|apisystem|sh|remoteEntry\.js|debuginfo\.md) "no-cache, no-store, must-revalidate";
|
||||
~*\/(locales.*\.json) "public, no-transform";
|
||||
~*\.(ogg|ogv|svg|svgz|eot|otf|woff|woff2|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf|md|css|js)$ "public, no-transform, max-age=0, s-maxage=3153600";
|
||||
|
@ -18,39 +18,7 @@
|
||||
]
|
||||
}
|
||||
],
|
||||
"module": [
|
||||
{
|
||||
"name": "forum",
|
||||
"data": "853B6EB9-73EE-438d-9B09-8FFEEDF36234",
|
||||
"type": "disc",
|
||||
"path": "$STORAGE_ROOT\\Products\\Community\\Modules\\Forum\\Data\\attachments",
|
||||
"virtualpath": "~/products/community/modules/forum/data/attachments",
|
||||
"expires": "0:10:0"
|
||||
},
|
||||
{
|
||||
"name": "bookmarking",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"type": "disc",
|
||||
"path": "$STORAGE_ROOT\\Products\\Community\\Modules\\Bookmarking\\Data\\images",
|
||||
"virtualpath": "~/products/community/modules/bookmarking/data/images"
|
||||
},
|
||||
{
|
||||
"name": "wiki",
|
||||
"data": "742CF945-CBBC-4a57-82D6-1600A12CF8CA",
|
||||
"type": "disc",
|
||||
"path": "$STORAGE_ROOT\\Products\\Community\\Modules\\Wiki\\Data\\files",
|
||||
"virtualpath": "~/products/community/modules/wiki/data/files",
|
||||
"expires": "0:10:0",
|
||||
"domain": [
|
||||
{
|
||||
"name": "temp",
|
||||
"visible": false,
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\Community\\Modules\\Wiki\\Data\\filestemp",
|
||||
"virtualpath": "~/products/community/modules/wiki/data/filestemp"
|
||||
}
|
||||
]
|
||||
},
|
||||
"module": [
|
||||
{
|
||||
"name": "files",
|
||||
"data": "e67be73d-f9ae-4ce1-8fec-1880cb518cb4",
|
||||
@ -94,122 +62,7 @@
|
||||
"public": true,
|
||||
"disableMigrate": true,
|
||||
"disableEncryption": true
|
||||
},
|
||||
{
|
||||
"name": "crm",
|
||||
"data": "6743007C-6F95-4d20-8C88-A8601CE5E76D",
|
||||
"type": "disc",
|
||||
"path": "$STORAGE_ROOT\\Products\\CRM\\Data",
|
||||
"virtualpath": "~/products/crm/data",
|
||||
"domain": [
|
||||
{
|
||||
"name": "export",
|
||||
"visible": false,
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\CRM\\Data\\{0}\\export",
|
||||
"expires": "1.0:0:0"
|
||||
},
|
||||
{
|
||||
"name": "temp",
|
||||
"visible": false,
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\CRM\\Data\\{0}\\temp"
|
||||
},
|
||||
{
|
||||
"name": "mail_messages",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\CRM\\Data\\{0}\\mail_messages"
|
||||
},
|
||||
{
|
||||
"name": "voip",
|
||||
"visible": true,
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\CRM\\Data\\{0}\\voip",
|
||||
"virtualpath": "~/products/crm/data/{0}/voip",
|
||||
"public": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "crm_template",
|
||||
"visible": false,
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"type": "disc",
|
||||
"path": "Products\\CRM\\DocStore",
|
||||
"disableMigrate": true,
|
||||
"disableEncryption": true
|
||||
},
|
||||
{
|
||||
"name": "fckuploaders",
|
||||
"count": false,
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"type": "disc",
|
||||
"path": "$STORAGE_ROOT\\Studio\\htmleditorfiles",
|
||||
"virtualpath": "~/data/shared/htmleditorfiles",
|
||||
"domain": [
|
||||
{
|
||||
"name": "mail",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\addons\\mail\\Data\\htmleditorfiles",
|
||||
"virtualpath": "~/addons/mail/data/htmleditorfiles"
|
||||
},
|
||||
{
|
||||
"name": "forum",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\Community\\Modules\\Forum\\Data\\htmleditorfiles",
|
||||
"virtualpath": "~/products/community/modules/forum/data/htmleditorfiles"
|
||||
},
|
||||
{
|
||||
"name": "news",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\Community\\Modules\\News\\Data\\htmleditorfiles",
|
||||
"virtualpath": "~/products/community/modules/news/data/htmleditorfiles"
|
||||
},
|
||||
{
|
||||
"name": "news_comments",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\Community\\Modules\\News\\Data\\fckcomments",
|
||||
"virtualpath": "~/products/community/modules/news/data/fckcomments"
|
||||
},
|
||||
{
|
||||
"name": "blogs",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\Community\\Modules\\Blogs\\Data\\htmleditorfiles",
|
||||
"virtualpath": "~/products/community/modules/blogs/data/htmleditorfiles"
|
||||
},
|
||||
{
|
||||
"name": "blogs_comments",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\Community\\Modules\\Blogs\\Data\\fckcomments",
|
||||
"virtualpath": "~/products/community/modules/blogs/data/fckcomments"
|
||||
},
|
||||
{
|
||||
"name": "bookmarking_comments",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\Community\\Modules\\Bookmarking\\data\\fckcomments",
|
||||
"virtualpath": "~/products/community/modules/bookmarking/data/fckcomments"
|
||||
},
|
||||
{
|
||||
"name": "wiki_comments",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\Community\\Modules\\Wiki\\Data\\fckcomments",
|
||||
"virtualpath": "~/products/community/modules/wiki/data/fckcomments"
|
||||
},
|
||||
{
|
||||
"name": "projects_comments",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
"path": "$STORAGE_ROOT\\Products\\Projects\\Data\\fckcomments",
|
||||
"virtualpath": "~/products/projects/data/fckcomments"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "talk",
|
||||
"data": "BF88953E-3C43-4850-A3FB-B1E43AD53A3E",
|
||||
"type": "disc",
|
||||
"path": "$STORAGE_ROOT\\addons\\talk\\Data",
|
||||
"virtualpath": "~/addons/talk/data"
|
||||
},
|
||||
},
|
||||
{
|
||||
"name": "certs",
|
||||
"visible": "false",
|
||||
@ -217,14 +70,7 @@
|
||||
"path": "$STORAGE_ROOT\\certs\\",
|
||||
"appendTenantId": false,
|
||||
"disableEncryption": true
|
||||
},
|
||||
{
|
||||
"name": "mailaggregator",
|
||||
"data": "666ceac1-4532-4f8c-9cba-8f510eca2fd1",
|
||||
"type": "disc",
|
||||
"path": "$STORAGE_ROOT\\addons\\mail\\Data\\aggregator",
|
||||
"virtualpath": "~/addons/mail/data/aggregator"
|
||||
},
|
||||
},
|
||||
{
|
||||
"name": "logo",
|
||||
"data": "00000000-0000-0000-0000-000000000000",
|
||||
@ -281,17 +127,6 @@
|
||||
"virtualpath": "~/studio/{0}/userphotos/temp"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "static_partnerdata",
|
||||
"type": "disc",
|
||||
"path": "App_Data\\static\\partnerdata",
|
||||
"acl": "Read",
|
||||
"virtualpath": "~/App_Data/static/partnerdata",
|
||||
"appendTenantId": false,
|
||||
"public": true,
|
||||
"disableMigrate": true,
|
||||
"disableEncryption": true
|
||||
}
|
||||
]
|
||||
}
|
||||
|
20715
i18next/client.babel
20715
i18next/client.babel
File diff suppressed because it is too large
Load Diff
43985
i18next/common.babel
43985
i18next/common.babel
File diff suppressed because it is too large
Load Diff
2120
i18next/editor.babel
2120
i18next/editor.babel
File diff suppressed because it is too large
Load Diff
7598
i18next/login.babel
7598
i18next/login.babel
File diff suppressed because it is too large
Load Diff
@ -72,7 +72,7 @@ namespace ASC.Migrations.MySql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -1,
|
||||
Features = "trial,audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:100,manager:1",
|
||||
Features = "trial,audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:100,manager:1",
|
||||
Name = "trial",
|
||||
Price = 0m,
|
||||
Visible = false
|
||||
@ -80,7 +80,7 @@ namespace ASC.Migrations.MySql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -2,
|
||||
Features = "audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:1024,manager:1",
|
||||
Features = "audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:1024,manager:1",
|
||||
Name = "admin",
|
||||
Price = 30m,
|
||||
ProductId = "1002",
|
||||
@ -89,7 +89,7 @@ namespace ASC.Migrations.MySql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -3,
|
||||
Features = "free,total_size:2147483648,manager:1,room:12,usersInRoom:3",
|
||||
Features = "free,thirdparty,total_size:2147483648,manager:1,room:12,usersInRoom:3",
|
||||
Name = "startup",
|
||||
Price = 0m,
|
||||
Visible = false
|
||||
|
@ -29,131 +29,130 @@ using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace ASC.Migrations.MySql.Migrations
|
||||
namespace ASC.Migrations.MySql.Migrations;
|
||||
|
||||
public partial class CoreDbContextMigrate : Migration
|
||||
{
|
||||
public partial class CoreDbContextMigrate : Migration
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AlterDatabase()
|
||||
.Annotation("MySql:CharSet", "utf8mb4");
|
||||
migrationBuilder.AlterDatabase()
|
||||
.Annotation("MySql:CharSet", "utf8mb4");
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_quota",
|
||||
columns: table => new
|
||||
{
|
||||
tenant = table.Column<int>(type: "int", nullable: false),
|
||||
name = table.Column<string>(type: "varchar(128)", nullable: true, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
description = table.Column<string>(type: "varchar(128)", nullable: true, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
features = table.Column<string>(type: "text", nullable: true)
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
price = table.Column<decimal>(type: "decimal(10,2)", nullable: false, defaultValueSql: "'0.00'"),
|
||||
product_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, defaultValueSql: "'0'")
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PRIMARY", x => x.tenant);
|
||||
})
|
||||
.Annotation("MySql:CharSet", "utf8");
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_quota",
|
||||
columns: table => new
|
||||
{
|
||||
tenant = table.Column<int>(type: "int", nullable: false),
|
||||
name = table.Column<string>(type: "varchar(128)", nullable: true, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
description = table.Column<string>(type: "varchar(128)", nullable: true, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
features = table.Column<string>(type: "text", nullable: true)
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
price = table.Column<decimal>(type: "decimal(10,2)", nullable: false, defaultValueSql: "'0.00'"),
|
||||
product_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, defaultValueSql: "'0'")
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PRIMARY", x => x.tenant);
|
||||
})
|
||||
.Annotation("MySql:CharSet", "utf8");
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_quotarow",
|
||||
columns: table => new
|
||||
{
|
||||
tenant = table.Column<int>(type: "int", nullable: false),
|
||||
path = table.Column<string>(type: "varchar(255)", nullable: false, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
user_id = table.Column<Guid>(type: "char(36)", nullable: false, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
counter = table.Column<long>(type: "bigint", nullable: false, defaultValueSql: "'0'"),
|
||||
tag = table.Column<string>(type: "varchar(1024)", nullable: true, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
last_modified = table.Column<DateTime>(type: "timestamp", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PRIMARY", x => new { x.tenant, x.user_id, x.path });
|
||||
})
|
||||
.Annotation("MySql:CharSet", "utf8");
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_quotarow",
|
||||
columns: table => new
|
||||
{
|
||||
tenant = table.Column<int>(type: "int", nullable: false),
|
||||
path = table.Column<string>(type: "varchar(255)", nullable: false, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
user_id = table.Column<Guid>(type: "char(36)", nullable: false, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
counter = table.Column<long>(type: "bigint", nullable: false, defaultValueSql: "'0'"),
|
||||
tag = table.Column<string>(type: "varchar(1024)", nullable: true, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
last_modified = table.Column<DateTime>(type: "timestamp", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PRIMARY", x => new { x.tenant, x.user_id, x.path });
|
||||
})
|
||||
.Annotation("MySql:CharSet", "utf8");
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_tariff",
|
||||
columns: table => new
|
||||
{
|
||||
id = table.Column<int>(type: "int", nullable: false)
|
||||
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
|
||||
tenant = table.Column<int>(type: "int", nullable: false),
|
||||
stamp = table.Column<DateTime>(type: "datetime", nullable: false),
|
||||
customer_id = table.Column<string>(type: "varchar(255)", nullable: false, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
comment = table.Column<string>(type: "varchar(255)", nullable: true, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
create_on = table.Column<DateTime>(type: "timestamp", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_tenants_tariff", x => x.id);
|
||||
})
|
||||
.Annotation("MySql:CharSet", "utf8");
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_tariff",
|
||||
columns: table => new
|
||||
{
|
||||
id = table.Column<int>(type: "int", nullable: false)
|
||||
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
|
||||
tenant = table.Column<int>(type: "int", nullable: false),
|
||||
stamp = table.Column<DateTime>(type: "datetime", nullable: false),
|
||||
customer_id = table.Column<string>(type: "varchar(255)", nullable: false, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
comment = table.Column<string>(type: "varchar(255)", nullable: true, collation: "utf8_general_ci")
|
||||
.Annotation("MySql:CharSet", "utf8"),
|
||||
create_on = table.Column<DateTime>(type: "timestamp", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_tenants_tariff", x => x.id);
|
||||
})
|
||||
.Annotation("MySql:CharSet", "utf8");
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_tariffrow",
|
||||
columns: table => new
|
||||
{
|
||||
tariff_id = table.Column<int>(type: "int", nullable: false),
|
||||
quota = table.Column<int>(type: "int", nullable: false),
|
||||
tenant = table.Column<int>(type: "int", nullable: false),
|
||||
quantity = table.Column<int>(type: "int", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PRIMARY", x => new { x.tenant, x.tariff_id, x.quota });
|
||||
})
|
||||
.Annotation("MySql:CharSet", "utf8mb4");
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_tariffrow",
|
||||
columns: table => new
|
||||
{
|
||||
tariff_id = table.Column<int>(type: "int", nullable: false),
|
||||
quota = table.Column<int>(type: "int", nullable: false),
|
||||
tenant = table.Column<int>(type: "int", nullable: false),
|
||||
quantity = table.Column<int>(type: "int", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PRIMARY", x => new { x.tenant, x.tariff_id, x.quota });
|
||||
})
|
||||
.Annotation("MySql:CharSet", "utf8mb4");
|
||||
|
||||
migrationBuilder.InsertData(
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "product_id" },
|
||||
values: new object[] { -3, null, "free,total_size:2147483648,manager:1,room:12,usersInRoom:3", "startup", null });
|
||||
migrationBuilder.InsertData(
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "product_id" },
|
||||
values: new object[] { -3, null, "free,thirdparty,total_size:2147483648,manager:1,room:12,usersInRoom:3", "startup", null });
|
||||
|
||||
migrationBuilder.InsertData(
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "price", "product_id", "visible" },
|
||||
values: new object[] { -2, null, "audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:1024,manager:1", "admin", 30m, "1002", true });
|
||||
migrationBuilder.InsertData(
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "price", "product_id", "visible" },
|
||||
values: new object[] { -2, null, "audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:1024,manager:1", "admin", 30m, "1002", true });
|
||||
|
||||
migrationBuilder.InsertData(
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "product_id" },
|
||||
values: new object[] { -1, null, "trial,audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:100,manager:1", "trial", null });
|
||||
migrationBuilder.InsertData(
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "product_id" },
|
||||
values: new object[] { -1, null, "trial,audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:100,manager:1", "trial", null });
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "last_modified",
|
||||
table: "tenants_quotarow",
|
||||
column: "last_modified");
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "last_modified",
|
||||
table: "tenants_quotarow",
|
||||
column: "last_modified");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "tenant",
|
||||
table: "tenants_tariff",
|
||||
column: "tenant");
|
||||
}
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "tenant",
|
||||
table: "tenants_tariff",
|
||||
column: "tenant");
|
||||
}
|
||||
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_quota");
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_quota");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_quotarow");
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_quotarow");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_tariff");
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_tariff");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_tariffrow");
|
||||
}
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_tariffrow");
|
||||
}
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ namespace ASC.Migrations.MySql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -1,
|
||||
Features = "trial,audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:100,manager:1",
|
||||
Features = "trial,audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:100,manager:1",
|
||||
Name = "trial",
|
||||
Price = 0m,
|
||||
Visible = false
|
||||
@ -78,7 +78,7 @@ namespace ASC.Migrations.MySql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -2,
|
||||
Features = "audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:1024,manager:1",
|
||||
Features = "audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:1024,manager:1",
|
||||
Name = "admin",
|
||||
Price = 30m,
|
||||
ProductId = "1002",
|
||||
@ -87,7 +87,7 @@ namespace ASC.Migrations.MySql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -3,
|
||||
Features = "free,total_size:2147483648,manager:1,room:12,usersInRoom:3",
|
||||
Features = "free,thirdparty,total_size:2147483648,manager:1,room:12,usersInRoom:3",
|
||||
Name = "startup",
|
||||
Price = 0m,
|
||||
Visible = false
|
||||
|
@ -67,7 +67,7 @@ namespace ASC.Migrations.PostgreSql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -1,
|
||||
Features = "trial,audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:100,manager:1",
|
||||
Features = "trial,audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:100,manager:1",
|
||||
Name = "trial",
|
||||
Price = 0m,
|
||||
Visible = false
|
||||
@ -75,7 +75,7 @@ namespace ASC.Migrations.PostgreSql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -2,
|
||||
Features = "audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:1024,manager:1",
|
||||
Features = "audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:1024,manager:1",
|
||||
Name = "admin",
|
||||
Price = 30m,
|
||||
ProductId = "1002",
|
||||
@ -84,7 +84,7 @@ namespace ASC.Migrations.PostgreSql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -3,
|
||||
Features = "free,total_size:2147483648,manager:1,room:12,usersInRoom:3",
|
||||
Features = "free,thirdparty,total_size:2147483648,manager:1,room:12,usersInRoom:3",
|
||||
Name = "startup",
|
||||
Price = 0m,
|
||||
Visible = false
|
||||
|
@ -30,131 +30,130 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace ASC.Migrations.PostgreSql.Migrations
|
||||
namespace ASC.Migrations.PostgreSql.Migrations;
|
||||
|
||||
public partial class CoreDbContextMigrate : Migration
|
||||
{
|
||||
public partial class CoreDbContextMigrate : Migration
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.EnsureSchema(
|
||||
name: "onlyoffice");
|
||||
migrationBuilder.EnsureSchema(
|
||||
name: "onlyoffice");
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_quota",
|
||||
schema: "onlyoffice",
|
||||
columns: table => new
|
||||
{
|
||||
tenant = table.Column<int>(type: "integer", nullable: false),
|
||||
name = table.Column<string>(type: "character varying", nullable: true),
|
||||
description = table.Column<string>(type: "character varying", nullable: true),
|
||||
features = table.Column<string>(type: "text", nullable: true),
|
||||
price = table.Column<decimal>(type: "numeric(10,2)", nullable: false, defaultValueSql: "0.00"),
|
||||
product_id = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: true, defaultValueSql: "NULL"),
|
||||
visible = table.Column<bool>(type: "boolean", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("tenants_quota_pkey", x => x.tenant);
|
||||
});
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_quota",
|
||||
schema: "onlyoffice",
|
||||
columns: table => new
|
||||
{
|
||||
tenant = table.Column<int>(type: "integer", nullable: false),
|
||||
name = table.Column<string>(type: "character varying", nullable: true),
|
||||
description = table.Column<string>(type: "character varying", nullable: true),
|
||||
features = table.Column<string>(type: "text", nullable: true),
|
||||
price = table.Column<decimal>(type: "numeric(10,2)", nullable: false, defaultValueSql: "0.00"),
|
||||
product_id = table.Column<string>(type: "character varying(128)", maxLength: 128, nullable: true, defaultValueSql: "NULL"),
|
||||
visible = table.Column<bool>(type: "boolean", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("tenants_quota_pkey", x => x.tenant);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_quotarow",
|
||||
schema: "onlyoffice",
|
||||
columns: table => new
|
||||
{
|
||||
tenant = table.Column<int>(type: "integer", nullable: false),
|
||||
path = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
|
||||
counter = table.Column<long>(type: "bigint", nullable: false, defaultValueSql: "'0'"),
|
||||
tag = table.Column<string>(type: "character varying(1024)", maxLength: 1024, nullable: true, defaultValueSql: "'0'"),
|
||||
last_modified = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, defaultValueSql: "CURRENT_TIMESTAMP"),
|
||||
user_id = table.Column<Guid>(type: "uuid", maxLength: 36, nullable: false, defaultValueSql: "NULL")
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("tenants_quotarow_pkey", x => new { x.tenant, x.path });
|
||||
});
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_quotarow",
|
||||
schema: "onlyoffice",
|
||||
columns: table => new
|
||||
{
|
||||
tenant = table.Column<int>(type: "integer", nullable: false),
|
||||
path = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false),
|
||||
counter = table.Column<long>(type: "bigint", nullable: false, defaultValueSql: "'0'"),
|
||||
tag = table.Column<string>(type: "character varying(1024)", maxLength: 1024, nullable: true, defaultValueSql: "'0'"),
|
||||
last_modified = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, defaultValueSql: "CURRENT_TIMESTAMP"),
|
||||
user_id = table.Column<Guid>(type: "uuid", maxLength: 36, nullable: false, defaultValueSql: "NULL")
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("tenants_quotarow_pkey", x => new { x.tenant, x.path });
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_tariff",
|
||||
schema: "onlyoffice",
|
||||
columns: table => new
|
||||
{
|
||||
id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
tenant = table.Column<int>(type: "integer", nullable: false),
|
||||
stamp = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||
customer_id = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, defaultValueSql: "NULL"),
|
||||
comment = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true, defaultValueSql: "NULL"),
|
||||
create_on = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, defaultValueSql: "CURRENT_TIMESTAMP")
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_tenants_tariff", x => x.id);
|
||||
});
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_tariff",
|
||||
schema: "onlyoffice",
|
||||
columns: table => new
|
||||
{
|
||||
id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
tenant = table.Column<int>(type: "integer", nullable: false),
|
||||
stamp = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
|
||||
customer_id = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: false, defaultValueSql: "NULL"),
|
||||
comment = table.Column<string>(type: "character varying(255)", maxLength: 255, nullable: true, defaultValueSql: "NULL"),
|
||||
create_on = table.Column<DateTime>(type: "timestamp with time zone", nullable: false, defaultValueSql: "CURRENT_TIMESTAMP")
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_tenants_tariff", x => x.id);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_tariffrow",
|
||||
schema: "onlyoffice",
|
||||
columns: table => new
|
||||
{
|
||||
tariff_id = table.Column<int>(type: "int", nullable: false),
|
||||
quota = table.Column<int>(type: "int", nullable: false),
|
||||
tenant = table.Column<int>(type: "int", nullable: false),
|
||||
quantity = table.Column<int>(type: "int", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PRIMARY", x => new { x.tenant, x.tariff_id, x.quota });
|
||||
});
|
||||
migrationBuilder.CreateTable(
|
||||
name: "tenants_tariffrow",
|
||||
schema: "onlyoffice",
|
||||
columns: table => new
|
||||
{
|
||||
tariff_id = table.Column<int>(type: "int", nullable: false),
|
||||
quota = table.Column<int>(type: "int", nullable: false),
|
||||
tenant = table.Column<int>(type: "int", nullable: false),
|
||||
quantity = table.Column<int>(type: "int", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PRIMARY", x => new { x.tenant, x.tariff_id, x.quota });
|
||||
});
|
||||
|
||||
migrationBuilder.InsertData(
|
||||
schema: "onlyoffice",
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "visible" },
|
||||
values: new object[] { -3, null, "free,total_size:2147483648,manager:1,room:12,usersInRoom:3", "startup", false });
|
||||
migrationBuilder.InsertData(
|
||||
schema: "onlyoffice",
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "visible" },
|
||||
values: new object[] { -3, null, "free,thirdparty,total_size:2147483648,manager:1,room:12,usersInRoom:3", "startup", false });
|
||||
|
||||
migrationBuilder.InsertData(
|
||||
schema: "onlyoffice",
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "price", "product_id", "visible" },
|
||||
values: new object[] { -2, null, "audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:1024,manager:1", "admin", 30m, "1002", true });
|
||||
migrationBuilder.InsertData(
|
||||
schema: "onlyoffice",
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "price", "product_id", "visible" },
|
||||
values: new object[] { -2, null, "audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:1024,manager:1", "admin", 30m, "1002", true });
|
||||
|
||||
migrationBuilder.InsertData(
|
||||
schema: "onlyoffice",
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "visible" },
|
||||
values: new object[] { -1, null, "trial,audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:100,manager:1", "trial", false });
|
||||
migrationBuilder.InsertData(
|
||||
schema: "onlyoffice",
|
||||
table: "tenants_quota",
|
||||
columns: new[] { "tenant", "description", "features", "name", "visible" },
|
||||
values: new object[] { -1, null, "trial,audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:100,manager:1", "trial", false });
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "last_modified_tenants_quotarow",
|
||||
schema: "onlyoffice",
|
||||
table: "tenants_quotarow",
|
||||
column: "last_modified");
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "last_modified_tenants_quotarow",
|
||||
schema: "onlyoffice",
|
||||
table: "tenants_quotarow",
|
||||
column: "last_modified");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "tenant_tenants_tariff",
|
||||
schema: "onlyoffice",
|
||||
table: "tenants_tariff",
|
||||
column: "tenant");
|
||||
}
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "tenant_tenants_tariff",
|
||||
schema: "onlyoffice",
|
||||
table: "tenants_tariff",
|
||||
column: "tenant");
|
||||
}
|
||||
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_quota",
|
||||
schema: "onlyoffice");
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_quota",
|
||||
schema: "onlyoffice");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_quotarow",
|
||||
schema: "onlyoffice");
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_quotarow",
|
||||
schema: "onlyoffice");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_tariff",
|
||||
schema: "onlyoffice");
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_tariff",
|
||||
schema: "onlyoffice");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_tariffrow",
|
||||
schema: "onlyoffice");
|
||||
}
|
||||
migrationBuilder.DropTable(
|
||||
name: "tenants_tariffrow",
|
||||
schema: "onlyoffice");
|
||||
}
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ namespace ASC.Migrations.PostgreSql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -1,
|
||||
Features = "trial,audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:100,manager:1",
|
||||
Features = "trial,audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:100,manager:1",
|
||||
Name = "trial",
|
||||
Price = 0m,
|
||||
Visible = false
|
||||
@ -73,7 +73,7 @@ namespace ASC.Migrations.PostgreSql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -2,
|
||||
Features = "audit,ldap,sso,whitelabel,restore,total_size:107374182400,file_size:1024,manager:1",
|
||||
Features = "audit,ldap,sso,whitelabel,restore,thirdparty,total_size:107374182400,file_size:1024,manager:1",
|
||||
Name = "admin",
|
||||
Price = 30m,
|
||||
ProductId = "1002",
|
||||
@ -82,7 +82,7 @@ namespace ASC.Migrations.PostgreSql.Migrations
|
||||
new
|
||||
{
|
||||
Tenant = -3,
|
||||
Features = "free,total_size:2147483648,manager:1,room:12,usersInRoom:3",
|
||||
Features = "free,thirdparty,total_size:2147483648,manager:1,room:12,usersInRoom:3",
|
||||
Name = "startup",
|
||||
Price = 0m,
|
||||
Visible = false
|
||||
|
@ -21,7 +21,6 @@
|
||||
"BackupCreatedSuccess": "Ehtiyat nüsxə uğurla yaradıldı.",
|
||||
"BackupList": "Ehtiyyat siyahısı",
|
||||
"BackupListWarningText": "Siyahıdan müəyyən elementləri silsəniz, onların müvafiq faylları da silinəcək. Bu əməliyyat geri qaytarıla bilməz. Bütün faylları silmək üçün linkdən istifadə edin:",
|
||||
"BrowserNoCanvasSupport": "Sizin brauzeriniz HTML5 canvas teqini dəstəkləmir.",
|
||||
"ByApp": "Doğrulama tətbiqi vasitəsilə",
|
||||
"BySms": "Sms vasitəsilə",
|
||||
"ChangeLogoButton": "Loqonu dəyişin",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Akkauntu qoşmaq",
|
||||
"AddAuthor": "Müəllif Əlavə et",
|
||||
"ArchivingData": "Məlumatların arxivləşdirilməsi",
|
||||
"ConnectingAccount": "Akkauntun qoşulması",
|
||||
"Copy": "Köçür",
|
||||
|
@ -19,7 +19,6 @@
|
||||
"BackupCreatedSuccess": "Резервното копие е създадено успешно.",
|
||||
"BackupList": "Списък с резервни копия",
|
||||
"BackupListWarningText": "Ако изтриете всички елементи от списъка, съответните им файлове също ще бъдат изтрити. Това действие не може да бъде отменено. За да изтриете всички файлове, използвайте връзката:",
|
||||
"BrowserNoCanvasSupport": "Браузърът Ви не поддържа HTML5 маркера за платно.",
|
||||
"ByApp": "Чрез приложението за удостоверяване",
|
||||
"BySms": "Чрез съобщение",
|
||||
"ChangeLogoButton": "Смяна на лого",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Добави профил",
|
||||
"AddAuthor": "Добави автор",
|
||||
"ArchivingData": "Архивиране на данни",
|
||||
"ConnectingAccount": "Свързване на профил",
|
||||
"Copy": "Копирай",
|
||||
|
@ -14,6 +14,5 @@
|
||||
"SendInviteAgain": "Odeslat pozvánku ještě jednou",
|
||||
"SuccessChangeUserStatus": "Stav uživatele byl úspěšně změněn",
|
||||
"SuccessDeletePersonalData": "Osobní údaje byly úspěšně odstraněny",
|
||||
"SuccessSentInvitation": "Pozvánka byla úspěšně odeslána",
|
||||
"maxSizeFileError": "Maximální velikost souboru překročena"
|
||||
"SuccessSentInvitation": "Pozvánka byla úspěšně odeslána"
|
||||
}
|
||||
|
@ -20,7 +20,6 @@
|
||||
"BackupCreatedSuccess": "Kopie zálohy byla úspěšně vytvořena.",
|
||||
"BackupList": "Seznam záloh",
|
||||
"BackupListWarningText": "Pokud odstraníte nějaké položky ze seznamu, budou také odstraněny odpovídající soubory. Tuto akci nelze vrátit zpět. Chcete-li odstranit všechny soubory, použijte odkaz:",
|
||||
"BrowserNoCanvasSupport": "Váš prohlížeč nepodporuje značku HTML5 canvas.",
|
||||
"ByApp": "Pomocí ověřovací aplikace",
|
||||
"BySms": "Pomocí SMS",
|
||||
"ChangeLogoButton": "Změnit Logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Přidat účet",
|
||||
"AddAuthor": "Přidat autora",
|
||||
"ArchivingData": "Archivace dat",
|
||||
"ConnectingAccount": "Připojovací účet",
|
||||
"Copy": "Zkopírovat",
|
||||
|
@ -21,7 +21,6 @@
|
||||
"BackupCreatedSuccess": "Die Sicherungskopie wurde erfolgreich erstellt.",
|
||||
"BackupList": "Backup-Liste",
|
||||
"BackupListWarningText": "Falls Sie einige Elemente aus der Liste löschen, werden die entsprechende Dateien auch gelöscht. Dieser Vorgang nicht rückgängig gemacht werden kann. Um alle Dateien zu löschen, verwenden Sie den Link:",
|
||||
"BrowserNoCanvasSupport": "Ihr Browser unterstützt die HTML5 Canvas-Tag nicht.",
|
||||
"ByApp": "Über die Authentifizierungs-App",
|
||||
"BySms": "Per SMS",
|
||||
"ChangeLogoButton": "Logo ändern",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Konto hinzufügen",
|
||||
"AddAuthor": "Autor hinzufügen",
|
||||
"ArchivingData": "Archivieren der Daten",
|
||||
"ConnectingAccount": "Konto wird verbunden",
|
||||
"Copy": "Kopieren",
|
||||
|
@ -19,7 +19,6 @@
|
||||
"BackupCreatedSuccess": "Το εφεδρικό αντίγραφο έχει δημιουργηθεί επιτυχώς.",
|
||||
"BackupList": "Εφεδρική λίστα",
|
||||
"BackupListWarningText": "Εάν διαγράψετε στοιχεία από τη λίστα, θα διαγραφούν και τα αντίστοιχα αρχεία τους. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Για να διαγράψετε όλα τα αρχεία, χρησιμοποιήστε τον σύνδεσμο:",
|
||||
"BrowserNoCanvasSupport": "Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα καμβά HTML5.",
|
||||
"ByApp": "Με εφαρμογή ελέγχου ταυτότητας",
|
||||
"BySms": "Με sms",
|
||||
"ChangeLogoButton": "Αλλαγή λογότυπου",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Προσθήκη λογαριασμού",
|
||||
"AddAuthor": "Προσθήκη Συγγραφέα",
|
||||
"ArchivingData": "Αρχειοθέτηση δεδομένων",
|
||||
"ConnectingAccount": "Σύνδεση λογαριασμού",
|
||||
"Copy": "Αντιγραφή",
|
||||
|
@ -2,7 +2,7 @@
|
||||
"ArchiveHeader": "Move to Archived?",
|
||||
"ArchiveRoom": "You are about to archive a room.",
|
||||
"ArchiveRooms": "You are about to archive rooms.",
|
||||
"RestoreAllRooms": "Are you sure you want to restore all rooms?",
|
||||
"RestoreRoom": "Are you sure you want to restore room?",
|
||||
"RestoreRooms": "Are you sure you want to restore rooms?",
|
||||
"RestoreAllRooms": "Are you sure you want to restore all rooms?"
|
||||
"RestoreRooms": "Are you sure you want to restore rooms?"
|
||||
}
|
||||
|
@ -1,123 +1,123 @@
|
||||
{
|
||||
"AddMembersDescription": "You can add new team members manually or invite them via link.",
|
||||
"All": "All",
|
||||
"AllFiles": "All files",
|
||||
"ArchiveAction": "Empty archive",
|
||||
"Archived": "Archived",
|
||||
"ArchivedRoomAction": "The room '{{name}}' is archived",
|
||||
"ArchivedRoomsAction": "The rooms are archived",
|
||||
"Archives": "Archives",
|
||||
"ArchiveEmptyScreen": "You can archive rooms you don’t use and restore them in your DocSpace at any moment or delete them permanently. These rooms will appear here.",
|
||||
"ArchiveEmptyScreenUser": "Rooms that have been archived will appear here.",
|
||||
"ArchiveEmptyScreenHeader": "No archived rooms here yet",
|
||||
"BackToParentFolderButton": "Back to parent folder",
|
||||
"ByAuthor": "Author",
|
||||
"ByCreation": "Created",
|
||||
"ByLastModified": "Modified",
|
||||
"ByOwner": "Owner",
|
||||
"CollaborationRooms": "Collaboration",
|
||||
"CommonEmptyContainerDescription": "'Common' section contains files shared to all users by the portal admin. Only portal admins can create files there. Users can be granted Full access to a certain folder within the section. This way they will be able to create/upload files in this very folder. ",
|
||||
"ContainsSpecCharacter": "The title can't contain any of the following characters: *+:\"<>?|/",
|
||||
"Convert": "Convert",
|
||||
"CopyItem": "<strong>{{title}}</strong> copied",
|
||||
"CopyItems": "<strong>{{qty}}</strong> elements copied",
|
||||
"CustomRooms": "Custom",
|
||||
"Document": "Document",
|
||||
"EditRoom": "Edit room",
|
||||
"EmptyFile": "Empty file",
|
||||
"EmptyFilterDescriptionText": "No files or folders match this filter. Try a different one or clear filter to view all files. ",
|
||||
"EmptyFilterDescriptionTextRooms": "No rooms match this filter. Try a different one or clear filter to view all rooms.",
|
||||
"EmptyFilterSubheadingText": "No files to be displayed for this filter here",
|
||||
"EmptyFolderDecription": "Drop files here or create new ones.",
|
||||
"EmptyFolderDescriptionUser": "Files and folders uploaded by admins will appeared here.",
|
||||
"EmptyFolderHeader": "No files in this folder",
|
||||
"EmptyRecycleBin": "Empty Trash",
|
||||
"EmptyScreenFolder": "No docs here yet",
|
||||
"ExcludeSubfolders": "Exclude subfolders",
|
||||
"FavoritesEmptyContainerDescription": "To mark files as favorites or remove them from this list, use the context menu.",
|
||||
"FileContents": "File contents",
|
||||
"FileRemoved": "File moved to Trash",
|
||||
"FileRenamed": "The document '{{oldTitle}}' is renamed to '{{newTitle}}'",
|
||||
"FillingFormRooms": "Filling form",
|
||||
"Filter": "Filter",
|
||||
"FinalizeVersion": "Finalize version",
|
||||
"Folder": "Folder",
|
||||
"FolderRemoved": "Folder moved to Trash",
|
||||
"FolderRenamed": "The folder '{{folderTitle}}' is renamed to '{{newFoldedTitle}}'",
|
||||
"Forms": "Forms",
|
||||
"FormsTemplates": "Forms templates",
|
||||
"GoToMyRooms": "Go to My rooms",
|
||||
"GoToPersonal": "Go to Personal",
|
||||
"GoToShared": "Go to Shared",
|
||||
"Images": "Images",
|
||||
"InviteUsersInRoom": "Invite users in room",
|
||||
"LinkForPortalUsers": "Link for portal users",
|
||||
"LinkForRoomMembers": "Link for room members",
|
||||
"MarkAsFavorite": "Mark as favorite",
|
||||
"MarkRead": "Mark as read",
|
||||
"MarkedAsFavorite": "Added to favorites",
|
||||
"Media": "Media",
|
||||
"MoveItem": "<strong>{{title}}</strong> moved",
|
||||
"MoveItems": "<strong>{{qty}}</strong> elements have been moved",
|
||||
"MoveOrCopy": "Move or copy",
|
||||
"MoveTo": "Move to",
|
||||
"MoveToFolderMessage": "You can't move the folder to its subfolder",
|
||||
"New": "New",
|
||||
"NewDocument": "New document",
|
||||
"NewFolder": "New folder",
|
||||
"NewMasterForm": "New form template",
|
||||
"NewPresentation": "New presentation",
|
||||
"NewRoom": "New room",
|
||||
"NewSpreadsheet": "New spreadsheet",
|
||||
"NoAccessRoomTitle": "Sorry, you don't have access to this room",
|
||||
"NoAccessRoomDescription": "You will be redirected to the My Rooms automatically in 5 seconds.",
|
||||
"NoFilesHereYet": "No files here yet",
|
||||
"Open": "Open",
|
||||
"OpenLocation": "Open location",
|
||||
"PersonalEmptyContainerDescription": "Drop files here or create new ones.",
|
||||
"PinToTop": "Pin to top",
|
||||
"Pin": "Pin",
|
||||
"Presentation": "Presentation",
|
||||
"PrivateRoomDescriptionEncrypted": "Encrypted editing and real-time collaboration.",
|
||||
"PrivateRoomDescriptionSafest": "The safest storage for docx, xlsx and pptx.",
|
||||
"PrivateRoomDescriptionSecure": "Secure sharing with trusted teammates.",
|
||||
"PrivateRoomDescriptionUnbreakable": "Unbreakable AES-256 algorithm.",
|
||||
"PrivateRoomHeader": "Welcome to ONLYOFFICE private room where every symbol you type is encrypted",
|
||||
"PrivateRoomSupport": "Work in Private Room is available via {{organizationName}} desktop app. <3>Instructions</3>",
|
||||
"RecentEmptyContainerDescription": "Your last viewed or edited docs will be displayed in this section.",
|
||||
"RecycleBinAction": "Empty trash",
|
||||
"RemoveFromFavorites": "Remove from favorites",
|
||||
"RemoveFromList": "Remove from list",
|
||||
"RemovedFromFavorites": "Removed from favorites",
|
||||
"Rename": "Rename",
|
||||
"RoomCreated": "Room created",
|
||||
"RoomEmptyContainerDescription": "Please create the first room.",
|
||||
"RoomEmptyContainerDescriptionUser": "Rooms shared with you will appear here",
|
||||
"RoomRemoved": "Room removed",
|
||||
"RoomsRemoved": "Rooms removed",
|
||||
"RestoreAll": "Restore all",
|
||||
"SearchByContent": "Search by file contents",
|
||||
"SendByEmail": "Send by email",
|
||||
"Share": "Share",
|
||||
"SharedEmptyContainerDescription": "The 'Shared with Me' section shows files shared to you by teammates. If you haven't seen the latest changes, they are marked as new. You can remove the files from the list using the context menu. ",
|
||||
"ShowVersionHistory": "Show version history",
|
||||
"Spreadsheet": "Spreadsheet",
|
||||
"TooltipElementCopyMessage": "Copy {{element}}",
|
||||
"TooltipElementsCopyMessage": "Copy {{element}} elements",
|
||||
"TooltipElementsMoveMessage": "Move {{element}} elements",
|
||||
"TrashEmptyDescription": "All deleted files are moved to 'Trash'. Restore files deleted by mistake or delete them permanently. Please note, that the files deleted from the 'Trash' cannot be restored any longer.",
|
||||
"UnarchivedRoomAction": "The room '{{name}}' is unarchived",
|
||||
"UnarchivedRoomsAction": "The rooms are unarchived",
|
||||
"UnblockVersion": "Unblock/Check-in",
|
||||
"Unpin": "Unpin",
|
||||
"UploadToFolder": "Upload to folder",
|
||||
"VersionBadge": "V.{{version}}",
|
||||
"VersionHistory": "Version history",
|
||||
"ViewList": "List",
|
||||
"ViewOnlyRooms": "View-only",
|
||||
"ViewTiles": "Tiles",
|
||||
"WithSubfolders": "With subfolders",
|
||||
"RoomPinned": "Room pinned",
|
||||
"RoomUnpinned": "Room unpinned",
|
||||
"CreateRoom": "Create room"
|
||||
}
|
||||
{
|
||||
"AddMembersDescription": "You can add new team members manually or invite them via link.",
|
||||
"All": "All",
|
||||
"AllFiles": "All files",
|
||||
"ArchiveAction": "Empty archive",
|
||||
"ArchiveEmptyScreen": "You can archive rooms you don’t use and restore them in your DocSpace at any moment or delete them permanently. These rooms will appear here.",
|
||||
"ArchiveEmptyScreenHeader": "No archived rooms here yet",
|
||||
"ArchiveEmptyScreenUser": "Rooms that have been archived will appear here.",
|
||||
"Archived": "Archived",
|
||||
"ArchivedRoomAction": "The room '{{name}}' is archived",
|
||||
"ArchivedRoomsAction": "The rooms are archived",
|
||||
"Archives": "Archives",
|
||||
"BackToParentFolderButton": "Back to parent folder",
|
||||
"ByAuthor": "Author",
|
||||
"ByCreation": "Created",
|
||||
"ByLastModified": "Modified",
|
||||
"ByOwner": "Owner",
|
||||
"CollaborationRooms": "Collaboration",
|
||||
"CommonEmptyContainerDescription": "'Common' section contains files shared to all users by the portal admin. Only portal admins can create files there. Users can be granted Full access to a certain folder within the section. This way they will be able to create/upload files in this very folder. ",
|
||||
"ContainsSpecCharacter": "The title can't contain any of the following characters: *+:\"<>?|/",
|
||||
"Convert": "Convert",
|
||||
"CopyItem": "<strong>{{title}}</strong> copied",
|
||||
"CopyItems": "<strong>{{qty}}</strong> elements copied",
|
||||
"CreateRoom": "Create room",
|
||||
"CustomRooms": "Custom",
|
||||
"Document": "Document",
|
||||
"EditRoom": "Edit room",
|
||||
"EmptyFile": "Empty file",
|
||||
"EmptyFilterDescriptionText": "No files or folders match this filter. Try a different one or clear filter to view all files. ",
|
||||
"EmptyFilterDescriptionTextRooms": "No rooms match this filter. Try a different one or clear filter to view all rooms.",
|
||||
"EmptyFilterSubheadingText": "No files to be displayed for this filter here",
|
||||
"EmptyFolderDecription": "Drop files here or create new ones.",
|
||||
"EmptyFolderDescriptionUser": "Files and folders uploaded by admins will appeared here.",
|
||||
"EmptyFolderHeader": "No files in this folder",
|
||||
"EmptyRecycleBin": "Empty Trash",
|
||||
"EmptyScreenFolder": "No docs here yet",
|
||||
"ExcludeSubfolders": "Exclude subfolders",
|
||||
"FavoritesEmptyContainerDescription": "To mark files as favorites or remove them from this list, use the context menu.",
|
||||
"FileContents": "File contents",
|
||||
"FileRemoved": "File moved to Trash",
|
||||
"FileRenamed": "The document '{{oldTitle}}' is renamed to '{{newTitle}}'",
|
||||
"FillingFormRooms": "Filling form",
|
||||
"Filter": "Filter",
|
||||
"FinalizeVersion": "Finalize version",
|
||||
"Folder": "Folder",
|
||||
"FolderRemoved": "Folder moved to Trash",
|
||||
"FolderRenamed": "The folder '{{folderTitle}}' is renamed to '{{newFoldedTitle}}'",
|
||||
"Forms": "Forms",
|
||||
"FormsTemplates": "Forms templates",
|
||||
"GoToMyRooms": "Go to My rooms",
|
||||
"GoToPersonal": "Go to Personal",
|
||||
"GoToShared": "Go to Shared",
|
||||
"Images": "Images",
|
||||
"InviteUsersInRoom": "Invite users in room",
|
||||
"LinkForPortalUsers": "Link for portal users",
|
||||
"LinkForRoomMembers": "Link for room members",
|
||||
"MarkAsFavorite": "Mark as favorite",
|
||||
"MarkRead": "Mark as read",
|
||||
"MarkedAsFavorite": "Added to favorites",
|
||||
"Media": "Media",
|
||||
"MoveItem": "<strong>{{title}}</strong> moved",
|
||||
"MoveItems": "<strong>{{qty}}</strong> elements have been moved",
|
||||
"MoveOrCopy": "Move or copy",
|
||||
"MoveTo": "Move to",
|
||||
"MoveToFolderMessage": "You can't move the folder to its subfolder",
|
||||
"New": "New",
|
||||
"NewDocument": "New document",
|
||||
"NewFolder": "New folder",
|
||||
"NewMasterForm": "New form template",
|
||||
"NewPresentation": "New presentation",
|
||||
"NewRoom": "New room",
|
||||
"NewSpreadsheet": "New spreadsheet",
|
||||
"NoAccessRoomDescription": "You will be redirected to the My Rooms automatically in 5 seconds.",
|
||||
"NoAccessRoomTitle": "Sorry, you don't have access to this room",
|
||||
"NoFilesHereYet": "No files here yet",
|
||||
"Open": "Open",
|
||||
"OpenLocation": "Open location",
|
||||
"PersonalEmptyContainerDescription": "Drop files here or create new ones.",
|
||||
"Pin": "Pin",
|
||||
"PinToTop": "Pin to top",
|
||||
"Presentation": "Presentation",
|
||||
"PrivateRoomDescriptionEncrypted": "Encrypted editing and real-time collaboration.",
|
||||
"PrivateRoomDescriptionSafest": "The safest storage for docx, xlsx and pptx.",
|
||||
"PrivateRoomDescriptionSecure": "Secure sharing with trusted teammates.",
|
||||
"PrivateRoomDescriptionUnbreakable": "Unbreakable AES-256 algorithm.",
|
||||
"PrivateRoomHeader": "Welcome to ONLYOFFICE private room where every symbol you type is encrypted",
|
||||
"PrivateRoomSupport": "Work in Private Room is available via {{organizationName}} desktop app. <3>Instructions</3>",
|
||||
"RecentEmptyContainerDescription": "Your last viewed or edited docs will be displayed in this section.",
|
||||
"RecycleBinAction": "Empty trash",
|
||||
"RemoveFromFavorites": "Remove from favorites",
|
||||
"RemoveFromList": "Remove from list",
|
||||
"RemovedFromFavorites": "Removed from favorites",
|
||||
"Rename": "Rename",
|
||||
"RestoreAll": "Restore all",
|
||||
"RoomCreated": "Room created",
|
||||
"RoomEmptyContainerDescription": "Please create the first room.",
|
||||
"RoomEmptyContainerDescriptionUser": "Rooms shared with you will appear here",
|
||||
"RoomPinned": "Room pinned",
|
||||
"RoomRemoved": "Room removed",
|
||||
"RoomUnpinned": "Room unpinned",
|
||||
"RoomsRemoved": "Rooms removed",
|
||||
"SearchByContent": "Search by file contents",
|
||||
"SendByEmail": "Send by email",
|
||||
"Share": "Share",
|
||||
"SharedEmptyContainerDescription": "The 'Shared with Me' section shows files shared to you by teammates. If you haven't seen the latest changes, they are marked as new. You can remove the files from the list using the context menu. ",
|
||||
"ShowVersionHistory": "Show version history",
|
||||
"Spreadsheet": "Spreadsheet",
|
||||
"TooltipElementCopyMessage": "Copy {{element}}",
|
||||
"TooltipElementsCopyMessage": "Copy {{element}} elements",
|
||||
"TooltipElementsMoveMessage": "Move {{element}} elements",
|
||||
"TrashEmptyDescription": "All deleted files are moved to 'Trash'. Restore files deleted by mistake or delete them permanently. Please note, that the files deleted from the 'Trash' cannot be restored any longer.",
|
||||
"UnarchivedRoomAction": "The room '{{name}}' is unarchived",
|
||||
"UnarchivedRoomsAction": "The rooms are unarchived",
|
||||
"UnblockVersion": "Unblock/Check-in",
|
||||
"Unpin": "Unpin",
|
||||
"UploadToFolder": "Upload to folder",
|
||||
"VersionBadge": "V.{{version}}",
|
||||
"VersionHistory": "Version history",
|
||||
"ViewList": "List",
|
||||
"ViewOnlyRooms": "View-only",
|
||||
"ViewTiles": "Tiles",
|
||||
"WithSubfolders": "With subfolders"
|
||||
}
|
||||
|
@ -5,12 +5,12 @@
|
||||
"GetShortenLink": "Get shortened link",
|
||||
"HelpAnswerLinkInviteSettings": "Share the link to invite colleagues to your portal.",
|
||||
"IndividualInvitation": "Individual invitation",
|
||||
"InviteAccountSearchPlaceholder": "Invite people by email",
|
||||
"InviteLinkValidInterval": "This link is valid for {{ count }} days only.",
|
||||
"InviteRoomSearchPlaceholder": "Invite people by name or email",
|
||||
"InviteUsersAsCollaborators": "Add users as {{guestsCaption, lowercase}}",
|
||||
"InviteUsersToRoom": "Invite users to room",
|
||||
"Invited": "Invited",
|
||||
"LinkCopySuccess": "Link has been copied",
|
||||
"InviteRoomSearchPlaceholder": "Invite people by name or email",
|
||||
"InviteAccountSearchPlaceholder": "Invite people by email",
|
||||
"SendInvitation": "Send invitation"
|
||||
}
|
||||
|
@ -37,8 +37,8 @@
|
||||
"StripeCustomerPortal": "go to the Stripe customer portal",
|
||||
"TotalPricePerMonth": "<1>{{currencySymbol}}</1><2>{{price}}</2><3>/month</3>",
|
||||
"UpgradeNow": "Upgrade now",
|
||||
"UserNotFound": "User <1>{{email}}</1> is not found",
|
||||
"YourPrice": "Your price",
|
||||
"UpgradePlan": "Upgrade plan",
|
||||
"UpgradePlanInfo": "Adding new users will exceed the maximum number of room members allowed by your current pricing plan."
|
||||
"UpgradePlanInfo": "Adding new users will exceed the maximum number of room members allowed by your current pricing plan.",
|
||||
"UserNotFound": "User <1>{{email}}</1> is not found",
|
||||
"YourPrice": "Your price"
|
||||
}
|
||||
|
@ -1,22 +1,21 @@
|
||||
{
|
||||
"ActiveSessions": "Active Sessions",
|
||||
"ChangeEmailSuccess": "Email has been changed successfully",
|
||||
"ConnectSocialNetworks": "Сonnect your social networks",
|
||||
"ChangePasswordAfterLoggingOut": "Change password after logging out",
|
||||
"ConnectSocialNetworks": "Сonnect your social networks",
|
||||
"DarkTheme": "Dark theme",
|
||||
"DescriptionForSecurity": "For more security, you need to change your password.",
|
||||
"EditPhoto": "Edit photo",
|
||||
"EmailNotVerified": "Email not verified",
|
||||
"InterfaceTheme": "Interface theme",
|
||||
"LightTheme": "Light theme",
|
||||
"LogoutAllActiveSessions": "Log out from all active sessions",
|
||||
"LogoutActiveConnection": "Log out from active connection",
|
||||
"LogoutAllActiveConnections": "Log out from all active connections",
|
||||
"LogoutDescription": "Note. All active connections except this connection will be logged out, as it is currently in use.",
|
||||
"LogoutBtn": "Log out",
|
||||
"LogoutFrom": "Log out from {{platform}} {{browser}} ?",
|
||||
"SuccessLogout": "The active connection was logged out: {{platform}}, {{browser}}",
|
||||
"LogoutAllActiveSessions": "Log out from all active sessions",
|
||||
"LogoutAllActiveSessionsDescription": "All active connections except this connection will be logged out, as it is currently in use.",
|
||||
"LogoutBtn": "Log out",
|
||||
"LogoutDescription": "Note. All active connections except this connection will be logged out, as it is currently in use.",
|
||||
"LogoutFrom": "Log out from {{platform}} {{browser}} ?",
|
||||
"MessageEmailActivationInstuctionsSentOnEmail": "The email activation instructions have been sent to the <strong>{{ email }}</strong> email address",
|
||||
"MyProfile": "My profile",
|
||||
"ProviderSuccessfullyConnected": "Provider successfully connected",
|
||||
@ -26,6 +25,7 @@
|
||||
"SubscriptionEmailTipsToggleLbl": "Email notification with tips and tricks",
|
||||
"SubscriptionTurnOffToast": "You have been successfully unsubscribed from the the mailing list. <1>Subscribe again</1>",
|
||||
"Subscriptions": "Subscriptions",
|
||||
"SuccessLogout": "The active connection was logged out: {{platform}}, {{browser}}",
|
||||
"SystemTheme": "Use system theme",
|
||||
"SystemThemeDescription": "Automatically switch between light and dark themes when your system does.",
|
||||
"TfaLoginSettings": "Login settings",
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"RequestDetails": "Please describe your request details here",
|
||||
"SalesDepartmentRequest": "Sales department request",
|
||||
"SuccessfullySentMessage": "Your message was successfully sent. You will be contacted by the Sales Department.",
|
||||
"YouWillBeContacted": "The sales team will contact you after creating the request",
|
||||
"YourName": "Your name",
|
||||
"SuccessfullySentMessage": "Your message was successfully sent. You will be contacted by the Sales Department."
|
||||
"YourName": "Your name"
|
||||
}
|
||||
|
@ -43,7 +43,6 @@
|
||||
"BrandingSubtitle": "Use this option to provide on-brand experience to your users. These settings will be effective for all of your portals.",
|
||||
"BreakpointWarningText": "This section is only available in desktop version",
|
||||
"BreakpointWarningTextPrompt": "Please use the desktop site to access <1>{{sectionName}}</1> settings",
|
||||
"BrowserNoCanvasSupport": "Your browser does not support the HTML5 canvas tag.",
|
||||
"Buttons": "Buttons",
|
||||
"ByApp": "By authenticator app",
|
||||
"BySms": "By sms",
|
||||
@ -131,9 +130,9 @@
|
||||
"PasswordMinLenght": "Minimal password length",
|
||||
"Path": "Path",
|
||||
"Payments": "Plans & payments",
|
||||
"Plugins": "Plugins",
|
||||
"PleaseNote": "Please note",
|
||||
"PleaseNoteDescription": "<0>{{pleaseNote}}</0>: your old portal address will become available to new users once you click the <2>{{save}}</2> button.",
|
||||
"Plugins": "Plugins",
|
||||
"PortalAccess": "Portal access",
|
||||
"PortalAccessSubTitle": "This section allows you to provide users with safe and convenient ways to access the portal.",
|
||||
"PortalDeactivation": "Deactivate DocSpace",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Add account",
|
||||
"AddAuthor": "Add author",
|
||||
"ArchivingData": "Archiving data",
|
||||
"ChooseFromList": "Choose from list",
|
||||
"ConnectingAccount": "Connecting account",
|
||||
@ -28,6 +27,7 @@
|
||||
"FolderTitleYandex": "Yandex Directory",
|
||||
"FolderTitlekDrive": "kDrive directory",
|
||||
"Folders": "Folders",
|
||||
"FormTemplates": "Form templates",
|
||||
"LinkCopySuccess": "Link has been copied to the clipboard",
|
||||
"MediaLoadError": "Media file could not be loaded",
|
||||
"MobileAndroid": "Get ONLYOFFICE Documents on Google Play",
|
||||
@ -41,7 +41,6 @@
|
||||
"Other": "Other",
|
||||
"OwnerChange": "Change owner",
|
||||
"Presentations": "Presentations",
|
||||
"FormTemplates": "Form templates",
|
||||
"Remove": "Remove",
|
||||
"RoleCommentator": "Commentator",
|
||||
"RoleCommentatorDescription": "Operations with existing files: viewing, commenting.",
|
||||
|
@ -21,7 +21,6 @@
|
||||
"BackupCreatedSuccess": "La copia de seguridad se ha creado con éxito.",
|
||||
"BackupList": "Lista de copias de seguridad",
|
||||
"BackupListWarningText": "Si elimina cualquier artículo de la lista, también se eliminarán los archivos correspondientes. No se puede cancelar esta acción. Para eliminar todos los archivos use el enlace:",
|
||||
"BrowserNoCanvasSupport": "Su navegador no soporta la etiqueta canvas de HTML5.",
|
||||
"ByApp": "Con ayuda de la aplicación para autenticación",
|
||||
"BySms": "Por SMS",
|
||||
"ChangeLogoButton": "Cambiar logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Añadir cuenta",
|
||||
"AddAuthor": "Agregar autor",
|
||||
"ArchivingData": "Archivando datos",
|
||||
"ConnectingAccount": "Conectando cuenta",
|
||||
"Copy": "Copiar",
|
||||
|
@ -20,7 +20,6 @@
|
||||
"BackupCreatedSuccess": "Turvatallenteen kopio on luotu onnistuneesti.",
|
||||
"BackupList": "Varmuuskopiolista",
|
||||
"BackupListWarningText": "Jos poistat luettelosta kohteita, myös vastaavat tiedostot poistetaan. Tätä toimintoa ei voi kumota. Jos haluat poistaa kaikki tiedostot, käytä linkkiä:",
|
||||
"BrowserNoCanvasSupport": "Selaimesi ei tue HTML5 esityalueen tagia.",
|
||||
"ByApp": "Autentikointisovelluksella",
|
||||
"BySms": "Tekstiviestillä",
|
||||
"ChangeLogoButton": "Vaihda logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Lisää tili",
|
||||
"AddAuthor": "Lisää kirjoittaja",
|
||||
"ArchivingData": "Tietojen arkistointi",
|
||||
"ConnectingAccount": "Yhdistetään tili",
|
||||
"Copy": "Kopio",
|
||||
|
@ -21,7 +21,6 @@
|
||||
"BackupCreatedSuccess": "La copie de sauvegarde a été créée avec succès.",
|
||||
"BackupList": "Liste des sauvegardes",
|
||||
"BackupListWarningText": "Si vous supprimez certains éléments de la liste, leurs fichiers correspondants seront également supprimés. Cette action ne peut être annulée. Pour supprimer tous les fichiers, utilisez le lien:",
|
||||
"BrowserNoCanvasSupport": "Votre navigateur ne supporte pas les balises HTML5 canvas.",
|
||||
"ByApp": "A l'aide de l'application d'authentification",
|
||||
"BySms": "Par SMS",
|
||||
"ChangeLogoButton": "Changer le logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Ajouter un compte",
|
||||
"AddAuthor": "Ajouter un auteur",
|
||||
"ArchivingData": "Archivage des données",
|
||||
"ConnectingAccount": "Connecter un compte",
|
||||
"Copy": "Copier",
|
||||
|
@ -19,7 +19,6 @@
|
||||
"BackupCreatedSuccess": "Պահուստային պատճենը հաջողությամբ ստեղծվել է:",
|
||||
"BackupList": "Պահուստի ցուցակ",
|
||||
"BackupListWarningText": "Եթե ցանկից որևէ միավոր ջնջեք, դրանց համապատասխան ֆայլերը նույնպես կջնջվեն: Այս գործողությունը հնարավոր չէ հետարկել:Բոլոր ֆայլերը ջնջելու համար օգտագործեք հղումը.",
|
||||
"BrowserNoCanvasSupport": "Ձեր զննարկիչը չի աջակցում HTML5 կտավ պիտակը:",
|
||||
"ByApp": "Իսկորոշիչ հավելվածով ",
|
||||
"BySms": "sms-ով",
|
||||
"ChangeLogoButton": "Փոխել լոգոն",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Ավելացնել հաշիվ",
|
||||
"AddAuthor": "Ավելացնել հեղինակ",
|
||||
"ArchivingData": "Տվյալների արխիվացում",
|
||||
"ConnectingAccount": "Հաշիվը միանում է",
|
||||
"Copy": "Պատճենել",
|
||||
|
@ -21,7 +21,6 @@
|
||||
"BackupCreatedSuccess": "La copia di backup è stata creata con successo.",
|
||||
"BackupList": "Elenco di backup",
|
||||
"BackupListWarningText": "Se si eliminano tutti gli elementi dall'elenco, i relativi file verranno eliminati. Questa azione non può essere annullata. Per eliminare tutti i file, utilizzare il collegamento:",
|
||||
"BrowserNoCanvasSupport": "Il browser che stai utilizzando non supporta l'uso dei tag canvas HTML5.",
|
||||
"ByApp": "Con l'app di autenticazione",
|
||||
"BySms": "Tramite SMS",
|
||||
"ChangeLogoButton": "Cambia logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Aggiungere account",
|
||||
"AddAuthor": "Aggiungi autore",
|
||||
"ArchivingData": "Archiviazione dei dati",
|
||||
"ConnectingAccount": "Collegamento dell'account",
|
||||
"Copy": "Copiare",
|
||||
|
@ -20,7 +20,6 @@
|
||||
"BackupCreatedSuccess": "バックアップ・コピーは正常に作成されました。",
|
||||
"BackupList": "バックアップリスト",
|
||||
"BackupListWarningText": "リストからアイテムを削除すると、対応するファイルも削除されます。この操作を元に戻すことができません。すべてのファイルを削除するために次のリンクをクリックしてください:",
|
||||
"BrowserNoCanvasSupport": "お使いのブラウザは、HTML5のcanvasタグをサポートしていません。",
|
||||
"ByApp": "認証アプリで",
|
||||
"BySms": "smsで",
|
||||
"ChangeLogoButton": "ロゴの変更",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "アカウントの追加",
|
||||
"AddAuthor": "著者を追加",
|
||||
"ArchivingData": "データのアーカイブ",
|
||||
"ConnectingAccount": "接続アカウント",
|
||||
"Copy": "コピー",
|
||||
|
@ -19,7 +19,6 @@
|
||||
"BackupCreatedSuccess": "백업 복사본 생성에 성공했습니다.",
|
||||
"BackupList": "백업 목록",
|
||||
"BackupListWarningText": "목록에서 항목을 삭제하면 그에 상응하는 파일도 삭제됩니다. 이 작업은 취소할 수 없습니다. 모든 파일을 삭제하려면 다음 링크를 사용하시기 바랍니다:",
|
||||
"BrowserNoCanvasSupport": "고객님의 브라우저가 HTML5 캔버스 태그를 지원하지 않습니다.",
|
||||
"ByApp": "인증 앱 이용",
|
||||
"BySms": "SMS 이용",
|
||||
"ChangeLogoButton": "로고 변경",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "계정 추가",
|
||||
"AddAuthor": "작성자추가",
|
||||
"ArchivingData": "데이터 아카이브 중",
|
||||
"ConnectingAccount": "계정 연결 중",
|
||||
"Copy": "복사",
|
||||
|
@ -18,7 +18,6 @@
|
||||
"BackupCreatedSuccess": "ສຳເນົາສໍາຮອງໄດ້ຖືກສ້າງສຳເລັດແລ້ວ.",
|
||||
"BackupList": "ສໍາຮອງຂໍ້ມູນ ລາຍການ",
|
||||
"BackupListWarningText": "ຖ້າທ່ານລຶບລາຍການໃດໆອອກຈາກບັນຊີລາຍຊື່, ໄຟລ໌ທີ່ສອດຄ້ອງກັນຂອງພວກມັນຈະຖືກລຶບຖິ້ມ. ການດໍາເນີນການນີ້ບໍ່ສາມາດຍົກເລີກໄດ້. ເພື່ອລຶບໄຟລ໌ທັງຫມົດໃຫ້ໃຊ້ການເຊື່ອມຕໍ່:",
|
||||
"BrowserNoCanvasSupport": "ບຣາວເຊີຂອງທ່ານບໍ່ສະຫນັບສະຫນູນແບບ HTML5",
|
||||
"ByApp": "ຈາກການກວດສອບສິດ",
|
||||
"BySms": "ຈາກຂໍ້ຄວາມ",
|
||||
"ChangeLogoButton": "ປ່ຽນໂລໂກ",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "ເພີ່ມບັນຊີ",
|
||||
"AddAuthor": "ເພີ່ມຜູ້ຂຽນ",
|
||||
"ArchivingData": "ການເກັບກໍາຂໍ້ມູນ",
|
||||
"ConnectingAccount": "ການເຊື່ອມໂຍງບັນຊີ",
|
||||
"Copy": "ສໍາເນົາ",
|
||||
|
@ -20,7 +20,6 @@
|
||||
"BackupCreatedSuccess": "Rezerves kopija veiksmīgi izveidota.",
|
||||
"BackupList": "Rezerves kopiju saraksts",
|
||||
"BackupListWarningText": "Ja jūs dzēsīsit jebkādus elementus no saraksta, tiem atbilstošie faili arī tiks dzēsti. Šo darbību nevar atsaukt. Lai dzēstu visus failus, izmantojiet saiti:",
|
||||
"BrowserNoCanvasSupport": "Jūsu pārlūkprogramma neatbalsta HTML5 pamatnes tagu.",
|
||||
"ByApp": "Pēc autentifikācijas lietotnes",
|
||||
"BySms": "Pēc SMS",
|
||||
"ChangeLogoButton": "Mainīt logotipu",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Pievienot kontu",
|
||||
"AddAuthor": "Dodaj autora",
|
||||
"ArchivingData": "Datu arhivēšana",
|
||||
"ConnectingAccount": "Savieno kontu",
|
||||
"Copy": "Kopēt",
|
||||
|
@ -20,7 +20,6 @@
|
||||
"BackupCreatedSuccess": "De back-up kopie is succesvol aangemaakt.",
|
||||
"BackupList": "Back-up lijst",
|
||||
"BackupListWarningText": "Als u items uit de lijst verwijdert, worden hun bijbehorende bestanden ook verwijderd. Deze actie kan niet ongedaan gemaakt worden. Om alle bestanden te verwijderen, gebruik de link:",
|
||||
"BrowserNoCanvasSupport": "Uw browser ondersteunt de HTML5 canvas tag niet.",
|
||||
"ByApp": "Via authenticator app",
|
||||
"BySms": "Per sms",
|
||||
"ChangeLogoButton": "Verander Logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Account toevoegen",
|
||||
"AddAuthor": "Voeg auteur toe",
|
||||
"ArchivingData": "Gegevens archiveren",
|
||||
"ConnectingAccount": "Account koppelen",
|
||||
"Copy": "Kopieer",
|
||||
|
@ -20,7 +20,6 @@
|
||||
"BackupCreatedSuccess": "Kopia zapasowa została pomyślnie utworzona.",
|
||||
"BackupList": "Lista kopii zapasowych",
|
||||
"BackupListWarningText": "Jeśli usuniesz wszystkie elementy z listy, odpowiadające im pliki zostaną również usunięte. Ta czynność nie może zostać cofnięta. Aby usunąć wszystkie pliki, użyj linku:",
|
||||
"BrowserNoCanvasSupport": "Twoja przeglądarka nie obsługuje znacznika canvas HTML5.",
|
||||
"ByApp": "Za pośrednictwem aplikacji uwierzytelniającej",
|
||||
"BySms": "Za pośrednictwem wiadomości SMS",
|
||||
"ChangeLogoButton": "Zmień logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Dodaj konto",
|
||||
"AddAuthor": "Dodaj autora",
|
||||
"ArchivingData": "Archiwizacja danych",
|
||||
"ConnectingAccount": "Podłączanie konta",
|
||||
"Copy": "Skopiuj",
|
||||
|
@ -21,7 +21,6 @@
|
||||
"BackupCreatedSuccess": "A cópia de backup foi criada com sucesso.",
|
||||
"BackupList": "Lista de backup",
|
||||
"BackupListWarningText": "Se você excluir qualquer item da lista, seus arquivos correspondentes também serão excluídos. Esta ação não pode ser desfeita. Para excluir todos os arquivos use o link:",
|
||||
"BrowserNoCanvasSupport": "Seu navegador não suporta tag canvas HTML5.",
|
||||
"ByApp": "Por aplicativo autenticador",
|
||||
"BySms": "Por SMS",
|
||||
"ChangeLogoButton": "Alterar Logotipo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Adicionar conta",
|
||||
"AddAuthor": "Adicionar Autor",
|
||||
"ArchivingData": "Arquivando dados",
|
||||
"ConnectingAccount": "Conectando conta",
|
||||
"Copy": "Copiar",
|
||||
|
@ -19,7 +19,6 @@
|
||||
"BackupCreatedSuccess": "A cópia de segurança foi criada com sucesso.",
|
||||
"BackupList": "Lista de Cópias de Segurança",
|
||||
"BackupListWarningText": "Se eliminar qualquer item desta lista, os ficheiros que lhes correspondem serão também eliminados. Esta ação não pode ser anulada. Para eliminar todos os ficheiros utilize o link:",
|
||||
"BrowserNoCanvasSupport": "O seu browser não suporta a tag HTML5 canvas.",
|
||||
"ByApp": "Através da app de autenticação",
|
||||
"BySms": "Por SMS",
|
||||
"ChangeLogoButton": "Alterar Logótipo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Adicionar conta",
|
||||
"AddAuthor": "Adicionar autor",
|
||||
"ArchivingData": "Arquivar dados",
|
||||
"ConnectingAccount": "A ligar conta",
|
||||
"Copy": "Copiar",
|
||||
|
@ -19,7 +19,6 @@
|
||||
"BackupCreatedSuccess": "O copie de rezervă a fost creată cu succes.",
|
||||
"BackupList": "Lista copiilor de rezervă",
|
||||
"BackupListWarningText": "Dacă ștergeți un element din lista, se șterg și toate fișierele respective. Această acțiune nu poate fi anulată. Pentru a șterge toate fișierele folosiți link-ul:",
|
||||
"BrowserNoCanvasSupport": "Browser-ul dvs nu suportă etichetele HTML5 Canvas.",
|
||||
"ByApp": "Prin aplicația de autentificare ",
|
||||
"BySms": "Prin SMS",
|
||||
"ChangeLogoButton": "Schimbare logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Adaugă cont",
|
||||
"AddAuthor": "Adăugare autor",
|
||||
"ArchivingData": "Se arhivează datele",
|
||||
"ConnectingAccount": "Conectare cont",
|
||||
"Copy": "Copiere",
|
||||
|
@ -12,6 +12,7 @@
|
||||
"Convert": "Конвертация",
|
||||
"CopyItem": "<strong>{{title}}</strong> скопирован",
|
||||
"CopyItems": "Скопировано элементов: <strong>{{qty}}</strong>",
|
||||
"CreateRoom": "Создание комнаты",
|
||||
"CustomRooms": "Пользовательская",
|
||||
"Document": "Документ",
|
||||
"EditRoom": "Изменить комнату",
|
||||
@ -80,6 +81,5 @@
|
||||
"VersionHistory": "История версий",
|
||||
"ViewList": "Список",
|
||||
"ViewOnlyRooms": "Просмотр",
|
||||
"ViewTiles": "Плитки",
|
||||
"CreateRoom": "Создание комнаты"
|
||||
"ViewTiles": "Плитки"
|
||||
}
|
||||
|
@ -3,10 +3,10 @@
|
||||
"AdministratorDescription": "Настройка DocSpace, создание и администрирование комнат, возможность приглашать пользователей и управлять ими в DocSpace и в виртуальных комнатах, возможность управлять правами доступа.",
|
||||
"Benefits": "Преимущества",
|
||||
"BusinessExpired": "Срок действия вашего {{planName}} тарифа истек {{date}}",
|
||||
"BusinessTitle": "Вы используете {{planName}} план",
|
||||
"BusinessFinalDateInfo": "Подписка будет автоматически продлена {{finalDate}} с обновленными ценами и техническими характеристиками. Вы можете отменить его или изменить свою платежную информацию на клиентский портал Stripe.",
|
||||
"BusinessRequestDescription": "Тарифные планы с более чем {{peopleNumber}} менеджерами доступны только по запросу",
|
||||
"BusinessSuggestion": "Настройте свой {{planName}} план",
|
||||
"BusinessTitle": "Вы используете {{planName}} план",
|
||||
"BusinessUpdated": "{{planName}} тариф обновлён",
|
||||
"ChangePayer": "Изменить плательщика",
|
||||
"ContactUs": "По вопросам продаж обращайтесь к нам по адресу",
|
||||
|
@ -34,7 +34,6 @@
|
||||
"BackupCreatedSuccess": "Резервная копия успешно создана.",
|
||||
"BackupList": "Список резервных копий",
|
||||
"BackupListWarningText": "При удалении любых элементов из списка соответствующие им файлы тоже будут удалены. Это действие необратимо. Для удаления всех файлов используйте ссылку:",
|
||||
"BrowserNoCanvasSupport": "Ваш браузер не поддерживает тег HTML5 canvas.",
|
||||
"ByApp": "С помощью приложения для аутентификации",
|
||||
"BySms": "С помощью SMS",
|
||||
"ChangeLogoButton": "Сменить логотип",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Подключить",
|
||||
"AddAuthor": "Добавить автора",
|
||||
"ArchivingData": "Архивирование данных",
|
||||
"ConnectingAccount": "Подключение аккаунта",
|
||||
"Copy": "Копировать",
|
||||
@ -27,6 +26,7 @@
|
||||
"FolderTitleYandex": "Каталог Яндекса",
|
||||
"FolderTitlekDrive": "Каталог kDrive",
|
||||
"Folders": "Папки",
|
||||
"FormTemplates": "Шаблоны форм",
|
||||
"LinkCopySuccess": "Ссылка скопирована в буфер обмена",
|
||||
"MediaLoadError": "Медиа файл не может быть загружен",
|
||||
"MobileAndroid": "Скачать ONLYOFFICE Документы в Google Play",
|
||||
@ -40,7 +40,6 @@
|
||||
"Other": "Другой",
|
||||
"OwnerChange": "Сменить владельца",
|
||||
"Presentations": "Презентации",
|
||||
"FormTemplates": "Шаблоны форм",
|
||||
"Spreadsheets": "Таблицы",
|
||||
"SubNewForm": "Пустая",
|
||||
"SubNewFormFile": " Из текстового файла",
|
||||
|
@ -20,7 +20,6 @@
|
||||
"BackupCreatedSuccess": "Kópia zálohy bola úspešne vytvorená.",
|
||||
"BackupList": "Zoznam záloh",
|
||||
"BackupListWarningText": "Ak odstránite niektoré položky zo zoznamu, odstránia sa aj ich príslušné súbory. Táto akcia sa nedá vrátiť späť. Ak chcete odstrániť všetky súbory, použite odkaz:",
|
||||
"BrowserNoCanvasSupport": "Váš prehliadač nepodporuje HTML5 canvas tag.",
|
||||
"ByApp": "Aplikáciou na overenie totožnosti",
|
||||
"BySms": "Prostredníctvom SMS",
|
||||
"ChangeLogoButton": "Zmeniť logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Pridať účet",
|
||||
"AddAuthor": "Pridať autora",
|
||||
"ArchivingData": "Archivácia údajov",
|
||||
"ConnectingAccount": "Pripojenie účtu",
|
||||
"Copy": "Kopírovať",
|
||||
|
@ -20,7 +20,6 @@
|
||||
"BackupCreatedSuccess": "Varnostna kopija je bila uspešno ustvarjena.",
|
||||
"BackupList": "Seznam varnostnih kopij",
|
||||
"BackupListWarningText": "Če izbrišete kateri koli predmet iz seznama, bodo izbrisane tudi ustrezne datoteke. Tega dejanja ni mogoče razveljaviti. Če želite izbrisati vse datoteke, uporabite povezavo:",
|
||||
"BrowserNoCanvasSupport": "Vaš brskalnik ne podpira canvas oznake HTML5.",
|
||||
"ByApp": "Z aplikacijo za avtentikacijo",
|
||||
"BySms": "Preko sms",
|
||||
"ChangeLogoButton": "Spremeni Logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Dodaj račun",
|
||||
"AddAuthor": "Dodaj avtorja",
|
||||
"ArchivingData": "Arhiviraj podatke",
|
||||
"ConnectingAccount": "Povezovanje računa",
|
||||
"Copy": "Kopiraj",
|
||||
|
@ -20,7 +20,6 @@
|
||||
"BackupCreatedSuccess": "Yedekleme kopyası başarıyla oluşturuldu.",
|
||||
"BackupList": "Yedekleme listesi",
|
||||
"BackupListWarningText": "Listeden herhangi bir öğe silerseniz bu öğe ile ilgili dosyalar da silinir. Bu işlem geri alınamaz. Tüm dosyaları silmek için linke tıklayın:",
|
||||
"BrowserNoCanvasSupport": "Tarayıcınız HTML5 canvas etiketini desteklemiyor.",
|
||||
"ByApp": "Kimlik doğrulama uygulaması ile",
|
||||
"BySms": "Sms ile",
|
||||
"ChangeLogoButton": "Logo Değiştir",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Hesap ekle",
|
||||
"AddAuthor": "Yazar Ekle",
|
||||
"ArchivingData": "Veriler arşivleniyor",
|
||||
"ConnectingAccount": "Hesap bağlanıyor",
|
||||
"Copy": "Kopyala",
|
||||
|
@ -20,7 +20,6 @@
|
||||
"BackupCreatedSuccess": "Резервна копія успішно створена.",
|
||||
"BackupList": "Список резервних копій",
|
||||
"BackupListWarningText": "Якщо ви видалите будь-які елементи зі списку, їх відповідні файли також будуть видалені. Цю дію не можна скасувати. Для видалення всіх файлів використовуйте посилання:",
|
||||
"BrowserNoCanvasSupport": "Ваш браузер не підтримує тег canvas в HTML5.",
|
||||
"ByApp": "За допомогою програми автентифікації",
|
||||
"BySms": "За допомогою SMS",
|
||||
"ChangeLogoButton": "Змінити логотип",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Додати обліковий запис",
|
||||
"AddAuthor": "Додати автора",
|
||||
"ArchivingData": "Архівація даних",
|
||||
"ConnectingAccount": "Підключення облікового запису",
|
||||
"Copy": "Копіювати",
|
||||
|
@ -20,7 +20,6 @@
|
||||
"BackupCreatedSuccess": "Bản sao lưu đã được tạo thành công.",
|
||||
"BackupList": "Danh sách sao lưu",
|
||||
"BackupListWarningText": "Nếu bạn xóa bất kỳ mục nào trong danh sách, các file tương ứng của chúng cũng sẽ bị xóa. Tác vụ này không thể được hoàn tác. Để xóa tất cả các file này sử dụng liên kết:",
|
||||
"BrowserNoCanvasSupport": "Trình duyệt của bạn không hỗ trợ HTML5 canvas tag.",
|
||||
"ByApp": "Bằng ứng dụng trình xác thực",
|
||||
"BySms": "Bằng sms",
|
||||
"ChangeLogoButton": "Thay đổi Logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "Thêm tài khoản",
|
||||
"AddAuthor": "Thêm Tác giả",
|
||||
"ArchivingData": "Lưu trữ dữ liệu",
|
||||
"ConnectingAccount": "Đang kết nối tài khoản",
|
||||
"Copy": "Sao chép",
|
||||
|
@ -21,7 +21,6 @@
|
||||
"BackupCreatedSuccess": "备份副本已成功创建。",
|
||||
"BackupList": "备份列表",
|
||||
"BackupListWarningText": "若您从列表中删除任何项目,其相应的文件也将被删除。此操作无法撤消。若想删除所有文件,请使用以下链接:",
|
||||
"BrowserNoCanvasSupport": "您的浏览器不支持HTML5 canvas标记。",
|
||||
"ByApp": "通过身份验证应用",
|
||||
"BySms": "通过短信",
|
||||
"ChangeLogoButton": "更改Logo",
|
||||
|
@ -1,6 +1,5 @@
|
||||
{
|
||||
"AddAccount": "添加账户",
|
||||
"AddAuthor": "添加作者",
|
||||
"ArchivingData": "归档数据",
|
||||
"ConnectingAccount": "连接账户",
|
||||
"Copy": "复制",
|
||||
|
@ -9,26 +9,31 @@ export default function withQuickButtons(WrappedComponent) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
isLoading: false,
|
||||
isCanWebEdit: props.item.viewAccessability?.WebEdit,
|
||||
};
|
||||
}
|
||||
|
||||
onClickLock = () => {
|
||||
const { item, lockFileAction, t } = this.props;
|
||||
onClickLock = async () => {
|
||||
let timer = null;
|
||||
const { item, setIsLoading, isLoading, lockFileAction, t } = this.props;
|
||||
const { locked, id, security } = item;
|
||||
|
||||
if (security?.Lock && !this.state.isLoading) {
|
||||
this.setState({ isLoading: true });
|
||||
return lockFileAction(id, !locked)
|
||||
.then(() =>
|
||||
try {
|
||||
timer = setTimeout(() => {
|
||||
setIsLoading(true);
|
||||
}, 200);
|
||||
if (security?.Lock && !isLoading) {
|
||||
await lockFileAction(id, !locked).then(() =>
|
||||
locked
|
||||
? toastr.success(t("Translations:FileUnlocked"))
|
||||
: toastr.success(t("Translations:FileLocked"))
|
||||
)
|
||||
.catch((err) => toastr.error(err), this.setState({ isLoading: false }))
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
toastr.error(err);
|
||||
} finally {
|
||||
setIsLoading(false), clearTimeout(timer);
|
||||
}
|
||||
return;
|
||||
};
|
||||
|
||||
onClickFavorite = (showFavorite) => {
|
||||
@ -47,7 +52,7 @@ export default function withQuickButtons(WrappedComponent) {
|
||||
};
|
||||
|
||||
render() {
|
||||
const { isLoading, isCanWebEdit } = this.state;
|
||||
const { isCanWebEdit } = this.state;
|
||||
|
||||
const {
|
||||
t,
|
||||
@ -57,6 +62,7 @@ export default function withQuickButtons(WrappedComponent) {
|
||||
sectionWidth,
|
||||
viewAs,
|
||||
folderCategory,
|
||||
isLoading,
|
||||
} = this.props;
|
||||
|
||||
const quickButtonsComponent = (
|
||||
@ -96,6 +102,8 @@ export default function withQuickButtons(WrappedComponent) {
|
||||
lockFileAction,
|
||||
setFavoriteAction,
|
||||
onSelectItem,
|
||||
setIsLoading,
|
||||
isLoading,
|
||||
} = filesActionsStore;
|
||||
const {
|
||||
isPersonalFolderRoot,
|
||||
@ -115,6 +123,8 @@ export default function withQuickButtons(WrappedComponent) {
|
||||
onSelectItem,
|
||||
setSharingPanelVisible,
|
||||
folderCategory,
|
||||
setIsLoading,
|
||||
isLoading,
|
||||
};
|
||||
}
|
||||
)(observer(WithQuickButtons));
|
||||
|
@ -16,7 +16,6 @@ const QuickButtons = (props) => {
|
||||
item,
|
||||
theme,
|
||||
sectionWidth,
|
||||
|
||||
onClickLock,
|
||||
isDisabled,
|
||||
onClickFavorite,
|
||||
@ -67,7 +66,6 @@ const QuickButtons = (props) => {
|
||||
<ColorTheme
|
||||
themeId={ThemeType.IconButton}
|
||||
iconName={iconLock}
|
||||
locked={locked}
|
||||
className="badge lock-file icons-group"
|
||||
size={sizeQuickButton}
|
||||
data-id={id}
|
||||
|
@ -0,0 +1,279 @@
|
||||
import styled, { css } from "styled-components";
|
||||
import Base from "@docspace/components/themes/base";
|
||||
import TableRow from "@docspace/components/table-container/TableRow";
|
||||
import DragAndDrop from "@docspace/components/drag-and-drop";
|
||||
|
||||
const hotkeyBorderStyle = css`
|
||||
border-bottom: 1px solid;
|
||||
border-image-slice: 1;
|
||||
border-image-source: linear-gradient(to left, #2da7db 24px, #2da7db 24px);
|
||||
`;
|
||||
|
||||
const rowCheckboxDraggingStyle = css`
|
||||
margin-left: -20px;
|
||||
padding-left: 20px;
|
||||
|
||||
border-bottom: 1px solid;
|
||||
border-image-slice: 1;
|
||||
border-image-source: ${(props) => `linear-gradient(to right,
|
||||
${props.theme.filesSection.tableView.row.borderColorTransition} 17px, ${props.theme.filesSection.tableView.row.borderColor} 31px)`};
|
||||
`;
|
||||
|
||||
const contextMenuWrapperDraggingStyle = css`
|
||||
margin-right: -20px;
|
||||
padding-right: 20px;
|
||||
|
||||
border-bottom: 1px solid;
|
||||
border-image-slice: 1;
|
||||
border-image-source: ${(props) => `linear-gradient(to left,
|
||||
${props.theme.filesSection.tableView.row.borderColorTransition} 17px, ${props.theme.filesSection.tableView.row.borderColor} 31px)`};
|
||||
`;
|
||||
|
||||
const StyledTableRow = styled(TableRow)`
|
||||
${(props) =>
|
||||
props.isRoom &&
|
||||
css`
|
||||
.table-container_cell {
|
||||
height: 48px;
|
||||
max-height: 48px;
|
||||
}
|
||||
|
||||
.table-container_row-checkbox {
|
||||
padding-left: 20px !important;
|
||||
}
|
||||
`}
|
||||
${(props) =>
|
||||
!props.isDragging &&
|
||||
css`
|
||||
:hover {
|
||||
.table-container_cell {
|
||||
cursor: pointer;
|
||||
background: ${(props) =>
|
||||
`${props.theme.filesSection.tableView.row.backgroundActive} !important`};
|
||||
|
||||
margin-top: ${(props) => (props.showHotkeyBorder ? "-2px" : "-1px")};
|
||||
${(props) =>
|
||||
!props.showHotkeyBorder &&
|
||||
css`
|
||||
border-top: ${(props) =>
|
||||
`1px solid ${props.theme.filesSection.tableView.row.borderColor}`};
|
||||
`}
|
||||
}
|
||||
.table-container_file-name-cell {
|
||||
margin-left: -24px;
|
||||
padding-left: 24px;
|
||||
}
|
||||
.table-container_row-context-menu-wrapper {
|
||||
margin-right: -20px;
|
||||
padding-right: 18px;
|
||||
}
|
||||
}
|
||||
`}
|
||||
.table-container_cell {
|
||||
background: ${(props) =>
|
||||
(props.checked || props.isActive) &&
|
||||
`${props.theme.filesSection.tableView.row.backgroundActive} !important`};
|
||||
cursor: ${(props) =>
|
||||
!props.isThirdPartyFolder &&
|
||||
(props.checked || props.isActive) &&
|
||||
"url(/static/images/cursor.palm.react.svg), auto !important"};
|
||||
|
||||
${(props) =>
|
||||
props.inProgress &&
|
||||
css`
|
||||
pointer-events: none;
|
||||
/* cursor: wait; */
|
||||
`}
|
||||
|
||||
${(props) => props.showHotkeyBorder && "border-color: #2DA7DB"}
|
||||
}
|
||||
|
||||
.table-container_element-wrapper,
|
||||
.table-container_quick-buttons-wrapper {
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
.table-container_element-wrapper,
|
||||
.table-container_row-loader {
|
||||
min-width: ${(props) => (props.isRoom ? "40px" : "36px")};
|
||||
}
|
||||
|
||||
.table-container_element-container {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.table-container_row-loader {
|
||||
svg {
|
||||
margin-left: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.table-container_row-checkbox {
|
||||
padding-left: 20px;
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
.table-container_file-name-cell {
|
||||
${(props) =>
|
||||
props.showHotkeyBorder &&
|
||||
css`
|
||||
margin-left: -24px;
|
||||
padding-left: 24px;
|
||||
${hotkeyBorderStyle}
|
||||
`};
|
||||
${(props) => props.dragging && rowCheckboxDraggingStyle};
|
||||
}
|
||||
|
||||
.table-container_row-context-menu-wrapper {
|
||||
padding-right: 0px;
|
||||
|
||||
${(props) => props.dragging && contextMenuWrapperDraggingStyle};
|
||||
${(props) =>
|
||||
props.showHotkeyBorder &&
|
||||
css`
|
||||
margin-right: -20px;
|
||||
padding-right: 18px;
|
||||
${hotkeyBorderStyle}
|
||||
`};
|
||||
}
|
||||
|
||||
.edit {
|
||||
svg:not(:root) {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
${(props) =>
|
||||
props.showHotkeyBorder &&
|
||||
css`
|
||||
.table-container_cell {
|
||||
margin-top: -2px;
|
||||
|
||||
border-top: 1px solid #2da7db !important;
|
||||
border-right: 0;
|
||||
border-left: 0;
|
||||
}
|
||||
.table-container_file-name-cell > .table-container_cell {
|
||||
margin-top: 2px;
|
||||
border-top: 0px !important;
|
||||
}
|
||||
|
||||
.item-file-name,
|
||||
.row_update-text,
|
||||
.expandButton,
|
||||
.badges,
|
||||
.tag,
|
||||
.author-cell,
|
||||
.table-container_cell > p {
|
||||
margin-top: 2px;
|
||||
}
|
||||
`}
|
||||
`;
|
||||
|
||||
const StyledDragAndDrop = styled(DragAndDrop)`
|
||||
display: contents;
|
||||
`;
|
||||
|
||||
const StyledBadgesContainer = styled.div`
|
||||
margin-left: 8px;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
${(props) =>
|
||||
props.showHotkeyBorder &&
|
||||
css`
|
||||
margin-top: 1px;
|
||||
`}
|
||||
|
||||
.badges {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
.badges:last-child {
|
||||
margin-left: 0px;
|
||||
}
|
||||
|
||||
.badge {
|
||||
cursor: pointer;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.new-items {
|
||||
min-width: 12px;
|
||||
width: max-content;
|
||||
margin: 0 -2px -2px -2px;
|
||||
}
|
||||
|
||||
.badge-version {
|
||||
width: max-content;
|
||||
margin: 0 5px -2px -2px;
|
||||
|
||||
> div {
|
||||
padding: 0 3.3px 0 4px;
|
||||
p {
|
||||
letter-spacing: 0.5px;
|
||||
font-size: 8px;
|
||||
font-weight: 800;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.badge-new-version {
|
||||
width: max-content;
|
||||
}
|
||||
`;
|
||||
|
||||
const StyledQuickButtonsContainer = styled.div`
|
||||
width: 100%;
|
||||
|
||||
.badges {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.badge {
|
||||
margin-right: 14px;
|
||||
}
|
||||
|
||||
.badge:last-child {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.lock-file {
|
||||
svg {
|
||||
height: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.favorite {
|
||||
margin-top: 1px;
|
||||
}
|
||||
|
||||
.share-button-icon:hover {
|
||||
cursor: pointer;
|
||||
path {
|
||||
fill: ${(props) =>
|
||||
props.theme.filesSection.tableView.row.shareHoverColor};
|
||||
}
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
`;
|
||||
|
||||
StyledQuickButtonsContainer.defaultProps = { theme: Base };
|
||||
|
||||
export {
|
||||
StyledBadgesContainer,
|
||||
StyledQuickButtonsContainer,
|
||||
StyledTableRow,
|
||||
StyledDragAndDrop,
|
||||
};
|
@ -1,4 +1,4 @@
|
||||
import React, { useEffect, useRef } from "react";
|
||||
import React, { useEffect, useRef, useCallback } from "react";
|
||||
import elementResizeDetectorMaker from "element-resize-detector";
|
||||
import TableContainer from "@docspace/components/table-container";
|
||||
import { inject, observer } from "mobx-react";
|
||||
@ -8,7 +8,6 @@ import TableBody from "@docspace/components/table-container/TableBody";
|
||||
import { isMobile } from "react-device-detect";
|
||||
import styled, { css } from "styled-components";
|
||||
import { Base } from "@docspace/components/themes";
|
||||
import { TableVersions } from "SRC_DIR/helpers/constants";
|
||||
|
||||
const marginCss = css`
|
||||
margin-top: -1px;
|
||||
@ -99,14 +98,6 @@ const StyledTableContainer = styled(TableContainer)`
|
||||
|
||||
StyledTableContainer.defaultProps = { theme: Base };
|
||||
|
||||
const TABLE_COLUMNS = `filesTableColumns_ver-${TableVersions.Files}`;
|
||||
const COLUMNS_SIZE = `filesColumnsSize_ver-${TableVersions.Files}`;
|
||||
const COLUMNS_SIZE_INFO_PANEL = `filesColumnsSizeInfoPanel_ver-${TableVersions.Files}`;
|
||||
|
||||
const TABLE_ROOMS_COLUMNS = `roomsTableColumns_ver-${TableVersions.Rooms}`;
|
||||
const COLUMNS_ROOMS_SIZE = `roomsColumnsSize_ver-${TableVersions.Rooms}`;
|
||||
const COLUMNS_ROOMS_SIZE_INFO_PANEL = `roomsColumnsSizeInfoPanel_ver-${TableVersions.Rooms}`;
|
||||
|
||||
const elementResizeDetector = elementResizeDetectorMaker({
|
||||
strategy: "scroll",
|
||||
callOnAdd: false,
|
||||
@ -121,12 +112,13 @@ const Table = ({
|
||||
setHeaderBorder,
|
||||
theme,
|
||||
infoPanelVisible,
|
||||
userId,
|
||||
fetchMoreFiles,
|
||||
hasMoreFiles,
|
||||
filterTotal,
|
||||
isRooms,
|
||||
withPaging,
|
||||
columnStorageName,
|
||||
columnInfoPanelStorageName,
|
||||
}) => {
|
||||
const [tagCount, setTagCount] = React.useState(null);
|
||||
const [hideColumns, setHideColumns] = React.useState(false);
|
||||
@ -149,7 +141,7 @@ const Table = ({
|
||||
}
|
||||
}, [sectionWidth]);
|
||||
|
||||
React.useEffect(() => {
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
if (!tagRef?.current) return;
|
||||
|
||||
@ -157,7 +149,7 @@ const Table = ({
|
||||
};
|
||||
}, []);
|
||||
|
||||
const onResize = React.useCallback(
|
||||
const onResize = useCallback(
|
||||
(node) => {
|
||||
const element = tagRef?.current ? tagRef?.current : node;
|
||||
|
||||
@ -172,7 +164,7 @@ const Table = ({
|
||||
[tagCount]
|
||||
);
|
||||
|
||||
const onSetTagRef = React.useCallback((node) => {
|
||||
const onSetTagRef = useCallback((node) => {
|
||||
if (node) {
|
||||
tagRef.current = node;
|
||||
onResize(node);
|
||||
@ -181,29 +173,11 @@ const Table = ({
|
||||
}
|
||||
}, []);
|
||||
|
||||
const tableColumns = isRooms
|
||||
? `${TABLE_ROOMS_COLUMNS}=${userId}`
|
||||
: `${TABLE_COLUMNS}=${userId}`;
|
||||
const columnStorageName = isRooms
|
||||
? `${COLUMNS_ROOMS_SIZE}=${userId}`
|
||||
: `${COLUMNS_SIZE}=${userId}`;
|
||||
const columnInfoPanelStorageName = isRooms
|
||||
? `${COLUMNS_ROOMS_SIZE_INFO_PANEL}=${userId}`
|
||||
: `${COLUMNS_SIZE_INFO_PANEL}=${userId}`;
|
||||
|
||||
return (
|
||||
<StyledTableContainer useReactWindow={!withPaging} forwardedRef={ref}>
|
||||
<TableHeader
|
||||
sectionWidth={sectionWidth}
|
||||
containerRef={ref}
|
||||
tableStorageName={tableColumns}
|
||||
columnStorageName={columnStorageName}
|
||||
filesColumnStorageName={`${COLUMNS_SIZE}=${userId}`}
|
||||
roomsColumnStorageName={`${COLUMNS_ROOMS_SIZE}=${userId}`}
|
||||
columnInfoPanelStorageName={columnInfoPanelStorageName}
|
||||
filesColumnInfoPanelStorageName={`${COLUMNS_SIZE_INFO_PANEL}=${userId}`}
|
||||
roomsColumnInfoPanelStorageName={`${COLUMNS_ROOMS_SIZE_INFO_PANEL}=${userId}`}
|
||||
isRooms={isRooms}
|
||||
tagRef={onSetTagRef}
|
||||
setHideColumns={setHideColumns}
|
||||
/>
|
||||
@ -228,9 +202,6 @@ const Table = ({
|
||||
setFirsElemChecked={setFirsElemChecked}
|
||||
setHeaderBorder={setHeaderBorder}
|
||||
theme={theme}
|
||||
tableColumns={tableColumns}
|
||||
columnStorageName={columnStorageName}
|
||||
columnInfoPanelStorageName={columnInfoPanelStorageName}
|
||||
tagCount={tagCount}
|
||||
isRooms={isRooms}
|
||||
hideColumns={hideColumns}
|
||||
@ -241,13 +212,14 @@ const Table = ({
|
||||
);
|
||||
};
|
||||
|
||||
export default inject(({ filesStore, treeFoldersStore, auth }) => {
|
||||
export default inject(({ filesStore, treeFoldersStore, auth, tableStore }) => {
|
||||
const { isVisible: infoPanelVisible } = auth.infoPanelStore;
|
||||
|
||||
const { isRoomsFolder, isArchiveFolder } = treeFoldersStore;
|
||||
|
||||
const isRooms = isRoomsFolder || isArchiveFolder;
|
||||
|
||||
const { columnStorageName, columnInfoPanelStorageName } = tableStore;
|
||||
|
||||
const {
|
||||
filesList,
|
||||
viewAs,
|
||||
@ -276,5 +248,7 @@ export default inject(({ filesStore, treeFoldersStore, auth }) => {
|
||||
filterTotal: isRooms ? roomsFilterTotal : filterTotal,
|
||||
isRooms,
|
||||
withPaging,
|
||||
columnStorageName,
|
||||
columnInfoPanelStorageName,
|
||||
};
|
||||
})(observer(Table));
|
||||
|
@ -4,8 +4,6 @@ import { inject, observer } from "mobx-react";
|
||||
import { withTranslation } from "react-i18next";
|
||||
import { Events } from "@docspace/common/constants";
|
||||
|
||||
const WITH_AUTHOR = "withAuthorColumn";
|
||||
|
||||
class FilesTableHeader extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
@ -16,13 +14,7 @@ class FilesTableHeader extends React.Component {
|
||||
}
|
||||
|
||||
getTableColumns = (fromUpdate = false) => {
|
||||
const {
|
||||
t,
|
||||
personal,
|
||||
tableStorageName,
|
||||
isRooms,
|
||||
isPersonalRoom,
|
||||
} = this.props;
|
||||
const { t, isRooms, getColumns } = this.props;
|
||||
|
||||
const defaultColumns = [];
|
||||
|
||||
@ -32,7 +24,7 @@ class FilesTableHeader extends React.Component {
|
||||
key: "Name",
|
||||
title: t("Common:Name"),
|
||||
resizable: true,
|
||||
enable: true,
|
||||
enable: this.props.roomColumnNameIsEnabled,
|
||||
default: true,
|
||||
sortBy: "AZ",
|
||||
minWidth: 210,
|
||||
@ -41,7 +33,7 @@ class FilesTableHeader extends React.Component {
|
||||
{
|
||||
key: "Type",
|
||||
title: t("Common:Type"),
|
||||
enable: false,
|
||||
enable: this.props.roomColumnTypeIsEnabled,
|
||||
resizable: true,
|
||||
sortBy: "roomType",
|
||||
onChange: this.onColumnChange,
|
||||
@ -50,7 +42,7 @@ class FilesTableHeader extends React.Component {
|
||||
{
|
||||
key: "Tags",
|
||||
title: t("Common:Tags"),
|
||||
enable: true,
|
||||
enable: this.props.roomColumnTagsIsEnabled,
|
||||
resizable: true,
|
||||
sortBy: "Tags",
|
||||
withTagRef: true,
|
||||
@ -60,7 +52,7 @@ class FilesTableHeader extends React.Component {
|
||||
{
|
||||
key: "Owner",
|
||||
title: t("ByOwner"),
|
||||
enable: false,
|
||||
enable: this.props.roomColumnOwnerIsEnabled,
|
||||
resizable: true,
|
||||
sortBy: "Author",
|
||||
onChange: this.onColumnChange,
|
||||
@ -69,7 +61,7 @@ class FilesTableHeader extends React.Component {
|
||||
{
|
||||
key: "Activity",
|
||||
title: t("ByLastModified"),
|
||||
enable: true,
|
||||
enable: this.props.roomColumnActivityIsEnabled,
|
||||
resizable: true,
|
||||
sortBy: "DateAndTime",
|
||||
onChange: this.onColumnChange,
|
||||
@ -79,38 +71,30 @@ class FilesTableHeader extends React.Component {
|
||||
|
||||
defaultColumns.push(...columns);
|
||||
} else {
|
||||
const authorOption = {
|
||||
key: "Author",
|
||||
title: t("ByAuthor"),
|
||||
enable: false,
|
||||
resizable: true,
|
||||
sortBy: "Author",
|
||||
|
||||
// isDisabled: isPersonalRoom,
|
||||
onClick: this.onFilter,
|
||||
onChange: this.onColumnChange,
|
||||
};
|
||||
|
||||
// if (isPersonalRoom) {
|
||||
// authorOption.defaultSize = 0;
|
||||
// }
|
||||
|
||||
const columns = [
|
||||
{
|
||||
key: "Name",
|
||||
title: t("Common:Name"),
|
||||
resizable: true,
|
||||
enable: true,
|
||||
enable: this.props.nameColumnIsEnabled,
|
||||
default: true,
|
||||
sortBy: "AZ",
|
||||
minWidth: 210,
|
||||
onClick: this.onFilter,
|
||||
},
|
||||
authorOption,
|
||||
{
|
||||
key: "Author",
|
||||
title: t("ByAuthor"),
|
||||
enable: this.props.authorColumnIsEnabled,
|
||||
resizable: true,
|
||||
sortBy: "Author",
|
||||
onClick: this.onFilter,
|
||||
onChange: this.onColumnChange,
|
||||
},
|
||||
{
|
||||
key: "Created",
|
||||
title: t("ByCreation"),
|
||||
enable: true,
|
||||
enable: this.props.createdColumnIsEnabled,
|
||||
resizable: true,
|
||||
sortBy: "DateAndTimeCreation",
|
||||
onClick: this.onFilter,
|
||||
@ -119,7 +103,7 @@ class FilesTableHeader extends React.Component {
|
||||
{
|
||||
key: "Modified",
|
||||
title: t("ByLastModified"),
|
||||
enable: true,
|
||||
enable: this.props.modifiedColumnIsEnabled,
|
||||
resizable: true,
|
||||
sortBy: "DateAndTime",
|
||||
onClick: this.onFilter,
|
||||
@ -128,7 +112,7 @@ class FilesTableHeader extends React.Component {
|
||||
{
|
||||
key: "Size",
|
||||
title: t("Common:Size"),
|
||||
enable: true,
|
||||
enable: this.props.sizeColumnIsEnabled,
|
||||
resizable: true,
|
||||
sortBy: "Size",
|
||||
onClick: this.onFilter,
|
||||
@ -137,7 +121,7 @@ class FilesTableHeader extends React.Component {
|
||||
{
|
||||
key: "Type",
|
||||
title: t("Common:Type"),
|
||||
enable: true,
|
||||
enable: this.props.typeColumnIsEnabled,
|
||||
resizable: true,
|
||||
sortBy: "Type",
|
||||
onClick: this.onFilter,
|
||||
@ -146,20 +130,18 @@ class FilesTableHeader extends React.Component {
|
||||
{
|
||||
key: "QuickButtons",
|
||||
title: "",
|
||||
enable: true,
|
||||
enable: this.props.quickButtonsColumnIsEnabled,
|
||||
defaultSize: 75,
|
||||
resizable: false,
|
||||
},
|
||||
];
|
||||
|
||||
personal && columns.splice(1, 1);
|
||||
|
||||
defaultColumns.push(...columns);
|
||||
}
|
||||
|
||||
const storageColumns = localStorage.getItem(tableStorageName);
|
||||
const columns = getColumns(defaultColumns);
|
||||
const storageColumns = localStorage.getItem(this.props.tableStorageName);
|
||||
const splitColumns = storageColumns && storageColumns.split(",");
|
||||
const columns = this.getColumns(defaultColumns, splitColumns);
|
||||
const resetColumnsSize =
|
||||
(splitColumns && splitColumns.length !== columns.length) || !splitColumns;
|
||||
|
||||
@ -167,17 +149,13 @@ class FilesTableHeader extends React.Component {
|
||||
this.setTableColumns(tableColumns);
|
||||
if (fromUpdate) {
|
||||
this.setState({
|
||||
columns: columns,
|
||||
resetColumnsSize: resetColumnsSize,
|
||||
isRooms: isRooms,
|
||||
isPersonalRoom: isPersonalRoom,
|
||||
columns,
|
||||
resetColumnsSize,
|
||||
});
|
||||
} else {
|
||||
this.state = {
|
||||
columns: columns,
|
||||
resetColumnsSize: resetColumnsSize,
|
||||
isRooms: isRooms,
|
||||
isPersonalRoom: isPersonalRoom,
|
||||
columns,
|
||||
resetColumnsSize,
|
||||
};
|
||||
}
|
||||
};
|
||||
@ -214,12 +192,9 @@ class FilesTableHeader extends React.Component {
|
||||
|
||||
this.isBeginScrolling = true;
|
||||
};
|
||||
componentDidUpdate(prevProps) {
|
||||
if (this.props.isRooms !== this.state.isRooms) {
|
||||
return this.getTableColumns(true);
|
||||
}
|
||||
|
||||
if (this.props.isPersonalRoom !== this.state.isPersonalRoom) {
|
||||
componentDidUpdate(prevProps) {
|
||||
if (this.props.isRooms !== prevProps.isRooms) {
|
||||
return this.getTableColumns(true);
|
||||
}
|
||||
|
||||
@ -244,56 +219,21 @@ class FilesTableHeader extends React.Component {
|
||||
componentWillUnmount() {
|
||||
this.customScrollElm.removeEventListener("scroll", this.onBeginScroll);
|
||||
}
|
||||
getColumns = (defaultColumns, splitColumns) => {
|
||||
const { isPersonalRoom, isRooms } = this.props;
|
||||
|
||||
const columns = [];
|
||||
|
||||
if (splitColumns) {
|
||||
for (let col of defaultColumns) {
|
||||
const column = splitColumns.find((key) => key === col.key);
|
||||
column ? (col.enable = true) : (col.enable = false);
|
||||
|
||||
if (!isRooms) {
|
||||
if (column === "Author" && isPersonalRoom) {
|
||||
col.enable = false;
|
||||
}
|
||||
|
||||
if (col.key === "Author" && !isPersonalRoom) {
|
||||
if (!col.enable) {
|
||||
const withAuthor = localStorage.getItem(WITH_AUTHOR);
|
||||
|
||||
if (withAuthor === "true") {
|
||||
col.enable = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
columns.push(col);
|
||||
}
|
||||
return columns;
|
||||
} else {
|
||||
return defaultColumns;
|
||||
}
|
||||
};
|
||||
|
||||
onColumnChange = (key, e) => {
|
||||
onColumnChange = (key) => {
|
||||
const { columns } = this.state;
|
||||
|
||||
const columnIndex = columns.findIndex((c) => c.key === key);
|
||||
if (columnIndex === -1) return;
|
||||
|
||||
this.props.setColumnEnable(key);
|
||||
|
||||
columns[columnIndex].enable = !columns[columnIndex].enable;
|
||||
this.setState({ columns });
|
||||
|
||||
const tableColumns = columns.map((c) => c.enable && c.key);
|
||||
this.setTableColumns(tableColumns);
|
||||
|
||||
if (key === "Author") {
|
||||
localStorage.setItem(WITH_AUTHOR, columns[columnIndex].enable);
|
||||
}
|
||||
|
||||
const event = new Event(Events.CHANGE_COLUMN);
|
||||
|
||||
window.dispatchEvent(event);
|
||||
@ -356,27 +296,23 @@ class FilesTableHeader extends React.Component {
|
||||
setHideColumns,
|
||||
} = this.props;
|
||||
|
||||
// const { sortBy, sortOrder } = filter;
|
||||
const { columns, resetColumnsSize } = this.state;
|
||||
|
||||
const sortBy = isRooms ? roomsFilter.sortBy : filter.sortBy;
|
||||
const sortOrder = isRooms ? roomsFilter.sortOrder : filter.sortOrder;
|
||||
|
||||
// TODO: make some better
|
||||
let needReset = this.props.isRooms !== this.state.isRooms;
|
||||
let currentColumnStorageName = columnStorageName;
|
||||
let currentColumnInfoPanelStorageName = columnInfoPanelStorageName;
|
||||
|
||||
if (columns.length === 5 && columnStorageName === filesColumnStorageName) {
|
||||
currentColumnStorageName = roomsColumnStorageName;
|
||||
currentColumnInfoPanelStorageName = roomsColumnInfoPanelStorageName;
|
||||
needReset = true;
|
||||
}
|
||||
|
||||
if (columns.length === 7 && columnStorageName === roomsColumnStorageName) {
|
||||
currentColumnStorageName = filesColumnStorageName;
|
||||
currentColumnInfoPanelStorageName = filesColumnInfoPanelStorageName;
|
||||
needReset = true;
|
||||
}
|
||||
|
||||
return (
|
||||
@ -390,7 +326,7 @@ class FilesTableHeader extends React.Component {
|
||||
columnStorageName={currentColumnStorageName}
|
||||
columnInfoPanelStorageName={currentColumnInfoPanelStorageName}
|
||||
sectionWidth={sectionWidth}
|
||||
resetColumnsSize={resetColumnsSize || needReset}
|
||||
resetColumnsSize={resetColumnsSize}
|
||||
sortingVisible={sortingVisible}
|
||||
infoPanelVisible={infoPanelVisible}
|
||||
useReactWindow={!withPaging}
|
||||
@ -402,7 +338,7 @@ class FilesTableHeader extends React.Component {
|
||||
}
|
||||
|
||||
export default inject(
|
||||
({ auth, filesStore, selectedFolderStore, treeFoldersStore }) => {
|
||||
({ auth, filesStore, selectedFolderStore, treeFoldersStore, tableStore }) => {
|
||||
const { isVisible: infoPanelVisible } = auth.infoPanelStore;
|
||||
|
||||
const {
|
||||
@ -416,17 +352,44 @@ export default inject(
|
||||
roomsFilter,
|
||||
fetchRooms,
|
||||
} = filesStore;
|
||||
const { isRecentFolder, isPersonalRoom } = treeFoldersStore;
|
||||
const { isRecentFolder, isRoomsFolder, isArchiveFolder } = treeFoldersStore;
|
||||
const isRooms = isRoomsFolder || isArchiveFolder;
|
||||
const withContent = canShare;
|
||||
const sortingVisible = !isRecentFolder;
|
||||
const { personal, withPaging } = auth.settingsStore;
|
||||
const { withPaging } = auth.settingsStore;
|
||||
|
||||
const {
|
||||
tableStorageName,
|
||||
columnStorageName,
|
||||
columnInfoPanelStorageName,
|
||||
filesColumnStorageName,
|
||||
roomsColumnStorageName,
|
||||
filesColumnInfoPanelStorageName,
|
||||
roomsColumnInfoPanelStorageName,
|
||||
|
||||
nameColumnIsEnabled,
|
||||
authorColumnIsEnabled,
|
||||
createdColumnIsEnabled,
|
||||
modifiedColumnIsEnabled,
|
||||
sizeColumnIsEnabled,
|
||||
typeColumnIsEnabled,
|
||||
quickButtonsColumnIsEnabled,
|
||||
|
||||
roomColumnNameIsEnabled,
|
||||
roomColumnTypeIsEnabled,
|
||||
roomColumnTagsIsEnabled,
|
||||
roomColumnOwnerIsEnabled,
|
||||
roomColumnActivityIsEnabled,
|
||||
|
||||
getColumns,
|
||||
setColumnEnable,
|
||||
} = tableStore;
|
||||
|
||||
return {
|
||||
isHeaderChecked,
|
||||
filter,
|
||||
selectedFolderId: selectedFolderStore.id,
|
||||
withContent,
|
||||
personal,
|
||||
sortingVisible,
|
||||
|
||||
setIsLoading,
|
||||
@ -441,7 +404,31 @@ export default inject(
|
||||
infoPanelVisible,
|
||||
withPaging,
|
||||
|
||||
isPersonalRoom,
|
||||
tableStorageName,
|
||||
columnStorageName,
|
||||
columnInfoPanelStorageName,
|
||||
filesColumnStorageName,
|
||||
roomsColumnStorageName,
|
||||
filesColumnInfoPanelStorageName,
|
||||
roomsColumnInfoPanelStorageName,
|
||||
|
||||
nameColumnIsEnabled,
|
||||
authorColumnIsEnabled,
|
||||
createdColumnIsEnabled,
|
||||
modifiedColumnIsEnabled,
|
||||
sizeColumnIsEnabled,
|
||||
typeColumnIsEnabled,
|
||||
quickButtonsColumnIsEnabled,
|
||||
|
||||
roomColumnNameIsEnabled,
|
||||
roomColumnTypeIsEnabled,
|
||||
roomColumnTagsIsEnabled,
|
||||
roomColumnOwnerIsEnabled,
|
||||
roomColumnActivityIsEnabled,
|
||||
|
||||
getColumns,
|
||||
setColumnEnable,
|
||||
isRooms,
|
||||
};
|
||||
}
|
||||
)(
|
||||
|
@ -6,303 +6,24 @@ import withQuickButtons from "../../../../../HOCs/withQuickButtons";
|
||||
import withFileActions from "../../../../../HOCs/withFileActions";
|
||||
import ItemIcon from "../../../../../components/ItemIcon";
|
||||
import { withTranslation } from "react-i18next";
|
||||
import TableRow from "@docspace/components/table-container/TableRow";
|
||||
import TableCell from "@docspace/components/table-container/TableCell";
|
||||
import DragAndDrop from "@docspace/components/drag-and-drop";
|
||||
import FileNameCell from "./sub-components/FileNameCell";
|
||||
import SizeCell from "./sub-components/SizeCell";
|
||||
import AuthorCell from "./sub-components/AuthorCell";
|
||||
import DateCell from "./sub-components/DateCell";
|
||||
import TypeCell from "./sub-components/TypeCell";
|
||||
import TagsCell from "./sub-components/TagsCell";
|
||||
import styled, { css } from "styled-components";
|
||||
import Base from "@docspace/components/themes/base";
|
||||
import { classNames } from "@docspace/components/utils/classNames";
|
||||
|
||||
const hotkeyBorderStyle = css`
|
||||
border-bottom: 1px solid;
|
||||
border-image-slice: 1;
|
||||
border-image-source: linear-gradient(to left, #2da7db 24px, #2da7db 24px);
|
||||
`;
|
||||
|
||||
const rowCheckboxDraggingStyle = css`
|
||||
margin-left: -20px;
|
||||
padding-left: 20px;
|
||||
|
||||
border-bottom: 1px solid;
|
||||
border-image-slice: 1;
|
||||
border-image-source: ${(props) => `linear-gradient(to right,
|
||||
${props.theme.filesSection.tableView.row.borderColorTransition} 17px, ${props.theme.filesSection.tableView.row.borderColor} 31px)`};
|
||||
`;
|
||||
|
||||
const contextMenuWrapperDraggingStyle = css`
|
||||
margin-right: -20px;
|
||||
padding-right: 20px;
|
||||
|
||||
border-bottom: 1px solid;
|
||||
border-image-slice: 1;
|
||||
border-image-source: ${(props) => `linear-gradient(to left,
|
||||
${props.theme.filesSection.tableView.row.borderColorTransition} 17px, ${props.theme.filesSection.tableView.row.borderColor} 31px)`};
|
||||
`;
|
||||
|
||||
const StyledTableRow = styled(TableRow)`
|
||||
${(props) =>
|
||||
props.isRoom &&
|
||||
css`
|
||||
.table-container_cell {
|
||||
height: 48px;
|
||||
max-height: 48px;
|
||||
}
|
||||
|
||||
.table-container_row-checkbox {
|
||||
padding-left: 20px !important;
|
||||
}
|
||||
`}
|
||||
${(props) =>
|
||||
!props.isDragging &&
|
||||
css`
|
||||
:hover {
|
||||
.table-container_cell {
|
||||
cursor: pointer;
|
||||
background: ${(props) =>
|
||||
`${props.theme.filesSection.tableView.row.backgroundActive} !important`};
|
||||
|
||||
margin-top: ${(props) => (props.showHotkeyBorder ? "-2px" : "-1px")};
|
||||
${(props) =>
|
||||
!props.showHotkeyBorder &&
|
||||
css`
|
||||
border-top: ${(props) =>
|
||||
`1px solid ${props.theme.filesSection.tableView.row.borderColor}`};
|
||||
`}
|
||||
}
|
||||
.table-container_file-name-cell {
|
||||
margin-left: -24px;
|
||||
padding-left: 24px;
|
||||
}
|
||||
.table-container_row-context-menu-wrapper {
|
||||
margin-right: -20px;
|
||||
padding-right: 18px;
|
||||
}
|
||||
}
|
||||
`}
|
||||
.table-container_cell {
|
||||
background: ${(props) =>
|
||||
(props.checked || props.isActive) &&
|
||||
`${props.theme.filesSection.tableView.row.backgroundActive} !important`};
|
||||
cursor: ${(props) =>
|
||||
!props.isThirdPartyFolder &&
|
||||
(props.checked || props.isActive) &&
|
||||
"url(/static/images/cursor.palm.react.svg), auto !important"};
|
||||
|
||||
${(props) =>
|
||||
props.inProgress &&
|
||||
css`
|
||||
pointer-events: none;
|
||||
/* cursor: wait; */
|
||||
`}
|
||||
|
||||
${(props) => props.showHotkeyBorder && "border-color: #2DA7DB"}
|
||||
}
|
||||
|
||||
.table-container_element-wrapper,
|
||||
.table-container_quick-buttons-wrapper {
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
.table-container_element-wrapper,
|
||||
.table-container_row-loader {
|
||||
min-width: ${(props) => (props.isRoom ? "40px" : "36px")};
|
||||
}
|
||||
|
||||
.table-container_element-container {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.table-container_row-loader {
|
||||
svg {
|
||||
margin-left: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.table-container_row-checkbox {
|
||||
padding-left: 20px;
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
.table-container_file-name-cell {
|
||||
${(props) =>
|
||||
props.showHotkeyBorder &&
|
||||
css`
|
||||
margin-left: -24px;
|
||||
padding-left: 24px;
|
||||
${hotkeyBorderStyle}
|
||||
`};
|
||||
${(props) => props.dragging && rowCheckboxDraggingStyle};
|
||||
}
|
||||
|
||||
.table-container_row-context-menu-wrapper {
|
||||
padding-right: 0px;
|
||||
|
||||
${(props) => props.dragging && contextMenuWrapperDraggingStyle};
|
||||
${(props) =>
|
||||
props.showHotkeyBorder &&
|
||||
css`
|
||||
margin-right: -20px;
|
||||
padding-right: 18px;
|
||||
${hotkeyBorderStyle}
|
||||
`};
|
||||
}
|
||||
|
||||
.edit {
|
||||
svg:not(:root) {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
${(props) =>
|
||||
props.showHotkeyBorder &&
|
||||
css`
|
||||
.table-container_cell {
|
||||
margin-top: -2px;
|
||||
|
||||
border-top: 1px solid #2da7db !important;
|
||||
border-right: 0;
|
||||
border-left: 0;
|
||||
}
|
||||
.table-container_file-name-cell > .table-container_cell {
|
||||
margin-top: 2px;
|
||||
border-top: 0px !important;
|
||||
}
|
||||
|
||||
.item-file-name,
|
||||
.row_update-text,
|
||||
.expandButton,
|
||||
.badges,
|
||||
.tag,
|
||||
.author-cell,
|
||||
.table-container_cell > p {
|
||||
margin-top: 2px;
|
||||
}
|
||||
`}
|
||||
`;
|
||||
|
||||
const StyledDragAndDrop = styled(DragAndDrop)`
|
||||
display: contents;
|
||||
`;
|
||||
|
||||
const StyledBadgesContainer = styled.div`
|
||||
margin-left: 8px;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
${(props) =>
|
||||
props.showHotkeyBorder &&
|
||||
css`
|
||||
margin-top: 1px;
|
||||
`}
|
||||
|
||||
.badges {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
.badges:last-child {
|
||||
margin-left: 0px;
|
||||
}
|
||||
|
||||
.badge {
|
||||
cursor: pointer;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.new-items {
|
||||
min-width: 12px;
|
||||
width: max-content;
|
||||
margin: 0 -2px -2px -2px;
|
||||
}
|
||||
|
||||
.badge-version {
|
||||
width: max-content;
|
||||
margin: 0 5px -2px -2px;
|
||||
|
||||
> div {
|
||||
padding: 0 3.3px 0 4px;
|
||||
p {
|
||||
letter-spacing: 0.5px;
|
||||
font-size: 8px;
|
||||
font-weight: 800;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.badge-new-version {
|
||||
width: max-content;
|
||||
}
|
||||
`;
|
||||
|
||||
const StyledQuickButtonsContainer = styled.div`
|
||||
width: 100%;
|
||||
|
||||
.badges {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.badge {
|
||||
margin-right: 14px;
|
||||
}
|
||||
|
||||
.badge:last-child {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.lock-file {
|
||||
svg {
|
||||
height: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.favorite {
|
||||
margin-top: 1px;
|
||||
}
|
||||
|
||||
.share-button-icon:hover {
|
||||
cursor: pointer;
|
||||
path {
|
||||
fill: ${(props) =>
|
||||
props.theme.filesSection.tableView.row.shareHoverColor};
|
||||
}
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
`;
|
||||
|
||||
StyledQuickButtonsContainer.defaultProps = { theme: Base };
|
||||
import RoomsRowDataComponent from "./sub-components/RoomsRowData";
|
||||
import RowDataComponent from "./sub-components/RowData";
|
||||
import { StyledTableRow, StyledDragAndDrop } from "./StyledTable";
|
||||
|
||||
const FilesTableRow = (props) => {
|
||||
const {
|
||||
t,
|
||||
fileContextClick,
|
||||
item,
|
||||
onContentFileSelect,
|
||||
checkedProps,
|
||||
className,
|
||||
value,
|
||||
onMouseClick,
|
||||
badgesComponent,
|
||||
dragging,
|
||||
isDragging,
|
||||
onDrop,
|
||||
onMouseDown,
|
||||
personal,
|
||||
isActive,
|
||||
onHideContextMenu,
|
||||
onFilesClick,
|
||||
@ -311,12 +32,9 @@ const FilesTableRow = (props) => {
|
||||
setFirsElemChecked,
|
||||
setHeaderBorder,
|
||||
theme,
|
||||
quickButtonsComponent,
|
||||
getContextModel,
|
||||
showHotkeyBorder,
|
||||
tableColumns,
|
||||
id,
|
||||
hideColumns,
|
||||
isRooms,
|
||||
} = props;
|
||||
const { acceptBackground, background } = theme.dragAndDrop;
|
||||
@ -374,33 +92,6 @@ const FilesTableRow = (props) => {
|
||||
}
|
||||
}, [checkedProps, isActive, showHotkeyBorder]);
|
||||
|
||||
let availableColumns = [];
|
||||
let authorAvailableDrag = true;
|
||||
let createdAvailableDrag = true;
|
||||
let modifiedAvailableDrag = true;
|
||||
let sizeAvailableDrag = true;
|
||||
let typeAvailableDrag = true;
|
||||
let ownerAvailableDrag = true;
|
||||
let tagsAvailableDrag = true;
|
||||
let activityAvailableDrag = true;
|
||||
let buttonsAvailableDrag = true;
|
||||
|
||||
if (dragging && isDragging) {
|
||||
availableColumns = localStorage.getItem(tableColumns).split(",");
|
||||
|
||||
authorAvailableDrag = availableColumns.includes("Author") && !hideColumns;
|
||||
createdAvailableDrag = availableColumns.includes("Created") && !hideColumns;
|
||||
modifiedAvailableDrag =
|
||||
availableColumns.includes("Modified") && !hideColumns;
|
||||
sizeAvailableDrag = availableColumns.includes("Size") && !hideColumns;
|
||||
typeAvailableDrag = availableColumns.includes("Type") && !hideColumns;
|
||||
buttonsAvailableDrag = availableColumns.includes("QuickButtons");
|
||||
ownerAvailableDrag = availableColumns.includes("Owner") && !hideColumns;
|
||||
tagsAvailableDrag = availableColumns.includes("Tags") && !hideColumns;
|
||||
activityAvailableDrag =
|
||||
availableColumns.includes("Activity") && !hideColumns;
|
||||
}
|
||||
|
||||
const idWithFileExst = item.fileExst
|
||||
? `${item.id}_${item.fileExst}`
|
||||
: item.id ?? "";
|
||||
@ -446,161 +137,18 @@ const FilesTableRow = (props) => {
|
||||
}
|
||||
isRoom={item.isRoom}
|
||||
>
|
||||
<TableCell
|
||||
{...dragStyles}
|
||||
className={classNames(
|
||||
selectionProp?.className,
|
||||
"table-container_file-name-cell"
|
||||
)}
|
||||
value={value}
|
||||
>
|
||||
<FileNameCell
|
||||
theme={theme}
|
||||
onContentSelect={onContentFileSelect}
|
||||
checked={checkedProps}
|
||||
{isRooms ? (
|
||||
<RoomsRowDataComponent
|
||||
element={element}
|
||||
inProgress={inProgress}
|
||||
dragStyles={dragStyles}
|
||||
{...props}
|
||||
/>
|
||||
<StyledBadgesContainer showHotkeyBorder={showHotkeyBorder}>
|
||||
{badgesComponent}
|
||||
</StyledBadgesContainer>
|
||||
</TableCell>
|
||||
|
||||
{(item.isRoom || isRooms) && (
|
||||
<TableCell
|
||||
style={
|
||||
!typeAvailableDrag
|
||||
? { background: "none !important" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<TypeCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
)}
|
||||
|
||||
{!item.isRoom && isRooms && (
|
||||
<TableCell
|
||||
style={
|
||||
!typeAvailableDrag
|
||||
? { background: "none !important" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
></TableCell>
|
||||
)}
|
||||
|
||||
{item.isRoom && (
|
||||
<TableCell
|
||||
style={
|
||||
!tagsAvailableDrag
|
||||
? { background: "none !important" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<TagsCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
)}
|
||||
|
||||
{!personal && (
|
||||
<TableCell
|
||||
style={
|
||||
!authorAvailableDrag && !ownerAvailableDrag
|
||||
? { background: "none" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<AuthorCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
)}
|
||||
|
||||
{!item.isRoom && !isRooms && (
|
||||
<TableCell
|
||||
style={
|
||||
!createdAvailableDrag
|
||||
? { background: "none !important" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<DateCell
|
||||
create
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
)}
|
||||
|
||||
<TableCell
|
||||
style={
|
||||
!modifiedAvailableDrag && !activityAvailableDrag
|
||||
? { background: "none" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<DateCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
) : (
|
||||
<RowDataComponent
|
||||
element={element}
|
||||
dragStyles={dragStyles}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
|
||||
{!item.isRoom && !isRooms && (
|
||||
<TableCell
|
||||
style={
|
||||
!sizeAvailableDrag ? { background: "none" } : dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<SizeCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
)}
|
||||
|
||||
{!item.isRoom && !isRooms && (
|
||||
<TableCell
|
||||
style={
|
||||
!typeAvailableDrag
|
||||
? { background: "none !important" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<TypeCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
)}
|
||||
{!item.isRoom && !isRooms && (
|
||||
<TableCell
|
||||
style={
|
||||
!buttonsAvailableDrag ? { background: "none" } : dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
className={classNames(
|
||||
selectionProp?.className,
|
||||
"table-container_quick-buttons-wrapper"
|
||||
)}
|
||||
>
|
||||
<StyledQuickButtonsContainer>
|
||||
{quickButtonsComponent}
|
||||
</StyledQuickButtonsContainer>
|
||||
</TableCell>
|
||||
)}
|
||||
</StyledTableRow>
|
||||
</StyledDragAndDrop>
|
||||
|
@ -13,6 +13,7 @@ const StyledAuthorCell = styled.div`
|
||||
|
||||
.author-avatar-cell {
|
||||
width: 16px;
|
||||
min-width: 16px;
|
||||
height: 16px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
@ -0,0 +1,143 @@
|
||||
import React from "react";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import TableCell from "@docspace/components/table-container/TableCell";
|
||||
import FileNameCell from "./FileNameCell";
|
||||
import TypeCell from "./TypeCell";
|
||||
import TagsCell from "./TagsCell";
|
||||
import AuthorCell from "./AuthorCell";
|
||||
import DateCell from "./DateCell";
|
||||
import { classNames } from "@docspace/components/utils/classNames";
|
||||
import { StyledBadgesContainer } from "../StyledTable";
|
||||
|
||||
const RoomsRowDataComponent = (props) => {
|
||||
const {
|
||||
roomColumnTypeIsEnabled,
|
||||
roomColumnOwnerIsEnabled,
|
||||
roomColumnTagsIsEnabled,
|
||||
roomColumnActivityIsEnabled,
|
||||
|
||||
dragStyles,
|
||||
selectionProp,
|
||||
value,
|
||||
theme,
|
||||
onContentFileSelect,
|
||||
checkedProps,
|
||||
element,
|
||||
inProgress,
|
||||
showHotkeyBorder,
|
||||
badgesComponent,
|
||||
} = props;
|
||||
|
||||
return (
|
||||
<>
|
||||
<TableCell
|
||||
{...dragStyles}
|
||||
className={classNames(
|
||||
selectionProp?.className,
|
||||
"table-container_file-name-cell"
|
||||
)}
|
||||
value={value}
|
||||
>
|
||||
<FileNameCell
|
||||
theme={theme}
|
||||
onContentSelect={onContentFileSelect}
|
||||
checked={checkedProps}
|
||||
element={element}
|
||||
inProgress={inProgress}
|
||||
{...props}
|
||||
/>
|
||||
<StyledBadgesContainer showHotkeyBorder={showHotkeyBorder}>
|
||||
{badgesComponent}
|
||||
</StyledBadgesContainer>
|
||||
</TableCell>
|
||||
|
||||
{roomColumnTypeIsEnabled ? (
|
||||
<TableCell
|
||||
style={
|
||||
!roomColumnTypeIsEnabled
|
||||
? { background: "none !important" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<TypeCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
) : (
|
||||
<div />
|
||||
)}
|
||||
|
||||
{roomColumnTagsIsEnabled ? (
|
||||
<TableCell
|
||||
style={
|
||||
!roomColumnTagsIsEnabled
|
||||
? { background: "none !important" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<TagsCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
) : (
|
||||
<div />
|
||||
)}
|
||||
|
||||
{roomColumnOwnerIsEnabled ? (
|
||||
<TableCell
|
||||
style={
|
||||
!roomColumnOwnerIsEnabled
|
||||
? { background: "none" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<AuthorCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
) : (
|
||||
<div />
|
||||
)}
|
||||
|
||||
{roomColumnActivityIsEnabled ? (
|
||||
<TableCell
|
||||
style={
|
||||
!roomColumnActivityIsEnabled
|
||||
? { background: "none" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<DateCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
) : (
|
||||
<div />
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default inject(({ tableStore }) => {
|
||||
const {
|
||||
roomColumnTypeIsEnabled,
|
||||
roomColumnOwnerIsEnabled,
|
||||
roomColumnTagsIsEnabled,
|
||||
roomColumnActivityIsEnabled,
|
||||
} = tableStore;
|
||||
|
||||
return {
|
||||
roomColumnTypeIsEnabled,
|
||||
roomColumnOwnerIsEnabled,
|
||||
roomColumnTagsIsEnabled,
|
||||
roomColumnActivityIsEnabled,
|
||||
};
|
||||
})(observer(RoomsRowDataComponent));
|
@ -0,0 +1,186 @@
|
||||
import React from "react";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import TableCell from "@docspace/components/table-container/TableCell";
|
||||
import FileNameCell from "./FileNameCell";
|
||||
import TypeCell from "./TypeCell";
|
||||
import AuthorCell from "./AuthorCell";
|
||||
import DateCell from "./DateCell";
|
||||
import SizeCell from "./SizeCell";
|
||||
import { classNames } from "@docspace/components/utils/classNames";
|
||||
import {
|
||||
StyledBadgesContainer,
|
||||
StyledQuickButtonsContainer,
|
||||
} from "../StyledTable";
|
||||
|
||||
const RowDataComponent = (props) => {
|
||||
const {
|
||||
authorColumnIsEnabled,
|
||||
createdColumnIsEnabled,
|
||||
modifiedColumnIsEnabled,
|
||||
sizeColumnIsEnabled,
|
||||
typeColumnIsEnabled,
|
||||
quickButtonsColumnIsEnabled,
|
||||
|
||||
dragStyles,
|
||||
selectionProp,
|
||||
value,
|
||||
theme,
|
||||
onContentFileSelect,
|
||||
checkedProps,
|
||||
element,
|
||||
inProgress,
|
||||
showHotkeyBorder,
|
||||
badgesComponent,
|
||||
quickButtonsComponent,
|
||||
} = props;
|
||||
|
||||
return (
|
||||
<>
|
||||
<TableCell
|
||||
{...dragStyles}
|
||||
className={classNames(
|
||||
selectionProp?.className,
|
||||
"table-container_file-name-cell"
|
||||
)}
|
||||
value={value}
|
||||
>
|
||||
<FileNameCell
|
||||
theme={theme}
|
||||
onContentSelect={onContentFileSelect}
|
||||
checked={checkedProps}
|
||||
element={element}
|
||||
inProgress={inProgress}
|
||||
{...props}
|
||||
/>
|
||||
<StyledBadgesContainer showHotkeyBorder={showHotkeyBorder}>
|
||||
{badgesComponent}
|
||||
</StyledBadgesContainer>
|
||||
</TableCell>
|
||||
|
||||
{authorColumnIsEnabled ? (
|
||||
<TableCell
|
||||
style={
|
||||
!authorColumnIsEnabled ? { background: "none" } : dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<AuthorCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
) : (
|
||||
<div />
|
||||
)}
|
||||
|
||||
{createdColumnIsEnabled ? (
|
||||
<TableCell
|
||||
style={
|
||||
!createdColumnIsEnabled
|
||||
? { background: "none !important" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<DateCell
|
||||
create
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
) : (
|
||||
<div />
|
||||
)}
|
||||
|
||||
{modifiedColumnIsEnabled ? (
|
||||
<TableCell
|
||||
style={
|
||||
!modifiedColumnIsEnabled ? { background: "none" } : dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<DateCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
) : (
|
||||
<div />
|
||||
)}
|
||||
|
||||
{sizeColumnIsEnabled ? (
|
||||
<TableCell
|
||||
style={
|
||||
!sizeColumnIsEnabled ? { background: "none" } : dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<SizeCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
) : (
|
||||
<div />
|
||||
)}
|
||||
|
||||
{typeColumnIsEnabled ? (
|
||||
<TableCell
|
||||
style={
|
||||
!typeColumnIsEnabled
|
||||
? { background: "none !important" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
>
|
||||
<TypeCell
|
||||
sideColor={theme.filesSection.tableView.row.sideColor}
|
||||
{...props}
|
||||
/>
|
||||
</TableCell>
|
||||
) : (
|
||||
<div />
|
||||
)}
|
||||
{quickButtonsColumnIsEnabled ? (
|
||||
<TableCell
|
||||
style={
|
||||
!quickButtonsColumnIsEnabled
|
||||
? { background: "none" }
|
||||
: dragStyles.style
|
||||
}
|
||||
{...selectionProp}
|
||||
className={classNames(
|
||||
selectionProp?.className,
|
||||
"table-container_quick-buttons-wrapper"
|
||||
)}
|
||||
>
|
||||
<StyledQuickButtonsContainer>
|
||||
{quickButtonsComponent}
|
||||
</StyledQuickButtonsContainer>
|
||||
</TableCell>
|
||||
) : (
|
||||
<div />
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default inject(({ tableStore }) => {
|
||||
const {
|
||||
authorColumnIsEnabled,
|
||||
createdColumnIsEnabled,
|
||||
modifiedColumnIsEnabled,
|
||||
sizeColumnIsEnabled,
|
||||
typeColumnIsEnabled,
|
||||
quickButtonsColumnIsEnabled,
|
||||
} = tableStore;
|
||||
|
||||
return {
|
||||
authorColumnIsEnabled,
|
||||
createdColumnIsEnabled,
|
||||
modifiedColumnIsEnabled,
|
||||
sizeColumnIsEnabled,
|
||||
typeColumnIsEnabled,
|
||||
quickButtonsColumnIsEnabled,
|
||||
};
|
||||
})(observer(RowDataComponent));
|
@ -15,7 +15,11 @@ import WhiteLabelWrapper from "./StyledWhitelabel";
|
||||
import LoaderWhiteLabel from "../sub-components/loaderWhiteLabel";
|
||||
|
||||
import Logo from "./sub-components/logo";
|
||||
import { generateLogo, getLogoOptions } from "../../../utils/generateLogo";
|
||||
import {
|
||||
generateLogo,
|
||||
getLogoOptions,
|
||||
uploadLogo,
|
||||
} from "../../../utils/generateLogo";
|
||||
import isEqual from "lodash/isEqual";
|
||||
|
||||
const WhiteLabel = (props) => {
|
||||
@ -100,28 +104,30 @@ const WhiteLabel = (props) => {
|
||||
}
|
||||
};
|
||||
|
||||
const onChangeLogo = (e) => {
|
||||
const onChangeLogo = async (e) => {
|
||||
const id = e.target.id.split("_");
|
||||
const index = id[1];
|
||||
const theme = id[2];
|
||||
|
||||
let file = e.target.files[0];
|
||||
|
||||
let reader = new FileReader();
|
||||
reader.readAsDataURL(file);
|
||||
reader.onload = (e) => {
|
||||
const img = e.target.result;
|
||||
const { data } = await uploadLogo(file);
|
||||
|
||||
if (data.Success) {
|
||||
const url = data.Message;
|
||||
const newArr = logoUrlsWhiteLabel;
|
||||
|
||||
if (theme === "light") {
|
||||
newArr[index - 1].path.light = img;
|
||||
newArr[index - 1].path.light = url;
|
||||
} else if (theme === "dark") {
|
||||
newArr[index - 1].path.dark = img;
|
||||
newArr[index - 1].path.dark = url;
|
||||
}
|
||||
|
||||
setLogoUrlsWhiteLabel(newArr);
|
||||
};
|
||||
} else {
|
||||
console.error(data.Message);
|
||||
toastr.error(data.Message);
|
||||
}
|
||||
};
|
||||
|
||||
const onSave = async () => {
|
||||
|
@ -103,6 +103,9 @@ const StyledAutoBackup = styled.div`
|
||||
.auto-backup_third-party-module {
|
||||
margin-top: 16px;
|
||||
margin-left: 24px;
|
||||
button {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
}
|
||||
.automatic-backup_main {
|
||||
margin-bottom: 30px;
|
||||
@ -173,6 +176,10 @@ const StyledRestoreBackup = styled.div`
|
||||
${commonStyles}
|
||||
.restore-backup_third-party-module {
|
||||
margin-top: 16px;
|
||||
|
||||
button {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
}
|
||||
.restore-description {
|
||||
max-width: ${TEXT_LENGTH};
|
||||
@ -327,7 +334,11 @@ const StyledBackup = styled.div`
|
||||
display: flex;
|
||||
margin-bottom: 12px;
|
||||
display: grid;
|
||||
grid-template-columns: minmax(100px, 310px) 32px;
|
||||
|
||||
${(props) =>
|
||||
props.isConnectedAccount
|
||||
? "grid-template-columns:minmax(100px, 310px) 32px"
|
||||
: "grid-template-columns:minmax(100px, 350px) 32px"};
|
||||
grid-gap: 8px;
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user