0.0.6 | Built motion from commit ffa9431.
[motion.git] / public / assets / plugins / angular-elastic-builder / src / directives / BuilderDirective.js
1 /**
2  * angular-elastic-builder
3  *
4  * /src/directives/BuilderDirective.js
5  *
6  * Angular Directive for injecting a query builder form.
7  */
8
9 (function(angular) {
10   'use strict';
11
12   angular.module('angular-elastic-builder')
13     .directive('elasticBuilder', [
14       'elasticQueryService',
15
16       function EB(elasticQueryService) {
17
18         return {
19           scope: {
20             data: '=elasticBuilder',
21           },
22
23           templateUrl: 'angular-elastic-builder/BuilderDirective.html',
24
25           link: function(scope) {
26             var data = scope.data;
27
28             scope.filters = [];
29
30             /**
31              * Removes either Group or Rule
32              */
33             scope.removeChild = function(idx) {
34               scope.filters.splice(idx, 1);
35             };
36
37             /**
38              * Adds a Single Rule
39              */
40             scope.addRule = function() {
41               scope.filters.push({});
42             };
43
44             /**
45              * Adds a Group of Rules
46              */
47             scope.addGroup = function() {
48               scope.filters.push({
49                 type: 'group',
50                 subType: 'and',
51                 rules: [],
52               });
53             };
54
55             /**
56              * Any time "outside forces" change the query, they should tell us so via
57              * `data.needsUpdate`
58              */
59             scope.$watch('data.needsUpdate', function(curr) {
60               if (!curr) {
61                 return;
62               }
63
64               scope.filters = elasticQueryService.toFilters(data.query, scope.data.fields);
65               scope.data.needsUpdate = false;
66             });
67
68             /**
69              * Changes on the page update the Query
70              */
71             scope.$watch('filters', function(curr) {
72               if (!curr) {
73                 return;
74               }
75
76               data.query = elasticQueryService.toQuery(scope.filters, scope.data.fields);
77             }, true);
78           }
79         };
80       }
81
82     ]);
83
84 })(window.angular);