Merge branch 'release/rc-v1.2.0' of github.com:ONLYOFFICE/DocSpace into release/rc-v1.2.0

This commit is contained in:
Maksim Chegulov 2022-12-26 12:19:54 +03:00
commit 846aa53583
155 changed files with 36392 additions and 42124 deletions

View File

@ -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)

View File

@ -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"))

View File

@ -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

View File

@ -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)

View File

@ -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; }
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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,

View File

@ -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";

View File

@ -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)

View File

@ -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}");
}
}
}

View File

@ -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);

View File

@ -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";

View File

@ -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
}
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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");
}
}

View File

@ -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

View File

@ -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

View File

@ -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");
}
}

View File

@ -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

View File

@ -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",

View File

@ -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",

View File

@ -19,7 +19,6 @@
"BackupCreatedSuccess": "Резервното копие е създадено успешно.",
"BackupList": "Списък с резервни копия",
"BackupListWarningText": "Ако изтриете всички елементи от списъка, съответните им файлове също ще бъдат изтрити. Това действие не може да бъде отменено. За да изтриете всички файлове, използвайте връзката:",
"BrowserNoCanvasSupport": "Браузърът Ви не поддържа HTML5 маркера за платно.",
"ByApp": "Чрез приложението за удостоверяване",
"BySms": "Чрез съобщение",
"ChangeLogoButton": "Смяна на лого",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Добави профил",
"AddAuthor": "Добави автор",
"ArchivingData": "Архивиране на данни",
"ConnectingAccount": "Свързване на профил",
"Copy": "Копирай",

View File

@ -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"
}

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Přidat účet",
"AddAuthor": "Přidat autora",
"ArchivingData": "Archivace dat",
"ConnectingAccount": "Připojovací účet",
"Copy": "Zkopírovat",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Konto hinzufügen",
"AddAuthor": "Autor hinzufügen",
"ArchivingData": "Archivieren der Daten",
"ConnectingAccount": "Konto wird verbunden",
"Copy": "Kopieren",

View File

@ -19,7 +19,6 @@
"BackupCreatedSuccess": "Το εφεδρικό αντίγραφο έχει δημιουργηθεί επιτυχώς.",
"BackupList": "Εφεδρική λίστα",
"BackupListWarningText": "Εάν διαγράψετε στοιχεία από τη λίστα, θα διαγραφούν και τα αντίστοιχα αρχεία τους. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Για να διαγράψετε όλα τα αρχεία, χρησιμοποιήστε τον σύνδεσμο:",
"BrowserNoCanvasSupport": "Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την ετικέτα καμβά HTML5.",
"ByApp": "Με εφαρμογή ελέγχου ταυτότητας",
"BySms": "Με sms",
"ChangeLogoButton": "Αλλαγή λογότυπου",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Προσθήκη λογαριασμού",
"AddAuthor": "Προσθήκη Συγγραφέα",
"ArchivingData": "Αρχειοθέτηση δεδομένων",
"ConnectingAccount": "Σύνδεση λογαριασμού",
"Copy": "Αντιγραφή",

View File

@ -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?"
}

View File

@ -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 dont 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 dont 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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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",

View File

@ -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"
}

View File

@ -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",

View File

@ -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.",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Añadir cuenta",
"AddAuthor": "Agregar autor",
"ArchivingData": "Archivando datos",
"ConnectingAccount": "Conectando cuenta",
"Copy": "Copiar",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Lisää tili",
"AddAuthor": "Lisää kirjoittaja",
"ArchivingData": "Tietojen arkistointi",
"ConnectingAccount": "Yhdistetään tili",
"Copy": "Kopio",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Ajouter un compte",
"AddAuthor": "Ajouter un auteur",
"ArchivingData": "Archivage des données",
"ConnectingAccount": "Connecter un compte",
"Copy": "Copier",

View File

