diff --git a/packages/client/src/HOCs/withQuickButtons.js b/packages/client/src/HOCs/withQuickButtons.js index a5d2ea8d42..1fee72e82e 100644 --- a/packages/client/src/HOCs/withQuickButtons.js +++ b/packages/client/src/HOCs/withQuickButtons.js @@ -114,6 +114,7 @@ export default function withQuickButtons(WrappedComponent) { isPublicRoom, isPersonalRoom, isArchiveFolder, + currentDeviceType, } = this.props; const quickButtonsComponent = ( @@ -134,6 +135,7 @@ export default function withQuickButtons(WrappedComponent) { folderCategory={folderCategory} onCopyPrimaryLink={this.onCopyPrimaryLink} isArchiveFolder={isArchiveFolder} + currentDeviceType={currentDeviceType} /> ); @@ -177,6 +179,7 @@ export default function withQuickButtons(WrappedComponent) { return { theme: settingsStore.theme, + currentDeviceType: settingsStore.currentDeviceType, isAdmin: authStore.isAdmin, lockFileAction, setFavoriteAction, diff --git a/packages/client/src/components/Article/Body/Banner.js b/packages/client/src/components/Article/Body/Banner.js index ae66cded22..08852bb68b 100644 --- a/packages/client/src/components/Article/Body/Banner.js +++ b/packages/client/src/components/Article/Body/Banner.js @@ -39,7 +39,8 @@ const Banner = ({ setSubmitToGalleryDialogVisible, setClosedCampaigns, getBanner, - campaignImage, + campaignBackground, + campaignIcon, campaignTranslate, campaignConfig, currentCampaign, @@ -73,12 +74,13 @@ const Banner = ({ return ( - {campaignImage && + {campaignBackground && campaignTranslate && campaignConfig && currentCampaign && ( { const { setClosedCampaigns, getBanner, - campaignImage, + campaignBackground, + campaignIcon, campaignTranslate, campaignConfig, currentCampaign, @@ -104,7 +107,8 @@ export default inject(({ dialogsStore, campaignsStore }) => { setSubmitToGalleryDialogVisible, setClosedCampaigns, getBanner, - campaignImage, + campaignBackground, + campaignIcon, campaignTranslate, campaignConfig, currentCampaign, diff --git a/packages/client/src/components/QuickButtons.js b/packages/client/src/components/QuickButtons.js index bf0817799d..6d2e8a2a13 100644 --- a/packages/client/src/components/QuickButtons.js +++ b/packages/client/src/components/QuickButtons.js @@ -30,12 +30,14 @@ import LinkReactSvgUrl from "PUBLIC_DIR/images/link.react.svg?url"; import LockedReactSvgUrl from "PUBLIC_DIR/images/locked.react.svg?url"; import FileActionsFavoriteReactSvgUrl from "PUBLIC_DIR/images/file.actions.favorite.react.svg?url"; import FavoriteReactSvgUrl from "PUBLIC_DIR/images/favorite.react.svg?url"; +import LockedReact12SvgUrl from "PUBLIC_DIR/images/icons/12/lock.react.svg?url"; -import React from "react"; +import React, { useMemo } from "react"; import styled from "styled-components"; import { isTablet, isMobile, commonIconsStyles } from "@docspace/shared/utils"; import { + DeviceType, FileStatus, RoomsType, ShareAccessRights, @@ -60,16 +62,26 @@ const QuickButtons = (props) => { onClickShare, isPersonalRoom, isArchiveFolder, + currentDeviceType, } = props; + const isMobile = currentDeviceType === DeviceType.mobile; + const { id, locked, shared, fileStatus, title, fileExst } = item; const isFavorite = (fileStatus & FileStatus.IsFavorite) === FileStatus.IsFavorite; const isTile = viewAs === "tile"; + const isRow = viewAs == "row"; - const iconLock = locked ? FileActionsLockedReactSvgUrl : LockedReactSvgUrl; + const iconLock = useMemo(() => { + if (isMobile) { + return LockedReact12SvgUrl; + } + + return locked ? FileActionsLockedReactSvgUrl : LockedReactSvgUrl; + }, [locked, isMobile]); const colorLock = locked ? theme.filesQuickButtons.sharedColor @@ -90,13 +102,17 @@ const QuickButtons = (props) => { const tabletViewQuickButton = isTablet(); const sizeQuickButton = isTile || tabletViewQuickButton ? "medium" : "small"; - - const displayBadges = viewAs === "table" || isTile || tabletViewQuickButton; + const displayBadges = + viewAs === "table" || + (isRow && locked && isMobile) || + isTile || + tabletViewQuickButton; const setFavorite = () => onClickFavorite(isFavorite); const isAvailableLockFile = !folderCategory && fileExst && displayBadges && item.security.Lock; + const isAvailableDownloadFile = isPublicRoom && item.security.Download && viewAs === "tile"; diff --git a/packages/client/src/components/dialogs/CreateEditRoomDialog/sub-components/TagInput/TagDropdown.js b/packages/client/src/components/dialogs/CreateEditRoomDialog/sub-components/TagInput/TagDropdown.js index 21d281c2eb..1458f1e426 100644 --- a/packages/client/src/components/dialogs/CreateEditRoomDialog/sub-components/TagInput/TagDropdown.js +++ b/packages/client/src/components/dialogs/CreateEditRoomDialog/sub-components/TagInput/TagDropdown.js @@ -93,6 +93,7 @@ const TagDropdown = ({ heightTablet={32} key={i} label={tag} + onMouseDown={preventDefault} onClick={() => addFetchedTag(tag)} /> )); diff --git a/packages/client/src/pages/Home/InfoPanel/Body/views/Members/index.js b/packages/client/src/pages/Home/InfoPanel/Body/views/Members/index.js index 40fa369508..83fcbd3aa5 100644 --- a/packages/client/src/pages/Home/InfoPanel/Body/views/Members/index.js +++ b/packages/client/src/pages/Home/InfoPanel/Body/views/Members/index.js @@ -71,6 +71,7 @@ const Members = ({ setExternalLink, withPublicRoomBlock, fetchMembers, + fetchMoreMembers, membersIsLoading, searchValue, searchResultIsLoading, @@ -96,19 +97,7 @@ const Members = ({ }, [infoPanelSelection, searchValue]); const loadNextPage = async () => { - const roomId = infoPanelSelection.id; - const fetchedMembers = await fetchMembers(t, false, withoutTitlesAndLinks); - const { users, administrators, expected, groups } = fetchedMembers; - - const newMembers = { - roomId: roomId, - administrators: [...infoPanelMembers.administrators, ...administrators], - users: [...infoPanelMembers.users, ...users], - expected: [...infoPanelMembers.expected, ...expected], - groups: [...infoPanelMembers.groups, ...groups], - }; - - setInfoPanelMembers(newMembers); + await fetchMoreMembers(t, withoutTitlesAndLinks); }; if (membersIsLoading) return ; @@ -301,6 +290,7 @@ export default inject( infoPanelMembers, setInfoPanelMembers, fetchMembers, + fetchMoreMembers, membersIsLoading, withPublicRoomBlock, searchValue, @@ -344,6 +334,7 @@ export default inject( setExternalLink, withPublicRoomBlock, fetchMembers, + fetchMoreMembers, membersIsLoading, searchValue, searchResultIsLoading, diff --git a/packages/client/src/pages/Home/InfoPanel/Body/views/Members/sub-components/MembersList.js b/packages/client/src/pages/Home/InfoPanel/Body/views/Members/sub-components/MembersList.js index af94888583..cb83a687f8 100644 --- a/packages/client/src/pages/Home/InfoPanel/Body/views/Members/sub-components/MembersList.js +++ b/packages/client/src/pages/Home/InfoPanel/Body/views/Members/sub-components/MembersList.js @@ -89,7 +89,7 @@ const MembersList = (props) => { }); const listOfTitles = list - .filter((x) => x.props.isTitle) + .filter((x) => x.props.user?.isTitle) .map((item) => { return { displayName: item.props.user.displayName, diff --git a/packages/client/src/pages/Home/InfoPanel/Body/views/SeveralItems/index.js b/packages/client/src/pages/Home/InfoPanel/Body/views/SeveralItems/index.js index 33fb773235..5ce397e060 100644 --- a/packages/client/src/pages/Home/InfoPanel/Body/views/SeveralItems/index.js +++ b/packages/client/src/pages/Home/InfoPanel/Body/views/SeveralItems/index.js @@ -35,7 +35,7 @@ import { useTranslation } from "react-i18next"; import { Text } from "@docspace/shared/components/text"; import { StyledSeveralItemsContainer } from "../../styles/severalItems"; -const SeveralItems = ({ isAccounts, theme, selectedItems }) => { +const SeveralItems = ({ isPeople, theme, selectedItems }) => { const { t } = useTranslation("InfoPanel"); const emptyScreenAlt = theme.isBase @@ -46,15 +46,15 @@ const SeveralItems = ({ isAccounts, theme, selectedItems }) => { ? EmptyScreenPersonSvgUrl : EmptyScreenPersonSvgDarkUrl; - const imgSrc = isAccounts ? emptyScreenPerson : emptyScreenAlt; + const imgSrc = isPeople ? emptyScreenPerson : emptyScreenAlt; - const itemsText = isAccounts + const itemsText = isPeople ? t("InfoPanel:SelectedUsers") : t("InfoPanel:ItemsSelected"); return ( diff --git a/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/RowView/userContent.js b/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/RowView/userContent.js index bd144713cc..f324224125 100644 --- a/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/RowView/userContent.js +++ b/packages/client/src/pages/Home/Section/AccountsBody/InsideGroup/RowView/userContent.js @@ -47,7 +47,7 @@ const StyledRowContent = styled(RowContent)` .badges { flex-direction: row-reverse; - margin-top: 10px; + margin-inline-end: 12px; .paid-badge { diff --git a/packages/client/src/pages/Home/Section/AccountsBody/People/RowView/userContent.js b/packages/client/src/pages/Home/Section/AccountsBody/People/RowView/userContent.js index c1466a11fe..3f15819558 100644 --- a/packages/client/src/pages/Home/Section/AccountsBody/People/RowView/userContent.js +++ b/packages/client/src/pages/Home/Section/AccountsBody/People/RowView/userContent.js @@ -46,7 +46,7 @@ const StyledRowContent = styled(RowContent)` .badges { flex-direction: row-reverse; - margin-top: 9px; + margin-inline-end: 12px; .paid-badge { diff --git a/packages/client/src/pages/Home/Section/Body/RowsView/SimpleFilesRow.js b/packages/client/src/pages/Home/Section/Body/RowsView/SimpleFilesRow.js index 306dcc93b1..4108bfd419 100644 --- a/packages/client/src/pages/Home/Section/Body/RowsView/SimpleFilesRow.js +++ b/packages/client/src/pages/Home/Section/Body/RowsView/SimpleFilesRow.js @@ -175,13 +175,6 @@ const StyledSimpleFilesRow = styled(Row)` } } - .lock-file { - cursor: ${(props) => (props.withAccess ? "pointer" : "default")}; - svg { - height: 12px; - } - } - .tablet-row-copy-link { display: none; } @@ -241,6 +234,7 @@ const StyledSimpleFilesRow = styled(Row)` } .lock-file { + cursor: ${(props) => (props.withAccess ? "pointer" : "default")}; svg { height: 16px; } @@ -292,20 +286,26 @@ const StyledSimpleFilesRow = styled(Row)` } @media ${mobile} { + .lock-file { + svg { + height: 12px; + } + } + .badges { gap: 8px; } - .badges__quickButtons:not(:empty) { + /* .badges__quickButtons:not(:empty) { ${(props) => - props.theme.interfaceDirection === "rtl" - ? css` - margin-right: 8px; - ` - : css` - margin-left: 8px; - `} - } + props.theme.interfaceDirection === "rtl" + ? css` + margin-right: 8px; + ` + : css` + margin-left: 8px; + `} + } */ .room__badges:empty, .file__badges:empty, .folder__badges:empty, diff --git a/packages/client/src/pages/Home/Section/Body/TilesView/sub-components/Tile.js b/packages/client/src/pages/Home/Section/Body/TilesView/sub-components/Tile.js index 2a8ac1de28..809f79a050 100644 --- a/packages/client/src/pages/Home/Section/Body/TilesView/sub-components/Tile.js +++ b/packages/client/src/pages/Home/Section/Body/TilesView/sub-components/Tile.js @@ -714,6 +714,7 @@ class Tile extends React.PureComponent { isThirdParty: true, icon: item.thirdPartyIcon, label: item.providerKey, + providerType: item.providerType, onClick: () => selectOption({ option: "typeProvider", diff --git a/packages/client/src/pages/Sdk/index.js b/packages/client/src/pages/Sdk/index.js index 2c2cc1adaf..ec926ddf3b 100644 --- a/packages/client/src/pages/Sdk/index.js +++ b/packages/client/src/pages/Sdk/index.js @@ -55,6 +55,7 @@ const Sdk = ({ getRoomsIcon, fetchExternalLinks, getFilePrimaryLink, + getFilesSettings, }) => { const [isDataReady, setIsDataReady] = useState(false); @@ -96,6 +97,10 @@ const Sdk = ({ } }, [callCommandLoad, isDataReady]); + useEffect(() => { + getFilesSettings(); + }, []); + const { mode } = useParams(); const selectorType = new URLSearchParams(window.location.search).get( "selectorType", @@ -291,7 +296,7 @@ export default inject( settingsStore; const { loadCurrentUser, user } = userStore; const { updateProfileCulture } = peopleStore.targetUserStore; - const { getIcon, getRoomsIcon } = filesSettingsStore; + const { getIcon, getRoomsIcon, getFilesSettings } = filesSettingsStore; const { fetchExternalLinks } = publicRoomStore; const { getFilePrimaryLink } = filesStore; @@ -310,6 +315,7 @@ export default inject( user, fetchExternalLinks, getFilePrimaryLink, + getFilesSettings, }; }, )(withTranslation(["JavascriptSdk", "Common"])(observer(Sdk))); diff --git a/packages/client/src/pages/VersionHistory/Section/Body/VersionRow.js b/packages/client/src/pages/VersionHistory/Section/Body/VersionRow.js index ef2db46259..443f5a0b07 100644 --- a/packages/client/src/pages/VersionHistory/Section/Body/VersionRow.js +++ b/packages/client/src/pages/VersionHistory/Section/Body/VersionRow.js @@ -190,6 +190,10 @@ const VersionRow = (props) => { // ); // }; + const onContextMenu = (event) => { + if (showEditPanel) event.stopPropagation(); + }; + const contextOptions = [ { key: "open", @@ -241,7 +245,7 @@ const VersionRow = (props) => { isEditing={isEditing} contextTitle={t("Common:Actions")} > -
+
{ this.currentCampaign = currentCampaign; - this.campaignImage = image; + this.campaignBackground = image; + this.campaignIcon = icon; this.campaignTranslate = translate; this.campaignConfig = config; }); diff --git a/packages/client/src/store/FilesActionsStore.js b/packages/client/src/store/FilesActionsStore.js index a8bbf67d7a..5d74b6078b 100644 --- a/packages/client/src/store/FilesActionsStore.js +++ b/packages/client/src/store/FilesActionsStore.js @@ -1211,6 +1211,11 @@ class FilesActionStore { } // this.updateCurrentFolder(null, null, null, operationId); + this.dialogsStore.setIsFolderActions(false); + return setTimeout( + () => clearSecondaryProgressData(operationId), + TIMEOUT, + ); }) .then(() => { @@ -1264,6 +1269,11 @@ class FilesActionStore { await this.uploadDataStore.loopFilesOperations(data, pbData); // this.updateCurrentFolder(null, [items], null, operationId); + this.dialogsStore.setIsFolderActions(false); + return setTimeout( + () => clearSecondaryProgressData(operationId), + TIMEOUT, + ); }) .then(() => { diff --git a/packages/client/src/store/InfoPanelStore.js b/packages/client/src/store/InfoPanelStore.js index fe189845ad..fceb1a257b 100644 --- a/packages/client/src/store/InfoPanelStore.js +++ b/packages/client/src/store/InfoPanelStore.js @@ -133,8 +133,10 @@ class InfoPanelStore { }; setSearchValue = (value) => { - this.setSearchResultIsLoading(true); - this.searchValue = value; + if (value !== this.searchValue) { + this.setSearchResultIsLoading(true); + this.searchValue = value; + } }; resetSearch = () => { @@ -651,6 +653,38 @@ class InfoPanelStore { }; }; + fetchMoreMembers = async (t, withoutTitles) => { + const roomId = this.infoPanelSelection.id; + const oldMembers = this.infoPanelMembers; + + const data = await this.filesStore.getRoomMembers(roomId, false); + + const newMembers = this.convertMembers(t, data, false, true); + + const mergedMembers = { + roomId: roomId, + administrators: [ + ...oldMembers.administrators, + ...newMembers.administrators, + ], + users: [...oldMembers.users, ...newMembers.users], + expected: [...oldMembers.expected, ...newMembers.expectedMembers], + groups: [...oldMembers.groups, ...newMembers.groups], + }; + + if (!withoutTitles) { + this.addMembersTitle( + t, + mergedMembers.administrators, + mergedMembers.users, + mergedMembers.expected, + mergedMembers.groups, + ); + } + + this.setInfoPanelMembers(mergedMembers); + }; + addInfoPanelMembers = (t, members) => { const convertedMembers = this.convertMembers(t, members); diff --git a/packages/doceditor/src/components/Root.tsx b/packages/doceditor/src/components/Root.tsx index ea76d94c4a..aade9a8ee1 100644 --- a/packages/doceditor/src/components/Root.tsx +++ b/packages/doceditor/src/components/Root.tsx @@ -63,6 +63,8 @@ const Root = ({ fileId, hash, }: TResponse) => { + const editorRef = React.useRef(null); + const documentserverUrl = config?.editorUrl ?? error?.editorUrl; const fileInfo = config?.file; @@ -141,9 +143,19 @@ const Root = ({ isSharingDialogVisible || isVisibleSelectFolderDialog || selectFileDialogVisible - ) + ) { calculateAsideHeight(); + const activeElement = document.activeElement as HTMLElement | null; + + if (activeElement && activeElement.tagName === "IFRAME") { + editorRef.current = activeElement; + activeElement.blur(); + } + } else if (editorRef.current) { + editorRef.current.focus(); + } + if (isSharingDialogVisible) { setTimeout(calculateAsideHeight, 10); } diff --git a/packages/login/src/client/components/Login.tsx b/packages/login/src/client/components/Login.tsx index 594d41a39a..2e27e6edfd 100644 --- a/packages/login/src/client/components/Login.tsx +++ b/packages/login/src/client/components/Login.tsx @@ -170,8 +170,8 @@ const Login: React.FC = ({ }; const onSocialButtonClick = useCallback( - (e: HTMLElementEvent) => { - const { target } = e; + (e: React.MouseEvent) => { + const target = e.target as HTMLElement; let targetElement = target; if ( diff --git a/packages/shared/components/campaigns-banner/CampaignsBanner.stories.tsx b/packages/shared/components/campaigns-banner/CampaignsBanner.stories.tsx index 5849bf98c0..e23019b42c 100644 --- a/packages/shared/components/campaigns-banner/CampaignsBanner.stories.tsx +++ b/packages/shared/components/campaigns-banner/CampaignsBanner.stories.tsx @@ -55,7 +55,7 @@ const Template = (args: CampaignsBannerProps) => ( export const Default: Story = { render: (args) =>