From b400ad5ebca881dd3fde8bbe5d08c8f9fa50ceac Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 19 Dec 2017 10:52:18 +0100 Subject: [PATCH] improve tabbed menu to dynamically load tab --- src/app/panels/righthand-panel.js | 60 ++++++--------------- src/app/tabs/analysis-tab.js | 1 + src/app/tabs/compile-tab.js | 1 + src/app/tabs/debugger-tab.js | 1 + src/app/tabs/run-tab.js | 1 + src/app/tabs/settings-tab.js | 1 + src/app/tabs/support-tab.js | 1 + src/app/tabs/tabbed-menu.js | 88 ++++++++++++++++++++++--------- 8 files changed, 85 insertions(+), 69 deletions(-) diff --git a/src/app/panels/righthand-panel.js b/src/app/panels/righthand-panel.js index 6f79dc82ef..e6a29d2956 100644 --- a/src/app/panels/righthand-panel.js +++ b/src/app/panels/righthand-panel.js @@ -1,7 +1,7 @@ var yo = require('yo-yo') var remixLib = require('remix-lib') var EventManager = remixLib.EventManager -var tabbedMenu = require('../tabs/tabbed-menu') +var TabbedMenu = require('../tabs/tabbed-menu') var compileTab = require('../tabs/compile-tab') var runTab = require('../tabs/run-tab') var settingsTab = require('../tabs/settings-tab') @@ -121,15 +121,9 @@ function RighthandPanel (appAPI, events, opts) { self.event = new EventManager() self._view = {} - var optionViews = yo`
${cssTabs}
` + var optionViews = yo`
` var options = yo` ` self._view.dragbar = yo`
` @@ -147,24 +141,26 @@ function RighthandPanel (appAPI, events, opts) { appAPI.switchTab = (tabClass) => { this.event.trigger('switchTab', [tabClass]) } - compileTab(optionViews, appAPI, events, opts) - runTab(optionViews, appAPI, events, opts) - settingsTab(optionViews, appAPI, events, opts) - analysisTab(optionViews, appAPI, events, opts) - debuggerTab(optionViews, appAPI, events, opts) - supportTab(optionViews, appAPI, events, opts) + + // load tabbed menu component + var tabEvents = {compiler: events.compiler, app: events.app, rhp: self.event} + self._view.tabbedMenu = new TabbedMenu(options, {}, tabEvents, {}) + + events.rhp = self.event + + this._view.tabbedMenu.addTab('Compile', 'compileView', compileTab(optionViews, appAPI, events, opts)) + this._view.tabbedMenu.addTab('Run', 'runView', runTab(optionViews, appAPI, events, opts)) + this._view.tabbedMenu.addTab('Settings', 'settingsView', settingsTab(optionViews, appAPI, events, opts)) + this._view.tabbedMenu.addTab('Analysis', 'staticanalysisView', analysisTab(optionViews, appAPI, events, opts)) + this._view.tabbedMenu.addTab('Debugger', 'debugView', debuggerTab(optionViews, appAPI, events, opts)) + this._view.tabbedMenu.addTab('Support', 'supportView', supportTab(optionViews, appAPI, events, opts)) + this._view.tabbedMenu.selectTabByTitle('Compile') self.render = function () { return self._view.element } self.init = function () { ;[...options.children].forEach((el) => { el.classList.add(css.options) }) - // ----------------- tabbed menu ----------------- - var tabbedMenuAPI = {} - // load tabbed menu component - var tabEvents = {compiler: events.compiler, app: events.app, rhp: self.event} - tabbedMenu(options, tabbedMenuAPI, tabEvents, {}) - // ----------------- resizeable ui --------------- var limit = 60 self._view.dragbar.addEventListener('mousedown', mousedown) @@ -206,27 +202,3 @@ function RighthandPanel (appAPI, events, opts) { } } } - -var cssTabs = yo`` diff --git a/src/app/tabs/analysis-tab.js b/src/app/tabs/analysis-tab.js index 10c3fd23db..3f8fde60ff 100644 --- a/src/app/tabs/analysis-tab.js +++ b/src/app/tabs/analysis-tab.js @@ -34,4 +34,5 @@ function analysisTab (container, appAPI, events, opts) { ` container.appendChild(el) + return el } diff --git a/src/app/tabs/compile-tab.js b/src/app/tabs/compile-tab.js index 0d32accb47..702d28c75d 100644 --- a/src/app/tabs/compile-tab.js +++ b/src/app/tabs/compile-tab.js @@ -445,6 +445,7 @@ function compileTab (container, appAPI, appEvents, opts) { } return el } + return el } function detailsHelpSection () { diff --git a/src/app/tabs/debugger-tab.js b/src/app/tabs/debugger-tab.js index da6edaf156..1fe289baff 100644 --- a/src/app/tabs/debugger-tab.js +++ b/src/app/tabs/debugger-tab.js @@ -24,4 +24,5 @@ function debuggerTab (container, appAPI, events, opts) {
` container.appendChild(el) + return el } diff --git a/src/app/tabs/run-tab.js b/src/app/tabs/run-tab.js index b8f6de63d3..707720f3e0 100644 --- a/src/app/tabs/run-tab.js +++ b/src/app/tabs/run-tab.js @@ -250,6 +250,7 @@ function runTab (container, appAPI, appEvents, opts) { noInstancesText.style.display = 'block' instanceContainer.appendChild(noInstancesText) }) + return el } function fillAccountsList (appAPI, container) { diff --git a/src/app/tabs/settings-tab.js b/src/app/tabs/settings-tab.js index 47de6a1fcc..f37d8c4c5f 100644 --- a/src/app/tabs/settings-tab.js +++ b/src/app/tabs/settings-tab.js @@ -137,6 +137,7 @@ function SettingsTab (container, appAPI, appEvents, opts) { }) container.appendChild(el) + return el } function setVersionText (text, el) { diff --git a/src/app/tabs/support-tab.js b/src/app/tabs/support-tab.js index 241b9a06f9..f1e1f83be1 100644 --- a/src/app/tabs/support-tab.js +++ b/src/app/tabs/support-tab.js @@ -86,6 +86,7 @@ function supportTab (container, appAPI, events, opts) { ` container.appendChild(el) + return el } function openLink () { diff --git a/src/app/tabs/tabbed-menu.js b/src/app/tabs/tabbed-menu.js index be611569a9..2e38661593 100644 --- a/src/app/tabs/tabbed-menu.js +++ b/src/app/tabs/tabbed-menu.js @@ -1,4 +1,4 @@ -var $ = require('jquery') +var yo = require('yo-yo') // -------------- styling ---------------------- var csjs = require('csjs-inject') @@ -6,46 +6,84 @@ var remixLib = require('remix-lib') var styleGuide = remixLib.ui.styleGuide var styles = styleGuide() -module.exports = tabbedMenu +var helper = require('../../lib/helper') var css = csjs` li.active { background-color: ${styles.rightPanel.backgroundColor_Tab}; - color: ${styles.appProperties.mainText_Color}; + color: ${styles.appProperties.mainText_Color} } -` - -function tabbedMenu (container, appAPI, events, opts) { - var lis = container.querySelectorAll('li') - for (var li = 0; li < lis.length; ++li) { - lis[li].onclick = function (ev) { selectTab(this) } + .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} + } +` - events.app.register('debuggingRequested', () => { - selectTab(container.querySelector('li.debugView')) - }) +class TabbedMenu { + constructor (tabView, api, events, opts) { + var self = this + this.tabView = tabView + this.events = events + this.tabs = {} + this.contents = {} - events.rhp.register('switchTab', tabName => { - selectTab(container.querySelector(`li.${tabName}`)) - }) + events.app.register('debuggingRequested', () => { + self.selectTab(tabView.querySelector('li.debugView')) + }) - // initialize tabbed menu - selectTab(container.querySelector('.compileView')) + events.rhp.register('switchTab', tabName => { + self.selectTab(tabView.querySelector(`li.${tabName}`)) + }) + } - // select tab + selectTabByTitle (title) { + this.selectTab(this.tabs[title]) + } - function selectTab (el) { - var match = /[a-z]+View/.exec(el.className) - if (!match) return - var cls = match[0] + selectTab (el) { if (!el.classList.contains(css.active)) { var nodes = el.parentNode.querySelectorAll('li') for (var i = 0; i < nodes.length; ++i) { nodes[i].classList.remove(css.active) + this.contents[nodes[i].getAttribute('title')].style.display = 'none' } - $('#optionViews').attr('class', '').addClass(cls) - el.classList.add(css.active) } - events.app.trigger('tabChanged', [cls]) + var title = el.getAttribute('title') + this.contents[el.getAttribute('title')].style.display = 'block' + el.classList.add(css.active) + this.events.app.trigger('tabChanged', [title]) + } + + addTab (title, cssClass, content) { + var self = this + if (!helper.checkSpecialChars(title)) { + this.contents[title] = content + this.tabs[title] = yo`
  • ${title}
  • ` + this.tabView.appendChild(this.tabs[title]) + } } } + +module.exports = TabbedMenu