renderContextMenu()

in frontend/src/js/components/workspace/Workspaces.tsx [572:664]


    renderContextMenu(entry: TreeEntry<WorkspaceEntry>, positionX: number, positionY: number, currentUser: PartialUser, workspace: Workspace) {
        const copyFilenameContent = "Copy file name"
        const copyFilePathContent = "Copy file path"
        const items = [
            {key : "copyFilename", content: copyFilenameContent, icon: "copy"},
            {key : "copyFilePath", content: copyFilePathContent, icon: "copy"},
            // or 'pencil alternate'
            { key: "rename", content: "Rename", icon: "pen square" },
            { key: "remove", content: "Remove from workspace", icon: "trash" },
        ];
        
        if (entry.data.addedBy.username === currentUser.username && isWorkspaceLeaf(entry.data)) {
            items.push({ key: "deleteOrRemove", content: "Delete file", icon: "trash" });
        }

        if (isWorkspaceLeaf(entry.data)){
            items.push({ key: "reprocess", content: "Reprocess source file", icon: "redo" });
        } else {
           items.push({ key: "search", content: "Search in folder", icon: "search" })
        }

        return <DetectClickOutside onClickOutside={this.closeContextMenu}>
            <Menu
                style={{ position: 'absolute', left: positionX, top: positionY }}
                items={items}
                vertical
                onItemClick={(e, menuItemProps) => {
                    const workspaceId = this.props.match.params.id;
                    let closeMenuDelay = 0;
                    if (menuItemProps.content === 'Rename') {
                        this.props.setEntryBeingRenamed(entry);
                    }

                    if (menuItemProps.content === 'Remove from workspace') {
                        this.setState({
                            removeFromWorkspaceModalContext: {
                                isOpen: true,
                                entry,
                                status: "unconfirmed",
                            }
                        });
                    }

                    if (menuItemProps.content === copyFilenameContent || menuItemProps.content === copyFilePathContent) {
                        const text = menuItemProps.content === copyFilenameContent ? entry.name : this.getEntryPath(entry.id, workspace.rootNode);
                        navigator.clipboard.writeText(text);
                        const menuItem = items.find((i: ContextMenuEntry) => i.content === menuItemProps.content)
                        if (menuItem) {
                            menuItem.content = 'Copied!'
                            menuItem.icon = 'check'
                            closeMenuDelay = 700;
                        }
                    }

                    if (menuItemProps.content === "Delete file") {
                        this.setState({
                            deleteModalContext: {
                                isOpen: true,
                                entry,
                                status: "unconfirmed",
                            }
                        });
                    }

                    if (menuItemProps.content === 'Reprocess source file' && (isWorkspaceLeaf(entry.data))) {
                        this.props.reprocessBlob(workspaceId, entry.data.uri)
                    }

                    if (menuItemProps.content === "Search in folder"){
                        history.push(
                            buildLink("/search", {
                                q: JSON.stringify([
                                    "",
                                    {
                                        n: "Workspace Folder",
                                        v: entry.name,
                                        op: "+",
                                        t: "workspace_folder",
                                        workspaceId: workspace.id,
                                        folderId: entry.id,
                                    },
                                    "*"
                                ]),
                                page: 1
                            }),
                        )
                    }

                    setTimeout(() => this.closeContextMenu(), closeMenuDelay);
                }}
            />
        </DetectClickOutside>;
    }