Merge branch 'release/v1.0.0' of https://github.com/ONLYOFFICE/DocSpace into release/v1.0.0

This commit is contained in:
Maria Sukhova 2023-04-14 16:21:08 +03:00
commit 5a471feecf
17 changed files with 129 additions and 55 deletions

View File

@ -123,7 +123,7 @@ public class WorkContext
INotifySender emailSender = _notifyServiceSender;
INotifySender telegramSender = _telegramSender;
INotifySender pushSender = _pushSender;
var postman = _configuration["core:notify:postman"];
@ -161,6 +161,11 @@ public class WorkContext
}
}
public void RegisterSendMethod(Func<DateTime, Task> method, string cron)
{
NotifyEngine.RegisterSendMethod(method, cron);
}
public void RegisterSendMethod(Action<DateTime> method, string cron)
{
NotifyEngine.RegisterSendMethod(method, cron);

View File

@ -100,6 +100,25 @@ public class NotifyEngine : INotifyEngine, IDisposable
_methodsEvent.Set();
}
internal void RegisterSendMethod(Func<DateTime, Task> method, string cron)
{
ArgumentNullException.ThrowIfNull(method);
ArgumentNullOrEmptyException.ThrowIfNullOrEmpty(cron);
var w = new SendMethodWrapper(method, cron, _logger);
lock (_sendMethods)
{
if (!_notifyScheduler.IsAlive)
{
_notifyScheduler.Start();
}
_sendMethods.Remove(w);
_sendMethods.Add(w);
}
_methodsEvent.Set();
}
internal void UnregisterSendMethod(Action<DateTime> method)
{
ArgumentNullException.ThrowIfNull(method);
@ -124,7 +143,7 @@ public class NotifyEngine : INotifyEngine, IDisposable
copy = _sendMethods.ToList();
}
foreach(var w in copy)
foreach (var w in copy)
{
if (!w.ScheduleDate.HasValue)
{
@ -590,6 +609,7 @@ public class NotifyEngine : INotifyEngine, IDisposable
private readonly SemaphoreSlim _semaphore;
private readonly CronExpression _cronExpression;
private readonly Action<DateTime> _method;
private readonly Func<DateTime, Task> _asyncMethod;
private readonly ILogger _logger;
public DateTime? ScheduleDate { get; private set; }
@ -608,6 +628,11 @@ public class NotifyEngine : INotifyEngine, IDisposable
UpdateScheduleDate(DateTime.UtcNow);
}
public SendMethodWrapper(Func<DateTime, Task> method, string cron, ILogger log) : this((Action<DateTime>)null, cron, log)
{
_asyncMethod = method;
}
public void UpdateScheduleDate(DateTime d)
{
try
@ -626,11 +651,18 @@ public class NotifyEngine : INotifyEngine, IDisposable
public async Task InvokeSendMethod(DateTime d)
{
await _semaphore.WaitAsync();
await Task.Run(() =>
await Task.Run(async () =>
{
try
{
_method(d);
if (_method != null)
{
_method(d);
}
else if (_asyncMethod != null)
{
await _asyncMethod(d);
}
}
catch (Exception e)
{
@ -642,7 +674,7 @@ public class NotifyEngine : INotifyEngine, IDisposable
public override bool Equals(object obj)
{
return obj is SendMethodWrapper w && _method.Equals(w._method);
return obj is SendMethodWrapper w && ((_method != null && _method.Equals(w._method)) || (_asyncMethod != null && _asyncMethod.Equals(w._asyncMethod)));
}
public override int GetHashCode()

View File

@ -36,7 +36,7 @@ const AvatarEditorDialog = (props) => {
"CreateEditRoomDialog",
]);
const { visible, onClose, profile, updateCreatedAvatar } = props;
const { visible, onClose, profile, updateCreatedAvatar, setHasAvatar } = props;
const [avatar, setAvatar] = useState({
uploadedFile: profile.hasAvatar ? profile.avatarMax : DefaultUserAvatarMax,
x: 0.5,
@ -54,6 +54,7 @@ const AvatarEditorDialog = (props) => {
if (!avatar.uploadedFile) {
const res = await deleteAvatar(profile.id);
updateCreatedAvatar(res);
setHasAvatar(false)
onClose();
return;
}
@ -69,6 +70,7 @@ const AvatarEditorDialog = (props) => {
if (res.success) {
res.data && updateCreatedAvatar(res.data);
setHasAvatar(true)
toastr.success(t("Common:ChangesSavedSuccessfully"));
} else {
throw new Error(t("Common:ErrorInternalServer"));
@ -134,10 +136,11 @@ const AvatarEditorDialog = (props) => {
export default inject(({ peopleStore }) => {
const { targetUserStore } = peopleStore;
const { targetUser: profile, updateCreatedAvatar } = targetUserStore;
const { targetUser: profile, updateCreatedAvatar, setHasAvatar } = targetUserStore;
return {
profile,
setHasAvatar,
updateCreatedAvatar,
};
})(observer(AvatarEditorDialog));

View File

@ -23,6 +23,10 @@ const StyledTagList = styled.div`
}
.tag-icon {
margin-left: 10px;
svg {
width: 10px;
height: 10px;
}
}
}
`;

View File

@ -48,6 +48,7 @@ const CreateUserForm = (props) => {
isDesktop,
linkData,
capabilities,
currentColorScheme,
} = props;
const inputRef = React.useRef(null);
@ -445,7 +446,7 @@ const CreateUserForm = (props) => {
type="action"
fontSize="13px"
fontWeight="600"
color="#3B72A7"
color={currentColorScheme?.main?.accent}
className="more-label"
onClick={moreAuthOpen}
>
@ -672,6 +673,7 @@ export default inject(({ auth }) => {
defaultPage,
getSettings,
getPortalPasswordSettings,
currentColorScheme,
} = settingsStore;
return {
@ -687,6 +689,7 @@ export default inject(({ auth }) => {
thirdPartyLogin,
providers,
capabilities,
currentColorScheme,
};
})(
withRouter(

View File

@ -446,6 +446,8 @@ class FilesActionStore {
const folderIds = roomsForDelete.map((f) => f.id);
if (isArchiveFolder) addActiveItems(null, folderIds);
const operationId = uniqueid("operation_");
setSecondaryProgressBarData({
icon: "trash",
visible: true,
@ -455,8 +457,6 @@ class FilesActionStore {
operationId,
});
const operationId = uniqueid("operation_");
try {
await removeFiles(folderIds, [], true, true).then(async (res) => {
if (res[0]?.error) return Promise.reject(res[0].error);

View File

@ -376,10 +376,16 @@ class FilesStore {
const folder = JSON.parse(opt?.data);
if (!folder || !folder.id) return;
this.getFolderInfo(folder.id);
api.files
.getFolderInfo(folder.id)
.then(() => this.setFolder(folderInfo))
.catch(() => {
// console.log("Folder deleted")
});
console.log("[WS] update folder", folder.id, folder.title);
if (this.selection) {
if (this.selection?.length) {
const foundIndex = this.selection?.findIndex((x) => x.id === folder.id);
if (foundIndex > -1) {
runInAction(() => {

View File

@ -35,8 +35,8 @@ class TargetUserStore {
get getDisableProfileType() {
const res =
this.peopleStore.authStore.userStore.user.id === this.targetUser.id ||
!this.peopleStore.authStore.isAdmin ||
this.peopleStore.isPeoplesAdmin
!this.peopleStore.authStore.isAdmin ||
this.peopleStore.isPeoplesAdmin
? false
: true;
@ -47,10 +47,15 @@ class TargetUserStore {
return (
this.targetUser &&
this.targetUser.userName ===
this.peopleStore.authStore.userStore.user.userName
this.peopleStore.authStore.userStore.user.userName
);
}
setHasAvatar = (value) => {
this.targetUser.hasAvatar = value;
this.peopleStore.authStore.userStore.user.hasAvatar = value;
}
getTargetUser = async (userName) => {
/*if (this.peopleStore.authStore.userStore.user.userName === userName) {
return this.setTargetUser(this.peopleStore.authStore.userStore.user);

View File

@ -239,7 +239,7 @@ const Login: React.FC<ILoginProps> = ({
type="action"
fontSize="13px"
fontWeight="600"
color="#3B72A7"
color={currentColorScheme?.main?.accent}
className="more-label"
onClick={moreAuthOpen}
>

View File

@ -2976,7 +2976,14 @@ public class FileStorageService<T> //: IFileStorageService
message = message.Substring(0, maxMessageLength) + "...";
}
_ = _notifyClient.SendEditorMentions(file, fileLink, recipients, message);
try
{
await _notifyClient.SendEditorMentions(file, fileLink, recipients, message);
}
catch(Exception ex)
{
_logger.ErrorWithException(ex);
}
return showSharingSettings ? await GetSharedInfoShortFileAsync(fileId) : null;
}

View File

@ -786,7 +786,8 @@ public class StudioNotifyService
notifyAction = Actions.SaasAdminActivationV1;
}
var confirmationUrl = _commonLinkUtility.GetConfirmationEmailUrl(u.Email, ConfirmType.EmailActivation);
var userId = _authContext.CurrentAccount.ID;
var confirmationUrl = _commonLinkUtility.GetConfirmationEmailUrl(u.Email, ConfirmType.EmailActivation, null, userId);
confirmationUrl += "&first=true";
static string greenButtonText() => WebstudioNotifyPatternResource.ButtonConfirmEmail;

View File

@ -123,16 +123,16 @@ public class StudioNotifyServiceSender
scope.ServiceProvider.GetService<StudioPeriodicNotify>().SendPersonalLetters(EMailSenderName, scheduleDate);
}
public void SendMsgWhatsNew(DateTime scheduleDate)
public async Task SendMsgWhatsNew(DateTime scheduleDate)
{
using var scope = _serviceProvider.CreateScope();
scope.ServiceProvider.GetRequiredService<StudioWhatsNewNotify>().SendMsgWhatsNew(scheduleDate, WhatsNewType.DailyFeed);
await scope.ServiceProvider.GetRequiredService<StudioWhatsNewNotify>().SendMsgWhatsNew(scheduleDate, WhatsNewType.DailyFeed);
}
public void SendRoomsActivity(DateTime scheduleDate)
public async Task SendRoomsActivity(DateTime scheduleDate)
{
using var scope = _serviceProvider.CreateScope();
scope.ServiceProvider.GetRequiredService<StudioWhatsNewNotify>().SendMsgWhatsNew(scheduleDate, WhatsNewType.RoomsActivity);
await scope.ServiceProvider.GetRequiredService<StudioWhatsNewNotify>().SendMsgWhatsNew(scheduleDate, WhatsNewType.RoomsActivity);
}
}

View File

@ -45,7 +45,7 @@ public class StudioWhatsNewNotify
private readonly WorkContext _workContext;
private readonly DisplayUserSettingsHelper _displayUserSettingsHelper;
public readonly static List<MessageAction?> DailyActions = new List<MessageAction?>()
public static readonly List<MessageAction?> DailyActions = new List<MessageAction?>()
{
MessageAction.FileCreated,
MessageAction.FileUpdatedRevisionComment,
@ -57,7 +57,7 @@ public class StudioWhatsNewNotify
MessageAction.UserUpdated
};
public readonly static List<MessageAction?> RoomsActivityActions = new List<MessageAction?>()
public static readonly List<MessageAction?> RoomsActivityActions = new List<MessageAction?>()
{
MessageAction.FileUploaded,
MessageAction.UserFileUpdated,
@ -101,7 +101,7 @@ public class StudioWhatsNewNotify
}
public void SendMsgWhatsNew(DateTime scheduleDate, WhatsNewType whatsNewType)
public async Task SendMsgWhatsNew(DateTime scheduleDate, WhatsNewType whatsNewType)
{
var products = _webItemManager.GetItemsAll<IProduct>();
@ -117,7 +117,7 @@ public class StudioWhatsNewNotify
foreach (var tenantid in tenants)
{
SendMsgWhatsNew(tenantid, scheduleDate, whatsNewType, products);
await SendMsgWhatsNew(tenantid, scheduleDate, whatsNewType, products);
}
}
@ -134,7 +134,7 @@ public class StudioWhatsNewNotify
}
}
private void SendMsgWhatsNew(int tenantid, DateTime scheduleDate, WhatsNewType whatsNewType, List<IProduct> products)
private async Task SendMsgWhatsNew(int tenantid, DateTime scheduleDate, WhatsNewType whatsNewType, List<IProduct> products)
{
try
{
@ -153,11 +153,15 @@ public class StudioWhatsNewNotify
_log.InformationStartSendWhatsNewIn(tenant.GetTenantDomain(_coreSettings), tenantid);
foreach (var user in _userManager.GetUsers())
{
_log.Debug($"SendMsgWhatsNew start checking subscription: {user.Email}");//temp
if (!CheckSubscription(user, whatsNewType))
{
continue;
}
_log.Debug($"SendMsgWhatsNew checking subscription complete: {user.Email}");//temp
_securityContext.AuthenticateMeWithoutCookie(_authManager.GetAccountByID(tenant.Id, user.Id));
var culture = string.IsNullOrEmpty(user.CultureName) ? tenant.GetCulture() : user.GetCulture();
@ -169,9 +173,11 @@ public class StudioWhatsNewNotify
foreach (var p in products)
{
auditEvents.AddRange(p.GetAuditEventsAsync(scheduleDate, user.Id, tenant, whatsNewType).Result);
auditEvents.AddRange(await p.GetAuditEventsAsync(scheduleDate, user.Id, tenant, whatsNewType));
}
_log.Debug($"SendMsgWhatsNew auditEvents count : {auditEvents.Count}");//temp
var userActivities = new List<string>();
foreach (var e in auditEvents)
@ -182,6 +188,8 @@ public class StudioWhatsNewNotify
}
}
_log.Debug($"SendMsgWhatsNew userActivities count : {userActivities.Count}");//temp
if (userActivities.Any())
{
_log.InformationSendWhatsNewTo(user.Email);

View File

@ -65,11 +65,11 @@ namespace ASC.Web.Core.PublicResources {
///
///Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to &quot;${__VirtualRootPath}&quot;:&quot;${__VirtualRootPath}&quot;. Now you can:
///
///*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///
///*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
///
///*# Collaborate on documents* with two co-editing [rest of string was truncated]&quot;;.
///*# Collaborate on documents* with two co-editing m [rest of string was truncated]&quot;;.
/// </summary>
public static string pattern_enterprise_whitelabel_user_welcome_custom_mode_v1 {
get {

View File

@ -122,7 +122,7 @@
Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to "${__VirtualRootPath}":"${__VirtualRootPath}". Now you can:
*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.

View File

@ -880,11 +880,11 @@ namespace ASC.Web.Core.PublicResources {
///
///Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to &quot;${__VirtualRootPath}&quot;:&quot;${__VirtualRootPath}&quot;. Now you can:
///
///*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///
///*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
///
///*# Collaborate on documents* with two co-editing [rest of string was truncated]&quot;;.
///*# Collaborate on documents* with two co-editing m [rest of string was truncated]&quot;;.
/// </summary>
public static string pattern_enterprise_guest_welcome_v1 {
get {
@ -914,11 +914,11 @@ namespace ASC.Web.Core.PublicResources {
///
///Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to &quot;${__VirtualRootPath}&quot;:&quot;${__VirtualRootPath}&quot;. Now you can:
///
///*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///
///*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
///
///*# Collaborate on documents* with two co-editing [rest of string was truncated]&quot;;.
///*# Collaborate on documents* with two co-editing m [rest of string was truncated]&quot;;.
/// </summary>
public static string pattern_enterprise_user_welcome_v1 {
get {
@ -993,11 +993,11 @@ namespace ASC.Web.Core.PublicResources {
///
///Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to &quot;${__VirtualRootPath}&quot;:&quot;${__VirtualRootPath}&quot;. Now you can:
///
///*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///
///*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
///
///*# Collaborate on documents* with two co-editing [rest of string was truncated]&quot;;.
///*# Collaborate on documents* with two co-editing m [rest of string was truncated]&quot;;.
/// </summary>
public static string pattern_enterprise_whitelabel_guest_welcome_v1 {
get {
@ -1027,11 +1027,11 @@ namespace ASC.Web.Core.PublicResources {
///
///Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to &quot;${__VirtualRootPath}&quot;:&quot;${__VirtualRootPath}&quot;. Now you can:
///
///*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///
///*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
///
///*# Collaborate on documents* with two co-editing [rest of string was truncated]&quot;;.
///*# Collaborate on documents* with two co-editing m [rest of string was truncated]&quot;;.
/// </summary>
public static string pattern_enterprise_whitelabel_user_welcome_v1 {
get {
@ -1314,11 +1314,11 @@ namespace ASC.Web.Core.PublicResources {
///
///Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to &quot;${__VirtualRootPath}&quot;:&quot;${__VirtualRootPath}&quot;. Now you can:
///
///*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///
///*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
///
///*# Collaborate on documents* with two co-editing [rest of string was truncated]&quot;;.
///*# Collaborate on documents* with two co-editing m [rest of string was truncated]&quot;;.
/// </summary>
public static string pattern_opensource_guest_welcome_v1 {
get {
@ -1363,11 +1363,11 @@ namespace ASC.Web.Core.PublicResources {
///
///Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to &quot;${__VirtualRootPath}&quot;:&quot;${__VirtualRootPath}&quot;. Now you can:
///
///*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///
///*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
///
///*# Collaborate on documents* with two co-editing [rest of string was truncated]&quot;;.
///*# Collaborate on documents* with two co-editing m [rest of string was truncated]&quot;;.
/// </summary>
public static string pattern_opensource_user_welcome_v1 {
get {
@ -2019,11 +2019,11 @@ namespace ASC.Web.Core.PublicResources {
///
///Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to &quot;${__VirtualRootPath}&quot;:&quot;${__VirtualRootPath}&quot;. Now you can:
///
///*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose.
///
///*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
///
///*# Collaborate on documents* with two co-editing [rest of string was truncated]&quot;;.
///*# Collaborate on documents* with two co-editing mo [rest of string was truncated]&quot;;.
/// </summary>
public static string pattern_saas_guest_welcome_v1 {
get {
@ -2148,11 +2148,11 @@ namespace ASC.Web.Core.PublicResources {
///
///Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to &quot;${__VirtualRootPath}&quot;:&quot;${__VirtualRootPath}&quot;. Now you can:
///
///*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
///
///*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
///
///*# Collaborate on documents* with two co-editing [rest of string was truncated]&quot;;.
///*# Collaborate on documents* with two co-editing m [rest of string was truncated]&quot;;.
/// </summary>
public static string pattern_saas_user_welcome_v1 {
get {

View File

@ -349,7 +349,7 @@ You will get more tips on how to use your web-office. You can cancel the subscri
Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to "${__VirtualRootPath}":"${__VirtualRootPath}". Now you can:
*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
@ -381,7 +381,7 @@ You will get more tips on how to use your web-office. You can cancel the subscri
Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to "${__VirtualRootPath}":"${__VirtualRootPath}". Now you can:
*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
@ -537,7 +537,7 @@ You will get more tips on how to use your web-office. You can cancel the subscri
Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to "${__VirtualRootPath}":"${__VirtualRootPath}". Now you can:
*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
@ -916,7 +916,7 @@ ONLYOFFICE Team
Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to "${__VirtualRootPath}":"${__VirtualRootPath}". Now you can:
*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose.
*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
@ -1528,7 +1528,7 @@ ONLYOFFICE Team
Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to "${__VirtualRootPath}":"${__VirtualRootPath}". Now you can:
*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
@ -1549,7 +1549,7 @@ ONLYOFFICE Team
Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to "${__VirtualRootPath}":"${__VirtualRootPath}". Now you can:
*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
@ -1570,7 +1570,7 @@ ONLYOFFICE Team
Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to "${__VirtualRootPath}":"${__VirtualRootPath}". Now you can:
*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.
@ -1619,7 +1619,7 @@ ONLYOFFICE Team
Welcome to ONLYOFFICE DocSpace! Your user profile has been successfully added to "${__VirtualRootPath}":"${__VirtualRootPath}". Now you can:
*#* Work with other users in the room you are invited to: *collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with other users in the room you are invited to*: collaboration rooms for real-time co-authoring or custom rooms with flexible settings for any purpose*.
*# Work with files of different formats*: text documents, spreadsheets, presentations, digital forms, PDFs, e-books, multimedia.