Merge pull request #1669 from ethereum/runtab_refactor

Runtab refactor
pull/1/head
yann300 6 years ago committed by GitHub
commit cb8d69c81d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 48
      src/app.js
  2. 46
      src/app/tabs/analysis-tab.js
  3. 36
      src/app/tabs/debugger-tab.js
  4. 42
      src/app/tabs/plugin-tab.js
  5. 237
      src/app/tabs/run-tab.js
  6. 4
      src/app/tabs/runTab/model/dropdownlogic.js
  7. 7
      src/app/tabs/runTab/model/recorder.js
  8. 13
      src/app/tabs/runTab/recorder.js
  9. 12
      src/app/tabs/styles/analysis-tab-styles.js
  10. 14
      src/app/tabs/styles/debugger-tab-styles.js
  11. 15
      src/app/tabs/styles/plugin-tab-styles.js
  12. 84
      src/app/tabs/styles/support-tab-styles.js
  13. 42
      src/app/tabs/styles/tabbed-menu-styles.js
  14. 143
      src/app/tabs/support-tab.js
  15. 43
      src/app/tabs/tabbed-menu.js

@ -1,5 +1,6 @@
'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
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())

@ -1,43 +1,23 @@
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 {
padding: 2%;
padding-bottom: 3em;
display: flex;
flex-direction: column;
} }
`
module.exports = AnalysisTab

@ -1,48 +1,26 @@
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
} }
} }

@ -1,36 +1,24 @@
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 {
height: 100%;
width: 100%;
} }
.iframe {
height: 100%;
width: 100%;
border: 0;
} }
`
module.exports = PluginTab

