Merge branch 'release/1.0.0' of github.com:ONLYOFFICE/AppServer into release/1.0.0

This commit is contained in:
Tatiana Lopaeva 2021-08-11 11:03:22 +03:00
commit 1d849f210f
25 changed files with 246 additions and 125 deletions

View File

@ -6,17 +6,15 @@ using Microsoft.Extensions.Options;
namespace ASC.Common.Logging
{
[Scope]
[Singletone]
public class EFLoggerFactory : ILoggerFactory
{
Dictionary<string, ILogger> Loggers { get; set; }
Lazy<ILogger> Logger { get; set; }
ILoggerProvider LoggerProvider { get; set; }
public EFLoggerFactory(EFLoggerProvider loggerProvider)
{
LoggerProvider = loggerProvider;
Loggers = new Dictionary<string, ILogger>();
Logger = new Lazy<ILogger>(() => LoggerProvider.CreateLogger(""));
}
@ -35,7 +33,7 @@ namespace ASC.Common.Logging
}
}
[Scope]
[Singletone]
public class EFLoggerProvider : ILoggerProvider
{
private IOptionsMonitor<ILog> Option { get; }

View File

@ -24,31 +24,33 @@
*/
using System;
using ASC.Common;
using ASC.Core.Encryption;
using Autofac;
using Microsoft.Extensions.DependencyInjection;
namespace ASC.Data.Storage.Encryption
{
[Singletone]
public class EncryptionFactory
{
private ILifetimeScope Container { get; }
private IServiceProvider ServiceProvider { get; }
public EncryptionFactory(ILifetimeScope container)
public EncryptionFactory(IServiceProvider serviceProvider)
{
Container = container;
ServiceProvider = serviceProvider;
}
public ICrypt GetCrypt(string storageName, EncryptionSettings encryptionSettings)
{
ICrypt result = null;
using var scope = Container.BeginLifetimeScope();
using var scope = ServiceProvider.CreateScope();
if (scope != null)
{
result = scope.Resolve<ICrypt>();
result = scope.ServiceProvider.GetService<ICrypt>();
}
result ??= new FakeCrypt();

View File

@ -27,7 +27,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using ASC.Common;
@ -35,7 +34,6 @@ using ASC.Common.Logging;
using ASC.Core.Common.EF;
using ASC.Core.Common.EF.Context;
using ASC.Core.Common.EF.Model;
using ASC.Core.Tenants;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
@ -55,7 +53,7 @@ namespace ASC.MessagingSystem.DbSender
private static DateTime lastSave = DateTime.UtcNow;
private readonly TimeSpan CacheTime;
private readonly IDictionary<string, EventMessage> Cache;
private static Parser Parser { get; set; }
private Parser Parser { get; set; }
private readonly Timer Timer;
private bool timerStarted;
@ -67,7 +65,6 @@ namespace ASC.MessagingSystem.DbSender
{
CacheTime = TimeSpan.FromMinutes(1);
Cache = new Dictionary<string, EventMessage>();
Parser = Parser.GetDefault();
timerStarted = false;
Log = options.CurrentValue;
@ -142,6 +139,7 @@ namespace ASC.MessagingSystem.DbSender
}
else
{
Parser = Parser ?? Parser.GetDefault();
clientInfo = Parser.Parse(message.UAHeader);
dict.Add(message.UAHeader, clientInfo);
}

View File

@ -20,6 +20,14 @@ namespace ASC.Data.Backup.EF.Context
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
ModelBuilderWrapper
.From(modelBuilder, Provider)
.AddDbTenant()
.AddDbTariff();
}
}
public static class BackupsContextExtension

View File

@ -36,6 +36,7 @@ using ASC.Core.Common.Settings;
using Autofac;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
@ -85,7 +86,6 @@ namespace ASC.ElasticSearch.Core
private TenantManager TenantManager { get; }
private SettingsManager SettingsManager { get; }
private CoreBaseSettings CoreBaseSettings { get; }
private FactoryIndexer FactoryIndexer { get; }
private ICacheNotify<ReIndexAction> CacheNotify { get; }
private IServiceProvider ServiceProvider { get; }
public IConfiguration Configuration { get; }
@ -94,7 +94,6 @@ namespace ASC.ElasticSearch.Core
TenantManager tenantManager,
SettingsManager settingsManager,
CoreBaseSettings coreBaseSettings,
FactoryIndexer factoryIndexer,
ICacheNotify<ReIndexAction> cacheNotify,
IServiceProvider serviceProvider,
IConfiguration configuration)
@ -102,7 +101,6 @@ namespace ASC.ElasticSearch.Core
TenantManager = tenantManager;
SettingsManager = settingsManager;
CoreBaseSettings = coreBaseSettings;
FactoryIndexer = factoryIndexer;
CacheNotify = cacheNotify;
ServiceProvider = serviceProvider;
Configuration = configuration;
@ -127,7 +125,7 @@ namespace ASC.ElasticSearch.Core
{
get
{
return allItems ??= FactoryIndexer.Builder.Resolve<IEnumerable<IFactoryIndexer>>().ToList();
return allItems ??= ServiceProvider.GetService<IEnumerable<IFactoryIndexer>>().ToList();
}
}

View File

@ -556,16 +556,15 @@ namespace ASC.ElasticSearch
public class FactoryIndexer
{
private readonly ICache cache;
private IServiceProvider ServiceProvider { get; }
private FactoryIndexerHelper FactoryIndexerHelper { get; }
internal ILifetimeScope Builder { get; set; }
internal static bool Init { get; set; }
public ILog Log { get; }
private Client Client { get; }
private CoreBaseSettings CoreBaseSettings { get; }
public FactoryIndexer(
ILifetimeScope container,
IServiceProvider serviceProvider,
FactoryIndexerHelper factoryIndexerHelper,
Client client,
IOptionsMonitor<ILog> options,
@ -573,7 +572,7 @@ namespace ASC.ElasticSearch
ICache cache)
{
this.cache = cache;
Builder = container;
ServiceProvider = serviceProvider;
FactoryIndexerHelper = factoryIndexerHelper;
Client = client;
CoreBaseSettings = coreBaseSettings;
@ -581,12 +580,6 @@ namespace ASC.ElasticSearch
try
{
Log = options.Get("ASC.Indexer");
if (container != null)
{
Builder = container;
Init = true;
}
}
catch (Exception e)
{
@ -735,7 +728,7 @@ namespace ASC.ElasticSearch
if (!CoreBaseSettings.Standalone) return;
var generic = typeof(BaseIndexer<>);
var indexers = Builder.Resolve<IEnumerable<IFactoryIndexer>>()
var indexers = ServiceProvider.GetService<IEnumerable<IFactoryIndexer>>()
.Where(r => string.IsNullOrEmpty(name) || r.IndexName == name)
.Select(r => (IFactoryIndexer)Activator.CreateInstance(generic.MakeGenericType(r.GetType()), r));

View File

@ -35,8 +35,6 @@ using ASC.Core;
using ASC.Core.Common.Settings;
using ASC.ElasticSearch.Core;
using Autofac;
using Microsoft.Extensions.DependencyInjection;
namespace ASC.ElasticSearch.Service
@ -44,13 +42,11 @@ namespace ASC.ElasticSearch.Service
[Singletone(Additional = typeof(ServiceExtension))]
public class Service
{
private ILifetimeScope Container { get; }
private IServiceProvider ServiceProvider { get; }
private ICacheNotify<ReIndexAction> CacheNotify { get; }
public Service(ILifetimeScope container, IServiceProvider serviceProvider, ICacheNotify<ReIndexAction> cacheNotify)
public Service(IServiceProvider serviceProvider, ICacheNotify<ReIndexAction> cacheNotify)
{
Container = container;
ServiceProvider = serviceProvider;
CacheNotify = cacheNotify;
}
@ -65,12 +61,12 @@ namespace ASC.ElasticSearch.Service
public bool Support(string table)
{
return Container.Resolve<IEnumerable<IFactoryIndexer>>().Any(r => r.IndexName == table);
return ServiceProvider.GetService<IEnumerable<IFactoryIndexer>>().Any(r => r.IndexName == table);
}
public void ReIndex(List<string> toReIndex, int tenant)
{
var allItems = Container.Resolve<IEnumerable<IFactoryIndexer>>().ToList();
var allItems = ServiceProvider.GetService<IEnumerable<IFactoryIndexer>>().ToList();
var tasks = new List<Task>(toReIndex.Count);
foreach (var item in toReIndex)

View File

@ -31,6 +31,7 @@ const ButtonKeys = Object.freeze({
ctr: 17,
one: 49,
del: 46,
s: 83,
});
const StyledMediaDeleteIcon = styled(MediaDeleteIcon)`
@ -306,14 +307,15 @@ class MediaViewer extends React.Component {
: 0;
this.props.onDownload && this.props.onDownload(currentFileId);
};
onKeyup = (e) => {
if (ButtonKeys.ctr === e.keyCode) {
ctrIsPressed = false;
}
};
onKeydown = (e) => {
let isActionKey = false;
for (let key in ButtonKeys) {
if (ButtonKeys[key] === e.keyCode) {
e.preventDefault();
@ -342,7 +344,7 @@ class MediaViewer extends React.Component {
: this.nextMedia();
break;
case ButtonKeys.esc:
this.props.onClose();
if (!this.props.deleteDialogVisible) this.props.onClose();
break;
case ButtonKeys.upArrow:
document.getElementsByClassName("iconContainer zoomIn").length > 0 &&
@ -355,6 +357,9 @@ class MediaViewer extends React.Component {
case ButtonKeys.ctr:
ctrIsPressed = true;
break;
case ButtonKeys.s:
if (ctrIsPressed) this.onDownload();
break;
case ButtonKeys.one:
ctrIsPressed &&
document.getElementsByClassName("iconContainer reset").length > 0 &&
@ -465,7 +470,6 @@ class MediaViewer extends React.Component {
) : (
<StyledVideoViewer
url={url}
playing={false}
isVideo={isVideo}
getOffset={this.getOffset}
/>
@ -509,6 +513,7 @@ MediaViewer.propTypes = {
onDownload: PropTypes.func,
onClose: PropTypes.func,
onEmptyPlaylistError: PropTypes.func,
deleteDialogVisible: PropTypes.bool,
};
MediaViewer.defaultProps = {

View File

@ -231,7 +231,7 @@ class VideoViewer extends Component {
state = {
url: this.props.url,
pip: false,
playing: this.props.playing,
playing: false,
controls: false,
light: false,
volume: 0.3,
@ -251,29 +251,17 @@ class VideoViewer extends Component {
document.removeEventListener("keydown", this.onKeydown, false);
}
componentDidUpdate(prevProps, prevState) {
let newUrl = prevState.url;
let newPlaying = prevState.playing;
if (
this.props.url !== prevProps.url ||
this.props.playing !== prevProps.playing
) {
if (this.props.url !== prevProps.url) {
newUrl = this.props.url;
}
if (this.props.playing !== prevProps.playing) {
newPlaying = this.props.playing;
}
componentDidUpdate(prevProps) {
if (this.props.url !== prevProps.url) {
this.setState({
url: newUrl,
playing: newPlaying,
url: this.props.url,
playing: false,
});
}
}
onKeydown = (e) => {
if (e.keyCode === 32) this.handlePlayPause();
if (e.keyCode === 37 || e.keyCode === 39) this.setState({ playing: false });
};
handlePlayPause = () => {
@ -500,7 +488,6 @@ class VideoViewer extends Component {
VideoViewer.propTypes = {
isVideo: PropTypes.bool,
url: PropTypes.string,
playing: PropTypes.bool,
getOffset: PropTypes.func,
};

View File

@ -5,12 +5,14 @@ class UserStore {
user = null;
isLoading = false;
isLoaded = false;
userIsUpdate = false;
constructor() {
makeObservable(this, {
user: observable,
isLoading: observable,
isLoaded: observable,
userIsUpdate: observable,
getCurrentUser: action,
setIsLoading: action,
setIsLoaded: action,
@ -53,6 +55,10 @@ class UserStore {
this.setUser(user);
this.setIsLoading(false);
};
setUserIsUpdate = (isUpdate) => {
this.userIsUpdate = isUpdate;
};
}
export default UserStore;

View File

@ -0,0 +1,19 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="24X24 / pot">
<path id="background" d="M3 1H16L21 7V23H3V1Z" fill="white"/>
<path id="shadow" d="M21 7L16 1H3V16H2V0H16L22 7V16H21V7Z" fill="#BFBFBF"/>
<g id="logo">
<path d="M15 2H4V14H20V8H19V13H5V3H15V2Z" fill="#BFBFBF"/>
<path d="M15 6H12V5H10V7H15V6Z" fill="#BFBFBF"/>
<path d="M8 5H6V7H8V5Z" fill="#BFBFBF"/>
<path d="M6 9H8V11H6V9Z" fill="#BFBFBF"/>
<path d="M17 9H10V11H12V10H17V9Z" fill="#BFBFBF"/>
</g>
<path id="ear shadow" opacity="0.3" d="M14 9V1H15V8H21V9H14Z" fill="black"/>
<g id="Subtract">
<path d="M7 18H5V19H7V18Z" fill="#F36700"/>
<path d="M13 18V21H10V18H13Z" fill="#F36700"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M2 16C2 15.4477 2.44771 15 3 15H21C21.5523 15 22 15.4477 22 16V23C22 23.5523 21.5523 24 21 24H3C2.44772 24 2 23.5523 2 23V16ZM7 17H4V22H5V20H7V19H8V18H7V17ZM13 17H10V18H9V21H10V22H13V21H14V18H13V17ZM20 17H15V18H17V22H18V18H20V17Z" fill="#F36700"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1016 B

View File

@ -0,0 +1,21 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="32X32 / pot">
<path id="background" d="M4 1H19L28 9L28.1676 31H4V1Z" fill="white"/>
<path id="shadow" fill-rule="evenodd" clip-rule="evenodd" d="M4 31H28.148L28 9L19 1L4.08333 1.06667L4 31ZM19 0H3V32H29V9L19 0Z" fill="#BFBFBF"/>
<g id="logo">
<path d="M6 4V18H26V10H25V17H7V5H18V4H6Z" fill="#BFBFBF"/>
<path d="M18 7H16V6H12V8H18V7Z" fill="#BFBFBF"/>
<path d="M10 6H8V8H10V6Z" fill="#BFBFBF"/>
<path d="M17 10V11H15V12H12V10H17Z" fill="#BFBFBF"/>
<path d="M10 14H8V16H10V14Z" fill="#BFBFBF"/>
<path d="M12 14H15V15H23V16H12V14Z" fill="#BFBFBF"/>
<path d="M10 10H8V12H10V10Z" fill="#BFBFBF"/>
</g>
<path id="ear shadow" opacity="0.3" d="M17 11V1H18V10H28V11H17Z" fill="black"/>
<g id="Subtract">
<path d="M11 23H9V24H11V23Z" fill="#F36700"/>
<path d="M17 23V26H14V23H17Z" fill="#F36700"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M6 21C6 20.4477 6.44771 20 7 20H25C25.5523 20 26 20.4477 26 21V28C26 28.5523 25.5523 29 25 29H7C6.44772 29 6 28.5523 6 28V21ZM11 22H8V27H9V25H11V24H12V23H11V22ZM17 22H14V23H13V26H14V27H17V26H18V23H17V22ZM24 22H19V23H21V27H22V23H24V22Z" fill="#F36700"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,21 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="64X64 / pot">
<path id="background" d="M7 1H38L57 20V63H7V1Z" fill="white"/>
<path id="shadow" fill-rule="evenodd" clip-rule="evenodd" d="M7 63H57V20L38 1H7V63ZM38 0H6V64H58V20L38 0Z" fill="#BFBFBF"/>
<g id="logo">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13 9H38V11H15V33H49V19H51V35H13V9Z" fill="#BFBFBF"/>
<path d="M17 31V27H21V31H17Z" fill="#BFBFBF"/>
<path d="M21 24H17V20H21V24Z" fill="#BFBFBF"/>
<path d="M17 13V17H21V13H17Z" fill="#BFBFBF"/>
<path d="M23 13V17H34V15H30V13H23Z" fill="#BFBFBF"/>
<path d="M41 20H23V24H33V22H41V20Z" fill="#BFBFBF"/>
<path d="M23 31V27H47V29H39V31H23Z" fill="#BFBFBF"/>
</g>
<path id="ear shadow" opacity="0.3" d="M37 20V1H38V19H57L58 20H37Z" fill="black"/>
<g id="Subtract">
<path d="M29.4034 48.4917C29.4034 49.7376 29.691 50.6832 30.2664 51.3286C30.8418 51.969 31.5723 52.2892 32.4578 52.2892C33.3434 52.2892 34.0689 51.9715 34.6343 51.3361C35.2046 50.6957 35.4898 49.7376 35.4898 48.4617C35.4898 47.2009 35.2121 46.2603 34.6568 45.6399C34.1064 45.0195 33.3734 44.7093 32.4578 44.7093C31.5422 44.7093 30.8043 45.0245 30.2439 45.6549C29.6835 46.2803 29.4034 47.2259 29.4034 48.4917Z" fill="#F36700"/>
<path d="M19.5344 44.8594V47.9814H20.7502C21.6258 47.9814 22.2112 47.9239 22.5064 47.8088C22.8016 47.6937 23.0317 47.5136 23.1968 47.2684C23.3669 47.0233 23.452 46.7381 23.452 46.4129C23.452 46.0126 23.3344 45.6824 23.0993 45.4222C22.8641 45.1621 22.5664 44.9995 22.2062 44.9344C21.941 44.8844 21.4082 44.8594 20.6076 44.8594H19.5344Z" fill="#F36700"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M15 39C13.8955 39 13 39.8955 13 41V57C13 58.1045 13.8955 59 15 59H49C50.1045 59 51 58.1045 51 57V41C51 39.8955 50.1045 39 49 39H15ZM27.1144 48.5668C27.1144 47.4461 27.282 46.5055 27.6172 45.745C27.8674 45.1846 28.2076 44.6818 28.6379 44.2365C29.0731 43.7912 29.5485 43.461 30.0638 43.2458C30.7492 42.9556 31.5397 42.8105 32.4353 42.8105C34.0564 42.8105 35.3522 43.3134 36.3229 44.319C37.2985 45.3247 37.7863 46.7231 37.7863 48.5143C37.7863 50.2904 37.3035 51.6813 36.3379 52.687C35.3722 53.6876 34.0814 54.188 32.4653 54.188C30.8293 54.188 29.5284 53.6901 28.5628 52.6945C27.5972 51.6938 27.1144 50.3179 27.1144 48.5668ZM17.313 54.0003V42.9982H20.8778C22.2287 42.9982 23.1093 43.0532 23.5195 43.1633C24.1499 43.3284 24.6778 43.6886 25.1031 44.244C25.5283 44.7943 25.741 45.5073 25.741 46.3829C25.741 47.0583 25.6184 47.6262 25.3732 48.0865C25.1281 48.5468 24.8154 48.9095 24.4351 49.1747C24.0599 49.4349 23.6771 49.6075 23.2869 49.6925C22.7565 49.7976 21.9885 49.8501 20.9829 49.8501H19.5344V54.0003H17.313ZM42.0041 44.8594V54.0003H44.2255V44.8594H47.4826V42.9982H38.7394V44.8594H42.0041Z" fill="#F36700"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,30 @@
<svg width="96" height="96" viewBox="0 0 96 96" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="96X96 / pot" clip-path="url(#clip0)">
<path id="background" d="M10 1H57L86 30V95H10V1Z" fill="white"/>
<path id="shadow" fill-rule="evenodd" clip-rule="evenodd" d="M10 95H86V30L57 1H10V95ZM57 0H9V96H87V30L57 0Z" fill="url(#paint0_linear)"/>
<g id="logo">
<path d="M57 11H20V51H76V29H73V48H23V14H57V11Z" fill="#BFBFBF"/>
<path d="M32 17H26V23H32V17Z" fill="#BFBFBF"/>
<path d="M26 28H32V34H26V28Z" fill="#BFBFBF"/>
<path d="M32 39H26V45H32V39Z" fill="#BFBFBF"/>
<path d="M35 17H46V20H52V23H35V17Z" fill="#BFBFBF"/>
<path d="M57 28V29H62V31H50V34H35V28H57Z" fill="#BFBFBF"/>
<path d="M70 39H35V45H59V42H70V39Z" fill="#BFBFBF"/>
</g>
<path id="ear shadow" opacity="0.3" d="M56 30V1H57V29H86L87 30H56Z" fill="black"/>
<g id="Subtract">
<path d="M44.1143 73.7573C44.1143 75.6216 44.5448 77.0366 45.4058 78.0024C46.2668 78.9608 47.3599 79.4399 48.6851 79.4399C50.0103 79.4399 51.0959 78.9645 51.9419 78.0137C52.7954 77.0553 53.2222 75.6216 53.2222 73.7124C53.2222 71.8257 52.8066 70.4181 51.9756 69.4897C51.152 68.5614 50.0552 68.0972 48.6851 68.0972C47.3149 68.0972 46.2106 68.5688 45.3721 69.5122C44.5335 70.4481 44.1143 71.8631 44.1143 73.7573Z" fill="#F36700"/>
<path d="M29.3462 68.3218V72.9937H31.1655C32.4757 72.9937 33.3517 72.9076 33.7935 72.7354C34.2352 72.5631 34.5796 72.2936 34.8267 71.9268C35.0812 71.5599 35.2085 71.1331 35.2085 70.6465C35.2085 70.0475 35.0326 69.5534 34.6807 69.1641C34.3288 68.7747 33.8833 68.5314 33.3442 68.4341C32.9474 68.3592 32.1501 68.3218 30.9521 68.3218H29.3462Z" fill="#F36700"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M23 58C21.3431 58 20 59.3431 20 61V86C20 87.6569 21.3431 89 23 89H73C74.6569 89 76 87.6569 76 86V61C76 59.3431 74.6569 58 73 58H23ZM40.689 73.8696C40.689 72.1925 40.9398 70.785 41.4414 69.647C41.8158 68.8084 42.3249 68.056 42.9688 67.3896C43.6201 66.7233 44.3314 66.2292 45.1025 65.9072C46.1283 65.473 47.3112 65.2559 48.6514 65.2559C51.0771 65.2559 53.0163 66.0083 54.4688 67.5132C55.9287 69.0181 56.6587 71.1107 56.6587 73.791C56.6587 76.4489 55.9362 78.5303 54.4912 80.0352C53.0462 81.5326 51.1146 82.2812 48.6963 82.2812C46.248 82.2812 44.3014 81.5363 42.8564 80.0464C41.4115 78.549 40.689 76.4901 40.689 73.8696ZM26.022 82.0005V65.5366H31.3564C33.3779 65.5366 34.6956 65.619 35.3096 65.7837C36.2529 66.0308 37.0428 66.5698 37.6792 67.4009C38.3156 68.2244 38.6338 69.2913 38.6338 70.6016C38.6338 71.6123 38.4504 72.4621 38.0835 73.1509C37.7166 73.8397 37.2487 74.3825 36.6797 74.7793C36.1182 75.1686 35.5454 75.4269 34.9614 75.5542C34.1678 75.7114 33.0186 75.79 31.5137 75.79H29.3462V82.0005H26.022ZM62.9702 68.3218V82.0005H66.2944V68.3218H71.1685V65.5366H58.085V68.3218H62.9702Z" fill="#F36700"/>
</g>
</g>
<defs>
<linearGradient id="paint0_linear" x1="48" y1="94.25" x2="48" y2="1.21299e-06" gradientUnits="userSpaceOnUse">
<stop stop-color="#A8A8A8"/>
<stop offset="1" stop-color="#DADADA"/>
</linearGradient>
<clipPath id="clip0">
<rect width="96" height="96" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -35,7 +35,7 @@ const DownloadAppListContainer = ({ t }) => {
return (
<StyledDownloadAppList>
<Text color="#83888d" fontSize="14px" fontWeight={600}>
<Text color="#83888d" fontSize="14px">
{t("Translations:DownloadApps")}
</Text>
<div className="download-app-list">

View File

@ -21,6 +21,7 @@ const FilesMediaViewer = (props) => {
setRemoveMediaItem,
selectedFolderId,
userAccess,
deleteDialogVisible,
} = props;
useEffect(() => {
@ -94,6 +95,7 @@ const FilesMediaViewer = (props) => {
onDownload={onDownloadMediaFile}
onClose={onMediaViewerClose}
onEmptyPlaylistError={onMediaViewerClose}
deleteDialogVisible={deleteDialogVisible}
extsMediaPreviewed={mediaViewerMediaFormats} //TODO:
extsImagePreviewed={mediaViewerImageFormats} //TODO:
/>
@ -131,6 +133,7 @@ export default inject(
mediaViewerImageFormats: images,
mediaViewerMediaFormats: media,
setRemoveMediaItem: dialogsStore.setRemoveMediaItem,
deleteDialogVisible: dialogsStore.deleteDialogVisible,
selectedFolderId: selectedFolderStore.id,
};
}

View File

@ -297,6 +297,8 @@ class IconFormatsStore {
return `${folderPath}/ott.svg`;
case ".pdf":
return `${folderPath}/pdf.svg`;
case ".pot":
return `${folderPath}/pot.svg`;
case ".pps":
return `${folderPath}/pps.svg`;
case ".ppsx":
@ -393,6 +395,8 @@ class IconFormatsStore {
return `${folderPath}/ott.svg`;
case ".pdf":
return `${folderPath}/pdf.svg`;
case ".pot":
return `${folderPath}/pot.svg`;
case ".pps":
return `${folderPath}/pps.svg`;
case ".ppsx":

View File

@ -41,8 +41,6 @@ using ASC.Web.Studio.Core;
using ASC.Web.Studio.UserControls.Statistics;
using ASC.Web.Studio.Utility;
using Autofac;
using Microsoft.EntityFrameworkCore;
namespace ASC.Files.Core.Data

View File

@ -63,14 +63,15 @@ namespace ASC.Web.Files.Utils
FileHelper = fileHelper;
// clear old sessions
try
{
CommonSessionHolder(false).DeleteExpired();
}
catch (Exception err)
{
options.CurrentValue.Error(err);
}
//TODO
//try
//{
// CommonSessionHolder(false).DeleteExpired();
//}
//catch (Exception err)
//{
// options.CurrentValue.Error(err);
//}
}
public void StoreSession<T>(ChunkedUploadSession<T> s)

View File

@ -15,7 +15,6 @@
*/
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
@ -32,19 +31,17 @@ namespace ASC.Files.ThumbnailBuilder
private Worker worker;
internal static readonly ConcurrentDictionary<object, FileData<int>> Queue = new ConcurrentDictionary<object, FileData<int>>();
private IServiceProvider ServiceProvider { get; }
private Service Service { get; }
public Launcher(IServiceProvider serviceProvider, Service service)
public Launcher(Service service, Worker worker)
{
ServiceProvider = serviceProvider;
Service = service;
this.worker = worker;
}
public Task StartAsync(CancellationToken cancellationToken)
{
worker = new Worker(ServiceProvider, cancellationToken);
worker.Start();
worker.Start(cancellationToken);
Service.Start();
return Task.CompletedTask;

View File

@ -27,20 +27,27 @@ using Microsoft.Extensions.Options;
namespace ASC.Files.ThumbnailBuilder
{
internal class Worker
[Singletone]
public class Worker
{
private readonly IServiceProvider serviceProvider;
private readonly CancellationToken cancellationToken;
private readonly ThumbnailSettings thumbnailSettings;
private readonly ILog logger;
private Timer timer;
public Worker(IServiceProvider serviceProvider, CancellationToken cancellationToken)
public Worker(
IServiceProvider serviceProvider,
IOptionsMonitor<ILog> options,
ThumbnailSettings thumbnailSettings)
{
this.serviceProvider = serviceProvider;
this.cancellationToken = cancellationToken;
this.thumbnailSettings = thumbnailSettings;
logger = options.Get("ASC.Files.ThumbnailBuilder");
}
public void Start()
public void Start(CancellationToken cancellationToken)
{
timer = new Timer(Procedure, null, 0, Timeout.Infinite);
}
@ -58,39 +65,40 @@ namespace ASC.Files.ThumbnailBuilder
private void Procedure(object _)
{
timer.Change(Timeout.Infinite, Timeout.Infinite);
logger.Trace("Procedure: Start.");
if (cancellationToken.IsCancellationRequested)
{
Stop();
return;
}
using var scope = serviceProvider.CreateScope();
var fileDataProvider = scope.ServiceProvider.GetService<FileDataProvider>();
var logger = scope.ServiceProvider.GetService<IOptionsMonitor<ILog>>().Get("ASC.Files.ThumbnailBuilder");
var builder = scope.ServiceProvider.GetService<BuilderQueue<int>>();
var config = scope.ServiceProvider.GetService<ThumbnailSettings>();
// var configSection = (ConfigSection)ConfigurationManager.GetSection("thumbnailBuilder") ?? new ConfigSection();
//var configSection = (ConfigSection)ConfigurationManager.GetSection("thumbnailBuilder") ?? new ConfigSection();
//CommonLinkUtility.Initialize(configSection.ServerRoot, false);
timer.Change(Timeout.Infinite, Timeout.Infinite);
logger.Trace("Procedure: Start.");
var filesWithoutThumbnails = Launcher.Queue.Select(pair => pair.Value).ToList();
if (!filesWithoutThumbnails.Any())
{
logger.TraceFormat("Procedure: Waiting for data. Sleep {0}.", config.LaunchFrequency);
timer.Change(TimeSpan.FromSeconds(config.LaunchFrequency), TimeSpan.FromMilliseconds(-1));
logger.TraceFormat("Procedure: Waiting for data. Sleep {0}.", thumbnailSettings.LaunchFrequency);
timer.Change(TimeSpan.FromSeconds(thumbnailSettings.LaunchFrequency), TimeSpan.FromMilliseconds(-1));
return;
}
var premiumTenants = fileDataProvider.GetPremiumTenants();
using (var scope = serviceProvider.CreateScope())
{
var fileDataProvider = scope.ServiceProvider.GetService<FileDataProvider>();
var builder = scope.ServiceProvider.GetService<BuilderQueue<int>>();
var premiumTenants = fileDataProvider.GetPremiumTenants();
filesWithoutThumbnails = filesWithoutThumbnails
.OrderByDescending(fileData => Array.IndexOf(premiumTenants, fileData.TenantId))
.ToList();
filesWithoutThumbnails = filesWithoutThumbnails
.OrderByDescending(fileData => Array.IndexOf(premiumTenants, fileData.TenantId))
.ToList();
builder.BuildThumbnails(filesWithoutThumbnails);
builder.BuildThumbnails(filesWithoutThumbnails);
}
logger.Trace("Procedure: Finish.");
timer.Change(0, Timeout.Infinite);

View File

@ -280,6 +280,7 @@ class UpdateUserForm extends React.Component {
updateProfileInUsers,
history,
t,
setUserIsUpdate,
} = this.props;
this.setState({ isLoading: true });
@ -289,6 +290,7 @@ class UpdateUserForm extends React.Component {
updateProfileInUsers(profile);
toastr.success(t("ChangesSavedSuccessfully"));
setIsEditingForm(false);
setUserIsUpdate(true);
history.goBack();
})
.catch((error) => {
@ -976,6 +978,7 @@ export default withRouter(
setIsEditTargetUser: peopleStore.targetUserStore.setIsEditTargetUser,
isEditTargetUser: peopleStore.targetUserStore.isEditTargetUser,
personal: auth.settingsStore.personal,
setUserIsUpdate: auth.userStore.setUserIsUpdate,
}))(
observer(
withTranslation(["ProfileAction", "Common", "Translations"])(

View File

@ -64,6 +64,8 @@ const HeaderNav = ({
peopleAvailable,
isPersonal,
versionAppServer,
userIsUpdate,
setUserIsUpdate,
}) => {
const { t } = useTranslation(["NavMenu", "Common", "About"]);
const [visibleDialog, setVisibleDialog] = useState(false);
@ -150,7 +152,12 @@ const HeaderNav = ({
/>
))}
{isAuthenticated && user ? (
<ProfileActions userActions={getCurrentUserActions()} user={user} />
<ProfileActions
userActions={getCurrentUserActions()}
user={user}
userIsUpdate={userIsUpdate}
setUserIsUpdate={setUserIsUpdate}
/>
) : (
<></>
)}
@ -192,7 +199,7 @@ export default withRouter(
personal: isPersonal,
version: versionAppServer,
} = settingsStore;
const { user } = userStore;
const { user, userIsUpdate, setUserIsUpdate } = userStore;
const modules = auth.availableModules;
return {
isPersonal,
@ -205,6 +212,8 @@ export default withRouter(
logout,
peopleAvailable: modules.some((m) => m.appName === "people"),
versionAppServer,
userIsUpdate,
setUserIsUpdate,
};
})(observer(HeaderNav))
);

View File

@ -4,7 +4,7 @@ import Avatar from "@appserver/components/avatar";
import DropDownItem from "@appserver/components/drop-down-item";
import Link from "@appserver/components/link";
import ProfileMenu from "./profile-menu";
import api from "@appserver/common/api";
class ProfileActions extends React.PureComponent {
constructor(props) {
super(props);
@ -14,6 +14,7 @@ class ProfileActions extends React.PureComponent {
this.state = {
opened: props.opened,
user: props.user,
avatar: "",
};
}
@ -21,6 +22,11 @@ class ProfileActions extends React.PureComponent {
this.setState({ opened: opened });
};
componentDidMount() {
const { user } = this.state;
this.getAvatar(user.id);
}
componentDidUpdate(prevProps, prevState) {
if (this.props.user !== prevProps.user) {
this.setState({ user: this.props.user });
@ -29,6 +35,11 @@ class ProfileActions extends React.PureComponent {
if (this.props.opened !== prevProps.opened) {
this.setOpened(this.props.opened);
}
if (this.props.userIsUpdate !== prevProps.userIsUpdate) {
this.getAvatar(this.state.user.id);
this.props.setUserIsUpdate(false);
}
}
getUserRole = (user) => {
@ -60,9 +71,14 @@ class ProfileActions extends React.PureComponent {
e.preventDefault();
};
getAvatar = async (id) => {
const avatar = await api.people.getUserPhoto(id);
this.setState({ avatar: avatar });
};
render() {
//console.log("Layout sub-component ProfileActions render");
const { user, opened } = this.state;
const { user, opened, avatar } = this.state;
const userRole = this.getUserRole(user);
return (
@ -71,14 +87,14 @@ class ProfileActions extends React.PureComponent {
onClick={this.onClick}
role={userRole}
size="small"
source={user.avatar}
source={String(avatar.big)}
userName={user.displayName}
className="icon-profile-menu"
/>
<ProfileMenu
className="profile-menu"
avatarRole={userRole}
avatarSource={user.avatarMedium}
avatarSource={avatar.medium}
displayName={user.displayName}
email={user.email}
open={opened}
@ -106,12 +122,15 @@ ProfileActions.propTypes = {
opened: PropTypes.bool,
user: PropTypes.object,
userActions: PropTypes.array,
userIsUpdate: PropTypes.bool,
setUserIsUpdate: PropTypes.func,
};
ProfileActions.defaultProps = {
opened: false,
user: {},
userActions: [],
userIsUpdate: false,
};
export default ProfileActions;

View File

@ -34,9 +34,8 @@ using ASC.Common.Logging;
using ASC.Core;
using ASC.Web.Core.WebZones;
using Autofac;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace ASC.Web.Core
@ -120,7 +119,7 @@ namespace ASC.Web.Core
get { return new Guid("{46CFA73A-F320-46CF-8D5B-CD82E1D67F26}"); }
}
private ILifetimeScope Container { get; }
public IServiceProvider ServiceProvider { get; }
private IConfiguration Configuration { get; }
@ -133,9 +132,9 @@ namespace ASC.Web.Core
}
}
public WebItemManager(ILifetimeScope container, IConfiguration configuration, IOptionsMonitor<ILog> options)
public WebItemManager(IServiceProvider serviceProvider, IConfiguration configuration, IOptionsMonitor<ILog> options)
{
Container = container;
ServiceProvider = serviceProvider;
Configuration = configuration;
log = options.Get("ASC.Web");
disableItem = (Configuration["web:disabled-items"] ?? "").Split(",").ToList();
@ -146,9 +145,7 @@ namespace ASC.Web.Core
{
var result = new ConcurrentDictionary<Guid, IWebItem>();
if (Container == null) return result;
foreach (var webitem in Container.Resolve<IEnumerable<IWebItem>>())
foreach (var webitem in ServiceProvider.GetService<IEnumerable<IWebItem>>())
{
var file = webitem.ID.ToString();
try