Merge branch 'develop' into feature/custom-theme

This commit is contained in:
Alexey Safronov 2022-11-23 19:57:15 +03:00
commit d3d91ba54e
31 changed files with 342 additions and 133 deletions

1
.gitignore vendored
View File

@ -50,4 +50,3 @@ TestsResults/
**/.yarn/cache
**/.yarn/install-state.gz
config/appsettings.dev.json

View File

@ -0,0 +1,81 @@
$PSversionMajor = $PSVersionTable.PSVersion | sort-object major | ForEach-Object { $_.major }
$PSversionMinor = $PSVersionTable.PSVersion | sort-object minor | ForEach-Object { $_.minor }
if ($PSversionMajor -lt 7 -or $PSversionMinor -lt 2) {
Write-Error "Powershell version must be greater than or equal to 7.2."
exit
}
$Branch = git branch --show-current
$BranchExistRemote = git ls-remote --heads origin $Branch
if (-not $BranchExistRemote) {
Write-Error "The current branch does not exist in the remote repository. Please push changes."
exit
}
$RootDir = Split-Path -Parent $PSScriptRoot
$DockerDir = ($RootDir + "\build\install\docker")
$BuildDate = Get-Date -Format "yyyy-MM-dd"
$LocalIp = (Get-WmiObject -Class Win32_NetworkAdapterConfiguration | Where-Object { $_.DHCPEnabled -ne $null -and $_.DefaultIPGateway -ne $null }).IPAddress | Select-Object -First 1
$Doceditor = ($LocalIp + ":5013")
$Login = ($LocalIp + ":5011")
$Client = ($LocalIp + ":5001")
$DockerFile = "Dockerfile.dev"
$EnvExtension = "dev"
$CoreBaseDomain = "localhost"
# Stop all backend services"
& "$PSScriptRoot\start\stop.backend.docker.ps1"
$Env:COMPOSE_IGNORE_ORPHANS = "True"
$Containers = docker ps -a -f "name=^onlyoffice" --format="{{.ID}} {{.Names}}" | Select-String -Pattern ("mysql|rabbitmq|redis|elasticsearch|documentserver") -NotMatch | ConvertFrom-String | ForEach-Object P1
$Images = docker images onlyoffice/docspace* -q
if ($Containers) {
Write-Host "Remove all backend containers" -ForegroundColor Blue
docker rm -f $Containers
}
if ($Images) {
Write-Host "Remove all docker images except 'mysql, rabbitmq, redis, elasticsearch, documentserver'" -ForegroundColor Blue
docker rmi -f $Images
}
Write-Host "Run MySQL" -ForegroundColor Green
docker compose -f ($DockerDir + "\db.yml") up -d
Write-Host "Run environments (redis, rabbitmq)" -ForegroundColor Green
$Env:DOCKERFILE = $DockerFile
docker compose -f ($DockerDir + "\redis.yml") -f ($DockerDir + "\rabbitmq.yml") up -d
if ($args[0] -eq "--no_ds") {
Write-Host "SKIP Document server" -ForegroundColor Blue
}
else {
Write-Host "Run Document server" -ForegroundColor Green
$Env:DOCUMENT_SERVER_IMAGE_NAME = "onlyoffice/documentserver-de:latest"
$Env:ROOT_DIR = $RootDir
docker compose -f ($DockerDir + "\ds.dev.yml") up -d
}
Write-Host "Build all backend services" -ForegroundColor Blue
$Env:DOCKERFILE = $DockerFile
$Env:RELEASE_DATE = $BuildDate
$Env:GIT_BRANCH = $Branch
$Env:SERVICE_DOCEDITOR = $Doceditor
$Env:SERVICE_LOGIN = $Login
$Env:SERVICE_CLIENT = $Client
$Env:APP_CORE_BASE_DOMAIN = $CoreBaseDomain
$Env:ENV_EXTENSION = $EnvExtension
docker compose -f ($DockerDir + "\build.dev.yml") build --build-arg GIT_BRANCH=$Branch --build-arg RELEASE_DATE=$BuildDate
Write-Host "Run DB migration" -ForegroundColor Green
$Env:DOCKERFILE = $DockerFile
docker compose -f ($DockerDir + "\migration-runner.yml") up -d
# Start all backend services"
& "$PSScriptRoot\start\start.backend.docker.ps1"

