forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSidebarTabs.js
More file actions
1 lines (1 loc) · 5.32 KB
/
SidebarTabs.js
File metadata and controls
1 lines (1 loc) · 5.32 KB
1
define(function(require,exports,module){const AppInit=require("utils/AppInit"),EventDispatcher=require("utils/EventDispatcher"),Metrics=require("utils/Metrics"),PreferencesManager=require("preferences/PreferencesManager"),SIDEBAR_TAB_FILES="sidebar-tab-files",AI_TAB_GOOD_WIDTH=450,PREF_AI_WIDTH_SET_INITIAL="aiTabWidthSetInitial",EVENT_TAB_ADDED="tabAdded",EVENT_TAB_REMOVED="tabRemoved",EVENT_TAB_CHANGED="tabChanged";let $navTabBar,$sidebar;const _tabs=[],_tabContent={},_appendedNodes=new Set;let _activeTabId=SIDEBAR_TAB_FILES;const _EXCLUDED_IDS={mainNavBar:!0,navTabBar:!0},_EXCLUDED_CLASSES=["horz-resizer","vert-resizer"];function _isExcludedNode(node){if(_EXCLUDED_IDS[node.id])return!0;for(let i=0;i<_EXCLUDED_CLASSES.length;i++)if(node.classList.contains(_EXCLUDED_CLASSES[i]))return!0;return!1}function _rebuildTabBar(){$navTabBar.empty(),_tabs.sort(function(a,b){return a.priority-b.priority}),_tabs.forEach(function(tab){const $item=$('<div class="sidebar-tab" data-tab-id="'+tab.id+'"><i class="'+tab.iconClass+'"></i><span>'+tab.label+"</span></div>");tab.id===_activeTabId&&$item.addClass("active"),tab.$tabItem=$item,$navTabBar.append($item)}),_tabs.length>=2?$navTabBar.addClass("has-tabs"):$navTabBar.removeClass("has-tabs")}function _isNodeInTab(node,tabId){return _tabContent[tabId]&&-1!==_tabContent[tabId].indexOf(node)}function _isNodeInAnyTab(node){const tabIds=Object.keys(_tabContent);for(let i=0;i<tabIds.length;i++)if(-1!==_tabContent[tabIds[i]].indexOf(node))return!0;return!1}function _applyTabVisibility(){if(!$sidebar||!$sidebar.length)return;const children=$sidebar.children().toArray();if(_activeTabId===SIDEBAR_TAB_FILES){const filesNodes=new Set(_tabContent[SIDEBAR_TAB_FILES]||[]);children.forEach(function(child){_isExcludedNode(child)||(filesNodes.has(child)||!_isNodeInAnyTab(child)?child.classList.remove("sidebar-tab-hidden"):child.classList.add("sidebar-tab-hidden"))})}else{const activeNodes=new Set(_tabContent[_activeTabId]||[]);children.forEach(function(child){_isExcludedNode(child)||(activeNodes.has(child)?child.classList.remove("sidebar-tab-hidden"):child.classList.add("sidebar-tab-hidden"))})}}function addTab(id,label,iconClass,options){options=options||{};for(let i=0;i<_tabs.length;i++)if(_tabs[i].id===id)return;const tab={id:id,label:label,iconClass:iconClass,priority:void 0!==options.priority?options.priority:100,$tabItem:null};_tabs.push(tab),_tabContent[id]=_tabContent[id]||[],_rebuildTabBar(),exports.trigger(EVENT_TAB_ADDED,id)}function addToTab(tabId,$content){const node=$content instanceof $?$content[0]:$content;node&&(_tabContent[tabId]||(_tabContent[tabId]=[]),-1===_tabContent[tabId].indexOf(node)&&(_tabContent[tabId].push(node),$sidebar[0].contains(node)||($sidebar.append(node),_appendedNodes.add(node)),tabId===_activeTabId||_isNodeInTab(node,_activeTabId)?node.classList.remove("sidebar-tab-hidden"):node.classList.add("sidebar-tab-hidden")))}function removeFromTab(tabId,$content){const node=$content instanceof $?$content[0]:$content;if(!node||!_tabContent[tabId])return;const idx=_tabContent[tabId].indexOf(node);-1!==idx&&(_tabContent[tabId].splice(idx,1),_isNodeInAnyTab(node)?_applyTabVisibility():_appendedNodes.has(node)?($(node).remove(),_appendedNodes.delete(node)):node.classList.remove("sidebar-tab-hidden"))}function removeTab(id){if(id===SIDEBAR_TAB_FILES)return!1;if(_tabContent[id]&&_tabContent[id].length>0)return!1;let removed=!1;for(let i=_tabs.length-1;i>=0;i--)if(_tabs[i].id===id){_tabs.splice(i,1),removed=!0;break}return removed&&(delete _tabContent[id],_activeTabId===id&&(_activeTabId=SIDEBAR_TAB_FILES),_rebuildTabBar(),_applyTabVisibility(),exports.trigger(EVENT_TAB_REMOVED,id)),removed}function setActiveTab(id){let found=!1;for(let i=0;i<_tabs.length;i++)if(_tabs[i].id===id){found=!0;break}if(!found)return;const previousTabId=_activeTabId;if(_activeTabId=id,$navTabBar.find(".sidebar-tab").removeClass("active"),$navTabBar.find('.sidebar-tab[data-tab-id="'+id+'"]').addClass("active"),_applyTabVisibility(),id!==SIDEBAR_TAB_FILES&&$sidebar&&$sidebar.length&&!PreferencesManager.getViewState(PREF_AI_WIDTH_SET_INITIAL)){const SidebarView=require("project/SidebarView");SidebarView.getWidth()<AI_TAB_GOOD_WIDTH&&SidebarView.resize(AI_TAB_GOOD_WIDTH),PreferencesManager.setViewState(PREF_AI_WIDTH_SET_INITIAL,!0)}previousTabId!==id&&exports.trigger(EVENT_TAB_CHANGED,id,previousTabId)}function getActiveTab(){return _activeTabId}function getAllTabs(){return _tabs.map(function(tab){return{id:tab.id,label:tab.label,iconClass:tab.iconClass,priority:tab.priority}})}AppInit.htmlReady(function(){$sidebar=$("#sidebar"),$navTabBar=$('<div id="navTabBar"></div>'),$sidebar.find("#mainNavBar").after($navTabBar),addTab(SIDEBAR_TAB_FILES,"Files","fa-solid fa-folder",{priority:0}),$navTabBar.on("click",".sidebar-tab",function(){const tabId=$(this).attr("data-tab-id");if(tabId){const label=tabId===SIDEBAR_TAB_FILES?"files":tabId;Metrics.countEvent(Metrics.EVENT_TYPE.UI,"navTab",label),setActiveTab(tabId)}})}),EventDispatcher.makeEventDispatcher(exports),exports.SIDEBAR_TAB_FILES=SIDEBAR_TAB_FILES,exports.EVENT_TAB_ADDED=EVENT_TAB_ADDED,exports.EVENT_TAB_REMOVED=EVENT_TAB_REMOVED,exports.EVENT_TAB_CHANGED=EVENT_TAB_CHANGED,exports.addTab=addTab,exports.addToTab=addToTab,exports.removeFromTab=removeFromTab,exports.removeTab=removeTab,exports.setActiveTab=setActiveTab,exports.getActiveTab=getActiveTab,exports.getAllTabs=getAllTabs});