From 6e4ca6151a123bc488f97d2602c580d30abd578e Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Wed, 15 Nov 2023 10:09:39 +0200 Subject: [PATCH] one-to-one select apply isEmpty filter --- client/src/views/fields/link.js | 52 +++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/client/src/views/fields/link.js b/client/src/views/fields/link.js index 34955dca7f..1ad0d697e2 100644 --- a/client/src/views/fields/link.js +++ b/client/src/views/fields/link.js @@ -537,7 +537,7 @@ class LinkFieldView extends BaseFieldView { url += '&' + $.param({'primaryFilter': filters.primary}); } - if (filters.advanced) { + if (filters.advanced && Object.keys(filters.advanced).length) { url += '&' + $.param({'where': filters.advanced}); } @@ -1117,6 +1117,48 @@ class LinkFieldView extends BaseFieldView { }); } + /** + * @param {Object} advanced + * @private + */ + _applyAdditionalFilter(advanced) { + const foreignLink = this.model.getLinkParam(this.name, 'foreign'); + + if (!foreignLink) { + return; + } + + if (advanced[foreignLink]) { + return; + } + + const linkType = this.model.getLinkParam(this.name, 'type'); + const foreignLinkType = this.getMetadata() + .get(['entityDefs', this.foreignScope, 'links', foreignLink, 'type']); + const foreignFieldType = this.getMetadata() + .get(['entityDefs', this.foreignScope, 'fields', foreignLink, 'type']); + + if (!foreignFieldType) { + return; + } + + const isOneToOne = + (linkType === 'hasOne' || foreignLinkType === 'hasOne') && + ['link', 'linkOne'].includes(foreignFieldType); + + if (!isOneToOne) { + return; + } + + advanced[foreignLink] = { + type: 'isNull', + attribute: foreignLink + 'Id', + data: { + type: 'isEmpty', + }, + }; + } + /** * @private * @return {Promise<{bool?: string[], advanced?: Object, primary?: string}>} @@ -1134,10 +1176,14 @@ class LinkFieldView extends BaseFieldView { ] : undefined; + const advanced = this.getSelectFilters() || {}; + + this._applyAdditionalFilter(advanced); + return Promise.resolve({ primary: this.getSelectPrimaryFilterName() || this.panelDefs.selectPrimaryFilterName, bool: boolFilterList, - advanced: this.getSelectFilters() || undefined, + advanced: advanced, }); } @@ -1160,6 +1206,8 @@ class LinkFieldView extends BaseFieldView { ] : undefined; + this._applyAdditionalFilter(advanced); + resolve({ bool: boolFilterList, primary: primaryFilter,