Unverified Commit e5469454 authored by Levi Barnes's avatar Levi Barnes Committed by GitHub

Merge pull request #1 from ethereum/master

Sync with main repo
parents d4d91b8b bab2fb1e
'use strict' 'use strict'
var $ = require('jquery')
var csjs = require('csjs-inject') var csjs = require('csjs-inject')
var yo = require('yo-yo') var yo = require('yo-yo')
var async = require('async') var async = require('async')
...@@ -423,14 +424,53 @@ Please make a backup of your contracts and start using http://remix.ethereum.org ...@@ -423,14 +424,53 @@ Please make a backup of your contracts and start using http://remix.ethereum.org
let compileTab = new CompileTab(self._components.registry) let compileTab = new CompileTab(self._components.registry)
let tabs = { let tabs = {
compile: compileTab, compile: compileTab,
run: new RunTab(self._components.registry), run: new RunTab(
registry.get('udapp').api,
registry.get('udappUI').api,
registry.get('config').api,
registry.get('filemanager').api,
registry.get('editor').api,
registry.get('logCallback').api,
registry.get('filepanel').api,
registry.get('pluginmanager').api,
registry.get('compilersartefacts').api
),
settings: new SettingsTab(self._components.registry), settings: new SettingsTab(self._components.registry),
analysis: new AnalysisTab(self._components.registry), analysis: new AnalysisTab(registry),
debug: new DebuggerTab(self._components.registry), debug: new DebuggerTab(),
support: new SupportTab(self._components.registry), support: new SupportTab(),
test: new TestTab(self._components.registry, compileTab) test: new TestTab(self._components.registry, compileTab)
} }
registry.get('app').api.event.register('tabChanged', (tabName) => {
if (tabName === 'Support') tabs.support.loadTab()
})
let transactionContextAPI = {
getAddress: (cb) => {
cb(null, $('#txorigin').val())
},
getValue: (cb) => {
try {
var number = document.querySelector('#value').value
var select = document.getElementById('unit')
var index = select.selectedIndex
var selectedUnit = select.querySelectorAll('option')[index].dataset.unit
var unit = 'ether' // default
if (['ether', 'finney', 'gwei', 'wei'].indexOf(selectedUnit) >= 0) {
unit = selectedUnit
}
cb(null, executionContext.web3().toWei(number, unit))
} catch (e) {
cb(e)
}
},
getGasLimit: (cb) => {
cb(null, $('#gasLimit').val())
}
}
udapp.resetAPI(transactionContextAPI)
// ---------------- Righthand-panel -------------------- // ---------------- Righthand-panel --------------------
self._components.righthandpanel = new RighthandPanel({ tabs, pluginManager }) self._components.righthandpanel = new RighthandPanel({ tabs, pluginManager })
self._view.rightpanel.appendChild(self._components.righthandpanel.render()) self._view.rightpanel.appendChild(self._components.righthandpanel.render())
......
'use strict' 'use strict'
var solcTranslate = require('solc/translate')
var remixLib = require('remix-lib') var remixLib = require('remix-lib')
var txHelper = remixLib.execution.txHelper var txHelper = remixLib.execution.txHelper
...@@ -42,7 +43,7 @@ var getDetails = function (contractName, contract, source) { ...@@ -42,7 +43,7 @@ var getDetails = function (contractName, contract, source) {
} }
if (source && contract.assembly !== null) { if (source && contract.assembly !== null) {
detail['Assembly'] = formatAssemblyText(contract.evm.legacyAssembly, '', source.content) detail['Assembly'] = solcTranslate.prettyPrintLegacyAssemblyJSON(contract.evm.legacyAssembly, source.content)
} }
return detail return detail
...@@ -58,36 +59,6 @@ var retrieveMetadataHash = function (bytecode) { ...@@ -58,36 +59,6 @@ var retrieveMetadataHash = function (bytecode) {
} }
} }
var formatAssemblyText = function (asm, prefix, source) {
if (typeof asm === typeof '' || asm === null || asm === undefined) {
return prefix + asm + '\n'
}
var text = prefix + '.code\n'
asm['.code'].forEach(function (item, _i) {
var v = item.value === undefined ? '' : item.value
var src = ''
if (item.begin !== undefined && item.end !== undefined) {
src = source.slice(item.begin, item.end).replace('\n', '\\n', 'g')
}
if (src.length > 30) {
src = src.slice(0, 30) + '...'
}
if (item.name !== 'tag') {
text += ' '
}
text += prefix + item.name + ' ' + v + '\t\t\t' + src + '\n'
})
text += prefix + '.data\n'
let asmData = (asm['.data'] || [])
for (let i in asmData) {
let item = asmData[i]
text += ' ' + prefix + '' + i + ':\n'
text += formatAssemblyText(item, prefix + ' ', source)
}
return text
}
var gethDeploy = function (contractName, jsonInterface, bytecode) { var gethDeploy = function (contractName, jsonInterface, bytecode) {
var code = '' var code = ''
var funABI = txHelper.getConstructorInterface(jsonInterface) var funABI = txHelper.getConstructorInterface(jsonInterface)
......
...@@ -50,7 +50,7 @@ staticAnalysisView.prototype.render = function () { ...@@ -50,7 +50,7 @@ staticAnalysisView.prototype.render = function () {
${this.modulesView} ${this.modulesView}
</div> </div>
<div class="${css.buttons}"> <div class="${css.buttons}">
<button class=${css.buttonRun} onclick=${function () { self.run() }} >Run</button> <button class="${css.buttonRun}" onclick="${function () { self.run() }}" >Run</button>
<label class="${css.label}" for="autorunstaticanalysis"> <label class="${css.label}" for="autorunstaticanalysis">
<input id="autorunstaticanalysis" <input id="autorunstaticanalysis"
type="checkbox" type="checkbox"
...@@ -59,8 +59,8 @@ staticAnalysisView.prototype.render = function () { ...@@ -59,8 +59,8 @@ staticAnalysisView.prototype.render = function () {
> >
Auto run Auto run
</label> </label>
<label class="${css.label}" for="checkallstaticanalysis"> <label class="${css.label}" for="checkAllEntries">
<input id="checkallstaticanalysis" <input id="checkAllEntries"
type="checkbox" type="checkbox"
onclick="${function (event) { self.checkAll(event) }}" onclick="${function (event) { self.checkAll(event) }}"
style="vertical-align:bottom" style="vertical-align:bottom"
...@@ -135,29 +135,23 @@ staticAnalysisView.prototype.run = function () { ...@@ -135,29 +135,23 @@ staticAnalysisView.prototype.run = function () {
} }
} }
staticAnalysisView.prototype.checkAll = function (event) { staticAnalysisView.prototype.checkModule = function (event) {
if (!this.view) { let selected = this.view.querySelectorAll('[name="staticanalysismodule"]:checked')
return let checkAll = this.view.querySelector('[id="checkAllEntries"]')
} if (event.target.checked) {
var all = this.view.querySelectorAll('[name="staticanalysismodule"]') checkAll.checked = true
var isAnySelected = false } else if (!selected.length) {
for (var i = 0; i < all.length; i++) { checkAll.checked = false
if (all[i].checked === true) {
isAnySelected = true
break
}
}
for (var j = 0; j < all.length; j++) {
all[j].checked = !isAnySelected
} }
event.target.checked = !isAnySelected
} }
staticAnalysisView.prototype.checkModule = function (event) { staticAnalysisView.prototype.checkAll = function (event) {
var selectAll = this.view.querySelector('[id="checkallstaticanalysis" ]') if (!this.view) {
if (event.target.checked) { return
selectAll.checked = true
} }
// checks/unchecks all
var checkBoxes = this.view.querySelectorAll('[name="staticanalysismodule"]')
checkBoxes.forEach((checkbox) => { checkbox.checked = event.target.checked })
} }
staticAnalysisView.prototype.renderModules = function () { staticAnalysisView.prototype.renderModules = function () {
...@@ -170,6 +164,7 @@ staticAnalysisView.prototype.renderModules = function () { ...@@ -170,6 +164,7 @@ staticAnalysisView.prototype.renderModules = function () {
<label class="${css.label}"> <label class="${css.label}">
<input id="staticanalysismodule_${categoryId}_${i}" <input id="staticanalysismodule_${categoryId}_${i}"
type="checkbox" type="checkbox"
class="staticAnalysisItem"
name="staticanalysismodule" name="staticanalysismodule"
index=${item._index} index=${item._index}
checked="true" checked="true"
......
var yo = require('yo-yo') var yo = require('yo-yo')
var csjs = require('csjs-inject')
var StaticAnalysis = require('../staticanalysis/staticAnalysisView') var StaticAnalysis = require('../staticanalysis/staticAnalysisView')
var globalRegistry = require('../../global/registry')
var EventManager = require('../../lib/events') var EventManager = require('../../lib/events')
var css = require('./styles/analysis-tab-styles')
class AnalysisTab {
module.exports = class AnalysisTab { constructor (registry) {
constructor (localRegistry) { this.event = new EventManager()
const self = this this.registry = registry
self.event = new EventManager()
self._view = { el: null }
self.data = {}
self._components = {}
self._components.registry = localRegistry || globalRegistry
self._deps = {}
} }
render () { render () {
const self = this
var staticanalysis = new StaticAnalysis() var staticanalysis = new StaticAnalysis()
staticanalysis.event.register('staticAnaysisWarning', (count) => { this.registry.put({api: staticanalysis, name: 'staticanalysis'})
if (count > 0) {
const msg = `Static Analysis raised ${count} warning(s) that requires your attention. Check Solidity Static Analysis Module for more information.`
const settings = { type: 'staticAnalysisWarning', useSpan: true }
self.event.trigger('newStaticAnaysisWarningMessage', [msg, settings])
}
})
self._components.registry.put({api: staticanalysis, name: 'staticanalysis'})
if (self._view.el) return self._view.el
self._view.el = yo`
<div class="${css.analysisTabView} "id="staticanalysisView">${staticanalysis.render()}</div>`
return self._view.el if (this.el) return this.el
this.el = yo`<div class="${css.analysisTabView} "id="staticanalysisView">${staticanalysis.render()}</div>`
return this.el
} }
} }
const css = csjs`
.analysisTabView { module.exports = AnalysisTab
padding: 2%;
padding-bottom: 3em;
display: flex;
flex-direction: column;
}
`
var yo = require('yo-yo') var yo = require('yo-yo')
var csjs = require('csjs-inject') var css = require('./styles/debugger-tab-styles')
var DebuggerUI = require('../debugger/debuggerUI') var DebuggerUI = require('../debugger/debuggerUI')
var globalRegistry = require('../../global/registry')
var EventManager = require('../../lib/events')
var styles = require('../ui/styles-guide/theme-chooser').chooser()
const css = csjs`
.debuggerTabView {
padding: 2%;
}
.debugger {
margin-bottom: 1%;
${styles.rightPanel.debuggerTab.box_Debugger}
}
`
class DebuggerTab { class DebuggerTab {
constructor (localRegistry) { constructor () {
const self = this this.el = null
self.event = new EventManager()
self._view = { el: null }
self.data = {}
self._components = {}
self._components.registry = localRegistry || globalRegistry
} }
render () { render () {
const self = this if (this.el) return this.el
if (self._view.el) return self._view.el
self._view.el = yo` this.el = yo`
<div class="${css.debuggerTabView}" id="debugView"> <div class="${css.debuggerTabView}" id="debugView">
<div id="debugger" class="${css.debugger}"></div> <div id="debugger" class="${css.debugger}"></div>
</div>` </div>`
this.debuggerUI = new DebuggerUI(self._view.el.querySelector('#debugger')) this.debuggerUI = new DebuggerUI(this.el.querySelector('#debugger'))
// self._view.transactionDebugger = this.debuggerUI.view() return this.el
return self._view.el
} }
debugger () { debugger () {
// return this._view.transactionDebugger
return this.debuggerUI return this.debuggerUI
} }
} }
......
var yo = require('yo-yo') var yo = require('yo-yo')
var csjs = require('csjs-inject') var css = require('./styles/plugin-tab-styles')
var globalRegistry = require('../../global/registry') class PluginTab {
var EventManager = require('../../lib/events')
module.exports = class plugintab { constructor (json) {
constructor (json, localRegistry) { this.el = null
const self = this this.data = { json }
self.event = new EventManager()
self._view = { el: null }
self.data = { json }
self._components = {}
self._components.registry = localRegistry || globalRegistry
} }
render () { render () {
const self = this if (this.el) return this.el
if (self._view.el) return self._view.el
self._view.el = yo` this.el = yo`
<div class="${css.pluginTabView}" id="pluginView"> <div class="${css.pluginTabView}" id="pluginView">
<iframe class="${css.iframe}" src="${self.data.json.url}/index.html"></iframe> <iframe class="${css.iframe}" src="${this.data.json.url}/index.html"></iframe>
</div>` </div>`
return self._view.el
return this.el
} }
} }
const css = csjs`
.pluginTabView { module.exports = PluginTab
height: 100%;
width: 100%;
}
.iframe {
height: 100%;
width: 100%;
border: 0;
}
`
This diff is collapsed.
...@@ -9,10 +9,9 @@ var CompilerAbstract = require('../../../compiler/compiler-abstract') ...@@ -9,10 +9,9 @@ var CompilerAbstract = require('../../../compiler/compiler-abstract')
var EventManager = remixLib.EventManager var EventManager = remixLib.EventManager
class DropdownLogic { class DropdownLogic {
constructor (fileManager, pluginManager, compilersArtefacts, compiler, config, editor, udapp, filePanel) { constructor (fileManager, pluginManager, compilersArtefacts, config, editor, udapp, filePanel) {
this.pluginManager = pluginManager this.pluginManager = pluginManager
this.compilersArtefacts = compilersArtefacts this.compilersArtefacts = compilersArtefacts
this.compiler = compiler
this.config = config this.config = config
this.editor = editor this.editor = editor
this.udapp = udapp this.udapp = udapp
...@@ -27,6 +26,7 @@ class DropdownLogic { ...@@ -27,6 +26,7 @@ class DropdownLogic {
}) })
} }
// TODO: can be moved up; the event in contractDropdown will have to refactored a method instead
listenToCompilationEvents () { listenToCompilationEvents () {
this.pluginManager.event.register('sendCompilationResult', (file, source, languageVersion, data) => { this.pluginManager.event.register('sendCompilationResult', (file, source, languageVersion, data) => {
// TODO check whether the tab is configured // TODO check whether the tab is configured
......
...@@ -80,6 +80,13 @@ class Recorder { ...@@ -80,6 +80,13 @@ class Recorder {
this.data._createdContracts[address] = timestamp this.data._createdContracts[address] = timestamp
this.data._createdContractsReverse[timestamp] = address this.data._createdContractsReverse[timestamp] = address
}) })
executionContext.event.register('contextChanged', this.clearAll.bind(this))
this.event.register('newTxRecorded', (count) => {
this.event.trigger('recorderCountChange', [count])
})
this.event.register('cleared', () => {
this.event.trigger('recorderCountChange', [0])
})
} }
/** /**
......
var yo = require('yo-yo') var yo = require('yo-yo')
var remixLib = require('remix-lib')
var EventManager = remixLib.EventManager
var csjs = require('csjs-inject') var csjs = require('csjs-inject')
var css = require('../styles/run-tab-styles') var css = require('../styles/run-tab-styles')
...@@ -8,10 +10,10 @@ var confirmDialog = require('../../execution/confirmDialog') ...@@ -8,10 +10,10 @@ var confirmDialog = require('../../execution/confirmDialog')
class RecorderUI { class RecorderUI {
constructor (recorder, parentSelf) { constructor (recorder, logCallBack) {
this.recorder = recorder this.recorder = recorder
this.parentSelf = parentSelf this.logCallBack = logCallBack
this.logCallBack = this.parentSelf._deps.logCallback this.event = new EventManager()
} }
render () { render () {
...@@ -67,10 +69,7 @@ class RecorderUI { ...@@ -67,10 +69,7 @@ class RecorderUI {
return modalDialogCustom.alert(error) return modalDialogCustom.alert(error)
} }
var noInstancesText = this.parentSelf._view.noInstancesText this.event.trigger('newScenario', [abi, address, contractName])
if (noInstancesText.parentNode) { noInstancesText.parentNode.removeChild(noInstancesText) }
this.parentSelf._view.instanceContainer.appendChild(this.parentSelf._deps.udappUI.renderInstanceFromABI(abi, address, contractName))
}) })
} }
......
var csjs = require('csjs-inject')
const css = csjs`
.analysisTabView {
padding: 2%;
padding-bottom: 3em;
display: flex;
flex-direction: column;
}
`
module.exports = css
var csjs = require('csjs-inject')
var styles = require('../../ui/styles-guide/theme-chooser').chooser()
const css = csjs`
.debuggerTabView {
padding: 2%;
}
.debugger {
margin-bottom: 1%;
${styles.rightPanel.debuggerTab.box_Debugger}
}
`
module.exports = css
var csjs = require('csjs-inject')
const css = csjs`
.pluginTabView {
height: 100%;
width: 100%;
}
.iframe {
height: 100%;
width: 100%;
border: 0;
}
`
module.exports = css
const csjs = require('csjs-inject')
const styles = require('../../ui/styles-guide/theme-chooser').chooser()
const css = csjs`
.supportTabView {
height: 100%;
padding: 2%;
padding-bottom: 3em;
display: flex;
flex-direction: column;
overflow: hidden;
overflow-y: auto;
}
.chat {
${styles.rightPanel.supportTab.box_IframeContainer}
display: flex;
flex-direction: column;
align-items: center;
height: 85%;
padding: 0;
}
.chatTitle {
height: 40px;
width: 90%;
display: flex;
align-items: center;
justify-content: center;
margin-top: 15px;
}
.chatTitle:hover {
cursor: pointer;
}
.icon {
height: 70%;
margin-right: 2%;
}
.chatTitleText {
font-size: 17px;
font-weight: bold;
}
.chatTitleText {
opacity: 0.8;
}
.chatIframe {
width: 100%;
height: 100%;
transform: scale(0.9);
padding: 0;
border: none;
}
.infoBox {
${styles.rightPanel.supportTab.box_SupportInfo}
}
.remixdinstallation {
padding: 3px;
border-radius: 2px;
margin-left: 5px;
}
.info {
${styles.rightPanel.settingsTab.box_SolidityVersionInfo};
margin-top: 1em;
word-break: break-word;
}
.title {
font-size: 1.1em;
font-weight: bold;
margin-bottom: 1em;
}
.crow {
display: flex;
overflow: auto;
clear: both;
padding: .2em;
}
.crow label {
cursor:pointer;
}
.crowNoFlex {
overflow: auto;
clear: both;
}
`
module.exports = css
const csjs = require('csjs-inject')
const styles = require('../../ui/styles-guide/theme-chooser').chooser()
const css = csjs`
.menu {
display: flex;
background-color: ${styles.rightPanel.BackgroundColor_Pre};
list-style: none;
margin: 0;
padding: 0;
}
.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;
}
.optionViews {
background-color: ${styles.rightPanel.backgroundColor_Tab};
overflow: scroll;
height: 100%;
}
.optionViews > div {
display: none;
}
.optionViews .pre {
word-wrap: break-word;
background-color: ${styles.rightPanel.BackgroundColor_Pre};
border-radius: 3px;
display: inline-block;
padding: 0 0.6em;
}
`
module.exports = css
...@@ -45,6 +45,8 @@ var css = csjs` ...@@ -45,6 +45,8 @@ var css = csjs`
.buttons { .buttons {
${styles.rightPanel.testTab.box_listTests}; ${styles.rightPanel.testTab.box_listTests};
margin: 2%; margin: 2%;
display: flex;
align-items: center;
} }
.runButton { .runButton {
${styles.rightPanel.testTab.button_runTests}; ${styles.rightPanel.testTab.button_runTests};
...@@ -58,6 +60,9 @@ var css = csjs` ...@@ -58,6 +60,9 @@ var css = csjs`
font-weight: bold; font-weight: bold;
margin-bottom: 1em; margin-bottom: 1em;
} }
.label {
display: flex;
align-items: center;
}
` `
module.exports = css module.exports = css
const yo = require('yo-yo') const yo = require('yo-yo')
const csjs = require('csjs-inject') var css = require('./styles/support-tab-styles')
var globalRegistry = require('../../global/registry') class SupportTab {
const styles = require('../ui/styles-guide/theme-chooser').chooser()
var EventManager = require('../../lib/events')
module.exports = class SupportTab {
constructor (localRegistry) { constructor (localRegistry) {
const self = this this.el = null
self.event = new EventManager() this.gitterIframe = ''
self._view = { el: null, gitterIframe: '', config: {} } this.gitterIsLoaded = false
self.data = { gitterIsLoaded: false }
self._components = {}
self._components.registry = localRegistry || globalRegistry
self._deps = {
app: self._components.registry.get('app').api
} }
self._deps.app.event.register('tabChanged', (tabName) => { loadTab () {
if (tabName !== 'Support' || self.data.gitterIsLoaded) return if (this.gitterIsLoaded) return
const iframe = yo`<iframe class="${css.chatIframe}" src='https://gitter.im/ethereum/remix/~embed'>` const iframe = yo`<iframe class="${css.chatIframe}" src='https://gitter.im/ethereum/remix/~embed'>`
self._view.gitterIframe.parentNode.replaceChild(iframe, self._view.gitterIframe) this.gitterIframe.parentNode.replaceChild(iframe, this.gitterIframe)
self._view.gitterIframe = iframe this.gitterIframe = iframe
self._view.el.style.display = 'block' this.el.style.display = 'block'
self.data.gitterIsLoaded = true this.gitterIsLoaded = true
})
} }
render () { render () {
const self = this if (this.el) return this.el
if (self._view.el) return self._view.el
self._view.gitterIframe = yo`<div></div>` this.gitterIframe = yo`<div></div>`
self._view.config.remixd = yo`
const remixd = yo`
<div class="${css.info}"> <div class="${css.info}">
<div class=${css.title}>Accessing local files</div> <div class=${css.title}>Accessing local files</div>
<div class="${css.crow}"> <div class="${css.crow}">
...@@ -44,7 +36,8 @@ module.exports = class SupportTab { ...@@ -44,7 +36,8 @@ module.exports = class SupportTab {
<div class="${css.crow}"><a target="_blank" href="https://remix.readthedocs.io/en/latest/tutorial_remixd_filesystem">http://remix.readthedocs.io/en/latest/tutorial_remixd_filesystem.html</a></div> <div class="${css.crow}"><a target="_blank" href="https://remix.readthedocs.io/en/latest/tutorial_remixd_filesystem">http://remix.readthedocs.io/en/latest/tutorial_remixd_filesystem.html</a></div>
<div class="${css.crow}">Installation: <pre class=${css.remixdinstallation}>npm install remixd -g</pre></div> <div class="${css.crow}">Installation: <pre class=${css.remixdinstallation}>npm install remixd -g</pre></div>
</div>` </div>`
self._view.config.localremixd = yo`
const localremixd = yo`
<div class="${css.info}"> <div class="${css.info}">
<div class=${css.title}>Running Remix locally</div> <div class=${css.title}>Running Remix locally</div>
<div class="${css.crow}"> <div class="${css.crow}">
...@@ -57,7 +50,8 @@ module.exports = class SupportTab { ...@@ -57,7 +50,8 @@ module.exports = class SupportTab {
</div> </div>
<a target="_blank" href="https://github.com/horizon-games/remix-app">https://github.com/horizon-games/remix-app</a> <a target="_blank" href="https://github.com/horizon-games/remix-app">https://github.com/horizon-games/remix-app</a>
</div>` </div>`
self._view.el = yo`
this.el = yo`
<div class="${css.supportTabView}" id="supportView"> <div class="${css.supportTabView}" id="supportView">
<div class="${css.infoBox}"> <div class="${css.infoBox}">
Have a question, found a bug or want to propose a feature? Have a look at the Have a question, found a bug or want to propose a feature? Have a look at the
...@@ -66,95 +60,18 @@ module.exports = class SupportTab { ...@@ -66,95 +60,18 @@ module.exports = class SupportTab {
<a target="_blank" href='https://solidity.readthedocs.io/en/latest/'> Solidity</a>. <a target="_blank" href='https://solidity.readthedocs.io/en/latest/'> Solidity</a>.
</div> </div>
<div class="${css.chat}"> <div class="${css.chat}">
<div class="${css.chatTitle}" onclick=${openLink} title='Click to open chat in Gitter'> <div class="${css.chatTitle}" onclick=${() => { window.open('https://gitter.im/ethereum/remix') }} title='Click to open chat in Gitter'>
<div class="${css.chatTitleText}">ethereum/remix community chat</div> <div class="${css.chatTitleText}">ethereum/remix community chat</div>
</div> </div>
${self._view.gitterIframe} ${this.gitterIframe}
</div> </div>
${self._view.config.remixd} ${remixd}
${self._view.config.localremixd} ${localremixd}
</div>` </div>`
return self._view.el
function openLink () { window.open('https://gitter.im/ethereum/remix') } return this.el
} }
} }
const css = csjs` module.exports = SupportTab
.supportTabView {
height: 100%;
padding: 2%;
padding-bottom: 3em;
display: flex;
flex-direction: column;
overflow: hidden;
overflow-y: auto;
}
.chat {
${styles.rightPanel.supportTab.box_IframeContainer}
display: flex;
flex-direction: column;
align-items: center;
height: 85%;
padding: 0;
}
.chatTitle {
height: 40px;
width: 90%;
display: flex;
align-items: center;
justify-content: center;
margin-top: 15px;
}
.chatTitle:hover {
cursor: pointer;
}
.icon {
height: 70%;
margin-right: 2%;
}
.chatTitleText {
font-size: 17px;
font-weight: bold;
}
.chatTitleText {
opacity: 0.8;
}
.chatIframe {
width: 100%;
height: 100%;
transform: scale(0.9);
padding: 0;
border: none;
}
.infoBox {
${styles.rightPanel.supportTab.box_SupportInfo}
}
.remixdinstallation {
padding: 3px;
border-radius: 2px;
margin-left: 5px;
}
.info {
${styles.rightPanel.settingsTab.box_SolidityVersionInfo};
margin-top: 1em;
word-break: break-word;
}
.title {
font-size: 1.1em;
font-weight: bold;
margin-bottom: 1em;
}
.crow {
display: flex;
overflow: auto;
clear: both;
padding: .2em;
}
.crow label {
cursor:pointer;
}
.crowNoFlex {
overflow: auto;
clear: both;
}
`
var yo = require('yo-yo') var yo = require('yo-yo')
var csjs = require('csjs-inject') var css = require('./styles/tabbed-menu-styles')
var globalRegistry = require('../../global/registry') var globalRegistry = require('../../global/registry')
var helper = require('../../lib/helper') var helper = require('../../lib/helper')
var styles = require('../ui/styles-guide/theme-chooser').chooser()
var EventManager = require('../../lib/events') var EventManager = require('../../lib/events')
module.exports = class TabbedMenu { class TabbedMenu {
constructor (localRegistry) { constructor (localRegistry) {
const self = this const self = this
self.event = new EventManager() self.event = new EventManager()
...@@ -91,40 +90,4 @@ module.exports = class TabbedMenu { ...@@ -91,40 +90,4 @@ module.exports = class TabbedMenu {
} }
} }
const css = csjs` module.exports = TabbedMenu
.menu {
display: flex;
background-color: ${styles.rightPanel.BackgroundColor_Pre};
list-style: none;
margin: 0;
padding: 0;
}
.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;
}
.optionViews {
background-color: ${styles.rightPanel.backgroundColor_Tab};
overflow: scroll;
height: 100%;
}
.optionViews > div {
display: none;
}
.optionViews .pre {
word-wrap: break-word;
background-color: ${styles.rightPanel.BackgroundColor_Pre};
border-radius: 3px;
display: inline-block;
padding: 0 0.6em;
}
`
...@@ -100,8 +100,8 @@ module.exports = class TestTab { ...@@ -100,8 +100,8 @@ module.exports = class TestTab {
} }
self._deps.filePanel.event.register('newTestFileCreated', file => { self._deps.filePanel.event.register('newTestFileCreated', file => {
var testList = document.querySelector("[class^='testList']") var testList = self.view.querySelector("[class^='testList']")
var test = yo`<label><input onchange=${(e) => toggleCheckbox(e, file)} type="checkbox" checked="true">${file}</label>` var test = yo`<label class="singleTestLabel"><input class="singleTest" onchange=${(e) => toggleCheckbox(e.target.checked, file)} type="checkbox" checked="true">${file}</label>`
testList.appendChild(test) testList.appendChild(test)
self.data.allTests.push(file) self.data.allTests.push(file)
self.data.selectedTests.push(file) self.data.selectedTests.push(file)
...@@ -133,13 +133,32 @@ module.exports = class TestTab { ...@@ -133,13 +133,32 @@ module.exports = class TestTab {
function listTests () { function listTests () {
var tests = self.data.allTests var tests = self.data.allTests
return tests.map(test => yo`<label><input onchange =${(e) => toggleCheckbox(e, test)} type="checkbox" checked="true">${test} </label>`) return tests.map(test => yo`<label class="singleTestLabel"><input class="singleTest" onchange =${(e) => toggleCheckbox(e.target.checked, test)} type="checkbox" checked="true">${test} </label>`)
} }
function toggleCheckbox (e, test) { function toggleCheckbox (eChecked, test) {
var selectedTests = self.data.selectedTests if (!self.data.selectedTests) {
selectedTests = e.target.checked ? [...selectedTests, test] : selectedTests.filter(el => el !== test) self.data.selectedTests = self._view.el.querySelectorAll('.singleTest:checked')
}
let selectedTests = self.data.selectedTests
selectedTests = eChecked ? [...selectedTests, test] : selectedTests.filter(el => el !== test)
self.data.selectedTests = selectedTests self.data.selectedTests = selectedTests
let checkAll = self._view.el.querySelector('[id="checkAllTests"]')
if (eChecked) {
checkAll.checked = true
} else if (!selectedTests.length) {
checkAll.checked = false
}
}
function checkAll (event) {
let checkBoxes = self._view.el.querySelectorAll('.singleTest')
const checkboxesLabels = self._view.el.querySelectorAll('.singleTestLabel')
// checks/unchecks all
for (let i = 0; i < checkBoxes.length; i++) {
checkBoxes[i].checked = event.target.checked
toggleCheckbox(event.target.checked, checkboxesLabels[i].innerText)
}
} }
var runTests = function () { var runTests = function () {
...@@ -177,12 +196,20 @@ module.exports = class TestTab { ...@@ -177,12 +196,20 @@ module.exports = class TestTab {
<br/> <br/>
For more details, see For more details, see
How to test smart contracts guide in our documentation. How to test smart contracts guide in our documentation.
<div class=${css.generateTestFile} onclick=${generateTestFile}>Generate test file</div> <div class="${css.generateTestFile}" onclick="${generateTestFile}">Generate test file</div>
</div> </div>
<div class="${css.tests}"> <div class="${css.tests}">
${self.testList} ${self.testList}
<div class=${css.buttons}> <div class="${css.buttons}">
<div class=${css.runButton} onclick=${runTests}>Run Tests</div> <div class="${css.runButton}" onclick="${runTests}">Run Tests</div>
<label class="${css.label}" for="checkAllTests">
<input id="checkAllTests"
type="checkbox"
onclick="${function (event) { checkAll(event) }}"
checked="true"
>
Check/Uncheck all
</label>
</div> </div>
${testsOutput} ${testsOutput}
${testsSummary} ${testsSummary}
......
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