Commit | Line | Data |
---|---|---|
6bc5e930 TO |
1 | <?php |
2 | ||
3 | require_once 'afform_gui.civix.php'; | |
4 | use CRM_AfformGui_ExtensionUtil as E; | |
5 | ||
6 | /** | |
7 | * Implements hook_civicrm_config(). | |
8 | * | |
9 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_config | |
10 | */ | |
11 | function afform_gui_civicrm_config(&$config) { | |
12 | _afform_gui_civix_civicrm_config($config); | |
13 | } | |
14 | ||
15 | /** | |
16 | * Implements hook_civicrm_xmlMenu(). | |
17 | * | |
18 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_xmlMenu | |
19 | */ | |
20 | function afform_gui_civicrm_xmlMenu(&$files) { | |
21 | _afform_gui_civix_civicrm_xmlMenu($files); | |
22 | } | |
23 | ||
24 | /** | |
25 | * Implements hook_civicrm_install(). | |
26 | * | |
27 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_install | |
28 | */ | |
29 | function afform_gui_civicrm_install() { | |
30 | _afform_gui_civix_civicrm_install(); | |
31 | } | |
32 | ||
33 | /** | |
34 | * Implements hook_civicrm_postInstall(). | |
35 | * | |
36 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_postInstall | |
37 | */ | |
38 | function afform_gui_civicrm_postInstall() { | |
39 | _afform_gui_civix_civicrm_postInstall(); | |
40 | } | |
41 | ||
42 | /** | |
43 | * Implements hook_civicrm_uninstall(). | |
44 | * | |
45 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_uninstall | |
46 | */ | |
47 | function afform_gui_civicrm_uninstall() { | |
48 | _afform_gui_civix_civicrm_uninstall(); | |
49 | } | |
50 | ||
51 | /** | |
52 | * Implements hook_civicrm_enable(). | |
53 | * | |
54 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_enable | |
55 | */ | |
56 | function afform_gui_civicrm_enable() { | |
57 | _afform_gui_civix_civicrm_enable(); | |
58 | } | |
59 | ||
60 | /** | |
61 | * Implements hook_civicrm_disable(). | |
62 | * | |
63 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_disable | |
64 | */ | |
65 | function afform_gui_civicrm_disable() { | |
66 | _afform_gui_civix_civicrm_disable(); | |
67 | } | |
68 | ||
69 | /** | |
70 | * Implements hook_civicrm_upgrade(). | |
71 | * | |
72 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_upgrade | |
73 | */ | |
74 | function afform_gui_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) { | |
75 | return _afform_gui_civix_civicrm_upgrade($op, $queue); | |
76 | } | |
77 | ||
78 | /** | |
79 | * Implements hook_civicrm_managed(). | |
80 | * | |
81 | * Generate a list of entities to create/deactivate/delete when this module | |
82 | * is installed, disabled, uninstalled. | |
83 | * | |
84 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_managed | |
85 | */ | |
86 | function afform_gui_civicrm_managed(&$entities) { | |
87 | _afform_gui_civix_civicrm_managed($entities); | |
88 | } | |
89 | ||
90 | /** | |
91 | * Implements hook_civicrm_caseTypes(). | |
92 | * | |
93 | * Generate a list of case-types. | |
94 | * | |
95 | * Note: This hook only runs in CiviCRM 4.4+. | |
96 | * | |
97 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_caseTypes | |
98 | */ | |
99 | function afform_gui_civicrm_caseTypes(&$caseTypes) { | |
100 | _afform_gui_civix_civicrm_caseTypes($caseTypes); | |
101 | } | |
102 | ||
103 | /** | |
104 | * Implements hook_civicrm_angularModules(). | |
105 | * | |
106 | * Generate a list of Angular modules. | |
107 | * | |
108 | * Note: This hook only runs in CiviCRM 4.5+. It may | |
109 | * use features only available in v4.6+. | |
110 | * | |
111 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_angularModules | |
112 | */ | |
113 | function afform_gui_civicrm_angularModules(&$angularModules) { | |
114 | _afform_gui_civix_civicrm_angularModules($angularModules); | |
115 | } | |
116 | ||
117 | /** | |
118 | * Implements hook_civicrm_alterSettingsFolders(). | |
119 | * | |
120 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_alterSettingsFolders | |
121 | */ | |
122 | function afform_gui_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) { | |
123 | _afform_gui_civix_civicrm_alterSettingsFolders($metaDataFolders); | |
124 | } | |
125 | ||
126 | /** | |
127 | * Implements hook_civicrm_entityTypes(). | |
128 | * | |
129 | * Declare entity types provided by this module. | |
130 | * | |
131 | * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_entityTypes | |
132 | */ | |
133 | function afform_gui_civicrm_entityTypes(&$entityTypes) { | |
134 | _afform_gui_civix_civicrm_entityTypes($entityTypes); | |
135 | } | |
136 | ||
7620445e TO |
137 | /** |
138 | * Implements hook_civicrm_themes(). | |
139 | */ | |
140 | function afform_gui_civicrm_themes(&$themes) { | |
141 | _afform_gui_civix_civicrm_themes($themes); | |
142 | } | |
143 | ||
6bc5e930 | 144 | /** |
c820e08c CW |
145 | * Implements hook_civicrm_pageRun(). |
146 | */ | |
147 | function afform_gui_civicrm_pageRun(&$page) { | |
148 | if (get_class($page) == 'CRM_Afform_Page_AfformBase' && $page->get('afModule') == 'afGuiAdmin') { | |
149 | Civi::resources()->addScriptUrl(Civi::service('asset_builder')->getUrl('af-gui-vars.js')); | |
150 | } | |
151 | } | |
6bc5e930 TO |
152 | |
153 | /** | |
c820e08c | 154 | * Implements hook_civicrm_buildAsset(). |
6bc5e930 | 155 | * |
c820e08c | 156 | * Loads metadata to send to the gui editor. |
e1aca853 CW |
157 | * |
158 | * FIXME: This is a prototype and should get broken out into separate callbacks with hooks, events, etc. | |
c820e08c CW |
159 | */ |
160 | function afform_gui_civicrm_buildAsset($asset, $params, &$mimeType, &$content) { | |
161 | if ($asset !== 'af-gui-vars.js') { | |
162 | return; | |
163 | } | |
164 | ||
1b745abc CW |
165 | $entityWhitelist = $data = []; |
166 | ||
167 | // First scan the entityDefaults directory for our list of supported entities | |
168 | // FIXME: Need a way to load this from other extensions too | |
169 | foreach (glob(__DIR__ . '/ang/afGuiEditor/entityDefaults/*.json') as $file) { | |
170 | $matches = []; | |
171 | preg_match('/([-a-z_A-Z0-9]*).json/', $file, $matches); | |
172 | $entityWhitelist[] = $entity = $matches[1]; | |
173 | // No json_decode, the files are not strict json and will go through angular.$parse clientside | |
174 | $data['defaults'][$entity] = trim(CRM_Utils_JS::stripComments(file_get_contents($file))); | |
c820e08c CW |
175 | } |
176 | ||
e1aca853 | 177 | // Load main entities |
1b745abc | 178 | $data['entities'] = (array) Civi\Api4\Entity::get() |
c820e08c | 179 | ->setCheckPermissions(FALSE) |
1b745abc CW |
180 | ->setSelect(['name', 'description']) |
181 | ->addWhere('name', 'IN', $entityWhitelist) | |
c820e08c CW |
182 | ->execute(); |
183 | ||
e1aca853 CW |
184 | // Load blocks |
185 | $data['blocks'] = []; | |
186 | $blockData = \Civi\Api4\Afform::get() | |
187 | ->setCheckPermissions(FALSE) | |
188 | ->addWhere('block', 'IS NOT NULL') | |
344e8290 | 189 | ->setSelect(['name', 'title', 'block', 'join', 'layout', 'repeat']) |
e1aca853 CW |
190 | ->setFormatWhitespace(TRUE) |
191 | ->setLayoutFormat('shallow') | |
192 | ->execute(); | |
193 | foreach ($blockData as $block) { | |
344e8290 CW |
194 | if (!empty($block['join']) && !in_array($block['join'], $entityWhitelist)) { |
195 | $entityWhitelist[] = $block['join']; | |
196 | } | |
e1aca853 CW |
197 | $data['blocks'][_afform_angular_module_name($block['name'], 'dash')] = $block; |
198 | } | |
199 | ||
200 | // Todo: scan for other elements | |
201 | $data['elements'] = [ | |
202 | 'container' => [ | |
203 | 'title' => ts('Container'), | |
204 | 'element' => [ | |
205 | '#tag' => 'div', | |
206 | 'class' => 'af-container', | |
207 | '#children' => [], | |
208 | ], | |
209 | ], | |
210 | 'text' => [ | |
211 | 'title' => ts('Text box'), | |
212 | 'element' => [ | |
213 | '#tag' => 'p', | |
214 | 'class' => 'af-text', | |
215 | '#children' => [ | |
216 | ['#text' => ts('Enter text')], | |
217 | ], | |
218 | ], | |
219 | ], | |
220 | 'markup' => [ | |
221 | 'title' => ts('Rich content'), | |
222 | 'element' => [ | |
223 | '#tag' => 'div', | |
224 | 'class' => 'af-markup', | |
225 | '#markup' => FALSE, | |
226 | ], | |
227 | ], | |
228 | 'button' => [ | |
229 | 'title' => ts('Button'), | |
230 | 'element' => [ | |
231 | '#tag' => 'button', | |
232 | 'class' => 'af-button btn-primary', | |
233 | 'crm-icon' => 'fa-check', | |
234 | 'ng-click' => 'afform.submit()', | |
235 | '#children' => [ | |
236 | ['#text' => ts('Enter text')], | |
237 | ], | |
238 | ], | |
239 | ], | |
240 | ]; | |
241 | ||
242 | $getFieldParams = [ | |
243 | 'checkPermissions' => FALSE, | |
244 | 'includeCustom' => TRUE, | |
245 | 'loadOptions' => TRUE, | |
246 | 'action' => 'create', | |
247 | 'select' => ['name', 'title', 'input_type', 'input_attrs', 'required', 'options', 'help_pre', 'help_post', 'serialize', 'data_type'], | |
248 | 'where' => [['input_type', 'IS NOT NULL']], | |
249 | ]; | |
250 | ||
344e8290 | 251 | // Get fields for main entities + joined entities |
e1aca853 CW |
252 | foreach (array_unique($entityWhitelist) as $entityName) { |
253 | $data['fields'][$entityName] = (array) civicrm_api4($entityName, 'getFields', $getFieldParams, 'name'); | |
b4def6e9 CW |
254 | |
255 | // TODO: Teach the api to return options in this format | |
256 | foreach ($data['fields'][$entityName] as $name => $field) { | |
257 | if (!empty($field['options'])) { | |
258 | $data['fields'][$entityName][$name]['options'] = CRM_Utils_Array::makeNonAssociative($field['options'], 'key', 'label'); | |
259 | } | |
260 | else { | |
261 | unset($data['fields'][$entityName][$name]['options']); | |
262 | } | |
263 | } | |
1b745abc CW |
264 | } |
265 | ||
266 | // Now adjust the field metadata | |
267 | // FIXME: This should probably be a callback event or something to allow extensions to tweak the metadata for their entities | |
268 | $data['fields']['Contact']['contact_type']['required_data'] = TRUE; | |
a064e90d | 269 | |
4bd44053 CW |
270 | // Scan for input types |
271 | // FIXME: Need a way to load this from other extensions too | |
b4def6e9 | 272 | foreach (glob(__DIR__ . '/ang/afGuiEditor/inputType/*.html') as $file) { |
4bd44053 CW |
273 | $matches = []; |
274 | preg_match('/([-a-z_A-Z0-9]*).html/', $file, $matches); | |
b4def6e9 | 275 | $data['inputType'][$matches[1]] = $matches[1]; |
4bd44053 CW |
276 | } |
277 | ||
51ec7d5a CW |
278 | $data['styles'] = [ |
279 | 'default' => ts('Default'), | |
280 | 'primary' => ts('Primary'), | |
281 | 'success' => ts('Success'), | |
282 | 'info' => ts('Info'), | |
283 | 'warning' => ts('Warning'), | |
284 | 'danger' => ts('Danger'), | |
285 | ]; | |
286 | ||
afc0cd72 CW |
287 | $data['permissions'] = []; |
288 | foreach (CRM_Core_Permission::basicPermissions(TRUE, TRUE) as $name => $perm) { | |
289 | $data['permissions'][] = [ | |
290 | 'id' => $name, | |
291 | 'text' => $perm[0], | |
292 | 'description' => $perm[1] ?? NULL, | |
293 | ]; | |
294 | } | |
295 | ||
c820e08c | 296 | $mimeType = 'text/javascript'; |
1b745abc | 297 | $content = "CRM.afformAdminData=" . json_encode($data, JSON_UNESCAPED_SLASHES) . ';'; |
c820e08c | 298 | } |