Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
26c3dbf
add topbar files and entries
joeizang Jul 15, 2025
7fd827d
temp increase max-old-space-size
joeizang Jul 9, 2025
6e49c69
add to ide shell
joeizang Jul 16, 2025
3caa3d4
topbar up and running
joeizang Jul 16, 2025
2517af7
props for react side
joeizang Jul 17, 2025
eb9334a
topbar context
joeizang Jul 17, 2025
a39c3fc
add topbar provider and inject filePanel into topbar
joeizang Jul 17, 2025
eef4a3a
fix styles. add new style. add markup
joeizang Jul 18, 2025
f773907
fix error in plugin
joeizang Jul 18, 2025
10802c2
fix version number button.
joeizang Jul 23, 2025
03b72f4
share types from hometab
joeizang Jul 23, 2025
a082c86
topbar workspaces dropdown
joeizang Jul 23, 2025
c0322dd
fix typescript error
joeizang Jul 23, 2025
963c123
get latest release url for topbar
joeizang Jul 23, 2025
7c64752
fix dropdown menu items
joeizang Jul 23, 2025
b792e07
custom menu for topbar
joeizang Jul 23, 2025
6a57c64
update Workspace dropdown component for topbar
joeizang Jul 23, 2025
590e5d5
working on flyoutsubmenu
joeizang Jul 24, 2025
4f12dc5
fix style and position
joeizang Jul 24, 2025
01376e4
fix submenus for workspaces dropdown
joeizang Jul 24, 2025
8d61d35
cleanup scratch code
joeizang Jul 24, 2025
25db57e
set topbar plugin permission
joeizang Jul 25, 2025
8749ef1
add actions for dropdown menu and submenus
joeizang Jul 25, 2025
fe18fa7
add modal and tooltip capabilities
joeizang Jul 25, 2025
984427c
update submenu actions
joeizang Jul 25, 2025
54e2f1c
remove previous dropdown and hamburger menu
joeizang Jul 25, 2025
f1c6dff
Update remix desktop download url
joeizang Jul 25, 2025
0a0e4cd
Merge branch 'master' into ide-topbar-feature
joeizang Jul 25, 2025
96b7e3b
fix the lack of data-id for menu items
joeizang Jul 25, 2025
66cb7a9
e2e fixes. direct calls to workspaces related functions.
joeizang Jul 28, 2025
a6396bc
Merge branch 'master' into ide-topbar-feature
joeizang Jul 29, 2025
30c21f1
fix e2e for settings
joeizang Jul 30, 2025
e1c3a41
remove dependence on currentBranch to detect submodules in git branch
joeizang Jul 30, 2025
f7fb664
clean up topbar provider
joeizang Jul 30, 2025
6eba25a
handle git ops
joeizang Jul 30, 2025
78c6378
fixing e2e tests
joeizang Jul 30, 2025
015a959
Merge branch 'master' into ide-topbar-feature
joeizang Jul 30, 2025
437e587
fix git workspace submodule e2e
joeizang Jul 30, 2025
b1be318
fix more workspaces e2e tests
joeizang Jul 30, 2025
16c7671
Add direct git login. Add themes
joeizang Jul 30, 2025
26eb132
fix more e2e tests. disabled test need git auth.
joeizang Jul 30, 2025
c7573a3
update data-ids
joeizang Jul 30, 2025
21d988d
fix e2es. fix file explorer bottom padding.
Jul 31, 2025
8d3dbe5
addressing dgit tests
Jul 31, 2025
4c020dd
fix dgit and npm import tests
Jul 31, 2025
14b2028
fix e2e needing logo. fix git related tests needing login
Jul 31, 2025
87e0634
clean up scriptrunner e2e
Jul 31, 2025
ec2e7f2
fix import from git test
Jul 31, 2025
5e128d8
fix import from Github test
Jul 31, 2025
e462d58
fix e2es for workspaces and workspaces.git
Jul 31, 2025
fbbefa6
fix e2e
Aug 1, 2025
f3053f5
update dgit_github teest
Aug 1, 2025
ee541ed
fix padding issues, simplify layout
Aug 1, 2025
3b05a5a
find settings in matomo test
Aug 1, 2025
5ca47e6
fix settings in e2e
Aug 1, 2025
fb96822
fix settings access for e2e
Aug 1, 2025
06f7bce
fixh e2e solidity import modal
Aug 1, 2025
71a2354
fix more tests
Aug 1, 2025
029075a
fix rename workspace test
Aug 1, 2025
b34b961
tagged rename workspace test with #pr
Aug 1, 2025
a474c19
fix workspace delete test
Aug 1, 2025
29e418b
remove wait from workspaces test
Aug 1, 2025
d8ebb8b
prtag for rename and delete workspace
Aug 1, 2025
b18a795
fix workspace rename test. reduce zindex which was interfering with m…
Aug 1, 2025
9ab1d2b
remove pr label
Aug 1, 2025
77aa532
Add connect to Remixd. Fix comments from @Aniket-Engg
Aug 4, 2025
4af6b18
removed duplicate temporarily
Aug 4, 2025
38ace61
remove topbar from plugin manager ui
Aug 4, 2025
c1ddf98
switch icon based on current theme. fix console error for settings
Aug 4, 2025
434314f
change theme icon when theme change happens.
Aug 4, 2025
8ac62b2
cleanup console logs
Aug 4, 2025
b4195a7
update workspaces based on events and not timeout
Aug 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .env.local
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
gist_token=<token>
account_passphrase=<passphrase>
account_password=<password>
NODE_OPTIONS=--max-old-space-size=2048

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2008

