Просмотр исходного кода

render table cell values only by field widget in TableAjax

Piotr Labudda 10 лет назад
Родитель
Сommit
5e49156779
1 измененных файлов с 185 добавлено и 158 удалено
  1. 185 158
      SE/se-lib/TableAjax.php

+ 185 - 158
SE/se-lib/TableAjax.php

@@ -801,42 +801,37 @@ 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) {
+		// @usage: priv.renderFieldWidget_TableCell(fldName, val, rowPK, row)
+		priv.renderFieldWidget_TableCell = function(fldName, value, rowPK, row) {
 			var renderFieldAsTableCell = priv.getFieldWidget_TableCell(fldName);
 			if (!renderFieldAsTableCell) return null;
-			return renderFieldAsTableCell(value);
-		}
+			return renderFieldAsTableCell(value, rowPK, row);
+		};
 
-		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) {
+		priv.registerFieldWidget = function(type, fldName, fieldProps) {
+			var fieldWidget = null;
+			switch (type) {
 				case "date":// @return Element - TODO: not used yet
-					renderFieldAsTableCell = _fieldWidgets[fldName] = (function(fldName, fieldProps) {
+					fieldWidget = (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);
+						// console.log('FieldWidget: generate function to render field('+_fieldName+') ', fieldProps);
+						return function(val, fieldPK, row) {
+							// console.log('FieldWidget: pk('+fieldPK+') 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) {
+					fieldWidget = (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);
+						// console.log('FieldWidget: generate function to render field('+_fieldName+') ', fieldProps);
+						return function(val, fieldPK, row) {
+							// console.log('FieldWidget: pk('+fieldPK+') run function to render field('+_fieldName+') with value('+val+') ', fieldProps);
 							fldNode = document.createElement('input');
 							fldNode.setAttribute('type', 'checkbox');
 							if (val) fldNode.setAttribute('checked', 'checked');
@@ -847,13 +842,13 @@ class TableAjax extends ViewAjax {
 					}(fldName, fieldProps));
 					break;
 				case "number":// @return String - TODO: not used yet
-					renderFieldAsTableCell = _fieldWidgets[fldName] = (function(fldName, fieldProps) {
+					fieldWidget = (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);
+						// console.log('FieldWidget: generate function to render field('+_fieldName+') _fractionDigits('+_fractionDigits+')', fieldProps);
+						return function(val, fieldPK, row) {
+							// console.log('FieldWidget: pk('+fieldPK+') run function to render field('+_fieldName+') with value('+val+') ', fieldProps);
 							// enumeration
 							// fractionDigits
 							// maxExclusive
@@ -869,24 +864,24 @@ class TableAjax extends ViewAjax {
 					}(fldName, fieldProps));
 					break;
 				case "string":// @return String
-					renderFieldAsTableCell = _fieldWidgets[fldName] = (function(fldName, fieldProps) {
+					fieldWidget = (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);
+								_format = _.get(_fieldProps, 'format', '{0}');
+						// console.log('FieldWidget: generate function to render field('+_fieldName+') ', fieldProps);
+						return function(val, fieldPK, row) {
+							// console.log('FieldWidget: pk('+fieldPK+') 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) {
+					fieldWidget = (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);
+						//  console.log('FieldWidget: generate function to render field('+_fieldName+') ', fieldProps);
+						return function(val, fieldPK, row) {
+							//  console.log('FieldWidget: pk('+fieldPK+') run function to render field('+_fieldName+') with value('+val+') ', fieldProps);
 							var link = '',
 									linkPrefix = '',
 									a = null,
@@ -911,7 +906,152 @@ class TableAjax extends ViewAjax {
 						}
 					}(fldName, fieldProps));
 					break;
+				case "special":
+					fieldWidget = (function(fldName, fieldProps) {
+						var _fieldName = fldName,
+								_fieldProps = fieldProps,
+								_format = _.get(_fieldProps, 'format', '{0}');
+						// console.log('FieldWidget: generate function to render field('+_fieldName+') ', fieldProps);
+						return function(val, fieldPK, row) {
+							// console.log('FieldWidget: pk('+fieldPK+') run function to render field('+_fieldName+') with value('+val+') ', fieldProps);
+							return _format.f(val);
+						}
+					}(fldName, fieldProps));
+					break;
+				case "simpleLink":
+					fieldWidget = (function(fldName, fieldProps) {
+						var _fieldName = fldName,
+								_fieldProps = fieldProps,
+								_format = _.get(_fieldProps, 'format', '{0}');
+						// console.log('FieldWidget: generate function to render field('+_fieldName+') ', fieldProps);
+						return function(val, fieldPK, row) {
+							// console.log('FieldWidget: pk('+fieldPK+') run function to render field('+_fieldName+') with value('+val+') ', fieldProps);
+							var valLink = String(val);
+							if (undefined !== _fieldProps._tsRetId
+									&& (0 === _fieldProps._tsRetId || '0' === _fieldProps._tsRetId)
+									&& undefined !== _fieldProps._tsSimpleLink) {
+								valLink = _fieldProps._tsSimpleLink.format;
+								$.each(_fieldProps._tsSimpleLink.aliasMap, function(i, v) {
+									//console.log('simpleLink aliasMap columnName:', columnName, 'i:', i, 'v:', v, 'props['+v+']', props[v], 'val', val, 'typeof val', typeof val);
+									if (undefined !== row[v]) {
+										valLink = valLink.replace(new RegExp('\{' + i + '\}', 'g'), row[v]);
+									}
+								});
+							}
+							return _format.f(valLink);
+						}
+					}(fldName, fieldProps));
+					break;
+				case "geom":
+					fieldWidget = (function(fldName, fieldProps) {
+						var _fieldName = fldName,
+								_fieldProps = fieldProps,
+								_format = _.get(_fieldProps, 'format', '{0}');
+						// console.log('FieldWidget: generate function to render field('+_fieldName+') ', fieldProps);
+						return function(val, fieldPK, row) {
+							// console.log('FieldWidget: run function to render field('+_fieldName+') with value('+val+') ', fieldProps);
+							// console.log('FieldWidget: test priv', priv);
+							var node = jQuery('<span></span>');
+							node.TableAjaxGeomField({
+								recordID: fieldPK,
+								fieldValue: val,
+								hasValueClassName: 'cell-mapfld-hasValue',
+								//removeUrl: 'index-ajax.php?_zasobID=<?php echo $this->_zasobID; ?>&_cls=<?php echo __CLASS__; ?>&_hash=<?php echo $this->_htmlID; ?>&_task=THE_GEOM_REMOVE&ID=' + rowPK,
+								linkClassNamePrefix: 'cell-mapfld',
+								linkSelectClassName: 'select',
+								linkSelectAddClassNames: 'glyphicon glyphicon-map-marker',
+								linkRemoveClassName: 'remove',
+								linkRemoveAddClassNames: 'glyphicon glyphicon-remove',
+								onSelect: function(recordID, geomShape) {
+									if (priv.options.debug) console.log('recordID:', recordID, 'geomShape:', geomShape);
+									priv.mapEditorShow();
+									_mapEditor.TableAjaxMapSelectRecord(recordID, geomShape);
+								},
+								onRemove: function(geomField, recordID, geomShape) {
+									if (confirm('Czy usunąć obiekt z mapy dla rekordu ' + recordID + '?')) {
+										if (!recordID) return;
+
+										var selectedRecordId = recordID;
+										function notifyAjaxCallback(data) {
+											var notify = {};
+											notify.type = (data && data.type)? data.type : '';
+											notify.msg = (data && data.msg)? data.msg : '';
+											switch (notify.type) {
+												case 'success':
+													if (!notify.msg) notify.msg = 'Usunięto obiekt z mapy dla rekordu ' + selectedRecordId;
+													break;
+												case 'info':
+													if (!notify.msg) notify.msg = 'Rekord nie był powiązany z żadnym obiektem na mapie';
+													break;
+												case 'error':
+													if (!notify.msg) notify.msg = 'Wystąpiły błędy';
+													break;
+												case 'warning':
+													notify.type = 'warn';
+													if (!notify.msg) notify.msg = 'Wystąpiły błędy';
+													break;
+												default:
+													notify.msg = 'Nieznany błąd';
+													if (data && data.errorCode) notify.msg += ' ' + data.errorCode;
+													notify.type = '';
+											}
+											jQuery.notify(notify.msg, notify.type);
+										}
+										$.ajax({
+											data: {},
+											dataType: 'json',
+											type: "POST",
+											url: 'index-ajax.php?_zasobID=<?php echo $this->_zasobID; ?>&_cls=<?php echo __CLASS__; ?>&_hash=<?php echo $this->_htmlID; ?>&_task=THE_GEOM_REMOVE&ID=' + recordID
+										})
+										.done(function(data, textStatus, jqXHR){
+											notifyAjaxCallback(data);
+											if (priv.options.debug) console.log('data.record.the_geom:', data.record.the_geom);
+											if (data && data.record && data.record.the_geom) {
+												if (priv.options.debug) console.log('data.record.the_geom:2:', data.record.the_geom);
+												geomField.setValue(data.record.the_geom);
+											}
+											else if (data && data.record) {
+												if (priv.options.debug) console.log('data.record.the_geom:2:', data.record.the_geom);
+												geomField.setValue(data.record.the_geom);
+											}
+											_mapEditor.TableAjaxMapRefresh();
+										})
+										.fail(function(jqXHR){// jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});
+											if (jqXHR.responseJSON) {
+												notifyAjaxCallback(jqXHR.responseJSON);
+											}
+											else {
+												var txt = jqXHR.responseText || 'Wystąpiły błędy';
+												if (jqXHR.status == 404) {
+													jQuery.notify(jqXHR.responseText, 'error');
+												} else {
+													jQuery.notify(jqXHR.responseText, 'warn');
+												}
+											}
+										});
+									}
+								}
+							});
+							return node;
+						}
+					}(fldName, fieldProps));
+					break;
 			}
+			_fieldWidgets[fldName] = fieldWidget;
+		};
+
+		priv.getFieldWidget_TableCell = function(fieldName) {
+			var props = _data.cols[fieldName],
+					type = null,
+					renderFieldAsTableCell = null;
+			if (!props) return null;
+			type = _.get(props, 'type');
+			if (!type) type = 'string';// TODO: throw Exception? / default string
+			renderFieldAsTableCell = _.get(_fieldWidgets, fieldName);
+			if (renderFieldAsTableCell) return renderFieldAsTableCell;
+			priv.registerFieldWidget(type, fieldName, props);
+			renderFieldAsTableCell = _.get(_fieldWidgets, fieldName);
+			if (!renderFieldAsTableCell) throw "Field type '" + type + "' not implemented";
 			return renderFieldAsTableCell;
 		};
 
@@ -920,6 +1060,7 @@ class TableAjax extends ViewAjax {
 					uniqueColName = _state.uniqueCol,
 					rowPK = (uniqueColName in props)? props[uniqueColName] : null,
 					cellNode,
+					columnName, columnProps, val, cellCnt, format, showTooltip, fldWidgetNode,
 					dbg = priv.options.debug
 			;
 
@@ -941,149 +1082,35 @@ class TableAjax extends ViewAjax {
 
 			//create cells
 			for (var i = 0; i < _state.colsSorted.length; i++) {
-				var columnName = _state.colsSorted[i],
-						columnProps = _data.cols[columnName],
-						val = '',
-						cellNode,
-						cellCnt,
-						format,
-						showTooltip = true
-				;
+				columnName = _state.colsSorted[i];
+				columnProps = _data.cols[columnName];
+				val = '';
 				if (!columnProps) continue;
 				if (columnProps.hidden) continue;// TODO: "unique" is hidden
 
 				val = props[columnName];
 				cellNode = $('<td></td>').appendTo(rowNode);
-				if (columnName !== uniqueColName) {
-					cellNode.on('dblclick', {id:rowPK, col:columnName}, priv.rowDblClicked);
-				}
-				if (i == 1) {// primaryKey(ID)
-					cellCnt = $('<div></div>').appendTo(cellNode);// fix dblclick for copy
-					cellNode.addClass('stickyCol2');
-				} else {
-					cellCnt = $('<span></span>').appendTo(cellNode);
-				}
+				if (i === 1) cellNode.addClass('stickyCol2');// primaryKey(ID)
+				if (i !== 1) cellNode.on('dblclick', {id:rowPK, col:columnName}, priv.rowDblClicked);
+				cellCnt = (i === 1)? '<div></div>' : '<span></span>';
+				cellCnt = $(cellCnt).appendTo(cellNode);// fix dblclick for copy
+
 				cellNode.data('column', columnName);
 				if (val === undefined) continue;
 
 				format = _.get(columnProps, 'format', '{0}');
 
 				// test use field widgets
-				var fldWidgetNode = priv.renderFieldWidget_TableCell(columnName, val);
+				fldWidgetNode = priv.renderFieldWidget_TableCell(columnName, val, rowPK, props);
 				if (fldWidgetNode) {
 					cellCnt.empty();
+					// console.log('FieldWidget: row.pk('+rowPK+') col('+columnName+') typeof fldWidgetNode', typeof fldWidgetNode, fldWidgetNode);
 					cellCnt.append(fldWidgetNode);
 				} else if (fldWidgetNode === '') {
 					cellCnt.empty();
 				}
 				else {
-
-				switch (columnProps.type) {// TODO: used is only: string(default), geom, special, simpleLink
-					case "string":
-						cellCnt.html(format.f(val));
-						break;
-					case "special":
-						cellCnt.html(format.f(val));
-						break;
-					case "simpleLink":
-						var valLink = String(val);
-						if (undefined !== columnProps._tsRetId
-								&& (0 === columnProps._tsRetId || '0' === columnProps._tsRetId)
-								&& undefined !== columnProps._tsSimpleLink) {
-							valLink = columnProps._tsSimpleLink.format;
-							$.each(columnProps._tsSimpleLink.aliasMap, function(i, v) {
-								//console.log('simpleLink aliasMap columnName:', columnName, 'i:', i, 'v:', v, 'props['+v+']', props[v], 'val', val, 'typeof val', typeof val);
-								if (undefined !== props[v]) {
-									valLink = valLink.replace(new RegExp('\{' + i + '\}', 'g'), props[v]);
-								}
-							});
-						}
-						cellCnt.html(format.f(valLink));
-						break;
-					case "geom":
-						cellCnt.TableAjaxGeomField({
-							recordID: rowPK,
-							fieldValue: val,
-							hasValueClassName: 'cell-mapfld-hasValue',
-							//removeUrl: 'index-ajax.php?_zasobID=<?php echo $this->_zasobID; ?>&_cls=<?php echo __CLASS__; ?>&_hash=<?php echo $this->_htmlID; ?>&_task=THE_GEOM_REMOVE&ID=' + rowPK,
-							linkClassNamePrefix: 'cell-mapfld',
-							linkSelectClassName: 'select',
-							linkSelectAddClassNames: 'glyphicon glyphicon-map-marker',
-							linkRemoveClassName: 'remove',
-							linkRemoveAddClassNames: 'glyphicon glyphicon-remove',
-							onSelect: function(recordID, geomShape) {
-								if (priv.options.debug) console.log('recordID:', recordID, 'geomShape:', geomShape);
-								priv.mapEditorShow();
-								_mapEditor.TableAjaxMapSelectRecord(recordID, geomShape);
-							},
-							onRemove: function(geomField, recordID, geomShape) {
-								if (confirm('Czy usunąć obiekt z mapy dla rekordu ' + recordID + '?')) {
-									if (!recordID) return;
-
-									var selectedRecordId = recordID;
-									function notifyAjaxCallback(data) {
-										var notify = {};
-										notify.type = (data && data.type)? data.type : '';
-										notify.msg = (data && data.msg)? data.msg : '';
-										switch (notify.type) {
-											case 'success':
-												if (!notify.msg) notify.msg = 'Usunięto obiekt z mapy dla rekordu ' + selectedRecordId;
-												break;
-											case 'info':
-												if (!notify.msg) notify.msg = 'Rekord nie był powiązany z żadnym obiektem na mapie';
-												break;
-											case 'error':
-												if (!notify.msg) notify.msg = 'Wystąpiły błędy';
-												break;
-											case 'warning':
-												notify.type = 'warn';
-												if (!notify.msg) notify.msg = 'Wystąpiły błędy';
-												break;
-											default:
-												notify.msg = 'Nieznany błąd';
-												if (data && data.errorCode) notify.msg += ' ' + data.errorCode;
-												notify.type = '';
-										}
-										jQuery.notify(notify.msg, notify.type);
-									}
-									$.ajax({
-										data: {},
-										dataType: 'json',
-										type: "POST",
-										url: 'index-ajax.php?_zasobID=<?php echo $this->_zasobID; ?>&_cls=<?php echo __CLASS__; ?>&_hash=<?php echo $this->_htmlID; ?>&_task=THE_GEOM_REMOVE&ID=' + recordID
-									})
-									.done(function(data, textStatus, jqXHR){
-										notifyAjaxCallback(data);
-										if (priv.options.debug) console.log('data.record.the_geom:', data.record.the_geom);
-										if (data && data.record && data.record.the_geom) {
-											if (priv.options.debug) console.log('data.record.the_geom:2:', data.record.the_geom);
-											geomField.setValue(data.record.the_geom);
-										}
-										else if (data && data.record) {
-											if (priv.options.debug) console.log('data.record.the_geom:2:', data.record.the_geom);
-											geomField.setValue(data.record.the_geom);
-										}
-										_mapEditor.TableAjaxMapRefresh();
-									})
-									.fail(function(jqXHR){// jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});
-										if (jqXHR.responseJSON) {
-											notifyAjaxCallback(jqXHR.responseJSON);
-										}
-										else {
-											var txt = jqXHR.responseText || 'Wystąpiły błędy';
-											if (jqXHR.status == 404) {
-												jQuery.notify(jqXHR.responseText, 'error');
-											} else {
-												jQuery.notify(jqXHR.responseText, 'warn');
-											}
-										}
-									});
-								}
-							}
-						});
-						break;
-				}
-
+					console.log('TODO: !FieldWidget for row.pk('+rowPK+') col('+columnName+') typeof fldWidgetNode(' + (typeof fldWidgetNode) + ')');
 				}// test fld widgets
 
 				if (columnProps._tsRetId) {