View File

@ -9,10 +9,17 @@ echo "Root directory:" $dir
cd $dir
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
branch=$(git branch --show-current)
echo "GIT_BRANCH:" $branch
branch_exist_remote=$(git ls-remote --heads origin $branch)
if [ -z "$branch_exist_remote" ]; then
echo "The current branch does not exist in the remote repository. Please push changes."
exit 1
fi
cd $dir/build/install/docker/
docker_dir="$( pwd )"
@ -43,11 +50,9 @@ $dir/build/start/stop.backend.docker.sh
echo "Remove all backend containers"
docker rm -f $(docker ps -a | egrep "onlyoffice" | egrep -v "mysql|rabbitmq|redis|elasticsearch|documentserver" | awk 'NR>0 {print $1}')
echo "Remove all backend images"
docker rmi -f $(docker images -a | egrep "onlyoffice" | egrep -v "mysql|rabbitmq|redis|elasticsearch|documentserver" | awk 'NR>0 {print $3}')
echo "Remove all docker images except 'mysql, rabbitmq, redis, elasticsearch, documentserver'"
docker image rm -f $(docker images -a | egrep "onlyoffice" | egrep -v "mysql|rabbitmq|redis|elasticsearch|documentserver" | awk 'NR>0 {print $3}')
docker rmi -f $(docker images -a | egrep "onlyoffice" | egrep -v "mysql|rabbitmq|redis|elasticsearch|documentserver" | awk 'NR>0 {print $3}')
echo "Run MySQL"
@ -58,7 +63,7 @@ if [ "${arch_name}" = "x86_64" ]; then
docker compose -f db.yml up -d
elif [ "${arch_name}" = "arm64" ]; then
echo "CPU Type: arm64 -> run db.yml with arm64v8 image"
MYSQL_IMAGE=arm64v8/mysql:oracle \
MYSQL_IMAGE=arm64v8/mysql:8.0.31-oracle \
docker compose -f db.yml up -d
else
echo "Error: Unknown CPU Type: ${arch_name}."

9
build/build.docker.bat Normal file
View File

@ -0,0 +1,9 @@
@echo off
if %errorlevel% == 0 (
pwsh %~dp0/build.backend.docker.ps1 "start"
)
echo.
pause

View File

@ -0,0 +1,21 @@
$Containers = docker ps -aqf "name=^onlyoffice"
$Images = docker images onlyoffice/docspace* -q
if ($Containers) {
Write-Host "Stop all backend containers" -ForegroundColor Blue
docker stop $Containers
Write-Host "Remove all backend containers" -ForegroundColor Blue
docker rm -f $Containers
}
if ($Images) {
Write-Host "Remove all docker images except 'mysql, rabbitmq, redis, elasticsearch, documentserver'" -ForegroundColor Blue
docker rmi -f $Images
}
Write-Host "Remove unused volumes." -ForegroundColor Blue
docker volume prune -f
Write-Host "Remove unused networks." -ForegroundColor Blue
docker network prune -f

View File

@ -5,7 +5,7 @@
DOCKER_IMAGE_PREFIX=${STATUS}docspace
DOCKER_TAG=latest
CONTAINER_PREFIX=${PRODUCT}-
MYSQL_VERSION=8.0.18
MYSQL_VERSION=8.0.31
MYSQL_IMAGE=mysql:${MYSQL_VERSION}
ELK_VERSION=7.13.1
SERVICE_PORT=5050

View File

