diff --git a/data/System/JQGridPlugin.txt b/data/System/JQGridPlugin.txt index 575e477..2dd5230 100644 --- a/data/System/JQGridPlugin.txt +++ b/data/System/JQGridPlugin.txt @@ -1,4 +1,4 @@ -%META:TOPICINFO{author="micha" date="1269622158" format="1.1" version="1.2"}% +%META:TOPICINFO{author="micha" date="1271426279" format="1.1" version="1.3"}% ---+ %TOPIC% %STARTSECTION{"summary"}% @@ -7,20 +7,75 @@ representing and manipulating tabular data on the web. Since the grid is a client-side solution loading data dynamically through Ajax callbacks, it can be integrated with any server-side technology, including PHP, ASP, Java Servlets, JSP, !ColdFusion, and Perl. For more read the [[%PUBURLPATH%/%SYSTEMWEB%/JQGridPlugin/jqgriddocs/][jqgriddocs]]. +See also the [[http://www.trirand.com/jqgridwiki/doku.php?id=wiki:jqgriddocs][jqgrid wiki]] for up-to-date documentation. %ENDSECTION{"summary"}% ---++ Source Homepage: http://www.trirand.com/blog/ %BR% Author(s): Tony Tomov %BR% -Version: 3.6.3 +Version: 3.6.5 + +---++ Syntax +=%GRID{"<query>" form="..." }%= + +render a grid of topics matching the given query + +| *Parameter* | *Description* | *Default* | +| =query= | search query | searching for topics that have the named =form= attached to it | +| =web= | web where o start the query | BASEWEB | +| =form= | !DataForm definition which describes the columns of the grid | | +| =columns= | name of columbns to display; these are the formfield names as specified in the !DataForm definition in the specified =form=; there is a list of special column names that are remapped to topic properties (see below) | all columns in the !DataForm | +| =include= | regluar expression columns/formfields must match to be included in the grid model | | +| =exclude= | regluar expression columns/formfields must NOT match to be included in the grid model | | +| =rows= | number of rows to display in the grid per page | 20 | +| =rownumbers= | toggle on/off displaying the row number in the first column of the grid | off | +| =filterbar= | toggle on/off displaying a filter input field at the top of each column to narrow down search results | off | +| =toolbar= | toggle on/off displaying a toolbar at the bottom of the grid; switch this on for pagination | off | +| =sort= | name of column to sort the grid initially | first column (excluding the optional row numbers) | +| =reverse= | toggle on/off reverse sorting order | off | +| =caption= | caption to be displayed at the top of the grid | | +| =pager= | toggle on/off the pager in the toolbar | off | +| =viewrecords= | toggle on/off computing the total number of records and pages as part of the pager | on | +| =height= | height of the grid; can be set as a number or =auto= | | +| =width= | width of the grid; if not set, the grid's width is the sum of the width of all column | | +| =scroll= | when enabled the pager element is disabled; data is loaded dynamically while scrolling down the grid | off | +| =rowlist= | comma separated list of optional number of rows to select from in the grid interface | 5, 10, 20, 30, 40, 50, 100 | +| =colname_title= | (per column option) title of the column | field title as specified in the !DataForm | +| =colname_resizable= | (per column option) toggle on/off whether the width of the column can be changed by the user | on | +| =colname_align= | (per column option) alignment of the data in the cell | left | +| =colname_width= | (per column option) width of this column in pixel | | +| =colname_search= | (per column option) toggle on/off if this column is searchable or not | on | + +---++ Special columns + +Normnally, the data and the way it is displayed in a GRID is specified by the !DataForm definition the GRID expression points to. +However, there's a set of additional properties of a topic that can be displayed in a GRID. These are specified in the =columns= +parameter to %GRID and are mapped to the actual property as follows: + +| *Colname* | *Data* | *Displayed* | +| Topic | topic name | link to topic | +| Modified, Changed | time when the topic has been changed recently | standard date format | +| By, Author | author of the last modification | link to author's homepage | +| Image, Photo | formfields of that name | displayed as html <img> tag where the data is used as src link || + +When [[Foswiki:Extensions/FlexFormPlugin][FlexFormPlugin]] is installed, each cell is rendered using +=%RENDERFORDISPLAY= expression. + +When [[Foswiki:Extesions/ImagePlugin][ImagePlugin]] is installed, each Image/Photo cell is renderd using an +=%IMAGE= expression to render thumbnails. + +%RED% +WARNING: This part is still in flux and solved rather adhoc for now. +The way how to specify which data is displayed in which way per column is still +subject to further changes. +%ENDCOLOR% ---++ Examples %GRID{ form="System.UserForm" web="%USERSWEB%" columns="Topic,FirstName,LastName,Organization,Country,Telephone" - rows="30" filterbar="on" rownumbers="on" width="auto" @@ -37,6 +92,10 @@ Version: 3.6.3 | Release: | %$RELEASE% | | Version: | %$VERSION% | | Change History: |   | +| 26 May 2010: | fixed loading locales; \ + improved grid construction process; \ + added field-specific options (title, resizable, align, width, search); \ + ongoing work on colmodel | | 26 Mar 2010: | initial release, externalized from Foswiki:Extensions/JQueryPlugin | | Dependencies: | %$DEPENDENCIES% | | Home: | Foswiki:Extensions/%TOPIC% | diff --git a/lib/Foswiki/Plugins/JQGridPlugin.pm b/lib/Foswiki/Plugins/JQGridPlugin.pm index be9d077..9313aa5 100644 --- a/lib/Foswiki/Plugins/JQGridPlugin.pm +++ b/lib/Foswiki/Plugins/JQGridPlugin.pm @@ -17,7 +17,7 @@ use strict; use warnings; our $VERSION = '$Rev$'; -our $RELEASE = '0.1'; +our $RELEASE = '0.2'; our $SHORTDESCRIPTION = 'jQuery grid widget for Foswiki'; our $NO_PREFS_IN_TOPIC = 1; diff --git a/lib/Foswiki/Plugins/JQGridPlugin/GRID.pm b/lib/Foswiki/Plugins/JQGridPlugin/GRID.pm index 0ceb2d8..29e3db4 100644 --- a/lib/Foswiki/Plugins/JQGridPlugin/GRID.pm +++ b/lib/Foswiki/Plugins/JQGridPlugin/GRID.pm @@ -54,15 +54,22 @@ sub new { author => 'Tony Tomov', homepage => 'http://www.trirand.com/blog/', puburl => '%PUBURLPATH%/%SYSTEMWEB%/JQGridPlugin', - javascript => ['jquery.jqgrid.js', 'jquery.jqgrid.init.js', 'jquery.fmatter.js'], + javascript => ['jquery.jqgrid.js', 'jquery.jqgrid.init.js'], css => ['css/jquery.jqgrid.css'], - dependencies => ['ui', 'metadata', 'livequery', 'JQUERYPLUGIN::THEME', 'JQGRIDPLUGIN::LANG'], + dependencies => ['ui', 'metadata', 'livequery', 'JQUERYPLUGIN::THEME', 'JQUERYPLUGIN::GRID::LANG'], ), $class); $this->{fieldNameMap} = { - 'topic' => 'Topic', 'Topic' => 'topic', - 'info.date' => 'Modified', 'Modified' => 'info.date', - 'info.author' => 'Changed By', 'Changed By' => 'info.author', + 'topic' => 'Topic', + 'Topic' => 'topic', + 'info.date' => 'Modified', + 'Modified' => 'info.date', + 'info.date' => 'Changed', + 'Changed' => 'info.date', + 'info.author' => 'By', + 'By' => 'info.author', + 'info.author' => 'Author', + 'Author' => 'info.author', }; return $this; @@ -83,13 +90,12 @@ sub init { # open matching localization file if it exists my $langTag = $this->{session}->i18n->language(); - my $localePrefix = 'i18n'; - my $localePath = $localePrefix.'/grid.locale-'.$langTag.'.js'; - $localePath = $localePrefix.'/grid.locale-en.js' - unless -f $this->{puburl}.'/'.$localePath; + my $localeFile = 'i18n/grid.locale-'.$langTag.'.js'; + $localeFile = 'i18n/grid.locale-en.js' + unless -f $this->{puburl}.'/'.$localeFile; - my $header .= $this->renderJS($localePath); - Foswiki::Func::addToZone('body', "JQGRIDPLUGIN::LANG", $header, 'JQUERYPLUGIN::UI'); + my $header .= $this->renderJS($localeFile); + Foswiki::Func::addToZone('body', "JQUERYPLUGIN::GRID::LANG", $header); } =begin TML @@ -107,12 +113,10 @@ sub handleGrid { my $theWeb = $params->{web} || $web; my $theForm = $params->{form} || ''; my $theCols = $params->{columns}; - my $theTitles = $params->{titles}; my $theRows = $params->{rows} || 20; my $theRowNumbers = $params->{rownumbers} || 'off'; my $theInclude = $params->{include}; my $theExclude = $params->{exclude}; - my $theEditable = $params->{editable} || 'off'; my $theFilterbar = $params->{filterbar} || 'off'; my $theToolbar = $params->{toolbar} || 'off'; # navGrid my $theSort = $params->{sort}; @@ -125,23 +129,62 @@ sub handleGrid { my $theScroll = $params->{scroll} || 'off'; my $theRowList = $params->{rowlist} || '5, 10, 20, 30, 40, 50, 100'; + # SMELL: unused for now + #my $theEditable = $params->{editable} || 'off'; + # sanitize params $theRowNumbers = ($theRowNumbers eq 'on')?'true':'false'; my $gridId = "jqGrid".Foswiki::Plugins::JQueryPlugin::Plugins::getRandom(); my $pagerId = "jqGridPager".Foswiki::Plugins::JQueryPlugin::Plugins::getRandom(); - my $filterToolbar = ($theFilterbar eq 'on'?'.filterToolbar()':''); - my $navGrid = ($theToolbar eq 'on'?'.navGrid(\'#'.$pagerId.'\',{search:false})':''); + my $filterToolbar = ''; + if ($theFilterbar eq 'on') { + $filterToolbar = <<"HERE"; +myGrid.jqGrid('filterToolbar'); +HERE + } + my $navGrid = ''; + if ($theToolbar eq 'on') { + $navGrid = <<"HERE"; +myGrid.jqGrid('navGrid', '#$pagerId', { + search:false, + edit:false, + del:false, + refresh:false, + add:false +}); +myGrid.jqGrid('navButtonAdd', '#$pagerId', { + caption:'%MAKETEXT{"Clear"}%', + title:'%MAKETEXT{"Clear Search"}%', + buttonicon:'ui-icon-refresh', + onClickButton:function() { + myGrid[0].clearToolbar(); + } +}); +HERE + } + +# SMELL: parked code +# +# myGrid.jqGrid('navButtonAdd', '#$pagerId', { +# caption:'%MAKETEXT{"Search"}%', +# title:'%MAKETEXT{"Toggle Search"}%', +# buttonicon:'ui-icon-search', +# onClickButton:function() { +# myGrid[0].toggleToolbar(); +# } +# }); my $sortOrder = ($theReverse eq 'on'?'desc':'asc'); +# "foswiki_filtertoolbar:".($theFilterbar eq 'on'?'true':'false'), +# "foswiki_navgrid:".($theToolbar eq 'on'?'true':'false'), my @metadata = ( - "foswiki_filtertoolbar:".($theFilterbar eq 'on'?'true':'false'), - "foswiki_navgrid:".($theToolbar eq 'on'?'true':'false'), "rowNum:$theRows", "rowList:[$theRowList]", "sortorder: '$sortOrder'", "rownumbers: $theRowNumbers", + "cellLayout: 18", # SMELL: this is depending on the skin's css :( ); push @metadata, "pager:'$pagerId'" if $thePager eq 'on'; @@ -189,25 +232,54 @@ sub handleGrid { @selectedFields = grep {!/^($theExclude)$/} @selectedFields; } - my $colNames; - if ($theTitles) { - $colNames = "['".join("','", split(/\s*,\s*/, $theTitles))."']"; - } else { - $colNames = "['".join("','", @selectedFields)."']"; - } - push @metadata, "colNames: $colNames"; + # get model + my @colModels; + foreach my $fieldName (@selectedFields) { + + my @colModel; + push @colModel, "name:'$fieldName'"; + + # title + my $fieldTitle = $params->{$fieldName.'_title'}; + $fieldTitle = $fieldName unless defined $fieldTitle; + push @colModel, "label:'$fieldTitle'"; + + # resizable + my $fieldResizable = $params->{$fieldName.'_resizable'}; + $fieldResizable = 'on' unless defined $fieldResizable; + $fieldResizable = ($fieldResizable eq 'on')?'true':'false'; + push @colModel, "resizable:$fieldResizable"; + + # align + my $fieldAlign = $params->{$fieldName.'_align'}; + $fieldAlign = 'left' unless defined $fieldAlign; + push @colModel, "align:'$fieldAlign'"; + + # width + my $fieldWidth = $params->{$fieldName.'_width'}; + push @colModel, "width:$fieldWidth" if defined $fieldWidth; + + # search + my $fieldSearch = $params->{$fieldName.'_search'}; + $fieldSearch = 'on' unless defined $fieldSearch; + #$fieldSearch = 'false' if $this->column2FieldName($fieldName) eq 'info.date'; + $fieldSearch = 'false' if $this->column2FieldName($fieldName) =~ /Image|Photo|Icon/; + $fieldSearch = ($fieldSearch eq 'on')?'true':'false'; + push @colModel, "search:$fieldSearch"; + + # colmodel + push @colModels, '{ '.join(', ', @colModel).'}'; - my @colModel; - foreach my $fieldName (@selectedFields) { $theSort = $fieldName unless $theSort; - my $col = "{name:'".$fieldName."', index:'".$fieldName."'}"; - push @colModel, $col; } - push @metadata, 'colModel: ['.join(",\n", @colModel).']'; + push @metadata, 'colModel: ['.join(",\n", @colModels).']'; + + my $baseWeb = $this->{session}->{webName}; + my $baseTopic = $this->{session}->{topicName}; my $gridConnectorUrl = Foswiki::Func::getScriptUrl('JQGridPlugin', 'gridconnector', 'rest', - theweb=>$theWeb, - thetopic=>$topic, + topic=>$baseWeb.'.'.$baseTopic, + web=>$theWeb, query=>$theQuery, columns=>join(',', @selectedFields), ); @@ -218,9 +290,11 @@ sub handleGrid { my $metadata = '{'.join(",\n", @metadata)."}\n"; my $jsTemplate = <<"HERE"; - HERE @@ -260,7 +334,11 @@ sub restGridConnector { $fieldName = $this->column2FieldName($fieldName); foreach my $value (split(/\s*,\s*/, $values)) { - $query .= " AND lc($fieldName)=~lc('$value')"; + if ($value =~ /^-(.*)$/) { + $query .= " AND !(lc($fieldName)=~lc('$1'))"; + } else { + $query .= " AND lc($fieldName)=~lc('$value')"; + } } } @@ -269,8 +347,8 @@ sub restGridConnector { my $reverse = ($sord eq 'desc'?'on':'off'); - my $web = $request->param('theweb') || $this->{session}->{webName}; - my $topic = $request->param('thetopic') || $this->{session}->{topicName}; + my $web = $request->param('web') || $this->{session}->{webName}; + my $topic = $this->{session}->{topicName}; my $count = $this->count($web, $query); unless (defined $count) { @@ -399,22 +477,28 @@ sub search { foreach my $fieldName (@selectedFields) { my $cell = ''; $fieldName = $this->column2FieldName($fieldName); - if ($fieldName =~ /Image|Photo/) { + if ($fieldName eq 'Icon') { + $cell .= ''; + } elsif ($fieldName =~ /Image|Photo/) { if ($context->{ImagePluginEnabled}) { - $cell .= '$percntIMAGE{\"$expand('.$fieldName.')\" size=\"135\" type=\"plain\" warn=\"off\"}$percnt'; + $cell .= '$percntIMAGE{\"$expand('.$fieldName.')\" size=\"80\" type=\"plain\" warn=\"off\"}$percnt'; } else { - $cell .= ''; + $cell .= ''; } } elsif ($fieldName =~ /info.author/) { $cell .= '[[%USERSWEB%.$expand(info.author)][$expand(info.author)]]'; } elsif ($fieldName =~ /info.date|createdate/) { $cell .= '$formatTime('.$fieldName.')'; } elsif ($fieldName eq 'topic') { - $cell .= '[[$web.$topic][$topic]]'; + $cell .= '[[$web.$topic][$expand(topictitle or topic)]]'; } else { - $cell .= '$expand('.$fieldName.')'; + if ($context->{FlexFormPluginEnabled}) { + $cell .= '$percntRENDERFORDISPLAY{topic=\"$web.$topic\" field=\"'.$fieldName.'\" format=\"$value\"}$percnt'; + } else { + $cell .= '$expand('.$fieldName.')'; + } } - $tml .= ''."\n"; + $tml .= ''."\n"; # SMELL extra space behind cell needed to work around bug in Render::getRenderedVerision } $tml .= '"}%'; diff --git a/lib/Foswiki/Plugins/JQGridPlugin/MANIFEST b/lib/Foswiki/Plugins/JQGridPlugin/MANIFEST index 926c9fd..d80dc3c 100644 --- a/lib/Foswiki/Plugins/JQGridPlugin/MANIFEST +++ b/lib/Foswiki/Plugins/JQGridPlugin/MANIFEST @@ -111,7 +111,6 @@ pub/System/JQGridPlugin/i18n/Makefile 0644 pub/System/JQGridPlugin/jqDnR.js 0644 pub/System/JQGridPlugin/jqgriddocs.pdf 0644 pub/System/JQGridPlugin/jqModal.js 0644 -pub/System/JQGridPlugin/jquery.fmatter.js 0644 pub/System/JQGridPlugin/jquery.jqgrid.init.js 0644 pub/System/JQGridPlugin/jquery.jqgrid.init.js.gz 0644 pub/System/JQGridPlugin/jquery.jqgrid.init.uncompressed.js 0644 diff --git a/pub/System/JQGridPlugin/jquery.fmatter.js b/pub/System/JQGridPlugin/jquery.fmatter.js deleted file mode 100644 index b381d48..0000000 --- a/pub/System/JQGridPlugin/jquery.fmatter.js +++ /dev/null @@ -1,517 +0,0 @@ -/* -** - * formatter for values but most of the values if for jqGrid - * Some of this was inspired and based on how YUI does the table datagrid but in jQuery fashion - * we are trying to keep it as light as possible - * Joshua Burnett josh@9ci.com - * http://www.greenbill.com - * - * Changes from Tony Tomov tony@trirand.com - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * -**/ - -;(function($) { - $.fmatter = {}; - //opts can be id:row id for the row, rowdata:the data for the row, colmodel:the column model for this column - //example {id:1234,} - $.fn.fmatter = function(formatType, cellval, opts, rwd, act) { - //debug(this); - //debug(cellval); - // build main options before element iteration - opts = $.extend({}, $.jgrid.formatter, opts); - return fireFormatter(formatType,cellval, opts, rwd, act); - }; - $.fmatter.util = { - // Taken from YAHOO utils - NumberFormat : function(nData,opts) { - if(!isNumber(nData)) { - nData *= 1; - } - if(isNumber(nData)) { - var bNegative = (nData < 0); - var sOutput = nData + ""; - var sDecimalSeparator = (opts.decimalSeparator) ? opts.decimalSeparator : "."; - var nDotIndex; - if(isNumber(opts.decimalPlaces)) { - // Round to the correct decimal place - var nDecimalPlaces = opts.decimalPlaces; - var nDecimal = Math.pow(10, nDecimalPlaces); - sOutput = Math.round(nData*nDecimal)/nDecimal + ""; - nDotIndex = sOutput.lastIndexOf("."); - if(nDecimalPlaces > 0) { - // Add the decimal separator - if(nDotIndex < 0) { - sOutput += sDecimalSeparator; - nDotIndex = sOutput.length-1; - } - // Replace the "." - else if(sDecimalSeparator !== "."){ - sOutput = sOutput.replace(".",sDecimalSeparator); - } - // Add missing zeros - while((sOutput.length - 1 - nDotIndex) < nDecimalPlaces) { - sOutput += "0"; - } - } - } - if(opts.thousandsSeparator) { - var sThousandsSeparator = opts.thousandsSeparator; - nDotIndex = sOutput.lastIndexOf(sDecimalSeparator); - nDotIndex = (nDotIndex > -1) ? nDotIndex : sOutput.length; - var sNewOutput = sOutput.substring(nDotIndex); - var nCount = -1; - for (var i=nDotIndex; i>0; i--) { - nCount++; - if ((nCount%3 === 0) && (i !== nDotIndex) && (!bNegative || (i > 1))) { - sNewOutput = sThousandsSeparator + sNewOutput; - } - sNewOutput = sOutput.charAt(i-1) + sNewOutput; - } - sOutput = sNewOutput; - } - // Prepend prefix - sOutput = (opts.prefix) ? opts.prefix + sOutput : sOutput; - // Append suffix - sOutput = (opts.suffix) ? sOutput + opts.suffix : sOutput; - return sOutput; - - } else { - return nData; - } - }, - // Tony Tomov - // PHP implementation. Sorry not all options are supported. - // Feel free to add them if you want - DateFormat : function (format, date, newformat, opts) { - var token = /\\.|[dDjlNSwzWFmMntLoYyaABgGhHisueIOPTZcrU]/g, - timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, - timezoneClip = /[^-+\dA-Z]/g, - pad = function (value, length) { - value = String(value); - length = parseInt(length) || 2; - while (value.length < length) value = '0' + value; - return value; - }, - ts = {m : 1, d : 1, y : 1970, h : 0, i : 0, s : 0}, - timestamp=0, dM, k,hl, - dateFormat=["i18n"]; - // Internationalization strings - dateFormat["i18n"] = { - dayNames: opts.dayNames, - monthNames: opts.monthNames - }; - if( format in opts.masks ) format = opts.masks[format]; - date = date.split(/[\\\/:_;.\t\T\s-]/); - format = format.split(/[\\\/:_;.\t\T\s-]/); - // parsing for month names - for(k=0,hl=format.length;k 11){date[k] = dM+1-12;} - } - ts[format[k].toLowerCase()] = parseInt(date[k],10); - } - ts.m = parseInt(ts.m)-1; - var ty = ts.y; - if (ty >= 70 && ty <= 99) ts.y = 1900+ts.y; - else if (ty >=0 && ty <=69) ts.y= 2000+ts.y; - timestamp = new Date(ts.y, ts.m, ts.d, ts.h, ts.i, ts.s,0); - if( newformat in opts.masks ) { - newformat = opts.masks[newformat]; - } else if ( !newformat ) { - newformat = 'Y-m-d'; - } - var - G = timestamp.getHours(), - i = timestamp.getMinutes(), - j = timestamp.getDate(), - n = timestamp.getMonth() + 1, - o = timestamp.getTimezoneOffset(), - s = timestamp.getSeconds(), - u = timestamp.getMilliseconds(), - w = timestamp.getDay(), - Y = timestamp.getFullYear(), - N = (w + 6) % 7 + 1, - z = (new Date(Y, n - 1, j) - new Date(Y, 0, 1)) / 86400000, - flags = { - // Day - d: pad(j), - D: dateFormat.i18n.dayNames[w], - j: j, - l: dateFormat.i18n.dayNames[w + 7], - N: N, - S: opts.S(j), - //j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th', - w: w, - z: z, - // Week - W: N < 5 ? Math.floor((z + N - 1) / 7) + 1 : Math.floor((z + N - 1) / 7) || ((new Date(Y - 1, 0, 1).getDay() + 6) % 7 < 4 ? 53 : 52), - // Month - F: dateFormat.i18n.monthNames[n - 1 + 12], - m: pad(n), - M: dateFormat.i18n.monthNames[n - 1], - n: n, - t: '?', - // Year - L: '?', - o: '?', - Y: Y, - y: String(Y).substring(2), - // Time - a: G < 12 ? opts.AmPm[0] : opts.AmPm[1], - A: G < 12 ? opts.AmPm[2] : opts.AmPm[3], - B: '?', - g: G % 12 || 12, - G: G, - h: pad(G % 12 || 12), - H: pad(G), - i: pad(i), - s: pad(s), - u: u, - // Timezone - e: '?', - I: '?', - O: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), - P: '?', - T: (String(timestamp).match(timezone) || [""]).pop().replace(timezoneClip, ""), - Z: '?', - // Full Date/Time - c: '?', - r: '?', - U: Math.floor(timestamp / 1000) - }; - return newformat.replace(token, function ($0) { - return $0 in flags ? flags[$0] : $0.substring(1); - }); - } - }; - $.fn.fmatter.defaultFormat = function(cellval, opts) { - return (isValue(cellval) && cellval!=="" ) ? cellval : opts.defaultValue ? opts.defaultValue : " "; - }; - $.fn.fmatter.email = function(cellval, opts) { - if(!isEmpty(cellval)) { - return "" + cellval + ""; - }else { - return $.fn.fmatter.defaultFormat(cellval,opts ); - } - }; - $.fn.fmatter.checkbox =function(cval, opts) { - var op = $.extend({},opts.checkbox), ds; - if(!isUndefined(opts.colModel.formatoptions)) { - op = $.extend({},op,opts.colModel.formatoptions); - } - if(op.disabled===true) {ds = "disabled";} else {ds="";} - if(isEmpty(cval) || isUndefined(cval) ) cval = $.fn.fmatter.defaultFormat(cval,op); - cval=cval+""; cval=cval.toLowerCase(); - var bchk = cval.search(/(false|0|no|off)/i)<0 ? " checked='checked' " : ""; - return ""; - }, - $.fn.fmatter.link = function(cellval, opts) { - var op = {target:opts.target }; - var target = ""; - if(!isUndefined(opts.colModel.formatoptions)) { - op = $.extend({},op,opts.colModel.formatoptions); - } - if(op.target) {target = 'target=' + op.target;} - if(!isEmpty(cellval)) { - return "" + cellval + ""; - }else { - return $.fn.fmatter.defaultFormat(cellval,opts); - } - }; - $.fn.fmatter.showlink = function(cellval, opts) { - var op = {baseLinkUrl: opts.baseLinkUrl,showAction:opts.showAction, addParam: opts.addParam || "", target: opts.target, idName: opts.idName }, - target = ""; - if(!isUndefined(opts.colModel.formatoptions)) { - op = $.extend({},op,opts.colModel.formatoptions); - } - if(op.target) {target = 'target=' + op.target;} - idUrl = op.baseLinkUrl+op.showAction + '?'+ op.idName+'='+opts.rowId+op.addParam; - if(isString(cellval)) { //add this one even if its blank string - return "" + cellval + ""; - }else { - return $.fn.fmatter.defaultFormat(cellval,opts); - } - }; - $.fn.fmatter.integer = function(cellval, opts) { - var op = $.extend({},opts.integer); - if(!isUndefined(opts.colModel.formatoptions)) { - op = $.extend({},op,opts.colModel.formatoptions); - } - if(isEmpty(cellval)) { - return op.defaultValue; - } - return $.fmatter.util.NumberFormat(cellval,op); - }; - $.fn.fmatter.number = function (cellval, opts) { - var op = $.extend({},opts.number); - if(!isUndefined(opts.colModel.formatoptions)) { - op = $.extend({},op,opts.colModel.formatoptions); - } - if(isEmpty(cellval)) { - return op.defaultValue; - } - return $.fmatter.util.NumberFormat(cellval,op); - }; - $.fn.fmatter.currency = function (cellval, opts) { - var op = $.extend({},opts.currency); - if(!isUndefined(opts.colModel.formatoptions)) { - op = $.extend({},op,opts.colModel.formatoptions); - } - if(isEmpty(cellval)) { - return op.defaultValue; - } - return $.fmatter.util.NumberFormat(cellval,op); - }; - $.fn.fmatter.date = function (cellval, opts, rwd, act) { - var op = $.extend({},opts.date); - if(!isUndefined(opts.colModel.formatoptions)) { - op = $.extend({},op,opts.colModel.formatoptions); - } - if(!op.reformatAfterEdit && act=='edit'){ - return $.fn.fmatter.defaultFormat(cellval, opts); - } else if(!isEmpty(cellval)) { - return $.fmatter.util.DateFormat(op.srcformat,cellval,op.newformat,op); - } else { - return $.fn.fmatter.defaultFormat(cellval, opts); - } - }; - $.fn.fmatter.select = function (cellval,opts, rwd, act) { - // jqGrid specific - cellval = cellval + ""; - var oSelect = false, ret=[]; - if(!isUndefined(opts.colModel.editoptions)){ - oSelect= opts.colModel.editoptions.value; - } - if (oSelect) { - var msl = opts.colModel.editoptions.multiple === true ? true : false, - scell = [], sv; - if(msl) { scell = cellval.split(","); scell = $.map(scell,function(n){return $.trim(n);})} - if (isString(oSelect)) { - // mybe here we can use some caching with care ???? - var so = oSelect.split(";"), j=0; - for(var i=0; i 2 ) { - sv[1] = jQuery.map(sv,function(n,i){if(i>0)return n;}).join(":"); - } - if(msl) { - if(jQuery.inArray(sv[0],scell)>-1) { - ret[j] = sv[1]; - j++; - } - } else if($.trim(sv[0])==$.trim(cellval)) { - ret[0] = sv[1]; - break; - } - } - } else if(isObject(oSelect)) { - // this is quicker - if(msl) { - ret = jQuery.map(scell, function(n, i){ - return oSelect[n]; - }); - } else { - ret[0] = oSelect[cellval] || ""; - } - } - } - cellval = ret.join(", "); - return cellval == "" ? $.fn.fmatter.defaultFormat(cellval,opts) : cellval; - }; - $.fn.fmatter.rowactions = function(rid,gid,act,keys) { - switch(act) - { - case 'edit': - var restorerow = function() { - $(".ui-inline-edit, .ui-inline-del","#"+rid).show(); - $(".ui-inline-save, .ui-inline-cancel","#"+rid).hide(); - } - $('#'+gid).jqGrid('editRow',rid,keys,null,null,null,{oper:'edit'},restorerow,null,restorerow); - $(".ui-inline-edit, .ui-inline-del","#"+rid).hide(); - $(".ui-inline-save, .ui-inline-cancel","#"+rid).show(); - break; - case 'save': - $('#'+gid).jqGrid('saveRow',rid,null,null,{oper:'edit'}); - $(".ui-inline-edit, .ui-inline-del","#"+rid).show(); - $(".ui-inline-save, .ui-inline-cancel","#"+rid).hide(); - break; - case 'cancel' : - $('#'+gid).jqGrid('restoreRow',rid); - $(".ui-inline-edit, .ui-inline-del","#"+rid).show(); - $(".ui-inline-save, .ui-inline-cancel","#"+rid).hide(); - break; - } - }; - $.fn.fmatter.actions = function(cellval,opts, rwd) { - var op ={keys:false}; - if(!isUndefined(opts.colModel.formatoptions)) { - op = $.extend(op,opts.colModel.formatoptions); - } - var rowid = opts.rowId; - if(typeof(rowid) =='undefined' || isEmpty(rowid)) return ""; - var ocl = "onclick=$.fn.fmatter.rowactions('"+rowid+"','"+opts.gid+"','edit',"+op.keys+");" - var str = "
"; - ocl = "onclick=jQuery('#"+opts.gid+"').jqGrid('delGridRow','"+rowid+"');" - str = str+"
"; - ocl = "onclick=$.fn.fmatter.rowactions('"+rowid+"','"+opts.gid+"','save',false);" - str = str+""; - ocl = "onclick=$.fn.fmatter.rowactions('"+rowid+"','"+opts.gid+"','cancel',false);" - str = str+"
"; - return str; - }; - $.unformat = function (cellval,options,pos,cnt) { - // specific for jqGrid only - var ret, formatType = options.colModel.formatter, - op =options.colModel.formatoptions || {}, sep, - re = /([\.\*\_\'\(\)\{\}\+\?\\])/g; - unformatFunc = options.colModel.unformat||($.fn.fmatter[formatType] && $.fn.fmatter[formatType].unformat); - if(typeof unformatFunc !== 'undefined' && isFunction(unformatFunc) ) { - ret = unformatFunc($(cellval).text(), options, cellval); - } else if(typeof formatType !== 'undefined' && isString(formatType) ) { - var opts = $.jgrid.formatter || {}, stripTag; - switch(formatType) { - case 'integer' : - op = $.extend({},opts.integer,op); - sep = op.thousandsSeparator.replace(re,"\\$1"); - stripTag = new RegExp(sep, "g"); - ret = $(cellval).text().replace(stripTag,''); - break; - case 'number' : - op = $.extend({},opts.number,op); - sep = op.thousandsSeparator.replace(re,"\\$1"); - stripTag = new RegExp(sep, "g"); - ret = $(cellval).text().replace(stripTag,"").replace(op.decimalSeparator,'.'); - break; - case 'currency': - op = $.extend({},opts.currency,op); - sep = op.thousandsSeparator.replace(re,"\\$1"); - stripTag = new RegExp(sep, "g"); - ret = $(cellval).text().replace(stripTag,'').replace(op.decimalSeparator,'.').replace(op.prefix,'').replace(op.suffix,''); - break; - case 'checkbox': - var cbv = (options.colModel.editoptions) ? options.colModel.editoptions.value.split(":") : ["Yes","No"]; - ret = $('input',cellval).attr("checked") ? cbv[0] : cbv[1]; - break; - case 'select' : - ret = $.unformat.select(cellval,options,pos,cnt); - break; - case 'actions': - return ""; - default: - ret= $(cellval).text(); - } - } - return ret ? ret : cnt===true ? $(cellval).text() : $.jgrid.htmlDecode($(cellval).html()); - }; - $.unformat.select = function (cellval,options,pos,cnt) { - // Spacial case when we have local data and perform a sort - // cnt is set to true only in sortDataArray - var ret = []; - var cell = $(cellval).text(); - if(cnt==true) return cell; - var op = $.extend({},options.colModel.editoptions); - if(op.value){ - var oSelect = op.value, - msl = op.multiple === true ? true : false, - scell = [], sv; - if(msl) { scell = cell.split(","); scell = $.map(scell,function(n){return $.trim(n);})} - if (isString(oSelect)) { - var so = oSelect.split(";"), j=0; - for(var i=0; i-1) { - ret[j] = sv[0]; - j++; - } - } else if($.trim(sv[1])==$.trim(cell)) { - ret[0] = sv[0]; - break; - } - } - } else if(isObject(oSelect)) { - if(!msl) scell[0] = cell; - ret = jQuery.map(scell, function(n){ - var rv; - $.each(oSelect, function(i,val){ - if (val == n) { - rv = i; - return false; - } - }); - if( rv) return rv; - }); - } - return ret.join(", "); - } else { - return cell || ""; - } - }; - function fireFormatter(formatType,cellval, opts, rwd, act) { - var v=cellval; - - if ($.fn.fmatter[formatType]){ - v = $.fn.fmatter[formatType](cellval, opts, rwd, act); - } - - return v; - }; - //private methods and data - function debug($obj) { - if (window.console && window.console.log) window.console.log($obj); - }; - /** - * A convenience method for detecting a legitimate non-null value. - * Returns false for null/undefined/NaN, true for other values, - * including 0/false/'' - * --taken from the yui.lang - */ - isValue= function(o) { - return (isObject(o) || isString(o) || isNumber(o) || isBoolean(o)); - }; - isBoolean= function(o) { - return typeof o === 'boolean'; - }; - isNull= function(o) { - return o === null; - }; - isNumber= function(o) { - return typeof o === 'number' && isFinite(o); - }; - isString= function(o) { - return typeof o === 'string'; - }; - /** - * check if its empty trim it and replace \  and \  with '' and check if its empty ==="" - * if its is not a string but has a value then it returns false, Returns true for null/undefined/NaN - essentailly this provdes a way to see if it has any value to format for things like links - */ - isEmpty= function(o) { - if(!isString(o) && isValue(o)) { - return false; - }else if (!isValue(o)){ - return true; - } - o = $.trim(o).replace(/\ \;/ig,'').replace(/\ \;/ig,''); - return o===""; - - }; - isUndefined= function(o) { - return typeof o === 'undefined'; - }; - isObject= function(o) { - return (o && (typeof o === 'object' || isFunction(o))) || false; - }; - isFunction= function(o) { - return typeof o === 'function'; - }; - -})(jQuery); \ No newline at end of file