From ee404fa400c741491535d3c14e38d0a09d0dcdcc Mon Sep 17 00:00:00 2001 From: yuri Date: Tue, 13 Sep 2016 15:05:38 +0300 Subject: [PATCH 1/6] parentType = null if empty --- client/src/views/fields/link-parent.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/views/fields/link-parent.js b/client/src/views/fields/link-parent.js index 3fbfb9b0e9..990a220e30 100644 --- a/client/src/views/fields/link-parent.js +++ b/client/src/views/fields/link-parent.js @@ -289,6 +289,9 @@ Espo.define('views/fields/link-parent', 'views/fields/base', function (Dep) { data[this.typeName] = this.$elementType.val() || null; data[this.nameName] = this.$elementName.val() || null; data[this.idName] = this.$elementId.val() || null; + if (data[this.idName] === null) { + data[this.typeName] = null; + } return data; }, From 2d6d6a2b198291fa58816e34a1bf70543178ab3e Mon Sep 17 00:00:00 2001 From: yuri Date: Tue, 13 Sep 2016 15:17:49 +0300 Subject: [PATCH 2/6] link parent: search by parent type --- client/src/views/fields/link-parent.js | 65 +++++++++++++++++--------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/client/src/views/fields/link-parent.js b/client/src/views/fields/link-parent.js index 990a220e30..61c28b890d 100644 --- a/client/src/views/fields/link-parent.js +++ b/client/src/views/fields/link-parent.js @@ -319,33 +319,54 @@ Espo.define('views/fields/link-parent', 'views/fields/base', function (Dep) { var entityName = this.$elementName.val() var entityId = this.$elementId.val(); - if (!entityId || !entityType) { + if (!entityType) { return false; } - var data = { - frontType: 'is', - type: 'and', - field: this.idName, + var data; + if (entityId) { + data = { + frontType: 'is', + type: 'and', + field: this.idName, - value: [ - { - type: 'equals', - field: this.idName, - value: entityId, - }, - { - type: 'equals', - field: this.typeName, - value: entityType, - } - ], - valueId: entityId, - valueName: entityName, - valueType: entityType, - }; + value: [ + { + type: 'equals', + field: this.idName, + value: entityId, + }, + { + type: 'equals', + field: this.typeName, + value: entityType, + } + ], + valueId: entityId, + valueName: entityName, + valueType: entityType, + }; + } else { + data = { + frontType: 'is', + type: 'and', + field: this.idName, + value: [ + { + type: 'isNotNull', + field: this.idName + }, + { + type: 'equals', + field: this.typeName, + value: entityType, + } + ], + valueType: entityType + }; + } return data; - }, + } }); }); From ecf8256b147e8a60ce1138fda83e0cd4a7e6a099 Mon Sep 17 00:00:00 2001 From: yuri Date: Tue, 13 Sep 2016 15:26:51 +0300 Subject: [PATCH 3/6] fix textFilterFields list --- client/src/views/admin/entity-manager/modals/edit-entity.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/views/admin/entity-manager/modals/edit-entity.js b/client/src/views/admin/entity-manager/modals/edit-entity.js index 597fdcd0dd..846fe1dfb5 100644 --- a/client/src/views/admin/entity-manager/modals/edit-entity.js +++ b/client/src/views/admin/entity-manager/modals/edit-entity.js @@ -196,7 +196,7 @@ Espo.define('views/admin/entity-manager/modals/edit-entity', ['views/modal', 'mo var fieldDefs = this.getMetadata().get(['entityDefs', scope, 'fields']) || {}; var optionList = Object.keys(fieldDefs).filter(function (item) { - if (!~['varchar', 'text', 'phoneNumber', 'email', 'personName'].indexOf(this.getMetadata().get(['entityDefs', scope, 'fields', item, 'type']))) { + if (!~['varchar', 'text', 'phone', 'email', 'personName'].indexOf(this.getMetadata().get(['entityDefs', scope, 'fields', item, 'type']))) { return false; } if (this.getMetadata().get(['entityDefs', scope, 'fields', item, 'disabled'])) { From a6197386520e514894142816c27246de4029f1a2 Mon Sep 17 00:00:00 2001 From: yuri Date: Tue, 13 Sep 2016 16:53:06 +0300 Subject: [PATCH 4/6] fix dashboard javascript error --- client/src/views/dashboard.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/src/views/dashboard.js b/client/src/views/dashboard.js index 5f017ce9ab..c7782878ff 100644 --- a/client/src/views/dashboard.js +++ b/client/src/views/dashboard.js @@ -78,6 +78,10 @@ Espo.define('views/dashboard', ['view', 'lib!gridstack'], function (Dep, Gridsta }); }, this); + this.dashletIdList.forEach(function (item) { + this.clearView('dashlet-' + item); + }, this); + this.dashboardLayout = dashboardLayout; this.saveLayout(); From 850c3fd6967f08d810109c4c7d1e1663713c4942 Mon Sep 17 00:00:00 2001 From: yuri Date: Wed, 14 Sep 2016 13:00:22 +0300 Subject: [PATCH 5/6] orm: get parent relation --- application/Espo/ORM/DB/Mapper.php | 50 +++++++++++++++++++++----- application/Espo/ORM/DB/Query/Base.php | 16 ++++++--- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/application/Espo/ORM/DB/Mapper.php b/application/Espo/ORM/DB/Mapper.php index d5d6172179..cf7a5b01e6 100644 --- a/application/Espo/ORM/DB/Mapper.php +++ b/application/Espo/ORM/DB/Mapper.php @@ -151,15 +151,21 @@ abstract class Mapper implements IMapper { $relOpt = $entity->relations[$relationName]; - if (!isset($relOpt['entity']) || !isset($relOpt['type'])) { - throw new \LogicException("Not appropriate defenition for relationship {$relationName} in " . $entity->getEntityType() . " entity"); + if (!isset($relOpt['type'])) { + throw new \LogicException("Missing 'type' in defenition for relationship {$relationName} in " . $entity->getEntityType() . " entity"); } - $relEntityName = (!empty($relOpt['class'])) ? $relOpt['class'] : $relOpt['entity']; - $relEntity = $this->entityFactory->create($relEntityName); + if ($relOpt['type'] !== IEntity::BELONGS_TO_PARENT) { + if (!isset($relOpt['entity'])) { + throw new \LogicException("Missing 'entity' in defenition for relationship {$relationName} in " . $entity->getEntityType() . " entity"); + } - if (!$relEntity) { - return null; + $relEntityName = (!empty($relOpt['class'])) ? $relOpt['class'] : $relOpt['entity']; + $relEntity = $this->entityFactory->create($relEntityName); + + if (!$relEntity) { + return null; + } } if ($totalCount) { @@ -167,7 +173,6 @@ abstract class Mapper implements IMapper $params['aggregationBy'] = 'id'; } - if (empty($params['whereClause'])) { $params['whereClause'] = array(); } @@ -207,8 +212,8 @@ abstract class Mapper implements IMapper $params['whereClause'][$foreignKey] = $entity->get($key); if ($relType == IEntity::HAS_CHILDREN) { - $foreignType = $keySet['foreignType']; - $params['whereClause'][$foreignType] = $entity->getEntityType(); + $foreignTypeKey = $keySet['foreignTypeKey']; + $params['whereClause'][$foreignTypeKey] = $entity->getEntityType(); } if ($relType == IEntity::HAS_ONE) { @@ -282,6 +287,33 @@ abstract class Mapper implements IMapper } else { return $resultArr; } + case IEntity::BELONGS_TO_PARENT: + $foreignEntityType = $entity->get($keySet['typeKey']); + $foreignEntityId = $entity->get($key); + if (!$foreignEntityType || !$foreignEntityId) { + return null; + } + $params['whereClause'][$foreignKey] = $foreignEntityId; + $params['offset'] = 0; + $params['limit'] = 1; + + $relEntity = $this->entityFactory->create($foreignEntityType); + + $sql = $this->query->createSelectQuery($foreignEntityType, $params); + + $ps = $this->pdo->query($sql); + + if ($ps) { + foreach ($ps as $row) { + if (!$totalCount) { + $relEntity = $this->fromRow($relEntity, $row); + return $relEntity; + } else { + return $row['AggregateValue']; + } + } + } + return null; } return false; diff --git a/application/Espo/ORM/DB/Query/Base.php b/application/Espo/ORM/DB/Query/Base.php index 7dba5d0cf7..49db607c03 100644 --- a/application/Espo/ORM/DB/Query/Base.php +++ b/application/Espo/ORM/DB/Query/Base.php @@ -978,14 +978,14 @@ abstract class Base if (isset($relOpt['foreignKey'])) { $foreignKey = $relOpt['foreignKey']; } - $foreignType = 'parentType'; + $foreignTypeKey = 'parentType'; if (isset($relOpt['foreignType'])) { - $foreignType = $relOpt['foreignType']; + $foreignTypeKey = $relOpt['foreignType']; } return array( 'key' => $key, 'foreignKey' => $foreignKey, - 'foreignType' => $foreignType, + 'foreignTypeKey' => $foreignTypeKey, ); case IEntity::MANY_MANY: @@ -1007,7 +1007,15 @@ abstract class Base 'key' => $key, 'foreignKey' => $foreignKey, 'nearKey' => $nearKey, - 'distantKey' => $distantKey, + 'distantKey' => $distantKey + ); + case IEntity::BELONGS_TO_PARENT: + $key = $this->toDb($entity->getEntityType()) . 'Id'; + $type = $this->toDb($entity->getEntityType()) . 'Type'; + return array( + 'key' => $key, + 'typeKey' => $foreignType, + 'foreignKey' => 'id' ); } } From fab257eb971f13129355e787f29ac8a8506f95ab Mon Sep 17 00:00:00 2001 From: yuri Date: Wed, 14 Sep 2016 13:07:32 +0300 Subject: [PATCH 6/6] fix orm --- application/Espo/ORM/DB/Query/Base.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/Espo/ORM/DB/Query/Base.php b/application/Espo/ORM/DB/Query/Base.php index 49db607c03..aa77acce81 100644 --- a/application/Espo/ORM/DB/Query/Base.php +++ b/application/Espo/ORM/DB/Query/Base.php @@ -1011,10 +1011,10 @@ abstract class Base ); case IEntity::BELONGS_TO_PARENT: $key = $this->toDb($entity->getEntityType()) . 'Id'; - $type = $this->toDb($entity->getEntityType()) . 'Type'; + $typeKey = $this->toDb($entity->getEntityType()) . 'Type'; return array( 'key' => $key, - 'typeKey' => $foreignType, + 'typeKey' => $typeKey, 'foreignKey' => 'id' ); }