aboutsummaryrefslogtreecommitdiffstats
path: root/vnfmarket/common/thirdparty/angular-material-data-table/dist
diff options
context:
space:
mode:
Diffstat (limited to 'vnfmarket/common/thirdparty/angular-material-data-table/dist')
-rw-r--r--vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.css394
-rw-r--r--vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.js1486
-rw-r--r--vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.min.css1
-rw-r--r--vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.min.js1
4 files changed, 1882 insertions, 0 deletions
diff --git a/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.css b/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.css
new file mode 100644
index 00000000..b58df874
--- /dev/null
+++ b/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.css
@@ -0,0 +1,394 @@
+md-backdrop.md-edit-dialog-backdrop {
+ z-index: 80;
+}
+md-edit-dialog {
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ position: fixed;
+ z-index: 81;
+ background-color: #f9f9f9;
+ border-radius: 2px;
+ cursor: default;
+}
+md-edit-dialog > .md-content {
+ padding: 16px 24px 0;
+}
+md-edit-dialog > .md-content .md-title {
+ color: rgba(0, 0, 0, 0.87);
+ margin-bottom: 8px;
+}
+md-edit-dialog > .md-content md-input-container {
+ margin: 0;
+ font-size: 13px;
+}
+md-edit-dialog > .md-content md-input-container input {
+ float: none;
+}
+md-edit-dialog > .md-content md-input-container .md-errors-spacer {
+ min-height: auto;
+ min-width: auto;
+ color: rgba(0, 0, 0, 0.54);
+}
+md-edit-dialog > .md-content md-input-container .md-errors-spacer .md-char-counter {
+ padding: 5px 2px 5px 0;
+}
+md-edit-dialog > .md-content md-input-container [ng-message] {
+ padding: 5px 0 5px 2px;
+}
+md-edit-dialog > .md-actions {
+ margin: 0 16px 8px;
+}
+md-edit-dialog > .md-actions .md-button {
+ margin: 0;
+ min-width: initial;
+}
+md-edit-dialog > .md-actions .md-button + .md-button {
+ margin-left: 8px;
+}
+.md-table-pagination {
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-justify-content: flex-end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+ -webkit-flex-wrap: wrap-reverse;
+ -ms-flex-wrap: wrap-reverse;
+ flex-wrap: wrap-reverse;
+ box-sizing: border-box;
+ padding: 0 24px;
+ font-size: 12px;
+ color: rgba(0, 0, 0, 0.54);
+ border-top: 1px rgba(0, 0, 0, 0.12) solid;
+}
+.md-table-pagination md-select {
+ -webkit-justify-content: flex-end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+ min-width: 64px;
+}
+.md-table-pagination md-select:not([disabled]):focus .md-select-value {
+ color: rgba(0, 0, 0, 0.54);
+}
+.md-table-pagination md-select .md-select-value {
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+}
+.md-table-pagination md-select .md-select-value span.md-select-icon {
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ text-align: center;
+ margin-right: -6px !important;
+}
+.md-table-pagination md-select .md-select-value span.md-select-icon:after {
+ top: initial;
+ -webkit-transform: scaleY(0.5) scaleX(1);
+ transform: scaleY(0.5) scaleX(1);
+}
+.md-table-pagination > * {
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ height: 56px;
+}
+.md-table-pagination > .buttons:not(:first-child),
+.md-table-pagination > .limit-select:not(:first-child) {
+ margin-left: 32px;
+}
+.md-table-pagination > .buttons {
+ margin-right: -16px;
+}
+.md-table-pagination > .buttons > .md-button.md-icon-button {
+ margin: 0;
+}
+.md-table-pagination > .buttons > .label + .md-button.md-icon-button {
+ margin-left: 20px;
+}
+md-select.md-table-select {
+ margin: 0;
+}
+md-select.md-table-select > .md-select-value {
+ padding: 0;
+ min-width: 0;
+ min-height: 24px;
+ border-bottom: 0 !important;
+}
+md-select.md-table-select > .md-select-value > span {
+ display: block;
+ height: auto;
+ -webkit-transform: none !important;
+ transform: none !important;
+}
+md-select.md-table-select > .md-select-value > span > .md-text {
+ display: inherit;
+ height: inherit;
+ -webkit-transform: inherit;
+ transform: inherit;
+}
+md-select.md-table-select > .md-select-value > span.md-select-icon {
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ height: 24px;
+ margin: 0;
+}
+md-select.md-table-select > .md-select-value > span.md-select-icon:after {
+ top: initial;
+}
+.md-select-menu-container.md-table-select,
+.md-select-menu-container.md-pagination-select {
+ margin-left: -2px;
+ border-radius: 2px;
+}
+.md-select-menu-container.md-table-select md-select-menu,
+.md-select-menu-container.md-pagination-select md-select-menu,
+.md-select-menu-container.md-table-select md-content,
+.md-select-menu-container.md-pagination-select md-content {
+ border-radius: inherit;
+}
+.md-select-menu-container.md-table-select md-content,
+.md-select-menu-container.md-pagination-select md-content {
+ padding: 0;
+}
+.md-select-menu-container.md-table-select .md-text {
+ font-size: 13px;
+}
+.md-select-menu-container.md-pagination-select .md-text {
+ font-size: 12px;
+}
+md-toolbar.md-table-toolbar {
+ box-shadow: none;
+}
+md-toolbar.md-table-toolbar.md-default-theme:not(.md-menu-toolbar).md-default,
+md-toolbar.md-table-toolbar:not(.md-menu-toolbar).md-default {
+ background-color: #ffffff;
+ color: rgba(0, 0, 0, 0.87);
+}
+md-toolbar.md-table-toolbar.md-default-theme:not(.md-menu-toolbar).md-default .md-button,
+md-toolbar.md-table-toolbar:not(.md-menu-toolbar).md-default .md-button {
+ color: rgba(0, 0, 0, 0.87);
+}
+@media only screen and (max-width: 959px) and (min-width: 0) and (orientation: landscape) {
+ md-toolbar.md-table-toolbar .md-toolbar-tools {
+ height: 64px;
+ max-height: initial;
+ }
+}
+md-toolbar.md-table-toolbar .md-toolbar-tools {
+ padding: 0 24px;
+}
+md-toolbar.md-table-toolbar .md-toolbar-tools md-icon {
+ color: rgba(0, 0, 0, 0.54);
+}
+md-toolbar.md-table-toolbar .md-toolbar-tools > .md-button.md-icon-button {
+ margin: 0;
+}
+md-toolbar.md-table-toolbar .md-toolbar-tools > .md-button.md-icon-button:first-child {
+ margin-left: -12px;
+}
+md-toolbar.md-table-toolbar .md-toolbar-tools > .md-button.md-icon-button:last-child {
+ margin-right: -12px;
+}
+md-card > md-toolbar.md-table-toolbar:first-child,
+md-card > md-table-container:first-child {
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+md-card > md-toolbar.md-table-toolbar:last-child,
+md-card > md-table-container:last-child {
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+md-table-container {
+ display: block;
+ max-width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+table.md-table {
+ width: 100%;
+ border-spacing: 0;
+ overflow: hidden;
+}
+table.md-table thead.md-head > tr.md-row {
+ height: 56px;
+}
+table.md-table tbody.md-body > tr.md-row,
+table.md-table tfoot.md-foot > tr.md-row {
+ height: 48px;
+}
+table.md-table thead.md-head + .md-table-progress md-progress-linear {
+ top: -3px;
+}
+table.md-table .md-table-progress th {
+ padding: 0;
+}
+table.md-table .md-table-progress th md-progress-linear {
+ height: 0;
+ transition: opacity 1s;
+}
+table.md-table .md-table-progress th md-progress-linear.ng-hide {
+ opacity: 0;
+}
+table.md-table .md-table-progress th md-progress-linear > .md-container {
+ height: 3px;
+ top: 0;
+ transition: none;
+}
+table.md-table .md-table-progress th md-progress-linear > .md-container > .md-bar {
+ height: 3px;
+}
+table.md-table th.md-column {
+ color: rgba(0, 0, 0, 0.54);
+ font-size: 12px;
+ font-weight: bold;
+ white-space: nowrap;
+}
+table.md-table th.md-column.md-sort {
+ cursor: pointer;
+}
+table.md-table th.md-column md-icon {
+ height: 16px;
+ width: 16px;
+ font-size: 16px !important;
+ line-height: 16px !important;
+}
+table.md-table th.md-column md-icon.md-sort-icon {
+ color: rgba(0, 0, 0, 0.26);
+ opacity: 0;
+ transition: -webkit-transform 0.25s, opacity 0.25s;
+ transition: transform 0.25s, opacity 0.25s;
+}
+table.md-table th.md-column md-icon.md-sort-icon.md-asc {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+}
+table.md-table th.md-column md-icon.md-sort-icon.md-desc {
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+table.md-table th.md-column md-icon:not(:first-child) {
+ margin-left: 8px;
+}
+table.md-table th.md-column md-icon:not(:last-child) {
+ margin-right: 8px;
+}
+table.md-table th.md-column.md-active,
+table.md-table th.md-column.md-active md-icon {
+ color: rgba(0, 0, 0, 0.87);
+}
+table.md-table th.md-column:hover md-icon.md-sort-icon,
+table.md-table th.md-column.md-active md-icon.md-sort-icon {
+ opacity: 1;
+}
+table.md-table tr.md-row[ng\:repeat].ng-leave,
+table.md-table tr.md-row[ng-repeat].ng-leave,
+table.md-table tr.md-row[x-ng-repeat].ng-leave,
+table.md-table tr.md-row[data-ng-repeat].ng-leave {
+ display: none;
+}
+table.md-table.md-row-select tbody.md-body > tr.md-row {
+ transition: background-color 0.2s;
+}
+table.md-table.md-row-select tbody.md-body > tr.md-row:not([disabled]):hover {
+ background-color: #eeeeee !important;
+}
+table.md-table.md-row-select tbody.md-body > tr.md-row.md-selected {
+ background-color: #f5f5f5;
+}
+table.md-table.md-row-select td.md-cell:first-child,
+table.md-table.md-row-select th.md-column:first-child {
+ width: 20px;
+ padding: 0 0 0 24px;
+}
+table.md-table.md-row-select td.md-cell:nth-child(2),
+table.md-table.md-row-select th.md-column:nth-child(2) {
+ padding: 0 24px;
+}
+table.md-table.md-row-select td.md-cell:nth-child(n+3):nth-last-child(n+2),
+table.md-table.md-row-select th.md-column:nth-child(n+3):nth-last-child(n+2) {
+ padding: 0 56px 0 0;
+}
+table.md-table:not(.md-row-select) td.md-cell:first-child,
+table.md-table:not(.md-row-select) th.md-column:first-child {
+ padding: 0 24px;
+}
+table.md-table:not(.md-row-select) td.md-cell:nth-child(n+2):nth-last-child(n+2),
+table.md-table:not(.md-row-select) th.md-column:nth-child(n+2):nth-last-child(n+2) {
+ padding: 0 56px 0 0;
+}
+table.md-table td.md-cell,
+table.md-table th.md-column {
+ vertical-align: middle;
+ text-align: left;
+}
+table.md-table td.md-cell > *,
+table.md-table th.md-column > * {
+ vertical-align: middle;
+}
+table.md-table td.md-cell:last-child,
+table.md-table th.md-column:last-child {
+ padding: 0 24px 0 0;
+}
+table.md-table td.md-cell.md-clickable,
+table.md-table th.md-column.md-clickable {
+ cursor: pointer;
+}
+table.md-table td.md-cell.md-clickable:focus,
+table.md-table th.md-column.md-clickable:focus {
+ outline: none;
+}
+table.md-table td.md-cell.md-numeric,
+table.md-table th.md-column.md-numeric {
+ text-align: right;
+}
+table.md-table td.md-cell md-checkbox,
+table.md-table th.md-column md-checkbox {
+ margin: 0;
+ width: 20px;
+}
+table.md-table td.md-cell {
+ color: rgba(0, 0, 0, 0.87);
+ font-size: 13px;
+ border-top: 1px rgba(0, 0, 0, 0.12) solid;
+}
+table.md-table td.md-cell.md-numeric md-select {
+ -webkit-justify-content: flex-end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+}
+table.md-table td.md-cell.md-numeric md-select .md-select-value {
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+}
+table.md-table td.md-cell.md-placeholder {
+ color: rgba(0, 0, 0, 0.26);
+}
+table.md-table td.md-cell md-select > .md-select-value > span.md-select-icon {
+ -webkit-justify-content: flex-end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+ color: rgba(0, 0, 0, 0.54);
+ width: 18px;
+ text-align: right;
+}
+table.md-table td.md-cell md-select > .md-select-value > span.md-select-icon:after {
+ -webkit-transform: scaleY(0.4) scaleX(0.8);
+ transform: scaleY(0.4) scaleX(0.8);
+}
diff --git a/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.js b/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.js
new file mode 100644
index 00000000..8372a777
--- /dev/null
+++ b/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.js
@@ -0,0 +1,1486 @@
+/*
+ * Angular Material Data Table
+ * https://github.com/daniel-nagy/md-data-table
+ * @license MIT
+ * v0.10.9
+ */
+(function (window, angular, undefined) {
+'use strict';
+
+angular.module('md.table.templates', ['md-table-pagination.html', 'md-table-progress.html', 'arrow-up.svg', 'navigate-before.svg', 'navigate-first.svg', 'navigate-last.svg', 'navigate-next.svg']);
+
+angular.module('md-table-pagination.html', []).run(['$templateCache', function($templateCache) {
+ $templateCache.put('md-table-pagination.html',
+ '<div class="page-select" ng-if="$pagination.showPageSelect()">\n' +
+ ' <div class="label">{{$pagination.label.page}}</div>\n' +
+ '\n' +
+ ' <md-select virtual-page-select total="{{$pagination.pages()}}" class="md-table-select" ng-model="$pagination.page" md-container-class="md-pagination-select" ng-change="$pagination.onPaginationChange()" ng-disabled="$pagination.disabled" aria-label="Page">\n' +
+ ' <md-content>\n' +
+ ' <md-option ng-repeat="page in $pageSelect.pages" ng-value="page">{{page}}</md-option>\n' +
+ ' </md-content>\n' +
+ ' </md-select>\n' +
+ '</div>\n' +
+ '\n' +
+ '<div class="limit-select" ng-if="$pagination.limitOptions">\n' +
+ ' <div class="label">{{$pagination.label.rowsPerPage}}</div>\n' +
+ '\n' +
+ ' <md-select class="md-table-select" ng-model="$pagination.limit" md-container-class="md-pagination-select" ng-disabled="$pagination.disabled" aria-label="Rows" placeholder="{{ $pagination.limitOptions[0] }}">\n' +
+ ' <md-option ng-repeat="option in $pagination.limitOptions" ng-value="option.value ? $pagination.eval(option.value) : option">{{::option.label ? option.label : option}}</md-option>\n' +
+ ' </md-select>\n' +
+ '</div>\n' +
+ '\n' +
+ '<div class="buttons">\n' +
+ ' <div class="label">{{$pagination.min()}} - {{$pagination.max()}} {{$pagination.label.of}} {{$pagination.total}}</div>\n' +
+ '\n' +
+ ' <md-button class="md-icon-button" type="button" ng-if="$pagination.showBoundaryLinks()" ng-click="$pagination.first()" ng-disabled="$pagination.disabled || !$pagination.hasPrevious()" aria-label="First">\n' +
+ ' <md-icon md-svg-icon="navigate-first.svg"></md-icon>\n' +
+ ' </md-button>\n' +
+ '\n' +
+ ' <md-button class="md-icon-button" type="button" ng-click="$pagination.previous()" ng-disabled="$pagination.disabled || !$pagination.hasPrevious()" aria-label="Previous">\n' +
+ ' <md-icon md-svg-icon="navigate-before.svg"></md-icon>\n' +
+ ' </md-button>\n' +
+ '\n' +
+ ' <md-button class="md-icon-button" type="button" ng-click="$pagination.next()" ng-disabled="$pagination.disabled || !$pagination.hasNext()" aria-label="Next">\n' +
+ ' <md-icon md-svg-icon="navigate-next.svg"></md-icon>\n' +
+ ' </md-button>\n' +
+ '\n' +
+ ' <md-button class="md-icon-button" type="button" ng-if="$pagination.showBoundaryLinks()" ng-click="$pagination.last()" ng-disabled="$pagination.disabled || !$pagination.hasNext()" aria-label="Last">\n' +
+ ' <md-icon md-svg-icon="navigate-last.svg"></md-icon>\n' +
+ ' </md-button>\n' +
+ '</div>');
+}]);
+
+angular.module('md-table-progress.html', []).run(['$templateCache', function($templateCache) {
+ $templateCache.put('md-table-progress.html',
+ '<tr>\n' +
+ ' <th colspan="{{columnCount()}}">\n' +
+ ' <md-progress-linear ng-show="deferred()" md-mode="indeterminate"></md-progress-linear>\n' +
+ ' </th>\n' +
+ '</tr>');
+}]);
+
+angular.module('arrow-up.svg', []).run(['$templateCache', function($templateCache) {
+ $templateCache.put('arrow-up.svg',
+ '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z"/></svg>');
+}]);
+
+angular.module('navigate-before.svg', []).run(['$templateCache', function($templateCache) {
+ $templateCache.put('navigate-before.svg',
+ '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></svg>');
+}]);
+
+angular.module('navigate-first.svg', []).run(['$templateCache', function($templateCache) {
+ $templateCache.put('navigate-first.svg',
+ '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M7 6 v12 h2 v-12 h-2z M17.41 7.41L16 6l-6 6 6 6 1.41-1.41L12.83 12z"/></svg>');
+}]);
+
+angular.module('navigate-last.svg', []).run(['$templateCache', function($templateCache) {
+ $templateCache.put('navigate-last.svg',
+ '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M15 6 v12 h2 v-12 h-2z M8 6L6.59 7.41 11.17 12l-4.58 4.59L8 18l6-6z"/></svg>');
+}]);
+
+angular.module('navigate-next.svg', []).run(['$templateCache', function($templateCache) {
+ $templateCache.put('navigate-next.svg',
+ '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg>');
+}]);
+
+
+angular.module('md.data.table', ['md.table.templates']);
+
+angular.module('md.data.table').directive('mdBody', mdBody);
+
+function mdBody() {
+
+ function compile(tElement) {
+ tElement.addClass('md-body');
+ }
+
+ return {
+ compile: compile,
+ restrict: 'A'
+ };
+}
+
+angular.module('md.data.table').directive('mdCell', mdCell);
+
+function mdCell() {
+
+ function compile(tElement) {
+ var select = tElement.find('md-select');
+
+ if(select.length) {
+ select.addClass('md-table-select').attr('md-container-class', 'md-table-select');
+ }
+
+ tElement.addClass('md-cell');
+
+ return postLink;
+ }
+
+ // empty controller to be bind properties to in postLink function
+ function Controller() {
+
+ }
+
+ function postLink(scope, element, attrs, ctrls) {
+ var select = element.find('md-select');
+ var cellCtrl = ctrls.shift();
+ var tableCtrl = ctrls.shift();
+
+ if(attrs.ngClick) {
+ element.addClass('md-clickable');
+ }
+
+ if(select.length) {
+ select.on('click', function (event) {
+ event.stopPropagation();
+ });
+
+ element.addClass('md-clickable').on('click', function (event) {
+ event.stopPropagation();
+ select[0].click();
+ });
+ }
+
+ cellCtrl.getTable = tableCtrl.getElement;
+
+ function getColumn() {
+ return tableCtrl.$$columns[getIndex()];
+ }
+
+ function getIndex() {
+ return Array.prototype.indexOf.call(element.parent().children(), element[0]);
+ }
+
+ scope.$watch(getColumn, function (column) {
+ if(!column) {
+ return;
+ }
+
+ if(column.numeric) {
+ element.addClass('md-numeric');
+ } else {
+ element.removeClass('md-numeric');
+ }
+ });
+ }
+
+ return {
+ controller: Controller,
+ compile: compile,
+ require: ['mdCell', '^^mdTable'],
+ restrict: 'A'
+ };
+}
+
+angular.module('md.data.table').directive('mdColumn', mdColumn);
+
+function mdColumn($compile, $mdUtil) {
+
+ function compile(tElement) {
+ tElement.addClass('md-column');
+ return postLink;
+ }
+
+ function postLink(scope, element, attrs, ctrls) {
+ var headCtrl = ctrls.shift();
+ var tableCtrl = ctrls.shift();
+
+ function attachSortIcon() {
+ var sortIcon = angular.element('<md-icon md-svg-icon="arrow-up.svg">');
+
+ $compile(sortIcon.addClass('md-sort-icon').attr('ng-class', 'getDirection()'))(scope);
+
+ if(element.hasClass('md-numeric')) {
+ element.prepend(sortIcon);
+ } else {
+ element.append(sortIcon);
+ }
+ }
+
+ function detachSortIcon() {
+ Array.prototype.some.call(element.find('md-icon'), function (icon) {
+ return icon.classList.contains('md-sort-icon') && element[0].removeChild(icon);
+ });
+ }
+
+ function disableSorting() {
+ detachSortIcon();
+ element.removeClass('md-sort').off('click', setOrder);
+ }
+
+ function enableSorting() {
+ attachSortIcon();
+ element.addClass('md-sort').on('click', setOrder);
+ }
+
+ function getIndex() {
+ return Array.prototype.indexOf.call(element.parent().children(), element[0]);
+ }
+
+ function isActive() {
+ return scope.orderBy && (headCtrl.order === scope.orderBy || headCtrl.order === '-' + scope.orderBy);
+ }
+
+ function isNumeric() {
+ return attrs.mdNumeric === '' || scope.numeric;
+ }
+
+ function setOrder() {
+ scope.$applyAsync(function () {
+ if(isActive()) {
+ headCtrl.order = scope.getDirection() === 'md-asc' ? '-' + scope.orderBy : scope.orderBy;
+ } else {
+ headCtrl.order = scope.getDirection() === 'md-asc' ? scope.orderBy : '-' + scope.orderBy;
+ }
+
+ if(angular.isFunction(headCtrl.onReorder)) {
+ $mdUtil.nextTick(function () {
+ headCtrl.onReorder(headCtrl.order);
+ });
+ }
+ });
+ }
+
+ function updateColumn(index, column) {
+ tableCtrl.$$columns[index] = column;
+
+ if(column.numeric) {
+ element.addClass('md-numeric');
+ } else {
+ element.removeClass('md-numeric');
+ }
+ }
+
+ scope.getDirection = function () {
+ if(isActive()) {
+ return headCtrl.order.charAt(0) === '-' ? 'md-desc' : 'md-asc';
+ }
+
+ return attrs.mdDesc === '' || scope.$eval(attrs.mdDesc) ? 'md-desc' : 'md-asc';
+ };
+
+ scope.$watch(isActive, function (active) {
+ if(active) {
+ element.addClass('md-active');
+ } else {
+ element.removeClass('md-active');
+ }
+ });
+
+ scope.$watch(getIndex, function (index) {
+ updateColumn(index, {'numeric': isNumeric()});
+ });
+
+ scope.$watch(isNumeric, function (numeric) {
+ updateColumn(getIndex(), {'numeric': numeric});
+ });
+
+ scope.$watch('orderBy', function (orderBy) {
+ if(orderBy) {
+ if(!element.hasClass('md-sort')) {
+ enableSorting();
+ }
+ } else if(element.hasClass('md-sort')) {
+ disableSorting();
+ }
+ });
+ }
+
+ return {
+ compile: compile,
+ require: ['^^mdHead', '^^mdTable'],
+ restrict: 'A',
+ scope: {
+ numeric: '=?mdNumeric',
+ orderBy: '@?mdOrderBy'
+ }
+ };
+}
+
+mdColumn.$inject = ['$compile', '$mdUtil'];
+
+angular.module('md.data.table')
+ .decorator('$controller', controllerDecorator)
+ .factory('$mdEditDialog', mdEditDialog);
+
+/*
+ * A decorator for ng.$controller to optionally bind properties to the
+ * controller before invoking the constructor. Stolen from the ngMock.
+ *
+ * https://docs.angularjs.org/api/ngMock/service/$controller
+ */
+function controllerDecorator($delegate) {
+ return function(expression, locals, later, ident) {
+ if(later && typeof later === 'object') {
+ var create = $delegate(expression, locals, true, ident);
+ angular.extend(create.instance, later);
+ return create();
+ }
+ return $delegate(expression, locals, later, ident);
+ };
+}
+
+controllerDecorator.$inject = ['$delegate'];
+
+function mdEditDialog($compile, $controller, $document, $mdUtil, $q, $rootScope, $templateCache, $templateRequest, $window) {
+ /* jshint validthis: true */
+
+ var ESCAPE = 27;
+
+ var busy = false;
+ var body = angular.element($document.prop('body'));
+
+ /*
+ * bindToController
+ * controller
+ * controllerAs
+ * locals
+ * resolve
+ * scope
+ * targetEvent
+ * template
+ * templateUrl
+ */
+ var defaultOptions = {
+ clickOutsideToClose: true,
+ disableScroll: true,
+ escToClose: true,
+ focusOnOpen: true
+ };
+
+ function build(template, options) {
+ var scope = $rootScope.$new();
+ var element = $compile(template)(scope);
+ var backdrop = $mdUtil.createBackdrop(scope, 'md-edit-dialog-backdrop');
+ var controller;
+
+ if(options.controller) {
+ controller = getController(options, scope, {$element: element, $scope: scope});
+ } else {
+ angular.extend(scope, options.scope);
+ }
+
+ if(options.disableScroll) {
+ disableScroll(element);
+ }
+
+ body.prepend(backdrop).append(element.addClass('md-whiteframe-1dp'));
+
+ positionDialog(element, options.target);
+
+ if(options.focusOnOpen) {
+ focusOnOpen(element);
+ }
+
+ if(options.clickOutsideToClose) {
+ backdrop.on('click', function () {
+ element.remove();
+ });
+ }
+
+ if(options.escToClose) {
+ escToClose(element);
+ }
+
+ element.on('$destroy', function () {
+ busy = false;
+ backdrop.remove();
+ });
+
+ return controller;
+ }
+
+ function disableScroll(element) {
+ var restoreScroll = $mdUtil.disableScrollAround(element, body);
+
+ element.on('$destroy', function () {
+ restoreScroll();
+ });
+ }
+
+ function getController(options, scope, inject) {
+ if(!options.controller) {
+ return;
+ }
+
+ if(options.resolve) {
+ angular.extend(inject, options.resolve);
+ }
+
+ if(options.locals) {
+ angular.extend(inject, options.locals);
+ }
+
+ if(options.controllerAs) {
+ scope[options.controllerAs] = {};
+
+ if(options.bindToController) {
+ angular.extend(scope[options.controllerAs], options.scope);
+ } else {
+ angular.extend(scope, options.scope);
+ }
+ } else {
+ angular.extend(scope, options.scope);
+ }
+
+ if(options.bindToController) {
+ return $controller(options.controller, inject, scope[options.controllerAs]);
+ } else {
+ return $controller(options.controller, inject);
+ }
+ }
+
+ function getTemplate(options) {
+ return $q(function (resolve, reject) {
+ var template = options.template;
+
+ function illegalType(type) {
+ reject('Unexpected template value. Expected a string; received a ' + type + '.');
+ }
+
+ if(template) {
+ return angular.isString(template) ? resolve(template) : illegalType(typeof template);
+ }
+
+ if(options.templateUrl) {
+ template = $templateCache.get(options.templateUrl);
+
+ if(template) {
+ return resolve(template);
+ }
+
+ var success = function (template) {
+ return resolve(template);
+ };
+
+ var error = function () {
+ return reject('Error retrieving template from URL.');
+ };
+
+ return $templateRequest(options.templateUrl).then(success, error);
+ }
+
+ reject('Template not provided.');
+ });
+ }
+
+ function logError(error) {
+ busy = false;
+ console.error(error);
+ }
+
+ function escToClose(element) {
+ var keyup = function (event) {
+ if(event.keyCode === ESCAPE) {
+ element.remove();
+ }
+ };
+
+ body.on('keyup', keyup);
+
+ element.on('$destroy', function () {
+ body.off('keyup', keyup);
+ });
+ }
+
+ function focusOnOpen(element) {
+ $mdUtil.nextTick(function () {
+ var autofocus = $mdUtil.findFocusTarget(element);
+
+ if(autofocus) {
+ autofocus.focus();
+ }
+ }, false);
+ }
+
+ function positionDialog(element, target) {
+ var table = angular.element(target).controller('mdCell').getTable();
+
+ var getHeight = function () {
+ return element.prop('clientHeight');
+ };
+
+ var getSize = function () {
+ return {
+ width: getWidth(),
+ height: getHeight()
+ };
+ };
+
+ var getTableBounds = function () {
+ var parent = table.parent();
+
+ if(parent.prop('tagName') === 'MD-TABLE-CONTAINER') {
+ return parent[0].getBoundingClientRect();
+ } else {
+ return table[0].getBoundingClientRect();
+ }
+ };
+
+ var getWidth = function () {
+ return element.prop('clientWidth');
+ };
+
+ var reposition = function () {
+ var size = getSize();
+ var cellBounds = target.getBoundingClientRect();
+ var tableBounds = getTableBounds();
+
+ if(size.width > tableBounds.right - cellBounds.left) {
+ element.css('left', tableBounds.right - size.width + 'px');
+ } else {
+ element.css('left', cellBounds.left + 'px');
+ }
+
+ if(size.height > tableBounds.bottom - cellBounds.top) {
+ element.css('top', tableBounds.bottom - size.height + 'px');
+ } else {
+ element.css('top', cellBounds.top + 1 + 'px');
+ }
+
+ element.css('minWidth', cellBounds.width + 'px');
+ };
+
+ var watchWidth = $rootScope.$watch(getWidth, reposition);
+ var watchHeight = $rootScope.$watch(getHeight, reposition);
+
+ $window.addEventListener('resize', reposition);
+
+ element.on('$destroy', function () {
+ watchWidth();
+ watchHeight();
+
+ $window.removeEventListener('resize', reposition);
+ });
+ }
+
+ function preset(size, options) {
+
+ function getAttrs() {
+ var attrs = 'type="' + (options.type || 'text') + '"';
+
+ for(var attr in options.validators) {
+ attrs += ' ' + attr + '="' + options.validators[attr] + '"';
+ }
+
+ return attrs;
+ }
+
+ return {
+ controller: ['$element', '$q', 'save', '$scope', function ($element, $q, save, $scope) {
+ function update() {
+ if($scope.editDialog.$invalid) {
+ return $q.reject();
+ }
+
+ if(angular.isFunction(save)) {
+ return $q.when(save($scope.editDialog.input));
+ }
+
+ return $q.resolve();
+ }
+
+ this.dismiss = function () {
+ $element.remove();
+ };
+
+ this.getInput = function () {
+ return $scope.editDialog.input;
+ };
+
+ $scope.dismiss = this.dismiss;
+
+ $scope.submit = function () {
+ update().then(function () {
+ $scope.dismiss();
+ });
+ };
+ }],
+ locals: {
+ save: options.save
+ },
+ scope: {
+ cancel: options.cancel || 'Cancel',
+ messages: options.messages,
+ model: options.modelValue,
+ ok: options.ok || 'Save',
+ placeholder: options.placeholder,
+ title: options.title,
+ size: size
+ },
+ template:
+ '<md-edit-dialog>' +
+ '<div layout="column" class="md-content">' +
+ '<div ng-if="size === \'large\'" class="md-title">{{title || \'Edit\'}}</div>' +
+ '<form name="editDialog" layout="column" ng-submit="submit(model)">' +
+ '<md-input-container md-no-float>' +
+ '<input name="input" ng-model="model" md-autofocus placeholder="{{placeholder}} "' + getAttrs() + '>' +
+ '<div ng-messages="editDialog.input.$error">' +
+ '<div ng-repeat="(key, message) in messages" ng-message="{{key}}">{{message}}</div>' +
+ '</div>' +
+ '</md-input-container>' +
+ '</form>' +
+ '</div>' +
+ '<div ng-if="size === \'large\'" layout="row" layout-align="end" class="md-actions">' +
+ '<md-button class="md-primary" ng-click="dismiss()">{{cancel}}</md-button>' +
+ '<md-button class="md-primary" ng-click="submit()">{{ok}}</md-button>' +
+ '</div>' +
+ '</md-edit-dialog>'
+ };
+ }
+
+ this.show = function (options) {
+ if(busy) {
+ return $q.reject();
+ }
+
+ busy = true;
+ options = angular.extend({}, defaultOptions, options);
+
+ if(!options.targetEvent) {
+ return logError('options.targetEvent is required to align the dialog with the table cell.');
+ }
+
+ if(!options.targetEvent.currentTarget.classList.contains('md-cell')) {
+ return logError('The event target must be a table cell.');
+ }
+
+ if(options.bindToController && !options.controllerAs) {
+ return logError('You must define options.controllerAs when options.bindToController is true.');
+ }
+
+ options.target = options.targetEvent.currentTarget;
+
+ var promise = getTemplate(options);
+ var promises = [promise];
+
+ for(var prop in options.resolve) {
+ promise = options.resolve[prop];
+ promises.push($q.when(angular.isFunction(promise) ? promise() : promise));
+ }
+
+ promise = $q.all(promises);
+
+ promise['catch'](logError);
+
+ return promise.then(function (results) {
+ var template = results.shift();
+
+ for(var prop in options.resolve) {
+ options.resolve[prop] = results.shift();
+ }
+
+ return build(template, options);
+ });
+ };
+
+ this.small = function (options) {
+ return this.show(angular.extend({}, options, preset('small', options)));
+ }.bind(this);
+
+ this.large = function (options) {
+ return this.show(angular.extend({}, options, preset('large', options)));
+ }.bind(this);
+
+ return this;
+}
+
+mdEditDialog.$inject = ['$compile', '$controller', '$document', '$mdUtil', '$q', '$rootScope', '$templateCache', '$templateRequest', '$window'];
+
+
+angular.module('md.data.table').directive('mdFoot', mdFoot);
+
+function mdFoot() {
+
+ function compile(tElement) {
+ tElement.addClass('md-foot');
+ }
+
+ return {
+ compile: compile,
+ restrict: 'A'
+ };
+}
+
+angular.module('md.data.table').directive('mdHead', mdHead);
+
+function mdHead($compile) {
+
+ function compile(tElement) {
+ tElement.addClass('md-head');
+ return postLink;
+ }
+
+ // empty controller to be bind scope properties to
+ function Controller() {
+
+ }
+
+ function postLink(scope, element, attrs, tableCtrl) {
+ // because scope.$watch is unpredictable
+ var oldValue = new Array(2);
+
+ function addCheckboxColumn() {
+ element.children().prepend('<th class="md-column md-checkbox-column">');
+ }
+
+ function attatchCheckbox() {
+ element.prop('lastElementChild').firstElementChild.appendChild($compile(createCheckBox())(scope)[0]);
+ }
+
+ function createCheckBox() {
+ return angular.element('<md-checkbox>').attr({
+ 'aria-label': 'Select All',
+ 'ng-click': 'toggleAll()',
+ 'ng-checked': 'allSelected()',
+ 'ng-disabled': '!getSelectableRows().length'
+ });
+ }
+
+ function detachCheckbox() {
+ var cell = element.prop('lastElementChild').firstElementChild;
+
+ if(cell.classList.contains('md-checkbox-column')) {
+ angular.element(cell).empty();
+ }
+ }
+
+ function enableRowSelection() {
+ return tableCtrl.$$rowSelect;
+ }
+
+ function mdSelectCtrl(row) {
+ return angular.element(row).controller('mdSelect');
+ }
+
+ function removeCheckboxColumn() {
+ Array.prototype.some.call(element.find('th'), function (cell) {
+ return cell.classList.contains('md-checkbox-column') && cell.remove();
+ });
+ }
+
+ scope.allSelected = function () {
+ var rows = scope.getSelectableRows();
+
+ return rows.length && rows.every(function (row) {
+ return row.isSelected();
+ });
+ };
+
+ scope.getSelectableRows = function () {
+ return tableCtrl.getBodyRows().map(mdSelectCtrl).filter(function (ctrl) {
+ return ctrl && !ctrl.disabled;
+ });
+ };
+
+ scope.selectAll = function () {
+ tableCtrl.getBodyRows().map(mdSelectCtrl).forEach(function (ctrl) {
+ if(ctrl && !ctrl.isSelected()) {
+ ctrl.select();
+ }
+ });
+ };
+
+ scope.toggleAll = function () {
+ return scope.allSelected() ? scope.unSelectAll() : scope.selectAll();
+ };
+
+ scope.unSelectAll = function () {
+ tableCtrl.getBodyRows().map(mdSelectCtrl).forEach(function (ctrl) {
+ if(ctrl && ctrl.isSelected()) {
+ ctrl.deselect();
+ }
+ });
+ };
+
+ scope.$watchGroup([enableRowSelection, tableCtrl.enableMultiSelect], function (newValue) {
+ if(newValue[0] !== oldValue[0]) {
+ if(newValue[0]) {
+ addCheckboxColumn();
+
+ if(newValue[1]) {
+ attatchCheckbox();
+ }
+ } else {
+ removeCheckboxColumn();
+ }
+ } else if(newValue[0] && newValue[1] !== oldValue[1]) {
+ if(newValue[1]) {
+ attatchCheckbox();
+ } else {
+ detachCheckbox();
+ }
+ }
+
+ angular.copy(newValue, oldValue);
+ });
+ }
+
+ return {
+ bindToController: true,
+ compile: compile,
+ controller: Controller,
+ controllerAs: '$mdHead',
+ require: '^^mdTable',
+ restrict: 'A',
+ scope: {
+ order: '=?mdOrder',
+ onReorder: '=?mdOnReorder'
+ }
+ };
+}
+
+mdHead.$inject = ['$compile'];
+
+angular.module('md.data.table').directive('mdRow', mdRow);
+
+function mdRow() {
+
+ function compile(tElement) {
+ tElement.addClass('md-row');
+ return postLink;
+ }
+
+ function postLink(scope, element, attrs, tableCtrl) {
+ function enableRowSelection() {
+ return tableCtrl.$$rowSelect;
+ }
+
+ function isBodyRow() {
+ return tableCtrl.getBodyRows().indexOf(element[0]) !== -1;
+ }
+
+ function isChild(node) {
+ return element[0].contains(node[0]);
+ }
+
+ if(isBodyRow()) {
+ var cell = angular.element('<td class="md-cell">');
+
+ scope.$watch(enableRowSelection, function (enable) {
+ // if a row is not selectable, prepend an empty cell to it
+ if(enable && !attrs.mdSelect) {
+ if(!isChild(cell)) {
+ element.prepend(cell);
+ }
+ return;
+ }
+
+ if(isChild(cell)) {
+ cell.remove();
+ }
+ });
+ }
+ }
+
+ return {
+ compile: compile,
+ require: '^^mdTable',
+ restrict: 'A'
+ };
+}
+
+angular.module('md.data.table').directive('mdSelect', mdSelect);
+
+function mdSelect($compile, $parse) {
+
+ // empty controller to bind scope properties to
+ function Controller() {
+
+ }
+
+ function postLink(scope, element, attrs, ctrls) {
+ var self = ctrls.shift();
+ var tableCtrl = ctrls.shift();
+ var getId = $parse(attrs.mdSelectId);
+
+ self.id = getId(self.model);
+
+ if(tableCtrl.$$rowSelect && self.id) {
+ if(tableCtrl.$$hash.has(self.id)) {
+ var index = tableCtrl.selected.indexOf(tableCtrl.$$hash.get(self.id));
+
+ // if the item is no longer selected remove it
+ if(index === -1) {
+ tableCtrl.$$hash.purge(self.id);
+ }
+
+ // if the item is not a reference to the current model update the reference
+ else if(!tableCtrl.$$hash.equals(self.id, self.model)) {
+ tableCtrl.$$hash.update(self.id, self.model);
+ tableCtrl.selected.splice(index, 1, self.model);
+ }
+
+ } else {
+
+ // check if the item has been selected
+ tableCtrl.selected.some(function (item, index) {
+ if(getId(item) === self.id) {
+ tableCtrl.$$hash.update(self.id, self.model);
+ tableCtrl.selected.splice(index, 1, self.model);
+
+ return true;
+ }
+ });
+ }
+ }
+
+ self.isSelected = function () {
+ if(!tableCtrl.$$rowSelect) {
+ return false;
+ }
+
+ if(self.id) {
+ return tableCtrl.$$hash.has(self.id);
+ }
+
+ return tableCtrl.selected.indexOf(self.model) !== -1;
+ };
+
+ self.select = function () {
+ if(self.disabled) {
+ return;
+ }
+
+ if(tableCtrl.enableMultiSelect()) {
+ tableCtrl.selected.push(self.model);
+ } else {
+ tableCtrl.selected.splice(0, tableCtrl.selected.length, self.model);
+ }
+
+ if(angular.isFunction(self.onSelect)) {
+ self.onSelect(self.model);
+ }
+ };
+
+ self.deselect = function () {
+ if(self.disabled) {
+ return;
+ }
+
+ tableCtrl.selected.splice(tableCtrl.selected.indexOf(self.model), 1);
+
+ if(angular.isFunction(self.onDeselect)) {
+ self.onDeselect(self.model);
+ }
+ };
+
+ self.toggle = function (event) {
+ if(event && event.stopPropagation) {
+ event.stopPropagation();
+ }
+
+ return self.isSelected() ? self.deselect() : self.select();
+ };
+
+ function autoSelect() {
+ return attrs.mdAutoSelect === '' || self.autoSelect;
+ }
+
+ function createCheckbox() {
+ var checkbox = angular.element('<md-checkbox>').attr({
+ 'aria-label': 'Select Row',
+ 'ng-click': '$mdSelect.toggle($event)',
+ 'ng-checked': '$mdSelect.isSelected()',
+ 'ng-disabled': '$mdSelect.disabled'
+ });
+
+ return angular.element('<td class="md-cell md-checkbox-cell">').append($compile(checkbox)(scope));
+ }
+
+ function disableSelection() {
+ Array.prototype.some.call(element.children(), function (child) {
+ return child.classList.contains('md-checkbox-cell') && element[0].removeChild(child);
+ });
+
+ if(autoSelect()) {
+ element.off('click', toggle);
+ }
+ }
+
+ function enableSelection() {
+ element.prepend(createCheckbox());
+
+ if(autoSelect()) {
+ element.on('click', toggle);
+ }
+ }
+
+ function enableRowSelection() {
+ return tableCtrl.$$rowSelect;
+ }
+
+ function onSelectChange(selected) {
+ if(!self.id) {
+ return;
+ }
+
+ if(tableCtrl.$$hash.has(self.id)) {
+ // check if the item has been deselected
+ if(selected.indexOf(tableCtrl.$$hash.get(self.id)) === -1) {
+ tableCtrl.$$hash.purge(self.id);
+ }
+
+ return;
+ }
+
+ // check if the item has been selected
+ if(selected.indexOf(self.model) !== -1) {
+ tableCtrl.$$hash.update(self.id, self.model);
+ }
+ }
+
+ function toggle(event) {
+ scope.$applyAsync(function () {
+ self.toggle(event);
+ });
+ }
+
+ scope.$watch(enableRowSelection, function (enable) {
+ if(enable) {
+ enableSelection();
+ } else {
+ disableSelection();
+ }
+ });
+
+ scope.$watch(autoSelect, function (newValue, oldValue) {
+ if(newValue === oldValue) {
+ return;
+ }
+
+ if(tableCtrl.$$rowSelect && newValue) {
+ element.on('click', toggle);
+ } else {
+ element.off('click', toggle);
+ }
+ });
+
+ scope.$watch(self.isSelected, function (isSelected) {
+ return isSelected ? element.addClass('md-selected') : element.removeClass('md-selected');
+ });
+
+ scope.$watch(tableCtrl.enableMultiSelect, function (multiple) {
+ if(tableCtrl.$$rowSelect && !multiple) {
+ // remove all but the first selected item
+ tableCtrl.selected.splice(1);
+ }
+ });
+
+ tableCtrl.registerModelChangeListener(onSelectChange);
+
+ element.on('$destroy', function () {
+ tableCtrl.removeModelChangeListener(onSelectChange);
+ });
+ }
+
+ return {
+ bindToController: true,
+ controller: Controller,
+ controllerAs: '$mdSelect',
+ link: postLink,
+ require: ['mdSelect', '^^mdTable'],
+ restrict: 'A',
+ scope: {
+ model: '=mdSelect',
+ disabled: '=ngDisabled',
+ onSelect: '=?mdOnSelect',
+ onDeselect: '=?mdOnDeselect',
+ autoSelect: '=mdAutoSelect'
+ }
+ };
+}
+
+mdSelect.$inject = ['$compile', '$parse'];
+
+angular.module('md.data.table').directive('mdTable', mdTable);
+
+function Hash() {
+ var keys = {};
+
+ this.equals = function (key, item) {
+ return keys[key] === item;
+ };
+
+ this.get = function (key) {
+ return keys[key];
+ };
+
+ this.has = function (key) {
+ return keys.hasOwnProperty(key);
+ };
+
+ this.purge = function (key) {
+ delete keys[key];
+ };
+
+ this.update = function (key, item) {
+ keys[key] = item;
+ };
+}
+
+function mdTable() {
+
+ function compile(tElement, tAttrs) {
+ tElement.addClass('md-table');
+
+ if(tAttrs.hasOwnProperty('mdProgress')) {
+ var body = tElement.find('tbody')[0];
+ var progress = angular.element('<thead class="md-table-progress" md-table-progress>');
+
+ if(body) {
+ tElement[0].insertBefore(progress[0], body);
+ }
+ }
+ }
+
+ function Controller($attrs, $element, $q, $scope) {
+ var self = this;
+ var queue = [];
+ var watchListener;
+ var modelChangeListeners = [];
+
+ self.$$hash = new Hash();
+ self.$$columns = {};
+
+ function enableRowSelection() {
+ self.$$rowSelect = true;
+
+ watchListener = $scope.$watchCollection('$mdTable.selected', function (selected) {
+ modelChangeListeners.forEach(function (listener) {
+ listener(selected);
+ });
+ });
+
+ $element.addClass('md-row-select');
+ }
+
+ function disableRowSelection() {
+ self.$$rowSelect = false;
+
+ if(angular.isFunction(watchListener)) {
+ watchListener();
+ }
+
+ $element.removeClass('md-row-select');
+ }
+
+ function resolvePromises() {
+ if(!queue.length) {
+ return $scope.$applyAsync();
+ }
+
+ queue[0]['finally'](function () {
+ queue.shift();
+ resolvePromises();
+ });
+ }
+
+ function rowSelect() {
+ return $attrs.mdRowSelect === '' || self.rowSelect;
+ }
+
+ function validateModel() {
+ if(!self.selected) {
+ return console.error('Row selection: ngModel is not defined.');
+ }
+
+ if(!angular.isArray(self.selected)) {
+ return console.error('Row selection: Expected an array. Recived ' + typeof self.selected + '.');
+ }
+
+ return true;
+ }
+
+ self.columnCount = function () {
+ return self.getRows($element[0]).reduce(function (count, row) {
+ return row.cells.length > count ? row.cells.length : count;
+ }, 0);
+ };
+
+ self.getRows = function (element) {
+ return Array.prototype.filter.call(element.rows, function (row) {
+ return !row.classList.contains('ng-leave');
+ });
+ };
+
+ self.getBodyRows = function () {
+ return Array.prototype.reduce.call($element.prop('tBodies'), function (result, tbody) {
+ return result.concat(self.getRows(tbody));
+ }, []);
+ };
+
+ self.getElement = function () {
+ return $element;
+ };
+
+ self.getHeaderRows = function () {
+ return self.getRows($element.prop('tHead'));
+ };
+
+ self.enableMultiSelect = function () {
+ return $attrs.multiple === '' || $scope.$eval($attrs.multiple);
+ };
+
+ self.waitingOnPromise = function () {
+ return !!queue.length;
+ };
+
+ self.queuePromise = function (promise) {
+ if(!promise) {
+ return;
+ }
+
+ if(queue.push(angular.isArray(promise) ? $q.all(promise) : $q.when(promise)) === 1) {
+ resolvePromises();
+ }
+ };
+
+ self.registerModelChangeListener = function (listener) {
+ modelChangeListeners.push(listener);
+ };
+
+ self.removeModelChangeListener = function (listener) {
+ var index = modelChangeListeners.indexOf(listener);
+
+ if(index !== -1) {
+ modelChangeListeners.splice(index, 1);
+ }
+ };
+
+ if($attrs.hasOwnProperty('mdProgress')) {
+ $scope.$watch('$mdTable.progress', self.queuePromise);
+ }
+
+ $scope.$watch(rowSelect, function (enable) {
+ if(enable && !!validateModel()) {
+ enableRowSelection();
+ } else {
+ disableRowSelection();
+ }
+ });
+ }
+
+ Controller.$inject = ['$attrs', '$element', '$q', '$scope'];
+
+ return {
+ bindToController: true,
+ compile: compile,
+ controller: Controller,
+ controllerAs: '$mdTable',
+ restrict: 'A',
+ scope: {
+ progress: '=?mdProgress',
+ selected: '=ngModel',
+ rowSelect: '=mdRowSelect'
+ }
+ };
+}
+
+angular.module('md.data.table').directive('mdTablePagination', mdTablePagination);
+
+function mdTablePagination() {
+
+ function compile(tElement) {
+ tElement.addClass('md-table-pagination');
+ }
+
+ function Controller($attrs, $mdUtil, $scope) {
+ var self = this;
+ var defaultLabel = {
+ page: 'Page:',
+ rowsPerPage: 'Rows per page:',
+ of: 'of'
+ };
+
+ self.label = angular.copy(defaultLabel);
+
+ function isPositive(number) {
+ return parseInt(number, 10) > 0;
+ }
+
+ self.eval = function (expression) {
+ return $scope.$eval(expression);
+ };
+
+ self.first = function () {
+ self.page = 1;
+ self.onPaginationChange();
+ };
+
+ self.hasNext = function () {
+ return self.page * self.limit < self.total;
+ };
+
+ self.hasPrevious = function () {
+ return self.page > 1;
+ };
+
+ self.last = function () {
+ self.page = self.pages();
+ self.onPaginationChange();
+ };
+
+ self.max = function () {
+ return self.hasNext() ? self.page * self.limit : self.total;
+ };
+
+ self.min = function () {
+ return isPositive(self.total) ? self.page * self.limit - self.limit + 1 : 0;
+ };
+
+ self.next = function () {
+ self.page++;
+ self.onPaginationChange();
+ };
+
+ self.onPaginationChange = function () {
+ if(angular.isFunction(self.onPaginate)) {
+ $mdUtil.nextTick(function () {
+ self.onPaginate(self.page, self.limit);
+ });
+ }
+ };
+
+ self.pages = function () {
+ return isPositive(self.total) ? Math.ceil(self.total / (isPositive(self.limit) ? self.limit : 1)) : 1;
+ };
+
+ self.previous = function () {
+ self.page--;
+ self.onPaginationChange();
+ };
+
+ self.showBoundaryLinks = function () {
+ return $attrs.mdBoundaryLinks === '' || self.boundaryLinks;
+ };
+
+ self.showPageSelect = function () {
+ return $attrs.mdPageSelect === '' || self.pageSelect;
+ };
+
+ $scope.$watch('$pagination.limit', function (newValue, oldValue) {
+ if(isNaN(newValue) || isNaN(oldValue) || newValue === oldValue) {
+ return;
+ }
+
+ // find closest page from previous min
+ self.page = Math.floor(((self.page * oldValue - oldValue) + newValue) / (isPositive(newValue) ? newValue : 1));
+ self.onPaginationChange();
+ });
+
+ $attrs.$observe('mdLabel', function (label) {
+ angular.extend(self.label, defaultLabel, $scope.$eval(label));
+ });
+
+ $scope.$watch('$pagination.total', function (newValue, oldValue) {
+ if(isNaN(newValue) || newValue === oldValue) {
+ return;
+ }
+
+ if(self.page > self.pages()) {
+ self.last();
+ }
+ });
+ }
+
+ Controller.$inject = ['$attrs', '$mdUtil', '$scope'];
+
+ return {
+ bindToController: {
+ boundaryLinks: '=?mdBoundaryLinks',
+ disabled: '=ngDisabled',
+ limit: '=mdLimit',
+ page: '=mdPage',
+ pageSelect: '=?mdPageSelect',
+ onPaginate: '=?mdOnPaginate',
+ limitOptions: '=?mdLimitOptions',
+ total: '@mdTotal'
+ },
+ compile: compile,
+ controller: Controller,
+ controllerAs: '$pagination',
+ restrict: 'E',
+ scope: {},
+ templateUrl: 'md-table-pagination.html'
+ };
+}
+
+angular.module('md.data.table').directive('mdTableProgress', mdTableProgress);
+
+function mdTableProgress() {
+
+ function postLink(scope, element, attrs, tableCtrl) {
+ scope.columnCount = tableCtrl.columnCount;
+ scope.deferred = tableCtrl.waitingOnPromise;
+ }
+
+ return {
+ link: postLink,
+ require: '^^mdTable',
+ restrict: 'A',
+ scope: {},
+ templateUrl: 'md-table-progress.html'
+ };
+}
+
+angular.module('md.data.table').directive('virtualPageSelect', virtualPageSelect);
+
+function virtualPageSelect() {
+
+ function Controller($element, $scope) {
+ var self = this;
+ var content = $element.find('md-content');
+
+ self.pages = [];
+
+ function getMin(pages, total) {
+ return Math.min(pages, isFinite(total) && isPositive(total) ? total : 1);
+ }
+
+ function isPositive(number) {
+ return number > 0;
+ }
+
+ function setPages(max) {
+ if(self.pages.length > max) {
+ return self.pages.splice(max);
+ }
+
+ for(var i = self.pages.length; i < max; i++) {
+ self.pages.push(i + 1);
+ }
+ }
+
+ content.on('scroll', function () {
+ if((content.prop('clientHeight') + content.prop('scrollTop')) >= content.prop('scrollHeight')) {
+ $scope.$applyAsync(function () {
+ setPages(getMin(self.pages.length + 10, self.total));
+ });
+ }
+ });
+
+ $scope.$watch('$pageSelect.total', function (total) {
+ setPages(getMin(Math.max(self.pages.length, 10), total));
+ });
+
+ $scope.$watch('$pagination.page', function (page) {
+ for(var i = self.pages.length; i < page; i++) {
+ self.pages.push(i + 1);
+ }
+ });
+ }
+
+ Controller.$inject = ['$element', '$scope'];
+
+ return {
+ bindToController: {
+ total: '@'
+ },
+ controller: Controller,
+ controllerAs: '$pageSelect'
+ };
+}
+
+})(window, angular); \ No newline at end of file
diff --git a/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.min.css b/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.min.css
new file mode 100644
index 00000000..0637d003
--- /dev/null
+++ b/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.min.css
@@ -0,0 +1 @@
+md-backdrop.md-edit-dialog-backdrop{z-index:80}md-edit-dialog{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:fixed;z-index:81;background-color:#f9f9f9;border-radius:2px;cursor:default}md-edit-dialog>.md-content{padding:16px 24px 0}md-edit-dialog>.md-content .md-title{color:rgba(0,0,0,.87);margin-bottom:8px}md-edit-dialog>.md-content md-input-container{margin:0;font-size:13px}md-edit-dialog>.md-content md-input-container input{float:none}md-edit-dialog>.md-content md-input-container .md-errors-spacer{min-height:auto;min-width:auto;color:rgba(0,0,0,.54)}md-edit-dialog>.md-content md-input-container .md-errors-spacer .md-char-counter{padding:5px 2px 5px 0}md-edit-dialog>.md-content md-input-container [ng-message]{padding:5px 0 5px 2px}md-edit-dialog>.md-actions{margin:0 16px 8px}md-edit-dialog>.md-actions .md-button{margin:0;min-width:initial}md-edit-dialog>.md-actions .md-button+.md-button{margin-left:8px}.md-table-pagination{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;box-sizing:border-box;padding:0 24px;font-size:12px;color:rgba(0,0,0,.54);border-top:1px rgba(0,0,0,.12) solid}.md-table-pagination md-select{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;min-width:64px}.md-table-pagination md-select:not([disabled]):focus .md-select-value{color:rgba(0,0,0,.54)}.md-table-pagination md-select .md-select-value{-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.md-table-pagination md-select .md-select-value span.md-select-icon{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;margin-right:-6px!important}.md-table-pagination md-select .md-select-value span.md-select-icon:after{top:initial;-webkit-transform:scaleY(0.5) scaleX(1);transform:scaleY(0.5) scaleX(1)}.md-table-pagination>*{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:56px}.md-table-pagination>.buttons:not(:first-child),.md-table-pagination>.limit-select:not(:first-child){margin-left:32px}.md-table-pagination>.buttons{margin-right:-16px}.md-table-pagination>.buttons>.md-button.md-icon-button{margin:0}.md-table-pagination>.buttons>.label+.md-button.md-icon-button{margin-left:20px}md-select.md-table-select{margin:0}md-select.md-table-select>.md-select-value{padding:0;min-width:0;min-height:24px;border-bottom:0!important}md-select.md-table-select>.md-select-value>span{display:block;height:auto;-webkit-transform:none!important;transform:none!important}md-select.md-table-select>.md-select-value>span>.md-text{display:inherit;height:inherit;-webkit-transform:inherit;transform:inherit}md-select.md-table-select>.md-select-value>span.md-select-icon{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:24px;margin:0}md-select.md-table-select>.md-select-value>span.md-select-icon:after{top:initial}.md-select-menu-container.md-pagination-select,.md-select-menu-container.md-table-select{margin-left:-2px;border-radius:2px}.md-select-menu-container.md-pagination-select md-content,.md-select-menu-container.md-pagination-select md-select-menu,.md-select-menu-container.md-table-select md-content,.md-select-menu-container.md-table-select md-select-menu{border-radius:inherit}.md-select-menu-container.md-pagination-select md-content,.md-select-menu-container.md-table-select md-content{padding:0}.md-select-menu-container.md-table-select .md-text{font-size:13px}.md-select-menu-container.md-pagination-select .md-text{font-size:12px}md-toolbar.md-table-toolbar{box-shadow:none}md-toolbar.md-table-toolbar.md-default-theme:not(.md-menu-toolbar).md-default,md-toolbar.md-table-toolbar:not(.md-menu-toolbar).md-default{background-color:#fff;color:rgba(0,0,0,.87)}md-toolbar.md-table-toolbar.md-default-theme:not(.md-menu-toolbar).md-default .md-button,md-toolbar.md-table-toolbar:not(.md-menu-toolbar).md-default .md-button{color:rgba(0,0,0,.87)}@media only screen and (max-width:959px) and (min-width:0) and (orientation:landscape){md-toolbar.md-table-toolbar .md-toolbar-tools{height:64px;max-height:initial}}md-toolbar.md-table-toolbar .md-toolbar-tools{padding:0 24px}md-toolbar.md-table-toolbar .md-toolbar-tools md-icon{color:rgba(0,0,0,.54)}md-toolbar.md-table-toolbar .md-toolbar-tools>.md-button.md-icon-button{margin:0}md-toolbar.md-table-toolbar .md-toolbar-tools>.md-button.md-icon-button:first-child{margin-left:-12px}md-toolbar.md-table-toolbar .md-toolbar-tools>.md-button.md-icon-button:last-child{margin-right:-12px}md-card>md-table-container:first-child,md-card>md-toolbar.md-table-toolbar:first-child{border-top-left-radius:2px;border-top-right-radius:2px}md-card>md-table-container:last-child,md-card>md-toolbar.md-table-toolbar:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}md-table-container{display:block;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}table.md-table{width:100%;border-spacing:0;overflow:hidden}table.md-table thead.md-head>tr.md-row{height:56px}table.md-table tbody.md-body>tr.md-row,table.md-table tfoot.md-foot>tr.md-row{height:48px}table.md-table thead.md-head+.md-table-progress md-progress-linear{top:-3px}table.md-table .md-table-progress th{padding:0}table.md-table .md-table-progress th md-progress-linear{height:0;transition:opacity 1s}table.md-table .md-table-progress th md-progress-linear.ng-hide{opacity:0}table.md-table .md-table-progress th md-progress-linear>.md-container{height:3px;top:0;transition:none}table.md-table .md-table-progress th md-progress-linear>.md-container>.md-bar{height:3px}table.md-table th.md-column{color:rgba(0,0,0,.54);font-size:12px;font-weight:700;white-space:nowrap}table.md-table th.md-column.md-sort{cursor:pointer}table.md-table th.md-column md-icon{height:16px;width:16px;font-size:16px!important;line-height:16px!important}table.md-table th.md-column md-icon.md-sort-icon{color:rgba(0,0,0,.26);opacity:0;transition:-webkit-transform .25s,opacity .25s;transition:transform .25s,opacity .25s}table.md-table th.md-column md-icon.md-sort-icon.md-asc{-webkit-transform:rotate(0deg);transform:rotate(0deg)}table.md-table th.md-column md-icon.md-sort-icon.md-desc{-webkit-transform:rotate(180deg);transform:rotate(180deg)}table.md-table th.md-column md-icon:not(:first-child){margin-left:8px}table.md-table th.md-column md-icon:not(:last-child){margin-right:8px}table.md-table th.md-column.md-active,table.md-table th.md-column.md-active md-icon{color:rgba(0,0,0,.87)}table.md-table th.md-column.md-active md-icon.md-sort-icon,table.md-table th.md-column:hover md-icon.md-sort-icon{opacity:1}table.md-table tr.md-row[data-ng-repeat].ng-leave,table.md-table tr.md-row[ng-repeat].ng-leave,table.md-table tr.md-row[ng\:repeat].ng-leave,table.md-table tr.md-row[x-ng-repeat].ng-leave{display:none}table.md-table.md-row-select tbody.md-body>tr.md-row{transition:background-color .2s}table.md-table.md-row-select tbody.md-body>tr.md-row:not([disabled]):hover{background-color:#eee!important}table.md-table.md-row-select tbody.md-body>tr.md-row.md-selected{background-color:#f5f5f5}table.md-table.md-row-select td.md-cell:first-child,table.md-table.md-row-select th.md-column:first-child{width:20px;padding:0 0 0 24px}table.md-table.md-row-select td.md-cell:nth-child(2),table.md-table.md-row-select th.md-column:nth-child(2){padding:0 24px}table.md-table.md-row-select td.md-cell:nth-child(n+3):nth-last-child(n+2),table.md-table.md-row-select th.md-column:nth-child(n+3):nth-last-child(n+2){padding:0 56px 0 0}table.md-table:not(.md-row-select) td.md-cell:first-child,table.md-table:not(.md-row-select) th.md-column:first-child{padding:0 24px}table.md-table:not(.md-row-select) td.md-cell:nth-child(n+2):nth-last-child(n+2),table.md-table:not(.md-row-select) th.md-column:nth-child(n+2):nth-last-child(n+2){padding:0 56px 0 0}table.md-table td.md-cell,table.md-table th.md-column{vertical-align:middle;text-align:left}table.md-table td.md-cell>*,table.md-table th.md-column>*{vertical-align:middle}table.md-table td.md-cell:last-child,table.md-table th.md-column:last-child{padding:0 24px 0 0}table.md-table td.md-cell.md-clickable,table.md-table th.md-column.md-clickable{cursor:pointer}table.md-table td.md-cell.md-clickable:focus,table.md-table th.md-column.md-clickable:focus{outline:0}table.md-table td.md-cell.md-numeric,table.md-table th.md-column.md-numeric{text-align:right}table.md-table td.md-cell md-checkbox,table.md-table th.md-column md-checkbox{margin:0;width:20px}table.md-table td.md-cell{color:rgba(0,0,0,.87);font-size:13px;border-top:1px rgba(0,0,0,.12) solid}table.md-table td.md-cell.md-numeric md-select{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}table.md-table td.md-cell.md-numeric md-select .md-select-value{-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}table.md-table td.md-cell.md-placeholder{color:rgba(0,0,0,.26)}table.md-table td.md-cell md-select>.md-select-value>span.md-select-icon{-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;color:rgba(0,0,0,.54);width:18px;text-align:right}table.md-table td.md-cell md-select>.md-select-value>span.md-select-icon:after{-webkit-transform:scaleY(0.4) scaleX(0.8);transform:scaleY(0.4) scaleX(0.8)} \ No newline at end of file
diff --git a/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.min.js b/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.min.js
new file mode 100644
index 00000000..660f3c30
--- /dev/null
+++ b/vnfmarket/common/thirdparty/angular-material-data-table/dist/md-data-table.min.js
@@ -0,0 +1 @@
+!function(a,b,c){"use strict";function d(){function a(a){a.addClass("md-body")}return{compile:a,restrict:"A"}}function e(){function a(a){var b=a.find("md-select");return b.length&&b.addClass("md-table-select").attr("md-container-class","md-table-select"),a.addClass("md-cell"),c}function b(){}function c(a,b,c,d){function e(){return i.$$columns[f()]}function f(){return Array.prototype.indexOf.call(b.parent().children(),b[0])}var g=b.find("md-select"),h=d.shift(),i=d.shift();c.ngClick&&b.addClass("md-clickable"),g.length&&(g.on("click",function(a){a.stopPropagation()}),b.addClass("md-clickable").on("click",function(a){a.stopPropagation(),g[0].click()})),h.getTable=i.getElement,a.$watch(e,function(a){a&&(a.numeric?b.addClass("md-numeric"):b.removeClass("md-numeric"))})}return{controller:b,compile:a,require:["mdCell","^^mdTable"],restrict:"A"}}function f(a,c){function d(a){return a.addClass("md-column"),e}function e(d,e,f,g){function h(){var c=b.element('<md-icon md-svg-icon="arrow-up.svg">');a(c.addClass("md-sort-icon").attr("ng-class","getDirection()"))(d),e.hasClass("md-numeric")?e.prepend(c):e.append(c)}function i(){Array.prototype.some.call(e.find("md-icon"),function(a){return a.classList.contains("md-sort-icon")&&e[0].removeChild(a)})}function j(){i(),e.removeClass("md-sort").off("click",o)}function k(){h(),e.addClass("md-sort").on("click",o)}function l(){return Array.prototype.indexOf.call(e.parent().children(),e[0])}function m(){return d.orderBy&&(q.order===d.orderBy||q.order==="-"+d.orderBy)}function n(){return""===f.mdNumeric||d.numeric}function o(){d.$applyAsync(function(){m()?q.order="md-asc"===d.getDirection()?"-"+d.orderBy:d.orderBy:q.order="md-asc"===d.getDirection()?d.orderBy:"-"+d.orderBy,b.isFunction(q.onReorder)&&c.nextTick(function(){q.onReorder(q.order)})})}function p(a,b){r.$$columns[a]=b,b.numeric?e.addClass("md-numeric"):e.removeClass("md-numeric")}var q=g.shift(),r=g.shift();d.getDirection=function(){return m()?"-"===q.order.charAt(0)?"md-desc":"md-asc":""===f.mdDesc||d.$eval(f.mdDesc)?"md-desc":"md-asc"},d.$watch(m,function(a){a?e.addClass("md-active"):e.removeClass("md-active")}),d.$watch(l,function(a){p(a,{numeric:n()})}),d.$watch(n,function(a){p(l(),{numeric:a})}),d.$watch("orderBy",function(a){a?e.hasClass("md-sort")||k():e.hasClass("md-sort")&&j()})}return{compile:d,require:["^^mdHead","^^mdTable"],restrict:"A",scope:{numeric:"=?mdNumeric",orderBy:"@?mdOrderBy"}}}function g(a){return function(c,d,e,f){if(e&&"object"==typeof e){var g=a(c,d,!0,f);return b.extend(g.instance,e),g()}return a(c,d,e,f)}}function h(a,c,d,e,f,g,h,i,j){function k(c,d){var f,h=g.$new(),i=a(c)(h),j=e.createBackdrop(h,"md-edit-dialog-backdrop");return d.controller?f=m(d,h,{$element:i,$scope:h}):b.extend(h,d.scope),d.disableScroll&&l(i),v.prepend(j).append(i.addClass("md-whiteframe-1dp")),r(i,d.target),d.focusOnOpen&&q(i),d.clickOutsideToClose&&j.on("click",function(){i.remove()}),d.escToClose&&p(i),i.on("$destroy",function(){u=!1,j.remove()}),f}function l(a){var b=e.disableScrollAround(a,v);a.on("$destroy",function(){b()})}function m(a,d,e){if(a.controller)return a.resolve&&b.extend(e,a.resolve),a.locals&&b.extend(e,a.locals),a.controllerAs?(d[a.controllerAs]={},a.bindToController?b.extend(d[a.controllerAs],a.scope):b.extend(d,a.scope)):b.extend(d,a.scope),a.bindToController?c(a.controller,e,d[a.controllerAs]):c(a.controller,e)}function n(a){return f(function(c,d){function e(a){d("Unexpected template value. Expected a string; received a "+a+".")}var f=a.template;if(f)return b.isString(f)?c(f):e(typeof f);if(a.templateUrl){if(f=h.get(a.templateUrl))return c(f);var g=function(a){return c(a)},j=function(){return d("Error retrieving template from URL.")};return i(a.templateUrl).then(g,j)}d("Template not provided.")})}function o(a){u=!1,console.error(a)}function p(a){var b=function(b){b.keyCode===t&&a.remove()};v.on("keyup",b),a.on("$destroy",function(){v.off("keyup",b)})}function q(a){e.nextTick(function(){var b=e.findFocusTarget(a);b&&b.focus()},!1)}function r(a,c){var d=b.element(c).controller("mdCell").getTable(),e=function(){return a.prop("clientHeight")},f=function(){return{width:i(),height:e()}},h=function(){var a=d.parent();return"MD-TABLE-CONTAINER"===a.prop("tagName")?a[0].getBoundingClientRect():d[0].getBoundingClientRect()},i=function(){return a.prop("clientWidth")},k=function(){var b=f(),d=c.getBoundingClientRect(),e=h();b.width>e.right-d.left?a.css("left",e.right-b.width+"px"):a.css("left",d.left+"px"),b.height>e.bottom-d.top?a.css("top",e.bottom-b.height+"px"):a.css("top",d.top+1+"px"),a.css("minWidth",d.width+"px")},l=g.$watch(i,k),m=g.$watch(e,k);j.addEventListener("resize",k),a.on("$destroy",function(){l(),m(),j.removeEventListener("resize",k)})}function s(a,c){function d(){var a='type="'+(c.type||"text")+'"';for(var b in c.validators)a+=" "+b+'="'+c.validators[b]+'"';return a}return{controller:["$element","$q","save","$scope",function(a,c,d,e){function f(){return e.editDialog.$invalid?c.reject():b.isFunction(d)?c.when(d(e.editDialog.input)):c.resolve()}this.dismiss=function(){a.remove()},this.getInput=function(){return e.editDialog.input},e.dismiss=this.dismiss,e.submit=function(){f().then(function(){e.dismiss()})}}],locals:{save:c.save},scope:{cancel:c.cancel||"Cancel",messages:c.messages,model:c.modelValue,ok:c.ok||"Save",placeholder:c.placeholder,title:c.title,size:a},template:'<md-edit-dialog><div layout="column" class="md-content"><div ng-if="size === \'large\'" class="md-title">{{title || \'Edit\'}}</div><form name="editDialog" layout="column" ng-submit="submit(model)"><md-input-container md-no-float><input name="input" ng-model="model" md-autofocus placeholder="{{placeholder}} "'+d()+'><div ng-messages="editDialog.input.$error"><div ng-repeat="(key, message) in messages" ng-message="{{key}}">{{message}}</div></div></md-input-container></form></div><div ng-if="size === \'large\'" layout="row" layout-align="end" class="md-actions"><md-button class="md-primary" ng-click="dismiss()">{{cancel}}</md-button><md-button class="md-primary" ng-click="submit()">{{ok}}</md-button></div></md-edit-dialog>'}}var t=27,u=!1,v=b.element(d.prop("body")),w={clickOutsideToClose:!0,disableScroll:!0,escToClose:!0,focusOnOpen:!0};return this.show=function(a){if(u)return f.reject();if(u=!0,a=b.extend({},w,a),!a.targetEvent)return o("options.targetEvent is required to align the dialog with the table cell.");if(!a.targetEvent.currentTarget.classList.contains("md-cell"))return o("The event target must be a table cell.");if(a.bindToController&&!a.controllerAs)return o("You must define options.controllerAs when options.bindToController is true.");a.target=a.targetEvent.currentTarget;var c=n(a),d=[c];for(var e in a.resolve)c=a.resolve[e],d.push(f.when(b.isFunction(c)?c():c));return c=f.all(d),c.catch(o),c.then(function(b){var c=b.shift();for(var d in a.resolve)a.resolve[d]=b.shift();return k(c,a)})},this.small=function(a){return this.show(b.extend({},a,s("small",a)))}.bind(this),this.large=function(a){return this.show(b.extend({},a,s("large",a)))}.bind(this),this}function i(){function a(a){a.addClass("md-foot")}return{compile:a,restrict:"A"}}function j(a){function c(a){return a.addClass("md-head"),e}function d(){}function e(c,d,e,f){function g(){d.children().prepend('<th class="md-column md-checkbox-column">')}function h(){d.prop("lastElementChild").firstElementChild.appendChild(a(i())(c)[0])}function i(){return b.element("<md-checkbox>").attr({"aria-label":"Select All","ng-click":"toggleAll()","ng-checked":"allSelected()","ng-disabled":"!getSelectableRows().length"})}function j(){var a=d.prop("lastElementChild").firstElementChild;a.classList.contains("md-checkbox-column")&&b.element(a).empty()}function k(){return f.$$rowSelect}function l(a){return b.element(a).controller("mdSelect")}function m(){Array.prototype.some.call(d.find("th"),function(a){return a.classList.contains("md-checkbox-column")&&a.remove()})}var n=new Array(2);c.allSelected=function(){var a=c.getSelectableRows();return a.length&&a.every(function(a){return a.isSelected()})},c.getSelectableRows=function(){return f.getBodyRows().map(l).filter(function(a){return a&&!a.disabled})},c.selectAll=function(){f.getBodyRows().map(l).forEach(function(a){a&&!a.isSelected()&&a.select()})},c.toggleAll=function(){return c.allSelected()?c.unSelectAll():c.selectAll()},c.unSelectAll=function(){f.getBodyRows().map(l).forEach(function(a){a&&a.isSelected()&&a.deselect()})},c.$watchGroup([k,f.enableMultiSelect],function(a){a[0]!==n[0]?a[0]?(g(),a[1]&&h()):m():a[0]&&a[1]!==n[1]&&(a[1]?h():j()),b.copy(a,n)})}return{bindToController:!0,compile:c,controller:d,controllerAs:"$mdHead",require:"^^mdTable",restrict:"A",scope:{order:"=?mdOrder",onReorder:"=?mdOnReorder"}}}function k(){function a(a){return a.addClass("md-row"),c}function c(a,c,d,e){function f(){return e.$$rowSelect}function g(){return e.getBodyRows().indexOf(c[0])!==-1}function h(a){return c[0].contains(a[0])}if(g()){var i=b.element('<td class="md-cell">');a.$watch(f,function(a){return a&&!d.mdSelect?void(h(i)||c.prepend(i)):void(h(i)&&i.remove())})}}return{compile:a,require:"^^mdTable",restrict:"A"}}function l(a,c){function d(){}function e(d,e,f,g){function h(){return""===f.mdAutoSelect||o.autoSelect}function i(){var c=b.element("<md-checkbox>").attr({"aria-label":"Select Row","ng-click":"$mdSelect.toggle($event)","ng-checked":"$mdSelect.isSelected()","ng-disabled":"$mdSelect.disabled"});return b.element('<td class="md-cell md-checkbox-cell">').append(a(c)(d))}function j(){Array.prototype.some.call(e.children(),function(a){return a.classList.contains("md-checkbox-cell")&&e[0].removeChild(a)}),h()&&e.off("click",n)}function k(){e.prepend(i()),h()&&e.on("click",n)}function l(){return p.$$rowSelect}function m(a){if(o.id)return p.$$hash.has(o.id)?void(a.indexOf(p.$$hash.get(o.id))===-1&&p.$$hash.purge(o.id)):void(a.indexOf(o.model)!==-1&&p.$$hash.update(o.id,o.model))}function n(a){d.$applyAsync(function(){o.toggle(a)})}var o=g.shift(),p=g.shift(),q=c(f.mdSelectId);if(o.id=q(o.model),p.$$rowSelect&&o.id)if(p.$$hash.has(o.id)){var r=p.selected.indexOf(p.$$hash.get(o.id));r===-1?p.$$hash.purge(o.id):p.$$hash.equals(o.id,o.model)||(p.$$hash.update(o.id,o.model),p.selected.splice(r,1,o.model))}else p.selected.some(function(a,b){if(q(a)===o.id)return p.$$hash.update(o.id,o.model),p.selected.splice(b,1,o.model),!0});o.isSelected=function(){return!!p.$$rowSelect&&(o.id?p.$$hash.has(o.id):p.selected.indexOf(o.model)!==-1)},o.select=function(){o.disabled||(p.enableMultiSelect()?p.selected.push(o.model):p.selected.splice(0,p.selected.length,o.model),b.isFunction(o.onSelect)&&o.onSelect(o.model))},o.deselect=function(){o.disabled||(p.selected.splice(p.selected.indexOf(o.model),1),b.isFunction(o.onDeselect)&&o.onDeselect(o.model))},o.toggle=function(a){return a&&a.stopPropagation&&a.stopPropagation(),o.isSelected()?o.deselect():o.select()},d.$watch(l,function(a){a?k():j()}),d.$watch(h,function(a,b){a!==b&&(p.$$rowSelect&&a?e.on("click",n):e.off("click",n))}),d.$watch(o.isSelected,function(a){return a?e.addClass("md-selected"):e.removeClass("md-selected")}),d.$watch(p.enableMultiSelect,function(a){p.$$rowSelect&&!a&&p.selected.splice(1)}),p.registerModelChangeListener(m),e.on("$destroy",function(){p.removeModelChangeListener(m)})}return{bindToController:!0,controller:d,controllerAs:"$mdSelect",link:e,require:["mdSelect","^^mdTable"],restrict:"A",scope:{model:"=mdSelect",disabled:"=ngDisabled",onSelect:"=?mdOnSelect",onDeselect:"=?mdOnDeselect",autoSelect:"=mdAutoSelect"}}}function m(){var a={};this.equals=function(b,c){return a[b]===c},this.get=function(b){return a[b]},this.has=function(b){return a.hasOwnProperty(b)},this.purge=function(b){delete a[b]},this.update=function(b,c){a[b]=c}}function n(){function a(a,c){if(a.addClass("md-table"),c.hasOwnProperty("mdProgress")){var d=a.find("tbody")[0],e=b.element('<thead class="md-table-progress" md-table-progress>');d&&a[0].insertBefore(e[0],d)}}function c(a,c,d,e){function f(){l.$$rowSelect=!0,k=e.$watchCollection("$mdTable.selected",function(a){o.forEach(function(b){b(a)})}),c.addClass("md-row-select")}function g(){l.$$rowSelect=!1,b.isFunction(k)&&k(),c.removeClass("md-row-select")}function h(){return n.length?void n[0].finally(function(){n.shift(),h()}):e.$applyAsync()}function i(){return""===a.mdRowSelect||l.rowSelect}function j(){return l.selected?!!b.isArray(l.selected)||console.error("Row selection: Expected an array. Recived "+typeof l.selected+"."):console.error("Row selection: ngModel is not defined.")}var k,l=this,n=[],o=[];l.$$hash=new m,l.$$columns={},l.columnCount=function(){return l.getRows(c[0]).reduce(function(a,b){return b.cells.length>a?b.cells.length:a},0)},l.getRows=function(a){return Array.prototype.filter.call(a.rows,function(a){return!a.classList.contains("ng-leave")})},l.getBodyRows=function(){return Array.prototype.reduce.call(c.prop("tBodies"),function(a,b){return a.concat(l.getRows(b))},[])},l.getElement=function(){return c},l.getHeaderRows=function(){return l.getRows(c.prop("tHead"))},l.enableMultiSelect=function(){return""===a.multiple||e.$eval(a.multiple)},l.waitingOnPromise=function(){return!!n.length},l.queuePromise=function(a){a&&1===n.push(b.isArray(a)?d.all(a):d.when(a))&&h()},l.registerModelChangeListener=function(a){o.push(a)},l.removeModelChangeListener=function(a){var b=o.indexOf(a);b!==-1&&o.splice(b,1)},a.hasOwnProperty("mdProgress")&&e.$watch("$mdTable.progress",l.queuePromise),e.$watch(i,function(a){a&&j()?f():g()})}return c.$inject=["$attrs","$element","$q","$scope"],{bindToController:!0,compile:a,controller:c,controllerAs:"$mdTable",restrict:"A",scope:{progress:"=?mdProgress",selected:"=ngModel",rowSelect:"=mdRowSelect"}}}function o(){function a(a){a.addClass("md-table-pagination")}function c(a,c,d){function e(a){return parseInt(a,10)>0}var f=this,g={page:"Page:",rowsPerPage:"Rows per page:",of:"of"};f.label=b.copy(g),f.eval=function(a){return d.$eval(a)},f.first=function(){f.page=1,f.onPaginationChange()},f.hasNext=function(){return f.page*f.limit<f.total},f.hasPrevious=function(){return f.page>1},f.last=function(){f.page=f.pages(),f.onPaginationChange()},f.max=function(){return f.hasNext()?f.page*f.limit:f.total},f.min=function(){return e(f.total)?f.page*f.limit-f.limit+1:0},f.next=function(){f.page++,f.onPaginationChange()},f.onPaginationChange=function(){b.isFunction(f.onPaginate)&&c.nextTick(function(){f.onPaginate(f.page,f.limit)})},f.pages=function(){return e(f.total)?Math.ceil(f.total/(e(f.limit)?f.limit:1)):1},f.previous=function(){f.page--,f.onPaginationChange()},f.showBoundaryLinks=function(){return""===a.mdBoundaryLinks||f.boundaryLinks},f.showPageSelect=function(){return""===a.mdPageSelect||f.pageSelect},d.$watch("$pagination.limit",function(a,b){isNaN(a)||isNaN(b)||a===b||(f.page=Math.floor((f.page*b-b+a)/(e(a)?a:1)),f.onPaginationChange())}),a.$observe("mdLabel",function(a){b.extend(f.label,g,d.$eval(a))}),d.$watch("$pagination.total",function(a,b){isNaN(a)||a===b||f.page>f.pages()&&f.last()})}return c.$inject=["$attrs","$mdUtil","$scope"],{bindToController:{boundaryLinks:"=?mdBoundaryLinks",disabled:"=ngDisabled",limit:"=mdLimit",page:"=mdPage",pageSelect:"=?mdPageSelect",onPaginate:"=?mdOnPaginate",limitOptions:"=?mdLimitOptions",total:"@mdTotal"},compile:a,controller:c,controllerAs:"$pagination",restrict:"E",scope:{},templateUrl:"md-table-pagination.html"}}function p(){function a(a,b,c,d){a.columnCount=d.columnCount,a.deferred=d.waitingOnPromise}return{link:a,require:"^^mdTable",restrict:"A",scope:{},templateUrl:"md-table-progress.html"}}function q(){function a(a,b){function c(a,b){return Math.min(a,isFinite(b)&&d(b)?b:1)}function d(a){return a>0}function e(a){if(f.pages.length>a)return f.pages.splice(a);for(var b=f.pages.length;b<a;b++)f.pages.push(b+1)}var f=this,g=a.find("md-content");f.pages=[],g.on("scroll",function(){g.prop("clientHeight")+g.prop("scrollTop")>=g.prop("scrollHeight")&&b.$applyAsync(function(){e(c(f.pages.length+10,f.total))})}),b.$watch("$pageSelect.total",function(a){e(c(Math.max(f.pages.length,10),a))}),b.$watch("$pagination.page",function(a){for(var b=f.pages.length;b<a;b++)f.pages.push(b+1)})}return a.$inject=["$element","$scope"],{bindToController:{total:"@"},controller:a,controllerAs:"$pageSelect"}}b.module("md.table.templates",["md-table-pagination.html","md-table-progress.html","arrow-up.svg","navigate-before.svg","navigate-first.svg","navigate-last.svg","navigate-next.svg"]),b.module("md-table-pagination.html",[]).run(["$templateCache",function(a){a.put("md-table-pagination.html",'<div class="page-select" ng-if="$pagination.showPageSelect()">\n <div class="label">{{$pagination.label.page}}</div>\n\n <md-select virtual-page-select total="{{$pagination.pages()}}" class="md-table-select" ng-model="$pagination.page" md-container-class="md-pagination-select" ng-change="$pagination.onPaginationChange()" ng-disabled="$pagination.disabled" aria-label="Page">\n <md-content>\n <md-option ng-repeat="page in $pageSelect.pages" ng-value="page">{{page}}</md-option>\n </md-content>\n </md-select>\n</div>\n\n<div class="limit-select" ng-if="$pagination.limitOptions">\n <div class="label">{{$pagination.label.rowsPerPage}}</div>\n\n <md-select class="md-table-select" ng-model="$pagination.limit" md-container-class="md-pagination-select" ng-disabled="$pagination.disabled" aria-label="Rows" placeholder="{{ $pagination.limitOptions[0] }}">\n <md-option ng-repeat="option in $pagination.limitOptions" ng-value="option.value ? $pagination.eval(option.value) : option">{{::option.label ? option.label : option}}</md-option>\n </md-select>\n</div>\n\n<div class="buttons">\n <div class="label">{{$pagination.min()}} - {{$pagination.max()}} {{$pagination.label.of}} {{$pagination.total}}</div>\n\n <md-button class="md-icon-button" type="button" ng-if="$pagination.showBoundaryLinks()" ng-click="$pagination.first()" ng-disabled="$pagination.disabled || !$pagination.hasPrevious()" aria-label="First">\n <md-icon md-svg-icon="navigate-first.svg"></md-icon>\n </md-button>\n\n <md-button class="md-icon-button" type="button" ng-click="$pagination.previous()" ng-disabled="$pagination.disabled || !$pagination.hasPrevious()" aria-label="Previous">\n <md-icon md-svg-icon="navigate-before.svg"></md-icon>\n </md-button>\n\n <md-button class="md-icon-button" type="button" ng-click="$pagination.next()" ng-disabled="$pagination.disabled || !$pagination.hasNext()" aria-label="Next">\n <md-icon md-svg-icon="navigate-next.svg"></md-icon>\n </md-button>\n\n <md-button class="md-icon-button" type="button" ng-if="$pagination.showBoundaryLinks()" ng-click="$pagination.last()" ng-disabled="$pagination.disabled || !$pagination.hasNext()" aria-label="Last">\n <md-icon md-svg-icon="navigate-last.svg"></md-icon>\n </md-button>\n</div>')}]),b.module("md-table-progress.html",[]).run(["$templateCache",function(a){a.put("md-table-progress.html",'<tr>\n <th colspan="{{columnCount()}}">\n <md-progress-linear ng-show="deferred()" md-mode="indeterminate"></md-progress-linear>\n </th>\n</tr>')}]),b.module("arrow-up.svg",[]).run(["$templateCache",function(a){a.put("arrow-up.svg",'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z"/></svg>')}]),b.module("navigate-before.svg",[]).run(["$templateCache",function(a){a.put("navigate-before.svg",'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></svg>')}]),b.module("navigate-first.svg",[]).run(["$templateCache",function(a){a.put("navigate-first.svg",'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M7 6 v12 h2 v-12 h-2z M17.41 7.41L16 6l-6 6 6 6 1.41-1.41L12.83 12z"/></svg>')}]),b.module("navigate-last.svg",[]).run(["$templateCache",function(a){a.put("navigate-last.svg",'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M15 6 v12 h2 v-12 h-2z M8 6L6.59 7.41 11.17 12l-4.58 4.59L8 18l6-6z"/></svg>')}]),b.module("navigate-next.svg",[]).run(["$templateCache",function(a){a.put("navigate-next.svg",'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg>')}]),b.module("md.data.table",["md.table.templates"]),b.module("md.data.table").directive("mdBody",d),b.module("md.data.table").directive("mdCell",e),b.module("md.data.table").directive("mdColumn",f),f.$inject=["$compile","$mdUtil"],b.module("md.data.table").decorator("$controller",g).factory("$mdEditDialog",h),g.$inject=["$delegate"],h.$inject=["$compile","$controller","$document","$mdUtil","$q","$rootScope","$templateCache","$templateRequest","$window"],b.module("md.data.table").directive("mdFoot",i),b.module("md.data.table").directive("mdHead",j),j.$inject=["$compile"],b.module("md.data.table").directive("mdRow",k),b.module("md.data.table").directive("mdSelect",l),l.$inject=["$compile","$parse"],b.module("md.data.table").directive("mdTable",n),b.module("md.data.table").directive("mdTablePagination",o),b.module("md.data.table").directive("mdTableProgress",p),b.module("md.data.table").directive("virtualPageSelect",q)}(window,angular); \ No newline at end of file