From 0ace0967016a6056b124f722f9043326dbe7be88 Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Fri, 23 Sep 2011 19:09:52 +0000 Subject: [PATCH] Start nextmatch header --- .../class.etemplate_widget_nextmatch.inc.php | 3 +- etemplate/js/et2_extension_nextmatch.js | 135 +++++++++++++++++- 2 files changed, 136 insertions(+), 2 deletions(-) diff --git a/etemplate/inc/class.etemplate_widget_nextmatch.inc.php b/etemplate/inc/class.etemplate_widget_nextmatch.inc.php index f140bf11a0..7058216e22 100644 --- a/etemplate/inc/class.etemplate_widget_nextmatch.inc.php +++ b/etemplate/inc/class.etemplate_widget_nextmatch.inc.php @@ -120,12 +120,13 @@ class etemplate_widget_nextmatch extends etemplate_widget * @param string full id of widget incl. all namespaces * @return array with values for keys 'total', 'rows', 'readonlys' */ - static public function ajax_get_rows($exec_id, $fetchList, $form_name='nm') + static public function ajax_get_rows($exec_id, $fetchList, $filters = array(), $form_name='nm') { error_log(__METHOD__."('".substr($exec_id,0,10)."...',".array2string($fetchList).",'$form_name')"); self::$request = etemplate_request::read($exec_id); $value = self::get_array(self::$request->content, $form_name, true); + $value += $filters; $result = array('rows' => array()); foreach ($fetchList as $entry) diff --git a/etemplate/js/et2_extension_nextmatch.js b/etemplate/js/et2_extension_nextmatch.js index 0592055091..440ed91647 100644 --- a/etemplate/js/et2_extension_nextmatch.js +++ b/etemplate/js/et2_extension_nextmatch.js @@ -87,6 +87,8 @@ var et2_nextmatch = et2_DOMWidget.extend(et2_IResizeable, { this.div = $j(document.createElement("div")) .addClass("et2_nextmatch"); + this.header = new et2_nextmatch_header_bar(this, this.div); + // Create the dynheight component which dynamically scales the inner // container. this.dynheight = new et2_dynheight(null, this.div, 150); @@ -161,12 +163,16 @@ var et2_nextmatch = et2_DOMWidget.extend(et2_IResizeable, { var request = new egw_json_request( "etemplate_widget_nextmatch::ajax_get_rows::etemplate", [ this.getInstanceManager().etemplate_exec_id, - _fetchList + _fetchList, + this.activeFilters ], this); + var nextmatch = this; // Send the request request.sendRequest(true, function(_data) { _callback.call(_context, _data); + // Let anything else know + nextmatch.div.trigger({type:'nm_data', nm_data: _data, 'nextmatch': nextmatch}); }, null); }, @@ -415,6 +421,133 @@ var et2_nextmatch = et2_DOMWidget.extend(et2_IResizeable, { et2_register_widget(et2_nextmatch, ["nextmatch"]); +/** + * Standard nextmatch header bar, containing filters, search, record count, letter filters, etc. + */ +var et2_nextmatch_header_bar = Class.extend(et2_INextmatchHeader, { + attributes: { + "filter_label": { + "name": "Filter label", + "type": "string", + "description": "Label for filter", + "default": "", + "translate": true + }, + "filter_help": { + "name": "Filter help", + "type": "string", + "description": "Help message for filter", + "default": "", + "translate": true + }, + "filter": { + "name": "Filter value", + "type": "any", + "description": "Current value for filter", + "default": "" + }, + "no_filter": { + "name": "No filter", + "type": "boolean", + "description": "Remove filter", + "default": false + } + }, + + init: function(nextmatch, nm_div) { + this.nextmatch = nextmatch; + + this.div = jQuery(document.createElement("div")) + .addClass("et2_nm_header_bar"); + if(this.nextmatch) this._createHeader(); + }, + + destroy: function() { + this.nextmatch = null; + this.div = null; + }, + + setNextmatch: function(nextmatch) { + if(this.div) this.div.remove(); + this.nextmatch = nextmatch; + this._createHeader(); + }, + + _createHeader: function() { + + var self = this; + var nm_div = this.nextmatch.div; + + this.div.prependTo(nm_div); + + // Left + + // Record count + this.count = jQuery(document.createElement("span")) + .addClass("header_count") + .appendTo(this.div); + + this.count.append("? - ? ").append(egw.lang("of")).append(" "); + this.count_total = jQuery(document.createElement("span")) + .appendTo(this.count) + .text(this.nextmatch.options.settings.total + ""); + + // Set up so if row count changes, display is updated + nm_div.bind('nm_data', function(e) { // Have to bind to DOM node, not et2 widget + self.count_total.text(e.nm_data.total); + }); + + // Right + + // Add category + + // Filter 1 + + // Filter 2 + + // Search + + // Export + + // Letter search + var current_letter = this.nextmatch.options.settings.searchletter ? + this.nextmatch.options.settings.searchletter : + (this.nextmatch.activeFilters ? this.nextmatch.activeFilters.searchletter : false); + if(this.nextmatch.options.settings.lettersearch || current_letter) + { + this.lettersearch = jQuery(document.createElement("table")) + .css("width", "100%") + .appendTo(this.div); + var tbody = jQuery(document.createElement("tbody")).appendTo(this.lettersearch); + var row = jQuery(document.createElement("tr")).appendTo(tbody); + + for(var i = 65; i <= 90; i++) { + var button = jQuery(document.createElement("td")) + .addClass("lettersearch") + .appendTo(row) + .attr("id", String.fromCharCode(i)) + .text(String.fromCharCode(i)); + if(String.fromCharCode(i) == current_letter) button.addClass("lettersearch_active"); + } + button = jQuery(document.createElement("td")) + .addClass("lettersearch") + .appendTo(row) + .attr("id", "") + .text(egw.lang("all")); + if(!current_letter) button.addClass("lettersearch_active"); + + this.lettersearch.click(this.nextmatch, function(event) { + // this is the lettersearch table + jQuery("td",this).removeClass("lettersearch_active"); + jQuery(event.target).addClass("lettersearch_active"); + var letter = event.target.id; + event.data.activeFilters.searchletter = (letter == "" ? false : letter); + event.data.applyFilters(); + }); + } + } +}); +et2_register_widget(et2_nextmatch_header_bar, ["nextmatch_header_bar"]); /** * Classes for the nextmatch sortheaders etc.