SearchKit - Fix link target selection and move link templating out of controller
authorColeman Watts <coleman@civicrm.org>
Mon, 7 Jun 2021 19:53:36 +0000 (15:53 -0400)
committerColeman Watts <coleman@civicrm.org>
Mon, 7 Jun 2021 19:53:36 +0000 (15:53 -0400)
ext/search_kit/ang/crmSearchAdmin/displays/colType/field.html
ext/search_kit/ang/crmSearchDisplay.module.js
ext/search_kit/ang/crmSearchDisplay/colType/buttons.html
ext/search_kit/ang/crmSearchDisplay/colType/field.html
ext/search_kit/ang/crmSearchDisplay/colType/links.html
ext/search_kit/ang/crmSearchDisplay/colType/menu.html
js/crm.ajax.js

index 4ce65de91707980daeab7dd123deb5c5e7d7095f..08f16d139f478951689dd57410b7f5c8d6a8d898 100644 (file)
@@ -1,9 +1,9 @@
 <div class="form-inline crm-search-admin-flex-row">
-  <label title="{{ ts('Display as clickable link') }}" >
+  <label title="{{:: ts('Display as clickable link') }}" >
     <input type="checkbox" ng-checked="col.link" ng-click="$ctrl.parent.toggleLink(col)" >
     {{:: ts('Link') }}
   </label>
-  <select class="form-control" ng-model="$ctrl.link.target" ng-if="col.link">
+  <select class="form-control" ng-model="col.link.target" ng-if="col.link">
     <option value>{{:: ts('Open normally') }}</option>
     <option value="_blank">{{:: ts('New tab') }}</option>
     <option value="crm-popup">{{:: ts('Popup dialog') }}</option>