NODE_OPTIONS=--max-old-space-size=4096
WALLET_CONNECT_PROJECT_ID=<project_id>
NOIR_COMPILER_BASE_URL_DEV=<dev_base_endpoint>
NOIR_COMPILER_BASE_URL_PROD=<prod_base_endpoint>
Expand Down
8 changes: 4 additions & 4 deletions apps/remix-ide-e2e/src/commands/currentWorkspaceIs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ class CurrentWorkspaceIs extends EventEmitter {
selector: xpath,
timeout: 20000
})
.perform((done) => {
done()
this.emit('complete')
})
.perform((done) => {
done()
this.emit('complete')
})
return this
}
}
Expand Down
40 changes: 20 additions & 20 deletions apps/remix-ide-e2e/src/commands/openFile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,31 +33,31 @@ function openFile (browser: NightwatchBrowser, name: string, done: VoidFunction)
}
})
})
.perform(async () => {
if (await browser.isVisible({ selector: 'li[data-id="treeViewLitreeViewItem' + name + '"]', suppressNotFoundErrors: true})) {
.perform(async () => {
if (await browser.isVisible({ selector: 'li[data-id="treeViewLitreeViewItem' + name + '"]', suppressNotFoundErrors: true })) {
browser.click('li[data-id="treeViewLitreeViewItem' + name + '"]')
done()
return
}
let it = 0
const split = name.split('/')
let current = split.splice(0, 1)
while (true) {
if (await browser.isVisible({ selector: 'li[data-id="treeViewLitreeViewItem' + current.join('/') + '"]', suppressNotFoundErrors: true }) &&
!await browser.isPresent({ selector: 'li[data-id="treeViewLitreeViewItem' + current.join('/') + '"] .fa-folder-open', suppressNotFoundErrors: true })) {
browser.click('li[data-id="treeViewLitreeViewItem' + current.join('/') + '"]')
}
if (current.join('/') === name) {
break
}
current.push(split.shift())
it++
if (it > 15) {
browser.assert.fail(name, current.join('/'), 'cannot open file ' + name)
let it = 0
const split = name.split('/')
const current = split.splice(0, 1)
while (true) {
if (await browser.isVisible({ selector: 'li[data-id="treeViewLitreeViewItem' + current.join('/') + '"]', suppressNotFoundErrors: true }) &&
!await browser.isPresent({ selector: 'li[data-id="treeViewLitreeViewItem' + current.join('/') + '"] .fa-folder-open', suppressNotFoundErrors: true })) {
browser.click('li[data-id="treeViewLitreeViewItem' + current.join('/') + '"]')
}
if (current.join('/') === name) {
break
}
current.push(split.shift())
it++
if (it > 15) {
browser.assert.fail(name, current.join('/'), 'cannot open file ' + name)
}
}
}
done()
})
done()
})
}

module.exports = OpenFile
20 changes: 10 additions & 10 deletions apps/remix-ide-e2e/src/commands/switchWorkspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@ import EventEmitter from 'events'
class switchWorkspace extends EventEmitter {
command (this: NightwatchBrowser, workspaceName: string): NightwatchBrowser {
this.api
.waitForElementVisible('[data-id="workspacesSelect"]')
.click('[data-id="workspacesSelect"]')
.waitForElementVisible(`[data-id="dropdown-item-${workspaceName}"]`)
.click(`[data-id="dropdown-item-${workspaceName}"]`)
.pause(7000)
.perform((done) => {
done()
this.emit('complete')
})
.waitForElementVisible('[data-id="workspacesSelect"]')
.click('[data-id="workspacesSelect"]')
.waitForElementVisible(`[data-id="dropdown-item-${workspaceName}"]`)
.click(`[data-id="dropdown-item-${workspaceName}"]`)
.pause(7000)
.perform((done) => {
done()
this.emit('complete')
})
return this
}
}

module.exports = switchWorkspace
module.exports = switchWorkspace
9 changes: 7 additions & 2 deletions apps/remix-ide-e2e/src/helpers/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,10 +99,15 @@ function initModules(browser: NightwatchBrowser, callback: VoidFunction) {
.scrollAndClick('[data-id="pluginManagerComponentActivateButtonsolidityStaticAnalysis"]')
.scrollAndClick('[data-id="pluginManagerComponentActivateButtondebugger"]')
.scrollAndClick('[data-id="verticalIconsKindfilePanel"]')
.clickLaunchIcon('settings')

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • [ ]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • [ ]

.waitForElementVisible('*[data-id="topbar-settingsIcon"]')
.click('*[data-id="topbar-settingsIcon"]')
.click('*[data-id="settingsTabGenerateContractMetadataLabel"]')
.setValue('[data-id="settingsTabGistAccessToken"]', process.env.gist_token)
.click('[data-id="settingsTabSaveGistToken"]')
.click('[data-id="settingsTabThemeLabelFlatly"]') // e2e tests were initially developed with Flatly. Some tests are failing with the default one (Dark), because the dark theme put uppercase everywhere.
.waitForElementVisible('*[data-id="topbar-themeIcon-toggle"]')
.click('*[data-id="topbar-themeIcon-toggle"]')
.waitForElementVisible('*[data-id="topbar-themeIcon-light"]')
.click('*[data-id="topbar-themeIcon-light"]')
// .click('[data-id="settingsTabThemeLabelFlatly"]') // e2e tests were initially developed with Flatly. Some tests are failing with the default one (Dark), because the dark theme put uppercase everywhere.
.perform(() => { callback() })
}
8 changes: 4 additions & 4 deletions apps/remix-ide-e2e/src/tests/ballot.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ module.exports = {
'Compile with remappings set in remappings.txt file #group1': function (browser: NightwatchBrowser) {
browser
.clickLaunchIcon('filePanel')
.click('*[data-id="workspacesMenuDropdown"]')
.click('*[data-id="workspacesSelect"]')
.click('*[data-id="workspacecreate"]')
.waitForElementPresent('*[data-id="create-remixDefault"]')
.scrollAndClick('*[data-id="create-remixDefault"]')
Expand Down Expand Up @@ -169,7 +169,7 @@ module.exports = {
suppressNotFoundErrors: true,
timeout: 1000
})

.waitForElementVisible('*[data-id="scConfigFilePathInput"]', 10000)
.sendKeys('*[data-id="scConfigFilePathInput"]', 'cf.json')
.sendKeys('*[data-id="scConfigFilePathInput"]', browser.Keys.ENTER)
Expand Down Expand Up @@ -200,7 +200,7 @@ module.exports = {
suppressNotFoundErrors: true,
timeout: 1000
})

.waitForElementVisible('*[data-id="scConfigFilePathInput"]', 10000)
.sendKeys('*[data-id="scConfigFilePathInput"]', 'cf.json')
.sendKeys('*[data-id="scConfigFilePathInput"]', browser.Keys.ENTER)
Expand Down Expand Up @@ -233,7 +233,7 @@ module.exports = {
suppressNotFoundErrors: true,
timeout: 1000
})

