res = CRM_Core_Resources::singleton(); } /** * This function takes care of all the things common to all * pages. This typically involves assigning the appropriate * smarty variable :) * * @return string * The content generated by running this page */ public function run() { $this->registerResources(); return parent::run(); } /** * Register resources required by Angular. */ public function registerResources() { $modules = $this->getAngularModules(); $this->res->addSettingsFactory(function () use (&$modules) { // TODO optimization; client-side caching return array( 'resourceUrls' => CRM_Extension_System::singleton()->getMapper()->getActiveModuleUrls(), 'angular' => array( 'modules' => array_merge(array('ngRoute'), array_keys($modules)), ), 'crmAttachment' => array( 'token' => CRM_Core_Page_AJAX_Attachment::createToken(), ), ); }); $this->res->addScriptFile('civicrm', 'bower_components/angular/angular.min.js', 100, 'html-header', FALSE); $this->res->addScriptFile('civicrm', 'bower_components/angular-route/angular-route.min.js', 110, 'html-header', FALSE); $headOffset = 0; foreach ($modules as $module) { if (!empty($module['css'])) { foreach ($module['css'] as $file) { $this->res->addStyleFile($module['ext'], $file, self::DEFAULT_MODULE_WEIGHT + (++$headOffset), 'html-header', TRUE); } } if (!empty($module['js'])) { foreach ($module['js'] as $file) { $this->res->addScriptFile($module['ext'], $file, self::DEFAULT_MODULE_WEIGHT + (++$headOffset), 'html-header', TRUE); } } } } /** * Get a list of AngularJS modules which should be autoloaded * * @return array * (string $name => array('ext' => string $key, 'js' => array $paths, 'css' => array $paths)) */ public function getAngularModules() { $angularModules = array(); $angularModules['angularFileUpload'] = array( 'ext' => 'civicrm', 'js' => array('bower_components/angular-file-upload/angular-file-upload.min.js'), ); $angularModules['crmApp'] = array('ext' => 'civicrm', 'js' => array('js/angular-crmApp.js')); $angularModules['crmAttachment'] = array( 'ext' => 'civicrm', 'js' => array('js/angular-crmAttachment.js'), 'css' => array('css/angular-crmAttachment.css'), 'partials' => array('partials/crmAttachment/*.html'), ); $angularModules['crmUi'] = array( 'ext' => 'civicrm', 'js' => array('js/angular-crm-ui.js', 'packages/ckeditor/ckeditor.js'), 'partials' => array('partials/crmUi/*.html'), ); $angularModules['crmUtil'] = array('ext' => 'civicrm', 'js' => array('js/angular-crm-util.js')); // https://github.com/jwstadler/angular-jquery-dialog-service $angularModules['dialogService'] = array( 'ext' => 'civicrm', 'js' => array('bower_components/angular-jquery-dialog-service/dialog-service.js'), ); $angularModules['ngSanitize'] = array('ext' => 'civicrm', 'js' => array('js/angular-sanitize.js')); $angularModules['ui.utils'] = array( 'ext' => 'civicrm', 'js' => array('bower_components/angular-ui-utils/ui-utils.min.js'), ); $angularModules['ui.sortable'] = array( 'ext' => 'civicrm', 'js' => array('bower_components/angular-ui-sortable/sortable.min.js'), ); $angularModules['unsavedChanges'] = array( 'ext' => 'civicrm', 'js' => array('bower_components/angular-unsavedChanges/dist/unsavedChanges.min.js'), ); foreach (CRM_Core_Component::getEnabledComponents() as $component) { $angularModules = array_merge($angularModules, $component->getAngularModules()); } CRM_Utils_Hook::angularModules($angularModules); $angularModules = $this->resolvePatterns($angularModules); return $angularModules; } /** * @param array $modules * List of Angular modules. * @return array * Updated list of Angular modules */ public function resolvePatterns($modules) { $newModules = array(); foreach ($modules as $moduleKey => $module) { foreach (array('js', 'css', 'partials') as $fileset) { if (!isset($module[$fileset])) { continue; } $module[$fileset] = $this->res->glob($module['ext'], $module[$fileset]); } $newModules[$moduleKey] = $module; } return $newModules; } }