});
});
- angular.module('api4Explorer').controller('Api4Explorer', function($scope, $routeParams, $location, $timeout, $http, crmUiHelp, crmApi4) {
+ angular.module('api4Explorer').controller('Api4Explorer', function($scope, $routeParams, $location, $timeout, $http, crmUiHelp, crmApi4, dialogService) {
var ts = $scope.ts = CRM.ts();
$scope.entities = entities;
$scope.actions = actions;
};
$scope.isSelectRowCount = function() {
- return $scope.params && $scope.params.select && $scope.params.select.length === 1 && $scope.params.select[0] === 'row_count';
+ return isSelectRowCount($scope.params);
};
+ function isSelectRowCount(params) {
+ return params && params.select && params.select.length === 1 && params.select[0] === 'row_count';
+ }
+
function getEntity(entityName) {
return _.findWhere(schema, {name: entityName || $scope.entity});
}
}
var results = lcfirst(_.isNumber(index) ? result : pluralize(result)),
paramCount = _.size(params),
- isSelectRowCount = params.select && params.select.length === 1 && params.select[0] === 'row_count',
i = 0;
- if (isSelectRowCount) {
+ if (isSelectRowCount(params)) {
results = result + 'Count';
}
code.php += ");";
// Write oop code
- if (entity.substr(0, 7) !== 'Custom_') {
- code.oop = '$' + results + " = \\Civi\\Api4\\" + entity + '::' + action + '()';
- } else {
- code.oop = '$' + results + " = \\Civi\\Api4\\CustomValue::" + action + "('" + entity.substr(7) + "')";
- }
- _.each(params, function(param, key) {
- var val = '';
- if (typeof objectParams[key] !== 'undefined' && key !== 'chain') {
- _.each(param, function(item, index) {
- val = phpFormat(index) + ', ' + phpFormat(item, 4);
- code.oop += "\n ->add" + ucfirst(key).replace(/s$/, '') + '(' + val + ')';
- });
- } else if (key === 'where') {
- _.each(param, function (clause) {
- if (clause[0] === 'AND' || clause[0] === 'OR' || clause[0] === 'NOT') {
- code.oop += "\n ->addClause(" + phpFormat(clause[0]) + ", " + phpFormat(clause[1]).slice(1, -1) + ')';
- } else {
- code.oop += "\n ->addWhere(" + phpFormat(clause).slice(1, -1) + ")";
- }
- });
- } else if (key === 'select') {
- code.oop += "\n ";
- // addSelect() is a variadic function & can take multiple arguments; selectRowCount() is a shortcut for addSelect('row_count')
- code.oop += isSelectRowCount ? '->selectRowCount()' : '->addSelect(' + phpFormat(param).slice(1, -1) + ')';
- } else {
- code.oop += "\n ->set" + ucfirst(key) + '(' + phpFormat(param, 4) + ')';
- }
- });
- code.oop += "\n ->execute()";
- if (isSelectRowCount) {
+ code.oop = '$' + results + " = " + formatOOP(entity, action, params, 2) + "\n ->execute()";
+ if (isSelectRowCount(params)) {
code.oop += "\n ->count()";
} else if (_.isNumber(index)) {
code.oop += !index ? '\n ->first()' : (index === -1 ? '\n ->last()' : '\n ->itemAt(' + index + ')');
}
}
code.oop += ";\n";
- if (!_.isNumber(index) && !isSelectRowCount) {
+ if (!_.isNumber(index) && !isSelectRowCount(params)) {
code.oop += "foreach ($" + results + ' as $' + ((_.isString(index) && index) ? index + ' => $' : '') + result + ') {\n // do something\n}';
}
});
}
+ // Format oop params
+ function formatOOP(entity, action, params, indent) {
+ var code = '',
+ newLine = "\n" + _.repeat(' ', indent);
+ if (entity.substr(0, 7) !== 'Custom_') {
+ code = "\\Civi\\Api4\\" + entity + '::' + action + '()';
+ } else {
+ code = "\\Civi\\Api4\\CustomValue::" + action + "('" + entity.substr(7) + "')";
+ }
+ _.each(params, function(param, key) {
+ var val = '';
+ if (typeof objectParams[key] !== 'undefined' && key !== 'chain') {
+ _.each(param, function(item, index) {
+ val = phpFormat(index) + ', ' + phpFormat(item, 2 + indent);
+ code += newLine + "->add" + ucfirst(key).replace(/s$/, '') + '(' + val + ')';
+ });
+ } else if (key === 'where') {
+ _.each(param, function (clause) {
+ if (clause[0] === 'AND' || clause[0] === 'OR' || clause[0] === 'NOT') {
+ code += newLine + "->addClause(" + phpFormat(clause[0]) + ", " + phpFormat(clause[1]).slice(1, -1) + ')';
+ } else {
+ code += newLine + "->addWhere(" + phpFormat(clause).slice(1, -1) + ")";
+ }
+ });
+ } else if (key === 'select') {
+ code += newLine;
+ // addSelect() is a variadic function & can take multiple arguments; selectRowCount() is a shortcut for addSelect('row_count')
+ code += isSelectRowCount(params) ? '->selectRowCount()' : '->addSelect(' + phpFormat(param).slice(1, -1) + ')';
+ } else if (key === 'chain') {
+ _.each(param, function(chain, name) {
+ code += newLine + "->addChain('" + name + "', " + formatOOP(chain[0], chain[1], chain[2], 2 + indent);
+ code += (chain.length > 3 ? ',' : '') + (!_.isEmpty(chain[2]) ? newLine : ' ') + (chain.length > 3 ? phpFormat(chain[3]) : '') + ')';
+ });
+ }
+ else {
+ code += newLine + "->set" + ucfirst(key) + '(' + phpFormat(param, 2 + indent) + ')';
+ }
+ });
+ return code;
+ }
+
function isInt(value) {
if (_.isFinite(value)) {
return true;
return docs.params[name];
};
+ $scope.executeDoc = function() {
+ var doc = {
+ description: ts('Runs API call on the CiviCRM database.'),
+ comment: ts('Results and debugging info will be displayed below.')
+ };
+ if ($scope.action === 'delete') {
+ doc.WARNING = ts('This API call will be executed on the real database. Deleting data cannot be undone.');
+ }
+ else if ($scope.action && $scope.action.slice(0, 3) !== 'get') {
+ doc.WARNING = ts('This API call will be executed on the real database. It cannot be undone.');
+ }
+ return doc;
+ };
+
+ $scope.saveDoc = function() {
+ return {
+ description: ts('Save API call as a smart group.'),
+ comment: ts('Allows you to create a SavedSearch containing the WHERE clause of this API call.'),
+ };
+ };
+
$scope.$watch('params', writeCode, true);
$scope.$watch('index', writeCode);
writeCode();
+ $scope.save = function() {
+ var model = {
+ title: '',
+ id: null,
+ entity: $scope.entity,
+ params: JSON.parse(angular.toJson($scope.params))
+ };
+ model.params.version = 4;
+ delete model.params.select;
+ delete model.params.chain;
+ delete model.params.debug;
+ delete model.params.limit;
+ delete model.params.checkPermissions;
+ var options = CRM.utils.adjustDialogDefaults({
+ width: '500px',
+ autoOpen: false,
+ title: ts('Save smart group')
+ });
+ dialogService.open('saveSearchDialog', '~/api4Explorer/SaveSearch.html', model, options);
+ };
+ });
+
+ angular.module('api4Explorer').controller('SaveSearchCtrl', function($scope, crmApi4, dialogService) {
+ var ts = $scope.ts = CRM.ts(),
+ model = $scope.model;
+ $scope.$watch('model.id', function(id) {
+ if (id) {
+ model.description = $('#api-save-search-select-group').select2('data').extra.description;
+ }
+ });
+ $scope.cancel = function() {
+ dialogService.cancel('saveSearchDialog');
+ };
+ $scope.save = function() {
+ $('.ui-dialog:visible').block();
+ var group = model.id ? {id: model.id} : {title: model.title};
+ group.description = model.description;
+ group.saved_search_id = '$id';
+ var savedSearch = {
+ api_entity: model.entity,
+ api_params: model.params
+ };
+ if (group.id) {
+ savedSearch.id = $('#api-save-search-select-group').select2('data').extra.saved_search_id;
+ }
+ crmApi4('SavedSearch', 'save', {records: [savedSearch], chain: {group: ['Group', 'save', {'records': [group]}]}})
+ .then(function(result) {
+ dialogService.close('saveSearchDialog', result[0]);
+ });
+ };
});
angular.module('api4Explorer').directive('crmApi4WhereClause', function($timeout) {