';
+
+ return _template;
+ },
+ setName: function () {
+ var text = "";
+ var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+
+ for (var i = 0; i < 5; i++) {
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
+ }
+
+ return text;
+ },
+ isPM: function () {
+ return this.$dtpElement.find('a.dtp-meridien-pm').hasClass('selected');
+ },
+ setElementValue: function () {
+ this.$element.trigger('beforeChange', this.currentDate);
+ if (this.$element.hasClass("mdl-textfield__input")) {
+ this.$element.removeClass('empty');
+ this.$element.parent().addClass("is-dirty");
+ }
+
+ this.$element.val(moment(this.currentDate).locale(this.params.lang).format(this.params.format));
+
+ this.$element.trigger('change', this.currentDate);
+ },
+ toggleButtons: function (date) {
+ if (date && date.isValid()) {
+ var startOfMonth = moment(date).locale(this.params.lang).startOf('month');
+ var endOfMonth = moment(date).locale(this.params.lang).endOf('month');
+
+ if (!this.isAfterMinDate(startOfMonth, false, false)) {
+ this.$dtpElement.find('a.dtp-select-month-before').addClass('invisible');
+ } else {
+ this.$dtpElement.find('a.dtp-select-month-before').removeClass('invisible');
+ }
+
+ if (!this.isBeforeMaxDate(endOfMonth, false, false)) {
+ this.$dtpElement.find('a.dtp-select-month-after').addClass('invisible');
+ } else {
+ this.$dtpElement.find('a.dtp-select-month-after').removeClass('invisible');
+ }
+
+ var startOfYear = moment(date).locale(this.params.lang).startOf('year');
+ var endOfYear = moment(date).locale(this.params.lang).endOf('year');
+
+ if (!this.isAfterMinDate(startOfYear, false, false)) {
+ this.$dtpElement.find('a.dtp-select-year-before').addClass('invisible');
+ } else {
+ this.$dtpElement.find('a.dtp-select-year-before').removeClass('invisible');
+ }
+
+ if (!this.isBeforeMaxDate(endOfYear, false, false)) {
+ this.$dtpElement.find('a.dtp-select-year-after').addClass('invisible');
+ } else {
+ this.$dtpElement.find('a.dtp-select-year-after').removeClass('invisible');
+ }
+ }
+ },
+ toggleTime: function (value, isHours) {
+ var result = false;
+
+ if (isHours) {
+ var _date = moment(this.currentDate);
+ _date.hour(this.convertHours(value)).minute(0).second(0);
+
+ result = !(this.isAfterMinDate(_date, true, false) === false || this.isBeforeMaxDate(_date, true, false) === false);
+ } else {
+ var _date = moment(this.currentDate);
+ _date.minute(value).second(0);
+
+ result = !(this.isAfterMinDate(_date, true, true) === false || this.isBeforeMaxDate(_date, true, true) === false);
+ }
+
+ return result;
+ },
+ _attachEvent: function (el, ev, fn) {
+ el.on(ev, null, null, fn);
+ this._attachedEvents.push([el, ev, fn]);
+ },
+ _detachEvents: function () {
+ for (var i = this._attachedEvents.length - 1; i >= 0; i--) {
+ this._attachedEvents[i][0].off(this._attachedEvents[i][1], this._attachedEvents[i][2]);
+ this._attachedEvents.splice(i, 1);
+ }
+ },
+ _fireCalendar: function () {
+ this.currentView = 0;
+ this.$element.blur();
+
+ this.initDates();
+
+ this.show();
+
+ if (this.params.date) {
+ this.$dtpElement.find('.dtp-date').removeClass('hidden');
+ this.initDate();
+ } else {
+ if (this.params.time) {
+ this.$dtpElement.find('.dtp-time').removeClass('hidden');
+ this.initHours();
+ }
+ }
+ },
+ _onBackgroundClick: function (e) {
+ e.stopPropagation();
+ this.hide();
+ },
+ _onElementClick: function (e) {
+ e.stopPropagation();
+ },
+ _onKeydown: function (e) {
+ if (e.which === 27) {
this.hide();
- break;
- }
- },
- _onCancelClick: function () {
- if (this.params.time) {
+ }
+ },
+ _onCloseClick: function () {
+ this.hide();
+ },
+ _onClearClick: function () {
+ this.currentDate = null;
+ this.$element.trigger('beforeChange', this.currentDate);
+ this.hide();
+ if (typeof ($.material) !== 'undefined') {
+ this.$element.addClass('empty');
+ }
+ this.$element.val('');
+ this.$element.trigger('change', this.currentDate);
+ },
+ _onNowClick: function () {
+ this.currentDate = moment();
+
+ if (this.params.date === true) {
+ this.showDate(this.currentDate);
+
+ if (this.currentView === 0) {
+ this.initDate();
+ }
+ }
+
+ if (this.params.time === true) {
+ this.showTime(this.currentDate);
+
+ switch (this.currentView) {
+ case 1 :
+ this.initHours();
+ break;
+ case 2 :
+ this.initMinutes();
+ break;
+ }
+
+ this.animateHands();
+ }
+ },
+ _onOKClick: function () {
switch (this.currentView) {
case 0:
- this.hide();
- break;
- case 1:
- if (this.params.date) {
- this.initDate();
+ if (this.params.time === true) {
+ this.initHours();
} else {
+ this.setElementValue();
this.hide();
}
break;
- case 2:
- this.initHours();
+ case 1:
+ this.initMinutes();
break;
- }
- } else {
- this.hide();
- }
- },
- _onMonthBeforeClick: function () {
- this.currentDate.subtract(1, 'months');
- this.initDate(this.currentDate);
- },
- _onMonthAfterClick: function () {
- this.currentDate.add(1, 'months');
- this.initDate(this.currentDate);
- },
- _onYearBeforeClick: function () {
- this.currentDate.subtract(1, 'years');
- this.initDate(this.currentDate);
- },
- _onYearAfterClick: function () {
- this.currentDate.add(1, 'years');
- this.initDate(this.currentDate);
- },
- _onSelectDate: function (e) {
- this.$dtpElement.find('a.dtp-select-day').removeClass('selected');
- $(e.currentTarget).addClass('selected');
-
- this.selectDate($(e.currentTarget).parent().data("date"));
-
- if (this.params.switchOnClick === true && this.params.time === true)
- setTimeout(this.initHours.bind(this), 200);
-
- if (this.params.switchOnClick === true && this.params.time === false) {
- setTimeout(this._onOKClick.bind(this), 200);
- }
-
- },
- _onSelectHour: function (e) {
- if (!$(e.target).hasClass('disabled')) {
- var value = $(e.target).data('hour');
- var parent = $(e.target).parent();
-
- var h = parent.find('.dtp-select-hour');
- for (var i = 0; i < h.length; i++) {
- $(h[i]).attr('fill', 'transparent');
- }
- var th = parent.find('.dtp-select-hour-text');
- for (var i = 0; i < th.length; i++) {
- $(th[i]).attr('fill', '#000');
- }
-
- $(parent.find('#h-' + value)).attr('fill', '#8BC34A');
- $(parent.find('#th-' + value)).attr('fill', '#fff');
-
- this.currentDate.hour(parseInt(value));
-
- if (this.params.shortTime === true && this.isPM()) {
- this.currentDate.add(12, 'hours');
- }
-
- this.showTime(this.currentDate);
-
- this.animateHands();
-
- if (this.params.switchOnClick === true)
- setTimeout(this.initMinutes.bind(this), 200);
- }
- },
- _onSelectMinute: function (e) {
- if (!$(e.target).hasClass('disabled')) {
- var value = $(e.target).data('minute');
- var parent = $(e.target).parent();
-
- var m = parent.find('.dtp-select-minute');
- for (var i = 0; i < m.length; i++) {
- $(m[i]).attr('fill', 'transparent');
- }
- var tm = parent.find('.dtp-select-minute-text');
- for (var i = 0; i < tm.length; i++) {
- $(tm[i]).attr('fill', '#000');
- }
-
- $(parent.find('#m-' + value)).attr('fill', '#8BC34A');
- $(parent.find('#tm-' + value)).attr('fill', '#fff');
-
- this.currentDate.minute(parseInt(value));
- this.showTime(this.currentDate);
-
- this.animateHands();
-
- if (this.params.switchOnClick === true)
- setTimeout(function () {
+ case 2:
this.setElementValue();
this.hide();
- }.bind(this), 200);
- }
- },
- _onSelectAM: function (e) {
- $('.dtp-actual-meridien').find('a').removeClass('selected');
- $(e.currentTarget).addClass('selected');
+ break;
+ }
+ },
+ _onCancelClick: function () {
+ if (this.params.time) {
+ switch (this.currentView) {
+ case 0:
+ this.hide();
+ break;
+ case 1:
+ if (this.params.date) {
+ this.initDate();
+ } else {
+ this.hide();
+ }
+ break;
+ case 2:
+ this.initHours();
+ break;
+ }
+ } else {
+ this.hide();
+ }
+ },
+ _onMonthBeforeClick: function () {
+ this.currentDate.subtract(1, 'months');
+ this.initDate(this.currentDate);
+ },
+ _onMonthAfterClick: function () {
+ this.currentDate.add(1, 'months');
+ this.initDate(this.currentDate);
+ },
+ _onYearBeforeClick: function () {
+ this.currentDate.subtract(1, 'years');
+ this.initDate(this.currentDate);
+ },
+ _onYearAfterClick: function () {
+ this.currentDate.add(1, 'years');
+ this.initDate(this.currentDate);
+ },
+ _onSelectDate: function (e) {
+ this.$dtpElement.find('a.dtp-select-day').removeClass('selected');
+ $(e.currentTarget).addClass('selected');
+
+ this.selectDate($(e.currentTarget).parent().data("date"));
+
+ if (this.params.switchOnClick === true && this.params.time === true)
+ setTimeout(this.initHours.bind(this), 200);
+
+ if (this.params.switchOnClick === true && this.params.time === false) {
+ setTimeout(this._onOKClick.bind(this), 200);
+ }
+
+ },
+ _onSelectHour: function (e) {
+ if (!$(e.target).hasClass('disabled')) {
+ var value = $(e.target).data('hour');
+ var parent = $(e.target).parent();
+
+ var h = parent.find('.dtp-select-hour');
+ for (var i = 0; i < h.length; i++) {
+ $(h[i]).attr('fill', 'transparent');
+ }
+ var th = parent.find('.dtp-select-hour-text');
+ for (var i = 0; i < th.length; i++) {
+ $(th[i]).attr('fill', '#000');
+ }
+
+ $(parent.find('#h-' + value)).attr('fill', '#8BC34A');
+ $(parent.find('#th-' + value)).attr('fill', '#fff');
+
+ this.currentDate.hour(parseInt(value));
+
+ if (this.params.shortTime === true && this.isPM()) {
+ this.currentDate.add(12, 'hours');
+ }
- if (this.currentDate.hour() >= 12) {
- if (this.currentDate.subtract(12, 'hours'))
this.showTime(this.currentDate);
- }
- this.toggleTime((this.currentView === 1));
- },
- _onSelectPM: function (e) {
- $('.dtp-actual-meridien').find('a').removeClass('selected');
- $(e.currentTarget).addClass('selected');
- if (this.currentDate.hour() < 12) {
- if (this.currentDate.add(12, 'hours'))
+ this.animateHands();
+
+ if (this.params.switchOnClick === true)
+ setTimeout(this.initMinutes.bind(this), 200);
+ }
+ },
+ _onSelectMinute: function (e) {
+ if (!$(e.target).hasClass('disabled')) {
+ var value = $(e.target).data('minute');
+ var parent = $(e.target).parent();
+
+ var m = parent.find('.dtp-select-minute');
+ for (var i = 0; i < m.length; i++) {
+ $(m[i]).attr('fill', 'transparent');
+ }
+ var tm = parent.find('.dtp-select-minute-text');
+ for (var i = 0; i < tm.length; i++) {
+ $(tm[i]).attr('fill', '#000');
+ }
+
+ $(parent.find('#m-' + value)).attr('fill', '#8BC34A');
+ $(parent.find('#tm-' + value)).attr('fill', '#fff');
+
+ this.currentDate.minute(parseInt(value));
this.showTime(this.currentDate);
- }
- this.toggleTime((this.currentView === 1));
- },
- convertHours: function (h) {
- var _return = h;
- if (this.params.shortTime === true) {
- if ((h < 12) && this.isPM()) {
- _return += 12;
+ this.animateHands();
+
+ if (this.params.switchOnClick === true)
+ setTimeout(function () {
+ this.setElementValue();
+ this.hide();
+ }.bind(this), 200);
+ }
+ },
+ _onSelectAM: function (e) {
+ $('.dtp-actual-meridien').find('a').removeClass('selected');
+ $(e.currentTarget).addClass('selected');
+
+ if (this.currentDate.hour() >= 12) {
+ if (this.currentDate.subtract(12, 'hours'))
+ this.showTime(this.currentDate);
+ }
+ this.toggleTime((this.currentView === 1));
+ },
+ _onSelectPM: function (e) {
+ $('.dtp-actual-meridien').find('a').removeClass('selected');
+ $(e.currentTarget).addClass('selected');
+
+ if (this.currentDate.hour() < 12) {
+ if (this.currentDate.add(12, 'hours'))
+ this.showTime(this.currentDate);
+ }
+ this.toggleTime((this.currentView === 1));
+ },
+ convertHours: function (h) {
+ var _return = h;
+
+ if (this.params.shortTime === true) {
+ if ((h < 12) && this.isPM()) {
+ _return += 12;
+ }
+ }
+
+ return _return;
+ },
+ setDate: function (date) {
+ this.params.currentDate = date;
+ this.initDates();
+ },
+ setMinDate: function (date) {
+ this.params.minDate = date;
+ this.initDates();
+ },
+ setMaxDate: function (date) {
+ this.params.maxDate = date;
+ this.initDates();
+ },
+ destroy: function () {
+ this._detachEvents();
+ this.$dtpElement.remove();
+ },
+ show: function () {
+ this.$dtpElement.removeClass('hidden');
+ this._attachEvent($(window), 'keydown', this._onKeydown.bind(this));
+ this._centerBox();
+ },
+ hide: function () {
+ $(window).off('keydown', null, null, this._onKeydown.bind(this));
+ this.$dtpElement.addClass('hidden');
+ },
+ _centerBox: function () {
+ var h = (this.$dtpElement.height() - this.$dtpElement.find('.dtp-content').height()) / 2;
+ this.$dtpElement.find('.dtp-content').css('marginLeft', -(this.$dtpElement.find('.dtp-content').width() / 2) + 'px');
+ this.$dtpElement.find('.dtp-content').css('top', h + 'px');
+ },
+ enableDays: function () {
+ var enableDays = this.params.enableDays;
+ if (enableDays) {
+ $(".dtp-picker-days tbody tr td").each(function () {
+ if (!(($.inArray($(this).index(), enableDays)) >= 0)) {
+ $(this).find('a').css({
+ "background": "#e3e3e3",
+ "cursor": "no-drop",
+ "opacity": "0.5"
+ }).off("click");
+ }
+ });
}
}
- return _return;
- },
- setDate: function (date) {
- this.params.currentDate = date;
- this.initDates();
- },
- setMinDate: function (date) {
- this.params.minDate = date;
- this.initDates();
- },
- setMaxDate: function (date) {
- this.params.maxDate = date;
- this.initDates();
- },
- destroy: function () {
- this._detachEvents();
- this.$dtpElement.remove();
- },
- show: function () {
- this.$dtpElement.removeClass('hidden');
- this._attachEvent($(window), 'keydown', this._onKeydown.bind(this));
- this._centerBox();
- },
- hide: function () {
- $(window).off('keydown', null, null, this._onKeydown.bind(this));
- this.$dtpElement.addClass('hidden');
- },
- _centerBox: function () {
- var h = (this.$dtpElement.height() - this.$dtpElement.find('.dtp-content').height()) / 2;
- this.$dtpElement.find('.dtp-content').css('marginLeft', -(this.$dtpElement.find('.dtp-content').width() / 2) + 'px');
- this.$dtpElement.find('.dtp-content').css('top', h + 'px');
- },
- enableDays: function () {
- var enableDays = this.params.enableDays;
- if (enableDays) {
- $(".dtp-picker-days tbody tr td").each(function () {
- if (!(($.inArray($(this).index(), enableDays)) >= 0)) {
- $(this).find('a').css({
- "background": "#e3e3e3",
- "cursor": "no-drop",
- "opacity": "0.5"
- }).off("click");
- }
- });
- }
- }
-
- };
+ };
})(jQuery, moment);
\ No newline at end of file
diff --git a/app/modules/web/themes/material-blue/js/bootstrap-material-datetimepicker.map b/app/modules/web/themes/material-blue/js/bootstrap-material-datetimepicker.map
index 76f1256c..a30f6e13 100644
--- a/app/modules/web/themes/material-blue/js/bootstrap-material-datetimepicker.map
+++ b/app/modules/web/themes/material-blue/js/bootstrap-material-datetimepicker.map
@@ -1,8 +1,246 @@
{
-"version":3,
-"file":"bootstrap-material-datetimepicker.min.js",
-"lineCount":48,
-"mappings":"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",
-"sources":[" [synthetic:base] "," [synthetic:util/findinternal] "," [synthetic:util/defineproperty] "," [synthetic:util/global] "," [synthetic:util/polyfill] "," [synthetic:es6/array/find] ","bootstrap-material-datetimepicker.js"],
-"names":["$","moment","Plugin","element","options","currentView","minDate","maxDate","_attachedEvents","$element","params","date","time","format","currentDate","lang","weekStart","shortTime","clearButton","nowButton","cancelText","okText","clearText","nowText","switchOnClick","triggerEvent","fn","extend","name","setName","attr","locale","init","p","each","data","pluginDataName","removeData","prototype","initDays","initDates","initTemplate","initButtons","_attachEvent","window","_centerBox","bind","$dtpElement","find","_onElementClick","_onBackgroundClick","_onCloseClick","_fireCalendar","days","i","length","push","toString","val","isValid","x","getTime","isAfterMinDate","isBeforeMaxDate","template","$body","append","dtpElement","_onCancelClick","_onOKClick","_onMonthBeforeClick","_onMonthAfterClick","_onYearBeforeClick","_onYearAfterClick","_onClearClick","removeClass","_onNowClick","addClass","initMeridienButtons","off","on","_onSelectAM","_onSelectPM","initDate","d","_date","_calendar","generateCalendar","week","_template","constructHTMLCalendar","html","_onSelectDate","toggleButtons","showDate","initHours","showTime","hour","click","hFormat","svgClockElement","createSVGClock","Math","sin","PI","y","cos","fill","color","svgHourCircle","createSVGElement","r","cx","cy","svgHourText","textContent","toggleTime","addEventListener","_onSelectHour","className","setAttribute","appendChild","initMinutes","s","svgMinuteCircle","_onSelectMinute","svgMinuteText","animateHands","H","M","minute","hh","mh","isHour","hl","svgElement","class","viewBox","svgGElement","transform","svgClockFace","stroke","svgClockCenter","svgMinuteHand","x1","y1","x2","y2","svgHourHand","empty","tag","attrs","el","document","createElementNS","k","checkHour","checkMinute","_return","_minDate","second","millisecond","parseInt","checkTime","_maxDate","rotateElement","deg","css","WebkitTransform","toUpperCase","minutes","content","selectDate","trigger","startOfMonth","startOf","endOfMonth","endOf","iNumDay","iWeek","indexOf","calendar","substring","text","possible","charAt","floor","random","isPM","hasClass","setElementValue","parent","startOfYear","endOfYear","value","isHours","result","convertHours","ev","_detachEvents","splice","blur","show","e","stopPropagation","hide","_onKeydown","which","material","subtract","add","currentTarget","setTimeout","target","h","th","m","tm","setDate","setMinDate","setMaxDate","destroy","remove","height","width","enableDays","inArray","index","jQuery"]
+ "version": 3,
+ "file": "bootstrap-material-datetimepicker.min.js",
+ "lineCount": 48,
+ "mappings": "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",
+ "sources": [
+ " [synthetic:base] ",
+ " [synthetic:util/findinternal] ",
+ " [synthetic:util/defineproperty] ",
+ " [synthetic:util/global] ",
+ " [synthetic:util/polyfill] ",
+ " [synthetic:es6/array/find] ",
+ "bootstrap-material-datetimepicker.js"
+ ],
+ "names": [
+ "$",
+ "moment",
+ "Plugin",
+ "element",
+ "options",
+ "currentView",
+ "minDate",
+ "maxDate",
+ "_attachedEvents",
+ "$element",
+ "params",
+ "date",
+ "time",
+ "format",
+ "currentDate",
+ "lang",
+ "weekStart",
+ "shortTime",
+ "clearButton",
+ "nowButton",
+ "cancelText",
+ "okText",
+ "clearText",
+ "nowText",
+ "switchOnClick",
+ "triggerEvent",
+ "fn",
+ "extend",
+ "name",
+ "setName",
+ "attr",
+ "locale",
+ "init",
+ "p",
+ "each",
+ "data",
+ "pluginDataName",
+ "removeData",
+ "prototype",
+ "initDays",
+ "initDates",
+ "initTemplate",
+ "initButtons",
+ "_attachEvent",
+ "window",
+ "_centerBox",
+ "bind",
+ "$dtpElement",
+ "find",
+ "_onElementClick",
+ "_onBackgroundClick",
+ "_onCloseClick",
+ "_fireCalendar",
+ "days",
+ "i",
+ "length",
+ "push",
+ "toString",
+ "val",
+ "isValid",
+ "x",
+ "getTime",
+ "isAfterMinDate",
+ "isBeforeMaxDate",
+ "template",
+ "$body",
+ "append",
+ "dtpElement",
+ "_onCancelClick",
+ "_onOKClick",
+ "_onMonthBeforeClick",
+ "_onMonthAfterClick",
+ "_onYearBeforeClick",
+ "_onYearAfterClick",
+ "_onClearClick",
+ "removeClass",
+ "_onNowClick",
+ "addClass",
+ "initMeridienButtons",
+ "off",
+ "on",
+ "_onSelectAM",
+ "_onSelectPM",
+ "initDate",
+ "d",
+ "_date",
+ "_calendar",
+ "generateCalendar",
+ "week",
+ "_template",
+ "constructHTMLCalendar",
+ "html",
+ "_onSelectDate",
+ "toggleButtons",
+ "showDate",
+ "initHours",
+ "showTime",
+ "hour",
+ "click",
+ "hFormat",
+ "svgClockElement",
+ "createSVGClock",
+ "Math",
+ "sin",
+ "PI",
+ "y",
+ "cos",
+ "fill",
+ "color",
+ "svgHourCircle",
+ "createSVGElement",
+ "r",
+ "cx",
+ "cy",
+ "svgHourText",
+ "textContent",
+ "toggleTime",
+ "addEventListener",
+ "_onSelectHour",
+ "className",
+ "setAttribute",
+ "appendChild",
+ "initMinutes",
+ "s",
+ "svgMinuteCircle",
+ "_onSelectMinute",
+ "svgMinuteText",
+ "animateHands",
+ "H",
+ "M",
+ "minute",
+ "hh",
+ "mh",
+ "isHour",
+ "hl",
+ "svgElement",
+ "class",
+ "viewBox",
+ "svgGElement",
+ "transform",
+ "svgClockFace",
+ "stroke",
+ "svgClockCenter",
+ "svgMinuteHand",
+ "x1",
+ "y1",
+ "x2",
+ "y2",
+ "svgHourHand",
+ "empty",
+ "tag",
+ "attrs",
+ "el",
+ "document",
+ "createElementNS",
+ "k",
+ "checkHour",
+ "checkMinute",
+ "_return",
+ "_minDate",
+ "second",
+ "millisecond",
+ "parseInt",
+ "checkTime",
+ "_maxDate",
+ "rotateElement",
+ "deg",
+ "css",
+ "WebkitTransform",
+ "toUpperCase",
+ "minutes",
+ "content",
+ "selectDate",
+ "trigger",
+ "startOfMonth",
+ "startOf",
+ "endOfMonth",
+ "endOf",
+ "iNumDay",
+ "iWeek",
+ "indexOf",
+ "calendar",
+ "substring",
+ "text",
+ "possible",
+ "charAt",
+ "floor",
+ "random",
+ "isPM",
+ "hasClass",
+ "setElementValue",
+ "parent",
+ "startOfYear",
+ "endOfYear",
+ "value",
+ "isHours",
+ "result",
+ "convertHours",
+ "ev",
+ "_detachEvents",
+ "splice",
+ "blur",
+ "show",
+ "e",
+ "stopPropagation",
+ "hide",
+ "_onKeydown",
+ "which",
+ "material",
+ "subtract",
+ "add",
+ "currentTarget",
+ "setTimeout",
+ "target",
+ "h",
+ "th",
+ "m",
+ "tm",
+ "setDate",
+ "setMinDate",
+ "setMaxDate",
+ "destroy",
+ "remove",
+ "height",
+ "width",
+ "enableDays",
+ "inArray",
+ "index",
+ "jQuery"
+ ]
}
diff --git a/app/modules/web/themes/material-blue/js/material.js b/app/modules/web/themes/material-blue/js/material.js
index 994825a4..7783dfa7 100644
--- a/app/modules/web/themes/material-blue/js/material.js
+++ b/app/modules/web/themes/material-blue/js/material.js
@@ -1,509 +1,518 @@
-;(function() {
-"use strict";
+;(function () {
+ "use strict";
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
-/**
- * A component handler interface using the revealing module design pattern.
- * More details on this design pattern here:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @author Jason Mayes.
- */
-/* exported componentHandler */
+ /**
+ * A component handler interface using the revealing module design pattern.
+ * More details on this design pattern here:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @author Jason Mayes.
+ */
+ /* exported componentHandler */
// Pre-defining the componentHandler interface, for closure documentation and
// static verification.
-var componentHandler = {
- /**
- * Searches existing DOM for elements of our component type and upgrades them
- * if they have not already been upgraded.
- *
- * @param {string=} optJsClass the programatic name of the element class we
- * need to create a new instance of.
- * @param {string=} optCssClass the name of the CSS class elements of this
- * type will have.
- */
- upgradeDom: function(optJsClass, optCssClass) {},
- /**
- * Upgrades a specific element rather than all in the DOM.
- *
- * @param {!Element} element The element we wish to upgrade.
- * @param {string=} optJsClass Optional name of the class we want to upgrade
- * the element to.
- */
- upgradeElement: function(element, optJsClass) {},
- /**
- * Upgrades a specific list of elements rather than all in the DOM.
- *
- * @param {!Element|!Array|!NodeList|!HTMLCollection} elements
- * The elements we wish to upgrade.
- */
- upgradeElements: function(elements) {},
- /**
- * Upgrades all registered components found in the current DOM. This is
- * automatically called on window load.
- */
- upgradeAllRegistered: function() {},
- /**
- * Allows user to be alerted to any upgrades that are performed for a given
- * component type
- *
- * @param {string} jsClass The class name of the MDL component we wish
- * to hook into for any upgrades performed.
- * @param {function(!HTMLElement)} callback The function to call upon an
- * upgrade. This function should expect 1 parameter - the HTMLElement which
- * got upgraded.
- */
- registerUpgradedCallback: function(jsClass, callback) {},
- /**
- * Registers a class for future use and attempts to upgrade existing DOM.
- *
- * @param {componentHandler.ComponentConfigPublic} config the registration configuration
- */
- register: function(config) {},
- /**
- * Downgrade either a given node, an array of nodes, or a NodeList.
- *
- * @param {!Node|!Array|!NodeList} nodes
- */
- downgradeElements: function(nodes) {}
-};
-
-componentHandler = (function() {
- 'use strict';
-
- /** @type {!Array} */
- var registeredComponents_ = [];
-
- /** @type {!Array} */
- var createdComponents_ = [];
-
- var componentConfigProperty_ = 'mdlComponentConfigInternal_';
-
- /**
- * Searches registered components for a class we are interested in using.
- * Optionally replaces a match with passed object if specified.
- *
- * @param {string} name The name of a class we want to use.
- * @param {componentHandler.ComponentConfig=} optReplace Optional object to replace match with.
- * @return {!Object|boolean}
- * @private
- */
- function findRegisteredClass_(name, optReplace) {
- for (var i = 0; i < registeredComponents_.length; i++) {
- if (registeredComponents_[i].className === name) {
- if (typeof optReplace !== 'undefined') {
- registeredComponents_[i] = optReplace;
+ var componentHandler = {
+ /**
+ * Searches existing DOM for elements of our component type and upgrades them
+ * if they have not already been upgraded.
+ *
+ * @param {string=} optJsClass the programatic name of the element class we
+ * need to create a new instance of.
+ * @param {string=} optCssClass the name of the CSS class elements of this
+ * type will have.
+ */
+ upgradeDom: function (optJsClass, optCssClass) {
+ },
+ /**
+ * Upgrades a specific element rather than all in the DOM.
+ *
+ * @param {!Element} element The element we wish to upgrade.
+ * @param {string=} optJsClass Optional name of the class we want to upgrade
+ * the element to.
+ */
+ upgradeElement: function (element, optJsClass) {
+ },
+ /**
+ * Upgrades a specific list of elements rather than all in the DOM.
+ *
+ * @param {!Element|!Array|!NodeList|!HTMLCollection} elements
+ * The elements we wish to upgrade.
+ */
+ upgradeElements: function (elements) {
+ },
+ /**
+ * Upgrades all registered components found in the current DOM. This is
+ * automatically called on window load.
+ */
+ upgradeAllRegistered: function () {
+ },
+ /**
+ * Allows user to be alerted to any upgrades that are performed for a given
+ * component type
+ *
+ * @param {string} jsClass The class name of the MDL component we wish
+ * to hook into for any upgrades performed.
+ * @param {function(!HTMLElement)} callback The function to call upon an
+ * upgrade. This function should expect 1 parameter - the HTMLElement which
+ * got upgraded.
+ */
+ registerUpgradedCallback: function (jsClass, callback) {
+ },
+ /**
+ * Registers a class for future use and attempts to upgrade existing DOM.
+ *
+ * @param {componentHandler.ComponentConfigPublic} config the registration configuration
+ */
+ register: function (config) {
+ },
+ /**
+ * Downgrade either a given node, an array of nodes, or a NodeList.
+ *
+ * @param {!Node|!Array|!NodeList} nodes
+ */
+ downgradeElements: function (nodes) {
}
- return registeredComponents_[i];
- }
- }
- return false;
- }
-
- /**
- * Returns an array of the classNames of the upgraded classes on the element.
- *
- * @param {!Element} element The element to fetch data from.
- * @return {!Array}
- * @private
- */
- function getUpgradedListOfElement_(element) {
- var dataUpgraded = element.getAttribute('data-upgraded');
- // Use `['']` as default value to conform the `,name,name...` style.
- return dataUpgraded === null ? [''] : dataUpgraded.split(',');
- }
-
- /**
- * Returns true if the given element has already been upgraded for the given
- * class.
- *
- * @param {!Element} element The element we want to check.
- * @param {string} jsClass The class to check for.
- * @returns {boolean}
- * @private
- */
- function isElementUpgraded_(element, jsClass) {
- var upgradedList = getUpgradedListOfElement_(element);
- return upgradedList.indexOf(jsClass) !== -1;
- }
-
- /**
- * Create an event object.
- *
- * @param {string} eventType The type name of the event.
- * @param {boolean} bubbles Whether the event should bubble up the DOM.
- * @param {boolean} cancelable Whether the event can be canceled.
- * @returns {!Event}
- */
- function createEvent_(eventType, bubbles, cancelable) {
- if ('CustomEvent' in window && typeof window.CustomEvent === 'function') {
- return new CustomEvent(eventType, {
- bubbles: bubbles,
- cancelable: cancelable
- });
- } else {
- var ev = document.createEvent('Events');
- ev.initEvent(eventType, bubbles, cancelable);
- return ev;
- }
- }
-
- /**
- * Searches existing DOM for elements of our component type and upgrades them
- * if they have not already been upgraded.
- *
- * @param {string=} optJsClass the programatic name of the element class we
- * need to create a new instance of.
- * @param {string=} optCssClass the name of the CSS class elements of this
- * type will have.
- */
- function upgradeDomInternal(optJsClass, optCssClass) {
- if (typeof optJsClass === 'undefined' &&
- typeof optCssClass === 'undefined') {
- for (var i = 0; i < registeredComponents_.length; i++) {
- upgradeDomInternal(registeredComponents_[i].className,
- registeredComponents_[i].cssClass);
- }
- } else {
- var jsClass = /** @type {string} */ (optJsClass);
- if (typeof optCssClass === 'undefined') {
- var registeredClass = findRegisteredClass_(jsClass);
- if (registeredClass) {
- optCssClass = registeredClass.cssClass;
- }
- }
-
- var elements = document.querySelectorAll('.' + optCssClass);
- for (var n = 0; n < elements.length; n++) {
- upgradeElementInternal(elements[n], jsClass);
- }
- }
- }
-
- /**
- * Upgrades a specific element rather than all in the DOM.
- *
- * @param {!Element} element The element we wish to upgrade.
- * @param {string=} optJsClass Optional name of the class we want to upgrade
- * the element to.
- */
- function upgradeElementInternal(element, optJsClass) {
- // Verify argument type.
- if (!(typeof element === 'object' && element instanceof Element)) {
- throw new Error('Invalid argument provided to upgrade MDL element.');
- }
- // Allow upgrade to be canceled by canceling emitted event.
- var upgradingEv = createEvent_('mdl-componentupgrading', true, true);
- element.dispatchEvent(upgradingEv);
- if (upgradingEv.defaultPrevented) {
- return;
- }
-
- var upgradedList = getUpgradedListOfElement_(element);
- var classesToUpgrade = [];
- // If jsClass is not provided scan the registered components to find the
- // ones matching the element's CSS classList.
- if (!optJsClass) {
- var classList = element.classList;
- registeredComponents_.forEach(function(component) {
- // Match CSS & Not to be upgraded & Not upgraded.
- if (classList.contains(component.cssClass) &&
- classesToUpgrade.indexOf(component) === -1 &&
- !isElementUpgraded_(element, component.className)) {
- classesToUpgrade.push(component);
- }
- });
- } else if (!isElementUpgraded_(element, optJsClass)) {
- classesToUpgrade.push(findRegisteredClass_(optJsClass));
- }
-
- // Upgrade the element for each classes.
- for (var i = 0, n = classesToUpgrade.length, registeredClass; i < n; i++) {
- registeredClass = classesToUpgrade[i];
- if (registeredClass) {
- // Mark element as upgraded.
- upgradedList.push(registeredClass.className);
- element.setAttribute('data-upgraded', upgradedList.join(','));
- var instance = new registeredClass.classConstructor(element);
- instance[componentConfigProperty_] = registeredClass;
- createdComponents_.push(instance);
- // Call any callbacks the user has registered with this component type.
- for (var j = 0, m = registeredClass.callbacks.length; j < m; j++) {
- registeredClass.callbacks[j](element);
- }
-
- if (registeredClass.widget) {
- // Assign per element instance for control over API
- element[registeredClass.className] = instance;
- }
- } else {
- throw new Error(
- 'Unable to find a registered component for the given class.');
- }
-
- var upgradedEv = createEvent_('mdl-componentupgraded', true, false);
- element.dispatchEvent(upgradedEv);
- }
- }
-
- /**
- * Upgrades a specific list of elements rather than all in the DOM.
- *
- * @param {!Element|!Array|!NodeList|!HTMLCollection} elements
- * The elements we wish to upgrade.
- */
- function upgradeElementsInternal(elements) {
- if (!Array.isArray(elements)) {
- if (elements instanceof Element) {
- elements = [elements];
- } else {
- elements = Array.prototype.slice.call(elements);
- }
- }
- for (var i = 0, n = elements.length, element; i < n; i++) {
- element = elements[i];
- if (element instanceof HTMLElement) {
- upgradeElementInternal(element);
- if (element.children.length > 0) {
- upgradeElementsInternal(element.children);
- }
- }
- }
- }
-
- /**
- * Registers a class for future use and attempts to upgrade existing DOM.
- *
- * @param {componentHandler.ComponentConfigPublic} config
- */
- function registerInternal(config) {
- // In order to support both Closure-compiled and uncompiled code accessing
- // this method, we need to allow for both the dot and array syntax for
- // property access. You'll therefore see the `foo.bar || foo['bar']`
- // pattern repeated across this method.
- var widgetMissing = (typeof config.widget === 'undefined' &&
- typeof config['widget'] === 'undefined');
- var widget = true;
-
- if (!widgetMissing) {
- widget = config.widget || config['widget'];
- }
-
- var newConfig = /** @type {componentHandler.ComponentConfig} */ ({
- classConstructor: config.constructor || config['constructor'],
- className: config.classAsString || config['classAsString'],
- cssClass: config.cssClass || config['cssClass'],
- widget: widget,
- callbacks: []
- });
-
- registeredComponents_.forEach(function(item) {
- if (item.cssClass === newConfig.cssClass) {
- throw new Error('The provided cssClass has already been registered: ' + item.cssClass);
- }
- if (item.className === newConfig.className) {
- throw new Error('The provided className has already been registered');
- }
- });
-
- if (config.constructor.prototype
- .hasOwnProperty(componentConfigProperty_)) {
- throw new Error(
- 'MDL component classes must not have ' + componentConfigProperty_ +
- ' defined as a property.');
- }
-
- var found = findRegisteredClass_(config.classAsString, newConfig);
-
- if (!found) {
- registeredComponents_.push(newConfig);
- }
- }
-
- /**
- * Allows user to be alerted to any upgrades that are performed for a given
- * component type
- *
- * @param {string} jsClass The class name of the MDL component we wish
- * to hook into for any upgrades performed.
- * @param {function(!HTMLElement)} callback The function to call upon an
- * upgrade. This function should expect 1 parameter - the HTMLElement which
- * got upgraded.
- */
- function registerUpgradedCallbackInternal(jsClass, callback) {
- var regClass = findRegisteredClass_(jsClass);
- if (regClass) {
- regClass.callbacks.push(callback);
- }
- }
-
- /**
- * Upgrades all registered components found in the current DOM. This is
- * automatically called on window load.
- */
- function upgradeAllRegisteredInternal() {
- for (var n = 0; n < registeredComponents_.length; n++) {
- upgradeDomInternal(registeredComponents_[n].className);
- }
- }
-
- /**
- * Check the component for the downgrade method.
- * Execute if found.
- * Remove component from createdComponents list.
- *
- * @param {?componentHandler.Component} component
- */
- function deconstructComponentInternal(component) {
- if (component) {
- var componentIndex = createdComponents_.indexOf(component);
- createdComponents_.splice(componentIndex, 1);
-
- var upgrades = component.element_.getAttribute('data-upgraded').split(',');
- var componentPlace = upgrades.indexOf(component[componentConfigProperty_].classAsString);
- upgrades.splice(componentPlace, 1);
- component.element_.setAttribute('data-upgraded', upgrades.join(','));
-
- var ev = createEvent_('mdl-componentdowngraded', true, false);
- component.element_.dispatchEvent(ev);
- }
- }
-
- /**
- * Downgrade either a given node, an array of nodes, or a NodeList.
- *
- * @param {!Node|!Array|!NodeList} nodes
- */
- function downgradeNodesInternal(nodes) {
- /**
- * Auxiliary function to downgrade a single node.
- * @param {!Node} node the node to be downgraded
- */
- var downgradeNode = function(node) {
- createdComponents_.filter(function(item) {
- return item.element_ === node;
- }).forEach(deconstructComponentInternal);
};
- if (nodes instanceof Array || nodes instanceof NodeList) {
- for (var n = 0; n < nodes.length; n++) {
- downgradeNode(nodes[n]);
- }
- } else if (nodes instanceof Node) {
- downgradeNode(nodes);
- } else {
- throw new Error('Invalid argument provided to downgrade MDL nodes.');
- }
- }
- // Now return the functions that should be made public with their publicly
- // facing names...
- return {
- upgradeDom: upgradeDomInternal,
- upgradeElement: upgradeElementInternal,
- upgradeElements: upgradeElementsInternal,
- upgradeAllRegistered: upgradeAllRegisteredInternal,
- registerUpgradedCallback: registerUpgradedCallbackInternal,
- register: registerInternal,
- downgradeElements: downgradeNodesInternal
- };
-})();
+ componentHandler = (function () {
+ 'use strict';
-/**
- * Describes the type of a registered component type managed by
- * componentHandler. Provided for benefit of the Closure compiler.
- *
- * @typedef {{
- * constructor: Function,
- * classAsString: string,
- * cssClass: string,
- * widget: (string|boolean|undefined)
- * }}
- */
-componentHandler.ComponentConfigPublic; // jshint ignore:line
+ /** @type {!Array} */
+ var registeredComponents_ = [];
-/**
- * Describes the type of a registered component type managed by
- * componentHandler. Provided for benefit of the Closure compiler.
- *
- * @typedef {{
- * constructor: !Function,
- * className: string,
- * cssClass: string,
- * widget: (string|boolean),
- * callbacks: !Array
- * }}
- */
-componentHandler.ComponentConfig; // jshint ignore:line
+ /** @type {!Array} */
+ var createdComponents_ = [];
-/**
- * Created component (i.e., upgraded element) type as managed by
- * componentHandler. Provided for benefit of the Closure compiler.
- *
- * @typedef {{
- * element_: !HTMLElement,
- * className: string,
- * classAsString: string,
- * cssClass: string,
- * widget: string
- * }}
- */
-componentHandler.Component; // jshint ignore:line
+ var componentConfigProperty_ = 'mdlComponentConfigInternal_';
+
+ /**
+ * Searches registered components for a class we are interested in using.
+ * Optionally replaces a match with passed object if specified.
+ *
+ * @param {string} name The name of a class we want to use.
+ * @param {componentHandler.ComponentConfig=} optReplace Optional object to replace match with.
+ * @return {!Object|boolean}
+ * @private
+ */
+ function findRegisteredClass_(name, optReplace) {
+ for (var i = 0; i < registeredComponents_.length; i++) {
+ if (registeredComponents_[i].className === name) {
+ if (typeof optReplace !== 'undefined') {
+ registeredComponents_[i] = optReplace;
+ }
+ return registeredComponents_[i];
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns an array of the classNames of the upgraded classes on the element.
+ *
+ * @param {!Element} element The element to fetch data from.
+ * @return {!Array}
+ * @private
+ */
+ function getUpgradedListOfElement_(element) {
+ var dataUpgraded = element.getAttribute('data-upgraded');
+ // Use `['']` as default value to conform the `,name,name...` style.
+ return dataUpgraded === null ? [''] : dataUpgraded.split(',');
+ }
+
+ /**
+ * Returns true if the given element has already been upgraded for the given
+ * class.
+ *
+ * @param {!Element} element The element we want to check.
+ * @param {string} jsClass The class to check for.
+ * @returns {boolean}
+ * @private
+ */
+ function isElementUpgraded_(element, jsClass) {
+ var upgradedList = getUpgradedListOfElement_(element);
+ return upgradedList.indexOf(jsClass) !== -1;
+ }
+
+ /**
+ * Create an event object.
+ *
+ * @param {string} eventType The type name of the event.
+ * @param {boolean} bubbles Whether the event should bubble up the DOM.
+ * @param {boolean} cancelable Whether the event can be canceled.
+ * @returns {!Event}
+ */
+ function createEvent_(eventType, bubbles, cancelable) {
+ if ('CustomEvent' in window && typeof window.CustomEvent === 'function') {
+ return new CustomEvent(eventType, {
+ bubbles: bubbles,
+ cancelable: cancelable
+ });
+ } else {
+ var ev = document.createEvent('Events');
+ ev.initEvent(eventType, bubbles, cancelable);
+ return ev;
+ }
+ }
+
+ /**
+ * Searches existing DOM for elements of our component type and upgrades them
+ * if they have not already been upgraded.
+ *
+ * @param {string=} optJsClass the programatic name of the element class we
+ * need to create a new instance of.
+ * @param {string=} optCssClass the name of the CSS class elements of this
+ * type will have.
+ */
+ function upgradeDomInternal(optJsClass, optCssClass) {
+ if (typeof optJsClass === 'undefined' &&
+ typeof optCssClass === 'undefined') {
+ for (var i = 0; i < registeredComponents_.length; i++) {
+ upgradeDomInternal(registeredComponents_[i].className,
+ registeredComponents_[i].cssClass);
+ }
+ } else {
+ var jsClass = /** @type {string} */ (optJsClass);
+ if (typeof optCssClass === 'undefined') {
+ var registeredClass = findRegisteredClass_(jsClass);
+ if (registeredClass) {
+ optCssClass = registeredClass.cssClass;
+ }
+ }
+
+ var elements = document.querySelectorAll('.' + optCssClass);
+ for (var n = 0; n < elements.length; n++) {
+ upgradeElementInternal(elements[n], jsClass);
+ }
+ }
+ }
+
+ /**
+ * Upgrades a specific element rather than all in the DOM.
+ *
+ * @param {!Element} element The element we wish to upgrade.
+ * @param {string=} optJsClass Optional name of the class we want to upgrade
+ * the element to.
+ */
+ function upgradeElementInternal(element, optJsClass) {
+ // Verify argument type.
+ if (!(typeof element === 'object' && element instanceof Element)) {
+ throw new Error('Invalid argument provided to upgrade MDL element.');
+ }
+ // Allow upgrade to be canceled by canceling emitted event.
+ var upgradingEv = createEvent_('mdl-componentupgrading', true, true);
+ element.dispatchEvent(upgradingEv);
+ if (upgradingEv.defaultPrevented) {
+ return;
+ }
+
+ var upgradedList = getUpgradedListOfElement_(element);
+ var classesToUpgrade = [];
+ // If jsClass is not provided scan the registered components to find the
+ // ones matching the element's CSS classList.
+ if (!optJsClass) {
+ var classList = element.classList;
+ registeredComponents_.forEach(function (component) {
+ // Match CSS & Not to be upgraded & Not upgraded.
+ if (classList.contains(component.cssClass) &&
+ classesToUpgrade.indexOf(component) === -1 &&
+ !isElementUpgraded_(element, component.className)) {
+ classesToUpgrade.push(component);
+ }
+ });
+ } else if (!isElementUpgraded_(element, optJsClass)) {
+ classesToUpgrade.push(findRegisteredClass_(optJsClass));
+ }
+
+ // Upgrade the element for each classes.
+ for (var i = 0, n = classesToUpgrade.length, registeredClass; i < n; i++) {
+ registeredClass = classesToUpgrade[i];
+ if (registeredClass) {
+ // Mark element as upgraded.
+ upgradedList.push(registeredClass.className);
+ element.setAttribute('data-upgraded', upgradedList.join(','));
+ var instance = new registeredClass.classConstructor(element);
+ instance[componentConfigProperty_] = registeredClass;
+ createdComponents_.push(instance);
+ // Call any callbacks the user has registered with this component type.
+ for (var j = 0, m = registeredClass.callbacks.length; j < m; j++) {
+ registeredClass.callbacks[j](element);
+ }
+
+ if (registeredClass.widget) {
+ // Assign per element instance for control over API
+ element[registeredClass.className] = instance;
+ }
+ } else {
+ throw new Error(
+ 'Unable to find a registered component for the given class.');
+ }
+
+ var upgradedEv = createEvent_('mdl-componentupgraded', true, false);
+ element.dispatchEvent(upgradedEv);
+ }
+ }
+
+ /**
+ * Upgrades a specific list of elements rather than all in the DOM.
+ *
+ * @param {!Element|!Array|!NodeList|!HTMLCollection} elements
+ * The elements we wish to upgrade.
+ */
+ function upgradeElementsInternal(elements) {
+ if (!Array.isArray(elements)) {
+ if (elements instanceof Element) {
+ elements = [elements];
+ } else {
+ elements = Array.prototype.slice.call(elements);
+ }
+ }
+ for (var i = 0, n = elements.length, element; i < n; i++) {
+ element = elements[i];
+ if (element instanceof HTMLElement) {
+ upgradeElementInternal(element);
+ if (element.children.length > 0) {
+ upgradeElementsInternal(element.children);
+ }
+ }
+ }
+ }
+
+ /**
+ * Registers a class for future use and attempts to upgrade existing DOM.
+ *
+ * @param {componentHandler.ComponentConfigPublic} config
+ */
+ function registerInternal(config) {
+ // In order to support both Closure-compiled and uncompiled code accessing
+ // this method, we need to allow for both the dot and array syntax for
+ // property access. You'll therefore see the `foo.bar || foo['bar']`
+ // pattern repeated across this method.
+ var widgetMissing = (typeof config.widget === 'undefined' &&
+ typeof config['widget'] === 'undefined');
+ var widget = true;
+
+ if (!widgetMissing) {
+ widget = config.widget || config['widget'];
+ }
+
+ var newConfig = /** @type {componentHandler.ComponentConfig} */ ({
+ classConstructor: config.constructor || config['constructor'],
+ className: config.classAsString || config['classAsString'],
+ cssClass: config.cssClass || config['cssClass'],
+ widget: widget,
+ callbacks: []
+ });
+
+ registeredComponents_.forEach(function (item) {
+ if (item.cssClass === newConfig.cssClass) {
+ throw new Error('The provided cssClass has already been registered: ' + item.cssClass);
+ }
+ if (item.className === newConfig.className) {
+ throw new Error('The provided className has already been registered');
+ }
+ });
+
+ if (config.constructor.prototype
+ .hasOwnProperty(componentConfigProperty_)) {
+ throw new Error(
+ 'MDL component classes must not have ' + componentConfigProperty_ +
+ ' defined as a property.');
+ }
+
+ var found = findRegisteredClass_(config.classAsString, newConfig);
+
+ if (!found) {
+ registeredComponents_.push(newConfig);
+ }
+ }
+
+ /**
+ * Allows user to be alerted to any upgrades that are performed for a given
+ * component type
+ *
+ * @param {string} jsClass The class name of the MDL component we wish
+ * to hook into for any upgrades performed.
+ * @param {function(!HTMLElement)} callback The function to call upon an
+ * upgrade. This function should expect 1 parameter - the HTMLElement which
+ * got upgraded.
+ */
+ function registerUpgradedCallbackInternal(jsClass, callback) {
+ var regClass = findRegisteredClass_(jsClass);
+ if (regClass) {
+ regClass.callbacks.push(callback);
+ }
+ }
+
+ /**
+ * Upgrades all registered components found in the current DOM. This is
+ * automatically called on window load.
+ */
+ function upgradeAllRegisteredInternal() {
+ for (var n = 0; n < registeredComponents_.length; n++) {
+ upgradeDomInternal(registeredComponents_[n].className);
+ }
+ }
+
+ /**
+ * Check the component for the downgrade method.
+ * Execute if found.
+ * Remove component from createdComponents list.
+ *
+ * @param {?componentHandler.Component} component
+ */
+ function deconstructComponentInternal(component) {
+ if (component) {
+ var componentIndex = createdComponents_.indexOf(component);
+ createdComponents_.splice(componentIndex, 1);
+
+ var upgrades = component.element_.getAttribute('data-upgraded').split(',');
+ var componentPlace = upgrades.indexOf(component[componentConfigProperty_].classAsString);
+ upgrades.splice(componentPlace, 1);
+ component.element_.setAttribute('data-upgraded', upgrades.join(','));
+
+ var ev = createEvent_('mdl-componentdowngraded', true, false);
+ component.element_.dispatchEvent(ev);
+ }
+ }
+
+ /**
+ * Downgrade either a given node, an array of nodes, or a NodeList.
+ *
+ * @param {!Node|!Array|!NodeList} nodes
+ */
+ function downgradeNodesInternal(nodes) {
+ /**
+ * Auxiliary function to downgrade a single node.
+ * @param {!Node} node the node to be downgraded
+ */
+ var downgradeNode = function (node) {
+ createdComponents_.filter(function (item) {
+ return item.element_ === node;
+ }).forEach(deconstructComponentInternal);
+ };
+ if (nodes instanceof Array || nodes instanceof NodeList) {
+ for (var n = 0; n < nodes.length; n++) {
+ downgradeNode(nodes[n]);
+ }
+ } else if (nodes instanceof Node) {
+ downgradeNode(nodes);
+ } else {
+ throw new Error('Invalid argument provided to downgrade MDL nodes.');
+ }
+ }
+
+ // Now return the functions that should be made public with their publicly
+ // facing names...
+ return {
+ upgradeDom: upgradeDomInternal,
+ upgradeElement: upgradeElementInternal,
+ upgradeElements: upgradeElementsInternal,
+ upgradeAllRegistered: upgradeAllRegisteredInternal,
+ registerUpgradedCallback: registerUpgradedCallbackInternal,
+ register: registerInternal,
+ downgradeElements: downgradeNodesInternal
+ };
+ })();
+
+ /**
+ * Describes the type of a registered component type managed by
+ * componentHandler. Provided for benefit of the Closure compiler.
+ *
+ * @typedef {{
+ * constructor: Function,
+ * classAsString: string,
+ * cssClass: string,
+ * widget: (string|boolean|undefined)
+ * }}
+ */
+ componentHandler.ComponentConfigPublic; // jshint ignore:line
+
+ /**
+ * Describes the type of a registered component type managed by
+ * componentHandler. Provided for benefit of the Closure compiler.
+ *
+ * @typedef {{
+ * constructor: !Function,
+ * className: string,
+ * cssClass: string,
+ * widget: (string|boolean),
+ * callbacks: !Array
+ * }}
+ */
+ componentHandler.ComponentConfig; // jshint ignore:line
+
+ /**
+ * Created component (i.e., upgraded element) type as managed by
+ * componentHandler. Provided for benefit of the Closure compiler.
+ *
+ * @typedef {{
+ * element_: !HTMLElement,
+ * className: string,
+ * classAsString: string,
+ * cssClass: string,
+ * widget: string
+ * }}
+ */
+ componentHandler.Component; // jshint ignore:line
// Export all symbols, for the benefit of Closure compiler.
// No effect on uncompiled code.
-componentHandler['upgradeDom'] = componentHandler.upgradeDom;
-componentHandler['upgradeElement'] = componentHandler.upgradeElement;
-componentHandler['upgradeElements'] = componentHandler.upgradeElements;
-componentHandler['upgradeAllRegistered'] =
- componentHandler.upgradeAllRegistered;
-componentHandler['registerUpgradedCallback'] =
- componentHandler.registerUpgradedCallback;
-componentHandler['register'] = componentHandler.register;
-componentHandler['downgradeElements'] = componentHandler.downgradeElements;
-window.componentHandler = componentHandler;
-window['componentHandler'] = componentHandler;
+ componentHandler['upgradeDom'] = componentHandler.upgradeDom;
+ componentHandler['upgradeElement'] = componentHandler.upgradeElement;
+ componentHandler['upgradeElements'] = componentHandler.upgradeElements;
+ componentHandler['upgradeAllRegistered'] =
+ componentHandler.upgradeAllRegistered;
+ componentHandler['registerUpgradedCallback'] =
+ componentHandler.registerUpgradedCallback;
+ componentHandler['register'] = componentHandler.register;
+ componentHandler['downgradeElements'] = componentHandler.downgradeElements;
+ window.componentHandler = componentHandler;
+ window['componentHandler'] = componentHandler;
-window.addEventListener('load', function() {
- 'use strict';
+ window.addEventListener('load', function () {
+ 'use strict';
- /**
- * Performs a "Cutting the mustard" test. If the browser supports the features
- * tested, adds a mdl-js class to the element. It then upgrades all MDL
- * components requiring JavaScript.
- */
- if ('classList' in document.createElement('div') &&
- 'querySelector' in document &&
- 'addEventListener' in window && Array.prototype.forEach) {
- document.documentElement.classList.add('mdl-js');
- componentHandler.upgradeAllRegistered();
- } else {
- /**
- * Dummy function to avoid JS errors.
- */
- componentHandler.upgradeElement = function() {};
- /**
- * Dummy function to avoid JS errors.
- */
- componentHandler.register = function() {};
- }
-});
+ /**
+ * Performs a "Cutting the mustard" test. If the browser supports the features
+ * tested, adds a mdl-js class to the element. It then upgrades all MDL
+ * components requiring JavaScript.
+ */
+ if ('classList' in document.createElement('div') &&
+ 'querySelector' in document &&
+ 'addEventListener' in window && Array.prototype.forEach) {
+ document.documentElement.classList.add('mdl-js');
+ componentHandler.upgradeAllRegistered();
+ } else {
+ /**
+ * Dummy function to avoid JS errors.
+ */
+ componentHandler.upgradeElement = function () {
+ };
+ /**
+ * Dummy function to avoid JS errors.
+ */
+ componentHandler.register = function () {
+ };
+ }
+ });
// Source: https://github.com/darius/requestAnimationFrame/blob/master/requestAnimationFrame.js
// Adapted from https://gist.github.com/paulirish/1579671 which derived from
@@ -512,3485 +521,3490 @@ window.addEventListener('load', function() {
// requestAnimationFrame polyfill by Erik Möller.
// Fixes from Paul Irish, Tino Zijdel, Andrew Mao, Klemen Slavič, Darius Bacon
// MIT license
-if (!Date.now) {
+ if (!Date.now) {
+ /**
+ * Date.now polyfill.
+ * @return {number} the current Date
+ */
+ Date.now = function () {
+ return new Date().getTime();
+ };
+ Date['now'] = Date.now;
+ }
+ var vendors = [
+ 'webkit',
+ 'moz'
+ ];
+ for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
+ var vp = vendors[i];
+ window.requestAnimationFrame = window[vp + 'RequestAnimationFrame'];
+ window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame'];
+ window['requestAnimationFrame'] = window.requestAnimationFrame;
+ window['cancelAnimationFrame'] = window.cancelAnimationFrame;
+ }
+ if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
+ var lastTime = 0;
+ /**
+ * requestAnimationFrame polyfill.
+ * @param {!Function} callback the callback function.
+ */
+ window.requestAnimationFrame = function (callback) {
+ var now = Date.now();
+ var nextTime = Math.max(lastTime + 16, now);
+ return setTimeout(function () {
+ callback(lastTime = nextTime);
+ }, nextTime - now);
+ };
+ window.cancelAnimationFrame = clearTimeout;
+ window['requestAnimationFrame'] = window.requestAnimationFrame;
+ window['cancelAnimationFrame'] = window.cancelAnimationFrame;
+ }
/**
- * Date.now polyfill.
- * @return {number} the current Date
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*/
- Date.now = function () {
- return new Date().getTime();
- };
- Date['now'] = Date.now;
-}
-var vendors = [
- 'webkit',
- 'moz'
-];
-for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
- var vp = vendors[i];
- window.requestAnimationFrame = window[vp + 'RequestAnimationFrame'];
- window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame'];
- window['requestAnimationFrame'] = window.requestAnimationFrame;
- window['cancelAnimationFrame'] = window.cancelAnimationFrame;
-}
-if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
- var lastTime = 0;
/**
- * requestAnimationFrame polyfill.
- * @param {!Function} callback the callback function.
+ * Class constructor for Button MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @param {HTMLElement} element The element that will be upgraded.
*/
- window.requestAnimationFrame = function (callback) {
- var now = Date.now();
- var nextTime = Math.max(lastTime + 16, now);
- return setTimeout(function () {
- callback(lastTime = nextTime);
- }, nextTime - now);
+ var MaterialButton = function MaterialButton(element) {
+ this.element_ = element;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialButton'] = MaterialButton;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialButton.prototype.Constant_ = {};
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialButton.prototype.CssClasses_ = {
+ RIPPLE_EFFECT: 'mdl-js-ripple-effect',
+ RIPPLE_CONTAINER: 'mdl-button__ripple-container',
+ RIPPLE: 'mdl-ripple'
+ };
+ /**
+ * Handle blur of element.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialButton.prototype.blurHandler_ = function (event) {
+ if (event) {
+ this.element_.blur();
+ }
};
- window.cancelAnimationFrame = clearTimeout;
- window['requestAnimationFrame'] = window.requestAnimationFrame;
- window['cancelAnimationFrame'] = window.cancelAnimationFrame;
-}
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Button MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialButton = function MaterialButton(element) {
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialButton'] = MaterialButton;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialButton.prototype.Constant_ = {};
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialButton.prototype.CssClasses_ = {
- RIPPLE_EFFECT: 'mdl-js-ripple-effect',
- RIPPLE_CONTAINER: 'mdl-button__ripple-container',
- RIPPLE: 'mdl-ripple'
-};
-/**
- * Handle blur of element.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialButton.prototype.blurHandler_ = function (event) {
- if (event) {
- this.element_.blur();
- }
-};
// Public methods.
-/**
- * Disable button.
- *
- * @public
- */
-MaterialButton.prototype.disable = function () {
- this.element_.disabled = true;
-};
-MaterialButton.prototype['disable'] = MaterialButton.prototype.disable;
-/**
- * Enable button.
- *
- * @public
- */
-MaterialButton.prototype.enable = function () {
- this.element_.disabled = false;
-};
-MaterialButton.prototype['enable'] = MaterialButton.prototype.enable;
-/**
- * Initialize element.
- */
-MaterialButton.prototype.init = function () {
- if (this.element_) {
- if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {
- var rippleContainer = document.createElement('span');
- rippleContainer.classList.add(this.CssClasses_.RIPPLE_CONTAINER);
- this.rippleElement_ = document.createElement('span');
- this.rippleElement_.classList.add(this.CssClasses_.RIPPLE);
- rippleContainer.appendChild(this.rippleElement_);
- this.boundRippleBlurHandler = this.blurHandler_.bind(this);
- this.rippleElement_.addEventListener('mouseup', this.boundRippleBlurHandler);
- this.element_.appendChild(rippleContainer);
- }
- this.boundButtonBlurHandler = this.blurHandler_.bind(this);
- this.element_.addEventListener('mouseup', this.boundButtonBlurHandler);
- this.element_.addEventListener('mouseleave', this.boundButtonBlurHandler);
- }
-};
-// The component registers itself. It can assume componentHandler is available
-// in the global scope.
-componentHandler.register({
- constructor: MaterialButton,
- classAsString: 'MaterialButton',
- cssClass: 'mdl-js-button',
- widget: true
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Checkbox MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialCheckbox = function MaterialCheckbox(element) {
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialCheckbox'] = MaterialCheckbox;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialCheckbox.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialCheckbox.prototype.CssClasses_ = {
- INPUT: 'mdl-checkbox__input',
- BOX_OUTLINE: 'mdl-checkbox__box-outline',
- FOCUS_HELPER: 'mdl-checkbox__focus-helper',
- TICK_OUTLINE: 'mdl-checkbox__tick-outline',
- RIPPLE_EFFECT: 'mdl-js-ripple-effect',
- RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
- RIPPLE_CONTAINER: 'mdl-checkbox__ripple-container',
- RIPPLE_CENTER: 'mdl-ripple--center',
- RIPPLE: 'mdl-ripple',
- IS_FOCUSED: 'is-focused',
- IS_DISABLED: 'is-disabled',
- IS_CHECKED: 'is-checked',
- IS_UPGRADED: 'is-upgraded'
-};
-/**
- * Handle change of state.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialCheckbox.prototype.onChange_ = function (event) {
- this.updateClasses_();
-};
-/**
- * Handle focus of element.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialCheckbox.prototype.onFocus_ = function (event) {
- this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
-};
-/**
- * Handle lost focus of element.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialCheckbox.prototype.onBlur_ = function (event) {
- this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
-};
-/**
- * Handle mouseup.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialCheckbox.prototype.onMouseUp_ = function (event) {
- this.blur_();
-};
-/**
- * Handle class updates.
- *
- * @private
- */
-MaterialCheckbox.prototype.updateClasses_ = function () {
- this.checkDisabled();
- this.checkToggleState();
-};
-/**
- * Add blur.
- *
- * @private
- */
-MaterialCheckbox.prototype.blur_ = function () {
- // TODO: figure out why there's a focus event being fired after our blur,
- // so that we can avoid this hack.
- window.setTimeout(function () {
- this.inputElement_.blur();
- }.bind(this), this.Constant_.TINY_TIMEOUT);
-};
-// Public methods.
-/**
- * Check the inputs toggle state and update display.
- *
- * @public
- */
-MaterialCheckbox.prototype.checkToggleState = function () {
- if (this.inputElement_.checked) {
- this.element_.classList.add(this.CssClasses_.IS_CHECKED);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
- }
-};
-MaterialCheckbox.prototype['checkToggleState'] = MaterialCheckbox.prototype.checkToggleState;
-/**
- * Check the inputs disabled state and update display.
- *
- * @public
- */
-MaterialCheckbox.prototype.checkDisabled = function () {
- if (this.inputElement_.disabled) {
- this.element_.classList.add(this.CssClasses_.IS_DISABLED);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
- }
-};
-MaterialCheckbox.prototype['checkDisabled'] = MaterialCheckbox.prototype.checkDisabled;
-/**
- * Disable checkbox.
- *
- * @public
- */
-MaterialCheckbox.prototype.disable = function () {
- this.inputElement_.disabled = true;
- this.updateClasses_();
-};
-MaterialCheckbox.prototype['disable'] = MaterialCheckbox.prototype.disable;
-/**
- * Enable checkbox.
- *
- * @public
- */
-MaterialCheckbox.prototype.enable = function () {
- this.inputElement_.disabled = false;
- this.updateClasses_();
-};
-MaterialCheckbox.prototype['enable'] = MaterialCheckbox.prototype.enable;
-/**
- * Check checkbox.
- *
- * @public
- */
-MaterialCheckbox.prototype.check = function () {
- this.inputElement_.checked = true;
- this.updateClasses_();
-};
-MaterialCheckbox.prototype['check'] = MaterialCheckbox.prototype.check;
-/**
- * Uncheck checkbox.
- *
- * @public
- */
-MaterialCheckbox.prototype.uncheck = function () {
- this.inputElement_.checked = false;
- this.updateClasses_();
-};
-MaterialCheckbox.prototype['uncheck'] = MaterialCheckbox.prototype.uncheck;
-/**
- * Initialize element.
- */
-MaterialCheckbox.prototype.init = function () {
- if (this.element_) {
- this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);
- var boxOutline = document.createElement('span');
- boxOutline.classList.add(this.CssClasses_.BOX_OUTLINE);
- var tickContainer = document.createElement('span');
- tickContainer.classList.add(this.CssClasses_.FOCUS_HELPER);
- var tickOutline = document.createElement('span');
- tickOutline.classList.add(this.CssClasses_.TICK_OUTLINE);
- boxOutline.appendChild(tickOutline);
- this.element_.appendChild(tickContainer);
- this.element_.appendChild(boxOutline);
- if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {
- this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
- this.rippleContainerElement_ = document.createElement('span');
- this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);
- this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_EFFECT);
- this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);
- this.boundRippleMouseUp = this.onMouseUp_.bind(this);
- this.rippleContainerElement_.addEventListener('mouseup', this.boundRippleMouseUp);
- var ripple = document.createElement('span');
- ripple.classList.add(this.CssClasses_.RIPPLE);
- this.rippleContainerElement_.appendChild(ripple);
- this.element_.appendChild(this.rippleContainerElement_);
- }
- this.boundInputOnChange = this.onChange_.bind(this);
- this.boundInputOnFocus = this.onFocus_.bind(this);
- this.boundInputOnBlur = this.onBlur_.bind(this);
- this.boundElementMouseUp = this.onMouseUp_.bind(this);
- this.inputElement_.addEventListener('change', this.boundInputOnChange);
- this.inputElement_.addEventListener('focus', this.boundInputOnFocus);
- this.inputElement_.addEventListener('blur', this.boundInputOnBlur);
- this.element_.addEventListener('mouseup', this.boundElementMouseUp);
- this.updateClasses_();
- this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
- }
-};
-// The component registers itself. It can assume componentHandler is available
-// in the global scope.
-componentHandler.register({
- constructor: MaterialCheckbox,
- classAsString: 'MaterialCheckbox',
- cssClass: 'mdl-js-checkbox',
- widget: true
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for icon toggle MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialIconToggle = function MaterialIconToggle(element) {
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialIconToggle'] = MaterialIconToggle;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialIconToggle.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialIconToggle.prototype.CssClasses_ = {
- INPUT: 'mdl-icon-toggle__input',
- JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',
- RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
- RIPPLE_CONTAINER: 'mdl-icon-toggle__ripple-container',
- RIPPLE_CENTER: 'mdl-ripple--center',
- RIPPLE: 'mdl-ripple',
- IS_FOCUSED: 'is-focused',
- IS_DISABLED: 'is-disabled',
- IS_CHECKED: 'is-checked'
-};
-/**
- * Handle change of state.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialIconToggle.prototype.onChange_ = function (event) {
- this.updateClasses_();
-};
-/**
- * Handle focus of element.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialIconToggle.prototype.onFocus_ = function (event) {
- this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
-};
-/**
- * Handle lost focus of element.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialIconToggle.prototype.onBlur_ = function (event) {
- this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
-};
-/**
- * Handle mouseup.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialIconToggle.prototype.onMouseUp_ = function (event) {
- this.blur_();
-};
-/**
- * Handle class updates.
- *
- * @private
- */
-MaterialIconToggle.prototype.updateClasses_ = function () {
- this.checkDisabled();
- this.checkToggleState();
-};
-/**
- * Add blur.
- *
- * @private
- */
-MaterialIconToggle.prototype.blur_ = function () {
- // TODO: figure out why there's a focus event being fired after our blur,
- // so that we can avoid this hack.
- window.setTimeout(function () {
- this.inputElement_.blur();
- }.bind(this), this.Constant_.TINY_TIMEOUT);
-};
-// Public methods.
-/**
- * Check the inputs toggle state and update display.
- *
- * @public
- */
-MaterialIconToggle.prototype.checkToggleState = function () {
- if (this.inputElement_.checked) {
- this.element_.classList.add(this.CssClasses_.IS_CHECKED);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
- }
-};
-MaterialIconToggle.prototype['checkToggleState'] = MaterialIconToggle.prototype.checkToggleState;
-/**
- * Check the inputs disabled state and update display.
- *
- * @public
- */
-MaterialIconToggle.prototype.checkDisabled = function () {
- if (this.inputElement_.disabled) {
- this.element_.classList.add(this.CssClasses_.IS_DISABLED);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
- }
-};
-MaterialIconToggle.prototype['checkDisabled'] = MaterialIconToggle.prototype.checkDisabled;
-/**
- * Disable icon toggle.
- *
- * @public
- */
-MaterialIconToggle.prototype.disable = function () {
- this.inputElement_.disabled = true;
- this.updateClasses_();
-};
-MaterialIconToggle.prototype['disable'] = MaterialIconToggle.prototype.disable;
-/**
- * Enable icon toggle.
- *
- * @public
- */
-MaterialIconToggle.prototype.enable = function () {
- this.inputElement_.disabled = false;
- this.updateClasses_();
-};
-MaterialIconToggle.prototype['enable'] = MaterialIconToggle.prototype.enable;
-/**
- * Check icon toggle.
- *
- * @public
- */
-MaterialIconToggle.prototype.check = function () {
- this.inputElement_.checked = true;
- this.updateClasses_();
-};
-MaterialIconToggle.prototype['check'] = MaterialIconToggle.prototype.check;
-/**
- * Uncheck icon toggle.
- *
- * @public
- */
-MaterialIconToggle.prototype.uncheck = function () {
- this.inputElement_.checked = false;
- this.updateClasses_();
-};
-MaterialIconToggle.prototype['uncheck'] = MaterialIconToggle.prototype.uncheck;
-/**
- * Initialize element.
- */
-MaterialIconToggle.prototype.init = function () {
- if (this.element_) {
- this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);
- if (this.element_.classList.contains(this.CssClasses_.JS_RIPPLE_EFFECT)) {
- this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
- this.rippleContainerElement_ = document.createElement('span');
- this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);
- this.rippleContainerElement_.classList.add(this.CssClasses_.JS_RIPPLE_EFFECT);
- this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);
- this.boundRippleMouseUp = this.onMouseUp_.bind(this);
- this.rippleContainerElement_.addEventListener('mouseup', this.boundRippleMouseUp);
- var ripple = document.createElement('span');
- ripple.classList.add(this.CssClasses_.RIPPLE);
- this.rippleContainerElement_.appendChild(ripple);
- this.element_.appendChild(this.rippleContainerElement_);
- }
- this.boundInputOnChange = this.onChange_.bind(this);
- this.boundInputOnFocus = this.onFocus_.bind(this);
- this.boundInputOnBlur = this.onBlur_.bind(this);
- this.boundElementOnMouseUp = this.onMouseUp_.bind(this);
- this.inputElement_.addEventListener('change', this.boundInputOnChange);
- this.inputElement_.addEventListener('focus', this.boundInputOnFocus);
- this.inputElement_.addEventListener('blur', this.boundInputOnBlur);
- this.element_.addEventListener('mouseup', this.boundElementOnMouseUp);
- this.updateClasses_();
- this.element_.classList.add('is-upgraded');
- }
-};
-// The component registers itself. It can assume componentHandler is available
-// in the global scope.
-componentHandler.register({
- constructor: MaterialIconToggle,
- classAsString: 'MaterialIconToggle',
- cssClass: 'mdl-js-icon-toggle',
- widget: true
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for dropdown MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialMenu = function MaterialMenu(element) {
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialMenu'] = MaterialMenu;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialMenu.prototype.Constant_ = {
- // Total duration of the menu animation.
- TRANSITION_DURATION_SECONDS: 0.3,
- // The fraction of the total duration we want to use for menu item animations.
- TRANSITION_DURATION_FRACTION: 0.8,
- // How long the menu stays open after choosing an option (so the user can see
- // the ripple).
- CLOSE_TIMEOUT: 150
-};
-/**
- * Keycodes, for code readability.
- *
- * @enum {number}
- * @private
- */
-MaterialMenu.prototype.Keycodes_ = {
- ENTER: 13,
- ESCAPE: 27,
- SPACE: 32,
- UP_ARROW: 38,
- DOWN_ARROW: 40
-};
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialMenu.prototype.CssClasses_ = {
- CONTAINER: 'mdl-menu__container',
- OUTLINE: 'mdl-menu__outline',
- ITEM: 'mdl-menu__item',
- ITEM_RIPPLE_CONTAINER: 'mdl-menu__item-ripple-container',
- RIPPLE_EFFECT: 'mdl-js-ripple-effect',
- RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
- RIPPLE: 'mdl-ripple',
- // Statuses
- IS_UPGRADED: 'is-upgraded',
- IS_VISIBLE: 'is-visible',
- IS_ANIMATING: 'is-animating',
- // Alignment options
- BOTTOM_LEFT: 'mdl-menu--bottom-left',
- // This is the default.
- BOTTOM_RIGHT: 'mdl-menu--bottom-right',
- TOP_LEFT: 'mdl-menu--top-left',
- TOP_RIGHT: 'mdl-menu--top-right',
- UNALIGNED: 'mdl-menu--unaligned'
-};
-/**
- * Initialize element.
- */
-MaterialMenu.prototype.init = function () {
- if (this.element_) {
- // Create container for the menu.
- var container = document.createElement('div');
- container.classList.add(this.CssClasses_.CONTAINER);
- this.element_.parentElement.insertBefore(container, this.element_);
- this.element_.parentElement.removeChild(this.element_);
- container.appendChild(this.element_);
- this.container_ = container;
- // Create outline for the menu (shadow and background).
- var outline = document.createElement('div');
- outline.classList.add(this.CssClasses_.OUTLINE);
- this.outline_ = outline;
- container.insertBefore(outline, this.element_);
- // Find the "for" element and bind events to it.
- var forElId = this.element_.getAttribute('for') || this.element_.getAttribute('data-mdl-for');
- var forEl = null;
- if (forElId) {
- forEl = document.getElementById(forElId);
- if (forEl) {
- this.forElement_ = forEl;
- forEl.addEventListener('click', this.handleForClick_.bind(this));
- forEl.addEventListener('keydown', this.handleForKeyboardEvent_.bind(this));
- }
- }
- var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);
- this.boundItemKeydown_ = this.handleItemKeyboardEvent_.bind(this);
- this.boundItemClick_ = this.handleItemClick_.bind(this);
- for (var i = 0; i < items.length; i++) {
- // Add a listener to each menu item.
- items[i].addEventListener('click', this.boundItemClick_);
- // Add a tab index to each menu item.
- items[i].tabIndex = '-1';
- // Add a keyboard listener to each menu item.
- items[i].addEventListener('keydown', this.boundItemKeydown_);
- }
- // Add ripple classes to each item, if the user has enabled ripples.
- if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {
- this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
- for (i = 0; i < items.length; i++) {
- var item = items[i];
+ /**
+ * Disable button.
+ *
+ * @public
+ */
+ MaterialButton.prototype.disable = function () {
+ this.element_.disabled = true;
+ };
+ MaterialButton.prototype['disable'] = MaterialButton.prototype.disable;
+ /**
+ * Enable button.
+ *
+ * @public
+ */
+ MaterialButton.prototype.enable = function () {
+ this.element_.disabled = false;
+ };
+ MaterialButton.prototype['enable'] = MaterialButton.prototype.enable;
+ /**
+ * Initialize element.
+ */
+ MaterialButton.prototype.init = function () {
+ if (this.element_) {
+ if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {
var rippleContainer = document.createElement('span');
- rippleContainer.classList.add(this.CssClasses_.ITEM_RIPPLE_CONTAINER);
+ rippleContainer.classList.add(this.CssClasses_.RIPPLE_CONTAINER);
+ this.rippleElement_ = document.createElement('span');
+ this.rippleElement_.classList.add(this.CssClasses_.RIPPLE);
+ rippleContainer.appendChild(this.rippleElement_);
+ this.boundRippleBlurHandler = this.blurHandler_.bind(this);
+ this.rippleElement_.addEventListener('mouseup', this.boundRippleBlurHandler);
+ this.element_.appendChild(rippleContainer);
+ }
+ this.boundButtonBlurHandler = this.blurHandler_.bind(this);
+ this.element_.addEventListener('mouseup', this.boundButtonBlurHandler);
+ this.element_.addEventListener('mouseleave', this.boundButtonBlurHandler);
+ }
+ };
+// The component registers itself. It can assume componentHandler is available
+// in the global scope.
+ componentHandler.register({
+ constructor: MaterialButton,
+ classAsString: 'MaterialButton',
+ cssClass: 'mdl-js-button',
+ widget: true
+ });
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for Checkbox MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+ var MaterialCheckbox = function MaterialCheckbox(element) {
+ this.element_ = element;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialCheckbox'] = MaterialCheckbox;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialCheckbox.prototype.Constant_ = {TINY_TIMEOUT: 0.001};
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialCheckbox.prototype.CssClasses_ = {
+ INPUT: 'mdl-checkbox__input',
+ BOX_OUTLINE: 'mdl-checkbox__box-outline',
+ FOCUS_HELPER: 'mdl-checkbox__focus-helper',
+ TICK_OUTLINE: 'mdl-checkbox__tick-outline',
+ RIPPLE_EFFECT: 'mdl-js-ripple-effect',
+ RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
+ RIPPLE_CONTAINER: 'mdl-checkbox__ripple-container',
+ RIPPLE_CENTER: 'mdl-ripple--center',
+ RIPPLE: 'mdl-ripple',
+ IS_FOCUSED: 'is-focused',
+ IS_DISABLED: 'is-disabled',
+ IS_CHECKED: 'is-checked',
+ IS_UPGRADED: 'is-upgraded'
+ };
+ /**
+ * Handle change of state.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialCheckbox.prototype.onChange_ = function (event) {
+ this.updateClasses_();
+ };
+ /**
+ * Handle focus of element.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialCheckbox.prototype.onFocus_ = function (event) {
+ this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
+ };
+ /**
+ * Handle lost focus of element.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialCheckbox.prototype.onBlur_ = function (event) {
+ this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
+ };
+ /**
+ * Handle mouseup.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialCheckbox.prototype.onMouseUp_ = function (event) {
+ this.blur_();
+ };
+ /**
+ * Handle class updates.
+ *
+ * @private
+ */
+ MaterialCheckbox.prototype.updateClasses_ = function () {
+ this.checkDisabled();
+ this.checkToggleState();
+ };
+ /**
+ * Add blur.
+ *
+ * @private
+ */
+ MaterialCheckbox.prototype.blur_ = function () {
+ // TODO: figure out why there's a focus event being fired after our blur,
+ // so that we can avoid this hack.
+ window.setTimeout(function () {
+ this.inputElement_.blur();
+ }.bind(this), this.Constant_.TINY_TIMEOUT);
+ };
+// Public methods.
+ /**
+ * Check the inputs toggle state and update display.
+ *
+ * @public
+ */
+ MaterialCheckbox.prototype.checkToggleState = function () {
+ if (this.inputElement_.checked) {
+ this.element_.classList.add(this.CssClasses_.IS_CHECKED);
+ } else {
+ this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
+ }
+ };
+ MaterialCheckbox.prototype['checkToggleState'] = MaterialCheckbox.prototype.checkToggleState;
+ /**
+ * Check the inputs disabled state and update display.
+ *
+ * @public
+ */
+ MaterialCheckbox.prototype.checkDisabled = function () {
+ if (this.inputElement_.disabled) {
+ this.element_.classList.add(this.CssClasses_.IS_DISABLED);
+ } else {
+ this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
+ }
+ };
+ MaterialCheckbox.prototype['checkDisabled'] = MaterialCheckbox.prototype.checkDisabled;
+ /**
+ * Disable checkbox.
+ *
+ * @public
+ */
+ MaterialCheckbox.prototype.disable = function () {
+ this.inputElement_.disabled = true;
+ this.updateClasses_();
+ };
+ MaterialCheckbox.prototype['disable'] = MaterialCheckbox.prototype.disable;
+ /**
+ * Enable checkbox.
+ *
+ * @public
+ */
+ MaterialCheckbox.prototype.enable = function () {
+ this.inputElement_.disabled = false;
+ this.updateClasses_();
+ };
+ MaterialCheckbox.prototype['enable'] = MaterialCheckbox.prototype.enable;
+ /**
+ * Check checkbox.
+ *
+ * @public
+ */
+ MaterialCheckbox.prototype.check = function () {
+ this.inputElement_.checked = true;
+ this.updateClasses_();
+ };
+ MaterialCheckbox.prototype['check'] = MaterialCheckbox.prototype.check;
+ /**
+ * Uncheck checkbox.
+ *
+ * @public
+ */
+ MaterialCheckbox.prototype.uncheck = function () {
+ this.inputElement_.checked = false;
+ this.updateClasses_();
+ };
+ MaterialCheckbox.prototype['uncheck'] = MaterialCheckbox.prototype.uncheck;
+ /**
+ * Initialize element.
+ */
+ MaterialCheckbox.prototype.init = function () {
+ if (this.element_) {
+ this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);
+ var boxOutline = document.createElement('span');
+ boxOutline.classList.add(this.CssClasses_.BOX_OUTLINE);
+ var tickContainer = document.createElement('span');
+ tickContainer.classList.add(this.CssClasses_.FOCUS_HELPER);
+ var tickOutline = document.createElement('span');
+ tickOutline.classList.add(this.CssClasses_.TICK_OUTLINE);
+ boxOutline.appendChild(tickOutline);
+ this.element_.appendChild(tickContainer);
+ this.element_.appendChild(boxOutline);
+ if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {
+ this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
+ this.rippleContainerElement_ = document.createElement('span');
+ this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);
+ this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_EFFECT);
+ this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);
+ this.boundRippleMouseUp = this.onMouseUp_.bind(this);
+ this.rippleContainerElement_.addEventListener('mouseup', this.boundRippleMouseUp);
var ripple = document.createElement('span');
ripple.classList.add(this.CssClasses_.RIPPLE);
- rippleContainer.appendChild(ripple);
- item.appendChild(rippleContainer);
- item.classList.add(this.CssClasses_.RIPPLE_EFFECT);
+ this.rippleContainerElement_.appendChild(ripple);
+ this.element_.appendChild(this.rippleContainerElement_);
}
+ this.boundInputOnChange = this.onChange_.bind(this);
+ this.boundInputOnFocus = this.onFocus_.bind(this);
+ this.boundInputOnBlur = this.onBlur_.bind(this);
+ this.boundElementMouseUp = this.onMouseUp_.bind(this);
+ this.inputElement_.addEventListener('change', this.boundInputOnChange);
+ this.inputElement_.addEventListener('focus', this.boundInputOnFocus);
+ this.inputElement_.addEventListener('blur', this.boundInputOnBlur);
+ this.element_.addEventListener('mouseup', this.boundElementMouseUp);
+ this.updateClasses_();
+ this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
}
- // Copy alignment classes to the container, so the outline can use them.
- if (this.element_.classList.contains(this.CssClasses_.BOTTOM_LEFT)) {
- this.outline_.classList.add(this.CssClasses_.BOTTOM_LEFT);
- }
- if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {
- this.outline_.classList.add(this.CssClasses_.BOTTOM_RIGHT);
- }
- if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {
- this.outline_.classList.add(this.CssClasses_.TOP_LEFT);
- }
- if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {
- this.outline_.classList.add(this.CssClasses_.TOP_RIGHT);
- }
- if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {
- this.outline_.classList.add(this.CssClasses_.UNALIGNED);
- }
- container.classList.add(this.CssClasses_.IS_UPGRADED);
- }
-};
-/**
- * Handles a click on the "for" element, by positioning the menu and then
- * toggling it.
- *
- * @param {Event} evt The event that fired.
- * @private
- */
-MaterialMenu.prototype.handleForClick_ = function (evt) {
- if (this.element_ && this.forElement_) {
- var rect = this.forElement_.getBoundingClientRect();
- var forRect = this.forElement_.parentElement.getBoundingClientRect();
- if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {
- } else if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {
- // Position below the "for" element, aligned to its right.
- this.container_.style.right = forRect.right - rect.right + 'px';
- this.container_.style.top = this.forElement_.offsetTop + this.forElement_.offsetHeight + 'px';
- } else if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {
- // Position above the "for" element, aligned to its left.
- this.container_.style.left = this.forElement_.offsetLeft + 'px';
- this.container_.style.bottom = forRect.bottom - rect.top + 'px';
- } else if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {
- // Position above the "for" element, aligned to its right.
- this.container_.style.right = forRect.right - rect.right + 'px';
- this.container_.style.bottom = forRect.bottom - rect.top + 'px';
- } else {
- // Default: position below the "for" element, aligned to its left.
- this.container_.style.left = this.forElement_.offsetLeft + 'px';
- this.container_.style.top = this.forElement_.offsetTop + this.forElement_.offsetHeight + 'px';
- }
- }
- this.toggle(evt);
-};
-/**
- * Handles a keyboard event on the "for" element.
- *
- * @param {Event} evt The event that fired.
- * @private
- */
-MaterialMenu.prototype.handleForKeyboardEvent_ = function (evt) {
- if (this.element_ && this.container_ && this.forElement_) {
- var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM + ':not([disabled])');
- if (items && items.length > 0 && this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {
- if (evt.keyCode === this.Keycodes_.UP_ARROW) {
- evt.preventDefault();
- items[items.length - 1].focus();
- } else if (evt.keyCode === this.Keycodes_.DOWN_ARROW) {
- evt.preventDefault();
- items[0].focus();
- }
- }
- }
-};
-/**
- * Handles a keyboard event on an item.
- *
- * @param {Event} evt The event that fired.
- * @private
- */
-MaterialMenu.prototype.handleItemKeyboardEvent_ = function (evt) {
- if (this.element_ && this.container_) {
- var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM + ':not([disabled])');
- if (items && items.length > 0 && this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {
- var currentIndex = Array.prototype.slice.call(items).indexOf(evt.target);
- if (evt.keyCode === this.Keycodes_.UP_ARROW) {
- evt.preventDefault();
- if (currentIndex > 0) {
- items[currentIndex - 1].focus();
- } else {
- items[items.length - 1].focus();
- }
- } else if (evt.keyCode === this.Keycodes_.DOWN_ARROW) {
- evt.preventDefault();
- if (items.length > currentIndex + 1) {
- items[currentIndex + 1].focus();
- } else {
- items[0].focus();
- }
- } else if (evt.keyCode === this.Keycodes_.SPACE || evt.keyCode === this.Keycodes_.ENTER) {
- evt.preventDefault();
- // Send mousedown and mouseup to trigger ripple.
- var e = new MouseEvent('mousedown');
- evt.target.dispatchEvent(e);
- e = new MouseEvent('mouseup');
- evt.target.dispatchEvent(e);
- // Send click.
- evt.target.click();
- } else if (evt.keyCode === this.Keycodes_.ESCAPE) {
- evt.preventDefault();
- this.hide();
- }
- }
- }
-};
-/**
- * Handles a click event on an item.
- *
- * @param {Event} evt The event that fired.
- * @private
- */
-MaterialMenu.prototype.handleItemClick_ = function (evt) {
- if (evt.target.hasAttribute('disabled')) {
- evt.stopPropagation();
- } else {
- // Wait some time before closing menu, so the user can see the ripple.
- this.closing_ = true;
- window.setTimeout(function (evt) {
- this.hide();
- this.closing_ = false;
- }.bind(this), this.Constant_.CLOSE_TIMEOUT);
- }
-};
-/**
- * Calculates the initial clip (for opening the menu) or final clip (for closing
- * it), and applies it. This allows us to animate from or to the correct point,
- * that is, the point it's aligned to in the "for" element.
- *
- * @param {number} height Height of the clip rectangle
- * @param {number} width Width of the clip rectangle
- * @private
- */
-MaterialMenu.prototype.applyClip_ = function (height, width) {
- if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {
- // Do not clip.
- this.element_.style.clip = '';
- } else if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {
- // Clip to the top right corner of the menu.
- this.element_.style.clip = 'rect(0 ' + width + 'px ' + '0 ' + width + 'px)';
- } else if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {
- // Clip to the bottom left corner of the menu.
- this.element_.style.clip = 'rect(' + height + 'px 0 ' + height + 'px 0)';
- } else if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {
- // Clip to the bottom right corner of the menu.
- this.element_.style.clip = 'rect(' + height + 'px ' + width + 'px ' + height + 'px ' + width + 'px)';
- } else {
- // Default: do not clip (same as clipping to the top left corner).
- this.element_.style.clip = '';
- }
-};
-/**
- * Cleanup function to remove animation listeners.
- *
- * @param {Event} evt
- * @private
- */
-MaterialMenu.prototype.removeAnimationEndListener_ = function (evt) {
- evt.target.classList.remove(MaterialMenu.prototype.CssClasses_.IS_ANIMATING);
-};
-/**
- * Adds an event listener to clean up after the animation ends.
- *
- * @private
- */
-MaterialMenu.prototype.addAnimationEndListener_ = function () {
- this.element_.addEventListener('transitionend', this.removeAnimationEndListener_);
- this.element_.addEventListener('webkitTransitionEnd', this.removeAnimationEndListener_);
-};
-/**
- * Displays the menu.
- *
- * @public
- */
-MaterialMenu.prototype.show = function (evt) {
- if (this.element_ && this.container_ && this.outline_) {
- // Measure the inner element.
- var height = this.element_.getBoundingClientRect().height;
- var width = this.element_.getBoundingClientRect().width;
- // Apply the inner element's size to the container and outline.
- this.container_.style.width = width + 'px';
- this.container_.style.height = height + 'px';
- this.outline_.style.width = width + 'px';
- this.outline_.style.height = height + 'px';
- var transitionDuration = this.Constant_.TRANSITION_DURATION_SECONDS * this.Constant_.TRANSITION_DURATION_FRACTION;
- // Calculate transition delays for individual menu items, so that they fade
- // in one at a time.
- var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);
- for (var i = 0; i < items.length; i++) {
- var itemDelay = null;
- if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT) || this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {
- itemDelay = (height - items[i].offsetTop - items[i].offsetHeight) / height * transitionDuration + 's';
- } else {
- itemDelay = items[i].offsetTop / height * transitionDuration + 's';
- }
- items[i].style.transitionDelay = itemDelay;
- }
- // Apply the initial clip to the text before we start animating.
- this.applyClip_(height, width);
- // Wait for the next frame, turn on animation, and apply the final clip.
- // Also make it visible. This triggers the transitions.
- window.requestAnimationFrame(function () {
- this.element_.classList.add(this.CssClasses_.IS_ANIMATING);
- this.element_.style.clip = 'rect(0 ' + width + 'px ' + height + 'px 0)';
- this.container_.classList.add(this.CssClasses_.IS_VISIBLE);
- }.bind(this));
- // Clean up after the animation is complete.
- this.addAnimationEndListener_();
- // Add a click listener to the document, to close the menu.
- var callback = function (e) {
- // Check to see if the document is processing the same event that
- // displayed the menu in the first place. If so, do nothing.
- // Also check to see if the menu is in the process of closing itself, and
- // do nothing in that case.
- // Also check if the clicked element is a menu item
- // if so, do nothing.
- if (e !== evt && !this.closing_ && e.target.parentNode !== this.element_) {
- document.removeEventListener('click', callback);
- this.hide();
- }
- }.bind(this);
- document.addEventListener('click', callback);
- }
-};
-MaterialMenu.prototype['show'] = MaterialMenu.prototype.show;
-/**
- * Hides the menu.
- *
- * @public
- */
-MaterialMenu.prototype.hide = function () {
- if (this.element_ && this.container_ && this.outline_) {
- var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);
- // Remove all transition delays; menu items fade out concurrently.
- for (var i = 0; i < items.length; i++) {
- items[i].style.removeProperty('transition-delay');
- }
- // Measure the inner element.
- var rect = this.element_.getBoundingClientRect();
- var height = rect.height;
- var width = rect.width;
- // Turn on animation, and apply the final clip. Also make invisible.
- // This triggers the transitions.
- this.element_.classList.add(this.CssClasses_.IS_ANIMATING);
- this.applyClip_(height, width);
- this.container_.classList.remove(this.CssClasses_.IS_VISIBLE);
- // Clean up after the animation is complete.
- this.addAnimationEndListener_();
- }
-};
-MaterialMenu.prototype['hide'] = MaterialMenu.prototype.hide;
-/**
- * Displays or hides the menu, depending on current state.
- *
- * @public
- */
-MaterialMenu.prototype.toggle = function (evt) {
- if (this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {
- this.hide();
- } else {
- this.show(evt);
- }
-};
-MaterialMenu.prototype['toggle'] = MaterialMenu.prototype.toggle;
+ };
// The component registers itself. It can assume componentHandler is available
// in the global scope.
-componentHandler.register({
- constructor: MaterialMenu,
- classAsString: 'MaterialMenu',
- cssClass: 'mdl-js-menu',
- widget: true
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Progress MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialProgress = function MaterialProgress(element) {
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialProgress'] = MaterialProgress;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialProgress.prototype.Constant_ = {};
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialProgress.prototype.CssClasses_ = { INDETERMINATE_CLASS: 'mdl-progress__indeterminate' };
-/**
- * Set the current progress of the progressbar.
- *
- * @param {number} p Percentage of the progress (0-100)
- * @public
- */
-MaterialProgress.prototype.setProgress = function (p) {
- if (this.element_.classList.contains(this.CssClasses_.INDETERMINATE_CLASS)) {
- return;
- }
- this.progressbar_.style.width = p + '%';
-};
-MaterialProgress.prototype['setProgress'] = MaterialProgress.prototype.setProgress;
-/**
- * Set the current progress of the buffer.
- *
- * @param {number} p Percentage of the buffer (0-100)
- * @public
- */
-MaterialProgress.prototype.setBuffer = function (p) {
- this.bufferbar_.style.width = p + '%';
- this.auxbar_.style.width = 100 - p + '%';
-};
-MaterialProgress.prototype['setBuffer'] = MaterialProgress.prototype.setBuffer;
-/**
- * Initialize element.
- */
-MaterialProgress.prototype.init = function () {
- if (this.element_) {
- var el = document.createElement('div');
- el.className = 'progressbar bar bar1';
- this.element_.appendChild(el);
- this.progressbar_ = el;
- el = document.createElement('div');
- el.className = 'bufferbar bar bar2';
- this.element_.appendChild(el);
- this.bufferbar_ = el;
- el = document.createElement('div');
- el.className = 'auxbar bar bar3';
- this.element_.appendChild(el);
- this.auxbar_ = el;
- this.progressbar_.style.width = '0%';
- this.bufferbar_.style.width = '100%';
- this.auxbar_.style.width = '0%';
- this.element_.classList.add('is-upgraded');
- }
-};
-// The component registers itself. It can assume componentHandler is available
-// in the global scope.
-componentHandler.register({
- constructor: MaterialProgress,
- classAsString: 'MaterialProgress',
- cssClass: 'mdl-js-progress',
- widget: true
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Radio MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialRadio = function MaterialRadio(element) {
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialRadio'] = MaterialRadio;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialRadio.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialRadio.prototype.CssClasses_ = {
- IS_FOCUSED: 'is-focused',
- IS_DISABLED: 'is-disabled',
- IS_CHECKED: 'is-checked',
- IS_UPGRADED: 'is-upgraded',
- JS_RADIO: 'mdl-js-radio',
- RADIO_BTN: 'mdl-radio__button',
- RADIO_OUTER_CIRCLE: 'mdl-radio__outer-circle',
- RADIO_INNER_CIRCLE: 'mdl-radio__inner-circle',
- RIPPLE_EFFECT: 'mdl-js-ripple-effect',
- RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
- RIPPLE_CONTAINER: 'mdl-radio__ripple-container',
- RIPPLE_CENTER: 'mdl-ripple--center',
- RIPPLE: 'mdl-ripple'
-};
-/**
- * Handle change of state.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialRadio.prototype.onChange_ = function (event) {
- // Since other radio buttons don't get change events, we need to look for
- // them to update their classes.
- var radios = document.getElementsByClassName(this.CssClasses_.JS_RADIO);
- for (var i = 0; i < radios.length; i++) {
- var button = radios[i].querySelector('.' + this.CssClasses_.RADIO_BTN);
- // Different name == different group, so no point updating those.
- if (button.getAttribute('name') === this.btnElement_.getAttribute('name')) {
- if (typeof radios[i]['MaterialRadio'] !== 'undefined') {
- radios[i]['MaterialRadio'].updateClasses_();
- }
- }
- }
-};
-/**
- * Handle focus.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialRadio.prototype.onFocus_ = function (event) {
- this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
-};
-/**
- * Handle lost focus.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialRadio.prototype.onBlur_ = function (event) {
- this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
-};
-/**
- * Handle mouseup.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialRadio.prototype.onMouseup_ = function (event) {
- this.blur_();
-};
-/**
- * Update classes.
- *
- * @private
- */
-MaterialRadio.prototype.updateClasses_ = function () {
- this.checkDisabled();
- this.checkToggleState();
-};
-/**
- * Add blur.
- *
- * @private
- */
-MaterialRadio.prototype.blur_ = function () {
- // TODO: figure out why there's a focus event being fired after our blur,
- // so that we can avoid this hack.
- window.setTimeout(function () {
- this.btnElement_.blur();
- }.bind(this), this.Constant_.TINY_TIMEOUT);
-};
-// Public methods.
-/**
- * Check the components disabled state.
- *
- * @public
- */
-MaterialRadio.prototype.checkDisabled = function () {
- if (this.btnElement_.disabled) {
- this.element_.classList.add(this.CssClasses_.IS_DISABLED);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
- }
-};
-MaterialRadio.prototype['checkDisabled'] = MaterialRadio.prototype.checkDisabled;
-/**
- * Check the components toggled state.
- *
- * @public
- */
-MaterialRadio.prototype.checkToggleState = function () {
- if (this.btnElement_.checked) {
- this.element_.classList.add(this.CssClasses_.IS_CHECKED);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
- }
-};
-MaterialRadio.prototype['checkToggleState'] = MaterialRadio.prototype.checkToggleState;
-/**
- * Disable radio.
- *
- * @public
- */
-MaterialRadio.prototype.disable = function () {
- this.btnElement_.disabled = true;
- this.updateClasses_();
-};
-MaterialRadio.prototype['disable'] = MaterialRadio.prototype.disable;
-/**
- * Enable radio.
- *
- * @public
- */
-MaterialRadio.prototype.enable = function () {
- this.btnElement_.disabled = false;
- this.updateClasses_();
-};
-MaterialRadio.prototype['enable'] = MaterialRadio.prototype.enable;
-/**
- * Check radio.
- *
- * @public
- */
-MaterialRadio.prototype.check = function () {
- this.btnElement_.checked = true;
- this.onChange_(null);
-};
-MaterialRadio.prototype['check'] = MaterialRadio.prototype.check;
-/**
- * Uncheck radio.
- *
- * @public
- */
-MaterialRadio.prototype.uncheck = function () {
- this.btnElement_.checked = false;
- this.onChange_(null);
-};
-MaterialRadio.prototype['uncheck'] = MaterialRadio.prototype.uncheck;
-/**
- * Initialize element.
- */
-MaterialRadio.prototype.init = function () {
- if (this.element_) {
- this.btnElement_ = this.element_.querySelector('.' + this.CssClasses_.RADIO_BTN);
- this.boundChangeHandler_ = this.onChange_.bind(this);
- this.boundFocusHandler_ = this.onChange_.bind(this);
- this.boundBlurHandler_ = this.onBlur_.bind(this);
- this.boundMouseUpHandler_ = this.onMouseup_.bind(this);
- var outerCircle = document.createElement('span');
- outerCircle.classList.add(this.CssClasses_.RADIO_OUTER_CIRCLE);
- var innerCircle = document.createElement('span');
- innerCircle.classList.add(this.CssClasses_.RADIO_INNER_CIRCLE);
- this.element_.appendChild(outerCircle);
- this.element_.appendChild(innerCircle);
- var rippleContainer;
- if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {
- this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
- rippleContainer = document.createElement('span');
- rippleContainer.classList.add(this.CssClasses_.RIPPLE_CONTAINER);
- rippleContainer.classList.add(this.CssClasses_.RIPPLE_EFFECT);
- rippleContainer.classList.add(this.CssClasses_.RIPPLE_CENTER);
- rippleContainer.addEventListener('mouseup', this.boundMouseUpHandler_);
- var ripple = document.createElement('span');
- ripple.classList.add(this.CssClasses_.RIPPLE);
- rippleContainer.appendChild(ripple);
- this.element_.appendChild(rippleContainer);
- }
- this.btnElement_.addEventListener('change', this.boundChangeHandler_);
- this.btnElement_.addEventListener('focus', this.boundFocusHandler_);
- this.btnElement_.addEventListener('blur', this.boundBlurHandler_);
- this.element_.addEventListener('mouseup', this.boundMouseUpHandler_);
- this.updateClasses_();
- this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
- }
-};
-// The component registers itself. It can assume componentHandler is available
-// in the global scope.
-componentHandler.register({
- constructor: MaterialRadio,
- classAsString: 'MaterialRadio',
- cssClass: 'mdl-js-radio',
- widget: true
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Slider MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialSlider = function MaterialSlider(element) {
- this.element_ = element;
- // Browser feature detection.
- this.isIE_ = window.navigator.msPointerEnabled;
- // Initialize instance.
- this.init();
-};
-window['MaterialSlider'] = MaterialSlider;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialSlider.prototype.Constant_ = {};
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialSlider.prototype.CssClasses_ = {
- IE_CONTAINER: 'mdl-slider__ie-container',
- SLIDER_CONTAINER: 'mdl-slider__container',
- BACKGROUND_FLEX: 'mdl-slider__background-flex',
- BACKGROUND_LOWER: 'mdl-slider__background-lower',
- BACKGROUND_UPPER: 'mdl-slider__background-upper',
- IS_LOWEST_VALUE: 'is-lowest-value',
- IS_UPGRADED: 'is-upgraded'
-};
-/**
- * Handle input on element.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialSlider.prototype.onInput_ = function (event) {
- this.updateValueStyles_();
-};
-/**
- * Handle change on element.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialSlider.prototype.onChange_ = function (event) {
- this.updateValueStyles_();
-};
-/**
- * Handle mouseup on element.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialSlider.prototype.onMouseUp_ = function (event) {
- event.target.blur();
-};
-/**
- * Handle mousedown on container element.
- * This handler is purpose is to not require the use to click
- * exactly on the 2px slider element, as FireFox seems to be very
- * strict about this.
- *
- * @param {Event} event The event that fired.
- * @private
- * @suppress {missingProperties}
- */
-MaterialSlider.prototype.onContainerMouseDown_ = function (event) {
- // If this click is not on the parent element (but rather some child)
- // ignore. It may still bubble up.
- if (event.target !== this.element_.parentElement) {
- return;
- }
- // Discard the original event and create a new event that
- // is on the slider element.
- event.preventDefault();
- var newEvent = new MouseEvent('mousedown', {
- target: event.target,
- buttons: event.buttons,
- clientX: event.clientX,
- clientY: this.element_.getBoundingClientRect().y
+ componentHandler.register({
+ constructor: MaterialCheckbox,
+ classAsString: 'MaterialCheckbox',
+ cssClass: 'mdl-js-checkbox',
+ widget: true
});
- this.element_.dispatchEvent(newEvent);
-};
-/**
- * Handle updating of values.
- *
- * @private
- */
-MaterialSlider.prototype.updateValueStyles_ = function () {
- // Calculate and apply percentages to div structure behind slider.
- var fraction = (this.element_.value - this.element_.min) / (this.element_.max - this.element_.min);
- if (fraction === 0) {
- this.element_.classList.add(this.CssClasses_.IS_LOWEST_VALUE);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_LOWEST_VALUE);
- }
- if (!this.isIE_) {
- this.backgroundLower_.style.flex = fraction;
- this.backgroundLower_.style.webkitFlex = fraction;
- this.backgroundUpper_.style.flex = 1 - fraction;
- this.backgroundUpper_.style.webkitFlex = 1 - fraction;
- }
-};
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for icon toggle MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+ var MaterialIconToggle = function MaterialIconToggle(element) {
+ this.element_ = element;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialIconToggle'] = MaterialIconToggle;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialIconToggle.prototype.Constant_ = {TINY_TIMEOUT: 0.001};
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialIconToggle.prototype.CssClasses_ = {
+ INPUT: 'mdl-icon-toggle__input',
+ JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',
+ RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
+ RIPPLE_CONTAINER: 'mdl-icon-toggle__ripple-container',
+ RIPPLE_CENTER: 'mdl-ripple--center',
+ RIPPLE: 'mdl-ripple',
+ IS_FOCUSED: 'is-focused',
+ IS_DISABLED: 'is-disabled',
+ IS_CHECKED: 'is-checked'
+ };
+ /**
+ * Handle change of state.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialIconToggle.prototype.onChange_ = function (event) {
+ this.updateClasses_();
+ };
+ /**
+ * Handle focus of element.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialIconToggle.prototype.onFocus_ = function (event) {
+ this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
+ };
+ /**
+ * Handle lost focus of element.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialIconToggle.prototype.onBlur_ = function (event) {
+ this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
+ };
+ /**
+ * Handle mouseup.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialIconToggle.prototype.onMouseUp_ = function (event) {
+ this.blur_();
+ };
+ /**
+ * Handle class updates.
+ *
+ * @private
+ */
+ MaterialIconToggle.prototype.updateClasses_ = function () {
+ this.checkDisabled();
+ this.checkToggleState();
+ };
+ /**
+ * Add blur.
+ *
+ * @private
+ */
+ MaterialIconToggle.prototype.blur_ = function () {
+ // TODO: figure out why there's a focus event being fired after our blur,
+ // so that we can avoid this hack.
+ window.setTimeout(function () {
+ this.inputElement_.blur();
+ }.bind(this), this.Constant_.TINY_TIMEOUT);
+ };
// Public methods.
-/**
- * Disable slider.
- *
- * @public
- */
-MaterialSlider.prototype.disable = function () {
- this.element_.disabled = true;
-};
-MaterialSlider.prototype['disable'] = MaterialSlider.prototype.disable;
-/**
- * Enable slider.
- *
- * @public
- */
-MaterialSlider.prototype.enable = function () {
- this.element_.disabled = false;
-};
-MaterialSlider.prototype['enable'] = MaterialSlider.prototype.enable;
-/**
- * Update slider value.
- *
- * @param {number} value The value to which to set the control (optional).
- * @public
- */
-MaterialSlider.prototype.change = function (value) {
- if (typeof value !== 'undefined') {
- this.element_.value = value;
- }
- this.updateValueStyles_();
-};
-MaterialSlider.prototype['change'] = MaterialSlider.prototype.change;
-/**
- * Initialize element.
- */
-MaterialSlider.prototype.init = function () {
- if (this.element_) {
- if (this.isIE_) {
- // Since we need to specify a very large height in IE due to
- // implementation limitations, we add a parent here that trims it down to
- // a reasonable size.
- var containerIE = document.createElement('div');
- containerIE.classList.add(this.CssClasses_.IE_CONTAINER);
- this.element_.parentElement.insertBefore(containerIE, this.element_);
- this.element_.parentElement.removeChild(this.element_);
- containerIE.appendChild(this.element_);
+ /**
+ * Check the inputs toggle state and update display.
+ *
+ * @public
+ */
+ MaterialIconToggle.prototype.checkToggleState = function () {
+ if (this.inputElement_.checked) {
+ this.element_.classList.add(this.CssClasses_.IS_CHECKED);
} else {
- // For non-IE browsers, we need a div structure that sits behind the
- // slider and allows us to style the left and right sides of it with
- // different colors.
+ this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
+ }
+ };
+ MaterialIconToggle.prototype['checkToggleState'] = MaterialIconToggle.prototype.checkToggleState;
+ /**
+ * Check the inputs disabled state and update display.
+ *
+ * @public
+ */
+ MaterialIconToggle.prototype.checkDisabled = function () {
+ if (this.inputElement_.disabled) {
+ this.element_.classList.add(this.CssClasses_.IS_DISABLED);
+ } else {
+ this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
+ }
+ };
+ MaterialIconToggle.prototype['checkDisabled'] = MaterialIconToggle.prototype.checkDisabled;
+ /**
+ * Disable icon toggle.
+ *
+ * @public
+ */
+ MaterialIconToggle.prototype.disable = function () {
+ this.inputElement_.disabled = true;
+ this.updateClasses_();
+ };
+ MaterialIconToggle.prototype['disable'] = MaterialIconToggle.prototype.disable;
+ /**
+ * Enable icon toggle.
+ *
+ * @public
+ */
+ MaterialIconToggle.prototype.enable = function () {
+ this.inputElement_.disabled = false;
+ this.updateClasses_();
+ };
+ MaterialIconToggle.prototype['enable'] = MaterialIconToggle.prototype.enable;
+ /**
+ * Check icon toggle.
+ *
+ * @public
+ */
+ MaterialIconToggle.prototype.check = function () {
+ this.inputElement_.checked = true;
+ this.updateClasses_();
+ };
+ MaterialIconToggle.prototype['check'] = MaterialIconToggle.prototype.check;
+ /**
+ * Uncheck icon toggle.
+ *
+ * @public
+ */
+ MaterialIconToggle.prototype.uncheck = function () {
+ this.inputElement_.checked = false;
+ this.updateClasses_();
+ };
+ MaterialIconToggle.prototype['uncheck'] = MaterialIconToggle.prototype.uncheck;
+ /**
+ * Initialize element.
+ */
+ MaterialIconToggle.prototype.init = function () {
+ if (this.element_) {
+ this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);
+ if (this.element_.classList.contains(this.CssClasses_.JS_RIPPLE_EFFECT)) {
+ this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
+ this.rippleContainerElement_ = document.createElement('span');
+ this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);
+ this.rippleContainerElement_.classList.add(this.CssClasses_.JS_RIPPLE_EFFECT);
+ this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);
+ this.boundRippleMouseUp = this.onMouseUp_.bind(this);
+ this.rippleContainerElement_.addEventListener('mouseup', this.boundRippleMouseUp);
+ var ripple = document.createElement('span');
+ ripple.classList.add(this.CssClasses_.RIPPLE);
+ this.rippleContainerElement_.appendChild(ripple);
+ this.element_.appendChild(this.rippleContainerElement_);
+ }
+ this.boundInputOnChange = this.onChange_.bind(this);
+ this.boundInputOnFocus = this.onFocus_.bind(this);
+ this.boundInputOnBlur = this.onBlur_.bind(this);
+ this.boundElementOnMouseUp = this.onMouseUp_.bind(this);
+ this.inputElement_.addEventListener('change', this.boundInputOnChange);
+ this.inputElement_.addEventListener('focus', this.boundInputOnFocus);
+ this.inputElement_.addEventListener('blur', this.boundInputOnBlur);
+ this.element_.addEventListener('mouseup', this.boundElementOnMouseUp);
+ this.updateClasses_();
+ this.element_.classList.add('is-upgraded');
+ }
+ };
+// The component registers itself. It can assume componentHandler is available
+// in the global scope.
+ componentHandler.register({
+ constructor: MaterialIconToggle,
+ classAsString: 'MaterialIconToggle',
+ cssClass: 'mdl-js-icon-toggle',
+ widget: true
+ });
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for dropdown MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+ var MaterialMenu = function MaterialMenu(element) {
+ this.element_ = element;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialMenu'] = MaterialMenu;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialMenu.prototype.Constant_ = {
+ // Total duration of the menu animation.
+ TRANSITION_DURATION_SECONDS: 0.3,
+ // The fraction of the total duration we want to use for menu item animations.
+ TRANSITION_DURATION_FRACTION: 0.8,
+ // How long the menu stays open after choosing an option (so the user can see
+ // the ripple).
+ CLOSE_TIMEOUT: 150
+ };
+ /**
+ * Keycodes, for code readability.
+ *
+ * @enum {number}
+ * @private
+ */
+ MaterialMenu.prototype.Keycodes_ = {
+ ENTER: 13,
+ ESCAPE: 27,
+ SPACE: 32,
+ UP_ARROW: 38,
+ DOWN_ARROW: 40
+ };
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialMenu.prototype.CssClasses_ = {
+ CONTAINER: 'mdl-menu__container',
+ OUTLINE: 'mdl-menu__outline',
+ ITEM: 'mdl-menu__item',
+ ITEM_RIPPLE_CONTAINER: 'mdl-menu__item-ripple-container',
+ RIPPLE_EFFECT: 'mdl-js-ripple-effect',
+ RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
+ RIPPLE: 'mdl-ripple',
+ // Statuses
+ IS_UPGRADED: 'is-upgraded',
+ IS_VISIBLE: 'is-visible',
+ IS_ANIMATING: 'is-animating',
+ // Alignment options
+ BOTTOM_LEFT: 'mdl-menu--bottom-left',
+ // This is the default.
+ BOTTOM_RIGHT: 'mdl-menu--bottom-right',
+ TOP_LEFT: 'mdl-menu--top-left',
+ TOP_RIGHT: 'mdl-menu--top-right',
+ UNALIGNED: 'mdl-menu--unaligned'
+ };
+ /**
+ * Initialize element.
+ */
+ MaterialMenu.prototype.init = function () {
+ if (this.element_) {
+ // Create container for the menu.
var container = document.createElement('div');
- container.classList.add(this.CssClasses_.SLIDER_CONTAINER);
+ container.classList.add(this.CssClasses_.CONTAINER);
this.element_.parentElement.insertBefore(container, this.element_);
this.element_.parentElement.removeChild(this.element_);
container.appendChild(this.element_);
- var backgroundFlex = document.createElement('div');
- backgroundFlex.classList.add(this.CssClasses_.BACKGROUND_FLEX);
- container.appendChild(backgroundFlex);
- this.backgroundLower_ = document.createElement('div');
- this.backgroundLower_.classList.add(this.CssClasses_.BACKGROUND_LOWER);
- backgroundFlex.appendChild(this.backgroundLower_);
- this.backgroundUpper_ = document.createElement('div');
- this.backgroundUpper_.classList.add(this.CssClasses_.BACKGROUND_UPPER);
- backgroundFlex.appendChild(this.backgroundUpper_);
+ this.container_ = container;
+ // Create outline for the menu (shadow and background).
+ var outline = document.createElement('div');
+ outline.classList.add(this.CssClasses_.OUTLINE);
+ this.outline_ = outline;
+ container.insertBefore(outline, this.element_);
+ // Find the "for" element and bind events to it.
+ var forElId = this.element_.getAttribute('for') || this.element_.getAttribute('data-mdl-for');
+ var forEl = null;
+ if (forElId) {
+ forEl = document.getElementById(forElId);
+ if (forEl) {
+ this.forElement_ = forEl;
+ forEl.addEventListener('click', this.handleForClick_.bind(this));
+ forEl.addEventListener('keydown', this.handleForKeyboardEvent_.bind(this));
+ }
+ }
+ var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);
+ this.boundItemKeydown_ = this.handleItemKeyboardEvent_.bind(this);
+ this.boundItemClick_ = this.handleItemClick_.bind(this);
+ for (var i = 0; i < items.length; i++) {
+ // Add a listener to each menu item.
+ items[i].addEventListener('click', this.boundItemClick_);
+ // Add a tab index to each menu item.
+ items[i].tabIndex = '-1';
+ // Add a keyboard listener to each menu item.
+ items[i].addEventListener('keydown', this.boundItemKeydown_);
+ }
+ // Add ripple classes to each item, if the user has enabled ripples.
+ if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {
+ this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
+ for (i = 0; i < items.length; i++) {
+ var item = items[i];
+ var rippleContainer = document.createElement('span');
+ rippleContainer.classList.add(this.CssClasses_.ITEM_RIPPLE_CONTAINER);
+ var ripple = document.createElement('span');
+ ripple.classList.add(this.CssClasses_.RIPPLE);
+ rippleContainer.appendChild(ripple);
+ item.appendChild(rippleContainer);
+ item.classList.add(this.CssClasses_.RIPPLE_EFFECT);
+ }
+ }
+ // Copy alignment classes to the container, so the outline can use them.
+ if (this.element_.classList.contains(this.CssClasses_.BOTTOM_LEFT)) {
+ this.outline_.classList.add(this.CssClasses_.BOTTOM_LEFT);
+ }
+ if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {
+ this.outline_.classList.add(this.CssClasses_.BOTTOM_RIGHT);
+ }
+ if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {
+ this.outline_.classList.add(this.CssClasses_.TOP_LEFT);
+ }
+ if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {
+ this.outline_.classList.add(this.CssClasses_.TOP_RIGHT);
+ }
+ if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {
+ this.outline_.classList.add(this.CssClasses_.UNALIGNED);
+ }
+ container.classList.add(this.CssClasses_.IS_UPGRADED);
}
- this.boundInputHandler = this.onInput_.bind(this);
- this.boundChangeHandler = this.onChange_.bind(this);
- this.boundMouseUpHandler = this.onMouseUp_.bind(this);
- this.boundContainerMouseDownHandler = this.onContainerMouseDown_.bind(this);
- this.element_.addEventListener('input', this.boundInputHandler);
- this.element_.addEventListener('change', this.boundChangeHandler);
- this.element_.addEventListener('mouseup', this.boundMouseUpHandler);
- this.element_.parentElement.addEventListener('mousedown', this.boundContainerMouseDownHandler);
- this.updateValueStyles_();
- this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
- }
-};
+ };
+ /**
+ * Handles a click on the "for" element, by positioning the menu and then
+ * toggling it.
+ *
+ * @param {Event} evt The event that fired.
+ * @private
+ */
+ MaterialMenu.prototype.handleForClick_ = function (evt) {
+ if (this.element_ && this.forElement_) {
+ var rect = this.forElement_.getBoundingClientRect();
+ var forRect = this.forElement_.parentElement.getBoundingClientRect();
+ if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {
+ } else if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {
+ // Position below the "for" element, aligned to its right.
+ this.container_.style.right = forRect.right - rect.right + 'px';
+ this.container_.style.top = this.forElement_.offsetTop + this.forElement_.offsetHeight + 'px';
+ } else if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {
+ // Position above the "for" element, aligned to its left.
+ this.container_.style.left = this.forElement_.offsetLeft + 'px';
+ this.container_.style.bottom = forRect.bottom - rect.top + 'px';
+ } else if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {
+ // Position above the "for" element, aligned to its right.
+ this.container_.style.right = forRect.right - rect.right + 'px';
+ this.container_.style.bottom = forRect.bottom - rect.top + 'px';
+ } else {
+ // Default: position below the "for" element, aligned to its left.
+ this.container_.style.left = this.forElement_.offsetLeft + 'px';
+ this.container_.style.top = this.forElement_.offsetTop + this.forElement_.offsetHeight + 'px';
+ }
+ }
+ this.toggle(evt);
+ };
+ /**
+ * Handles a keyboard event on the "for" element.
+ *
+ * @param {Event} evt The event that fired.
+ * @private
+ */
+ MaterialMenu.prototype.handleForKeyboardEvent_ = function (evt) {
+ if (this.element_ && this.container_ && this.forElement_) {
+ var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM + ':not([disabled])');
+ if (items && items.length > 0 && this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {
+ if (evt.keyCode === this.Keycodes_.UP_ARROW) {
+ evt.preventDefault();
+ items[items.length - 1].focus();
+ } else if (evt.keyCode === this.Keycodes_.DOWN_ARROW) {
+ evt.preventDefault();
+ items[0].focus();
+ }
+ }
+ }
+ };
+ /**
+ * Handles a keyboard event on an item.
+ *
+ * @param {Event} evt The event that fired.
+ * @private
+ */
+ MaterialMenu.prototype.handleItemKeyboardEvent_ = function (evt) {
+ if (this.element_ && this.container_) {
+ var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM + ':not([disabled])');
+ if (items && items.length > 0 && this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {
+ var currentIndex = Array.prototype.slice.call(items).indexOf(evt.target);
+ if (evt.keyCode === this.Keycodes_.UP_ARROW) {
+ evt.preventDefault();
+ if (currentIndex > 0) {
+ items[currentIndex - 1].focus();
+ } else {
+ items[items.length - 1].focus();
+ }
+ } else if (evt.keyCode === this.Keycodes_.DOWN_ARROW) {
+ evt.preventDefault();
+ if (items.length > currentIndex + 1) {
+ items[currentIndex + 1].focus();
+ } else {
+ items[0].focus();
+ }
+ } else if (evt.keyCode === this.Keycodes_.SPACE || evt.keyCode === this.Keycodes_.ENTER) {
+ evt.preventDefault();
+ // Send mousedown and mouseup to trigger ripple.
+ var e = new MouseEvent('mousedown');
+ evt.target.dispatchEvent(e);
+ e = new MouseEvent('mouseup');
+ evt.target.dispatchEvent(e);
+ // Send click.
+ evt.target.click();
+ } else if (evt.keyCode === this.Keycodes_.ESCAPE) {
+ evt.preventDefault();
+ this.hide();
+ }
+ }
+ }
+ };
+ /**
+ * Handles a click event on an item.
+ *
+ * @param {Event} evt The event that fired.
+ * @private
+ */
+ MaterialMenu.prototype.handleItemClick_ = function (evt) {
+ if (evt.target.hasAttribute('disabled')) {
+ evt.stopPropagation();
+ } else {
+ // Wait some time before closing menu, so the user can see the ripple.
+ this.closing_ = true;
+ window.setTimeout(function (evt) {
+ this.hide();
+ this.closing_ = false;
+ }.bind(this), this.Constant_.CLOSE_TIMEOUT);
+ }
+ };
+ /**
+ * Calculates the initial clip (for opening the menu) or final clip (for closing
+ * it), and applies it. This allows us to animate from or to the correct point,
+ * that is, the point it's aligned to in the "for" element.
+ *
+ * @param {number} height Height of the clip rectangle
+ * @param {number} width Width of the clip rectangle
+ * @private
+ */
+ MaterialMenu.prototype.applyClip_ = function (height, width) {
+ if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {
+ // Do not clip.
+ this.element_.style.clip = '';
+ } else if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {
+ // Clip to the top right corner of the menu.
+ this.element_.style.clip = 'rect(0 ' + width + 'px ' + '0 ' + width + 'px)';
+ } else if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT)) {
+ // Clip to the bottom left corner of the menu.
+ this.element_.style.clip = 'rect(' + height + 'px 0 ' + height + 'px 0)';
+ } else if (this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {
+ // Clip to the bottom right corner of the menu.
+ this.element_.style.clip = 'rect(' + height + 'px ' + width + 'px ' + height + 'px ' + width + 'px)';
+ } else {
+ // Default: do not clip (same as clipping to the top left corner).
+ this.element_.style.clip = '';
+ }
+ };
+ /**
+ * Cleanup function to remove animation listeners.
+ *
+ * @param {Event} evt
+ * @private
+ */
+ MaterialMenu.prototype.removeAnimationEndListener_ = function (evt) {
+ evt.target.classList.remove(MaterialMenu.prototype.CssClasses_.IS_ANIMATING);
+ };
+ /**
+ * Adds an event listener to clean up after the animation ends.
+ *
+ * @private
+ */
+ MaterialMenu.prototype.addAnimationEndListener_ = function () {
+ this.element_.addEventListener('transitionend', this.removeAnimationEndListener_);
+ this.element_.addEventListener('webkitTransitionEnd', this.removeAnimationEndListener_);
+ };
+ /**
+ * Displays the menu.
+ *
+ * @public
+ */
+ MaterialMenu.prototype.show = function (evt) {
+ if (this.element_ && this.container_ && this.outline_) {
+ // Measure the inner element.
+ var height = this.element_.getBoundingClientRect().height;
+ var width = this.element_.getBoundingClientRect().width;
+ // Apply the inner element's size to the container and outline.
+ this.container_.style.width = width + 'px';
+ this.container_.style.height = height + 'px';
+ this.outline_.style.width = width + 'px';
+ this.outline_.style.height = height + 'px';
+ var transitionDuration = this.Constant_.TRANSITION_DURATION_SECONDS * this.Constant_.TRANSITION_DURATION_FRACTION;
+ // Calculate transition delays for individual menu items, so that they fade
+ // in one at a time.
+ var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);
+ for (var i = 0; i < items.length; i++) {
+ var itemDelay = null;
+ if (this.element_.classList.contains(this.CssClasses_.TOP_LEFT) || this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)) {
+ itemDelay = (height - items[i].offsetTop - items[i].offsetHeight) / height * transitionDuration + 's';
+ } else {
+ itemDelay = items[i].offsetTop / height * transitionDuration + 's';
+ }
+ items[i].style.transitionDelay = itemDelay;
+ }
+ // Apply the initial clip to the text before we start animating.
+ this.applyClip_(height, width);
+ // Wait for the next frame, turn on animation, and apply the final clip.
+ // Also make it visible. This triggers the transitions.
+ window.requestAnimationFrame(function () {
+ this.element_.classList.add(this.CssClasses_.IS_ANIMATING);
+ this.element_.style.clip = 'rect(0 ' + width + 'px ' + height + 'px 0)';
+ this.container_.classList.add(this.CssClasses_.IS_VISIBLE);
+ }.bind(this));
+ // Clean up after the animation is complete.
+ this.addAnimationEndListener_();
+ // Add a click listener to the document, to close the menu.
+ var callback = function (e) {
+ // Check to see if the document is processing the same event that
+ // displayed the menu in the first place. If so, do nothing.
+ // Also check to see if the menu is in the process of closing itself, and
+ // do nothing in that case.
+ // Also check if the clicked element is a menu item
+ // if so, do nothing.
+ if (e !== evt && !this.closing_ && e.target.parentNode !== this.element_) {
+ document.removeEventListener('click', callback);
+ this.hide();
+ }
+ }.bind(this);
+ document.addEventListener('click', callback);
+ }
+ };
+ MaterialMenu.prototype['show'] = MaterialMenu.prototype.show;
+ /**
+ * Hides the menu.
+ *
+ * @public
+ */
+ MaterialMenu.prototype.hide = function () {
+ if (this.element_ && this.container_ && this.outline_) {
+ var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);
+ // Remove all transition delays; menu items fade out concurrently.
+ for (var i = 0; i < items.length; i++) {
+ items[i].style.removeProperty('transition-delay');
+ }
+ // Measure the inner element.
+ var rect = this.element_.getBoundingClientRect();
+ var height = rect.height;
+ var width = rect.width;
+ // Turn on animation, and apply the final clip. Also make invisible.
+ // This triggers the transitions.
+ this.element_.classList.add(this.CssClasses_.IS_ANIMATING);
+ this.applyClip_(height, width);
+ this.container_.classList.remove(this.CssClasses_.IS_VISIBLE);
+ // Clean up after the animation is complete.
+ this.addAnimationEndListener_();
+ }
+ };
+ MaterialMenu.prototype['hide'] = MaterialMenu.prototype.hide;
+ /**
+ * Displays or hides the menu, depending on current state.
+ *
+ * @public
+ */
+ MaterialMenu.prototype.toggle = function (evt) {
+ if (this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)) {
+ this.hide();
+ } else {
+ this.show(evt);
+ }
+ };
+ MaterialMenu.prototype['toggle'] = MaterialMenu.prototype.toggle;
// The component registers itself. It can assume componentHandler is available
// in the global scope.
-componentHandler.register({
- constructor: MaterialSlider,
- classAsString: 'MaterialSlider',
- cssClass: 'mdl-js-slider',
- widget: true
-});
-/**
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Snackbar MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialSnackbar = function MaterialSnackbar(element) {
- this.element_ = element;
- this.textElement_ = this.element_.querySelector('.' + this.cssClasses_.MESSAGE);
- this.actionElement_ = this.element_.querySelector('.' + this.cssClasses_.ACTION);
- if (!this.textElement_) {
- throw new Error('There must be a message element for a snackbar.');
- }
- if (!this.actionElement_) {
- throw new Error('There must be an action element for a snackbar.');
- }
- this.active = false;
- this.actionHandler_ = undefined;
- this.message_ = undefined;
- this.actionText_ = undefined;
- this.queuedNotifications_ = [];
- this.setActionHidden_(true);
-};
-window['MaterialSnackbar'] = MaterialSnackbar;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialSnackbar.prototype.Constant_ = {
- // The duration of the snackbar show/hide animation, in ms.
- ANIMATION_LENGTH: 250
-};
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialSnackbar.prototype.cssClasses_ = {
- SNACKBAR: 'mdl-snackbar',
- MESSAGE: 'mdl-snackbar__text',
- ACTION: 'mdl-snackbar__action',
- ACTIVE: 'mdl-snackbar--active'
-};
-/**
- * Display the snackbar.
- *
- * @private
- */
-MaterialSnackbar.prototype.displaySnackbar_ = function () {
- this.element_.setAttribute('aria-hidden', 'true');
- if (this.actionHandler_) {
- this.actionElement_.textContent = this.actionText_;
- this.actionElement_.addEventListener('click', this.actionHandler_);
- this.setActionHidden_(false);
- }
- this.textElement_.textContent = this.message_;
- this.element_.classList.add(this.cssClasses_.ACTIVE);
- this.element_.setAttribute('aria-hidden', 'false');
- setTimeout(this.cleanup_.bind(this), this.timeout_);
-};
-/**
- * Show the snackbar.
- *
- * @param {Object} data The data for the notification.
- * @public
- */
-MaterialSnackbar.prototype.showSnackbar = function (data) {
- if (data === undefined) {
- throw new Error('Please provide a data object with at least a message to display.');
- }
- if (data['message'] === undefined) {
- throw new Error('Please provide a message to be displayed.');
- }
- if (data['actionHandler'] && !data['actionText']) {
- throw new Error('Please provide action text with the handler.');
- }
- if (this.active) {
- this.queuedNotifications_.push(data);
- } else {
- this.active = true;
- this.message_ = data['message'];
- if (data['timeout']) {
- this.timeout_ = data['timeout'];
+ componentHandler.register({
+ constructor: MaterialMenu,
+ classAsString: 'MaterialMenu',
+ cssClass: 'mdl-js-menu',
+ widget: true
+ });
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for Progress MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+ var MaterialProgress = function MaterialProgress(element) {
+ this.element_ = element;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialProgress'] = MaterialProgress;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialProgress.prototype.Constant_ = {};
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialProgress.prototype.CssClasses_ = {INDETERMINATE_CLASS: 'mdl-progress__indeterminate'};
+ /**
+ * Set the current progress of the progressbar.
+ *
+ * @param {number} p Percentage of the progress (0-100)
+ * @public
+ */
+ MaterialProgress.prototype.setProgress = function (p) {
+ if (this.element_.classList.contains(this.CssClasses_.INDETERMINATE_CLASS)) {
+ return;
+ }
+ this.progressbar_.style.width = p + '%';
+ };
+ MaterialProgress.prototype['setProgress'] = MaterialProgress.prototype.setProgress;
+ /**
+ * Set the current progress of the buffer.
+ *
+ * @param {number} p Percentage of the buffer (0-100)
+ * @public
+ */
+ MaterialProgress.prototype.setBuffer = function (p) {
+ this.bufferbar_.style.width = p + '%';
+ this.auxbar_.style.width = 100 - p + '%';
+ };
+ MaterialProgress.prototype['setBuffer'] = MaterialProgress.prototype.setBuffer;
+ /**
+ * Initialize element.
+ */
+ MaterialProgress.prototype.init = function () {
+ if (this.element_) {
+ var el = document.createElement('div');
+ el.className = 'progressbar bar bar1';
+ this.element_.appendChild(el);
+ this.progressbar_ = el;
+ el = document.createElement('div');
+ el.className = 'bufferbar bar bar2';
+ this.element_.appendChild(el);
+ this.bufferbar_ = el;
+ el = document.createElement('div');
+ el.className = 'auxbar bar bar3';
+ this.element_.appendChild(el);
+ this.auxbar_ = el;
+ this.progressbar_.style.width = '0%';
+ this.bufferbar_.style.width = '100%';
+ this.auxbar_.style.width = '0%';
+ this.element_.classList.add('is-upgraded');
+ }
+ };
+// The component registers itself. It can assume componentHandler is available
+// in the global scope.
+ componentHandler.register({
+ constructor: MaterialProgress,
+ classAsString: 'MaterialProgress',
+ cssClass: 'mdl-js-progress',
+ widget: true
+ });
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for Radio MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+ var MaterialRadio = function MaterialRadio(element) {
+ this.element_ = element;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialRadio'] = MaterialRadio;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialRadio.prototype.Constant_ = {TINY_TIMEOUT: 0.001};
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialRadio.prototype.CssClasses_ = {
+ IS_FOCUSED: 'is-focused',
+ IS_DISABLED: 'is-disabled',
+ IS_CHECKED: 'is-checked',
+ IS_UPGRADED: 'is-upgraded',
+ JS_RADIO: 'mdl-js-radio',
+ RADIO_BTN: 'mdl-radio__button',
+ RADIO_OUTER_CIRCLE: 'mdl-radio__outer-circle',
+ RADIO_INNER_CIRCLE: 'mdl-radio__inner-circle',
+ RIPPLE_EFFECT: 'mdl-js-ripple-effect',
+ RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
+ RIPPLE_CONTAINER: 'mdl-radio__ripple-container',
+ RIPPLE_CENTER: 'mdl-ripple--center',
+ RIPPLE: 'mdl-ripple'
+ };
+ /**
+ * Handle change of state.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialRadio.prototype.onChange_ = function (event) {
+ // Since other radio buttons don't get change events, we need to look for
+ // them to update their classes.
+ var radios = document.getElementsByClassName(this.CssClasses_.JS_RADIO);
+ for (var i = 0; i < radios.length; i++) {
+ var button = radios[i].querySelector('.' + this.CssClasses_.RADIO_BTN);
+ // Different name == different group, so no point updating those.
+ if (button.getAttribute('name') === this.btnElement_.getAttribute('name')) {
+ if (typeof radios[i]['MaterialRadio'] !== 'undefined') {
+ radios[i]['MaterialRadio'].updateClasses_();
+ }
+ }
+ }
+ };
+ /**
+ * Handle focus.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialRadio.prototype.onFocus_ = function (event) {
+ this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
+ };
+ /**
+ * Handle lost focus.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialRadio.prototype.onBlur_ = function (event) {
+ this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
+ };
+ /**
+ * Handle mouseup.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialRadio.prototype.onMouseup_ = function (event) {
+ this.blur_();
+ };
+ /**
+ * Update classes.
+ *
+ * @private
+ */
+ MaterialRadio.prototype.updateClasses_ = function () {
+ this.checkDisabled();
+ this.checkToggleState();
+ };
+ /**
+ * Add blur.
+ *
+ * @private
+ */
+ MaterialRadio.prototype.blur_ = function () {
+ // TODO: figure out why there's a focus event being fired after our blur,
+ // so that we can avoid this hack.
+ window.setTimeout(function () {
+ this.btnElement_.blur();
+ }.bind(this), this.Constant_.TINY_TIMEOUT);
+ };
+// Public methods.
+ /**
+ * Check the components disabled state.
+ *
+ * @public
+ */
+ MaterialRadio.prototype.checkDisabled = function () {
+ if (this.btnElement_.disabled) {
+ this.element_.classList.add(this.CssClasses_.IS_DISABLED);
} else {
- this.timeout_ = 2750;
+ this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
}
- if (data['actionHandler']) {
- this.actionHandler_ = data['actionHandler'];
+ };
+ MaterialRadio.prototype['checkDisabled'] = MaterialRadio.prototype.checkDisabled;
+ /**
+ * Check the components toggled state.
+ *
+ * @public
+ */
+ MaterialRadio.prototype.checkToggleState = function () {
+ if (this.btnElement_.checked) {
+ this.element_.classList.add(this.CssClasses_.IS_CHECKED);
+ } else {
+ this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
}
- if (data['actionText']) {
- this.actionText_ = data['actionText'];
+ };
+ MaterialRadio.prototype['checkToggleState'] = MaterialRadio.prototype.checkToggleState;
+ /**
+ * Disable radio.
+ *
+ * @public
+ */
+ MaterialRadio.prototype.disable = function () {
+ this.btnElement_.disabled = true;
+ this.updateClasses_();
+ };
+ MaterialRadio.prototype['disable'] = MaterialRadio.prototype.disable;
+ /**
+ * Enable radio.
+ *
+ * @public
+ */
+ MaterialRadio.prototype.enable = function () {
+ this.btnElement_.disabled = false;
+ this.updateClasses_();
+ };
+ MaterialRadio.prototype['enable'] = MaterialRadio.prototype.enable;
+ /**
+ * Check radio.
+ *
+ * @public
+ */
+ MaterialRadio.prototype.check = function () {
+ this.btnElement_.checked = true;
+ this.onChange_(null);
+ };
+ MaterialRadio.prototype['check'] = MaterialRadio.prototype.check;
+ /**
+ * Uncheck radio.
+ *
+ * @public
+ */
+ MaterialRadio.prototype.uncheck = function () {
+ this.btnElement_.checked = false;
+ this.onChange_(null);
+ };
+ MaterialRadio.prototype['uncheck'] = MaterialRadio.prototype.uncheck;
+ /**
+ * Initialize element.
+ */
+ MaterialRadio.prototype.init = function () {
+ if (this.element_) {
+ this.btnElement_ = this.element_.querySelector('.' + this.CssClasses_.RADIO_BTN);
+ this.boundChangeHandler_ = this.onChange_.bind(this);
+ this.boundFocusHandler_ = this.onChange_.bind(this);
+ this.boundBlurHandler_ = this.onBlur_.bind(this);
+ this.boundMouseUpHandler_ = this.onMouseup_.bind(this);
+ var outerCircle = document.createElement('span');
+ outerCircle.classList.add(this.CssClasses_.RADIO_OUTER_CIRCLE);
+ var innerCircle = document.createElement('span');
+ innerCircle.classList.add(this.CssClasses_.RADIO_INNER_CIRCLE);
+ this.element_.appendChild(outerCircle);
+ this.element_.appendChild(innerCircle);
+ var rippleContainer;
+ if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {
+ this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
+ rippleContainer = document.createElement('span');
+ rippleContainer.classList.add(this.CssClasses_.RIPPLE_CONTAINER);
+ rippleContainer.classList.add(this.CssClasses_.RIPPLE_EFFECT);
+ rippleContainer.classList.add(this.CssClasses_.RIPPLE_CENTER);
+ rippleContainer.addEventListener('mouseup', this.boundMouseUpHandler_);
+ var ripple = document.createElement('span');
+ ripple.classList.add(this.CssClasses_.RIPPLE);
+ rippleContainer.appendChild(ripple);
+ this.element_.appendChild(rippleContainer);
+ }
+ this.btnElement_.addEventListener('change', this.boundChangeHandler_);
+ this.btnElement_.addEventListener('focus', this.boundFocusHandler_);
+ this.btnElement_.addEventListener('blur', this.boundBlurHandler_);
+ this.element_.addEventListener('mouseup', this.boundMouseUpHandler_);
+ this.updateClasses_();
+ this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
}
- this.displaySnackbar_();
- }
-};
-MaterialSnackbar.prototype['showSnackbar'] = MaterialSnackbar.prototype.showSnackbar;
-/**
- * Check if the queue has items within it.
- * If it does, display the next entry.
- *
- * @private
- */
-MaterialSnackbar.prototype.checkQueue_ = function () {
- if (this.queuedNotifications_.length > 0) {
- this.showSnackbar(this.queuedNotifications_.shift());
- }
-};
-/**
- * Cleanup the snackbar event listeners and accessiblity attributes.
- *
- * @private
- */
-MaterialSnackbar.prototype.cleanup_ = function () {
- this.element_.classList.remove(this.cssClasses_.ACTIVE);
- setTimeout(function () {
- this.element_.setAttribute('aria-hidden', 'true');
- this.textElement_.textContent = '';
- if (!Boolean(this.actionElement_.getAttribute('aria-hidden'))) {
- this.setActionHidden_(true);
- this.actionElement_.textContent = '';
- this.actionElement_.removeEventListener('click', this.actionHandler_);
+ };
+// The component registers itself. It can assume componentHandler is available
+// in the global scope.
+ componentHandler.register({
+ constructor: MaterialRadio,
+ classAsString: 'MaterialRadio',
+ cssClass: 'mdl-js-radio',
+ widget: true
+ });
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for Slider MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+ var MaterialSlider = function MaterialSlider(element) {
+ this.element_ = element;
+ // Browser feature detection.
+ this.isIE_ = window.navigator.msPointerEnabled;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialSlider'] = MaterialSlider;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialSlider.prototype.Constant_ = {};
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialSlider.prototype.CssClasses_ = {
+ IE_CONTAINER: 'mdl-slider__ie-container',
+ SLIDER_CONTAINER: 'mdl-slider__container',
+ BACKGROUND_FLEX: 'mdl-slider__background-flex',
+ BACKGROUND_LOWER: 'mdl-slider__background-lower',
+ BACKGROUND_UPPER: 'mdl-slider__background-upper',
+ IS_LOWEST_VALUE: 'is-lowest-value',
+ IS_UPGRADED: 'is-upgraded'
+ };
+ /**
+ * Handle input on element.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialSlider.prototype.onInput_ = function (event) {
+ this.updateValueStyles_();
+ };
+ /**
+ * Handle change on element.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialSlider.prototype.onChange_ = function (event) {
+ this.updateValueStyles_();
+ };
+ /**
+ * Handle mouseup on element.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialSlider.prototype.onMouseUp_ = function (event) {
+ event.target.blur();
+ };
+ /**
+ * Handle mousedown on container element.
+ * This handler is purpose is to not require the use to click
+ * exactly on the 2px slider element, as FireFox seems to be very
+ * strict about this.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ * @suppress {missingProperties}
+ */
+ MaterialSlider.prototype.onContainerMouseDown_ = function (event) {
+ // If this click is not on the parent element (but rather some child)
+ // ignore. It may still bubble up.
+ if (event.target !== this.element_.parentElement) {
+ return;
}
+ // Discard the original event and create a new event that
+ // is on the slider element.
+ event.preventDefault();
+ var newEvent = new MouseEvent('mousedown', {
+ target: event.target,
+ buttons: event.buttons,
+ clientX: event.clientX,
+ clientY: this.element_.getBoundingClientRect().y
+ });
+ this.element_.dispatchEvent(newEvent);
+ };
+ /**
+ * Handle updating of values.
+ *
+ * @private
+ */
+ MaterialSlider.prototype.updateValueStyles_ = function () {
+ // Calculate and apply percentages to div structure behind slider.
+ var fraction = (this.element_.value - this.element_.min) / (this.element_.max - this.element_.min);
+ if (fraction === 0) {
+ this.element_.classList.add(this.CssClasses_.IS_LOWEST_VALUE);
+ } else {
+ this.element_.classList.remove(this.CssClasses_.IS_LOWEST_VALUE);
+ }
+ if (!this.isIE_) {
+ this.backgroundLower_.style.flex = fraction;
+ this.backgroundLower_.style.webkitFlex = fraction;
+ this.backgroundUpper_.style.flex = 1 - fraction;
+ this.backgroundUpper_.style.webkitFlex = 1 - fraction;
+ }
+ };
+// Public methods.
+ /**
+ * Disable slider.
+ *
+ * @public
+ */
+ MaterialSlider.prototype.disable = function () {
+ this.element_.disabled = true;
+ };
+ MaterialSlider.prototype['disable'] = MaterialSlider.prototype.disable;
+ /**
+ * Enable slider.
+ *
+ * @public
+ */
+ MaterialSlider.prototype.enable = function () {
+ this.element_.disabled = false;
+ };
+ MaterialSlider.prototype['enable'] = MaterialSlider.prototype.enable;
+ /**
+ * Update slider value.
+ *
+ * @param {number} value The value to which to set the control (optional).
+ * @public
+ */
+ MaterialSlider.prototype.change = function (value) {
+ if (typeof value !== 'undefined') {
+ this.element_.value = value;
+ }
+ this.updateValueStyles_();
+ };
+ MaterialSlider.prototype['change'] = MaterialSlider.prototype.change;
+ /**
+ * Initialize element.
+ */
+ MaterialSlider.prototype.init = function () {
+ if (this.element_) {
+ if (this.isIE_) {
+ // Since we need to specify a very large height in IE due to
+ // implementation limitations, we add a parent here that trims it down to
+ // a reasonable size.
+ var containerIE = document.createElement('div');
+ containerIE.classList.add(this.CssClasses_.IE_CONTAINER);
+ this.element_.parentElement.insertBefore(containerIE, this.element_);
+ this.element_.parentElement.removeChild(this.element_);
+ containerIE.appendChild(this.element_);
+ } else {
+ // For non-IE browsers, we need a div structure that sits behind the
+ // slider and allows us to style the left and right sides of it with
+ // different colors.
+ var container = document.createElement('div');
+ container.classList.add(this.CssClasses_.SLIDER_CONTAINER);
+ this.element_.parentElement.insertBefore(container, this.element_);
+ this.element_.parentElement.removeChild(this.element_);
+ container.appendChild(this.element_);
+ var backgroundFlex = document.createElement('div');
+ backgroundFlex.classList.add(this.CssClasses_.BACKGROUND_FLEX);
+ container.appendChild(backgroundFlex);
+ this.backgroundLower_ = document.createElement('div');
+ this.backgroundLower_.classList.add(this.CssClasses_.BACKGROUND_LOWER);
+ backgroundFlex.appendChild(this.backgroundLower_);
+ this.backgroundUpper_ = document.createElement('div');
+ this.backgroundUpper_.classList.add(this.CssClasses_.BACKGROUND_UPPER);
+ backgroundFlex.appendChild(this.backgroundUpper_);
+ }
+ this.boundInputHandler = this.onInput_.bind(this);
+ this.boundChangeHandler = this.onChange_.bind(this);
+ this.boundMouseUpHandler = this.onMouseUp_.bind(this);
+ this.boundContainerMouseDownHandler = this.onContainerMouseDown_.bind(this);
+ this.element_.addEventListener('input', this.boundInputHandler);
+ this.element_.addEventListener('change', this.boundChangeHandler);
+ this.element_.addEventListener('mouseup', this.boundMouseUpHandler);
+ this.element_.parentElement.addEventListener('mousedown', this.boundContainerMouseDownHandler);
+ this.updateValueStyles_();
+ this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
+ }
+ };
+// The component registers itself. It can assume componentHandler is available
+// in the global scope.
+ componentHandler.register({
+ constructor: MaterialSlider,
+ classAsString: 'MaterialSlider',
+ cssClass: 'mdl-js-slider',
+ widget: true
+ });
+ /**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for Snackbar MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+ var MaterialSnackbar = function MaterialSnackbar(element) {
+ this.element_ = element;
+ this.textElement_ = this.element_.querySelector('.' + this.cssClasses_.MESSAGE);
+ this.actionElement_ = this.element_.querySelector('.' + this.cssClasses_.ACTION);
+ if (!this.textElement_) {
+ throw new Error('There must be a message element for a snackbar.');
+ }
+ if (!this.actionElement_) {
+ throw new Error('There must be an action element for a snackbar.');
+ }
+ this.active = false;
this.actionHandler_ = undefined;
this.message_ = undefined;
this.actionText_ = undefined;
- this.active = false;
- this.checkQueue_();
- }.bind(this), this.Constant_.ANIMATION_LENGTH);
-};
-/**
- * Set the action handler hidden state.
- *
- * @param {boolean} value
- * @private
- */
-MaterialSnackbar.prototype.setActionHidden_ = function (value) {
- if (value) {
- this.actionElement_.setAttribute('aria-hidden', 'true');
- } else {
- this.actionElement_.removeAttribute('aria-hidden');
- }
-};
+ this.queuedNotifications_ = [];
+ this.setActionHidden_(true);
+ };
+ window['MaterialSnackbar'] = MaterialSnackbar;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialSnackbar.prototype.Constant_ = {
+ // The duration of the snackbar show/hide animation, in ms.
+ ANIMATION_LENGTH: 250
+ };
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialSnackbar.prototype.cssClasses_ = {
+ SNACKBAR: 'mdl-snackbar',
+ MESSAGE: 'mdl-snackbar__text',
+ ACTION: 'mdl-snackbar__action',
+ ACTIVE: 'mdl-snackbar--active'
+ };
+ /**
+ * Display the snackbar.
+ *
+ * @private
+ */
+ MaterialSnackbar.prototype.displaySnackbar_ = function () {
+ this.element_.setAttribute('aria-hidden', 'true');
+ if (this.actionHandler_) {
+ this.actionElement_.textContent = this.actionText_;
+ this.actionElement_.addEventListener('click', this.actionHandler_);
+ this.setActionHidden_(false);
+ }
+ this.textElement_.textContent = this.message_;
+ this.element_.classList.add(this.cssClasses_.ACTIVE);
+ this.element_.setAttribute('aria-hidden', 'false');
+ setTimeout(this.cleanup_.bind(this), this.timeout_);
+ };
+ /**
+ * Show the snackbar.
+ *
+ * @param {Object} data The data for the notification.
+ * @public
+ */
+ MaterialSnackbar.prototype.showSnackbar = function (data) {
+ if (data === undefined) {
+ throw new Error('Please provide a data object with at least a message to display.');
+ }
+ if (data['message'] === undefined) {
+ throw new Error('Please provide a message to be displayed.');
+ }
+ if (data['actionHandler'] && !data['actionText']) {
+ throw new Error('Please provide action text with the handler.');
+ }
+ if (this.active) {
+ this.queuedNotifications_.push(data);
+ } else {
+ this.active = true;
+ this.message_ = data['message'];
+ if (data['timeout']) {
+ this.timeout_ = data['timeout'];
+ } else {
+ this.timeout_ = 2750;
+ }
+ if (data['actionHandler']) {
+ this.actionHandler_ = data['actionHandler'];
+ }
+ if (data['actionText']) {
+ this.actionText_ = data['actionText'];
+ }
+ this.displaySnackbar_();
+ }
+ };
+ MaterialSnackbar.prototype['showSnackbar'] = MaterialSnackbar.prototype.showSnackbar;
+ /**
+ * Check if the queue has items within it.
+ * If it does, display the next entry.
+ *
+ * @private
+ */
+ MaterialSnackbar.prototype.checkQueue_ = function () {
+ if (this.queuedNotifications_.length > 0) {
+ this.showSnackbar(this.queuedNotifications_.shift());
+ }
+ };
+ /**
+ * Cleanup the snackbar event listeners and accessiblity attributes.
+ *
+ * @private
+ */
+ MaterialSnackbar.prototype.cleanup_ = function () {
+ this.element_.classList.remove(this.cssClasses_.ACTIVE);
+ setTimeout(function () {
+ this.element_.setAttribute('aria-hidden', 'true');
+ this.textElement_.textContent = '';
+ if (!Boolean(this.actionElement_.getAttribute('aria-hidden'))) {
+ this.setActionHidden_(true);
+ this.actionElement_.textContent = '';
+ this.actionElement_.removeEventListener('click', this.actionHandler_);
+ }
+ this.actionHandler_ = undefined;
+ this.message_ = undefined;
+ this.actionText_ = undefined;
+ this.active = false;
+ this.checkQueue_();
+ }.bind(this), this.Constant_.ANIMATION_LENGTH);
+ };
+ /**
+ * Set the action handler hidden state.
+ *
+ * @param {boolean} value
+ * @private
+ */
+ MaterialSnackbar.prototype.setActionHidden_ = function (value) {
+ if (value) {
+ this.actionElement_.setAttribute('aria-hidden', 'true');
+ } else {
+ this.actionElement_.removeAttribute('aria-hidden');
+ }
+ };
// The component registers itself. It can assume componentHandler is available
// in the global scope.
-componentHandler.register({
- constructor: MaterialSnackbar,
- classAsString: 'MaterialSnackbar',
- cssClass: 'mdl-js-snackbar',
- widget: true
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Spinner MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @param {HTMLElement} element The element that will be upgraded.
- * @constructor
- */
-var MaterialSpinner = function MaterialSpinner(element) {
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialSpinner'] = MaterialSpinner;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialSpinner.prototype.Constant_ = { MDL_SPINNER_LAYER_COUNT: 4 };
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialSpinner.prototype.CssClasses_ = {
- MDL_SPINNER_LAYER: 'mdl-spinner__layer',
- MDL_SPINNER_CIRCLE_CLIPPER: 'mdl-spinner__circle-clipper',
- MDL_SPINNER_CIRCLE: 'mdl-spinner__circle',
- MDL_SPINNER_GAP_PATCH: 'mdl-spinner__gap-patch',
- MDL_SPINNER_LEFT: 'mdl-spinner__left',
- MDL_SPINNER_RIGHT: 'mdl-spinner__right'
-};
-/**
- * Auxiliary method to create a spinner layer.
- *
- * @param {number} index Index of the layer to be created.
- * @public
- */
-MaterialSpinner.prototype.createLayer = function (index) {
- var layer = document.createElement('div');
- layer.classList.add(this.CssClasses_.MDL_SPINNER_LAYER);
- layer.classList.add(this.CssClasses_.MDL_SPINNER_LAYER + '-' + index);
- var leftClipper = document.createElement('div');
- leftClipper.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER);
- leftClipper.classList.add(this.CssClasses_.MDL_SPINNER_LEFT);
- var gapPatch = document.createElement('div');
- gapPatch.classList.add(this.CssClasses_.MDL_SPINNER_GAP_PATCH);
- var rightClipper = document.createElement('div');
- rightClipper.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER);
- rightClipper.classList.add(this.CssClasses_.MDL_SPINNER_RIGHT);
- var circleOwners = [
- leftClipper,
- gapPatch,
- rightClipper
- ];
- for (var i = 0; i < circleOwners.length; i++) {
- var circle = document.createElement('div');
- circle.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE);
- circleOwners[i].appendChild(circle);
- }
- layer.appendChild(leftClipper);
- layer.appendChild(gapPatch);
- layer.appendChild(rightClipper);
- this.element_.appendChild(layer);
-};
-MaterialSpinner.prototype['createLayer'] = MaterialSpinner.prototype.createLayer;
-/**
- * Stops the spinner animation.
- * Public method for users who need to stop the spinner for any reason.
- *
- * @public
- */
-MaterialSpinner.prototype.stop = function () {
- this.element_.classList.remove('is-active');
-};
-MaterialSpinner.prototype['stop'] = MaterialSpinner.prototype.stop;
-/**
- * Starts the spinner animation.
- * Public method for users who need to manually start the spinner for any reason
- * (instead of just adding the 'is-active' class to their markup).
- *
- * @public
- */
-MaterialSpinner.prototype.start = function () {
- this.element_.classList.add('is-active');
-};
-MaterialSpinner.prototype['start'] = MaterialSpinner.prototype.start;
-/**
- * Initialize element.
- */
-MaterialSpinner.prototype.init = function () {
- if (this.element_) {
- for (var i = 1; i <= this.Constant_.MDL_SPINNER_LAYER_COUNT; i++) {
- this.createLayer(i);
+ componentHandler.register({
+ constructor: MaterialSnackbar,
+ classAsString: 'MaterialSnackbar',
+ cssClass: 'mdl-js-snackbar',
+ widget: true
+ });
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for Spinner MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @param {HTMLElement} element The element that will be upgraded.
+ * @constructor
+ */
+ var MaterialSpinner = function MaterialSpinner(element) {
+ this.element_ = element;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialSpinner'] = MaterialSpinner;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialSpinner.prototype.Constant_ = {MDL_SPINNER_LAYER_COUNT: 4};
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialSpinner.prototype.CssClasses_ = {
+ MDL_SPINNER_LAYER: 'mdl-spinner__layer',
+ MDL_SPINNER_CIRCLE_CLIPPER: 'mdl-spinner__circle-clipper',
+ MDL_SPINNER_CIRCLE: 'mdl-spinner__circle',
+ MDL_SPINNER_GAP_PATCH: 'mdl-spinner__gap-patch',
+ MDL_SPINNER_LEFT: 'mdl-spinner__left',
+ MDL_SPINNER_RIGHT: 'mdl-spinner__right'
+ };
+ /**
+ * Auxiliary method to create a spinner layer.
+ *
+ * @param {number} index Index of the layer to be created.
+ * @public
+ */
+ MaterialSpinner.prototype.createLayer = function (index) {
+ var layer = document.createElement('div');
+ layer.classList.add(this.CssClasses_.MDL_SPINNER_LAYER);
+ layer.classList.add(this.CssClasses_.MDL_SPINNER_LAYER + '-' + index);
+ var leftClipper = document.createElement('div');
+ leftClipper.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER);
+ leftClipper.classList.add(this.CssClasses_.MDL_SPINNER_LEFT);
+ var gapPatch = document.createElement('div');
+ gapPatch.classList.add(this.CssClasses_.MDL_SPINNER_GAP_PATCH);
+ var rightClipper = document.createElement('div');
+ rightClipper.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER);
+ rightClipper.classList.add(this.CssClasses_.MDL_SPINNER_RIGHT);
+ var circleOwners = [
+ leftClipper,
+ gapPatch,
+ rightClipper
+ ];
+ for (var i = 0; i < circleOwners.length; i++) {
+ var circle = document.createElement('div');
+ circle.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE);
+ circleOwners[i].appendChild(circle);
}
- this.element_.classList.add('is-upgraded');
- }
-};
+ layer.appendChild(leftClipper);
+ layer.appendChild(gapPatch);
+ layer.appendChild(rightClipper);
+ this.element_.appendChild(layer);
+ };
+ MaterialSpinner.prototype['createLayer'] = MaterialSpinner.prototype.createLayer;
+ /**
+ * Stops the spinner animation.
+ * Public method for users who need to stop the spinner for any reason.
+ *
+ * @public
+ */
+ MaterialSpinner.prototype.stop = function () {
+ this.element_.classList.remove('is-active');
+ };
+ MaterialSpinner.prototype['stop'] = MaterialSpinner.prototype.stop;
+ /**
+ * Starts the spinner animation.
+ * Public method for users who need to manually start the spinner for any reason
+ * (instead of just adding the 'is-active' class to their markup).
+ *
+ * @public
+ */
+ MaterialSpinner.prototype.start = function () {
+ this.element_.classList.add('is-active');
+ };
+ MaterialSpinner.prototype['start'] = MaterialSpinner.prototype.start;
+ /**
+ * Initialize element.
+ */
+ MaterialSpinner.prototype.init = function () {
+ if (this.element_) {
+ for (var i = 1; i <= this.Constant_.MDL_SPINNER_LAYER_COUNT; i++) {
+ this.createLayer(i);
+ }
+ this.element_.classList.add('is-upgraded');
+ }
+ };
// The component registers itself. It can assume componentHandler is available
// in the global scope.
-componentHandler.register({
- constructor: MaterialSpinner,
- classAsString: 'MaterialSpinner',
- cssClass: 'mdl-js-spinner',
- widget: true
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Checkbox MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialSwitch = function MaterialSwitch(element) {
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialSwitch'] = MaterialSwitch;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialSwitch.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialSwitch.prototype.CssClasses_ = {
- INPUT: 'mdl-switch__input',
- TRACK: 'mdl-switch__track',
- THUMB: 'mdl-switch__thumb',
- FOCUS_HELPER: 'mdl-switch__focus-helper',
- RIPPLE_EFFECT: 'mdl-js-ripple-effect',
- RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
- RIPPLE_CONTAINER: 'mdl-switch__ripple-container',
- RIPPLE_CENTER: 'mdl-ripple--center',
- RIPPLE: 'mdl-ripple',
- IS_FOCUSED: 'is-focused',
- IS_DISABLED: 'is-disabled',
- IS_CHECKED: 'is-checked'
-};
-/**
- * Handle change of state.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialSwitch.prototype.onChange_ = function (event) {
- this.updateClasses_();
-};
-/**
- * Handle focus of element.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialSwitch.prototype.onFocus_ = function (event) {
- this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
-};
-/**
- * Handle lost focus of element.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialSwitch.prototype.onBlur_ = function (event) {
- this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
-};
-/**
- * Handle mouseup.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialSwitch.prototype.onMouseUp_ = function (event) {
- this.blur_();
-};
-/**
- * Handle class updates.
- *
- * @private
- */
-MaterialSwitch.prototype.updateClasses_ = function () {
- this.checkDisabled();
- this.checkToggleState();
-};
-/**
- * Add blur.
- *
- * @private
- */
-MaterialSwitch.prototype.blur_ = function () {
- // TODO: figure out why there's a focus event being fired after our blur,
- // so that we can avoid this hack.
- window.setTimeout(function () {
- this.inputElement_.blur();
- }.bind(this), this.Constant_.TINY_TIMEOUT);
-};
-// Public methods.
-/**
- * Check the components disabled state.
- *
- * @public
- */
-MaterialSwitch.prototype.checkDisabled = function () {
- if (this.inputElement_.disabled) {
- this.element_.classList.add(this.CssClasses_.IS_DISABLED);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
- }
-};
-MaterialSwitch.prototype['checkDisabled'] = MaterialSwitch.prototype.checkDisabled;
-/**
- * Check the components toggled state.
- *
- * @public
- */
-MaterialSwitch.prototype.checkToggleState = function () {
- if (this.inputElement_.checked) {
- this.element_.classList.add(this.CssClasses_.IS_CHECKED);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
- }
-};
-MaterialSwitch.prototype['checkToggleState'] = MaterialSwitch.prototype.checkToggleState;
-/**
- * Disable switch.
- *
- * @public
- */
-MaterialSwitch.prototype.disable = function () {
- this.inputElement_.disabled = true;
- this.updateClasses_();
-};
-MaterialSwitch.prototype['disable'] = MaterialSwitch.prototype.disable;
-/**
- * Enable switch.
- *
- * @public
- */
-MaterialSwitch.prototype.enable = function () {
- this.inputElement_.disabled = false;
- this.updateClasses_();
-};
-MaterialSwitch.prototype['enable'] = MaterialSwitch.prototype.enable;
-/**
- * Activate switch.
- *
- * @public
- */
-MaterialSwitch.prototype.on = function () {
- this.inputElement_.checked = true;
- this.updateClasses_();
-};
-MaterialSwitch.prototype['on'] = MaterialSwitch.prototype.on;
-/**
- * Deactivate switch.
- *
- * @public
- */
-MaterialSwitch.prototype.off = function () {
- this.inputElement_.checked = false;
- this.updateClasses_();
-};
-MaterialSwitch.prototype['off'] = MaterialSwitch.prototype.off;
-/**
- * Initialize element.
- */
-MaterialSwitch.prototype.init = function () {
- if (this.element_) {
- this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);
- var track = document.createElement('div');
- track.classList.add(this.CssClasses_.TRACK);
- var thumb = document.createElement('div');
- thumb.classList.add(this.CssClasses_.THUMB);
- var focusHelper = document.createElement('span');
- focusHelper.classList.add(this.CssClasses_.FOCUS_HELPER);
- thumb.appendChild(focusHelper);
- this.element_.appendChild(track);
- this.element_.appendChild(thumb);
- this.boundMouseUpHandler = this.onMouseUp_.bind(this);
- if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {
- this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
- this.rippleContainerElement_ = document.createElement('span');
- this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);
- this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_EFFECT);
- this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);
- this.rippleContainerElement_.addEventListener('mouseup', this.boundMouseUpHandler);
- var ripple = document.createElement('span');
- ripple.classList.add(this.CssClasses_.RIPPLE);
- this.rippleContainerElement_.appendChild(ripple);
- this.element_.appendChild(this.rippleContainerElement_);
- }
- this.boundChangeHandler = this.onChange_.bind(this);
- this.boundFocusHandler = this.onFocus_.bind(this);
- this.boundBlurHandler = this.onBlur_.bind(this);
- this.inputElement_.addEventListener('change', this.boundChangeHandler);
- this.inputElement_.addEventListener('focus', this.boundFocusHandler);
- this.inputElement_.addEventListener('blur', this.boundBlurHandler);
- this.element_.addEventListener('mouseup', this.boundMouseUpHandler);
+ componentHandler.register({
+ constructor: MaterialSpinner,
+ classAsString: 'MaterialSpinner',
+ cssClass: 'mdl-js-spinner',
+ widget: true
+ });
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for Checkbox MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+ var MaterialSwitch = function MaterialSwitch(element) {
+ this.element_ = element;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialSwitch'] = MaterialSwitch;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialSwitch.prototype.Constant_ = {TINY_TIMEOUT: 0.001};
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialSwitch.prototype.CssClasses_ = {
+ INPUT: 'mdl-switch__input',
+ TRACK: 'mdl-switch__track',
+ THUMB: 'mdl-switch__thumb',
+ FOCUS_HELPER: 'mdl-switch__focus-helper',
+ RIPPLE_EFFECT: 'mdl-js-ripple-effect',
+ RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
+ RIPPLE_CONTAINER: 'mdl-switch__ripple-container',
+ RIPPLE_CENTER: 'mdl-ripple--center',
+ RIPPLE: 'mdl-ripple',
+ IS_FOCUSED: 'is-focused',
+ IS_DISABLED: 'is-disabled',
+ IS_CHECKED: 'is-checked'
+ };
+ /**
+ * Handle change of state.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialSwitch.prototype.onChange_ = function (event) {
this.updateClasses_();
- this.element_.classList.add('is-upgraded');
- }
-};
+ };
+ /**
+ * Handle focus of element.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialSwitch.prototype.onFocus_ = function (event) {
+ this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
+ };
+ /**
+ * Handle lost focus of element.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialSwitch.prototype.onBlur_ = function (event) {
+ this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
+ };
+ /**
+ * Handle mouseup.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialSwitch.prototype.onMouseUp_ = function (event) {
+ this.blur_();
+ };
+ /**
+ * Handle class updates.
+ *
+ * @private
+ */
+ MaterialSwitch.prototype.updateClasses_ = function () {
+ this.checkDisabled();
+ this.checkToggleState();
+ };
+ /**
+ * Add blur.
+ *
+ * @private
+ */
+ MaterialSwitch.prototype.blur_ = function () {
+ // TODO: figure out why there's a focus event being fired after our blur,
+ // so that we can avoid this hack.
+ window.setTimeout(function () {
+ this.inputElement_.blur();
+ }.bind(this), this.Constant_.TINY_TIMEOUT);
+ };
+// Public methods.
+ /**
+ * Check the components disabled state.
+ *
+ * @public
+ */
+ MaterialSwitch.prototype.checkDisabled = function () {
+ if (this.inputElement_.disabled) {
+ this.element_.classList.add(this.CssClasses_.IS_DISABLED);
+ } else {
+ this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
+ }
+ };
+ MaterialSwitch.prototype['checkDisabled'] = MaterialSwitch.prototype.checkDisabled;
+ /**
+ * Check the components toggled state.
+ *
+ * @public
+ */
+ MaterialSwitch.prototype.checkToggleState = function () {
+ if (this.inputElement_.checked) {
+ this.element_.classList.add(this.CssClasses_.IS_CHECKED);
+ } else {
+ this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
+ }
+ };
+ MaterialSwitch.prototype['checkToggleState'] = MaterialSwitch.prototype.checkToggleState;
+ /**
+ * Disable switch.
+ *
+ * @public
+ */
+ MaterialSwitch.prototype.disable = function () {
+ this.inputElement_.disabled = true;
+ this.updateClasses_();
+ };
+ MaterialSwitch.prototype['disable'] = MaterialSwitch.prototype.disable;
+ /**
+ * Enable switch.
+ *
+ * @public
+ */
+ MaterialSwitch.prototype.enable = function () {
+ this.inputElement_.disabled = false;
+ this.updateClasses_();
+ };
+ MaterialSwitch.prototype['enable'] = MaterialSwitch.prototype.enable;
+ /**
+ * Activate switch.
+ *
+ * @public
+ */
+ MaterialSwitch.prototype.on = function () {
+ this.inputElement_.checked = true;
+ this.updateClasses_();
+ };
+ MaterialSwitch.prototype['on'] = MaterialSwitch.prototype.on;
+ /**
+ * Deactivate switch.
+ *
+ * @public
+ */
+ MaterialSwitch.prototype.off = function () {
+ this.inputElement_.checked = false;
+ this.updateClasses_();
+ };
+ MaterialSwitch.prototype['off'] = MaterialSwitch.prototype.off;
+ /**
+ * Initialize element.
+ */
+ MaterialSwitch.prototype.init = function () {
+ if (this.element_) {
+ this.inputElement_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);
+ var track = document.createElement('div');
+ track.classList.add(this.CssClasses_.TRACK);
+ var thumb = document.createElement('div');
+ thumb.classList.add(this.CssClasses_.THUMB);
+ var focusHelper = document.createElement('span');
+ focusHelper.classList.add(this.CssClasses_.FOCUS_HELPER);
+ thumb.appendChild(focusHelper);
+ this.element_.appendChild(track);
+ this.element_.appendChild(thumb);
+ this.boundMouseUpHandler = this.onMouseUp_.bind(this);
+ if (this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT)) {
+ this.element_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
+ this.rippleContainerElement_ = document.createElement('span');
+ this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CONTAINER);
+ this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_EFFECT);
+ this.rippleContainerElement_.classList.add(this.CssClasses_.RIPPLE_CENTER);
+ this.rippleContainerElement_.addEventListener('mouseup', this.boundMouseUpHandler);
+ var ripple = document.createElement('span');
+ ripple.classList.add(this.CssClasses_.RIPPLE);
+ this.rippleContainerElement_.appendChild(ripple);
+ this.element_.appendChild(this.rippleContainerElement_);
+ }
+ this.boundChangeHandler = this.onChange_.bind(this);
+ this.boundFocusHandler = this.onFocus_.bind(this);
+ this.boundBlurHandler = this.onBlur_.bind(this);
+ this.inputElement_.addEventListener('change', this.boundChangeHandler);
+ this.inputElement_.addEventListener('focus', this.boundFocusHandler);
+ this.inputElement_.addEventListener('blur', this.boundBlurHandler);
+ this.element_.addEventListener('mouseup', this.boundMouseUpHandler);
+ this.updateClasses_();
+ this.element_.classList.add('is-upgraded');
+ }
+ };
// The component registers itself. It can assume componentHandler is available
// in the global scope.
-componentHandler.register({
- constructor: MaterialSwitch,
- classAsString: 'MaterialSwitch',
- cssClass: 'mdl-js-switch',
- widget: true
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Tabs MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {Element} element The element that will be upgraded.
- */
-var MaterialTabs = function MaterialTabs(element) {
- // Stores the HTML element.
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialTabs'] = MaterialTabs;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string}
- * @private
- */
-MaterialTabs.prototype.Constant_ = {};
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialTabs.prototype.CssClasses_ = {
- TAB_CLASS: 'mdl-tabs__tab',
- PANEL_CLASS: 'mdl-tabs__panel',
- ACTIVE_CLASS: 'is-active',
- UPGRADED_CLASS: 'is-upgraded',
- MDL_JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',
- MDL_RIPPLE_CONTAINER: 'mdl-tabs__ripple-container',
- MDL_RIPPLE: 'mdl-ripple',
- MDL_JS_RIPPLE_EFFECT_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events'
-};
-/**
- * Handle clicks to a tabs component
- *
- * @private
- */
-MaterialTabs.prototype.initTabs_ = function () {
- if (this.element_.classList.contains(this.CssClasses_.MDL_JS_RIPPLE_EFFECT)) {
- this.element_.classList.add(this.CssClasses_.MDL_JS_RIPPLE_EFFECT_IGNORE_EVENTS);
+ componentHandler.register({
+ constructor: MaterialSwitch,
+ classAsString: 'MaterialSwitch',
+ cssClass: 'mdl-js-switch',
+ widget: true
+ });
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for Tabs MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {Element} element The element that will be upgraded.
+ */
+ var MaterialTabs = function MaterialTabs(element) {
+ // Stores the HTML element.
+ this.element_ = element;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialTabs'] = MaterialTabs;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialTabs.prototype.Constant_ = {};
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialTabs.prototype.CssClasses_ = {
+ TAB_CLASS: 'mdl-tabs__tab',
+ PANEL_CLASS: 'mdl-tabs__panel',
+ ACTIVE_CLASS: 'is-active',
+ UPGRADED_CLASS: 'is-upgraded',
+ MDL_JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',
+ MDL_RIPPLE_CONTAINER: 'mdl-tabs__ripple-container',
+ MDL_RIPPLE: 'mdl-ripple',
+ MDL_JS_RIPPLE_EFFECT_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events'
+ };
+ /**
+ * Handle clicks to a tabs component
+ *
+ * @private
+ */
+ MaterialTabs.prototype.initTabs_ = function () {
+ if (this.element_.classList.contains(this.CssClasses_.MDL_JS_RIPPLE_EFFECT)) {
+ this.element_.classList.add(this.CssClasses_.MDL_JS_RIPPLE_EFFECT_IGNORE_EVENTS);
+ }
+ // Select element tabs, document panels
+ this.tabs_ = this.element_.querySelectorAll('.' + this.CssClasses_.TAB_CLASS);
+ this.panels_ = this.element_.querySelectorAll('.' + this.CssClasses_.PANEL_CLASS);
+ // Create new tabs for each tab element
+ for (var i = 0; i < this.tabs_.length; i++) {
+ new MaterialTab(this.tabs_[i], this);
+ }
+ this.element_.classList.add(this.CssClasses_.UPGRADED_CLASS);
+ };
+ /**
+ * Reset tab state, dropping active classes
+ *
+ * @private
+ */
+ MaterialTabs.prototype.resetTabState_ = function () {
+ for (var k = 0; k < this.tabs_.length; k++) {
+ this.tabs_[k].classList.remove(this.CssClasses_.ACTIVE_CLASS);
+ }
+ };
+ /**
+ * Reset panel state, droping active classes
+ *
+ * @private
+ */
+ MaterialTabs.prototype.resetPanelState_ = function () {
+ for (var j = 0; j < this.panels_.length; j++) {
+ this.panels_[j].classList.remove(this.CssClasses_.ACTIVE_CLASS);
+ }
+ };
+ /**
+ * Initialize element.
+ */
+ MaterialTabs.prototype.init = function () {
+ if (this.element_) {
+ this.initTabs_();
+ }
+ };
+
+ /**
+ * Constructor for an individual tab.
+ *
+ * @constructor
+ * @param {Element} tab The HTML element for the tab.
+ * @param {MaterialTabs} ctx The MaterialTabs object that owns the tab.
+ */
+ function MaterialTab(tab, ctx) {
+ if (tab) {
+ if (ctx.element_.classList.contains(ctx.CssClasses_.MDL_JS_RIPPLE_EFFECT)) {
+ var rippleContainer = document.createElement('span');
+ rippleContainer.classList.add(ctx.CssClasses_.MDL_RIPPLE_CONTAINER);
+ rippleContainer.classList.add(ctx.CssClasses_.MDL_JS_RIPPLE_EFFECT);
+ var ripple = document.createElement('span');
+ ripple.classList.add(ctx.CssClasses_.MDL_RIPPLE);
+ rippleContainer.appendChild(ripple);
+ tab.appendChild(rippleContainer);
+ }
+ tab.addEventListener('click', function (e) {
+ if (tab.getAttribute('href').charAt(0) === '#') {
+ e.preventDefault();
+ var href = tab.href.split('#')[1];
+ var panel = ctx.element_.querySelector('#' + href);
+ ctx.resetTabState_();
+ ctx.resetPanelState_();
+ tab.classList.add(ctx.CssClasses_.ACTIVE_CLASS);
+ panel.classList.add(ctx.CssClasses_.ACTIVE_CLASS);
+ }
+ });
+ }
}
- // Select element tabs, document panels
- this.tabs_ = this.element_.querySelectorAll('.' + this.CssClasses_.TAB_CLASS);
- this.panels_ = this.element_.querySelectorAll('.' + this.CssClasses_.PANEL_CLASS);
- // Create new tabs for each tab element
- for (var i = 0; i < this.tabs_.length; i++) {
- new MaterialTab(this.tabs_[i], this);
- }
- this.element_.classList.add(this.CssClasses_.UPGRADED_CLASS);
-};
-/**
- * Reset tab state, dropping active classes
- *
- * @private
- */
-MaterialTabs.prototype.resetTabState_ = function () {
- for (var k = 0; k < this.tabs_.length; k++) {
- this.tabs_[k].classList.remove(this.CssClasses_.ACTIVE_CLASS);
- }
-};
-/**
- * Reset panel state, droping active classes
- *
- * @private
- */
-MaterialTabs.prototype.resetPanelState_ = function () {
- for (var j = 0; j < this.panels_.length; j++) {
- this.panels_[j].classList.remove(this.CssClasses_.ACTIVE_CLASS);
- }
-};
-/**
- * Initialize element.
- */
-MaterialTabs.prototype.init = function () {
- if (this.element_) {
- this.initTabs_();
- }
-};
-/**
- * Constructor for an individual tab.
- *
- * @constructor
- * @param {Element} tab The HTML element for the tab.
- * @param {MaterialTabs} ctx The MaterialTabs object that owns the tab.
- */
-function MaterialTab(tab, ctx) {
- if (tab) {
- if (ctx.element_.classList.contains(ctx.CssClasses_.MDL_JS_RIPPLE_EFFECT)) {
+
+// The component registers itself. It can assume componentHandler is available
+// in the global scope.
+ componentHandler.register({
+ constructor: MaterialTabs,
+ classAsString: 'MaterialTabs',
+ cssClass: 'mdl-js-tabs'
+ });
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for Textfield MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+ var MaterialTextfield = function MaterialTextfield(element) {
+ this.element_ = element;
+ this.maxRows = this.Constant_.NO_MAX_ROWS;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialTextfield'] = MaterialTextfield;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialTextfield.prototype.Constant_ = {
+ NO_MAX_ROWS: -1,
+ MAX_ROWS_ATTRIBUTE: 'maxrows'
+ };
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialTextfield.prototype.CssClasses_ = {
+ LABEL: 'mdl-textfield__label',
+ INPUT: 'mdl-textfield__input',
+ IS_DIRTY: 'is-dirty',
+ IS_FOCUSED: 'is-focused',
+ IS_DISABLED: 'is-disabled',
+ IS_INVALID: 'is-invalid',
+ IS_UPGRADED: 'is-upgraded',
+ HAS_PLACEHOLDER: 'has-placeholder'
+ };
+ /**
+ * Handle input being entered.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialTextfield.prototype.onKeyDown_ = function (event) {
+ var currentRowCount = event.target.value.split('\n').length;
+ if (event.keyCode === 13) {
+ if (currentRowCount >= this.maxRows) {
+ event.preventDefault();
+ }
+ }
+ };
+ /**
+ * Handle focus.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialTextfield.prototype.onFocus_ = function (event) {
+ this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
+ };
+ /**
+ * Handle lost focus.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialTextfield.prototype.onBlur_ = function (event) {
+ this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
+ };
+ /**
+ * Handle reset event from out side.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialTextfield.prototype.onReset_ = function (event) {
+ this.updateClasses_();
+ };
+ /**
+ * Handle class updates.
+ *
+ * @private
+ */
+ MaterialTextfield.prototype.updateClasses_ = function () {
+ this.checkDisabled();
+ this.checkValidity();
+ this.checkDirty();
+ this.checkFocus();
+ };
+// Public methods.
+ /**
+ * Check the disabled state and update field accordingly.
+ *
+ * @public
+ */
+ MaterialTextfield.prototype.checkDisabled = function () {
+ if (this.input_.disabled) {
+ this.element_.classList.add(this.CssClasses_.IS_DISABLED);
+ } else {
+ this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
+ }
+ };
+ MaterialTextfield.prototype['checkDisabled'] = MaterialTextfield.prototype.checkDisabled;
+ /**
+ * Check the focus state and update field accordingly.
+ *
+ * @public
+ */
+ MaterialTextfield.prototype.checkFocus = function () {
+ if (Boolean(this.element_.querySelector(':focus'))) {
+ this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
+ } else {
+ this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
+ }
+ };
+ MaterialTextfield.prototype['checkFocus'] = MaterialTextfield.prototype.checkFocus;
+ /**
+ * Check the validity state and update field accordingly.
+ *
+ * @public
+ */
+ MaterialTextfield.prototype.checkValidity = function () {
+ if (this.input_.validity) {
+ if (this.input_.validity.valid) {
+ this.element_.classList.remove(this.CssClasses_.IS_INVALID);
+ } else {
+ this.element_.classList.add(this.CssClasses_.IS_INVALID);
+ }
+ }
+ };
+ MaterialTextfield.prototype['checkValidity'] = MaterialTextfield.prototype.checkValidity;
+ /**
+ * Check the dirty state and update field accordingly.
+ *
+ * @public
+ */
+ MaterialTextfield.prototype.checkDirty = function () {
+ if (this.input_.value && this.input_.value.length > 0) {
+ this.element_.classList.add(this.CssClasses_.IS_DIRTY);
+ } else {
+ this.element_.classList.remove(this.CssClasses_.IS_DIRTY);
+ }
+ };
+ MaterialTextfield.prototype['checkDirty'] = MaterialTextfield.prototype.checkDirty;
+ /**
+ * Disable text field.
+ *
+ * @public
+ */
+ MaterialTextfield.prototype.disable = function () {
+ this.input_.disabled = true;
+ this.updateClasses_();
+ };
+ MaterialTextfield.prototype['disable'] = MaterialTextfield.prototype.disable;
+ /**
+ * Enable text field.
+ *
+ * @public
+ */
+ MaterialTextfield.prototype.enable = function () {
+ this.input_.disabled = false;
+ this.updateClasses_();
+ };
+ MaterialTextfield.prototype['enable'] = MaterialTextfield.prototype.enable;
+ /**
+ * Update text field value.
+ *
+ * @param {string} value The value to which to set the control (optional).
+ * @public
+ */
+ MaterialTextfield.prototype.change = function (value) {
+ this.input_.value = value || '';
+ this.updateClasses_();
+ };
+ MaterialTextfield.prototype['change'] = MaterialTextfield.prototype.change;
+ /**
+ * Initialize element.
+ */
+ MaterialTextfield.prototype.init = function () {
+ if (this.element_) {
+ this.label_ = this.element_.querySelector('.' + this.CssClasses_.LABEL);
+ this.input_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);
+ if (this.input_) {
+ if (this.input_.hasAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE)) {
+ this.maxRows = parseInt(this.input_.getAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE), 10);
+ if (isNaN(this.maxRows)) {
+ this.maxRows = this.Constant_.NO_MAX_ROWS;
+ }
+ }
+ if (this.input_.hasAttribute('placeholder')) {
+ this.element_.classList.add(this.CssClasses_.HAS_PLACEHOLDER);
+ }
+ this.boundUpdateClassesHandler = this.updateClasses_.bind(this);
+ this.boundFocusHandler = this.onFocus_.bind(this);
+ this.boundBlurHandler = this.onBlur_.bind(this);
+ this.boundResetHandler = this.onReset_.bind(this);
+ this.input_.addEventListener('input', this.boundUpdateClassesHandler);
+ this.input_.addEventListener('focus', this.boundFocusHandler);
+ this.input_.addEventListener('blur', this.boundBlurHandler);
+ this.input_.addEventListener('reset', this.boundResetHandler);
+ if (this.maxRows !== this.Constant_.NO_MAX_ROWS) {
+ // TODO: This should handle pasting multi line text.
+ // Currently doesn't.
+ this.boundKeyDownHandler = this.onKeyDown_.bind(this);
+ this.input_.addEventListener('keydown', this.boundKeyDownHandler);
+ }
+ var invalid = this.element_.classList.contains(this.CssClasses_.IS_INVALID);
+ this.updateClasses_();
+ this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
+ if (invalid) {
+ this.element_.classList.add(this.CssClasses_.IS_INVALID);
+ }
+ if (this.input_.hasAttribute('autofocus')) {
+ this.element_.focus();
+ this.checkFocus();
+ }
+ }
+ }
+ };
+// The component registers itself. It can assume componentHandler is available
+// in the global scope.
+ componentHandler.register({
+ constructor: MaterialTextfield,
+ classAsString: 'MaterialTextfield',
+ cssClass: 'mdl-js-textfield',
+ widget: true
+ });
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for Tooltip MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+ var MaterialTooltip = function MaterialTooltip(element) {
+ this.element_ = element;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialTooltip'] = MaterialTooltip;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialTooltip.prototype.Constant_ = {};
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialTooltip.prototype.CssClasses_ = {
+ IS_ACTIVE: 'is-active',
+ BOTTOM: 'mdl-tooltip--bottom',
+ LEFT: 'mdl-tooltip--left',
+ RIGHT: 'mdl-tooltip--right',
+ TOP: 'mdl-tooltip--top'
+ };
+ /**
+ * Handle mouseenter for tooltip.
+ *
+ * @param {Event} event The event that fired.
+ * @private
+ */
+ MaterialTooltip.prototype.handleMouseEnter_ = function (event) {
+ var props = event.target.getBoundingClientRect();
+ var left = props.left + props.width / 2;
+ var top = props.top + props.height / 2;
+ var marginLeft = -1 * (this.element_.offsetWidth / 2);
+ var marginTop = -1 * (this.element_.offsetHeight / 2);
+ if (this.element_.classList.contains(this.CssClasses_.LEFT) || this.element_.classList.contains(this.CssClasses_.RIGHT)) {
+ left = props.width / 2;
+ if (top + marginTop < 0) {
+ this.element_.style.top = '0';
+ this.element_.style.marginTop = '0';
+ } else {
+ this.element_.style.top = top + 'px';
+ this.element_.style.marginTop = marginTop + 'px';
+ }
+ } else {
+ if (left + marginLeft < 0) {
+ this.element_.style.left = '0';
+ this.element_.style.marginLeft = '0';
+ } else {
+ this.element_.style.left = left + 'px';
+ this.element_.style.marginLeft = marginLeft + 'px';
+ }
+ }
+ if (this.element_.classList.contains(this.CssClasses_.TOP)) {
+ this.element_.style.top = props.top - this.element_.offsetHeight - 10 + 'px';
+ } else if (this.element_.classList.contains(this.CssClasses_.RIGHT)) {
+ this.element_.style.left = props.left + props.width + 10 + 'px';
+ } else if (this.element_.classList.contains(this.CssClasses_.LEFT)) {
+ this.element_.style.left = props.left - this.element_.offsetWidth - 10 + 'px';
+ } else {
+ this.element_.style.top = props.top + props.height + 10 + 'px';
+ }
+ this.element_.classList.add(this.CssClasses_.IS_ACTIVE);
+ };
+ /**
+ * Hide tooltip on mouseleave or scroll
+ *
+ * @private
+ */
+ MaterialTooltip.prototype.hideTooltip_ = function () {
+ this.element_.classList.remove(this.CssClasses_.IS_ACTIVE);
+ };
+ /**
+ * Initialize element.
+ */
+ MaterialTooltip.prototype.init = function () {
+ if (this.element_) {
+ var forElId = this.element_.getAttribute('for') || this.element_.getAttribute('data-mdl-for');
+ if (forElId) {
+ this.forElement_ = document.getElementById(forElId);
+ }
+ if (this.forElement_) {
+ // It's left here because it prevents accidental text selection on Android
+ if (!this.forElement_.hasAttribute('tabindex')) {
+ this.forElement_.setAttribute('tabindex', '0');
+ }
+ this.boundMouseEnterHandler = this.handleMouseEnter_.bind(this);
+ this.boundMouseLeaveAndScrollHandler = this.hideTooltip_.bind(this);
+ this.forElement_.addEventListener('mouseenter', this.boundMouseEnterHandler, false);
+ this.forElement_.addEventListener('touchend', this.boundMouseEnterHandler, false);
+ this.forElement_.addEventListener('mouseleave', this.boundMouseLeaveAndScrollHandler, false);
+ window.addEventListener('scroll', this.boundMouseLeaveAndScrollHandler, true);
+ window.addEventListener('touchstart', this.boundMouseLeaveAndScrollHandler);
+ }
+ }
+ };
+// The component registers itself. It can assume componentHandler is available
+// in the global scope.
+ componentHandler.register({
+ constructor: MaterialTooltip,
+ classAsString: 'MaterialTooltip',
+ cssClass: 'mdl-tooltip'
+ });
+ /**
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /**
+ * Class constructor for Layout MDL component.
+ * Implements MDL component design pattern defined at:
+ * https://github.com/jasonmayes/mdl-component-design-pattern
+ *
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+ var MaterialLayout = function MaterialLayout(element) {
+ this.element_ = element;
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialLayout'] = MaterialLayout;
+ /**
+ * Store constants in one place so they can be updated easily.
+ *
+ * @enum {string | number}
+ * @private
+ */
+ MaterialLayout.prototype.Constant_ = {
+ MAX_WIDTH: '(max-width: 1024px)',
+ TAB_SCROLL_PIXELS: 100,
+ RESIZE_TIMEOUT: 100,
+ MENU_ICON: '',
+ CHEVRON_LEFT: 'chevron_left',
+ CHEVRON_RIGHT: 'chevron_right'
+ };
+ /**
+ * Keycodes, for code readability.
+ *
+ * @enum {number}
+ * @private
+ */
+ MaterialLayout.prototype.Keycodes_ = {
+ ENTER: 13,
+ ESCAPE: 27,
+ SPACE: 32
+ };
+ /**
+ * Modes.
+ *
+ * @enum {number}
+ * @private
+ */
+ MaterialLayout.prototype.Mode_ = {
+ STANDARD: 0,
+ SEAMED: 1,
+ WATERFALL: 2,
+ SCROLL: 3
+ };
+ /**
+ * Store strings for class names defined by this component that are used in
+ * JavaScript. This allows us to simply change it in one place should we
+ * decide to modify at a later date.
+ *
+ * @enum {string}
+ * @private
+ */
+ MaterialLayout.prototype.CssClasses_ = {
+ CONTAINER: 'mdl-layout__container',
+ HEADER: 'mdl-layout__header',
+ DRAWER: 'mdl-layout__drawer',
+ CONTENT: 'mdl-layout__content',
+ DRAWER_BTN: 'mdl-layout__drawer-button',
+ ICON: 'material-icons',
+ JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',
+ RIPPLE_CONTAINER: 'mdl-layout__tab-ripple-container',
+ RIPPLE: 'mdl-ripple',
+ RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
+ HEADER_SEAMED: 'mdl-layout__header--seamed',
+ HEADER_WATERFALL: 'mdl-layout__header--waterfall',
+ HEADER_SCROLL: 'mdl-layout__header--scroll',
+ FIXED_HEADER: 'mdl-layout--fixed-header',
+ OBFUSCATOR: 'mdl-layout__obfuscator',
+ TAB_BAR: 'mdl-layout__tab-bar',
+ TAB_CONTAINER: 'mdl-layout__tab-bar-container',
+ TAB: 'mdl-layout__tab',
+ TAB_BAR_BUTTON: 'mdl-layout__tab-bar-button',
+ TAB_BAR_LEFT_BUTTON: 'mdl-layout__tab-bar-left-button',
+ TAB_BAR_RIGHT_BUTTON: 'mdl-layout__tab-bar-right-button',
+ TAB_MANUAL_SWITCH: 'mdl-layout__tab-manual-switch',
+ PANEL: 'mdl-layout__tab-panel',
+ HAS_DRAWER: 'has-drawer',
+ HAS_TABS: 'has-tabs',
+ HAS_SCROLLING_HEADER: 'has-scrolling-header',
+ CASTING_SHADOW: 'is-casting-shadow',
+ IS_COMPACT: 'is-compact',
+ IS_SMALL_SCREEN: 'is-small-screen',
+ IS_DRAWER_OPEN: 'is-visible',
+ IS_ACTIVE: 'is-active',
+ IS_UPGRADED: 'is-upgraded',
+ IS_ANIMATING: 'is-animating',
+ ON_LARGE_SCREEN: 'mdl-layout--large-screen-only',
+ ON_SMALL_SCREEN: 'mdl-layout--small-screen-only'
+ };
+ /**
+ * Handles scrolling on the content.
+ *
+ * @private
+ */
+ MaterialLayout.prototype.contentScrollHandler_ = function () {
+ if (this.header_.classList.contains(this.CssClasses_.IS_ANIMATING)) {
+ return;
+ }
+ var headerVisible = !this.element_.classList.contains(this.CssClasses_.IS_SMALL_SCREEN) || this.element_.classList.contains(this.CssClasses_.FIXED_HEADER);
+ if (this.content_.scrollTop > 0 && !this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {
+ this.header_.classList.add(this.CssClasses_.CASTING_SHADOW);
+ this.header_.classList.add(this.CssClasses_.IS_COMPACT);
+ if (headerVisible) {
+ this.header_.classList.add(this.CssClasses_.IS_ANIMATING);
+ }
+ } else if (this.content_.scrollTop <= 0 && this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {
+ this.header_.classList.remove(this.CssClasses_.CASTING_SHADOW);
+ this.header_.classList.remove(this.CssClasses_.IS_COMPACT);
+ if (headerVisible) {
+ this.header_.classList.add(this.CssClasses_.IS_ANIMATING);
+ }
+ }
+ };
+ /**
+ * Handles a keyboard event on the drawer.
+ *
+ * @param {Event} evt The event that fired.
+ * @private
+ */
+ MaterialLayout.prototype.keyboardEventHandler_ = function (evt) {
+ // Only react when the drawer is open.
+ if (evt.keyCode === this.Keycodes_.ESCAPE && this.drawer_.classList.contains(this.CssClasses_.IS_DRAWER_OPEN)) {
+ this.toggleDrawer();
+ }
+ };
+ /**
+ * Handles changes in screen size.
+ *
+ * @private
+ */
+ MaterialLayout.prototype.screenSizeHandler_ = function () {
+ if (this.screenSizeMediaQuery_.matches) {
+ this.element_.classList.add(this.CssClasses_.IS_SMALL_SCREEN);
+ } else {
+ this.element_.classList.remove(this.CssClasses_.IS_SMALL_SCREEN);
+ // Collapse drawer (if any) when moving to a large screen size.
+ if (this.drawer_) {
+ this.drawer_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN);
+ this.obfuscator_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN);
+ }
+ }
+ };
+ /**
+ * Handles events of drawer button.
+ *
+ * @param {Event} evt The event that fired.
+ * @private
+ */
+ MaterialLayout.prototype.drawerToggleHandler_ = function (evt) {
+ if (evt && evt.type === 'keydown') {
+ if (evt.keyCode === this.Keycodes_.SPACE || evt.keyCode === this.Keycodes_.ENTER) {
+ // prevent scrolling in drawer nav
+ evt.preventDefault();
+ } else {
+ // prevent other keys
+ return;
+ }
+ }
+ this.toggleDrawer();
+ };
+ /**
+ * Handles (un)setting the `is-animating` class
+ *
+ * @private
+ */
+ MaterialLayout.prototype.headerTransitionEndHandler_ = function () {
+ this.header_.classList.remove(this.CssClasses_.IS_ANIMATING);
+ };
+ /**
+ * Handles expanding the header on click
+ *
+ * @private
+ */
+ MaterialLayout.prototype.headerClickHandler_ = function () {
+ if (this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {
+ this.header_.classList.remove(this.CssClasses_.IS_COMPACT);
+ this.header_.classList.add(this.CssClasses_.IS_ANIMATING);
+ }
+ };
+ /**
+ * Reset tab state, dropping active classes
+ *
+ * @private
+ */
+ MaterialLayout.prototype.resetTabState_ = function (tabBar) {
+ for (var k = 0; k < tabBar.length; k++) {
+ tabBar[k].classList.remove(this.CssClasses_.IS_ACTIVE);
+ }
+ };
+ /**
+ * Reset panel state, droping active classes
+ *
+ * @private
+ */
+ MaterialLayout.prototype.resetPanelState_ = function (panels) {
+ for (var j = 0; j < panels.length; j++) {
+ panels[j].classList.remove(this.CssClasses_.IS_ACTIVE);
+ }
+ };
+ /**
+ * Toggle drawer state
+ *
+ * @public
+ */
+ MaterialLayout.prototype.toggleDrawer = function () {
+ var drawerButton = this.element_.querySelector('.' + this.CssClasses_.DRAWER_BTN);
+ this.drawer_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);
+ this.obfuscator_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);
+ // Set accessibility properties.
+ if (this.drawer_.classList.contains(this.CssClasses_.IS_DRAWER_OPEN)) {
+ this.drawer_.setAttribute('aria-hidden', 'false');
+ drawerButton.setAttribute('aria-expanded', 'true');
+ } else {
+ this.drawer_.setAttribute('aria-hidden', 'true');
+ drawerButton.setAttribute('aria-expanded', 'false');
+ }
+ };
+ MaterialLayout.prototype['toggleDrawer'] = MaterialLayout.prototype.toggleDrawer;
+ /**
+ * Initialize element.
+ */
+ MaterialLayout.prototype.init = function () {
+ if (this.element_) {
+ var container = document.createElement('div');
+ container.classList.add(this.CssClasses_.CONTAINER);
+ var focusedElement = this.element_.querySelector(':focus');
+ this.element_.parentElement.insertBefore(container, this.element_);
+ this.element_.parentElement.removeChild(this.element_);
+ container.appendChild(this.element_);
+ if (focusedElement) {
+ focusedElement.focus();
+ }
+ var directChildren = this.element_.childNodes;
+ var numChildren = directChildren.length;
+ for (var c = 0; c < numChildren; c++) {
+ var child = directChildren[c];
+ if (child.classList && child.classList.contains(this.CssClasses_.HEADER)) {
+ this.header_ = child;
+ }
+ if (child.classList && child.classList.contains(this.CssClasses_.DRAWER)) {
+ this.drawer_ = child;
+ }
+ if (child.classList && child.classList.contains(this.CssClasses_.CONTENT)) {
+ this.content_ = child;
+ }
+ }
+ window.addEventListener('pageshow', function (e) {
+ if (e.persisted) {
+ // when page is loaded from back/forward cache
+ // trigger repaint to let layout scroll in safari
+ this.element_.style.overflowY = 'hidden';
+ requestAnimationFrame(function () {
+ this.element_.style.overflowY = '';
+ }.bind(this));
+ }
+ }.bind(this), false);
+ if (this.header_) {
+ this.tabBar_ = this.header_.querySelector('.' + this.CssClasses_.TAB_BAR);
+ }
+ var mode = this.Mode_.STANDARD;
+ if (this.header_) {
+ if (this.header_.classList.contains(this.CssClasses_.HEADER_SEAMED)) {
+ mode = this.Mode_.SEAMED;
+ } else if (this.header_.classList.contains(this.CssClasses_.HEADER_WATERFALL)) {
+ mode = this.Mode_.WATERFALL;
+ this.header_.addEventListener('transitionend', this.headerTransitionEndHandler_.bind(this));
+ this.header_.addEventListener('click', this.headerClickHandler_.bind(this));
+ } else if (this.header_.classList.contains(this.CssClasses_.HEADER_SCROLL)) {
+ mode = this.Mode_.SCROLL;
+ container.classList.add(this.CssClasses_.HAS_SCROLLING_HEADER);
+ }
+ if (mode === this.Mode_.STANDARD) {
+ this.header_.classList.add(this.CssClasses_.CASTING_SHADOW);
+ if (this.tabBar_) {
+ this.tabBar_.classList.add(this.CssClasses_.CASTING_SHADOW);
+ }
+ } else if (mode === this.Mode_.SEAMED || mode === this.Mode_.SCROLL) {
+ this.header_.classList.remove(this.CssClasses_.CASTING_SHADOW);
+ if (this.tabBar_) {
+ this.tabBar_.classList.remove(this.CssClasses_.CASTING_SHADOW);
+ }
+ } else if (mode === this.Mode_.WATERFALL) {
+ // Add and remove shadows depending on scroll position.
+ // Also add/remove auxiliary class for styling of the compact version of
+ // the header.
+ this.content_.addEventListener('scroll', this.contentScrollHandler_.bind(this));
+ this.contentScrollHandler_();
+ }
+ }
+ // Add drawer toggling button to our layout, if we have an openable drawer.
+ if (this.drawer_) {
+ var drawerButton = this.element_.querySelector('.' + this.CssClasses_.DRAWER_BTN);
+ if (!drawerButton) {
+ drawerButton = document.createElement('div');
+ drawerButton.setAttribute('aria-expanded', 'false');
+ drawerButton.setAttribute('role', 'button');
+ drawerButton.setAttribute('tabindex', '0');
+ drawerButton.classList.add(this.CssClasses_.DRAWER_BTN);
+ var drawerButtonIcon = document.createElement('i');
+ drawerButtonIcon.classList.add(this.CssClasses_.ICON);
+ drawerButtonIcon.innerHTML = this.Constant_.MENU_ICON;
+ drawerButton.appendChild(drawerButtonIcon);
+ }
+ if (this.drawer_.classList.contains(this.CssClasses_.ON_LARGE_SCREEN)) {
+ //If drawer has ON_LARGE_SCREEN class then add it to the drawer toggle button as well.
+ drawerButton.classList.add(this.CssClasses_.ON_LARGE_SCREEN);
+ } else if (this.drawer_.classList.contains(this.CssClasses_.ON_SMALL_SCREEN)) {
+ //If drawer has ON_SMALL_SCREEN class then add it to the drawer toggle button as well.
+ drawerButton.classList.add(this.CssClasses_.ON_SMALL_SCREEN);
+ }
+ drawerButton.addEventListener('click', this.drawerToggleHandler_.bind(this));
+ drawerButton.addEventListener('keydown', this.drawerToggleHandler_.bind(this));
+ // Add a class if the layout has a drawer, for altering the left padding.
+ // Adds the HAS_DRAWER to the elements since this.header_ may or may
+ // not be present.
+ this.element_.classList.add(this.CssClasses_.HAS_DRAWER);
+ // If we have a fixed header, add the button to the header rather than
+ // the layout.
+ if (this.element_.classList.contains(this.CssClasses_.FIXED_HEADER)) {
+ this.header_.insertBefore(drawerButton, this.header_.firstChild);
+ } else {
+ this.element_.insertBefore(drawerButton, this.content_);
+ }
+ var obfuscator = document.createElement('div');
+ obfuscator.classList.add(this.CssClasses_.OBFUSCATOR);
+ this.element_.appendChild(obfuscator);
+ obfuscator.addEventListener('click', this.drawerToggleHandler_.bind(this));
+ this.obfuscator_ = obfuscator;
+ this.drawer_.addEventListener('keydown', this.keyboardEventHandler_.bind(this));
+ this.drawer_.setAttribute('aria-hidden', 'true');
+ }
+ // Keep an eye on screen size, and add/remove auxiliary class for styling
+ // of small screens.
+ this.screenSizeMediaQuery_ = window.matchMedia(this.Constant_.MAX_WIDTH);
+ this.screenSizeMediaQuery_.addListener(this.screenSizeHandler_.bind(this));
+ this.screenSizeHandler_();
+ // Initialize tabs, if any.
+ if (this.header_ && this.tabBar_) {
+ this.element_.classList.add(this.CssClasses_.HAS_TABS);
+ var tabContainer = document.createElement('div');
+ tabContainer.classList.add(this.CssClasses_.TAB_CONTAINER);
+ this.header_.insertBefore(tabContainer, this.tabBar_);
+ this.header_.removeChild(this.tabBar_);
+ var leftButton = document.createElement('div');
+ leftButton.classList.add(this.CssClasses_.TAB_BAR_BUTTON);
+ leftButton.classList.add(this.CssClasses_.TAB_BAR_LEFT_BUTTON);
+ var leftButtonIcon = document.createElement('i');
+ leftButtonIcon.classList.add(this.CssClasses_.ICON);
+ leftButtonIcon.textContent = this.Constant_.CHEVRON_LEFT;
+ leftButton.appendChild(leftButtonIcon);
+ leftButton.addEventListener('click', function () {
+ this.tabBar_.scrollLeft -= this.Constant_.TAB_SCROLL_PIXELS;
+ }.bind(this));
+ var rightButton = document.createElement('div');
+ rightButton.classList.add(this.CssClasses_.TAB_BAR_BUTTON);
+ rightButton.classList.add(this.CssClasses_.TAB_BAR_RIGHT_BUTTON);
+ var rightButtonIcon = document.createElement('i');
+ rightButtonIcon.classList.add(this.CssClasses_.ICON);
+ rightButtonIcon.textContent = this.Constant_.CHEVRON_RIGHT;
+ rightButton.appendChild(rightButtonIcon);
+ rightButton.addEventListener('click', function () {
+ this.tabBar_.scrollLeft += this.Constant_.TAB_SCROLL_PIXELS;
+ }.bind(this));
+ tabContainer.appendChild(leftButton);
+ tabContainer.appendChild(this.tabBar_);
+ tabContainer.appendChild(rightButton);
+ // Add and remove tab buttons depending on scroll position and total
+ // window size.
+ var tabUpdateHandler = function () {
+ if (this.tabBar_.scrollLeft > 0) {
+ leftButton.classList.add(this.CssClasses_.IS_ACTIVE);
+ } else {
+ leftButton.classList.remove(this.CssClasses_.IS_ACTIVE);
+ }
+ if (this.tabBar_.scrollLeft < this.tabBar_.scrollWidth - this.tabBar_.offsetWidth) {
+ rightButton.classList.add(this.CssClasses_.IS_ACTIVE);
+ } else {
+ rightButton.classList.remove(this.CssClasses_.IS_ACTIVE);
+ }
+ }.bind(this);
+ this.tabBar_.addEventListener('scroll', tabUpdateHandler);
+ tabUpdateHandler();
+ // Update tabs when the window resizes.
+ var windowResizeHandler = function () {
+ // Use timeouts to make sure it doesn't happen too often.
+ if (this.resizeTimeoutId_) {
+ clearTimeout(this.resizeTimeoutId_);
+ }
+ this.resizeTimeoutId_ = setTimeout(function () {
+ tabUpdateHandler();
+ this.resizeTimeoutId_ = null;
+ }.bind(this), this.Constant_.RESIZE_TIMEOUT);
+ }.bind(this);
+ window.addEventListener('resize', windowResizeHandler);
+ if (this.tabBar_.classList.contains(this.CssClasses_.JS_RIPPLE_EFFECT)) {
+ this.tabBar_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
+ }
+ // Select element tabs, document panels
+ var tabs = this.tabBar_.querySelectorAll('.' + this.CssClasses_.TAB);
+ var panels = this.content_.querySelectorAll('.' + this.CssClasses_.PANEL);
+ // Create new tabs for each tab element
+ for (var i = 0; i < tabs.length; i++) {
+ new MaterialLayoutTab(tabs[i], tabs, panels, this);
+ }
+ }
+ this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
+ }
+ };
+
+ /**
+ * Constructor for an individual tab.
+ *
+ * @constructor
+ * @param {HTMLElement} tab The HTML element for the tab.
+ * @param {!Array} tabs Array with HTML elements for all tabs.
+ * @param {!Array} panels Array with HTML elements for all panels.
+ * @param {MaterialLayout} layout The MaterialLayout object that owns the tab.
+ */
+ function MaterialLayoutTab(tab, tabs, panels, layout) {
+ /**
+ * Auxiliary method to programmatically select a tab in the UI.
+ */
+ function selectTab() {
+ var href = tab.href.split('#')[1];
+ var panel = layout.content_.querySelector('#' + href);
+ layout.resetTabState_(tabs);
+ layout.resetPanelState_(panels);
+ tab.classList.add(layout.CssClasses_.IS_ACTIVE);
+ panel.classList.add(layout.CssClasses_.IS_ACTIVE);
+ }
+
+ if (layout.tabBar_.classList.contains(layout.CssClasses_.JS_RIPPLE_EFFECT)) {
var rippleContainer = document.createElement('span');
- rippleContainer.classList.add(ctx.CssClasses_.MDL_RIPPLE_CONTAINER);
- rippleContainer.classList.add(ctx.CssClasses_.MDL_JS_RIPPLE_EFFECT);
+ rippleContainer.classList.add(layout.CssClasses_.RIPPLE_CONTAINER);
+ rippleContainer.classList.add(layout.CssClasses_.JS_RIPPLE_EFFECT);
var ripple = document.createElement('span');
- ripple.classList.add(ctx.CssClasses_.MDL_RIPPLE);
+ ripple.classList.add(layout.CssClasses_.RIPPLE);
rippleContainer.appendChild(ripple);
tab.appendChild(rippleContainer);
}
- tab.addEventListener('click', function (e) {
- if (tab.getAttribute('href').charAt(0) === '#') {
- e.preventDefault();
- var href = tab.href.split('#')[1];
- var panel = ctx.element_.querySelector('#' + href);
- ctx.resetTabState_();
- ctx.resetPanelState_();
- tab.classList.add(ctx.CssClasses_.ACTIVE_CLASS);
- panel.classList.add(ctx.CssClasses_.ACTIVE_CLASS);
- }
- });
+ if (!layout.tabBar_.classList.contains(layout.CssClasses_.TAB_MANUAL_SWITCH)) {
+ tab.addEventListener('click', function (e) {
+ if (tab.getAttribute('href').charAt(0) === '#') {
+ e.preventDefault();
+ selectTab();
+ }
+ });
+ }
+ tab.show = selectTab;
}
-}
+
+ window['MaterialLayoutTab'] = MaterialLayoutTab;
// The component registers itself. It can assume componentHandler is available
// in the global scope.
-componentHandler.register({
- constructor: MaterialTabs,
- classAsString: 'MaterialTabs',
- cssClass: 'mdl-js-tabs'
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Textfield MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialTextfield = function MaterialTextfield(element) {
- this.element_ = element;
- this.maxRows = this.Constant_.NO_MAX_ROWS;
- // Initialize instance.
- this.init();
-};
-window['MaterialTextfield'] = MaterialTextfield;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialTextfield.prototype.Constant_ = {
- NO_MAX_ROWS: -1,
- MAX_ROWS_ATTRIBUTE: 'maxrows'
-};
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialTextfield.prototype.CssClasses_ = {
- LABEL: 'mdl-textfield__label',
- INPUT: 'mdl-textfield__input',
- IS_DIRTY: 'is-dirty',
- IS_FOCUSED: 'is-focused',
- IS_DISABLED: 'is-disabled',
- IS_INVALID: 'is-invalid',
- IS_UPGRADED: 'is-upgraded',
- HAS_PLACEHOLDER: 'has-placeholder'
-};
-/**
- * Handle input being entered.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialTextfield.prototype.onKeyDown_ = function (event) {
- var currentRowCount = event.target.value.split('\n').length;
- if (event.keyCode === 13) {
- if (currentRowCount >= this.maxRows) {
- event.preventDefault();
- }
- }
-};
-/**
- * Handle focus.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialTextfield.prototype.onFocus_ = function (event) {
- this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
-};
-/**
- * Handle lost focus.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialTextfield.prototype.onBlur_ = function (event) {
- this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
-};
-/**
- * Handle reset event from out side.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialTextfield.prototype.onReset_ = function (event) {
- this.updateClasses_();
-};
-/**
- * Handle class updates.
- *
- * @private
- */
-MaterialTextfield.prototype.updateClasses_ = function () {
- this.checkDisabled();
- this.checkValidity();
- this.checkDirty();
- this.checkFocus();
-};
-// Public methods.
-/**
- * Check the disabled state and update field accordingly.
- *
- * @public
- */
-MaterialTextfield.prototype.checkDisabled = function () {
- if (this.input_.disabled) {
- this.element_.classList.add(this.CssClasses_.IS_DISABLED);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
- }
-};
-MaterialTextfield.prototype['checkDisabled'] = MaterialTextfield.prototype.checkDisabled;
-/**
- * Check the focus state and update field accordingly.
- *
- * @public
- */
-MaterialTextfield.prototype.checkFocus = function () {
- if (Boolean(this.element_.querySelector(':focus'))) {
- this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
- }
-};
-MaterialTextfield.prototype['checkFocus'] = MaterialTextfield.prototype.checkFocus;
-/**
- * Check the validity state and update field accordingly.
- *
- * @public
- */
-MaterialTextfield.prototype.checkValidity = function () {
- if (this.input_.validity) {
- if (this.input_.validity.valid) {
- this.element_.classList.remove(this.CssClasses_.IS_INVALID);
- } else {
- this.element_.classList.add(this.CssClasses_.IS_INVALID);
- }
- }
-};
-MaterialTextfield.prototype['checkValidity'] = MaterialTextfield.prototype.checkValidity;
-/**
- * Check the dirty state and update field accordingly.
- *
- * @public
- */
-MaterialTextfield.prototype.checkDirty = function () {
- if (this.input_.value && this.input_.value.length > 0) {
- this.element_.classList.add(this.CssClasses_.IS_DIRTY);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_DIRTY);
- }
-};
-MaterialTextfield.prototype['checkDirty'] = MaterialTextfield.prototype.checkDirty;
-/**
- * Disable text field.
- *
- * @public
- */
-MaterialTextfield.prototype.disable = function () {
- this.input_.disabled = true;
- this.updateClasses_();
-};
-MaterialTextfield.prototype['disable'] = MaterialTextfield.prototype.disable;
-/**
- * Enable text field.
- *
- * @public
- */
-MaterialTextfield.prototype.enable = function () {
- this.input_.disabled = false;
- this.updateClasses_();
-};
-MaterialTextfield.prototype['enable'] = MaterialTextfield.prototype.enable;
-/**
- * Update text field value.
- *
- * @param {string} value The value to which to set the control (optional).
- * @public
- */
-MaterialTextfield.prototype.change = function (value) {
- this.input_.value = value || '';
- this.updateClasses_();
-};
-MaterialTextfield.prototype['change'] = MaterialTextfield.prototype.change;
-/**
- * Initialize element.
- */
-MaterialTextfield.prototype.init = function () {
- if (this.element_) {
- this.label_ = this.element_.querySelector('.' + this.CssClasses_.LABEL);
- this.input_ = this.element_.querySelector('.' + this.CssClasses_.INPUT);
- if (this.input_) {
- if (this.input_.hasAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE)) {
- this.maxRows = parseInt(this.input_.getAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE), 10);
- if (isNaN(this.maxRows)) {
- this.maxRows = this.Constant_.NO_MAX_ROWS;
- }
- }
- if (this.input_.hasAttribute('placeholder')) {
- this.element_.classList.add(this.CssClasses_.HAS_PLACEHOLDER);
- }
- this.boundUpdateClassesHandler = this.updateClasses_.bind(this);
- this.boundFocusHandler = this.onFocus_.bind(this);
- this.boundBlurHandler = this.onBlur_.bind(this);
- this.boundResetHandler = this.onReset_.bind(this);
- this.input_.addEventListener('input', this.boundUpdateClassesHandler);
- this.input_.addEventListener('focus', this.boundFocusHandler);
- this.input_.addEventListener('blur', this.boundBlurHandler);
- this.input_.addEventListener('reset', this.boundResetHandler);
- if (this.maxRows !== this.Constant_.NO_MAX_ROWS) {
- // TODO: This should handle pasting multi line text.
- // Currently doesn't.
- this.boundKeyDownHandler = this.onKeyDown_.bind(this);
- this.input_.addEventListener('keydown', this.boundKeyDownHandler);
- }
- var invalid = this.element_.classList.contains(this.CssClasses_.IS_INVALID);
- this.updateClasses_();
- this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
- if (invalid) {
- this.element_.classList.add(this.CssClasses_.IS_INVALID);
- }
- if (this.input_.hasAttribute('autofocus')) {
- this.element_.focus();
- this.checkFocus();
- }
- }
- }
-};
-// The component registers itself. It can assume componentHandler is available
-// in the global scope.
-componentHandler.register({
- constructor: MaterialTextfield,
- classAsString: 'MaterialTextfield',
- cssClass: 'mdl-js-textfield',
- widget: true
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Tooltip MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialTooltip = function MaterialTooltip(element) {
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialTooltip'] = MaterialTooltip;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialTooltip.prototype.Constant_ = {};
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialTooltip.prototype.CssClasses_ = {
- IS_ACTIVE: 'is-active',
- BOTTOM: 'mdl-tooltip--bottom',
- LEFT: 'mdl-tooltip--left',
- RIGHT: 'mdl-tooltip--right',
- TOP: 'mdl-tooltip--top'
-};
-/**
- * Handle mouseenter for tooltip.
- *
- * @param {Event} event The event that fired.
- * @private
- */
-MaterialTooltip.prototype.handleMouseEnter_ = function (event) {
- var props = event.target.getBoundingClientRect();
- var left = props.left + props.width / 2;
- var top = props.top + props.height / 2;
- var marginLeft = -1 * (this.element_.offsetWidth / 2);
- var marginTop = -1 * (this.element_.offsetHeight / 2);
- if (this.element_.classList.contains(this.CssClasses_.LEFT) || this.element_.classList.contains(this.CssClasses_.RIGHT)) {
- left = props.width / 2;
- if (top + marginTop < 0) {
- this.element_.style.top = '0';
- this.element_.style.marginTop = '0';
- } else {
- this.element_.style.top = top + 'px';
- this.element_.style.marginTop = marginTop + 'px';
- }
- } else {
- if (left + marginLeft < 0) {
- this.element_.style.left = '0';
- this.element_.style.marginLeft = '0';
- } else {
- this.element_.style.left = left + 'px';
- this.element_.style.marginLeft = marginLeft + 'px';
- }
- }
- if (this.element_.classList.contains(this.CssClasses_.TOP)) {
- this.element_.style.top = props.top - this.element_.offsetHeight - 10 + 'px';
- } else if (this.element_.classList.contains(this.CssClasses_.RIGHT)) {
- this.element_.style.left = props.left + props.width + 10 + 'px';
- } else if (this.element_.classList.contains(this.CssClasses_.LEFT)) {
- this.element_.style.left = props.left - this.element_.offsetWidth - 10 + 'px';
- } else {
- this.element_.style.top = props.top + props.height + 10 + 'px';
- }
- this.element_.classList.add(this.CssClasses_.IS_ACTIVE);
-};
-/**
- * Hide tooltip on mouseleave or scroll
- *
- * @private
- */
-MaterialTooltip.prototype.hideTooltip_ = function () {
- this.element_.classList.remove(this.CssClasses_.IS_ACTIVE);
-};
-/**
- * Initialize element.
- */
-MaterialTooltip.prototype.init = function () {
- if (this.element_) {
- var forElId = this.element_.getAttribute('for') || this.element_.getAttribute('data-mdl-for');
- if (forElId) {
- this.forElement_ = document.getElementById(forElId);
- }
- if (this.forElement_) {
- // It's left here because it prevents accidental text selection on Android
- if (!this.forElement_.hasAttribute('tabindex')) {
- this.forElement_.setAttribute('tabindex', '0');
- }
- this.boundMouseEnterHandler = this.handleMouseEnter_.bind(this);
- this.boundMouseLeaveAndScrollHandler = this.hideTooltip_.bind(this);
- this.forElement_.addEventListener('mouseenter', this.boundMouseEnterHandler, false);
- this.forElement_.addEventListener('touchend', this.boundMouseEnterHandler, false);
- this.forElement_.addEventListener('mouseleave', this.boundMouseLeaveAndScrollHandler, false);
- window.addEventListener('scroll', this.boundMouseLeaveAndScrollHandler, true);
- window.addEventListener('touchstart', this.boundMouseLeaveAndScrollHandler);
- }
- }
-};
-// The component registers itself. It can assume componentHandler is available
-// in the global scope.
-componentHandler.register({
- constructor: MaterialTooltip,
- classAsString: 'MaterialTooltip',
- cssClass: 'mdl-tooltip'
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Layout MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {HTMLElement} element The element that will be upgraded.
- */
-var MaterialLayout = function MaterialLayout(element) {
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialLayout'] = MaterialLayout;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialLayout.prototype.Constant_ = {
- MAX_WIDTH: '(max-width: 1024px)',
- TAB_SCROLL_PIXELS: 100,
- RESIZE_TIMEOUT: 100,
- MENU_ICON: '',
- CHEVRON_LEFT: 'chevron_left',
- CHEVRON_RIGHT: 'chevron_right'
-};
-/**
- * Keycodes, for code readability.
- *
- * @enum {number}
- * @private
- */
-MaterialLayout.prototype.Keycodes_ = {
- ENTER: 13,
- ESCAPE: 27,
- SPACE: 32
-};
-/**
- * Modes.
- *
- * @enum {number}
- * @private
- */
-MaterialLayout.prototype.Mode_ = {
- STANDARD: 0,
- SEAMED: 1,
- WATERFALL: 2,
- SCROLL: 3
-};
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialLayout.prototype.CssClasses_ = {
- CONTAINER: 'mdl-layout__container',
- HEADER: 'mdl-layout__header',
- DRAWER: 'mdl-layout__drawer',
- CONTENT: 'mdl-layout__content',
- DRAWER_BTN: 'mdl-layout__drawer-button',
- ICON: 'material-icons',
- JS_RIPPLE_EFFECT: 'mdl-js-ripple-effect',
- RIPPLE_CONTAINER: 'mdl-layout__tab-ripple-container',
- RIPPLE: 'mdl-ripple',
- RIPPLE_IGNORE_EVENTS: 'mdl-js-ripple-effect--ignore-events',
- HEADER_SEAMED: 'mdl-layout__header--seamed',
- HEADER_WATERFALL: 'mdl-layout__header--waterfall',
- HEADER_SCROLL: 'mdl-layout__header--scroll',
- FIXED_HEADER: 'mdl-layout--fixed-header',
- OBFUSCATOR: 'mdl-layout__obfuscator',
- TAB_BAR: 'mdl-layout__tab-bar',
- TAB_CONTAINER: 'mdl-layout__tab-bar-container',
- TAB: 'mdl-layout__tab',
- TAB_BAR_BUTTON: 'mdl-layout__tab-bar-button',
- TAB_BAR_LEFT_BUTTON: 'mdl-layout__tab-bar-left-button',
- TAB_BAR_RIGHT_BUTTON: 'mdl-layout__tab-bar-right-button',
- TAB_MANUAL_SWITCH: 'mdl-layout__tab-manual-switch',
- PANEL: 'mdl-layout__tab-panel',
- HAS_DRAWER: 'has-drawer',
- HAS_TABS: 'has-tabs',
- HAS_SCROLLING_HEADER: 'has-scrolling-header',
- CASTING_SHADOW: 'is-casting-shadow',
- IS_COMPACT: 'is-compact',
- IS_SMALL_SCREEN: 'is-small-screen',
- IS_DRAWER_OPEN: 'is-visible',
- IS_ACTIVE: 'is-active',
- IS_UPGRADED: 'is-upgraded',
- IS_ANIMATING: 'is-animating',
- ON_LARGE_SCREEN: 'mdl-layout--large-screen-only',
- ON_SMALL_SCREEN: 'mdl-layout--small-screen-only'
-};
-/**
- * Handles scrolling on the content.
- *
- * @private
- */
-MaterialLayout.prototype.contentScrollHandler_ = function () {
- if (this.header_.classList.contains(this.CssClasses_.IS_ANIMATING)) {
- return;
- }
- var headerVisible = !this.element_.classList.contains(this.CssClasses_.IS_SMALL_SCREEN) || this.element_.classList.contains(this.CssClasses_.FIXED_HEADER);
- if (this.content_.scrollTop > 0 && !this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {
- this.header_.classList.add(this.CssClasses_.CASTING_SHADOW);
- this.header_.classList.add(this.CssClasses_.IS_COMPACT);
- if (headerVisible) {
- this.header_.classList.add(this.CssClasses_.IS_ANIMATING);
- }
- } else if (this.content_.scrollTop <= 0 && this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {
- this.header_.classList.remove(this.CssClasses_.CASTING_SHADOW);
- this.header_.classList.remove(this.CssClasses_.IS_COMPACT);
- if (headerVisible) {
- this.header_.classList.add(this.CssClasses_.IS_ANIMATING);
- }
- }
-};
-/**
- * Handles a keyboard event on the drawer.
- *
- * @param {Event} evt The event that fired.
- * @private
- */
-MaterialLayout.prototype.keyboardEventHandler_ = function (evt) {
- // Only react when the drawer is open.
- if (evt.keyCode === this.Keycodes_.ESCAPE && this.drawer_.classList.contains(this.CssClasses_.IS_DRAWER_OPEN)) {
- this.toggleDrawer();
- }
-};
-/**
- * Handles changes in screen size.
- *
- * @private
- */
-MaterialLayout.prototype.screenSizeHandler_ = function () {
- if (this.screenSizeMediaQuery_.matches) {
- this.element_.classList.add(this.CssClasses_.IS_SMALL_SCREEN);
- } else {
- this.element_.classList.remove(this.CssClasses_.IS_SMALL_SCREEN);
- // Collapse drawer (if any) when moving to a large screen size.
- if (this.drawer_) {
- this.drawer_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN);
- this.obfuscator_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN);
- }
- }
-};
-/**
- * Handles events of drawer button.
- *
- * @param {Event} evt The event that fired.
- * @private
- */
-MaterialLayout.prototype.drawerToggleHandler_ = function (evt) {
- if (evt && evt.type === 'keydown') {
- if (evt.keyCode === this.Keycodes_.SPACE || evt.keyCode === this.Keycodes_.ENTER) {
- // prevent scrolling in drawer nav
- evt.preventDefault();
- } else {
- // prevent other keys
- return;
- }
- }
- this.toggleDrawer();
-};
-/**
- * Handles (un)setting the `is-animating` class
- *
- * @private
- */
-MaterialLayout.prototype.headerTransitionEndHandler_ = function () {
- this.header_.classList.remove(this.CssClasses_.IS_ANIMATING);
-};
-/**
- * Handles expanding the header on click
- *
- * @private
- */
-MaterialLayout.prototype.headerClickHandler_ = function () {
- if (this.header_.classList.contains(this.CssClasses_.IS_COMPACT)) {
- this.header_.classList.remove(this.CssClasses_.IS_COMPACT);
- this.header_.classList.add(this.CssClasses_.IS_ANIMATING);
- }
-};
-/**
- * Reset tab state, dropping active classes
- *
- * @private
- */
-MaterialLayout.prototype.resetTabState_ = function (tabBar) {
- for (var k = 0; k < tabBar.length; k++) {
- tabBar[k].classList.remove(this.CssClasses_.IS_ACTIVE);
- }
-};
-/**
- * Reset panel state, droping active classes
- *
- * @private
- */
-MaterialLayout.prototype.resetPanelState_ = function (panels) {
- for (var j = 0; j < panels.length; j++) {
- panels[j].classList.remove(this.CssClasses_.IS_ACTIVE);
- }
-};
-/**
- * Toggle drawer state
- *
- * @public
- */
-MaterialLayout.prototype.toggleDrawer = function () {
- var drawerButton = this.element_.querySelector('.' + this.CssClasses_.DRAWER_BTN);
- this.drawer_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);
- this.obfuscator_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);
- // Set accessibility properties.
- if (this.drawer_.classList.contains(this.CssClasses_.IS_DRAWER_OPEN)) {
- this.drawer_.setAttribute('aria-hidden', 'false');
- drawerButton.setAttribute('aria-expanded', 'true');
- } else {
- this.drawer_.setAttribute('aria-hidden', 'true');
- drawerButton.setAttribute('aria-expanded', 'false');
- }
-};
-MaterialLayout.prototype['toggleDrawer'] = MaterialLayout.prototype.toggleDrawer;
-/**
- * Initialize element.
- */
-MaterialLayout.prototype.init = function () {
- if (this.element_) {
- var container = document.createElement('div');
- container.classList.add(this.CssClasses_.CONTAINER);
- var focusedElement = this.element_.querySelector(':focus');
- this.element_.parentElement.insertBefore(container, this.element_);
- this.element_.parentElement.removeChild(this.element_);
- container.appendChild(this.element_);
- if (focusedElement) {
- focusedElement.focus();
- }
- var directChildren = this.element_.childNodes;
- var numChildren = directChildren.length;
- for (var c = 0; c < numChildren; c++) {
- var child = directChildren[c];
- if (child.classList && child.classList.contains(this.CssClasses_.HEADER)) {
- this.header_ = child;
- }
- if (child.classList && child.classList.contains(this.CssClasses_.DRAWER)) {
- this.drawer_ = child;
- }
- if (child.classList && child.classList.contains(this.CssClasses_.CONTENT)) {
- this.content_ = child;
- }
- }
- window.addEventListener('pageshow', function (e) {
- if (e.persisted) {
- // when page is loaded from back/forward cache
- // trigger repaint to let layout scroll in safari
- this.element_.style.overflowY = 'hidden';
- requestAnimationFrame(function () {
- this.element_.style.overflowY = '';
- }.bind(this));
- }
- }.bind(this), false);
- if (this.header_) {
- this.tabBar_ = this.header_.querySelector('.' + this.CssClasses_.TAB_BAR);
- }
- var mode = this.Mode_.STANDARD;
- if (this.header_) {
- if (this.header_.classList.contains(this.CssClasses_.HEADER_SEAMED)) {
- mode = this.Mode_.SEAMED;
- } else if (this.header_.classList.contains(this.CssClasses_.HEADER_WATERFALL)) {
- mode = this.Mode_.WATERFALL;
- this.header_.addEventListener('transitionend', this.headerTransitionEndHandler_.bind(this));
- this.header_.addEventListener('click', this.headerClickHandler_.bind(this));
- } else if (this.header_.classList.contains(this.CssClasses_.HEADER_SCROLL)) {
- mode = this.Mode_.SCROLL;
- container.classList.add(this.CssClasses_.HAS_SCROLLING_HEADER);
- }
- if (mode === this.Mode_.STANDARD) {
- this.header_.classList.add(this.CssClasses_.CASTING_SHADOW);
- if (this.tabBar_) {
- this.tabBar_.classList.add(this.CssClasses_.CASTING_SHADOW);
- }
- } else if (mode === this.Mode_.SEAMED || mode === this.Mode_.SCROLL) {
- this.header_.classList.remove(this.CssClasses_.CASTING_SHADOW);
- if (this.tabBar_) {
- this.tabBar_.classList.remove(this.CssClasses_.CASTING_SHADOW);
- }
- } else if (mode === this.Mode_.WATERFALL) {
- // Add and remove shadows depending on scroll position.
- // Also add/remove auxiliary class for styling of the compact version of
- // the header.
- this.content_.addEventListener('scroll', this.contentScrollHandler_.bind(this));
- this.contentScrollHandler_();
- }
- }
- // Add drawer toggling button to our layout, if we have an openable drawer.
- if (this.drawer_) {
- var drawerButton = this.element_.querySelector('.' + this.CssClasses_.DRAWER_BTN);
- if (!drawerButton) {
- drawerButton = document.createElement('div');
- drawerButton.setAttribute('aria-expanded', 'false');
- drawerButton.setAttribute('role', 'button');
- drawerButton.setAttribute('tabindex', '0');
- drawerButton.classList.add(this.CssClasses_.DRAWER_BTN);
- var drawerButtonIcon = document.createElement('i');
- drawerButtonIcon.classList.add(this.CssClasses_.ICON);
- drawerButtonIcon.innerHTML = this.Constant_.MENU_ICON;
- drawerButton.appendChild(drawerButtonIcon);
- }
- if (this.drawer_.classList.contains(this.CssClasses_.ON_LARGE_SCREEN)) {
- //If drawer has ON_LARGE_SCREEN class then add it to the drawer toggle button as well.
- drawerButton.classList.add(this.CssClasses_.ON_LARGE_SCREEN);
- } else if (this.drawer_.classList.contains(this.CssClasses_.ON_SMALL_SCREEN)) {
- //If drawer has ON_SMALL_SCREEN class then add it to the drawer toggle button as well.
- drawerButton.classList.add(this.CssClasses_.ON_SMALL_SCREEN);
- }
- drawerButton.addEventListener('click', this.drawerToggleHandler_.bind(this));
- drawerButton.addEventListener('keydown', this.drawerToggleHandler_.bind(this));
- // Add a class if the layout has a drawer, for altering the left padding.
- // Adds the HAS_DRAWER to the elements since this.header_ may or may
- // not be present.
- this.element_.classList.add(this.CssClasses_.HAS_DRAWER);
- // If we have a fixed header, add the button to the header rather than
- // the layout.
- if (this.element_.classList.contains(this.CssClasses_.FIXED_HEADER)) {
- this.header_.insertBefore(drawerButton, this.header_.firstChild);
- } else {
- this.element_.insertBefore(drawerButton, this.content_);
- }
- var obfuscator = document.createElement('div');
- obfuscator.classList.add(this.CssClasses_.OBFUSCATOR);
- this.element_.appendChild(obfuscator);
- obfuscator.addEventListener('click', this.drawerToggleHandler_.bind(this));
- this.obfuscator_ = obfuscator;
- this.drawer_.addEventListener('keydown', this.keyboardEventHandler_.bind(this));
- this.drawer_.setAttribute('aria-hidden', 'true');
- }
- // Keep an eye on screen size, and add/remove auxiliary class for styling
- // of small screens.
- this.screenSizeMediaQuery_ = window.matchMedia(this.Constant_.MAX_WIDTH);
- this.screenSizeMediaQuery_.addListener(this.screenSizeHandler_.bind(this));
- this.screenSizeHandler_();
- // Initialize tabs, if any.
- if (this.header_ && this.tabBar_) {
- this.element_.classList.add(this.CssClasses_.HAS_TABS);
- var tabContainer = document.createElement('div');
- tabContainer.classList.add(this.CssClasses_.TAB_CONTAINER);
- this.header_.insertBefore(tabContainer, this.tabBar_);
- this.header_.removeChild(this.tabBar_);
- var leftButton = document.createElement('div');
- leftButton.classList.add(this.CssClasses_.TAB_BAR_BUTTON);
- leftButton.classList.add(this.CssClasses_.TAB_BAR_LEFT_BUTTON);
- var leftButtonIcon = document.createElement('i');
- leftButtonIcon.classList.add(this.CssClasses_.ICON);
- leftButtonIcon.textContent = this.Constant_.CHEVRON_LEFT;
- leftButton.appendChild(leftButtonIcon);
- leftButton.addEventListener('click', function () {
- this.tabBar_.scrollLeft -= this.Constant_.TAB_SCROLL_PIXELS;
- }.bind(this));
- var rightButton = document.createElement('div');
- rightButton.classList.add(this.CssClasses_.TAB_BAR_BUTTON);
- rightButton.classList.add(this.CssClasses_.TAB_BAR_RIGHT_BUTTON);
- var rightButtonIcon = document.createElement('i');
- rightButtonIcon.classList.add(this.CssClasses_.ICON);
- rightButtonIcon.textContent = this.Constant_.CHEVRON_RIGHT;
- rightButton.appendChild(rightButtonIcon);
- rightButton.addEventListener('click', function () {
- this.tabBar_.scrollLeft += this.Constant_.TAB_SCROLL_PIXELS;
- }.bind(this));
- tabContainer.appendChild(leftButton);
- tabContainer.appendChild(this.tabBar_);
- tabContainer.appendChild(rightButton);
- // Add and remove tab buttons depending on scroll position and total
- // window size.
- var tabUpdateHandler = function () {
- if (this.tabBar_.scrollLeft > 0) {
- leftButton.classList.add(this.CssClasses_.IS_ACTIVE);
- } else {
- leftButton.classList.remove(this.CssClasses_.IS_ACTIVE);
- }
- if (this.tabBar_.scrollLeft < this.tabBar_.scrollWidth - this.tabBar_.offsetWidth) {
- rightButton.classList.add(this.CssClasses_.IS_ACTIVE);
- } else {
- rightButton.classList.remove(this.CssClasses_.IS_ACTIVE);
- }
- }.bind(this);
- this.tabBar_.addEventListener('scroll', tabUpdateHandler);
- tabUpdateHandler();
- // Update tabs when the window resizes.
- var windowResizeHandler = function () {
- // Use timeouts to make sure it doesn't happen too often.
- if (this.resizeTimeoutId_) {
- clearTimeout(this.resizeTimeoutId_);
- }
- this.resizeTimeoutId_ = setTimeout(function () {
- tabUpdateHandler();
- this.resizeTimeoutId_ = null;
- }.bind(this), this.Constant_.RESIZE_TIMEOUT);
- }.bind(this);
- window.addEventListener('resize', windowResizeHandler);
- if (this.tabBar_.classList.contains(this.CssClasses_.JS_RIPPLE_EFFECT)) {
- this.tabBar_.classList.add(this.CssClasses_.RIPPLE_IGNORE_EVENTS);
- }
- // Select element tabs, document panels
- var tabs = this.tabBar_.querySelectorAll('.' + this.CssClasses_.TAB);
- var panels = this.content_.querySelectorAll('.' + this.CssClasses_.PANEL);
- // Create new tabs for each tab element
- for (var i = 0; i < tabs.length; i++) {
- new MaterialLayoutTab(tabs[i], tabs, panels, this);
- }
- }
- this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
- }
-};
-/**
- * Constructor for an individual tab.
- *
- * @constructor
- * @param {HTMLElement} tab The HTML element for the tab.
- * @param {!Array} tabs Array with HTML elements for all tabs.
- * @param {!Array} panels Array with HTML elements for all panels.
- * @param {MaterialLayout} layout The MaterialLayout object that owns the tab.
- */
-function MaterialLayoutTab(tab, tabs, panels, layout) {
+ componentHandler.register({
+ constructor: MaterialLayout,
+ classAsString: 'MaterialLayout',
+ cssClass: 'mdl-js-layout'
+ });
/**
- * Auxiliary method to programmatically select a tab in the UI.
+ * @license
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*/
- function selectTab() {
- var href = tab.href.split('#')[1];
- var panel = layout.content_.querySelector('#' + href);
- layout.resetTabState_(tabs);
- layout.resetPanelState_(panels);
- tab.classList.add(layout.CssClasses_.IS_ACTIVE);
- panel.classList.add(layout.CssClasses_.IS_ACTIVE);
- }
- if (layout.tabBar_.classList.contains(layout.CssClasses_.JS_RIPPLE_EFFECT)) {
- var rippleContainer = document.createElement('span');
- rippleContainer.classList.add(layout.CssClasses_.RIPPLE_CONTAINER);
- rippleContainer.classList.add(layout.CssClasses_.JS_RIPPLE_EFFECT);
- var ripple = document.createElement('span');
- ripple.classList.add(layout.CssClasses_.RIPPLE);
- rippleContainer.appendChild(ripple);
- tab.appendChild(rippleContainer);
- }
- if (!layout.tabBar_.classList.contains(layout.CssClasses_.TAB_MANUAL_SWITCH)) {
- tab.addEventListener('click', function (e) {
- if (tab.getAttribute('href').charAt(0) === '#') {
- e.preventDefault();
- selectTab();
- }
- });
- }
- tab.show = selectTab;
-}
-window['MaterialLayoutTab'] = MaterialLayoutTab;
-// The component registers itself. It can assume componentHandler is available
-// in the global scope.
-componentHandler.register({
- constructor: MaterialLayout,
- classAsString: 'MaterialLayout',
- cssClass: 'mdl-js-layout'
-});
-/**
- * @license
- * Copyright 2015 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Class constructor for Data Table Card MDL component.
- * Implements MDL component design pattern defined at:
- * https://github.com/jasonmayes/mdl-component-design-pattern
- *
- * @constructor
- * @param {Element} element The element that will be upgraded.
- */
-var MaterialDataTable = function MaterialDataTable(element) {
- this.element_ = element;
- // Initialize instance.
- this.init();
-};
-window['MaterialDataTable'] = MaterialDataTable;
-/**
- * Store constants in one place so they can be updated easily.
- *
- * @enum {string | number}
- * @private
- */
-MaterialDataTable.prototype.Constant_ = {};
-/**
- * Store strings for class names defined by this component that are used in
- * JavaScript. This allows us to simply change it in one place should we
- * decide to modify at a later date.
- *
- * @enum {string}
- * @private
- */
-MaterialDataTable.prototype.CssClasses_ = {
- DATA_TABLE: 'mdl-data-table',
- SELECTABLE: 'mdl-data-table--selectable',
- SELECT_ELEMENT: 'mdl-data-table__select',
- IS_SELECTED: 'is-selected',
- IS_UPGRADED: 'is-upgraded'
-};
-/**
- * Generates and returns a function that toggles the selection state of a
- * single row (or multiple rows).
- *
- * @param {Element} checkbox Checkbox that toggles the selection state.
- * @param {Element} row Row to toggle when checkbox changes.
- * @param {(Array