else if (editor.getFormType() === 'search') {
editor.layout['#children'] = afGui.findRecursive(editor.afform.layout, {'af-fieldset': ''})[0]['#children'];
- editor.searchDisplay = afGui.findRecursive(editor.layout['#children'], function(item) {
- return item['#tag'] && item['#tag'].indexOf('crm-search-display-') === 0;
- })[0];
- editor.searchFilters = getSearchFilterOptions();
+ var searchFieldsets = afGui.findRecursive(editor.afform.layout, {'af-fieldset': ''});
+ editor.searchDisplays = _.transform(searchFieldsets, function(searchDisplays, fieldset) {
+ var displayElement = afGui.findRecursive(fieldset['#children'], function(item) {
+ return item['search-name'] && item['#tag'] && item['#tag'].indexOf('crm-search-display-') === 0;
+ })[0];
+ if (displayElement) {
+ searchDisplays[displayElement['search-name'] + (displayElement['display-name'] ? '.' + displayElement['display-name'] : '')] = {
+ element: displayElement,
+ fieldset: fieldset,
+ settings: afGui.getSearchDisplay(displayElement['search-name'], displayElement['display-name'])
+ };
+ }
+ }, {});
}
// Set changesSaved to true on initial load, false thereafter whenever changes are made to the model
this.toggleContactSummary = function() {
if (editor.afform.contact_summary) {
editor.afform.contact_summary = false;
- if (editor.afform.type === 'search') {
- delete editor.searchDisplay.filters;
- }
+ _.each(editor.searchDisplays, function(searchDisplay) {
+ delete searchDisplay.element.filters;
+ });
} else {
editor.afform.contact_summary = 'block';
- if (editor.afform.type === 'search') {
- editor.searchDisplay.filters = editor.searchFilters[0].key;
- }
+ _.each(editor.searchDisplays, function(searchDisplay) {
+ var filterOptions = getSearchFilterOptions(searchDisplay.settings);
+ if (filterOptions.length) {
+ searchDisplay.element.filters = filterOptions[0].key;
+ }
+ });
}
};
- function getSearchFilterOptions() {
- var searchDisplay = afGui.getSearchDisplay(editor.searchDisplay['search-name'], editor.searchDisplay['display-name']),
+ function getSearchFilterOptions(searchDisplay) {
+ var
entityCount = {},
options = [];
this.getFilterFields = function() {
var fieldGroups = [],
entities = getEntities();
- if (ctrl.display.calc_fields && ctrl.display.calc_fields.length) {
+ if (ctrl.display.settings.calc_fields && ctrl.display.settings.calc_fields.length) {
fieldGroups.push({
text: ts('Calculated Fields'),
- children: _.transform(ctrl.display.calc_fields, function(fields, el) {
+ children: _.transform(ctrl.display.settings.calc_fields, function(fields, el) {
fields.push({id: el.name, text: el.defn.label, disabled: ctrl.fieldInUse(el.name)});
}, [])
});
// Gets the name of the entity a field belongs to
this.getFieldEntity = function(fieldName) {
if (fieldName.indexOf('.') < 0) {
- return ctrl.display['saved_search_id.api_entity'];
+ return ctrl.display.settings['saved_search_id.api_entity'];
}
var alias = fieldName.split('.')[0],
entity;
- _.each(ctrl.display['saved_search_id.api_params'].join, function(join) {
+ _.each(ctrl.display.settings['saved_search_id.api_params'].join, function(join) {
var joinInfo = join[0].split(' AS ');
if (alias === joinInfo[1]) {
entity = joinInfo[0];
return false;
}
});
- return entity || ctrl.display['saved_search_id.api_entity'];
+ return entity || ctrl.display.settings['saved_search_id.api_entity'];
};
function buildCalcFieldList(search) {
$scope.calcFieldList.length = 0;
- _.each(_.cloneDeep(ctrl.display.calc_fields), function(field) {
+ _.each(_.cloneDeep(ctrl.display.settings.calc_fields), function(field) {
if (!search || _.contains(field.defn.label.toLowerCase(), search)) {
$scope.calcFieldList.push(field);
}
// Fetch all entities used in search (main entity + joins)
function getEntities() {
var
- mainEntity = afGui.getEntity(ctrl.display['saved_search_id.api_entity']),
+ mainEntity = afGui.getEntity(ctrl.display.settings['saved_search_id.api_entity']),
entityCount = {},
entities = [{
name: mainEntity.entity,
}];
entityCount[mainEntity.entity] = 1;
- _.each(ctrl.display['saved_search_id.api_params'].join, function(join) {
+ _.each(ctrl.display.settings['saved_search_id.api_params'].join, function(join) {
var joinInfo = join[0].split(' AS '),
entity = afGui.getEntity(joinInfo[0]);
entityCount[entity.entity] = (entityCount[entity.entity] || 0) + 1;
if (_.findIndex(ctrl.filters, {name: fieldName}) >= 0) {
return true;
}
- return !!getElement(ctrl.editor.layout['#children'], {'#tag': 'af-field', name: fieldName});
+ return !!getElement(ctrl.display.fieldset['#children'], {'#tag': 'af-field', name: fieldName});
};
// Checks if fields in a block are already in use on the form.
// Note that if a block contains no fields it can be used repeatedly, so this will always return false for those.
$scope.blockInUse = function(block) {
if (block['af-join']) {
- return !!getElement(ctrl.editor.layout['#children'], {'af-join': block['af-join']});
+ return !!getElement(ctrl.display.fieldset['#children'], {'af-join': block['af-join']});
}
var fieldsInBlock = _.pluck(afGui.findRecursive(afGui.meta.blocks[block['#tag']].layout, {'#tag': 'af-field'}), 'name');
- return !!getElement(ctrl.editor.layout['#children'], function(item) {
+ return !!getElement(ctrl.display.fieldset['#children'], function(item) {
return item['#tag'] === 'af-field' && _.includes(fieldsInBlock, item.name);
});
};
- function getSearchDisplayElement() {
- return getElement(ctrl.editor.layout['#children'], {'#tag': ctrl.display['type:name'], 'display-name': ctrl.display.name, 'search-name': ctrl.display['saved_search_id.name']});
- }
-
// Return an item matching criteria
// Recursively checks the form layout, including block directives
function getElement(group, criteria, found) {
}
function filtersToArray() {
- return _.transform(ctrl.display.filters, function(result, value, key) {
+ if (!ctrl.display.element.filters || ctrl.display.element.filters === '{}') {
+ return [];
+ }
+ // Split contents by commas, ignoring commas inside quotes
+ var rawValues = _.trim(ctrl.display.element.filters, '{}').split(/,(?=(?:(?:[^']*'){2})*[^']*$)/);
+ return _.transform(rawValues, function(result, raw) {
+ raw = _.trim(raw);
+ var split;
+ if (raw.charAt(0) === '"') {
+ split = raw.slice(1).split(/"[ ]*:/);
+ } else if (raw.charAt(0) === "'") {
+ split = raw.slice(1).split(/'[ ]*:/);
+ } else {
+ split = raw.split(':');
+ }
+ var key = _.trim(split[0]);
+ var value = _.trim(split[1]);
+ var mode = 'val';
+ if (value.indexOf('routeParams') === 0) {
+ mode = 'routeParams';
+ } else if (value.indexOf('options') === 0) {
+ mode = 'options';
+ }
var info = {
name: key,
- mode: value.indexOf('routeParams') === 0 ? 'url' : 'val'
+ mode: mode
};
// Object dot notation
- if (info.mode === 'url' && value.indexOf('routeParams.') === 0) {
- info.value = value.replace('routeParams.', '');
+ if (mode !== 'val' && value.indexOf(mode + '.') === 0) {
+ info.value = value.replace(mode + '.', '');
}
// Object bracket notation
- else if (info.mode === 'url') {
+ else if (mode !== 'val') {
info.value = decode(value.substring(value.indexOf('[') + 1, value.lastIndexOf(']')));
}
// Literal value
ctrl.filters.push({
name: fieldName,
value: fieldName,
- mode: 'url'
+ mode: 'routeParams'
});
};
// Respond to changing a filter field name
this.onChangeFilter = function(index) {
var filter = ctrl.filters[index];
- if (filter.name) {
- filter.mode = 'url';
- filter.value = filter.name;
- } else {
+ // Clear filter
+ if (!filter.name) {
ctrl.filters.splice(index, 1);
+ } else if (filter.mode === 'routeParams') {
+ // Set default value for routeParams
+ filter.value = filter.name;
}
};
// Convert filters array to js notation & add to crm-search-display element
function writeFilters() {
- var element = getSearchDisplayElement(),
- output = [];
+ var output = [];
if (!ctrl.filters.length) {
- delete element.filters;
+ if ('filters' in ctrl.display.element) {
+ delete ctrl.display.element.filters;
+ }
return;
}
_.each(ctrl.filters, function(filter) {
filter.name.match(/\W/) ? encode(filter.name) : filter.name,
];
// Object dot notation
- if (filter.mode === 'url' && !filter.value.match(/\W/)) {
- keyVal.push('routeParams.' + filter.value);
+ if (filter.mode !== 'val' && !filter.value.match(/\W/)) {
+ keyVal.push(filter.mode + '.' + filter.value);
}
// Object bracket notation
- else if (filter.mode === 'url') {
- keyVal.push('routeParams[' + encode(filter.value) + ']');
+ else if (filter.mode !== 'val') {
+ keyVal.push(filter.mode + '[' + encode(filter.value) + ']');
}
// Literal value
else {
}
output.push(keyVal.join(': '));
});
- element.filters = '{' + output.join(', ') + '}';
+ ctrl.display.element.filters = '{' + output.join(', ') + '}';
}
this.$onInit = function() {