foreach ($angular->getResources($moduleNames, 'settingsFactory', 'settingsFactory') as $moduleName => $factory) {
$settingsByModule[$moduleName] = array_merge($settingsByModule[$moduleName] ?? [], $factory());
}
+ // Add clientside permissions
+ $permissions = [];
+ $toCheck = $angular->getResources($moduleNames, 'permissions', 'permissions');
+ foreach ($toCheck as $perms) {
+ foreach ((array) $perms as $perm) {
+ if (!isset($permissions[$perm])) {
+ $permissions[$perm] = \CRM_Core_Permission::check($perm);
+ }
+ }
+ }
// TODO optimization; client-side caching
- return array_merge($settingsByModule, [
+ return array_merge($settingsByModule, ['permissions' => $permissions], [
'resourceUrls' => \CRM_Extension_System::singleton()->getMapper()->getActiveModuleUrls(),
'angular' => [
'modules' => $moduleNames,
'partials' => ['ang/crmMailing'],
'settingsFactory' => ['CRM_Mailing_Info', 'createAngularSettings'],
'requires' => ['crmUtil', 'crmAttachment', 'crmAutosave', 'ngRoute', 'ui.utils', 'crmUi', 'dialogService', 'crmResource'],
+ 'permissions' => [
+ 'view all contacts',
+ 'edit all contacts',
+ 'access CiviMail',
+ 'create mailings',
+ 'schedule mailings',
+ 'approve mailings',
+ 'delete in CiviMail',
+ 'edit message templates',
+ ],
];
public function factoryScenarios() {
return [
- ['dummy1', 2, 1],
- ['dummy2', 2, 0],
- ['dummy3', 2, 2],
+ ['dummy1', 2, 1, ['access CiviCRM', 'administer CiviCRM']],
+ ['dummy2', 2, 0, []],
+ ['dummy3', 2, 2, ['access CiviCRM', 'administer CiviCRM', 'view debug output']],
];
}
* @param $module
* @param $expectedSettingCount
* @param $expectedCallbackCount
+ * @param $expectedPermissions
*/
- public function testSettingFactory($module, $expectedSettingCount, $expectedCallbackCount) {
+ public function testSettingFactory($module, $expectedSettingCount, $expectedCallbackCount, $expectedPermissions) {
(new \Civi\Angular\AngularLoader())
->setModules([$module])
->useApp()
->load();
// Run factory callbacks
- $factorySettings = \Civi::resources()->getSettings();
+ $actual = \Civi::resources()->getSettings();
// Dummy1 module's factory setting should be set if it is loaded directly or required by dummy3
- $this->assertTrue(($expectedCallbackCount > 0) === isset($factorySettings['dummy1']['dummy_setting_factory']));
+ $this->assertTrue(($expectedCallbackCount > 0) === isset($actual['dummy1']['dummy_setting_factory']));
// Dummy3 module's factory setting should be set if it is loaded directly
- $this->assertTrue(($expectedCallbackCount > 1) === isset($factorySettings['dummy3']['dummy_setting_factory']));
+ $this->assertTrue(($expectedCallbackCount > 1) === isset($actual['dummy3']['dummy_setting_factory']));
// Dummy1 module's regular setting should be set if it is loaded directly or required by dummy3
- $this->assertTrue(($module !== 'dummy2') === isset($factorySettings['dummy1']['dummy_setting']));
+ $this->assertTrue(($module !== 'dummy2') === isset($actual['dummy1']['dummy_setting']));
// Dummy2 module's regular setting should be set if loaded
- $this->assertTrue(($module === 'dummy2') === isset($factorySettings['dummy2']['dummy_setting']));
+ $this->assertTrue(($module === 'dummy2') === isset($actual['dummy2']['dummy_setting']));
+
+ // Assert appropriate permissions have been added
+ $this->assertEquals($expectedPermissions, array_keys($actual['permissions']));
// Assert the callback functions ran the expected number of times
$this->assertEquals($expectedSettingCount, self::$dummy_setting_count);
$modules['dummy1'] = [
'ext' => 'civicrm',
'settings' => $this->getDummySetting(),
+ 'permissions' => ['access CiviCRM', 'administer CiviCRM'],
'settingsFactory' => [self::class, 'getDummySettingFactory'],
];
$modules['dummy2'] = [
'ext' => 'civicrm',
// The string self::class is preferred but passing object $this should also work
'settingsFactory' => [$this, 'getDummySettingFactory'],
+ // This should get merged with dummy1's permissions
+ 'permissions' => ['view debug output', 'administer CiviCRM'],
'requires' => ['dummy1'],
];
}