2 namespace Civi\Angular
;
5 * Manage Angular resources.
7 * @package Civi\Angular
12 * @var \CRM_Core_Resources
14 protected $res = NULL;
18 * Each item has some combination of these keys:
20 * The Civi extension which defines the Angular module.
21 * - js: array(string $relativeFilePath)
22 * List of JS files (relative to the extension).
23 * - css: array(string $relativeFilePath)
24 * List of CSS files (relative to the extension).
25 * - partials: array(string $relativeFilePath)
26 * A list of partial-HTML folders (relative to the extension).
27 * This will be mapped to "~/moduleName" by crmResource.
28 * - settings: array(string $key => mixed $value)
29 * List of settings to preload.
31 protected $modules = NULL;
34 * @param \CRM_Core_Resources $res
35 * The resource manager.
37 public function __construct($res) {
42 * Get a list of AngularJS modules which should be autoloaded.
45 * Each item has some combination of these keys:
47 * The Civi extension which defines the Angular module.
48 * - js: array(string $relativeFilePath)
49 * List of JS files (relative to the extension).
50 * - css: array(string $relativeFilePath)
51 * List of CSS files (relative to the extension).
52 * - partials: array(string $relativeFilePath)
53 * A list of partial-HTML folders (relative to the extension).
54 * This will be mapped to "~/moduleName" by crmResource.
55 * - settings: array(string $key => mixed $value)
56 * List of settings to preload.
58 public function getModules() {
59 if ($this->modules
=== NULL) {
60 $config = \CRM_Core_Config
::singleton();
62 $angularModules = array();
63 $angularModules['angularFileUpload'] = array(
65 'js' => array('bower_components/angular-file-upload/angular-file-upload.min.js'),
67 $angularModules['crmApp'] = array(
69 'js' => array('ang/crmApp.js'),
71 $angularModules['crmAttachment'] = array(
73 'js' => array('ang/crmAttachment.js'),
74 'css' => array('ang/crmAttachment.css'),
75 'partials' => array('ang/crmAttachment'),
77 'token' => \CRM_Core_Page_AJAX_Attachment
::createToken(),
80 $angularModules['crmAutosave'] = array(
82 'js' => array('ang/crmAutosave.js'),
84 $angularModules['crmCxn'] = array(
86 'js' => array('ang/crmCxn.js', 'ang/crmCxn/*.js'),
87 'css' => array('ang/crmCxn.css'),
88 'partials' => array('ang/crmCxn'),
90 //$angularModules['crmExample'] = array(
91 // 'ext' => 'civicrm',
92 // 'js' => array('ang/crmExample.js'),
93 // 'partials' => array('ang/crmExample'),
95 $angularModules['crmResource'] = array(
97 // 'js' => array('js/angular-crmResource/byModule.js'), // One HTTP request per module.
98 'js' => array('js/angular-crmResource/all.js'), // One HTTP request for all modules.
100 $angularModules['crmUi'] = array(
102 'js' => array('ang/crmUi.js'),
103 'partials' => array('ang/crmUi'),
105 $angularModules['crmUtil'] = array(
107 'js' => array('ang/crmUtil.js'),
109 // https://github.com/jwstadler/angular-jquery-dialog-service
110 $angularModules['dialogService'] = array(
112 'js' => array('bower_components/angular-jquery-dialog-service/dialog-service.js'),
114 $angularModules['ngRoute'] = array(
116 'js' => array('bower_components/angular-route/angular-route.min.js'),
118 $angularModules['ngSanitize'] = array(
120 'js' => array('bower_components/angular-sanitize/angular-sanitize.min.js'),
122 $angularModules['ui.utils'] = array(
124 'js' => array('bower_components/angular-ui-utils/ui-utils.min.js'),
126 $angularModules['ui.sortable'] = array(
128 'js' => array('bower_components/angular-ui-sortable/sortable.min.js'),
130 $angularModules['unsavedChanges'] = array(
132 'js' => array('bower_components/angular-unsavedChanges/dist/unsavedChanges.min.js'),
135 $angularModules['statuspage'] = array(
137 'js' => array('ang/crmStatusPage.js', 'ang/crmStatusPage/*.js'),
138 'css' => array('ang/crmStatusPage.css'),
139 'partials' => array('ang/crmStatusPage'),
140 'settings' => array(),
143 foreach (\CRM_Core_Component
::getEnabledComponents() as $component) {
144 $angularModules = array_merge($angularModules, $component->getAngularModules());
146 \CRM_Utils_Hook
::angularModules($angularModules);
147 $this->modules
= $this->resolvePatterns($angularModules);
150 return $this->modules
;
154 * Get the descriptor for an Angular module.
156 * @param string $name
159 * Details about the module:
160 * - ext: string, the name of the Civi extension which defines the module
161 * - js: array(string $relativeFilePath).
162 * - css: array(string $relativeFilePath).
163 * - partials: array(string $relativeFilePath).
166 public function getModule($name) {
167 $modules = $this->getModules();
168 if (!isset($modules[$name])) {
169 throw new \
Exception("Unrecognized Angular module");
171 return $modules[$name];
175 * Convert any globs in an Angular module to file names.
177 * @param array $modules
178 * List of Angular modules.
180 * Updated list of Angular modules
182 protected function resolvePatterns($modules) {
183 $newModules = array();
185 foreach ($modules as $moduleKey => $module) {
186 foreach (array('js', 'css', 'partials') as $fileset) {
187 if (!isset($module[$fileset])) {
190 $module[$fileset] = $this->res
->glob($module['ext'], $module[$fileset]);
192 $newModules[$moduleKey] = $module;
199 * Get the partial HTML documents for a module.
201 * @param string $name
202 * Angular module name.
204 * Array(string $extFilePath => string $html)
206 * Invalid partials configuration.
208 public function getPartials($name) {
209 $module = $this->getModule($name);
211 if (isset($module['partials'])) {
212 foreach ($module['partials'] as $partialDir) {
213 $partialDir = $this->res
->getPath($module['ext']) . '/' . $partialDir;
214 $files = \CRM_Utils_File
::findFiles($partialDir, '*.html', TRUE);
215 foreach ($files as $file) {
216 $filename = '~/' . $name . '/' . $file;
217 $result[$filename] = file_get_contents($partialDir . '/' . $file);
225 * Get list of translated strings for a module.
227 * @param string $name
228 * Angular module name.
230 * Translated strings: array(string $orig => string $translated).
232 public function getTranslatedStrings($name) {
233 $module = $this->getModule($name);
235 $strings = $this->getStrings($name);
236 foreach ($strings as $string) {
237 // TODO: should we pass translation domain based on $module[ext] or $module[tsDomain]?
238 // It doesn't look like client side really supports the domain right now...
239 $translated = ts($string, array(
240 'domain' => array($module['ext'], NULL),
242 if ($translated != $string) {
243 $result[$string] = $translated;
250 * Get list of translatable strings for a module.
252 * @param string $name
253 * Angular module name.
255 * Translatable strings.
257 public function getStrings($name) {
258 $module = $this->getModule($name);
260 if (isset($module['js'])) {
261 foreach ($module['js'] as $file) {
262 $strings = $this->res
->getStrings()->get(
264 $this->res
->getPath($module['ext'], $file),
267 $result = array_unique(array_merge($result, $strings));
270 if (isset($module['partials'])) {
271 foreach ($module['partials'] as $partialDir) {
272 $partialDir = $this->res
->getPath($module['ext']) . '/' . $partialDir;
273 $files = \CRM_Utils_File
::findFiles($partialDir, '*.html');
274 foreach ($files as $file) {
275 $strings = $this->res
->getStrings()->get(
280 $result = array_unique(array_merge($result, $strings));
288 * Get resources for one or more modules.
290 * @param string|array $moduleNames
291 * List of module names.
292 * @param string $resType
293 * Type of resource ('js', 'css', 'settings').
294 * @param string $refType
295 * Type of reference to the resource ('cacheUrl', 'rawUrl', 'path', 'settings').
297 * List of URLs or paths.
298 * @throws \CRM_Core_Exception
300 public function getResources($moduleNames, $resType, $refType) {
302 $moduleNames = (array) $moduleNames;
303 foreach ($moduleNames as $moduleName) {
304 $module = $this->getModule($moduleName);
305 if (isset($module[$resType])) {
306 foreach ($module[$resType] as $file) {
309 $result[] = $this->res
->getPath($module['ext'], $file);
313 $result[] = $this->res
->getUrl($module['ext'], $file);
317 $result[] = $this->res
->getUrl($module['ext'], $file, TRUE);
321 if (!empty($module[$resType])) {
322 $result[$moduleName] = $module[$resType];
327 throw new \
CRM_Core_Exception("Unrecognized resource format");