.waitForElementVisible('*[data-id="scConfigFilePathInput"]', 10000)
.sendKeys('*[data-id="scConfigFilePathInput"]', 'cf.json')
.sendKeys('*[data-id="scConfigFilePathInput"]', browser.Keys.ENTER)
Expand Down
19 changes: 11 additions & 8 deletions apps/remix-ide-e2e/src/tests/circom.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ import init from '../helpers/init'
module.exports = {
'@disabled': true,
before: function (browser: NightwatchBrowser, done: VoidFunction) {
browser.globals.asyncHookTimeout = 30000000;
browser.globals.asyncHookTimeout = 30000000;
init(browser, done)
},

'Should create semaphore workspace template #group1 #group2 #group3 #group4': function (browser: NightwatchBrowser) {
browser
.clickLaunchIcon('filePanel')
.click('*[data-id="workspacesMenuDropdown"]')
.click('*[data-id="workspacesSelect"]')
.click('*[data-id="workspacecreate"]')
.waitForElementPresent('*[data-id="create-semaphore"]')
.scrollAndClick('*[data-id="create-semaphore"]')
Expand Down Expand Up @@ -41,7 +41,7 @@ module.exports = {
.waitForElementContainsText('*[data-id="terminalJournal"]', 'Everything went okay')
.waitForElementPresent('[data-id="treeViewLitreeViewItemcircuits/.bin/simple_js"]')
.openFile('circuits/.bin/simple_js')
.waitForElementPresent('[data-id="treeViewLitreeViewItemcircuits/.bin/simple_js/simple.wasm"]')
.waitForElementPresent('[data-id="treeViewLitreeViewItemcircuits/.bin/simple_js/simple.wasm"]')
},
'Should compute a witness for a simple circuit #group1': function (browser: NightwatchBrowser) {
browser
Expand Down Expand Up @@ -118,12 +118,15 @@ module.exports = {
.waitForElementPresent('[data-id="verticalIconsKindcircuit-compiler"]')
.waitForElementVisible('[data-id="verticalIconsKindcircuit-compiler"]')
.perform(function () {
const actions = this.actions({async: true})
const actions = this.actions({ async: true })

return actions.keyDown(this.Keys.CONTROL).sendKeys('s')
actions.keyDown(this.Keys.CONTROL).sendKeys('s').perform()
return actions.keyUp(this.Keys.CONTROL).perform()
})
.pause(2000)
.openFile('circuits/.bin/simple_js/simple.wasm')
.click('[data-id="treeViewDivtreeViewItemREADME.md"]')
.waitForElementVisible('*[data-id="treeViewDivtreeViewItemcircuits/.bin/simple_js"]')
.click('*[data-id="treeViewDivtreeViewItemcircuits/.bin/simple_js"]')
// .openFile('circuits/.bin/simple_js/simple.wasm')
.waitForElementPresent('[data-id="treeViewLitreeViewItemcircuits/.bin/simple_js/simple.wasm"]')
.waitForElementVisible('[data-id="treeViewLitreeViewItemcircuits/.bin/simple_js/simple.wasm"]')
},
Expand Down Expand Up @@ -178,7 +181,7 @@ module.exports = {
'Should create a new workspace using hash checker template #group5 #group6': function (browser: NightwatchBrowser) {
browser
.clickLaunchIcon('filePanel')
.click('*[data-id="workspacesMenuDropdown"]')
.click('*[data-id="workspacesSelect"]')
.click('*[data-id="workspacecreate"]')
.waitForElementPresent('*[data-id="create-hashchecker"]')
.scrollAndClick('*[data-id="create-hashchecker"]')
Expand Down
6 changes: 2 additions & 4 deletions apps/remix-ide-e2e/src/tests/compile_run_widget.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ module.exports = {
browser
.openFile('contracts/3_Ballot.sol')
.click('[data-id="compile-dropdown-trigger"]')
.waitForElementVisible('[data-id="compile-dropdown-panel"]', 5000)
.waitForElementVisible('[data-id="compile-dropdown-panel"]', 5000)
.click('[data-id="compile-run-analysis-menu-item"]')
.waitForElementVisible('[data-id="compile-run-analysis-menu-item-panel"]', 5000)
.click('[data-id="run-solidity-scan-submenu-item"]')
Expand All @@ -56,6 +56,4 @@ module.exports = {
.waitForElementContainsText('*[data-id="terminalJournal"]', 'Scan Summary:', 30000)
.verifyContracts(['Ballot'])
}


}
}
36 changes: 18 additions & 18 deletions apps/remix-ide-e2e/src/tests/contract_flattener.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ module.exports = {
init(browser, done)
},
'@sources': () => sources,
'Should flatten contract after creation': function (browser: NightwatchBrowser) {
'Should flatten contract after creation': function (browser: NightwatchBrowser) {
browser.addFile('TestContract.sol', sources[0]['TestContract.sol'])
.pause(10000)
.waitForElementVisible('*[data-id="treeViewLitreeViewItemTestContract.sol"]')
Expand All @@ -18,7 +18,7 @@ module.exports = {
.waitForElementVisible('*[data-id="treeViewLitreeViewItemTestContract_flattened.sol"]')
},
'Should not be able to flatten contract without imports': function (browser: NightwatchBrowser) {
browser.click('*[data-id="treeViewLitreeViewItemcontracts"]')
browser.waitForElementVisible('*[data-id="treeViewLitreeViewItemcontracts"]')
.waitForElementVisible('*[data-id="treeViewLitreeViewItemcontracts/3_Ballot.sol"]')
.pause(1000)
.click('*[data-id="treeViewLitreeViewItemcontracts/3_Ballot.sol"]')
Expand All @@ -43,53 +43,53 @@ const sources = [
content: `
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";

contract MyToken is ERC20, ERC20Burnable, ERC20Pausable, Ownable, ERC20Permit {
constructor(address initialOwner)
ERC20("MyToken", "MTK")
Ownable(initialOwner)
ERC20Permit("MyToken")
{}

function pause() public onlyOwner {
_pause();
}

function unpause() public onlyOwner {
_unpause();
}

function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}

// The following functions are overrides required by Solidity.

function _update(address from, address to, uint256 value)
internal
override(ERC20, ERC20Pausable)
{
super._update(from, to, value);
}
}

`
},
}
}
]

const content = `
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

/**
/**
* @title Ballot
* @dev Implements voting process along with vote delegation
*/
Expand All @@ -103,7 +103,7 @@ const content = `
}

struct Proposal {
// If you can limit the length to a certain number of bytes,
// If you can limit the length to a certain number of bytes,
// always use one of bytes1 to bytes32 because they are much cheaper
bytes32 name; // short name (up to 32 bytes)
uint voteCount; // number of accumulated votes
Expand All @@ -115,7 +115,7 @@ const content = `

Proposal[] public proposals;

/**
/**
* @dev Create a new ballot to choose one of 'proposalNames'.
* @param proposalNames names of proposals
*/
Expand All @@ -134,7 +134,7 @@ const content = `
}
}

/**
/**
* @dev Give 'voter' the right to vote on this ballot. May only be called by 'chairperson'.
* @param voter address of voter
*/
Expand Down Expand Up @@ -197,7 +197,7 @@ const content = `
proposals[proposal].voteCount += sender.weight;
}

/**
/**
* @dev Computes the winning proposal taking all previous votes into account.
* @return winningProposal_ index of winning proposal in the proposals array
*/
Expand All @@ -213,7 +213,7 @@ const content = `
}
}

/**
/**
* @dev Calls winningProposal() function to get the index of the winner contained in the proposals array and then
* @return winnerName_ the name of the winner
*/
Expand All @@ -223,4 +223,4 @@ const content = `
winnerName_ = proposals[winningProposal()].name;
}
}
`
`
2 changes: 1 addition & 1 deletion apps/remix-ide-e2e/src/tests/defaultLayout.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ module.exports = {
.waitForElementVisible('div[data-id="verticalIconsHomeIcon"]')
.waitForElementVisible('div[plugin="filePanel"]')
.waitForElementVisible('div[plugin="pluginManager"]')
.waitForElementVisible('div[plugin="settings"]')
.waitForElementVisible('*[data-id="topbar-settingsIcon"]')
},

'Loads Side Panel': function (browser: NightwatchBrowser) {
Expand Down
Loading