civicrm-core.git
2 years agoSetup - Remove CiviGrant from available components
Coleman Watts [Fri, 10 Jun 2022 16:25:32 +0000 (12:25 -0400)]
Setup - Remove CiviGrant from available components

Fixes dev/core#3485

2 years agoMerge pull request #23750 from eileenmcnaughton/test_cruft
Seamus Lee [Fri, 10 Jun 2022 06:41:36 +0000 (16:41 +1000)]
Merge pull request #23750 from eileenmcnaughton/test_cruft

Reduce test output spam

2 years agoMerge pull request #23748 from eileenmcnaughton/guzzle
Seamus Lee [Fri, 10 Jun 2022 06:41:18 +0000 (16:41 +1000)]
Merge pull request #23748 from eileenmcnaughton/guzzle

Update guzzle to 6.5.7

2 years agoMerge pull request #23751 from eileenmcnaughton/test_member
Eileen McNaughton [Fri, 10 Jun 2022 04:51:53 +0000 (16:51 +1200)]
Merge pull request #23751 from eileenmcnaughton/test_member

Fix for failing test in master

2 years agoMerge pull request #23746 from totten/master-queue-flag
Eileen McNaughton [Fri, 10 Jun 2022 03:31:58 +0000 (15:31 +1200)]
Merge pull request #23746 from totten/master-queue-flag

CRM_Queue_Runner - Add basic/skeletal support for `runAllInteractively()`

2 years agoMerge pull request #23679 from totten/master-queue-tpl-inclusive
Eileen McNaughton [Fri, 10 Jun 2022 03:00:25 +0000 (15:00 +1200)]
Merge pull request #23679 from totten/master-queue-tpl-inclusive

Civi::queue() - Add support for 'template' queues

2 years agoMerge pull request #23744 from eileenmcnaughton/import_csv
Eileen McNaughton [Fri, 10 Jun 2022 02:59:43 +0000 (14:59 +1200)]
Merge pull request #23744 from eileenmcnaughton/import_csv

Fix unrelease regression - malformed MapField without skipColumnHeaders

2 years agoFix for failing test in master
Eileen McNaughton [Fri, 10 Jun 2022 02:06:46 +0000 (14:06 +1200)]
Fix for failing test in master

2 years agoMerge pull request #23745 from eileenmcnaughton/obsolete_activity
Eileen McNaughton [Fri, 10 Jun 2022 01:40:38 +0000 (13:40 +1200)]
Merge pull request #23745 from eileenmcnaughton/obsolete_activity

Remove obsolete/unused code, fix notices - activity import

2 years agoMerge pull request #23743 from totten/master-queue-runas
Eileen McNaughton [Fri, 10 Jun 2022 01:39:57 +0000 (13:39 +1200)]
Merge pull request #23743 from totten/master-queue-runas

CRM_Queue_Task - Track an optional `$runAs` property

2 years agoReduce test output spam
Eileen McNaughton [Fri, 10 Jun 2022 01:25:21 +0000 (13:25 +1200)]
Reduce test output spam

2 years agoUpdate guzzle to 6.5.7
Eileen McNaughton [Fri, 10 Jun 2022 01:08:19 +0000 (13:08 +1200)]
Update guzzle to 6.5.7

2 years agoFix unrelease regression - malformed MapField without skipColumnHeaders
Eileen McNaughton [Thu, 9 Jun 2022 23:01:33 +0000 (11:01 +1200)]
Fix unrelease regression - malformed MapField without skipColumnHeaders

2 years agoRemove obsolete/unused code - activity import
Eileen McNaughton [Thu, 9 Jun 2022 23:17:29 +0000 (11:17 +1200)]
Remove obsolete/unused code - activity import

2 years agoMerge pull request #23742 from eileenmcnaughton/import_remove
Eileen McNaughton [Thu, 9 Jun 2022 23:57:05 +0000 (11:57 +1200)]
Merge pull request #23742 from eileenmcnaughton/import_remove

Remove more obsolete import code

2 years agodemoqueue - Switch from `runAllViaWeb()` to `runAllInteractive()`
Tim Otten [Tue, 7 Jun 2022 10:32:31 +0000 (03:32 -0700)]
demoqueue - Switch from `runAllViaWeb()` to `runAllInteractive()`

