Procházet zdrojové kódy

render table cell values by field widget in TableAjax

Piotr Labudda před 10 roky
rodič
revize
54478628d2
1 změnil soubory, kde provedl 136 přidání a 45 odebrání
  1. 136 45
      SE/se-lib/TableAjax.php

+ 136 - 45
SE/se-lib/TableAjax.php

@@ -584,6 +584,8 @@ class TableAjax extends ViewAjax {
 
 		var _tableWidth;
 
+		var _fieldWidgets = {};
+
 		/*
 		 initialize the plugin.
 		 */
@@ -679,7 +681,7 @@ class TableAjax extends ViewAjax {
 
 			_foot = _head = _body = _headSort = _headFilter = undefined;// TODO: refactor
 			/// console.log('L.<?php echo __LINE__; ?> priv.initialRender, _uiNode$Table: ', _uiNode$Table.html())
-		}
+		};
 
 		/*
 		 creates the table with all its parts and handlers.
@@ -688,8 +690,8 @@ class TableAjax extends ViewAjax {
 		 */
 		priv.renderTable = function() {
 			//create table itself
-/// console.log('renderTable:: _data', _data);//TODO:DBG:RMME
-/// console.log('renderTable:: _uiNode$Table', _uiNode$Table);//TODO:DBG:RMME
+			/// console.log('renderTable:: _data', _data);//TODO:DBG:RMME
+			/// console.log('renderTable:: _uiNode$Table', _uiNode$Table);//TODO:DBG:RMME
 
 			//create the header which will later hold both sorting and filtering
 			/// console.log('L.<?php echo __LINE__; ?> renderTable:: _head', _head);//TODO:DBG:RMME
@@ -799,6 +801,120 @@ class TableAjax extends ViewAjax {
 			}
 		};
 