@ -1,8 +1,5 @@
var $ = require('jquery')
var yo = require('yo-yo') var yo = require('yo-yo')
var EventManager = require('../../lib/events') var EventManager = require('../../lib/events')
var globlalRegistry = require('../../global/registry')
var executionContext = require('../../execution-context')
var Card = require('../ui/card') var Card = require('../ui/card')
var css = require('./styles/run-tab-styles') var css = require('./styles/run-tab-styles')
@ -15,170 +12,140 @@ var ContractDropdownUI = require('./runTab/contractDropdown.js')
var Recorder = require('./runTab/model/recorder.js') var Recorder = require('./runTab/model/recorder.js')
var RecorderUI = require('./runTab/recorder.js') var RecorderUI = require('./runTab/recorder.js')
function runTab (opts, localRegistry) { class RunTab {
var self = this
self.event = new EventManager() constructor (udapp, udappUI, config, fileManager, editor, logCallback, filePanel, pluginManager, compilersArtefacts) {
self._view = {} this.event = new EventManager()
self.data = {
count: 0, this.renderInstanceContainer()
text: `All transactions (deployed contracts and function executions) in this environment can be saved and replayed in this.renderSettings(udapp)
another environment. e.g Transactions created in Javascript VM can be replayed in the Injected Web3.` this.renderDropdown(udappUI, fileManager, pluginManager, compilersArtefacts, config, editor, udapp, filePanel, logCallback)
} this.renderRecorder(udapp, udappUI, fileManager, config, logCallback)
self._components = {} this.renderRecorderCard()
self._components.registry = localRegistry || globlalRegistry this.renderContainer()
self._components.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())
}
} }
// dependencies
self._deps = { renderContainer () {
udapp: self._components.registry.get('udapp').api, this.container = yo`<div class="${css.runTabView}" id="runTabView" ></div>`
udappUI: self._components.registry.get('udappUI').api,
config: self._components.registry.get('config').api, var el = yo`
fileManager: self._components.registry.get('filemanager').api, <div>
editor: self._components.registry.get('editor').api, ${this.settingsUI.render()}
logCallback: self._components.registry.get('logCallback').api, ${this.contractDropdownUI.render()}
filePanel: self._components.registry.get('filepanel').api, ${this.recorderCard.render()}
pluginManager: self._components.registry.get('pluginmanager').api, ${this.instanceContainer}
compilersArtefacts: self._components.registry.get('compilersartefacts').api </div>
`
this.container.appendChild(el)
} }
self._deps.udapp.resetAPI(self._components.transactionContextAPI)
self._view.recorderCount = yo`<span>0</span>` renderInstanceContainer () {
self._view.instanceContainer = yo`<div class="${css.instanceContainer}"></div>` this.instanceContainer = yo`<div class="${css.instanceContainer}"></div>`
self._view.clearInstanceElement = yo`
<i class="${css.clearinstance} ${css.icon} fa fa-trash" onclick=${() => self.event.trigger('clearInstance', [])} const instanceContainerTitle = yo`
title="Clear instances list and reset recorder" aria-hidden="true">
</i>`
self._view.instanceContainerTitle = yo`
<div class=${css.instanceContainerTitle} <div class=${css.instanceContainerTitle}
title="Autogenerated generic user interfaces for interaction with deployed contracts"> title="Autogenerated generic user interfaces for interaction with deployed contracts">
Deployed Contracts Deployed Contracts
${self._view.clearInstanceElement} <i class="${css.clearinstance} ${css.icon} fa fa-trash" onclick=${() => this.event.trigger('clearInstance', [])}
title="Clear instances list and reset recorder" aria-hidden="true">
</i>
</div>` </div>`
self._view.noInstancesText = yo`
this.noInstancesText = yo`
<div class="${css.noInstancesText}"> <div class="${css.noInstancesText}">
Currently you have no contract instances to interact with. Currently you have no contract instances to interact with.
</div>` </div>`
var container = yo`<div class="${css.runTabView}" id="runTabView" ></div>` this.event.register('clearInstance', () => {
this.instanceContainer.innerHTML = '' // clear the instances list
this.instanceContainer.appendChild(instanceContainerTitle)
this.instanceContainer.appendChild(this.noInstancesText)
})
this.instanceContainer.appendChild(instanceContainerTitle)
this.instanceContainer.appendChild(this.noInstancesText)
}
renderSettings (udapp) {
var settings = new Settings(udapp)
this.settingsUI = new SettingsUI(settings)
this.settingsUI.event.register('clearInstance', () => {
this.event.trigger('clearInstance', [])
})
}
renderDropdown (udappUI, fileManager, pluginManager, compilersArtefacts, config, editor, udapp, filePanel, logCallback) {
var dropdownLogic = new DropdownLogic(fileManager, pluginManager, compilersArtefacts, config, editor, udapp, filePanel)
this.contractDropdownUI = new ContractDropdownUI(dropdownLogic, logCallback)
var recorder = new Recorder(self._deps.udapp, self._deps.fileManager, self._deps.config) this.contractDropdownUI.event.register('clearInstance', () => {
recorder.event.register('newTxRecorded', (count) => { var noInstancesText = this.noInstancesText
this.data.count = count if (noInstancesText.parentNode) { noInstancesText.parentNode.removeChild(noInstancesText) }
this._view.recorderCount.innerText = count })
this.contractDropdownUI.event.register('newContractABIAdded', (abi, address) => {
this.instanceContainer.appendChild(udappUI.renderInstanceFromABI(abi, address, address))
}) })
recorder.event.register('cleared', () => { this.contractDropdownUI.event.register('newContractInstanceAdded', (contractObject, address, value) => {
this.data.count = 0 this.instanceContainer.appendChild(udappUI.renderInstance(contractObject, address, value))
this._view.recorderCount.innerText = 0
}) })
executionContext.event.register('contextChanged', recorder.clearAll.bind(recorder)) }
self.event.register('clearInstance', recorder.clearAll.bind(recorder))
var recorderInterface = new RecorderUI(recorder, self) renderRecorder (udapp, udappUI, fileManager, config, logCallback) {
recorderInterface.render() this.recorderCount = yo`<span>0</span>`
self._view.collapsedView = yo` var recorder = new Recorder(udapp, fileManager, config)
recorder.event.register('recorderCountChange', (count) => {
this.recorderCount.innerText = count
})
this.event.register('clearInstance', recorder.clearAll.bind(recorder))
this.recorderInterface = new RecorderUI(recorder, logCallback)
this.recorderInterface.event.register('newScenario', (abi, address, contractName) => {
var noInstancesText = this.noInstancesText
if (noInstancesText.parentNode) { noInstancesText.parentNode.removeChild(noInstancesText) }
this.instanceContainer.appendChild(udappUI.renderInstanceFromABI(abi, address, contractName))
})
this.recorderInterface.render()
}
renderRecorderCard () {
const collapsedView = yo`
<div class=${css.recorderCollapsedView}> <div class=${css.recorderCollapsedView}>
<div class=${css.recorderCount}>${self._view.recorderCount}</div> <div class=${css.recorderCount}>${this.recorderCount}</div>
</div>` </div>`
self._view.expandedView = yo` const expandedView = yo`
<div class=${css.recorderExpandedView}> <div class=${css.recorderExpandedView}>
<div class=${css.recorderDescription}> <div class=${css.recorderDescription}>
${self.data.text} All transactions (deployed contracts and function executions) in this environment can be saved and replayed in
another environment. e.g Transactions created in Javascript VM can be replayed in the Injected Web3.
</div> </div>
<div class="${css.transactionActions}"> <div class="${css.transactionActions}">
${recorderInterface.recordButton} ${this.recorderInterface.recordButton}
${recorderInterface.runButton} ${this.recorderInterface.runButton}
</div> </div>
</div> </div>
</div>` </div>`
self.recorderOpts = { this.recorderCard = new Card({}, {}, { title: 'Transactions recorded:', collapsedView: collapsedView })
title: 'Transactions recorded:', this.recorderCard.event.register('expandCollapseCard', (arrow, body, status) => {
collapsedView: self._view.collapsedView
}
var recorderCard = new Card({}, {}, self.recorderOpts)
recorderCard.event.register('expandCollapseCard', (arrow, body, status) => {
body.innerHTML = '' body.innerHTML = ''
status.innerHTML = '' status.innerHTML = ''
if (arrow === 'down') { if (arrow === 'down') {
status.appendChild(self._view.collapsedView) status.appendChild(collapsedView)
body.appendChild(self._view.expandedView) body.appendChild(expandedView)
} else if (arrow === 'up') { } else if (arrow === 'up') {
status.appendChild(self._view.collapsedView) status.appendChild(collapsedView)
} }
}) })
}
var settings = new Settings(self._deps.udapp) render () {
var settingsUI = new SettingsUI(settings) return this.container
}
self.event.register('clearInstance', () => {
this._view.instanceContainer.innerHTML = '' // clear the instances list
this._view.instanceContainer.appendChild(self._view.instanceContainerTitle)
this._view.instanceContainer.appendChild(self._view.noInstancesText)
})
settingsUI.event.register('clearInstance', () => {
this.event.trigger('clearInstance', [])
})
var dropdownLogic = new DropdownLogic(
this._deps.fileManager,
this._deps.pluginManager,
this._deps.compilersArtefacts,
this._deps.compiler,
this._deps.config,
this._deps.editor,
this._deps.udapp,
this._deps.filePanel
)
var contractDropdownUI = new ContractDropdownUI(dropdownLogic, this._deps.logCallback)
contractDropdownUI.event.register('clearInstance', () => {
var noInstancesText = this._view.noInstancesText
if (noInstancesText.parentNode) { noInstancesText.parentNode.removeChild(noInstancesText) }
})
contractDropdownUI.event.register('newContractABIAdded', (abi, address) => {
this._view.instanceContainer.appendChild(this._deps.udappUI.renderInstanceFromABI(abi, address, address))
})
contractDropdownUI.event.register('newContractInstanceAdded', (contractObject, address, value) => {
this._view.instanceContainer.appendChild(this._deps.udappUI.renderInstance(contractObject, address, value))
})
this._view.instanceContainer.appendChild(this._view.instanceContainerTitle)
this._view.instanceContainer.appendChild(this._view.noInstancesText)
var el = yo`
<div>
${settingsUI.render()}
${contractDropdownUI.render()}
${recorderCard.render()}
${self._view.instanceContainer}
</div>
`
container.appendChild(el)
return { render () { return container } }
} }
module.exports = runTab module.exports = RunTab

@ -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 {
}) })
} }
// 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 {
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])
})
} }
/** /**

@ -1,4 +1,6 @@
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')
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 {
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))
}) })
} }

@ -0,0 +1,12 @@
var csjs = require('csjs-inject')
const css = csjs`
.analysisTabView {
padding: 2%;
padding-bottom: 3em;
display: flex;
flex-direction: column;
}
`
module.exports = css

@ -0,0 +1,14 @@
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

@ -0,0 +1,15 @@
var csjs = require('csjs-inject')
const css = csjs`
.pluginTabView {
height: 100%;
width: 100%;
}
.iframe {
height: 100%;
width: 100%;
border: 0;
}
`
module.exports = css

@ -0,0 +1,84 @@
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

@ -0,0 +1,42 @@
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

@ -1,38 +1,30 @@
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 {
<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 {
</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 {
<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') }
}
}
const css = csjs` return this.el
.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 = SupportTab

@ -1,13 +1,12 @@
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 {
} }
} }
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;
}
`

Loading…
Cancel
Save