2 years agoImplement runAllInteractive and assertRequirements*
Tim Otten [Tue, 7 Jun 2022 06:12:47 +0000 (23:12 -0700)]
Implement runAllInteractive and assertRequirements*

2 years agoCRM_Queue_Runner - runAllViaWeb should run exclusively via web
Tim Otten [Tue, 7 Jun 2022 02:36:12 +0000 (19:36 -0700)]
CRM_Queue_Runner - runAllViaWeb should run exclusively via web

This is a preventative measure.

2 years agocivicrm/queue/monitor - Add skeletal page for monitoring status
Tim Otten [Sat, 4 Jun 2022 08:09:42 +0000 (01:09 -0700)]
civicrm/queue/monitor - Add skeletal page for monitoring status

2 years agocrmQueueMonitor - Skeletal module
Tim Otten [Tue, 7 Jun 2022 00:31:57 +0000 (17:31 -0700)]
crmQueueMonitor - Skeletal module

2 years agoAdd experimental setting `enableBackgroundQueue`
Tim Otten [Sat, 4 Jun 2022 04:44:35 +0000 (21:44 -0700)]
Add experimental setting `enableBackgroundQueue`

2 years agoCRM_Queue_Runner - Conditionally inherit the queue's error-policy
Tim Otten [Tue, 7 Jun 2022 01:36:09 +0000 (18:36 -0700)]
CRM_Queue_Runner - Conditionally inherit the queue's error-policy

2 years agoFix test fatal
Eileen McNaughton [Thu, 9 Jun 2022 23:40:20 +0000 (11:40 +1200)]
Fix test fatal

2 years agoRemove more obsolete import code
Eileen McNaughton [Thu, 9 Jun 2022 22:32:23 +0000 (10:32 +1200)]
Remove more obsolete import code

2 years agoUserJob - Add property `is_template`
Tim Otten [Thu, 9 Jun 2022 23:32:45 +0000 (16:32 -0700)]
UserJob - Add property `is_template`

Eileen requested, and it's easiest to add now, and it seems safe+consistent.

2 years agoCivi::queue() - Add support for 'template' queues
Tim Otten [Fri, 3 Jun 2022 01:14:41 +0000 (18:14 -0700)]
Civi::queue() - Add support for 'template' queues

Overview
--------

Suppose you are in the habit of making separate queue-instances for
different batches of work.  However, you want to allow the sysadmin to
configure options like `type`, `batch_limit`, and `retry_interval`.

Solution: Make a template

After
-----

```php
// Use the API to register a template, eg
\Civi\Api4\Queue::create()->setValues([
  'name' => 'template-name',
  'is_template' => TRUE,
  ...
])->execute();

// Later, create a queue from the template
$q = Civi::queue('new-queue', ['template' => 'template-name']);
```

2 years agoQueue - Add column `is_template`
Tim Otten [Thu, 9 Jun 2022 23:09:43 +0000 (16:09 -0700)]
Queue - Add column `is_template`

2 years agoCRM_Queue_Task - Track an optional `$runAs` property
Tim Otten [Wed, 27 Oct 2021 07:12:50 +0000 (00:12 -0700)]
CRM_Queue_Task - Track an optional `$runAs` property

2 years agoMerge pull request #23740 from eileenmcnaughton/import_unused
Seamus Lee [Thu, 9 Jun 2022 22:46:40 +0000 (08:46 +1000)]
Merge pull request #23740 from eileenmcnaughton/import_unused

Remove unused functions

2 years agoMerge pull request #23737 from eileenmcnaughton/import_up_multi
colemanw [Thu, 9 Jun 2022 21:20:08 +0000 (17:20 -0400)]
Merge pull request #23737 from eileenmcnaughton/import_up_multi

Add upgrade for label to name conversion in `civicrm_mapping_field` for multiple custom imports

2 years agoMerge pull request #23712 from eileenmcnaughton/import_queue
colemanw [Thu, 9 Jun 2022 21:17:31 +0000 (17:17 -0400)]
Merge pull request #23712 from eileenmcnaughton/import_queue

Enable QueueRunner for all imports

2 years agoMerge pull request #23736 from eileenmcnaughton/import_multi
Eileen McNaughton [Thu, 9 Jun 2022 08:45:25 +0000 (20:45 +1200)]
Merge pull request #23736 from eileenmcnaughton/import_multi

