Merge branch 'release/v1.1.0' of github.com:ONLYOFFICE/AppServer into release/v1.1.0
This commit is contained in:
commit
055c200b60
@ -37,6 +37,13 @@ while [ "$1" != "" ]; do
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
-skiphc | --skiphardwarecheck )
|
||||||
|
if [ "$2" != "" ]; then
|
||||||
|
SKIP_HARDWARE_CHECK=$2
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
-? | -h | --help )
|
-? | -h | --help )
|
||||||
echo " Usage $0 [PARAMETER] [[PARAMETER], ...]"
|
echo " Usage $0 [PARAMETER] [[PARAMETER], ...]"
|
||||||
echo " Parameters:"
|
echo " Parameters:"
|
||||||
@ -60,6 +67,10 @@ if [ -z "${LOCAL_SCRIPTS}" ]; then
|
|||||||
LOCAL_SCRIPTS="false";
|
LOCAL_SCRIPTS="false";
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -z "${SKIP_HARDWARE_CHECK}" ]; then
|
||||||
|
SKIP_HARDWARE_CHECK="false";
|
||||||
|
fi
|
||||||
|
|
||||||
if [ $(dpkg-query -W -f='${Status}' curl 2>/dev/null | grep -c "ok installed") -eq 0 ]; then
|
if [ $(dpkg-query -W -f='${Status}' curl 2>/dev/null | grep -c "ok installed") -eq 0 ]; then
|
||||||
apt-get update;
|
apt-get update;
|
||||||
apt-get install -yq curl;
|
apt-get install -yq curl;
|
||||||
|
@ -61,7 +61,7 @@ if [ "$(ls -A "$PRODUCT_DIR/services/kafka" 2> /dev/null)" == "" ]; then
|
|||||||
adduser --quiet --home ${PRODUCT_DIR}/services/kafka --system kafka
|
adduser --quiet --home ${PRODUCT_DIR}/services/kafka --system kafka
|
||||||
fi
|
fi
|
||||||
cd ${PRODUCT_DIR}/services/kafka
|
cd ${PRODUCT_DIR}/services/kafka
|
||||||
curl https://downloads.apache.org/kafka/2.7.1/kafka_2.13-2.7.1.tgz -O
|
curl https://downloads.apache.org/kafka/2.7.2/kafka_2.13-2.7.2.tgz -O
|
||||||
tar xzf kafka_*.tgz --strip 1 && rm -rf kafka_*.tgz
|
tar xzf kafka_*.tgz --strip 1 && rm -rf kafka_*.tgz
|
||||||
chown -R kafka ${PRODUCT_DIR}/services/kafka
|
chown -R kafka ${PRODUCT_DIR}/services/kafka
|
||||||
cd -
|
cd -
|
||||||
|
@ -6,6 +6,37 @@ command_exists () {
|
|||||||
type "$1" &> /dev/null;
|
type "$1" &> /dev/null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check_hardware () {
|
||||||
|
DISK_REQUIREMENTS=40960;
|
||||||
|
MEMORY_REQUIREMENTS=5500;
|
||||||
|
CORE_REQUIREMENTS=2;
|
||||||
|
|
||||||
|
AVAILABLE_DISK_SPACE=$(df -m / | tail -1 | awk '{ print $4 }');
|
||||||
|
|
||||||
|
if [ ${AVAILABLE_DISK_SPACE} -lt ${DISK_REQUIREMENTS} ]; then
|
||||||
|
echo "Minimal requirements are not met: need at least $DISK_REQUIREMENTS MB of free HDD space"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
TOTAL_MEMORY=$(free -m | grep -oP '\d+' | head -n 1);
|
||||||
|
|
||||||
|
if [ ${TOTAL_MEMORY} -lt ${MEMORY_REQUIREMENTS} ]; then
|
||||||
|
echo "Minimal requirements are not met: need at least $MEMORY_REQUIREMENTS MB of RAM"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
CPU_CORES_NUMBER=$(cat /proc/cpuinfo | grep processor | wc -l);
|
||||||
|
|
||||||
|
if [ ${CPU_CORES_NUMBER} -lt ${CORE_REQUIREMENTS} ]; then
|
||||||
|
echo "The system does not meet the minimal hardware requirements. CPU with at least $CORE_REQUIREMENTS cores is required"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$SKIP_HARDWARE_CHECK" != "true" ]; then
|
||||||
|
check_hardware
|
||||||
|
fi
|
||||||
|
|
||||||
ARCH="$(dpkg --print-architecture)"
|
ARCH="$(dpkg --print-architecture)"
|
||||||
if [ "$ARCH" != "amd64" ]; then
|
if [ "$ARCH" != "amd64" ]; then
|
||||||
echo "ONLYOFFICE ${product^^} doesn't support architecture '$ARCH'"
|
echo "ONLYOFFICE ${product^^} doesn't support architecture '$ARCH'"
|
||||||
|
@ -47,6 +47,13 @@ while [ "$1" != "" ]; do
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
-skiphc | --skiphardwarecheck )
|
||||||
|
if [ "$2" != "" ]; then
|
||||||
|
SKIP_HARDWARE_CHECK=$2
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
-? | -h | --help )
|
-? | -h | --help )
|
||||||
echo " Usage $0 [PARAMETER] [[PARAMETER], ...]"
|
echo " Usage $0 [PARAMETER] [[PARAMETER], ...]"
|
||||||
echo " Parameters:"
|
echo " Parameters:"
|
||||||
@ -69,6 +76,10 @@ if [ -z "${LOCAL_SCRIPTS}" ]; then
|
|||||||
LOCAL_SCRIPTS="false";
|
LOCAL_SCRIPTS="false";
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -z "${SKIP_HARDWARE_CHECK}" ]; then
|
||||||
|
SKIP_HARDWARE_CHECK="false";
|
||||||
|
fi
|
||||||
|
|
||||||
cat > /etc/yum.repos.d/onlyoffice.repo <<END
|
cat > /etc/yum.repos.d/onlyoffice.repo <<END
|
||||||
[onlyoffice]
|
[onlyoffice]
|
||||||
name=onlyoffice repo
|
name=onlyoffice repo
|
||||||
@ -91,11 +102,13 @@ END
|
|||||||
DOWNLOAD_URL_PREFIX="https://raw.githubusercontent.com/ONLYOFFICE/${product}/${GIT_BRANCH}/build/install/OneClickInstall/install-RedHat"
|
DOWNLOAD_URL_PREFIX="https://raw.githubusercontent.com/ONLYOFFICE/${product}/${GIT_BRANCH}/build/install/OneClickInstall/install-RedHat"
|
||||||
|
|
||||||
if [ "$LOCAL_SCRIPTS" = "true" ]; then
|
if [ "$LOCAL_SCRIPTS" = "true" ]; then
|
||||||
|
source install-RedHat/tools.sh
|
||||||
source install-RedHat/bootstrap.sh
|
source install-RedHat/bootstrap.sh
|
||||||
source install-RedHat/check-ports.sh
|
source install-RedHat/check-ports.sh
|
||||||
source install-RedHat/install-preq.sh
|
source install-RedHat/install-preq.sh
|
||||||
source install-RedHat/install-app.sh
|
source install-RedHat/install-app.sh
|
||||||
else
|
else
|
||||||
|
source <(curl ${DOWNLOAD_URL_PREFIX}/tools.sh)
|
||||||
source <(curl ${DOWNLOAD_URL_PREFIX}/bootstrap.sh)
|
source <(curl ${DOWNLOAD_URL_PREFIX}/bootstrap.sh)
|
||||||
source <(curl ${DOWNLOAD_URL_PREFIX}/check-ports.sh)
|
source <(curl ${DOWNLOAD_URL_PREFIX}/check-ports.sh)
|
||||||
source <(curl ${DOWNLOAD_URL_PREFIX}/install-preq.sh)
|
source <(curl ${DOWNLOAD_URL_PREFIX}/install-preq.sh)
|
||||||
|
@ -104,7 +104,7 @@ if [ "$(ls -A "$PRODUCT_DIR/services/kafka" 2> /dev/null)" == "" ]; then
|
|||||||
mkdir -p ${PRODUCT_DIR}/services/
|
mkdir -p ${PRODUCT_DIR}/services/
|
||||||
getent passwd kafka >/dev/null || useradd -m -d ${PRODUCT_DIR}/services/kafka -s /sbin/nologin -p kafka kafka
|
getent passwd kafka >/dev/null || useradd -m -d ${PRODUCT_DIR}/services/kafka -s /sbin/nologin -p kafka kafka
|
||||||
cd ${PRODUCT_DIR}/services/kafka
|
cd ${PRODUCT_DIR}/services/kafka
|
||||||
curl https://downloads.apache.org/kafka/2.7.1/kafka_2.13-2.7.1.tgz -O
|
curl https://downloads.apache.org/kafka/2.7.2/kafka_2.13-2.7.2.tgz -O
|
||||||
tar xzf kafka_*.tgz --strip 1 && rm -rf kafka_*.tgz
|
tar xzf kafka_*.tgz --strip 1 && rm -rf kafka_*.tgz
|
||||||
chown -R kafka ${PRODUCT_DIR}/services/kafka
|
chown -R kafka ${PRODUCT_DIR}/services/kafka
|
||||||
cd -
|
cd -
|
||||||
|
34
build/install/OneClickInstall/install-RedHat/tools.sh
Normal file
34
build/install/OneClickInstall/install-RedHat/tools.sh
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
check_hardware () {
|
||||||
|
DISK_REQUIREMENTS=40960;
|
||||||
|
MEMORY_REQUIREMENTS=5500;
|
||||||
|
CORE_REQUIREMENTS=2;
|
||||||
|
|
||||||
|
AVAILABLE_DISK_SPACE=$(df -m / | tail -1 | awk '{ print $4 }');
|
||||||
|
|
||||||
|
if [ ${AVAILABLE_DISK_SPACE} -lt ${DISK_REQUIREMENTS} ]; then
|
||||||
|
echo "Minimal requirements are not met: need at least $DISK_REQUIREMENTS MB of free HDD space"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
TOTAL_MEMORY=$(free -m | grep -oP '\d+' | head -n 1);
|
||||||
|
|
||||||
|
if [ ${TOTAL_MEMORY} -lt ${MEMORY_REQUIREMENTS} ]; then
|
||||||
|
echo "Minimal requirements are not met: need at least $MEMORY_REQUIREMENTS MB of RAM"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
CPU_CORES_NUMBER=$(cat /proc/cpuinfo | grep processor | wc -l);
|
||||||
|
|
||||||
|
if [ ${CPU_CORES_NUMBER} -lt ${CORE_REQUIREMENTS} ]; then
|
||||||
|
echo "The system does not meet the minimal hardware requirements. CPU with at least $CORE_REQUIREMENTS cores is required"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$SKIP_HARDWARE_CHECK" != "true" ]; then
|
||||||
|
check_hardware
|
||||||
|
fi
|
@ -809,3 +809,26 @@ export function fileCopyAs(fileId, destTitle, destFolderId, enableExternalExt) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getEditHistory(fileId, doc) {
|
||||||
|
return request({
|
||||||
|
method: "get",
|
||||||
|
url: `files/file/${fileId}/edit/history?doc=${doc}`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getEditDiff(fileId, version, doc) {
|
||||||
|
return request({
|
||||||
|
method: "get",
|
||||||
|
url: `files/file/${fileId}/edit/diff?version=${version}&doc=${doc}`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function restoreDocumentsVersion(fileId, version, doc) {
|
||||||
|
const options = {
|
||||||
|
method: "get",
|
||||||
|
url: `files/file/${fileId}/restoreversion?version=${version}&doc=${doc}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
return request(options);
|
||||||
|
}
|
||||||
|
@ -97,7 +97,7 @@ namespace ASC.Files.Core.Data
|
|||||||
|
|
||||||
services.TryAdd<ILinkDao, LinkDao>();
|
services.TryAdd<ILinkDao, LinkDao>();
|
||||||
|
|
||||||
// AddSharpBoxDaoSelectorService
|
services.TryAdd<EditHistory>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1202,14 +1202,12 @@ namespace ASC.Files.Core.Data
|
|||||||
.Select(r =>
|
.Select(r =>
|
||||||
{
|
{
|
||||||
var item = ServiceProvider.GetService<EditHistory>();
|
var item = ServiceProvider.GetService<EditHistory>();
|
||||||
var editHistoryAuthor = ServiceProvider.GetService<EditHistoryAuthor>();
|
|
||||||
|
|
||||||
editHistoryAuthor.Id = r.ModifiedBy;
|
|
||||||
item.ID = r.Id;
|
item.ID = r.Id;
|
||||||
item.Version = r.Version;
|
item.Version = r.Version;
|
||||||
item.VersionGroup = r.VersionGroup;
|
item.VersionGroup = r.VersionGroup;
|
||||||
item.ModifiedOn = TenantUtil.DateTimeFromUtc(r.ModifiedOn);
|
item.ModifiedOn = TenantUtil.DateTimeFromUtc(r.ModifiedOn);
|
||||||
item.ModifiedBy = editHistoryAuthor;
|
item.ModifiedBy = r.ModifiedBy;
|
||||||
item.ChangesString = r.Changes;
|
item.ChangesString = r.Changes;
|
||||||
item.Key = documentServiceHelper.GetDocKey(item.ID, item.Version, TenantUtil.DateTimeFromUtc(r.CreateOn));
|
item.Key = documentServiceHelper.GetDocKey(item.ID, item.Version, TenantUtil.DateTimeFromUtc(r.CreateOn));
|
||||||
|
|
||||||
|
@ -28,8 +28,9 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json;
|
||||||
|
|
||||||
|
using ASC.Common;
|
||||||
using ASC.Common.Logging;
|
using ASC.Common.Logging;
|
||||||
using ASC.Core;
|
using ASC.Core;
|
||||||
using ASC.Core.Tenants;
|
using ASC.Core.Tenants;
|
||||||
@ -39,13 +40,17 @@ using ASC.Web.Core.Users;
|
|||||||
|
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
namespace ASC.Files.Core
|
namespace ASC.Files.Core
|
||||||
{
|
{
|
||||||
|
[Transient]
|
||||||
[DebuggerDisplay("{ID} v{Version}")]
|
[DebuggerDisplay("{ID} v{Version}")]
|
||||||
public class EditHistory
|
public class EditHistory
|
||||||
{
|
{
|
||||||
|
private ILog Logger { get; }
|
||||||
|
private TenantUtil TenantUtil { get; }
|
||||||
|
private UserManager UserManager { get; }
|
||||||
|
private DisplayUserSettingsHelper DisplayUserSettingsHelper { get; }
|
||||||
|
|
||||||
public EditHistory(
|
public EditHistory(
|
||||||
IOptionsMonitor<ILog> options,
|
IOptionsMonitor<ILog> options,
|
||||||
TenantUtil tenantUtil,
|
TenantUtil tenantUtil,
|
||||||
@ -63,12 +68,12 @@ namespace ASC.Files.Core
|
|||||||
public int Version { get; set; }
|
public int Version { get; set; }
|
||||||
public int VersionGroup { get; set; }
|
public int VersionGroup { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("user")]
|
public DateTime ModifiedOn { get; set; }
|
||||||
public EditHistoryAuthor ModifiedBy { get; set; }
|
public Guid ModifiedBy { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("changeshistory")]
|
|
||||||
public string ChangesString { get; set; }
|
public string ChangesString { get; set; }
|
||||||
|
|
||||||
|
public string ServerVersion { get; set; }
|
||||||
|
|
||||||
public List<EditHistoryChanges> Changes
|
public List<EditHistoryChanges> Changes
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@ -78,29 +83,40 @@ namespace ASC.Files.Core
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var jObject = JObject.Parse(ChangesString);
|
var options = new JsonSerializerOptions
|
||||||
ServerVersion = jObject.Value<string>("serverVersion");
|
{
|
||||||
|
AllowTrailingCommas = true,
|
||||||
|
PropertyNameCaseInsensitive = true
|
||||||
|
};
|
||||||
|
|
||||||
|
var jObject = JsonSerializer.Deserialize<ChangesDataList>(ChangesString, options);
|
||||||
|
ServerVersion = jObject.ServerVersion;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(ServerVersion))
|
if (string.IsNullOrEmpty(ServerVersion))
|
||||||
return changes;
|
return changes;
|
||||||
|
|
||||||
var jChanges = jObject.Value<JArray>("changes");
|
changes = jObject.Changes.Select(r =>
|
||||||
|
{
|
||||||
|
var result = new EditHistoryChanges()
|
||||||
|
{
|
||||||
|
Author = new EditHistoryAuthor(UserManager, DisplayUserSettingsHelper)
|
||||||
|
{
|
||||||
|
Id = new Guid(r.User.Id ?? Guid.Empty.ToString()),
|
||||||
|
Name = r.User.Name,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
if (DateTime.TryParse(r.Created, out var _date))
|
||||||
|
{
|
||||||
|
_date = TenantUtil.DateTimeFromUtc(_date);
|
||||||
|
}
|
||||||
|
result.Date = _date;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
|
||||||
changes = jChanges.Children()
|
|
||||||
.Select(jChange =>
|
|
||||||
{
|
|
||||||
var jUser = jChange.Value<JObject>("user");
|
|
||||||
return new EditHistoryChanges(TenantUtil)
|
|
||||||
{
|
|
||||||
Date = jChange.Value<string>("created"),
|
|
||||||
Author = new EditHistoryAuthor(UserManager, DisplayUserSettingsHelper)
|
|
||||||
{
|
|
||||||
Id = new Guid(jUser.Value<string>("id") ?? Guid.Empty.ToString()),
|
|
||||||
Name = jUser.Value<string>("name"),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
})
|
|
||||||
.ToList();
|
|
||||||
return changes;
|
return changes;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -112,24 +128,27 @@ namespace ASC.Files.Core
|
|||||||
}
|
}
|
||||||
set { throw new NotImplementedException(); }
|
set { throw new NotImplementedException(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public DateTime ModifiedOn;
|
|
||||||
|
|
||||||
[JsonPropertyName("created")]
|
|
||||||
public string ModifiedOnString
|
|
||||||
{
|
|
||||||
get { return ModifiedOn.Equals(default) ? null : ModifiedOn.ToString("g"); }
|
|
||||||
set { throw new NotImplementedException(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILog Logger { get; }
|
|
||||||
private TenantUtil TenantUtil { get; }
|
|
||||||
private UserManager UserManager { get; }
|
|
||||||
private DisplayUserSettingsHelper DisplayUserSettingsHelper { get; }
|
|
||||||
|
|
||||||
public string ServerVersion;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ChangesDataList
|
||||||
|
{
|
||||||
|
public string ServerVersion { get; set; }
|
||||||
|
public ChangesData[] Changes { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
class ChangesData
|
||||||
|
{
|
||||||
|
public string Created { get; set; }
|
||||||
|
public ChangesUserData User { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
class ChangesUserData
|
||||||
|
{
|
||||||
|
public string Id { get; set; }
|
||||||
|
public string Name { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Transient]
|
||||||
[DebuggerDisplay("{Id} {Name}")]
|
[DebuggerDisplay("{Id} {Name}")]
|
||||||
public class EditHistoryAuthor
|
public class EditHistoryAuthor
|
||||||
{
|
{
|
||||||
@ -169,30 +188,11 @@ namespace ASC.Files.Core
|
|||||||
[DebuggerDisplay("{Author.Name}")]
|
[DebuggerDisplay("{Author.Name}")]
|
||||||
public class EditHistoryChanges
|
public class EditHistoryChanges
|
||||||
{
|
{
|
||||||
public EditHistoryChanges(TenantUtil tenantUtil)
|
|
||||||
{
|
|
||||||
TenantUtil = tenantUtil;
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonPropertyName("user")]
|
|
||||||
public EditHistoryAuthor Author { get; set; }
|
public EditHistoryAuthor Author { get; set; }
|
||||||
|
|
||||||
private DateTime _date;
|
public DateTime Date { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("created")]
|
|
||||||
public string Date
|
|
||||||
{
|
|
||||||
get { return _date.Equals(default) ? null : _date.ToString("g"); }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (DateTime.TryParse(value, out _date))
|
|
||||||
{
|
|
||||||
_date = TenantUtil.DateTimeFromUtc(_date);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private TenantUtil TenantUtil { get; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[DebuggerDisplay("{Version}")]
|
[DebuggerDisplay("{Version}")]
|
||||||
@ -209,6 +209,8 @@ namespace ASC.Files.Core
|
|||||||
public string Url { get; set; }
|
public string Url { get; set; }
|
||||||
|
|
||||||
public int Version { get; set; }
|
public int Version { get; set; }
|
||||||
|
|
||||||
|
public string FileType { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[DebuggerDisplay("{Key} - {Url}")]
|
[DebuggerDisplay("{Key} - {Url}")]
|
||||||
@ -217,5 +219,7 @@ namespace ASC.Files.Core
|
|||||||
public string Key { get; set; }
|
public string Key { get; set; }
|
||||||
|
|
||||||
public string Url { get; set; }
|
public string Url { get; set; }
|
||||||
|
|
||||||
|
public string FileType { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1071,12 +1071,15 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
Key = DocumentServiceHelper.GetDocKey(file),
|
Key = DocumentServiceHelper.GetDocKey(file),
|
||||||
Url = DocumentServiceConnector.ReplaceCommunityAdress(PathProvider.GetFileStreamUrl(file, doc)),
|
Url = DocumentServiceConnector.ReplaceCommunityAdress(PathProvider.GetFileStreamUrl(file, doc)),
|
||||||
Version = version,
|
Version = version,
|
||||||
|
FileType = GetFileExtensionWithoutDot(FileUtility.GetFileExtension(file.Title))
|
||||||
};
|
};
|
||||||
|
|
||||||
if (fileDao.ContainChanges(file.ID, file.Version))
|
if (fileDao.ContainChanges(file.ID, file.Version))
|
||||||
{
|
{
|
||||||
string previouseKey;
|
string previouseKey;
|
||||||
string sourceFileUrl;
|
string sourceFileUrl;
|
||||||
|
string previousFileExt;
|
||||||
|
|
||||||
if (file.Version > 1)
|
if (file.Version > 1)
|
||||||
{
|
{
|
||||||
var previousFileStable = fileDao.GetFileStable(file.ID, file.Version - 1);
|
var previousFileStable = fileDao.GetFileStable(file.ID, file.Version - 1);
|
||||||
@ -1085,6 +1088,7 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
sourceFileUrl = PathProvider.GetFileStreamUrl(previousFileStable, doc);
|
sourceFileUrl = PathProvider.GetFileStreamUrl(previousFileStable, doc);
|
||||||
|
|
||||||
previouseKey = DocumentServiceHelper.GetDocKey(previousFileStable);
|
previouseKey = DocumentServiceHelper.GetDocKey(previousFileStable);
|
||||||
|
previousFileExt = FileUtility.GetFileExtension(previousFileStable.Title);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1105,12 +1109,14 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
sourceFileUrl = BaseCommonLinkUtility.GetFullAbsolutePath(sourceFileUrl);
|
sourceFileUrl = BaseCommonLinkUtility.GetFullAbsolutePath(sourceFileUrl);
|
||||||
|
|
||||||
previouseKey = DocumentServiceConnector.GenerateRevisionId(Guid.NewGuid().ToString());
|
previouseKey = DocumentServiceConnector.GenerateRevisionId(Guid.NewGuid().ToString());
|
||||||
|
previousFileExt = fileExt;
|
||||||
}
|
}
|
||||||
|
|
||||||
result.Previous = new EditHistoryUrl
|
result.Previous = new EditHistoryUrl
|
||||||
{
|
{
|
||||||
Key = previouseKey,
|
Key = previouseKey,
|
||||||
Url = DocumentServiceConnector.ReplaceCommunityAdress(sourceFileUrl),
|
Url = DocumentServiceConnector.ReplaceCommunityAdress(sourceFileUrl),
|
||||||
|
FileType = GetFileExtensionWithoutDot(previousFileExt)
|
||||||
};
|
};
|
||||||
result.ChangesUrl = PathProvider.GetFileChangesUrl(file, doc);
|
result.ChangesUrl = PathProvider.GetFileChangesUrl(file, doc);
|
||||||
}
|
}
|
||||||
@ -1118,6 +1124,11 @@ namespace ASC.Web.Files.Services.WCFService
|
|||||||
result.Token = DocumentServiceHelper.GetSignature(result);
|
result.Token = DocumentServiceHelper.GetSignature(result);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
string GetFileExtensionWithoutDot(string ext)
|
||||||
|
{
|
||||||
|
return ext.Substring(ext.IndexOf('.') + 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<EditHistory> RestoreVersion(T fileId, int version, string url = null, string doc = null)
|
public List<EditHistory> RestoreVersion(T fileId, int version, string url = null, string doc = null)
|
||||||
|
49
products/ASC.Files/Core/Model/EditHistoryWrapper.cs
Normal file
49
products/ASC.Files/Core/Model/EditHistoryWrapper.cs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
using ASC.Api.Core;
|
||||||
|
using ASC.Core;
|
||||||
|
using ASC.Web.Core.Users;
|
||||||
|
|
||||||
|
namespace ASC.Files.Core.Model
|
||||||
|
{
|
||||||
|
public class EditHistoryWrapper
|
||||||
|
{
|
||||||
|
public int ID { get; set; }
|
||||||
|
public string Key { get; set; }
|
||||||
|
public int Version { get; set; }
|
||||||
|
public int VersionGroup { get; set; }
|
||||||
|
public EditHistoryAuthor User { get; set; }
|
||||||
|
public ApiDateTime Created { get; set; }
|
||||||
|
public string ChangesHistory { get; set; }
|
||||||
|
public List<EditHistoryChangesWrapper> Changes { get; set; }
|
||||||
|
public string ServerVersion { get; set; }
|
||||||
|
|
||||||
|
public EditHistoryWrapper(EditHistory editHistory, ApiDateTimeHelper apiDateTimeHelper, UserManager userManager, DisplayUserSettingsHelper displayUserSettingsHelper)
|
||||||
|
{
|
||||||
|
ID = editHistory.ID;
|
||||||
|
Key = editHistory.Key;
|
||||||
|
Version = editHistory.Version;
|
||||||
|
VersionGroup = editHistory.VersionGroup;
|
||||||
|
Changes = editHistory.Changes.Select(r => new EditHistoryChangesWrapper(r, apiDateTimeHelper)).ToList();
|
||||||
|
ChangesHistory = editHistory.ChangesString;
|
||||||
|
Created = apiDateTimeHelper.Get(editHistory.ModifiedOn);
|
||||||
|
User = new EditHistoryAuthor(userManager, displayUserSettingsHelper) { Id = editHistory.ModifiedBy };
|
||||||
|
ServerVersion = editHistory.ServerVersion;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EditHistoryChangesWrapper
|
||||||
|
{
|
||||||
|
public EditHistoryAuthor User { get; set; }
|
||||||
|
|
||||||
|
public ApiDateTime Created { get; set; }
|
||||||
|
|
||||||
|
public EditHistoryChangesWrapper(EditHistoryChanges historyChanges, ApiDateTimeHelper apiDateTimeHelper)
|
||||||
|
{
|
||||||
|
User = historyChanges.Author;
|
||||||
|
Created = apiDateTimeHelper.Get(historyChanges.Date);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1517,6 +1517,48 @@ namespace ASC.Api.Documents
|
|||||||
return FilesControllerHelperInt.LockFile(fileId, model.LockFile);
|
return FilesControllerHelperInt.LockFile(fileId, model.LockFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[AllowAnonymous]
|
||||||
|
[Read("file/{fileId}/edit/history")]
|
||||||
|
public List<EditHistoryWrapper> GetEditHistory(string fileId, string doc = null)
|
||||||
|
{
|
||||||
|
return FilesControllerHelperString.GetEditHistory(fileId, doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
[AllowAnonymous]
|
||||||
|
[Read("file/{fileId:int}/edit/history")]
|
||||||
|
public List<EditHistoryWrapper> GetEditHistory(int fileId, string doc = null)
|
||||||
|
{
|
||||||
|
return FilesControllerHelperInt.GetEditHistory(fileId, doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
[AllowAnonymous]
|
||||||
|
[Read("file/{fileId}/edit/diff")]
|
||||||
|
public EditHistoryData GetEditDiffUrl(string fileId, int version = 0, string doc = null)
|
||||||
|
{
|
||||||
|
return FilesControllerHelperString.GetEditDiffUrl(fileId, version, doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
[AllowAnonymous]
|
||||||
|
[Read("file/{fileId:int}/edit/diff")]
|
||||||
|
public EditHistoryData GetEditDiffUrl(int fileId, int version = 0, string doc = null)
|
||||||
|
{
|
||||||
|
return FilesControllerHelperInt.GetEditDiffUrl(fileId, version, doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
[AllowAnonymous]
|
||||||
|
[Read("file/{fileId}/restoreversion")]
|
||||||
|
public List<EditHistoryWrapper> RestoreVersion(string fileId, int version = 0, string url = null, string doc = null)
|
||||||
|
{
|
||||||
|
return FilesControllerHelperString.RestoreVersion(fileId, version, url, doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
[AllowAnonymous]
|
||||||
|
[Read("file/{fileId:int}/restoreversion")]
|
||||||
|
public List<EditHistoryWrapper> RestoreVersion(int fileId, int version = 0, string url = null, string doc = null)
|
||||||
|
{
|
||||||
|
return FilesControllerHelperInt.RestoreVersion(fileId, version, url, doc);
|
||||||
|
}
|
||||||
|
|
||||||
[Update("file/{fileId}/comment")]
|
[Update("file/{fileId}/comment")]
|
||||||
public object UpdateCommentFromBody(string fileId, [FromBody] UpdateCommentModel model)
|
public object UpdateCommentFromBody(string fileId, [FromBody] UpdateCommentModel model)
|
||||||
{
|
{
|
||||||
|
@ -21,6 +21,7 @@ using ASC.Files.Core;
|
|||||||
using ASC.Files.Core.Model;
|
using ASC.Files.Core.Model;
|
||||||
using ASC.Files.Model;
|
using ASC.Files.Model;
|
||||||
using ASC.Web.Core.Files;
|
using ASC.Web.Core.Files;
|
||||||
|
using ASC.Web.Core.Users;
|
||||||
using ASC.Web.Files.Classes;
|
using ASC.Web.Files.Classes;
|
||||||
using ASC.Web.Files.Core.Entries;
|
using ASC.Web.Files.Core.Entries;
|
||||||
using ASC.Web.Files.Services.DocumentService;
|
using ASC.Web.Files.Services.DocumentService;
|
||||||
@ -66,6 +67,9 @@ namespace ASC.Files.Helpers
|
|||||||
private EncryptionKeyPairHelper EncryptionKeyPairHelper { get; }
|
private EncryptionKeyPairHelper EncryptionKeyPairHelper { get; }
|
||||||
private IHttpContextAccessor HttpContextAccessor { get; }
|
private IHttpContextAccessor HttpContextAccessor { get; }
|
||||||
private FileConverter FileConverter { get; }
|
private FileConverter FileConverter { get; }
|
||||||
|
private ApiDateTimeHelper ApiDateTimeHelper { get; }
|
||||||
|
private UserManager UserManager { get; }
|
||||||
|
private DisplayUserSettingsHelper DisplayUserSettingsHelper { get; }
|
||||||
private ILog Logger { get; set; }
|
private ILog Logger { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -94,7 +98,10 @@ namespace ASC.Files.Helpers
|
|||||||
SettingsManager settingsManager,
|
SettingsManager settingsManager,
|
||||||
EncryptionKeyPairHelper encryptionKeyPairHelper,
|
EncryptionKeyPairHelper encryptionKeyPairHelper,
|
||||||
IHttpContextAccessor httpContextAccessor,
|
IHttpContextAccessor httpContextAccessor,
|
||||||
FileConverter fileConverter)
|
FileConverter fileConverter,
|
||||||
|
ApiDateTimeHelper apiDateTimeHelper,
|
||||||
|
UserManager userManager,
|
||||||
|
DisplayUserSettingsHelper displayUserSettingsHelper)
|
||||||
{
|
{
|
||||||
ApiContext = context;
|
ApiContext = context;
|
||||||
FileStorageService = fileStorageService;
|
FileStorageService = fileStorageService;
|
||||||
@ -115,6 +122,9 @@ namespace ASC.Files.Helpers
|
|||||||
DocumentServiceTracker = documentServiceTracker;
|
DocumentServiceTracker = documentServiceTracker;
|
||||||
SettingsManager = settingsManager;
|
SettingsManager = settingsManager;
|
||||||
EncryptionKeyPairHelper = encryptionKeyPairHelper;
|
EncryptionKeyPairHelper = encryptionKeyPairHelper;
|
||||||
|
ApiDateTimeHelper = apiDateTimeHelper;
|
||||||
|
UserManager = userManager;
|
||||||
|
DisplayUserSettingsHelper = displayUserSettingsHelper;
|
||||||
HttpContextAccessor = httpContextAccessor;
|
HttpContextAccessor = httpContextAccessor;
|
||||||
FileConverter = fileConverter;
|
FileConverter = fileConverter;
|
||||||
Logger = optionMonitor.Get("ASC.Files");
|
Logger = optionMonitor.Get("ASC.Files");
|
||||||
@ -571,6 +581,23 @@ namespace ASC.Files.Helpers
|
|||||||
return FileStorageService.GetPresignedUri(fileId);
|
return FileStorageService.GetPresignedUri(fileId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<EditHistoryWrapper> GetEditHistory(T fileId, string doc = null)
|
||||||
|
{
|
||||||
|
var result = FileStorageService.GetEditHistory(fileId, doc);
|
||||||
|
return result.Select(r => new EditHistoryWrapper(r, ApiDateTimeHelper, UserManager, DisplayUserSettingsHelper)).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public EditHistoryData GetEditDiffUrl(T fileId, int version = 0, string doc = null)
|
||||||
|
{
|
||||||
|
return FileStorageService.GetEditDiffUrl(fileId, version, doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<EditHistoryWrapper> RestoreVersion(T fileId, int version = 0, string url = null, string doc = null)
|
||||||
|
{
|
||||||
|
var result = FileStorageService.RestoreVersion(fileId, version, url, doc);
|
||||||
|
return result.Select(r => new EditHistoryWrapper(r, ApiDateTimeHelper, UserManager, DisplayUserSettingsHelper)).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
public string UpdateComment(T fileId, int version, string comment)
|
public string UpdateComment(T fileId, int version, string comment)
|
||||||
{
|
{
|
||||||
return FileStorageService.UpdateComment(fileId, version, comment);
|
return FileStorageService.UpdateComment(fileId, version, comment);
|
||||||
|
@ -26,6 +26,9 @@ import {
|
|||||||
getPresignedUri,
|
getPresignedUri,
|
||||||
convertFile,
|
convertFile,
|
||||||
checkFillFormDraft,
|
checkFillFormDraft,
|
||||||
|
getEditHistory,
|
||||||
|
getEditDiff,
|
||||||
|
restoreDocumentsVersion,
|
||||||
} from "@appserver/common/api/files";
|
} from "@appserver/common/api/files";
|
||||||
import FilesFilter from "@appserver/common/api/files/filter";
|
import FilesFilter from "@appserver/common/api/files/filter";
|
||||||
|
|
||||||
@ -33,12 +36,12 @@ import throttle from "lodash/throttle";
|
|||||||
import { isIOS, deviceType } from "react-device-detect";
|
import { isIOS, deviceType } from "react-device-detect";
|
||||||
import { homepage } from "../package.json";
|
import { homepage } from "../package.json";
|
||||||
|
|
||||||
import { AppServerConfig, FolderType } from "@appserver/common/constants";
|
import { AppServerConfig } from "@appserver/common/constants";
|
||||||
import SharingDialog from "files/SharingDialog";
|
import SharingDialog from "files/SharingDialog";
|
||||||
import { getDefaultFileName, SaveAs, canConvert } from "files/utils";
|
import { getDefaultFileName, SaveAs, canConvert } from "files/utils";
|
||||||
import SelectFileDialog from "files/SelectFileDialog";
|
import SelectFileDialog from "files/SelectFileDialog";
|
||||||
import SelectFolderDialog from "files/SelectFolderDialog";
|
import SelectFolderDialog from "files/SelectFolderDialog";
|
||||||
import { StyledSelectFolder, StyledSelectFile } from "./StyledEditor";
|
import { StyledSelectFolder } from "./StyledEditor";
|
||||||
import i18n from "./i18n";
|
import i18n from "./i18n";
|
||||||
import Text from "@appserver/components/text";
|
import Text from "@appserver/components/text";
|
||||||
import TextInput from "@appserver/components/text-input";
|
import TextInput from "@appserver/components/text-input";
|
||||||
@ -67,7 +70,9 @@ let isSharingAccess;
|
|||||||
let user = null;
|
let user = null;
|
||||||
let personal;
|
let personal;
|
||||||
let url = window.location.href;
|
let url = window.location.href;
|
||||||
|
let config;
|
||||||
const filesUrl = url.substring(0, url.indexOf("/doceditor"));
|
const filesUrl = url.substring(0, url.indexOf("/doceditor"));
|
||||||
|
const doc = url.indexOf("doc=") !== -1 ? url.split("doc=")[1] : null;
|
||||||
|
|
||||||
toast.configure();
|
toast.configure();
|
||||||
|
|
||||||
@ -142,7 +147,7 @@ const Editor = () => {
|
|||||||
docEditor.setFavorite(favorite);
|
docEditor.setFavorite(favorite);
|
||||||
};
|
};
|
||||||
|
|
||||||
const initDesktop = (config) => {
|
const initDesktop = () => {
|
||||||
const isEncryption = config?.editorConfig["encryptionKeys"] !== undefined;
|
const isEncryption = config?.editorConfig["encryptionKeys"] !== undefined;
|
||||||
|
|
||||||
regDesktop(
|
regDesktop(
|
||||||
@ -237,7 +242,7 @@ const Editor = () => {
|
|||||||
setIsAuthenticated(successAuth);
|
setIsAuthenticated(successAuth);
|
||||||
}
|
}
|
||||||
|
|
||||||
const config = await openEdit(fileId, version, doc, view);
|
config = await openEdit(fileId, version, doc, view);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!view &&
|
!view &&
|
||||||
@ -269,7 +274,7 @@ const Editor = () => {
|
|||||||
|
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
|
|
||||||
loadScript(docApiUrl, "scripDocServiceAddress", () => onLoad(config));
|
loadScript(docApiUrl, "scripDocServiceAddress", () => onLoad());
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
toastr.error(
|
toastr.error(
|
||||||
@ -332,7 +337,7 @@ const Editor = () => {
|
|||||||
document.title = title;
|
document.title = title;
|
||||||
};
|
};
|
||||||
|
|
||||||
const onLoad = (config) => {
|
const onLoad = () => {
|
||||||
try {
|
try {
|
||||||
if (!window.DocsAPI) throw new Error("DocsAPI is not defined");
|
if (!window.DocsAPI) throw new Error("DocsAPI is not defined");
|
||||||
|
|
||||||
@ -408,7 +413,8 @@ const Editor = () => {
|
|||||||
onRequestSaveAs,
|
onRequestSaveAs,
|
||||||
onRequestInsertImage,
|
onRequestInsertImage,
|
||||||
onRequestMailMergeRecipients,
|
onRequestMailMergeRecipients,
|
||||||
onRequestCompareFile;
|
onRequestCompareFile,
|
||||||
|
onRequestRestore;
|
||||||
|
|
||||||
if (isSharingAccess) {
|
if (isSharingAccess) {
|
||||||
onRequestSharingSettings = onSDKRequestSharingSettings;
|
onRequestSharingSettings = onSDKRequestSharingSettings;
|
||||||
@ -425,6 +431,9 @@ const Editor = () => {
|
|||||||
onRequestCompareFile = onSDKRequestCompareFile;
|
onRequestCompareFile = onSDKRequestCompareFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!!config.document.permissions.changeHistory) {
|
||||||
|
onRequestRestore = onSDKRequestRestore;
|
||||||
|
}
|
||||||
const events = {
|
const events = {
|
||||||
events: {
|
events: {
|
||||||
onAppReady: onSDKAppReady,
|
onAppReady: onSDKAppReady,
|
||||||
@ -442,6 +451,10 @@ const Editor = () => {
|
|||||||
onRequestMailMergeRecipients,
|
onRequestMailMergeRecipients,
|
||||||
onRequestCompareFile,
|
onRequestCompareFile,
|
||||||
onRequestEditRights: onSDKRequestEditRights,
|
onRequestEditRights: onSDKRequestEditRights,
|
||||||
|
onRequestHistory: onSDKRequestHistory,
|
||||||
|
onRequestHistoryClose: onSDKRequestHistoryClose,
|
||||||
|
onRequestHistoryData: onSDKRequestHistoryData,
|
||||||
|
onRequestRestore,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -454,6 +467,114 @@ const Editor = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onSDKRequestHistoryData = async (event) => {
|
||||||
|
const version = event.data;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const versionDifference = await getEditDiff(fileId, version, doc);
|
||||||
|
const changesUrl = versionDifference.changesUrl;
|
||||||
|
const previous = versionDifference.previous;
|
||||||
|
const token = versionDifference.token;
|
||||||
|
|
||||||
|
docEditor.setHistoryData({
|
||||||
|
...(changesUrl && { changesUrl }),
|
||||||
|
key: versionDifference.key,
|
||||||
|
fileType: versionDifference.fileType,
|
||||||
|
...(previous && {
|
||||||
|
previous: {
|
||||||
|
fileType: previous.fileType,
|
||||||
|
key: previous.key,
|
||||||
|
url: previous.url,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
...(token && { token }),
|
||||||
|
url: versionDifference.url,
|
||||||
|
version,
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
docEditor.setHistoryData({
|
||||||
|
error: `${e}`, //TODO: maybe need to display something else.
|
||||||
|
version,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const onSDKRequestHistoryClose = () => {
|
||||||
|
document.location.reload();
|
||||||
|
};
|
||||||
|
|
||||||
|
const getDocumentHistory = (fileHistory, historyLength) => {
|
||||||
|
let result = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < historyLength; i++) {
|
||||||
|
const changes = fileHistory[i].changes;
|
||||||
|
const serverVersion = fileHistory[i].serverVersion;
|
||||||
|
const version = fileHistory[i].version;
|
||||||
|
const versionGroup = fileHistory[i].versionGroup;
|
||||||
|
|
||||||
|
let obj = {
|
||||||
|
...(changes.length !== 0 && { changes }),
|
||||||
|
created: `${new Date(fileHistory[i].created).toLocaleString(
|
||||||
|
config.editorConfig.lang
|
||||||
|
)}`,
|
||||||
|
...(serverVersion && { serverVersion }),
|
||||||
|
key: fileHistory[i].key,
|
||||||
|
user: {
|
||||||
|
id: fileHistory[i].user.id,
|
||||||
|
name: fileHistory[i].user.name,
|
||||||
|
},
|
||||||
|
version,
|
||||||
|
versionGroup,
|
||||||
|
};
|
||||||
|
|
||||||
|
result.push(obj);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
const getCurrentDocumentVersion = (fileHistory, historyLength) => {
|
||||||
|
return url.indexOf("&version=") !== -1
|
||||||
|
? +url.split("&version=")[1]
|
||||||
|
: fileHistory[historyLength - 1].version;
|
||||||
|
};
|
||||||
|
const onSDKRequestHistory = async () => {
|
||||||
|
try {
|
||||||
|
const fileHistory = await getEditHistory(fileId, doc);
|
||||||
|
const historyLength = fileHistory.length;
|
||||||
|
|
||||||
|
docEditor.refreshHistory({
|
||||||
|
currentVersion: getCurrentDocumentVersion(fileHistory, historyLength),
|
||||||
|
history: getDocumentHistory(fileHistory, historyLength),
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
docEditor.refreshHistory({
|
||||||
|
error: `${e}`, //TODO: maybe need to display something else.
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const onSDKRequestRestore = async (event) => {
|
||||||
|
const restoreVersion = event.data.version;
|
||||||
|
try {
|
||||||
|
const updateVersions = await restoreDocumentsVersion(
|
||||||
|
fileId,
|
||||||
|
restoreVersion,
|
||||||
|
doc
|
||||||
|
);
|
||||||
|
const historyLength = updateVersions.length;
|
||||||
|
docEditor.refreshHistory({
|
||||||
|
currentVersion: getCurrentDocumentVersion(
|
||||||
|
updateVersions,
|
||||||
|
historyLength
|
||||||
|
),
|
||||||
|
history: getDocumentHistory(updateVersions, historyLength),
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
docEditor.refreshHistory({
|
||||||
|
error: `${e}`, //TODO: maybe need to display something else.
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const onSDKAppReady = () => {
|
const onSDKAppReady = () => {
|
||||||
console.log("ONLYOFFICE Document Editor is ready");
|
console.log("ONLYOFFICE Document Editor is ready");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user