muicss
Version:
Lightweight CSS framework based on Google's Material Design guidelines
1,698 lines (1,353 loc) • 61.3 kB
JavaScript
(function (global) {
var babelHelpers = global.babelHelpers = {};
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
babelHelpers.interopRequireDefault = _interopRequireDefault;
function _getRequireWildcardCache() {
if (typeof WeakMap !== "function") return null;
var cache = new WeakMap();
_getRequireWildcardCache = function () {
return cache;
};
return cache;
}
function _interopRequireWildcard(obj) {
if (obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache();
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
babelHelpers.interopRequireWildcard = _interopRequireWildcard;
})(typeof global === "undefined" ? self : global);(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
"use strict";
/**
* MUI Angular main module
* @module angular/main
*/
(function (win) {
// return if library has been loaded already
if (win._muiAngularLoaded) return;else win._muiAngularLoaded = true;
win.angular.module('mui', [require('src/angular/appbar'), require('src/angular/button'), require('src/angular/caret'), require('src/angular/container'), require('src/angular/divider'), require('src/angular/dropdown'), require('src/angular/dropdown-item'), require('src/angular/panel'), require('src/angular/input'), require('src/angular/row'), require('src/angular/col'), require('src/angular/tabs'), require('src/angular/radio'), require('src/angular/checkbox'), require('src/angular/option'), require('src/angular/select'), require('src/angular/form')]);
})(window);
},{"src/angular/appbar":2,"src/angular/button":3,"src/angular/caret":4,"src/angular/checkbox":5,"src/angular/col":6,"src/angular/container":7,"src/angular/divider":8,"src/angular/dropdown":10,"src/angular/dropdown-item":9,"src/angular/form":11,"src/angular/input":12,"src/angular/option":13,"src/angular/panel":14,"src/angular/radio":15,"src/angular/row":16,"src/angular/select":17,"src/angular/tabs":18}],2:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Appbar Component
* @module angular/appbar
*/
var moduleName = 'mui.appbar';
_angular.default.module(moduleName, []).directive('muiAppbar', function () {
return {
restrict: 'AE',
transclude: true,
replace: true,
template: '<div class="mui-appbar"></div>',
link: function link(scope, element, attrs, controller, transcludeFn) {
// use transcludeFn to pass ng-controller on parent element
transcludeFn(scope, function (clone) {
element.append(clone);
});
}
};
});
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],3:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
var jqLite = babelHelpers.interopRequireWildcard(require("../js/lib/jqLite"));
var util = babelHelpers.interopRequireWildcard(require("../js/lib/util"));
/**
* MUI Angular Button Component
* @module angular/button
*/
var moduleName = 'mui.button',
supportsTouch = ('ontouchstart' in document.documentElement),
mouseDownEvents = supportsTouch ? 'touchstart' : 'mousedown',
mouseUpEvents = supportsTouch ? 'touchend' : 'mouseup mouseleave';
_angular.default.module(moduleName, []).directive('muiButton', function () {
return {
restrict: 'AE',
replace: true,
template: '<button class="mui-btn" mui-ripple>' + '<ng-transclude></ng-transclude>' + '<span class="mui-btn__ripple-container">' + '<span class="mui-ripple"></span>' + '</span>' + '</button>',
transclude: true,
link: function link(scope, element, attrs) {
var isUndef = _angular.default.isUndefined,
el = element[0]; // disable MUI js
el._muiDropdown = true;
el._muiRipple = true; // handle disabled attribute
if (!isUndef(attrs.disabled) && isUndef(attrs.ngDisabled)) {
element.prop('disabled', true);
} // set button styles
_angular.default.forEach(['variant', 'color', 'size'], function (attrName) {
var attrVal = attrs[attrName];
if (attrVal) element.addClass('mui-btn--' + attrVal);
});
}
};
}).directive('muiRipple', ['$timeout', function ($timeout) {
return {
restrict: 'A',
link: function link(scope, element, attrs) {
var buttonEl = element[0]; // cache reference to ripple element
buttonEl._rippleEl = buttonEl.querySelector('.mui-ripple'); // add mousedown and mouseup event ripple effect handlers
element.on(mouseDownEvents, mouseDownHandler);
}
};
}]);
/**
* MouseDown event handler.
* @param {Event} ev - The DOM event
*/
function mouseDownHandler(ev) {
var buttonEl = this,
rippleEl = buttonEl._rippleEl; // exit if disabled
if (buttonEl.disabled) return; // add mouseup handler on first-click
if (!rippleEl._init) {
jqLite.on(buttonEl, mouseUpEvents, mouseUpHandler);
rippleEl._init = true;
} // get (x, y) position of click
var offset = jqLite.offset(buttonEl),
clickEv = ev.type === 'touchstart' ? ev.touches[0] : ev,
radius,
diameter; // calculate radius
radius = Math.sqrt(offset.width * offset.width + offset.height * offset.height);
diameter = radius * 2 + 'px'; // set position and dimensions
jqLite.css(rippleEl, {
width: diameter,
height: diameter,
top: Math.round(clickEv.pageY - offset.top - radius) + 'px',
left: Math.round(clickEv.pageX - offset.left - radius) + 'px'
});
jqLite.removeClass(rippleEl, 'mui--is-animating');
jqLite.addClass(rippleEl, 'mui--is-visible'); // start animation
util.requestAnimationFrame(function () {
jqLite.addClass(rippleEl, 'mui--is-animating');
});
}
/**
* MouseUp event handler.
* @param {Event} ev - The DOM event
*/
function mouseUpHandler(ev) {
// get ripple element
var rippleEl = this._rippleEl; // allow a repaint to occur before removing class so animation shows for
// tap events
util.requestAnimationFrame(function () {
jqLite.removeClass(rippleEl, 'mui--is-visible');
});
}
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"../js/lib/jqLite":21,"../js/lib/util":22,"angular":"angular"}],4:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Caret Component
* @module angular/caret
*/
var moduleName = 'mui.caret';
_angular.default.module(moduleName, []).directive('muiCaret', function () {
return {
restrict: 'AE',
replace: true,
template: '<span class="mui-caret"></span>',
link: function link(scope, element, attrs) {
// caret direction
if (!_angular.default.isUndefined(attrs.direction)) {
element.addClass('mui-caret--' + attrs['direction']);
}
}
};
});
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],5:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Checkbox Component
* @module angular/checkox
*/
var moduleName = 'mui.checkbox';
_angular.default.module(moduleName, []).directive('muiCheckbox', ['$parse', function () {
return {
restrict: 'AE',
replace: true,
scope: {
label: '@',
name: '@',
value: '@',
ngChecked: '=',
ngDisabled: '=',
ngModel: '='
},
template: function template(tElement, tAttrs) {
var isUndef = _angular.default.isUndefined,
html = '';
html += '<div class="mui-checkbox"><label><input type="checkbox" '; // input attributes
html += 'name={{name}} ';
html += 'value={{value}} ';
html += 'ng-disabled="ngDisabled" '; // handle ngChecked and ngModel
if (!isUndef(tAttrs.ngChecked)) html += 'ng-checked="ngChecked" ';
if (!isUndef(tAttrs.ngModel)) html += 'ng-model="ngModel" ';
html += '>{{label}}</label></div>';
return html;
}
};
}]);
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],6:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Col (Grid) Component
* @module angular/col
*/
var moduleName = 'mui.col';
_angular.default.module(moduleName, []).directive('muiCol', function () {
return {
restrict: 'AE',
scope: true,
replace: true,
template: '<div></div>',
transclude: true,
link: function link(scope, element, attrs, controller, transcludeFn) {
// use transcludeFn to pass ng-controller on parent element
transcludeFn(scope, function (clone) {
element.append(clone);
}); // iterate through breakpoints
var breakpoints = {
'xs': 'mui-col-xs-',
'sm': 'mui-col-sm-',
'md': 'mui-col-md-',
'lg': 'mui-col-lg-',
'xl': 'mui-col-xl-',
'xs-offset': 'mui-col-xs-offset-',
'sm-offset': 'mui-col-sm-offset-',
'md-offset': 'mui-col-md-offset-',
'lg-offset': 'mui-col-lg-offset-',
'xl-offset': 'mui-col-xl-offset-'
};
_angular.default.forEach(breakpoints, function (value, key) {
var attrVal = attrs[attrs.$normalize(key)];
if (attrVal) element.addClass(value + attrVal);
});
}
};
});
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],7:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Container Component
* @module angular/container
*/
var moduleName = 'mui.container';
_angular.default.module(moduleName, []).directive('muiContainer', function () {
return {
restrict: 'AE',
template: '<div class="mui-container"></div>',
transclude: true,
scope: true,
replace: true,
link: function link(scope, element, attrs, controller, transcludeFn) {
// use transcludeFn to pass ng-controller on parent element
transcludeFn(scope, function (clone) {
element.append(clone);
}); // handle fluid containers
if (!_angular.default.isUndefined(attrs.fluid)) {
element.removeClass('mui-container').addClass('mui-container-fluid');
}
}
};
});
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],8:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Divider Component
* @module angular/divider
*/
var moduleName = 'mui.divider';
_angular.default.module(moduleName, []).directive('muiDivider', function () {
return {
restrict: 'AE',
replace: true,
compile: function compile(tElement, tAttrs) {
tElement.addClass('mui-divider');
}
};
});
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],9:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular DropdownItem Component
* @module angular/dropdown-item
*/
var moduleName = 'mui.dropdown-item';
_angular.default.module(moduleName, []).directive('muiDropdownItem', function () {
return {
restrict: 'AE',
replace: true,
scope: {
link: '@'
},
transclude: true,
template: '<li><a href="{{link}}" ng-transclude></a></li>'
};
});
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],10:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Dropdown Component
* @module angular/dropdown
*/
var moduleName = 'mui.dropdown';
_angular.default.module(moduleName, []).directive('muiDropdown', ['$timeout', '$compile', function ($timeout, $compile) {
return {
restrict: 'AE',
transclude: true,
replace: true,
scope: {
variant: '@',
color: '@',
size: '@',
open: '=?',
placement: '@',
alignment: '@',
ngDisabled: '='
},
template: '<div class="mui-dropdown">' + '<mui-button ' + 'variant="{{variant}}" ' + 'color="{{color}}" ' + 'size="{{size}}" ' + 'ng-click="onClick($event);" ' + '></mui-button>' + '<ul class="mui-dropdown__menu" ng-transclude></ul>' + '</div>',
link: function link(scope, element, attrs) {
var dropdownClass = 'mui-dropdown',
menuClass = 'mui-dropdown__menu',
openClass = 'mui--is-open',
rightClass = 'mui-dropdown__menu--right',
isUndef = _angular.default.isUndefined,
menuEl,
buttonEl,
contents; // save references
menuEl = _angular.default.element(element[0].querySelector('.' + menuClass));
buttonEl = _angular.default.element(element[0].querySelector('.mui-btn')); // handle is-open
if (!isUndef(attrs.open)) scope.open = true; // handle disabled
if (!isUndef(attrs.disabled)) {
buttonEl.attr('disabled', true);
} // placement class
if (!isUndef(attrs.placement)) {
element.addClass(dropdownClass + '--' + attrs.placement);
} // alignment class
if (!isUndef(attrs.rightAlign)) {
// legacy `rightAlign` attribute
menuEl.addClass(rightClass);
} else if (!isUndef(attrs.alignment)) {
menuEl.addClass(menuClass + '--' + attrs.alignment);
} // handle caret
if (!isUndef(attrs.noCaret)) {
// no caret
buttonEl.html(attrs.label);
} else {
// caret direction and placement
contents = '<mui-caret direction="{{placement}}"></mui-caret>';
contents = $compile(contents)(scope);
if (scope.placement === 'left') {
buttonEl.append(contents).append(attrs.label + ' ');
} else {
buttonEl.append(attrs.label + ' ').append(contents);
}
}
function closeDropdownFn() {
scope.open = false;
scope.$apply();
}
function handleKeyDownFn(ev) {
// close dropdown on escape key
var key = ev.key;
if (key === 'Escape' || key === 'Esc') closeDropdownFn();
} // handle menu open
scope.$watch('open', function (newValue) {
var doc = document,
pos = {},
wrapperRect,
toggleRect;
if (newValue === true) {
// menu placement
wrapperRect = element[0].getBoundingClientRect();
toggleRect = buttonEl[0].getBoundingClientRect();
switch (attrs.placement) {
case 'up':
pos.bottom = toggleRect.height + toggleRect.top - wrapperRect.top + 'px';
break;
case 'right':
pos.left = toggleRect.width + 'px';
pos.top = toggleRect.top - wrapperRect.top + 'px';
break;
case 'left':
pos.right = toggleRect.width + 'px';
pos.top = toggleRect.top - wrapperRect.top + 'px';
break;
default:
pos.top = toggleRect.top - wrapperRect.top + toggleRect.height + 'px';
} // menu alignment
if (attrs.alignment === 'bottom') {
pos.top = 'auto';
pos.bottom = toggleRect.top - wrapperRect.top + 'px';
} // set menu position
menuEl.css(pos); // open menu
menuEl.addClass(openClass);
doc.addEventListener('click', closeDropdownFn);
doc.addEventListener('keydown', handleKeyDownFn);
} else if (newValue === false) {
menuEl.removeClass(openClass);
doc.removeEventListener('click', closeDropdownFn);
doc.removeEventListener('keydown', handleKeyDownFn);
}
}); // click handler
scope.onClick = function ($event) {
// exit if disabled
if (scope.disabled) return; // prevent form submission
$event.preventDefault();
$event.stopPropagation(); // toggle open
if (scope.open) scope.open = false;else scope.open = true;
};
}
};
}]);
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],11:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Form Directive
* @module angular/form
*/
var moduleName = 'mui.form';
_angular.default.module(moduleName, []).directive('muiForm', function () {
return {
restrict: 'AE',
template: '<form class="mui-form"></form>',
transclude: true,
scope: true,
replace: true,
link: function link(scope, element, attrs, controller, transcludeFn) {
// use transcludeFn to pass ng-controller on parent element
transcludeFn(scope, function (clone) {
element.append(clone);
}); // handle inline forms
if (!_angular.default.isUndefined(attrs.inline)) {
element.addClass('mui-form--inline');
}
}
};
});
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],12:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Input and Textarea Components
* @module angular/input
*/
var moduleName = 'mui.input';
/**
* Build directive function.
* @param {Boolean} isTextArea
*/
function inputFactory(isTextArea) {
var scopeArgs, template, ngClassStr, attrs; // defaults
scopeArgs = {
floatLabel: '@',
hint: '@',
label: '@',
name: '@',
ngDisabled: '=',
ngMaxlength: '@',
ngMinlength: '@',
ngModel: '='
};
template = '<div class="mui-textfield">';
ngClassStr = '{' + ["'mui--is-touched': inputCtrl.$touched", // hasn't lost focus yet
"'mui--is-untouched': inputCtrl.$untouched", "'mui--is-pristine': inputCtrl.$pristine", // user hasn't interacted yet
"'mui--is-dirty': inputCtrl.$dirty", "'mui--is-empty': inputCtrl.$isEmpty(inputCtrl.$viewValue)", "'mui--is-not-empty': !inputCtrl.$isEmpty(inputCtrl.$viewValue)", "'mui--is-invalid': inputCtrl.$invalid"].join(',') + '}';
attrs = ['name={{name}}', 'placeholder={{hint}}', 'ng-class="' + ngClassStr + '"', 'ng-disabled="ngDisabled"', 'ng-maxlength={{ngMaxlength}}', 'ng-minlength={{ngMinlength}}', 'ng-model="ngModel"']; // element-specific
if (!isTextArea) {
scopeArgs.type = '@';
attrs.push('type={{type}}');
template += '<input ' + attrs.join(' ') + '>';
} else {
scopeArgs.rows = '@';
attrs.push('rows={{rows}}');
template += '<textarea ' + attrs.join(' ') + '></textarea>';
} // update template
template += '<label tabindex="-1">{{label}}</label></div>'; // directive function
return ['$timeout', function ($timeout) {
return {
restrict: 'AE',
require: ['ngModel'],
scope: scopeArgs,
replace: true,
template: template,
link: function link(scope, element, attrs, controllers) {
var inputEl = element.find(isTextArea ? 'textarea' : 'input'),
labelEl = element.find('label'),
ngModelCtrl = controllers[0],
formCtrl = controllers[1],
isUndef = _angular.default.isUndefined,
el = inputEl[0]; // add inputCrl to scope
scope.inputCtrl = inputEl.controller('ngModel'); // disable MUI js
if (el) el._muiTextfield = true; // remove attributes from wrapper
element.removeAttr('ng-change');
element.removeAttr('ng-model');
element.removeAttr('ng-minlength');
element.removeAttr('ng-maxlength'); // scope defaults
if (!isTextArea) scope.type = scope.type || 'text';else scope.rows = scope.rows || 2; // autofocus
if (!isUndef(attrs.autofocus)) inputEl[0].focus(); // required
if (!isUndef(attrs.required)) inputEl.prop('required', true); // invalid
if (!isUndef(attrs.invalid)) inputEl.addClass('mui--is-invalid'); // float-label
if (!isUndef(scope.floatLabel)) {
element.addClass('mui-textfield--float-label');
$timeout(function () {
labelEl.css({
'transition': '.15s ease-out',
'-webkit-transition': '.15s ease-out',
'-moz-transition': '.15s ease-out',
'-o-transition': '.15s ease-out',
'-ms-transition': '.15s ease-out'
});
}, 150);
} // handle changes
scope.onChange = function () {
// trigger ng-change on parent
if (ngModelCtrl) ngModelCtrl.$setViewValue(scope.ngModel);
};
}
};
}];
}
_angular.default.module(moduleName, []).directive('muiInput', inputFactory(false)).directive('muiTextarea', inputFactory(true));
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],13:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
var formlib = babelHelpers.interopRequireWildcard(require("../js/lib/forms"));
var util = babelHelpers.interopRequireWildcard(require("../js/lib/util"));
var jqLite = babelHelpers.interopRequireWildcard(require("../js/lib/jqLite"));
/**
* MUI Angular Select Component
* @module angular/select
*/
var moduleName = 'mui.option';
_angular.default.module(moduleName, []).directive('muiOption', function () {
return {
restrict: 'AE',
replace: true,
//require: '^muiSelect',
scope: {
label: '@',
value: '@',
ngDisabled: '='
},
template: '<option>{{label}}</option>',
link: function link(scope, element, attrs, controller) {
/*
// register
controller.addMenuItem({
label: attrs.label,
value: attrs.value,
disabled: scope.ngDisabled,
hidden: attrs.hidden
});
// destroy hook
scope.$on('$destroy', function() {
controller.removeMenuItem(attrs.value);
});
*/
}
};
});
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"../js/lib/forms":20,"../js/lib/jqLite":21,"../js/lib/util":22,"angular":"angular"}],14:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Panel Component
* @module angular/panel
*/
var moduleName = 'mui.panel';
_angular.default.module(moduleName, []).directive('muiPanel', function () {
return {
restrict: 'AE',
replace: true,
scope: true,
template: '<div class="mui-panel"></div>',
transclude: true,
link: function link(scope, element, attr, controller, transcludeFn) {
transcludeFn(scope, function (clone) {
element.append(clone);
});
}
};
});
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],15:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Radio Component
* @module angular/radio
*/
var moduleName = 'mui.radio';
_angular.default.module(moduleName, []).directive('muiRadio', function () {
return {
restrict: 'AE',
replace: true,
scope: {
label: '@',
name: '@',
value: '@',
ngChecked: '=',
ngDisabled: '=',
ngModel: '='
},
template: function template(tElement, tAttrs) {
var isUndef = _angular.default.isUndefined,
html = '';
html += '<div class="mui-radio"><label><input type="radio" '; // input attributes
html += 'name={{name}} ';
html += 'value={{value}} ';
html += 'ng-disabled="ngDisabled" '; // handle ngChecked and ngModel
if (!isUndef(tAttrs.ngChecked)) html += 'ng-checked="ngChecked" ';
if (!isUndef(tAttrs.ngModel)) html += 'ng-model="ngModel" ';
html += '>{{label}}</label></div>';
return html;
}
};
});
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],16:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
/**
* MUI Angular Grid/Row Module
* @module angular/row.js
*/
var moduleName = 'mui.row';
_angular.default.module('mui.row', []).directive('muiRow', function () {
return {
restrict: 'AE',
scope: true,
replace: true,
template: '<div class="mui-row"></div>',
transclude: true,
link: function link(scope, element, attr, controller, transcludeFn) {
transcludeFn(scope, function (clone) {
element.append(clone);
});
}
};
});
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"angular":"angular"}],17:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
var formlib = babelHelpers.interopRequireWildcard(require("../js/lib/forms"));
var util = babelHelpers.interopRequireWildcard(require("../js/lib/util"));
var jqLite = babelHelpers.interopRequireWildcard(require("../js/lib/jqLite"));
/**
* MUI Angular Select Component
* @module angular/select
*/
var moduleName = 'mui.select';
_angular.default.module(moduleName, []).directive('muiSelect', ['$timeout', function ($timeout) {
return {
restrict: 'AE',
require: ['ngModel'],
scope: {
label: '@',
name: '@',
placeholder: '@',
ngDisabled: '=',
ngModel: '=',
ngRequired: '='
},
replace: true,
transclude: true,
template: '<div class="mui-select" ' + 'ng-blur="onWrapperBlurOrFocus($event)" ' + 'ng-click="onWrapperClick($event)" ' + 'ng-focus="onWrapperBlurOrFocus($event)" ' + 'ng-keydown="onWrapperKeydown($event)" ' + 'ng-keypress="onWrapperKeypress($event)">' + '<select ' + 'name="{{name}}" ' + 'ng-class=\'{"mui--text-placeholder": placeholder && ngModel == ""}\' ' + 'ng-disabled="ngDisabled" ' + 'ng-model="ngModel" ' + 'ng-mousedown="onInnerMousedown($event)" ' + 'ng-required="ngRequired" ' + '>' + '<option ng-if="placeholder" value="" placeholder>{{placeholder}}</option>' + '</select>' + '<label tabindex="-1">{{label}}</label>' + '<div ' + 'class="mui-select__menu"' + 'ng-if="!useDefault && isOpen">' + '<div ' + 'ng-click="chooseOption($event, option)" ' + 'ng-repeat="option in selectEl.children() track by $index" ' + 'ng-class=\'{"mui--is-selected": $index === menuIndex, "mui--text-placeholder": option.hasAttribute("placeholder"), "mui--is-disabled": option.disabled}\' ' + 'ng-disabled="option.disabled" ' + 'ng-hide="option.hidden" ' + '>{{option.innerText}}</div>' + '</div>' + '</div>',
link: function link(scope, element, attrs, controller, transcludeFn) {
var wrapperEl = element,
selectEl = element.find('select'),
isUndef = _angular.default.isUndefined,
origValue; // disable MUI js
selectEl[0]._muiSelect = true; // init scope
scope.selectEl = selectEl;
scope.isOpen = false;
scope.useDefault = 'ontouchstart' in document.documentElement ? true : false;
scope.origTabIndex = selectEl[0].tabIndex;
scope.menuIndex = 0;
scope.q = '';
scope.qTimeout = null; // handle `use-default` attribute
if (!isUndef(attrs.useDefault)) scope.useDefault = true; // use tabIndex to make wrapper or inner focusable
if (scope.useDefault === false) {
wrapperEl.prop('tabIndex', '0');
selectEl.prop('tabIndex', '-1');
} else {
wrapperEl.prop('tabIndex', '-1');
selectEl.prop('tabIndex', '0');
} // add <option> tags to <select>
transcludeFn(function (clone) {
selectEl.append(clone);
});
function dispatchChange(option) {
selectEl[0].selectedIndex = option.index;
if (option.value !== origValue) {
scope.ngModel = option.value; // trigger change event
$timeout(function () {
util.dispatchEvent(selectEl[0], 'change', true, false);
});
}
}
/**
* Handle blur and focus events on wrapper <div> element.
* @param {Event} $event - Angular event instance
*/
scope.onWrapperBlurOrFocus = function ($event) {
// ignore events that bubbled up
if (document.activeElement !== wrapperEl[0]) return;
util.dispatchEvent(selectEl[0], $event.type, false, false);
};
/**
* Handle click event on wrapper <div> element.
* @param {Event} $event - Angular event instance
*/
scope.onWrapperClick = function ($event) {
// only left click, check default prevented and useDefault
if ($event.button !== 0 || $event.defaultPrevented || scope.useDefault || selectEl[0].disabled) {
return;
} // focus wrapper
wrapperEl[0].focus(); // open custom menu
scope.isOpen = true;
};
/**
* Handle keydown event on wrapper element.
* @param {Event} $event - Angular event instance
*/
scope.onWrapperKeydown = function ($event) {
// exit if preventDefault() was called or useDefault is true
if ($event.defaultPrevented || scope.useDefault) return;
var keyCode = $event.keyCode;
if (scope.isOpen === false) {
// spacebar, down, up
if (keyCode === 32 || keyCode === 38 || keyCode === 40) {
// prevent win scroll
$event.preventDefault(); // open menu
scope.isOpen = true;
}
} else {
// tab
if (keyCode === 9) return scope.isOpen = false; // escape | up | down | enter
if (keyCode === 27 || keyCode === 40 || keyCode === 38 || keyCode === 13) {
$event.preventDefault();
}
var options = selectEl.children(),
nextIndex = null,
i;
if (keyCode === 27) {
// escape -> close
scope.isOpen = false;
} else if (keyCode === 40) {
// down -> increment
i = scope.menuIndex + 1;
while (i < options.length) {
// exit if option not disabled
if (!options[i].disabled && !options[i].hidden) {
nextIndex = i;
break;
}
i += 1;
}
if (nextIndex !== null) scope.menuIndex = nextIndex;
} else if (keyCode === 38) {
// up -> decrement
i = scope.menuIndex - 1;
while (i > -1) {
// exit if option not disabled
if (!options[i].disabled && !options[i].hidden) {
nextIndex = i;
break;
}
i -= 1;
}
if (nextIndex !== null) scope.menuIndex = nextIndex;
} else if (keyCode === 13) {
// enter -> choose and close
dispatchChange(options[scope.menuIndex]);
scope.isOpen = false;
}
}
};
/**
* Handle keypress event on wrapper element.
* @param {Event} $event - Angular event instance
*/
scope.onWrapperKeypress = function ($event) {
// exit if preventDefault() was called or useDefault is true or
// menu is closed
if ($event.defaultPrevented || scope.useDefault || !scope.isOpen) {
return;
} // handle query timer
clearTimeout(scope.qTimeout);
scope.q += $event.key;
scope.qTimeout = setTimeout(function () {
scope.q = '';
}, 600); // select first match alphabetically
var prefixRegex = new RegExp('^' + scope.q, 'i'),
options = selectEl.children(),
m = options.length,
option,
i;
for (i = 0; i < m; i++) {
option = options[i];
if (!option.hidden && !option.disabled && prefixRegex.test(option.innerText)) {
scope.menuIndex = option.index;
break;
}
}
};
/**
* Handle mousedown event on Inner <select> element
* @param {Event} $event - Angular event instance
*/
scope.onInnerMousedown = function ($event) {
// check flag
if ($event.button !== 0 || scope.useDefault === true) return; // prevent built-in menu from opening
$event.preventDefault();
};
/**
* Choose option the user selected.
* @param {Object} option - The option selected.
*/
scope.chooseOption = function ($event, option) {
// prevent bubbling
$event.stopImmediatePropagation(); // ignore disabled
if (option.disabled) return; // dispatch change
dispatchChange(option); // close menu
scope.isOpen = false;
}; // function to close menu on window resize and document click
function closeMenuFn() {
scope.isOpen = false; // disable scroll lock
util.disableScrollLock(true); // remove event handlers
jqLite.off(document, 'click', closeMenuFn);
jqLite.off(window, 'resize', closeMenuFn);
scope.$digest();
}
/**
* Open/Close custom select menu
*/
scope.$watch('isOpen', function (isOpen, oldVal) {
// ignore first call
if (isOpen === oldVal) return; // exit if use-default is true
if (scope.useDefault === true) return;
if (isOpen === true) {
// enable scroll lock
util.enableScrollLock(); // init menuIndex
var menuEl = element.find('div'),
value = scope.ngModel,
options = selectEl.children(),
m = options.length,
i;
origValue = scope.ngModel;
scope.menuIndex = scope.menuIndex;
$timeout(function () {
// set position of custom menu
var props = formlib.getMenuPositionalCSS(element[0], menuEl[0], scope.menuIndex);
props.height = 'auto';
menuEl.css(props);
jqLite.scrollTop(menuEl[0], props.scrollTop); // attach event handlers
jqLite.on(document, 'click', closeMenuFn);
jqLite.on(window, 'resize', closeMenuFn);
});
} else {
// focus select element
selectEl[0].focus(); // disable scroll lock
util.disableScrollLock(true); // remove event handlers
jqLite.off(document, 'click', closeMenuFn);
jqLite.off(window, 'resize', closeMenuFn);
}
});
/**
* Scroll to menu items (if hidden)
*/
scope.$watch('menuIndex', function (newVal, oldVal) {
// skip initialization
if (newVal === oldVal) return; // scroll menu after rendering is finished
$timeout(function () {
var itemEl = selectEl.children()[scope.menuIndex],
itemRect = itemEl.getBoundingClientRect(),
menuEl = itemEl.parentNode;
if (itemRect.top < 0) {
// menu item is hidden above visible window
menuEl.scrollTop = menuEl.scrollTop + itemRect.top - 5;
} else if (itemRect.top > window.innerHeight) {
// menu item is hidden below visible window
menuEl.scrollTop = menuEl.scrollTop + (itemRect.top + itemRect.height - window.innerHeight) + 5;
}
});
});
scope.$watch('ngDisabled', function (newVal) {
if (newVal === true) wrapperEl.prop('tabIndex', '-1');else if (!scope.useDefault) wrapperEl.prop('tabIndex', '0');
});
}
};
}]);
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"../js/lib/forms":20,"../js/lib/jqLite":21,"../js/lib/util":22,"angular":"angular"}],18:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _angular = babelHelpers.interopRequireDefault(window.angular);
var jqLite = babelHelpers.interopRequireWildcard(require("../js/lib/jqLite"));
/**
* MUI Angular Tabs Component
* @module angular/tabs
*/
var moduleName = 'mui.tabs';
_angular.default.module(moduleName, []).directive('muiTabs', function () {
return {
restrict: 'EA',
transclude: true,
scope: {
selectedId: '=?selected',
onChange: '&?'
},
template: '' + '<ul ' + 'class="mui-tabs__bar" ' + 'ng-class=\'{"mui-tabs__bar--justified": justified}\'>' + '<li ' + 'ng-repeat="tab in tabs track by $index" ' + 'ng-class=\'{"mui--is-active": $index === selectedId}\'>' + '<a ng-click="onClick($index)">{{tab.label}}</a>' + '</li>' + '</ul>',
controller: ['$scope', function ($scope) {
var counter = 0; // init scope
$scope.tabs = []; // add tab
this.addTab = function (args) {
// user counter for tab id
var tabId = counter;
counter += 1; // update tabs list
$scope.tabs.push({
label: args.label
}); // handle active tabs
if (args.isActive) $scope.selectedId = tabId; // return id
return tabId;
};
}],
link: function link(scope, element, attrs, ctrl, transcludeFn) {
var isUndef = _angular.default.isUndefined; // init scope
if (isUndef(scope.selectedId)) scope.selectedId = 0;
scope.justified = false; // justified
if (!isUndef(attrs.justified)) scope.justified = true; // click handler
scope.onClick = function (tabId) {
// check current tab
if (tabId === scope.selectedId) return; // update active tab
scope.selectedId = tabId; // execute onChange callback
if (scope.onChange) scope.$$postDigest(scope.onChange);
}; // use transcludeFn to pass ng-controller on parent element
transcludeFn(scope, function (clone) {
element.append(clone);
});
}
};
}).directive('muiTab', ['$parse', function ($parse) {
return {
require: '^?muiTabs',
restrict: 'AE',
scope: {
active: '&?',
label: '@?'
},
transclude: true,
template: '<div ' + 'class="mui-tabs__pane" ' + 'ng-class=\'{"mui--is-active": tabId === $parent.selectedId}\'></div>',
link: function link(scope, element, attrs, ctrl, transcludeFn) {
var onSelectFn = $parse(attrs.onSelect),
onDeselectFn = $parse(attrs.onDeselect),
origScope = scope.$parent.$parent; // init scope
scope.tabId = null; // add to parent controller
if (ctrl) {
scope.tabId = ctrl.addTab({
label: scope.label,
isActive: Boolean(scope.active)
});
} // use transcludeFn to pass ng-controller on parent element
transcludeFn(scope, function (clone) {
element.find('div').append(clone);
});
scope.$parent.$watch('selectedId', function (newVal, oldVal) {
// ignore initial load
if (newVal === oldVal) return; // execute onSelect
if (newVal === scope.tabId) onSelectFn(origScope); // execute onDeselect
if (oldVal === scope.tabId) onDeselectFn(origScope);
});
}
};
}]);
/** Define module API */
var _default = moduleName;
exports.default = _default;
module.exports = exports.default;
},{"../js/lib/jqLite":21,"angular":"angular"}],19:[function(require,module,exports){
"use strict";
/**
* MUI config module
* @module config
*/
/** Define module API */
module.exports = {
/** Use debug mode */
debug: true
};
},{}],20:[function(require,module,exports){
/**
* MUI CSS/JS form helpers module
* @module lib/forms.py
*/
'use strict';
var jqLite = require('./jqLite');
/**
* Menu position/size/scroll helper
* @returns {Object} Object with keys 'height', 'top', 'scrollTop'
*/
function getMenuPositionalCSSFn(wrapperEl, menuEl, selectedRow) {
var viewHeight = document.documentElement.clientHeight,
numRows = menuEl.children.length; // determine menu height
var h = parseInt(menuEl.offsetHeight),
height = Math.min(h, viewHeight); // determine row height
var p = parseInt(jqLite.css(menuEl, 'padding-top')),
rowHeight = (h - 2 * p) / numRows; // determine 'top'
var top, initTop, minTop, maxTop;
initTop = -1 * selectedRow * rowHeight;
minTop = -1 * wrapperEl.getBoundingClientRect().top;
maxTop = viewHeight - height + minTop;
top = Math.min(Math.max(initTop, minTop), maxTop); // determine 'scrollTop'
var scrollTop = 0,
scrollIdeal,
scrollMax;
if (h > viewHeight) {
scrollIdeal = top + p + selectedRow * rowHeight;
scrollMax = numRows * rowHeight + 2 * p - height;
scrollTop = Math.min(scrollIdeal, scrollMax);
}
return {
'height': height + 'px',
'top': top + 'px',
'scrollTop': scrollTop
};
}
/** Define module API */
module.exports = {
getMenuPositionalCSS: getMenuPositionalCSSFn
};
},{"./jqLite":21}],21:[function(require,module,exports){
/**
* MUI CSS/JS jqLite module
* @module lib/jqLite
*/
'use strict';
/**
* Add a class to an element.
* @param {Element} element - The DOM element.
* @param {string} cssClasses - Space separated list of class names.
*/
function jqLiteAddClass(element, cssClasses) {
if (!cssClasses || !element.setAttribute) return;
var existingClasses = _getExistingClasses(element),
splitClasses = cssClasses.split(' '),
cssClass;
for (var i = 0; i < splitClasses.length; i++) {
cssClass = splitClasses[i].trim();
if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {
existingClasses += cssClass + ' ';
}
}
element.setAttribute('class', existingClasses.trim());
}
/**
* Get or set CSS properties.
* @param {Element} element - The DOM element.
* @param {string} [name] - The property name.
* @param {string} [value] - The property value.
*/
function jqLiteCss(element, name, value) {
// Return full style object
if (name === undefined) {
return getComputedStyle(element);
}
var nameType = jqLiteType(name); // Set multiple values
if (nameType === 'object') {
for (var key in name) {
element.style[_camelCase(key)] = name[key];
}
return;
} // Set a single value
if (nameType === 'string' && value !== undefined) {
element.style[_camelCase(name)] = value;
}
var styleObj = getComputedStyle(element),
isArray = jqLiteType(name) === 'array'; // Read single value
if (!isArray) return _getCurrCssProp(element, name, styleObj); // Read multiple values
var outObj = {},
key;
for (var i = 0; i < name.length; i++) {
key = name[i];
outObj[key] = _getCurrCssProp(element, key, styleObj);
}
return outObj;
}
/**
* Check if element has class.
* @param {Element} element - The DOM element.
* @param {string} cls - The class name string.
*/
function jqLiteHasClass(element, cls) {
if (!cls || !element.getAttribute) return false;
return _getExistingClasses(element).indexOf(' ' + cls + ' ') > -1;
}
/**
* Return the type of a variable.
* @param {} somevar - The JavaScript variable.
*/
function jqLiteType(somevar) {
// handle undefined
if (somevar === undefined) return 'undefined'; // handle others (of type [object <Type>])
var typeStr = Object.prototype.toString.call(somevar);
if (typeStr.indexOf('[object ') === 0) {
return typeStr.slice(8, -1).toLowerCase();
} else {
throw new Error("MUI: Could not understand type: " + typeStr);
}
}
/**
* Attach an event handler to a DOM element
* @param {Element} element - The DOM element.
* @param {string} events - Space separated event names.
* @param {Function} callback - The callback function.
* @param {Boolean} useCapture - Use capture flag.
*/
function jqLiteOn(element, events, callback, useCapture) {
useCapture = useCapture === undefined ? false : useCapture;
var cache = element._muiEventCache = element._muiEventCache || {};
events.split(' ').map(function (event) {
// add to DOM
element.addEventListener(event, callback, useCapture); // add to cache
cache[event] = cache[event] || [];
cache[event].push([callback, useCapture]);
});
}
/**
* Remove an event handler from a DOM element
* @param {Element} element - The DOM element.
* @param {string} events - Space separated event names.
* @param {Function} callback - The callback function.
* @param {Boolean} useCapture - Use capture flag.
*/
function jqLiteOff(element, events, callback, useCapture) {
useCapture = useCapture === undefined ? false : useCapture; // remove from cache
var cache = element._muiEventCache = element._muiEventCache || {},
argsList,
args,
i;
events.split(' ').map(function (event) {
argsList = cache[event] || [];
i = argsList.length;
while (i--) {
args = argsList[i]; // remove all events if callback is undefined
if (callback === undefined || args[0] === callback && args[1] === useCapture) {
// remove from cache
argsList.splice(i, 1); // remove from DOM
element.removeEventListener(event, args[0], args[1]);
}
}
});
}
/**
* Attach an event hander which will only execute once per element per event
* @param {Element} element - The DOM element.
* @param {string} events - Space separated event names.
* @param {Function} callback - The callback function.
* @param {Boolean} useCapture - Use capture flag.
*/
function jqLiteOne(element, events, callback, useCapture) {
events.split(' ').map(function (event) {
jqLiteOn(element, event, function onFn(ev) {
// execute callback
if (callback) callback.apply(this, arguments); // remove wrapper
jqLiteOff(element, event, onFn, useCapture);
}, useCapture);
});
}
/**
* Get or set horizontal scroll position
* @param {Element} element - The DOM element
* @param {number} [value] - The scroll position
*/
function jqLiteScrollLeft(element, value) {
var win = window; // get
if (value === undefined) {
if (element === win) {
var docEl = document.documentElement;
return (win.pageXOffset || docEl.scrollLeft) - (docEl.clientLeft || 0);
} else {
return element.scrollLeft;
}
} // set
if (element === win) win.scrollTo(value, jqLiteScrollTop(win));else element.scrollLeft = value;
}
/**
* Get or set vertical scroll position
* @param {Element} element - The DOM element
* @param {number} value - The scroll position
*/
function jqLiteScrollTop(element, value) {
var win = window; // get
if (value === undefined) {
if (element === win) {
var docEl = document.documentElement;
return (win.pageYOffset || docEl.scrollTop) - (