$scope.controls = {};
$scope.langs = ['php', 'js', 'ang', 'cli'];
$scope.joinTypes = [{k: false, v: 'FALSE (LEFT JOIN)'}, {k: true, v: 'TRUE (INNER JOIN)'}];
- $scope.bridgeEntities = _.filter(schema, {type: 'BridgeEntity'});
+ $scope.bridgeEntities = _.filter(schema, function(entity) {return _.includes(entity.type, 'EntityBridge');});
$scope.code = {
php: [
{name: 'oop', label: ts('OOP Style'), code: ''},
if (lastLetter === 's' || lastLetter === 'x' || lastTwo === 'ch') {
return str + 'es';
}
- if (lastLetter === 'y' && lastTwo !== 'ey') {
+ if (lastLetter === 'y' && !_.includes(['ay', 'ey', 'iy', 'oy', 'uy'], lastTwo)) {
return str.slice(0, -1) + 'ies';
}
return str + 's';
setHelp($scope.entity, {
description: entityInfo.description,
comment: entityInfo.comment,
+ type: entityInfo.type,
see: entityInfo.see
});
}
};
});
- angular.module('api4Explorer').directive('crmApi4Clause', function() {
- return {
- scope: {
- data: '<crmApi4Clause'
- },
- templateUrl: '~/api4Explorer/Clause.html',
- controller: function ($scope, $element, $timeout) {
- var ts = $scope.ts = CRM.ts(),
- ctrl = $scope.$ctrl = this;
- this.conjunctions = {AND: ts('And'), OR: ts('Or'), NOT: ts('Not')};
- this.operators = CRM.vars.api4.operators;
- this.sortOptions = {
- axis: 'y',
- connectWith: '.api4-clause-group-sortable',
- containment: $element.closest('.api4-clause-fieldset'),
- over: onSortOver,
- start: onSort,
- stop: onSort
- };
+ angular.module('api4Explorer').component('crmApi4Clause', {
+ bindings: {
+ fields: '<',
+ clauses: '<',
+ format: '@',
+ op: '@',
+ skip: '<',
+ isRequired: '<',
+ label: '@',
+ deleteGroup: '&'
+ },
+ templateUrl: '~/api4Explorer/Clause.html',
+ controller: function ($scope, $element, $timeout) {
+ var ts = $scope.ts = CRM.ts(),
+ ctrl = this;
+ this.conjunctions = {AND: ts('And'), OR: ts('Or'), NOT: ts('Not')};
+ this.operators = CRM.vars.api4.operators;
+ this.sortOptions = {
+ axis: 'y',
+ connectWith: '.api4-clause-group-sortable',
+ containment: $element.closest('.api4-clause-fieldset'),
+ over: onSortOver,
+ start: onSort,
+ stop: onSort
+ };
- this.addGroup = function(op) {
- $scope.data.clauses.push([op, []]);
- };
+ this.$onInit = function() {
+ ctrl.hasParent = !!$element.attr('delete-group');
+ };
- this.removeGroup = function() {
- $scope.data.groupParent.splice($scope.data.groupIndex, 1);
- };
+ this.addGroup = function(op) {
+ ctrl.clauses.push([op, []]);
+ };
+
+ function onSort(event, ui) {
+ $($element).closest('.api4-clause-fieldset').toggleClass('api4-sorting', event.type === 'sortstart');
+ $('.api4-input.form-inline').css('margin-left', '');
+ }
- function onSort(event, ui) {
- $($element).closest('.api4-clause-fieldset').toggleClass('api4-sorting', event.type === 'sortstart');
- $('.api4-input.form-inline').css('margin-left', '');
+ // Indent clause while dragging between nested groups
+ function onSortOver(event, ui) {
+ var offset = 0;
+ if (ui.sender) {
+ offset = $(ui.placeholder).offset().left - $(ui.sender).offset().left;
}
+ $('.api4-input.form-inline.ui-sortable-helper').css('margin-left', '' + offset + 'px');
+ }
- // Indent clause while dragging between nested groups
- function onSortOver(event, ui) {
- var offset = 0;
- if (ui.sender) {
- offset = $(ui.placeholder).offset().left - $(ui.sender).offset().left;
+ this.addClause = function() {
+ $timeout(function() {
+ if (ctrl.newClause) {
+ if (ctrl.skip && ctrl.clauses.length < ctrl.skip) {
+ ctrl.clauses.push(null);
+ }
+ ctrl.clauses.push([ctrl.newClause, '=', '']);
+ ctrl.newClause = null;
}
- $('.api4-input.form-inline.ui-sortable-helper').css('margin-left', '' + offset + 'px');
+ });
+ };
+
+ this.deleteRow = function(index) {
+ ctrl.clauses.splice(index, 1);
+ };
+
+ // Remove empty values
+ this.changeClauseField = function(clause, index) {
+ if (clause[0] === '') {
+ ctrl.deleteRow(index);
}
+ };
- this.addClause = function() {
- $timeout(function() {
- if (ctrl.newClause) {
- $scope.data.clauses.push([ctrl.newClause, '=', '']);
- ctrl.newClause = null;
- }
- });
- };
- $scope.$watch('data.clauses', function(values) {
- // Iterate in reverse order so index doesn't get out-of-sync during splice
- _.forEachRight(values, function(clause, index) {
- // Remove empty values
- if (index >= ($scope.data.skip || 0)) {
- if (typeof clause !== 'undefined' && !clause[0]) {
- values.splice(index, 1);
- }
- // Add/remove value if operator allows for one
- else if (typeof clause[1] === 'string' && _.contains(clause[1], 'NULL')) {
- clause.length = 2;
- } else if (typeof clause[1] === 'string' && clause.length === 2) {
- clause.push('');
- }
- }
- });
- }, true);
- }
- };
+ // Add/remove value if operator allows for one
+ this.changeClauseOperator = function(clause) {
+ if (_.contains(clause[1], 'NULL')) {
+ clause.length = 2;
+ } else if (clause.length === 2) {
+ clause.push('');
+ }
+ };
+ }
});
angular.module('api4Explorer').directive('api4ExpValue', function($routeParams, crmApi4) {
$el.removeClass('loading').crmSelect2({data: options, multiple: multi});
});
} else if (field.fk_entity) {
- $el.crmEntityRef({entity: field.fk_entity, select:{multiple: multi}});
+ $el.crmEntityRef({entity: field.fk_entity, select:{multiple: multi}, static: field.fk_entity === 'Contact' ? ['user_contact_id'] : []});
} else if (dataType === 'Boolean') {
$el.attr('placeholder', ts('- select -')).crmSelect2({allowClear: false, multiple: multi, placeholder: ts('- select -'), data: [
{id: 'true', text: ts('Yes')},