1 (function(angular
, $, _
) {
4 // Shared between router and searchMeta service
7 // Declare module and route/controller/services
8 angular
.module('search', CRM
.angRequires('search'))
10 .config(function($routeProvider
) {
11 $routeProvider
.when('/:entity', {
12 controller
: 'searchRoute',
13 template
: '<div id="bootstrap-theme" class="crm-search"><crm-search entity="entity"></crm-search></div>',
18 // Controller binds entity to route
19 .controller('searchRoute', function($scope
, $routeParams
, $location
) {
20 searchEntity
= $scope
.entity
= $routeParams
.entity
;
22 // Changing entity will refresh the angular page
23 $scope
.$watch('entity', function(newEntity
, oldEntity
) {
24 if (newEntity
&& oldEntity
&& newEntity
!== oldEntity
) {
25 $location
.url('/' + newEntity
);
30 .factory('searchMeta', function() {
31 function getEntity(entityName
) {
33 entityName
= entityName
=== true ? searchEntity
: entityName
;
34 return _
.find(CRM
.vars
.search
.schema
, {name
: entityName
});
37 function getField(name
) {
38 var dotSplit
= name
.split('.'),
39 joinEntity
= dotSplit
.length
> 1 ? dotSplit
[0] : null,
40 fieldName
= _
.last(dotSplit
).split(':')[0],
41 entityName
= searchEntity
;
43 entityName
= _
.find(CRM
.vars
.search
.links
[entityName
], {alias
: joinEntity
}).entity
;
45 return _
.find(getEntity(entityName
).fields
, {name
: fieldName
});
50 parseExpr: function(expr
) {
53 bracketPos
= expr
.indexOf('(');
54 if (bracketPos
>= 0) {
55 fieldName
= expr
.match(/[A-Z( _]*([\w.:]+)/)[1];
56 result
.fn
= _
.find(CRM
.vars
.search
.functions
, {name
: expr
.substring(0, bracketPos
)});
58 result
.field
= getField(fieldName
);
59 var split
= fieldName
.split(':'),
60 dotPos
= split
[0].indexOf('.');
61 result
.path
= split
[0];
62 result
.prefix
= result
.path
.substring(0, dotPos
+ 1);
63 result
.suffix
= !split
[1] ? '' : ':' + split
[1];
69 // Reformat an array of objects for compatibility with select2
70 // Todo this probably belongs in core
71 .factory('formatForSelect2', function() {
72 return function(input
, key
, label
, extra
) {
73 return _
.transform(input
, function(result
, item
) {
74 var formatted
= {id
: item
[key
], text
: item
[label
]};
76 _
.merge(formatted
, _
.pick(item
, extra
));
78 result
.push(formatted
);
83 })(angular
, CRM
.$, CRM
._
);