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']);
]);
$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']));
_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 .= '}';
+}
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;
}
$scope.ts = CRM.ts();
$scope.afform = null;
$scope.selectedEntity = null;
+ $scope.meta = CRM.afformAdminData;
var newForm = {
title: ts('Untitled Form'),
layout: {
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) {
-<div>
-
+<div class="panel panel-default">
+ <div class="panel-heading">
+ {{ ts('Form Layout') }}
+ </div>
+ <div class="panel-body"></div>
</div>
--- /dev/null
+<div>
+
+</div>
--- /dev/null
+<div>
+
+</div>
-<ul id="afGuiEditor-tabs" class="nav nav-pills nav-stacked">
+<ul id="afGuiEditor-palette-tabs" class="nav nav-pills nav-stacked">
<li role="presentation" ng-class="{active: selectedEntity === null}">
<a href ng-click="selectEntity(null)">{{ ts('Form Settings') }}</a>
</li>
<li role="presentation" ng-repeat="entity in entities" ng-class="{active: selectedEntity === entity.name}">
<a href ng-click="selectEntity(entity.name)">{{ entity.label }}</a>
</li>
- <li role="presentation" class="dropdown text-right">
+ <li role="presentation" class="dropdown">
<a href class="dropdown-toggle" data-toggle="dropdown">
<i class="crm-i fa-plus"></i>
</a>
<ul class="dropdown-menu">
- <li></li>
+ <li ng-repeat="entity in meta.entities">
+ <a href ng-click="addEntity(entity.name)">{{ entity.name }}</a>
+ </li>
</ul>
</li>
</ul>
+<div id="afGuiEditor-palette-config" class="panel panel-default">
+ <div class="panel-heading">
+ <span ng-if="selectedEntity === null">{{ ts('Form Settings') }}</span>
+ <span ng-if="selectedEntity !== null">{{ entities[selectedEntity].label }}</span>
+ <a href ng-if="selectedEntity !== null" ng-click="removeEntity(selectedEntity)" class="pull-right">
+ <i class="crm-i fa-trash"></i>
+ </a>
+ </div>
+ <div class="panel-body" ng-include="'~/afGuiEditor/config-form.html'" ng-if="selectedEntity === null"></div>
+ <div class="panel-body" ng-include="'~/afGuiEditor/config-entity.html'" ng-if="selectedEntity !== null"></div>
+</div>