*/
protected $region;
+ /**
+ * @var array
+ * When adding supplimental modules via snippet,
+ * these modules are already loaded.
+ */
+ protected $modulesAlreadyLoaded = [];
+
/**
* @var string
* Ex: 'civicrm/a'.
$this->region = \CRM_Utils_Request::retrieve('snippet', 'String') ? 'ajax-snippet' : 'html-header';
$this->pageName = \CRM_Utils_System::currentPath();
$this->modules = [];
+ if ($this->region === 'ajax-snippet' && !empty($_GET['crmAngularModules'])) {
+ $this->modulesAlreadyLoaded = explode(',', $_GET['crmAngularModules']);
+ }
+ // Ensure region exists
+ \CRM_Core_Region::instance($this->region);
}
/**
]);
}
- $moduleNames = $this->findActiveModules();
+ $allModules = $this->findActiveModules();
+ $moduleNames = array_values(array_diff($allModules, $this->modulesAlreadyLoaded));
+
+ if (!$moduleNames && $this->modulesAlreadyLoaded) {
+ // No modules to load
+ return $this;
+ }
if (!$this->isAllModules($moduleNames)) {
$assetParams = ['modules' => implode(',', $moduleNames)];
}
$assetParams = ['nonce' => md5(implode(',', $moduleNames))];
}
- $res->addSettingsFactory(function () use (&$moduleNames, $angular, $res, $assetParams) {
+ $res->addSettingsFactory(function () use (&$moduleNames, $angular, $res, $assetParams, $allModules) {
// Merge static settings with the results of settingsFactory functions
$settingsByModule = $angular->getResources($moduleNames, 'settings', 'settings');
foreach ($angular->getResources($moduleNames, 'settingsFactory', 'settingsFactory') as $moduleName => $factory) {
return array_merge($settingsByModule, ['permissions' => $permissions], [
'resourceUrls' => \CRM_Extension_System::singleton()->getMapper()->getActiveModuleUrls(),
'angular' => [
- 'modules' => $moduleNames,
+ 'modules' => $allModules,
'requires' => $angular->getResources($moduleNames, 'requires', 'requires'),
'cacheCode' => $res->getCacheCode(),
'bundleUrl' => \Civi::service('asset_builder')->getUrl('angular-modules.json', $assetParams),
]);
});
- $res->addScriptFile('civicrm', 'bower_components/angular/angular.min.js', 100, $this->getRegion(), FALSE);
+ if (!$this->modulesAlreadyLoaded) {
+ $res->addScriptFile('civicrm', 'bower_components/angular/angular.min.js', 100, $this->getRegion(), FALSE);
+ }
$headOffset = 0;
$config = \CRM_Core_Config::singleton();
- if ($config->debug) {
- // FIXME: The `resetLocationProviderHashPrefix.js` has to stay in sync with `\Civi\Angular\Page\Modules::buildAngularModules()`.
- $res->addScriptFile('civicrm', 'ang/resetLocationProviderHashPrefix.js', 101, $this->getRegion(), FALSE);
+ if ($config->debug || $this->modulesAlreadyLoaded) {
+ if (!$this->modulesAlreadyLoaded) {
+ // FIXME: The `resetLocationProviderHashPrefix.js` has to stay in sync with `\Civi\Angular\Page\Modules::buildAngularModules()`.
+ $res->addScriptFile('civicrm', 'ang/resetLocationProviderHashPrefix.js', 101, $this->getRegion(), FALSE);
+ }
foreach ($moduleNames as $moduleName) {
foreach ($this->angular->getResources($moduleName, 'css', 'cacheUrl') as $url) {
$res->addStyleUrl($url, self::DEFAULT_MODULE_WEIGHT + (++$headOffset), $this->getRegion());
}
}
// Add bundles
- foreach ($this->angular->getResources($moduleNames, 'bundles', 'bundles') as $bundles) {
- $res->addBundle($bundles);
+ if (!$this->modulesAlreadyLoaded) {
+ foreach ($this->angular->getResources($moduleNames, 'bundles', 'bundles') as $bundles) {
+ $res->addBundle($bundles);
+ }
}
return $this;
public function onRegionRender($e) {
if ($e->region->_name === $this->region && ($this->modules || $this->crmApp)) {
$this->loadAngularResources();
- $this->res->addScriptFile('civicrm', 'js/crm-angularjs-loader.js', 200, $this->getRegion(), FALSE);
+ if (!$this->modulesAlreadyLoaded) {
+ $this->res->addScriptFile('civicrm', 'js/crm-angularjs-loader.js', 200, $this->getRegion(), FALSE);
+ }
}
}
angular.module('crmResource').factory('crmResource', function($q, $http) {
var deferreds = {}; // null|object; deferreds[url][idx] = Deferred;
- var templates = null; // null|object; templates[url] = HTML;
var notify = function notify() {
var oldDfrds = deferreds;
deferreds = null;
angular.forEach(oldDfrds, function(dfrs, url) {
- if (templates[url]) {
+ if (CRM.angular.templates[url]) {
angular.forEach(dfrs, function(dfr) {
dfr.resolve({
status: 200,
var headers = {'Content-type': 'text/html'};
return name ? headers[name] : headers;
},
- data: templates[url]
+ data: CRM.angular.templates[url]
});
});
}
var moduleUrl = CRM.angular.bundleUrl;
$http.get(moduleUrl)
.then(function httpSuccess(response) {
- templates = [];
- angular.forEach(response.data, function(module) {
+ CRM.angular.templates = CRM.angular.templates || {};
+ angular.forEach(response.data, function (module) {
if (module.partials) {
- angular.extend(templates, module.partials);
+ angular.extend(CRM.angular.templates, module.partials);
}
if (module.strings) {
CRM.addStrings(module.domain, module.strings);
});
notify();
}, function httpError() {
- templates = [];
notify();
});
return {
// @return string|Promise<string>
getUrl: function getUrl(url) {
- if (templates !== null) {
- return templates[url];
+ if (CRM.angular.templates && CRM.angular.templates[url]) {
+ return CRM.angular.templates[url];
}
else {
var deferred = $q.defer();