index 8c08cffa0ed09d56af3bba16f7215ae4c91c9a89..24c96974b368f42162f4fe234ef63dc6b4f8a899 100644 (file)
@@ -7,7 +7,7 @@
     .factory('searchDisplayUtils', function(crmApi4) {
 
       // Replace tokens keyed to rowData.
-      // If rowMeta is provided, values will be formatted; if omiited, raw values will be provided.
+      // If rowMeta is provided, values will be formatted; if omitted, raw values will be provided.
       function replaceTokens(str, rowData, rowMeta) {
         if (!str) {
           return '';
         return url;
       }
 
-      // Returns html-escaped display value for a single column in a row
+      // Returns display value for a single column in a row
       function formatDisplayValue(rowData, key, rowMeta) {
         var column = _.findWhere(rowMeta, {key: key}),
-          displayValue = column.rewrite ? replaceTokens(column.rewrite, rowData, rowMeta) : formatRawValue(column, rowData[key]),
-          result = _.escape(displayValue);
-        if (column.link) {
-          var target = '';
-          if (column.link.target) {
-            target = column.link.target === 'crm-popup' ? 'class="crm-popup" ' : 'target="' + column.link.target + '" ';
-          }
-          result = '<a ' + target + 'href="' + _.escape(getUrl(column.link.path, rowData)) + '">' + result + '</a>';
-        }
-        return result;
+          displayValue = column.rewrite ? replaceTokens(column.rewrite, rowData, rowMeta) : formatRawValue(column, rowData[key]);
+        return displayValue;
       }
 
       // Formats raw field value according to data type
index 7630a9b86352490fe47c207eb2bcdb63ebd51cb7..8e570383c788ed38727b07c9c989dd1a348e34ba 100644 (file)
@@ -1,5 +1,5 @@
 <span ng-repeat="item in col.links">
-  <a class="btn {{:: col.size }} btn-{{:: item.style }} {{:: item.target }}" target="{{:: item.target }}" href="{{:: displayUtils.getUrl(item.path, row) }}">
+  <a class="btn {{:: col.size }} btn-{{:: item.style }}" target="{{:: item.target }}" href="{{:: displayUtils.getUrl(item.path, row) }}">
     <i ng-if=":: item.icon" class="crm-i {{:: item.icon }}"></i>
     {{:: item.text }}
   </a>
index 4f21543abf02a38e9f307be2f40565087b8ef815..0d7558797005d596e07dc8783ed68aa4f73ad2c8 100644 (file)
@@ -1,2 +1,7 @@
 <crm-search-display-editable row="row" col="col" on-success="$ctrl.refresh(row)" cancel="$ctrl.editing = null;" ng-if="col.editable && $ctrl.editing && $ctrl.editing[0] === rowIndex && $ctrl.editing[1] === col.key"></crm-search-display-editable>
-<span ng-bind-html=":: $ctrl.formatFieldValue(row, col)" ng-class="{'crm-editable-enabled': col.editable && !$ctrl.editing && row[col.editable.id]}" ng-click="col.editable && !$ctrl.editing && ($ctrl.editing = [rowIndex, col.key])"></span>
+<span ng-if="::!col.link" ng-class="{'crm-editable-enabled': col.editable && !$ctrl.editing && row[col.editable.id]}" ng-click="col.editable && !$ctrl.editing && ($ctrl.editing = [rowIndex, col.key])">
+  {{:: $ctrl.formatFieldValue(row, col) }}
+</span>
+<a ng-if="::col.link" target="{{:: col.link.target }}" href="{{:: displayUtils.getUrl(col.link.path, row) }}">
+  {{:: $ctrl.formatFieldValue(row, col) }}
+</a>
index d84651693d176a988cafbff775c081c3ee24625b..c78ecda3ee1478442653cda4731f9d96f807402a 100644 (file)
@@ -1,5 +1,5 @@
 <span ng-repeat="item in col.links">
-  <a class="text-{{:: item.style }} {{:: item.target }}" target="{{:: item.target }}" href="{{:: displayUtils.getUrl(item.path, row) }}">
+  <a class="text-{{:: item.style }}" target="{{:: item.target }}" href="{{:: displayUtils.getUrl(item.path, row) }}">
     <i ng-if=":: item.icon" class="crm-i {{:: item.icon }}"></i>
     {{:: item.text }}
   </a>
index 213f81442425dd185246a33635b8df5dd92d3a7e..ffd5c08ea7fd574a164079a7fe7ef5d798e6a1b4 100644 (file)
@@ -5,7 +5,7 @@
   </button>
   <ul class="dropdown-menu {{ col.alignment === 'text-right' ? 'dropdown-menu-right' : '' }}" ng-if=":: col.open">
     <li ng-repeat="item in col.links" class="bg-{{:: item.style }}">
-      <a href="{{:: displayUtils.getUrl(item.path, row) }}" class="{{:: item.target }}" target="{{:: item.target }}">
+      <a href="{{:: displayUtils.getUrl(item.path, row) }}" target="{{:: item.target }}">
         <i ng-if=":: item.icon" class="crm-i {{:: item.icon }}"></i>
         {{:: item.text }}
       </a>
index aabfd28f3aaf6b55edaf3d9d651258039ee65b8f..563e57a6dfbc5611af2c448b91c292faa6d3d165 100644 (file)
       if (settings.openInline) {
         settings.autoClose = $el.crmSnippet('isOriginalUrl');
         $(this).off('.openInline').on('click.openInline', settings.openInline, function(e) {
-          if ($(this).is(exclude + ', .crm-popup')) {
+          if ($(this).is(exclude + ', .crm-popup, [target=crm-popup]')) {
             return;
           }
           if ($(this).hasClass('open-inline-noreturn')) {
 
   $(function($) {
     $('body')
-      .on('click', 'a.crm-popup', CRM.popup)
+      .on('click', 'a.crm-popup, a[target=crm-popup]', CRM.popup)
       // Close unsaved dialog messages
       .on('dialogopen', function(e) {
         $('.alert.unsaved-dialog .ui-notify-cross', '#crm-notification-container').click();