From 7549ba691caa53600b7dafc8ee635edd4fd2a3d7 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Mon, 20 Sep 2021 20:04:54 +0300 Subject: [PATCH 01/80] fix Bug 52632 fix Bug 52631 --- .../Core/Core/Dao/TeamlabDao/FileDao.cs | 2 +- products/ASC.Files/Core/Helpers/Global.cs | 34 ++++++++----------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs index 9d4896f4dc..6600a8119e 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs @@ -374,7 +374,7 @@ namespace ASC.Files.Core.Data throw FileSizeComment.GetFileSizeException(maxChunkedUploadSize); } - if (CoreBaseSettings.Personal && SetupInfo.IsVisibleSettings("PersonalMaxSpace")) + if (checkQuota && CoreBaseSettings.Personal && SetupInfo.IsVisibleSettings("PersonalMaxSpace")) { var personalMaxSpace = CoreConfiguration.PersonalMaxSpace(SettingsManager); if (personalMaxSpace - GlobalSpace.GetUserUsedSpace(file.ID == default ? AuthContext.CurrentAccount.ID : file.CreateBy) < file.ContentLength) diff --git a/products/ASC.Files/Core/Helpers/Global.cs b/products/ASC.Files/Core/Helpers/Global.cs index c475f4b905..f2a0fb6577 100644 --- a/products/ASC.Files/Core/Helpers/Global.cs +++ b/products/ASC.Files/Core/Helpers/Global.cs @@ -38,6 +38,7 @@ using ASC.Core.Common.Settings; using ASC.Core.Users; using ASC.Data.Storage; using ASC.Files.Core; +using ASC.Files.Core.Data; using ASC.Files.Core.Resources; using ASC.Files.Core.Security; using ASC.Web.Core; @@ -319,8 +320,8 @@ namespace ASC.Web.Files.Classes return (T)Convert.ChangeType(GetFolderProjects(daoFactory), typeof(T)); } - internal static readonly IDictionary UserRootFolderCache = - new ConcurrentDictionary(); /*Use SYNCHRONIZED for cross thread blocks*/ + internal static readonly ConcurrentDictionary> UserRootFolderCache = + new ConcurrentDictionary>(); /*Use SYNCHRONIZED for cross thread blocks*/ public T GetFolderMy(FileMarker fileMarker, IDaoFactory daoFactory) { @@ -334,19 +335,14 @@ namespace ASC.Web.Files.Classes var cacheKey = string.Format("my/{0}/{1}", TenantManager.GetCurrentTenant().TenantId, AuthContext.CurrentAccount.ID); - if (!UserRootFolderCache.TryGetValue(cacheKey, out var myFolderId)) - { - myFolderId = GetFolderIdAndProccessFirstVisit(fileMarker, daoFactory, true); - if (!Equals(myFolderId, 0)) - UserRootFolderCache[cacheKey] = myFolderId; - } - return myFolderId; + var myFolderId = UserRootFolderCache.GetOrAdd(cacheKey, (a) => new Lazy(() => GetFolderIdAndProccessFirstVisit(fileMarker, daoFactory, true))); + return myFolderId.Value; } protected internal void SetFolderMy(object value) { var cacheKey = string.Format("my/{0}/{1}", TenantManager.GetCurrentTenant().TenantId, value); - UserRootFolderCache.Remove(cacheKey); + UserRootFolderCache.Remove(cacheKey, out _); } public bool IsFirstVisit(IDaoFactory daoFactory) @@ -381,7 +377,7 @@ namespace ASC.Web.Files.Classes if (!CommonFolderCache.TryGetValue(TenantManager.GetCurrentTenant().TenantId, out var commonFolderId)) { - commonFolderId = GetFolderIdAndProccessFirstVisit(fileMarker, daoFactory, false); + commonFolderId = GetFolderIdAndProccessFirstVisit(fileMarker, daoFactory, false); if (!Equals(commonFolderId, 0)) CommonFolderCache[TenantManager.GetCurrentTenant().TenantId] = commonFolderId; } @@ -526,10 +522,10 @@ namespace ASC.Web.Files.Classes TrashFolderCache.Remove(cacheKey); } - private T GetFolderIdAndProccessFirstVisit(FileMarker fileMarker, IDaoFactory daoFactory, bool my) + private int GetFolderIdAndProccessFirstVisit(FileMarker fileMarker, IDaoFactory daoFactory, bool my) { - var folderDao = daoFactory.GetFolderDao(); - var fileDao = daoFactory.GetFileDao(); + var folderDao = (FolderDao)daoFactory.GetFolderDao(); + var fileDao = (FileDao)daoFactory.GetFileDao(); var id = my ? folderDao.GetFolderIDUser(false) : folderDao.GetFolderIDCommon(false); @@ -563,7 +559,7 @@ namespace ASC.Web.Files.Classes return id; } - private void SaveStartDocument(FileMarker fileMarker, IFolderDao folderDao, IFileDao fileDao, T folderId, string path, IDataStore storeTemplate) + private void SaveStartDocument(FileMarker fileMarker, FolderDao folderDao, FileDao fileDao, int folderId, string path, IDataStore storeTemplate) { foreach (var file in storeTemplate.ListFilesRelative("", path, "*", false)) { @@ -572,7 +568,7 @@ namespace ASC.Web.Files.Classes foreach (var folderName in storeTemplate.ListDirectoriesRelative(path, false)) { - var folder = ServiceProvider.GetService>(); + var folder = ServiceProvider.GetService>(); folder.Title = folderName; folder.FolderID = folderId; @@ -582,7 +578,7 @@ namespace ASC.Web.Files.Classes } } - private void SaveFile(FileMarker fileMarker, IFileDao fileDao, T folder, string filePath, IDataStore storeTemp) + private void SaveFile(FileMarker fileMarker, FileDao fileDao, int folder, string filePath, IDataStore storeTemp) { try { @@ -591,7 +587,7 @@ namespace ASC.Web.Files.Classes return; var fileName = Path.GetFileName(filePath); - var file = ServiceProvider.GetService>(); + var file = ServiceProvider.GetService>(); file.Title = fileName; file.FolderID = folder; @@ -600,7 +596,7 @@ namespace ASC.Web.Files.Classes using (var stream = storeTemp.GetReadStream("", filePath)) { file.ContentLength = stream.CanSeek ? stream.Length : storeTemp.GetFileSize("", filePath); - file = fileDao.SaveFile(file, stream); + file = fileDao.SaveFile(file, stream, false); } var pathThumb = filePath + "." + Global.ThumbnailExtension; From 9221136e50e52d1755cb6c934eff97524e54ff9c Mon Sep 17 00:00:00 2001 From: Sergey Kirichenko Date: Tue, 21 Sep 2021 10:53:05 +0300 Subject: [PATCH 02/80] Modify frontend build feature (#341) * Modify frontend build * Modify frontend build * Modify build hooks --- build/install/common/build-frontend.sh | 21 ++++++++++++++++++--- build/install/docker/Dockerfile-app | 4 +++- build/install/docker/hooks/build | 4 +++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/build/install/common/build-frontend.sh b/build/install/common/build-frontend.sh index 95b0c77ba2..6ba65f555d 100644 --- a/build/install/common/build-frontend.sh +++ b/build/install/common/build-frontend.sh @@ -1,6 +1,8 @@ #!/bin/bash SRC_PATH="/AppServer" +BUILD_ARGS="build" +DEPLOY_ARGS="deploy" while [ "$1" != "" ]; do case $1 in @@ -11,11 +13,24 @@ while [ "$1" != "" ]; do shift fi ;; - + -ba | --build-args ) + if [ "$2" != "" ]; then + BUILD_ARGS=$2 + shift + fi + ;; + -da | --deploy-args ) + if [ "$2" != "" ]; then + DEPLOY_ARGS=$2 + shift + fi + ;; -? | -h | --help ) echo " Usage: bash build-backend.sh [PARAMETER] [[PARAMETER], ...]" echo " Parameters:" echo " -sp, --srcpath path to AppServer root directory" + echo " -ba, --build-args arguments for yarn building" + echo " -da, --deploy-args arguments for yarn deploying" echo " -?, -h, --help this help" echo " Examples" echo " bash build-backend.sh -sp /app/AppServer" @@ -34,5 +49,5 @@ echo "== FRONT-END-BUILD ==" cd ${SRC_PATH} yarn install -yarn build -yarn deploy +yarn ${BUILD_ARGS} +yarn ${DEPLOY_ARGS} diff --git a/build/install/docker/Dockerfile-app b/build/install/docker/Dockerfile-app index 45d2d23026..3ea0cb16c1 100644 --- a/build/install/docker/Dockerfile-app +++ b/build/install/docker/Dockerfile-app @@ -12,6 +12,8 @@ ARG BUILD_NUMBER=0 ARG GIT_BRANCH=master ARG SRC_PATH ARG BUILD_PATH +ARG BUILD_ARGS=build +ARG DEPLOY_ARGS=deploy LABEL onlyoffice.appserver.release-date="${RELEASE_DATE}" \ maintainer="Ascensio System SIA " @@ -46,7 +48,7 @@ RUN echo "nameserver 8.8.8.8" | tee /etc/resolv.conf > /dev/null && \ sed -i "s/\"number\".*,/\"number\": \"${PRODUCT_VERSION}.${BUILD_NUMBER}\",/g" /app/onlyoffice/config/appsettings.json && \ sed -e 's/#//' -i /etc/nginx/conf.d/onlyoffice.conf && \ cd ${SRC_PATH}/build/install/common/ && \ - bash build-frontend.sh -sp ${SRC_PATH} && \ + bash build-frontend.sh -sp ${SRC_PATH} -ba ${BUILD_ARGS} -da ${DEPLOY_ARGS} && \ bash build-backend.sh -sp ${SRC_PATH} && \ bash publish-backend.sh -sp ${SRC_PATH} -bp ${BUILD_PATH} && \ cp -rf ${SRC_PATH}/products/ASC.Files/Server/DocStore ${BUILD_PATH}/products/ASC.Files/server/ && \ diff --git a/build/install/docker/hooks/build b/build/install/docker/hooks/build index 71666dda5c..d601d5aa8a 100644 --- a/build/install/docker/hooks/build +++ b/build/install/docker/hooks/build @@ -4,4 +4,6 @@ BUILD_NUMBER="$(date "+%Y%m%d%H")" docker-compose -f build.yml build \ --build-arg GIT_BRANCH=$SOURCE_BRANCH \ --build-arg PRODUCT_VERSION=$PRODUCT_VERSION \ - --build-arg BUILD_NUMBER=$BUILD_NUMBER + --build-arg BUILD_NUMBER=$BUILD_NUMBER \ + --build-arg BUILD_ARGS=$BUILD_ARGS \ + --build-arg DEPLOY_ARGS=$DEPLOY_ARGS From e87329f2d3e5c7e743daed73675c17041e5d702c Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Tue, 21 Sep 2021 12:17:26 +0300 Subject: [PATCH 03/80] Fixed Bug 52646 - iOS.Docs.Mobile. Fixed the type of device for the editor --- web/ASC.Web.Editor/src/Editor.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/ASC.Web.Editor/src/Editor.jsx b/web/ASC.Web.Editor/src/Editor.jsx index 3d44d8856e..09e3d7842d 100644 --- a/web/ASC.Web.Editor/src/Editor.jsx +++ b/web/ASC.Web.Editor/src/Editor.jsx @@ -44,7 +44,7 @@ import i18n from "./i18n"; import Text from "@appserver/components/text"; import TextInput from "@appserver/components/text-input"; import Checkbox from "@appserver/components/checkbox"; - +import { isMobile } from "react-device-detect"; import store from "studio/store"; const { auth: authStore } = store; @@ -381,7 +381,7 @@ const Editor = () => { setFavicon(config.documentType); setDocumentTitle(docTitle); - if (window.innerWidth < 720) { + if (isMobile) { config.type = "mobile"; } From 6691e523a80fa5690102273ebafaab13b145fb19 Mon Sep 17 00:00:00 2001 From: Viktor Fomin Date: Tue, 21 Sep 2021 13:48:13 +0300 Subject: [PATCH 04/80] Fix bug 52626, 52622: Media Viewer crash --- .../components/MediaViewer/MediaViewer.js | 30 +++++-------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/packages/asc-web-common/components/MediaViewer/MediaViewer.js b/packages/asc-web-common/components/MediaViewer/MediaViewer.js index e2bd80b67e..6f3754a503 100644 --- a/packages/asc-web-common/components/MediaViewer/MediaViewer.js +++ b/packages/asc-web-common/components/MediaViewer/MediaViewer.js @@ -109,7 +109,8 @@ class MediaViewer extends React.Component { _this.hammer.on("swiperight", _this.prevMedia); } } catch (ex) { - console.error("MediaViewer updateHammer", ex); + //console.error("MediaViewer updateHammer", ex); + this.hammer = null; } }, 500); } @@ -190,33 +191,15 @@ class MediaViewer extends React.Component { if (ext === ".tiff" || ext === ".tif") { this.getTiffDataURL(src); } - var _this = this; - setTimeout(function () { - if (document.getElementsByClassName("react-viewer-canvas").length > 0) { - _this.hammer = Hammer( - document.getElementsByClassName("react-viewer-canvas")[0] - ); - var pinch = new Hammer.Pinch(); - _this.hammer.add([pinch]); - _this.hammer.on("pinchout", _this.handleZoomOut); - _this.hammer.on("pinchin", _this.handleZoomIn); - _this.hammer.on("pinchend", _this.handleZoomEnd); - _this.hammer.on("doubletap", _this.doubleTap); - } else { - _this.hammer = Hammer( - document.getElementsByClassName("videoViewerOverlay")[0] - ); - } - if (_this.hammer) { - _this.hammer.on("swipeleft", _this.nextMedia); - _this.hammer.on("swiperight", _this.prevMedia); - } - }, 500); + + this.updateHammer(); + document.addEventListener("keydown", this.onKeydown, false); document.addEventListener("keyup", this.onKeyup, false); } componentWillUnmount() { + console.log("unmount mediaviewer"); if (this.hammer) { this.hammer.off("swipeleft", this.nextMedia); this.hammer.off("swiperight", this.prevMedia); @@ -227,6 +210,7 @@ class MediaViewer extends React.Component { } document.removeEventListener("keydown", this.onKeydown, false); document.removeEventListener("keyup", this.onKeyup, false); + this.onClose(); } mapSupplied = { From 11935dc196717b330d68aa57d1fd7471d5d4792e Mon Sep 17 00:00:00 2001 From: Viktor Fomin Date: Tue, 21 Sep 2021 14:00:59 +0300 Subject: [PATCH 05/80] Web: Common: delete useless --- packages/asc-web-common/components/MediaViewer/MediaViewer.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/asc-web-common/components/MediaViewer/MediaViewer.js b/packages/asc-web-common/components/MediaViewer/MediaViewer.js index 6f3754a503..211a4abcf1 100644 --- a/packages/asc-web-common/components/MediaViewer/MediaViewer.js +++ b/packages/asc-web-common/components/MediaViewer/MediaViewer.js @@ -199,7 +199,6 @@ class MediaViewer extends React.Component { } componentWillUnmount() { - console.log("unmount mediaviewer"); if (this.hammer) { this.hammer.off("swipeleft", this.nextMedia); this.hammer.off("swiperight", this.prevMedia); From d702b47502bf86cf73e7b82575c7301c4879be1c Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Tue, 21 Sep 2021 14:01:06 +0300 Subject: [PATCH 06/80] Fixed Bug 52642 - Android.Docs.Mobile. Fixed orientation change for mobile Firefox --- packages/asc-web-common/components/PageLayout/index.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/asc-web-common/components/PageLayout/index.js b/packages/asc-web-common/components/PageLayout/index.js index dbbb534a82..a49c665599 100644 --- a/packages/asc-web-common/components/PageLayout/index.js +++ b/packages/asc-web-common/components/PageLayout/index.js @@ -3,7 +3,7 @@ import PropTypes from "prop-types"; import Backdrop from "@appserver/components/backdrop"; import { size } from "@appserver/components/utils/device"; import { Provider } from "@appserver/components/utils/context"; -import { isMobile } from "react-device-detect"; +import { isMobile, isFirefox, isMobileOnly } from "react-device-detect"; import Article from "./sub-components/article"; import SubArticleHeader from "./sub-components/article-header"; import SubArticleMainButton from "./sub-components/article-main-button"; @@ -114,8 +114,12 @@ class PageLayout extends React.Component { orientationChangeHandler = () => { const isValueExist = !!this.props.isArticlePinned; const isEnoughWidth = screen.availWidth > size.smallTablet; + const isPortrait = + isFirefox && + isMobileOnly && + screen.orientation.type === "landscape-primary"; - if (!isEnoughWidth && isValueExist) { + if ((!isEnoughWidth && isValueExist) || isPortrait) { this.backdropClick(); } if (isEnoughWidth && isValueExist) { From 5e37585b0c03dbd9dd829da871099fded7a4e12e Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Tue, 21 Sep 2021 14:24:43 +0300 Subject: [PATCH 07/80] Web: Files: fixed table --- .../table-container/TableHeader.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/packages/asc-web-components/table-container/TableHeader.js b/packages/asc-web-components/table-container/TableHeader.js index 0d1340e976..623b735002 100644 --- a/packages/asc-web-components/table-container/TableHeader.js +++ b/packages/asc-web-components/table-container/TableHeader.js @@ -35,7 +35,9 @@ class TableHeader extends React.Component { } componentDidUpdate() { - this.onResize(); + if (this.props.sectionWidth >= size.tablet + 24) { + this.onResize(); + } } getSubstring = (str) => +str.substring(0, str.length - 2); @@ -201,23 +203,15 @@ class TableHeader extends React.Component { columnStorageName, checkboxSize, resetColumnsSize, - sectionWidth, } = this.props; - const minSize = size.tablet + 24; - let activeColumnIndex = null; const container = containerRef.current ? containerRef.current : document.getElementById("table-container"); - if ( - !container || - +container.clientWidth <= minSize || - sectionWidth <= minSize - ) - return; + if (!container) return; const storageSize = !resetColumnsSize && localStorage.getItem(columnStorageName); From de444cca9323619a01d5eef3ce953fa211fa2feb Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Tue, 21 Sep 2021 14:46:06 +0300 Subject: [PATCH 08/80] Web: Components: fixed table resizing after window resizing --- packages/asc-web-components/table-container/TableHeader.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/asc-web-components/table-container/TableHeader.js b/packages/asc-web-components/table-container/TableHeader.js index 0d1340e976..7147aed465 100644 --- a/packages/asc-web-components/table-container/TableHeader.js +++ b/packages/asc-web-components/table-container/TableHeader.js @@ -204,17 +204,18 @@ class TableHeader extends React.Component { sectionWidth, } = this.props; - const minSize = size.tablet + 24; - let activeColumnIndex = null; const container = containerRef.current ? containerRef.current : document.getElementById("table-container"); + const minSize = size.tablet; + const containerMargin = 25; + if ( !container || - +container.clientWidth <= minSize || + +container.clientWidth + containerMargin <= minSize || sectionWidth <= minSize ) return; From 3f2e615ad31df4e6e26b145123927d4f3c774d14 Mon Sep 17 00:00:00 2001 From: Viktor Fomin Date: Tue, 21 Sep 2021 14:52:16 +0300 Subject: [PATCH 09/80] Web: Files: fixed link copied toast --- products/ASC.Files/Client/public/locales/de/Translations.json | 2 +- products/ASC.Files/Client/public/locales/en/Translations.json | 2 +- products/ASC.Files/Client/public/locales/ru/Translations.json | 2 +- .../Client/src/components/panels/SharingPanel/SharingRow.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/products/ASC.Files/Client/public/locales/de/Translations.json b/products/ASC.Files/Client/public/locales/de/Translations.json index a885c9b96a..6b4540f519 100644 --- a/products/ASC.Files/Client/public/locales/de/Translations.json +++ b/products/ASC.Files/Client/public/locales/de/Translations.json @@ -11,7 +11,7 @@ "EncryptedFileSaving": "Die verschlüsselte Datei wird gespeichert", "Files": "Dateien", "Folders": "Ordner", - "LinkCopySuccess": "Der Link wurde in die Zwischenablage kopiert", + "LinkCopySuccess": "Link kopiert", "Move": "Verschieben", "MoveToOperation": "Wird verschoben", "OwnerChange": "Besitzer ändern", diff --git a/products/ASC.Files/Client/public/locales/en/Translations.json b/products/ASC.Files/Client/public/locales/en/Translations.json index 25d641a508..fea2e92808 100644 --- a/products/ASC.Files/Client/public/locales/en/Translations.json +++ b/products/ASC.Files/Client/public/locales/en/Translations.json @@ -12,7 +12,7 @@ "EncryptedFileSaving": "Saving encrypted file", "Files": "Files", "Folders": "Folders", - "LinkCopySuccess": "Link has been copied to the clipboard", + "LinkCopySuccess": "Link copied", "Move": "Move", "MoveToOperation": "Moving", "OwnerChange": "Change owner", diff --git a/products/ASC.Files/Client/public/locales/ru/Translations.json b/products/ASC.Files/Client/public/locales/ru/Translations.json index aade2d56b9..e1412d9098 100644 --- a/products/ASC.Files/Client/public/locales/ru/Translations.json +++ b/products/ASC.Files/Client/public/locales/ru/Translations.json @@ -12,7 +12,7 @@ "EncryptedFileSaving": "Сохранение зашифрованного файла", "Files": "Файлы", "Folders": "Папки", - "LinkCopySuccess": "Ссылка скопирована в буфер обмена", + "LinkCopySuccess": "Ссылка скопирована", "Move": "Переместить", "MoveToOperation": "Перемещение", "OwnerChange": "Сменить владельца", diff --git a/products/ASC.Files/Client/src/components/panels/SharingPanel/SharingRow.js b/products/ASC.Files/Client/src/components/panels/SharingPanel/SharingRow.js index ef1795b11a..4dd68173b3 100644 --- a/products/ASC.Files/Client/src/components/panels/SharingPanel/SharingRow.js +++ b/products/ASC.Files/Client/src/components/panels/SharingPanel/SharingRow.js @@ -3,7 +3,7 @@ import IconButton from "@appserver/components/icon-button"; import Link from "@appserver/components/link"; import Row from "@appserver/components/row"; import Text from "@appserver/components/text"; -import toastr from "studio/toastr"; +import toastr from "@appserver/components/toast/toastr"; import copy from "copy-to-clipboard"; import LinkRow from "./linkRow"; import AccessComboBox from "./AccessComboBox"; From c0a5a9f532d4890036add15c8042a2becf82b065 Mon Sep 17 00:00:00 2001 From: Viktor Fomin Date: Tue, 21 Sep 2021 15:07:34 +0300 Subject: [PATCH 10/80] Web: Files: fixed toast in empty trash --- .../Client/src/components/dialogs/EmptyTrashDialog/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/products/ASC.Files/Client/src/components/dialogs/EmptyTrashDialog/index.js b/products/ASC.Files/Client/src/components/dialogs/EmptyTrashDialog/index.js index b82568ff08..6eac792991 100644 --- a/products/ASC.Files/Client/src/components/dialogs/EmptyTrashDialog/index.js +++ b/products/ASC.Files/Client/src/components/dialogs/EmptyTrashDialog/index.js @@ -6,7 +6,7 @@ import Button from "@appserver/components/button"; import ModalDialog from "@appserver/components/modal-dialog"; import { withTranslation } from "react-i18next"; import { getProgress, emptyTrash } from "@appserver/common/api/files"; -import toastr from "studio/toastr"; +import toastr from "@appserver/components/toast/toastr"; import { TIMEOUT } from "../../../helpers/constants"; import { inject, observer } from "mobx-react"; From 454eb34dd5723a9b7f1dcdcdf5a899e186658abb Mon Sep 17 00:00:00 2001 From: Tatiana Lopaeva Date: Tue, 21 Sep 2021 16:15:31 +0300 Subject: [PATCH 11/80] Web: Components: Removed abbreviations of folder names in the tree, if the width of article allows. --- packages/asc-web-components/tree-menu/index.js | 2 +- .../asc-web-components/tree-menu/sub-components/tree-node.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/asc-web-components/tree-menu/index.js b/packages/asc-web-components/tree-menu/index.js index 44e4aa718f..5b2dcfef03 100644 --- a/packages/asc-web-components/tree-menu/index.js +++ b/packages/asc-web-components/tree-menu/index.js @@ -58,7 +58,7 @@ const StyledTreeMenu = styled(Tree)` `} & .rc-tree-node-selected .rc-tree-title { - ${(props) => !props.isFullFillSelection && "width: 85%;"} + ${(props) => !props.isFullFillSelection && "width: calc(100% - 26px);"} } &:not(.rc-tree-show-line) .rc-tree-switcher-noop { diff --git a/packages/asc-web-components/tree-menu/sub-components/tree-node.js b/packages/asc-web-components/tree-menu/sub-components/tree-node.js index 9239a9ae25..738939360c 100644 --- a/packages/asc-web-components/tree-menu/sub-components/tree-node.js +++ b/packages/asc-web-components/tree-menu/sub-components/tree-node.js @@ -121,7 +121,7 @@ const TreeNodeMenu = styled(TreeNode)` ${NoUserSelect} .rc-tree-node-selected { - max-width: ${(props) => (props.newItems > 999 ? "71%" : "98%")} !important; + max-width: ${(props) => (props.newItems > 999 ? "71%" : "102%")} !important; } ${(props) => From 533fbd47fd531eabcff9fa02a1c14ea72a6f25a9 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Tue, 21 Sep 2021 17:50:07 +0300 Subject: [PATCH 12/80] Web: Components: fixed min column size --- packages/asc-web-components/table-container/TableHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/asc-web-components/table-container/TableHeader.js b/packages/asc-web-components/table-container/TableHeader.js index 7147aed465..f2ba984836 100644 --- a/packages/asc-web-components/table-container/TableHeader.js +++ b/packages/asc-web-components/table-container/TableHeader.js @@ -12,7 +12,7 @@ import TableHeaderCell from "./TableHeaderCell"; import { size } from "../utils/device"; import TableGroupMenu from "./TableGroupMenu"; -const minColumnSize = 90; +const minColumnSize = 150; const settingsSize = 24; class TableHeader extends React.Component { From 2d8dde76329ac10d41abbc171af08457be7ce2d4 Mon Sep 17 00:00:00 2001 From: Viktor Fomin Date: Wed, 22 Sep 2021 13:52:01 +0300 Subject: [PATCH 13/80] Web: Files: fix toastr --- products/ASC.Files/Client/src/HOCs/withBadges.js | 2 +- products/ASC.Files/Client/src/HOCs/withContextOptions.js | 2 +- .../Client/src/components/panels/EmbeddingPanel/index.js | 2 +- products/ASC.Files/Client/src/pages/Home/index.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/products/ASC.Files/Client/src/HOCs/withBadges.js b/products/ASC.Files/Client/src/HOCs/withBadges.js index e0c4dec024..75aec07454 100644 --- a/products/ASC.Files/Client/src/HOCs/withBadges.js +++ b/products/ASC.Files/Client/src/HOCs/withBadges.js @@ -5,7 +5,7 @@ import { ShareAccessRights, AppServerConfig, } from "@appserver/common/constants"; -import toastr from "studio/toastr"; +import toastr from "@appserver/components/toast/toastr"; import { combineUrl } from "@appserver/common/utils"; import { getFileConversationProgress } from "@appserver/common/api/files"; diff --git a/products/ASC.Files/Client/src/HOCs/withContextOptions.js b/products/ASC.Files/Client/src/HOCs/withContextOptions.js index 113b0b3642..c27959baa7 100644 --- a/products/ASC.Files/Client/src/HOCs/withContextOptions.js +++ b/products/ASC.Files/Client/src/HOCs/withContextOptions.js @@ -3,7 +3,7 @@ import { inject, observer } from "mobx-react"; import copy from "copy-to-clipboard"; import { combineUrl } from "@appserver/common/utils"; import { FileAction, AppServerConfig } from "@appserver/common/constants"; -import toastr from "studio/toastr"; +import toastr from "@appserver/components/toast/toastr"; import config from "../../package.json"; export default function withContextOptions(WrappedComponent) { diff --git a/products/ASC.Files/Client/src/components/panels/EmbeddingPanel/index.js b/products/ASC.Files/Client/src/components/panels/EmbeddingPanel/index.js index 8c2e0ebecb..cb98c4d178 100644 --- a/products/ASC.Files/Client/src/components/panels/EmbeddingPanel/index.js +++ b/products/ASC.Files/Client/src/components/panels/EmbeddingPanel/index.js @@ -8,7 +8,7 @@ import Text from "@appserver/components/text"; import Link from "@appserver/components/link"; import TextInput from "@appserver/components/text-input"; import Textarea from "@appserver/components/textarea"; -import toastr from "studio/toastr"; +import toastr from "@appserver/components/toast/toastr"; import { withTranslation, I18nextProvider } from "react-i18next"; import { StyledEmbeddingPanel, diff --git a/products/ASC.Files/Client/src/pages/Home/index.js b/products/ASC.Files/Client/src/pages/Home/index.js index dd4fbe3cbc..952f754b42 100644 --- a/products/ASC.Files/Client/src/pages/Home/index.js +++ b/products/ASC.Files/Client/src/pages/Home/index.js @@ -3,7 +3,7 @@ import React from "react"; import { withRouter } from "react-router"; import { isMobile } from "react-device-detect"; import axios from "axios"; -import toastr from "studio/toastr"; +import toastr from "@appserver/components/toast/toastr"; import PageLayout from "@appserver/common/components/PageLayout"; import { showLoader, hideLoader } from "@appserver/common/utils"; import FilesFilter from "@appserver/common/api/files/filter"; From 844b996a6649003f8f392693f56d85c78b1af715 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Wed, 22 Sep 2021 16:37:11 +0300 Subject: [PATCH 14/80] Web: Client: fixed window height for IOS (Firefox, Safari) --- .../src/components/Layout/index.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/web/ASC.Web.Client/src/components/Layout/index.js b/web/ASC.Web.Client/src/components/Layout/index.js index 6cd93bae6f..7dab151e24 100644 --- a/web/ASC.Web.Client/src/components/Layout/index.js +++ b/web/ASC.Web.Client/src/components/Layout/index.js @@ -127,7 +127,7 @@ const Layout = (props) => { const updateHeight = () => { const correctorMobileChrome = 57; // ios - const correctorTabletSafari = 71; // ios + //const correctorTabletSafari = 71; // ios clearInterval(intervalHandler); clearTimeout(timeoutHandler); @@ -142,14 +142,15 @@ const Layout = (props) => { height = window.screen.availWidth - correctorMobileChrome; } } - if (isTablet && isIOS && isSafari) { - if ( - window.innerHeight < window.innerWidth && - window.innerWidth > 1024 - ) { - height = window.screen.availHeight - correctorTabletSafari; - } - } + + // if (isTablet && isIOS && isSafari) { + // if ( + // window.innerHeight < window.innerWidth && + // window.innerWidth > 1024 + // ) { + // height = window.screen.availHeight - correctorTabletSafari; + // } + // } setContentHeight(height); }; intervalHandler = setInterval(() => { From 6e016945d742afbfd00866960fac50431e437992 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Wed, 22 Sep 2021 18:55:37 +0300 Subject: [PATCH 15/80] Fixed Bug 52727 - Client.Files. Disabled drag for trash folder --- products/ASC.Files/Client/src/HOCs/withFileActions.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/products/ASC.Files/Client/src/HOCs/withFileActions.js b/products/ASC.Files/Client/src/HOCs/withFileActions.js index f2f16a5b18..0828802925 100644 --- a/products/ASC.Files/Client/src/HOCs/withFileActions.js +++ b/products/ASC.Files/Client/src/HOCs/withFileActions.js @@ -48,6 +48,7 @@ export default function withFileActions(WrappedFileItem) { setTooltipPosition, setStartDrag, isPrivacy, + isTrashFolder, onSelectItem, item, } = this.props; @@ -58,7 +59,7 @@ export default function withFileActions(WrappedFileItem) { const notSelectable = e.target.classList.contains("not-selectable"); const isFileName = e.target.classList.contains("item-file-name"); - if (isPrivacy || (!draggable && !isFileName)) return; + if (isPrivacy || isTrashFolder || (!draggable && !isFileName)) return; if (window.innerWidth < 1025 || notSelectable) { return; From 227937728d0d77867d61ceeb2f283de895c314eb Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Wed, 22 Sep 2021 19:16:30 +0300 Subject: [PATCH 16/80] Fix Bug 52730 - Client.Files.Image/Media. Fixed download for MediaViewer --- .../ASC.Files/Client/src/pages/Home/MediaViewer/index.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/products/ASC.Files/Client/src/pages/Home/MediaViewer/index.js b/products/ASC.Files/Client/src/pages/Home/MediaViewer/index.js index c0dc7d8d3d..8fdebf7e7b 100644 --- a/products/ASC.Files/Client/src/pages/Home/MediaViewer/index.js +++ b/products/ASC.Files/Client/src/pages/Home/MediaViewer/index.js @@ -5,7 +5,6 @@ import { withRouter } from "react-router"; import queryString from "query-string"; import history from "@appserver/common/history"; import MediaViewer from "@appserver/common/components/MediaViewer"; -import FilesFilter from "@appserver/common/api/files/filter"; import { createTreeFolders } from "../../../helpers/files-helpers"; const FilesMediaViewer = (props) => { @@ -86,8 +85,8 @@ const FilesMediaViewer = (props) => { }; const onDownloadMediaFile = (id) => { - if (files.length > 0) { - let viewUrlFile = files.find((file) => file.id === id).viewUrl; + if (playlist.length > 0) { + let viewUrlFile = playlist.find((file) => file.fileId === id).src; return window.open(viewUrlFile, "_self"); } }; From dd8fec1a8680dbf46e8f5738cd29b3a45714120d Mon Sep 17 00:00:00 2001 From: Viktor Fomin Date: Thu, 23 Sep 2021 05:43:15 +0300 Subject: [PATCH 17/80] Fix bug 52310: open files from upload panel --- .../Client/src/components/panels/UploadPanel/FileRow.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/products/ASC.Files/Client/src/components/panels/UploadPanel/FileRow.js b/products/ASC.Files/Client/src/components/panels/UploadPanel/FileRow.js index f3d2f92519..da022375d4 100644 --- a/products/ASC.Files/Client/src/components/panels/UploadPanel/FileRow.js +++ b/products/ASC.Files/Client/src/components/panels/UploadPanel/FileRow.js @@ -116,9 +116,7 @@ const FileRow = (props) => { } > <> - {item.fileId && - item.action !== "convert" && - item.action !== "converted" ? ( + {item.fileId ? ( isMedia ? ( Date: Thu, 23 Sep 2021 17:05:04 +0300 Subject: [PATCH 18/80] Bug 52726 - Client.Files.Image: Fix After removing the image from the viewer, the following media file is displayed on the page. --- .../asc-web-common/components/MediaViewer/MediaViewer.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/asc-web-common/components/MediaViewer/MediaViewer.js b/packages/asc-web-common/components/MediaViewer/MediaViewer.js index 211a4abcf1..f59497a68c 100644 --- a/packages/asc-web-common/components/MediaViewer/MediaViewer.js +++ b/packages/asc-web-common/components/MediaViewer/MediaViewer.js @@ -123,7 +123,8 @@ class MediaViewer extends React.Component { onEmptyPlaylistError, } = this.props; - const { playlistPos } = this.state; + const { playlistPos, fileUrl } = this.state; + const src = playlist[playlistPos]?.src; if (visible !== prevProps.visible) { const newPlaylistPos = @@ -137,6 +138,10 @@ class MediaViewer extends React.Component { }); } + if (src && src !== fileUrl && playlistPos === prevState.playlistPos) { + this.setState({ fileUrl: src }); + } + if ( visible && visible === prevProps.visible && From 06dda4229a704d389d25b4e9d815d203f924bb3b Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Thu, 23 Sep 2021 21:48:52 +0300 Subject: [PATCH 19/80] fix Bug 52608 --- .../Core/Core/Thirdparty/Box/BoxProviderInfo.cs | 2 +- .../Core/Core/Thirdparty/Sharpbox/SharpBoxDaoBase.cs | 10 ++++++++-- .../Core/Thirdparty/Sharpbox/SharpBoxProviderInfo.cs | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/products/ASC.Files/Core/Core/Thirdparty/Box/BoxProviderInfo.cs b/products/ASC.Files/Core/Core/Thirdparty/Box/BoxProviderInfo.cs index daef2a5179..a916b22ce7 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/Box/BoxProviderInfo.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/Box/BoxProviderInfo.cs @@ -190,7 +190,7 @@ namespace ASC.Files.Thirdparty.Box CheckToken(token, id); boxStorage.Open(token); - return boxStorage; + return Storage = boxStorage; } private void CheckToken(OAuth20Token token, int id) diff --git a/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxDaoBase.cs b/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxDaoBase.cs index ad9c015622..3cdc336b54 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxDaoBase.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxDaoBase.cs @@ -286,7 +286,7 @@ namespace ASC.Files.Thirdparty.Sharpbox folder.FolderID = isRoot ? null : MakeId(fsEntry.Parent); folder.CreateOn = isRoot ? ProviderInfo.CreateOn : fsEntry.Modified; folder.ModifiedOn = isRoot ? ProviderInfo.CreateOn : fsEntry.Modified; - folder.RootFolderId = MakeId(RootFolder()); + folder.RootFolderId = RootFolderMakeId(); folder.Title = MakeTitle(fsEntry); folder.TotalFiles = 0; /*fsEntry.Count - childFoldersCount NOTE: Removed due to performance isssues*/ @@ -356,7 +356,7 @@ namespace ASC.Files.Thirdparty.Sharpbox file.ModifiedOn = fsEntry.Modified.Kind == DateTimeKind.Utc ? TenantUtil.DateTimeFromUtc(fsEntry.Modified) : fsEntry.Modified; file.NativeAccessor = fsEntry; file.Title = MakeTitle(fsEntry); - file.RootFolderId = MakeId(RootFolder()); + file.RootFolderId = RootFolderMakeId(); return file; } @@ -365,6 +365,12 @@ namespace ASC.Files.Thirdparty.Sharpbox protected ICloudDirectoryEntry RootFolder() { return _rootFolder ??= ProviderInfo.Storage.GetRoot(); + } + + private string _rootFolderId; + protected string RootFolderMakeId() + { + return _rootFolderId ??= MakeId(RootFolder()); } protected ICloudDirectoryEntry GetFolderById(object folderId) diff --git a/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxProviderInfo.cs b/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxProviderInfo.cs index f9fa00931a..b8f1a4b192 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxProviderInfo.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxProviderInfo.cs @@ -166,7 +166,7 @@ namespace ASC.Files.Thirdparty.Sharpbox { storage.Open(config, new GenericNetworkCredentials { Password = _authData.Password, UserName = _authData.Login }); } - return storage; + return Storage = storage; } public void Dispose() From bd9492b533680b104d9ecfe1fdec4bed0a0721f0 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Fri, 24 Sep 2021 11:06:57 +0300 Subject: [PATCH 20/80] fixed version number --- config/appsettings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/appsettings.json b/config/appsettings.json index 15d4cbfddd..b1a657b417 100644 --- a/config/appsettings.json +++ b/config/appsettings.json @@ -45,7 +45,7 @@ "enabled": "enabled" }, "version": { - "number": "1.0.0", + "number": "11.5.0", "release": { "date": "", "sign": "" From 90bb2ef44a0316bb82a534a425939bac3df4716f Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Fri, 24 Sep 2021 12:08:10 +0300 Subject: [PATCH 21/80] fixed bearer --- common/ASC.Api.Core/Auth/CookieAuthHandler.cs | 11 ++++++++--- web/ASC.Web.Core/Helpers/AuthorizationHelper.cs | 4 +++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/common/ASC.Api.Core/Auth/CookieAuthHandler.cs b/common/ASC.Api.Core/Auth/CookieAuthHandler.cs index c779f064d5..1316ab3185 100644 --- a/common/ASC.Api.Core/Auth/CookieAuthHandler.cs +++ b/common/ASC.Api.Core/Auth/CookieAuthHandler.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using ASC.Common; using ASC.Core; using ASC.Web.Core; +using ASC.Web.Core.Helpers; using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.Logging; @@ -16,6 +17,7 @@ namespace ASC.Api.Core.Auth [Scope] public class CookieAuthHandler : AuthenticationHandler { + private AuthorizationHelper AuthorizationHelper { get; } private SecurityContext SecurityContext { get; } private CookiesManager CookiesManager { get; } @@ -23,17 +25,20 @@ namespace ASC.Api.Core.Auth { } // - public CookieAuthHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, SecurityContext securityContext, CookiesManager cookiesManager) + public CookieAuthHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, + AuthorizationHelper authorizationHelper, + SecurityContext securityContext, + CookiesManager cookiesManager) : this(options, logger, encoder, clock) { + AuthorizationHelper = authorizationHelper; SecurityContext = securityContext; CookiesManager = cookiesManager; } protected override Task HandleAuthenticateAsync() { - var token = Context.Request.Cookies["asc_auth_key"] ?? Context.Request.Headers["Authorization"]; - var result = SecurityContext.AuthenticateMe(token); + var result = AuthorizationHelper.ProcessBasicAuthorization(out _); if (!result) { diff --git a/web/ASC.Web.Core/Helpers/AuthorizationHelper.cs b/web/ASC.Web.Core/Helpers/AuthorizationHelper.cs index 4f89786ba5..b70d848ebf 100644 --- a/web/ASC.Web.Core/Helpers/AuthorizationHelper.cs +++ b/web/ASC.Web.Core/Helpers/AuthorizationHelper.cs @@ -27,6 +27,7 @@ using System; using System.Text; +using ASC.Common; using ASC.Core; using ASC.Security.Cryptography; @@ -34,6 +35,7 @@ using Microsoft.AspNetCore.Http; namespace ASC.Web.Core.Helpers { + [Scope] public class AuthorizationHelper { private IHttpContextAccessor HttpContextAccessor { get; } @@ -59,7 +61,7 @@ namespace ASC.Web.Core.Helpers try { //Try basic - var authorization = HttpContextAccessor.HttpContext.Request.Headers["Authorization"].ToString(); + var authorization = HttpContextAccessor.HttpContext.Request.Cookies["asc_auth_key"] ?? HttpContextAccessor.HttpContext.Request.Headers["Authorization"].ToString(); if (string.IsNullOrEmpty(authorization)) { return false; From c1c1517a1edb8eb35648313317203fcfde98aa70 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Fri, 24 Sep 2021 13:39:07 +0300 Subject: [PATCH 22/80] Web: Files: fixed moveTo/copyTo operations --- .../dialogs/ThirdPartyMoveDialog/index.js | 6 +- .../Client/src/store/FilesActionsStore.js | 4 +- .../Client/src/store/UploadDataStore.js | 109 ++++++++++-------- 3 files changed, 66 insertions(+), 53 deletions(-) diff --git a/products/ASC.Files/Client/src/components/dialogs/ThirdPartyMoveDialog/index.js b/products/ASC.Files/Client/src/components/dialogs/ThirdPartyMoveDialog/index.js index 386c07f7da..d90c2155e5 100644 --- a/products/ASC.Files/Client/src/components/dialogs/ThirdPartyMoveDialog/index.js +++ b/products/ASC.Files/Client/src/components/dialogs/ThirdPartyMoveDialog/index.js @@ -25,7 +25,7 @@ const PureThirdPartyMoveContainer = ({ setThirdPartyMoveDialogVisible, }) => { const zIndex = 310; - const deleteAfter = true; // TODO: get from settings + const deleteAfter = false; // TODO: get from settings const onClose = () => { setDestFolderId(false); @@ -51,6 +51,10 @@ const PureThirdPartyMoveContainer = ({ fileIds, deleteAfter, isCopy, + translations: { + copy: t("Translations:CopyOperation"), + move: t("Translations:MoveToOperation"), + }, }; checkOperationConflict(data); diff --git a/products/ASC.Files/Client/src/store/FilesActionsStore.js b/products/ASC.Files/Client/src/store/FilesActionsStore.js index a34b3402b0..7320a9c59b 100644 --- a/products/ASC.Files/Client/src/store/FilesActionsStore.js +++ b/products/ASC.Files/Client/src/store/FilesActionsStore.js @@ -66,7 +66,7 @@ class FilesActionStore { clearSecondaryProgressData, } = this.uploadDataStore.secondaryProgressDataStore; - const deleteAfter = true; //Delete after finished TODO: get from settings + const deleteAfter = false; //Delete after finished TODO: get from settings const immediately = isRecycleBinFolder || isPrivacyFolder ? true : false; //Don't move to the Recycle Bin const folderIds = []; @@ -590,7 +590,7 @@ class FilesActionStore { moveDragItems = (destFolderId, folderTitle, translations) => { const folderIds = []; const fileIds = []; - const deleteAfter = true; + const deleteAfter = false; const { selection } = this.filesStore; const { isRootFolder } = this.selectedFolderStore; diff --git a/products/ASC.Files/Client/src/store/UploadDataStore.js b/products/ASC.Files/Client/src/store/UploadDataStore.js index 58a88394d5..82b095dd61 100644 --- a/products/ASC.Files/Client/src/store/UploadDataStore.js +++ b/products/ASC.Files/Client/src/store/UploadDataStore.js @@ -766,8 +766,8 @@ class UploadDataStore { .then((res) => { if (res[0]?.error) return Promise.reject(res[0].error); - const id = res[0] && res[0].id ? res[0].id : null; - return this.loopFilesOperations(id, destFolderId, true); + const data = res[0] ? res[0] : null; + return this.loopFilesOperations(data, destFolderId, true); }) .catch((err) => { setSecondaryProgressBarData({ @@ -801,8 +801,8 @@ class UploadDataStore { deleteAfter ) .then((res) => { - const id = res[0] && res[0].id ? res[0].id : null; - this.loopFilesOperations(id, destFolderId, false); + const data = res[0] ? res[0] : null; + return this.loopFilesOperations(data, destFolderId, true); }) .catch((err) => { setSecondaryProgressBarData({ @@ -853,7 +853,7 @@ class UploadDataStore { ); }; - loopFilesOperations = (id, destFolderId, isCopy) => { + loopFilesOperations = async (data, destFolderId, isCopy) => { const label = this.secondaryProgressDataStore.label; const treeFolders = this.treeFoldersStore.treeFolders; @@ -862,59 +862,68 @@ class UploadDataStore { setSecondaryProgressBarData, } = this.secondaryProgressDataStore; - return this.getOperationProgress(id) - .then((item) => { - if (item && item.progress !== 100) { + let progress = data.progress; + + if (!data) { + setTimeout(() => clearSecondaryProgressData(), TIMEOUT); + return; + } + + while (progress !== 100) { + await this.getOperationProgress(data.id) + .then((item) => { + progress = item ? item.progress : 100; + setSecondaryProgressBarData({ icon: isCopy ? "duplicate" : "move", label, - percent: item.progress, + percent: progress, visible: true, alert: false, }); - } else { - setSecondaryProgressBarData({ - icon: isCopy ? "duplicate" : "move", - label, - percent: 100, - visible: true, - alert: false, + }) + .catch((err) => Promise.reject(err)); + } + + setSecondaryProgressBarData({ + icon: isCopy ? "duplicate" : "move", + label, + percent: 100, + visible: true, + alert: false, + }); + + getFolder(destFolderId).then((data) => { + let newTreeFolders = treeFolders; + let path = data.pathParts.slice(0); + let folders = data.folders; + let foldersCount = data.current.foldersCount; + loopTreeFolders(path, newTreeFolders, folders, foldersCount); + + if (!isCopy || destFolderId === this.selectedFolderStore.id) { + this.filesStore + .fetchFiles( + this.selectedFolderStore.id, + this.filesStore.filter, + true, + true + ) + .finally(() => { + setTimeout(() => clearSecondaryProgressData(), TIMEOUT); }); + } else { + setSecondaryProgressBarData({ + icon: "duplicate", + label, + percent: 100, + visible: true, + alert: false, + }); - getFolder(destFolderId).then((data) => { - let newTreeFolders = treeFolders; - let path = data.pathParts.slice(0); - let folders = data.folders; - let foldersCount = data.current.foldersCount; - loopTreeFolders(path, newTreeFolders, folders, foldersCount); - - if (!isCopy || destFolderId === this.selectedFolderStore.id) { - this.filesStore - .fetchFiles( - this.selectedFolderStore.id, - this.filesStore.filter, - true, - true - ) - .finally(() => { - setTimeout(() => clearSecondaryProgressData(), TIMEOUT); - }); - } else { - setSecondaryProgressBarData({ - icon: "duplicate", - label, - percent: 100, - visible: true, - alert: false, - }); - - setTimeout(() => clearSecondaryProgressData(), TIMEOUT); - this.treeFoldersStore.setTreeFolders(newTreeFolders); - } - }); - } - }) - .catch((err) => Promise.reject(err)); + setTimeout(() => clearSecondaryProgressData(), TIMEOUT); + this.treeFoldersStore.setTreeFolders(newTreeFolders); + } + }); }; getOperationProgress = async (id) => { From b42e137f10a4b893e6c343a6d96ac01c9c4510a7 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Fri, 24 Sep 2021 13:47:21 +0300 Subject: [PATCH 23/80] Web: Files: fixed error log --- products/ASC.Files/Client/src/store/FilesActionsStore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/products/ASC.Files/Client/src/store/FilesActionsStore.js b/products/ASC.Files/Client/src/store/FilesActionsStore.js index 7320a9c59b..189b9cc4c5 100644 --- a/products/ASC.Files/Client/src/store/FilesActionsStore.js +++ b/products/ASC.Files/Client/src/store/FilesActionsStore.js @@ -663,7 +663,7 @@ class FilesActionStore { try { await this.uploadDataStore.itemOperationToFolder(operationData); } catch (err) { - return toastr.error(err.message); + return toastr.error(err.message ? err.message : err); } } }; From 877c242dba42e8e26ebb61ce28cfe93cc31aa6b3 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Fri, 24 Sep 2021 14:27:51 +0300 Subject: [PATCH 24/80] Web: Files: fixed cbMenuItems --- products/ASC.Files/Client/src/store/FilesStore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/products/ASC.Files/Client/src/store/FilesStore.js b/products/ASC.Files/Client/src/store/FilesStore.js index 73fa35125a..8e6e910841 100644 --- a/products/ASC.Files/Client/src/store/FilesStore.js +++ b/products/ASC.Files/Client/src/store/FilesStore.js @@ -1242,7 +1242,7 @@ class FilesStore { } const hasFiles = cbMenu.some( - (elem) => elem !== "all" && elem !== FilterType.DocumentsOnly + (elem) => elem !== "all" && elem !== FilterType.FoldersOnly ); if (hasFiles) cbMenu.push(FilterType.FilesOnly); From 50becafef717a7320f0472715943279427fb4838 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Fri, 24 Sep 2021 15:07:44 +0300 Subject: [PATCH 25/80] Fixed Bug 52642 - Android.Docs.Mobile. Fixed orientation change for mobile Firefox --- packages/asc-web-common/components/PageLayout/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/asc-web-common/components/PageLayout/index.js b/packages/asc-web-common/components/PageLayout/index.js index a49c665599..d8d06b7996 100644 --- a/packages/asc-web-common/components/PageLayout/index.js +++ b/packages/asc-web-common/components/PageLayout/index.js @@ -117,10 +117,11 @@ class PageLayout extends React.Component { const isPortrait = isFirefox && isMobileOnly && - screen.orientation.type === "landscape-primary"; + screen.orientation.type === "portrait-primary"; if ((!isEnoughWidth && isValueExist) || isPortrait) { this.backdropClick(); + return; } if (isEnoughWidth && isValueExist) { this.pinArticle(); From ea589789d3d8ac0b7af06457fa1f03739adb0a94 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Fri, 24 Sep 2021 15:47:27 +0300 Subject: [PATCH 26/80] fix Bug 50655 --- .../Thirdparty/GoogleDrive/GoogleDriveStorage.cs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveStorage.cs b/products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveStorage.cs index 27c07a5a73..10d6e74c68 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveStorage.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveStorage.cs @@ -65,11 +65,13 @@ namespace ASC.Files.Thirdparty.GoogleDrive public GoogleDriveStorage( ConsumerFactory consumerFactory, FileUtility fileUtility, - IOptionsMonitor monitor) + IOptionsMonitor monitor, + TempStream tempStream) { ConsumerFactory = consumerFactory; FileUtility = fileUtility; - Log = monitor.Get("ASC.Files"); + Log = monitor.Get("ASC.Files"); + TempStream = tempStream; } private OAuth20Token _token; @@ -92,12 +94,7 @@ namespace ASC.Files.Thirdparty.GoogleDrive public ILog Log { get; } private TempStream TempStream { get; } - public const long MaxChunkedUploadFileSize = 2L * 1024L * 1024L * 1024L; - - public GoogleDriveStorage(TempStream tempStream) - { - TempStream = tempStream; - } + public const long MaxChunkedUploadFileSize = 2L * 1024L * 1024L * 1024L; public void Open(OAuth20Token token) { From f137fc5d463c19759c1d7fca40f3355c8ba4d299 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Fri, 24 Sep 2021 15:57:41 +0300 Subject: [PATCH 27/80] Fixed Bug 52756 - Client.Files. Fixed DnD when opening files/folders --- .../Client/src/pages/Home/Section/Body/index.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/products/ASC.Files/Client/src/pages/Home/Section/Body/index.js b/products/ASC.Files/Client/src/pages/Home/Section/Body/index.js index 0e157194fc..b1e8bf5d88 100644 --- a/products/ASC.Files/Client/src/pages/Home/Section/Body/index.js +++ b/products/ASC.Files/Client/src/pages/Home/Section/Body/index.js @@ -28,6 +28,8 @@ const SectionBodyContent = (props) => { moveDragItems, viewAs, setSelection, + tooltipPageX, + tooltipPageY, } = props; useEffect(() => { @@ -68,6 +70,13 @@ const SectionBodyContent = (props) => { }; const onMouseMove = (e) => { + if ( + Math.abs(e.pageX - tooltipPageX) < 5 && + Math.abs(e.pageY - tooltipPageY) < 5 + ) { + return false; + } + if (!dragging) { document.body.classList.add("drag-cursor"); setDragging(true); @@ -212,6 +221,8 @@ export default inject( startDrag, setStartDrag, setSelection, + tooltipPageX, + tooltipPageY, } = filesStore; return { @@ -229,6 +240,8 @@ export default inject( moveDragItems: filesActionsStore.moveDragItems, viewAs, setSelection, + tooltipPageX, + tooltipPageY, }; } )( From ef65cc7cb79437835f99d57a9b79e2490692b905 Mon Sep 17 00:00:00 2001 From: Tatiana Lopaeva Date: Fri, 24 Sep 2021 16:02:23 +0300 Subject: [PATCH 28/80] Bug 52647 - iOS.Docs.Mobile: Added transition back from profile. --- .../src/pages/Profile/Section/Header/index.js | 36 +++++++------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js b/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js index 79248a3e51..9e351c740c 100644 --- a/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js +++ b/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js @@ -65,7 +65,7 @@ const StyledContainer = styled.div` } .header-headline { - margin-left: ${(props) => (props.personal ? "0px" : "16px")}; + margin-left: 16px; } `; @@ -426,16 +426,7 @@ class SectionHeaderContent extends React.PureComponent { }; render() { - const { - profile, - isAdmin, - viewer, - t, - filter, - history, - isMe, - personal, - } = this.props; + const { profile, isAdmin, viewer, t, filter, history, isMe } = this.props; const { avatar, visibleAvatarEditor, dialogsVisible } = this.state; const contextOptions = () => this.getUserContextOptions(profile, viewer); @@ -443,19 +434,17 @@ class SectionHeaderContent extends React.PureComponent { return ( - {!personal && ( - - )} + + {profile.displayName} {profile.isLDAP && ` (${t("Translations:LDAPLbl")})`} @@ -542,7 +531,6 @@ export default withRouter( isMe: peopleStore.targetUserStore.isMe, updateProfile: peopleStore.targetUserStore.updateProfile, getUserPhoto: peopleStore.targetUserStore.getUserPhoto, - personal: auth.settingsStore.personal, }; })( observer( From 2aebbe0bb592860db57ff4a0070d56ae0b9b3666 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Fri, 24 Sep 2021 16:48:53 +0300 Subject: [PATCH 29/80] Web: Files: fixed moveTo operation --- products/ASC.Files/Client/src/store/UploadDataStore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/products/ASC.Files/Client/src/store/UploadDataStore.js b/products/ASC.Files/Client/src/store/UploadDataStore.js index 82b095dd61..263269e31c 100644 --- a/products/ASC.Files/Client/src/store/UploadDataStore.js +++ b/products/ASC.Files/Client/src/store/UploadDataStore.js @@ -802,7 +802,7 @@ class UploadDataStore { ) .then((res) => { const data = res[0] ? res[0] : null; - return this.loopFilesOperations(data, destFolderId, true); + return this.loopFilesOperations(data, destFolderId, false); }) .catch((err) => { setSecondaryProgressBarData({ From b69cd151b8a058b5bb3ef4775700b8e7b450529b Mon Sep 17 00:00:00 2001 From: Tatiana Lopaeva Date: Fri, 24 Sep 2021 17:00:01 +0300 Subject: [PATCH 30/80] Web: Removed resetProfile for fixed transition for personal. --- .../Client/src/pages/Profile/Section/Header/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js b/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js index 9e351c740c..a038ab85a6 100644 --- a/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js +++ b/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js @@ -408,12 +408,13 @@ class SectionHeaderContent extends React.PureComponent { onClickBack = () => { const { filter, setFilter, history, resetProfile, isMy } = this.props; - resetProfile(); if (isMy) { return history.goBack(); } + resetProfile(); + const url = filter.toUrlParams(); const backUrl = combineUrl( AppServerConfig.proxyURL, From e755d2eda8e449cae5374d5f583a312814aaeca0 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Fri, 24 Sep 2021 17:36:46 +0300 Subject: [PATCH 31/80] renamed providers to lowercase --- .../Notify/Telegram/TelegramHelper.cs | 2 +- .../ASC.Data.Backup.Core/BackupAjaxHandler.cs | 2 +- .../ASC.FederatedLogin/ProviderConstants.cs | 16 +-- config/autofac.consumers.json | 132 +++++++++--------- 4 files changed, 76 insertions(+), 76 deletions(-) diff --git a/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs b/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs index dce8ccbb1f..e40176ae3c 100644 --- a/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs +++ b/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs @@ -145,7 +145,7 @@ namespace ASC.Core.Common.Notify private string GetLink(string token) { - var tgProvider = (ITelegramLoginProvider)ConsumerFactory.GetByKey("Telegram"); + var tgProvider = (ITelegramLoginProvider)ConsumerFactory.GetByKey("telegram"); var botname = tgProvider == null ? default : tgProvider.TelegramBotName; if (string.IsNullOrEmpty(botname)) return null; diff --git a/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs b/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs index 5dd3db0376..694fd05bf9 100644 --- a/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs +++ b/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs @@ -186,7 +186,7 @@ namespace ASC.Data.Backup { var amazonSettings = CoreConfiguration.GetSection(); - var consumer = ConsumerFactory.GetByKey("S3"); + var consumer = ConsumerFactory.GetByKey("s3"); if (!consumer.IsSet) { consumer["acesskey"] = amazonSettings.AccessKeyId; diff --git a/common/ASC.FederatedLogin/ProviderConstants.cs b/common/ASC.FederatedLogin/ProviderConstants.cs index 3751e7a37f..a54213f4bd 100644 --- a/common/ASC.FederatedLogin/ProviderConstants.cs +++ b/common/ASC.FederatedLogin/ProviderConstants.cs @@ -28,15 +28,15 @@ namespace ASC.FederatedLogin { public static class ProviderConstants { - public const string Twitter = "Twitter"; - public const string Facebook = "Facebook"; - public const string LinkedIn = "LinkedIn"; + public const string Twitter = "twitter"; + public const string Facebook = "facebook"; + public const string LinkedIn = "linkedin"; public const string OpenId = "openid"; - public const string Box = "Box"; - public const string Google = "Google"; - public const string Yandex = "Yandex"; - public const string MailRu = "Mailru"; - public const string VK = "Vk"; + public const string Box = "box"; + public const string Google = "google"; + public const string Yandex = "yandex"; + public const string MailRu = "mailru"; + public const string VK = "vk"; public const string GosUslugi = "gosuslugi"; public const string Encryption = "e2e"; } diff --git a/config/autofac.consumers.json b/config/autofac.consumers.json index cb0e55b2ce..813badfe8d 100644 --- a/config/autofac.consumers.json +++ b/config/autofac.consumers.json @@ -10,17 +10,17 @@ "type": "ASC.FederatedLogin.LoginProviders.BitlyLoginProvider, ASC.FederatedLogin" }, { - "key": "Bitly", + "key": "bitly", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Bitly", + "key": "bitly", "type": "ASC.FederatedLogin.LoginProviders.BitlyLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Bitly", + "name": "bitly", "order": "13", "props": { "bitlyClientId": "", @@ -41,17 +41,17 @@ "type": "ASC.FederatedLogin.LoginProviders.TelegramLoginProvider, ASC.FederatedLogin" }, { - "key": "Telegram", + "key": "telegram", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Telegram", + "key": "telegram", "type": "ASC.FederatedLogin.LoginProviders.TelegramLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Telegram", + "name": "telegram", "order": "13", "props": { "telegramBotToken": "", @@ -73,17 +73,17 @@ "type": "ASC.FederatedLogin.LoginProviders.BoxLoginProvider, ASC.FederatedLogin" }, { - "key": "Box", + "key": "box", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Box", + "key": "box", "type": "ASC.FederatedLogin.LoginProviders.BoxLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Box", + "name": "box", "order": "3", "props": { "boxClientId": "", @@ -104,17 +104,17 @@ "type": "ASC.Web.Core.Sms.ClickatellProvider, ASC.Web.Core" }, { - "key": "Clickatell", + "key": "clickatell", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Clickatell", + "key": "clickatell", "type": "ASC.Web.Core.Sms.ClickatellProvider, ASC.Web.Core" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Clickatell", + "name": "clickatell", "order": "10", "props": { "clickatellapiKey": "" @@ -131,17 +131,17 @@ "type": "ASC.FederatedLogin.LoginProviders.DocuSignLoginProvider, ASC.FederatedLogin" }, { - "key": "DocuSign", + "key": "docuSign", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "DocuSign", + "key": "docuSign", "type": "ASC.FederatedLogin.LoginProviders.DocuSignLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "DocuSign", + "name": "docuSign", "order": "1", "props": { "docuSignClientId": "", @@ -163,17 +163,17 @@ "type": "ASC.FederatedLogin.LoginProviders.DropboxLoginProvider, ASC.FederatedLogin" }, { - "key": "DropBox", + "key": "dropbox", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "DropBox", + "key": "dropbox", "type": "ASC.FederatedLogin.LoginProviders.DropboxLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "DropBox", + "name": "dropbox", "order": "2", "props": { "dropboxClientId": "", @@ -196,17 +196,17 @@ "type": "ASC.FederatedLogin.LoginProviders.FacebookLoginProvider, ASC.FederatedLogin" }, { - "key": "Facebook", + "key": "facebook", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Facebook", + "key": "facebook", "type": "ASC.FederatedLogin.LoginProviders.FacebookLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Facebook", + "name": "facebook", "order": "6", "props": { "facebookClientId": "", @@ -227,17 +227,17 @@ "type": "ASC.Web.Core.Jabber.FireBase, ASC.Web.Core" }, { - "key": "Firebase", + "key": "firebase", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Firebase", + "key": "firebase", "type": "ASC.Web.Core.Jabber.FireBase, ASC.Web.Core" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Firebase", + "name": "firebase", "order": "12", "props": { "firebase_apiKey": "", @@ -257,17 +257,17 @@ "type": "ASC.FederatedLogin.LoginProviders.GoogleLoginProvider, ASC.FederatedLogin" }, { - "key": "Google", + "key": "google", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Google", + "key": "google", "type": "ASC.FederatedLogin.LoginProviders.GoogleLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Google", + "name": "google", "order": "5", "props": { "googleClientId": "", @@ -288,17 +288,17 @@ "type": "ASC.FederatedLogin.LoginProviders.LinkedInLoginProvider, ASC.FederatedLogin" }, { - "key": "LinkedIn", + "key": "linkedin", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "LinkedIn", + "key": "linkedin", "type": "ASC.FederatedLogin.LoginProviders.LinkedInLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "LinkedIn", + "name": "linkedin", "order": "8", "props": { "linkedInKey": "", @@ -319,17 +319,17 @@ "type": "ASC.FederatedLogin.LoginProviders.MailRuLoginProvider, ASC.FederatedLogin" }, { - "key": "Mailru", + "key": "mailru", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Mailru", + "key": "mailru", "type": "ASC.FederatedLogin.LoginProviders.MailRuLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Mailru", + "name": "mailru", "order": "4", "props": { "mailRuClientId": "", @@ -350,17 +350,17 @@ "type": "ASC.FederatedLogin.LoginProviders.OneDriveLoginProvider, ASC.FederatedLogin" }, { - "key": "SkyDrive", + "key": "skydrive", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "SkyDrive", + "key": "skydrive", "type": "ASC.FederatedLogin.LoginProviders.OneDriveLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "SkyDrive", + "name": "skydrive", "order": "4", "props": { "skydriveappkey": "", @@ -381,17 +381,17 @@ "type": "ASC.Web.Core.Sms.SmscProvider, ASC.Web.Core" }, { - "key": "Smsc", + "key": "smsc", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Smsc", + "key": "smsc", "type": "ASC.Web.Core.Sms.SmscProvider, ASC.Web.Core" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Smsc", + "name": "smsc", "order": "11", "props": { "smsclogin": "", @@ -413,17 +413,17 @@ "type": "ASC.Web.Core.Sms.TwilioProvider, ASC.Web.Core" }, { - "key": "Twilio", + "key": "twilio", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Twilio", + "key": "twilio", "type": "ASC.Web.Core.Sms.TwilioProvider, ASC.Web.Core" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Twilio", + "name": "twilio", "order": "9", "props": { "twilioAccountSid": "", @@ -442,17 +442,17 @@ "type": "ASC.FederatedLogin.LoginProviders.YahooLoginProvider, ASC.FederatedLogin" }, { - "key": "Yahoo", + "key": "yahoo", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Yahoo", + "key": "yahoo", "type": "ASC.FederatedLogin.LoginProviders.YahooLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Yahoo", + "name": "yahoo", "order": "14", "props": { "yahooClientId": "", @@ -473,17 +473,17 @@ "type": "ASC.FederatedLogin.LoginProviders.VKLoginProvider, ASC.FederatedLogin" }, { - "key": "Vk", + "key": "vk", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Vk", + "key": "vk", "type": "ASC.FederatedLogin.LoginProviders.VKLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Vk", + "name": "vk", "order": "14", "props": { "vkClientId": "", @@ -504,17 +504,17 @@ "type": "ASC.FederatedLogin.LoginProviders.WordpressLoginProvider, ASC.FederatedLogin" }, { - "key": "Wordpress", + "key": "wordpress", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Wordpress", + "key": "wordpress", "type": "ASC.FederatedLogin.LoginProviders.WordpressLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Wordpress", + "name": "wordpress", "order": "15", "props": { "wpClientId": "", @@ -535,17 +535,17 @@ "type": "ASC.FederatedLogin.LoginProviders.YandexLoginProvider, ASC.FederatedLogin" }, { - "key": "Yandex", + "key": "yandex", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Yandex", + "key": "yandex", "type": "ASC.FederatedLogin.LoginProviders.YandexLoginProvider, ASC.FederatedLogin" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Yandex", + "name": "yandex", "order": "15", "props": { "yandexClientId": "", @@ -566,17 +566,17 @@ "type": "ASC.Core.Common.Configuration.DataStoreConsumer, ASC.Core.Common" }, { - "key": "S3", + "key": "s3", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "S3", + "key": "s3", "type": "ASC.Core.Common.Configuration.DataStoreConsumer, ASC.Core.Common" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "S3", + "name": "s3", "order": "20", "props": { "acesskey": "", @@ -604,17 +604,17 @@ "type": "ASC.Core.Common.Configuration.DataStoreConsumer, ASC.Core.Common" }, { - "key": "GoogleCloud", + "key": "googlecloud", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "GoogleCloud", + "key": "googlecloud", "type": "ASC.Core.Common.Configuration.DataStoreConsumer, ASC.Core.Common" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "GoogleCloud", + "name": "googlecloud", "order": "21", "props": { "json": "" @@ -635,17 +635,17 @@ "type": "ASC.Core.Common.Configuration.DataStoreConsumer, ASC.Core.Common" }, { - "key": "Rackspace", + "key": "rackspace", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Rackspace", + "key": "rackspace", "type": "ASC.Core.Common.Configuration.DataStoreConsumer, ASC.Core.Common" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Rackspace", + "name": "rackspace", "order": "22", "props": { "username": "", @@ -669,17 +669,17 @@ "type": "ASC.Core.Common.Configuration.DataStoreConsumer, ASC.Core.Common" }, { - "key": "Selectel", + "key": "selectel", "type": "ASC.Core.Common.Configuration.Consumer, ASC.Core.Common" }, { - "key": "Selectel", + "key": "selectel", "type": "ASC.Core.Common.Configuration.DataStoreConsumer, ASC.Core.Common" } ], "instanceScope": "perlifetimescope", "parameters": { - "name": "Selectel", + "name": "selectel", "order": "23", "props": { "authUser": "", From f2913339d3dffe7333c17a941d4d22cae96db6e2 Mon Sep 17 00:00:00 2001 From: AlexeySafronov Date: Fri, 24 Sep 2021 20:09:12 +0300 Subject: [PATCH 32/80] Web: Components: Added CountDown to Snackbar --- packages/asc-web-components/package.json | 1 + packages/asc-web-components/snackbar/index.js | 31 ++++++++++++++++++- yarn.lock | 7 +++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/packages/asc-web-components/package.json b/packages/asc-web-components/package.json index 376d52451f..d2d3fec258 100644 --- a/packages/asc-web-components/package.json +++ b/packages/asc-web-components/package.json @@ -27,6 +27,7 @@ "punycode": "^2.1.1", "rc-tree": "^2.1.4", "react-autosize-textarea": "^7.1.0", + "react-countdown": "2.3.2", "react-custom-scrollbars": "^4.2.1", "react-device-detect": "^1.17.0", "react-dropzone": "^11.2.4", diff --git a/packages/asc-web-components/snackbar/index.js b/packages/asc-web-components/snackbar/index.js index 84abb3b57e..3bb428868c 100644 --- a/packages/asc-web-components/snackbar/index.js +++ b/packages/asc-web-components/snackbar/index.js @@ -2,6 +2,7 @@ import React from "react"; import ReactDOM from "react-dom"; import PropType from "prop-types"; import PropTypes from "prop-types"; +import Countdown, { zeroPad } from "react-countdown"; import StyledSnackBar from "./styled-snackbar"; import StyledCrossIcon from "./styled-snackbar-action"; import StyledLogoIcon from "./styled-snackbar-logo"; @@ -40,6 +41,24 @@ class SnackBar extends React.Component { this.props.onAction && this.props.onAction(e); }; + // Renderer callback with condition + countDownRenderer = ({ minutes, seconds, completed }) => { + if (completed) return <>; + const { textColor, fontSize, fontWeight } = this.props; + + // Render a countdown + return ( + + {zeroPad(minutes)}:{zeroPad(seconds)} + + ); + }; + render() { const { text, @@ -52,6 +71,7 @@ class SnackBar extends React.Component { textAlign, htmlContent, style, + countDownTime, ...rest } = this.props; @@ -97,6 +117,14 @@ class SnackBar extends React.Component { {btnText} )} + + {countDownTime > -1 && ( + + )} @@ -106,7 +134,6 @@ class SnackBar extends React.Component { )} - ) ); } @@ -126,6 +153,7 @@ SnackBar.propTypes = { textAlign: PropType.string, htmlContent: PropType.string, style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]), + countDownTime: PropType.number, }; SnackBar.defaultProps = { @@ -136,6 +164,7 @@ SnackBar.defaultProps = { fontWeight: "400", textAlign: "left", htmlContent: "", + countDownTime: -1, }; export default SnackBar; diff --git a/yarn.lock b/yarn.lock index 1397586746..5d420ad9ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14584,6 +14584,13 @@ react-content-loader@^5.1.4: resolved "https://registry.yarnpkg.com/react-content-loader/-/react-content-loader-5.1.4.tgz#854bafe4415dd9de07174621375bc308edd0ebb5" integrity sha512-hTq7pZi2GKCK6a9d3u6XStozm0QGCEjw8cSqQReiWnh2up6IwCha5R5TF0o6SY5qUDpByloEZEZtnFxpJyENFw== +react-countdown@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/react-countdown/-/react-countdown-2.3.2.tgz#4cc27f28f2dcd47237ee66e4b9f6d2a21fc0b0ad" + integrity sha512-Q4SADotHtgOxNWhDdvgupmKVL0pMB9DvoFcxv5AzjsxVhzOVxnttMbAywgqeOdruwEAmnPhOhNv/awAgkwru2w== + dependencies: + prop-types "^15.7.2" + react-custom-scrollbars@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/react-custom-scrollbars/-/react-custom-scrollbars-4.2.1.tgz#830fd9502927e97e8a78c2086813899b2a8b66db" From 6ada582cc5fc3905ec101702db87a939f3b405ee Mon Sep 17 00:00:00 2001 From: AlexeySafronov Date: Fri, 24 Sep 2021 20:10:54 +0300 Subject: [PATCH 33/80] Web: service-worker updates optimization --- config/workbox-config.js | 2 +- packages/asc-web-common/utils/sw-helper.js | 25 ++++++++++++++------ packages/asc-web-common/utils/sw-template.js | 15 ++++++++---- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/config/workbox-config.js b/config/workbox-config.js index ba87cb6d75..da3d88a038 100644 --- a/config/workbox-config.js +++ b/config/workbox-config.js @@ -1,7 +1,7 @@ module.exports = { globDirectory: 'build/deploy/', globPatterns: [ - "**/*.{js,css,woff2}" + "**/*.{js,html,css,woff2,svg}" ], globIgnores: ['**/remoteEntry.js'], swSrc: 'packages/asc-web-common/utils/sw-template.js', diff --git a/packages/asc-web-common/utils/sw-helper.js b/packages/asc-web-common/utils/sw-helper.js index 796b0118a1..f72a8af4c1 100644 --- a/packages/asc-web-common/utils/sw-helper.js +++ b/packages/asc-web-common/utils/sw-helper.js @@ -45,6 +45,7 @@ const SnackBarWrapper = (props) => { btnText: t("Load"), onAction: () => props.onButtonClick(), opacity: 1, + countDownTime: 5 * 60 * 1000, }; return ; @@ -56,8 +57,6 @@ const registerSW = () => { if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) { const wb = new Workbox(`/sw.js`); - //TODO: watch https://developers.google.com/web/tools/workbox/guides/advanced-recipes and https://github.com/webmaxru/prog-web-news/blob/5ff94b45c9d317409c21c0fbb7d76e92f064471b/src/app/app-shell/app-shell.component.ts - const showSkipWaitingPrompt = (event) => { console.log( `A new service worker has installed, but it can't activate` + @@ -75,11 +74,6 @@ const registerSW = () => { } try { - if (localStorage.getItem("sw_need_activation")) { - refresh(); - return; - } - const snackbarNode = document.createElement("div"); snackbarNode.id = "snackbar"; document.body.appendChild(snackbarNode); @@ -101,6 +95,13 @@ const registerSW = () => { } }; + window.addEventListener("beforeunload", async () => { + if (localStorage.getItem("sw_need_activation")) { + localStorage.removeItem("sw_need_activation"); + wb.messageSkipWaiting(); + } + }); + // Add an event listener to detect when the registered // service worker has installed but is waiting to activate. wb.addEventListener("waiting", showSkipWaitingPrompt); @@ -108,6 +109,16 @@ const registerSW = () => { wb.register() .then((reg) => { console.log("Successful service worker registration", reg); + + if (!window.swUpdateTimer) { + console.log("SW timer checks for updates every hour"); + window.swUpdateTimer = setInterval(() => { + console.log("SW update timer check"); + reg.update().catch((e) => { + console.error("SW update timer FAILED", e); + }); + }, 60 * 60 * 1000); + } }) .catch((err) => console.error("Service worker registration failed", err)); } else { diff --git a/packages/asc-web-common/utils/sw-template.js b/packages/asc-web-common/utils/sw-template.js index 619c41ca74..73fbb6ca3b 100644 --- a/packages/asc-web-common/utils/sw-template.js +++ b/packages/asc-web-common/utils/sw-template.js @@ -20,8 +20,15 @@ clientsClaim(); // PRECACHING +const prefix = "appserver"; + // Setting custom cache name -setCacheNameDetails({ precache: "wb6-precache", runtime: "wb6-runtime" }); +setCacheNameDetails({ + prefix: prefix, + precache: "precache", + runtime: "runtime", + suffix: "v1", +}); // We inject manifest here using "workbox-build" in workbox-inject.js const precachRoutes = self.__WB_MANIFEST; @@ -33,7 +40,7 @@ cleanupOutdatedCaches(); // STATIC RESOURCES -googleFontsCache({ cachePrefix: "wb6-gfonts" }); +googleFontsCache({ cachePrefix: `${prefix}-gfonts` }); // TRANSLATIONS @@ -42,13 +49,13 @@ registerRoute( // Use cache but update in the background. new StaleWhileRevalidate({ // Use a custom cache name. - cacheName: "wb6-content-translation", + cacheName: `${prefix}-translation`, }) ); // CONTENT -imageCache({ cacheName: "wb6-content-images", maxEntries: 60 }); +imageCache({ cacheName: `${prefix}-images`, maxEntries: 60 }); // APP SHELL UPDATE FLOW From 25a58de730099b9968a89614a33f4b23edcdfc85 Mon Sep 17 00:00:00 2001 From: AlexeySafronov Date: Fri, 24 Sep 2021 21:17:50 +0300 Subject: [PATCH 34/80] Web: SW: Update workbox --- packages/asc-web-common/utils/sw-template.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/asc-web-common/utils/sw-template.js b/packages/asc-web-common/utils/sw-template.js index 73fbb6ca3b..a8bc46ecf0 100644 --- a/packages/asc-web-common/utils/sw-template.js +++ b/packages/asc-web-common/utils/sw-template.js @@ -1,5 +1,5 @@ importScripts( - "https://storage.googleapis.com/workbox-cdn/releases/6.2.3/workbox-sw.js" + "https://storage.googleapis.com/workbox-cdn/releases/6.3.0/workbox-sw.js" ); workbox.setConfig({ @@ -27,7 +27,7 @@ setCacheNameDetails({ prefix: prefix, precache: "precache", runtime: "runtime", - suffix: "v1", + suffix: "v1.0.0", }); // We inject manifest here using "workbox-build" in workbox-inject.js From 4531d38e6feaefdf86a01add9e6031f19bba6441 Mon Sep 17 00:00:00 2001 From: AlexeySafronov Date: Fri, 24 Sep 2021 21:18:50 +0300 Subject: [PATCH 35/80] Web: Removed duplicates --- config/nginx/onlyoffice.conf | 2 +- products/ASC.CRM/Client/public/index.html | 6 +++--- products/ASC.CRM/Client/public/manifest.json | 15 --------------- products/ASC.Calendar/Client/public/favicon.ico | Bin 8348 -> 0 bytes products/ASC.Calendar/Client/public/index.html | 6 +++--- .../ASC.Calendar/Client/public/manifest.json | 15 --------------- products/ASC.Files/Client/public/favicon.ico | Bin 8348 -> 0 bytes products/ASC.Files/Client/public/index.html | 6 +++--- products/ASC.Files/Client/public/manifest.json | 15 --------------- products/ASC.Mail/Client/public/favicon.ico | Bin 8348 -> 0 bytes products/ASC.Mail/Client/public/index.html | 6 +++--- products/ASC.Mail/Client/public/manifest.json | 15 --------------- products/ASC.People/Client/public/favicon.ico | Bin 8348 -> 0 bytes products/ASC.People/Client/public/index.html | 6 +++--- products/ASC.People/Client/public/manifest.json | 15 --------------- products/ASC.Projects/Client/public/favicon.ico | Bin 8348 -> 0 bytes products/ASC.Projects/Client/public/index.html | 6 +++--- .../ASC.Projects/Client/public/manifest.json | 15 --------------- .../ASC.CRM/Client/public => public}/favicon.ico | Bin public/offline/offline.html | 2 +- public/thirdparty/third-party.html | 2 +- web/ASC.Web.Client/public/favicon.ico | Bin 8348 -> 0 bytes web/ASC.Web.Client/public/index.html | 6 +++--- web/ASC.Web.Client/public/manifest.json | 15 --------------- web/ASC.Web.Editor/public/favicon.ico | Bin 8348 -> 0 bytes web/ASC.Web.Editor/public/index.html | 6 +++--- web/ASC.Web.Login/public/index.html | 6 +++--- 27 files changed, 30 insertions(+), 135 deletions(-) delete mode 100644 products/ASC.CRM/Client/public/manifest.json delete mode 100644 products/ASC.Calendar/Client/public/favicon.ico delete mode 100644 products/ASC.Calendar/Client/public/manifest.json delete mode 100644 products/ASC.Files/Client/public/favicon.ico delete mode 100644 products/ASC.Files/Client/public/manifest.json delete mode 100644 products/ASC.Mail/Client/public/favicon.ico delete mode 100644 products/ASC.Mail/Client/public/manifest.json delete mode 100644 products/ASC.People/Client/public/favicon.ico delete mode 100644 products/ASC.People/Client/public/manifest.json delete mode 100644 products/ASC.Projects/Client/public/favicon.ico delete mode 100644 products/ASC.Projects/Client/public/manifest.json rename {products/ASC.CRM/Client/public => public}/favicon.ico (100%) delete mode 100644 web/ASC.Web.Client/public/favicon.ico delete mode 100644 web/ASC.Web.Client/public/manifest.json delete mode 100644 web/ASC.Web.Editor/public/favicon.ico diff --git a/config/nginx/onlyoffice.conf b/config/nginx/onlyoffice.conf index 7b2a078313..315a5e7966 100644 --- a/config/nginx/onlyoffice.conf +++ b/config/nginx/onlyoffice.conf @@ -83,7 +83,7 @@ server { location / { proxy_pass http://localhost:5001; - location ~* /(manifest.json|sw.js|appIcon.png|bg-error.png) { + location ~* /(manifest.json|sw.js|appIcon.png|bg-error.png|favicon.ico) { root $public_root; try_files /$basename /index.html =404; } diff --git a/products/ASC.CRM/Client/public/index.html b/products/ASC.CRM/Client/public/index.html index 9bdeaa196b..836ef31fce 100644 --- a/products/ASC.CRM/Client/public/index.html +++ b/products/ASC.CRM/Client/public/index.html @@ -11,14 +11,14 @@ manifest.json provides metadata used when your web app is added to the homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/ --> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +