Prechádzať zdrojové kódy

added test simpleType widget - www_link

Piotr Labudda 10 rokov pred
rodič
commit
56958ac1aa

+ 19 - 0
SE/schema/gui/company/biuro_biall_net_pl/default_db.test_perms.php

@@ -0,0 +1,19 @@
+<?php
+
+class Schema_biuro_biall_net_pl_default_db_test_perms {
+
+	public function fixTypes($types) {
+		foreach ($types as $fldName => $type) {
+			switch ($fldName) {
+				case 'WWW': {
+					$types[$fldName]['simpleType'] = 'p5:www_link';
+				} break;
+				case 'KATALOG_LINK': {
+					$types[$fldName]['simpleType'] = 'p5:www_link';
+				} break;
+			}
+		}
+		return $types;
+	}
+
+}

+ 44 - 2
SE/se-lib/TableAcl.php

@@ -31,6 +31,7 @@ class TableAcl {
 	private $_fields = array();
 	private $_types = array();
 	private $_virtualFieldsIdList = array();
+	private $_sourceLoaded = false;
 
 	public function __construct($zasobID) {
 		$this->_zasobID = $zasobID;
@@ -684,7 +685,40 @@ class TableAcl {
 		return $_cache[$idTable];
 	}
 
+	public function loadSources() {
+		if ($this->_sourceLoaded) return;
+		$srvName = $_SERVER['SERVER_NAME'];
+		$srvCleanName = str_replace(array(".", "-"), '_', $srvName);
+		$tblLowerName = strtolower($this->_name);
+		$sourceName = ($this->_db == DB::getPDO()->getZasobId())? 'default_db' : "p5_{$this->_db}";
+		DBG::_('DBG_SCH', '>1', "srvCleanName", $srvCleanName, __CLASS__, __FUNCTION__, __LINE__);
+		DBG::_('DBG_SCH', '>1', "tblLowerName", $tblLowerName, __CLASS__, __FUNCTION__, __LINE__);
+		DBG::_('DBG_SCH', '>1', "sourceName", $sourceName, __CLASS__, __FUNCTION__, __LINE__);
+		// TODO: fetch form widgets from file config
+		//       "schema/gui/core/{$sourceName}.{$tblLowerName}.php";
+		//       class Schema_Core_{$sourceName}_{$tblLowerName};
+		//   TODO: override by company file config
+		//         "schema/gui/{$srvCleanName}/{$sourceName}.{$tblLowerName}.php";
+		//         class Schema_{$srvCleanName}_{$sourceName}_{$tblLowerName};
+		$pathCoreClass = APP_PATH_SCHEMA . "/gui/core/{$sourceName}.{$tblLowerName}.php";
+		$coreClassName = "Schema_Core_{$sourceName}_{$tblLowerName}";
+		if (file_exists($pathCoreClass)) {
+			require_once $pathCoreClass;
+			if (!class_exists($coreClassName)) throw new Exception("Config error for schema core class {$sourceName}:{$tblLowerName}");
+			$this->_coreSource = new $coreClassName();
+		}
+		$pathCompanyClass = APP_PATH_SCHEMA . "/gui/company/{$srvCleanName}/{$sourceName}.{$tblLowerName}.php";
+		$companyClassName = "Schema_{$srvCleanName}_{$sourceName}_{$tblLowerName}";
+		if (file_exists($pathCompanyClass)) {
+			require_once $pathCompanyClass;
+			if (!class_exists($companyClassName)) throw new Exception("Config error for schema company class {$sourceName}:{$tblLowerName}");
+			$this->_companySource = new $companyClassName();
+		}
+		$this->_sourceLoaded = true;
+	}
+
 	public function init($force = false) {
+		$this->loadSources();
 		if (empty($this->_fields)) {
 			$this->_types = array();// clear _types @see $this->isInitialized
 			$userAcl = User::getAcl();
@@ -703,18 +737,26 @@ class TableAcl {
 
 		uasort($this->_fields, array($this, 'sortFieldsCallback'));
 
+		$this->_fixTypes();
+
+		$this->save();
+	}
+
+	public function _fixTypes() {
 		$this->_fixDateFields();
 		$this->_sortEnumFields();
 		$this->_fixProjectType();
 
+		if ($this->_coreSource) $this->_types = $this->_coreSource->fixTypes($this->_types);
+		if ($this->_companySource) $this->_types = $this->_companySource->fixTypes($this->_types);
+		//DBG::_(true, true, "this->_types", $this->_types, __CLASS__, __FUNCTION__, __LINE__);
+
 		$fieldIds = array_keys($this->_fields);
 		Lib::loadClass('Typespecial');
 		$vColsIdList = Typespecial::initFields($fieldIds);
 		if (!empty($vColsIdList)) {
 			$this->_virtualFieldsIdList = $vColsIdList;
 		}
-
-		$this->save();
 	}
 
 	public function initFieldsFromConfig($fieldsConfig) {

+ 118 - 100
SE/se-lib/TableAjax.php

@@ -803,7 +803,8 @@ class TableAjax extends ViewAjax {
 			var rowNode = $('<tr></tr>'),
 					uniqueColName = _state.uniqueCol,
 					rowPK = (uniqueColName in props)? props[uniqueColName] : null,
-					cellNode
+					cellNode,
+					dbg = priv.options.debug
 			;
 
 			if (priv.options.rowFunctions || priv.options.filtersClean) {
@@ -855,6 +856,22 @@ class TableAjax extends ViewAjax {
 					case "string":
 						cellCnt.html(format.f(val));
 						break;
+					case "p5:www_link":
+						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);
@@ -1425,111 +1442,111 @@ class TableAjax extends ViewAjax {
 				var props = _data.cols[column];
 				tooltip = props.filterTooltip === true ? undefined : props.filterTooltip === false ? '' : props.filterTooltip;
 				placeHolder = props.placeHolder === true ? undefined : props.placeHolder === false ? '' : props.placeHolder;
+				if (props.hidden) continue;
 
-				if (!props.hidden) {
-					headCell = $('<th></th>').appendTo(node);
-					headCell.css({padding: '0'});
-					if (i == 1) headCell.addClass('stickyCol2');
-
-					// @mark MarkTableAjaxFilterColType
-					switch (props.type || 'string') {
-							case "number":
-									if (placeHolder == undefined) placeHolder = priv.options.types.number.placeHolder;
-									placeHolder = (placeHolder === true || placeHolder == undefined) ? '10..20 =50' : placeHolder === false ? '' : placeHolder;
-									if (tooltip == undefined) tooltip = priv.options.types.number.filterTooltip;
-									tooltip = (tooltip === true || tooltip == undefined) ? 'Values 10 to 20:<br/>10..20<br/>Values exactly 50:<br/>=50' : tooltip === false ? '' : tooltip;
-									elem = $('<input placeholder="{0}" class="filter" type="text" />'.f(placeHolder));
-									elem.on('keyup', {column: column}, priv.filterChanged);
-									break;
-							case "date":
-									if (placeHolder == undefined) placeHolder = priv.options.types.date.placeHolder;
-									placeHolder = (placeHolder === true || placeHolder == undefined) ? '-7..0' : placeHolder === false ? '' : placeHolder;
-									if (tooltip == undefined) tooltip = priv.options.types.date.filterTooltip;
-									tooltip = (tooltip === true || tooltip == undefined) ? 'Today:<br/>0..1<br/>A week today excluded:<br/>-7..0' : tooltip === false ? '' : tooltip;
-									elem = $('<div><input placeholder="{0}" class="filter" type="text" /></div>'.f(placeHolder));
-
-									if (priv.options.types.date.datePicker === true || priv.options.types.date.datePicker == undefined)
-									{
-											if ($().datepicker)
-											{
-													elem.addClass('date-wrap');
-													var today = 0;//new priv.ext.XDate(false).setHours(0, 0, 0, 0).toString('yyyy-MM-dd');
-													var dp = $('<div style="float:right" class="date" data-date="{0}" data-date-format="{1}" />'.f(today, 'yyyy-mm-dd')).appendTo(elem);
-													$('<input style="display:none" type="text"  />').appendTo(dp);
-													$('<span class="add-on"><i class="glyphicon glyphicon-chevron-right"></i></span>').on('click', {op: "l"}, priv.dpOpChanged).appendTo(dp);
-													$('<span class="add-on"><i class="glyphicon glyphicon-chevron-left"></i></span>').on('click', {op: "r"}, priv.dpOpChanged).appendTo(dp);
-													dp.datepicker({weekStart:1});
-													dp.on('changeDate', {column: column, input: $('input.filter', elem)}, priv.dpClicked);
-											}
-											else
-											if (priv.options.debug) console.log('datepicker plugin not found');
-									}
-									elem.on('keyup', 'input.filter', {column: column}, priv.filterChanged);
-									break;
-							case "bool":
-									if (tooltip == undefined) tooltip = priv.options.types.bool.filterTooltip;
-									tooltip = (tooltip === true || tooltip == undefined) ? 'Toggle between:<br/>indeterminate,<br/>checked,<br/>unchecked' : tooltip === false ? '' : tooltip;
-									elem = $('<input class="filter indeterminate" checked type="checkbox" />');
-									elem.on('click', {column: column}, priv.filterChanged);
-									break;
-							case "string":
-									if (placeHolder == undefined) placeHolder = priv.options.types.string.placeHolder;
-									placeHolder = (placeHolder === true || placeHolder == undefined) ? '%' : placeHolder === false ? '' : placeHolder;
-									if (tooltip == undefined) tooltip = priv.options.types.string.filterTooltip;
-									tooltip = (tooltip === true || tooltip == undefined) ? 'Find str: str<br/>Find all but str: !str<br/>Find str inside: %str%' : tooltip === false ? '' : tooltip;
-									elem = $('<input placeholder="{0}" class="filter" type="text" size="8" />'.f(placeHolder));
-									elem.on('keyup', {column: column}, priv.filterChanged);
-									break;
-							case "special":
-									elem = $('<div>&nbsp;</div>');
-									break;
-							case "simpleLink":
-									elem = $('<div>&nbsp;</div>');
-									break;
-							case "geom":
-									if (placeHolder == undefined) placeHolder = priv.options.types.string.placeHolder;
-									placeHolder = (placeHolder === true || placeHolder == undefined) ? '%' : placeHolder === false ? '' : placeHolder;
-									elem = $('<input placeholder="{0}" class="filter" type="text" size="8" />'.f(placeHolder));
-									elem.on('keyup', {column: column}, priv.filterChanged);
-									break;
-							case "none":
-									elem = $('<div>&nbsp;</div>');
-									break;
-					}
+				headCell = $('<th></th>').appendTo(node);
+				headCell.css({padding: '0'});
+				if (i == 1) headCell.addClass('stickyCol2');
+
+				// @mark MarkTableAjaxFilterColType
+				switch (props.type || 'string') {
+						case "number":
+								if (placeHolder == undefined) placeHolder = priv.options.types.number.placeHolder;
+								placeHolder = (placeHolder === true || placeHolder == undefined) ? '10..20 =50' : placeHolder === false ? '' : placeHolder;
+								if (tooltip == undefined) tooltip = priv.options.types.number.filterTooltip;
+								tooltip = (tooltip === true || tooltip == undefined) ? 'Values 10 to 20:<br/>10..20<br/>Values exactly 50:<br/>=50' : tooltip === false ? '' : tooltip;
+								elem = $('<input placeholder="{0}" class="filter" type="text" />'.f(placeHolder));
+								elem.on('keyup', {column: column}, priv.filterChanged);
+								break;
+						case "date":
+								if (placeHolder == undefined) placeHolder = priv.options.types.date.placeHolder;
+								placeHolder = (placeHolder === true || placeHolder == undefined) ? '-7..0' : placeHolder === false ? '' : placeHolder;
+								if (tooltip == undefined) tooltip = priv.options.types.date.filterTooltip;
+								tooltip = (tooltip === true || tooltip == undefined) ? 'Today:<br/>0..1<br/>A week today excluded:<br/>-7..0' : tooltip === false ? '' : tooltip;
+								elem = $('<div><input placeholder="{0}" class="filter" type="text" /></div>'.f(placeHolder));
+
+								if (priv.options.types.date.datePicker === true || priv.options.types.date.datePicker == undefined)
+								{
+										if ($().datepicker)
+										{
+												elem.addClass('date-wrap');
+												var today = 0;//new priv.ext.XDate(false).setHours(0, 0, 0, 0).toString('yyyy-MM-dd');
+												var dp = $('<div style="float:right" class="date" data-date="{0}" data-date-format="{1}" />'.f(today, 'yyyy-mm-dd')).appendTo(elem);
+												$('<input style="display:none" type="text"  />').appendTo(dp);
+												$('<span class="add-on"><i class="glyphicon glyphicon-chevron-right"></i></span>').on('click', {op: "l"}, priv.dpOpChanged).appendTo(dp);
+												$('<span class="add-on"><i class="glyphicon glyphicon-chevron-left"></i></span>').on('click', {op: "r"}, priv.dpOpChanged).appendTo(dp);
+												dp.datepicker({weekStart:1});
+												dp.on('changeDate', {column: column, input: $('input.filter', elem)}, priv.dpClicked);
+										}
+										else
+										if (priv.options.debug) console.log('datepicker plugin not found');
+								}
+								elem.on('keyup', 'input.filter', {column: column}, priv.filterChanged);
+								break;
+						case "bool":
+								if (tooltip == undefined) tooltip = priv.options.types.bool.filterTooltip;
+								tooltip = (tooltip === true || tooltip == undefined) ? 'Toggle between:<br/>indeterminate,<br/>checked,<br/>unchecked' : tooltip === false ? '' : tooltip;
+								elem = $('<input class="filter indeterminate" checked type="checkbox" />');
+								elem.on('click', {column: column}, priv.filterChanged);
+								break;
+						case "p5:www_link":
+						case "string":
+								if (placeHolder == undefined) placeHolder = priv.options.types.string.placeHolder;
+								placeHolder = (placeHolder === true || placeHolder == undefined) ? '%' : placeHolder === false ? '' : placeHolder;
+								if (tooltip == undefined) tooltip = priv.options.types.string.filterTooltip;
+								tooltip = (tooltip === true || tooltip == undefined) ? 'Find str: str<br/>Find all but str: !str<br/>Find str inside: %str%' : tooltip === false ? '' : tooltip;
+								elem = $('<input placeholder="{0}" class="filter" type="text" size="8" />'.f(placeHolder));
+								elem.on('keyup', {column: column}, priv.filterChanged);
+								break;
+						case "special":
+								elem = $('<div>&nbsp;</div>');
+								break;
+						case "simpleLink":
+								elem = $('<div>&nbsp;</div>');
+								break;
+						case "geom":
+								if (placeHolder == undefined) placeHolder = priv.options.types.string.placeHolder;
+								placeHolder = (placeHolder === true || placeHolder == undefined) ? '%' : placeHolder === false ? '' : placeHolder;
+								elem = $('<input placeholder="{0}" class="filter" type="text" size="8" />'.f(placeHolder));
+								elem.on('keyup', {column: column}, priv.filterChanged);
+								break;
+						case "none":
+								elem = $('<div>&nbsp;</div>');
+								break;
+				}
 
-					if (false) {// tooltip OFF - (tooltip)
-						elem.tooltip({
-							title: tooltip.trim(),
-							html: true,
-							container: 'body',
-							trigger: 'focus',
-							placement: 'top',
-							delay: {
-								show: 500,
-								hide: 100
-							}
-						});
-					}
+				if (false) {// tooltip OFF - (tooltip)
+					elem.tooltip({
+						title: tooltip.trim(),
+						html: true,
+						container: 'body',
+						trigger: 'focus',
+						placement: 'top',
+						delay: {
+							show: 500,
+							hide: 100
+						}
+					});
+				}
 
-					if (elem && props.filter) {
-						$.map(_state.filters.filterCols, function(colProps, col) {
-							if (col == column) {
-								var columnSettings = _data.cols[col];
-								if (columnSettings.type == 'bool') {
-									if (colProps.filter) elem.prop('checked', true).removeClass('indeterminate');
-									else if (!colProps.filter) elem.prop('checked', false).removeClass('indeterminate');
-									else if (colProps.filter == '') elem.addClass('indeterminate');
-								}
-								else elem.val(colProps.filter);
+				if (elem && props.filter) {
+					$.map(_state.filters.filterCols, function(colProps, col) {
+						if (col == column) {
+							var columnSettings = _data.cols[col];
+							if (columnSettings.type == 'bool') {
+								if (colProps.filter) elem.prop('checked', true).removeClass('indeterminate');
+								else if (!colProps.filter) elem.prop('checked', false).removeClass('indeterminate');
+								else if (colProps.filter == '') elem.addClass('indeterminate');
 							}
-						});
-						if (priv.options.forceFilterInit && undefined !== priv.options.forceFilterInit[column]) {
-							elem.prop('disabled', true);
+							else elem.val(colProps.filter);
 						}
-						elem.appendTo(headCell);
-
-						_filterFields[column] = elem;
+					});
+					if (priv.options.forceFilterInit && undefined !== priv.options.forceFilterInit[column]) {
+						elem.prop('disabled', true);
 					}
+					elem.appendTo(headCell);
+
+					_filterFields[column] = elem;
 				}
 			}
 
@@ -5601,6 +5618,7 @@ jQuery(document).ready(function(){
 				if ($colType['type'] == 'date') {
 					//$columnConfig->type = 'date';// TODO: require datetimepicker
 				}
+				if (!empty($colType['simpleType'])) $columnConfig->type = $colType['simpleType'];
 			} else {// typespecial - no type
 				$columnConfig->type = 'special';
 			}

+ 1 - 0
SE/se-lib/tmpl/_layout_gora.php

@@ -29,6 +29,7 @@
 	<script src="stuff/jquery.hotkeys.js"></script>
 	<script src="stuff/lodash.min.js"></script>
 	<script src="stuff/superagent.js"></script>
+	<script src="stuff/validate.min.js"></script>
 	<style type="text/css">
 .typepsecial .selectize-input { width:366px; padding:4px 6px; }
 .typepsecial .selectize-control::before {

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 7 - 0
SE/stuff/validate.min.js


+ 19 - 34
SE/superedit-VIEWTABLE_AJAX.php

@@ -1,39 +1,28 @@
 <?php
 
+Lib::loadClass('ProcesHelper');
 
-function VIEWTABLE_AJAX( $params = array() ) {
+function VIEWTABLE_AJAX($params = array()) {
+	try {
+		SE_Layout::menu();
 
-	SE_Layout::menu();
+		$zasobID = V::get('ZASOB_ID', 0, $_GET, 'int');
+		if ($zasobID <= 0) throw new Exception("Wrong param ZASOB_ID");
 
-	$zasobID = V::get('ZASOB_ID', 0, $_GET, 'int');
-	if ($zasobID <= 0) {
-		echo 'Wrong param ZASOB_ID';
-		return;
-	}
+		$zasobObj = ProcesHelper::getZasobTableInfo($zasobID);
+		if (!$zasobObj) throw new Exception("Zasob TABELA ID={$zasobID} nie istnieje");
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">zasobObj (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($zasobObj);echo'</pre>';
 
-	Lib::loadClass('ProcesHelper');
+		$userAcl = User::getAcl();
+		$userAcl->fetchGroups();
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;display:none;">$userAcl (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($userAcl);echo'</pre>';
 
-	$zasobObj = ProcesHelper::getZasobTableInfo($zasobID);
-	if (!$zasobObj) {
-		echo "Zasob TABELA ID={$zasobID} nie istnieje";
-		return;
-	}
+		if (!$userAcl->hasTableAcl($zasobObj->ID)) throw new Exception("Brak uprawnień do tabeli ID={$zasobObj->ID}");
 
-	//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">zasobObj (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($zasobObj);echo'</pre>';
+		$tblAcl = $userAcl->getTableAcl($zasobObj->ID);
+		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">tblAcl (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($tblAcl);echo'</pre>';
 
-	$userAcl = User::getAcl();
-	$userAcl->fetchGroups();
-	//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;display:none;">$userAcl (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($userAcl);echo'</pre>';
-
-	if (!$userAcl->hasTableAcl($zasobObj->ID)) {
-		die("Brak uprawnień do tabeli ID={$zasobObj->ID}");
-	}
-
-	$tblAcl = $userAcl->getTableAcl($zasobObj->ID);
-	//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">tblAcl (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($tblAcl);echo'</pre>';
-
-	$forceTblAclInit = ('1' == V::get('_force', '', $_GET));
-	try {
+		$forceTblAclInit = ('1' == V::get('_force', '', $_GET));
 		$tblAcl->init($forceTblAclInit);
 
 		Lib::loadClass('TableAjax');
@@ -69,14 +58,10 @@ function VIEWTABLE_AJAX( $params = array() ) {
 		$tbl->addRowFunction('cp');
 		$tbl->addRowFunction('msgs');
 		echo $tbl->render();
-
 	} catch (Exception $e) {
-		?>
-		<div class="alert alert-error">
-			<strong>Wystąpiły błędy!</strong>
-			<?php echo $e->getMessage(); ?>
-		</div>
-		<?php
+		echo '<div class="container">';
+		SE_Layout::alert('danger', "<strong>Wystąpiły błędy!</strong> " . $e->getMessage());
+		echo '</div>';
 	}
 
 }

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov