| <link rel="import" href="../../third-party/polymer/polymer.html"> |
| <link rel="import" href="../../third-party/core-pages/core-pages.html"> |
| <link rel="import" href="../../third-party/core-icons/core-icons.html"> |
| <link rel="import" href="../../third-party/core-icon-button/core-icon-button.html"> |
| <link rel="import" href="../../third-party/core-toolbar/core-toolbar.html"> |
| <link rel="import" href="../../third-party/core-selector/core-selector.html"> |
| <link rel="import" href="../../third-party/paper-tabs/paper-tabs.html"> |
| <link rel="import" href="tab-content/component.html"> |
| <link rel="import" href="tab-toolbar/component.html"> |
| |
| <polymer-element name="p2b-pipes"> |
| <template> |
| <link rel="stylesheet" href="../common/common.css"> |
| <link rel="stylesheet" href="component.css"> |
| <div class="container" flex> |
| <template if="{{ numTabs == 0 }}"> |
| <h2 page-title class="empty-message">No pipes to show...</h2> |
| <div class="no-pipes-bg"></div> |
| </template> |
| |
| <div id="tabsContainer" class="{{ {hidden : numTabs == 0} | tokenList}}" flex> |
| <paper-tabs id="tabs" class="{{ {hidden : numTabs <= 1} | tokenList}}" on-core-select="{{ handleTabSelectionChange }}" valueattr="key" selected="{{ selectedTabKey }}" noink></paper-tabs> |
| <core-selector id="tabPages" valueattr="key" selected="{{ selectedTabKey }}" flex></core-selector> |
| </div> |
| </div> |
| </template> |
| <script> |
| Polymer('p2b-pipes', { |
| |
| /* |
| * Map of existing pipe tabs. Key is the tab key. |
| * @type {set} |
| * @private |
| */ |
| pipeTabs: {}, |
| |
| /* |
| * Key of currently selected tab |
| * @type {string} |
| */ |
| selectedTabKey : '', |
| |
| /* |
| * Stack of previously selected tabs. |
| * @type {Array<string>} |
| * @private |
| */ |
| selectionHistoryStack: [], |
| |
| ready: function() { |
| this.numTabs = 0 |
| }, |
| |
| /* |
| * Adds a new tab |
| * @param {string} key Key of the tab to add |
| * @param {string} name Name of the tab to add |
| * @param {DOMElement} el Content of the tab |
| * @param {function} onClose Optional onClose callback. |
| */ |
| addTab: function(key, name, el, onClose) { |
| var self = this; |
| |
| // Create a tab thumb |
| var tab = document.createElement('paper-tab'); |
| tab.key = key; |
| tab.textContent = name; |
| |
| // Create a tab toolbar and assign the close handler |
| var tabToolbar = document.createElement('p2b-pipes-tab-toolbar'); |
| tabToolbar.toolbarTitle = name; |
| tabToolbar.addEventListener('close-action', function() { |
| self.removeTab(key); |
| if (onClose) { |
| onClose(); |
| } |
| }); |
| tabToolbar.addEventListener('fullscreen-action', function() { |
| var tabContent = self.pipeTabs[key].tabContent; |
| tabContent.fullscreen(); |
| }); |
| |
| // Create the content of the tab |
| var tabContent = document.createElement('p2b-pipes-tab-content'); |
| tabContent.setAttribute('key', key); |
| tabContent.appendChild(tabToolbar); |
| tabContent.appendChild(el); |
| |
| this.$.tabPages.appendChild(tabContent); |
| |
| // Add the tab to our list. |
| this.pipeTabs[key] = { |
| name: name, |
| tab: tab, |
| tabContent: tabContent, |
| tabToolbar: tabToolbar |
| }; |
| |
| this.numTabs++; |
| |
| this.selectedTabKey = key; |
| requestAnimationFrame(function() { |
| self.$.tabs.appendChild(tab); |
| }); |
| }, |
| |
| /* |
| * Adds a new toolbar action for the tab's toolbar |
| * @param {string} tabKey Key of the tab to add action to |
| * @param icon {string} icon Icon name for the action |
| * @param onClick {function} event handler for the action |
| */ |
| addToolbarAction: function(tabKey, icon, onClick) { |
| if (!this.pipeTabs[tabKey]) { |
| return; |
| } |
| var toolbar = this.pipeTabs[tabKey].tabToolbar; |
| toolbar.add(icon, onClick); |
| }, |
| |
| /* |
| * Removes a tab |
| * @param {string} key Key of the tab to remove |
| */ |
| removeTab: function(key) { |
| if (!this.pipeTabs[key]) { |
| return; |
| } |
| // Remove tab thumb and content |
| var tab = this.pipeTabs[key].tab; |
| tab.remove(); |
| var tabContent = this.pipeTabs[key].tabContent; |
| tabContent.remove(); |
| |
| // Delete tab from the map |
| delete this.pipeTabs[key]; |
| this.numTabs--; |
| |
| // Select an existing tab from previous selection history |
| var toSelect = this.selectionHistoryStack.pop(); |
| while ( toSelect && !this.pipeTabs[toSelect] ) { |
| // pop until we find one that still exists |
| toSelect = this.selectionHistoryStack.pop(); |
| } |
| if (toSelect) { |
| this.selectedTabKey = toSelect; |
| } |
| }, |
| |
| /* |
| * Replaces content of a tab |
| * @param {string} key Key of the tab to replace content for |
| * @param {string} newName new name for the tab |
| * @param {DOMElement} el New content of the tab |
| */ |
| replaceTabContent: function(key, newName, newEl) { |
| if (!this.pipeTabs[key]) { |
| return; |
| } |
| var tabContent = this.pipeTabs[key].tabContent; |
| tabContent.replaceTabContent(newEl); |
| if (newName) { |
| this.pipeTabs[key].tab.textContent = newName; |
| this.pipeTabs[key].tabToolbar.toolbarTitle = newName; |
| } |
| }, |
| |
| /* |
| * Adds the tab selection to history when selection changes |
| * @private |
| */ |
| handleTabSelectionChange: function(e) { |
| if (!e.detail.isSelected){ |
| return; |
| } |
| this.selectionHistoryStack.push(this.selectedTabKey); |
| } |
| }); |
| </script> |
| </polymer-element> |