@ -319,26 +319,7 @@ ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
ENV SRC_PATH=${SRC_PATH}
WORKDIR ${BUILD_PATH}/services/ASC.Migration.Runner/
COPY ./docker-migration-entrypoint.sh ./docker-migration-entrypoint.sh
COPY docker-migration-entrypoint.sh docker-migration-entrypoint.sh
COPY --from=base ${SRC_PATH}/ASC.Migration.Runner/service/ .
ENTRYPOINT ["./docker-migration-entrypoint.sh"]
## image for k8s bin-share ##
FROM busybox:latest AS bin_share
RUN mkdir -p /app/appserver/ASC.Files/server && \
mkdir -p /app/appserver/ASC.People/server/ && \
addgroup --system --gid 107 onlyoffice && \
adduser -u 104 onlyoffice --home /var/www/onlyoffice --system -G onlyoffice
COPY bin-share-docker-entrypoint.sh /app/docker-entrypoint.sh
COPY --from=base /var/www/products/ASC.Files/server/ /app/appserver/ASC.Files/server/
COPY --from=base /var/www/products/ASC.People/server/ /app/appserver/ASC.People/server/
ENTRYPOINT ["./app/docker-entrypoint.sh"]
## image for k8s wait-bin-share ##
FROM busybox:latest AS wait_bin_share
RUN mkdir /app
COPY wait-bin-share-docker-entrypoint.sh /app/docker-entrypoint.sh
ENTRYPOINT ["./app/docker-entrypoint.sh"]

View File

@ -1,34 +1,33 @@
version: "3.8"
x-service:
&x-service-base
container_name: base
restart: always
expose:
x-service: &x-service-base
container_name: base
restart: always
expose:
- ${SERVICE_PORT}
environment:
MYSQL_HOST: ${MYSQL_HOST}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
DATABASE_MIGRATION: ${DATABASE_MIGRATION}
APP_DOTNET_ENV: ${APP_DOTNET_ENV}
APP_CORE_BASE_DOMAIN: ${APP_CORE_BASE_DOMAIN}
APP_CORE_MACHINEKEY: ${APP_CORE_MACHINEKEY}
DOCUMENT_SERVER_JWT_SECRET: ${DOCUMENT_SERVER_JWT_SECRET}
DOCUMENT_SERVER_JWT_HEADER: ${DOCUMENT_SERVER_JWT_HEADER}
DOCUMENT_SERVER_URL_PUBLIC: ${DOCUMENT_SERVER_URL_PUBLIC}
DOCUMENT_SERVER_URL_INTERNAL: ${DOCUMENT_SERVER_URL_INTERNAL}
KAFKA_HOST: ${KAFKA_HOST}
ELK_HOST: ${ELK_HOST}
PROXY_HOST: ${PROXY_HOST}
volumes:
environment:
MYSQL_HOST: ${MYSQL_HOST}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
DATABASE_MIGRATION: ${DATABASE_MIGRATION}
APP_DOTNET_ENV: ${APP_DOTNET_ENV}
APP_CORE_BASE_DOMAIN: ${APP_CORE_BASE_DOMAIN}
APP_CORE_MACHINEKEY: ${APP_CORE_MACHINEKEY}
DOCUMENT_SERVER_JWT_SECRET: ${DOCUMENT_SERVER_JWT_SECRET}
DOCUMENT_SERVER_JWT_HEADER: ${DOCUMENT_SERVER_JWT_HEADER}
DOCUMENT_SERVER_URL_PUBLIC: ${DOCUMENT_SERVER_URL_PUBLIC}
DOCUMENT_SERVER_URL_INTERNAL: ${DOCUMENT_SERVER_URL_INTERNAL}
KAFKA_HOST: ${KAFKA_HOST}
ELK_HOST: ${ELK_HOST}
PROXY_HOST: ${PROXY_HOST}
volumes:
#- /app/onlyoffice/CommunityServer/data:/app/onlyoffice/data
- app_data:/app/onlyoffice/data
- files_data:/var/www/products/ASC.Files/server/
- people_data:/var/www/products/ASC.People/server/
services:
services:
onlyoffice-elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}
container_name: ${ELK_HOST}
@ -58,7 +57,7 @@ services:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup:${DOCKER_TAG}"
container_name: ${BACKUP_HOST}
onlyoffice-clear-events:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}"
@ -78,7 +77,7 @@ services:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files-services:${DOCKER_TAG}"
container_name: ${FILES_SERVICES_HOST}
onlyoffice-people-server:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-people-server:${DOCKER_TAG}"
@ -89,8 +88,8 @@ services:
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-socket:${DOCKER_TAG}"
container_name: ${SOCKET_HOST}
expose:
- ${SERVICE_PORT}
- ${SERVICE_PORT}
onlyoffice-studio-notify:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}"
@ -106,8 +105,8 @@ services:
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-urlshortener:${DOCKER_TAG}"
container_name: ${URLSHORTENER_HOST}
expose:
- ${SERVICE_PORT}
- "9999"
- ${SERVICE_PORT}
- "9999"
onlyoffice-api:
<<: *x-service-base
@ -123,19 +122,19 @@ services:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}"
container_name: ${STUDIO_HOST}
onlyoffice-ssoauth:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}"
container_name: ${SSOAUTH_HOST}
expose:
- ${SERVICE_PORT}
- "9834"
- ${SERVICE_PORT}
- "9834"
onlyoffice-webhooks-service:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-webhooks-service:${DOCKER_TAG}"
container_name: ${WEBHOOKS_SERVICE_HOST}
container_name: ${WEBHOOKS_SERVICE_HOST}
onlyoffice-doceditor:
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-doceditor:${DOCKER_TAG}"
@ -160,7 +159,7 @@ services:
- "8099"
- "8092"
ports:
- 8092:8092
- 8092:8092
depends_on:
- onlyoffice-backup-background-tasks
- onlyoffice-backup
@ -206,8 +205,8 @@ services:
networks:
default:
external:
name: ${NETWORK_NAME}
name: ${NETWORK_NAME}
external: true
volumes:
es_data:

