Merge branch 'develop' into feature/socket-newtag

This commit is contained in:
Alexey Safronov 2022-11-25 17:17:31 +03:00
commit 1b7844b44a
47 changed files with 1052 additions and 5141 deletions

View File

@ -74,14 +74,10 @@ services_name_backend+=(ASC.Data.Backup)
services_name_backend+=(ASC.Files.Service) services_name_backend+=(ASC.Files.Service)
services_name_backend+=(ASC.Notify) services_name_backend+=(ASC.Notify)
services_name_backend+=(ASC.Studio.Notify) services_name_backend+=(ASC.Studio.Notify)
services_name_backend+=(ASC.TelegramService)
services_name_backend+=(ASC.UrlShortener.Svc)
services_name_backend+=(ASC.Web.Api) services_name_backend+=(ASC.Web.Api)
services_name_backend+=(ASC.Web.Studio) services_name_backend+=(ASC.Web.Studio)
services_name_backend+=(ASC.Data.Backup.BackgroundTasks) services_name_backend+=(ASC.Data.Backup.BackgroundTasks)
services_name_backend+=(ASC.ClearEvents) services_name_backend+=(ASC.ClearEvents)
services_name_backend+=(ASC.Migration)
services_name_backend+=(ASC.Webhooks.Service)
services_name_backend+=(ASC.ApiSystem) services_name_backend+=(ASC.ApiSystem)
# Publish backend services # Publish backend services
@ -94,7 +90,6 @@ done
# Array of names backend services in directory common (Nodejs) # Array of names backend services in directory common (Nodejs)
services_name_backend_nodejs=() services_name_backend_nodejs=()
services_name_backend_nodejs+=(ASC.UrlShortener)
services_name_backend_nodejs+=(ASC.Socket.IO) services_name_backend_nodejs+=(ASC.Socket.IO)
services_name_backend_nodejs+=(ASC.SsoAuth) services_name_backend_nodejs+=(ASC.SsoAuth)

View File

@ -54,9 +54,6 @@
BACKUP_HOST=${CONTAINER_PREFIX}backup BACKUP_HOST=${CONTAINER_PREFIX}backup
BACKUP_BACKGRUOND_TASKS_HOST=${CONTAINER_PREFIX}backup-background-tasks BACKUP_BACKGRUOND_TASKS_HOST=${CONTAINER_PREFIX}backup-background-tasks
CLEAR_EVENTS_HOST=${CONTAINER_PREFIX}clear-events CLEAR_EVENTS_HOST=${CONTAINER_PREFIX}clear-events
MIGRATION_HOST=${CONTAINER_PREFIX}migration
WEBHOOKS_SERVICE_HOST=${CONTAINER_PREFIX}webhooks-service
STORAGE_ENCRYPTION_HOST=${CONTAINER_PREFIX}storage-encryption
FILES_HOST=${CONTAINER_PREFIX}files FILES_HOST=${CONTAINER_PREFIX}files
FILES_SERVICES_HOST=${CONTAINER_PREFIX}files-services FILES_SERVICES_HOST=${CONTAINER_PREFIX}files-services
STORAGE_MIGRATION_HOST=${CONTAINER_PREFIX}storage-migration STORAGE_MIGRATION_HOST=${CONTAINER_PREFIX}storage-migration
@ -64,8 +61,6 @@
PEOPLE_SERVER_HOST=${CONTAINER_PREFIX}people-server PEOPLE_SERVER_HOST=${CONTAINER_PREFIX}people-server
SOCKET_HOST=${CONTAINER_PREFIX}socket SOCKET_HOST=${CONTAINER_PREFIX}socket
STUDIO_NOTIFY_HOST=${CONTAINER_PREFIX}studio-notify STUDIO_NOTIFY_HOST=${CONTAINER_PREFIX}studio-notify
TELEGRAM_SERVICE_HOST=${CONTAINER_PREFIX}telegram-service
URLSHORTENER_HOST=${CONTAINER_PREFIX}urlshortener
API_HOST=${CONTAINER_PREFIX}api API_HOST=${CONTAINER_PREFIX}api
STUDIO_HOST=${CONTAINER_PREFIX}studio STUDIO_HOST=${CONTAINER_PREFIX}studio
SSOAUTH_HOST=${CONTAINER_PREFIX}ssoauth SSOAUTH_HOST=${CONTAINER_PREFIX}ssoauth
@ -79,9 +74,6 @@
SERVICE_BACKUP=${BACKUP_HOST}:${SERVICE_PORT} SERVICE_BACKUP=${BACKUP_HOST}:${SERVICE_PORT}
SERVICE_BACKUP_BACKGRUOND_TASKS=${BACKUP_BACKGRUOND_TASKS_HOST}:${SERVICE_PORT} SERVICE_BACKUP_BACKGRUOND_TASKS=${BACKUP_BACKGRUOND_TASKS_HOST}:${SERVICE_PORT}
SERVICE_CLEAR_EVENTS=${CLEAR_EVENTS_HOST}:${SERVICE_PORT} SERVICE_CLEAR_EVENTS=${CLEAR_EVENTS_HOST}:${SERVICE_PORT}
SERVICE_MIGRATION=${MIGRATION_HOST}:${SERVICE_PORT}
SERVICE_WEBHOOKS_SERVICE=${WEBHOOKS_SERVICE_HOST}:${SERVICE_PORT}
SERVICE_STORAGE_ENCRYPTION=${STORAGE_ENCRYPTION_HOST}:${SERVICE_PORT}
SERVICE_FILES=${FILES_HOST}:${SERVICE_PORT} SERVICE_FILES=${FILES_HOST}:${SERVICE_PORT}
SERVICE_FILES_SERVICES=${FILES_SERVICES_HOST}:${SERVICE_PORT} SERVICE_FILES_SERVICES=${FILES_SERVICES_HOST}:${SERVICE_PORT}
SERVICE_STORAGE_MIGRATION=${STORAGE_MIGRATION_HOST}:${SERVICE_PORT} SERVICE_STORAGE_MIGRATION=${STORAGE_MIGRATION_HOST}:${SERVICE_PORT}
@ -89,8 +81,6 @@
SERVICE_PEOPLE_SERVER=${PEOPLE_SERVER_HOST}:${SERVICE_PORT} SERVICE_PEOPLE_SERVER=${PEOPLE_SERVER_HOST}:${SERVICE_PORT}
SERVICE_SOCKET=${SOCKET_HOST}:${SERVICE_PORT} SERVICE_SOCKET=${SOCKET_HOST}:${SERVICE_PORT}
SERVICE_STUDIO_NOTIFY=${STUDIO_NOTIFY_HOST}:${SERVICE_PORT} SERVICE_STUDIO_NOTIFY=${STUDIO_NOTIFY_HOST}:${SERVICE_PORT}
SERVICE_TELEGRAM_SERVICE=${TELEGRAM_SERVICE_HOST}:${SERVICE_PORT}
SERVICE_URLSHORTENER=${URLSHORTENER_HOST}:${SERVICE_PORT}
SERVICE_API=${API_HOST}:${SERVICE_PORT} SERVICE_API=${API_HOST}:${SERVICE_PORT}
SERVICE_STUDIO=${STUDIO_HOST}:${SERVICE_PORT} SERVICE_STUDIO=${STUDIO_HOST}:${SERVICE_PORT}
SERVICE_SSOAUTH=${SSOAUTH_HOST}:${SERVICE_PORT} SERVICE_SSOAUTH=${SSOAUTH_HOST}:${SERVICE_PORT}

View File

