Socket
Socket
Sign inDemoInstall

@momsfriendlydevco/angular-ui-query-builder

Package Overview
Dependencies
5
Maintainers
4
Versions
33
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.3.4 to 1.3.6

66

dist/angular-ui-query-builder-core.js

@@ -20,3 +20,3 @@ "use strict";

type: v.type,
enum: _(v.enum).map(function (e) {
"enum": _(v["enum"]).map(function (e) {
return _.isString(e) ? {

@@ -182,3 +182,3 @@ id: e,

};
} else if (pathSpec.type == 'string' && _.isArray(pathSpec.enum) && pathSpec.enum.length) {
} else if (pathSpec.type == 'string' && _.isArray(pathSpec["enum"]) && pathSpec["enum"].length) {
return {

@@ -188,5 +188,5 @@ path: path,

type: 'enum',
action: operand.$in ? '$in' : operand.$nin ? '$nin' : pathSpec.enum.length ? '$in' : '$eq',
enum: pathSpec.enum,
value: operand.$in ? operand.$in : operand.$nin ? operand.$nin : pathSpec.enum.length && !_.isArray(operand) ? [operand] : operand,
action: operand.$in ? '$in' : operand.$nin ? '$nin' : pathSpec["enum"].length ? '$in' : '$eq',
"enum": pathSpec["enum"],
value: operand.$in ? operand.$in : operand.$nin ? operand.$nin : pathSpec["enum"].length && !_.isArray(operand) ? [operand] : operand,
actions: QueryBuilder.queryPathPrototypeActions

@@ -290,3 +290,3 @@ };

},
template: "\n\t\t<div class=\"ui-query-builder\">\n\t\t\t<div class=\"query-container\">\n\t\t\t\t<ui-query-builder-group\n\t\t\t\t\tqb-group=\"$ctrl.qbQuery\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-group>\n\t\t\t</div>\n\t\t</div>\n\t",
template: "\n\t\t<div class=\"ui-query-builder\">\n\t\t\t<div ng-if=\"$ctrl.isEmpty\">\n\t\t\t\t<ui-query-builder-group\n\t\t\t\t\tqb-group=\"$ctrl.emptyQueryLayout\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-group>\n\t\t\t</div>\n\t\t\t<div ng-if=\"!$ctrl.isEmpty\" class=\"query-container\">\n\t\t\t\t<ui-query-builder-group\n\t\t\t\t\tqb-group=\"$ctrl.qbQuery\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-group>\n\t\t\t</div>\n\t\t</div>\n\t",
controller: ["$scope", "$timeout", "QueryBuilder", function controller($scope, $timeout, QueryBuilder) {

@@ -345,3 +345,3 @@ var $ctrl = this; // Main loader {{{

});
if (!existingItemIndex) throw new Error("Cannot find path \"".concat(path, "\" to swap with new path \"").concat(newPath, "\""));
if (existingItemIndex < 0) throw new Error("Cannot find path \"".concat(path, "\" to swap with new path \"").concat(newPath, "\""));
$ctrl.qbQuery[existingItemIndex] = QueryBuilder.queryPathPrototype(newPath, undefined, $ctrl.qbSpec);

@@ -362,13 +362,33 @@ $timeout(function () {

$scope.$on('queryBuilder.pathAction.add', function (e, path) {
// Append new path and set to blank
$ctrl.qbQuery.push({
path: '',
type: 'blank',
value: null,
fields: []
});
$timeout(function () {
return $scope.$broadcast('queryBuilder.focusPath', '');
}); // Tell the widget to try and focus itself
});
if (!path) {
var existingItemIndex = $ctrl.qbQuery.findIndex(function (q) {
return !q.path;
}); // Adding an existing path somewhere already?
if (existingItemIndex) {
// Append new path and set to blank
$ctrl.qbQuery.push({
path: '',
type: 'blank',
value: null,
fields: []
});
}
$timeout(function () {
return $scope.$broadcast('queryBuilder.focusPath', '');
}); // Tell the widget to try and focus itself
} else {
console.warn('Adding a path to a sub-node is not yet supported');
}
}); // Manage empty queries {{{
$ctrl.emptyQueryLayout = [{
type: 'alert',
title: 'No query specified'
}];
$ctrl.isEmpty;
$scope.$watchCollection('$ctrl.qbQuery', function () {
return $ctrl.isEmpty = _.isEmpty($ctrl.qbQuery);
}); // }}}
}]

@@ -419,3 +439,3 @@ }) // }}}

$ctrl.delete = function (path) {
$ctrl["delete"] = function (path) {
return $scope.$emit('queryBuilder.pathAction.drop', path);

@@ -447,3 +467,3 @@ };

}],
template: "\n\t\t<div ng-switch=\"$ctrl.qbItem.type\">\n\t\t\t<!-- $and / $or condition {{{ -->\n\t\t\t<div ng-switch-when=\"binaryGroup\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-1 btn-block\">\n\t\t\t\t\t\t{{$ctrl.qbItem.title}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div ng-repeat=\"conditional in $ctrl.qbItem.children\" class=\"query-container clearfix\">\n\t\t\t\t\t<ui-query-builder-group\n\t\t\t\t\t\tqb-group=\"conditional\"\n\t\t\t\t\t\tqb-spec=\"$ctrl.spec\"\n\t\t\t\t\t></ui-query-builder-group>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- String {{{ -->\n\t\t\t<div ng-switch-when=\"string\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"2\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.action\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.actions\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-3 btn-block\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model=\"$ctrl.qbItem.value\"\n\t\t\t\t\t\t\tng-change=\"$ctrl.setChanged()\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Enum {{{ -->\n\t\t\t<div ng-switch-when=\"enum\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"2\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.action\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.actions\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<ui-query-builder-block-menu-multiple\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"3\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.value\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.enum\"\n\t\t\t\t></ui-query-builder-block-menu-multiple>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Date {{{ -->\n\t\t\t<div ng-switch-when=\"date\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"2\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.action\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.actions\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-3 btn-block\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model=\"$ctrl.qbItem.value\"\n\t\t\t\t\t\t\tng-change=\"$ctrl.setChanged()\"\n\t\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Number {{{ -->\n\t\t\t<div ng-switch-when=\"number\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"2\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.action\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.actions\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-3 btn-block\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-value=\"$ctrl.qbItem.value\"\n\t\t\t\t\t\t\tng-changed=\"$ctrl.setChanged()\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Exists {{{ -->\n\t\t\t<div ng-switch-when=\"exists\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"2\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.action\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.actions\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Search {{{ -->\n\t\t\t<div ng-switch-when=\"search\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-2 btn-block\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model=\"$ctrl.qbItem.value\"\n\t\t\t\t\t\t\tng-change=\"$ctrl.setChanged()\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- keyVal (Only title + value) {{{ -->\n\t\t\t<div ng-switch-when=\"keyVal\" class=\"query-row\">\n\t\t\t\t<a ng-if=\"$ctrl.qbItem.canDelete === undefined || $ctrl.qbItem.canDelete\" ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-block\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\ttitle=\"$ctrl.qbItem.title\"\n\t\t\t\t></ui-query-builder-block>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-2 btn-block\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model=\"$ctrl.qbItem.value\"\n\t\t\t\t\t\t\tng-change=\"$ctrl.setChanged()\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Blank (i.e. field not set yet) {{{ -->\n\t\t\t<div ng-switch-when=\"blank\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Unknown {{{ -->\n\t\t\t<div ng-switch-default class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-warning btn-block\">\n\t\t\t\t\t\tUnknown handler: {{$ctrl.qbItem.type}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t</div>\n\t"
template: "\n\t\t<div ng-switch=\"$ctrl.qbItem.type\">\n\t\t\t<!-- $and / $or condition {{{ -->\n\t\t\t<div ng-switch-when=\"binaryGroup\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-1 btn-block\">\n\t\t\t\t\t\t{{$ctrl.qbItem.title}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div ng-repeat=\"conditional in $ctrl.qbItem.children\" class=\"query-container clearfix\">\n\t\t\t\t\t<ui-query-builder-group\n\t\t\t\t\t\tqb-group=\"conditional\"\n\t\t\t\t\t\tqb-spec=\"$ctrl.spec\"\n\t\t\t\t\t></ui-query-builder-group>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- String {{{ -->\n\t\t\t<div ng-switch-when=\"string\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"2\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.action\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.actions\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-3 btn-block\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model=\"$ctrl.qbItem.value\"\n\t\t\t\t\t\t\tng-change=\"$ctrl.setChanged()\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Enum {{{ -->\n\t\t\t<div ng-switch-when=\"enum\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"2\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.action\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.actions\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<ui-query-builder-block-menu-multiple\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"3\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.value\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.enum\"\n\t\t\t\t></ui-query-builder-block-menu-multiple>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Date {{{ -->\n\t\t\t<div ng-switch-when=\"date\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"2\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.action\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.actions\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-3 btn-block\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model=\"$ctrl.qbItem.value\"\n\t\t\t\t\t\t\tng-change=\"$ctrl.setChanged()\"\n\t\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Number {{{ -->\n\t\t\t<div ng-switch-when=\"number\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"2\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.action\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.actions\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-3 btn-block\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-value=\"$ctrl.qbItem.value\"\n\t\t\t\t\t\t\tng-changed=\"$ctrl.setChanged()\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Exists {{{ -->\n\t\t\t<div ng-switch-when=\"exists\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"2\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.action\"\n\t\t\t\t\toptions=\"$ctrl.qbItem.actions\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Search {{{ -->\n\t\t\t<div ng-switch-when=\"search\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t\ton-change=\"$ctrl.setAction(selected)\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-2 btn-block\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model=\"$ctrl.qbItem.value\"\n\t\t\t\t\t\t\tng-change=\"$ctrl.setChanged()\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- keyVal (Only title + value) {{{ -->\n\t\t\t<div ng-switch-when=\"keyVal\" class=\"query-row\">\n\t\t\t\t<a ng-if=\"$ctrl.qbItem.canDelete === undefined || $ctrl.qbItem.canDelete\" ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-block\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\ttitle=\"$ctrl.qbItem.title\"\n\t\t\t\t></ui-query-builder-block>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-2 btn-block\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model=\"$ctrl.qbItem.value\"\n\t\t\t\t\t\t\tng-change=\"$ctrl.setChanged()\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Blank (i.e. field not set yet) {{{ -->\n\t\t\t<div ng-switch-when=\"blank\" class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Alert {{{ -->\n\t\t\t<div ng-switch-when=\"alert\" class=\"query-row\">\n\t\t\t\t<div class=\"query-block query-block-2\">\n\t\t\t\t\t<div class=\"btn btn-block btn-noclick\" ng-bind=\"$ctrl.qbItem.title\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t\t<!-- Unknown {{{ -->\n\t\t\t<div ng-switch-default class=\"query-row\">\n\t\t\t\t<a ng-click=\"$ctrl.delete($ctrl.qbItem.path)\" class=\"btn-trash\"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass=\"query-block\"\n\t\t\t\t\tlevel=\"1\"\n\t\t\t\t\tselected=\"$ctrl.qbItem.path\"\n\t\t\t\t\tqb-spec=\"$ctrl.qbSpec\"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class=\"query-block\">\n\t\t\t\t\t<div class=\"btn btn-warning btn-block\">\n\t\t\t\t\t\tUnknown handler: {{$ctrl.qbItem.type}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<!-- }}} -->\n\t\t</div>\n\t"
}) // }}}

@@ -487,3 +507,3 @@ // Component: uiQueryBuilderPath {{{

}],
template: "\n\t\t<a class=\"btn btn-block btn-{{$ctrl.level}} dropdown-toggle\" data-toggle=\"dropdown\">\n\t\t\t{{$ctrl.selectedOption.title}}\n\t\t\t<i class=\"fa fa-caret-down\"></i>\n\t\t</a>\n\t\t<ul class=\"dropdown-menu pull-right\">\n\t\t\t<li ng-repeat=\"path in $ctrl.options track by path.path\"><a ng-click=\"$ctrl.setSelected(path.path)\">{{path.title}}</a></li>\n\t\t</ul>\n\t"
template: "\n\t\t<a class=\"btn btn-block btn-{{$ctrl.level}} dropdown-toggle\" data-toggle=\"dropdown\" ng-bind=\"$ctrl.selectedOption.title\"></a>\n\t\t<ul class=\"dropdown-menu pull-right\">\n\t\t\t<li ng-repeat=\"path in $ctrl.options track by path.path\"><a ng-click=\"$ctrl.setSelected(path.path)\">{{path.title}}</a></li>\n\t\t</ul>\n\t"
}) // }}}

@@ -540,3 +560,3 @@ // Component: uiQueryBuilderBlock {{{

}],
template: "\n\t\t<a class=\"btn btn-block btn-{{$ctrl.level}} dropdown-toggle\" data-toggle=\"dropdown\">\n\t\t\t{{$ctrl.selectedOption.title}}\n\t\t\t<i class=\"fa fa-caret-down\"></i>\n\t\t</a>\n\t\t<ul class=\"dropdown-menu pull-right\">\n\t\t\t<li ng-repeat=\"option in $ctrl.options track by option.id\"><a ng-click=\"$ctrl.setSelected(option)\">{{option.title}}</a></li>\n\t\t</ul>\n\t"
template: "\n\t\t<a class=\"btn btn-block btn-{{$ctrl.level}} dropdown-toggle\" data-toggle=\"dropdown\" ng-bind=\"$ctrl.selectedOption.title\"></a>\n\t\t<ul class=\"dropdown-menu pull-right\">\n\t\t\t<li ng-repeat=\"option in $ctrl.options track by option.id\"><a ng-click=\"$ctrl.setSelected(option)\">{{option.title}}</a></li>\n\t\t</ul>\n\t"
}) // }}}

@@ -587,3 +607,3 @@ // Component: uiQueryBuilderBlockMenuMultiple {{{

}],
template: "\n\t\t<a class=\"btn btn-block btn-{{$ctrl.level}} dropdown-toggle\" data-toggle=\"dropdown\">\n\t\t\t<span ng-repeat=\"item in $ctrl.selectedOptions track by item.id\" class=\"pill\">\n\t\t\t\t{{item.title}}\n\t\t\t</span>\n\t\t\t<i class=\"fa fa-caret-down\"></i></a>\n\t\t</a>\n\t\t<ul class=\"dropdown-menu pull-right\">\n\t\t\t<li ng-repeat=\"option in $ctrl.options track by option.id\">\n\t\t\t\t<a ng-click=\"$ctrl.toggle(option)\">\n\t\t\t\t\t<i class=\"fa fa-fw\" ng-class=\"option.selected ? 'fa-check-square-o' : 'fa-square-o'\"></i>\n\t\t\t\t\t{{option.title}}\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t</ul>\n\t"
template: "\n\t\t<a class=\"btn btn-block btn-{{$ctrl.level}} dropdown-toggle\" data-toggle=\"dropdown\">\n\t\t\t<span ng-repeat=\"item in $ctrl.selectedOptions track by item.id\" class=\"pill\">\n\t\t\t\t{{item.title}}\n\t\t\t</span>\n\t\t</a>\n\t\t<ul class=\"dropdown-menu\">\n\t\t\t<li ng-repeat=\"option in $ctrl.options track by option.id\">\n\t\t\t\t<a ng-click=\"$ctrl.toggle(option)\">\n\t\t\t\t\t<i class=\"fa fa-fw\" ng-class=\"option.selected ? 'fa-check-square-o' : 'fa-square-o'\"></i>\n\t\t\t\t\t{{option.title}}\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t</ul>\n\t"
}); // }}}

@@ -1,1 +0,1 @@