@ -19,7 +19,6 @@
"BackupCreatedSuccess": "Պահուստային պատճենը հաջողությամբ ստեղծվել է:",
"BackupList": "Պահուստի ցուցակ",
"BackupListWarningText": "Եթե ​​ցանկից որևէ միավոր ջնջեք, դրանց համապատասխան ֆայլերը նույնպես կջնջվեն: Այս գործողությունը հնարավոր չէ հետարկել:Բոլոր ֆայլերը ջնջելու համար օգտագործեք հղումը.",
"BrowserNoCanvasSupport": "Ձեր զննարկիչը չի աջակցում HTML5 կտավ պիտակը:",
"ByApp": "Իսկորոշիչ հավելվածով ",
"BySms": "sms-ով",
"ChangeLogoButton": "Փոխել լոգոն",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Ավելացնել հաշիվ",
"AddAuthor": "Ավելացնել հեղինակ",
"ArchivingData": "Տվյալների արխիվացում",
"ConnectingAccount": "Հաշիվը միանում է",
"Copy": "Պատճենել",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Aggiungere account",
"AddAuthor": "Aggiungi autore",
"ArchivingData": "Archiviazione dei dati",
"ConnectingAccount": "Collegamento dell'account",
"Copy": "Copiare",

View File

@ -20,7 +20,6 @@
"BackupCreatedSuccess": "バックアップ・コピーは正常に作成されました。",
"BackupList": "バックアップリスト",
"BackupListWarningText": "リストからアイテムを削除すると、対応するファイルも削除されます。この操作を元に戻すことができません。すべてのファイルを削除するために次のリンクをクリックしてください:",
"BrowserNoCanvasSupport": "お使いのブラウザは、HTML5のcanvasタグをサポートしていません。",
"ByApp": "認証アプリで",
"BySms": "smsで",
"ChangeLogoButton": "ロゴの変更",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "アカウントの追加",
"AddAuthor": "著者を追加",
"ArchivingData": "データのアーカイブ",
"ConnectingAccount": "接続アカウント",
"Copy": "コピー",

View File

@ -19,7 +19,6 @@
"BackupCreatedSuccess": "백업 복사본 생성에 성공했습니다.",
"BackupList": "백업 목록",
"BackupListWarningText": "목록에서 항목을 삭제하면 그에 상응하는 파일도 삭제됩니다. 이 작업은 취소할 수 없습니다. 모든 파일을 삭제하려면 다음 링크를 사용하시기 바랍니다:",
"BrowserNoCanvasSupport": "고객님의 브라우저가 HTML5 캔버스 태그를 지원하지 않습니다.",
"ByApp": "인증 앱 이용",
"BySms": "SMS 이용",
"ChangeLogoButton": "로고 변경",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "계정 추가",
"AddAuthor": "작성자추가",
"ArchivingData": "데이터 아카이브 중",
"ConnectingAccount": "계정 연결 중",
"Copy": "복사",

View File

@ -18,7 +18,6 @@
"BackupCreatedSuccess": "ສຳເນົາສໍາຮອງໄດ້ຖືກສ້າງສຳເລັດແລ້ວ.",
"BackupList": "ສໍາຮອງຂໍ້ມູນ ລາຍການ",
"BackupListWarningText": "ຖ້າທ່ານລຶບລາຍການໃດໆອອກຈາກບັນຊີລາຍຊື່, ໄຟລ໌ທີ່ສອດຄ້ອງກັນຂອງພວກມັນຈະຖືກລຶບຖິ້ມ. ການດໍາເນີນການນີ້ບໍ່ສາມາດຍົກເລີກໄດ້. ເພື່ອລຶບໄຟລ໌ທັງຫມົດໃຫ້ໃຊ້ການເຊື່ອມຕໍ່:",
"BrowserNoCanvasSupport": "ບຣາວເຊີຂອງທ່ານບໍ່ສະຫນັບສະຫນູນແບບ HTML5",
"ByApp": "ຈາກການກວດສອບສິດ",
"BySms": "ຈາກຂໍ້ຄວາມ",
"ChangeLogoButton": "ປ່ຽນໂລໂກ",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "ເພີ່ມບັນຊີ",
"AddAuthor": "ເພີ່ມຜູ້ຂຽນ",
"ArchivingData": "ການເກັບກໍາຂໍ້ມູນ",
"ConnectingAccount": "ການເຊື່ອມໂຍງບັນຊີ",
"Copy": "ສໍາເນົາ",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Pievienot kontu",
"AddAuthor": "Dodaj autora",
"ArchivingData": "Datu arhivēšana",
"ConnectingAccount": "Savieno kontu",
"Copy": "Kopēt",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Account toevoegen",
"AddAuthor": "Voeg auteur toe",
"ArchivingData": "Gegevens archiveren",
"ConnectingAccount": "Account koppelen",
"Copy": "Kopieer",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Dodaj konto",
"AddAuthor": "Dodaj autora",
"ArchivingData": "Archiwizacja danych",
"ConnectingAccount": "Podłączanie konta",
"Copy": "Skopiuj",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Adicionar conta",
"AddAuthor": "Adicionar Autor",
"ArchivingData": "Arquivando dados",
"ConnectingAccount": "Conectando conta",
"Copy": "Copiar",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Adicionar conta",
"AddAuthor": "Adicionar autor",
"ArchivingData": "Arquivar dados",
"ConnectingAccount": "A ligar conta",
"Copy": "Copiar",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Adaugă cont",
"AddAuthor": "Adăugare autor",
"ArchivingData": "Se arhivează datele",
"ConnectingAccount": "Conectare cont",
"Copy": "Copiere",