@ -150,18 +150,12 @@ RUN chown nginx:nginx /etc/nginx/* -R && \
# changes for upstream configure # changes for upstream configure
sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5021/$service_crm/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5020/$service_projects_server/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5000/$service_api/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5000/$service_api/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5023/$service_calendar/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5022/$service_mail/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9999/$service_urlshortener/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5034/$service_migration/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/$public_root/\/var\/www\/public\//' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/$public_root/\/var\/www\/public\//' /etc/nginx/conf.d/onlyoffice.conf && \
@ -212,15 +206,6 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.ClearE
CMD ["ASC.ClearEvents.dll", "ASC.ClearEvents"] CMD ["ASC.ClearEvents.dll", "ASC.ClearEvents"]
## ASC.Migration ##
FROM dotnetrun AS migration
WORKDIR ${BUILD_PATH}/services/ASC.Migration/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Migration/service/ .
CMD ["ASC.Migration.dll", "ASC.Migration"]
## ASC.Data.Backup ## ## ASC.Data.Backup ##
FROM dotnetrun AS backup FROM dotnetrun AS backup
WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup/ WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup/
@ -293,24 +278,6 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Studio
CMD ["ASC.Studio.Notify.dll", "ASC.Studio.Notify"] CMD ["ASC.Studio.Notify.dll", "ASC.Studio.Notify"]
## ASC.TelegramService ##
FROM dotnetrun AS telegram_service
WORKDIR ${BUILD_PATH}/services/ASC.TelegramService/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.TelegramService/service/ .
CMD ["ASC.TelegramService.dll", "ASC.TelegramService"]
## ASC.UrlShortener ##
FROM noderun AS urlshortener
WORKDIR ${BUILD_PATH}/services/ASC.UrlShortener/service/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.UrlShortener/service/ .
CMD ["index.js", "ASC.UrlShortener"]
## ASC.Web.Api ## ## ASC.Web.Api ##
FROM dotnetrun AS api FROM dotnetrun AS api
WORKDIR ${BUILD_PATH}/studio/ASC.Web.Api/ WORKDIR ${BUILD_PATH}/studio/ASC.Web.Api/
@ -320,15 +287,6 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Web.Ap
CMD ["ASC.Web.Api.dll", "ASC.Web.Api"] CMD ["ASC.Web.Api.dll", "ASC.Web.Api"]
## ASC.Webhooks.Service ##
FROM dotnetrun AS webhooks-service
WORKDIR ${BUILD_PATH}/services/ASC.Webhooks.Service/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Webhooks.Service/service/ .
CMD ["ASC.Webhooks.Service.dll", "ASC.Webhooks.Service"]
## ASC.Web.Studio ## ## ASC.Web.Studio ##
FROM dotnetrun AS studio FROM dotnetrun AS studio
WORKDIR ${BUILD_PATH}/studio/ASC.Web.Studio/ WORKDIR ${BUILD_PATH}/studio/ASC.Web.Studio/

View File

@ -150,7 +150,7 @@ RUN dos2unix /docker-entrypoint.d/prepare-nginx-proxy.sh && \
RUN chown nginx:nginx /etc/nginx/* -R && \ RUN chown nginx:nginx /etc/nginx/* -R && \
chown nginx:nginx /docker-entrypoint.d/* && \ chown nginx:nginx /docker-entrypoint.d/* && \
# changes for upstream configure # changes for upstream configure
sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \ # sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \
@ -158,8 +158,8 @@ RUN chown nginx:nginx /etc/nginx/* -R && \
sed -i 's/127.0.0.1:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9999/$service_urlshortener/' /etc/nginx/conf.d/onlyoffice.conf && \ # sed -i 's/127.0.0.1:9999/$service_urlshortener/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5034/$service_migration/' /etc/nginx/conf.d/onlyoffice.conf && \ # sed -i 's/127.0.0.1:5034/$service_migration/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5001/$service_client/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5001/$service_client/' /etc/nginx/conf.d/onlyoffice.conf && \

View File

@ -63,11 +63,6 @@ services:
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}" image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}"
container_name: ${CLEAR_EVENTS_HOST} container_name: ${CLEAR_EVENTS_HOST}
onlyoffice-migration:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration:${DOCKER_TAG}"
container_name: ${MIGRATION_HOST}
onlyoffice-files: onlyoffice-files:
<<: *x-service-base <<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files:${DOCKER_TAG}" image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files:${DOCKER_TAG}"
@ -95,19 +90,6 @@ services:
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}" image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}"
container_name: ${STUDIO_NOTIFY_HOST} container_name: ${STUDIO_NOTIFY_HOST}
onlyoffice-telegram-service:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-telegram-service:${DOCKER_TAG}"
container_name: ${TELEGRAM_SERVICE_HOST}
onlyoffice-urlshortener:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-urlshortener:${DOCKER_TAG}"
container_name: ${URLSHORTENER_HOST}
expose:
- ${SERVICE_PORT}
- "9999"
onlyoffice-api: onlyoffice-api:
<<: *x-service-base <<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}" image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
@ -131,11 +113,6 @@ services:
- ${SERVICE_PORT} - ${SERVICE_PORT}
- "9834" - "9834"
onlyoffice-webhooks-service:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-webhooks-service:${DOCKER_TAG}"
container_name: ${WEBHOOKS_SERVICE_HOST}
onlyoffice-doceditor: onlyoffice-doceditor:
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-doceditor:${DOCKER_TAG}" image: "${REPO}/${DOCKER_IMAGE_PREFIX}-doceditor:${DOCKER_TAG}"
container_name: ${DOCEDITOR_HOST} container_name: ${DOCEDITOR_HOST}
@ -164,15 +141,11 @@ services:
- onlyoffice-backup-background-tasks - onlyoffice-backup-background-tasks
- onlyoffice-backup - onlyoffice-backup
- onlyoffice-clear-events - onlyoffice-clear-events
- onlyoffice-migration
- onlyoffice-webhooks-service
- onlyoffice-files - onlyoffice-files
- onlyoffice-files-services - onlyoffice-files-services
- onlyoffice-people-server - onlyoffice-people-server
- onlyoffice-socket - onlyoffice-socket
- onlyoffice-studio-notify - onlyoffice-studio-notify
- onlyoffice-telegram-service
- onlyoffice-urlshortener
- onlyoffice-api - onlyoffice-api
- onlyoffice-api-system - onlyoffice-api-system
- onlyoffice-studio - onlyoffice-studio
@ -184,14 +157,10 @@ services:
- SERVICE_FILES=${SERVICE_FILES} - SERVICE_FILES=${SERVICE_FILES}
- SERVICE_FILES_SERVICES=${SERVICE_FILES_SERVICES} - SERVICE_FILES_SERVICES=${SERVICE_FILES_SERVICES}
- SERVICE_CLEAR_EVENTS=${SERVICE_CLEAR_EVENTS} - SERVICE_CLEAR_EVENTS=${SERVICE_CLEAR_EVENTS}
- SERVICE_MIGRATION=${SERVICE_MIGRATION}
- SERVICE_WEBHOOKS_SERVICE=${SERVICE_WEBHOOKS_SERVICE}
- SERVICE_NOTIFY=${SERVICE_NOTIFY} - SERVICE_NOTIFY=${SERVICE_NOTIFY}
- SERVICE_PEOPLE_SERVER=${SERVICE_PEOPLE_SERVER} - SERVICE_PEOPLE_SERVER=${SERVICE_PEOPLE_SERVER}
- SERVICE_SOCKET=${SERVICE_SOCKET} - SERVICE_SOCKET=${SERVICE_SOCKET}
- SERVICE_STUDIO_NOTIFY=${SERVICE_STUDIO_NOTIFY} - SERVICE_STUDIO_NOTIFY=${SERVICE_STUDIO_NOTIFY}
- SERVICE_TELEGRAM_SERVICE=${SERVICE_TELEGRAM_SERVICE}
- SERVICE_URLSHORTENER=${SERVICE_URLSHORTENER}
- SERVICE_API=${SERVICE_API} - SERVICE_API=${SERVICE_API}
- SERVICE_API_SYSTEM=${SERVICE_API_SYSTEM} - SERVICE_API_SYSTEM=${SERVICE_API_SYSTEM}
- SERVICE_STUDIO=${SERVICE_STUDIO} - SERVICE_STUDIO=${SERVICE_STUDIO}

View File

@ -15,13 +15,6 @@ services:
target: clear-events target: clear-events
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}" image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}"
onlyoffice-migration:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: migration
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration:${DOCKER_TAG}"
onlyoffice-backup: onlyoffice-backup:
build: build:
context: ./ context: ./
@ -71,20 +64,6 @@ services:
target: studio_notify target: studio_notify
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}" image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}"
onlyoffice-telegram-service:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: telegram_service
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-telegram-service:${DOCKER_TAG}"
onlyoffice-urlshortener:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: urlshortener
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-urlshortener:${DOCKER_TAG}"
onlyoffice-api: onlyoffice-api:
build: build:
context: ./ context: ./
@ -113,13 +92,6 @@ services:
target: ssoauth target: ssoauth
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}" image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}"
onlyoffice-webhooks-service:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: webhooks-service
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-webhooks-service:${DOCKER_TAG}"
onlyoffice-bin-share: onlyoffice-bin-share:
build: build:
context: ./ context: ./

View File

@ -15,11 +15,6 @@ map $SERVICE_CLIENT $service_client {
$SERVICE_CLIENT $SERVICE_CLIENT; $SERVICE_CLIENT $SERVICE_CLIENT;
} }
map $SERVICE_MIGRATION $service_migration {
volatile;
$SERVICE_MIGRATION $SERVICE_MIGRATION;
}
map $SERVICE_API_SYSTEM $service_api_system { map $SERVICE_API_SYSTEM $service_api_system {
volatile; volatile;
$SERVICE_API_SYSTEM $SERVICE_API_SYSTEM; $SERVICE_API_SYSTEM $SERVICE_API_SYSTEM;
@ -30,21 +25,6 @@ map $SERVICE_BACKUP $service_backup {
$SERVICE_BACKUP $SERVICE_BACKUP; $SERVICE_BACKUP $SERVICE_BACKUP;
} }
map $SERVICE_CALENDAR $service_calendar {
volatile;
$SERVICE_CALENDAR $SERVICE_CALENDAR;
}
map $SERVICE_CRM $service_crm {
volatile;
$SERVICE_CRM $SERVICE_CRM;
}
map $SERVICE_STORAGE_ENCRYPTION $service_storage_encryption {
volatile;
$SERVICE_STORAGE_ENCRYPTION $SERVICE_STORAGE_ENCRYPTION;
}
map $SERVICE_FILES $service_files { map $SERVICE_FILES $service_files {
volatile; volatile;
$SERVICE_FILES $SERVICE_FILES; $SERVICE_FILES $SERVICE_FILES;
@ -55,16 +35,6 @@ map $SERVICE_FILES_SERVICES $service_files_services {
$SERVICE_FILES_SERVICES $SERVICE_FILES_SERVICES; $SERVICE_FILES_SERVICES $SERVICE_FILES_SERVICES;
} }
map $SERVICE_MAIL $service_mail {
volatile;
$SERVICE_MAIL $SERVICE_MAIL;
}
map $SERVICE_STORAGE_MIGRATION $service_storage_migration {
volatile;
$SERVICE_STORAGE_MIGRATION $SERVICE_STORAGE_MIGRATION;
}
map $SERVICE_NOTIFY $service_notify { map $SERVICE_NOTIFY $service_notify {
volatile; volatile;
$SERVICE_NOTIFY $SERVICE_NOTIFY; $SERVICE_NOTIFY $SERVICE_NOTIFY;
@ -75,11 +45,6 @@ map $SERVICE_PEOPLE_SERVER $service_people_server {
$SERVICE_PEOPLE_SERVER $SERVICE_PEOPLE_SERVER; $SERVICE_PEOPLE_SERVER $SERVICE_PEOPLE_SERVER;
} }
map $SERVICE_PROJECTS_SERVER $service_projects_server {
volatile;
$SERVICE_PROJECTS_SERVER $SERVICE_PROJECTS_SERVER;
}
map $SERVICE_SOCKET $service_socket { map $SERVICE_SOCKET $service_socket {
volatile; volatile;
$SERVICE_SOCKET $SERVICE_SOCKET; $SERVICE_SOCKET $SERVICE_SOCKET;
@ -90,21 +55,11 @@ map $SERVICE_STUDIO_NOTIFY $service_studio_notify {
$SERVICE_STUDIO_NOTIFY $SERVICE_STUDIO_NOTIFY; $SERVICE_STUDIO_NOTIFY $SERVICE_STUDIO_NOTIFY;
} }
map $SERVICE_TELEGRAM_SERVICE $service_telegram_service {
volatile;
$SERVICE_TELEGRAM_SERVICE $SERVICE_TELEGRAM_SERVICE;
}
map $SERVICE_THUMBNAILS $service_thumbnails { map $SERVICE_THUMBNAILS $service_thumbnails {
volatile; volatile;
$SERVICE_THUMBNAILS $SERVICE_THUMBNAILS; $SERVICE_THUMBNAILS $SERVICE_THUMBNAILS;
} }
map $SERVICE_URLSHORTENER $service_urlshortener {
volatile;
$SERVICE_URLSHORTENER $SERVICE_URLSHORTENER;
}
map $SERVICE_API $service_api { map $SERVICE_API $service_api {
volatile; volatile;
$SERVICE_API $SERVICE_API; $SERVICE_API $SERVICE_API;

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -21,7 +21,6 @@ MYSQL_HOST = os.environ["MYSQL_HOST"] if environ.get("MYSQL_HOST") else "localho
MYSQL_DATABASE = os.environ["MYSQL_DATABASE"] if environ.get("MYSQL_DATABASE") else "onlyoffice" MYSQL_DATABASE = os.environ["MYSQL_DATABASE"] if environ.get("MYSQL_DATABASE") else "onlyoffice"
MYSQL_USER = os.environ["MYSQL_USER"] if environ.get("MYSQL_USER") else "onlyoffice_user" MYSQL_USER = os.environ["MYSQL_USER"] if environ.get("MYSQL_USER") else "onlyoffice_user"
MYSQL_PASSWORD = os.environ["MYSQL_PASSWORD"] if environ.get("MYSQL_PASSWORD") else "onlyoffice_pass" MYSQL_PASSWORD = os.environ["MYSQL_PASSWORD"] if environ.get("MYSQL_PASSWORD") else "onlyoffice_pass"
DATABASE_MIGRATION = os.environ["DATABASE_MIGRATION"] if environ.get("DATABASE_MIGRATION") else "false"
APP_CORE_BASE_DOMAIN = os.environ["APP_CORE_BASE_DOMAIN"] if environ.get("APP_CORE_BASE_DOMAIN") is not None else "localhost" APP_CORE_BASE_DOMAIN = os.environ["APP_CORE_BASE_DOMAIN"] if environ.get("APP_CORE_BASE_DOMAIN") is not None else "localhost"
APP_CORE_MACHINEKEY = os.environ["APP_CORE_MACHINEKEY"] if environ.get("APP_CORE_MACHINEKEY") else "your_core_machinekey" APP_CORE_MACHINEKEY = os.environ["APP_CORE_MACHINEKEY"] if environ.get("APP_CORE_MACHINEKEY") else "your_core_machinekey"
@ -128,13 +127,11 @@ updateJsonData(jsonData,"$.core.base-domain", APP_CORE_BASE_DOMAIN)
updateJsonData(jsonData,"$.core.machinekey", APP_CORE_MACHINEKEY) updateJsonData(jsonData,"$.core.machinekey", APP_CORE_MACHINEKEY)
updateJsonData(jsonData,"$.core.products.subfolder", "server") updateJsonData(jsonData,"$.core.products.subfolder", "server")
updateJsonData(jsonData,"$.web.hub.internal", "http://onlyoffice-socket:" + SERVICE_PORT + "/") updateJsonData(jsonData,"$.web.hub.internal", "http://onlyoffice-socket:" + SERVICE_PORT + "/")
updateJsonData(jsonData,"$.web.url-shortener.internal", "http://onlyoffice-urlshortener:" + SERVICE_PORT + "/")
updateJsonData(jsonData,"$.files.docservice.url.portal", APP_URL_PORTAL) updateJsonData(jsonData,"$.files.docservice.url.portal", APP_URL_PORTAL)
updateJsonData(jsonData,"$.files.docservice.url.public", DOCUMENT_SERVER_URL_PUBLIC) updateJsonData(jsonData,"$.files.docservice.url.public", DOCUMENT_SERVER_URL_PUBLIC)
updateJsonData(jsonData,"$.files.docservice.url.internal", DOCUMENT_SERVER_URL_INTERNAL) updateJsonData(jsonData,"$.files.docservice.url.internal", DOCUMENT_SERVER_URL_INTERNAL)
updateJsonData(jsonData,"$.files.docservice.secret.value", DOCUMENT_SERVER_JWT_SECRET) updateJsonData(jsonData,"$.files.docservice.secret.value", DOCUMENT_SERVER_JWT_SECRET)
updateJsonData(jsonData,"$.files.docservice.secret.header", DOCUMENT_SERVER_JWT_HEADER) updateJsonData(jsonData,"$.files.docservice.secret.header", DOCUMENT_SERVER_JWT_HEADER)
updateJsonData(jsonData,"$.migration.enabled", DATABASE_MIGRATION)
writeJsonFile(filePath, jsonData) writeJsonFile(filePath, jsonData)
filePath = "/app/onlyoffice/config/elastic.json" filePath = "/app/onlyoffice/config/elastic.json"

View File

@ -173,14 +173,14 @@ services:
- SERVICE_CLEAR_EVENTS=${SERVICE_CLEAR_EVENTS} - SERVICE_CLEAR_EVENTS=${SERVICE_CLEAR_EVENTS}
# - SERVICE_MIGRATION=${SERVICE_MIGRATION} # - SERVICE_MIGRATION=${SERVICE_MIGRATION}
# - SERVICE_WEBHOOKS_SERVICE=${SERVICE_WEBHOOKS_SERVICE} # - SERVICE_WEBHOOKS_SERVICE=${SERVICE_WEBHOOKS_SERVICE}
# - SERVICE_NOTIFY=${SERVICE_NOTIFY} - SERVICE_NOTIFY=${SERVICE_NOTIFY}
- SERVICE_PEOPLE_SERVER=${SERVICE_PEOPLE_SERVER} - SERVICE_PEOPLE_SERVER=${SERVICE_PEOPLE_SERVER}
- SERVICE_SOCKET=${SERVICE_SOCKET} - SERVICE_SOCKET=${SERVICE_SOCKET}
- SERVICE_STUDIO_NOTIFY=${SERVICE_STUDIO_NOTIFY} - SERVICE_STUDIO_NOTIFY=${SERVICE_STUDIO_NOTIFY}
# - SERVICE_TELEGRAM_SERVICE=${SERVICE_TELEGRAM_SERVICE} # - SERVICE_TELEGRAM_SERVICE=${SERVICE_TELEGRAM_SERVICE}
# - SERVICE_URLSHORTENER=${SERVICE_URLSHORTENER} # - SERVICE_URLSHORTENER=${SERVICE_URLSHORTENER}
- SERVICE_API=${SERVICE_API} - SERVICE_API=${SERVICE_API}
# - SERVICE_API_SYSTEM=${SERVICE_API_SYSTEM} - SERVICE_API_SYSTEM=${SERVICE_API_SYSTEM}
- SERVICE_STUDIO=${SERVICE_STUDIO} - SERVICE_STUDIO=${SERVICE_STUDIO}
- SERVICE_SSOAUTH=${SERVICE_SSOAUTH} - SERVICE_SSOAUTH=${SERVICE_SSOAUTH}
- SERVICE_DOCEDITOR=${SERVICE_DOCEDITOR} - SERVICE_DOCEDITOR=${SERVICE_DOCEDITOR}

View File

@ -17,7 +17,7 @@ if (-not $BranchExistRemote) {
$RootDir = Split-Path (Split-Path -Parent $PSScriptRoot) -Parent $RootDir = Split-Path (Split-Path -Parent $PSScriptRoot) -Parent
$DockerDir = ($RootDir + "\build\install\docker") $DockerDir = ($RootDir + "\build\install\docker")
$BuildDate = Get-Date -Format "yyyy-MM-dd" $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 $LocalIp = (Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | Where-Object { $_.DHCPEnabled -ne $null -and $_.DefaultIPGateway -ne $null }).IPAddress | Select-Object -First 1
$Doceditor = ($LocalIp + ":5013") $Doceditor = ($LocalIp + ":5013")
$Login = ($LocalIp + ":5011") $Login = ($LocalIp + ":5011")

View File

@ -62,11 +62,7 @@ public static class ISetupBuilderExtension
var awsSecretAccessKey = string.IsNullOrEmpty(settings.AWSSecretAccessKey) ? configuration["aws:cloudWatch:secretAccessKey"] : settings.AWSSecretAccessKey; var awsSecretAccessKey = string.IsNullOrEmpty(settings.AWSSecretAccessKey) ? configuration["aws:cloudWatch:secretAccessKey"] : settings.AWSSecretAccessKey;
if (!string.IsNullOrEmpty(awsAccessKeyId)) if (!string.IsNullOrEmpty(awsAccessKeyId))
{ {
awsTarget.LogGroup = String.IsNullOrEmpty(configuration["aws:cloudWatch:logGroupName"]) ? awsTarget.LogGroup : configuration["aws:cloudWatch:logGroupName"];
awsTarget.Region = String.IsNullOrEmpty(configuration["aws:cloudWatch:region"]) ? awsTarget.Region : configuration["aws:cloudWatch:region"];
awsTarget.Credentials = new Amazon.Runtime.BasicAWSCredentials(awsAccessKeyId, awsSecretAccessKey); awsTarget.Credentials = new Amazon.Runtime.BasicAWSCredentials(awsAccessKeyId, awsSecretAccessKey);
} }
} }

View File

@ -185,10 +185,18 @@ public class DIHelper
public bool TryAdd(Type service, Type implementation = null) public bool TryAdd(Type service, Type implementation = null)
{ {
if (service.IsInterface && service.IsGenericType && implementation == null && Type serviceGenericTypeDefinition = null;
(service.GetGenericTypeDefinition() == typeof(IOptionsSnapshot<>) ||
service.GetGenericTypeDefinition() == typeof(IOptions<>) || if (service.IsGenericType)
service.GetGenericTypeDefinition() == typeof(IOptionsMonitor<>) {
serviceGenericTypeDefinition = service.GetGenericTypeDefinition();
}
if (service.IsInterface && serviceGenericTypeDefinition != null && implementation == null &&
(
serviceGenericTypeDefinition == typeof(IOptionsSnapshot<>) ||
serviceGenericTypeDefinition == typeof(IOptions<>) ||
serviceGenericTypeDefinition == typeof(IOptionsMonitor<>)
)) ))
{ {
service = service.GetGenericArguments().FirstOrDefault(); service = service.GetGenericArguments().FirstOrDefault();
@ -208,10 +216,10 @@ public class DIHelper
Added.Add(serviceName); Added.Add(serviceName);
var di = service.IsGenericType && ( var di = serviceGenericTypeDefinition != null && (
service.GetGenericTypeDefinition() == typeof(IConfigureOptions<>) || serviceGenericTypeDefinition == typeof(IConfigureOptions<>) ||
service.GetGenericTypeDefinition() == typeof(IPostConfigureOptions<>) || serviceGenericTypeDefinition == typeof(IPostConfigureOptions<>) ||
service.GetGenericTypeDefinition() == typeof(IOptionsMonitor<>) serviceGenericTypeDefinition == typeof(IOptionsMonitor<>)
) && implementation != null ? implementation.GetCustomAttribute<DIAttribute>() : service.GetCustomAttribute<DIAttribute>(); ) && implementation != null ? implementation.GetCustomAttribute<DIAttribute>() : service.GetCustomAttribute<DIAttribute>();
var isnew = false; var isnew = false;
@ -237,11 +245,21 @@ public class DIHelper
{ {
if (di.Service != null) if (di.Service != null)
{ {
var a = di.Service.GetInterfaces().FirstOrDefault(x => x.IsGenericType && ( var a = di.Service.GetInterfaces().FirstOrDefault(x =>
x.GetGenericTypeDefinition() == typeof(IConfigureOptions<>) || {
x.GetGenericTypeDefinition() == typeof(IPostConfigureOptions<>) || Type xGenericTypeDefinition = null;
x.GetGenericTypeDefinition() == typeof(IOptionsMonitor<>)
)); if (x.IsGenericType)
{
xGenericTypeDefinition = x.GetGenericTypeDefinition();
}
return
xGenericTypeDefinition != null && (
xGenericTypeDefinition == typeof(IConfigureOptions<>) ||
xGenericTypeDefinition == typeof(IPostConfigureOptions<>) ||
xGenericTypeDefinition == typeof(IOptionsMonitor<>));
});
if (a != null) if (a != null)
{ {
@ -302,11 +320,24 @@ public class DIHelper
if (di.Implementation != null) if (di.Implementation != null)
{ {
var a = di.Implementation.GetInterfaces().FirstOrDefault(x => x.IsGenericType && var a = di.Implementation.GetInterfaces().FirstOrDefault(x =>
(x.GetGenericTypeDefinition() == typeof(IConfigureOptions<>) || {
x.GetGenericTypeDefinition() == typeof(IPostConfigureOptions<>) ||
x.GetGenericTypeDefinition() == typeof(IOptionsMonitor<>)) Type xGenericTypeDefinition = null;
);
if (x.IsGenericType)
{
xGenericTypeDefinition = x.GetGenericTypeDefinition();
}
return
xGenericTypeDefinition != null &&
(
xGenericTypeDefinition == typeof(IConfigureOptions<>) ||
xGenericTypeDefinition == typeof(IPostConfigureOptions<>) ||
xGenericTypeDefinition == typeof(IOptionsMonitor<>));
});
if (a != null) if (a != null)
{ {
if (!a.ContainsGenericParameters) if (!a.ContainsGenericParameters)
@ -449,10 +480,17 @@ public class DIHelper
return true; return true;
} }
var c = service.IsGenericType && ( Type serviceGenericTypeDefinition = null;
service.GetGenericTypeDefinition() == typeof(IConfigureOptions<>) ||
service.GetGenericTypeDefinition() == typeof(IPostConfigureOptions<>) || if (service.IsGenericType)
service.GetGenericTypeDefinition() == typeof(IOptionsMonitor<>) {
serviceGenericTypeDefinition = service.GetGenericTypeDefinition();
}
var c = serviceGenericTypeDefinition != null && (
serviceGenericTypeDefinition == typeof(IConfigureOptions<>) ||
serviceGenericTypeDefinition == typeof(IPostConfigureOptions<>) ||
serviceGenericTypeDefinition == typeof(IOptionsMonitor<>)
) && implementation != null ? implementation.GetCustomAttribute<DIAttribute>() : service.GetCustomAttribute<DIAttribute>(); ) && implementation != null ? implementation.GetCustomAttribute<DIAttribute>() : service.GetCustomAttribute<DIAttribute>();
var serviceName = $"{service}{implementation}"; var serviceName = $"{service}{implementation}";

View File

@ -114,10 +114,6 @@
"internal": "http://localhost:9899/" "internal": "http://localhost:9899/"
}, },
"cultures": "az,cs,el-GR,es,fr,ja-JP,lo-LA,nl,pt,ro,sk,tr,vi,bg,de,en-US,en-GB,fi,it,ko-KR,lv,pl,pt-BR,ru,sl,uk-UA,zh-CN", "cultures": "az,cs,el-GR,es,fr,ja-JP,lo-LA,nl,pt,ro,sk,tr,vi,bg,de,en-US,en-GB,fi,it,ko-KR,lv,pl,pt-BR,ru,sl,uk-UA,zh-CN",
"url-shortener": {
"value": "/sh/",
"internal": "http://localhost:9999/"
},
"controlpanel": { "controlpanel": {
"url": "" "url": ""
}, },

View File

@ -29,7 +29,7 @@ export default function withBadges(WrappedComponent) {
isTrashFolder, isTrashFolder,
} = this.props; } = this.props;
if (isTrashFolder) return; if (isTrashFolder) return;
fetchFileVersions(item.id + ""); fetchFileVersions(item.id + "", item.access);
setIsVerHistoryPanel(true); setIsVerHistoryPanel(true);
}; };
@ -91,6 +91,7 @@ export default function withBadges(WrappedComponent) {
isDesktopClient, isDesktopClient,
sectionWidth, sectionWidth,
viewAs, viewAs,
canViewVersionFileHistory,
} = this.props; } = this.props;
const { fileStatus, access } = item; const { fileStatus, access } = item;
@ -123,6 +124,7 @@ export default function withBadges(WrappedComponent) {
setConvertDialogVisible={this.setConvertDialogVisible} setConvertDialogVisible={this.setConvertDialogVisible}
onFilesClick={onFilesClick} onFilesClick={onFilesClick}
viewAs={viewAs} viewAs={viewAs}
canViewVersionFileHistory={canViewVersionFileHistory}
/> />
); );
@ -142,6 +144,7 @@ export default function withBadges(WrappedComponent) {
dialogsStore, dialogsStore,
filesStore, filesStore,
settingsStore, settingsStore,
accessRightsStore,
}, },
{ item } { item }
) => { ) => {
@ -158,6 +161,9 @@ export default function withBadges(WrappedComponent) {
const canWebEdit = settingsStore.canWebEdit(item.fileExst); const canWebEdit = settingsStore.canWebEdit(item.fileExst);
const canConvert = settingsStore.canConvert(item.fileExst); const canConvert = settingsStore.canConvert(item.fileExst);
const canViewVersionFileHistory = accessRightsStore.canViewVersionFileHistory(
item
);
return { return {
theme, theme,
@ -177,6 +183,7 @@ export default function withBadges(WrappedComponent) {
setConvertItem, setConvertItem,
isDesktopClient, isDesktopClient,
setPinAction, setPinAction,
canViewVersionFileHistory,
}; };
} }
)(observer(WithBadges)); )(observer(WithBadges));

View File

@ -1,7 +1,5 @@
import React from "react"; import React from "react";
import { inject, observer } from "mobx-react"; import { inject, observer } from "mobx-react";
import { ShareAccessRights } from "@docspace/common/constants";
import toastr from "@docspace/components/toast/toastr"; import toastr from "@docspace/components/toast/toastr";
import QuickButtons from "../components/QuickButtons"; import QuickButtons from "../components/QuickButtons";
@ -56,19 +54,12 @@ export default function withQuickButtons(WrappedComponent) {
t, t,
theme, theme,
item, item,
isTrashFolder,
isAdmin, isAdmin,
sectionWidth, sectionWidth,
viewAs, viewAs,
isArchiveFolderRoot, canLockFile,
} = this.props; } = this.props;
const { access, id, fileExst } = item;
const accessToEdit =
access === ShareAccessRights.FullAccess ||
access === ShareAccessRights.None; // TODO: fix access type for owner (now - None)
const quickButtonsComponent = ( const quickButtonsComponent = (
<QuickButtons <QuickButtons
t={t} t={t}
@ -76,14 +67,12 @@ export default function withQuickButtons(WrappedComponent) {
item={item} item={item}
sectionWidth={sectionWidth} sectionWidth={sectionWidth}
isAdmin={isAdmin} isAdmin={isAdmin}
isTrashFolder={isTrashFolder}
accessToEdit={accessToEdit}
viewAs={viewAs} viewAs={viewAs}
isDisabled={isLoading} isDisabled={isLoading}
isCanWebEdit={isCanWebEdit} isCanWebEdit={isCanWebEdit}
onClickLock={this.onClickLock} onClickLock={this.onClickLock}
onClickFavorite={this.onClickFavorite} onClickFavorite={this.onClickFavorite}
isArchiveFolderRoot={isArchiveFolderRoot} canLockFile={canLockFile}
/> />
); );
@ -99,13 +88,11 @@ export default function withQuickButtons(WrappedComponent) {
return inject( return inject(
({ ({
auth, auth,
treeFoldersStore,
filesActionsStore, filesActionsStore,
filesStore,
dialogsStore, dialogsStore,
settingsStore, settingsStore,
accessRightsStore,
}) => { }) => {
const { isRecycleBinFolder, isArchiveFolderRoot } = treeFoldersStore;
const { const {
lockFileAction, lockFileAction,
setFavoriteAction, setFavoriteAction,
@ -114,16 +101,17 @@ export default function withQuickButtons(WrappedComponent) {
const { setSharingPanelVisible } = dialogsStore; const { setSharingPanelVisible } = dialogsStore;
const { canWebEdit } = settingsStore; const { canWebEdit } = settingsStore;
const { canLockFile } = accessRightsStore;
return { return {
theme: auth.settingsStore.theme, theme: auth.settingsStore.theme,
isAdmin: auth.isAdmin, isAdmin: auth.isAdmin,
isTrashFolder: isRecycleBinFolder,
lockFileAction, lockFileAction,
setFavoriteAction, setFavoriteAction,
onSelectItem, onSelectItem,
setSharingPanelVisible, setSharingPanelVisible,
canWebEdit, canWebEdit,
isArchiveFolderRoot, canLockFile,
}; };
} }
)(observer(WithQuickButtons)); )(observer(WithQuickButtons));

View File

@ -30,6 +30,7 @@ import { isMobileOnly } from "react-device-detect";
import IndicatorLoader from "./components/IndicatorLoader"; import IndicatorLoader from "./components/IndicatorLoader";
import DialogsWrapper from "./components/dialogs/DialogsWrapper"; import DialogsWrapper from "./components/dialogs/DialogsWrapper";
import MainBar from "./components/MainBar"; import MainBar from "./components/MainBar";
import { Portal } from "@docspace/components";
// const { proxyURL } = AppServerConfig; // const { proxyURL } = AppServerConfig;
// const homepage = config.homepage; // const homepage = config.homepage;
@ -409,10 +410,18 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
setTheme(systemTheme); setTheme(systemTheme);
}, [systemTheme]); }, [systemTheme]);
const rootElement = document.getElementById("root");
const toast = isMobileOnly ? (
<Portal element={<Toast />} appendTo={rootElement} visible={true} />
) : (
<Toast />
);
return ( return (
<Layout> <Layout>
<Router history={history}> <Router history={history}>
<Toast /> {toast}
<ReactSmartBanner t={t} ready={ready} /> <ReactSmartBanner t={t} ready={ready} />
{isEditor || !isMobileOnly ? <></> : <NavMenu />} {isEditor || !isMobileOnly ? <></> : <NavMenu />}
{isMobileOnly && <MainBar />} {isMobileOnly && <MainBar />}
@ -422,73 +431,73 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
<Main isDesktop={isDesktop}> <Main isDesktop={isDesktop}>
{!isMobileOnly && <MainBar />} {!isMobileOnly && <MainBar />}
<div className="main-container"> <div className="main-container">
<Switch> <Switch>
<PrivateRoute <PrivateRoute
exact exact
path={[ path={[
"/", "/",
"/rooms/personal", "/rooms/personal",
"/rooms/personal/filter", "/rooms/personal/filter",
"/rooms/shared", "/rooms/shared",
"/rooms/shared/filter", "/rooms/shared/filter",
"/rooms/shared/:room", "/rooms/shared/:room",
"/rooms/shared/:room/filter", "/rooms/shared/:room/filter",
"/rooms/archived", "/rooms/archived",
"/rooms/archived/filter", "/rooms/archived/filter",
"/rooms/archived/:room", "/rooms/archived/:room",
"/rooms/archived/:room/filter", "/rooms/archived/:room/filter",
"/files/favorite", "/files/favorite",
"/files/favorite/filter", "/files/favorite/filter",
"/files/recent", "/files/recent",
"/files/recent/filter", "/files/recent/filter",
"/files/trash", "/files/trash",
"/files/trash/filter", "/files/trash/filter",
"/accounts", "/accounts",
"/accounts/filter", "/accounts/filter",
"/accounts/create/:type", "/accounts/create/:type",
"/accounts/edit/:userId", "/accounts/edit/:userId",
"/accounts/view/:userId", "/accounts/view/:userId",
"/accounts/view/@self", "/accounts/view/@self",
"/settings", "/settings",
"/settings/common", "/settings/common",
"/settings/admin", "/settings/admin",
//"/settings/connected-clouds", //"/settings/connected-clouds",
]} ]}
component={FilesRoute} component={FilesRoute}
/> />
<PrivateRoute <PrivateRoute
path={"/form-gallery/:folderId"} path={"/form-gallery/:folderId"}
component={FormGalleryRoute} component={FormGalleryRoute}
/> />
<PublicRoute exact path={"/wizard"} component={WizardRoute} /> <PublicRoute exact path={"/wizard"} component={WizardRoute} />
<PrivateRoute path={"/about"} component={AboutRoute} /> <PrivateRoute path={"/about"} component={AboutRoute} />
<Route path={"/confirm"} component={ConfirmRoute} /> <Route path={"/confirm"} component={ConfirmRoute} />
<PrivateRoute path={"/payments"} component={PaymentsRoute} /> <PrivateRoute path={"/payments"} component={PaymentsRoute} />
<PrivateRoute <PrivateRoute
restricted restricted
path={"/portal-settings"} path={"/portal-settings"}
component={PortalSettingsRoute} component={PortalSettingsRoute}
/> />
<PrivateRoute <PrivateRoute
path={"/preparation-portal"} path={"/preparation-portal"}
component={PreparationPortalRoute} component={PreparationPortalRoute}
/> />
<PrivateRoute <PrivateRoute
path={"/portal-unavailable"} path={"/portal-unavailable"}
component={PortalUnavailableRoute} component={PortalUnavailableRoute}
/> />
<PrivateRoute path={"/error401"} component={Error401Route} /> <PrivateRoute path={"/error401"} component={Error401Route} />
<PrivateRoute component={Error404Route} /> <PrivateRoute component={Error404Route} />
</Switch> </Switch>
</div> </div>
</Main> </Main>
</Router> </Router>

View File

@ -71,6 +71,7 @@ const Badges = ({
setConvertDialogVisible, setConvertDialogVisible,
viewAs, viewAs,
onUnpinClick, onUnpinClick,
canViewVersionFileHistory,
}) => { }) => {
const { const {
id, id,
@ -142,6 +143,10 @@ const Badges = ({
"data-id": id, "data-id": id,
}; };
const onShowVersionHistoryProp = canViewVersionFileHistory
? { onClick: onShowVersionHistory }
: {};
return fileExst ? ( return fileExst ? (
<div className="badges additional-badges temp-badges"> <div className="badges additional-badges temp-badges">
{isEditing && ( {isEditing && (
@ -167,13 +172,13 @@ const Badges = ({
/> />
)} )}
{version > 1 && ( {version > 1 && (
<BadgeWrapper onClick={onShowVersionHistory} isTile={isTile}> <BadgeWrapper {...onShowVersionHistoryProp} isTile={isTile}>
<Badge <Badge
{...versionBadgeProps} {...versionBadgeProps}
className="badge-version badge-version-current tablet-badge icons-group" className="badge-version badge-version-current tablet-badge icons-group"
backgroundColor={theme.filesBadges.backgroundColor} backgroundColor={theme.filesBadges.backgroundColor}
label={t("VersionBadge", { version: countVersions })} label={t("VersionBadge", { version: countVersions })}
onClick={onShowVersionHistory} {...onShowVersionHistoryProp}
noHover={true} noHover={true}
isVersionBadge={true} isVersionBadge={true}
/> />

View File

@ -17,16 +17,16 @@ const QuickButtons = (props) => {
theme, theme,
sectionWidth, sectionWidth,
isTrashFolder, isTrashFolder,
accessToEdit,
onClickLock, onClickLock,
isDisabled, isDisabled,
onClickFavorite, onClickFavorite,
viewAs, viewAs,
isCanWebEdit, isCanWebEdit,
isArchiveFolderRoot, canLockFile,
} = props; } = props;
const { id, locked, fileStatus, title, fileExst } = item; const { id, locked, fileStatus, title, fileExst, access, folderType } = item;
const canLockFileAbility = canLockFile(item);
const isFavorite = const isFavorite =
(fileStatus & FileStatus.IsFavorite) === FileStatus.IsFavorite; (fileStatus & FileStatus.IsFavorite) === FileStatus.IsFavorite;
@ -59,12 +59,7 @@ const QuickButtons = (props) => {
const setFavorite = () => onClickFavorite(isFavorite); const setFavorite = () => onClickFavorite(isFavorite);
const isAvailableLockFile = const isAvailableLockFile =
!isArchiveFolderRoot && canLockFileAbility && fileExst && displayBadges && isCanWebEdit;
fileExst &&
accessToEdit &&
!isTrashFolder &&
displayBadges &&
isCanWebEdit;
return ( return (
<div className="badges additional-badges"> <div className="badges additional-badges">

View File

@ -1,11 +1,13 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { observer, inject } from "mobx-react"; import { observer, inject } from "mobx-react";
import { withTranslation } from "react-i18next"; import { withTranslation } from "react-i18next";
import { isMobileOnly } from "react-device-detect";
import Backdrop from "@docspace/components/backdrop"; import Backdrop from "@docspace/components/backdrop";
import Aside from "@docspace/components/aside"; import Aside from "@docspace/components/aside";
import Button from "@docspace/components/button"; import Button from "@docspace/components/button";
import toastr from "@docspace/components/toast/toastr"; import toastr from "@docspace/components/toast/toastr";
import Portal from "@docspace/components/portal";
import { import {
StyledBlock, StyledBlock,
@ -168,19 +170,20 @@ const InvitePanel = ({
const roomType = selectedRoom ? selectedRoom.roomType : -1; const roomType = selectedRoom ? selectedRoom.roomType : -1;
return ( const invitePanelComponent = (
<StyledInvitePanel> <StyledInvitePanel>
<Backdrop <Backdrop
onClick={onClose} onClick={onClose}
visible={visible} visible={visible}
isAside={true} isAside={true}
zIndex={210} zIndex={isMobileOnly ? 10 : 210}
/> />
<Aside <Aside
className="invite_panel" className="invite_panel"
visible={visible} visible={visible}
onClose={onClose} onClose={onClose}
withoutBodyScroll withoutBodyScroll
zIndex={310}
> >
<StyledBlock> <StyledBlock>
<StyledHeading> <StyledHeading>
@ -221,6 +224,20 @@ const InvitePanel = ({
</Aside> </Aside>
</StyledInvitePanel> </StyledInvitePanel>
); );
const renderPortalInvitePanel = () => {
const rootElement = document.getElementById("root");
return (
<Portal
element={invitePanelComponent}
appendTo={rootElement}
visible={visible}
/>
);
};
return isMobileOnly ? renderPortalInvitePanel() : invitePanelComponent;
}; };
export default inject(({ auth, peopleStore, filesStore, dialogsStore }) => { export default inject(({ auth, peopleStore, filesStore, dialogsStore }) => {

View File

@ -1,4 +1,4 @@
import React, { useState } from "react"; import React, { useState, useEffect } from "react";
import { inject } from "mobx-react"; import { inject } from "mobx-react";
import { ReactSVG } from "react-svg"; import { ReactSVG } from "react-svg";
@ -9,14 +9,26 @@ import infoPanel from "@docspace/common/components/Section/sub-components/info-p
const CommentEditor = ({ const CommentEditor = ({
t, t,
item, item,
editing,
setSelection, setSelection,
isRecycleBinFolder,
isArchiveFolderRoot,
fetchFileVersions, fetchFileVersions,
updateCommentVersion, updateCommentVersion,
canChangeVersionFileHistory,
setVerHistoryFileId,
setVerHistoryFileAccess,
}) => { }) => {
const { id, comment, version } = item; const { id, comment, version, access, folderType } = item;
const changeVersionHistoryAbility = canChangeVersionFileHistory({
access,
folderType,
editing,
});
useEffect(() => {
setVerHistoryFileId(id);
setVerHistoryFileAccess(access);
}, []);
const [isEdit, setIsEdit] = useState(false); const [isEdit, setIsEdit] = useState(false);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
@ -32,7 +44,7 @@ const CommentEditor = ({
const onSave = async () => { const onSave = async () => {
setIsLoading(true); setIsLoading(true);
await fetchFileVersions(id).catch((err) => { await fetchFileVersions(id, access).catch((err) => {
toastr.error(err); toastr.error(err);
setIsLoading(false); setIsLoading(false);
}); });
@ -61,7 +73,7 @@ const CommentEditor = ({
{comment} {comment}
</Text> </Text>
)} )}
{!isRecycleBinFolder && !isArchiveFolderRoot && ( {changeVersionHistoryAbility && (
<div className="edit_toggle" onClick={onOpenEditor}> <div className="edit_toggle" onClick={onOpenEditor}>
<ReactSVG <ReactSVG
className="edit_toggle-icon" className="edit_toggle-icon"
@ -104,17 +116,29 @@ const CommentEditor = ({
); );
}; };
export default inject(({ auth, versionHistoryStore, treeFoldersStore }) => { export default inject(({ auth, versionHistoryStore, accessRightsStore }) => {
const { setSelection } = auth.infoPanelStore; const { setSelection } = auth.infoPanelStore;
const { fetchFileVersions, updateCommentVersion } = versionHistoryStore; const {
const { isRecycleBinFolder, isArchiveFolderRoot } = treeFoldersStore; fetchFileVersions,
updateCommentVersion,
isEditingVersion,
isEditing,
fileId,
setVerHistoryFileId,
setVerHistoryFileAccess,
} = versionHistoryStore;
const { canChangeVersionFileHistory } = accessRightsStore;
const editing = isEditingVersion || isEditing;
return { return {
setSelection, setSelection,
isRecycleBinFolder,
isArchiveFolderRoot,
fetchFileVersions, fetchFileVersions,
updateCommentVersion, updateCommentVersion,
canChangeVersionFileHistory,
editing,
setVerHistoryFileId,
setVerHistoryFileAccess,
}; };
})(CommentEditor); })(CommentEditor);

View File

@ -3,7 +3,6 @@ import React, { useState } from "react";
import { StyledUser } from "../../styles/members"; import { StyledUser } from "../../styles/members";
import Avatar from "@docspace/components/avatar"; import Avatar from "@docspace/components/avatar";
import { ComboBox } from "@docspace/components"; import { ComboBox } from "@docspace/components";
import { ShareAccessRights } from "@docspace/common/constants";
const User = ({ const User = ({
t, t,
@ -15,7 +14,9 @@ const User = ({
currCanEditUsers, currCanEditUsers,
selectionParentRoom, selectionParentRoom,
setSelectionParentRoom, setSelectionParentRoom,
isArchiveRoot, canChangeUserRoleInRoom,
rootFolderType,
access,
}) => { }) => {
if (!selectionParentRoom) return null; if (!selectionParentRoom) return null;
if (!user.displayName && !user.email) return null; if (!user.displayName && !user.email) return null;
@ -66,11 +67,13 @@ const User = ({
} }
}; };
const isAvailable = const isCanChangeUserRole =
!isArchiveRoot && user &&
currCanEditUsers && canChangeUserRoleInRoom({
currentMember?.id !== user.id && access,
userRole.access !== ShareAccessRights.FullAccess; rootFolderType,
currentUserInList: { id: user.id, access: user.access },
});
return ( return (
<StyledUser isExpect={isExpect} key={user.id}> <StyledUser isExpect={isExpect} key={user.id}>
@ -91,7 +94,7 @@ const User = ({
{userRole && userRoleOptions && ( {userRole && userRoleOptions && (
<div className="role-wrapper"> <div className="role-wrapper">
{isAvailable ? ( {isCanChangeUserRole ? (
<ComboBox <ComboBox
className="role-combobox" className="role-combobox"
selectedOption={userRole} selectedOption={userRole}

View File

@ -19,7 +19,6 @@ const Members = ({
selfId, selfId,
isOwner, isOwner,
isAdmin, isAdmin,
isArchiveRoot,
selection, selection,
selectionParentRoom, selectionParentRoom,
@ -33,13 +32,19 @@ const Members = ({
changeUserType, changeUserType,
canInviteUserInRoom, canInviteUserInRoom,
canChangeUserRoleInRoom,
}) => { }) => {
const membersHelper = new MembersHelper({ t }); const membersHelper = new MembersHelper({ t });
const [members, setMembers] = useState(null); const [members, setMembers] = useState(null);
const [showLoader, setShowLoader] = useState(false); const [showLoader, setShowLoader] = useState(false);
const { access, rootFolderType } = selection;
const canInviteUserInRoomAbility = canInviteUserInRoom({
access,
rootFolderType,
});
const isDisabledInvite = !canInviteUserInRoom({ access: selection.access });
const fetchMembers = async (roomId) => { const fetchMembers = async (roomId) => {
let timerId; let timerId;
if (members) timerId = setTimeout(() => setShowLoader(true), 1000); if (members) timerId = setTimeout(() => setShowLoader(true), 1000);
@ -117,19 +122,13 @@ const Members = ({
(member) => member.id === selfId (member) => member.id === selfId
); );
const currCanEditUsers =
isOwner ||
isAdmin ||
currentMember?.access === ShareAccessRights.FullAccess ||
currentMember?.access === ShareAccessRights.RoomManager;
return ( return (
<> <>
<StyledUserTypeHeader> <StyledUserTypeHeader>
<Text className="title"> <Text className="title">
{t("UsersInRoom")} : {members.inRoom.length} {t("UsersInRoom")} : {members.inRoom.length}
</Text> </Text>
{currCanEditUsers && !isArchiveRoot && ( {canInviteUserInRoomAbility && (
<IconButton <IconButton
className={"icon"} className={"icon"}
title={t("Common:AddUsers")} title={t("Common:AddUsers")}
@ -137,7 +136,6 @@ const Members = ({
isFill={true} isFill={true}
onClick={onClickInviteUsers} onClick={onClickInviteUsers}
size={16} size={16}
isDisabled={isDisabledInvite}
/> />
)} )}
</StyledUserTypeHeader> </StyledUserTypeHeader>
@ -145,7 +143,8 @@ const Members = ({
<StyledUserList> <StyledUserList>
{Object.values(members.inRoom).map((user) => ( {Object.values(members.inRoom).map((user) => (
<User <User
currCanEditUsers={currCanEditUsers} access={access}
rootFolderType={rootFolderType}
key={user.id} key={user.id}
t={t} t={t}
user={user} user={user}
@ -156,7 +155,7 @@ const Members = ({
roomType={selectionParentRoom.roomType} roomType={selectionParentRoom.roomType}
selectionParentRoom={selectionParentRoom} selectionParentRoom={selectionParentRoom}
setSelectionParentRoom={setSelectionParentRoom} setSelectionParentRoom={setSelectionParentRoom}
isArchiveRoot={isArchiveRoot} canChangeUserRoleInRoom={canChangeUserRoleInRoom}
/> />
))} ))}
</StyledUserList> </StyledUserList>
@ -164,7 +163,7 @@ const Members = ({
{!!members.expected.length && ( {!!members.expected.length && (
<StyledUserTypeHeader isExpect> <StyledUserTypeHeader isExpect>
<Text className="title">{t("ExpectPeople")}</Text> <Text className="title">{t("ExpectPeople")}</Text>
{currCanEditUsers && !isArchiveRoot && ( {canInviteUserInRoomAbility && (
<IconButton <IconButton
className={"icon"} className={"icon"}
title={t("Repeat invitation")} title={t("Repeat invitation")}
@ -180,6 +179,8 @@ const Members = ({
<StyledUserList> <StyledUserList>
{Object.values(members.expected).map((user) => ( {Object.values(members.expected).map((user) => (
<User <User
access={access}
rootFolderType={rootFolderType}
isExpect isExpect
key={user.id} key={user.id}
t={t} t={t}
@ -191,7 +192,6 @@ const Members = ({
roomType={selectionParentRoom.roomType} roomType={selectionParentRoom.roomType}
selectionParentRoom={selectionParentRoom} selectionParentRoom={selectionParentRoom}
setSelectionParentRoom={setSelectionParentRoom} setSelectionParentRoom={setSelectionParentRoom}
isArchiveRoot={isArchiveRoot}
/> />
))} ))}
</StyledUserList> </StyledUserList>
@ -200,14 +200,7 @@ const Members = ({
}; };
export default inject( export default inject(
({ ({ auth, filesStore, peopleStore, dialogsStore, accessRightsStore }) => {
auth,
filesStore,
peopleStore,
dialogsStore,
accessRightsStore,
treeFoldersStore,
}) => {
const { selectionParentRoom, setSelectionParentRoom } = auth.infoPanelStore; const { selectionParentRoom, setSelectionParentRoom } = auth.infoPanelStore;
const { const {
getRoomMembers, getRoomMembers,
@ -217,9 +210,7 @@ export default inject(
const { isOwner, isAdmin, id: selfId } = auth.userStore.user; const { isOwner, isAdmin, id: selfId } = auth.userStore.user;
const { setInvitePanelOptions } = dialogsStore; const { setInvitePanelOptions } = dialogsStore;
const { changeType: changeUserType } = peopleStore; const { changeType: changeUserType } = peopleStore;
const { canInviteUserInRoom } = accessRightsStore; const { canInviteUserInRoom, canChangeUserRoleInRoom } = accessRightsStore;
const { isArchiveFolderRoot } = treeFoldersStore;
return { return {
selectionParentRoom, selectionParentRoom,
@ -237,7 +228,7 @@ export default inject(
changeUserType, changeUserType,
canInviteUserInRoom, canInviteUserInRoom,
isArchiveRoot: isArchiveFolderRoot, canChangeUserRoleInRoom,
}; };
} }
)( )(

View File

@ -358,14 +358,14 @@ class SectionHeaderContent extends React.Component {
key: "empty-archive", key: "empty-archive",
label: t("ArchiveAction"), label: t("ArchiveAction"),
onClick: this.onEmptyTrashAction, onClick: this.onEmptyTrashAction,
disabled: !canRestoreAll, disabled: !canDeleteAll,
icon: "images/clear.trash.react.svg", icon: "images/clear.trash.react.svg",
}, },
{ {
key: "restore-all", key: "restore-all",
label: t("RestoreAll"), label: t("RestoreAll"),
onClick: this.onRestoreAllArchiveAction, onClick: this.onRestoreAllArchiveAction,
disabled: !canDeleteAll, disabled: !canRestoreAll,
icon: "images/subtract.react.svg", icon: "images/subtract.react.svg",
}, },
]; ];

View File

@ -22,6 +22,8 @@ const Backup = ({
return ( return (
<> <>
<HelpButton <HelpButton
displayType="auto"
place="bottom"
iconName={"/static/images/help.react.svg"} iconName={"/static/images/help.react.svg"}
tooltipContent={ tooltipContent={
<> <>

View File

@ -91,7 +91,8 @@ let paymentTerm,
fromDate, fromDate,
byDate, byDate,
delayDaysCount, delayDaysCount,
payerInfo = null; payerInfo = null,
isAlreadyPaid = false;
const PaymentsPage = ({ const PaymentsPage = ({
setPortalPaymentQuotas, setPortalPaymentQuotas,
language, language,
@ -109,27 +110,22 @@ const PaymentsPage = ({
startValue, startValue,
dueDate, dueDate,
delayDueDate, delayDueDate,
portalStatus, setReplacingValuesInTranslation,
replaceFeaturesValues,
portalPaymentQuotasFeatures,
currentTariffPlanTitle, currentTariffPlanTitle,
tariffPlanTitle, tariffPlanTitle,
expandArticle, expandArticle,
setPortalQuota, setPortalQuota,
currentPortalQuota,
portalTariffStatus,
portalPaymentQuotas,
}) => { }) => {
const { t, ready } = useTranslation(["Payments", "Common", "Settings"]); const { t, ready } = useTranslation(["Payments", "Common", "Settings"]);
const [isInitialLoading, setIsInitialLoading] = useState(true); const [isInitialLoading, setIsInitialLoading] = useState(true);
const isAlreadyPaid = payerEmail.length !== 0 || !isFreeTariff;
useEffect(() => { useEffect(() => {
setDocumentTitle(t("Settings:Payments")); setDocumentTitle(t("Settings:Payments"));
}, [ready]); }, [ready]);
useEffect(() => {
if (ready && portalPaymentQuotasFeatures.length !== 0)
replaceFeaturesValues(t);
}, [ready, portalPaymentQuotasFeatures]);
const gracePeriodDays = () => { const gracePeriodDays = () => {
const fromDateMoment = moment(dueDate); const fromDateMoment = moment(dueDate);
@ -152,17 +148,31 @@ const PaymentsPage = ({
isGracePeriod && gracePeriodDays(); isGracePeriod && gracePeriodDays();
}; };
useEffect(() => {
moment.locale(language);
}, []);
useEffect(() => {
if (ready && Object.keys(portalPaymentQuotas).length !== 0)
setReplacingValuesInTranslation(t);
}, [ready, portalPaymentQuotas.title]);
useEffect(() => { useEffect(() => {
(async () => { (async () => {
moment.locale(language); if (
Object.keys(currentPortalQuota).length === 0 ||
Object.keys(portalTariffStatus).length === 0
)
return;
isAlreadyPaid = payerEmail.length !== 0 || !isFreeTariff;
const requests = [getSettingsPayment(), setPortalQuota()]; const requests = [getSettingsPayment(), setPortalQuota()];
if (!currencySymbol && !startValue) if (!currencySymbol && !startValue)
requests.push(setPortalPaymentQuotas()); requests.push(setPortalPaymentQuotas());
if (portalStatus !== TariffState.Trial) if (isAlreadyPaid) requests.push(setPaymentAccount());
requests.push(setPaymentAccount());
try { try {
await Promise.all(requests); await Promise.all(requests);
@ -180,7 +190,7 @@ const PaymentsPage = ({
setIsInitialLoading(false); setIsInitialLoading(false);
})(); })();
}, []); }, [currentPortalQuota.title, portalTariffStatus.state]);
const renderTooltip = () => { const renderTooltip = () => {
return ( return (
@ -417,6 +427,7 @@ export default inject(({ auth, payments }) => {
isFreeTariff, isFreeTariff,
currentTariffPlanTitle, currentTariffPlanTitle,
setPortalQuota, setPortalQuota,
currentPortalQuota,
} = currentQuotaStore; } = currentQuotaStore;
const { const {
isNotPaidPeriod, isNotPaidPeriod,
@ -425,15 +436,15 @@ export default inject(({ auth, payments }) => {
customerId, customerId,
dueDate, dueDate,
delayDueDate, delayDueDate,
portalStatus, portalTariffStatus,
} = currentTariffStatusStore; } = currentTariffStatusStore;
const { const {
setPortalPaymentQuotas, setPortalPaymentQuotas,
planCost, planCost,
replaceFeaturesValues, setReplacingValuesInTranslation,
portalPaymentQuotasFeatures,
tariffPlanTitle, tariffPlanTitle,
portalPaymentQuotas,
} = paymentQuotasStore; } = paymentQuotasStore;
const { organizationName, theme } = auth.settingsStore; const { organizationName, theme } = auth.settingsStore;
@ -467,10 +478,11 @@ export default inject(({ auth, payments }) => {
setPortalPaymentQuotas, setPortalPaymentQuotas,
dueDate, dueDate,
delayDueDate, delayDueDate,
portalStatus, setReplacingValuesInTranslation,
replaceFeaturesValues,
portalPaymentQuotasFeatures,
currentTariffPlanTitle, currentTariffPlanTitle,
setPortalQuota, setPortalQuota,
currentPortalQuota,
portalTariffStatus,
portalPaymentQuotas,
}; };
})(withRouter(observer(PaymentsPage))); })(withRouter(observer(PaymentsPage)));

View File

@ -16,7 +16,6 @@ import { inject, observer } from "mobx-react";
import toastr from "@docspace/components/toast/toastr"; import toastr from "@docspace/components/toast/toastr";
import { Encoder } from "@docspace/common/utils/encoder"; import { Encoder } from "@docspace/common/utils/encoder";
import { Base } from "@docspace/components/themes"; import { Base } from "@docspace/components/themes";
import { getFileRoleActions } from "@docspace/common/utils/actions";
const StyledExternalLinkIcon = styled(ExternalLinkIcon)` const StyledExternalLinkIcon = styled(ExternalLinkIcon)`
${commonIconsStyles} ${commonIconsStyles}
@ -42,16 +41,12 @@ const VersionRow = (props) => {
versionsListLength, versionsListLength,
isEditing, isEditing,
theme, theme,
isArchiveFolderRoot, canChangeVersionFileHistory,
} = props; } = props;
const [showEditPanel, setShowEditPanel] = useState(false); const [showEditPanel, setShowEditPanel] = useState(false);
const [commentValue, setCommentValue] = useState(info.comment); const [commentValue, setCommentValue] = useState(info.comment);
const [isSavingComment, setIsSavingComment] = useState(false); const [isSavingComment, setIsSavingComment] = useState(false);
const { changeVersionHistory } = getFileRoleActions(info.access);
const canEdit = changeVersionHistory && !isEditing;
const title = `${new Date(info.updated).toLocaleString( const title = `${new Date(info.updated).toLocaleString(
culture culture
)} ${Encoder.htmlDecode(info.updatedBy?.displayName)}`; )} ${Encoder.htmlDecode(info.updatedBy?.displayName)}`;
@ -95,15 +90,13 @@ const VersionRow = (props) => {
); );
}; };
const isAvailableEdit = canEdit && !isArchiveFolderRoot;
const contextOptions = [ const contextOptions = [
isAvailableEdit && { canChangeVersionFileHistory && {
key: "edit", key: "edit",
label: t("EditComment"), label: t("EditComment"),
onClick: onEditComment, onClick: onEditComment,
}, },
isAvailableEdit && { canChangeVersionFileHistory && {
key: "restore", key: "restore",
label: t("Common:Restore"), label: t("Common:Restore"),
onClick: onRestoreClick, onClick: onRestoreClick,
@ -115,7 +108,9 @@ const VersionRow = (props) => {
}, },
]; ];
const onClickProp = isAvailableEdit ? { onClick: onVersionClick } : {}; const onClickProp = canChangeVersionFileHistory
? { onClick: onVersionClick }
: {};
useEffect(() => { useEffect(() => {
const newRowHeight = document.getElementsByClassName( const newRowHeight = document.getElementsByClassName(
@ -129,7 +124,7 @@ const VersionRow = (props) => {
<StyledVersionRow <StyledVersionRow
showEditPanel={showEditPanel} showEditPanel={showEditPanel}
contextOptions={contextOptions} contextOptions={contextOptions}
canEdit={isAvailableEdit} canEdit={canChangeVersionFileHistory}
isTabletView={isTabletView} isTabletView={isTabletView}
isSavingComment={isSavingComment} isSavingComment={isSavingComment}
isEditing={isEditing} isEditing={isEditing}
@ -225,32 +220,44 @@ const VersionRow = (props) => {
); );
}; };
export default inject(({ auth, versionHistoryStore, treeFoldersStore }) => { export default inject(
const { user } = auth.userStore; ({ auth, versionHistoryStore, accessRightsStore, selectedFolderStore }) => {
const { culture, isTabletView } = auth.settingsStore; const { user } = auth.userStore;
const language = (user && user.cultureName) || culture || "en"; const { culture, isTabletView } = auth.settingsStore;
const language = (user && user.cultureName) || culture || "en";
const { const {
markAsVersion, markAsVersion,
restoreVersion, restoreVersion,
updateCommentVersion, updateCommentVersion,
isEditing, isEditing,
isEditingVersion, isEditingVersion,
} = versionHistoryStore; fileAccess,
} = versionHistoryStore;
const { isArchiveFolderRoot } = treeFoldersStore; const { rootFolderType } = selectedFolderStore;
return { const isEdit = isEditingVersion || isEditing;
theme: auth.settingsStore.theme, const canChangeVersionFileHistory = accessRightsStore.canChangeVersionFileHistory(
culture: language, {
isTabletView, access: fileAccess,
markAsVersion, rootFolderType,
restoreVersion, editing: isEdit,
updateCommentVersion, }
isEditing: isEditingVersion || isEditing, );
isArchiveFolderRoot,
}; return {
})( theme: auth.settingsStore.theme,
culture: language,
isTabletView,
markAsVersion,
restoreVersion,
updateCommentVersion,
isEditing: isEdit,
canChangeVersionFileHistory,
};
}
)(
withRouter( withRouter(
withTranslation(["VersionHistory", "Common", "Translations"])( withTranslation(["VersionHistory", "Common", "Translations"])(
observer(VersionRow) observer(VersionRow)

View File

@ -24,15 +24,15 @@ class SectionBodyContent extends React.Component {
const fileId = match.params.fileId || this.props.fileId; const fileId = match.params.fileId || this.props.fileId;
if (fileId && fileId !== this.props.fileId) { if (fileId && fileId !== this.props.fileId) {
this.getFileVersions(fileId); this.getFileVersions(fileId, fileAccess);
setFirstLoad(false); setFirstLoad(false);
} }
} }
getFileVersions = (fileId) => { getFileVersions = (fileId, fileAccess) => {
const { fetchFileVersions, setIsLoading } = this.props; const { fetchFileVersions, setIsLoading } = this.props;
setIsLoading(true); setIsLoading(true);
fetchFileVersions(fileId).then(() => setIsLoading(false)); fetchFileVersions(fileId, fileAccess).then(() => setIsLoading(false));
}; };
onSetRestoreProcess = (restoring) => { onSetRestoreProcess = (restoring) => {
@ -138,14 +138,19 @@ class SectionBodyContent extends React.Component {
export default inject(({ auth, filesStore, versionHistoryStore }) => { export default inject(({ auth, filesStore, versionHistoryStore }) => {
const { setFirstLoad, setIsLoading, isLoading } = filesStore; const { setFirstLoad, setIsLoading, isLoading } = filesStore;
const { versions, fetchFileVersions, fileId } = versionHistoryStore; const {
versions,
fetchFileVersions,
fileId,
fileAccess,
} = versionHistoryStore;
return { return {
culture: auth.settingsStore.culture, culture: auth.settingsStore.culture,
isLoading, isLoading,
versions, versions,
fileId, fileId,
fileAccess,
setFirstLoad, setFirstLoad,
setIsLoading, setIsLoading,
fetchFileVersions, fetchFileVersions,

View File

@ -10,11 +10,13 @@ import {
getFileRoleActions, getFileRoleActions,
getRoomRoleActions, getRoomRoleActions,
getArchiveRoomRoleActions, getArchiveRoomRoleActions,
getArchiveFileRoleActions,
} from "@docspace/common/utils/actions"; } from "@docspace/common/utils/actions";
class AccessRightsStore { class AccessRightsStore {
authStore = null; authStore = null;
selectedFolderStore = null; selectedFolderStore = null;
treeFoldersStore = null;
constructor(authStore, selectedFolderStore) { constructor(authStore, selectedFolderStore) {
this.authStore = authStore; this.authStore = authStore;
@ -23,14 +25,133 @@ class AccessRightsStore {
makeAutoObservable(this); makeAutoObservable(this);
} }
canInviteUserInRoom = (room) => { canInviteUserInRoom(room) {
const { rootFolderType } = this.selectedFolderStore; const { access, rootFolderType } = room;
if (rootFolderType === FolderType.Archive) return false; if (rootFolderType === FolderType.Archive)
return getArchiveRoomRoleActions(access).inviteUsers;
const { inviteUsers } = getRoomRoleActions(room.access); return getRoomRoleActions(access).inviteUsers;
}
return inviteUsers; canChangeUserRoleInRoom = (room) => {
const { access, rootFolderType, currentUserInList } = room;
const { userStore } = this.authStore;
const { user } = userStore;
if (rootFolderType === FolderType.Archive)
return getArchiveRoomRoleActions(access).changeUserRole;
const isMyProfile = user.id === currentUserInList.id;
const isOwnerRoleRoom =
currentUserInList.access === ShareAccessRights.FullAccess;
if (isMyProfile || isOwnerRoleRoom) return false;
return getRoomRoleActions(access).changeUserRole;
};
canLockFile = (file) => {
const { rootFolderType, access } = file;
if (rootFolderType === FolderType.Archive)
return getArchiveFileRoleActions(access).block;
if (rootFolderType === FolderType.TRASH) return false;
return getFileRoleActions(access).block;
};
canChangeVersionFileHistory = (file) => {
const { rootFolderType, editing, providerKey, access } = file;
if (rootFolderType === FolderType.Archive)
return getArchiveFileRoleActions(access).changeVersionHistory;
if (
rootFolderType === FolderType.TRASH ||
// rootFolderType === FolderType.Privacy ||
editing ||
providerKey
)
return false;
return getFileRoleActions(access).changeVersionHistory;
};
canViewVersionFileHistory = (file) => {
const { rootFolderType, access, providerKey } = file;
if (rootFolderType === FolderType.Archive)
return getArchiveFileRoleActions(access).viewVersionHistory;
if (
rootFolderType === FolderType.TRASH ||
// rootFolderType === FolderType.Privacy ||
providerKey
)
return false;
return getFileRoleActions(access).viewVersionHistory;
};
canEditFile = (file) => {
const { rootFolderType, access } = file;
if (rootFolderType === FolderType.Archive)
return getArchiveFileRoleActions(access).edit;
if (
rootFolderType === FolderType.TRASH
// || rootFolderType === FolderType.Privacy
)
return false;
return getFileRoleActions(access).edit;
};
canRenameItem = (item = {}) => {
const { rootFolderType, access, isFile } = item;
const { isDesktopClient } = this.authStore.settingsStore;
if (rootFolderType === FolderType.Archive)
return getArchiveFileRoleActions(access).rename;
if (
rootFolderType === FolderType.TRASH ||
(!isFile &&
// rootFolderType === FolderType.Privacy &&
!isDesktopClient)
)
return false;
return getFileRoleActions(access).rename;
};
canFillForm = (file) => {
const { rootFolderType, access } = file;
if (rootFolderType === FolderType.Archive)
return getArchiveFileRoleActions(access).fillForm;
if (rootFolderType === FolderType.TRASH) return false;
return getFileRoleActions(access).fillForm;
};
canMakeForm = (item) => {
const { rootFolderType, access } = item;
if (rootFolderType === FolderType.Archive)
return getArchiveFileRoleActions(access).saveAsForm;
if (
rootFolderType === FolderType.TRASH ||
// rootFolderType === FolderType.Privacy ||
rootFolderType === FolderType.Favorites ||
rootFolderType === FolderType.Recent
)
return false;
return getFileRoleActions(access).saveAsForm;
}; };
canArchiveRoom = (room) => { canArchiveRoom = (room) => {
@ -40,51 +161,130 @@ class AccessRightsStore {
}; };
canRemoveRoom = (room) => { canRemoveRoom = (room) => {
const { delete: remove } = getRoomRoleActions(room.access); const { access, rootFolderType } = room;
return remove; if (rootFolderType !== FolderType.Archive)
return getRoomRoleActions(access).delete;
return getArchiveRoomRoleActions(access).delete;
};
canViewRoomInfo = (room) => {
const { access, rootFolderType } = room;
if (rootFolderType === FolderType.Archive)
return getArchiveRoomRoleActions(access).viewInfo;
return getRoomRoleActions(access).viewInfo;
};
canPinRoom = (room) => {
const { access, rootFolderType } = room;
if (rootFolderType === FolderType.Archive)
return getArchiveRoomRoleActions(access).canPin;
return getRoomRoleActions(access).canPin;
};
canEditRoom = (room) => {
const { access, rootFolderType } = room;
if (rootFolderType === FolderType.Archive)
return getArchiveRoomRoleActions(access).edit;
return getRoomRoleActions(access).edit;
}; };
get canCreateFiles() { get canCreateFiles() {
const { access, rootFolderType } = this.selectedFolderStore; const { access, rootFolderType } = this.selectedFolderStore;
if (rootFolderType === FolderType.Archive) return false; if (rootFolderType === FolderType.Archive)
return getArchiveFileRoleActions(access).create;
const { create } = getFileRoleActions(access); const { create } = getFileRoleActions(access);
return create; return create;
} }
canMoveFile = (room) => { canMoveItems = (item) => {
const { rootFolderType } = room; const { rootFolderType, access, editing: fileEditing, providerKey } = item;
if (rootFolderType === FolderType.Archive) return false; if (rootFolderType === FolderType.Archive) {
const { moveSelf, moveAlien } = getArchiveFileRoleActions(access);
const { moveSelf, moveAlien } = getFileRoleActions(room.access); return moveSelf || moveAlien;
}
if (
rootFolderType === FolderType.TRASH ||
rootFolderType === FolderType.Favorites ||
rootFolderType === FolderType.Recent ||
// rootFolderType === FolderType.Privacy ||
providerKey ||
fileEditing
)
return false;
const { moveSelf, moveAlien } = getFileRoleActions(access);
return moveSelf || moveAlien; return moveSelf || moveAlien;
}; };
canDeleteFile = (room) => { canDeleteItems = (item) => {
const { rootFolderType } = room; const { rootFolderType, access, editing: fileEditing } = item;
if (rootFolderType === FolderType.Archive) return false; if (rootFolderType === FolderType.Archive) {
const { deleteSelf, deleteAlien } = getArchiveFileRoleActions(access);
const { deleteSelf, deleteAlien } = getFileRoleActions(room.access); return deleteSelf || deleteAlien;
}
if (
rootFolderType === FolderType.TRASH ||
rootFolderType === FolderType.Favorites ||
rootFolderType === FolderType.Recent ||
// rootFolderType === FolderType.Privacy ||
fileEditing
)
return false;
const { deleteSelf, deleteAlien } = getFileRoleActions(access);
return deleteSelf || deleteAlien; return deleteSelf || deleteAlien;
}; };
canCopyFile = (room) => { canCopyItems = (item) => {
const { rootFolderType } = room; const { rootFolderType, access } = item;
if (rootFolderType === FolderType.Archive) return false; if (
rootFolderType === FolderType.TRASH ||
rootFolderType === FolderType.Favorites ||
rootFolderType === FolderType.Recent
// || rootFolderType === FolderType.Privacy
)
return false;
const { copyFromPersonal } = getFileRoleActions(room.access); const { canCopy } = getFileRoleActions(access);
return copyFromPersonal; return canCopy;
}; };
canDuplicateFile = (item) => {
const { rootFolderType, access } = item;
if (rootFolderType === FolderType.Archive)
return getArchiveFileRoleActions(access).canDuplicate;
if (
rootFolderType === FolderType.TRASH ||
rootFolderType === FolderType.Favorites ||
rootFolderType === FolderType.Recent
// || rootFolderType === FolderType.Privacy
)
return false;
return getFileRoleActions(access).canDuplicate;
};
canChangeUserType = (user) => { canChangeUserType = (user) => {
const { id, isOwner } = this.authStore.userStore.user; const { id, isOwner } = this.authStore.userStore.user;

View File

@ -489,7 +489,7 @@ class ContextOptionsStore {
key: "show-version-history", key: "show-version-history",
label: t("ShowVersionHistory"), label: t("ShowVersionHistory"),
icon: "images/history.react.svg", icon: "images/history.react.svg",
onClick: () => this.showVersionHistory(item.id), onClick: () => this.showVersionHistory(item.id, item.access),
disabled: false, disabled: false,
}, },
] ]
@ -503,14 +503,15 @@ class ContextOptionsStore {
key: "finalize-version", key: "finalize-version",
label: t("FinalizeVersion"), label: t("FinalizeVersion"),
icon: "images/history-finalized.react.svg", icon: "images/history-finalized.react.svg",
onClick: () => this.finalizeVersion(item.id), onClick: () => this.finalizeVersion(item.id, item.access),
disabled: false, disabled: false,
}, },
{ {
key: "show-version-history", key: "show-version-history",
label: t("ShowVersionHistory"), label: t("ShowVersionHistory"),
icon: "images/history.react.svg", icon: "images/history.react.svg",
onClick: () => this.showVersionHistory(item.id), onClick: () =>
this.showVersionHistory(item.id, item.access),
disabled: false, disabled: false,
}, },
], ],
@ -528,7 +529,7 @@ class ContextOptionsStore {
key: "show-version-history", key: "show-version-history",
label: t("ShowVersionHistory"), label: t("ShowVersionHistory"),
icon: "images/history.react.svg", icon: "images/history.react.svg",
onClick: () => this.showVersionHistory(item.id), onClick: () => this.showVersionHistory(item.id, item.access),
disabled: false, disabled: false,
}, },
] ]
@ -884,10 +885,25 @@ class ContextOptionsStore {
deleteRooms, deleteRooms,
} = this.filesActionsStore; } = this.filesActionsStore;
if (isRoomsFolder || isArchiveFolder) { if (isRoomsFolder || isArchiveFolder) {
const isPinOption = selection.filter((item) => !item.pinned).length > 0; const isPinOption = selection.filter((item) => !item.pinned).length > 0;
const canDelete =
selection.findIndex((k) => k.contextOptions.includes("delete")) !== -1;
const canArchiveRoom =
selection.findIndex((k) =>
k.contextOptions.includes("archive-room")
) !== -1;
const canRestoreRoom =
selection.findIndex((k) =>
k.contextOptions.includes("unarchive-room")
) !== -1;
let archiveOptions;
const pinOption = isPinOption const pinOption = isPinOption
? { ? {
key: "pin-room", key: "pin-room",
@ -904,25 +920,28 @@ class ContextOptionsStore {
disabled: false, disabled: false,
}; };
const archiveOptions = !isArchiveFolder if (canArchiveRoom) {
? { archiveOptions = {
key: "archive-room", key: "archive-room",
label: t("Archived"), label: t("Archived"),
icon: "/static/images/room.archive.svg", icon: "/static/images/room.archive.svg",
onClick: (e) => this.onClickArchive(e), onClick: (e) => this.onClickArchive(e),
disabled: false, disabled: false,
"data-action": "archive", "data-action": "archive",
action: "archive", action: "archive",
} };
: { }
key: "unarchive-room", if (canRestoreRoom) {
label: t("Common:Restore"), archiveOptions = {
icon: "images/subtract.react.svg", key: "unarchive-room",
onClick: (e) => this.onClickArchive(e), label: t("Common:Restore"),
disabled: false, icon: "images/subtract.react.svg",
"data-action": "unarchive", onClick: (e) => this.onClickArchive(e),
action: "unarchive", disabled: false,
}; "data-action": "unarchive",
action: "unarchive",
};
}
const options = []; const options = [];
@ -936,14 +955,13 @@ class ContextOptionsStore {
options.push(archiveOptions); options.push(archiveOptions);
if (isArchiveFolder) { canDelete &&
options.push({ options.push({
key: "delete-rooms", key: "delete-rooms",
label: t("Common:Delete"), label: t("Common:Delete"),
icon: "images/trash.react.svg", icon: "images/trash.react.svg",
onClick: () => deleteRooms(t), onClick: () => deleteRooms(t),
}); });
}
return options; return options;
} }

View File

@ -1257,20 +1257,18 @@ class FilesActionStore {
}; };
isAvailableOption = (option) => { isAvailableOption = (option) => {
const { isFavoritesFolder, isRecentFolder } = this.treeFoldersStore;
const { const {
isAccessedSelected, isAccessedSelected,
canConvertSelected, canConvertSelected,
isThirdPartyRootSelection,
hasSelection, hasSelection,
allFilesIsEditing, allFilesIsEditing,
selection, selection,
} = this.filesStore; } = this.filesStore;
const { const {
canCopyFile, canCopyItems,
canDeleteFile, canDeleteItems,
canMoveFile, canMoveItems,
canArchiveRoom, canArchiveRoom,
canRemoveRoom, canRemoveRoom,
} = this.accessRightsStore; } = this.accessRightsStore;
@ -1278,7 +1276,7 @@ class FilesActionStore {
switch (option) { switch (option) {
case "copy": case "copy":
const canCopy = canCopyFile({ access, rootFolderType }); const canCopy = canCopyItems({ access, rootFolderType });
return hasSelection && canCopy; return hasSelection && canCopy;
case "showInfo": case "showInfo":
@ -1287,16 +1285,12 @@ class FilesActionStore {
case "downloadAs": case "downloadAs":
return canConvertSelected; return canConvertSelected;
case "moveTo": case "moveTo":
const canMove = canMoveFile({ access, rootFolderType }); const canMove = canMoveItems({
return ( access,
!isThirdPartyRootSelection && rootFolderType,
hasSelection && editing: allFilesIsEditing,
isAccessedSelected && });
!isRecentFolder && return hasSelection && isAccessedSelected && canMove;
!isFavoritesFolder &&
!allFilesIsEditing &&
canMove
);
case "archive": case "archive":
case "unarchive": case "unarchive":
@ -1313,12 +1307,12 @@ class FilesActionStore {
return canRemove.length > 0; return canRemove.length > 0;
case "delete": case "delete":
const canDelete = canDeleteFile({ access, rootFolderType }); const canDelete = canDeleteItems({
const deleteCondition = access,
!isThirdPartyRootSelection && rootFolderType,
hasSelection && editing: allFilesIsEditing,
isAccessedSelected && });
!allFilesIsEditing; const deleteCondition = hasSelection && isAccessedSelected;
return canDelete && deleteCondition; return canDelete && deleteCondition;
} }

View File

@ -26,10 +26,7 @@ import {
import { isDesktop } from "@docspace/components/utils/device"; import { isDesktop } from "@docspace/components/utils/device";
import { getContextMenuKeysByType } from "SRC_DIR/helpers/plugins"; import { getContextMenuKeysByType } from "SRC_DIR/helpers/plugins";
import { PluginContextMenuItemType } from "SRC_DIR/helpers/plugins/constants"; import { PluginContextMenuItemType } from "SRC_DIR/helpers/plugins/constants";
import { import { getArchiveRoomRoleActions } from "@docspace/common/utils/actions";
getFileRoleActions,
getRoomRoleActions,
} from "@docspace/common/utils/actions";
const { FilesFilter, RoomsFilter } = api; const { FilesFilter, RoomsFilter } = api;
const storageViewAs = localStorage.getItem("viewAs"); const storageViewAs = localStorage.getItem("viewAs");
@ -1047,23 +1044,13 @@ class FilesStore {
const isDocuSign = false; //TODO: need this prop; const isDocuSign = false; //TODO: need this prop;
const isEditing = const isEditing =
(item.fileStatus & FileStatus.IsEditing) === FileStatus.IsEditing; (item.fileStatus & FileStatus.IsEditing) === FileStatus.IsEditing;
const isFileOwner = // const isFileOwner =
item.createdBy?.id === this.authStore.userStore.user?.id; // item.createdBy?.id === this.authStore.userStore.user?.id;
const { const { isRecycleBinFolder, isMy, isArchiveFolder } = this.treeFoldersStore;
isRecycleBinFolder,
isPrivacyFolder,
isRecentFolder,
isFavoritesFolder,
isShareFolder,
isMy,
isArchiveFolder,
} = this.treeFoldersStore;
const { canFormFillingDocs } = this.filesSettingsStore; const { canFormFillingDocs } = this.filesSettingsStore;
const filesRights = getFileRoleActions(item.access);
const { enablePlugins } = this.authStore.settingsStore; const { enablePlugins } = this.authStore.settingsStore;
const isThirdPartyFolder = const isThirdPartyFolder =
@ -1076,10 +1063,39 @@ class FilesStore {
const pluginAllKeys = const pluginAllKeys =
enablePlugins && getContextMenuKeysByType(PluginContextMenuItemType.All); enablePlugins && getContextMenuKeysByType(PluginContextMenuItemType.All);
const canRenameItem = this.accessRightsStore.canRenameItem({
...item,
...isFile,
});
const canMove = this.accessRightsStore.canMoveItems({
...item,
...{ editing: isEditing },
});
const canDelete = this.accessRightsStore.canDeleteItems({
...item,
...{ editing: isEditing },
});
const canCopy = this.accessRightsStore.canCopyItems(item);
const canCreateCopy = this.accessRightsStore.canDuplicateFile(item);
if (isFile) { if (isFile) {
const shouldFillForm = canFormFillingDocs(item.fileExst); const shouldFillForm = canFormFillingDocs(item.fileExst);
const canLockFile = this.accessRightsStore.canLockFile(item);
const canChangeVersionFileHistory = this.accessRightsStore.canChangeVersionFileHistory(
{ ...item, ...{ editing: isEditing } }
);
const canViewVersionFileHistory = this.accessRightsStore.canViewVersionFileHistory(
item
);
const canFillForm = this.accessRightsStore.canFillForm(item);
const canEditFile = this.accessRightsStore.canEditFile(item);
const isMasterForm = item.fileExst === ".docxf"; const isMasterForm = item.fileExst === ".docxf";
const canMakeForm = this.accessRightsStore.canMakeForm(item);
let fileOptions = [ let fileOptions = [
//"open", //"open",
@ -1105,7 +1121,7 @@ class FilesStore {
"open-location", "open-location",
"mark-read", "mark-read",
// "mark-as-favorite", // "mark-as-favorite",
"remove-from-favorites", // "remove-from-favorites",
"download", "download",
"download-as", "download-as",
"convert", "convert",
@ -1120,75 +1136,69 @@ class FilesStore {
"delete", "delete",
]; ];
if (!filesRights.edit) { if (!canLockFile) {
fileOptions = this.removeOptions(fileOptions, ["edit"]);
}
if (!filesRights.fillForm) {
fileOptions = this.removeOptions(fileOptions, ["fill-form"]);
}
if (!filesRights.blockFile) {
fileOptions = this.removeOptions(fileOptions, [ fileOptions = this.removeOptions(fileOptions, [
"block-unblock-version", "block-unblock-version",
]); ]);
} }
if (!filesRights.viewVersionHistory) {
fileOptions = this.removeOptions(fileOptions, ["show-version-history"]); if (!canChangeVersionFileHistory) {
}
if (!filesRights.changeVersionHistory) {
fileOptions = this.removeOptions(fileOptions, ["finalize-version"]); fileOptions = this.removeOptions(fileOptions, ["finalize-version"]);
} }
if (!filesRights.deleteSelf || !filesRights.deleteAlien) {
fileOptions = this.removeOptions(fileOptions, ["delete"]); if (!canViewVersionFileHistory) {
fileOptions = this.removeOptions(fileOptions, ["show-version-history"]);
} }
if (!filesRights.moveSelf || !filesRights.moveAlien) {
fileOptions = this.removeOptions(fileOptions, ["move-to"]); if (!canChangeVersionFileHistory && !canViewVersionFileHistory) {
}
if (!filesRights.rename) {
fileOptions = this.removeOptions(fileOptions, ["rename"]);
}
if (!filesRights.copyFromPersonal) {
fileOptions = this.removeOptions(fileOptions, ["copy-to", "copy"]);
}
if (
!filesRights.viewVersionHistory &&
!filesRights.changeVersionHistory
) {
fileOptions = this.removeOptions(fileOptions, ["version"]); fileOptions = this.removeOptions(fileOptions, ["version"]);
if (item.rootFolderType === FolderType.Archive) { if (item.rootFolderType === FolderType.Archive) {
fileOptions = this.removeOptions(fileOptions, ["separator0"]); fileOptions = this.removeOptions(fileOptions, ["separator0"]);
} }
} }
if (
(!filesRights.moveSelf || !filesRights.moveAlien) && if (!canRenameItem) {
!filesRights.copyFromPersonal fileOptions = this.removeOptions(fileOptions, ["rename"]);
) { }
if (canOpenPlayer || !canEditFile) {
fileOptions = this.removeOptions(fileOptions, ["edit"]);
}
if (!(shouldFillForm && canFillForm)) {
fileOptions = this.removeOptions(fileOptions, ["fill-form"]);
}
if (!canDelete) {
fileOptions = this.removeOptions(fileOptions, ["delete"]);
}
if (!canMove) {
fileOptions = this.removeOptions(fileOptions, ["move-to"]);
}
if (!canCopy) {
fileOptions = this.removeOptions(fileOptions, ["copy-to"]);
}
if (!canCreateCopy) {
fileOptions = this.removeOptions(fileOptions, ["copy"]);
}
if (!canMove && !canCopy && !canCreateCopy) {
fileOptions = this.removeOptions(fileOptions, ["move"]); fileOptions = this.removeOptions(fileOptions, ["move"]);
} }
if (!(isMasterForm && canMakeForm))
fileOptions = this.removeOptions(fileOptions, ["make-form"]);
if (item.rootFolderType === FolderType.Archive) { if (item.rootFolderType === FolderType.Archive) {
fileOptions = this.removeOptions(fileOptions, [ fileOptions = this.removeOptions(fileOptions, [
"make-form",
"mark-read", "mark-read",
"mark-as-favorite", "mark-as-favorite",
"remove-from-favorites", "remove-from-favorites",
"edit",
"move",
"move-to",
"copy-to",
"copy",
"rename",
"separator2",
"delete",
"finalize-version",
]); ]);
} }
if (!isMasterForm)
fileOptions = this.removeOptions(fileOptions, ["make-form"]);
if (!shouldFillForm)
fileOptions = this.removeOptions(fileOptions, ["fill-form"]);
if (!canConvert) { if (!canConvert) {
fileOptions = this.removeOptions(fileOptions, ["download-as"]); fileOptions = this.removeOptions(fileOptions, ["download-as"]);
} }
@ -1200,110 +1210,64 @@ class FilesStore {
if (!canOpenPlayer) { if (!canOpenPlayer) {
fileOptions = this.removeOptions(fileOptions, ["view"]); fileOptions = this.removeOptions(fileOptions, ["view"]);
} else { } else {
fileOptions = this.removeOptions(fileOptions, ["edit", "preview"]); fileOptions = this.removeOptions(fileOptions, ["preview"]);
} }
if (!isDocuSign) { if (!isDocuSign) {
fileOptions = this.removeOptions(fileOptions, ["docu-sign"]); fileOptions = this.removeOptions(fileOptions, ["docu-sign"]);
} }
if (isEditing) { if (
fileOptions = this.removeOptions(fileOptions, [ isEditing ||
"finalize-version", item.rootFolderType === FolderType.Archive
"move-to", // ||
"separator2", // (isFavoritesFolder && !isFavorite) ||
"delete", // isFavoritesFolder ||
]); // isRecentFolder
if (isThirdPartyItem) { )
fileOptions = this.removeOptions(fileOptions, ["rename"]); fileOptions = this.removeOptions(fileOptions, ["separator2"]);
}
}
if (isFavorite) { // if (isFavorite) {
fileOptions = this.removeOptions(fileOptions, ["mark-as-favorite"]); // fileOptions = this.removeOptions(fileOptions, ["mark-as-favorite"]);
} else { // } else {
fileOptions = this.removeOptions(fileOptions, [ // fileOptions = this.removeOptions(fileOptions, [
"remove-from-favorites", // "remove-from-favorites",
]); // ]);
if (isFavoritesFolder) { // if (isFavoritesFolder) {
fileOptions = this.removeOptions(fileOptions, ["mark-as-favorite"]); // fileOptions = this.removeOptions(fileOptions, ["mark-as-favorite"]);
} // }
} // }
if (isFavoritesFolder) {
fileOptions = this.removeOptions(fileOptions, [
"move-to",
"delete",
"copy",
]);
if (!isFavorite) {
fileOptions = this.removeOptions(fileOptions, ["separator2"]);
}
}
if (isEncrypted) { if (isEncrypted) {
fileOptions = this.removeOptions(fileOptions, [ fileOptions = this.removeOptions(fileOptions, [
"open", "open",
"edit", // "link-for-portal-users",
"make-form", // "external-link",
"link-for-portal-users",
"external-link",
"send-by-email", "send-by-email",
"block-unblock-version", //need split
"version", //category
"finalize-version",
"copy-to",
"copy",
"mark-as-favorite", "mark-as-favorite",
]); ]);
} }
if (isRecentFolder) { // if (isFavoritesFolder || isRecentFolder) {
fileOptions = this.removeOptions(fileOptions, ["delete"]); // fileOptions = this.removeOptions(fileOptions, [
// //"unsubscribe",
if (!isFavorite) { // ]);
fileOptions = this.removeOptions(fileOptions, ["separator2"]); // }
}
}
if (isFavoritesFolder || isRecentFolder) {
fileOptions = this.removeOptions(fileOptions, [
"make-form",
"copy",
"move-to",
//"sharing-settings",
"unsubscribe",
"separator2",
]);
}
if (isRecycleBinFolder) { if (isRecycleBinFolder) {
fileOptions = this.removeOptions(fileOptions, [ fileOptions = this.removeOptions(fileOptions, [
"fill-form",
"open", "open",
"open-location", "open-location",
"view", "view",
"preview", "preview",
"edit", //"link-for-portal-users",
"make-form", //"sharing-settings",
"link-for-portal-users", //"external-link",
"sharing-settings",
"external-link",
"send-by-email", "send-by-email",
"block-unblock-version", //need split
"version", //category
"finalize-version",
"show-version-history",
"move", //category
"move-to",
"copy-to",
"copy",
"mark-read", "mark-read",
"mark-as-favorite", // "mark-as-favorite",
"remove-from-favorites", // "remove-from-favorites",
"rename",
"separator0", "separator0",
"separator1", "separator1",
]); ]);
@ -1327,11 +1291,7 @@ class FilesStore {
} }
if (isThirdPartyItem) { if (isThirdPartyItem) {
fileOptions = this.removeOptions(fileOptions, [ fileOptions = this.removeOptions(fileOptions, ["owner-change"]);
"owner-change",
"finalize-version",
"copy",
]);
} }
if (!hasNew) { if (!hasNew) {
@ -1340,38 +1300,42 @@ class FilesStore {
if ( if (
!( !(
isRecentFolder || // isRecentFolder ||
isFavoritesFolder || // isFavoritesFolder ||
(isMyFolder && (this.filterType || this.filterSearch)) (isMyFolder && (this.filterType || this.filterSearch))
) )
) { ) {
fileOptions = this.removeOptions(fileOptions, ["open-location"]); fileOptions = this.removeOptions(fileOptions, ["open-location"]);
} }
if (isPrivacyFolder) { // if (isPrivacyFolder) {
fileOptions = this.removeOptions(fileOptions, [ // fileOptions = this.removeOptions(fileOptions, [
"preview", // "preview",
"view", // "view",
"separator0", // "separator0",
"copy", // "download-as",
"download-as", // ]);
]);
if (!isDesktopClient) { // // if (!isDesktopClient) {
fileOptions = this.removeOptions(fileOptions, ["sharing-settings"]); // // fileOptions = this.removeOptions(fileOptions, ["sharing-settings"]);
} // // }
// }
fileOptions = this.removeOptions(
fileOptions,
isFileOwner ? ["unsubscribe"] : ["move-to", "delete"]
);
}
fileOptions = this.removeSeparator(fileOptions); fileOptions = this.removeSeparator(fileOptions);
return fileOptions; return fileOptions;
} else if (isRoom) { } else if (isRoom) {
const roomAccessRights = getRoomRoleActions(item.access); const canInviteUserInRoom = this.accessRightsStore.canInviteUserInRoom(
item
);
const canRemoveRoom = this.accessRightsStore.canRemoveRoom(item);
const canArchiveRoom = this.accessRightsStore.canArchiveRoom(item);
const canPinRoom = this.accessRightsStore.canPinRoom(item);
const canEditRoom = this.accessRightsStore.canEditRoom(item);
const canViewRoomInfo = this.accessRightsStore.canViewRoomInfo(item);
let roomOptions = [ let roomOptions = [
"select", "select",
@ -1388,29 +1352,29 @@ class FilesStore {
"delete", "delete",
]; ];
if (!roomAccessRights.edit) { if (!canEditRoom) {
roomOptions = this.removeOptions(roomOptions, [ roomOptions = this.removeOptions(roomOptions, [
"edit-room", "edit-room",
"reconnect-storage", "reconnect-storage",
]); ]);
} }
if (!roomAccessRights.inviteUsers) { if (!canInviteUserInRoom) {
roomOptions = this.removeOptions(roomOptions, ["invite-users-to-room"]); roomOptions = this.removeOptions(roomOptions, ["invite-users-to-room"]);
} }
if (!roomAccessRights.archive) { if (!canArchiveRoom) {
roomOptions = this.removeOptions(roomOptions, [ roomOptions = this.removeOptions(roomOptions, [
"archive-room", "archive-room",
"unarchive-room", "unarchive-room",
]); ]);
} }
if (!roomAccessRights.delete) { if (!canRemoveRoom) {
roomOptions = this.removeOptions(roomOptions, ["delete"]); roomOptions = this.removeOptions(roomOptions, ["delete"]);
} }
if (!roomAccessRights.archive && !roomAccessRights.delete) { if (!canArchiveRoom && !canRemoveRoom) {
roomOptions = this.removeOptions(roomOptions, ["separator1"]); roomOptions = this.removeOptions(roomOptions, ["separator1"]);
} }
@ -1418,27 +1382,28 @@ class FilesStore {
roomOptions = this.removeOptions(roomOptions, ["reconnect-storage"]); roomOptions = this.removeOptions(roomOptions, ["reconnect-storage"]);
} }
if (item.pinned) { if (!canPinRoom) {
roomOptions = this.removeOptions(roomOptions, ["pin-room"]); roomOptions = this.removeOptions(roomOptions, [
"unpin-room",
"pin-room",
]);
} else { } else {
roomOptions = this.removeOptions(roomOptions, ["unpin-room"]); item.pinned
? (roomOptions = this.removeOptions(roomOptions, ["pin-room"]))
: (roomOptions = this.removeOptions(roomOptions, ["unpin-room"]));
}
if (!canViewRoomInfo) {
roomOptions = this.removeOptions(roomOptions, ["room-info"]);
} }
if (isArchiveFolder || item.rootFolderType === FolderType.Archive) { if (isArchiveFolder || item.rootFolderType === FolderType.Archive) {
roomOptions = this.removeOptions(roomOptions, [ roomOptions = this.removeOptions(roomOptions, [
"edit-room",
"invite-users-to-room",
"pin-room",
"unpin-room",
"archive-room", "archive-room",
"separator1", "separator1",
"room-info",
]); ]);
} else { } else {
roomOptions = this.removeOptions(roomOptions, [ roomOptions = this.removeOptions(roomOptions, ["unarchive-room"]);
"delete",
"unarchive-room",
]);
if (enablePlugins) { if (enablePlugins) {
const pluginRoomsKeys = getContextMenuKeysByType( const pluginRoomsKeys = getContextMenuKeysByType(
@ -1473,66 +1438,54 @@ class FilesStore {
"mark-read", "mark-read",
"restore", "restore",
"rename", "rename",
"change-thirdparty-info", // "change-thirdparty-info",
"separator2", "separator2",
// "unsubscribe", // "unsubscribe",
"delete", "delete",
]; ];
if (!filesRights.deleteSelf || !filesRights.deleteAlien) { if (!canRenameItem) {
folderOptions = this.removeOptions(folderOptions, ["delete"]);
}
if (!filesRights.moveSelf || !filesRights.moveAlien) {
folderOptions = this.removeOptions(folderOptions, ["move-to"]);
}
if (!filesRights.rename) {
folderOptions = this.removeOptions(folderOptions, ["rename"]); folderOptions = this.removeOptions(folderOptions, ["rename"]);
} }
if (!filesRights.copyFromPersonal) {
folderOptions = this.removeOptions(folderOptions, ["copy-to", "copy"]); if (!canDelete) {
folderOptions = this.removeOptions(folderOptions, ["delete"]);
}
if (!canMove) {
folderOptions = this.removeOptions(folderOptions, ["move-to"]);
} }
if ( if (!canCopy) {
(!filesRights.moveSelf || !filesRights.moveAlien) && folderOptions = this.removeOptions(folderOptions, ["copy-to"]);
!filesRights.copyFromPersonal }
) {
if (!canCreateCopy) {
folderOptions = this.removeOptions(folderOptions, ["copy"]);
}
if (!canMove && !canCopy && !canCreateCopy) {
folderOptions = this.removeOptions(folderOptions, ["move"]); folderOptions = this.removeOptions(folderOptions, ["move"]);
} }
if (item.rootFolderType === FolderType.Archive) { // if (item.rootFolderType === FolderType.Archive) {
folderOptions = this.removeOptions(folderOptions, [ // folderOptions = this.removeOptions(folderOptions, [
"move", // "change-thirdparty-info",
"move-to", // "separator2",
"copy-to", // ]);
"rename", // }
"change-thirdparty-info",
"separator2",
"delete",
]);
}
if (isPrivacyFolder) { // if (isPrivacyFolder) {
folderOptions = this.removeOptions(folderOptions, [ // folderOptions = this.removeOptions(folderOptions, [
"sharing-settings", // // "sharing-settings",
"copy", // ]);
"copy-to", // }
]);
if (!isDesktopClient) {
folderOptions = this.removeOptions(folderOptions, ["rename"]);
}
}
if (isRecycleBinFolder) { if (isRecycleBinFolder) {
folderOptions = this.removeOptions(folderOptions, [ folderOptions = this.removeOptions(folderOptions, [
"open", "open",
"link-for-portal-users", // "link-for-portal-users",
"sharing-settings", // "sharing-settings",
"move",
"move-to",
"copy-to",
"mark-read", "mark-read",
"rename",
"separator0", "separator0",
"separator1", "separator1",
]); ]);
@ -1559,52 +1512,43 @@ class FilesStore {
folderOptions = this.removeOptions(folderOptions, ["mark-read"]); folderOptions = this.removeOptions(folderOptions, ["mark-read"]);
} }
if (isThirdPartyFolder) { if (isThirdPartyFolder && isDesktopClient)
folderOptions = this.removeOptions(folderOptions, ["move-to"]); folderOptions = this.removeOptions(folderOptions, ["separator2"]);
if (isDesktopClient) { // if (!isThirdPartyFolder)
folderOptions = this.removeOptions(folderOptions, [ // folderOptions = this.removeOptions(folderOptions, [
"separator2", // "change-thirdparty-info",
"delete", // ]);
]);
}
} else {
folderOptions = this.removeOptions(folderOptions, [
"change-thirdparty-info",
]);
}
if (isThirdPartyItem) { // if (isThirdPartyItem) {
folderOptions = this.removeOptions(folderOptions, ["owner-change"]); // folderOptions = this.removeOptions(folderOptions, ["owner-change"]);
if (isShareFolder) { // if (isShareFolder) {
folderOptions = this.removeOptions(folderOptions, [ // folderOptions = this.removeOptions(folderOptions, [
"change-thirdparty-info", // "change-thirdparty-info",
]); // ]);
} else { // } else {
if (isDesktopClient) { // if (isDesktopClient) {
folderOptions = this.removeOptions(folderOptions, [ // folderOptions = this.removeOptions(folderOptions, [
"change-thirdparty-info", // "change-thirdparty-info",
]); // ]);
} // }
folderOptions = this.removeOptions(folderOptions, ["remove"]); // folderOptions = this.removeOptions(folderOptions, ["remove"]);
if (!item) { // if (!item) {
//For damaged items // //For damaged items
folderOptions = this.removeOptions(folderOptions, [ // folderOptions = this.removeOptions(folderOptions, [
"open", // "open",
"download", // "download",
"copy-to", // ]);
"rename", // }
]); // }
} // } else {
} // folderOptions = this.removeOptions(folderOptions, [
} else { // "change-thirdparty-info",
folderOptions = this.removeOptions(folderOptions, [ // ]);
"change-thirdparty-info", // }
]);
}
if (!(isMyFolder && (this.filterType || this.filterSearch))) { if (!(isMyFolder && (this.filterType || this.filterSearch))) {
folderOptions = this.removeOptions(folderOptions, ["open-location"]); folderOptions = this.removeOptions(folderOptions, ["open-location"]);
@ -2346,10 +2290,10 @@ class FilesStore {
); );
} }
get isThirdPartyRootSelection() { // get isThirdPartyRootSelection() {
const withProvider = this.selection.find((x) => x.providerKey); // const withProvider = this.selection.find((x) => x.providerKey);
return withProvider && withProvider.rootFolderId === withProvider.id; // return withProvider && withProvider.rootFolderId === withProvider.id;
} // }
get isThirdPartySelection() { get isThirdPartySelection() {
const withProvider = this.selection.find((x) => x.providerKey); const withProvider = this.selection.find((x) => x.providerKey);
@ -2775,11 +2719,15 @@ class FilesStore {
} }
get roomsForRestore() { get roomsForRestore() {
return this.folders.filter((f) => getRoomRoleActions(f.access).archive); return this.folders.filter(
(f) => getArchiveRoomRoleActions(f.access).restore
);
} }
get roomsForDelete() { get roomsForDelete() {
return this.folders.filter((f) => getRoomRoleActions(f.access).delete); return this.folders.filter(
(f) => getArchiveRoomRoleActions(f.access).delete
);
} }
} }

View File

@ -6,6 +6,7 @@ import { FileStatus } from "@docspace/common/constants";
class VersionHistoryStore { class VersionHistoryStore {
isVisible = false; isVisible = false;
fileId = null; fileId = null;
fileAccess = null;
versions = null; versions = null;
filesStore = null; filesStore = null;
showProgressBar = false; showProgressBar = false;
@ -61,7 +62,9 @@ class VersionHistoryStore {
setVerHistoryFileId = (fileId) => { setVerHistoryFileId = (fileId) => {
this.fileId = fileId; this.fileId = fileId;
}; };
setVerHistoryFileAccess = (access) => {
this.fileAccess = access;
};
setVersions = (versions) => { setVersions = (versions) => {
this.versions = versions; this.versions = versions;
}; };
@ -90,9 +93,11 @@ class VersionHistoryStore {
this.versions = versions; this.versions = versions;
}; };
fetchFileVersions = (fileId) => { fetchFileVersions = (fileId, access) => {
if (this.fileId !== fileId || !this.versions) { if (this.fileId !== fileId || !this.versions) {
this.setVerHistoryFileId(fileId); this.setVerHistoryFileId(fileId);
this.setVerHistoryFileAccess(access);
return api.files return api.files
.getFileVersionInfo(fileId) .getFileVersionInfo(fileId)
.then((versions) => this.setVerHistoryFileVersions(versions)); .then((versions) => this.setVerHistoryFileVersions(versions));

View File

@ -36,8 +36,6 @@ const oformsStore = new OformsStore(authStore);
const selectedFolderStore = new SelectedFolderStore(authStore.settingsStore); const selectedFolderStore = new SelectedFolderStore(authStore.settingsStore);
const accessRightsStore = new AccessRightsStore(authStore, selectedFolderStore);
const paymentStore = new PaymentStore(); const paymentStore = new PaymentStore();
const wizardStore = new WizardStore(); const wizardStore = new WizardStore();
const setupStore = new SettingsSetupStore(); const setupStore = new SettingsSetupStore();
@ -48,6 +46,13 @@ const bannerStore = new BannerStore();
const ssoStore = new SsoFormStore(); const ssoStore = new SsoFormStore();
const tagsStore = new TagsStore();
const treeFoldersStore = new TreeFoldersStore(selectedFolderStore);
const settingsStore = new SettingsStore(thirdPartyStore, treeFoldersStore);
const accessRightsStore = new AccessRightsStore(authStore, selectedFolderStore);
const peopleStore = new PeopleStore( const peopleStore = new PeopleStore(
authStore, authStore,
authStore.infoPanelStore, authStore.infoPanelStore,
@ -55,11 +60,6 @@ const peopleStore = new PeopleStore(
accessRightsStore accessRightsStore
); );
const tagsStore = new TagsStore();
const treeFoldersStore = new TreeFoldersStore(selectedFolderStore);
const settingsStore = new SettingsStore(thirdPartyStore, treeFoldersStore);
const filesStore = new FilesStore( const filesStore = new FilesStore(
authStore, authStore,
selectedFolderStore, selectedFolderStore,

View File

@ -17,6 +17,7 @@ import ArticleProfile from "./sub-components/article-profile";
import ArticlePaymentAlert from "./sub-components/article-payment-alert"; import ArticlePaymentAlert from "./sub-components/article-payment-alert";
import { StyledArticle } from "./styled-article"; import { StyledArticle } from "./styled-article";
import HideArticleMenuButton from "./sub-components/article-hide-menu-button"; import HideArticleMenuButton from "./sub-components/article-hide-menu-button";
import Portal from "@docspace/components/portal";
const Article = ({ const Article = ({
showText, showText,
@ -107,7 +108,7 @@ const Article = ({
[setShowText] [setShowText]
); );
return ( const articleComponent = (
<> <>
<StyledArticle <StyledArticle
id={"article-container"} id={"article-container"}
@ -158,6 +159,20 @@ const Article = ({
) : null} ) : null}
</> </>
); );
const renderPortalArticle = () => {
const rootElement = document.getElementById("root");
return (
<Portal
element={articleComponent}
appendTo={rootElement}
visible={true}
/>
);
};
return isMobileOnly ? renderPortalArticle() : articleComponent;
}; };
Article.propTypes = { Article.propTypes = {

View File

@ -1,4 +1,6 @@
import React from "react"; import React from "react";
import { withTranslation } from "react-i18next";
import { isMobileOnly } from "react-device-detect";
import Loaders from "../../Loaders"; import Loaders from "../../Loaders";
@ -6,6 +8,8 @@ import Backdrop from "@docspace/components/backdrop";
import Button from "@docspace/components/button"; import Button from "@docspace/components/button";
import Heading from "@docspace/components/heading"; import Heading from "@docspace/components/heading";
import IconButton from "@docspace/components/icon-button"; import IconButton from "@docspace/components/icon-button";
import Scrollbar from "@docspace/components/scrollbar";
import Portal from "@docspace/components/portal";
import FilterBlockItem from "./FilterBlockItem"; import FilterBlockItem from "./FilterBlockItem";
@ -19,8 +23,6 @@ import {
StyledControlContainer, StyledControlContainer,
StyledCrossIcon, StyledCrossIcon,
} from "./StyledFilterBlock"; } from "./StyledFilterBlock";
import { withTranslation } from "react-i18next";
import Scrollbar from "@docspace/components/scrollbar";
//TODO: fix translate //TODO: fix translate
const FilterBlock = ({ const FilterBlock = ({
@ -337,7 +339,7 @@ const FilterBlock = ({
const showFooter = isEqualFilter(); const showFooter = isEqualFilter();
return ( const filterBlockComponent = (
<> <>
{showSelector.show ? ( {showSelector.show ? (
<> <>
@ -443,6 +445,20 @@ const FilterBlock = ({
/> />
</> </>
); );
const renderPortalFilterBlock = () => {
const rootElement = document.getElementById("root");
return (
<Portal
element={filterBlockComponent}
appendTo={rootElement}
visible={true}
/>
);
};
return isMobileOnly ? renderPortalFilterBlock() : filterBlockComponent;
}; };
export default React.memo(withTranslation("Common")(FilterBlock)); export default React.memo(withTranslation("Common")(FilterBlock));

View File

@ -11,7 +11,8 @@ import React, { useEffect } from "react";
import styled, { css } from "styled-components"; import styled, { css } from "styled-components";
import CrossIcon from "@docspace/components/public/static/images/cross.react.svg"; import CrossIcon from "@docspace/components/public/static/images/cross.react.svg";
import { isMobile } from "react-device-detect"; import { isMobile, isMobileOnly } from "react-device-detect";
import { Portal } from "@docspace/components";
const StyledInfoPanelWrapper = styled.div.attrs(({ id }) => ({ const StyledInfoPanelWrapper = styled.div.attrs(({ id }) => ({
id: id, id: id,
@ -159,7 +160,7 @@ const InfoPanel = ({
}; };
}, []); }, []);
return ( const infoPanelComponent = (
<StyledInfoPanelWrapper <StyledInfoPanelWrapper
isRowView={viewAs === "row"} isRowView={viewAs === "row"}
className="info-panel" className="info-panel"
@ -177,6 +178,20 @@ const InfoPanel = ({
</StyledInfoPanel> </StyledInfoPanel>
</StyledInfoPanelWrapper> </StyledInfoPanelWrapper>
); );
const renderPortalInfoPanel = () => {
const rootElement = document.getElementById("root");
return (
<Portal
element={infoPanelComponent}
appendTo={rootElement}
visible={isVisible}
/>
);
};
return isMobileOnly ? renderPortalInfoPanel() : infoPanelComponent;
}; };
InfoPanel.propTypes = { InfoPanel.propTypes = {
@ -192,7 +207,7 @@ StyledInfoPanelWrapper.defaultProps = { theme: Base };
StyledInfoPanel.defaultProps = { theme: Base }; StyledInfoPanel.defaultProps = { theme: Base };
InfoPanel.defaultProps = { theme: Base }; InfoPanel.defaultProps = { theme: Base };
export default inject(({ auth, filesStore }) => { export default inject(({ auth }) => {
const { isVisible, setIsVisible, getCanDisplay } = auth.infoPanelStore; const { isVisible, setIsVisible, getCanDisplay } = auth.infoPanelStore;
const canDisplay = getCanDisplay(); const canDisplay = getCanDisplay();

View File

@ -39,10 +39,10 @@ class PaymentQuotasStore {
} }
get tariffTitle() { get tariffTitle() {
return this.portalPaymentQuotas.title; return this.portalPaymentQuotas?.title;
} }
replaceFeaturesValues = (t) => { setReplacingValuesInTranslation = (t) => {
this.replaceTotalSizeValue(t); this.replaceTotalSizeValue(t);
}; };

View File

@ -0,0 +1,95 @@
export const ArchiveFilesActions = Object.freeze({
create: false,
load: false,
edit: false,
fillForm: false,
peerReview: false,
commenting: false,
block: false,
viewVersionHistory: false,
changeVersionHistory: false,
viewContent: false,
viewComments: false,
copyAtBuffer: false,
printing: false,
download: false,
deleteSelf: false,
moveSelf: false,
deleteAlien: false,
moveAlien: false,
rename: false,
copyToPersonal: false,
saveAsForm: false,
canCopy: false,
canDuplicate: false,
});
export const OwnerArchiveFilesActions = Object.freeze({
...ArchiveFilesActions,
viewVersionHistory: true,
viewContent: true,
viewComments: true,
copyAtBuffer: true,
printing: true,
download: true,
copyToPersonal: true,
canCopy: true,
});
export const RoomAdminArchiveFilesActions = Object.freeze({
...ArchiveFilesActions,
viewVersionHistory: true,
viewContent: true,
viewComments: true,
copyAtBuffer: true,
printing: true,
download: true,
copyToPersonal: true,
canCopy: true,
});
export const EditorArchiveFilesActions = Object.freeze({
...ArchiveFilesActions,
viewVersionHistory: true,
viewContent: true,
viewComments: true,
copyAtBuffer: true,
printing: true,
download: true,
});
export const FormFillerArchiveFilesActions = Object.freeze({
...ArchiveFilesActions,
viewContent: true,
viewComments: true,
copyAtBuffer: true,
printing: true,
download: true,
});
export const ReviewerArchiveFilesActions = Object.freeze({
...ArchiveFilesActions,
viewContent: true,
viewComments: true,
copyAtBuffer: true,
printing: true,
download: true,
});
export const CommentatorArchiveFilesActions = Object.freeze({
...ArchiveFilesActions,
viewContent: true,
viewComments: true,
copyAtBuffer: true,
printing: true,
download: true,
});
export const ViewerArchiveFilesActions = Object.freeze({
...ArchiveFilesActions,
viewContent: true,
viewComments: true,
copyAtBuffer: true,
printing: true,
download: true,
});

View File

@ -8,6 +8,7 @@ export const ArchiveRoomsActions = Object.freeze({
deleteUsers: false, deleteUsers: false,
restore: false, restore: false,
delete: false, delete: false,
canPin: false,
}); });
export const OwnerArchiveRoomsActions = Object.freeze({ export const OwnerArchiveRoomsActions = Object.freeze({

View File

@ -19,6 +19,9 @@ export const FilesActions = Object.freeze({
moveAlien: false, moveAlien: false,
rename: false, rename: false,
copyFromPersonal: false, copyFromPersonal: false,
saveAsForm: false,
canCopy: false,
canDuplicate: false,
}); });
export const OwnerFilesActions = Object.freeze({ export const OwnerFilesActions = Object.freeze({
@ -43,6 +46,9 @@ export const OwnerFilesActions = Object.freeze({
moveAlien: true, moveAlien: true,
rename: true, rename: true,
copyFromPersonal: true, copyFromPersonal: true,
saveAsForm: true,
canCopy: true,
canDuplicate: true,
}); });
export const RoomAdminFilesActions = Object.freeze({ export const RoomAdminFilesActions = Object.freeze({
@ -67,6 +73,9 @@ export const RoomAdminFilesActions = Object.freeze({
moveAlien: true, moveAlien: true,
rename: true, rename: true,
copyFromPersonal: true, copyFromPersonal: true,
saveAsForm: true,
canCopy: true,
canDuplicate: true,
}); });
export const EditorFilesActions = Object.freeze({ export const EditorFilesActions = Object.freeze({

View File

@ -8,6 +8,7 @@ export const RoomsActions = Object.freeze({
deleteUsers: false, deleteUsers: false,
archive: false, archive: false,
delete: false, delete: false,
canPin: true,
}); });
export const OwnerRoomsActions = Object.freeze({ export const OwnerRoomsActions = Object.freeze({
@ -20,7 +21,6 @@ export const OwnerRoomsActions = Object.freeze({
viewInfo: true, viewInfo: true,
deleteUsers: true, deleteUsers: true,
archive: true, archive: true,
delete: true,
}); });
export const RoomAdminRoomsActions = Object.freeze({ export const RoomAdminRoomsActions = Object.freeze({

View File

@ -33,6 +33,17 @@ import {
ViewerFilesActions, ViewerFilesActions,
} from "./Files"; } from "./Files";
import {
ArchiveFilesActions,
OwnerArchiveFilesActions,
RoomAdminArchiveFilesActions,
EditorArchiveFilesActions,
FormFillerArchiveFilesActions,
ReviewerArchiveFilesActions,
CommentatorArchiveFilesActions,
ViewerArchiveFilesActions,
} from "./ArchiveFiles";
import { import {
OwnerAccountsActions, OwnerAccountsActions,
DocSpaceAdminAccountsActions, DocSpaceAdminAccountsActions,
@ -105,6 +116,28 @@ export const getArchiveRoomRoleActions = (access) => {
} }
}; };
export const getArchiveFileRoleActions = (access) => {
switch (access) {
case ShareAccessRights.None:
case ShareAccessRights.FullAccess:
return OwnerArchiveFilesActions;
case ShareAccessRights.RoomManager:
return RoomAdminArchiveFilesActions;
case ShareAccessRights.Editing:
return EditorArchiveFilesActions;
case ShareAccessRights.FormFilling:
return FormFillerArchiveFilesActions;
case ShareAccessRights.Review:
return ReviewerArchiveFilesActions;
case ShareAccessRights.Comment:
return CommentatorArchiveFilesActions;
case ShareAccessRights.ReadOnly:
return ViewerArchiveFilesActions;
default:
return ArchiveFilesActions;
}
};
export const getAccountsTypeActions = (isAdmin, isOwner) => { export const getAccountsTypeActions = (isAdmin, isOwner) => {
if (isOwner) return OwnerAccountsActions; if (isOwner) return OwnerAccountsActions;

View File

@ -110,9 +110,7 @@ const StyledContextMenu = styled.div`
.avatar-wrapper { .avatar-wrapper {
min-width: 32px; min-width: 32px;
box-sizing: border-box; box-sizing: border-box;
margin-right: 8px; margin-right: 8px;
} }
@ -120,7 +118,6 @@ const StyledContextMenu = styled.div`
width: 100%; width: 100%;
font-size: ${(props) => props.theme.menuItem.text.header.fontSize}; font-size: ${(props) => props.theme.menuItem.text.header.fontSize};
font-weight: 600; font-weight: 600;
line-height: 16px;
${(props) => ${(props) =>
props.isIconExist && props.isIconExist &&
css` css`

View File

@ -26,7 +26,10 @@ import { canConvert } from "../helpers/utils";
import { assign } from "@docspace/common/utils"; import { assign } from "@docspace/common/utils";
import toastr from "@docspace/components/toast/toastr"; import toastr from "@docspace/components/toast/toastr";
import { DocumentEditor } from "@onlyoffice/document-editor-react"; import { DocumentEditor } from "@onlyoffice/document-editor-react";
import { getFileRoleActions } from "@docspace/common/utils/actions"; import {
getArchiveFileRoleActions,
getFileRoleActions,
} from "@docspace/common/utils/actions";
toast.configure(); toast.configure();
@ -94,13 +97,16 @@ function Editor({
filesSettings, filesSettings,
}) { }) {
const fileInfo = config?.file; const fileInfo = config?.file;
isArchiveFolderRoot = isArchiveFolderRoot =
fileInfo && fileInfo.rootFolderType === FolderType.Archive; fileInfo && fileInfo.rootFolderType === FolderType.Archive;
const { t } = useTranslation(["Editor", "Common"]); const { t } = useTranslation(["Editor", "Common"]);
if (fileInfo) { if (fileInfo) {
userAccessRights = getFileRoleActions(fileInfo.access); userAccessRights = isArchiveFolderRoot
? getArchiveFileRoleActions(fileInfo.access)
: getFileRoleActions(fileInfo.access);
} }
useEffect(() => { useEffect(() => {
if (error && mfReady) { if (error && mfReady) {
@ -532,7 +538,7 @@ function Editor({
); );
} }
let onRequestSharingSettings, let //onRequestSharingSettings,
onRequestRename, onRequestRename,
onRequestSaveAs, onRequestSaveAs,
onRequestInsertImage, onRequestInsertImage,
@ -545,7 +551,7 @@ function Editor({
// onRequestSharingSettings = onSDKRequestSharingSettings; // onRequestSharingSettings = onSDKRequestSharingSettings;
// } // }
if (userAccessRights.rename && !isArchiveFolderRoot) { if (userAccessRights.rename) {
onRequestRename = onSDKRequestRename; onRequestRename = onSDKRequestRename;
} }
@ -563,7 +569,7 @@ function Editor({
onRequestCompareFile = onSDKRequestCompareFile; onRequestCompareFile = onSDKRequestCompareFile;
} }
if (userAccessRights.changeVersionHistory && !isArchiveFolderRoot) { if (userAccessRights.changeVersionHistory) {
onRequestRestore = onSDKRequestRestore; onRequestRestore = onSDKRequestRestore;
} }