Merge branch 'develop' into feature/socket-newtag
This commit is contained in:
commit
1b7844b44a
@ -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)
|
||||||
|
|
||||||
|
@ -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}
|
||||||
|
@ -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/
|
||||||
|
@ -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 && \
|
||||||
|
@ -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}
|
||||||
|
@ -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: ./
|
||||||
|
@ -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
@ -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"
|
||||||
|
@ -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}
|
||||||
|
@ -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")
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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}";
|
||||||
|
@ -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": ""
|
||||||
},
|
},
|
||||||
|
@ -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));
|
||||||
|
@ -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));
|
||||||
|
@ -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>
|
||||||
|
@ -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}
|
||||||
/>
|
/>
|
||||||
|
@ -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">
|
||||||
|
@ -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 }) => {
|
||||||
|
@ -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);
|
||||||
|
@ -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}
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
)(
|
)(
|
||||||
|
@ -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",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
@ -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={
|
||||||
<>
|
<>
|
||||||
|
@ -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)));
|
||||||
|
@ -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)
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
@ -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,
|
||||||
|
@ -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 = {
|
||||||
|
@ -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));
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
95
packages/common/utils/actions/ArchiveFiles.js
Normal file
95
packages/common/utils/actions/ArchiveFiles.js
Normal 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,
|
||||||
|
});
|
@ -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({
|
||||||
|
@ -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({
|
||||||
|
@ -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({
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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`
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user