"use strict";function _defineProperty(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}angular.module("angular-ui-query-builder",[]).service("QueryBuilder",function(){var c=this;c.cleanSpec=function(t){return _(t).mapValues(function(t,e){return{type:t.type,enum:_(t.enum).map(function(t){return _.isString(t)?{id:t,title:_.startCase(t)}:t}).sortBy("title").value()}}).value()},c.metaProperties={limit:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!0},populate:{type:"hidden"},skip:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!0},sort:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!1}},c.queryPathPrototypeActions=[{id:"$eq",title:"Equals"},{id:"$neq",title:"Doesnt equal"},{id:"$lt",title:"Is less than"},{id:"$lte",title:"Is equal to or less than"},{id:"$gt",title:"Is greater than"},{id:"$gte",title:"Is equal or greater than"},{id:"$in",title:"Is one of"},{id:"$nin",title:"Is not one of"},{id:"$exists",title:"Has a value"},{id:"$nexists",title:"Does not have a value"}],c.queryPathPrototype=function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=2<arguments.length?arguments[2]:void 0,r=n[t],l=_.isObject(e)&&_(e).keys().first(),i=_.isObject(e)?_(e).values().first():e;return"$or"==t&&e.every(function(t){return _.isObject(t)&&1==_.keys(t).length})&&e.map(function(t){return _.chain(t).first().values().first().keys().find(function(t){return"$regexp"==t}).value()}).length==e.length?{path:t,type:"search",title:"Search",value:_.chain(e).first().values().first().get("$regexp").value(),fields:_(e).map(function(t){return _.keys(t)}).flatten().value(),actions:c.queryPathPrototypeActions}:"$and"==t||"$or"==t?(_.isArray(e)||(console.warn("query-builder","Query path",t,"is a meta key",e,"but is not an array!","Given",_typeof(e)),e=[]),{path:t,type:"binaryGroup",title:"$and"==t?"AND":"$or"==t?"OR":"UNKNOWN",condition:t.replace(/\$/,""),children:e.map(function(t){return c.queryToArray(t,n)}),actions:c.queryPathPrototypeActions}):c.metaProperties[t]?Object.assign({path:t,title:_.startCase(t),value:e,type:"hidden",action:"$hidden",actions:c.queryPathPrototypeActions},c.metaProperties[t]):"$exists"==l?{path:t,title:e.title||_.startCase(t),value:!!e,type:"exists",action:"$exists",actions:c.queryPathPrototypeActions}:"string"==r.type&&_.isArray(r.enum)&&r.enum.length?{path:t,title:e.title||_.startCase(t),type:"enum",action:e.$in?"$in":e.$nin?"$nin":r.enum.length?"$in":"$eq",enum:r.enum,value:e.$in?e.$in:e.$nin?e.$nin:r.enum.length&&!_.isArray(e)?[e]:e,actions:c.queryPathPrototypeActions}:{path:t,title:e.title||_.startCase(t),type:"string"==r.type?"string":"number"==r.type?"number":"date"==r.type?"date":"string",action:"$eq",value:"date"==r.type?moment(i).toDate():i,actions:c.queryPathPrototypeActions}},c.queryToArray=function(t,r){return _(t).pickBy(function(t,e){var n=r[e]||"$and"==e||"$or"==e||c.metaProperties[e];return n||console.warn("query-builder","Incomming query path",e,"Does not map to anything in spec",r),!!n}).map(function(t,e){return c.queryPathPrototype(e,t,r)}).value()},c.arrayToQuery=function(t){return _(t).mapKeys(function(t){return t.path}).mapValues(function(e){switch(e.type){case"string":case"number":case"date":return"$eq"==e.action?e.value:_defineProperty({},e.action,e.value);case"enum":return _defineProperty({},e.action,e.value);case"exists":return{$exists:"$exists"==e.action};case"search":return e.fields.map(function(t){return _defineProperty({},t,{$regexp:e.value,options:"i"})});case"keyVal":case"hidden":return e.value;default:console.warn("Unknown type to convert:",e.type)}}).value()}}).component("uiQueryBuilder",{bindings:{query:"=",spec:"<"},template:'\n\t\t<div class="ui-query-builder">\n\t\t\t<div class="query-container">\n\t\t\t\t<ui-query-builder-group\n\t\t\t\t\tqb-group="$ctrl.qbQuery"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-group>\n\t\t\t</div>\n\t\t</div>\n\t',controller:["$scope","$timeout","QueryBuilder",function(l,i,c){var o=this;o.qbSpec,o.qbQuery;var t=l.$watchGroup(["$ctrl.query","$ctrl.spec"],function(){o.spec&&o.query&&(o.qbSpec=c.cleanSpec(o.spec),o.qbQuery=c.queryToArray(o.query,o.qbSpec),t())});l.$on("queryBuilder.change",function(t,e){return i(function(){e?(o.query=e,o.qbQuery=c.queryToArray(o.query,o.qbSpec)):o.query=c.arrayToQuery(o.qbQuery)})}),l.$on("queryBuilder.pathAction.drop",function(t,e){o.qbQuery=o.qbQuery.filter(function(t){return t.path!=e}),o.query=c.arrayToQuery(o.qbQuery)}),l.$on("queryBuilder.pathAction.swapPath",function(t,e,n){var r=o.qbQuery.findIndex(function(t){return t.path==e});if(!r)throw new Error('Cannot find path "'.concat(e,'" to swap with new path "').concat(n,'"'));o.qbQuery[r]=c.queryPathPrototype(n,void 0,o.qbSpec),i(function(){return l.$broadcast("queryBuilder.focusOperand",n)})}),l.$on("queryBuilder.pathAction.swapAction",function(t,e,n){console.log("SWAPACTION",e,n)}),l.$on("queryBuilder.pathAction.add",function(t,e){o.qbQuery.push({path:"",type:"blank",value:null,fields:[]}),i(function(){return l.$broadcast("queryBuilder.focusPath","")})})}]}).component("uiQueryBuilderGroup",{bindings:{qbGroup:"=",qbSpec:"<"},template:'\n\t\t<div ng-repeat="row in $ctrl.qbGroup | filter:$ctrl.qbGroupFilter" meta-key="{{row.path}}">\n\t\t\t<ui-query-builder-row\n\t\t\t\tqb-item="row"\n\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t></ui-query-builder-row>\n\t\t</div>\n\t\t<button ng-click="$ctrl.add()" type="button" class="btn-add"></button>\n\t',controller:["$scope","QueryBuilder",function(t,e){this.add=function(){return t.$emit("queryBuilder.pathAction.add")},this.qbGroupFilter=function(t){return"hidden"!=t.type}}]}).component("uiQueryBuilderRow",{bindings:{qbItem:"=",qbSpec:"<"},controller:["$element","$scope","QueryBuilder",function(r,e,t){var l=this;l.delete=function(t){return e.$emit("queryBuilder.pathAction.drop",t)},l.setChanged=function(){return e.$emit("queryBuilder.change")},l.setAction=function(t){return e.$emit("queryBuilder.pathAction.swapAction",l.qbItem,t)},e.$on("queryBuilder.focusPath",function(t,e){l.qbItem.path==e&&r.find("ui-query-builder-path .dropdown-toggle").dropdown("toggle")}),e.$on("queryBuilder.focusOperand",function(t,e){if(l.qbItem.path==e){var n=r.find("input.form-control");if(1==n.length)return n.focus();console.warn("Unable to focus any element within DOM",r[0],"for type",l.type,"on line item",l.qbItem)}})}],template:'\n\t\t<div ng-switch="$ctrl.qbItem.type">\n\t\t\t\x3c!-- $and / $or condition {{{ --\x3e\n\t\t\t<div ng-switch-when="binaryGroup" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-1 btn-block">\n\t\t\t\t\t\t{{$ctrl.qbItem.title}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div ng-repeat="conditional in $ctrl.qbItem.children" class="query-container clearfix">\n\t\t\t\t\t<ui-query-builder-group\n\t\t\t\t\t\tqb-group="conditional"\n\t\t\t\t\t\tqb-spec="$ctrl.spec"\n\t\t\t\t\t></ui-query-builder-group>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- String {{{ --\x3e\n\t\t\t<div ng-switch-when="string" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Enum {{{ --\x3e\n\t\t\t<div ng-switch-when="enum" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<ui-query-builder-block-menu-multiple\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="3"\n\t\t\t\t\tselected="$ctrl.qbItem.value"\n\t\t\t\t\toptions="$ctrl.qbItem.enum"\n\t\t\t\t></ui-query-builder-block-menu-multiple>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Date {{{ --\x3e\n\t\t\t<div ng-switch-when="date" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="date"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Number {{{ --\x3e\n\t\t\t<div ng-switch-when="number" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-value="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-changed="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="number"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Exists {{{ --\x3e\n\t\t\t<div ng-switch-when="exists" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Search {{{ --\x3e\n\t\t\t<div ng-switch-when="search" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-2 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- keyVal (Only title + value) {{{ --\x3e\n\t\t\t<div ng-switch-when="keyVal" class="query-row">\n\t\t\t\t<a ng-if="$ctrl.qbItem.canDelete === undefined || $ctrl.qbItem.canDelete" ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-block\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\ttitle="$ctrl.qbItem.title"\n\t\t\t\t></ui-query-builder-block>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-2 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Blank (i.e. field not set yet) {{{ --\x3e\n\t\t\t<div ng-switch-when="blank" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Unknown {{{ --\x3e\n\t\t\t<div ng-switch-default class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-warning btn-block">\n\t\t\t\t\t\tUnknown handler: {{$ctrl.qbItem.type}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t</div>\n\t'}).component("uiQueryBuilderPath",{bindings:{level:"<",selected:"<",qbSpec:"<"},controller:["$scope",function(e){var n=this;n.setSelected=function(t){return e.$emit("queryBuilder.pathAction.swapPath",n.selected,t)},n.options,n.$onInit=function(){n.options=_.map(n.qbSpec,function(t,e){return Object.assign({},{path:e,title:_.startCase(e)},t)}),n.selectedOption=n.options.find(function(t){return t.path==n.selected})}}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown">\n\t\t\t{{$ctrl.selectedOption.title}}\n\t\t\t<i class="fa fa-caret-down"></i>\n\t\t</a>\n\t\t<ul class="dropdown-menu pull-right">\n\t\t\t<li ng-repeat="path in $ctrl.options track by path.path"><a ng-click="$ctrl.setSelected(path.path)">{{path.title}}</a></li>\n\t\t</ul>\n\t'}).component("uiQueryBuilderBlock",{bindings:{level:"<",title:"<"},controller:["$scope",function(t){}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}}">\n\t\t\t{{$ctrl.title}}\n\t\t</a>\n\t'}).component("uiQueryBuilderBlockMenu",{bindings:{level:"<",options:"<",selected:"=",onChange:"&?"},controller:["$scope",function(t){var e=this;e.setSelected=function(t){e.selected=t.id,angular.isFunction(e.onChange)&&e.onChange({selected:e.selected})},e.selectedOption,t.$watchGroup(["$ctrl.options","$ctrl.selected"],function(){e.selectedOption=e.options.find(function(t){return t.id==e.selected})})}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown">\n\t\t\t{{$ctrl.selectedOption.title}}\n\t\t\t<i class="fa fa-caret-down"></i>\n\t\t</a>\n\t\t<ul class="dropdown-menu pull-right">\n\t\t\t<li ng-repeat="option in $ctrl.options track by option.id"><a ng-click="$ctrl.setSelected(option)">{{option.title}}</a></li>\n\t\t</ul>\n\t'}).component("uiQueryBuilderBlockMenuMultiple",{bindings:{level:"<",options:"<",selected:"="},controller:["$scope",function(t){var n=this;n.toggle=function(e){n.selected||(n.selected=[]),n.selected.includes(e.id)?n.selected=n.selected.filter(function(t){return t!=e.id}):n.selected.push(e.id),t.$emit("queryBuilder.change")},n.selectedOptions,t.$watch("$ctrl.selected",function(){n.selectedOptions=n.options.filter(function(t){return(n.selected||[]).includes(t.id)}),n.options.forEach(function(e){return e.selected=n.selectedOptions.some(function(t){return t.id==e.id})})},!0)}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown">\n\t\t\t<span ng-repeat="item in $ctrl.selectedOptions track by item.id" class="pill">\n\t\t\t\t{{item.title}}\n\t\t\t</span>\n\t\t\t<i class="fa fa-caret-down"></i></a>\n\t\t</a>\n\t\t<ul class="dropdown-menu pull-right">\n\t\t\t<li ng-repeat="option in $ctrl.options track by option.id">\n\t\t\t\t<a ng-click="$ctrl.toggle(option)">\n\t\t\t\t\t<i class="fa fa-fw" ng-class="option.selected ? \'fa-check-square-o\' : \'fa-square-o\'"></i>\n\t\t\t\t\t{{option.title}}\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t</ul>\n\t'});
"use strict";function _defineProperty(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}angular.module("angular-ui-query-builder",[]).service("QueryBuilder",function(){var c=this;c.cleanSpec=function(t){return _(t).mapValues(function(t,e){return{type:t.type,enum:_(t.enum).map(function(t){return _.isString(t)?{id:t,title:_.startCase(t)}:t}).sortBy("title").value()}}).value()},c.metaProperties={limit:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!0},populate:{type:"hidden"},skip:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!0},sort:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!1}},c.queryPathPrototypeActions=[{id:"$eq",title:"Equals"},{id:"$neq",title:"Doesnt equal"},{id:"$lt",title:"Is less than"},{id:"$lte",title:"Is equal to or less than"},{id:"$gt",title:"Is greater than"},{id:"$gte",title:"Is equal or greater than"},{id:"$in",title:"Is one of"},{id:"$nin",title:"Is not one of"},{id:"$exists",title:"Has a value"},{id:"$nexists",title:"Does not have a value"}],c.queryPathPrototype=function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=2<arguments.length?arguments[2]:void 0,r=n[t],l=_.isObject(e)&&_(e).keys().first(),i=_.isObject(e)?_(e).values().first():e;return"$or"==t&&e.every(function(t){return _.isObject(t)&&1==_.keys(t).length})&&e.map(function(t){return _.chain(t).first().values().first().keys().find(function(t){return"$regexp"==t}).value()}).length==e.length?{path:t,type:"search",title:"Search",value:_.chain(e).first().values().first().get("$regexp").value(),fields:_(e).map(function(t){return _.keys(t)}).flatten().value(),actions:c.queryPathPrototypeActions}:"$and"==t||"$or"==t?(_.isArray(e)||(console.warn("query-builder","Query path",t,"is a meta key",e,"but is not an array!","Given",_typeof(e)),e=[]),{path:t,type:"binaryGroup",title:"$and"==t?"AND":"$or"==t?"OR":"UNKNOWN",condition:t.replace(/\$/,""),children:e.map(function(t){return c.queryToArray(t,n)}),actions:c.queryPathPrototypeActions}):c.metaProperties[t]?Object.assign({path:t,title:_.startCase(t),value:e,type:"hidden",action:"$hidden",actions:c.queryPathPrototypeActions},c.metaProperties[t]):"$exists"==l?{path:t,title:e.title||_.startCase(t),value:!!e,type:"exists",action:"$exists",actions:c.queryPathPrototypeActions}:"string"==r.type&&_.isArray(r.enum)&&r.enum.length?{path:t,title:e.title||_.startCase(t),type:"enum",action:e.$in?"$in":e.$nin?"$nin":r.enum.length?"$in":"$eq",enum:r.enum,value:e.$in?e.$in:e.$nin?e.$nin:r.enum.length&&!_.isArray(e)?[e]:e,actions:c.queryPathPrototypeActions}:{path:t,title:e.title||_.startCase(t),type:"string"==r.type?"string":"number"==r.type?"number":"date"==r.type?"date":"string",action:"$eq",value:"date"==r.type?moment(i).toDate():i,actions:c.queryPathPrototypeActions}},c.queryToArray=function(t,r){return _(t).pickBy(function(t,e){var n=r[e]||"$and"==e||"$or"==e||c.metaProperties[e];return n||console.warn("query-builder","Incomming query path",e,"Does not map to anything in spec",r),!!n}).map(function(t,e){return c.queryPathPrototype(e,t,r)}).value()},c.arrayToQuery=function(t){return _(t).mapKeys(function(t){return t.path}).mapValues(function(e){switch(e.type){case"string":case"number":case"date":return"$eq"==e.action?e.value:_defineProperty({},e.action,e.value);case"enum":return _defineProperty({},e.action,e.value);case"exists":return{$exists:"$exists"==e.action};case"search":return e.fields.map(function(t){return _defineProperty({},t,{$regexp:e.value,options:"i"})});case"keyVal":case"hidden":return e.value;default:console.warn("Unknown type to convert:",e.type)}}).value()}}).component("uiQueryBuilder",{bindings:{query:"=",spec:"<"},template:'\n\t\t<div class="ui-query-builder">\n\t\t\t<div ng-if="$ctrl.isEmpty">\n\t\t\t\t<ui-query-builder-group\n\t\t\t\t\tqb-group="$ctrl.emptyQueryLayout"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-group>\n\t\t\t</div>\n\t\t\t<div ng-if="!$ctrl.isEmpty" class="query-container">\n\t\t\t\t<ui-query-builder-group\n\t\t\t\t\tqb-group="$ctrl.qbQuery"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-group>\n\t\t\t</div>\n\t\t</div>\n\t',controller:["$scope","$timeout","QueryBuilder",function(l,i,c){var o=this;o.qbSpec,o.qbQuery;var t=l.$watchGroup(["$ctrl.query","$ctrl.spec"],function(){o.spec&&o.query&&(o.qbSpec=c.cleanSpec(o.spec),o.qbQuery=c.queryToArray(o.query,o.qbSpec),t())});l.$on("queryBuilder.change",function(t,e){return i(function(){e?(o.query=e,o.qbQuery=c.queryToArray(o.query,o.qbSpec)):o.query=c.arrayToQuery(o.qbQuery)})}),l.$on("queryBuilder.pathAction.drop",function(t,e){o.qbQuery=o.qbQuery.filter(function(t){return t.path!=e}),o.query=c.arrayToQuery(o.qbQuery)}),l.$on("queryBuilder.pathAction.swapPath",function(t,e,n){var r=o.qbQuery.findIndex(function(t){return t.path==e});if(r<0)throw new Error('Cannot find path "'.concat(e,'" to swap with new path "').concat(n,'"'));o.qbQuery[r]=c.queryPathPrototype(n,void 0,o.qbSpec),i(function(){return l.$broadcast("queryBuilder.focusOperand",n)})}),l.$on("queryBuilder.pathAction.swapAction",function(t,e,n){console.log("SWAPACTION",e,n)}),l.$on("queryBuilder.pathAction.add",function(t,e){e?console.warn("Adding a path to a sub-node is not yet supported"):(o.qbQuery.findIndex(function(t){return!t.path})&&o.qbQuery.push({path:"",type:"blank",value:null,fields:[]}),i(function(){return l.$broadcast("queryBuilder.focusPath","")}))}),o.emptyQueryLayout=[{type:"alert",title:"No query specified"}],o.isEmpty,l.$watchCollection("$ctrl.qbQuery",function(){return o.isEmpty=_.isEmpty(o.qbQuery)})}]}).component("uiQueryBuilderGroup",{bindings:{qbGroup:"=",qbSpec:"<"},template:'\n\t\t<div ng-repeat="row in $ctrl.qbGroup | filter:$ctrl.qbGroupFilter" meta-key="{{row.path}}">\n\t\t\t<ui-query-builder-row\n\t\t\t\tqb-item="row"\n\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t></ui-query-builder-row>\n\t\t</div>\n\t\t<button ng-click="$ctrl.add()" type="button" class="btn-add"></button>\n\t',controller:["$scope","QueryBuilder",function(t,e){this.add=function(){return t.$emit("queryBuilder.pathAction.add")},this.qbGroupFilter=function(t){return"hidden"!=t.type}}]}).component("uiQueryBuilderRow",{bindings:{qbItem:"=",qbSpec:"<"},controller:["$element","$scope","QueryBuilder",function(r,e,t){var l=this;l.delete=function(t){return e.$emit("queryBuilder.pathAction.drop",t)},l.setChanged=function(){return e.$emit("queryBuilder.change")},l.setAction=function(t){return e.$emit("queryBuilder.pathAction.swapAction",l.qbItem,t)},e.$on("queryBuilder.focusPath",function(t,e){l.qbItem.path==e&&r.find("ui-query-builder-path .dropdown-toggle").dropdown("toggle")}),e.$on("queryBuilder.focusOperand",function(t,e){if(l.qbItem.path==e){var n=r.find("input.form-control");if(1==n.length)return n.focus();console.warn("Unable to focus any element within DOM",r[0],"for type",l.type,"on line item",l.qbItem)}})}],template:'\n\t\t<div ng-switch="$ctrl.qbItem.type">\n\t\t\t\x3c!-- $and / $or condition {{{ --\x3e\n\t\t\t<div ng-switch-when="binaryGroup" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-1 btn-block">\n\t\t\t\t\t\t{{$ctrl.qbItem.title}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div ng-repeat="conditional in $ctrl.qbItem.children" class="query-container clearfix">\n\t\t\t\t\t<ui-query-builder-group\n\t\t\t\t\t\tqb-group="conditional"\n\t\t\t\t\t\tqb-spec="$ctrl.spec"\n\t\t\t\t\t></ui-query-builder-group>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- String {{{ --\x3e\n\t\t\t<div ng-switch-when="string" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Enum {{{ --\x3e\n\t\t\t<div ng-switch-when="enum" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<ui-query-builder-block-menu-multiple\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="3"\n\t\t\t\t\tselected="$ctrl.qbItem.value"\n\t\t\t\t\toptions="$ctrl.qbItem.enum"\n\t\t\t\t></ui-query-builder-block-menu-multiple>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Date {{{ --\x3e\n\t\t\t<div ng-switch-when="date" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="date"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Number {{{ --\x3e\n\t\t\t<div ng-switch-when="number" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-value="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-changed="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="number"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Exists {{{ --\x3e\n\t\t\t<div ng-switch-when="exists" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Search {{{ --\x3e\n\t\t\t<div ng-switch-when="search" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-2 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- keyVal (Only title + value) {{{ --\x3e\n\t\t\t<div ng-switch-when="keyVal" class="query-row">\n\t\t\t\t<a ng-if="$ctrl.qbItem.canDelete === undefined || $ctrl.qbItem.canDelete" ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-block\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\ttitle="$ctrl.qbItem.title"\n\t\t\t\t></ui-query-builder-block>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-2 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Blank (i.e. field not set yet) {{{ --\x3e\n\t\t\t<div ng-switch-when="blank" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Alert {{{ --\x3e\n\t\t\t<div ng-switch-when="alert" class="query-row">\n\t\t\t\t<div class="query-block query-block-2">\n\t\t\t\t\t<div class="btn btn-block btn-noclick" ng-bind="$ctrl.qbItem.title"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Unknown {{{ --\x3e\n\t\t\t<div ng-switch-default class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-warning btn-block">\n\t\t\t\t\t\tUnknown handler: {{$ctrl.qbItem.type}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t</div>\n\t'}).component("uiQueryBuilderPath",{bindings:{level:"<",selected:"<",qbSpec:"<"},controller:["$scope",function(e){var n=this;n.setSelected=function(t){return e.$emit("queryBuilder.pathAction.swapPath",n.selected,t)},n.options,n.$onInit=function(){n.options=_.map(n.qbSpec,function(t,e){return Object.assign({},{path:e,title:_.startCase(e)},t)}),n.selectedOption=n.options.find(function(t){return t.path==n.selected})}}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown" ng-bind="$ctrl.selectedOption.title"></a>\n\t\t<ul class="dropdown-menu pull-right">\n\t\t\t<li ng-repeat="path in $ctrl.options track by path.path"><a ng-click="$ctrl.setSelected(path.path)">{{path.title}}</a></li>\n\t\t</ul>\n\t'}).component("uiQueryBuilderBlock",{bindings:{level:"<",title:"<"},controller:["$scope",function(t){}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}}">\n\t\t\t{{$ctrl.title}}\n\t\t</a>\n\t'}).component("uiQueryBuilderBlockMenu",{bindings:{level:"<",options:"<",selected:"=",onChange:"&?"},controller:["$scope",function(t){var e=this;e.setSelected=function(t){e.selected=t.id,angular.isFunction(e.onChange)&&e.onChange({selected:e.selected})},e.selectedOption,t.$watchGroup(["$ctrl.options","$ctrl.selected"],function(){e.selectedOption=e.options.find(function(t){return t.id==e.selected})})}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown" ng-bind="$ctrl.selectedOption.title"></a>\n\t\t<ul class="dropdown-menu pull-right">\n\t\t\t<li ng-repeat="option in $ctrl.options track by option.id"><a ng-click="$ctrl.setSelected(option)">{{option.title}}</a></li>\n\t\t</ul>\n\t'}).component("uiQueryBuilderBlockMenuMultiple",{bindings:{level:"<",options:"<",selected:"="},controller:["$scope",function(t){var n=this;n.toggle=function(e){n.selected||(n.selected=[]),n.selected.includes(e.id)?n.selected=n.selected.filter(function(t){return t!=e.id}):n.selected.push(e.id),t.$emit("queryBuilder.change")},n.selectedOptions,t.$watch("$ctrl.selected",function(){n.selectedOptions=n.options.filter(function(t){return(n.selected||[]).includes(t.id)}),n.options.forEach(function(e){return e.selected=n.selectedOptions.some(function(t){return t.id==e.id})})},!0)}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown">\n\t\t\t<span ng-repeat="item in $ctrl.selectedOptions track by item.id" class="pill">\n\t\t\t\t{{item.title}}\n\t\t\t</span>\n\t\t</a>\n\t\t<ul class="dropdown-menu">\n\t\t\t<li ng-repeat="option in $ctrl.options track by option.id">\n\t\t\t\t<a ng-click="$ctrl.toggle(option)">\n\t\t\t\t\t<i class="fa fa-fw" ng-class="option.selected ? \'fa-check-square-o\' : \'fa-square-o\'"></i>\n\t\t\t\t\t{{option.title}}\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t</ul>\n\t'});

@@ -33,3 +33,3 @@ "use strict";

};
qbTableSettings.export = {
qbTableSettings["export"] = {
defaults: {

@@ -317,4 +317,2 @@ format: 'xlsx'

$element.addClass('qb-col');
}],

@@ -550,3 +548,3 @@ link: function link(scope, element, attrs, parentScope) {

$scope.exportPrompt = function () {
$scope.settings = angular.extend(angular.copy(qbTableSettings.export.defaults), {
$scope.settings = angular.extend(angular.copy(qbTableSettings["export"].defaults), {
query: _($scope.query).omitBy(function (v, k) {

@@ -563,7 +561,7 @@ return ['skip', 'limit'].includes(k);

}).value(),
questions: _(qbTableSettings.export.questions) // Populate questions with defaults
questions: _(qbTableSettings["export"].questions) // Populate questions with defaults
.mapKeys(function (v) {
return v.id;
}).mapValues(function (v) {
return v.default;
return v["default"];
}).value()

@@ -650,3 +648,3 @@ });

restrict: 'A',
controller: ["$element", "$scope", "qbTableSettings", function controller($element, $scope, qbTableSettings) {
controller: ["$element", "$scope", "$rootScope", "qbTableSettings", function controller($element, $scope, $rootScope, qbTableSettings) {
var $ctrl = this;

@@ -672,3 +670,5 @@ $scope.qbTableSettings = qbTableSettings;

if (!$scope.binding || $scope.binding == 'complete') $scope.query = $scope.queryCopy;
$element.find('.qb-modal').modal('hide');
$element.find('.qb-modal').modal('hide'); // Inform the main query builder that we've changed something
$rootScope.$broadcast('queryBuilder.change.replace', $scope.query);
};

@@ -675,0 +675,0 @@

@@ -1,1 +0,1 @@

"use strict";function _defineProperty(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}angular.module("angular-ui-query-builder").provider("qbTableSettings",function(){var t=this;return t.debug=!1,t.debugPrefix="[angular-ui-query-builder]",t.icons={sortNone:"fa fa-fw fa-sort text-muted",sortAsc:"fa fa-fw fa-sort-alpha-asc text-primary",sortDesc:"fa fa-fw fa-sort-alpha-desc text-primary",checkMetaChecked:"fa fa-lg fa-fw fa-check-square-o text-primary",checkMetaSome:"fa fa-lg fa-fw fa-minus-square-o",checkMetaUnchecked:"fa fa-lg fa-fw fa-square-o",checkMetaCaret:"fa fa-caret-down",checkItemChecked:"fa fa-lg fa-fw fa-check-square-o",checkItemUnchecked:"fa fa-lg fa-fw fa-square-o",paginationPrev:"fa fa-arrow-left",paginationNext:"fa fa-arrow-right",modalClose:"fa fa-times",modalCollapseClosed:"fa fa-caret-right pull-right",search:"fa fa-search",searchClear:"fa fa-times"},t.pagination={showXOfY:!0,showPages:!0,pageRangeBack:5,pageRangeFore:5},t.export={defaults:{format:"xlsx"},formats:[{id:"xlsx",title:"Excel (XLSX)"},{id:"csv",title:"CSV"},{id:"json",title:"JSON"},{id:"html",title:"HTML (display in browser)"}],questions:[]},t.$get=function(){return t},t}).service("qbTableUtilities",function(){return{getSynopsis:function(t){var e=_.keys(t).filter(function(t){return!["sort","skip","limit","select"].includes(t)});return[e.length?1==e.length?"1 filter":"".concat(e.length," filters"):"All documents",t.sort?t.sort.startsWith("-")?"sorted by ".concat(t.sort.substr(1)," (reverse order)"):"sorted by ".concat(t.sort):null,t.limit?"limited to ".concat(t.limit," rows"):null,t.offset?"starting at record ".concat(t.skip):null,t.select?"selecting only ".concat(t.select.length," columns"):null].filter(function(t){return t}).join(", ")},find:function(t,e){var s,i=_.isFunction(e)?e:_.matches(e);return!!function n(t,a){return i(t,a.slice(a.length-1))?(s=a,!0):_.isArray(t)?t.some(function(t,e){return n(t,a.concat(e))}):_.isObject(t)?_.some(t,function(t,e){return n(t,a.concat(e))}):void 0}(t,[])&&s},escapeRegExp:function(t){return String(t).replace(/(\W)/g,"\\$1")},unescapeRegExp:function(t){return String(t).replace(/\\(\W)/g,"$1")}}}).directive("qbTable",function(){return{scope:{qbTable:"=?",count:"<?",stickyThead:"<?",stickyTfoot:"<?"},restrict:"AC",controller:["$attrs","$element","$rootScope","$scope","$timeout","qbTableSettings",function(t,e,n,s,a,i){var l=this;l.query=s.qbTable,l.count=s.count,s.$watch("count",function(){return l.count=s.count}),l.$broadcast=function(t){for(var e=arguments.length,n=new Array(1<e?e-1:0),a=1;a<e;a++)n[a-1]=arguments[a];return s.$broadcast.apply(s,[t].concat(n))},l.$on=function(t,e){return s.$on(t,e)},l.setDirty=function(){i.debug&&console.log(i.debugPrefix,"Declare query dirty",s.qbTable),n.$broadcast("queryBuilder.change",s.qbTable)},l.setField=function(t,e){if(null!=e){switch(t){case"sort":l.query.sort===e?l.query.sort="-".concat(e):(l.query.sort,"-".concat(e),l.query.sort=e);break;default:s.qbTable[t]=e}return l}delete l.query[t]},e.addClass("qb-table"),s.$watch("stickyThead",function(){return e.toggleClass("qb-sticky-thead",s.stickyThead||""===t.stickyThead)}),s.$watch("stickyTfoot",function(){return e.toggleClass("qb-sticky-tfoot",s.stickyTfoot||""===t.stickyTfoot)}),s.$watch("count",function(){return e.toggleClass("qb-noresults",0===s.count)}),s.$on("queryBuilder.change.replace",function(t,e){l.query=s.qbTable=e,a(function(){return l.setDirty()})})}]}}).directive("qbCol",function(){return{scope:{qbCol:"@",sortable:"@"},require:"^qbTable",restrict:"A",transclude:!0,controller:["$attrs","$element","$scope","$timeout","qbTableSettings",function(t,e,n,a,s){n.qbTableSettings=s;var i=n.$watchGroup(["qbTable","sortable"],function(){""===t.sortable&&!n.qbTable&&s.debug&&console.warn(s.debugPrefix,"Added qb-col + sortable onto element",e,"but no qb-table query has been assigned on the table element!"),i()});n.canSort=!1,n.isSorted=!1,this.$onInit=function(){n.canSort=n.sortable||""===t.sortable,e.toggleClass("sortable",n.canSort),n.canSort&&e.on("click",function(){return a(n.toggleSort)})},n.$watch("qbTable.query.sort",function(t){var e=n.sortable||n.qbCol;t?angular.isArray(t)&&t.some(function(t){return t==e})||t==e?n.isSorted="asc":angular.isArray(t)&&t.some(function(t){return t=="-"+e})||t=="-"+e?n.isSorted="desc":n.isSorted=!1:n.isSorted=!1}),n.toggleSort=function(){n.sortable?n.qbTable.setField("sort",n.sortable).setDirty():n.qbCol&&""===t.sortable&&n.qbTable.setField("sort",n.qbCol).setDirty()},e.addClass("qb-col")}],link:function(t,e,n,a){t.qbTable=a},template:'\n\t\t<div class="qb-col-wrapper">\n\t\t\t<ng-transclude></ng-transclude>\n\t\t\t<a ng-if="canSort" ng-click="toggleSort()" class="qb-col-right">\n\t\t\t\t<i class="{{\n\t\t\t\t\tisSorted == \'asc\' ? qbTableSettings.icons.sortAsc\n\t\t\t\t\t: isSorted == \'desc\' ? qbTableSettings.icons.sortDesc\n\t\t\t\t\t: qbTableSettings.icons.sortNone\n\t\t\t\t}}"></i>\n\t\t\t</a>\n\t\t</div>\n\t'}}).directive("qbCell",function(){return{scope:{selector:"=?",onPreSelect:"&?",onSelect:"&?"},require:"^qbTable",restrict:"A",transclude:!0,controller:["$attrs","$element","$scope","$timeout","qbTableSettings",function(t,e,n,a,s){n.qbTableSettings=s,n.isMeta=0<e.parents("thead").length,n.isMeta&&a(function(){return n.qbTable.$on("qbTableCellSelect",function(){var t=[];n.qbTable.$broadcast("qbTableCellSelectStatus",t),n.metaStatus=t.every(function(t){return t})?"all":t.some(function(t){return t})?"some":"none"})}),n.isSelector="selector"in t,n.$watch("selector",function(){n.isSelector&&e.toggleClass("selector",n.isSelector),n.isSelector&&!n.isMeta&&e.parents("tr").toggleClass("selected",!!n.selector)}),n.isSelector&&!n.isMeta&&e.on("click",function(t){return n.$apply(function(){n.onPreSelect&&n.onPreSelect({value:n.selector}),n.selector=!n.selector,n.qbTable.$broadcast("qbTableCellSelect"),n.onSelect&&a(function(){return n.onSelect({value:n.selector})})})}),n.metaSelect=function(t){return n.qbTable.$broadcast("qbTableCellSelectMeta",t)},n.isSelector&&!n.isMeta&&a(function(){n.qbTable.$on("qbTableCellSelectMeta",function(t,e){switch(e){case"all":n.selector=!0;break;case"invert":n.selector=!n.selector;break;case"none":n.selector=!1;break;default:throw new Error("Unknown selection type: ".concat(e))}n.qbTable.$broadcast("qbTableCellSelect")}),n.qbTable.$on("qbTableCellSelectStatus",function(t,e){return e.push(n.selector)})}),e.addClass("qb-cell")}],link:function(t,e,n,a){t.qbTable=a},template:'\n\t\t<ng-transclude></ng-transclude>\n\t\t<div ng-if="isSelector && isMeta" class="btn-group">\n\t\t\t<a class="btn btn-default dropdown-toggle" data-toggle="dropdown">\n\t\t\t\t<i ng-class="metaStatus == \'all\' ? qbTableSettings.icons.checkMetaChecked : metaStatus == \'some\' ? qbTableSettings.icons.checkMetaUnchecked : qbTableSettings.icons.checkMetaUnchecked"></i>\n\t\t\t\t<i ng-class="qbTableSettings.icons.checkMetaCaret"></i>\n\t\t\t</a>\n\t\t\t<ul class="dropdown-menu">\n\t\t\t\t<li><a ng-click="metaSelect(\'all\')">All</a></li>\n\t\t\t\t<li><a ng-click="metaSelect(\'invert\')">Invert</a></li>\n\t\t\t\t<li><a ng-click="metaSelect(\'none\')">None</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div ng-if="isSelector && !isMeta">\n\t\t\t<i ng-class="selector ? qbTableSettings.icons.checkItemChecked : qbTableSettings.icons.checkItemUnchecked"></i>\n\t\t</div>\n\t'}}).directive("qbPagination",function(){return{scope:{},require:"^qbTable",restrict:"EA",transclude:!0,controller:["$attrs","$scope","qbTableSettings",function(t,e,n){e.qbTableSettings=n,e.canPrev=!0,e.canNext=!0,e.showRange={},e.$watchGroup(["qbTable.query.limit","qbTable.query.skip","qbTable.count"],function(t){e.canPrev=0<e.qbTable.query.skip,e.canNext=!e.qbTable.count||e.qbTable.query.skip+e.qbTable.query.limit<e.qbTable.count,n.pagination.showXOfY&&(e.showRange={start:(e.qbTable.query.skip||0)+1,end:Math.min((e.qbTable.query.skip||0)+e.qbTable.query.limit,e.qbTable.count),total:e.qbTable.count}),n.pagination.showPages&&(e.pages={current:!!e.qbTable.query.limit&&Math.floor((e.qbTable.query.skip||0)/e.qbTable.query.limit)},e.pages.min=Math.max(e.pages.current-n.pagination.pageRangeBack,0),e.pages.total=e.qbTable.query.limit?Math.ceil(e.qbTable.count/e.qbTable.query.limit):1,e.pages.max=Math.min(e.pages.total,e.pages.current+n.pagination.pageRangeFore+1),e.pages.range=_.range(e.pages.min,e.pages.max).map(function(t){return{number:t,mode:t==e.pages.current?"current":t==e.pages.current-1?"prev":t==e.pages.current+1?"next":"normal"}}))}),e.navPageRelative=function(t){if(-1==t)e.qbTable.setField("skip",Math.max((e.qbTable.query.skip||0)-(e.qbTable.query.limit||10),0)).setDirty();else{if(1!=t)throw new Error("Unsupported page move: "+t);e.qbTable.setField("skip",(e.qbTable.query.skip||0)+(e.qbTable.query.limit||10)).setDirty()}},e.navPageNumber=function(t){return e.qbTable.setField("skip",(t||0)*(e.qbTable.query.limit||10)).setDirty()}}],link:function(t,e,n,a){t.qbTable=a},template:'\n\t\t<nav>\n\t\t\t<ul class="pager">\n\t\t\t\t<li ng-class="canPrev ? \'\' : \'disabled\'" class="previous"><a ng-click="navPageRelative(-1)"><i ng-class="qbTableSettings.icons.paginationPrev"></i></a></li>\n\t\t\t\t<ng-transclude class="text-center">\n\t\t\t\t\t<span ng-if="qbTableSettings.pagination.showXOfY && showRange.end" class="display-xofy">\n\t\t\t\t\t\tShowing documents {{showRange.start | number}} - {{showRange.end | number}}\n\t\t\t\t\t\t<span ng-if="showRange.total">\n\t\t\t\t\t\t\tof {{showRange.total | number}}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<ul ng-if="qbTableSettings.pagination.showPages && showRange.end && pages.max > 1" class="display-pages pagination">\n\t\t\t\t\t\t<li ng-repeat="page in pages.range track by page.number" ng-class="page.mode == \'current\' ? \'active\' : \'\'">\n\t\t\t\t\t\t\t<a ng-click="navPageNumber(page.number)">\n\t\t\t\t\t\t\t\t{{page.number + 1 | number}}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</ng-transclude>\n\t\t\t\t<li ng-class="canNext ? \'\' : \'disabled\'" class="next"><a ng-click="navPageRelative(1)"><i ng-class="qbTableSettings.icons.paginationNext"></i></a></li>\n\t\t\t</ul>\n\t\t</nav>\n\t'}}).directive("qbExport",function(){return{scope:{query:"<",spec:"<",url:"@"},transclude:!0,restrict:"EA",controller:["$element","$httpParamSerializerJQLike","$scope","$timeout","$window","qbTableSettings","qbTableUtilities",function(t,e,n,a,s,i,l){n.qbTableSettings=i,n.settings={},n.isShowing=!1,n.exportPrompt=function(){n.settings=angular.extend(angular.copy(i.export.defaults),{query:_(n.query).omitBy(function(t,e){return["skip","limit"].includes(e)}).value(),columns:_(n.spec).pickBy(function(t){return t&&t.type&&["string","number","data","boolean","objectid"].includes(t.type)}).map(function(t,e){return t.id=e,t.title=_.startCase(e),t.selected=!0,t}).value(),questions:_(i.export.questions).mapKeys(function(t){return t.id}).mapValues(function(t){return t.default}).value()}),t.find(".modal").on("show.bs.modal",function(){return a(function(){return n.isShowing=!0})}).on("hidden.bs.modal",function(){return a(function(){return n.isShowing=!1})}).modal("show")},n.exportExecute=function(){var t=angular.extend(n.settings.query,{select:n.settings.columns.filter(function(t){return t.selected}).map(function(t){return t.id}),format:n.settings.format},n.settings.questions);s.open(n.url+"?"+e(t))},n.querySynopsis,n.$watchGroup(["isShowing","settings.query"],function(){n.isShowing&&(n.querySynopsis=l.getSynopsis(n.settings.query))}),n.columnSynopsis,n.$watchGroup(["isShowing",function(){return _.get(n.settings,"columns",[]).map(function(t){return t.id+"="+t.selected}).join("&")}],function(){n.isShowing&&(n.columnSynopsis=n.settings.columns.filter(function(t){return t.selected}).length+" columns")})}],link:function(t,e){e.find("ng-transclude").on("click",function(){return t.$applyAsync(function(){return t.exportPrompt()})})},template:'\n\t\t<div class="modal fade">\n\t\t\t<div class="modal-dialog modal-lg">\n\t\t\t\t<div ng-if="isShowing" class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<a class="close" data-dismiss="modal"><i ng-class="qbTableSettings.icons.modalClose"></i></a>\n\t\t\t\t\t\t<h4 class="modal-title">Export</h4>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body form-horizontal">\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Output format</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<select ng-model="settings.format" class="form-control">\n\t\t\t\t\t\t\t\t\t<option ng-repeat="format in qbTableSettings.export.formats track by format.id" value="{{format.id}}">{{format.title}}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Criteria</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<div class="panel-group" id="qb-export-criteria-{{$id}}">\n\t\t\t\t\t\t\t\t\t<div class="panel panel-default">\n\t\t\t\t\t\t\t\t\t\t<div class="panel-heading">\n\t\t\t\t\t\t\t\t\t\t\t<h4 class="panel-title">\n\t\t\t\t\t\t\t\t\t\t\t\t<a data-toggle="collapse" data-target="#qb-export-criteria-{{$id}}-query" data-parent="#qb-export-criteria-{{$id}}" class="btn-block collapsed">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{querySynopsis}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i ng-class="qbTableSettings.icons.modalCollapseClosed"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div id="qb-export-criteria-{{$id}}-query" class="panel-collapse collapse container">\n\t\t\t\t\t\t\t\t\t\t\t<ui-query-builder\n\t\t\t\t\t\t\t\t\t\t\t\tquery="settings.query"\n\t\t\t\t\t\t\t\t\t\t\t\tspec="spec"\n\t\t\t\t\t\t\t\t\t\t\t></ui-query-builder>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Columns</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<div class="panel-group" id="qb-export-columns-{{$id}}">\n\t\t\t\t\t\t\t\t\t<div class="panel panel-default">\n\t\t\t\t\t\t\t\t\t\t<div class="panel-heading">\n\t\t\t\t\t\t\t\t\t\t\t<h4 class="panel-title">\n\t\t\t\t\t\t\t\t\t\t\t\t<a data-toggle="collapse" data-target="#qb-export-columns-{{$id}}-columns" data-parent="#qb-export-columns-{{$id}}" class="btn-block collapsed">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{columnSynopsis}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i ng-class="qbTableSettings.icons.modalCollapseClosed"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div id="qb-export-columns-{{$id}}-columns" class="panel-collapse collapse row">\n\t\t\t\t\t\t\t\t\t\t\t<div class="col-xs-12">\n\t\t\t\t\t\t\t\t\t\t\t\t<table qb-table class="table table-hover">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th qb-cell selector></th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Column</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr ng-repeat="col in settings.columns track by col.id">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td qb-cell selector="col.selected"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>{{col.title}}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div ng-repeat="question in qbTableSettings.export.questions track by question.id" class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">{{question.title}}</label>\n\t\t\t\t\t\t\t<div ng-switch="question.type" class="col-sm-9">\n\t\t\t\t\t\t\t\t<div ng-switch-when="text">\n\t\t\t\t\t\t\t\t\t<input type="text" ng-model="settings.questions[question.id]" class="form-control"/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div ng-switch-default>\n\t\t\t\t\t\t\t\t\t<div class="alert alert-danger">\n\t\t\t\t\t\t\t\t\t\tUnknown question type: "{{question.type}}"\n\t\t\t\t\t\t\t\t\t\t<pre>{{question | json}}</pre>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div ng-if="question.help" class="help-block">{{question.help}}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<div class="pull-left">\n\t\t\t\t\t\t\t<a class="btn btn-danger" data-dismiss="modal">Cancel</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="pull-right">\n\t\t\t\t\t\t\t<a ng-click="exportExecute()" class="btn btn-primary" data-dismiss="modal">Export</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<ng-transclude>\n\t\t\t<a ng-click="exportPrompt()" class="btn btn-default">Export...</a>\n\t\t</ng-transclude>\n\t'}}).directive("qbModal",function(){return{scope:{query:"=",spec:"<",title:"@?",onRefresh:"&?",binding:"@?"},transclude:!0,restrict:"A",controller:["$element","$scope","qbTableSettings",function(t,e,n){var a=this;e.qbTableSettings=n,a.isShown=!1,a.rebind=function(){t.one("click",function(){t.find(".qb-modal").one("hide.bs.modal",function(){a.isShown=!1}).one("hidden.bs.modal",function(){a.rebind()}).modal("show")})},e.submit=function(){angular.isFunction(a.onRefresh)&&a.onRefresh({query:e.queryCopy,spec:e.spec}),e.binding&&"complete"!=e.binding||(e.query=e.queryCopy),t.find(".qb-modal").modal("hide")},a.$onInit=function(){e.queryCopy="live"==e.binding?e.query:angular.copy(e.query)},a.rebind()}],template:'\n\t\t<ng-transclude></ng-transclude>\n\t\t<div class="qb-modal modal fade">\n\t\t\t<div class="modal-dialog modal-lg">\n\t\t\t\t<div class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<a class="close" data-dismiss="modal"><i ng-class="qbTableSettings.icons.modalClose"></i></a>\n\t\t\t\t\t\t<h4 class="modal-title">{{title || \'Edit Filter\'}}</h4>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body">\n\t\t\t\t\t\t<ui-query-builder\n\t\t\t\t\t\t\tquery="queryCopy"\n\t\t\t\t\t\t\tspec="spec"\n\t\t\t\t\t\t></ui-query-builder>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<div class="pull-left">\n\t\t\t\t\t\t\t<a class="btn btn-danger" data-dismiss="modal">Cancel</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="pull-right">\n\t\t\t\t\t\t\t<a ng-click="submit()" class="btn btn-success">Refresh</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t'}}).directive("qbSearch",function(){return{scope:{query:"=",spec:"<",onRefresh:"&?",fields:"<?",useIndexes:"@?"},restrict:"AE",transclude:!0,controller:["$element","$scope","$rootScope","$timeout","qbTableSettings","qbTableUtilities",function(a,l,r,t,o,c){var u=this;l.qbTableSettings=o,l.search="",l.isSearching=!1,l.submit=function(){var t=!(0<arguments.length&&void 0!==arguments[0])||arguments[0];if(!l.search&&t)return l.clear(!1);var n=c.escapeRegExp(_.trim(l.search)),e={$comment:"search",$or:_(l.spec).pickBy(function(t){return"string"==t.type}).mapValues(function(t,e){return[{$regex:n,$options:"i"}]}).value()},a=c.find(l.query,{$comment:"search"}),s=angular.copy(l.query);if(a&&_.isEqual(a,["$comment"]))s=e;else if(a&&"$and"==a[0])_.set(s,a,e);else if(_.isEqual(_.keys(s),["$and"]))s.$and.push(e);else if(_.isObject(s)){var i=u.useIndexes||"auto";"auto"==i&&(i=_.keys(l.spec).some(function(t){return"_id"!=t&&l.spec[t].index})?"stringIndexed":"string"),l.fields?s.$or=_(l.fields).map(function(t){return _defineProperty({},t,{$regex:c.escapeRegExp(l.search),$options:"i"})}).value():s.$or=_(l.spec).pickBy(function(t,e){if("_id"==e)return!1;if(l.fields&&l.fields.length)return l.fields.includes(e);switch(i){case"all":return!0;case"string":return"string"==t.type;case"stringIndexed":return"string"==t.type&&t.index;default:throw new Error('Unknown field selection method: "'+i+'"')}}).map(function(t,e){return _defineProperty({},e,{$regex:c.escapeRegExp(l.search),$options:"i"})}).value()}else console.warn(o.debugPrefix,"Unable to inject search term",e,"within complex query object",s);l.isSearching=!0,r.$broadcast("queryBuilder.change.replace",s),angular.isFunction(u.onRefresh)&&u.onRefresh({query:s}),("complete"==u.binding||angular.isUndefined(u.binding))&&(l.query=s)},l.clear=function(){var t,e=!(0<arguments.length&&void 0!==arguments[0])||arguments[0],n=c.find(l.query,{$comment:"search"});if(l.isSearching=!1,l.search="",e&&angular.element(a).find("input").focus(),n&&_.isEqual(n,["$comment"]))t={};else if(n&&"$and"==n[0])(t=angular.copy(l.query)).$and.find(function(t,e){return"search"!=t.$comment});else if(n)t=angular.copy(l.query),_.unset(t,n);else{if(!l.query.$or||!l.query.$or.every(function(t){return 1==_.size(t)&&_.chain(t).first().keys().find(function(t){return"$regEx"==t})}))return o.debug?void console.warn(o.debugPrefix,"Unable to clear search query within complex query - or query doesnt contain a search anyway",l.query):void 0;delete(t=angular.copy(l.query)).$or}r.$broadcast("queryBuilder.change.replace",t),angular.isFunction(u.onRefresh)&&u.onRefresh({query:t}),("complete"==u.binding||angular.isUndefined(u.binding))&&(l.query=t)},l.check=function(){try{l.search=_.chain(l.query).get("$or").first().values().first().get("$regex").thru(function(t){return c.unescapeRegExp(t||"")}).value()}catch(t){l.search=""}},u.$onInit=function(){return l.check()}}],template:'\n\t\t<ng-transclude>\n\t\t\t<form ng-submit="submit()" class="form-inline">\n\t\t\t\t<div class="form-group">\n\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t<input type="text" ng-model="search" class="form-control"/>\n\t\t\t\t\t\t<a ng-click="isSearching ? clear() : submit(false)" class="btn btn-default input-group-addon">\n\t\t\t\t\t\t\t<i ng-class="isSearching ? qbTableSettings.icons.searchClear : qbTableSettings.icons.search"/>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</ng-transclude>\n\t'}});
"use strict";function _defineProperty(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}angular.module("angular-ui-query-builder").provider("qbTableSettings",function(){var t=this;return t.debug=!1,t.debugPrefix="[angular-ui-query-builder]",t.icons={sortNone:"fa fa-fw fa-sort text-muted",sortAsc:"fa fa-fw fa-sort-alpha-asc text-primary",sortDesc:"fa fa-fw fa-sort-alpha-desc text-primary",checkMetaChecked:"fa fa-lg fa-fw fa-check-square-o text-primary",checkMetaSome:"fa fa-lg fa-fw fa-minus-square-o",checkMetaUnchecked:"fa fa-lg fa-fw fa-square-o",checkMetaCaret:"fa fa-caret-down",checkItemChecked:"fa fa-lg fa-fw fa-check-square-o",checkItemUnchecked:"fa fa-lg fa-fw fa-square-o",paginationPrev:"fa fa-arrow-left",paginationNext:"fa fa-arrow-right",modalClose:"fa fa-times",modalCollapseClosed:"fa fa-caret-right pull-right",search:"fa fa-search",searchClear:"fa fa-times"},t.pagination={showXOfY:!0,showPages:!0,pageRangeBack:5,pageRangeFore:5},t.export={defaults:{format:"xlsx"},formats:[{id:"xlsx",title:"Excel (XLSX)"},{id:"csv",title:"CSV"},{id:"json",title:"JSON"},{id:"html",title:"HTML (display in browser)"}],questions:[]},t.$get=function(){return t},t}).service("qbTableUtilities",function(){return{getSynopsis:function(t){var e=_.keys(t).filter(function(t){return!["sort","skip","limit","select"].includes(t)});return[e.length?1==e.length?"1 filter":"".concat(e.length," filters"):"All documents",t.sort?t.sort.startsWith("-")?"sorted by ".concat(t.sort.substr(1)," (reverse order)"):"sorted by ".concat(t.sort):null,t.limit?"limited to ".concat(t.limit," rows"):null,t.offset?"starting at record ".concat(t.skip):null,t.select?"selecting only ".concat(t.select.length," columns"):null].filter(function(t){return t}).join(", ")},find:function(t,e){var i,s=_.isFunction(e)?e:_.matches(e);return!!function n(t,a){return s(t,a.slice(a.length-1))?(i=a,!0):_.isArray(t)?t.some(function(t,e){return n(t,a.concat(e))}):_.isObject(t)?_.some(t,function(t,e){return n(t,a.concat(e))}):void 0}(t,[])&&i},escapeRegExp:function(t){return String(t).replace(/(\W)/g,"\\$1")},unescapeRegExp:function(t){return String(t).replace(/\\(\W)/g,"$1")}}}).directive("qbTable",function(){return{scope:{qbTable:"=?",count:"<?",stickyThead:"<?",stickyTfoot:"<?"},restrict:"AC",controller:["$attrs","$element","$rootScope","$scope","$timeout","qbTableSettings",function(t,e,n,i,a,s){var l=this;l.query=i.qbTable,l.count=i.count,i.$watch("count",function(){return l.count=i.count}),l.$broadcast=function(t){for(var e=arguments.length,n=new Array(1<e?e-1:0),a=1;a<e;a++)n[a-1]=arguments[a];return i.$broadcast.apply(i,[t].concat(n))},l.$on=function(t,e){return i.$on(t,e)},l.setDirty=function(){s.debug&&console.log(s.debugPrefix,"Declare query dirty",i.qbTable),n.$broadcast("queryBuilder.change",i.qbTable)},l.setField=function(t,e){if(null!=e){switch(t){case"sort":l.query.sort===e?l.query.sort="-".concat(e):(l.query.sort,"-".concat(e),l.query.sort=e);break;default:i.qbTable[t]=e}return l}delete l.query[t]},e.addClass("qb-table"),i.$watch("stickyThead",function(){return e.toggleClass("qb-sticky-thead",i.stickyThead||""===t.stickyThead)}),i.$watch("stickyTfoot",function(){return e.toggleClass("qb-sticky-tfoot",i.stickyTfoot||""===t.stickyTfoot)}),i.$watch("count",function(){return e.toggleClass("qb-noresults",0===i.count)}),i.$on("queryBuilder.change.replace",function(t,e){l.query=i.qbTable=e,a(function(){return l.setDirty()})})}]}}).directive("qbCol",function(){return{scope:{qbCol:"@",sortable:"@"},require:"^qbTable",restrict:"A",transclude:!0,controller:["$attrs","$element","$scope","$timeout","qbTableSettings",function(t,e,n,a,i){n.qbTableSettings=i;var s=n.$watchGroup(["qbTable","sortable"],function(){""===t.sortable&&!n.qbTable&&i.debug&&console.warn(i.debugPrefix,"Added qb-col + sortable onto element",e,"but no qb-table query has been assigned on the table element!"),s()});n.canSort=!1,n.isSorted=!1,this.$onInit=function(){n.canSort=n.sortable||""===t.sortable,e.toggleClass("sortable",n.canSort),n.canSort&&e.on("click",function(){return a(n.toggleSort)})},n.$watch("qbTable.query.sort",function(t){var e=n.sortable||n.qbCol;t?angular.isArray(t)&&t.some(function(t){return t==e})||t==e?n.isSorted="asc":angular.isArray(t)&&t.some(function(t){return t=="-"+e})||t=="-"+e?n.isSorted="desc":n.isSorted=!1:n.isSorted=!1}),n.toggleSort=function(){n.sortable?n.qbTable.setField("sort",n.sortable).setDirty():n.qbCol&&""===t.sortable&&n.qbTable.setField("sort",n.qbCol).setDirty()}}],link:function(t,e,n,a){t.qbTable=a},template:'\n\t\t<div class="qb-col-wrapper">\n\t\t\t<ng-transclude></ng-transclude>\n\t\t\t<a ng-if="canSort" ng-click="toggleSort()" class="qb-col-right">\n\t\t\t\t<i class="{{\n\t\t\t\t\tisSorted == \'asc\' ? qbTableSettings.icons.sortAsc\n\t\t\t\t\t: isSorted == \'desc\' ? qbTableSettings.icons.sortDesc\n\t\t\t\t\t: qbTableSettings.icons.sortNone\n\t\t\t\t}}"></i>\n\t\t\t</a>\n\t\t</div>\n\t'}}).directive("qbCell",function(){return{scope:{selector:"=?",onPreSelect:"&?",onSelect:"&?"},require:"^qbTable",restrict:"A",transclude:!0,controller:["$attrs","$element","$scope","$timeout","qbTableSettings",function(t,e,n,a,i){n.qbTableSettings=i,n.isMeta=0<e.parents("thead").length,n.isMeta&&a(function(){return n.qbTable.$on("qbTableCellSelect",function(){var t=[];n.qbTable.$broadcast("qbTableCellSelectStatus",t),n.metaStatus=t.every(function(t){return t})?"all":t.some(function(t){return t})?"some":"none"})}),n.isSelector="selector"in t,n.$watch("selector",function(){n.isSelector&&e.toggleClass("selector",n.isSelector),n.isSelector&&!n.isMeta&&e.parents("tr").toggleClass("selected",!!n.selector)}),n.isSelector&&!n.isMeta&&e.on("click",function(t){return n.$apply(function(){n.onPreSelect&&n.onPreSelect({value:n.selector}),n.selector=!n.selector,n.qbTable.$broadcast("qbTableCellSelect"),n.onSelect&&a(function(){return n.onSelect({value:n.selector})})})}),n.metaSelect=function(t){return n.qbTable.$broadcast("qbTableCellSelectMeta",t)},n.isSelector&&!n.isMeta&&a(function(){n.qbTable.$on("qbTableCellSelectMeta",function(t,e){switch(e){case"all":n.selector=!0;break;case"invert":n.selector=!n.selector;break;case"none":n.selector=!1;break;default:throw new Error("Unknown selection type: ".concat(e))}n.qbTable.$broadcast("qbTableCellSelect")}),n.qbTable.$on("qbTableCellSelectStatus",function(t,e){return e.push(n.selector)})}),e.addClass("qb-cell")}],link:function(t,e,n,a){t.qbTable=a},template:'\n\t\t<ng-transclude></ng-transclude>\n\t\t<div ng-if="isSelector && isMeta" class="btn-group">\n\t\t\t<a class="btn btn-default dropdown-toggle" data-toggle="dropdown">\n\t\t\t\t<i ng-class="metaStatus == \'all\' ? qbTableSettings.icons.checkMetaChecked : metaStatus == \'some\' ? qbTableSettings.icons.checkMetaUnchecked : qbTableSettings.icons.checkMetaUnchecked"></i>\n\t\t\t\t<i ng-class="qbTableSettings.icons.checkMetaCaret"></i>\n\t\t\t</a>\n\t\t\t<ul class="dropdown-menu">\n\t\t\t\t<li><a ng-click="metaSelect(\'all\')">All</a></li>\n\t\t\t\t<li><a ng-click="metaSelect(\'invert\')">Invert</a></li>\n\t\t\t\t<li><a ng-click="metaSelect(\'none\')">None</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div ng-if="isSelector && !isMeta">\n\t\t\t<i ng-class="selector ? qbTableSettings.icons.checkItemChecked : qbTableSettings.icons.checkItemUnchecked"></i>\n\t\t</div>\n\t'}}).directive("qbPagination",function(){return{scope:{},require:"^qbTable",restrict:"EA",transclude:!0,controller:["$attrs","$scope","qbTableSettings",function(t,e,n){e.qbTableSettings=n,e.canPrev=!0,e.canNext=!0,e.showRange={},e.$watchGroup(["qbTable.query.limit","qbTable.query.skip","qbTable.count"],function(t){e.canPrev=0<e.qbTable.query.skip,e.canNext=!e.qbTable.count||e.qbTable.query.skip+e.qbTable.query.limit<e.qbTable.count,n.pagination.showXOfY&&(e.showRange={start:(e.qbTable.query.skip||0)+1,end:Math.min((e.qbTable.query.skip||0)+e.qbTable.query.limit,e.qbTable.count),total:e.qbTable.count}),n.pagination.showPages&&(e.pages={current:!!e.qbTable.query.limit&&Math.floor((e.qbTable.query.skip||0)/e.qbTable.query.limit)},e.pages.min=Math.max(e.pages.current-n.pagination.pageRangeBack,0),e.pages.total=e.qbTable.query.limit?Math.ceil(e.qbTable.count/e.qbTable.query.limit):1,e.pages.max=Math.min(e.pages.total,e.pages.current+n.pagination.pageRangeFore+1),e.pages.range=_.range(e.pages.min,e.pages.max).map(function(t){return{number:t,mode:t==e.pages.current?"current":t==e.pages.current-1?"prev":t==e.pages.current+1?"next":"normal"}}))}),e.navPageRelative=function(t){if(-1==t)e.qbTable.setField("skip",Math.max((e.qbTable.query.skip||0)-(e.qbTable.query.limit||10),0)).setDirty();else{if(1!=t)throw new Error("Unsupported page move: "+t);e.qbTable.setField("skip",(e.qbTable.query.skip||0)+(e.qbTable.query.limit||10)).setDirty()}},e.navPageNumber=function(t){return e.qbTable.setField("skip",(t||0)*(e.qbTable.query.limit||10)).setDirty()}}],link:function(t,e,n,a){t.qbTable=a},template:'\n\t\t<nav>\n\t\t\t<ul class="pager">\n\t\t\t\t<li ng-class="canPrev ? \'\' : \'disabled\'" class="previous"><a ng-click="navPageRelative(-1)"><i ng-class="qbTableSettings.icons.paginationPrev"></i></a></li>\n\t\t\t\t<ng-transclude class="text-center">\n\t\t\t\t\t<span ng-if="qbTableSettings.pagination.showXOfY && showRange.end" class="display-xofy">\n\t\t\t\t\t\tShowing documents {{showRange.start | number}} - {{showRange.end | number}}\n\t\t\t\t\t\t<span ng-if="showRange.total">\n\t\t\t\t\t\t\tof {{showRange.total | number}}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<ul ng-if="qbTableSettings.pagination.showPages && showRange.end && pages.max > 1" class="display-pages pagination">\n\t\t\t\t\t\t<li ng-repeat="page in pages.range track by page.number" ng-class="page.mode == \'current\' ? \'active\' : \'\'">\n\t\t\t\t\t\t\t<a ng-click="navPageNumber(page.number)">\n\t\t\t\t\t\t\t\t{{page.number + 1 | number}}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</ng-transclude>\n\t\t\t\t<li ng-class="canNext ? \'\' : \'disabled\'" class="next"><a ng-click="navPageRelative(1)"><i ng-class="qbTableSettings.icons.paginationNext"></i></a></li>\n\t\t\t</ul>\n\t\t</nav>\n\t'}}).directive("qbExport",function(){return{scope:{query:"<",spec:"<",url:"@"},transclude:!0,restrict:"EA",controller:["$element","$httpParamSerializerJQLike","$scope","$timeout","$window","qbTableSettings","qbTableUtilities",function(t,e,n,a,i,s,l){n.qbTableSettings=s,n.settings={},n.isShowing=!1,n.exportPrompt=function(){n.settings=angular.extend(angular.copy(s.export.defaults),{query:_(n.query).omitBy(function(t,e){return["skip","limit"].includes(e)}).value(),columns:_(n.spec).pickBy(function(t){return t&&t.type&&["string","number","data","boolean","objectid"].includes(t.type)}).map(function(t,e){return t.id=e,t.title=_.startCase(e),t.selected=!0,t}).value(),questions:_(s.export.questions).mapKeys(function(t){return t.id}).mapValues(function(t){return t.default}).value()}),t.find(".modal").on("show.bs.modal",function(){return a(function(){return n.isShowing=!0})}).on("hidden.bs.modal",function(){return a(function(){return n.isShowing=!1})}).modal("show")},n.exportExecute=function(){var t=angular.extend(n.settings.query,{select:n.settings.columns.filter(function(t){return t.selected}).map(function(t){return t.id}),format:n.settings.format},n.settings.questions);i.open(n.url+"?"+e(t))},n.querySynopsis,n.$watchGroup(["isShowing","settings.query"],function(){n.isShowing&&(n.querySynopsis=l.getSynopsis(n.settings.query))}),n.columnSynopsis,n.$watchGroup(["isShowing",function(){return _.get(n.settings,"columns",[]).map(function(t){return t.id+"="+t.selected}).join("&")}],function(){n.isShowing&&(n.columnSynopsis=n.settings.columns.filter(function(t){return t.selected}).length+" columns")})}],link:function(t,e){e.find("ng-transclude").on("click",function(){return t.$applyAsync(function(){return t.exportPrompt()})})},template:'\n\t\t<div class="modal fade">\n\t\t\t<div class="modal-dialog modal-lg">\n\t\t\t\t<div ng-if="isShowing" class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<a class="close" data-dismiss="modal"><i ng-class="qbTableSettings.icons.modalClose"></i></a>\n\t\t\t\t\t\t<h4 class="modal-title">Export</h4>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body form-horizontal">\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Output format</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<select ng-model="settings.format" class="form-control">\n\t\t\t\t\t\t\t\t\t<option ng-repeat="format in qbTableSettings.export.formats track by format.id" value="{{format.id}}">{{format.title}}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Criteria</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<div class="panel-group" id="qb-export-criteria-{{$id}}">\n\t\t\t\t\t\t\t\t\t<div class="panel panel-default">\n\t\t\t\t\t\t\t\t\t\t<div class="panel-heading">\n\t\t\t\t\t\t\t\t\t\t\t<h4 class="panel-title">\n\t\t\t\t\t\t\t\t\t\t\t\t<a data-toggle="collapse" data-target="#qb-export-criteria-{{$id}}-query" data-parent="#qb-export-criteria-{{$id}}" class="btn-block collapsed">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{querySynopsis}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i ng-class="qbTableSettings.icons.modalCollapseClosed"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div id="qb-export-criteria-{{$id}}-query" class="panel-collapse collapse container">\n\t\t\t\t\t\t\t\t\t\t\t<ui-query-builder\n\t\t\t\t\t\t\t\t\t\t\t\tquery="settings.query"\n\t\t\t\t\t\t\t\t\t\t\t\tspec="spec"\n\t\t\t\t\t\t\t\t\t\t\t></ui-query-builder>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Columns</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<div class="panel-group" id="qb-export-columns-{{$id}}">\n\t\t\t\t\t\t\t\t\t<div class="panel panel-default">\n\t\t\t\t\t\t\t\t\t\t<div class="panel-heading">\n\t\t\t\t\t\t\t\t\t\t\t<h4 class="panel-title">\n\t\t\t\t\t\t\t\t\t\t\t\t<a data-toggle="collapse" data-target="#qb-export-columns-{{$id}}-columns" data-parent="#qb-export-columns-{{$id}}" class="btn-block collapsed">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{columnSynopsis}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i ng-class="qbTableSettings.icons.modalCollapseClosed"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div id="qb-export-columns-{{$id}}-columns" class="panel-collapse collapse row">\n\t\t\t\t\t\t\t\t\t\t\t<div class="col-xs-12">\n\t\t\t\t\t\t\t\t\t\t\t\t<table qb-table class="table table-hover">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th qb-cell selector></th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Column</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr ng-repeat="col in settings.columns track by col.id">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td qb-cell selector="col.selected"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>{{col.title}}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div ng-repeat="question in qbTableSettings.export.questions track by question.id" class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">{{question.title}}</label>\n\t\t\t\t\t\t\t<div ng-switch="question.type" class="col-sm-9">\n\t\t\t\t\t\t\t\t<div ng-switch-when="text">\n\t\t\t\t\t\t\t\t\t<input type="text" ng-model="settings.questions[question.id]" class="form-control"/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div ng-switch-default>\n\t\t\t\t\t\t\t\t\t<div class="alert alert-danger">\n\t\t\t\t\t\t\t\t\t\tUnknown question type: "{{question.type}}"\n\t\t\t\t\t\t\t\t\t\t<pre>{{question | json}}</pre>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div ng-if="question.help" class="help-block">{{question.help}}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<div class="pull-left">\n\t\t\t\t\t\t\t<a class="btn btn-danger" data-dismiss="modal">Cancel</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="pull-right">\n\t\t\t\t\t\t\t<a ng-click="exportExecute()" class="btn btn-primary" data-dismiss="modal">Export</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<ng-transclude>\n\t\t\t<a ng-click="exportPrompt()" class="btn btn-default">Export...</a>\n\t\t</ng-transclude>\n\t'}}).directive("qbModal",function(){return{scope:{query:"=",spec:"<",title:"@?",onRefresh:"&?",binding:"@?"},transclude:!0,restrict:"A",controller:["$element","$scope","$rootScope","qbTableSettings",function(t,e,n,a){var i=this;e.qbTableSettings=a,i.isShown=!1,i.rebind=function(){t.one("click",function(){t.find(".qb-modal").one("hide.bs.modal",function(){i.isShown=!1}).one("hidden.bs.modal",function(){i.rebind()}).modal("show")})},e.submit=function(){angular.isFunction(i.onRefresh)&&i.onRefresh({query:e.queryCopy,spec:e.spec}),e.binding&&"complete"!=e.binding||(e.query=e.queryCopy),t.find(".qb-modal").modal("hide"),n.$broadcast("queryBuilder.change.replace",e.query)},i.$onInit=function(){e.queryCopy="live"==e.binding?e.query:angular.copy(e.query)},i.rebind()}],template:'\n\t\t<ng-transclude></ng-transclude>\n\t\t<div class="qb-modal modal fade">\n\t\t\t<div class="modal-dialog modal-lg">\n\t\t\t\t<div class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<a class="close" data-dismiss="modal"><i ng-class="qbTableSettings.icons.modalClose"></i></a>\n\t\t\t\t\t\t<h4 class="modal-title">{{title || \'Edit Filter\'}}</h4>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body">\n\t\t\t\t\t\t<ui-query-builder\n\t\t\t\t\t\t\tquery="queryCopy"\n\t\t\t\t\t\t\tspec="spec"\n\t\t\t\t\t\t></ui-query-builder>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<div class="pull-left">\n\t\t\t\t\t\t\t<a class="btn btn-danger" data-dismiss="modal">Cancel</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="pull-right">\n\t\t\t\t\t\t\t<a ng-click="submit()" class="btn btn-success">Refresh</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t'}}).directive("qbSearch",function(){return{scope:{query:"=",spec:"<",onRefresh:"&?",fields:"<?",useIndexes:"@?"},restrict:"AE",transclude:!0,controller:["$element","$scope","$rootScope","$timeout","qbTableSettings","qbTableUtilities",function(a,l,r,t,o,c){var u=this;l.qbTableSettings=o,l.search="",l.isSearching=!1,l.submit=function(){var t=!(0<arguments.length&&void 0!==arguments[0])||arguments[0];if(!l.search&&t)return l.clear(!1);var n=c.escapeRegExp(_.trim(l.search)),e={$comment:"search",$or:_(l.spec).pickBy(function(t){return"string"==t.type}).mapValues(function(t,e){return[{$regex:n,$options:"i"}]}).value()},a=c.find(l.query,{$comment:"search"}),i=angular.copy(l.query);if(a&&_.isEqual(a,["$comment"]))i=e;else if(a&&"$and"==a[0])_.set(i,a,e);else if(_.isEqual(_.keys(i),["$and"]))i.$and.push(e);else if(_.isObject(i)){var s=u.useIndexes||"auto";"auto"==s&&(s=_.keys(l.spec).some(function(t){return"_id"!=t&&l.spec[t].index})?"stringIndexed":"string"),l.fields?i.$or=_(l.fields).map(function(t){return _defineProperty({},t,{$regex:c.escapeRegExp(l.search),$options:"i"})}).value():i.$or=_(l.spec).pickBy(function(t,e){if("_id"==e)return!1;if(l.fields&&l.fields.length)return l.fields.includes(e);switch(s){case"all":return!0;case"string":return"string"==t.type;case"stringIndexed":return"string"==t.type&&t.index;default:throw new Error('Unknown field selection method: "'+s+'"')}}).map(function(t,e){return _defineProperty({},e,{$regex:c.escapeRegExp(l.search),$options:"i"})}).value()}else console.warn(o.debugPrefix,"Unable to inject search term",e,"within complex query object",i);l.isSearching=!0,r.$broadcast("queryBuilder.change.replace",i),angular.isFunction(u.onRefresh)&&u.onRefresh({query:i}),"complete"!=u.binding&&!angular.isUndefined(u.binding)||(l.query=i)},l.clear=function(){var t,e=!(0<arguments.length&&void 0!==arguments[0])||arguments[0],n=c.find(l.query,{$comment:"search"});if(l.isSearching=!1,l.search="",e&&angular.element(a).find("input").focus(),n&&_.isEqual(n,["$comment"]))t={};else if(n&&"$and"==n[0])(t=angular.copy(l.query)).$and.find(function(t,e){return"search"!=t.$comment});else if(n)t=angular.copy(l.query),_.unset(t,n);else{if(!l.query.$or||!l.query.$or.every(function(t){return 1==_.size(t)&&_.chain(t).first().keys().find(function(t){return"$regEx"==t})}))return o.debug?void console.warn(o.debugPrefix,"Unable to clear search query within complex query - or query doesnt contain a search anyway",l.query):void 0;delete(t=angular.copy(l.query)).$or}r.$broadcast("queryBuilder.change.replace",t),angular.isFunction(u.onRefresh)&&u.onRefresh({query:t}),"complete"!=u.binding&&!angular.isUndefined(u.binding)||(l.query=t)},l.check=function(){try{l.search=_.chain(l.query).get("$or").first().values().first().get("$regex").thru(function(t){return c.unescapeRegExp(t||"")}).value()}catch(t){l.search=""}},u.$onInit=function(){return l.check()}}],template:'\n\t\t<ng-transclude>\n\t\t\t<form ng-submit="submit()" class="form-inline">\n\t\t\t\t<div class="form-group">\n\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t<input type="text" ng-model="search" class="form-control"/>\n\t\t\t\t\t\t<a ng-click="isSearching ? clear() : submit(false)" class="btn btn-default input-group-addon">\n\t\t\t\t\t\t\t<i ng-class="isSearching ? qbTableSettings.icons.searchClear : qbTableSettings.icons.search"/>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</ng-transclude>\n\t'}});

@@ -1,1 +0,1 @@

"use strict";function _defineProperty(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}angular.module("angular-ui-query-builder",[]).service("QueryBuilder",function(){var a=this;a.cleanSpec=function(t){return _(t).mapValues(function(t,e){return{type:t.type,enum:_(t.enum).map(function(t){return _.isString(t)?{id:t,title:_.startCase(t)}:t}).sortBy("title").value()}}).value()},a.metaProperties={limit:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!0},populate:{type:"hidden"},skip:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!0},sort:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!1}},a.queryPathPrototypeActions=[{id:"$eq",title:"Equals"},{id:"$neq",title:"Doesnt equal"},{id:"$lt",title:"Is less than"},{id:"$lte",title:"Is equal to or less than"},{id:"$gt",title:"Is greater than"},{id:"$gte",title:"Is equal or greater than"},{id:"$in",title:"Is one of"},{id:"$nin",title:"Is not one of"},{id:"$exists",title:"Has a value"},{id:"$nexists",title:"Does not have a value"}],a.queryPathPrototype=function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=2<arguments.length?arguments[2]:void 0,l=n[t],i=_.isObject(e)&&_(e).keys().first(),r=_.isObject(e)?_(e).values().first():e;return"$or"==t&&e.every(function(t){return _.isObject(t)&&1==_.keys(t).length})&&e.map(function(t){return _.chain(t).first().values().first().keys().find(function(t){return"$regexp"==t}).value()}).length==e.length?{path:t,type:"search",title:"Search",value:_.chain(e).first().values().first().get("$regexp").value(),fields:_(e).map(function(t){return _.keys(t)}).flatten().value(),actions:a.queryPathPrototypeActions}:"$and"==t||"$or"==t?(_.isArray(e)||(console.warn("query-builder","Query path",t,"is a meta key",e,"but is not an array!","Given",_typeof(e)),e=[]),{path:t,type:"binaryGroup",title:"$and"==t?"AND":"$or"==t?"OR":"UNKNOWN",condition:t.replace(/\$/,""),children:e.map(function(t){return a.queryToArray(t,n)}),actions:a.queryPathPrototypeActions}):a.metaProperties[t]?Object.assign({path:t,title:_.startCase(t),value:e,type:"hidden",action:"$hidden",actions:a.queryPathPrototypeActions},a.metaProperties[t]):"$exists"==i?{path:t,title:e.title||_.startCase(t),value:!!e,type:"exists",action:"$exists",actions:a.queryPathPrototypeActions}:"string"==l.type&&_.isArray(l.enum)&&l.enum.length?{path:t,title:e.title||_.startCase(t),type:"enum",action:e.$in?"$in":e.$nin?"$nin":l.enum.length?"$in":"$eq",enum:l.enum,value:e.$in?e.$in:e.$nin?e.$nin:l.enum.length&&!_.isArray(e)?[e]:e,actions:a.queryPathPrototypeActions}:{path:t,title:e.title||_.startCase(t),type:"string"==l.type?"string":"number"==l.type?"number":"date"==l.type?"date":"string",action:"$eq",value:"date"==l.type?moment(r).toDate():r,actions:a.queryPathPrototypeActions}},a.queryToArray=function(t,l){return _(t).pickBy(function(t,e){var n=l[e]||"$and"==e||"$or"==e||a.metaProperties[e];return n||console.warn("query-builder","Incomming query path",e,"Does not map to anything in spec",l),!!n}).map(function(t,e){return a.queryPathPrototype(e,t,l)}).value()},a.arrayToQuery=function(t){return _(t).mapKeys(function(t){return t.path}).mapValues(function(e){switch(e.type){case"string":case"number":case"date":return"$eq"==e.action?e.value:_defineProperty({},e.action,e.value);case"enum":return _defineProperty({},e.action,e.value);case"exists":return{$exists:"$exists"==e.action};case"search":return e.fields.map(function(t){return _defineProperty({},t,{$regexp:e.value,options:"i"})});case"keyVal":case"hidden":return e.value;default:console.warn("Unknown type to convert:",e.type)}}).value()}}).component("uiQueryBuilder",{bindings:{query:"=",spec:"<"},template:'\n\t\t<div class="ui-query-builder">\n\t\t\t<div class="query-container">\n\t\t\t\t<ui-query-builder-group\n\t\t\t\t\tqb-group="$ctrl.qbQuery"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-group>\n\t\t\t</div>\n\t\t</div>\n\t',controller:["$scope","$timeout","QueryBuilder",function(i,r,a){var c=this;c.qbSpec,c.qbQuery;var t=i.$watchGroup(["$ctrl.query","$ctrl.spec"],function(){c.spec&&c.query&&(c.qbSpec=a.cleanSpec(c.spec),c.qbQuery=a.queryToArray(c.query,c.qbSpec),t())});i.$on("queryBuilder.change",function(t,e){return r(function(){e?(c.query=e,c.qbQuery=a.queryToArray(c.query,c.qbSpec)):c.query=a.arrayToQuery(c.qbQuery)})}),i.$on("queryBuilder.pathAction.drop",function(t,e){c.qbQuery=c.qbQuery.filter(function(t){return t.path!=e}),c.query=a.arrayToQuery(c.qbQuery)}),i.$on("queryBuilder.pathAction.swapPath",function(t,e,n){var l=c.qbQuery.findIndex(function(t){return t.path==e});if(!l)throw new Error('Cannot find path "'.concat(e,'" to swap with new path "').concat(n,'"'));c.qbQuery[l]=a.queryPathPrototype(n,void 0,c.qbSpec),r(function(){return i.$broadcast("queryBuilder.focusOperand",n)})}),i.$on("queryBuilder.pathAction.swapAction",function(t,e,n){console.log("SWAPACTION",e,n)}),i.$on("queryBuilder.pathAction.add",function(t,e){c.qbQuery.push({path:"",type:"blank",value:null,fields:[]}),r(function(){return i.$broadcast("queryBuilder.focusPath","")})})}]}).component("uiQueryBuilderGroup",{bindings:{qbGroup:"=",qbSpec:"<"},template:'\n\t\t<div ng-repeat="row in $ctrl.qbGroup | filter:$ctrl.qbGroupFilter" meta-key="{{row.path}}">\n\t\t\t<ui-query-builder-row\n\t\t\t\tqb-item="row"\n\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t></ui-query-builder-row>\n\t\t</div>\n\t\t<button ng-click="$ctrl.add()" type="button" class="btn-add"></button>\n\t',controller:["$scope","QueryBuilder",function(t,e){this.add=function(){return t.$emit("queryBuilder.pathAction.add")},this.qbGroupFilter=function(t){return"hidden"!=t.type}}]}).component("uiQueryBuilderRow",{bindings:{qbItem:"=",qbSpec:"<"},controller:["$element","$scope","QueryBuilder",function(l,e,t){var i=this;i.delete=function(t){return e.$emit("queryBuilder.pathAction.drop",t)},i.setChanged=function(){return e.$emit("queryBuilder.change")},i.setAction=function(t){return e.$emit("queryBuilder.pathAction.swapAction",i.qbItem,t)},e.$on("queryBuilder.focusPath",function(t,e){i.qbItem.path==e&&l.find("ui-query-builder-path .dropdown-toggle").dropdown("toggle")}),e.$on("queryBuilder.focusOperand",function(t,e){if(i.qbItem.path==e){var n=l.find("input.form-control");if(1==n.length)return n.focus();console.warn("Unable to focus any element within DOM",l[0],"for type",i.type,"on line item",i.qbItem)}})}],template:'\n\t\t<div ng-switch="$ctrl.qbItem.type">\n\t\t\t\x3c!-- $and / $or condition {{{ --\x3e\n\t\t\t<div ng-switch-when="binaryGroup" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-1 btn-block">\n\t\t\t\t\t\t{{$ctrl.qbItem.title}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div ng-repeat="conditional in $ctrl.qbItem.children" class="query-container clearfix">\n\t\t\t\t\t<ui-query-builder-group\n\t\t\t\t\t\tqb-group="conditional"\n\t\t\t\t\t\tqb-spec="$ctrl.spec"\n\t\t\t\t\t></ui-query-builder-group>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- String {{{ --\x3e\n\t\t\t<div ng-switch-when="string" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Enum {{{ --\x3e\n\t\t\t<div ng-switch-when="enum" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<ui-query-builder-block-menu-multiple\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="3"\n\t\t\t\t\tselected="$ctrl.qbItem.value"\n\t\t\t\t\toptions="$ctrl.qbItem.enum"\n\t\t\t\t></ui-query-builder-block-menu-multiple>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Date {{{ --\x3e\n\t\t\t<div ng-switch-when="date" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="date"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Number {{{ --\x3e\n\t\t\t<div ng-switch-when="number" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-value="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-changed="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="number"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Exists {{{ --\x3e\n\t\t\t<div ng-switch-when="exists" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Search {{{ --\x3e\n\t\t\t<div ng-switch-when="search" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-2 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- keyVal (Only title + value) {{{ --\x3e\n\t\t\t<div ng-switch-when="keyVal" class="query-row">\n\t\t\t\t<a ng-if="$ctrl.qbItem.canDelete === undefined || $ctrl.qbItem.canDelete" ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-block\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\ttitle="$ctrl.qbItem.title"\n\t\t\t\t></ui-query-builder-block>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-2 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Blank (i.e. field not set yet) {{{ --\x3e\n\t\t\t<div ng-switch-when="blank" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Unknown {{{ --\x3e\n\t\t\t<div ng-switch-default class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-warning btn-block">\n\t\t\t\t\t\tUnknown handler: {{$ctrl.qbItem.type}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t</div>\n\t'}).component("uiQueryBuilderPath",{bindings:{level:"<",selected:"<",qbSpec:"<"},controller:["$scope",function(e){var n=this;n.setSelected=function(t){return e.$emit("queryBuilder.pathAction.swapPath",n.selected,t)},n.options,n.$onInit=function(){n.options=_.map(n.qbSpec,function(t,e){return Object.assign({},{path:e,title:_.startCase(e)},t)}),n.selectedOption=n.options.find(function(t){return t.path==n.selected})}}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown">\n\t\t\t{{$ctrl.selectedOption.title}}\n\t\t\t<i class="fa fa-caret-down"></i>\n\t\t</a>\n\t\t<ul class="dropdown-menu pull-right">\n\t\t\t<li ng-repeat="path in $ctrl.options track by path.path"><a ng-click="$ctrl.setSelected(path.path)">{{path.title}}</a></li>\n\t\t</ul>\n\t'}).component("uiQueryBuilderBlock",{bindings:{level:"<",title:"<"},controller:["$scope",function(t){}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}}">\n\t\t\t{{$ctrl.title}}\n\t\t</a>\n\t'}).component("uiQueryBuilderBlockMenu",{bindings:{level:"<",options:"<",selected:"=",onChange:"&?"},controller:["$scope",function(t){var e=this;e.setSelected=function(t){e.selected=t.id,angular.isFunction(e.onChange)&&e.onChange({selected:e.selected})},e.selectedOption,t.$watchGroup(["$ctrl.options","$ctrl.selected"],function(){e.selectedOption=e.options.find(function(t){return t.id==e.selected})})}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown">\n\t\t\t{{$ctrl.selectedOption.title}}\n\t\t\t<i class="fa fa-caret-down"></i>\n\t\t</a>\n\t\t<ul class="dropdown-menu pull-right">\n\t\t\t<li ng-repeat="option in $ctrl.options track by option.id"><a ng-click="$ctrl.setSelected(option)">{{option.title}}</a></li>\n\t\t</ul>\n\t'}).component("uiQueryBuilderBlockMenuMultiple",{bindings:{level:"<",options:"<",selected:"="},controller:["$scope",function(t){var n=this;n.toggle=function(e){n.selected||(n.selected=[]),n.selected.includes(e.id)?n.selected=n.selected.filter(function(t){return t!=e.id}):n.selected.push(e.id),t.$emit("queryBuilder.change")},n.selectedOptions,t.$watch("$ctrl.selected",function(){n.selectedOptions=n.options.filter(function(t){return(n.selected||[]).includes(t.id)}),n.options.forEach(function(e){return e.selected=n.selectedOptions.some(function(t){return t.id==e.id})})},!0)}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown">\n\t\t\t<span ng-repeat="item in $ctrl.selectedOptions track by item.id" class="pill">\n\t\t\t\t{{item.title}}\n\t\t\t</span>\n\t\t\t<i class="fa fa-caret-down"></i></a>\n\t\t</a>\n\t\t<ul class="dropdown-menu pull-right">\n\t\t\t<li ng-repeat="option in $ctrl.options track by option.id">\n\t\t\t\t<a ng-click="$ctrl.toggle(option)">\n\t\t\t\t\t<i class="fa fa-fw" ng-class="option.selected ? \'fa-check-square-o\' : \'fa-square-o\'"></i>\n\t\t\t\t\t{{option.title}}\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t</ul>\n\t'}),angular.module("angular-ui-query-builder").provider("qbTableSettings",function(){var t=this;return t.debug=!1,t.debugPrefix="[angular-ui-query-builder]",t.icons={sortNone:"fa fa-fw fa-sort text-muted",sortAsc:"fa fa-fw fa-sort-alpha-asc text-primary",sortDesc:"fa fa-fw fa-sort-alpha-desc text-primary",checkMetaChecked:"fa fa-lg fa-fw fa-check-square-o text-primary",checkMetaSome:"fa fa-lg fa-fw fa-minus-square-o",checkMetaUnchecked:"fa fa-lg fa-fw fa-square-o",checkMetaCaret:"fa fa-caret-down",checkItemChecked:"fa fa-lg fa-fw fa-check-square-o",checkItemUnchecked:"fa fa-lg fa-fw fa-square-o",paginationPrev:"fa fa-arrow-left",paginationNext:"fa fa-arrow-right",modalClose:"fa fa-times",modalCollapseClosed:"fa fa-caret-right pull-right",search:"fa fa-search",searchClear:"fa fa-times"},t.pagination={showXOfY:!0,showPages:!0,pageRangeBack:5,pageRangeFore:5},t.export={defaults:{format:"xlsx"},formats:[{id:"xlsx",title:"Excel (XLSX)"},{id:"csv",title:"CSV"},{id:"json",title:"JSON"},{id:"html",title:"HTML (display in browser)"}],questions:[]},t.$get=function(){return t},t}).service("qbTableUtilities",function(){return{getSynopsis:function(t){var e=_.keys(t).filter(function(t){return!["sort","skip","limit","select"].includes(t)});return[e.length?1==e.length?"1 filter":"".concat(e.length," filters"):"All documents",t.sort?t.sort.startsWith("-")?"sorted by ".concat(t.sort.substr(1)," (reverse order)"):"sorted by ".concat(t.sort):null,t.limit?"limited to ".concat(t.limit," rows"):null,t.offset?"starting at record ".concat(t.skip):null,t.select?"selecting only ".concat(t.select.length," columns"):null].filter(function(t){return t}).join(", ")},find:function(t,e){var i,r=_.isFunction(e)?e:_.matches(e);return!!function n(t,l){return r(t,l.slice(l.length-1))?(i=l,!0):_.isArray(t)?t.some(function(t,e){return n(t,l.concat(e))}):_.isObject(t)?_.some(t,function(t,e){return n(t,l.concat(e))}):void 0}(t,[])&&i},escapeRegExp:function(t){return String(t).replace(/(\W)/g,"\\$1")},unescapeRegExp:function(t){return String(t).replace(/\\(\W)/g,"$1")}}}).directive("qbTable",function(){return{scope:{qbTable:"=?",count:"<?",stickyThead:"<?",stickyTfoot:"<?"},restrict:"AC",controller:["$attrs","$element","$rootScope","$scope","$timeout","qbTableSettings",function(t,e,n,i,l,r){var a=this;a.query=i.qbTable,a.count=i.count,i.$watch("count",function(){return a.count=i.count}),a.$broadcast=function(t){for(var e=arguments.length,n=new Array(1<e?e-1:0),l=1;l<e;l++)n[l-1]=arguments[l];return i.$broadcast.apply(i,[t].concat(n))},a.$on=function(t,e){return i.$on(t,e)},a.setDirty=function(){r.debug&&console.log(r.debugPrefix,"Declare query dirty",i.qbTable),n.$broadcast("queryBuilder.change",i.qbTable)},a.setField=function(t,e){if(null!=e){switch(t){case"sort":a.query.sort===e?a.query.sort="-".concat(e):(a.query.sort,"-".concat(e),a.query.sort=e);break;default:i.qbTable[t]=e}return a}delete a.query[t]},e.addClass("qb-table"),i.$watch("stickyThead",function(){return e.toggleClass("qb-sticky-thead",i.stickyThead||""===t.stickyThead)}),i.$watch("stickyTfoot",function(){return e.toggleClass("qb-sticky-tfoot",i.stickyTfoot||""===t.stickyTfoot)}),i.$watch("count",function(){return e.toggleClass("qb-noresults",0===i.count)}),i.$on("queryBuilder.change.replace",function(t,e){a.query=i.qbTable=e,l(function(){return a.setDirty()})})}]}}).directive("qbCol",function(){return{scope:{qbCol:"@",sortable:"@"},require:"^qbTable",restrict:"A",transclude:!0,controller:["$attrs","$element","$scope","$timeout","qbTableSettings",function(t,e,n,l,i){n.qbTableSettings=i;var r=n.$watchGroup(["qbTable","sortable"],function(){""===t.sortable&&!n.qbTable&&i.debug&&console.warn(i.debugPrefix,"Added qb-col + sortable onto element",e,"but no qb-table query has been assigned on the table element!"),r()});n.canSort=!1,n.isSorted=!1,this.$onInit=function(){n.canSort=n.sortable||""===t.sortable,e.toggleClass("sortable",n.canSort),n.canSort&&e.on("click",function(){return l(n.toggleSort)})},n.$watch("qbTable.query.sort",function(t){var e=n.sortable||n.qbCol;t?angular.isArray(t)&&t.some(function(t){return t==e})||t==e?n.isSorted="asc":angular.isArray(t)&&t.some(function(t){return t=="-"+e})||t=="-"+e?n.isSorted="desc":n.isSorted=!1:n.isSorted=!1}),n.toggleSort=function(){n.sortable?n.qbTable.setField("sort",n.sortable).setDirty():n.qbCol&&""===t.sortable&&n.qbTable.setField("sort",n.qbCol).setDirty()},e.addClass("qb-col")}],link:function(t,e,n,l){t.qbTable=l},template:'\n\t\t<div class="qb-col-wrapper">\n\t\t\t<ng-transclude></ng-transclude>\n\t\t\t<a ng-if="canSort" ng-click="toggleSort()" class="qb-col-right">\n\t\t\t\t<i class="{{\n\t\t\t\t\tisSorted == \'asc\' ? qbTableSettings.icons.sortAsc\n\t\t\t\t\t: isSorted == \'desc\' ? qbTableSettings.icons.sortDesc\n\t\t\t\t\t: qbTableSettings.icons.sortNone\n\t\t\t\t}}"></i>\n\t\t\t</a>\n\t\t</div>\n\t'}}).directive("qbCell",function(){return{scope:{selector:"=?",onPreSelect:"&?",onSelect:"&?"},require:"^qbTable",restrict:"A",transclude:!0,controller:["$attrs","$element","$scope","$timeout","qbTableSettings",function(t,e,n,l,i){n.qbTableSettings=i,n.isMeta=0<e.parents("thead").length,n.isMeta&&l(function(){return n.qbTable.$on("qbTableCellSelect",function(){var t=[];n.qbTable.$broadcast("qbTableCellSelectStatus",t),n.metaStatus=t.every(function(t){return t})?"all":t.some(function(t){return t})?"some":"none"})}),n.isSelector="selector"in t,n.$watch("selector",function(){n.isSelector&&e.toggleClass("selector",n.isSelector),n.isSelector&&!n.isMeta&&e.parents("tr").toggleClass("selected",!!n.selector)}),n.isSelector&&!n.isMeta&&e.on("click",function(t){return n.$apply(function(){n.onPreSelect&&n.onPreSelect({value:n.selector}),n.selector=!n.selector,n.qbTable.$broadcast("qbTableCellSelect"),n.onSelect&&l(function(){return n.onSelect({value:n.selector})})})}),n.metaSelect=function(t){return n.qbTable.$broadcast("qbTableCellSelectMeta",t)},n.isSelector&&!n.isMeta&&l(function(){n.qbTable.$on("qbTableCellSelectMeta",function(t,e){switch(e){case"all":n.selector=!0;break;case"invert":n.selector=!n.selector;break;case"none":n.selector=!1;break;default:throw new Error("Unknown selection type: ".concat(e))}n.qbTable.$broadcast("qbTableCellSelect")}),n.qbTable.$on("qbTableCellSelectStatus",function(t,e){return e.push(n.selector)})}),e.addClass("qb-cell")}],link:function(t,e,n,l){t.qbTable=l},template:'\n\t\t<ng-transclude></ng-transclude>\n\t\t<div ng-if="isSelector && isMeta" class="btn-group">\n\t\t\t<a class="btn btn-default dropdown-toggle" data-toggle="dropdown">\n\t\t\t\t<i ng-class="metaStatus == \'all\' ? qbTableSettings.icons.checkMetaChecked : metaStatus == \'some\' ? qbTableSettings.icons.checkMetaUnchecked : qbTableSettings.icons.checkMetaUnchecked"></i>\n\t\t\t\t<i ng-class="qbTableSettings.icons.checkMetaCaret"></i>\n\t\t\t</a>\n\t\t\t<ul class="dropdown-menu">\n\t\t\t\t<li><a ng-click="metaSelect(\'all\')">All</a></li>\n\t\t\t\t<li><a ng-click="metaSelect(\'invert\')">Invert</a></li>\n\t\t\t\t<li><a ng-click="metaSelect(\'none\')">None</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div ng-if="isSelector && !isMeta">\n\t\t\t<i ng-class="selector ? qbTableSettings.icons.checkItemChecked : qbTableSettings.icons.checkItemUnchecked"></i>\n\t\t</div>\n\t'}}).directive("qbPagination",function(){return{scope:{},require:"^qbTable",restrict:"EA",transclude:!0,controller:["$attrs","$scope","qbTableSettings",function(t,e,n){e.qbTableSettings=n,e.canPrev=!0,e.canNext=!0,e.showRange={},e.$watchGroup(["qbTable.query.limit","qbTable.query.skip","qbTable.count"],function(t){e.canPrev=0<e.qbTable.query.skip,e.canNext=!e.qbTable.count||e.qbTable.query.skip+e.qbTable.query.limit<e.qbTable.count,n.pagination.showXOfY&&(e.showRange={start:(e.qbTable.query.skip||0)+1,end:Math.min((e.qbTable.query.skip||0)+e.qbTable.query.limit,e.qbTable.count),total:e.qbTable.count}),n.pagination.showPages&&(e.pages={current:!!e.qbTable.query.limit&&Math.floor((e.qbTable.query.skip||0)/e.qbTable.query.limit)},e.pages.min=Math.max(e.pages.current-n.pagination.pageRangeBack,0),e.pages.total=e.qbTable.query.limit?Math.ceil(e.qbTable.count/e.qbTable.query.limit):1,e.pages.max=Math.min(e.pages.total,e.pages.current+n.pagination.pageRangeFore+1),e.pages.range=_.range(e.pages.min,e.pages.max).map(function(t){return{number:t,mode:t==e.pages.current?"current":t==e.pages.current-1?"prev":t==e.pages.current+1?"next":"normal"}}))}),e.navPageRelative=function(t){if(-1==t)e.qbTable.setField("skip",Math.max((e.qbTable.query.skip||0)-(e.qbTable.query.limit||10),0)).setDirty();else{if(1!=t)throw new Error("Unsupported page move: "+t);e.qbTable.setField("skip",(e.qbTable.query.skip||0)+(e.qbTable.query.limit||10)).setDirty()}},e.navPageNumber=function(t){return e.qbTable.setField("skip",(t||0)*(e.qbTable.query.limit||10)).setDirty()}}],link:function(t,e,n,l){t.qbTable=l},template:'\n\t\t<nav>\n\t\t\t<ul class="pager">\n\t\t\t\t<li ng-class="canPrev ? \'\' : \'disabled\'" class="previous"><a ng-click="navPageRelative(-1)"><i ng-class="qbTableSettings.icons.paginationPrev"></i></a></li>\n\t\t\t\t<ng-transclude class="text-center">\n\t\t\t\t\t<span ng-if="qbTableSettings.pagination.showXOfY && showRange.end" class="display-xofy">\n\t\t\t\t\t\tShowing documents {{showRange.start | number}} - {{showRange.end | number}}\n\t\t\t\t\t\t<span ng-if="showRange.total">\n\t\t\t\t\t\t\tof {{showRange.total | number}}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<ul ng-if="qbTableSettings.pagination.showPages && showRange.end && pages.max > 1" class="display-pages pagination">\n\t\t\t\t\t\t<li ng-repeat="page in pages.range track by page.number" ng-class="page.mode == \'current\' ? \'active\' : \'\'">\n\t\t\t\t\t\t\t<a ng-click="navPageNumber(page.number)">\n\t\t\t\t\t\t\t\t{{page.number + 1 | number}}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</ng-transclude>\n\t\t\t\t<li ng-class="canNext ? \'\' : \'disabled\'" class="next"><a ng-click="navPageRelative(1)"><i ng-class="qbTableSettings.icons.paginationNext"></i></a></li>\n\t\t\t</ul>\n\t\t</nav>\n\t'}}).directive("qbExport",function(){return{scope:{query:"<",spec:"<",url:"@"},transclude:!0,restrict:"EA",controller:["$element","$httpParamSerializerJQLike","$scope","$timeout","$window","qbTableSettings","qbTableUtilities",function(t,e,n,l,i,r,a){n.qbTableSettings=r,n.settings={},n.isShowing=!1,n.exportPrompt=function(){n.settings=angular.extend(angular.copy(r.export.defaults),{query:_(n.query).omitBy(function(t,e){return["skip","limit"].includes(e)}).value(),columns:_(n.spec).pickBy(function(t){return t&&t.type&&["string","number","data","boolean","objectid"].includes(t.type)}).map(function(t,e){return t.id=e,t.title=_.startCase(e),t.selected=!0,t}).value(),questions:_(r.export.questions).mapKeys(function(t){return t.id}).mapValues(function(t){return t.default}).value()}),t.find(".modal").on("show.bs.modal",function(){return l(function(){return n.isShowing=!0})}).on("hidden.bs.modal",function(){return l(function(){return n.isShowing=!1})}).modal("show")},n.exportExecute=function(){var t=angular.extend(n.settings.query,{select:n.settings.columns.filter(function(t){return t.selected}).map(function(t){return t.id}),format:n.settings.format},n.settings.questions);i.open(n.url+"?"+e(t))},n.querySynopsis,n.$watchGroup(["isShowing","settings.query"],function(){n.isShowing&&(n.querySynopsis=a.getSynopsis(n.settings.query))}),n.columnSynopsis,n.$watchGroup(["isShowing",function(){return _.get(n.settings,"columns",[]).map(function(t){return t.id+"="+t.selected}).join("&")}],function(){n.isShowing&&(n.columnSynopsis=n.settings.columns.filter(function(t){return t.selected}).length+" columns")})}],link:function(t,e){e.find("ng-transclude").on("click",function(){return t.$applyAsync(function(){return t.exportPrompt()})})},template:'\n\t\t<div class="modal fade">\n\t\t\t<div class="modal-dialog modal-lg">\n\t\t\t\t<div ng-if="isShowing" class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<a class="close" data-dismiss="modal"><i ng-class="qbTableSettings.icons.modalClose"></i></a>\n\t\t\t\t\t\t<h4 class="modal-title">Export</h4>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body form-horizontal">\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Output format</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<select ng-model="settings.format" class="form-control">\n\t\t\t\t\t\t\t\t\t<option ng-repeat="format in qbTableSettings.export.formats track by format.id" value="{{format.id}}">{{format.title}}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Criteria</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<div class="panel-group" id="qb-export-criteria-{{$id}}">\n\t\t\t\t\t\t\t\t\t<div class="panel panel-default">\n\t\t\t\t\t\t\t\t\t\t<div class="panel-heading">\n\t\t\t\t\t\t\t\t\t\t\t<h4 class="panel-title">\n\t\t\t\t\t\t\t\t\t\t\t\t<a data-toggle="collapse" data-target="#qb-export-criteria-{{$id}}-query" data-parent="#qb-export-criteria-{{$id}}" class="btn-block collapsed">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{querySynopsis}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i ng-class="qbTableSettings.icons.modalCollapseClosed"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div id="qb-export-criteria-{{$id}}-query" class="panel-collapse collapse container">\n\t\t\t\t\t\t\t\t\t\t\t<ui-query-builder\n\t\t\t\t\t\t\t\t\t\t\t\tquery="settings.query"\n\t\t\t\t\t\t\t\t\t\t\t\tspec="spec"\n\t\t\t\t\t\t\t\t\t\t\t></ui-query-builder>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Columns</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<div class="panel-group" id="qb-export-columns-{{$id}}">\n\t\t\t\t\t\t\t\t\t<div class="panel panel-default">\n\t\t\t\t\t\t\t\t\t\t<div class="panel-heading">\n\t\t\t\t\t\t\t\t\t\t\t<h4 class="panel-title">\n\t\t\t\t\t\t\t\t\t\t\t\t<a data-toggle="collapse" data-target="#qb-export-columns-{{$id}}-columns" data-parent="#qb-export-columns-{{$id}}" class="btn-block collapsed">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{columnSynopsis}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i ng-class="qbTableSettings.icons.modalCollapseClosed"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div id="qb-export-columns-{{$id}}-columns" class="panel-collapse collapse row">\n\t\t\t\t\t\t\t\t\t\t\t<div class="col-xs-12">\n\t\t\t\t\t\t\t\t\t\t\t\t<table qb-table class="table table-hover">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th qb-cell selector></th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Column</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr ng-repeat="col in settings.columns track by col.id">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td qb-cell selector="col.selected"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>{{col.title}}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div ng-repeat="question in qbTableSettings.export.questions track by question.id" class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">{{question.title}}</label>\n\t\t\t\t\t\t\t<div ng-switch="question.type" class="col-sm-9">\n\t\t\t\t\t\t\t\t<div ng-switch-when="text">\n\t\t\t\t\t\t\t\t\t<input type="text" ng-model="settings.questions[question.id]" class="form-control"/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div ng-switch-default>\n\t\t\t\t\t\t\t\t\t<div class="alert alert-danger">\n\t\t\t\t\t\t\t\t\t\tUnknown question type: "{{question.type}}"\n\t\t\t\t\t\t\t\t\t\t<pre>{{question | json}}</pre>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div ng-if="question.help" class="help-block">{{question.help}}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<div class="pull-left">\n\t\t\t\t\t\t\t<a class="btn btn-danger" data-dismiss="modal">Cancel</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="pull-right">\n\t\t\t\t\t\t\t<a ng-click="exportExecute()" class="btn btn-primary" data-dismiss="modal">Export</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<ng-transclude>\n\t\t\t<a ng-click="exportPrompt()" class="btn btn-default">Export...</a>\n\t\t</ng-transclude>\n\t'}}).directive("qbModal",function(){return{scope:{query:"=",spec:"<",title:"@?",onRefresh:"&?",binding:"@?"},transclude:!0,restrict:"A",controller:["$element","$scope","qbTableSettings",function(t,e,n){var l=this;e.qbTableSettings=n,l.isShown=!1,l.rebind=function(){t.one("click",function(){t.find(".qb-modal").one("hide.bs.modal",function(){l.isShown=!1}).one("hidden.bs.modal",function(){l.rebind()}).modal("show")})},e.submit=function(){angular.isFunction(l.onRefresh)&&l.onRefresh({query:e.queryCopy,spec:e.spec}),e.binding&&"complete"!=e.binding||(e.query=e.queryCopy),t.find(".qb-modal").modal("hide")},l.$onInit=function(){e.queryCopy="live"==e.binding?e.query:angular.copy(e.query)},l.rebind()}],template:'\n\t\t<ng-transclude></ng-transclude>\n\t\t<div class="qb-modal modal fade">\n\t\t\t<div class="modal-dialog modal-lg">\n\t\t\t\t<div class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<a class="close" data-dismiss="modal"><i ng-class="qbTableSettings.icons.modalClose"></i></a>\n\t\t\t\t\t\t<h4 class="modal-title">{{title || \'Edit Filter\'}}</h4>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body">\n\t\t\t\t\t\t<ui-query-builder\n\t\t\t\t\t\t\tquery="queryCopy"\n\t\t\t\t\t\t\tspec="spec"\n\t\t\t\t\t\t></ui-query-builder>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<div class="pull-left">\n\t\t\t\t\t\t\t<a class="btn btn-danger" data-dismiss="modal">Cancel</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="pull-right">\n\t\t\t\t\t\t\t<a ng-click="submit()" class="btn btn-success">Refresh</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t'}}).directive("qbSearch",function(){return{scope:{query:"=",spec:"<",onRefresh:"&?",fields:"<?",useIndexes:"@?"},restrict:"AE",transclude:!0,controller:["$element","$scope","$rootScope","$timeout","qbTableSettings","qbTableUtilities",function(l,a,c,t,s,o){var u=this;a.qbTableSettings=s,a.search="",a.isSearching=!1,a.submit=function(){var t=!(0<arguments.length&&void 0!==arguments[0])||arguments[0];if(!a.search&&t)return a.clear(!1);var n=o.escapeRegExp(_.trim(a.search)),e={$comment:"search",$or:_(a.spec).pickBy(function(t){return"string"==t.type}).mapValues(function(t,e){return[{$regex:n,$options:"i"}]}).value()},l=o.find(a.query,{$comment:"search"}),i=angular.copy(a.query);if(l&&_.isEqual(l,["$comment"]))i=e;else if(l&&"$and"==l[0])_.set(i,l,e);else if(_.isEqual(_.keys(i),["$and"]))i.$and.push(e);else if(_.isObject(i)){var r=u.useIndexes||"auto";"auto"==r&&(r=_.keys(a.spec).some(function(t){return"_id"!=t&&a.spec[t].index})?"stringIndexed":"string"),a.fields?i.$or=_(a.fields).map(function(t){return _defineProperty({},t,{$regex:o.escapeRegExp(a.search),$options:"i"})}).value():i.$or=_(a.spec).pickBy(function(t,e){if("_id"==e)return!1;if(a.fields&&a.fields.length)return a.fields.includes(e);switch(r){case"all":return!0;case"string":return"string"==t.type;case"stringIndexed":return"string"==t.type&&t.index;default:throw new Error('Unknown field selection method: "'+r+'"')}}).map(function(t,e){return _defineProperty({},e,{$regex:o.escapeRegExp(a.search),$options:"i"})}).value()}else console.warn(s.debugPrefix,"Unable to inject search term",e,"within complex query object",i);a.isSearching=!0,c.$broadcast("queryBuilder.change.replace",i),angular.isFunction(u.onRefresh)&&u.onRefresh({query:i}),("complete"==u.binding||angular.isUndefined(u.binding))&&(a.query=i)},a.clear=function(){var t,e=!(0<arguments.length&&void 0!==arguments[0])||arguments[0],n=o.find(a.query,{$comment:"search"});if(a.isSearching=!1,a.search="",e&&angular.element(l).find("input").focus(),n&&_.isEqual(n,["$comment"]))t={};else if(n&&"$and"==n[0])(t=angular.copy(a.query)).$and.find(function(t,e){return"search"!=t.$comment});else if(n)t=angular.copy(a.query),_.unset(t,n);else{if(!a.query.$or||!a.query.$or.every(function(t){return 1==_.size(t)&&_.chain(t).first().keys().find(function(t){return"$regEx"==t})}))return s.debug?void console.warn(s.debugPrefix,"Unable to clear search query within complex query - or query doesnt contain a search anyway",a.query):void 0;delete(t=angular.copy(a.query)).$or}c.$broadcast("queryBuilder.change.replace",t),angular.isFunction(u.onRefresh)&&u.onRefresh({query:t}),("complete"==u.binding||angular.isUndefined(u.binding))&&(a.query=t)},a.check=function(){try{a.search=_.chain(a.query).get("$or").first().values().first().get("$regex").thru(function(t){return o.unescapeRegExp(t||"")}).value()}catch(t){a.search=""}},u.$onInit=function(){return a.check()}}],template:'\n\t\t<ng-transclude>\n\t\t\t<form ng-submit="submit()" class="form-inline">\n\t\t\t\t<div class="form-group">\n\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t<input type="text" ng-model="search" class="form-control"/>\n\t\t\t\t\t\t<a ng-click="isSearching ? clear() : submit(false)" class="btn btn-default input-group-addon">\n\t\t\t\t\t\t\t<i ng-class="isSearching ? qbTableSettings.icons.searchClear : qbTableSettings.icons.search"/>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</ng-transclude>\n\t'}});
"use strict";function _defineProperty(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}angular.module("angular-ui-query-builder",[]).service("QueryBuilder",function(){var a=this;a.cleanSpec=function(t){return _(t).mapValues(function(t,e){return{type:t.type,enum:_(t.enum).map(function(t){return _.isString(t)?{id:t,title:_.startCase(t)}:t}).sortBy("title").value()}}).value()},a.metaProperties={limit:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!0},populate:{type:"hidden"},skip:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!0},sort:{type:"keyVal",actions:[{id:"$eq",title:"Equals"}],action:"$eq",canDelete:!1}},a.queryPathPrototypeActions=[{id:"$eq",title:"Equals"},{id:"$neq",title:"Doesnt equal"},{id:"$lt",title:"Is less than"},{id:"$lte",title:"Is equal to or less than"},{id:"$gt",title:"Is greater than"},{id:"$gte",title:"Is equal or greater than"},{id:"$in",title:"Is one of"},{id:"$nin",title:"Is not one of"},{id:"$exists",title:"Has a value"},{id:"$nexists",title:"Does not have a value"}],a.queryPathPrototype=function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=2<arguments.length?arguments[2]:void 0,i=n[t],l=_.isObject(e)&&_(e).keys().first(),r=_.isObject(e)?_(e).values().first():e;return"$or"==t&&e.every(function(t){return _.isObject(t)&&1==_.keys(t).length})&&e.map(function(t){return _.chain(t).first().values().first().keys().find(function(t){return"$regexp"==t}).value()}).length==e.length?{path:t,type:"search",title:"Search",value:_.chain(e).first().values().first().get("$regexp").value(),fields:_(e).map(function(t){return _.keys(t)}).flatten().value(),actions:a.queryPathPrototypeActions}:"$and"==t||"$or"==t?(_.isArray(e)||(console.warn("query-builder","Query path",t,"is a meta key",e,"but is not an array!","Given",_typeof(e)),e=[]),{path:t,type:"binaryGroup",title:"$and"==t?"AND":"$or"==t?"OR":"UNKNOWN",condition:t.replace(/\$/,""),children:e.map(function(t){return a.queryToArray(t,n)}),actions:a.queryPathPrototypeActions}):a.metaProperties[t]?Object.assign({path:t,title:_.startCase(t),value:e,type:"hidden",action:"$hidden",actions:a.queryPathPrototypeActions},a.metaProperties[t]):"$exists"==l?{path:t,title:e.title||_.startCase(t),value:!!e,type:"exists",action:"$exists",actions:a.queryPathPrototypeActions}:"string"==i.type&&_.isArray(i.enum)&&i.enum.length?{path:t,title:e.title||_.startCase(t),type:"enum",action:e.$in?"$in":e.$nin?"$nin":i.enum.length?"$in":"$eq",enum:i.enum,value:e.$in?e.$in:e.$nin?e.$nin:i.enum.length&&!_.isArray(e)?[e]:e,actions:a.queryPathPrototypeActions}:{path:t,title:e.title||_.startCase(t),type:"string"==i.type?"string":"number"==i.type?"number":"date"==i.type?"date":"string",action:"$eq",value:"date"==i.type?moment(r).toDate():r,actions:a.queryPathPrototypeActions}},a.queryToArray=function(t,i){return _(t).pickBy(function(t,e){var n=i[e]||"$and"==e||"$or"==e||a.metaProperties[e];return n||console.warn("query-builder","Incomming query path",e,"Does not map to anything in spec",i),!!n}).map(function(t,e){return a.queryPathPrototype(e,t,i)}).value()},a.arrayToQuery=function(t){return _(t).mapKeys(function(t){return t.path}).mapValues(function(e){switch(e.type){case"string":case"number":case"date":return"$eq"==e.action?e.value:_defineProperty({},e.action,e.value);case"enum":return _defineProperty({},e.action,e.value);case"exists":return{$exists:"$exists"==e.action};case"search":return e.fields.map(function(t){return _defineProperty({},t,{$regexp:e.value,options:"i"})});case"keyVal":case"hidden":return e.value;default:console.warn("Unknown type to convert:",e.type)}}).value()}}).component("uiQueryBuilder",{bindings:{query:"=",spec:"<"},template:'\n\t\t<div class="ui-query-builder">\n\t\t\t<div ng-if="$ctrl.isEmpty">\n\t\t\t\t<ui-query-builder-group\n\t\t\t\t\tqb-group="$ctrl.emptyQueryLayout"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-group>\n\t\t\t</div>\n\t\t\t<div ng-if="!$ctrl.isEmpty" class="query-container">\n\t\t\t\t<ui-query-builder-group\n\t\t\t\t\tqb-group="$ctrl.qbQuery"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-group>\n\t\t\t</div>\n\t\t</div>\n\t',controller:["$scope","$timeout","QueryBuilder",function(l,r,a){var c=this;c.qbSpec,c.qbQuery;var t=l.$watchGroup(["$ctrl.query","$ctrl.spec"],function(){c.spec&&c.query&&(c.qbSpec=a.cleanSpec(c.spec),c.qbQuery=a.queryToArray(c.query,c.qbSpec),t())});l.$on("queryBuilder.change",function(t,e){return r(function(){e?(c.query=e,c.qbQuery=a.queryToArray(c.query,c.qbSpec)):c.query=a.arrayToQuery(c.qbQuery)})}),l.$on("queryBuilder.pathAction.drop",function(t,e){c.qbQuery=c.qbQuery.filter(function(t){return t.path!=e}),c.query=a.arrayToQuery(c.qbQuery)}),l.$on("queryBuilder.pathAction.swapPath",function(t,e,n){var i=c.qbQuery.findIndex(function(t){return t.path==e});if(i<0)throw new Error('Cannot find path "'.concat(e,'" to swap with new path "').concat(n,'"'));c.qbQuery[i]=a.queryPathPrototype(n,void 0,c.qbSpec),r(function(){return l.$broadcast("queryBuilder.focusOperand",n)})}),l.$on("queryBuilder.pathAction.swapAction",function(t,e,n){console.log("SWAPACTION",e,n)}),l.$on("queryBuilder.pathAction.add",function(t,e){e?console.warn("Adding a path to a sub-node is not yet supported"):(c.qbQuery.findIndex(function(t){return!t.path})&&c.qbQuery.push({path:"",type:"blank",value:null,fields:[]}),r(function(){return l.$broadcast("queryBuilder.focusPath","")}))}),c.emptyQueryLayout=[{type:"alert",title:"No query specified"}],c.isEmpty,l.$watchCollection("$ctrl.qbQuery",function(){return c.isEmpty=_.isEmpty(c.qbQuery)})}]}).component("uiQueryBuilderGroup",{bindings:{qbGroup:"=",qbSpec:"<"},template:'\n\t\t<div ng-repeat="row in $ctrl.qbGroup | filter:$ctrl.qbGroupFilter" meta-key="{{row.path}}">\n\t\t\t<ui-query-builder-row\n\t\t\t\tqb-item="row"\n\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t></ui-query-builder-row>\n\t\t</div>\n\t\t<button ng-click="$ctrl.add()" type="button" class="btn-add"></button>\n\t',controller:["$scope","QueryBuilder",function(t,e){this.add=function(){return t.$emit("queryBuilder.pathAction.add")},this.qbGroupFilter=function(t){return"hidden"!=t.type}}]}).component("uiQueryBuilderRow",{bindings:{qbItem:"=",qbSpec:"<"},controller:["$element","$scope","QueryBuilder",function(i,e,t){var l=this;l.delete=function(t){return e.$emit("queryBuilder.pathAction.drop",t)},l.setChanged=function(){return e.$emit("queryBuilder.change")},l.setAction=function(t){return e.$emit("queryBuilder.pathAction.swapAction",l.qbItem,t)},e.$on("queryBuilder.focusPath",function(t,e){l.qbItem.path==e&&i.find("ui-query-builder-path .dropdown-toggle").dropdown("toggle")}),e.$on("queryBuilder.focusOperand",function(t,e){if(l.qbItem.path==e){var n=i.find("input.form-control");if(1==n.length)return n.focus();console.warn("Unable to focus any element within DOM",i[0],"for type",l.type,"on line item",l.qbItem)}})}],template:'\n\t\t<div ng-switch="$ctrl.qbItem.type">\n\t\t\t\x3c!-- $and / $or condition {{{ --\x3e\n\t\t\t<div ng-switch-when="binaryGroup" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-1 btn-block">\n\t\t\t\t\t\t{{$ctrl.qbItem.title}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div ng-repeat="conditional in $ctrl.qbItem.children" class="query-container clearfix">\n\t\t\t\t\t<ui-query-builder-group\n\t\t\t\t\t\tqb-group="conditional"\n\t\t\t\t\t\tqb-spec="$ctrl.spec"\n\t\t\t\t\t></ui-query-builder-group>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- String {{{ --\x3e\n\t\t\t<div ng-switch-when="string" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Enum {{{ --\x3e\n\t\t\t<div ng-switch-when="enum" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<ui-query-builder-block-menu-multiple\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="3"\n\t\t\t\t\tselected="$ctrl.qbItem.value"\n\t\t\t\t\toptions="$ctrl.qbItem.enum"\n\t\t\t\t></ui-query-builder-block-menu-multiple>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Date {{{ --\x3e\n\t\t\t<div ng-switch-when="date" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="date"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Number {{{ --\x3e\n\t\t\t<div ng-switch-when="number" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-3 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-value="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-changed="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="number"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Exists {{{ --\x3e\n\t\t\t<div ng-switch-when="exists" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<ui-query-builder-block-menu\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="2"\n\t\t\t\t\tselected="$ctrl.qbItem.action"\n\t\t\t\t\toptions="$ctrl.qbItem.actions"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-block-menu>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Search {{{ --\x3e\n\t\t\t<div ng-switch-when="search" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t\ton-change="$ctrl.setAction(selected)"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-2 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- keyVal (Only title + value) {{{ --\x3e\n\t\t\t<div ng-switch-when="keyVal" class="query-row">\n\t\t\t\t<a ng-if="$ctrl.qbItem.canDelete === undefined || $ctrl.qbItem.canDelete" ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-block\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\ttitle="$ctrl.qbItem.title"\n\t\t\t\t></ui-query-builder-block>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-2 btn-block">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tng-model="$ctrl.qbItem.value"\n\t\t\t\t\t\t\tng-change="$ctrl.setChanged()"\n\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\tclass="form-control"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Blank (i.e. field not set yet) {{{ --\x3e\n\t\t\t<div ng-switch-when="blank" class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Alert {{{ --\x3e\n\t\t\t<div ng-switch-when="alert" class="query-row">\n\t\t\t\t<div class="query-block query-block-2">\n\t\t\t\t\t<div class="btn btn-block btn-noclick" ng-bind="$ctrl.qbItem.title"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t\t\x3c!-- Unknown {{{ --\x3e\n\t\t\t<div ng-switch-default class="query-row">\n\t\t\t\t<a ng-click="$ctrl.delete($ctrl.qbItem.path)" class="btn-trash"></a>\n\t\t\t\t<ui-query-builder-path\n\t\t\t\t\tclass="query-block"\n\t\t\t\t\tlevel="1"\n\t\t\t\t\tselected="$ctrl.qbItem.path"\n\t\t\t\t\tqb-spec="$ctrl.qbSpec"\n\t\t\t\t></ui-query-builder-path>\n\t\t\t\t<div class="query-block">\n\t\t\t\t\t<div class="btn btn-warning btn-block">\n\t\t\t\t\t\tUnknown handler: {{$ctrl.qbItem.type}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- }}} --\x3e\n\t\t</div>\n\t'}).component("uiQueryBuilderPath",{bindings:{level:"<",selected:"<",qbSpec:"<"},controller:["$scope",function(e){var n=this;n.setSelected=function(t){return e.$emit("queryBuilder.pathAction.swapPath",n.selected,t)},n.options,n.$onInit=function(){n.options=_.map(n.qbSpec,function(t,e){return Object.assign({},{path:e,title:_.startCase(e)},t)}),n.selectedOption=n.options.find(function(t){return t.path==n.selected})}}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown" ng-bind="$ctrl.selectedOption.title"></a>\n\t\t<ul class="dropdown-menu pull-right">\n\t\t\t<li ng-repeat="path in $ctrl.options track by path.path"><a ng-click="$ctrl.setSelected(path.path)">{{path.title}}</a></li>\n\t\t</ul>\n\t'}).component("uiQueryBuilderBlock",{bindings:{level:"<",title:"<"},controller:["$scope",function(t){}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}}">\n\t\t\t{{$ctrl.title}}\n\t\t</a>\n\t'}).component("uiQueryBuilderBlockMenu",{bindings:{level:"<",options:"<",selected:"=",onChange:"&?"},controller:["$scope",function(t){var e=this;e.setSelected=function(t){e.selected=t.id,angular.isFunction(e.onChange)&&e.onChange({selected:e.selected})},e.selectedOption,t.$watchGroup(["$ctrl.options","$ctrl.selected"],function(){e.selectedOption=e.options.find(function(t){return t.id==e.selected})})}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown" ng-bind="$ctrl.selectedOption.title"></a>\n\t\t<ul class="dropdown-menu pull-right">\n\t\t\t<li ng-repeat="option in $ctrl.options track by option.id"><a ng-click="$ctrl.setSelected(option)">{{option.title}}</a></li>\n\t\t</ul>\n\t'}).component("uiQueryBuilderBlockMenuMultiple",{bindings:{level:"<",options:"<",selected:"="},controller:["$scope",function(t){var n=this;n.toggle=function(e){n.selected||(n.selected=[]),n.selected.includes(e.id)?n.selected=n.selected.filter(function(t){return t!=e.id}):n.selected.push(e.id),t.$emit("queryBuilder.change")},n.selectedOptions,t.$watch("$ctrl.selected",function(){n.selectedOptions=n.options.filter(function(t){return(n.selected||[]).includes(t.id)}),n.options.forEach(function(e){return e.selected=n.selectedOptions.some(function(t){return t.id==e.id})})},!0)}],template:'\n\t\t<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown">\n\t\t\t<span ng-repeat="item in $ctrl.selectedOptions track by item.id" class="pill">\n\t\t\t\t{{item.title}}\n\t\t\t</span>\n\t\t</a>\n\t\t<ul class="dropdown-menu">\n\t\t\t<li ng-repeat="option in $ctrl.options track by option.id">\n\t\t\t\t<a ng-click="$ctrl.toggle(option)">\n\t\t\t\t\t<i class="fa fa-fw" ng-class="option.selected ? \'fa-check-square-o\' : \'fa-square-o\'"></i>\n\t\t\t\t\t{{option.title}}\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t</ul>\n\t'}),angular.module("angular-ui-query-builder").provider("qbTableSettings",function(){var t=this;return t.debug=!1,t.debugPrefix="[angular-ui-query-builder]",t.icons={sortNone:"fa fa-fw fa-sort text-muted",sortAsc:"fa fa-fw fa-sort-alpha-asc text-primary",sortDesc:"fa fa-fw fa-sort-alpha-desc text-primary",checkMetaChecked:"fa fa-lg fa-fw fa-check-square-o text-primary",checkMetaSome:"fa fa-lg fa-fw fa-minus-square-o",checkMetaUnchecked:"fa fa-lg fa-fw fa-square-o",checkMetaCaret:"fa fa-caret-down",checkItemChecked:"fa fa-lg fa-fw fa-check-square-o",checkItemUnchecked:"fa fa-lg fa-fw fa-square-o",paginationPrev:"fa fa-arrow-left",paginationNext:"fa fa-arrow-right",modalClose:"fa fa-times",modalCollapseClosed:"fa fa-caret-right pull-right",search:"fa fa-search",searchClear:"fa fa-times"},t.pagination={showXOfY:!0,showPages:!0,pageRangeBack:5,pageRangeFore:5},t.export={defaults:{format:"xlsx"},formats:[{id:"xlsx",title:"Excel (XLSX)"},{id:"csv",title:"CSV"},{id:"json",title:"JSON"},{id:"html",title:"HTML (display in browser)"}],questions:[]},t.$get=function(){return t},t}).service("qbTableUtilities",function(){return{getSynopsis:function(t){var e=_.keys(t).filter(function(t){return!["sort","skip","limit","select"].includes(t)});return[e.length?1==e.length?"1 filter":"".concat(e.length," filters"):"All documents",t.sort?t.sort.startsWith("-")?"sorted by ".concat(t.sort.substr(1)," (reverse order)"):"sorted by ".concat(t.sort):null,t.limit?"limited to ".concat(t.limit," rows"):null,t.offset?"starting at record ".concat(t.skip):null,t.select?"selecting only ".concat(t.select.length," columns"):null].filter(function(t){return t}).join(", ")},find:function(t,e){var l,r=_.isFunction(e)?e:_.matches(e);return!!function n(t,i){return r(t,i.slice(i.length-1))?(l=i,!0):_.isArray(t)?t.some(function(t,e){return n(t,i.concat(e))}):_.isObject(t)?_.some(t,function(t,e){return n(t,i.concat(e))}):void 0}(t,[])&&l},escapeRegExp:function(t){return String(t).replace(/(\W)/g,"\\$1")},unescapeRegExp:function(t){return String(t).replace(/\\(\W)/g,"$1")}}}).directive("qbTable",function(){return{scope:{qbTable:"=?",count:"<?",stickyThead:"<?",stickyTfoot:"<?"},restrict:"AC",controller:["$attrs","$element","$rootScope","$scope","$timeout","qbTableSettings",function(t,e,n,l,i,r){var a=this;a.query=l.qbTable,a.count=l.count,l.$watch("count",function(){return a.count=l.count}),a.$broadcast=function(t){for(var e=arguments.length,n=new Array(1<e?e-1:0),i=1;i<e;i++)n[i-1]=arguments[i];return l.$broadcast.apply(l,[t].concat(n))},a.$on=function(t,e){return l.$on(t,e)},a.setDirty=function(){r.debug&&console.log(r.debugPrefix,"Declare query dirty",l.qbTable),n.$broadcast("queryBuilder.change",l.qbTable)},a.setField=function(t,e){if(null!=e){switch(t){case"sort":a.query.sort===e?a.query.sort="-".concat(e):(a.query.sort,"-".concat(e),a.query.sort=e);break;default:l.qbTable[t]=e}return a}delete a.query[t]},e.addClass("qb-table"),l.$watch("stickyThead",function(){return e.toggleClass("qb-sticky-thead",l.stickyThead||""===t.stickyThead)}),l.$watch("stickyTfoot",function(){return e.toggleClass("qb-sticky-tfoot",l.stickyTfoot||""===t.stickyTfoot)}),l.$watch("count",function(){return e.toggleClass("qb-noresults",0===l.count)}),l.$on("queryBuilder.change.replace",function(t,e){a.query=l.qbTable=e,i(function(){return a.setDirty()})})}]}}).directive("qbCol",function(){return{scope:{qbCol:"@",sortable:"@"},require:"^qbTable",restrict:"A",transclude:!0,controller:["$attrs","$element","$scope","$timeout","qbTableSettings",function(t,e,n,i,l){n.qbTableSettings=l;var r=n.$watchGroup(["qbTable","sortable"],function(){""===t.sortable&&!n.qbTable&&l.debug&&console.warn(l.debugPrefix,"Added qb-col + sortable onto element",e,"but no qb-table query has been assigned on the table element!"),r()});n.canSort=!1,n.isSorted=!1,this.$onInit=function(){n.canSort=n.sortable||""===t.sortable,e.toggleClass("sortable",n.canSort),n.canSort&&e.on("click",function(){return i(n.toggleSort)})},n.$watch("qbTable.query.sort",function(t){var e=n.sortable||n.qbCol;t?angular.isArray(t)&&t.some(function(t){return t==e})||t==e?n.isSorted="asc":angular.isArray(t)&&t.some(function(t){return t=="-"+e})||t=="-"+e?n.isSorted="desc":n.isSorted=!1:n.isSorted=!1}),n.toggleSort=function(){n.sortable?n.qbTable.setField("sort",n.sortable).setDirty():n.qbCol&&""===t.sortable&&n.qbTable.setField("sort",n.qbCol).setDirty()}}],link:function(t,e,n,i){t.qbTable=i},template:'\n\t\t<div class="qb-col-wrapper">\n\t\t\t<ng-transclude></ng-transclude>\n\t\t\t<a ng-if="canSort" ng-click="toggleSort()" class="qb-col-right">\n\t\t\t\t<i class="{{\n\t\t\t\t\tisSorted == \'asc\' ? qbTableSettings.icons.sortAsc\n\t\t\t\t\t: isSorted == \'desc\' ? qbTableSettings.icons.sortDesc\n\t\t\t\t\t: qbTableSettings.icons.sortNone\n\t\t\t\t}}"></i>\n\t\t\t</a>\n\t\t</div>\n\t'}}).directive("qbCell",function(){return{scope:{selector:"=?",onPreSelect:"&?",onSelect:"&?"},require:"^qbTable",restrict:"A",transclude:!0,controller:["$attrs","$element","$scope","$timeout","qbTableSettings",function(t,e,n,i,l){n.qbTableSettings=l,n.isMeta=0<e.parents("thead").length,n.isMeta&&i(function(){return n.qbTable.$on("qbTableCellSelect",function(){var t=[];n.qbTable.$broadcast("qbTableCellSelectStatus",t),n.metaStatus=t.every(function(t){return t})?"all":t.some(function(t){return t})?"some":"none"})}),n.isSelector="selector"in t,n.$watch("selector",function(){n.isSelector&&e.toggleClass("selector",n.isSelector),n.isSelector&&!n.isMeta&&e.parents("tr").toggleClass("selected",!!n.selector)}),n.isSelector&&!n.isMeta&&e.on("click",function(t){return n.$apply(function(){n.onPreSelect&&n.onPreSelect({value:n.selector}),n.selector=!n.selector,n.qbTable.$broadcast("qbTableCellSelect"),n.onSelect&&i(function(){return n.onSelect({value:n.selector})})})}),n.metaSelect=function(t){return n.qbTable.$broadcast("qbTableCellSelectMeta",t)},n.isSelector&&!n.isMeta&&i(function(){n.qbTable.$on("qbTableCellSelectMeta",function(t,e){switch(e){case"all":n.selector=!0;break;case"invert":n.selector=!n.selector;break;case"none":n.selector=!1;break;default:throw new Error("Unknown selection type: ".concat(e))}n.qbTable.$broadcast("qbTableCellSelect")}),n.qbTable.$on("qbTableCellSelectStatus",function(t,e){return e.push(n.selector)})}),e.addClass("qb-cell")}],link:function(t,e,n,i){t.qbTable=i},template:'\n\t\t<ng-transclude></ng-transclude>\n\t\t<div ng-if="isSelector && isMeta" class="btn-group">\n\t\t\t<a class="btn btn-default dropdown-toggle" data-toggle="dropdown">\n\t\t\t\t<i ng-class="metaStatus == \'all\' ? qbTableSettings.icons.checkMetaChecked : metaStatus == \'some\' ? qbTableSettings.icons.checkMetaUnchecked : qbTableSettings.icons.checkMetaUnchecked"></i>\n\t\t\t\t<i ng-class="qbTableSettings.icons.checkMetaCaret"></i>\n\t\t\t</a>\n\t\t\t<ul class="dropdown-menu">\n\t\t\t\t<li><a ng-click="metaSelect(\'all\')">All</a></li>\n\t\t\t\t<li><a ng-click="metaSelect(\'invert\')">Invert</a></li>\n\t\t\t\t<li><a ng-click="metaSelect(\'none\')">None</a></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div ng-if="isSelector && !isMeta">\n\t\t\t<i ng-class="selector ? qbTableSettings.icons.checkItemChecked : qbTableSettings.icons.checkItemUnchecked"></i>\n\t\t</div>\n\t'}}).directive("qbPagination",function(){return{scope:{},require:"^qbTable",restrict:"EA",transclude:!0,controller:["$attrs","$scope","qbTableSettings",function(t,e,n){e.qbTableSettings=n,e.canPrev=!0,e.canNext=!0,e.showRange={},e.$watchGroup(["qbTable.query.limit","qbTable.query.skip","qbTable.count"],function(t){e.canPrev=0<e.qbTable.query.skip,e.canNext=!e.qbTable.count||e.qbTable.query.skip+e.qbTable.query.limit<e.qbTable.count,n.pagination.showXOfY&&(e.showRange={start:(e.qbTable.query.skip||0)+1,end:Math.min((e.qbTable.query.skip||0)+e.qbTable.query.limit,e.qbTable.count),total:e.qbTable.count}),n.pagination.showPages&&(e.pages={current:!!e.qbTable.query.limit&&Math.floor((e.qbTable.query.skip||0)/e.qbTable.query.limit)},e.pages.min=Math.max(e.pages.current-n.pagination.pageRangeBack,0),e.pages.total=e.qbTable.query.limit?Math.ceil(e.qbTable.count/e.qbTable.query.limit):1,e.pages.max=Math.min(e.pages.total,e.pages.current+n.pagination.pageRangeFore+1),e.pages.range=_.range(e.pages.min,e.pages.max).map(function(t){return{number:t,mode:t==e.pages.current?"current":t==e.pages.current-1?"prev":t==e.pages.current+1?"next":"normal"}}))}),e.navPageRelative=function(t){if(-1==t)e.qbTable.setField("skip",Math.max((e.qbTable.query.skip||0)-(e.qbTable.query.limit||10),0)).setDirty();else{if(1!=t)throw new Error("Unsupported page move: "+t);e.qbTable.setField("skip",(e.qbTable.query.skip||0)+(e.qbTable.query.limit||10)).setDirty()}},e.navPageNumber=function(t){return e.qbTable.setField("skip",(t||0)*(e.qbTable.query.limit||10)).setDirty()}}],link:function(t,e,n,i){t.qbTable=i},template:'\n\t\t<nav>\n\t\t\t<ul class="pager">\n\t\t\t\t<li ng-class="canPrev ? \'\' : \'disabled\'" class="previous"><a ng-click="navPageRelative(-1)"><i ng-class="qbTableSettings.icons.paginationPrev"></i></a></li>\n\t\t\t\t<ng-transclude class="text-center">\n\t\t\t\t\t<span ng-if="qbTableSettings.pagination.showXOfY && showRange.end" class="display-xofy">\n\t\t\t\t\t\tShowing documents {{showRange.start | number}} - {{showRange.end | number}}\n\t\t\t\t\t\t<span ng-if="showRange.total">\n\t\t\t\t\t\t\tof {{showRange.total | number}}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<ul ng-if="qbTableSettings.pagination.showPages && showRange.end && pages.max > 1" class="display-pages pagination">\n\t\t\t\t\t\t<li ng-repeat="page in pages.range track by page.number" ng-class="page.mode == \'current\' ? \'active\' : \'\'">\n\t\t\t\t\t\t\t<a ng-click="navPageNumber(page.number)">\n\t\t\t\t\t\t\t\t{{page.number + 1 | number}}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</ng-transclude>\n\t\t\t\t<li ng-class="canNext ? \'\' : \'disabled\'" class="next"><a ng-click="navPageRelative(1)"><i ng-class="qbTableSettings.icons.paginationNext"></i></a></li>\n\t\t\t</ul>\n\t\t</nav>\n\t'}}).directive("qbExport",function(){return{scope:{query:"<",spec:"<",url:"@"},transclude:!0,restrict:"EA",controller:["$element","$httpParamSerializerJQLike","$scope","$timeout","$window","qbTableSettings","qbTableUtilities",function(t,e,n,i,l,r,a){n.qbTableSettings=r,n.settings={},n.isShowing=!1,n.exportPrompt=function(){n.settings=angular.extend(angular.copy(r.export.defaults),{query:_(n.query).omitBy(function(t,e){return["skip","limit"].includes(e)}).value(),columns:_(n.spec).pickBy(function(t){return t&&t.type&&["string","number","data","boolean","objectid"].includes(t.type)}).map(function(t,e){return t.id=e,t.title=_.startCase(e),t.selected=!0,t}).value(),questions:_(r.export.questions).mapKeys(function(t){return t.id}).mapValues(function(t){return t.default}).value()}),t.find(".modal").on("show.bs.modal",function(){return i(function(){return n.isShowing=!0})}).on("hidden.bs.modal",function(){return i(function(){return n.isShowing=!1})}).modal("show")},n.exportExecute=function(){var t=angular.extend(n.settings.query,{select:n.settings.columns.filter(function(t){return t.selected}).map(function(t){return t.id}),format:n.settings.format},n.settings.questions);l.open(n.url+"?"+e(t))},n.querySynopsis,n.$watchGroup(["isShowing","settings.query"],function(){n.isShowing&&(n.querySynopsis=a.getSynopsis(n.settings.query))}),n.columnSynopsis,n.$watchGroup(["isShowing",function(){return _.get(n.settings,"columns",[]).map(function(t){return t.id+"="+t.selected}).join("&")}],function(){n.isShowing&&(n.columnSynopsis=n.settings.columns.filter(function(t){return t.selected}).length+" columns")})}],link:function(t,e){e.find("ng-transclude").on("click",function(){return t.$applyAsync(function(){return t.exportPrompt()})})},template:'\n\t\t<div class="modal fade">\n\t\t\t<div class="modal-dialog modal-lg">\n\t\t\t\t<div ng-if="isShowing" class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<a class="close" data-dismiss="modal"><i ng-class="qbTableSettings.icons.modalClose"></i></a>\n\t\t\t\t\t\t<h4 class="modal-title">Export</h4>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body form-horizontal">\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Output format</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<select ng-model="settings.format" class="form-control">\n\t\t\t\t\t\t\t\t\t<option ng-repeat="format in qbTableSettings.export.formats track by format.id" value="{{format.id}}">{{format.title}}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Criteria</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<div class="panel-group" id="qb-export-criteria-{{$id}}">\n\t\t\t\t\t\t\t\t\t<div class="panel panel-default">\n\t\t\t\t\t\t\t\t\t\t<div class="panel-heading">\n\t\t\t\t\t\t\t\t\t\t\t<h4 class="panel-title">\n\t\t\t\t\t\t\t\t\t\t\t\t<a data-toggle="collapse" data-target="#qb-export-criteria-{{$id}}-query" data-parent="#qb-export-criteria-{{$id}}" class="btn-block collapsed">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{querySynopsis}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i ng-class="qbTableSettings.icons.modalCollapseClosed"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div id="qb-export-criteria-{{$id}}-query" class="panel-collapse collapse container">\n\t\t\t\t\t\t\t\t\t\t\t<ui-query-builder\n\t\t\t\t\t\t\t\t\t\t\t\tquery="settings.query"\n\t\t\t\t\t\t\t\t\t\t\t\tspec="spec"\n\t\t\t\t\t\t\t\t\t\t\t></ui-query-builder>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">Columns</label>\n\t\t\t\t\t\t\t<div class="col-sm-9">\n\t\t\t\t\t\t\t\t<div class="panel-group" id="qb-export-columns-{{$id}}">\n\t\t\t\t\t\t\t\t\t<div class="panel panel-default">\n\t\t\t\t\t\t\t\t\t\t<div class="panel-heading">\n\t\t\t\t\t\t\t\t\t\t\t<h4 class="panel-title">\n\t\t\t\t\t\t\t\t\t\t\t\t<a data-toggle="collapse" data-target="#qb-export-columns-{{$id}}-columns" data-parent="#qb-export-columns-{{$id}}" class="btn-block collapsed">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{columnSynopsis}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i ng-class="qbTableSettings.icons.modalCollapseClosed"></i>\n\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div id="qb-export-columns-{{$id}}-columns" class="panel-collapse collapse row">\n\t\t\t\t\t\t\t\t\t\t\t<div class="col-xs-12">\n\t\t\t\t\t\t\t\t\t\t\t\t<table qb-table class="table table-hover">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th qb-cell selector></th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Column</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr ng-repeat="col in settings.columns track by col.id">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td qb-cell selector="col.selected"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td>{{col.title}}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div ng-repeat="question in qbTableSettings.export.questions track by question.id" class="form-group">\n\t\t\t\t\t\t\t<label class="col-sm-3 control-label">{{question.title}}</label>\n\t\t\t\t\t\t\t<div ng-switch="question.type" class="col-sm-9">\n\t\t\t\t\t\t\t\t<div ng-switch-when="text">\n\t\t\t\t\t\t\t\t\t<input type="text" ng-model="settings.questions[question.id]" class="form-control"/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div ng-switch-default>\n\t\t\t\t\t\t\t\t\t<div class="alert alert-danger">\n\t\t\t\t\t\t\t\t\t\tUnknown question type: "{{question.type}}"\n\t\t\t\t\t\t\t\t\t\t<pre>{{question | json}}</pre>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div ng-if="question.help" class="help-block">{{question.help}}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<div class="pull-left">\n\t\t\t\t\t\t\t<a class="btn btn-danger" data-dismiss="modal">Cancel</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="pull-right">\n\t\t\t\t\t\t\t<a ng-click="exportExecute()" class="btn btn-primary" data-dismiss="modal">Export</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<ng-transclude>\n\t\t\t<a ng-click="exportPrompt()" class="btn btn-default">Export...</a>\n\t\t</ng-transclude>\n\t'}}).directive("qbModal",function(){return{scope:{query:"=",spec:"<",title:"@?",onRefresh:"&?",binding:"@?"},transclude:!0,restrict:"A",controller:["$element","$scope","$rootScope","qbTableSettings",function(t,e,n,i){var l=this;e.qbTableSettings=i,l.isShown=!1,l.rebind=function(){t.one("click",function(){t.find(".qb-modal").one("hide.bs.modal",function(){l.isShown=!1}).one("hidden.bs.modal",function(){l.rebind()}).modal("show")})},e.submit=function(){angular.isFunction(l.onRefresh)&&l.onRefresh({query:e.queryCopy,spec:e.spec}),e.binding&&"complete"!=e.binding||(e.query=e.queryCopy),t.find(".qb-modal").modal("hide"),n.$broadcast("queryBuilder.change.replace",e.query)},l.$onInit=function(){e.queryCopy="live"==e.binding?e.query:angular.copy(e.query)},l.rebind()}],template:'\n\t\t<ng-transclude></ng-transclude>\n\t\t<div class="qb-modal modal fade">\n\t\t\t<div class="modal-dialog modal-lg">\n\t\t\t\t<div class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<a class="close" data-dismiss="modal"><i ng-class="qbTableSettings.icons.modalClose"></i></a>\n\t\t\t\t\t\t<h4 class="modal-title">{{title || \'Edit Filter\'}}</h4>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body">\n\t\t\t\t\t\t<ui-query-builder\n\t\t\t\t\t\t\tquery="queryCopy"\n\t\t\t\t\t\t\tspec="spec"\n\t\t\t\t\t\t></ui-query-builder>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<div class="pull-left">\n\t\t\t\t\t\t\t<a class="btn btn-danger" data-dismiss="modal">Cancel</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="pull-right">\n\t\t\t\t\t\t\t<a ng-click="submit()" class="btn btn-success">Refresh</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t'}}).directive("qbSearch",function(){return{scope:{query:"=",spec:"<",onRefresh:"&?",fields:"<?",useIndexes:"@?"},restrict:"AE",transclude:!0,controller:["$element","$scope","$rootScope","$timeout","qbTableSettings","qbTableUtilities",function(i,a,c,t,s,o){var u=this;a.qbTableSettings=s,a.search="",a.isSearching=!1,a.submit=function(){var t=!(0<arguments.length&&void 0!==arguments[0])||arguments[0];if(!a.search&&t)return a.clear(!1);var n=o.escapeRegExp(_.trim(a.search)),e={$comment:"search",$or:_(a.spec).pickBy(function(t){return"string"==t.type}).mapValues(function(t,e){return[{$regex:n,$options:"i"}]}).value()},i=o.find(a.query,{$comment:"search"}),l=angular.copy(a.query);if(i&&_.isEqual(i,["$comment"]))l=e;else if(i&&"$and"==i[0])_.set(l,i,e);else if(_.isEqual(_.keys(l),["$and"]))l.$and.push(e);else if(_.isObject(l)){var r=u.useIndexes||"auto";"auto"==r&&(r=_.keys(a.spec).some(function(t){return"_id"!=t&&a.spec[t].index})?"stringIndexed":"string"),a.fields?l.$or=_(a.fields).map(function(t){return _defineProperty({},t,{$regex:o.escapeRegExp(a.search),$options:"i"})}).value():l.$or=_(a.spec).pickBy(function(t,e){if("_id"==e)return!1;if(a.fields&&a.fields.length)return a.fields.includes(e);switch(r){case"all":return!0;case"string":return"string"==t.type;case"stringIndexed":return"string"==t.type&&t.index;default:throw new Error('Unknown field selection method: "'+r+'"')}}).map(function(t,e){return _defineProperty({},e,{$regex:o.escapeRegExp(a.search),$options:"i"})}).value()}else console.warn(s.debugPrefix,"Unable to inject search term",e,"within complex query object",l);a.isSearching=!0,c.$broadcast("queryBuilder.change.replace",l),angular.isFunction(u.onRefresh)&&u.onRefresh({query:l}),"complete"!=u.binding&&!angular.isUndefined(u.binding)||(a.query=l)},a.clear=function(){var t,e=!(0<arguments.length&&void 0!==arguments[0])||arguments[0],n=o.find(a.query,{$comment:"search"});if(a.isSearching=!1,a.search="",e&&angular.element(i).find("input").focus(),n&&_.isEqual(n,["$comment"]))t={};else if(n&&"$and"==n[0])(t=angular.copy(a.query)).$and.find(function(t,e){return"search"!=t.$comment});else if(n)t=angular.copy(a.query),_.unset(t,n);else{if(!a.query.$or||!a.query.$or.every(function(t){return 1==_.size(t)&&_.chain(t).first().keys().find(function(t){return"$regEx"==t})}))return s.debug?void console.warn(s.debugPrefix,"Unable to clear search query within complex query - or query doesnt contain a search anyway",a.query):void 0;delete(t=angular.copy(a.query)).$or}c.$broadcast("queryBuilder.change.replace",t),angular.isFunction(u.onRefresh)&&u.onRefresh({query:t}),"complete"!=u.binding&&!angular.isUndefined(u.binding)||(a.query=t)},a.check=function(){try{a.search=_.chain(a.query).get("$or").first().values().first().get("$regex").thru(function(t){return o.unescapeRegExp(t||"")}).value()}catch(t){a.search=""}},u.$onInit=function(){return a.check()}}],template:'\n\t\t<ng-transclude>\n\t\t\t<form ng-submit="submit()" class="form-inline">\n\t\t\t\t<div class="form-group">\n\t\t\t\t\t<div class="input-group">\n\t\t\t\t\t\t<input type="text" ng-model="search" class="form-control"/>\n\t\t\t\t\t\t<a ng-click="isSearching ? clear() : submit(false)" class="btn btn-default input-group-addon">\n\t\t\t\t\t\t\t<i ng-class="isSearching ? qbTableSettings.icons.searchClear : qbTableSettings.icons.search"/>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</ng-transclude>\n\t'}});
{
"name": "@momsfriendlydevco/angular-ui-query-builder",
"version": "1.3.4",
"version": "1.3.6",
"description": "MongoDB format query-builder UI component for Angular",

@@ -20,7 +20,7 @@ "main": "src/utilities.js",

"devDependencies": {
"@babel/core": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"babel-plugin-angularjs-annotate": "^0.9.0",
"chai": "^4.1.2",
"express": "^4.16.3",
"@babel/core": "^7.4.5",
"@babel/preset-env": "^7.4.5",
"babel-plugin-angularjs-annotate": "^0.10.0",
"chai": "^4.2.0",
"express": "^4.17.0",
"faker": "^4.1.0",

@@ -30,25 +30,25 @@ "font-awesome": "^4.7.0",

"gulp-babel": "^8.0.0",
"gulp-clean-css": "^3.10.0",
"gulp-clean-css": "^4.2.0",
"gulp-concat": "^2.6.1",
"gulp-file": "^0.4.0",
"gulp-gh-pages": "^0.5.4",
"gulp-nodemon": "^2.2.1",
"gulp-plumber": "^1.2.0",
"gulp-preprocess": "^3.0.1",
"gulp-nodemon": "^2.4.2",
"gulp-plumber": "^1.2.1",
"gulp-preprocess": "^3.0.2",
"gulp-rename": "^1.4.0",
"gulp-replace": "^1.0.0",
"gulp-uglify": "^3.0.1",
"gulp-uglify": "^3.0.2",
"gulp-util": "^3.0.8",
"gulp-watch": "^5.0.1",
"mocha": "^5.2.0",
"rimraf": "^2.6.2",
"sift": "^6.0.0"
"mocha": "^6.1.4",
"rimraf": "^2.6.3",
"sift": "^7.0.1"
},
"dependencies": {
"angular": "^1.7.4",
"bootstrap": "^3.3.7",
"jquery": "^3.3.1",
"angular": "^1.7.8",
"bootstrap": "^3.4.1",
"jquery": "^3.4.1",
"lodash": "^4.17.11",
"moment": "^2.22.2"
"moment": "^2.24.0"
}
}

@@ -260,2 +260,3 @@ angular-ui-query-builder

* [x] Indicator for 'No query - show all records'
* [x] Basic field filtering

@@ -262,0 +263,0 @@ * [ ] CSS tidyup

@@ -260,4 +260,10 @@ angular.module('angular-ui-query-builder',[])

<div class="ui-query-builder">
<div class="query-container">
<div ng-if="$ctrl.isEmpty">
<ui-query-builder-group
qb-group="$ctrl.emptyQueryLayout"
qb-spec="$ctrl.qbSpec"
></ui-query-builder-group>
</div>
<div ng-if="!$ctrl.isEmpty" class="query-container">
<ui-query-builder-group
qb-group="$ctrl.qbQuery"

@@ -317,3 +323,3 @@ qb-spec="$ctrl.qbSpec"

var existingItemIndex = $ctrl.qbQuery.findIndex(q => q.path == path);
if (!existingItemIndex) throw new Error(`Cannot find path "${path}" to swap with new path "${newPath}"`);
if (existingItemIndex < 0) throw new Error(`Cannot find path "${path}" to swap with new path "${newPath}"`);

@@ -336,12 +342,30 @@ $ctrl.qbQuery[existingItemIndex] = QueryBuilder.queryPathPrototype(newPath, undefined, $ctrl.qbSpec);

$scope.$on('queryBuilder.pathAction.add', (e, path) => {
// Append new path and set to blank
$ctrl.qbQuery.push({
path: '',
type: 'blank',
value: null,
fields: [],
});
if (!path) {
var existingItemIndex = $ctrl.qbQuery.findIndex(q => !q.path); // Adding an existing path somewhere already?
$timeout(()=> $scope.$broadcast('queryBuilder.focusPath', '')); // Tell the widget to try and focus itself
if (existingItemIndex) {
// Append new path and set to blank
$ctrl.qbQuery.push({
path: '',
type: 'blank',
value: null,
fields: [],
});
}
$timeout(()=> $scope.$broadcast('queryBuilder.focusPath', '')); // Tell the widget to try and focus itself
} else {
console.warn('Adding a path to a sub-node is not yet supported');
}
});
// Manage empty queries {{{
$ctrl.emptyQueryLayout = [{
type: 'alert',
title: 'No query specified',
}];
$ctrl.isEmpty;
$scope.$watchCollection('$ctrl.qbQuery', ()=> $ctrl.isEmpty = _.isEmpty($ctrl.qbQuery));
// }}}
},

@@ -615,2 +639,9 @@ })

<!-- }}} -->
<!-- Alert {{{ -->
<div ng-switch-when="alert" class="query-row">
<div class="query-block query-block-2">
<div class="btn btn-block btn-noclick" ng-bind="$ctrl.qbItem.title"></div>
</div>
</div>
<!-- }}} -->
<!-- Unknown {{{ -->

@@ -668,6 +699,3 @@ <div ng-switch-default class="query-row">

template: `
<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown">
{{$ctrl.selectedOption.title}}
<i class="fa fa-caret-down"></i>
</a>
<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown" ng-bind="$ctrl.selectedOption.title"></a>
<ul class="dropdown-menu pull-right">

@@ -731,6 +759,3 @@ <li ng-repeat="path in $ctrl.options track by path.path"><a ng-click="$ctrl.setSelected(path.path)">{{path.title}}</a></li>

template: `
<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown">
{{$ctrl.selectedOption.title}}
<i class="fa fa-caret-down"></i>
</a>
<a class="btn btn-block btn-{{$ctrl.level}} dropdown-toggle" data-toggle="dropdown" ng-bind="$ctrl.selectedOption.title"></a>
<ul class="dropdown-menu pull-right">

@@ -784,5 +809,4 @@ <li ng-repeat="option in $ctrl.options track by option.id"><a ng-click="$ctrl.setSelected(option)">{{option.title}}</a></li>

</span>
<i class="fa fa-caret-down"></i></a>
</a>
<ul class="dropdown-menu pull-right">
<ul class="dropdown-menu">
<li ng-repeat="option in $ctrl.options track by option.id">

@@ -789,0 +813,0 @@ <a ng-click="$ctrl.toggle(option)">

@@ -225,4 +225,2 @@ angular.module('angular-ui-query-builder')

// }}}
$element.addClass('qb-col');
},

@@ -691,3 +689,3 @@ link: function(scope, element, attrs, parentScope) {

restrict: 'A',
controller: function($element, $scope, qbTableSettings) {
controller: function($element, $scope, $rootScope, qbTableSettings) {
var $ctrl = this;

@@ -712,2 +710,5 @@

$element.find('.qb-modal').modal('hide');
// Inform the main query builder that we've changed something
$rootScope.$broadcast('queryBuilder.change.replace', $scope.query);
};

@@ -714,0 +715,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc