From d670453284c6fd7bc5996b1a5ca8eb43b1b6661e Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Sat, 24 Apr 2021 09:49:57 -0400 Subject: [PATCH] SearchKit - Improve UX for adding links to a search display When adding links to a column, it will now only show relevant links to the entity in the column. When adding a column of links/buttons, it will make all links available as before, but by default will only show the ones relevant to the main entity. --- .../crmSearchAdminDisplay.component.js | 26 ++++++++++++++++--- .../crmSearchAdminLinkGroup.component.js | 7 +++-- .../displays/colType/field.html | 2 +- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js index b19d59e447..83272f795d 100644 --- a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js +++ b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js @@ -179,7 +179,7 @@ if (column.link) { ctrl.onChangeLink(column, column.link.path, ''); } else { - var defaultLink = ctrl.getLinks()[0]; + var defaultLink = ctrl.getLinks(column.key)[0]; column.link = {path: defaultLink ? defaultLink.path : 'civicrm/'}; ctrl.onChangeLink(column, null, column.link.path); } @@ -200,11 +200,27 @@ } }; - this.getLinks = function() { + this.getLinks = function(columnKey) { if (!ctrl.links) { - ctrl.links = buildLinks(); + ctrl.links = {'*': buildLinks()}; } - return ctrl.links; + if (!columnKey) { + return ctrl.links['*']; + } + var expr = ctrl.getExprFromSelect(columnKey), + info = searchMeta.parseExpr(expr), + joinEntity = ''; + if (info.field.fk_entity || info.field.name !== info.field.fieldName) { + joinEntity = info.prefix + (info.field.fk_entity ? info.field.name : info.field.name.substr(0, info.field.name.lastIndexOf('.'))); + } else if (info.prefix) { + joinEntity = info.prefix.replace('.', ''); + } + if (!ctrl.links[joinEntity]) { + ctrl.links[joinEntity] = _.filter(ctrl.links['*'], function(link) { + return joinEntity === (link.join || ''); + }); + } + return ctrl.links[joinEntity]; }; // Build a list of all possible links to main entity or join entities @@ -224,6 +240,7 @@ if (entityCount[joinEntity.name] > 1) { link.title += ' ' + entityCount[joinEntity.name]; } + link.join = joinName[1]; links.push(link); }); }); @@ -238,6 +255,7 @@ _.each((joinEntity || {}).paths, function(path) { var link = _.cloneDeep(path); link.path = link.path.replace(/\[id/g, '[' + idField); + link.join = idField; links.push(link); }); } diff --git a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminLinkGroup.component.js b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminLinkGroup.component.js index d9145431a6..2768a4bcfc 100644 --- a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminLinkGroup.component.js +++ b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminLinkGroup.component.js @@ -60,9 +60,12 @@ }; this.$onInit = function() { + var defaultLinks = _.filter(ctrl.links, function(link) { + return !link.join; + }); if (!ctrl.group.length) { - if (ctrl.links.length) { - _.each(_.pluck(ctrl.links, 'path'), ctrl.addItem); + if (defaultLinks.length) { + _.each(_.pluck(defaultLinks, 'path'), ctrl.addItem); } else { ctrl.addItem('civicrm/'); } diff --git a/ext/search_kit/ang/crmSearchAdmin/displays/colType/field.html b/ext/search_kit/ang/crmSearchAdmin/displays/colType/field.html index 7b0969cbd2..21737f80ea 100644 --- a/ext/search_kit/ang/crmSearchAdmin/displays/colType/field.html +++ b/ext/search_kit/ang/crmSearchAdmin/displays/colType/field.html @@ -8,7 +8,7 @@ - +
-- 2.25.1