diff --git a/src/app/components/vertical-icons-component.js b/src/app/components/vertical-icons-component.js
index e81c34c068..bc0ecdb00d 100644
--- a/src/app/components/vertical-icons-component.js
+++ b/src/app/components/vertical-icons-component.js
@@ -1,5 +1,6 @@
var yo = require('yo-yo')
var csjs = require('csjs-inject')
+var helper = require('../../lib/helper')
const EventEmitter = require('events')
@@ -11,33 +12,75 @@ class VerticalIconComponent {
this.events = new EventEmitter()
this.icons = {}
this.iconKind = {}
+ this.iconStatus = {}
this.name = name
this.store.event.on('activate', (name) => {
- const { profile } = this.store.getOne(name)
- if (!profile.icon) return
- if (profile.location === this.name || !profile.location) {
- this.addIcon(profile)
+ const api = this.store.getOne(name)
+ if (!api.profile.icon) return
+ if (api.profile.location === this.name || !api.profile.location) {
+ this.addIcon(api.profile)
+ this.listenOnStatus(api)
}
})
this.store.event.on('deactivate', (name) => {
const api = this.store.getOne(name)
- if (api && this.icons[name]) this.removeIcon(api.profile)
+ if (api && this.icons[name]) {
+ this.removeIcon(api.profile)
+ this.stopListenOnStatus(api)
+ }
})
this.store.event.on('add', (api) => { })
this.store.event.on('remove', (api) => { })
}
+ stopListenOnStatus (api) {
+ if (!api.events) return
+ let fn = this.iconStatus[api.profile.name]
+ if (fn) {
+ api.events.remove('statusChanged', fn)
+ delete this.iconStatus[api.profile.name]
+ }
+ }
+
+ listenOnStatus (api) {
+ if (!api.events) return
+ const fn = (status) => {
+ this.setIconStatus(api.profile.name, status)
+ }
+ this.iconStatus[api.profile.name] = fn
+ api.events.on('statusChanged', this.iconStatus[api.profile.name])
+ }
+
/**
* Add an icon to the map
* @param {ModuleProfile} profile The profile of the module
*/
addIcon ({kind, name, icon}) {
this.icons[name] = yo`
![${name}](${icon})
`
-
this.iconKind[kind || 'other'].appendChild(this.icons[name])
}
+ /**
+ * Set a new status for the @arg name
+ * @param {String} name
+ * @param {Object} status
+ */
+ setIconStatus (name, status) {
+ const el = this.icons[name]
+ if (!el) return
+ let statusEl = el.querySelector('i')
+ if (statusEl) {
+ el.removeChild(statusEl)
+ }
+ if (status.key) {
+ let key = helper.checkSpecialChars(status.key) ? '' : status.key
+ let type = helper.checkSpecialChars(status.type) ? '' : status.type
+ let title = helper.checkSpecialChars(status.title) ? '' : status.title
+ el.appendChild(yo``)
+ }
+ }
+
/**
* Remove an icon from the map
* @param {ModuleProfile} profile The profile of the module
@@ -136,6 +179,7 @@ const css = csjs`
width: 36px;
height: 36px;
padding: 3px;
+ position: relative;
}
.icon img {
width: 28px;
@@ -152,9 +196,14 @@ const css = csjs`
border-radius: 8px;
padding-top: 1px;
padding-left: 1px;
-}
+ }
.icon[title='settings'] {
position: absolute;
bottom: 0;
}
+ .status {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ }
`
diff --git a/src/app/editor/contextualListener.js b/src/app/editor/contextualListener.js
index dcbc60077c..7673e1d7d9 100644
--- a/src/app/editor/contextualListener.js
+++ b/src/app/editor/contextualListener.js
@@ -69,6 +69,7 @@ class ContextualListener {
this.currentPosition = cursorPosition
return
}
+ this._stopHighlighting()
this.currentPosition = cursorPosition
this.currentFile = file
if (compilationResult && compilationResult.data && compilationResult.data.sources[file]) {
@@ -78,7 +79,7 @@ class ContextualListener {
this._highlightExpressions(nodes[nodes.length - 1], compilationResult)
}
this.event.trigger('contextChanged', [nodes])
- } else this._stopHighlighting()
+ }
}
_buildIndex (compilationResult, source) {
diff --git a/src/app/staticanalysis/staticAnalysisView.js b/src/app/staticanalysis/staticAnalysisView.js
index e00676a4ea..699387b61a 100644
--- a/src/app/staticanalysis/staticAnalysisView.js
+++ b/src/app/staticanalysis/staticAnalysisView.js
@@ -125,6 +125,7 @@ staticAnalysisView.prototype.run = function () {
})
} else {
warningContainer.html('No compiled AST available')
+ self.event.trigger('staticAnaysisWarning', [0])
}
}
diff --git a/src/app/tabs/analysis-tab.js b/src/app/tabs/analysis-tab.js
index 390082c84c..2b663cf594 100644
--- a/src/app/tabs/analysis-tab.js
+++ b/src/app/tabs/analysis-tab.js
@@ -4,12 +4,14 @@ var EventManager = require('../../lib/events')
var css = require('./styles/analysis-tab-styles')
import { ApiFactory } from 'remix-plugin'
+import { EventEmitter } from 'events'
class AnalysisTab extends ApiFactory {
constructor (registry) {
super()
this.event = new EventManager()
+ this.events = new EventEmitter()
this.registry = registry
}
@@ -27,6 +29,13 @@ class AnalysisTab extends ApiFactory {
render () {
var staticanalysis = new StaticAnalysis()
+ staticanalysis.event.register('staticAnaysisWarning', (count) => {
+ if (count) {
+ this.events.emit('statusChanged', {key: 'exclamation-triangle', title: count + ' warnings', type: 'warning'})
+ } else {
+ this.events.emit('statusChanged', {key: 'check', title: 'no warning', type: 'success'})
+ }
+ })
this.registry.put({api: staticanalysis, name: 'staticanalysis'})
if (this.el) return this.el
diff --git a/src/app/tabs/compile-tab.js b/src/app/tabs/compile-tab.js
index f87d43f61a..764a0442b6 100644
--- a/src/app/tabs/compile-tab.js
+++ b/src/app/tabs/compile-tab.js
@@ -79,6 +79,7 @@ class CompileTab extends ApiFactory {
if (this._view.errorContainer) {
this._view.errorContainer.innerHTML = ''
}
+ this.events.emit('statusChanged', {key: 'spinner', title: 'compiling...', type: 'info'})
})
this.fileManager.events.on('currentFileChanged', (name) => {
@@ -88,6 +89,7 @@ class CompileTab extends ApiFactory {
if (success) {
// forwarding the event to the appManager infra
this.events.emit('compilationFinished', source.target, source, 'soljson', data)
+ this.events.emit('statusChanged', {key: 'check', title: 'compilation successful', type: 'success'})
// Store the contracts
this.data.contractsDetails = {}
this.compiler.visitContracts((contract) => {
@@ -97,6 +99,8 @@ class CompileTab extends ApiFactory {
this.compiler.getSource(contract.file)
)
})
+ } else {
+ this.events.emit('statusChanged', {key: 'exclamation', title: 'compilation failed', type: 'danger'})
}
// Update contract Selection
let contractMap = {}