dev/core#3498 Fix mishandled option values

2 years agoAdd missing test file
Eileen McNaughton [Thu, 9 Jun 2022 07:13:03 +0000 (19:13 +1200)]
Add missing test file

2 years agoRemove unused functions
Eileen McNaughton [Thu, 9 Jun 2022 06:29:50 +0000 (18:29 +1200)]
Remove unused functions

These used to be called from run - which is gone itself now

2 years agoUpdate test for runner
Eileen McNaughton [Tue, 7 Jun 2022 22:58:22 +0000 (10:58 +1200)]
Update test for runner

2 years agoEnable QueueRunner for membership import
Eileen McNaughton [Tue, 7 Jun 2022 11:39:53 +0000 (23:39 +1200)]
Enable QueueRunner for membership import

2 years agoAdd upgrade for label to name conversion
Eileen McNaughton [Thu, 9 Jun 2022 03:49:03 +0000 (15:49 +1200)]
Add upgrade for label to name conversion

It wouldn't be that much more to go further & use the group.fieldname format - ....

Add upgrade script to convert saved field mappings to use names

2 years agoExtra fix to headerPatterns so fields 'guess' better
Eileen McNaughton [Thu, 9 Jun 2022 03:32:11 +0000 (15:32 +1200)]
Extra fix to headerPatterns so fields 'guess' better

2 years agodev/core#3498 Fix mishandled option values
Eileen McNaughton [Thu, 9 Jun 2022 03:18:48 +0000 (15:18 +1200)]
dev/core#3498 Fix mishandled option values

2 years agoMerge pull request #23734 from eileenmcnaughton/import_custom
Eileen McNaughton [Thu, 9 Jun 2022 04:20:32 +0000 (16:20 +1200)]
Merge pull request #23734 from eileenmcnaughton/import_custom

Fix test to validate forms & remove some unused code

2 years agoMerge pull request #23735 from colemanw/afformTriggerSuccess
Eileen McNaughton [Thu, 9 Jun 2022 02:05:35 +0000 (14:05 +1200)]
Merge pull request #23735 from colemanw/afformTriggerSuccess

Afform - Trigger 'crmFormSuccess' event after submission

2 years agoMerge pull request #23656 from colemanw/afformOptions
Eileen McNaughton [Thu, 9 Jun 2022 01:35:56 +0000 (13:35 +1200)]
Merge pull request #23656 from colemanw/afformOptions

Afform - allow ids to be passed directly into the directive

2 years agoMerge pull request #23655 from colemanw/searchKitFixJoinAgain
Eileen McNaughton [Thu, 9 Jun 2022 01:32:40 +0000 (13:32 +1200)]
Merge pull request #23655 from colemanw/searchKitFixJoinAgain

SearchKit - Remove confusing extra joins between Contact & Related Contacts

2 years agoFix some a couple of places where form variables were passed, remove a couple more...
Eileen McNaughton [Thu, 9 Jun 2022 00:43:48 +0000 (12:43 +1200)]
Fix some a couple of places where form variables were passed, remove a couple more things

2 years agoFix test to validate forms & remove some unused code
Eileen McNaughton [Thu, 9 Jun 2022 00:27:04 +0000 (12:27 +1200)]
Fix test to validate forms & remove some unused code

2 years agoMerge pull request #23733 from eileenmcnaughton/import_part
Eileen McNaughton [Thu, 9 Jun 2022 00:54:38 +0000 (12:54 +1200)]
Merge pull request #23733 from eileenmcnaughton/import_part

Participant import fix - broken uniqueName fields, mapping saving, ev…

2 years agoAfform - Trigger 'crmFormSuccess' event after submission
Coleman Watts [Thu, 9 Jun 2022 00:24:22 +0000 (20:24 -0400)]
Afform - Trigger 'crmFormSuccess' event after submission

2 years agoAfform - allow ids to be passed directly into the directive not just through the URL
Coleman Watts [Wed, 1 Jun 2022 19:11:46 +0000 (15:11 -0400)]
Afform - allow ids to be passed directly into the directive not just through the URL

This gives Submit Forms the same feature as Search Forms, entity ids can be passed
directly into the directive as 'options', allowing ids to be passed around internally.

2 years agoParticipant import fix - broken uniqueName fields, mapping saving, event_id
Eileen McNaughton [Wed, 8 Jun 2022 21:10:06 +0000 (09:10 +1200)]
Participant import fix - broken uniqueName fields, mapping saving, event_id

