From fc7dba6c9106902c1b882ab89d02cb124e6ffd03 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Thu, 23 Sep 2021 17:03:20 +0300 Subject: [PATCH] all of filter --- .../Espo/Core/Select/Where/Checker.php | 1 + .../Select/Where/ItemGeneralConverter.php | 63 +++++++++++++++++++ client/src/views/fields/link-multiple.js | 32 ++++++++-- 3 files changed, 91 insertions(+), 5 deletions(-) diff --git a/application/Espo/Core/Select/Where/Checker.php b/application/Espo/Core/Select/Where/Checker.php index 3bc460bcea..cb46bab223 100644 --- a/application/Espo/Core/Select/Where/Checker.php +++ b/application/Espo/Core/Select/Where/Checker.php @@ -72,6 +72,7 @@ class Checker 'isNotLinked', 'linkedWith', 'notLinkedWith', + 'linkedWithAll', 'isUserFromTeams', ]; diff --git a/application/Espo/Core/Select/Where/ItemGeneralConverter.php b/application/Espo/Core/Select/Where/ItemGeneralConverter.php index 1e5bc0792b..9023150382 100644 --- a/application/Espo/Core/Select/Where/ItemGeneralConverter.php +++ b/application/Espo/Core/Select/Where/ItemGeneralConverter.php @@ -1151,4 +1151,67 @@ class ItemGeneralConverter implements ItemConverter throw new Error("Bad where item. Not supported relation type."); } + + protected function processLinkedWithAll(QueryBuilder $queryBuilder, string $attribute, $value): array + { + $link = $attribute; + + if (!$this->ormDefs->getEntity($this->entityType)->hasRelation($link)) { + throw new Error("Not existing link '{$link}' in where item."); + } + + if (is_null($value) || !$value && !is_array($value)) { + throw new Error("Bad where item. Empty value."); + } + + if (!is_array($value)) { + $value = [$value]; + } + + $defs = $this->ormDefs->getEntity($this->entityType)->getRelation($link); + + $relationType = $defs->getType(); + + if ($relationType === Entity::MANY_MANY) { + $key = $defs->getForeignMidKey(); + + $whereList = []; + + foreach ($value as $targetId) { + $sq = QueryBuilder::create() + ->from($this->entityType) + ->select('id') + ->leftJoin($link) + ->where([ + $link . 'Middle.' . $key => $targetId, + ]) + ->build(); + + $whereList[] = ['id=s' => $sq->getRaw()]; + } + + return $whereList; + } + + if ($relationType === Entity::HAS_MANY) { + $whereList = []; + + foreach ($value as $targetId) { + $sq = QueryBuilder::create() + ->from($this->entityType) + ->select('id') + ->leftJoin($link) + ->where([ + $link . '.id' => $targetId, + ]) + ->build(); + + $whereList[] = ['id=s' => $sq->getRaw()]; + } + + return $whereList; + } + + throw new Error("Bad where item. Not supported relation type."); + } } diff --git a/client/src/views/fields/link-multiple.js b/client/src/views/fields/link-multiple.js index bf269db5b2..e382e54df2 100644 --- a/client/src/views/fields/link-multiple.js +++ b/client/src/views/fields/link-multiple.js @@ -56,7 +56,7 @@ define('views/fields/link-multiple', 'views/fields/base', function (Dep) { sortable: false, - searchTypeList: ['anyOf', 'isEmpty', 'isNotEmpty', 'noneOf'], + searchTypeList: ['anyOf', 'isEmpty', 'isNotEmpty', 'noneOf', 'allOf'], selectFilterList: null, @@ -173,7 +173,7 @@ define('views/fields/link-multiple', 'views/fields/base', function (Dep) { }, handleSearchType: function (type) { - if (~['anyOf', 'noneOf'].indexOf(type)) { + if (~['anyOf', 'noneOf', 'allOf'].indexOf(type)) { this.$el.find('div.link-group-container').removeClass('hidden'); } else { @@ -499,7 +499,27 @@ define('views/fields/link-multiple', 'views/fields/base', function (Dep) { return data; } - else if (type === 'noneOf') { + + if (type === 'allOf') { + var idList = this.ids || []; + + var data = { + type: 'linkedWithAll', + value: idList, + data: { + type: type, + nameHash: this.nameHash, + }, + }; + + if (!idList.length) { + data.value = null; + } + + return data; + } + + if (type === 'noneOf') { var data = { type: 'notLinkedWith', value: this.ids || [], @@ -511,7 +531,8 @@ define('views/fields/link-multiple', 'views/fields/base', function (Dep) { return data; } - else if (type === 'isEmpty') { + + if (type === 'isEmpty') { var data = { type: 'isNotLinked', data: { @@ -521,7 +542,8 @@ define('views/fields/link-multiple', 'views/fields/base', function (Dep) { return data; } - else if (type === 'isNotEmpty') { + + if (type === 'isNotEmpty') { var data = { type: 'isLinked', data: {