diff --git a/etemplate/js/et2_dataview_view_rowProvider.js b/etemplate/js/et2_dataview_view_rowProvider.js index a2ca8aeb69..089ad758ca 100644 --- a/etemplate/js/et2_dataview_view_rowProvider.js +++ b/etemplate/js/et2_dataview_view_rowProvider.js @@ -509,6 +509,9 @@ var et2_dataview_rowTemplateWidget = et2_widget.extend(et2_IDOMNode, { this._mgrs = {}; this._row = _row; + // Set parent to root widget, so sub-widget calls still work + this._parent = _root; + // Clone the widgets inside the placeholders array this._widgets = []; }, diff --git a/etemplate/js/et2_extension_nextmatch.js b/etemplate/js/et2_extension_nextmatch.js index d01551d06e..3d8e704c1f 100644 --- a/etemplate/js/et2_extension_nextmatch.js +++ b/etemplate/js/et2_extension_nextmatch.js @@ -461,7 +461,7 @@ var et2_nextmatch_header_bar = Class.extend(et2_INextmatchHeader, { this.nextmatch = nextmatch; this.div = jQuery(document.createElement("div")) - .addClass("et2_nm_header_bar"); + .addClass("nextmatch_header"); if(this.nextmatch) this._createHeader(); }, @@ -508,6 +508,7 @@ var et2_nextmatch_header_bar = Class.extend(et2_INextmatchHeader, { // Add category if(!settings.no_cat) { + settings.cat_id_label = egw.lang("Category"); this.category = this._build_select('cat_id', 'select-cat', settings.cat_id, true); filters.append(this.category.getDOMNode()); } @@ -525,12 +526,15 @@ var et2_nextmatch_header_bar = Class.extend(et2_INextmatchHeader, { } // Search - this.search = et2_createWidget("textbox", {}, this.nextmatch); - this.search.input.attr("type", "search"); + this.search = et2_createWidget("textbox", {"blur":egw.lang("search")}, this.nextmatch); + this.search.input.attr("type", "search") + .css("left", "40%").css("position", "relative"); + this.search.input.val(settings.search); filters.append(this.search.getDOMNode()); jQuery(document.createElement("button")) .appendTo(filters) + .css("left", "40%").css("position", "relative") .text(">") .click(this.nextmatch, function(event) { event.data.activeFilters.search = self.search.getValue() @@ -538,6 +542,23 @@ var et2_nextmatch_header_bar = Class.extend(et2_INextmatchHeader, { }); // Export + if(!settings.no_csv_export) + { + var definition = settings.csv_fields; + if(settings.csv_fields === true) + { + definition = egw.preference('nextmatch-export-definition', this.nextmatch.getTemplateApp()); + } + var button = et2_createWidget("buttononly", {"label": "Export", image:"phpgwapi/filesave"}, this.nextmatch); + jQuery(button.getDOMNode()).appendTo(filters).css("float", "right") + .click(this.nextmatch, function(event) { + egw_openWindowCentered2( egw.link('/index.php', { + 'menuaction': 'importexport.importexport_export_ui.export_dialog', + 'appname': event.data.getTemplateApp(), + 'definition': definition + }), '_blank', 850, 440, 'yes'); + }); + } // Letter search var current_letter = this.nextmatch.options.settings.searchletter ? @@ -577,14 +598,46 @@ var et2_nextmatch_header_bar = Class.extend(et2_INextmatchHeader, { } }, + /** + * Build the selectbox filters in the header bar + * Sets value, options, labels, and change handlers + */ _build_select: function(name, type, value, lang) { var select = et2_createWidget(type, { "id": this.nextmatch.id + "_"+name, + "label": this.nextmatch.options.settings[name+"_label"] },this.nextmatch); select.set_value(value); var mgr = this.nextmatch.getArrayMgr("content").openPerspective(this.nextmatch, this.nextmatch.id); var options = mgr.getEntry("options-" + name); if(options) select.set_select_options(options); + select.set_value(this.nextmatch.options.settings[name]); + var input = select.input; + if(this.nextmatch.options.settings[name+"_onchange"]) + { + var onchange = this.nextmatch.options.settings[name+"_onchange"]; + // onchange needs to get current values + if(typeof onchange == "string") { + // Don't change original so we can do this again + onchange = et2_js_pseudo_funcs(onchange, this.nextmatch.id); + if(onchange.indexOf("$") >= 0 || onchange.indexOf("@") >= 0) { + var mgr = this.nextmatch.getArrayMgr("content"); + if(mgr) onchange = mgr.expandName(onchange); + } + onchange = new Function(onchange); + } + input.change(this.nextmatch, function(event) { + onchange(event); + }); + } + else + { + input.change(this.nextmatch, function(event) { + event.data.activeFilters[name] = input.val() + event.data.applyFilters(); + }); + } + return select; } diff --git a/etemplate/js/et2_widget_selectbox.js b/etemplate/js/et2_widget_selectbox.js index d53d005523..604cbd2391 100644 --- a/etemplate/js/et2_widget_selectbox.js +++ b/etemplate/js/et2_widget_selectbox.js @@ -54,7 +54,7 @@ var et2_selectbox = et2_inputWidget.extend({ init: function() { this._super.apply(this, arguments); - + // Allow no other widgets inside this one this.supportedWidgetClasses = []; diff --git a/etemplate/js/et2_widget_textbox.js b/etemplate/js/et2_widget_textbox.js index d1bf88752c..b93e68614d 100644 --- a/etemplate/js/et2_widget_textbox.js +++ b/etemplate/js/et2_widget_textbox.js @@ -85,17 +85,23 @@ var et2_textbox = et2_inputWidget.extend({ this.input = $j(document.createElement("input")); } - if(this.size) { - this.set_size(this.size); + if(this.options.size) { + this.set_size(this.options.size); } - if(this.blur) { - this.set_blur(this.blur); + if(this.options.blur) { + this.set_blur(this.options.blur); } this.input.addClass("et2_textbox"); this.setDOMNode(this.input[0]); }, + getValue: function() + { + if(this.options.blur && this.input.val() == this.options.blur) return ""; + return this._super.apply(this, arguments); + }, + /** * Set input widget size diff --git a/etemplate/js/test/test.css b/etemplate/js/test/test.css index d0c7ea5992..2e0fba5641 100644 --- a/etemplate/js/test/test.css +++ b/etemplate/js/test/test.css @@ -512,6 +512,15 @@ label input, label span, label div, label select, label textarea { /* background-color: silver;*/ } +.nextmatch_header > .header_count { + text-align: center +} +.nextmatch_header .et2_button_icon { + vertical-align: middle; +} +.nextmatch_header select { + position: relative; +} .nextmatch_sortheader { color: #003075; cursor: pointer;