This switches to using 'normal' field names
for all participant fields.

2 years agoMerge pull request #23730 from herbdool/issue-3483
Eileen McNaughton [Wed, 8 Jun 2022 23:05:27 +0000 (11:05 +1200)]
Merge pull request #23730 from herbdool/issue-3483

Issue #3483: parent_id not always available as index

2 years agoMerge pull request #23727 from demeritcowboy/squigglefiles
Eileen McNaughton [Wed, 8 Jun 2022 23:05:12 +0000 (11:05 +1200)]
Merge pull request #23727 from demeritcowboy/squigglefiles

[NFC] Remove weird test data file

2 years agoIssue #3483: parent_id not always available as index
Herb [Wed, 8 Jun 2022 21:15:46 +0000 (17:15 -0400)]
Issue #3483: parent_id not always available as index

2 years agoMerge pull request #23719 from eileenmcnaughton/import_cust
Eileen McNaughton [Wed, 8 Jun 2022 20:53:17 +0000 (08:53 +1200)]
Merge pull request #23719 from eileenmcnaughton/import_cust

Fix custom import to work again (broke in master)

2 years agoMerge pull request #23726 from pradpnayak/receiptText
Eileen McNaughton [Wed, 8 Jun 2022 20:48:06 +0000 (08:48 +1200)]
Merge pull request #23726 from pradpnayak/receiptText

Added back 'Renewal Message' field on Membership renewal form

2 years agoremove weird file
demeritcowboy [Wed, 8 Jun 2022 20:14:21 +0000 (16:14 -0400)]
remove weird file

2 years agoMerge pull request #23645 from jmcclelland/profile-require-tag
demeritcowboy [Wed, 8 Jun 2022 20:12:58 +0000 (16:12 -0400)]
Merge pull request #23645 from jmcclelland/profile-require-tag

Enable ability to require tags in profiles

2 years agoEnable ability to require tags in profiles
Jamie McClelland [Tue, 31 May 2022 19:46:55 +0000 (15:46 -0400)]
Enable ability to require tags in profiles

Prior to this change, it was not possible to make tags required in a
profile.

2 years agoAdded back 'Renewal Message' field on Membership renewal form
Pradeep Nayak [Wed, 8 Jun 2022 15:52:39 +0000 (16:52 +0100)]
Added back 'Renewal Message' field on Membership renewal form

2 years agoMerge pull request #23715 from eileenmcnaughton/syntax
colemanw [Wed, 8 Jun 2022 15:31:43 +0000 (11:31 -0400)]
Merge pull request #23715 from eileenmcnaughton/syntax

Remove a couple of non-test tests  - syntax conformance

2 years agoEnotice fix
Eileen McNaughton [Wed, 8 Jun 2022 07:40:35 +0000 (19:40 +1200)]
Enotice fix

2 years agoEnsure no options is FALSE not NULL
Eileen McNaughton [Wed, 8 Jun 2022 07:33:42 +0000 (19:33 +1200)]
Ensure no options is FALSE not NULL

2 years ago(NFC) CRM/Import/Form/DataSource.php
Tim Otten [Wed, 8 Jun 2022 06:04:14 +0000 (23:04 -0700)]
(NFC) CRM/Import/Form/DataSource.php

2 years agoFix custom import to work again (broke in master)
Eileen McNaughton [Wed, 8 Jun 2022 01:52:14 +0000 (13:52 +1200)]
Fix custom import to work again (broke in master)

2 years agoMerge pull request #23717 from eileenmcnaughton/import_contss
Eileen McNaughton [Wed, 8 Jun 2022 04:30:53 +0000 (16:30 +1200)]
Merge pull request #23717 from eileenmcnaughton/import_contss

Fix Contribution import with pledge handling, add test

2 years agoMerge pull request #23718 from totten/master-missing-ext
Tim Otten [Wed, 8 Jun 2022 04:25:33 +0000 (21:25 -0700)]
Merge pull request #23718 from totten/master-missing-ext

