From c820e08c2d8bd403dda4026b1299a2bd54ac5a2d Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Fri, 25 Oct 2019 10:32:24 -0400 Subject: [PATCH] Add some metadata --- .../core/CRM/Afform/Page/AfformBase.php | 3 +- ext/afform/gui/afform_gui.php | 73 +++++++++++++------ ext/afform/gui/ang/afGuiEditor.css | 33 ++++++++- ext/afform/gui/ang/afGuiEditor.js | 3 + ext/afform/gui/ang/afGuiEditor/canvas.html | 7 +- .../gui/ang/afGuiEditor/config-entity.html | 3 + .../gui/ang/afGuiEditor/config-form.html | 3 + ext/afform/gui/ang/afGuiEditor/palette.html | 19 ++++- 8 files changed, 113 insertions(+), 31 deletions(-) create mode 100644 ext/afform/gui/ang/afGuiEditor/config-entity.html create mode 100644 ext/afform/gui/ang/afGuiEditor/config-form.html diff --git a/ext/afform/core/CRM/Afform/Page/AfformBase.php b/ext/afform/core/CRM/Afform/Page/AfformBase.php index 3d389528b6..3ccc1e50cc 100644 --- a/ext/afform/core/CRM/Afform/Page/AfformBase.php +++ b/ext/afform/core/CRM/Afform/Page/AfformBase.php @@ -7,6 +7,7 @@ class CRM_Afform_Page_AfformBase extends CRM_Core_Page { list ($pagePath, $pageArgs) = func_get_args(); $module = _afform_angular_module_name($pageArgs['afform']); + $this->set('afModule', $module); $loader = new \Civi\Angular\AngularLoader(); $loader->setModules([$module, 'afformStandalone']); @@ -18,7 +19,7 @@ class CRM_Afform_Page_AfformBase extends CRM_Core_Page { ]); $loader->load(); - $afform = civicrm_api4('Afform', 'get', ['checkPermissions' => FALSE, 'where' => [['name', '=', $pageArgs['afform']]], 'select' => ['title']]); + $afform = civicrm_api4('Afform', 'get', ['checkPermissions' => FALSE, 'where' => [['name', '=', $module]], 'select' => ['title']]); if (!empty($afform[0]['title'])) { CRM_Utils_System::setTitle(strip_tags($afform[0]['title'])); diff --git a/ext/afform/gui/afform_gui.php b/ext/afform/gui/afform_gui.php index 9eef57b07f..72caa9cf64 100644 --- a/ext/afform/gui/afform_gui.php +++ b/ext/afform/gui/afform_gui.php @@ -141,30 +141,57 @@ function afform_gui_civicrm_themes(&$themes) { _afform_gui_civix_civicrm_themes($themes); } -// --- Functions below this ship commented out. Uncomment as required. --- - /** - * Implements hook_civicrm_preProcess(). - * - * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_preProcess - * -function afform_gui_civicrm_preProcess($formName, &$form) { - -} // */ + * Implements hook_civicrm_pageRun(). + */ +function afform_gui_civicrm_pageRun(&$page) { + if (get_class($page) == 'CRM_Afform_Page_AfformBase' && $page->get('afModule') == 'afGuiAdmin') { + Civi::resources()->addScriptUrl(Civi::service('asset_builder')->getUrl('af-gui-vars.js')); + } +} /** - * Implements hook_civicrm_navigationMenu(). - * - * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_navigationMenu + * Implements hook_civicrm_buildAsset(). * -function afform_gui_civicrm_navigationMenu(&$menu) { - _afform_gui_civix_insert_navigation_menu($menu, 'Mailings', array( - 'label' => E::ts('New subliminal message'), - 'name' => 'mailing_subliminal_message', - 'url' => 'civicrm/mailing/subliminal', - 'permission' => 'access CiviMail', - 'operator' => 'OR', - 'separator' => 0, - )); - _afform_gui_civix_navigationMenu($menu); -} // */ + * Loads metadata to send to the gui editor. + */ +function afform_gui_civicrm_buildAsset($asset, $params, &$mimeType, &$content) { + if ($asset !== 'af-gui-vars.js') { + return; + } + + // Things that can't be handled by afform. TODO: Need a better way to do this. Maybe add core metadata about what each entity is for, and filter on that. + $entityBlacklist = [ + 'ACL', + 'ActionSchedule', + 'ActivityContact', + 'Afform%', + 'CaseContact', + 'EntityTag', + 'GroupContact', + 'GroupNesting', + 'GroupOrganization', + 'Setting', + 'System', + 'UF%', + ]; + $entityApi = Civi\Api4\Entity::get() + ->setCheckPermissions(FALSE) + ->setSelect(['name', 'description']); + foreach ($entityBlacklist as $nono) { + $entityApi->addWhere('name', 'NOT LIKE', $nono); + } + + $contacts = Civi\Api4\Contact::getFields() + ->setCheckPermissions(FALSE) + ->setIncludeCustom(TRUE) + ->setLoadOptions(TRUE) + ->setAction('Create') + ->execute(); + + $mimeType = 'text/javascript'; + $content = "CRM.afformAdminData={"; + $content .= 'entities:' . json_encode((array) $entityApi->execute(), JSON_UNESCAPED_SLASHES) . ','; + $content .= 'fields:' . json_encode(['Contact' => (array) $contacts], JSON_UNESCAPED_SLASHES); + $content .= '}'; +} diff --git a/ext/afform/gui/ang/afGuiEditor.css b/ext/afform/gui/ang/afGuiEditor.css index 190a4abbb5..e6464c1b56 100644 --- a/ext/afform/gui/ang/afGuiEditor.css +++ b/ext/afform/gui/ang/afGuiEditor.css @@ -2,10 +2,39 @@ display: flex; } -#afGuiEditor-palette { +#afGuiEditor-main .panel.panel-default { + margin-bottom: 0; +} + +#afGuiEditor-main #afGuiEditor-palette { flex: 1; + margin-right: 5px; + box-shadow: 0 3px 18px 0 rgba(48,40,40,0.25); } -#afGuiEditor-canvas { +#afGuiEditor-main #afGuiEditor-canvas { flex: 1; + margin-left: 5px; +} + +#afGuiEditor-main #afGuiEditor-palette-tabs { + width: 110px; + position: absolute; + left: 0; + top: 0; +} + +#afGuiEditor-main #afGuiEditor-palette-tabs li > a { + padding: 10px 15px; + font-size: 12px; +} + +#afGuiEditor-main #afGuiEditor-palette-tabs .dropdown-menu { + max-height: 500px; + overflow-y: auto; +} + +#afGuiEditor-main #afGuiEditor-palette-config { + margin-left: 110px; + box-shadow: none; } diff --git a/ext/afform/gui/ang/afGuiEditor.js b/ext/afform/gui/ang/afGuiEditor.js index 151ed01661..14866eb500 100644 --- a/ext/afform/gui/ang/afGuiEditor.js +++ b/ext/afform/gui/ang/afGuiEditor.js @@ -13,6 +13,7 @@ $scope.ts = CRM.ts(); $scope.afform = null; $scope.selectedEntity = null; + $scope.meta = CRM.afformAdminData; var newForm = { title: ts('Untitled Form'), layout: { @@ -61,11 +62,13 @@ label: entityType + ' ' + num }; $scope.afform.layout['#children'].push($scope.entities[entityType + num]); + $scope.selectEntity(entityType + num); }; $scope.removeEntity = function(entityName) { delete $scope.entities[entityName]; $scope.afform.layout['#children'].splice(_.findIndex($scope.afform.layout['#children'], {'#tag': 'af-entity', name: entityName}), 1); + $scope.selectEntity(null); }; $scope.selectEntity = function(entityName) { diff --git a/ext/afform/gui/ang/afGuiEditor/canvas.html b/ext/afform/gui/ang/afGuiEditor/canvas.html index b80e6e0678..103dd04c6e 100644 --- a/ext/afform/gui/ang/afGuiEditor/canvas.html +++ b/ext/afform/gui/ang/afGuiEditor/canvas.html @@ -1,3 +1,6 @@ -
- +
+
+ {{ ts('Form Layout') }} +
+
diff --git a/ext/afform/gui/ang/afGuiEditor/config-entity.html b/ext/afform/gui/ang/afGuiEditor/config-entity.html new file mode 100644 index 0000000000..b80e6e0678 --- /dev/null +++ b/ext/afform/gui/ang/afGuiEditor/config-entity.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/ext/afform/gui/ang/afGuiEditor/config-form.html b/ext/afform/gui/ang/afGuiEditor/config-form.html new file mode 100644 index 0000000000..b80e6e0678 --- /dev/null +++ b/ext/afform/gui/ang/afGuiEditor/config-form.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/ext/afform/gui/ang/afGuiEditor/palette.html b/ext/afform/gui/ang/afGuiEditor/palette.html index 66004be181..61db37a138 100644 --- a/ext/afform/gui/ang/afGuiEditor/palette.html +++ b/ext/afform/gui/ang/afGuiEditor/palette.html @@ -1,16 +1,29 @@ -