View File

@ -120,20 +120,6 @@ services:
target: webhooks-service
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-webhooks-service:${DOCKER_TAG}"
onlyoffice-bin-share:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: bin_share
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-bin-share:${DOCKER_TAG}"
onlyoffice-wait-bin-share:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: wait_bin_share
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-wait-bin-share:${DOCKER_TAG}"
onlyoffice-proxy:
build:
context: ./

View File

@ -1,4 +1,4 @@
#!/bin/bash
#!/bin/bash
MYSQL_HOST=${MYSQL_HOST:-"localhost"}
MYSQL_DATABASE=${MYSQL_DATABASE:-"onlyoffice"}
@ -7,4 +7,4 @@ MYSQL_PASSWORD=${MYSQL_PASSWORD:-"onlyoffice_pass"}
sed -i "s!\"ConnectionString\".*!\"ConnectionString\": \"Server=${MYSQL_HOST};Database=${MYSQL_DATABASE};User ID=${MYSQL_USER};Password=${MYSQL_PASSWORD}\",!g" ./appsettings.json
dotnet ASC.Migration.Runner.dll
dotnet ASC.Migration.Runner.dll

View File

@ -196,8 +196,8 @@ services:
networks:
default:
external:
name: ${NETWORK_NAME}
name: ${NETWORK_NAME}
external: true
volumes:
es_data:

View File

@ -13,5 +13,5 @@ services:
networks:
default:
external:
name: ${NETWORK_NAME}
name: ${NETWORK_NAME}
external: true

View File

@ -1,2 +1,3 @@
#!/bin/sh
envsubst '$MAP_HASH_BUCKET_SIZE,$COUNT_WORKER_CONNECTIONS' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
envsubst '$MAP_HASH_BUCKET_SIZE,$COUNT_WORKER_CONNECTIONS' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf

View File

@ -1,6 +1,6 @@
version: '3'
services:
onlyoffice-rabbitmq:
version: "3"
services:
onlyoffice-rabbitmq:
image: rabbitmq:3
container_name: onlyoffice-rabbitmq
restart: always
@ -9,5 +9,5 @@ services:
- "80"
networks:
default:
external:
name: ${NETWORK_NAME}
name: ${NETWORK_NAME}
external: true

