diff --git a/apps/remix-ide-e2e/src/tests/plugin_api.ts b/apps/remix-ide-e2e/src/tests/plugin_api.ts index 333a81fe1e..79cc466c76 100644 --- a/apps/remix-ide-e2e/src/tests/plugin_api.ts +++ b/apps/remix-ide-e2e/src/tests/plugin_api.ts @@ -217,7 +217,7 @@ module.exports = { .rightClickCustom('[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]').useXpath().waitForElementVisible('//*[@id="menuitemtestcommand"]').click('//*[@id="menuitemtestcommand"]', async () => { // @ts-ignore browser.click('//*[@data-id="verticalIconsKindlocalPlugin"]').frame(0, async () => { - await clickAndCheckLog(browser, null, { id: 'localPlugin', name: 'testCommand', label: 'testCommand', type: [], extension: ['.sol'], path: ['contracts/1_Storage.sol'], pattern: [] }, null, null) + await clickAndCheckLog(browser, null, { id: 'localPlugin', name: 'testCommand', label: 'testCommand', type: [], extension: ['.sol'], path: ['contracts/1_Storage.sol'], pattern: [], group: 99 }, null, null) }) }) }) diff --git a/apps/remix-ide-e2e/src/tests/remixd.test.ts b/apps/remix-ide-e2e/src/tests/remixd.test.ts index 1d9493016d..a1a617f645 100644 --- a/apps/remix-ide-e2e/src/tests/remixd.test.ts +++ b/apps/remix-ide-e2e/src/tests/remixd.test.ts @@ -104,7 +104,7 @@ module.exports = { }) .addFile('test_import_node_modules_with_github_import.sol', sources[4]['test_import_node_modules_with_github_import.sol']) .clickLaunchIcon('solidity') - .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') // open-zeppelin moved to pragma ^0.8.0 + .setSolidityCompilerVersion('soljson-v0.8.19+commit.7dd6d404.js') // open-zeppelin moved to pragma ^0.8.0 .testContracts('test_import_node_modules_with_github_import.sol', sources[4]['test_import_node_modules_with_github_import.sol'], ['ERC20', 'test11']) }, 'Static Analysis run with remixd #group3': '' + function (browser) { diff --git a/apps/remix-ide-e2e/src/tests/solidityImport.test.ts b/apps/remix-ide-e2e/src/tests/solidityImport.test.ts index 115119e996..79bddb5ed5 100644 --- a/apps/remix-ide-e2e/src/tests/solidityImport.test.ts +++ b/apps/remix-ide-e2e/src/tests/solidityImport.test.ts @@ -38,7 +38,7 @@ module.exports = { 'Test GitHub Import - from master branch #group1': function (browser: NightwatchBrowser) { browser - .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) + .setSolidityCompilerVersion('soljson-v0.8.19+commit.7dd6d404.js') // open-zeppelin moved to pragma ^0.8.19 (master branch) .addFile('Untitled4.sol', sources[3]['Untitled4.sol']) .clickLaunchIcon('filePanel') .verifyContracts(['test7', 'ERC20'], { wait: 10000 }) @@ -54,7 +54,7 @@ module.exports = { 'Test GitHub Import - no branch specified #group2': function (browser: NightwatchBrowser) { browser - .setSolidityCompilerVersion('soljson-v0.8.0+commit.c7dfd78e.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) + .setSolidityCompilerVersion('soljson-v0.8.19+commit.7dd6d404.js') // open-zeppelin moved to pragma ^0.8.19 (master branch) .clickLaunchIcon('filePanel') .click('li[data-id="treeViewLitreeViewItemREADME.txt"') .addFile('Untitled6.sol', sources[5]['Untitled6.sol']) @@ -64,6 +64,7 @@ module.exports = { 'Test GitHub Import - raw URL #group4': function (browser: NightwatchBrowser) { browser + .setSolidityCompilerVersion('soljson-v0.8.19+commit.7dd6d404.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) .clickLaunchIcon('filePanel') .click('li[data-id="treeViewLitreeViewItemREADME.txt"') .addFile('Untitled7.sol', sources[6]['Untitled7.sol']) diff --git a/apps/remix-ide/src/app/panels/file-panel.js b/apps/remix-ide/src/app/panels/file-panel.js index ccd9e4cec7..b391daf5bd 100644 --- a/apps/remix-ide/src/app/panels/file-panel.js +++ b/apps/remix-ide/src/app/panels/file-panel.js @@ -66,6 +66,15 @@ module.exports = class Filepanel extends ViewPlugin { /** * @param item { id: string, name: string, type?: string[], path?: string[], extension?: string[], pattern?: string[] } + * typically: + * group 0 for file manipulations + * group 1 for download operations + * group 2 for running operations (script for instance) + * group 3 for publishing operations (gist) + * group 4 for copying operations + * group 5 for solidity file operations (flatten for instance) + * group 6 for compiling operations + * group 7 for generating resource files (UML, documentation, ...) * @param callback (...args) => void */ registerContextMenuItem (item) { diff --git a/apps/remix-ide/src/app/tabs/compile-tab.js b/apps/remix-ide/src/app/tabs/compile-tab.js index d7fdc499e9..8531f2ead2 100644 --- a/apps/remix-ide/src/app/tabs/compile-tab.js +++ b/apps/remix-ide/src/app/tabs/compile-tab.js @@ -123,7 +123,8 @@ class CompileTab extends CompilerApiMixin(ViewPlugin) { // implements ICompilerA type: [], extension: ['.sol'], path: [], - pattern: [] + pattern: [], + group: 6 }) }) try { diff --git a/apps/remix-ide/src/remixAppManager.js b/apps/remix-ide/src/remixAppManager.js index 66f2b92bc3..73e4c755c0 100644 --- a/apps/remix-ide/src/remixAppManager.js +++ b/apps/remix-ide/src/remixAppManager.js @@ -192,7 +192,8 @@ export class RemixAppManager extends PluginManager { extension: ['.sol'], path: [], pattern: [], - sticky: true + sticky: true, + group: 5 }) await this.call('filePanel', 'registerContextMenuItem', { id: 'nahmii-compiler', @@ -202,7 +203,8 @@ export class RemixAppManager extends PluginManager { extension: ['.sol'], path: [], pattern: [], - sticky: true + sticky: true, + group: 6 }) await this.call('filePanel', 'registerContextMenuItem', { id: 'solidityumlgen', @@ -212,7 +214,8 @@ export class RemixAppManager extends PluginManager { extension: ['.sol'], path: [], pattern: [], - sticky: true + sticky: true, + group: 7 }) await this.call('filePanel', 'registerContextMenuItem', { id: 'doc-gen', @@ -222,7 +225,8 @@ export class RemixAppManager extends PluginManager { extension: ['.sol'], path: [], pattern: [], - sticky: true + sticky: true, + group: 7 }) } } diff --git a/libs/remix-ui/workspace/src/lib/components/file-explorer-context-menu.tsx b/libs/remix-ui/workspace/src/lib/components/file-explorer-context-menu.tsx index 825d66667d..b5e748a81d 100644 --- a/libs/remix-ui/workspace/src/lib/components/file-explorer-context-menu.tsx +++ b/libs/remix-ui/workspace/src/lib/components/file-explorer-context-menu.tsx @@ -72,12 +72,23 @@ export const FileExplorerContextMenu = (props: FileExplorerContextMenuProps) => } const menu = () => { - return actions.filter(item => filterItem(item)).map((item, index) => { + let group = 0 + const groupedActions = actions.filter(item => filterItem(item)).reduce((acc, item) => { + if (item.group === undefined || item.group === null) item.group = 99 + if (!acc[item.group]) acc[item.group] = [] + acc[item.group].push(item) + return acc; + }, []) + let key = -1 + return groupedActions.map((groupItem, groupIndex) => groupItem.map((item, index) => { + key++ + const className = `remixui_liitem ${group !== item.group ? 'border-top': ''}` + group = item.group if(item.name === "Upload File"){ return
  • { _paq.push(['trackEvent', 'fileExplorer', 'contextMenu', 'uploadFile']) setShowFileExplorer(true) @@ -88,8 +99,8 @@ export const FileExplorerContextMenu = (props: FileExplorerContextMenuProps) => if(item.name === "Load a Local File"){ return
  • { _paq.push(['trackEvent', 'fileExplorer', 'contextMenu', 'uploadFile']) setShowFileExplorer(true) @@ -98,8 +109,8 @@ export const FileExplorerContextMenu = (props: FileExplorerContextMenuProps) => } return
  • { e.stopPropagation() switch (item.name) { @@ -170,7 +181,7 @@ export const FileExplorerContextMenu = (props: FileExplorerContextMenuProps) => } hideContextMenu() }}>{intl.formatMessage({id: `filePanel.${item.id}`, defaultMessage: item.label || item.name})}
  • - }) + })) } return ( diff --git a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx index 648206b32b..a64ddb8979 100644 --- a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx +++ b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx @@ -76,7 +76,8 @@ export function Workspace () { extension: [], pattern: [], multiselect: false, - label: '' + label: '', + group: 4 }]) } else { removeMenuItems([{ @@ -87,7 +88,8 @@ export function Workspace () { extension: [], pattern: [], multiselect: false, - label: '' + label: '', + group: 4 }]) } }, [canPaste]) diff --git a/libs/remix-ui/workspace/src/lib/types/index.ts b/libs/remix-ui/workspace/src/lib/types/index.ts index 7247800715..5ded4df7d4 100644 --- a/libs/remix-ui/workspace/src/lib/types/index.ts +++ b/libs/remix-ui/workspace/src/lib/types/index.ts @@ -5,7 +5,7 @@ import { fileDecoration } from '@remix-ui/file-decorators' import { RemixAppManager } from 'libs/remix-ui/plugin-manager/src/types' import { ViewPlugin } from '@remixproject/engine-web' -export type action = { name: string, type?: Array<'folder' | 'gist' | 'file' | 'workspace'>, path?: string[], extension?: string[], pattern?: string[], id: string, multiselect: boolean, label: string, sticky?: boolean } +export type action = { name: string, type?: Array<'folder' | 'gist' | 'file' | 'workspace'>, path?: string[], extension?: string[], pattern?: string[], id: string, multiselect: boolean, label: string, sticky?: boolean, group: number } export interface JSONStandardInput { language: "Solidity"; settings?: any, @@ -176,7 +176,8 @@ export interface WorkSpaceState { extension?: string[] pattern?: string[] multiselect: boolean - label: string + label: string, + group: number }[] focusContext: FileFocusContextType focusEdit: { diff --git a/libs/remix-ui/workspace/src/lib/utils/index.ts b/libs/remix-ui/workspace/src/lib/utils/index.ts index f908451d19..9069e827e0 100644 --- a/libs/remix-ui/workspace/src/lib/utils/index.ts +++ b/libs/remix-ui/workspace/src/lib/utils/index.ts @@ -5,96 +5,112 @@ export const contextMenuActions: MenuItems = [{ name: 'New File', type: ['folder', 'gist', 'workspace'], multiselect: false, - label: '' + label: '', + group: 0 }, { id: 'newFolder', name: 'New Folder', type: ['folder', 'gist', 'workspace'], multiselect: false, - label: '' + label: '', + group: 0 }, { id: 'rename', name: 'Rename', type: ['file', 'folder'], multiselect: false, - label: '' + label: '', + group: 0 }, { id: 'delete', name: 'Delete', type: ['file', 'folder', 'gist'], multiselect: false, - label: '' + label: '', + group: 0 },{ + id: 'deleteAll', + name: 'Delete All', + type: ['folder', 'file'], + multiselect: true, + label: '', + group: 0 +}, { + id: 'copy', + name: 'Copy', + type: ['folder', 'file'], + multiselect: false, + label: '', + group: 1 +}, { + id: 'copyFileName', + name: 'Copy name', + type: ['file'], + multiselect: false, + label: '', + group: 1 +}, { + id: 'copyFilePath', + name: 'Copy path', + type: ['file'], + multiselect: false, + label: '', + group: 1 +}, { id: 'download', name: 'Download', type: ['file', 'folder', 'workspace'], multiselect: false, - label: '' + label: '', + group: 2 }, { id: 'run', name: 'Run', extension: ['.js', '.ts'], multiselect: false, - label: '' + label: '', + group: 3 },{ id: 'pushChangesToGist', name: 'Push changes to gist', type: ['gist'], multiselect: false, - label: '' + label: '', + group: 4 }, { id: 'publishFolderToGist', name: 'Publish folder to gist', type: ['folder'], multiselect: false, - label: '' + label: '', + group: 4 }, { id: 'publishFileToGist', name: 'Publish file to gist', type: ['file'], multiselect: false, - label: '' + label: '', + group: 4 }, { - id: 'copy', - name: 'Copy', - type: ['folder', 'file'], - multiselect: false, - label: '' -}, { - id: 'copyFileName', - name: 'Copy name', - type: ['file'], - multiselect: false, - label: '' -}, { - id: 'copyFilePath', - name: 'Copy path', - type: ['file'], - multiselect: false, - label: '' -}, { - id: 'deleteAll', - name: 'Delete All', - type: ['folder', 'file'], - multiselect: true, - label: '' -},{ id: 'uploadFile', name: 'Load a Local File', type: ['folder', 'gist', 'workspace'], multiselect: false, - label: 'Load a Local File' + label: 'Load a Local File', + group: 4 }, { id: 'publishToGist', name: 'Push changes to gist', type: ['folder', 'gist'], multiselect: false, - label: 'Publish all to Gist' + label: 'Publish all to Gist', + group: 4 }, { id: 'publishWorkspace', name: 'Publish Workspace to Gist', type: ['workspace'], multiselect: false, - label: '' + label: '', + group: 4 }] \ No newline at end of file