View File

@ -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": "Плитки"
}

View File

@ -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": "По вопросам продаж обращайтесь к нам по адресу",

View File

@ -34,7 +34,6 @@
"BackupCreatedSuccess": "Резервная копия успешно создана.",
"BackupList": "Список резервных копий",
"BackupListWarningText": "При удалении любых элементов из списка соответствующие им файлы тоже будут удалены. Это действие необратимо. Для удаления всех файлов используйте ссылку:",
"BrowserNoCanvasSupport": "Ваш браузер не поддерживает тег HTML5 canvas.",
"ByApp": "С помощью приложения для аутентификации",
"BySms": "С помощью SMS",
"ChangeLogoButton": "Сменить логотип",

View File

@ -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": " Из текстового файла",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Pridať účet",
"AddAuthor": "Pridať autora",
"ArchivingData": "Archivácia údajov",
"ConnectingAccount": "Pripojenie účtu",
"Copy": "Kopírovať",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Dodaj račun",
"AddAuthor": "Dodaj avtorja",
"ArchivingData": "Arhiviraj podatke",
"ConnectingAccount": "Povezovanje računa",
"Copy": "Kopiraj",

View File

@ -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",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Hesap ekle",
"AddAuthor": "Yazar Ekle",
"ArchivingData": "Veriler arşivleniyor",
"ConnectingAccount": "Hesap bağlanıyor",
"Copy": "Kopyala",

View File

@ -20,7 +20,6 @@
"BackupCreatedSuccess": "Резервна копія успішно створена.",
"BackupList": "Список резервних копій",
"BackupListWarningText": "Якщо ви видалите будь-які елементи зі списку, їх відповідні файли також будуть видалені. Цю дію не можна скасувати. Для видалення всіх файлів використовуйте посилання:",
"BrowserNoCanvasSupport": "Ваш браузер не підтримує тег canvas в HTML5.",
"ByApp": "За допомогою програми автентифікації",
"BySms": "За допомогою SMS",
"ChangeLogoButton": "Змінити логотип",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "Додати обліковий запис",
"AddAuthor": "Додати автора",
"ArchivingData": "Архівація даних",
"ConnectingAccount": "Підключення облікового запису",
"Copy": "Копіювати",

View File

@ -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",

View File

@ -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",

View File

@ -21,7 +21,6 @@
"BackupCreatedSuccess": "备份副本已成功创建。",
"BackupList": "备份列表",
"BackupListWarningText": "若您从列表中删除任何项目,其相应的文件也将被删除。此操作无法撤消。若想删除所有文件,请使用以下链接:",
"BrowserNoCanvasSupport": "您的浏览器不支持HTML5 canvas标记。",
"ByApp": "通过身份验证应用",
"BySms": "通过短信",
"ChangeLogoButton": "更改Logo",

View File

@ -1,6 +1,5 @@
{
"AddAccount": "添加账户",
"AddAuthor": "添加作者",
"ArchivingData": "归档数据",
"ConnectingAccount": "连接账户",
"Copy": "复制",

View File

@ -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));

View File

@ -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}

View File

@ -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,
};

View File

@ -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));

View File

@ -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,
};
}
)(

View File

@ -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>

View File

@ -13,6 +13,7 @@ const StyledAuthorCell = styled.div`
.author-avatar-cell {
width: 16px;
min-width: 16px;
height: 16px;
margin-right: 8px;
}

View File

@ -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));

View File

@ -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));

View File

@ -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 () => {

View File

@ -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