View File

@ -1,6 +1,6 @@
version: '3'
services:
onlyoffice-redis:
version: "3"
services:
onlyoffice-redis:
image: redis:7
container_name: onlyoffice-redis
restart: always
@ -8,5 +8,5 @@ services:
- "6379"
networks:
default:
external:
name: ${NETWORK_NAME}
name: ${NETWORK_NAME}
external: true

View File

@ -0,0 +1,5 @@
# Stop all backend services"
& "$PSScriptRoot\stop.backend.docker.ps1"
# Start all backend services"
& "$PSScriptRoot\start.backend.docker.ps1"

View File

@ -0,0 +1,41 @@
$PSversionMajor = $PSVersionTable.PSVersion | sort-object major | ForEach-Object { $_.major }
$PSversionMinor = $PSVersionTable.PSVersion | sort-object minor | ForEach-Object { $_.minor }
if ($PSversionMajor -lt 7 -or $PSversionMinor -lt 2) {
Write-Error "Powershell version must be greater than or equal to 7.2."
exit
}
$Branch = git branch --show-current
$BranchExistRemote = git ls-remote --heads origin $Branch
if (-not $BranchExistRemote) {
Write-Error "The current branch does not exist in the remote repository. Please push changes."
exit
}
$RootDir = Split-Path (Split-Path -Parent $PSScriptRoot) -Parent
$DockerDir = ($RootDir + "\build\install\docker")
$BuildDate = Get-Date -Format "yyyy-MM-dd"
$LocalIp = (Get-WmiObject -Class Win32_NetworkAdapterConfiguration | Where-Object { $_.DHCPEnabled -ne $null -and $_.DefaultIPGateway -ne $null }).IPAddress | Select-Object -First 1
$Doceditor = ($LocalIp + ":5013")
$Login = ($LocalIp + ":5011")
$Client = ($LocalIp + ":5001")
$DockerFile = "Dockerfile.dev"
$EnvExtension = "dev"
$CoreBaseDomain = "localhost"
Write-Host "Start all backend services (containers)" -ForegroundColor Green
$Env:DOCKERFILE = $DockerFile
$Env:ROOT_DIR = $RootDir
$Env:RELEASE_DATE = $BuildDate
$Env:GIT_BRANCH = $Branch
$Env:SERVICE_DOCEDITOR = $Doceditor
$Env:SERVICE_LOGIN = $Login
$Env:SERVICE_CLIENT = $Client
$Env:APP_CORE_BASE_DOMAIN = $CoreBaseDomain
$Env:APP_URL_PORTAL = ("http://" + $LocalIp + ":8092")
$Env:ENV_EXTENSION = $EnvExtension
docker compose -f ($DockerDir + "\docspace.dev.yml") up -d

View File

@ -9,10 +9,17 @@ echo "Root directory:" $dir
cd $dir
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
branch=$(git branch --show-current)
echo "GIT_BRANCH:" $branch
branch_exist_remote=$(git ls-remote --heads origin $branch)
if [ -z "$branch_exist_remote" ]; then
echo "The current branch does not exist in the remote repository. Please push changes."
exit 1
fi
cd $dir/build/install/docker/
docker_dir="$( pwd )"

View File

@ -0,0 +1,17 @@
$PSversionMajor = $PSVersionTable.PSVersion | sort-object major | ForEach-Object { $_.major }
$PSversionMinor = $PSVersionTable.PSVersion | sort-object minor | ForEach-Object { $_.minor }
if ($PSversionMajor -lt 7 -or $PSversionMinor -lt 2) {
Write-Error "Powershell version must be greater than or equal to 7.2."
exit
}
$Containers = docker ps -a -f "name=^onlyoffice" --format="{{.ID}} {{.Names}}" | Select-String -Pattern ("mysql|rabbitmq|redis|elasticsearch|documentserver") -NotMatch | ConvertFrom-String | ForEach-Object P1
if (-not $Containers) {
Write-Host "No containers to stop" -ForegroundColor Blue
exit
}
Write-Host "Stop all backend services (containers)" -ForegroundColor Green
docker stop $Containers

