diff --git a/.github/workflows/trigger-action.yml b/.github/workflows/trigger-action.yml index b3ce5c3e0c..4141db942a 100644 --- a/.github/workflows/trigger-action.yml +++ b/.github/workflows/trigger-action.yml @@ -6,6 +6,7 @@ on: branches: - 'hotfix/v*' - 'release/v*' + - 'develop' jobs: dispatch: diff --git a/packages/client/src/components/FilesPanels/index.js b/packages/client/src/components/FilesPanels/index.js index 02e3509a66..fd65f0f5a1 100644 --- a/packages/client/src/components/FilesPanels/index.js +++ b/packages/client/src/components/FilesPanels/index.js @@ -101,7 +101,7 @@ const Panels = (props) => { selectFileFormRoomDialogVisible, selectFileFormRoomFilterParam, setSelectFileFormRoomDialogVisible, - createFromTemplateForm, + copyFromTemplateForm, hotkeyPanelVisible, invitePanelVisible, convertPasswordDialogVisible, @@ -301,7 +301,7 @@ const Panels = (props) => { key="select-file-form-room-dialog" onClose={onCloseFileFormRoomDialog} openRoot={selectFileFormRoomOpenRoot} - onSelectFile={createFromTemplateForm} + onSelectFile={(file) => copyFromTemplateForm(file, t)} filterParam={selectFileFormRoomFilterParam} descriptionText={descriptionTextFileFormRoomDialog} /> @@ -367,6 +367,7 @@ export default inject( createEditRoomStore, pluginStore, filesStore, + filesActionsStore, }) => { const { ownerPanelVisible, @@ -397,7 +398,6 @@ export default inject( selectFileFormRoomDialogVisible, selectFileFormRoomFilterParam, setSelectFileFormRoomDialogVisible, - createFromTemplateForm, invitePanelOptions, inviteUsersWarningDialogVisible, changeUserTypeDialogVisible, @@ -417,6 +417,7 @@ export default inject( } = dialogsStore; const { preparationPortalDialogVisible } = backup; + const { copyFromTemplateForm } = filesActionsStore; const { uploadPanelVisible } = uploadDataStore; const { isVisible: versionHistoryPanelVisible } = versionHistoryStore; @@ -455,7 +456,7 @@ export default inject( selectFileFormRoomDialogVisible, selectFileFormRoomFilterParam, setSelectFileFormRoomDialogVisible, - createFromTemplateForm, + copyFromTemplateForm, hotkeyPanelVisible, restoreAllPanelVisible, invitePanelVisible: invitePanelOptions.visible, diff --git a/packages/client/src/components/GlobalEvents/CreateEvent.js b/packages/client/src/components/GlobalEvents/CreateEvent.js index 256687a5c2..f5c0a97fb9 100644 --- a/packages/client/src/components/GlobalEvents/CreateEvent.js +++ b/packages/client/src/components/GlobalEvents/CreateEvent.js @@ -71,6 +71,8 @@ const CreateEvent = ({ publicRoomKey, actionEdit, openOnNewPage, + openEditor, + createFile, }) => { const [headerTitle, setHeaderTitle] = React.useState(null); const [startValue, setStartValue] = React.useState(""); @@ -112,7 +114,7 @@ const CreateEvent = ({ }; }, [extension, title, fromTemplate, withoutDialog]); - const onSave = (e, value, open = true) => { + const onSave = async (e, value, open = true) => { let item; let createdFolderId; @@ -157,46 +159,63 @@ const CreateEvent = ({ return setIsLoading(false); }); } else { - const searchParams = new URLSearchParams(); + try { + if (openEditor) { + const searchParams = new URLSearchParams(); - searchParams.append("parentId", parentId); - searchParams.append("fileTitle", `${newValue}.${extension}`); - searchParams.append("open", open); - searchParams.append("id", id); + searchParams.append("parentId", parentId); + searchParams.append("fileTitle", `${newValue}.${extension}`); + searchParams.append("open", open); + searchParams.append("id", id); - if (preview) { - searchParams.append("action", "view"); + if (preview) { + searchParams.append("action", "view"); + } + + if (actionEdit) { + searchParams.append("action", "edit"); + } + + if (publicRoomKey) { + searchParams.append("share", publicRoomKey); + } + + if (isMakeFormFromFile) { + searchParams.append("fromFile", isMakeFormFromFile); + searchParams.append("templateId", templateId); + } else if (fromTemplate) { + searchParams.append("fromTemplate", fromTemplate); + searchParams.append("formId", gallerySelected.id); + } + + searchParams.append("hash", new Date().getTime()); + + const url = combineUrl( + window.location.origin, + window.ClientConfig?.proxy?.url, + config.homepage, + `/doceditor/create?${searchParams.toString()}`, + ); + + window.open(url, openOnNewPage ? "_blank" : "_self"); + + return; + } + + return await createFile( + +parentId, + `${newValue}.${extension}`, + templateId, + gallerySelected?.id, + ).catch((error) => { + toastr.error(error); + }); + } catch (error) { + toastr.error(error); + } finally { + setIsLoading(false); + onCloseAction(); } - - if (actionEdit) { - searchParams.append("action", "edit"); - } - - if (publicRoomKey) { - searchParams.append("share", publicRoomKey); - } - - if (isMakeFormFromFile) { - searchParams.append("fromFile", isMakeFormFromFile); - searchParams.append("templateId", templateId); - } else if (fromTemplate) { - searchParams.append("fromTemplate", fromTemplate); - searchParams.append("formId", gallerySelected.id); - } - - searchParams.append("hash", new Date().getTime()); - - const url = combineUrl( - window.location.origin, - window.ClientConfig?.proxy?.url, - config.homepage, - `/doceditor/create?${searchParams.toString()}`, - ); - - window.open(url, openOnNewPage ? "_blank" : "_self"); - - setIsLoading(false); - onCloseAction(); } }; diff --git a/packages/client/src/components/GlobalEvents/index.js b/packages/client/src/components/GlobalEvents/index.js index b0d3ba816f..85680e6abe 100644 --- a/packages/client/src/components/GlobalEvents/index.js +++ b/packages/client/src/components/GlobalEvents/index.js @@ -115,6 +115,7 @@ const GlobalEvents = ({ enablePlugins, eventListenerItemsList }) => { withoutDialog: payload.withoutDialog ?? false, preview: payload.preview ?? false, actionEdit: payload.edit ?? false, + openEditor: payload.openEditor ?? true, onClose: () => { setCreateDialogProps({ visible: false, @@ -128,6 +129,7 @@ const GlobalEvents = ({ enablePlugins, eventListenerItemsList }) => { withoutDialog: false, preview: false, actionEdit: false, + openEditor: true, }); }, }); diff --git a/packages/client/src/components/dialogs/ConflictResolveDialog/index.tsx b/packages/client/src/components/dialogs/ConflictResolveDialog/index.tsx index 48202c5ea0..0e5b5b3ba2 100644 --- a/packages/client/src/components/dialogs/ConflictResolveDialog/index.tsx +++ b/packages/client/src/components/dialogs/ConflictResolveDialog/index.tsx @@ -63,7 +63,7 @@ const ConflictResolveDialog = (props: ConflictResolveDialogProps) => { handleFilesUpload, } = props; - const { t, ready } = useTranslation(["ConflictResolveDialog", "Common"]); + const { t, ready } = useTranslation(["Common"]); const { destFolderId, @@ -198,7 +198,7 @@ const ConflictResolveDialog = (props: ConflictResolveDialogProps) => { items.length === 1 ? ( }} @@ -206,7 +206,7 @@ const ConflictResolveDialog = (props: ConflictResolveDialogProps) => { ) : ( }} @@ -216,20 +216,20 @@ const ConflictResolveDialog = (props: ConflictResolveDialogProps) => { return ( ); }; diff --git a/packages/client/src/pages/Home/Hooks/useFiles.js b/packages/client/src/pages/Home/Hooks/useFiles.js index 059b103c5c..188d89a747 100644 --- a/packages/client/src/pages/Home/Hooks/useFiles.js +++ b/packages/client/src/pages/Home/Hooks/useFiles.js @@ -34,7 +34,12 @@ import { getGroup } from "@docspace/shared/api/groups"; import { getUserById } from "@docspace/shared/api/people"; import { MEDIA_VIEW_URL } from "@docspace/shared/constants"; -import { Events, RoomSearchArea } from "@docspace/shared/enums"; +import { + Events, + FolderType, + RoomSearchArea, + RoomsType, +} from "@docspace/shared/enums"; import { getObjectByLocation } from "@docspace/shared/utils/common"; import { useParams } from "react-router-dom"; @@ -72,6 +77,7 @@ const useFiles = ({ userId, scrollToTop, + selectedFolderStore, }) => { const navigate = useNavigate(); const { id } = useParams(); @@ -298,11 +304,16 @@ const useFiles = ({ const event = new Event(Events.CREATE); + const isFormRoom = + selectedFolderStore.roomType === RoomsType.FormRoom || + selectedFolderStore.type === FolderType.FormRoom; + const payload = { extension: "pdf", id: -1, fromTemplate: true, title: gallerySelected.attributes.name_form, + openEditor: !isFormRoom, }; event.payload = payload; diff --git a/packages/client/src/pages/Home/InfoPanel/Body/helpers/DetailsHelper.js b/packages/client/src/pages/Home/InfoPanel/Body/helpers/DetailsHelper.js index d0e270602b..3aa44b2349 100644 --- a/packages/client/src/pages/Home/InfoPanel/Body/helpers/DetailsHelper.js +++ b/packages/client/src/pages/Home/InfoPanel/Body/helpers/DetailsHelper.js @@ -278,12 +278,16 @@ class DetailsHelper { getAuthorDecoration = (byField = "createdBy") => { const onClick = () => this.openUser(this.item[byField], this.navigate); + const isAnonim = this.item[byField]?.isAnonim; const displayName = this.item[byField]?.displayName; - const name = displayName ? decode(displayName) : ""; + + let name = displayName ? decode(displayName) : ""; + + if (isAnonim) name = this.t("Common:Anonymous"); //console.log("getAuthorDecoration", { name, displayName }); - return this.isVisitor || this.isCollaborator + return this.isVisitor || this.isCollaborator || isAnonim ? text(name) : link(name, onClick); }; diff --git a/packages/client/src/pages/Home/InfoPanel/Body/views/History/HistoryBlock.js b/packages/client/src/pages/Home/InfoPanel/Body/views/History/HistoryBlock.js index bdcf07bada..b60bedfced 100644 --- a/packages/client/src/pages/Home/InfoPanel/Body/views/History/HistoryBlock.js +++ b/packages/client/src/pages/Home/InfoPanel/Body/views/History/HistoryBlock.js @@ -83,7 +83,11 @@ const HistoryBlock = ({ />
- {decode(initiator.displayName)} + + {initiator?.isAnonim + ? t("Common:Anonymous") + : decode(initiator.displayName)} + {initiator.isOwner && ( {t("Common:Owner").toLowerCase()} diff --git a/packages/client/src/pages/Home/Section/Header/index.js b/packages/client/src/pages/Home/Section/Header/index.js index 924a69e3e3..f833fd8c15 100644 --- a/packages/client/src/pages/Home/Section/Header/index.js +++ b/packages/client/src/pages/Home/Section/Header/index.js @@ -1225,14 +1225,15 @@ export default inject( const sharedItem = navigationPath.find((r) => r.shared); - const showNavigationButton = isLoading - ? false - : (!isPublicRoom && - !isArchive && - canCopyPublicLink && - (isPublicRoomType || isCustomRoomType || isFormRoomType) && - shared) || - (sharedItem && sharedItem.canCopyPublicLink); + const showNavigationButton = + isLoading || !security?.CopyLink + ? false + : (!isPublicRoom && + !isArchive && + canCopyPublicLink && + (isPublicRoomType || isCustomRoomType || isFormRoomType) && + shared) || + (sharedItem && sharedItem.canCopyPublicLink); return { isGracePeriod, diff --git a/packages/client/src/pages/Home/index.js b/packages/client/src/pages/Home/index.js index 5e916b582c..ffea1f5615 100644 --- a/packages/client/src/pages/Home/index.js +++ b/packages/client/src/pages/Home/index.js @@ -201,6 +201,7 @@ const PureHome = (props) => { userId, scrollToTop, + selectedFolderStore, }); const { showUploadPanel } = useOperations({ diff --git a/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/SyncContainer.js b/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/SyncContainer.js index e988decb18..2140600502 100644 --- a/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/SyncContainer.js +++ b/packages/client/src/pages/PortalSettings/categories/integration/LDAP/sub-components/SyncContainer.js @@ -31,7 +31,7 @@ import { useTranslation } from "react-i18next"; import { Box } from "@docspace/shared/components/box"; import { Text } from "@docspace/shared/components/text"; import { Button, ButtonSize } from "@docspace/shared/components/button"; -import { Cron } from "@docspace/shared/components/cron"; +import { Cron, getNextSynchronization } from "@docspace/shared/components/cron"; import { toastr } from "@docspace/shared/components/toast"; import ProgressContainer from "./ProgressContainer"; @@ -50,7 +50,6 @@ const SyncContainer = ({ onChangeCron, cron, serverCron, - nextSyncDate, theme, isLdapEnabledOnServer, @@ -87,6 +86,10 @@ const SyncContainer = ({ const buttonSize = isDesktop() ? ButtonSize.small : ButtonSize.normal; + const nextSyncDate = React.useMemo(() => { + if (cron) return getNextSynchronization(cron); + }, [cron]); + const renderBody = () => ( {!isMobileView && ( @@ -144,7 +147,7 @@ const SyncContainer = ({ />
- {`${t("LdapNextSync")}: ${nextSyncDate.toFormat("DDDD tt")} UTC`} + {`${t("LdapNextSync")}: ${nextSyncDate?.toFormat("DDDD tt")} UTC`}