forked from extern/egroupware
New tag list widget, supports ajax & static options
This commit is contained in:
parent
14ebff54c9
commit
4ae6094d8d
54
etemplate/inc/class.etemplate_widget_taglist.inc.php
Normal file
54
etemplate/inc/class.etemplate_widget_taglist.inc.php
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* EGroupware - eTemplate serverside of tag list widget
|
||||||
|
*
|
||||||
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
||||||
|
* @package etemplate
|
||||||
|
* @subpackage api
|
||||||
|
* @link http://www.egroupware.org
|
||||||
|
* @author Nathan Gray
|
||||||
|
* @copyright 2013 Nathan Gray
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* eTemplate tag list widget
|
||||||
|
*/
|
||||||
|
class etemplate_widget_taglist extends etemplate_widget
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* Overrides parent to check for $xml first, prevents errors when instanciated without (via AJAX)
|
||||||
|
*
|
||||||
|
* @param string|XMLReader $xml string with xml or XMLReader positioned on the element to construct
|
||||||
|
* @throws egw_exception_wrong_parameter
|
||||||
|
*/
|
||||||
|
public function __construct($xml = '')
|
||||||
|
{
|
||||||
|
if($xml) {
|
||||||
|
parent::__construct($xml);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* The default search goes to the link system
|
||||||
|
*
|
||||||
|
* Find entries that match query parameter (from link system) and format them
|
||||||
|
* as the widget expects, a list of {id: ..., label: ...} objects
|
||||||
|
*/
|
||||||
|
public static function ajax_search() {
|
||||||
|
$app = $_REQUEST['app'];
|
||||||
|
$query = $_REQUEST['query'];
|
||||||
|
$options = array();
|
||||||
|
$links = egw_link::query($app, $query, $options);
|
||||||
|
|
||||||
|
$results = array();
|
||||||
|
foreach($links as $id => $name)
|
||||||
|
{
|
||||||
|
$results[] = array('id'=>$id, 'label' => htmlspecialchars($name));
|
||||||
|
}
|
||||||
|
header('Content-Type: application/json; charset=utf-8');
|
||||||
|
echo json_encode($results);
|
||||||
|
common::egw_exit();
|
||||||
|
}
|
||||||
|
}
|
191
etemplate/js/et2_widget_taglist.js
Normal file
191
etemplate/js/et2_widget_taglist.js
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
/**
|
||||||
|
* EGroupware eTemplate2 - JS Tag list object
|
||||||
|
*
|
||||||
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
||||||
|
* @package etemplate
|
||||||
|
* @subpackage api
|
||||||
|
* @link http://www.egroupware.org
|
||||||
|
* @author Nathan Gray
|
||||||
|
* @copyright Nathan Gray 2013
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
/*egw:uses
|
||||||
|
et2_core_inputWidget;
|
||||||
|
/phpgwapi/js/jquery/magicsuggest/src/magicsuggest-1.3.0.js;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tag list widget
|
||||||
|
*
|
||||||
|
* A cross between auto complete, selectbox and chosen multiselect
|
||||||
|
*
|
||||||
|
* Uses xoxco tagsinput library
|
||||||
|
* @see http://xoxco.com/projects/code/tagsinput/
|
||||||
|
* @augments et2_inputWidget
|
||||||
|
*/
|
||||||
|
var et2_taglist = et2_inputWidget.extend(
|
||||||
|
{
|
||||||
|
attributes: {
|
||||||
|
"empty_label": {
|
||||||
|
"name": "Empty label",
|
||||||
|
"type": "string",
|
||||||
|
"default": "",
|
||||||
|
"description": "Textual label for when nothing is selected"
|
||||||
|
},
|
||||||
|
"select_options": {
|
||||||
|
"type": "any",
|
||||||
|
"name": "Select options",
|
||||||
|
"default": null, //[{id: "a", label: "Alpha"},{id:"b", label: "Beta"}],
|
||||||
|
"description": "Internaly used to hold the select options."
|
||||||
|
},
|
||||||
|
|
||||||
|
// Value can be CSV String or Array
|
||||||
|
"value": {
|
||||||
|
"type": "any"
|
||||||
|
},
|
||||||
|
"autocomplete_url": {
|
||||||
|
"name": "Autocomplete source",
|
||||||
|
"type": "string",
|
||||||
|
"default": "etemplate_widget_taglist::ajax_search::etemplate",
|
||||||
|
"description": "Menuaction (app.class.function) for autocomplete data source. Must return actual JSON, and nothing more."
|
||||||
|
},
|
||||||
|
"autocomplete_params": {
|
||||||
|
"name": "Autocomplete parameters",
|
||||||
|
"type": "any",
|
||||||
|
"default": {},
|
||||||
|
"description": "Extra parameters passed to autocomplete URL"
|
||||||
|
},
|
||||||
|
"onAddTag": {
|
||||||
|
"name": "onAddTag",
|
||||||
|
"type": "js",
|
||||||
|
"default": et2_no_init,
|
||||||
|
"description": "Callback when a tag is added",
|
||||||
|
},
|
||||||
|
"onRemoveTag": {
|
||||||
|
"name": "onRemoveTag",
|
||||||
|
"type": "js",
|
||||||
|
"default": et2_no_init,
|
||||||
|
"description": "Callback when a tag is removed",
|
||||||
|
},
|
||||||
|
"onchange": {
|
||||||
|
"name": "onChange",
|
||||||
|
"type": "js",
|
||||||
|
"default": et2_no_init,
|
||||||
|
"description": "Callback when tags are changed",
|
||||||
|
},
|
||||||
|
"width": {
|
||||||
|
default: "150px"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construtor
|
||||||
|
*
|
||||||
|
* @memberOf et2_selectbox
|
||||||
|
*/
|
||||||
|
init: function() {
|
||||||
|
this._super.apply(this, arguments);
|
||||||
|
|
||||||
|
// jQuery wrapped DOM node
|
||||||
|
this.div = jQuery("<div></div>");
|
||||||
|
|
||||||
|
// magicSuggest object
|
||||||
|
this.taglist = null;
|
||||||
|
|
||||||
|
this.setDOMNode(this.div[0]);
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy: function() {
|
||||||
|
if(this.div != null)
|
||||||
|
{
|
||||||
|
// Undo the plugin
|
||||||
|
}
|
||||||
|
this._super.apply(this, arguments);
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
doLoadingFinished: function() {
|
||||||
|
this._super.apply(this, arguments);
|
||||||
|
|
||||||
|
// Initialize magicSuggest here
|
||||||
|
if(this.taglist != null) return;
|
||||||
|
|
||||||
|
this.taglist = this.div.magicSuggest({
|
||||||
|
id: this.getInstanceManager().uniqueId + '_' + this.id,
|
||||||
|
data: this.options.select_options ? this.options.select_options : this.options.autocomplete_url,
|
||||||
|
dataUrlParams: this.options.autocomplete_params,
|
||||||
|
method: 'GET',
|
||||||
|
displayField: "label",
|
||||||
|
emptyText: this.options.empty_label,
|
||||||
|
hideTrigger: true,
|
||||||
|
noSuggestionText: this.egw().lang("No suggestions"),
|
||||||
|
required: this.options.required
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
set_autocomplete_url: function(source)
|
||||||
|
{
|
||||||
|
if(source.indexOf('http') != 0)
|
||||||
|
{
|
||||||
|
source = this.egw().ajaxUrl(source);
|
||||||
|
}
|
||||||
|
this.options.autocomplete_url = source;
|
||||||
|
|
||||||
|
if(this.taglist == null) return;
|
||||||
|
this.taglist.setData(source);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the list of suggested options to a static list.
|
||||||
|
*
|
||||||
|
* You can pass either the traditional {id:label, id:label...} or an array of objects,
|
||||||
|
* and either will be coerced to what is needed.
|
||||||
|
*
|
||||||
|
* $param Array _options
|
||||||
|
*/
|
||||||
|
set_select_options: function(_options)
|
||||||
|
{
|
||||||
|
for (var key in _options)
|
||||||
|
{
|
||||||
|
var option = {id: key};
|
||||||
|
|
||||||
|
// Translate the options
|
||||||
|
if(!this.options.no_lang)
|
||||||
|
{
|
||||||
|
if (typeof _options[key] === 'object')
|
||||||
|
{
|
||||||
|
if(_options[key]["label"]) option["label"] = this.egw().lang(_options[key]["label"]);
|
||||||
|
if(_options[key]["title"]) option["title"] = this.egw().lang(_options[key]["title"]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
option.label = this.egw().lang(_options[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.options.select_options.push(option);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(this.taglist == null) return;
|
||||||
|
this.taglist.setData(this.options.select_options);
|
||||||
|
},
|
||||||
|
|
||||||
|
set_value: function(value) {
|
||||||
|
|
||||||
|
if(this.taglist == null) return;
|
||||||
|
this.taglist.clear(true);
|
||||||
|
this.taglist.setValue(value);
|
||||||
|
},
|
||||||
|
getValue: function() {
|
||||||
|
|
||||||
|
if(this.taglist == null) return null;
|
||||||
|
return this.taglist.getValue();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
et2_register_widget(et2_taglist, ["taglist"]);
|
||||||
|
|
||||||
|
// Require css - merge into etemplate2.css with all other widgets when done
|
||||||
|
if(typeof egw != 'undefined') egw(window).includeCSS(egw.webserverUrl + "/phpgwapi/js/jquery/magicsuggest/src/magicsuggest-1.3.0.css");
|
@ -36,6 +36,7 @@
|
|||||||
et2_widget_html;
|
et2_widget_html;
|
||||||
et2_widget_htmlarea;
|
et2_widget_htmlarea;
|
||||||
et2_widget_tabs;
|
et2_widget_tabs;
|
||||||
|
et2_widget_taglist;
|
||||||
et2_widget_tree;
|
et2_widget_tree;
|
||||||
et2_widget_historylog;
|
et2_widget_historylog;
|
||||||
et2_widget_hrule;
|
et2_widget_hrule;
|
||||||
|
Loading…
Reference in New Issue
Block a user