/*jsl:import ipa.js */ /*jsl:import navigation.js */ /* Authors: * Pavel Zuna * Endi S. Dewata * Adam Young * * Copyright (C) 2010 Red Hat * see file 'COPYING' for use and warranty information * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* REQUIRES: ipa.js, details.js, search.js, add.js */ IPA.facet = function (spec) { spec = spec || {}; var that = {}; that.display_class = spec.display_class || 'entity-facet'; that.name = spec.name; that.label = spec.label; that._entity_name = spec.entity_name; that.init = spec.init || init; that.create_content = spec.create_content || create_content; that.setup = spec.setup || setup; that.load = spec.load || load; that.dialogs = []; that.dialogs_by_name = {}; that.__defineGetter__('entity_name', function() { return that._entity_name; }); that.__defineSetter__('entity_name', function(entity_name) { that._entity_name = entity_name; }); that.create_action_panel = IPA.facet_create_action_panel; that.get_dialog = function(name) { return that.dialogs_by_name[name]; }; that.dialog = function(dialog) { that.dialogs.push(dialog); that.dialogs_by_name[dialog.name] = dialog; return that; }; function init() { that.entity = IPA.get_entity(that.entity_name); for (var i=0; i', { 'class': 'action-panel' }).appendTo(container); facet.create_action_panel(action_panel); var content = $('
', { 'class': 'content' }).appendTo(container); facet.create_content(content); facet.setup(container); facet.refresh(); }; IPA.nested_tab_labels = {}; IPA.get_nested_tab_label = function(entity_name){ if (!IPA.nested_tab_labels[entity_name]){ IPA.nested_tab_labels[entity_name] = "LABEL"; } return IPA.nested_tab_labels[entity_name]; }; /*Returns the entity requested, as well as: any nested tabs underneath it or its parent tab and the others nested at the same level*/ IPA.nested_tabs = function(entity_name){ var siblings = []; var nested_index; var nested_entities; var label; if (!IPA.tab_set) { siblings.push(entity_name); return siblings; } for (var top_tab_index = 0; top_tab_index < IPA.tab_set.length; top_tab_index += 1){ var top_tab = IPA.tab_set[top_tab_index]; for (var subtab_index = 0; subtab_index < top_tab.children.length; subtab_index += 1){ if(top_tab.children[subtab_index].name){ if (top_tab.children[subtab_index].name === entity_name){ siblings.push(entity_name); IPA.nested_tab_labels[entity_name] = top_tab.children[subtab_index].label; if (top_tab.children[subtab_index].children){ label = top_tab.children[subtab_index].label; nested_entities = top_tab.children[subtab_index].children; for ( nested_index = 0; nested_index < nested_entities.length; nested_index += 1){ siblings.push (nested_entities[nested_index].name); IPA.nested_tab_labels[entity_name] = top_tab.children[subtab_index].label; } } }else{ if (top_tab.children[subtab_index].children){ nested_entities = top_tab.children[subtab_index].children; for (nested_index = 0; nested_index < nested_entities.length; nested_index += 1){ if (nested_entities[nested_index].name === entity_name){ siblings.push(top_tab.children[subtab_index].name); IPA.nested_tab_labels[entity_name] = top_tab.children[subtab_index].label; for (var nested_index2 = 0; nested_index2 < nested_entities.length; nested_index2 += 1){ siblings.push(nested_entities[nested_index2].name); IPA.nested_tab_labels[nested_entities[nested_index2].name] = top_tab.children[subtab_index].label; } } } } } } } } return siblings; }; IPA.selected_icon = ''; IPA.back_icon = ''; IPA. facet_create_action_panel = function(container) { function build_link(other_facet,label){ var li = $('
  • ', { "class" : other_facet.display_class, title: other_facet.name, text: label, click: function(entity_name, other_facet_name) { return function() { if($(this).hasClass('entity-facet-disabled')){ return false; } var this_pkey = $('input[id=pkey]', container).val(); IPA.switch_and_show_page( entity_name, other_facet_name, this_pkey); return false; }; }(entity_name, other_facet_name) }); return li; } var that = this; var entity_name = that.entity_name; var panel_title = IPA.metadata.objects[entity_name].label; var nested_tabs = IPA.nested_tabs(entity_name); if (nested_tabs.length > 1){ panel_title = IPA.get_nested_tab_label(entity_name); } $('

    ', { text: panel_title }).appendTo(container); /*Note, for debugging purposes, it is useful to set var pkey_type = 'text';*/ var pkey_type = 'hidden'; $('', { 'type': pkey_type, id:'pkey', name:'pkey' }).appendTo(container); var ul = $('
      ', {'class': 'action'}).appendTo(container); var entity = IPA.get_entity(entity_name); var facet_name = IPA.current_facet(entity); var other_facet = entity.facets[0]; var other_facet_name = other_facet.name; var main_facet = build_link(other_facet,other_facet.label); for (var nested_index = 0 ; nested_index < nested_tabs.length; nested_index += 1){ if (nested_tabs[nested_index] === entity_name){ /*assume for now that entities with only a single facet do not have search*/ if (entity.facets.length > 0 ){ if ( entity.facets[0].name === IPA.current_facet( entity)){ if (nested_tabs.length > 1 ){ main_facet.html(IPA.selected_icon + IPA.metadata.objects[nested_tabs[nested_index]].label); main_facet.addClass('entity-facet-selected'); main_facet.appendTo(ul); } ul.append($('
    • ')); } else { main_facet.html( $('',{ "class":"input_link" }). append(IPA.back_icon + ' '+IPA.messages.buttons.back_to_list+' ')); main_facet.addClass('back-to-search'); main_facet.appendTo(ul); } ul.append($('

    • ')); } var facet_groups = {}; var li; for (var i=1; i', { 'class': 'entity-facet entity-facet-relation-label', 'text': other_facet.facet_group, 'title': other_facet.facet_group }); ul.append(li); facet_groups[facet_group] = li; } li = facet_groups[facet_group]; var link = build_link(other_facet, other_facet.label); link.addClass('facet-group-member'); li.after(link ); /* If we are on the current facet, we make the text black, non-clickable, add an icon and make sure the action controls are positioned underneath it. */ if ( other_facet.name === IPA.current_facet( entity)){ var text = link.text(); link.text(''); link.append($('
        '). append($('
      • ',{ 'class': 'association-facet-selected', html: IPA.selected_icon + text })). append($('
      • ',{ html:$('',{ 'class':"action-controls" }) }))); } facet_groups[facet_group] = li.next(); } else { var innerlist = $('
          ').appendTo(ul); var facet_link = build_link(other_facet, other_facet.label); innerlist.append(facet_link); if ( other_facet.name === IPA.current_facet( entity)){ text = facet_link.text(); facet_link.html(IPA.selected_icon + text); facet_link.addClass('entity-facet-selected'); innerlist.append($('
        • ')); } } } }else{ $('
        • ', { title: nested_tabs[nested_index], text: IPA.metadata.objects[nested_tabs[nested_index]].label, "class": "search-facet", click: function() { var state = {}; state[nested_tabs[0]+'-entity'] = this.title; IPA.nav.push_state(state); return false; } }).appendTo(ul); } } /*When we land on the search page, disable all facets that require a pkey until one is selected*/ if (facet_name === 'search'){ $('.entity-facet', container).addClass('entity-facet-disabled'); } return container; }; IPA.entity_builder = function(){ var that = {}; var entity = null; var facet = null; function section(spec){ var current_section = null; spec.entity_name = entity.name; if (!spec.label){ var obj_messages = IPA.messages.objects[entity.name]; spec.label = obj_messages[spec.name]; } if (spec.factory){ current_section = spec.factory(spec); }else{ current_section = IPA.details_list_section(spec); } facet.add_section(current_section); var fields = spec.fields; if (fields) { for (var i=0; i