Development issueshttps://lab.civicrm.org/groups/dev/-/issues2022-11-10T16:53:45Zhttps://lab.civicrm.org/dev/core/-/issues/3970SearchKit data segmentation: ability to AND/OR conditions per item2022-11-10T16:53:45ZherbdoolSearchKit data segmentation: ability to AND/OR conditions per itemI'm guessing that the conditions are currently AND. I have a use case for needing an OR if this is possible.
For example, a field either has a specific string OR that same field is blank.I'm guessing that the conditions are currently AND. I have a use case for needing an OR if this is possible.
For example, a field either has a specific string OR that same field is blank.https://lab.civicrm.org/dev/core/-/issues/3969Notice: Undefined offset: 1 in /var/www/html/civicirm/wp-content/plugins/civi...2023-01-17T02:01:54ZyodatakNotice: Undefined offset: 1 in /var/www/html/civicirm/wp-content/plugins/civicrm/civicrm/CRM/Utils/Date.php on line 908Overview
----------------------------------------
I got this error showing in civicrm on PHP7.4 and civicrm 5.55.0, Wordpres 6.1 , Nginx
Reproduction steps
----------------------------------------
Go to a report and on top this show
N...Overview
----------------------------------------
I got this error showing in civicrm on PHP7.4 and civicrm 5.55.0, Wordpres 6.1 , Nginx
Reproduction steps
----------------------------------------
Go to a report and on top this show
Notice: Undefined offset: 1 in /var/www/html/civicrm/wp-content/plugins/civicrm/civicrm/CRM/Utils/Date.php on line 908https://lab.civicrm.org/dev/core/-/issues/3968unsupported operand types in BAO/Navigation.php, orderByWeight2022-11-07T10:27:07Zsebalisunsupported operand types in BAO/Navigation.php, orderByWeightHi,
when trying out if a Wordpress+Civi test instance would survive a PHP upgrade to 8.0, I found that the CiviCRM menu had gone missing. It turned out that a fatal PHP error occured in the AJAX call that retrieves the menu structure. I...Hi,
when trying out if a Wordpress+Civi test instance would survive a PHP upgrade to 8.0, I found that the CiviCRM menu had gone missing. It turned out that a fatal PHP error occured in the AJAX call that retrieves the menu structure. It originated in line 323 of CRM/Core/BAO/Navigation.php, which is in the orderByWeight function:
`return $a['attributes']['weight'] - $b['attributes']['weight'];`
Perhaps PHP 8 is treating such issues more seriously than 7 – sorry but I simply don’t know. In any case, I was able to overcome this by adding explicit type casts:
`return (int) $a['attributes']['weight'] - (int) $b['attributes']['weight'];`
This was complete guesswork and maybe I should have cast to float instead – again, I don’t know. But I thought this might be worth reporting so you can decide how to best safeguard that line. For now I am happy to have my menu back with this temporary and local patch.
By the way, this was observed in version 5.54.1 but I notice that the line is unchanged in the master, 5.55 and 5.56 branches.5.56.0https://lab.civicrm.org/dev/core/-/issues/3967Deduping with multiple fields doesn't work with more than 999 contacts using ...2022-11-04T19:17:46ZlarsssandergreenDeduping with multiple fields doesn't work with more than 999 contacts using MariaDB 10.3+After upgrading to MariaDB 10.3 or later, finding dupes with a rule than uses multiple fields creates queries that runs for hours when checking 1000 contacts, but works fine for 999 contacts.
Here are the steps to replicate:
- MariaDB 1...After upgrading to MariaDB 10.3 or later, finding dupes with a rule than uses multiple fields creates queries that runs for hours when checking 1000 contacts, but works fine for 999 contacts.
Here are the steps to replicate:
- MariaDB 10.3+
- Create a dedupe rule with First Name and Last Name
- Use the rule on a group with 1000 or more contacts (or use the Deduper extension to limit to 1000 contacts)
- Result: query runs for a very long time
- Use the rule on a group with 999 or fewer contacts
- Result: results returned quickly as expected
Turns out this is due to a setting that was added to MariaDB in 10.3: [In Predicate Conversion Threshold](https://mariadb.com/docs/reference/mdb/system-variables/in_predicate_conversion_threshold/), which converts the long list of ids in the query that CiviCRM builds to a temp table when the length of the list of ids exceeds the setting, which is 1000 by default. Changing the setting to 0 fixes the issue by disabling the conversion.
Not clear why the temp table is so slow. I'm going to try creating temp tables with indexes explicitly to see if that helps. If not and nothing else suggests itself as a solution, will at least add some documentation unless others have thoughts on how to resolve this so it doesn't require adjusting settings for everyone using MariaDB.https://lab.civicrm.org/dev/backdrop/-/issues/76The control buttons in crm pop ups are all X's2022-11-10T17:27:08ZalicefruminThe control buttons in crm pop ups are all X'sThe icons in crm-pop-up title bars in backdrop all display as X's see screenshot below:
![allexes](/uploads/f29652a34e9b7d1048ea33507031615c/allexes.png)
They should display as whatever font awesome icon is assigned to them usually so...The icons in crm-pop-up title bars in backdrop all display as X's see screenshot below:
![allexes](/uploads/f29652a34e9b7d1048ea33507031615c/allexes.png)
They should display as whatever font awesome icon is assigned to them usually something like print, minimize, maximize or close see screenshot below:
![rightIcons](/uploads/1de63b46ded997951c0a0b5e8f7e49b5/rightIcons.png)5.55.2https://lab.civicrm.org/dev/core/-/issues/3966Contact ID, External ID and CRM User ID should only be shown once on the cont...2022-11-10T07:07:58ZlarsssandergreenContact ID, External ID and CRM User ID should only be shown once on the contact pageCurrently, out of the box, Contact ID and External ID are shown both in the Contact footer, which is visible on all Contact tabs and in the ID, Type, Tags block which is shown on the Contact Summary tab. [A PR](https://github.com/civicrm...Currently, out of the box, Contact ID and External ID are shown both in the Contact footer, which is visible on all Contact tabs and in the ID, Type, Tags block which is shown on the Contact Summary tab. [A PR](https://github.com/civicrm/civicrm-core/pull/24883) will add CRM User ID to the footer as well.
![image](/uploads/4aa3cf01bb4ed418a9c8aaae4ee30dd5/image.png)
I think we should not be duplicating this data on the Contact page. Either it should be shown in a block or it should be shown in the footer, but not both by default as that just wastes space and contributes to an overly busy UI that discourages adoption of CiviCRM.
I think it makes sense to separate the Tags block from the IDs and Contact Type block, as these are very different pieces of data and some may want to see one and not the other.
Some options:
1) Show Contact ID, CRM User ID, External ID and Contact Type in the footer. Remove the Summary tab block with these items, leaving just the Tags block. Or, if we want to give people the option to show the IDs and Contact Type as a block, keep it available, but not visible by default (like the Open ID block, which still exists, but isn't shown by default on new installs). The downside of showing this data in the footer is it is not configurable like the blocks are. The advantage is that the footer is less prominent than a block, which fits with the lower importance of this data, and the footer is visible on all Contact tabs, not just the Summary.
2) Remove all of these items from the footer and only show them in a block.
3) Make the footer only visible to those with Administer CiviCRM permission (as a convenience for admins) and also show the IDs in a block for everyone.
4) Keep everything as is, there are good reasons to duplicate this information.https://lab.civicrm.org/dev/core/-/issues/3965Adding mailing events (unsub, open, clicks, etc) to API42023-10-16T00:28:23ZlarsssandergreenAdding mailing events (unsub, open, clicks, etc) to API4I'd like to add mailing events to API4 so we can use them in SearchKit, to improve the A/B Mailing report page, and so on.
This would be all the [Mailing Events here.](https://github.com/civicrm/civicrm-core/tree/master/CRM/Mailing/Even...I'd like to add mailing events to API4 so we can use them in SearchKit, to improve the A/B Mailing report page, and so on.
This would be all the [Mailing Events here.](https://github.com/civicrm/civicrm-core/tree/master/CRM/Mailing/Event/DAO) Not sure they are all essential, but might as well do them all at once, as they will all be very similar.
Having poked around at this, I see a few issues that I think I need some help with before starting on this.
We have, for example, TrackableURLOpen, which links to a TrackableURL and also to the Queue entity, which links to the Job entity, which links to the Mailing entity. I don't think we want to have users building queries with joins on all of these entities in SearchKit in order to get useful information back. Ideally, we'd have an entity that has a get action that would return:
- id from TrackableURLOpen
- timestamp from TrackableURLOpen
- URL from TrackableURL
- contact id from Queue
- mailing id from Job
Can we do this by adding all these entities to the API, adding entity bridges to connect them all and then adding an abstract entity that wraps everything up together, with a get function that gets all the fields above from the API (and a getfields function as well). Or is there a less manual way to do this?
Also, I see that the Queue entity already exists in API4, but it isn't the Mailing_Event_Queue entity. Is there a way to specify the full class for an entity so that we don't get a collision? It looks like it just expects the last word from the classname as the API class and that won't work in this case. This might be helpful in general here, because adding an entity called just Opened is going to be confusing (versus naming it something like MailingEventOpened).https://lab.civicrm.org/dev/core/-/issues/3964Activity import: source_record_id field not importable2022-12-12T16:43:41ZSandor SemseyActivity import: source_record_id field not importableOverview
---
During activity import (**Contacts >> Import Activities**) Source Record ID field cannot be mapped and imported. In my understanding that is because this field is not marked as importable. If I add the `import => TRUE` to th...Overview
---
During activity import (**Contacts >> Import Activities**) Source Record ID field cannot be mapped and imported. In my understanding that is because this field is not marked as importable. If I add the `import => TRUE` to the relevant DAO, `source_record_id` can be mapped and imported successfully.
I haven't found any references except for this unresolved StackExchange question (https://civicrm.stackexchange.com/questions/33639/importing-signatures-into-petition) and a related issue (https://lab.civicrm.org/dev/core/-/issues/1380) where the OP wants to import petition signatures into Civi.
I checked the oldest available version of Civi on GitHub and this field wasn't marked as importable even then. So this seems quite historical.
I wonder, is there any reasons why this field can't be imported?
Example use-case
---
Importing petition signatures from other systems to CiviCRM.
Current behaviour
---
Not possible to import `source_record_id` for activities.
Proposed behaviour
---
Possible to import `source_record_id` for activities.
Comments
---
I'm happy to open a PR if it gets approved.https://lab.civicrm.org/dev/core/-/issues/3963Mix of auto renewing membership types and non-auto renewing membership types ...2024-03-15T21:08:28ZEdselopezMix of auto renewing membership types and non-auto renewing membership types not handled properly in pricesets.Overview
----------------------------------------
On a membership price set, it is possible to specify a mix of auto renewing memberships as well as non auto renewing memberships, but allow the selection of only one at a time (by virtue ...Overview
----------------------------------------
On a membership price set, it is possible to specify a mix of auto renewing memberships as well as non auto renewing memberships, but allow the selection of only one at a time (by virtue of it being a radio select). It seems CiviCRM doesn't know how to handle this properly, as it assumes that multiple options can be selected.
The code here https://github.com/civicrm/civicrm-core/blob/master/CRM/Price/BAO/PriceSet.php#L1290 seems to fetch the HTML type (which should be the deciding factor on if the payment processor is compatible with handling multiple concurrent transactions) but doesn't really do anything with it.
Reproduction steps
----------------------------------------
1. Create a membership price set
2. Add a price field of type radio
3. Proceed to create selections having membership types selected, but be sure to include a mix of auto renewing membership types and non-auto renewing membership types
4. Add the price field on a contribution page and click save.
Current behaviour
----------------------------------------
(I have tested this for PayPal - Website Payments Standard, but it should be replicable for any payment processor which doesn't support "MultipleConcurrentPayments".
Error shown when trying to save
"Price Set
The membership price set associated with this online contribution allows a user to select BOTH an auto-renew AND a non-auto-renew membership. This requires submitting multiple processor transactions, and is not supported for one or more of the payment processors enabled under the Amounts tab."
Expected behaviour
----------------------------------------
The contribution form should recognize that the price field is a single select field, and therefore allow me to save the configuration.
Environment information
----------------------------------------
* __Browser:__ _Firefox 59.0.1/Chrome 78.0.3904/Safari 13_
* __CiviCRM:__ _Master/5.20.0/5.19.1/5.18.2/..._ <!-- If this problem relates to an upgrade, then specify both old and new versions -->
* __PHP:__ _7.0/7.1/7.2/7.3/...__
* __CMS:__ _Backdrop 1.5/Drupal 7.30/Joomla 3.3/WordPress 4.5/..._
* __Database:__ _MySQL 5.7.7/MariaDB 10.4/..._
* __Web Server:__ _Apache 2.4/Nginx 1.16/..._5.69.5seamusleeseamusleehttps://lab.civicrm.org/dev/core/-/issues/3962Bool token formatting2022-11-18T14:27:07ZeileenBool token formattingI hit an issue today where we were using tokens in smarty. We already have this format in several message templates - e.g
`{if '{contact.current_employer}'} ({contact.current_employer}){/if}`
The single quotes are necessary as `{if } ...I hit an issue today where we were using tokens in smarty. We already have this format in several message templates - e.g
`{if '{contact.current_employer}'} ({contact.current_employer}){/if}`
The single quotes are necessary as `{if } {/if} ` will fail - so it renders to `{if ''} {/if} `
However, the problem we hit is if the employer is `O'Malley Construction'` which renders as `{if 'O'Malley Construction'} {/if} `
I think the solution is to add a bool modifier & allow any token to be passed through it - it would also simplify the smarty a little - ie
`{if {contact.current_employer|bool}} ({contact.current_employer}){/if}`5.57.0https://lab.civicrm.org/dev/core/-/issues/3960Assigning to accounting batch and closing batch fails with javascript error2022-11-07T23:48:10Zaydunsaidan.saunders@squiffle.ukAssigning to accounting batch and closing batch fails with javascript errorOverview
----------------------------------------
Attempting to assign a contribution to an accounting batch using the 'assign' link fails with
```
Uncaught TypeError: text is undefined
alert https://dmaster.demo.civicrm.org/sites/...Overview
----------------------------------------
Attempting to assign a contribution to an accounting batch using the 'assign' link fails with
```
Uncaught TypeError: text is undefined
alert https://dmaster.demo.civicrm.org/sites/all/modules/civicrm/js/Common.js?rkod02:1339
saveRecord https://dmaster.demo.civicrm.org/civicrm/batchtransaction?reset=1&bid=1:2123
jQuery 7
saveRecord https://dmaster.demo.civicrm.org/civicrm/batchtransaction?reset=1&bid=1:2110
assignRemove https://dmaster.demo.civicrm.org/civicrm/batchtransaction?reset=1&bid=1:2078
onclick https://dmaster.demo.civicrm.org/civicrm/batchtransaction?reset=1&bid=1:1
Common.js:1339:9
```
Similarly attempting to close a batch using the 'Close Batch' button produces the same javascript error. The 'Close and Export Batch' button does work.
Reproduction steps
----------------------------------------
1. Create a new batch using **Contributions -> Accounting Batches > New Batch**.
1. On the list of contributions, use the 'Assign' menu option at the right of a contribution
1. Enjoy the spinning wheel of doom.
Next:
1. Reload the page
2. Check the tickbox next to a contribution and use the 'Assign to Batch' action from the drop-down menu to add a contribution to the batch.
3. Attempt to close the batch using the 'Close Batch' button.
4. After the confirmation popup, nothing happens except for the javascript error in the browser console.
Current behaviour
----------------------------------------
Javascript Error as above
Also, in the browser's dev tools network tab note the response to the REST call:
```
{
"error_message": "FATAL: Invalid credential",
"is_error": 1
}
```
Expected behaviour
----------------------------------------
No error
Environment information
----------------------------------------
* __CiviCRM:__ _Master_ <!-- If this problem relates to an upgrade, then specify both old and new versions -->
This happens on the current version of master (confirmed on dmaster.demo.civicrm.org) but was also present in at least 5.53.0 and 5.54.15.56.0https://lab.civicrm.org/dev/core/-/issues/3959Event Scheduled Reminder Behavior2022-11-10T07:20:20ZLKuttnerEvent Scheduled Reminder BehaviorI am wondering if this behavior has been changed-- I did not see any online mention of a change with Scheduled Reminders.
Scenario: A schedule event reminder was set for 24 hours before the event start time 4:00 PM Tuesday.
On Monday at...I am wondering if this behavior has been changed-- I did not see any online mention of a change with Scheduled Reminders.
Scenario: A schedule event reminder was set for 24 hours before the event start time 4:00 PM Tuesday.
On Monday at 4:00 PM, 24 Hours before the event, the reminder is successfully sent to registered attendees.
On Tuesday, the day of the event, additional contacts register.
Expected behavior: The scheduled reminder that was sent on the previous day is NOT sent to new registrants.
Experienced behavior: The reminder scheduled for the previous day is sent ten minutes after a new contact registered.
I do not find any explanation for the later sent reminder emails.
This is with CiviCRM 5.45.7 on Drupal 7 with PHP 7.3.29https://lab.civicrm.org/dev/financial/-/issues/211Sending receipt auto when editing a payment (editing financial trx payment)2023-01-18T20:26:40Zlevi.kSending receipt auto when editing a payment (editing financial trx payment)@JoeMurray
Steps to reproduce
1. Add a contribution
2. Edit the payment (the edit needs to be of the sort that will create a minus and plus transaction) like changing a payment method
(This does not happen when editing the financial...@JoeMurray
Steps to reproduce
1. Add a contribution
2. Edit the payment (the edit needs to be of the sort that will create a minus and plus transaction) like changing a payment method
(This does not happen when editing the financial type on the contribution eventhough it effects a plus and minus transaction (when the account is different))
3. The system will then send a unwanted email receipt (think its using the payment receipt (not contribution receipt)
Drupal 7
civicrm 5.53.0Monish DebMonish Debhttps://lab.civicrm.org/dev/core/-/issues/3958PHP 8.2 deprecations2024-01-11T18:55:35ZseamusleePHP 8.2 deprecationsThis is to be a catch all issue for working on PHP8.2 issues
@bradleyt had already created the following issues for some specific PHP8.2 issues
* [Dynamic Properties are Deprecated](https://lab.civicrm.org/dev/core/-/issues/3833)
* [De...This is to be a catch all issue for working on PHP8.2 issues
@bradleyt had already created the following issues for some specific PHP8.2 issues
* [Dynamic Properties are Deprecated](https://lab.civicrm.org/dev/core/-/issues/3833)
* [Deprecated ${} string interpolation](https://lab.civicrm.org/dev/core/-/issues/3831)
* [utf8_encode and utf8_decode functions deprecated](https://lab.civicrm.org/dev/core/-/issues/3832)
There are probably others out there but adding this to help us navigate to the various sub issueshttps://lab.civicrm.org/dev/core/-/issues/3956SearchKit: Tagging a saved search adds strange "Include tags used for Saved S...2022-10-30T13:47:08ZlarsssandergreenSearchKit: Tagging a saved search adds strange "Include tags used for Saved Searches" search option to Advanced Search![image](/uploads/7472f315ef96fdc3d5c3c0ef829eb893/image.png)
Steps to reproduce on dmaster:
- Save a SK search with a tag
- This odd search option shows up in Advanced Search![image](/uploads/7472f315ef96fdc3d5c3c0ef829eb893/image.png)
Steps to reproduce on dmaster:
- Save a SK search with a tag
- This odd search option shows up in Advanced Searchhttps://lab.civicrm.org/dev/core/-/issues/3954sybunt/lybunt default for "this year" is 20122022-10-28T22:40:31ZDaveDsybunt/lybunt default for "this year" is 2012As much as we all want to forget the last few years happened, defaulting back to 2012 might be too far.
Note that in sample data it used to be hardcoded in a saved instance as 2011 but now that the 10 year window in the dropdown has pas...As much as we all want to forget the last few years happened, defaulting back to 2012 might be too far.
Note that in sample data it used to be hardcoded in a saved instance as 2011 but now that the 10 year window in the dropdown has passed that's now effectively ignored, so can close https://lab.civicrm.org/dev/core/-/issues/1091
But in regular installs it's a bit silly.
The problem though is the 'default' parameter doesn't seem to get used. It's correctly set to date('Y'). I dunno why it doesn't work yet.https://lab.civicrm.org/dev/core/-/issues/3953Fatal error after upgrade to 5.54.0 and enabling Authx2022-11-01T22:19:44ZkcristianoFatal error after upgrade to 5.54.0 and enabling AuthxI want to log this as it was very puzzling, but could be site specific.
Upgraded from CiviCRM 5.51.3 to 5.54.0 on WP 5.9.x and php 7.4 on a Multi-Site.
Also updated Mosaico from 2.9.x to 2.10
After Upgrade CiviCRM said Authx needed to...I want to log this as it was very puzzling, but could be site specific.
Upgraded from CiviCRM 5.51.3 to 5.54.0 on WP 5.9.x and php 7.4 on a Multi-Site.
Also updated Mosaico from 2.9.x to 2.10
After Upgrade CiviCRM said Authx needed to be enabled, so I did that.
Once I did that on the 'sub-sites' all non admins could not load New Mailings, Contribution Dashboard, Advanced search.
Error was
```
$Fatal Error Details = array:3 [
"message" => "The "cache.decendantGroups" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead."
"code" => null
"exception" => Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException {#3618
-id: "cache.decendantGroups"
-sourceId: null
-alternatives: []
#message: "The "cache.decendantGroups" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead."
```
I was able to grant two new poermissions to the user's role
```
AuthX: Authenticate to services with password
AuthX: Authenticate to services with API key
```
That seems to have fixed the issue - but I don't understand what really happened here.
Will try and reproduce and report back.https://lab.civicrm.org/dev/core/-/issues/3952Event badges, json may be broken (was CiviEvent - Date tokens may be misforma...2023-11-14T01:27:44ZtottenEvent badges, json may be broken (was CiviEvent - Date tokens may be misformatted)(*This is an offshoot from #3829. PR [24695](https://github.com/civicrm/civicrm-core/pull/24695) bundled in a partial fix for this date-token issue, but it looks to me like this is distinct from the barcode problem - and this still has s...(*This is an offshoot from #3829. PR [24695](https://github.com/civicrm/civicrm-core/pull/24695) bundled in a partial fix for this date-token issue, but it looks to me like this is distinct from the barcode problem - and this still has some TODOs.*)
v5.43 included an update for certain tokens. It recommended adding an explicit date filter:
* `{event.start_date}` => `{event.start_date|crmDate:"%B %E%f}`
* `{event.end_date}` => `{event.end_date|crmDate:"%B %E%f}`
Notably, the default content in `civicrm_print_label`.`data` has references to these tokens. It was updated by way of [873bfeb503caa413f17460](https://github.com/civicrm/civicrm-core/commit/873bfeb503caa413f17460dbe450b74fac3d6dbf#diff-b604dfcba0703a9cd5e9f1431451f657c2a580b1dfd8eb56e2c4e4a960c4b43c) (see `FiveFortyThree.php` and `civicrm_navigation.tpl`). However, the `data` field have special encoding requirements (JSON?), so it's not a simple string-substitution.
With [24695](https://github.com/civicrm/civicrm-core/pull/24695), it sounds like the escaping is fixed for new installs (5.54.1+). However, we probably need a cleanup/upgrade step for sites which either (a) installed 5.43-5.54 or (b) installed <5.43 and ran the upgrade.5.69.0https://lab.civicrm.org/dev/core/-/issues/3951AdminUI: Edit and Delete buttons don't work for Financial Types2022-10-28T02:27:08ZlarsssandergreenAdminUI: Edit and Delete buttons don't work for Financial TypesIn the new AdminUI screen for managing Financial Types, the Edit and Delete buttons don't work - they just bring up the same screen in a pop-up.
This was just [merged recently.](https://github.com/civicrm/civicrm-core/pull/24715)
Teste...In the new AdminUI screen for managing Financial Types, the Edit and Delete buttons don't work - they just bring up the same screen in a pop-up.
This was just [merged recently.](https://github.com/civicrm/civicrm-core/pull/24715)
Tested on dmaster (5.56).https://lab.civicrm.org/dev/core/-/issues/3949SearchKit: no JOIN available for ContactReference custom fields2023-05-11T04:35:35ZherbdoolSearchKit: no JOIN available for ContactReference custom fieldsI have a ContactReference custom field and an EntityRef field defined in XML schema on an entity. [Update: both are storing a single contact id] In SK I'd like to add a join to the Contact entity via the custom field. There is one availa...I have a ContactReference custom field and an EntityRef field defined in XML schema on an entity. [Update: both are storing a single contact id] In SK I'd like to add a join to the Contact entity via the custom field. There is one available for the EntityRef field, but not ContactReference custom field. I can make the join in API4 just fine.
This looks like a missing piece of functionality. Or I'm just not looking in the right place.