X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=ang%2Fapi4Explorer%2FExplorer.js;h=b589bdaaf3e420d137891fb8fa411281d5e3d012;hb=40cbd643a97e4a9c7ff63279e5e88a5a13f1be8b;hp=756675c8f9c6d61ab27a3024124846748b03758c;hpb=fd4987d01f1f25fbe2ad0e8cb42415f95b075066;p=civicrm-core.git diff --git a/ang/api4Explorer/Explorer.js b/ang/api4Explorer/Explorer.js index 756675c8f9..b589bdaaf3 100644 --- a/ang/api4Explorer/Explorer.js +++ b/ang/api4Explorer/Explorer.js @@ -20,7 +20,7 @@ }); }); - 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; @@ -253,9 +253,13 @@ }; $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}); } @@ -435,10 +439,9 @@ } 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'; } @@ -472,36 +475,8 @@ 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 + ')'); @@ -514,7 +489,7 @@ } } 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}'; } @@ -528,6 +503,47 @@ }); } + // 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; @@ -665,10 +681,81 @@ 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) {