// // Copyright (C) 2015 FreeIPA Contributors see COPYING for license // // // Contains API browser widgets // define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/on', 'dojo/Evented', 'dojo/Stateful', '../jquery', '../ipa', '../metadata', '../navigation', '../reg', '../text', '../util' ], function(declare, lang, on, Evented, Stateful, $, IPA, metadata, navigation, reg, text, util) { var widgets = { browser_widgets: {} }; //namespace var apibrowser_facet = 'apibrowser'; /** * Browser Widget Base * * Candidate for a base class for all widgets * * @class */ widgets.browser_widgets.Base = declare([Stateful, Evented], { // nodes el: null, /** * Render widget's HTML * @return {jQuery} base node */ render: function() { this.el = $('
', { 'class': this.css_class }); this.render_content(); return this.el; }, /** * Should be overridden */ render_content: function() { }, constructor: function(spec) { lang.mixin(this, spec); } }); /** * Detail Base * * A base class for showing details of various API objects * * @class * @extends {widgets.browser_widgets.Base} */ widgets.browser_widgets.DetailBase = declare([widgets.browser_widgets.Base], { /** * Item to be displayed * @property {Object} */ item: null, common_options: [ 'all', 'rights', 'raw', 'version', 'addattr', 'setattr', 'delattr', 'getattr', 'timelimit', 'sizelimit', 'pkey_only' ], _itemSetter: function(value) { this.item = value; if (this.el) { this.render_content(); } }, _get_object: function(obj_name) { var obj = metadata.get('@mo:' + obj_name); if (!obj || obj.only_webui) return null; return obj; }, _get_command_object: function(command_name) { var obj_name = command_name.split('_')[0]; var obj = this._get_object(obj_name); return obj; }, _get_objectparam: function(command_name, param_name) { var obj = this._get_command_object(command_name); if (!obj) return null; var param = metadata.get('@mo-param:' + obj.name + ':' + param_name); return param; }, _get_cli_option: function(name) { if (!name) return name; return '--' + name.replace('_', '-'); }, render_object_link: function(obj_name, text) { var facet = reg.facet.get(apibrowser_facet); var link = $('', { href: "#" + navigation.create_hash(facet, { type: 'object', name: obj_name }), text: text || obj_name }); return link; }, render_command_link: function(command_name, text) { var facet = reg.facet.get(apibrowser_facet); var link = $('', { href: "#" + navigation.create_hash(facet, { type: 'command', name: command_name }), text: text || command_name }); return link; }, render_param_link: function(obj_name, param_name, text) { var name = obj_name + ':' + param_name; var facet = reg.facet.get(apibrowser_facet); var link = $('', { href: "#" + navigation.create_hash(facet, { type: 'param', name: name }), text: text || param_name }); return link; }, render_title: function(type, text) { var title = $('

', { 'class': 'api-title' }); $('', { 'class': 'api-title-type', text: type }).appendTo(title); $('', { 'class': 'api-title-text', text: text }).appendTo(title); return title; }, render_doc: function(text) { return $('

', { text: text }); }, render_section_header: function(text, link) { return $('

