You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

244 lines
7.7 KiB
JavaScript

/**
* This file implements 2 types of menus (basic roll down and tabs), they are implemented as objects given
*/
if (!qcms){
var qcms = {}
}
qcms.menu = {}
qcms.menu.Common = function (){
this._format = function (text){
return text.replace(/(-|_)/g,' ').trim()
}
this._open = function (text,uri,_parentId){
var _domId = text.replace(/ /g,'-')
var http = HttpClient.instance()
http.setHeader('dom',_domId)
http.setHeader('uri',uri)
http.post(`${qcms.context}/${uri}`,(x)=>{
//
// @TODO: In case of an error
var _dom = $(x.responseText)
if ( $(_dom).attr("id") == null){
$(_dom).attr("id",_domId)
}
if($(`${_parentId} #${_domId}`).length){
$(`${_parentId} #${_domId}`).remove()
}
var _found = qcms.html.hasNode ($(`${_parentId}`),$(_domId))
if (_found == 0){
$(`${_parentId}`).children().slideUp('fast',()=>{
$(`${_parentId}`).append(_dom)
this._finalize(`${_parentId} #${_domId}`)
})
}
})
}
this._finalize = function (_id){
var _script = $(`${_id} script`)
if (_script.lenth > 0){
_script.each( (_index)=>{
var _code = $(_script)[_index].text
eval(_code)
})
}
}
}
qcms.menu.Basic = function (_layout,_outputId,_domId){
qcms.menu.Common.call(this)
this._layout = _layout
this._parentId = _outputId //-- target of the output
this.init = function (){}
this._build = function (_items){
var _panes = []
var _context = this._context ;
var _open = this._open
var _parentId = this._parentId
// var _format = this._format
// var _finalize = this._finalize
// var _domId = this._domId
var _me = this ;
_items.forEach(_item=>{
// ligne 68 var _div = jx.dom.get .instance('DIV')
var _div = jx.dom.get .instance('LI')
_div.innerHTML = this._format('<button>'+_item.text+'</button>')
//
// We need to check for the override text and see if it goes here
_div.className = 'active'
_div.data = _item
_panes.push(_div)
$(_div).on('click', function (){
//
// how do we process this ...
if (this.data.type == 'redirect') {
window.open(this.data.url,_me._format(this.data.text))
}else if (this.data.type == 'dialog'){
qcms.dialog.show(this.data)
}else if (this.data.type == 'open'){
window.open(this.data.uri,'_self')
}else{
_me._open(_me._format(this.data.text),this.data.uri,_parentId)
}
// if(this.data.uri && this.data.type != 'open') {
// if (this.data.type == 'dialog') {
// qcms.dialog.show(this.data)
// }else{
// _me._open(_me._format(this.data.text),this.data.uri,_parentId)
// }
// }else{
// //
// // redirecting
// if (this.data.uri != null){
// window.open(this.data.uri,'_self')
// }else{
// window.open(this.data.url,_format(this.data.text))
// }
// }
})
})
return _panes ;
}
/**
* This part builds the menu automatically
*/
var _names = _layout.order.menu.length > 0 ? _layout.order.menu : Object.keys(_layout.menu)
_names.forEach ((_name)=>{
if (_layout.menu[_name]){
var _div = this._build(_layout.menu[_name]) ;
var _sub = jx.dom.get.instance('DIV')
var _menuList = jx.dom.get.instance('UL')
var _menuListCont = jx.dom.get.instance('LI')
var _menuItem = jx.dom.get.instance('BUTTON')
_menuItem.innerHTML = this._format (_name)
_sub.className = 'sub-menu '
_menuItem.className = 'item'
_div.forEach(_item=>{$(_sub).append(_item) })
$(_sub).append(_div)
$(_menuList).appendChild(_sub)
$(_menuListCont).appendChild(_menuList)
_menuItem.appendChild(_menuListCont)
_domId = (_domId == null || $(_domId).length == 0)?'.main .menu' : _domId
$(`${_domId}`).append(_menuItem)
}
})
}
/**
* Implementing Tab based menu
*/
qcms.menu.Tabs = function (_layout,_outputId,_domId){
qcms.menu.Common.call(this) //-- inheriting format and open functions
this._layout = _layout
this._parentId = _outputId //-- target of the output
this._domId = _domId
this.tabs = jx.dom.get.instance('DIV')
this.tabs.className = 'tabs'
this._context = qcms.context
this._build = function (text,_item,event){
var text = text.trim().replace(/(_|-)/ig,' ').trim()
var _context = this._context;
if (text.match(/\//)){
text = text.split(/\//g).slice(-1)[0]
}
var _button = jx.dom.get.instance('INPUT')
var _label = jx.dom.get.instance('LABEL')
_button.type= 'radio'
_button.id = text+'tab'
_button.name = 'menu-tabs'
_label.data = {id:text.toLowerCase(),uri:_item[0].uri}
if (this._layout.icon){
var _icon = jx.dom.get.instance('I')
_icon.className = this._layout.icons[text]
$(_label).append(_icon)
}
text = ' ' + text
$(_label).append(text)
$(_button).val(text.toLowerCase())
_label.htmlFor = _button.id
// var _open = this._open
// var _parentId = this._parentId
var _me = this ;
$(_label).on('click',function (){
// _me._open(this.data.id,this.data.uri,_me._parentId)
_me._open(_me._format(this.data.text),this.data.uri,_parentId)
})
return [_button,_label]
}
var _names = _layout.order.menu.length > 0 ? _layout.order.menu : Object.keys(_layout.menu)
// Object.keys(_layout.menu).
_names.forEach(function(_text){
_item = _layout.menu[_text]
_tabItem = this._build(_text,_item)
$(tabs).append(_tabItem)
})
this.tabs.className = 'tabs'
$(this._domId).append(this.tabs)
$(this._domId).css({'border':'1px solid transparent'})
$(this._domId).css({'grid-template-columns':'64px auto'})
}
qcms.menu.init = function(_layout){
if (_layout.order != null){
if (_layout.order.length == null && _layout.order.menu == null){
_layout.order = {menu:[]}
}else if (_layout.order.menu == null){
_layout.order.menu = []
}
}else{
_layout.order = {menu:[]}
}
var _count = 0
var _items = 0
Object.keys(_layout.menu).forEach(_name=>{
_items += _layout.menu[_name].length
_count += 1
})
if (_count == _items){
var _menuObject = new qcms.menu.Tabs (_layout,'.main #content','.main .menu')
}else{
var _menuObject = new qcms.menu.Basic (_layout,'.main #content','.main .menu')
}
}
//
// backward compatibility ...
if(!menu){
var menu = {}
}
menu.init = qcms.menu.init