+		// TODO: priv.registerFieldWidget(typeName, fuction);
+		// TODO: priv.renderFieldWidget_InlineEdit = function(fldName, value) {}
+		// TODO: priv.renderFieldWidget_FormField = function(fldName, value) {}
+
+		// @usage: priv.renderFieldWidget_TableCell(fldName, val)
+		priv.renderFieldWidget_TableCell = function(fldName, value) {
+			var renderFieldAsTableCell = priv.getFieldWidget_TableCell(fldName);
+			if (!renderFieldAsTableCell) return null;
+			return renderFieldAsTableCell(value);
+		}
+
+		priv.getFieldWidget_TableCell = function(fldName) {
+			var fieldProps = _data.cols[fldName],
+					renderFieldAsTableCell = null;
+			if (!fieldProps) return null;
+			renderFieldAsTableCell = _.get(_fieldWidgets, fldName);
+			if (renderFieldAsTableCell) return renderFieldAsTableCell;
+			switch (fieldProps.type) {
+				case "date":// @return Element - TODO: not used yet
+					renderFieldAsTableCell = _fieldWidgets[fldName] = (function(fldName, fieldProps) {
+						var _fieldName = fldName,
+								_fieldProps = fieldProps;
+						//console.log('FieldWidget: generate function to render field('+_fieldName+') ', fieldProps);
+						return function(val) {
+							//console.log('FieldWidget: run function to render field('+_fieldName+') with value('+val+') ', fieldProps);
+							return val;
+						}
+					}(fldName, fieldProps));
+					break;
+				case "bool":// @return Element - TODO: not used yet
+					renderFieldAsTableCell = _fieldWidgets[fldName] = (function(fldName, fieldProps) {
+						var _fieldName = fldName,
+								_fieldProps = fieldProps;
+						//console.log('FieldWidget: generate function to render field('+_fieldName+') ', fieldProps);
+						return function(val) {
+							//console.log('FieldWidget: run function to render field('+_fieldName+') with value('+val+') ', fieldProps);
+							fldNode = document.createElement('input');
+							fldNode.setAttribute('type', 'checkbox');
+							if (val) fldNode.setAttribute('checked', 'checked');
+							fldNode.setAttribute('disabled', 'disabled');
+							fldNode.appendChild(document.createTextNode(val));
+							return fldNode;
+						}
+					}(fldName, fieldProps));
+					break;
+				case "number":// @return String - TODO: not used yet
+					renderFieldAsTableCell = _fieldWidgets[fldName] = (function(fldName, fieldProps) {
+						var _fieldName = fldName,
+								_fieldProps = fieldProps,
+								_fractionDigits = _.get(_fieldProps, 'fractionDigits', 2);
+						//console.log('FieldWidget: generate function to render field('+_fieldName+') _fractionDigits('+_fractionDigits+')', fieldProps);
+						return function(val) {
+							//console.log('FieldWidget: run function to render field('+_fieldName+') with value('+val+') ', fieldProps);
+							// enumeration
+							// fractionDigits
+							// maxExclusive
+							// maxInclusive
+							// minExclusive
+							// minInclusive
+							// pattern
+							// totalDigits
+							// whiteSpace
+							val = Number(val);
+							return ((val || 0) % 1 === 0)? val : val.toFixed(_fractionDigits);
+						}
+					}(fldName, fieldProps));
+					break;
+				case "string":// @return String
+					renderFieldAsTableCell = _fieldWidgets[fldName] = (function(fldName, fieldProps) {
+						var _fieldName = fldName,
+								_fieldProps = fieldProps,
+								_format = _fieldProps.format || '{0}';
+						//console.log('FieldWidget: generate function to render field('+_fieldName+') ', fieldProps);
+						return function(val) {
+							//console.log('FieldWidget: run function to render field('+_fieldName+') with value('+val+') ', fieldProps);
+							return _format.f(val);
+						}
+					}(fldName, fieldProps));
+					break;
+				case "p5:www_link":// @return Element
+					renderFieldAsTableCell = _fieldWidgets[fldName] = (function(fldName, fieldProps) {
+						var _fieldName = fldName,
+								_fieldProps = fieldProps;
+						// console.log('FieldWidget: generate function to render field('+_fieldName+') ', fieldProps);
+						return function(val) {
+							// console.log('FieldWidget: run function to render field('+_fieldName+') with value('+val+') ', fieldProps);
+							var link = '',
+									linkPrefix = '',
+									a = null,
+									dbg = false;
+							if (!val.length) return '';
+							var linkPrefix = '';
+							if ('http' == val.substr(0, 4)) linkPrefix = '';
+							//else if ('ftp' == val.substr(0, 3))
+							else linkPrefix = 'http://';
+							link = linkPrefix + val;
+
+							var linkErrors = validate({www_link: link}, {www_link: {url: true}});
+							if (linkErrors) {
+								// if(dbg)console.log('linkErrors for (' + link +')', linkErrors);
+								return '';
+							}
+							fldNode = document.createElement('a');
+							fldNode.setAttribute('href', link);
+							fldNode.setAttribute('target', '_blank');
+							fldNode.appendChild(document.createTextNode(val));
+							return fldNode;
+						}
+					}(fldName, fieldProps));
+					break;
+			}
+			return renderFieldAsTableCell;
+		};
+
 		priv.renderRow = function(props) {
 			var rowNode = $('<tr></tr>'),
 					uniqueColName = _state.uniqueCol,
@@ -850,44 +966,22 @@ class TableAjax extends ViewAjax {
 				cellNode.data('column', columnName);
 				if (val === undefined) continue;
 
-				format = props[columnName + 'Format'] || columnProps.format || '{0}';
+				// test use field widgets
+				var fldWidgetNode = priv.renderFieldWidget_TableCell(columnName, val);
+				if (fldWidgetNode) {
+					cellNode.empty();
+					cellNode.append(fldWidgetNode);
+				} else if (fldWidgetNode === '') {
+					cellNode.empty();
+				}
+				else {
+
+				format = columnProps.format || '{0}';
 				showTooltip = true;
-				switch (columnProps.type) {
+				switch (columnProps.type) {// TODO: used is only: string(default), geom, special, simpleLink
 					case "string":
 						cellCnt.html(format.f(val));
 						break;
-					case "p5:www_link":// TODO: P5Type('www_link', columnProps.restrictions).renderTableCell(val)
-						if (val.length > 0) {
-							var linkPrefix = '';
-							if ('http' == val.substr(0, 4)) linkPrefix = '';
-							//else if ('ftp' == val.substr(0, 3))
-							else linkPrefix = 'http://';
-
-							var linkErrors = validate({www_link: linkPrefix + val}, {www_link: {url: true}});
-							if (!linkErrors) {
-								format = '<a href="' + linkPrefix + '{0}" target="_blank">{0}</a>';
-							} else {
-								if(dbg)console.log('linkErrors for (' + (linkPrefix + val) +')', linkErrors);
-							}
-						}
-						cellCnt.html(format.f(val));
-						break;
-					case "number":
-						val = Number(val);
-						var forceDecimals = !isNaN(columnProps.decimals);
-						if (forceDecimals) cellCnt.html(format.f(val.toFixed(columnProps.decimals)));
-						else {
-							(val || 0) % 1 === 0
-								? cellCnt.html(format.f(val))
-								: cellCnt.html(format.f(val.toFixed(priv.options.types.number.decimals || 2)));
-					}
-						break;
-					case "date":
-						cellCnt.html(format.f(val));
-						break;
-					case "bool":
-						$('<input type="checkbox" {0} disabled />'.f(val ? "checked" : "")).appendTo(cellCnt);
-						break;
 					case "special":
 						cellCnt.html(format.f(val));
 						break;
@@ -990,6 +1084,8 @@ class TableAjax extends ViewAjax {
 						break;
 				}
 
+				}// test fld widgets
+
 				if (columnProps._tsRetId) {
 					showTooltip = false;
 					if (columnProps._tsRetId > 0) {
@@ -2865,8 +2961,7 @@ class TableAjax extends ViewAjax {
 					type: 'GET',
 					dataType: 'json',
 					success: function(data) {
-						var content = '';
-						if (data && data.simpleType && 'p5:www_link' == data.simpleType) {
+						if ('p5:www_link' == _.get(data, 'simpleType')) {
 							inlineEditBox$Node.find('.inlineEditBox-cnt').empty();
 							var label = jQuery('<label>');// for="' + data.htmlFieldName + '">');// "<label for="f22579" class="AjaxTableEdit-label"> ... </label>
 							label.attr('for', data.htmlFieldName);
@@ -2883,11 +2978,7 @@ class TableAjax extends ViewAjax {
 							frmItem.attr('class', 'form-control');
 							frmItem.insertAfter(label);
 						} else {
-							if (data && data.legacy_html) {
-								content = data.legacy_html;
-							} else {
-								content = 'Nieznany błąd';
-							}
+							var content = _.get(data, 'legacy_html', "Nieznany błąd");
 							inlineEditBox$Node.find('.inlineEditBox-cnt').html(content);
 						}
 						inlineEditBox$Node.find('.btn-save').show();
@@ -2949,7 +3040,7 @@ class TableAjax extends ViewAjax {
 				contentType: "application/json; charset=utf-8",
 				data: '',
 				success: function(req){
-					if (req.data && req.data.tbl_id > 0) {
+					if (_.get(req, 'data.tbl_id') > 0) {
 						var addHtml = '';
 						for(var i in req.data.items){
 							var url = 'index.php?MENU_INIT=VIEWTABLE_AJAX';