(dev/core#3496) Missing extension leads to bootstrap error for "hook_civicrm_entityTypes"

2 years agoFix test to not check the return code that is no longer returned
Eileen McNaughton [Wed, 8 Jun 2022 02:48:00 +0000 (14:48 +1200)]
Fix test to not check the return code that is no longer returned

2 years ago(dev/core#3496) Missing extension leads to bootstrap error for "hook_civicrm_entityTypes"
Tim Otten [Wed, 8 Jun 2022 00:03:04 +0000 (17:03 -0700)]
(dev/core#3496) Missing extension leads to bootstrap error for "hook_civicrm_entityTypes"

2 years agoFix Contribution import with pledge handling, add test
Eileen McNaughton [Wed, 8 Jun 2022 00:50:50 +0000 (12:50 +1200)]
Fix Contribution import with pledge handling, add test

2 years agoSwitch contribution to use same error handling
Eileen McNaughton [Tue, 7 Jun 2022 23:34:20 +0000 (11:34 +1200)]
Switch contribution to use same error handling

2 years agoMerge pull request #23709 from eileenmcnaughton/buttons
colemanw [Wed, 8 Jun 2022 00:21:52 +0000 (20:21 -0400)]
Merge pull request #23709 from eileenmcnaughton/buttons

Trivial extraction - addFormButtons shared code

2 years agoMerge pull request #23714 from eileenmcnaughton/import_conts
colemanw [Tue, 7 Jun 2022 23:59:34 +0000 (19:59 -0400)]
Merge pull request #23714 from eileenmcnaughton/import_conts

Contribution import - simplify error handling

2 years agoMerge pull request #23707 from eileenmcnaughton/import_activity
Eileen McNaughton [Tue, 7 Jun 2022 23:30:37 +0000 (11:30 +1200)]
Merge pull request #23707 from eileenmcnaughton/import_activity

Fix import activity & add tests

2 years agoRemove a couple of non-test tests
Eileen McNaughton [Tue, 7 Jun 2022 23:09:03 +0000 (11:09 +1200)]
Remove a couple of non-test tests

2 years agoMerge pull request #23711 from totten/master-queue-status
Eileen McNaughton [Tue, 7 Jun 2022 22:48:39 +0000 (10:48 +1200)]
Merge pull request #23711 from totten/master-queue-status

Queue - When UserJob has no more tasks, update status & fire hook

2 years agoFix copy & paste
Eileen McNaughton [Tue, 7 Jun 2022 21:59:07 +0000 (09:59 +1200)]
Fix copy & paste

2 years agoRemove copy&paste extraneous select
Eileen McNaughton [Tue, 7 Jun 2022 19:40:28 +0000 (07:40 +1200)]
Remove copy&paste extraneous select

2 years agoFixes for Activity import
Eileen McNaughton [Tue, 7 Jun 2022 02:55:32 +0000 (14:55 +1200)]
Fixes for Activity import

2 years agoExpand try-catch to whole function
Eileen McNaughton [Tue, 7 Jun 2022 03:01:11 +0000 (15:01 +1200)]
Expand try-catch to whole function

2 years agoMerge pull request #23703 from eileenmcnaughton/import_unblock
Eileen McNaughton [Tue, 7 Jun 2022 21:54:14 +0000 (09:54 +1200)]
Merge pull request #23703 from eileenmcnaughton/import_unblock

Fix Participant import, add tests

2 years agoMerge pull request #21471 from mattwire/edittemplatecontributionform
Eileen McNaughton [Tue, 7 Jun 2022 21:39:12 +0000 (09:39 +1200)]
Merge pull request #21471 from mattwire/edittemplatecontributionform

Fix editing and saving a template contribution via form

2 years agoMerge pull request #23713 from colemanw/globFix
Seamus Lee [Tue, 7 Jun 2022 21:20:48 +0000 (07:20 +1000)]
Merge pull request #23713 from colemanw/globFix

PHP8.1 - Fix deprecated passing null to glob

2 years agoSimplify parameters for duplicate - use class functions
Eileen McNaughton [Tue, 7 Jun 2022 21:10:50 +0000 (09:10 +1200)]
Simplify parameters for duplicate - use class functions

2 years agoSimplify error handling - allow catch to handle
Eileen McNaughton [Tue, 7 Jun 2022 20:32:39 +0000 (08:32 +1200)]
Simplify error handling - allow catch to handle

2 years agoRemove call to 'summary'
Eileen McNaughton [Tue, 7 Jun 2022 20:24:13 +0000 (08:24 +1200)]
Remove call to 'summary'

2 years agoMerge pull request #23704 from eileenmcnaughton/try
colemanw [Tue, 7 Jun 2022 19:49:18 +0000 (15:49 -0400)]
Merge pull request #23704 from eileenmcnaughton/try

Expand try-catch to whole function

2 years agoA couple more fixes..
Eileen McNaughton [Tue, 7 Jun 2022 19:38:08 +0000 (07:38 +1200)]
A couple more fixes..

2 years agoEnotice fix
Eileen McNaughton [Tue, 7 Jun 2022 19:05:24 +0000 (07:05 +1200)]
Enotice fix

2 years agoMinor wording tweak
Eileen McNaughton [Tue, 7 Jun 2022 19:00:06 +0000 (07:00 +1200)]
Minor wording tweak

This file is shared by memberships, contributions, participants, activities

2 years agoRemove reference to built in contact types
Eileen McNaughton [Tue, 7 Jun 2022 18:59:05 +0000 (06:59 +1200)]
Remove reference to built in contact types

2 years agoPHP8.1 - Fix deprecated passing null to glob
Coleman Watts [Tue, 7 Jun 2022 18:56:08 +0000 (14:56 -0400)]
PHP8.1 - Fix deprecated passing null to glob

2 years agoFix error due to interim merge adding funciton to parent
Eileen McNaughton [Tue, 7 Jun 2022 18:55:39 +0000 (06:55 +1200)]
Fix error due to interim merge adding funciton to parent

2 years agoFix Participant import, add tests
Eileen McNaughton [Mon, 6 Jun 2022 04:52:56 +0000 (16:52 +1200)]
Fix Participant import, add tests

2 years agoWrap function in try-catch
Eileen McNaughton [Tue, 7 Jun 2022 03:54:16 +0000 (15:54 +1200)]
Wrap function in try-catch

2 years agoMerge pull request #23710 from eileenmcnaughton/civi_import
Yashodha Chaku [Tue, 7 Jun 2022 16:25:17 +0000 (21:55 +0530)]
Merge pull request #23710 from eileenmcnaughton/civi_import

Minor simplification - use `$self->getContactType(),`

2 years agoMerge pull request #23620 from bugfolder/8_move_session_start
demeritcowboy [Tue, 7 Jun 2022 12:59:00 +0000 (08:59 -0400)]
Merge pull request #23620 from bugfolder/8_move_session_start

dev/backdrop#8 - Move session start into CMS-specific classes.

2 years agoMerge pull request #23708 from eileenmcnaughton/date
Monish Deb [Tue, 7 Jun 2022 11:58:41 +0000 (17:28 +0530)]
Merge pull request #23708 from eileenmcnaughton/date

dev/core#2325 Fix handling of seconds on import

2 years agodemoqueue - Include a userjob with the demo
Tim Otten [Tue, 7 Jun 2022 10:25:31 +0000 (03:25 -0700)]
demoqueue - Include a userjob with the demo

2 years agoMinor simplification - use
Eileen McNaughton [Tue, 7 Jun 2022 10:00:51 +0000 (22:00 +1200)]
Minor simplification - use

2 years agoQueue - When UserJob.queue_id works down to zero tasks, update status and fire hook
Tim Otten [Tue, 7 Jun 2022 08:46:34 +0000 (01:46 -0700)]
Queue - When UserJob.queue_id works down to zero tasks, update status and fire hook

Suppose you setup a queue with several tasks and then run them all. What happens
to the queue's status?

Before
------

The status always remains `active`.

After
-----

Depends on the use-case:

* If you have an open-ended queue providing an on-going service (no `UserJob`),
  then the status remains `active`.
* If you have a fixed-purpose queue attached to a `UserJob`, then the status
  changes from `active` to `completed`, and it fires an event:
    ```
    function hook_civicrm_queueStatus(CRM_Queue_Queue $queue, string $status)
    ```

Technical Details
-----------------

* There are two main ways that items get removed from a queue (`Queue.runNext`
  API and `civicrm/queue/ajax/runNext`).  Both of these fire an internal event
  (`civi.queue.check`) to consult the status.

2 years agoMinor extraction - addFormButtons shared code
Eileen McNaughton [Tue, 7 Jun 2022 08:32:57 +0000 (20:32 +1200)]
Minor extraction - addFormButtons shared code