c11188e82f86dfaa0a058a8f8853dd7938c7af86
[civicrm-core.git] / CRM / Core / Page / Angular.php
1 <?php
2
3 /**
4 * This page is simply a container; any Angular modules defined by CiviCRM (or by CiviCRM extensions)
5 * will be activated on this page.
6 *
7 * @link https://issues.civicrm.org/jira/browse/CRM-14479
8 */
9 class CRM_Core_Page_Angular extends CRM_Core_Page {
10 /**
11 * The weight to assign to any Angular JS module files
12 */
13 const DEFAULT_MODULE_WEIGHT = 200;
14
15 /**
16 * This function takes care of all the things common to all
17 * pages. This typically involves assigning the appropriate
18 * smarty variable :)
19 *
20 * @return string The content generated by running this page
21 */
22 public function run() {
23 $this->registerResources(CRM_Core_Resources::singleton());
24 return parent::run();
25 }
26
27 /**
28 * @param CRM_Core_Resources $res
29 */
30 public function registerResources(CRM_Core_Resources $res) {
31 $modules = self::getAngularModules();
32
33 $res->addSettingsFactory(function () use (&$modules) {
34 // TODO optimization; client-side caching
35 return array(
36 'resourceUrls' => CRM_Extension_System::singleton()->getMapper()->getActiveModuleUrls(),
37 'angular' => array(
38 'modules' => array_merge(array('ngRoute'), array_keys($modules)),
39 ),
40 'crmAttachment' => array(
41 'token' => CRM_Core_Page_AJAX_Attachment::createToken(),
42 ),
43 );
44 });
45
46 $res->addScriptFile('civicrm', 'bower_components/angular/angular.min.js', 100, 'html-header', FALSE);
47 $res->addScriptFile('civicrm', 'bower_components/angular-route/angular-route.min.js', 110, 'html-header', FALSE);
48 $headOffset = 0;
49 foreach ($modules as $module) {
50 if (!empty($module['css'])) {
51 foreach ($module['css'] as $file) {
52 $res->addStyleFile($module['ext'], $file, self::DEFAULT_MODULE_WEIGHT + (++$headOffset), 'html-header', TRUE);
53 }
54 }
55 if (!empty($module['js'])) {
56 foreach ($module['js'] as $file) {
57 $res->addScriptFile($module['ext'], $file, self::DEFAULT_MODULE_WEIGHT + (++$headOffset), 'html-header', TRUE);
58 }
59 }
60 }
61 }
62
63 /**
64 * Get a list of AngularJS modules which should be autoloaded
65 *
66 * @return array (string $name => array('ext' => string $key, 'js' => array $paths, 'css' => array $paths))
67 */
68 public static function getAngularModules() {
69 $angularModules = array();
70 $angularModules['angularFileUpload'] = array('ext' => 'civicrm', 'js' => array('bower_components/angular-file-upload/angular-file-upload.min.js'));
71 $angularModules['crmApp'] = array('ext' => 'civicrm', 'js' => array('js/angular-crmApp.js'));
72 $angularModules['crmAttachment'] = array('ext' => 'civicrm', 'js' => array('js/angular-crmAttachment.js'), 'css' => array('css/angular-crmAttachment.css'));
73 $angularModules['crmUi'] = array('ext' => 'civicrm', 'js' => array('js/angular-crm-ui.js', 'packages/ckeditor/ckeditor.js'));
74 $angularModules['crmUtil'] = array('ext' => 'civicrm', 'js' => array('js/angular-crm-util.js'));
75 // https://github.com/jwstadler/angular-jquery-dialog-service
76 $angularModules['dialogService'] = array('ext' => 'civicrm' , 'js' => array('bower_components/angular-jquery-dialog-service/dialog-service.js'));
77 $angularModules['ngSanitize'] = array('ext' => 'civicrm', 'js' => array('js/angular-sanitize.js'));
78 $angularModules['ui.utils'] = array('ext' => 'civicrm', 'js' => array('bower_components/angular-ui-utils/ui-utils.min.js'));
79 $angularModules['ui.sortable'] = array('ext' => 'civicrm', 'js' => array('bower_components/angular-ui-sortable/sortable.min.js'));
80 $angularModules['unsavedChanges'] = array('ext' => 'civicrm', 'js' => array('bower_components/angular-unsavedChanges/dist/unsavedChanges.min.js'));
81
82 foreach (CRM_Core_Component::getEnabledComponents() as $component) {
83 $angularModules = array_merge($angularModules, $component->getAngularModules());
84 }
85 CRM_Utils_Hook::angularModules($angularModules);
86 return $angularModules;
87 }
88
89 }