', { text: text, id: link }); }, render_value_container: function() { return $('
', { 'class': 'properties' }); }, render_value: function(label, value_node, container) { if (!text) return $(''); var row = $('
', { 'class': 'row' }); $('
', { 'class': 'col-sm-4 prop-label', text: label }).appendTo(row); $('
', { 'class': 'col-sm-8 prop-value' }).append(value_node).appendTo(row); if (container) { container.append(row); } return row; }, render_text_all: function(label, text, container) { if (text === null || text === undefined) return $(''); var node = document.createTextNode(text); return this.render_value(label, node, container); }, render_text: function(label, text, container) { if (!text) return $(''); var node = document.createTextNode(text); return this.render_value(label, node, container); }, render_array: function(label, value, container) { if (!value || value.length === 0) return $(''); var text = value.join(', '); return this.render_text(label, text, container); }, render_object: function(label, obj, container) { if (obj === undefined || obj === null) return $(''); var text = JSON.stringify(obj); return this.render_text(label, text, container); }, render_command_object_link: function(label, command_name, container) { var obj = this._get_command_object(command_name); if (!obj) return $(''); var link = this.render_object_link(obj.name, obj.label_singular); return this.render_value(label, link, container); }, render_flags: function(flags, cnt) { if (!flags) return null; if (!cnt) cnt = $('
'); for (var i=0,l=flags.length; i', { 'class': 'label label-default', text: flags[i] }).appendTo(cnt); } return cnt; }, render_param: function(param, is_arg, container) { var prop_cnt = this.render_value_container(); var header = $('

', { text: param.name }); header.appendTo(prop_cnt); this.render_param_properties(param, is_arg, prop_cnt, header); if (container) { container.append(prop_cnt); } return prop_cnt; }, render_param_properties: function(param, is_arg, container, flags_container) { var flags = []; if (param.required) flags.push('required'); if (param.multivalue) flags.push('multivalued'); //if (param.primary_key) flags.push('primary key'); this.render_doc(param.doc).appendTo(container); this.render_flags(flags, flags_container); if (param.label && param.label[0] !== '<') { this.render_text("label", param.label, container); } this.render_text("type", param.type, container); this.render_text_all("default value", param['default'], container); this.render_array("default value created from", param['default_from'], container); if (param.values) { this.render_array("possible values", param.values, container); } // Str values this.render_text("minimum length", param.minlength, container); this.render_text("maximum length", param.maxlength, container); this.render_text("pattern", param.pattern, container); // Int, Decimal this.render_text("minimum value", param.minvalue, container); this.render_text("maximum value", param.maxvalue, container); this.render_text("precision", param.precision, container); // CLI if (!is_arg) { this.render_text("CLI option name", this._get_cli_option(param.cli_name), container); } this.render_text("option_group", param.option_group, container); } }); var base = widgets.browser_widgets.DetailBase; /** * Object detail * @class * @extends {widgets.browser_widgets.DetailBase */ widgets.browser_widgets.ObjectDetailWidget = declare([base], { render_content: function() { var link, obj; this.el.empty(); if (!this.item) { this.el.append('No object selected'); return; } var item = this.item; this.render_title('Object: ', item.name).appendTo(this.el); if (item.doc) this.render_doc(item.doc).appendTo(this.el); if (item.parent_object) { obj = this._get_object(item.parent_object); if (obj) { link = this.render_object_link(item.parent_object, obj.label_singular); this.render_value('parent_object', link, this.el); } } //this.render_text("parent_object", item.parent_object, this.el); this.render_text("label", item.label, this.el); this.render_text("label_singular", item.label_singular, this.el); this.render_text("container_dn", item.container_dn, this.el); this.render_text("object_class", item.object_class, this.el); this.render_text("object_class_config", item.object_class_config, this.el); this.render_text("object_name", item.object_name, this.el); this.render_text("object_name_plural", item.object_name_plural, this.el); this.render_text("uuid_attribute", item.uuid_attribute, this.el); this.render_text("rdn_attribute", item.rdn_attribute, this.el); this.render_text("bindable", item.bindable, this.el); this.render_array("aciattrs", item.aciattrs, this.el); this.render_text("can_have_permissions", item.can_have_permissions, this.el); this.render_array("default_attributes", item.default_attributes, this.el); this.render_array("hidden_attributes", item.hidden_attributes, this.el); this.render_object("attribute_members", item.attribute_members, this.el); this.render_object("relationships", item.relationships, this.el); if (item.methods) { this.render_section_header('Methods').appendTo(this.el); var cnt = $('
'); for (i=0, l=item.methods.length; i0) { cnt.append(', '); } var command_name = item.name + '_' + method_name; link = this.render_command_link(command_name, method_name); cnt.append(link); } this.render_value('', cnt, this.el); } if (item.takes_params) { this.render_section_header('Params').appendTo(this.el); for (var i=0,l=item.takes_params.length; i 0) { this.render_section_header('Arguments').appendTo(this.el); for (i=0, l=item.takes_args.length; i 0) { var options = []; var common_options = []; for (i=0, l=item.takes_options.length; i -1) continue; if (this.common_options.indexOf(opt.name) > -1) { common_options.push(opt); } else { options.push(opt); } } if (options.length) { this.render_section_header('Options').appendTo(this.el); } for (i=0, l=options.length; i 0) { this.render_section_header('Output Params').appendTo(this.el); var out_params_cnt = $('
'); for (i=0, l=item.output_params.length; i0) { out_params_cnt.append(', '); } if (!param) { out_params_cnt.append(param_name); } else { var link = this.render_param_link(obj.name, param_name); out_params_cnt.append(link); } } out_params_cnt.appendTo(this.el); } } }); /** * Param Detail * @class * @extends {widgets.browser_widgets.DetailBase */ widgets.browser_widgets.ParamDetailWidget = declare([base], { render_content: function() { this.el.empty(); if (!this.item) { this.el.append('No param selected'); return; } var item = this.item; this.render_title('Param: ', item.name).appendTo(this.el); var flags = $('
').appendTo(this.el); this.render_param_properties(item, this.el, flags); } }); /** * Filter input * * @class * @extends {widgets.browser_widgets.DetailBase */ widgets.browser_widgets.FilterWidget = declare([widgets.browser_widgets.Base], { /** * Filter text * @property {String} */ filter: '', _filter_el: null, _filterSetter: function(value) { this.filter = value; if (this.el) { this._filter_el.val(value); } }, render_content: function() { this.el.empty(); this._filter_el = $('', { type: 'text', name: 'filter', placeholder: 'type to filter...', title: 'accepts case insensitive regular expression' }); this._filter_el.bind('input', function() { var filter = this._filter_el.val(); this.set('filter', filter); }.bind(this)); this._filter_el.appendTo(this.el); } }); return widgets.browser_widgets; });