View File

@ -59,7 +59,7 @@ public static class BaseDbContextExtension
{
case Provider.MySql:
optionsBuilder.ReplaceService<IMigrationsSqlGenerator, CustomMySqlMigrationsSqlGenerator>();
optionsBuilder.UseMySql(connectionString.ConnectionString, ServerVersion.Parse("8.0.25"), providerOptions =>
optionsBuilder.UseMySql(connectionString.ConnectionString, ServerVersion.AutoDetect(connectionString.ConnectionString), providerOptions =>
{
if (!string.IsNullOrEmpty(migrateAssembly))
{

View File

@ -11,14 +11,18 @@ module.exports = (socket, next) => {
const token = req?.headers?.authorization;
if (!cookie && !token) {
const err = new Error("Authentication error (not token or cookie)");
logger.error(err);
socket.disconnect("unauthorized");
next(new Error("Authentication error"));
next(err);
return;
}
if (token) {
if (!check(token)) {
next(new Error("Authentication error"));
const err = new Error("Authentication error (token check)");
logger.error(err);
next(err);
} else {
session.system = true;
session.save();
@ -33,7 +37,9 @@ module.exports = (socket, next) => {
Authorization: cookie,
};
const basePath = portalManager(req).replace(/\/$/g, "");
const basePath = portalManager(req)?.replace(/\/$/g, "");
logger.info(`API basePath='${basePath}' Authorization='${cookie}'`);
const getUser = () => {
return request({
@ -55,14 +61,15 @@ module.exports = (socket, next) => {
return Promise.all([getUser(), getPortal()])
.then(([user, portal]) => {
logger.info("Get account info", { user, portal });
session.user = user;
session.portal = portal;
session.save();
next();
})
.catch((err) => {
logger.error(err);
logger.error("Error of getting account info", err);
socket.disconnect("Unauthorized");
next(new Error("Authentication error"));
next(err);
});
};

View File

@ -1,7 +1,7 @@
const conf = require("../config");
const portalInternalUrl = conf.get("core")["base-domain"] === "localhost" ? "http://localhost" : "";
//const conf = require("../config");
//const portalInternalUrl = conf.get("core")["base-domain"] === "localhost" ? "http://localhost" : ""; //Do not use base-domain for portalInternalUrl
module.exports = (req) => {
if (portalInternalUrl) return portalInternalUrl;
//if (portalInternalUrl) return portalInternalUrl; //TODO: Fix internal api url setup after external api domain complete
const xRewriterUrlInternalHeader = "x-rewriter-url-internal";
if (req.headers && req.headers[xRewriterUrlInternalHeader]) {

View File

@ -0,0 +1 @@
{}

View File

@ -1,3 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8 16C12.4183 16 16 12.4183 16 8C16 3.58172 12.4183 0 8 0C3.58172 0 0 3.58172 0 8C0 12.4183 3.58172 16 8 16ZM5.92946 11.3447C6.38262 11.7704 7.11827 11.7704 7.57165 11.3447L12.705 6.52487C13.5659 5.66404 12.5449 4.32781 11.4764 5.39665L7.04492 9.57739C6.93026 9.68463 6.74449 9.68463 6.63005 9.57739L4.70054 7.7408C3.54497 6.58529 2.37389 8.00675 3.38509 8.95572L5.92946 11.3447Z" fill="#657077"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.0005 8C14.0005 7.75799 13.9862 7.51933 13.9583 7.28482L15.6364 5.60676C15.873 6.36243 16.0005 7.16632 16.0005 8C16.0005 12.4183 12.4188 16 8.00049 16C3.58221 16 0.000488281 12.4183 0.000488281 8C0.000488281 3.58172 3.58221 0 8.00049 0C9.37555 0 10.6696 0.34692 11.7998 0.95801L10.301 2.45685C9.59253 2.16249 8.81549 2 8.00049 2C4.68678 2 2.00049 4.68629 2.00049 8C2.00049 11.3137 4.68678 14 8.00049 14C11.3142 14 14.0005 11.3137 14.0005 8ZM14.2076 4.20678L7.7076 10.7068C7.31708 11.0973 6.68391 11.0973 6.29339 10.7068L3.29338 7.70677L4.7076 6.29256L7.0005 8.58546L12.7934 2.79257L14.2076 4.20678Z" fill="#657077"/>
</svg>

Before

Width:  |  Height:  |  Size: 550 B

After

Width:  |  Height:  |  Size: 772 B

View File

@ -102,9 +102,9 @@ const StyledComboBox = styled(ComboBox)`
}
.combo-buttons_arrow-icon {
margin-top: 12px;
margin-top: 6px;
margin-right: 8px;
margin-left: 0px;
margin-left: 2px;
}
padding: 0px;

View File

@ -2630,6 +2630,14 @@ class FilesStore {
setCreatedItem = (createdItem) => {
this.createdItem = createdItem;
const { socketHelper } = this.authStore.settingsStore;
if (createdItem?.type == "file") {
socketHelper.emit({
command: "subscribe",
data: `FILE-${createdItem.id}`,
});
}
};
setScrollToItem = (item) => {

View File

@ -138,7 +138,12 @@ const Article = ({
)}
{isAvailableArticlePaymentAlert &&
(isFreeTariff || isGracePeriod) &&
showText && <ArticlePaymentAlert isFreeTariff={isFreeTariff} />}
showText && (
<ArticlePaymentAlert
isFreeTariff={isFreeTariff}
toggleArticleOpen={toggleArticleOpen}
/>
)}
</SubArticleBody>
</StyledArticle>
{articleOpen && (isMobileOnly || window.innerWidth <= 375) && (

View File

@ -27,6 +27,7 @@ const ArticlePaymentAlert = ({
currencySymbol,
setPortalPaymentQuotas,
currentTariffPlanTitle,
toggleArticleOpen,
}) => {
const { t, ready } = useTranslation("Payments");
@ -40,6 +41,7 @@ const ArticlePaymentAlert = ({
"/payments/portal-payments"
);
history.push(paymentPageUrl);
toggleArticleOpen();
};
const isShowLoader = !ready;

View File

@ -1,6 +1,7 @@
import io from "socket.io-client";
let client = null;
let callbacks = [];
class SocketIOHelper {
socketUrl = null;
@ -21,7 +22,15 @@ class SocketIOHelper {
path: url,
});
client.on("connect", () => console.log("socket is connected"));
client.on("connect", () => {
console.log("socket is connected");
if (callbacks?.length > 0) {
callbacks.forEach(({ eventName, callback }) =>
client.on(eventName, callback)
);
callbacks = [];
}
});
client.on("connect_error", (err) =>
console.log("socket connect error", err)
);
@ -49,7 +58,10 @@ class SocketIOHelper {
};
on = (eventName, callback) => {
if (!this.isEnabled) return;
if (!this.isEnabled) {
callbacks.push({ eventName, callback });
return;
}
if (!client.connected) {
client.on("connect", () => {

View File

@ -216,6 +216,8 @@ function Editor({
const onSDKRequestEditRights = async () => {
console.log("ONLYOFFICE Document Editor requests editing rights");
const url = window.location.href;
const index = url.indexOf("&action=view");
if (index) {
@ -233,6 +235,8 @@ function Editor({
};
const onMakeActionLink = (event) => {
const url = window.location.href;
const actionData = event.data;
const link = generateLink(actionData);
@ -370,33 +374,33 @@ function Editor({
assign(window, ["ASC", "Files", "Editor", "docEditor"], docEditor); //Do not remove: it's for Back button on Mobile App
};
const updateFavorite = (favorite) => {
docEditor.setFavorite(favorite);
};
// const updateFavorite = (favorite) => {
// docEditor.setFavorite(favorite);
// };
const onMetaChange = (event) => {
const newTitle = event.data.title;
const favorite = event.data.favorite;
//const favorite = event.data.favorite;
if (newTitle && newTitle !== docTitle) {
setDocumentTitle(newTitle);
docTitle = newTitle;
}
if (!newTitle) {
const onlyNumbers = new RegExp("^[0-9]+$");
const isFileWithoutProvider = onlyNumbers.test(fileId);
// if (!newTitle) {
// const onlyNumbers = new RegExp("^[0-9]+$");
// const isFileWithoutProvider = onlyNumbers.test(fileId);
const convertFileId = isFileWithoutProvider ? +fileId : fileId;
// const convertFileId = isFileWithoutProvider ? +fileId : fileId;
favorite
? markAsFavorite([convertFileId])
.then(() => updateFavorite(favorite))
.catch((error) => console.log("error", error))
: removeFromFavorite([convertFileId])
.then(() => updateFavorite(favorite))
.catch((error) => console.log("error", error));
}
// favorite
// ? markAsFavorite([convertFileId])
// .then(() => updateFavorite(favorite))
// .catch((error) => console.log("error", error))
// : removeFromFavorite([convertFileId])
// .then(() => updateFavorite(favorite))
// .catch((error) => console.log("error", error));
// }
};
const setDocumentTitle = (subTitle = null) => {
@ -417,6 +421,10 @@ function Editor({
} else {
title = organizationName;
}
if (!documentIsReady) {
docTitle = title;
}
document.title = title;
};
@ -441,8 +449,10 @@ function Editor({
if (index > -1) {
const splitUrl = url.split("#message/");
if (splitUrl.length === 2) {
const message = decodeURIComponent(raw).replace(/\+/g, " ");
const message = decodeURIComponent(splitUrl[1]).replace(/\+/g, " ");
docEditor.showMessage(message);
history.pushState({}, null, url.substring(0, index));
} else {
@ -528,7 +538,8 @@ function Editor({
onRequestInsertImage,
onRequestMailMergeRecipients,
onRequestCompareFile,
onRequestRestore;
onRequestRestore,
onRequestHistory;
// if (isSharingAccess) {
// onRequestSharingSettings = onSDKRequestSharingSettings;
@ -538,6 +549,10 @@ function Editor({
onRequestRename = onSDKRequestRename;
}
if (userAccessRights.viewVersionHistory) {
onRequestHistory = onSDKRequestHistory;
}
if (successAuth && !user.isVisitor) {
onRequestSaveAs = onSDKRequestSaveAs;
}
@ -569,7 +584,7 @@ function Editor({
onRequestMailMergeRecipients,
onRequestCompareFile,
onRequestEditRights: onSDKRequestEditRights,
onRequestHistory: onSDKRequestHistory,
onRequestHistory: onRequestHistory,
onRequestHistoryClose: onSDKRequestHistoryClose,
onRequestHistoryData: onSDKRequestHistoryData,
onRequestRestore,

View File

@ -26,7 +26,7 @@
namespace ASC.Web.Files;
[Scope]
[Scope(Additional = typeof(FilesSpaceUsageStatExtension))]
public class FilesSpaceUsageStatManager : SpaceUsageStatManager, IUserSpaceUsage
{
private readonly IDbContextFactory<FilesDbContext> _dbContextFactory;
@ -139,5 +139,12 @@ public class FilesSpaceUsageStatManager : SpaceUsageStatManager, IUserSpaceUsage
new TenantQuotaRow { Tenant = TenantId, Path = $"/{FileConstant.ModuleId}/", Counter = size, Tag = WebItemManager.DocumentsProductID.ToString(), UserId = userId, LastModified = DateTime.UtcNow },
false);
}
}
}
public static class FilesSpaceUsageStatExtension
{
public static void Register(DIHelper services)
{
services.ServiceCollection.AddBaseDbContextPool<FilesDbContext>();
}
}