On Fri, Nov 12, 2010 at 4:29 PM, Ecaterina Moraru (Valica)
<[email protected]> wrote:
> On Thu, Nov 4, 2010 at 18:34, jvelociter
> <[email protected]>wrote:
>
>> Author: jvelociter
>> Date: 2010-11-04 17:34:35 +0100 (Thu, 04 Nov 2010)
>> New Revision: 32479
>>
>> Added:
>>
>> platform/web/trunk/standard/src/main/webapp/resources/uicomponents/widgets/list/
>>
>> platform/web/trunk/standard/src/main/webapp/resources/uicomponents/widgets/list/xlist.js
>> Modified:
>>
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.css
>>
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.js
>>
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/widgets/jumpToPage.js
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/xwiki.js
>>
>> platform/web/trunk/standard/src/main/webapp/resources/uicomponents/viewers/tags.js
>> platform/web/trunk/standard/src/main/webapp/templates/javascript.vm
>> platform/web/trunk/standard/src/main/webapp/templates/tagedit.vm
>>
>> platform/xwiki-applications/trunk/administration/src/main/resources/XWiki/XWikiGroupSheet.xml
>>
>> platform/xwiki-applications/trunk/officeimporter/src/main/resources/XWiki/OfficeImporter.xml
>> Log:
>> XWIKI-5648 New visual design for the AJAX suggest module
>> XWIKI-5649 CSS classes to support automatic users and groups suggestions on
>> field input
>> XWIKI-3655 Clean the JS code of the ajax suggest - Continued work
>> XWIKI-5105 When several suggest are used on the same page, suggests results
>> interfer from one field to another - Fixed
>>
>> + some formatting on xwiki.js
>>
>>
>>
>> Modified:
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.css
>> ===================================================================
>> ---
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.css
>> 2010-11-04 15:22:54 UTC (rev 32478)
>> +++
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.css
>> 2010-11-04 16:34:35 UTC (rev 32479)
>> @@ -1,167 +1,60 @@
>> -body
>> -{
>> - position: relative;
>> -}
>> +#template('colorThemeInit.vm')
>>
>> -div.ajaxsuggest
>> -{
>> - position: absolute;
>> - background-image: url(suggest_img/as_pointer.gif);
>> - background-position: top;
>> - background-repeat: no-repeat;
>> - padding: 10px 0 0 0;
>> -z-index: 100013;
>> +.xhover {
>> + background:red;
>> }
>>
>> -div.ajaxsuggest div.as_header,
>> -div.ajaxsuggest div.as_footer
>> -{
>> - position: relative;
>> - height: 6px;
>> - padding: 0 6px;
>> - background-image: url(suggest_img/ul_corner_tr.gif);
>> - background-position: top right;
>> - background-repeat: no-repeat;
>> - overflow: hidden;
>> +input[type="text"].suggest {
>> + border-width: 1px;
>> }
>> -div.ajaxsuggest div.as_footer
>> -{
>> - background-image: url(suggest_img/ul_corner_br.gif);
>> -}
>>
>> -div.ajaxsuggest div.as_header div.as_corner,
>> -div.ajaxsuggest div.as_footer div.as_corner
>> -{
>> - position: absolute;
>> - top: 0;
>> - left: 0;
>> - height: 6px;
>> - width: 6px;
>> - background-image: url(suggest_img/ul_corner_tl.gif);
>> - background-position: top left;
>> - background-repeat: no-repeat;
>> -}
>> -div.ajaxsuggest div.as_footer div.as_corner
>> -{
>> - background-image: url(suggest_img/ul_corner_bl.gif);
>> -}
>> -div.ajaxsuggest div.as_header div.as_bar,
>> -div.ajaxsuggest div.as_footer div.as_bar
>> -{
>> - height: 6px;
>> - overflow: hidden;
>> - background-color: #333;
>> -}
>> -
>> -
>> -div.ajaxsuggest ul
>> -{
>> - list-style: none;
>> - margin: 0 0 -4px 0;
>> - padding: 0;
>> - overflow: hidden;
>> - background-color: #333;
>> -}
>> -
>> -div.ajaxsuggest ul li
>> -{
>> - color: #ccc;
>> - padding: 0;
>> - margin: 0 4px 4px;
>> - text-align: left;
>> -}
>> -
>> -div.ajaxsuggest ul li a
>> -{
>> - color: #ccc;
>> - display: block;
>> - text-decoration: none;
>> - background-color: transparent;
>> +body {
>> position: relative;
>> - padding: 0;
>> - width: 100%;
>> }
>> -div.ajaxsuggest ul li a:hover
>> -{
>> - background-color: #444;
>> -}
>> -div.ajaxsuggest ul li.as_highlight a:hover
>> -{
>> - background-color: #1B5CCD;
>> -}
>>
>> -div.ajaxsuggest ul li a span
>> -{
>> - display: block;
>> - padding: 3px 6px;
>> - font-weight: bold;
>> +div.suggestItems {
>> + position:absolute;
>> + border: 1px solid $theme.borderColor;
>> + border-top: none;
>> + background: white; /* theme color ? */
>> + z-index: 100013;
>> + text-align:left;
>> }
>>
>> -div.ajaxsuggest ul li a span small
>> -{
>> - font-weight: normal;
>> - color: #fff;
>> +div.suggestItems ul {
>> + margin: 0px;
>> }
>>
>> -div.ajaxsuggest ul li.as_highlight a span small
>> -{
>> - color: #ccc;
>> +ul.suggestList {
>> + margin:0px !important;
>> + text-transform:none;
>> + color:$theme.textColor;
>> + font-weight:normal;
>> }
>>
>> -div.ajaxsuggest ul li.as_highlight a
>> -{
>> - color: #fff;
>> - background-color: #1B5CCD;
>> - background-image: url(suggest_img/hl_corner_br.gif);
>> - background-position: bottom right;
>> - background-repeat: no-repeat;
>> +ul.suggestList .xhighlight {
>> + background-color: $theme.highlightColor;
>> }
>>
>> -div.ajaxsuggest ul li.as_highlight a span
>> -{
>> - background-image: url(suggest_img/hl_corner_bl.gif);
>> - background-position: bottom left;
>> - background-repeat: no-repeat;
>> +div.suggestItemName {
>> + text-indent: 0;
>> }
>>
>> -div.ajaxsuggest ul li a .tl,
>> -div.ajaxsuggest ul li a .tr
>> -{
>> - background-repeat: no-repeat;
>> - width: 6px;
>> - height: 6px;
>> - position: absolute;
>> - top: 0;
>> - padding: 0;
>> - margin: 0;
>> +div.suggestItemInfo {
>> + color: #556677;
>> + font-size: 0.8em;
>> + padding-left: 20px;
>> + text-indent: 0;
>> }
>> -div.ajaxsuggest ul li a .tr
>> -{
>> - right: 0;
>> -}
>>
>> -div.ajaxsuggest ul li.as_highlight a .tl
>> -{
>> - left: 0;
>> - background-image: url(suggest_img/hl_corner_tl.gif);
>> - background-position: bottom left;
>> +div.suggestItemName,
>> +div.suggestItemInfo {
>> + text-decoration: inherit;
>> }
>>
>> -div.ajaxsuggest ul li.as_highlight a .tr
>> -{
>> - right: 0;
>> - background-image: url(suggest_img/hl_corner_tr.gif);
>> - background-position: bottom right;
>> +.highlight {
>> + background-color: $theme.highlightColor;
>> + font-weight:bold;
>> + text-decoration: inherit;
>> }
>>
>> -div.ajaxsuggest ul em
>> -{
>> - font-style: normal;
>> - color: #6EADE7;
>> -}
>> -
>> -div.ajaxsuggest ul li.as_warning
>> -{
>> - font-weight: bold;
>> - text-align: center;
>> -}
>>
>> Modified:
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.js
>> ===================================================================
>> ---
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.js
>> 2010-11-04 15:22:54 UTC (rev 32478)
>> +++
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/suggest/ajaxSuggest.js
>> 2010-11-04 16:34:35 UTC (rev 32479)
>> @@ -2,6 +2,12 @@
>>
>> var widgets = XWiki.widgets = XWiki.widgets || {};
>>
>> + if (typeof widgets.XList == 'undefined') {
>> + if (typeof console != "undefined" && typeof console.warn == "function")
>> {
>> + console.warn("[Suggest widget] Required class missing:
>> XWiki.widgets.XList");
>> + }
>> + } else {
>> +
>> /**
>> * Suggest class.
>> * Provide value suggestions to users when starting to type in a text
>> input.
>> @@ -18,7 +24,7 @@
>> className : "ajaxsuggest",
>> timeout : 2500,
>> delay : 500,
>> - offsety : -5,
>> + offsety : 0,
>> // Display a "no results" message, or simply hide the suggest box when
>> no suggestions are available
>> shownoresults : true,
>> // The message to display as the "no results" message
>> @@ -26,6 +32,7 @@
>> maxheight : 250,
>> cache : false,
>> seps : "",
>> + icon : null,
>> // The name of the JSON variable or XML element holding the results.
>> // "results" for the old suggest, "searchResults" for the REST search.
>> resultsParameter : "results",
>> @@ -59,8 +66,8 @@
>> return false;
>> }
>>
>> - // parameters object
>> - Object.extend(this.options, param || { });
>> + // Clone default options from the prototype so that they are not
>> shared and extend options with passed parameters
>> + this.options = Object.extend(Object.clone(this.options), param || {
>> });
>>
>> // Reset the container if the configured parameter is not valid
>> if (!$(this.options.parentContainer)) {
>> @@ -127,7 +134,7 @@
>> * value inside the target field, Escape closes the suggest dropdown, Up
>> and Down move the current selection.
>> */
>> onKeyPress: function(event) {
>> - if(!$(this.idAs)) {
>> + if(!$(this.suggest)) {
>> // Let the key events pass through if the UI is not displayed
>> return;
>> }
>> @@ -136,7 +143,7 @@
>> switch(key) {
>> case Event.KEY_RETURN:
>> if(this.aSuggestions.length == 1) {
>> - this.setHighlight(1);
>> + this.highlightFirst();
>> }
>> this.setHighlightedValue();
>> Event.stop(event);
>> @@ -234,7 +241,7 @@
>> requestHeaders: headers,
>> onSuccess: this.setSuggestions.bindAsEventListener(this),
>> onFailure: function (response) {
>> - alert("AJAX error: " + response.statusText);
>> + new XWiki.widgets.Notification("Failed to retrieve suggestions :
>> ')" + response.statusText, "error", {timeout: 5});
>> }
>> });
>> },
>> @@ -281,8 +288,6 @@
>> }
>>
>> }
>> -
>> - this.idAs = "as_"+this.fld.id;
>> this.createList(this.aSuggestions);
>> },
>>
>> @@ -298,8 +303,8 @@
>> // get rid of old list
>> // and clear the list removal timeout
>> //
>> - if ($(this.idAs)) {
>> - $(this.idAs).remove();
>> + if (this.suggest && this.suggest.parentNode) {
>> + this.suggest.remove();
>> }
>> this.killTimeout();
>>
>> @@ -309,69 +314,46 @@
>>
>> // create holding div
>> //
>> - var div = new Element("div", {
>> - id: this.idAs,
>> - className: this.options.className
>> + var div = new Element("div", { 'class': "suggestItems "+
>> this.options.className });
>> +
>> + // create and populate list
>> + var list = new XWiki.widgets.XList([], {
>> + icon: this.options.icon,
>> + classes: 'suggestList',
>> + eventListeners: {
>> + 'click' : function () { pointer.setHighlightedValue(); return
>> false; },
>> + 'mouseover' : function () { pointer.setHighlight(
>> this.getElement() ); }
>> + }
>> });
>>
>> - var hcorner = new Element("div", {className: "as_corner"});
>> - var hbar = new Element("div", {className: "as_bar"});
>> - var header = new Element("div", {className: "as_header"});
>> - header.appendChild(hcorner);
>> - header.appendChild(hbar);
>> - div.appendChild(header);
>> -
>> - // create and populate ul
>> - var ul = new Element("ul", {id: "as_ul"});
>> -
>> // loop throught arr of suggestions
>> - // creating an LI element for each suggestion
>> + // creating an XlistItem for each suggestion
>> //
>> for (var i=0;i<arr.length;i++)
>> {
>> // format output with the input enclosed in a EM element
>> // (as HTML, not DOM)
>> //
>> - var val = arr[i].value;
>> - var st = val.toLowerCase().indexOf( this.sInput.toLowerCase() );
>> - var output = val.substring(0,st) + "<em>" + val.substring(st,
>> st+this.sInput.length) + "</em>" + val.substring(st+this.sInput.length);
>> -
>> + var val = arr[i].value, st = val.toLowerCase().indexOf(
>> this.sInput.toLowerCase() );
>> + var output = val.substring(0,st) + "<span class='highlight'>" +
>> val.substring(st, st+this.sInput.length) + "</span>" +
>> val.substring(st+this.sInput.length);
>> var span = new Element("span").update(output);
>>
>> - var a = new Element("a", {href: "#"});
>> + var item = new XWiki.widgets.XListItem( span , {
>> + containerClasses: 'suggestItem',
>> + value: arr[i].value,
>> + noHighlight: true // we do the highlighting ourselves
>> + });
>>
>> - var tl = new Element("span", {className:"tl"}).update(" ");
>> - var tr = new Element("span", {className:"tr"}).update(" ");
>> - a.appendChild(tl);
>> - a.appendChild(tr);
>> -
>> - a.appendChild(span);
>> -
>> - a.name = i+1;
>> - a.onclick = function () { pointer.setHighlightedValue(); return
>> false; }
>> - a.onmouseover = function () { pointer.setHighlight(this.name); }
>> -
>> - var li = new Element("li").update(a);
>> -
>> - ul.appendChild( li );
>> + list.addItem(item);
>> }
>>
>> // no results
>> if (arr.length == 0)
>> {
>> - var li = new Element("li",
>> {className:"as_warning"}).update(this.options.noresults);
>> -
>> - ul.appendChild( li );
>> + list.addItem( new XWiki.widgets.XListItem(this.options.noresults,
>> {'classes' : 'noSuggestion'}))
>> }
>> - div.appendChild( ul );
>> + div.appendChild( list.getElement() );
>>
>> - var fcorner = new Element("div", {className: "as_corner"});
>> - var fbar = new Element("div", {className: "as_bar"});
>> - var footer = new Element("div", {className: "as_footer"});
>> - footer.appendChild(fcorner);
>> - footer.appendChild(fbar);
>> - div.appendChild(footer);
>> -
>> // get position of target textfield
>> // position holding div below it
>> // set width of holding div to width of field
>> @@ -388,7 +370,8 @@
>> div.onmouseout = function(){ pointer.resetTimeout() }
>>
>> // add DIV to document
>> - $(this.options.parentContainer).appendChild(div);
>> + $(this.options.parentContainer).insert(div);
>> + this.suggest = div;
>>
>> // currently no item is highlighted
>> this.iHighlighted = 0;
>> @@ -405,23 +388,30 @@
>> */
>> changeHighlight: function(key)
>> {
>> - var list = $("as_ul");
>> + var list = this.suggest.down('ul');
>> if (!list)
>> return false;
>>
>> var n;
>>
>> - if (key == 40)
>> - n = this.iHighlighted + 1;
>> - else if (key == 38)
>> - n = this.iHighlighted - 1;
>> + if (this.iHighlighted) {
>> + if (key == 40)
>> + elem = this.iHighlighted.next();
>> + else if (key == 38)
>> + elem = this.iHighlighted.previous();
>> + }
>> + else {
>> + if (key == 40)
>> + elem = list.down('li');
>> + else if (key == 38)
>> + if (list.select('li') > 0) {
>> + elem = list.select('li')[list.select('li').length];
>> + }
>> + }
>>
>> - if (n > list.childNodes.length)
>> - n = list.childNodes.length;
>> - if (n < 1)
>> - n = 1;
>> -
>> - this.setHighlight(n);
>> + if (typeof elem != 'undefined') {
>> + this.setHighlight(elem);
>> + }
>> },
>>
>> /**
>> @@ -429,18 +419,14 @@
>> *
>> * @param {Object} n
>> */
>> - setHighlight: function(n)
>> + setHighlight: function(highlightedItem)
>> {
>> - var list = $("as_ul");
>> - if (!list)
>> - return false;
>> -
>> - if (this.iHighlighted > 0)
>> + if (this.iHighlighted)
>> this.clearHighlight();
>>
>> - this.iHighlighted = Number(n);
>> + highlightedItem.addClassName("xhighlight");
>>
>> - list.childNodes[this.iHighlighted-1].className = "as_highlight";
>> + this.iHighlighted = highlightedItem;
>>
>> this.killTimeout();
>> },
>> @@ -450,14 +436,19 @@
>> */
>> clearHighlight: function()
>> {
>> - var list = $("as_ul");
>> - if (!list)
>> - return false;
>> + if (this.iHighlighted) {
>> + this.iHighlighted.removeClassName("xhighlight");
>> + delete this.iHighlighted;
>> + }
>> + },
>>
>> - if (this.iHighlighted > 0)
>> - {
>> - list.childNodes[this.iHighlighted-1].className = "";
>> - this.iHighlighted = 0;
>> + highlightFirst: function()
>> + {
>> + if (this.suggest && this.suggest.down('ul')) {
>> + var first = this.suggest.down('ul').down('li');
>> + if (first) {
>> + this.setHighlight(first);
>> + }
>> }
>> },
>>
>> @@ -466,7 +457,7 @@
>> if (this.iHighlighted)
>> {
>> if(this.sInput == "" && this.fld.value == "")
>> - this.sInput = this.fld.value = this.aSuggestions[
>> this.iHighlighted-1 ].value;
>> + this.sInput = this.fld.value =
>> this.iHighlighted.down(".value").innerHTML;
>> else {
>> if(this.seps) {
>> var lastIndx = -1;
>> @@ -474,15 +465,15 @@
>> if(this.fld.value.lastIndexOf(this.seps.charAt(i)) > lastIndx)
>> lastIndx = this.fld.value.lastIndexOf(this.seps.charAt(i));
>> if(lastIndx == -1)
>> - this.sInput = this.fld.value = this.aSuggestions[
>> this.iHighlighted-1 ].value;
>> + this.sInput = this.fld.value =
>> this.iHighlighted.down(".value").innerHTML;
>> else
>> {
>> - this.fld.value = this.fld.value.substring(0, lastIndx+1) +
>> this.aSuggestions[ this.iHighlighted-1 ].value;
>> + this.fld.value = this.fld.value.substring(0, lastIndx+1) +
>> this.iHighlighted.down(".value").innerHTML;
>> this.sInput = this.fld.value.substring(lastIndx+1);
>> }
>> }
>> else
>> - this.sInput = this.fld.value = this.aSuggestions[
>> this.iHighlighted-1 ].value;
>> + this.sInput = this.fld.value =
>> this.iHighlighted.down(".value").innerHTML;
>> }
>>
>> Event.fire(this.fld, "xwiki:suggest:selected");
>> @@ -537,12 +528,13 @@
>> */
>> clearSuggestions: function() {
>> this.killTimeout();
>> - var ele = $(this.idAs);
>> + var ele = $(this.suggest);
>> var pointer = this;
>> if (ele) {
>> var fade = new Effect.Fade(ele, {duration: "0.25", afterFinish :
>> function() {
>> - if($(pointer.idAs)) {
>> - $(pointer.idAs).remove();
>> + if($(pointer.suggest)) {
>> + $(pointer.suggest).remove();
>> + delete pointer.suggest;
>> }
>> }});
>> }
>> @@ -550,6 +542,8 @@
>>
>> });
>>
>> + }
>> +
>> return XWiki;
>>
>> })(XWiki || {});
>>
>> Modified:
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/widgets/jumpToPage.js
>> ===================================================================
>> ---
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/widgets/jumpToPage.js
>> 2010-11-04 15:22:54 UTC (rev 32478)
>> +++
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/widgets/jumpToPage.js
>> 2010-11-04 16:34:35 UTC (rev 32479)
>> @@ -57,6 +57,7 @@
>> // Prefixed with & since the current (as of 1.7) Suggest code does
>> not automatically append it.
>> varname: "q",
>> noresults: "Document not found",
>> + icon: "${xwiki.getSkinFile('icons/silk/page_white_text.gif')}",
>> json: true,
>> resultsParameter : "searchResults",
>> resultId : "id",
>>
>> Modified:
>> platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/xwiki.js
>> ===================================================================
>> --- platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/xwiki.js
>> 2010-11-04 15:22:54 UTC (rev 32478)
>> +++ platform/web/trunk/standard/src/main/webapp/resources/js/xwiki/xwiki.js
>> 2010-11-04 16:34:35 UTC (rev 32479)
>> @@ -537,55 +537,55 @@
>> },
>>
>> cookies: {
>> - /**
>> - * Create a cookie, with or without expiration date.
>> - *
>> - * @param name Name of the cookie.
>> - * @param value Value of the cookie.
>> - * @param days Days to keep the cookie (can be null).
>> - * @return
>> - */
>> - create: function(name,value,days) {
>> - if (days) {
>> - var date = new Date();
>> - date.setTime(date.getTime()+(days*24*60*60*1000));
>> - var expires = "; expires="+date.toGMTString();
>> - }
>> - else var expires = "";
>> - document.cookie = name+"="+value+expires+"; path=/";
>> - },
>> + /**
>> + * Create a cookie, with or without expiration date.
>> + *
>> + * @param name Name of the cookie.
>> + * @param value Value of the cookie.
>> + * @param days Days to keep the cookie (can be null).
>> + * @return
>> + */
>> + create: function(name,value,days) {
>> + if (days) {
>> + var date = new Date();
>> + date.setTime(date.getTime()+(days*24*60*60*1000));
>> + var expires = "; expires="+date.toGMTString();
>> + }
>> + else var expires = "";
>> + document.cookie = name+"="+value+expires+"; path=/";
>> + },
>>
>> - /**
>> - * Read a cookie.
>> - *
>> - * @param name Name of the cookie.
>> - * @return Value for the given cookie.
>> - */
>> - read:function(name) {
>> - var nameEQ = name + "=";
>> - var ca = document.cookie.split(';');
>> - for(var i=0;i < ca.length;i++) {
>> - var c = ca[i];
>> - while (c.charAt(0)==' ') {
>> - c = c.substring(1,c.length);
>> - }
>> - if (c.indexOf(nameEQ) == 0) {
>> - return c.substring(nameEQ.length,c.length);
>> - }
>> - }
>> - return null;
>> - },
>> + /**
>> + * Read a cookie.
>> + *
>> + * @param name Name of the cookie.
>> + * @return Value for the given cookie.
>> + */
>> + read:function(name) {
>> + var nameEQ = name + "=";
>> + var ca = document.cookie.split(';');
>> + for(var i=0;i < ca.length;i++) {
>> + var c = ca[i];
>> + while (c.charAt(0)==' ') {
>> + c = c.substring(1,c.length);
>> + }
>> + if (c.indexOf(nameEQ) == 0) {
>> + return c.substring(nameEQ.length,c.length);
>> + }
>> + }
>> + return null;
>> + },
>>
>> - /**
>> - * Erase a cookie.
>> - *
>> - * @param name Name of the cookie to erase.
>> - * @return
>> - */
>> - erase:function(name) {
>> - XWiki.cookies.create(name,"",-1);
>> - }
>> -
>> + /**
>> + * Erase a cookie.
>> + *
>> + * @param name Name of the cookie to erase.
>> + * @return
>> + */
>> + erase:function(name) {
>> + XWiki.cookies.create(name,"",-1);
>> + }
>> +
>> },
>>
>> /**
>> @@ -1337,27 +1337,57 @@
>> /**
>> * Small JS improvement, which suggests document names (doc.fullName) when
>> typing in an input.
>> *
>> - * To activate this behavior on an input elements, add the
>> "suggestDocuments" classname to it.
>> + * To activate this behavior on an input elements, add one of the
>> following classname to it :
>> + * <ul>
>> + * <li><tt>suggestDocuments</tt> to suggest from any available
>> document</li>
>> + * <li><tt>suggestUsers</tt> to suggest from documents that contains user
>> objects</li>
>> + * <li><tt>suggestGroups</tt> to suggest from documents that contains
>> group objects</li>
>> + * </ul>
>> */
>> document.observe('xwiki:dom:loaded', function() {
>> - if (typeof(XWiki.widgets.Suggest) != "undefined") {
>> - $$("input.suggestDocuments").each(function(item) {
>> - // Create the Suggest.
>> - new XWiki.widgets.Suggest(item, {
>> - // This document also provides the suggestions.
>> - script:
>> XWiki.Document.getRestSearchURL("scope=name&number=10&media=json&"),
>> - varname: "q",
>> - noresults: "Document not found",
>> - json: true,
>> - resultsParameter : "searchResults",
>> - resultId : "id",
>> - resultValue : "pageFullName",
>> - resultInfo : "pageFullName",
>> - timeout : 30000,
>> - parentContainer : item.up()
>> - });
>> - });
>> - }
>> + var suggestionsMapping = {
>> + "documents" : {
>> + script:
>> XWiki.Document.getRestSearchURL("scope=name&number=10&media=json&"),
>> + varname: "q",
>> + icon: "$xwiki.getSkinFile('icons/silk/page_white_text.gif')",
>> + noresults: "Document not found",
>> + json: true,
>> + resultsParameter : "searchResults",
>> + resultId : "id",
>> + resultValue : "pageFullName",
>> + resultInfo : "pageFullName"
>> + },
>> + "users" : {
>> + script: XWiki.currentDocument.getURL('get',
>> 'xpage=uorgsuggest&classname=XWiki.XWikiUsers&wiki=local&uorg=user&'),
>> + varname: "input",
>> + icon: "$xwiki.getSkinFile('icons/silk/user.gif')",
>> + noresults: "User not found",
>> + },
>> + "groups" : {
>> + script: XWiki.currentDocument.getURL('get',
>> 'xpage=uorgsuggest&classname=XWiki.XWikiGroups&wiki=local&uorg=group&'),
>> + varname: "input",
>> + icon: "$xwiki.getSkinFile('icons/silk/group.gif')",
>> + noresults: "Group not found",
>> + }
>> + };
>> + if (typeof(XWiki.widgets.Suggest) != "undefined") {
>> + var keys = Object.keys(suggestionsMapping);
>> + for (var i=0;i<keys.length;i++) {
>> + var selector = 'input.suggest' + keys[i].capitalize();
>> + $$(selector).each(function(item) {
>> + if (!item.hasClassName('initialized')) {
>> + var options = {
>> + timeout : 30000,
>> + parentContainer : item.up()
>> + };
>> + Object.extend(options, suggestionsMapping[keys[i]]);
>> + // Create the Suggest.
>> + var suggest = new XWiki.widgets.Suggest(item, options);
>> + item.addClassName('initialized');
>> + }
>> + });
>> + }
>> + }
>> });
>>
>> /**
>>
>> Modified:
>> platform/web/trunk/standard/src/main/webapp/resources/uicomponents/viewers/tags.js
>> ===================================================================
>> ---
>> platform/web/trunk/standard/src/main/webapp/resources/uicomponents/viewers/tags.js
>> 2010-11-04 15:22:54 UTC (rev 32478)
>> +++
>> platform/web/trunk/standard/src/main/webapp/resources/uicomponents/viewers/tags.js
>> 2010-11-04 16:34:35 UTC (rev 32479)
>> @@ -157,7 +157,8 @@
>> script: "${xwiki.getURL('Main.WebHome', 'view',
>> 'xpage=suggest&classname=XWiki.TagClass&fieldname=tags&firCol=-&secCol=-')}&",
>> varname: 'input',
>> seps:
>> "${xwiki.getDocument('XWiki.TagClass').xWikiClass.tags.getProperty('separators').value}",
>> - shownoresults : false
>> + shownoresults : false,
>> + icon: "${xwiki.getSkinFile('icons/silk/tag_yellow.gif')}"
>> });
>> }
>> });
>>
>> Added:
>> platform/web/trunk/standard/src/main/webapp/resources/uicomponents/widgets/list/xlist.js
>> ===================================================================
>> ---
>> platform/web/trunk/standard/src/main/webapp/resources/uicomponents/widgets/list/xlist.js
>> (rev 0)
>> +++
>> platform/web/trunk/standard/src/main/webapp/resources/uicomponents/widgets/list/xlist.js
>> 2010-11-04 16:34:35 UTC (rev 32479)
>> @@ -0,0 +1,126 @@
>> +/**
>> + * Usage :
>> + *
>> + * var xlist = new XWiki.widgets.XList(
>> + * [ // array of initial list elements (or just content it works too
>> + * new XWiki.widgets.XListItem( "A first element" ),
>> + * new XWiki.widgets.XListItem( "A second element", {'value' :
>> '10'} ),
>> + * "A third item passed as string content",
>> + * new Element("blink").update('An hip-hop item passed as DOM
>> element')
>> + * ],
>> + * { // options
>> + * numbered: false,
>> + * icon: "$xwiki.getSkinFile('icons/silk/sport_basketball.gif')",
>> + * classes : "myListExtraClass",
>> + * itemClasses : "myListItemExtraClasses",
>> + * eventListeners : {
>> + * // Event listeners defined for each of this list items.
>> + * // listeners call backs are bound to the list item object
>> (XWiki.widgets.XListItem) from which they emerge
>> + * 'click' : function() { console.log('clicked !', this); },
>> + * 'mouseover' : function() { console.log('mouse over !', this);
>> }
>> + * }
>> + * });
>> + *
>> + * $('insertionNode').insert( xlist.getElement() );
>> + *
>> + * xlist.addItem(
>> + * new XWiki.widgets.XListItem('A fifth element added later', {
>> + * icon : "$xwiki.getSkinFile('icons/silk/bomb.gif')", // this
>> overrides the one defined for the whole list
>> + * eventListeners: {
>> + * // Event listeners defined just for this specific list item
>> + * 'mouseout' : function() { console.log('just this list item is
>> bound to this event', this); }
>> + * }
>> + * })
>> + * );
>> + *
>> + */
>> +
>> +var XWiki = function(XWiki){
>> +
>> + var widgets = XWiki.widgets = XWiki.widgets || {};
>> +
>> + widgets.XList = Class.create({
>> + initialize: function(items, options) {
>> + this.items = items || [];
>> + this.options = options || {}
>> + this.listElement = new Element(this.options.ordered ? "ol" :
>> "ul", {
>> + 'class' : 'xlist' + (this.options.classes ? (' ' +
>> this.options.classes) : ''),
>> + });
>> + if (this.items && this.items.length > 0) {
>> + for (var i=0;i<this.items.length;i++) {
>> + this.addItem(this.items[i]);
>> + }
>> + }
>> + },
>> + addItem: function(item){ /* future: position (top, N) */
>> + if (!item || !(item instanceof XWiki.widgets.XListItem)) {
>> + item = new XWiki.widgets.XListItem(item);
>> + }
>> + var listItemElement = item.getElement();
>> + if (this.options.itemClasses &&
>> !this.options.itemClasses.blank()) {
>> + listItemElement.addClassName(this.options.itemClasses);
>> + }
>> + this.listElement.insert(listItemElement);
>> + if (typeof this.options.eventListeners == 'object') {
>> + item.bindEventListeners(this.options.eventListeners);
>> + }
>> + if (this.options.icon && !this.options.icon.blank()) {
>> + item.setIcon(this.options.icon,
>> this.options.overrideItemIcon);
>> + }
>> + item.list = this; // associate list item to this XList
>> + },
>> + getElement: function() {
>> + return this.listElement;
>> + }
>> + });
>> +
>> + widgets.XListItem = Class.create({
>> + initialize: function(content, options) {
>> + this.options = options || {};
>> + var classes = 'xitem' + (this.options.noHighlight ? '' : '
>> xhighlight');
>> + classes += this.options.classes ? this.options.classes: '';
>> + this.containerElement = new Element("div", {'class':
>> 'xitemcontainer'}).insert(content || '');
>> + this.containerElement.addClassName(this.options.containerClasses
>> || '');
>> + this.containerElement.setStyle({textIndent: '0px'});
>> + if (this.options.value) {
>> + this.containerElement.insert(new Element('div',
>> {'class':'hidden value'}).insert(this.options.value));
>> + }
>> + this.listItemElement = new Element("li", {'class' :
>> classes}).update( this.containerElement );
>> + if (this.options.icon && !this.options.icon.blank()) {
>> + this.setIcon(this.options.icon);
>> + this.hasIcon = true;
>> + }
>> + if (typeof this.options.eventListeners == 'object') {
>> + this.bindEventListeners(this.options.eventListeners);
>> + }
>> + },
>> + getElement: function() {
>> + return this.listItemElement;
>> + },
>> + setIcon: function(icon, override) {
>> + if (!this.hasIcon || override) {
>> + this.iconImage = new Image();
>> + this.iconImage.onload = function(){
>> + this.listItemElement.setStyle({
>> + backgroundImage: "url(" + this.iconImage.src + ")",
>> + backgroundRepeat: 'no-repeat',
>> + });
>> + this.listItemElement.down(".xitemcontainer").setStyle({
>> + textIndent:(this.iconImage.width + 5) + 'px',
>> + height: this.iconImage.height + 'px'
>> + });
>>
>
> We need to make some standard classes for those types of icons: page, tags,
> groups, etc and use those classes instead (search, suggest, activity, trees,
> etc)
> Not so nice that the image is put in style, is gonna break the wcag. Also,
> for this type of images (like the one in action menu) we have a
> background-position: 0 3px.
We already have a class option for xitem, that we could use for
suggestGroups, suggestUsers, etc. classes, but still this "icon" is
valid in my opinion, not all developers will want to define classes
for everything (for example your icon name could be retrieved
dynamically, etc.)
Does the WCAG validate dynamic DOM changes like suggest ?
Jerome.
>
> Thanks,
> Caty
>
>
>
>> + }.bind(this)
>> + this.iconImage.src = icon;
>> + }
>> + },
>> + bindEventListeners: function(eventListeners) {
>> + var events = Object.keys(eventListeners);
>> + for (var i=0;i<events.length;i++) {
>> + this.listItemElement.observe(events[i],
>> eventListeners[events[i]].bind(this));
>> + }
>> + },
>> + });
>> +
>> + return XWiki;
>> +
>> +}(XWiki || {});
>> \ No newline at end of file
>>
>> Modified:
>> platform/web/trunk/standard/src/main/webapp/templates/javascript.vm
>> ===================================================================
>> --- platform/web/trunk/standard/src/main/webapp/templates/javascript.vm
>> 2010-11-04 15:22:54 UTC (rev 32478)
>> +++ platform/web/trunk/standard/src/main/webapp/templates/javascript.vm
>> 2010-11-04 16:34:35 UTC (rev 32479)
>> @@ -1,7 +1,7 @@
>> ##
>> ## CSS files related to JS libraries.
>> ##
>> -<link href="$xwiki.getSkinFile("js/xwiki/suggest/ajaxSuggest.css")"
>> rel="stylesheet" type="text/css" />
>> +<link href="$xwiki.getSkinFile("js/xwiki/suggest/ajaxSuggest.css", true)"
>> rel="stylesheet" type="text/css" />
>> <link href="$xwiki.getSkinFile("js/xwiki/lightbox/lightbox.css", true)"
>> rel="stylesheet" type="text/css" />
>> <!--[if IE]>
>> <link href="$xwiki.getSkinFile("js/xwiki/lightbox/lightboxIE.css", true)"
>> rel="stylesheet" type="text/css" />
>> @@ -19,9 +19,10 @@
>> $xwiki.jsfx.use('uicomponents/widgets/confirmedAjaxRequest.js', true)
>> $xwiki.jsfx.use('uicomponents/widgets/notification.js', true)
>> $xwiki.ssfx.use('uicomponents/widgets/notification.css', true)
>> +$xwiki.jsfx.use('uicomponents/widgets/list/xlist.js')
>> +$xwiki.jsfx.use('js/xwiki/suggest/ajaxSuggest.js')
>> <script type="text/javascript"
>> src="$xwiki.getSkinFile("js/prototype/prototype.js")"></script>
>> <script type="text/javascript"
>> src="$xwiki.getSkinFile("js/xwiki/xwiki.js", true)"></script>
>> -<script type="text/javascript"
>> src="$xwiki.getSkinFile("js/xwiki/suggest/ajaxSuggest.js")"></script>
>> <script type="text/javascript">
>> // <![CDATA[
>> XWiki.webapppath = "${xwiki.webAppPath}";
>>
>> Modified: platform/web/trunk/standard/src/main/webapp/templates/tagedit.vm
>> ===================================================================
>> --- platform/web/trunk/standard/src/main/webapp/templates/tagedit.vm
>> 2010-11-04 15:22:54 UTC (rev 32478)
>> +++ platform/web/trunk/standard/src/main/webapp/templates/tagedit.vm
>> 2010-11-04 16:34:35 UTC (rev 32479)
>> @@ -93,7 +93,7 @@
>> #set($seps =
>> $xwiki.getDocument("XWiki.TagClass").xWikiClass.tags.getProperty('separators').value)
>> <dl>
>> <dt><label for="tags">$msg.get("core.tagedit.title")</label></dt>
>> - <dd><input type="text" id="tags" name="tags" onfocus="new
>> XWiki.widgets.Suggest(this, {script:'$script', varname: 'input',
>> seps:'$seps', offsety: 13} );" value="$!tdoc.tags"/></dd>
>> + <dd><input type="text" id="tags" name="tags" onfocus="new
>> XWiki.widgets.Suggest(this, {script:'$script', varname: 'input',
>> seps:'$seps', offsety: 13,
>> icon:'${xwiki.getSkinFile('icons/silk/tag_yellow.gif')}'"} );"
>> value="$!tdoc.tags"/></dd>
>> </dl>
>> #end
>> #end
>>
>> Modified:
>> platform/xwiki-applications/trunk/administration/src/main/resources/XWiki/XWikiGroupSheet.xml
>> ===================================================================
>> ---
>> platform/xwiki-applications/trunk/administration/src/main/resources/XWiki/XWikiGroupSheet.xml
>> 2010-11-04 15:22:54 UTC (rev 32478)
>> +++
>> platform/xwiki-applications/trunk/administration/src/main/resources/XWiki/XWikiGroupSheet.xml
>> 2010-11-04 16:34:35 UTC (rev 32479)
>> @@ -11,15 +11,15 @@
>> <customClass></customClass>
>> <contentAuthor>XWiki.Admin</contentAuthor>
>> <creationDate>1242173909000</creationDate>
>> -<date>1242173909000</date>
>> -<contentUpdateDate>1242173909000</contentUpdateDate>
>> +<date>1288812724000</date>
>> +<contentUpdateDate>1288812724000</contentUpdateDate>
>> <version>1.1</version>
>> <title></title>
>> <template></template>
>> <defaultTemplate></defaultTemplate>
>> <validationScript></validationScript>
>> <comment></comment>
>> -<minorEdit>false</minorEdit>
>> +<minorEdit>true</minorEdit>
>> <syntaxId>xwiki/2.0</syntaxId>
>> <hidden>false</hidden>
>> <object>
>> @@ -159,10 +159,12 @@
>>
>> if (uorg == "user") {
>> suggesturl += "&uorg=user&";
>> + icon = "$xwiki.getSkinFile('icons/silk/user.gif')";
>> } else {
>> suggesturl += "&uorg=group&";
>> + icon = "$xwiki.getSkinFile('icons/silk/group.gif')";
>> }
>> - return new XWiki.widgets.Suggest(input, { script: suggesturl,
>> varname:'input' });
>> + return new XWiki.widgets.Suggest(input, { script: suggesturl,
>> varname:'input', icon:icon });
>> },
>> addNewMember: function(uorg, input) {
>> if (input) {
>>
>> Modified:
>> platform/xwiki-applications/trunk/officeimporter/src/main/resources/XWiki/OfficeImporter.xml
>> ===================================================================
>> ---
>> platform/xwiki-applications/trunk/officeimporter/src/main/resources/XWiki/OfficeImporter.xml
>> 2010-11-04 15:22:54 UTC (rev 32478)
>> +++
>> platform/xwiki-applications/trunk/officeimporter/src/main/resources/XWiki/OfficeImporter.xml
>> 2010-11-04 16:34:35 UTC (rev 32479)
>> @@ -338,7 +338,8 @@
>> if (typeof(XWiki.widgets.Suggest) != "undefined") {
>> new XWiki.widgets.Suggest(field, {
>> script: "$suggestDoc.URL?xpage=plain&type=" + type +
>> "&number=" + number + "&",
>> - });
>> + icon: "$xwiki.getSkinFile('icons/silk/folder.gif')"
>> + });
>> }
>> }
>>
>> XWiki.officeImporter.addAutoSuggest(document.getElementById("targetSpaceInputId"),
>> "spaces", 5);
>>
>> _______________________________________________
>> notifications mailing list
>> [email protected]
>> http://lists.xwiki.org/mailman/listinfo/notifications
>>
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
>
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs