Unverified Commit 68d370f5 authored by yann300's avatar yann300 Committed by GitHub

Merge branch 'master' into updatepmluginAPI

parents 3c63421f 6672bde7
[![Build Status](https://travis-ci.org/ethereum/remix-ide.svg?branch=master)](https://travis-ci.org/ethereum/remix-ide) [![Build Status](https://travis-ci.org/ethereum/remix-ide.svg?branch=master)](https://travis-ci.org/ethereum/remix-ide)
[![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=MTc5WVBoNnhOTGhaUng3ZFI3MDZvNWkraHIrd1FNanZIZk80SG9uMkFIND0tLUoyUjd1YVhWRnRrcUJMMnFlbmN3Y0E9PQ==--4085377897aef217e507c8fc46d463eb699838b8)](https://www.browserstack.com/automate/public-build/MTc5WVBoNnhOTGhaUng3ZFI3MDZvNWkraHIrd1FNanZIZk80SG9uMkFIND0tLUoyUjd1YVhWRnRrcUJMMnFlbmN3Y0E9PQ==--4085377897aef217e507c8fc46d463eb699838b8)
# Remix # Remix
...@@ -32,8 +35,9 @@ Or if you want to clone the github repository (`wget` need to be installed first ...@@ -32,8 +35,9 @@ Or if you want to clone the github repository (`wget` need to be installed first
```bash ```bash
git clone https://github.com/ethereum/remix-ide.git git clone https://github.com/ethereum/remix-ide.git
cd remix-ide cd remix-ide
npm run setupremix # this will clone https://github.com/ethereum/remix for you and link it to remix-ide
npm install npm install
npm run build && npm run serve npm start
``` ```
## DEVELOPING: ## DEVELOPING:
...@@ -44,21 +48,6 @@ Then open your `text editor` and start developing. ...@@ -44,21 +48,6 @@ Then open your `text editor` and start developing.
The browser will automatically refresh when files are saved. The browser will automatically refresh when files are saved.
Most of the the time working with other modules (like debugger etc.) hosted in the [Remix repository](https://github.com/ethereum/remix) is not needed. Most of the the time working with other modules (like debugger etc.) hosted in the [Remix repository](https://github.com/ethereum/remix) is not needed.
But in case changes have to be made in that repository too, the following command will help you link Remix with your local remix-ide repository:
After `npm install` run also:
```bash
npm run pullremix
npm run linkremixcore
npm run linkremixlib
npm run linkremixsolidity
npm run linkremixdebugger
```
### Troubleshooting building ### Troubleshooting building
......
This document includes:
- how to make npm, github release of remix-* packages
- how to update remix.ethereum.org.
- how to update remix-alpha.ethereum.org.
# remix-* release (npm release, github release)
- For a specifix module (lib/core/debug/ide/solidity/tests)
- In a new branch, bump the version in package.json, push it and create PR.
- Wait for tests completion.
- merge PR
- build the branch ( `npm run build` for remix-ide ).
- execute `npm publish`.
- create new `tag` ( e.g `git tag v0.6.1-alpha.2` ).
- push the tag ( `git push --tag` ).
- execute `gren changelog --generate -t <new tag>..<previous tag> --data-source=prs`.
- in `changelog.md` remove the closed and non merged PR.
- publish a release in github using the changelog.
# remix.ethereum.org update
This is not strictly speaking a release. Updating the remix site is done through the Travis build:
- In remix-ide repository
- Switch to the branch `remix_live`
- Rebase the branch against master
- Force push
- https://travis-ci.org/ethereum/remix-ide
- Click `More options`
- Click `Trigger build`
- Select `remix_live`
- Click `Trigger custom build`
- Once the build is finished (can take a while) and successful, check remix.ethereum.org is updated accordingly
# remix-alpha.ethereum.org update
This is not strictly speaking a release. Updating the remix-alpha site is done through the Travis build:
- https://travis-ci.org/ethereum/remix-ide
- Click `More options`
- Click `Trigger build`
- Select `Master`
- Click `Trigger custom build`
- Once the build is finished (can take a while) and successful, check remix-alpha.ethereum.org is updated accordingly
...@@ -37,9 +37,8 @@ function RighthandPanel (appAPI = {}, events = {}, opts = {}) { ...@@ -37,9 +37,8 @@ function RighthandPanel (appAPI = {}, events = {}, opts = {}) {
</div> </div>
</div> </div>
` `
appAPI.switchTab = (tabClass) => { // selectTabByClassName
this.event.trigger('switchTab', [tabClass]) appAPI.switchTab = tabClass => self._view.tabbedMenu.selectTabByClassName(tabClass)
}
events.rhp = self.event events.rhp = self.event
......
...@@ -75,48 +75,47 @@ ...@@ -75,48 +75,47 @@
* See index.html and remix.js in test-browser folder for sample * See index.html and remix.js in test-browser folder for sample
* *
*/ */
class PluginManager { module.exports = class PluginManager {
constructor (api = {}, events = {}, opts = {}) { constructor (api = {}, events = {}, opts = {}) {
var self = this const self = this
this.plugins = {} self._opts = opts
this.inFocus self._api = api
var allowedapi = {'setConfig': 1, 'getConfig': 1, 'removeConfig': 1} self._events = events
events.compiler.register('compilationFinished', (success, data, source) => { self.plugins = {}
if (this.inFocus) { self.inFocus
self.allowedapi = {'setConfig': 1, 'getConfig': 1, 'removeConfig': 1}
self._events.compiler.register('compilationFinished', (success, data, source) => {
if (self.inFocus) {
// trigger to the current focus // trigger to the current focus
this.post(this.inFocus, JSON.stringify({ self.post(self.inFocus, JSON.stringify({
action: 'notification', action: 'notification',
key: 'compiler', key: 'compiler',
type: 'compilationFinished', type: 'compilationFinished',
value: [ value: [ success, data, source ]
success,
data,
source
]
})) }))
} }
}) })
events.app.register('tabChanged', (tabName) => { self._events.app.register('tabChanged', (tabName) => {
if (this.inFocus && this.inFocus !== tabName) { if (self.inFocus && self.inFocus !== tabName) {
// trigger unfocus // trigger unfocus
this.post(this.inFocus, JSON.stringify({ self.post(self.inFocus, JSON.stringify({
action: 'notification', action: 'notification',
key: 'app', key: 'app',
type: 'unfocus', type: 'unfocus',
value: [] value: []
})) }))
} }
if (this.plugins[tabName]) { if (self.plugins[tabName]) {
// trigger focus // trigger focus
this.post(tabName, JSON.stringify({ self.post(tabName, JSON.stringify({
action: 'notification', action: 'notification',
key: 'app', key: 'app',
type: 'focus', type: 'focus',
value: [] value: []
})) }))
this.inFocus = tabName self.inFocus = tabName
this.post(tabName, JSON.stringify({ self.post(tabName, JSON.stringify({
action: 'notification', action: 'notification',
key: 'compiler', key: 'compiler',
type: 'compilationData', type: 'compilationData',
...@@ -136,10 +135,10 @@ class PluginManager { ...@@ -136,10 +135,10 @@ class PluginManager {
value: [ result ] value: [ result ]
})) }))
} }
if (event.type === 'message' && this.inFocus && this.plugins[this.inFocus] && this.plugins[this.inFocus].origin === event.origin) { if (event.type === 'message' && self.inFocus && self.plugins[self.inFocus] && self.plugins[self.inFocus].origin === event.origin) {
var data = JSON.parse(event.data) var data = JSON.parse(event.data)
data.value.unshift(this.inFocus) data.value.unshift(self.inFocus)
if (allowedapi[data.type]) { if (self.allowedapi[data.type]) {
data.value.push((error, result) => { data.value.push((error, result) => {
response(data.key, data.type, data.id, error, result) response(data.key, data.type, data.id, error, result)
}) })
...@@ -149,13 +148,13 @@ class PluginManager { ...@@ -149,13 +148,13 @@ class PluginManager {
}, false) }, false)
} }
register (desc, content) { register (desc, content) {
this.plugins[desc.title] = {content, origin: desc.url} const self = this
self.plugins[desc.title] = {content, origin: desc.url}
} }
post (name, value) { post (name, value) {
if (this.plugins[name]) { const self = this
this.plugins[name].content.querySelector('iframe').contentWindow.postMessage(value, this.plugins[name].origin) if (self.plugins[name]) {
self.plugins[name].content.querySelector('iframe').contentWindow.postMessage(value, self.plugins[name].origin)
} }
} }
} }
module.exports = PluginManager
var yo = require('yo-yo') var yo = require('yo-yo')
var css = require('./styles/analysis-tab-styles') var csjs = require('csjs-inject')
var remixLib = require('remix-lib')
function analysisTab (api = {}, events = {}, opts = {}) { var EventManager = remixLib.EventManager
var el = yo`
<div class="${css.analysisTabView} "id="staticanalysisView">
</div>
`
return { render () { return el } }
}
module.exports = analysisTab module.exports = class AnalysisTab {
constructor (opts = { api: {}, events: {} }) {
const self = this
self.event = new EventManager()
self._api = opts.api
self._events = opts.events
self._view = { el: null }
self.data = {}
self._components = {}
}
render () {
const self = this
if (self._view.el) return self._view.el
self._view.el = yo`
<div class="${css.analysisTabView} "id="staticanalysisView"></div>`
return self._view.el
}
}
const css = csjs`
.analysisTabView {
padding: 2%;
padding-bottom: 3em;
display: flex;
flex-direction: column;
}
`
var yo = require('yo-yo') var yo = require('yo-yo')
var css = require('./styles/plugin-tab-styles') var csjs = require('csjs-inject')
var remixLib = require('remix-lib')
function plugintab (api = {}, events = {}, opts = {}) { var EventManager = remixLib.EventManager
var el = yo`
<div class="${css.pluginTabView}" id="pluginView">
<iframe class="${css.iframe}" src="${opts.url}/index.html"></iframe>
</div>`
return { render () { return el } }
}
module.exports = plugintab module.exports = class plugintab {
constructor (api = {}, events = {}, opts = {}) {
const self = this
self.event = new EventManager()
self._opts = opts
self._api = api
self._events = events
self._view = { el: null }
self._components = {}
}
render () {
const self = this
if (self._view.el) return self._view.el
self._view.el = yo`
<div class="${css.pluginTabView}" id="pluginView">
<iframe class="${css.iframe}" src="${self._opts.url}/index.html"></iframe>
</div>`
return self._view.el
}
}
const css = csjs`
.pluginTabView {
height: 100%;
width: 100%;
}
.iframe {
height: 100%;
width: 100%;
border: 0;
}
`
...@@ -65,7 +65,7 @@ function runTab (appAPI = {}, appEvents = {}, opts = {}) { ...@@ -65,7 +65,7 @@ function runTab (appAPI = {}, appEvents = {}, opts = {}) {
function setFinalContext () { function setFinalContext () {
// set the final context. Cause it is possible that this is not the one we've originaly selected // set the final context. Cause it is possible that this is not the one we've originaly selected
selectExEnv.value = executionContext.getProvider() selectExEnv.value = executionContext.getProvider()
fillAccountsList(appAPI, el) fillAccountsList(appAPI, opts, el)
event.trigger('clearInstance', []) event.trigger('clearInstance', [])
} }
......
// -------------- styling ----------------------
var csjs = require('csjs-inject')
var styleGuide = require('../../ui/styles-guide/theme-chooser')
var styles = styleGuide.chooser()
var css = csjs`
.analysisTabView {
padding: 2%;
padding-bottom: 3em;
display: flex;
flex-direction: column;
}
#staticanalysisView {
display: block;
}
.infoBox {
${styles.infoTextBox}
margin-bottom: 1em;
}
.textBox {
${styles.textBoxL}
margin-bottom: 1em;
}
`
module.exports = css
var csjs = require('csjs-inject')
var css = csjs`
.pluginTabView {
height: 100%;
width: 100%;
}
.iframe {
height: 100%;
width: 100%;
border: 0;
}
`
module.exports = css
var csjs = require('csjs-inject')
var styleGuide = require('../../ui/styles-guide/theme-chooser')
var styles = styleGuide.chooser()
var css = csjs`
li.active {
background-color: ${styles.rightPanel.backgroundColor_Tab};
color: ${styles.appProperties.mainText_Color}
}
.options {
float: left;
padding-top: 0.7em;
min-width: 60px;
font-size: 0.9em;
cursor: pointer;
font-size: 1em;
text-align: center;
}
.opts {
display: flex;
list-style: none;
margin: 0;
padding: 0;
}
.opts_li {
display: block;
font-weight: bold;
color: ${styles.rightPanel.text_Teriary}
}
.opts_li.active {
color: ${styles.rightPanel.text_Primary}
}
.opts_li:hover {
color: ${styles.rightPanel.icon_HoverColor_TogglePanel}
}
`
module.exports = css
var yo = require('yo-yo') var yo = require('yo-yo')
var csjs = require('csjs-inject')
var remixLib = require('remix-lib')
var helper = require('../../lib/helper') var helper = require('../../lib/helper')
var styles = require('../ui/styles-guide/theme-chooser').chooser()
var css = require('./styles/tabbed-menu-styles') var EventManager = remixLib.EventManager
class TabbedMenu { module.exports = class TabbedMenu {
constructor (api = {}, events = {}, opts = {}) { constructor (api = {}, events = {}, opts = {}) {
var self = this const self = this
var tabView = document.createElement('ul') self.event = new EventManager()
this.tabView = tabView self._opts = opts
this.events = events self._api = api
this.tabs = {} self._events = events
this.contents = {} self._view = { el: null, viewport: null, tabs: {}, contents: {} }
events.app.register('debuggingRequested', () => { events.app.register('debuggingRequested', () => {
self.selectTab(tabView.querySelector('li.debugView')) self.selectTabByTitle('Debugger')
})
events.rhp.register('switchTab', tabName => {
self.selectTab(tabView.querySelector(`li.${tabName}`))
}) })
} }
render () { return this.tabView } render () {
const self = this
if (self._view.el) return self._view.el
self._view.el = yo`<ul class=${css.menu}>${Object.values(self._view.tabs)}</ul>`
return self._view.el
}
renderViewport () {
const self = this
if (self._view.viewport) return self._view.viewport
self._view.viewport = yo`
<div id="optionViews" class=${css.optionViews}>
${Object.values(self._view.contents)}
</div>`
return self._view.viewport
}
addTab (title, cssClass, content) {
const self = this
if (helper.checkSpecialChars(title)) return
if (self._view.contents[title] || self._view.tabs[title]) throw new Error('tab already exists')
self._view.contents[title] = content
self._view.tabs[title] = yo`<li class="${css.options} ${cssClass}" onclick=${function (ev) { self.selectTab(this) }} title=${title}>${title}</li>`
if (self._view.el) self._view.el.appendChild(self._view.tabs[title])
if (self._view.viewport) self._view.viewport.appendChild(self._view.contents[title])
}
selectTabByTitle (title) { selectTabByTitle (title) {
this.selectTab(this.tabs[title]) const self = this
self.selectTab(self._view.tabs[title])
}
selectTabByClassName (tabClass) {
const self = this
self.selectTab(self._view.el.querySelector(`li.${tabClass}`))
} }
selectTab (el) { selectTab (el) {
const self = this
if (!el.classList.contains(css.active)) { if (!el.classList.contains(css.active)) {
var nodes = el.parentNode.querySelectorAll('li') var nodes = Object.values(self._view.tabs)
for (var i = 0; i < nodes.length; ++i) { for (var i = 0; i < nodes.length; ++i) {
nodes[i].classList.remove(css.active) nodes[i].classList.remove(css.active)
this.contents[nodes[i].getAttribute('title')].style.display = 'none' self._view.contents[nodes[i].getAttribute('title')].style.display = 'none'
} }
} }
var title = el.getAttribute('title') var title = el.getAttribute('title')
this.contents[el.getAttribute('title')].style.display = 'block' self._view.contents[el.getAttribute('title')].style.display = 'block'
el.classList.add(css.active) el.classList.add(css.active)
this.events.app.trigger('tabChanged', [title]) self._events.app.trigger('tabChanged', [title])
}
addTab (title, cssClass, content) {
var self = this
if (!helper.checkSpecialChars(title)) {
this.contents[title] = content
this.tabs[title] = yo`<li class="${css.opts_li} ${css.options} ${cssClass}" onclick=${function (ev) { self.selectTab(this) }} title=${title}>${title}</li>`
this.tabView.appendChild(this.tabs[title])
}
} }
} }
module.exports = TabbedMenu const css = csjs`
li.active {
background-color: ${styles.rightPanel.backgroundColor_Tab};
color: ${styles.appProperties.mainText_Color}
}
.options {
float: left;
padding-top: 0.7em;
min-width: 60px;
font-size: 0.9em;
cursor: pointer;
font-size: 1em;
text-align: center;
}
.opts {
display: flex;
list-style: none;
margin: 0;
padding: 0;
}
.opts_li {
display: block;
font-weight: bold;
color: ${styles.rightPanel.text_Teriary}
}
.opts_li.active {
color: ${styles.rightPanel.text_Primary}
}
.opts_li:hover {
color: ${styles.rightPanel.icon_HoverColor_TogglePanel}
}
`
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment