*/
function afform_civicrm_managed(&$entities) {
_afform_civix_civicrm_managed($entities);
+
+ /** @var \CRM_Afform_AfformScanner $scanner */
+ if (\Civi::container()->has('afform_scanner')) {
+ $scanner = \Civi::service('afform_scanner');
+ }
+ else {
+ // This might happen at oddballs points - e.g. while you're in the middle of re-enabling the ext.
+ // This AfformScanner instance only lives during this method call, and it feeds off the regular cache.
+ $scanner = new CRM_Afform_AfformScanner();
+ }
+
+ foreach ($scanner->getMetas() as $afform) {
+ if (empty($afform['is_dashlet']) || empty($afform['name'])) {
+ continue;
+ }
+ $entities[] = [
+ 'module' => E::LONG_NAME,
+ 'name' => 'afform_dashlet_' . $afform['name'],
+ 'entity' => 'Dashboard',
+ 'update' => 'always',
+ // ideal cleanup policy might be to (a) deactivate if used and (b) remove if unused
+ 'cleanup' => 'always',
+ 'params' => [
+ 'version' => 3,
+ // Q: Should we loop through all domains?
+ 'domain_id' => CRM_Core_BAO_Domain::getDomain()->id,
+ 'is_active' => TRUE,
+ 'name' => $afform['name'],
+ 'label' => $afform['title'] ?? ts('(Untitled)'),
+ 'directive' => _afform_angular_module_name($afform['name'], 'dash'),
+ 'permission' => "@afform:" . $afform['name'],
+ ],
+ ];
+ }
}
/**
function afform_civicrm_angularModules(&$angularModules) {
_afform_civix_civicrm_angularModules($angularModules);
- $afforms = \Civi\Api4\Afform::get()
- ->setCheckPermissions(FALSE)
+ $afforms = \Civi\Api4\Afform::get(FALSE)
->setSelect(['name', 'requires', 'module_name', 'directive_name'])
->execute();
$params = [
'action' => 'create',
'where' => [['name', '=', $afField->getAttribute('name')]],
- 'select' => ['title', 'input_type', 'input_attrs', 'options'],
+ 'select' => ['label', 'input_type', 'input_attrs', 'options'],
'loadOptions' => TRUE,
];
if (in_array($entityType, CRM_Contact_BAO_ContactType::basicTypes(TRUE))) {
$params['values'] = ['contact_type' => $entityType];
$entityType = 'Contact';
}
- $getFields = civicrm_api4($entityType, 'getFields', $params);
- // Merge field definition data with whatever's already in the markup
+ // Merge field definition data with whatever's already in the markup.
+ // If the admin has chosen to include this field on the form, then it's OK for us to get metadata about the field - regardless of user's other permissions.
+ $getFields = civicrm_api4($entityType, 'getFields', $params + ['checkPermissions' => FALSE]);
$deep = ['input_attrs'];
foreach ($getFields as $fieldInfo) {
$existingFieldDefn = trim(pq($afField)->attr('defn') ?: '');
}
}
+/**
+ * Implements hook_civicrm_permissionList().
+ *
+ * @see CRM_Utils_Hook::permissionList()
+ */
+function afform_civicrm_permissionList(&$permissions) {
+ $scanner = Civi::service('afform_scanner');
+ foreach ($scanner->getMetas() as $name => $meta) {
+ $permissions['@afform:' . $name] = [
+ 'group' => 'afform',
+ 'title' => ts('Afform: Inherit permission of %1', [
+ 1 => $name,
+ ]),
+ ];
+ }
+}
+
/**
* Clear any local/in-memory caches based on afform data.
*/