material_design_lite-sass 1.0.6.3 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -2
- data/CHANGELOG.md +9 -0
- data/README.md +41 -32
- data/lib/material_design_lite/sass/version.rb +1 -1
- data/vendor/assets/javascripts/material.js +377 -301
- data/vendor/assets/javascripts/material/button.js +0 -24
- data/vendor/assets/javascripts/material/checkbox.js +0 -26
- data/vendor/assets/javascripts/material/data-table.js +18 -10
- data/vendor/assets/javascripts/material/icon-toggle.js +0 -26
- data/vendor/assets/javascripts/material/layout.js +104 -6
- data/vendor/assets/javascripts/material/mdlComponentHandler.js +15 -36
- data/vendor/assets/javascripts/material/menu.js +16 -36
- data/vendor/assets/javascripts/material/progress.js +0 -22
- data/vendor/assets/javascripts/material/radio.js +0 -28
- data/vendor/assets/javascripts/material/ripple.js +6 -35
- data/vendor/assets/javascripts/material/slider.js +0 -23
- data/vendor/assets/javascripts/material/snackbar.js +189 -0
- data/vendor/assets/javascripts/material/switch.js +0 -26
- data/vendor/assets/javascripts/material/tabs.js +2 -2
- data/vendor/assets/javascripts/material/textfield.js +32 -25
- data/vendor/assets/javascripts/material/tooltip.js +39 -49
- data/vendor/assets/stylesheets/_material.scss +3 -0
- data/vendor/assets/stylesheets/material/_badge.scss +6 -0
- data/vendor/assets/stylesheets/material/_button.scss +3 -3
- data/vendor/assets/stylesheets/material/_checkbox.scss +5 -0
- data/vendor/assets/stylesheets/material/_data-table.scss +17 -9
- data/vendor/assets/stylesheets/material/_dialog.scss +57 -0
- data/vendor/assets/stylesheets/material/_grid.scss +60 -0
- data/vendor/assets/stylesheets/material/_layout.scss +77 -3
- data/vendor/assets/stylesheets/material/_list.scss +103 -0
- data/vendor/assets/stylesheets/material/_mega_footer.scss +1 -1
- data/vendor/assets/stylesheets/material/_menu.scss +5 -1
- data/vendor/assets/stylesheets/material/_mixins.scss +33 -0
- data/vendor/assets/stylesheets/material/_progress.scss +5 -0
- data/vendor/assets/stylesheets/material/_radio.scss +5 -0
- data/vendor/assets/stylesheets/material/_shadow.scss +4 -0
- data/vendor/assets/stylesheets/material/_snackbar.scss +81 -0
- data/vendor/assets/stylesheets/material/_switch.scss +5 -1
- data/vendor/assets/stylesheets/material/_tabs.scss +0 -1
- data/vendor/assets/stylesheets/material/_textfield.scss +13 -3
- data/vendor/assets/stylesheets/material/_typography.scss +4 -0
- data/vendor/assets/stylesheets/material/_variables.scss +102 -81
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2fef800435b17f9b16f3513e34f59dbea3eb7e8
|
4
|
+
data.tar.gz: d61e25399084c0bb39602b3ed0414c33458df540
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45dd2286e27638b6cd459e554b71a22bbcf2adc6401868f8ac37ded573a7a4d640ee0fcde1ca2f93ca1e50b9d2d2c2d177cc17783cde52c37d20169119b961e4
|
7
|
+
data.tar.gz: 365db8127f5295c925fd96fd0db0d4daba62e5ab32c17c1b82dd8159a7dc3c179a2a067f8ac880aa653349fb3e6d590619bf6d8c61c23e073f458a9d6ea9d45d
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -62,6 +62,7 @@ Then include desired Material Design Lite JavaScript component:
|
|
62
62
|
//= require material/radio
|
63
63
|
//= require material/ripple
|
64
64
|
//= require material/slider
|
65
|
+
//= require material/snackbar
|
65
66
|
//= require material/spinner
|
66
67
|
//= require material/switch
|
67
68
|
//= require material/tabs
|
@@ -72,35 +73,43 @@ Then include desired Material Design Lite JavaScript component:
|
|
72
73
|
Individual Sass components can be included like this:
|
73
74
|
|
74
75
|
```scss
|
75
|
-
|
76
|
-
@import
|
77
|
-
@import
|
78
|
-
|
79
|
-
|
80
|
-
@import
|
81
|
-
@import
|
82
|
-
|
83
|
-
|
84
|
-
@import
|
85
|
-
@import
|
76
|
+
// Variables and mixins
|
77
|
+
@import "material/variables";
|
78
|
+
@import "material/mixins";
|
79
|
+
|
80
|
+
// Resets and dependencies
|
81
|
+
@import "material/resets";
|
82
|
+
@import "material/typography";
|
83
|
+
|
84
|
+
// Components
|
85
|
+
@import "material/palette";
|
86
|
+
@import "material/ripple";
|
87
|
+
@import "material/animation";
|
88
|
+
@import "material/badge";
|
89
|
+
@import "material/button";
|
90
|
+
@import "material/card";
|
91
|
+
@import "material/checkbox";
|
92
|
+
@import "material/data-table";
|
93
|
+
@import "material/dialog";
|
94
|
+
@import "material/mega_footer";
|
95
|
+
@import "material/mini_footer";
|
96
|
+
@import "material/icon-toggle";
|
97
|
+
@import "material/list";
|
98
|
+
@import "material/menu";
|
99
|
+
@import "material/progress";
|
100
|
+
@import "material/layout";
|
101
|
+
@import "material/radio";
|
102
|
+
@import "material/slider";
|
103
|
+
@import "material/snackbar";
|
104
|
+
@import "material/spinner";
|
105
|
+
@import "material/switch";
|
106
|
+
@import "material/tabs";
|
107
|
+
@import "material/textfield";
|
108
|
+
@import "material/tooltip";
|
109
|
+
@import "material/shadow";
|
110
|
+
@import "material/grid";
|
86
111
|
@import "material/material-icons";
|
87
|
-
@import
|
88
|
-
@import 'material/mini_footer';
|
89
|
-
@import 'material/menu';
|
90
|
-
@import 'material/palette';
|
91
|
-
@import 'material/progress';
|
92
|
-
@import 'material/radio';
|
93
|
-
@import 'material/resets';
|
94
|
-
@import 'material/ripple';
|
95
|
-
@import 'material/roboto';
|
96
|
-
@import 'material/shadow';
|
97
|
-
@import 'material/slider';
|
98
|
-
@import 'material/spinner';
|
99
|
-
@import 'material/switch';
|
100
|
-
@import 'material/tabs';
|
101
|
-
@import 'material/textfield';
|
102
|
-
@import 'material/tooltip';
|
103
|
-
@import 'material/typography';
|
112
|
+
@import "material/roboto";
|
104
113
|
```
|
105
114
|
|
106
115
|
### Material Icons
|
@@ -144,14 +153,14 @@ Anyone is welcome to contribute to Material Design Lite for Sass. Please [raise
|
|
144
153
|
|
145
154
|
## Credits
|
146
155
|
|
147
|
-
Material Design Lite for Sass is inspired from [bootstrap-sass](https://github.com/twbs/bootstrap-sass) by
|
156
|
+
Material Design Lite for Sass is inspired from [bootstrap-sass](https://github.com/twbs/bootstrap-sass) by Bootstrap team.
|
148
157
|
|
149
158
|
## License
|
150
159
|
|
151
|
-
Material Design Lite © Google, 2015. Licensed under the [Apache-2](
|
160
|
+
Material Design Lite © Google, 2015. Licensed under the [Apache-2](http://www.apache.org/licenses/LICENSE-2.0.html) license.
|
152
161
|
|
153
|
-
Material Icons © Google, 2015.
|
162
|
+
Material Icons © Google, 2015. Licensed under the [Creative Common Attribution 4.0 International License (CC-BY 4.0)](https://creativecommons.org/licenses/by/4.0/legalcode).
|
154
163
|
|
155
|
-
Roboto © Google, 2015. Licensed under the [Apache-2](
|
164
|
+
Roboto © Google, 2015. Licensed under the [Apache-2](http://www.apache.org/licenses/LICENSE-2.0.html) license.
|
156
165
|
|
157
166
|
`material_design_lite-sass` © Dmitriy Tarasov, 2015. Released under the [MIT](https://github.com/rubysamurai/material_design_lite-sass/blob/master/LICENSE.txt) license.
|
@@ -94,7 +94,6 @@ componentHandler = (function() {
|
|
94
94
|
/** @type {!Array<componentHandler.Component>} */
|
95
95
|
var createdComponents_ = [];
|
96
96
|
|
97
|
-
var downgradeMethod_ = 'mdlDowngrade';
|
98
97
|
var componentConfigProperty_ = 'mdlComponentConfigInternal_';
|
99
98
|
|
100
99
|
/**
|
@@ -228,7 +227,7 @@ componentHandler = (function() {
|
|
228
227
|
}
|
229
228
|
} else {
|
230
229
|
throw new Error(
|
231
|
-
|
230
|
+
'Unable to find a registered component for the given class.');
|
232
231
|
}
|
233
232
|
|
234
233
|
var ev = document.createEvent('Events');
|
@@ -338,47 +337,25 @@ componentHandler = (function() {
|
|
338
337
|
}
|
339
338
|
}
|
340
339
|
|
341
|
-
/**
|
342
|
-
* Finds a created component by a given DOM node.
|
343
|
-
*
|
344
|
-
* @param {!Node} node
|
345
|
-
* @return {*}
|
346
|
-
*/
|
347
|
-
function findCreatedComponentByNodeInternal(node) {
|
348
|
-
for (var n = 0; n < createdComponents_.length; n++) {
|
349
|
-
var component = createdComponents_[n];
|
350
|
-
if (component.element_ === node) {
|
351
|
-
return component;
|
352
|
-
}
|
353
|
-
}
|
354
|
-
}
|
355
|
-
|
356
340
|
/**
|
357
341
|
* Check the component for the downgrade method.
|
358
342
|
* Execute if found.
|
359
343
|
* Remove component from createdComponents list.
|
360
344
|
*
|
361
|
-
* @param {
|
345
|
+
* @param {?componentHandler.Component} component
|
362
346
|
*/
|
363
347
|
function deconstructComponentInternal(component) {
|
364
|
-
|
365
|
-
|
366
|
-
.classConstructor.prototype
|
367
|
-
.hasOwnProperty(downgradeMethod_)) {
|
368
|
-
component[downgradeMethod_]();
|
369
|
-
var componentIndex = createdComponents_.indexOf(component);
|
370
|
-
createdComponents_.splice(componentIndex, 1);
|
348
|
+
var componentIndex = createdComponents_.indexOf(component);
|
349
|
+
createdComponents_.splice(componentIndex, 1);
|
371
350
|
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
component.element_.setAttribute('data-upgraded', upgrades.join(','));
|
351
|
+
var upgrades = component.element_.getAttribute('data-upgraded').split(',');
|
352
|
+
var componentPlace = upgrades.indexOf(component[componentConfigProperty_].classAsString);
|
353
|
+
upgrades.splice(componentPlace, 1);
|
354
|
+
component.element_.setAttribute('data-upgraded', upgrades.join(','));
|
377
355
|
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
}
|
356
|
+
var ev = document.createEvent('Events');
|
357
|
+
ev.initEvent('mdl-componentdowngraded', true, true);
|
358
|
+
component.element_.dispatchEvent(ev);
|
382
359
|
}
|
383
360
|
|
384
361
|
/**
|
@@ -392,7 +369,9 @@ componentHandler = (function() {
|
|
392
369
|
* @param {!Node} node the node to be downgraded
|
393
370
|
*/
|
394
371
|
var downgradeNode = function(node) {
|
395
|
-
|
372
|
+
createdComponents_.filter(function(item) {
|
373
|
+
return item.element_ === node;
|
374
|
+
}).forEach(deconstructComponentInternal);
|
396
375
|
};
|
397
376
|
if (nodes instanceof Array || nodes instanceof NodeList) {
|
398
377
|
for (var n = 0; n < nodes.length; n++) {
|
@@ -642,25 +621,6 @@ MaterialButton.prototype.init = function () {
|
|
642
621
|
this.element_.addEventListener('mouseleave', this.boundButtonBlurHandler);
|
643
622
|
}
|
644
623
|
};
|
645
|
-
/**
|
646
|
-
* Downgrade the element.
|
647
|
-
*
|
648
|
-
* @private
|
649
|
-
*/
|
650
|
-
MaterialButton.prototype.mdlDowngrade_ = function () {
|
651
|
-
if (this.rippleElement_) {
|
652
|
-
this.rippleElement_.removeEventListener('mouseup', this.boundRippleBlurHandler);
|
653
|
-
}
|
654
|
-
this.element_.removeEventListener('mouseup', this.boundButtonBlurHandler);
|
655
|
-
this.element_.removeEventListener('mouseleave', this.boundButtonBlurHandler);
|
656
|
-
};
|
657
|
-
/**
|
658
|
-
* Public alias for the downgrade method.
|
659
|
-
*
|
660
|
-
* @public
|
661
|
-
*/
|
662
|
-
MaterialButton.prototype.mdlDowngrade = MaterialButton.prototype.mdlDowngrade_;
|
663
|
-
MaterialButton.prototype['mdlDowngrade'] = MaterialButton.prototype.mdlDowngrade;
|
664
624
|
// The component registers itself. It can assume componentHandler is available
|
665
625
|
// in the global scope.
|
666
626
|
componentHandler.register({
|
@@ -893,27 +853,6 @@ MaterialCheckbox.prototype.init = function () {
|
|
893
853
|
this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
|
894
854
|
}
|
895
855
|
};
|
896
|
-
/**
|
897
|
-
* Downgrade the component.
|
898
|
-
*
|
899
|
-
* @private
|
900
|
-
*/
|
901
|
-
MaterialCheckbox.prototype.mdlDowngrade_ = function () {
|
902
|
-
if (this.rippleContainerElement_) {
|
903
|
-
this.rippleContainerElement_.removeEventListener('mouseup', this.boundRippleMouseUp);
|
904
|
-
}
|
905
|
-
this.inputElement_.removeEventListener('change', this.boundInputOnChange);
|
906
|
-
this.inputElement_.removeEventListener('focus', this.boundInputOnFocus);
|
907
|
-
this.inputElement_.removeEventListener('blur', this.boundInputOnBlur);
|
908
|
-
this.element_.removeEventListener('mouseup', this.boundElementMouseUp);
|
909
|
-
};
|
910
|
-
/**
|
911
|
-
* Public alias for the downgrade method.
|
912
|
-
*
|
913
|
-
* @public
|
914
|
-
*/
|
915
|
-
MaterialCheckbox.prototype.mdlDowngrade = MaterialCheckbox.prototype.mdlDowngrade_;
|
916
|
-
MaterialCheckbox.prototype['mdlDowngrade'] = MaterialCheckbox.prototype.mdlDowngrade;
|
917
856
|
// The component registers itself. It can assume componentHandler is available
|
918
857
|
// in the global scope.
|
919
858
|
componentHandler.register({
|
@@ -1133,27 +1072,6 @@ MaterialIconToggle.prototype.init = function () {
|
|
1133
1072
|
this.element_.classList.add('is-upgraded');
|
1134
1073
|
}
|
1135
1074
|
};
|
1136
|
-
/**
|
1137
|
-
* Downgrade the component
|
1138
|
-
*
|
1139
|
-
* @private
|
1140
|
-
*/
|
1141
|
-
MaterialIconToggle.prototype.mdlDowngrade_ = function () {
|
1142
|
-
if (this.rippleContainerElement_) {
|
1143
|
-
this.rippleContainerElement_.removeEventListener('mouseup', this.boundRippleMouseUp);
|
1144
|
-
}
|
1145
|
-
this.inputElement_.removeEventListener('change', this.boundInputOnChange);
|
1146
|
-
this.inputElement_.removeEventListener('focus', this.boundInputOnFocus);
|
1147
|
-
this.inputElement_.removeEventListener('blur', this.boundInputOnBlur);
|
1148
|
-
this.element_.removeEventListener('mouseup', this.boundElementOnMouseUp);
|
1149
|
-
};
|
1150
|
-
/**
|
1151
|
-
* Public alias for the downgrade method.
|
1152
|
-
*
|
1153
|
-
* @public
|
1154
|
-
*/
|
1155
|
-
MaterialIconToggle.prototype.mdlDowngrade = MaterialIconToggle.prototype.mdlDowngrade_;
|
1156
|
-
MaterialIconToggle.prototype['mdlDowngrade'] = MaterialIconToggle.prototype.mdlDowngrade;
|
1157
1075
|
// The component registers itself. It can assume componentHandler is available
|
1158
1076
|
// in the global scope.
|
1159
1077
|
componentHandler.register({
|
@@ -1266,7 +1184,7 @@ MaterialMenu.prototype.init = function () {
|
|
1266
1184
|
this.outline_ = outline;
|
1267
1185
|
container.insertBefore(outline, this.element_);
|
1268
1186
|
// Find the "for" element and bind events to it.
|
1269
|
-
var forElId = this.element_.getAttribute('for');
|
1187
|
+
var forElId = this.element_.getAttribute('for') || this.element_.getAttribute('data-mdl-for');
|
1270
1188
|
var forEl = null;
|
1271
1189
|
if (forElId) {
|
1272
1190
|
forEl = document.getElementById(forElId);
|
@@ -1458,20 +1376,23 @@ MaterialMenu.prototype.applyClip_ = function (height, width) {
|
|
1458
1376
|
this.element_.style.clip = '';
|
1459
1377
|
}
|
1460
1378
|
};
|
1379
|
+
/**
|
1380
|
+
* Cleanup function to remove animation listeners.
|
1381
|
+
*
|
1382
|
+
* @param {Event} evt
|
1383
|
+
* @private
|
1384
|
+
*/
|
1385
|
+
MaterialMenu.prototype.removeAnimationEndListener_ = function (evt) {
|
1386
|
+
evt.target.classList.remove(MaterialMenu.prototype.CssClasses_.IS_ANIMATING);
|
1387
|
+
};
|
1461
1388
|
/**
|
1462
1389
|
* Adds an event listener to clean up after the animation ends.
|
1463
1390
|
*
|
1464
1391
|
* @private
|
1465
1392
|
*/
|
1466
1393
|
MaterialMenu.prototype.addAnimationEndListener_ = function () {
|
1467
|
-
|
1468
|
-
|
1469
|
-
this.element_.removeEventListener('webkitTransitionEnd', cleanup);
|
1470
|
-
this.element_.classList.remove(this.CssClasses_.IS_ANIMATING);
|
1471
|
-
}.bind(this);
|
1472
|
-
// Remove animation class once the transition is done.
|
1473
|
-
this.element_.addEventListener('transitionend', cleanup);
|
1474
|
-
this.element_.addEventListener('webkitTransitionEnd', cleanup);
|
1394
|
+
this.element_.addEventListener('transitionend', this.removeAnimationEndListener_);
|
1395
|
+
this.element_.addEventListener('webkitTransitionEnd', this.removeAnimationEndListener_);
|
1475
1396
|
};
|
1476
1397
|
/**
|
1477
1398
|
* Displays the menu.
|
@@ -1539,7 +1460,7 @@ MaterialMenu.prototype.hide = function () {
|
|
1539
1460
|
var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);
|
1540
1461
|
// Remove all transition delays; menu items fade out concurrently.
|
1541
1462
|
for (var i = 0; i < items.length; i++) {
|
1542
|
-
items[i].style.
|
1463
|
+
items[i].style.removeProperty('transition-delay');
|
1543
1464
|
}
|
1544
1465
|
// Measure the inner element.
|
1545
1466
|
var rect = this.element_.getBoundingClientRect();
|
@@ -1568,25 +1489,6 @@ MaterialMenu.prototype.toggle = function (evt) {
|
|
1568
1489
|
}
|
1569
1490
|
};
|
1570
1491
|
MaterialMenu.prototype['toggle'] = MaterialMenu.prototype.toggle;
|
1571
|
-
/**
|
1572
|
-
* Downgrade the component.
|
1573
|
-
*
|
1574
|
-
* @private
|
1575
|
-
*/
|
1576
|
-
MaterialMenu.prototype.mdlDowngrade_ = function () {
|
1577
|
-
var items = this.element_.querySelectorAll('.' + this.CssClasses_.ITEM);
|
1578
|
-
for (var i = 0; i < items.length; i++) {
|
1579
|
-
items[i].removeEventListener('click', this.boundItemClick_);
|
1580
|
-
items[i].removeEventListener('keydown', this.boundItemKeydown_);
|
1581
|
-
}
|
1582
|
-
};
|
1583
|
-
/**
|
1584
|
-
* Public alias for the downgrade method.
|
1585
|
-
*
|
1586
|
-
* @public
|
1587
|
-
*/
|
1588
|
-
MaterialMenu.prototype.mdlDowngrade = MaterialMenu.prototype.mdlDowngrade_;
|
1589
|
-
MaterialMenu.prototype['mdlDowngrade'] = MaterialMenu.prototype.mdlDowngrade;
|
1590
1492
|
// The component registers itself. It can assume componentHandler is available
|
1591
1493
|
// in the global scope.
|
1592
1494
|
componentHandler.register({
|
@@ -1688,23 +1590,6 @@ MaterialProgress.prototype.init = function () {
|
|
1688
1590
|
this.element_.classList.add('is-upgraded');
|
1689
1591
|
}
|
1690
1592
|
};
|
1691
|
-
/**
|
1692
|
-
* Downgrade the component
|
1693
|
-
*
|
1694
|
-
* @private
|
1695
|
-
*/
|
1696
|
-
MaterialProgress.prototype.mdlDowngrade_ = function () {
|
1697
|
-
while (this.element_.firstChild) {
|
1698
|
-
this.element_.removeChild(this.element_.firstChild);
|
1699
|
-
}
|
1700
|
-
};
|
1701
|
-
/**
|
1702
|
-
* Public alias for the downgrade method.
|
1703
|
-
*
|
1704
|
-
* @public
|
1705
|
-
*/
|
1706
|
-
MaterialProgress.prototype.mdlDowngrade = MaterialProgress.prototype.mdlDowngrade_;
|
1707
|
-
MaterialProgress.prototype['mdlDowngrade'] = MaterialProgress.prototype.mdlDowngrade;
|
1708
1593
|
// The component registers itself. It can assume componentHandler is available
|
1709
1594
|
// in the global scope.
|
1710
1595
|
componentHandler.register({
|
@@ -1943,29 +1828,6 @@ MaterialRadio.prototype.init = function () {
|
|
1943
1828
|
this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
|
1944
1829
|
}
|
1945
1830
|
};
|
1946
|
-
/**
|
1947
|
-
* Downgrade the element.
|
1948
|
-
*
|
1949
|
-
* @private
|
1950
|
-
*/
|
1951
|
-
MaterialRadio.prototype.mdlDowngrade_ = function () {
|
1952
|
-
var rippleContainer = this.element_.querySelector('.' + this.CssClasses_.RIPPLE_CONTAINER);
|
1953
|
-
this.btnElement_.removeEventListener('change', this.boundChangeHandler_);
|
1954
|
-
this.btnElement_.removeEventListener('focus', this.boundFocusHandler_);
|
1955
|
-
this.btnElement_.removeEventListener('blur', this.boundBlurHandler_);
|
1956
|
-
this.element_.removeEventListener('mouseup', this.boundMouseUpHandler_);
|
1957
|
-
if (rippleContainer) {
|
1958
|
-
rippleContainer.removeEventListener('mouseup', this.boundMouseUpHandler_);
|
1959
|
-
this.element_.removeChild(rippleContainer);
|
1960
|
-
}
|
1961
|
-
};
|
1962
|
-
/**
|
1963
|
-
* Public alias for the downgrade method.
|
1964
|
-
*
|
1965
|
-
* @public
|
1966
|
-
*/
|
1967
|
-
MaterialRadio.prototype.mdlDowngrade = MaterialRadio.prototype.mdlDowngrade_;
|
1968
|
-
MaterialRadio.prototype['mdlDowngrade'] = MaterialRadio.prototype.mdlDowngrade;
|
1969
1831
|
// The component registers itself. It can assume componentHandler is available
|
1970
1832
|
// in the global scope.
|
1971
1833
|
componentHandler.register({
|
@@ -2181,30 +2043,184 @@ MaterialSlider.prototype.init = function () {
|
|
2181
2043
|
this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
|
2182
2044
|
}
|
2183
2045
|
};
|
2046
|
+
// The component registers itself. It can assume componentHandler is available
|
2047
|
+
// in the global scope.
|
2048
|
+
componentHandler.register({
|
2049
|
+
constructor: MaterialSlider,
|
2050
|
+
classAsString: 'MaterialSlider',
|
2051
|
+
cssClass: 'mdl-js-slider',
|
2052
|
+
widget: true
|
2053
|
+
});
|
2054
|
+
/**
|
2055
|
+
* Copyright 2015 Google Inc. All Rights Reserved.
|
2056
|
+
*
|
2057
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
2058
|
+
* you may not use this file except in compliance with the License.
|
2059
|
+
* You may obtain a copy of the License at
|
2060
|
+
*
|
2061
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
2062
|
+
*
|
2063
|
+
* Unless required by applicable law or agreed to in writing, software
|
2064
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
2065
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
2066
|
+
* See the License for the specific language governing permissions and
|
2067
|
+
* limitations under the License.
|
2068
|
+
*/
|
2184
2069
|
/**
|
2185
|
-
*
|
2070
|
+
* Class constructor for Snackbar MDL component.
|
2071
|
+
* Implements MDL component design pattern defined at:
|
2072
|
+
* https://github.com/jasonmayes/mdl-component-design-pattern
|
2186
2073
|
*
|
2074
|
+
* @constructor
|
2075
|
+
* @param {HTMLElement} element The element that will be upgraded.
|
2076
|
+
*/
|
2077
|
+
var MaterialSnackbar = function MaterialSnackbar(element) {
|
2078
|
+
this.element_ = element;
|
2079
|
+
this.textElement_ = this.element_.querySelector('.' + this.cssClasses_.MESSAGE);
|
2080
|
+
this.actionElement_ = this.element_.querySelector('.' + this.cssClasses_.ACTION);
|
2081
|
+
if (!this.textElement_) {
|
2082
|
+
throw new Error('There must be a message element for a snackbar.');
|
2083
|
+
}
|
2084
|
+
if (!this.actionElement_) {
|
2085
|
+
throw new Error('There must be an action element for a snackbar.');
|
2086
|
+
}
|
2087
|
+
this.active = false;
|
2088
|
+
this.actionHandler_ = undefined;
|
2089
|
+
this.message_ = undefined;
|
2090
|
+
this.actionText_ = undefined;
|
2091
|
+
this.queuedNotifications_ = [];
|
2092
|
+
this.setActionHidden_(true);
|
2093
|
+
};
|
2094
|
+
window['MaterialSnackbar'] = MaterialSnackbar;
|
2095
|
+
/**
|
2096
|
+
* Store constants in one place so they can be updated easily.
|
2097
|
+
*
|
2098
|
+
* @enum {string | number}
|
2187
2099
|
* @private
|
2188
2100
|
*/
|
2189
|
-
|
2190
|
-
|
2191
|
-
|
2192
|
-
this.element_.removeEventListener('mouseup', this.boundMouseUpHandler);
|
2193
|
-
this.element_.parentElement.removeEventListener('mousedown', this.boundContainerMouseDownHandler);
|
2101
|
+
MaterialSnackbar.prototype.Constant_ = {
|
2102
|
+
// The duration of the snackbar show/hide animation, in ms.
|
2103
|
+
ANIMATION_LENGTH: 250
|
2194
2104
|
};
|
2195
2105
|
/**
|
2196
|
-
*
|
2106
|
+
* Store strings for class names defined by this component that are used in
|
2107
|
+
* JavaScript. This allows us to simply change it in one place should we
|
2108
|
+
* decide to modify at a later date.
|
2197
2109
|
*
|
2110
|
+
* @enum {string}
|
2111
|
+
* @private
|
2112
|
+
*/
|
2113
|
+
MaterialSnackbar.prototype.cssClasses_ = {
|
2114
|
+
SNACKBAR: 'mdl-snackbar',
|
2115
|
+
MESSAGE: 'mdl-snackbar__text',
|
2116
|
+
ACTION: 'mdl-snackbar__action',
|
2117
|
+
ACTIVE: 'mdl-snackbar--active'
|
2118
|
+
};
|
2119
|
+
/**
|
2120
|
+
* Display the snackbar.
|
2121
|
+
*
|
2122
|
+
* @private
|
2123
|
+
*/
|
2124
|
+
MaterialSnackbar.prototype.displaySnackbar_ = function () {
|
2125
|
+
this.element_.setAttribute('aria-hidden', 'true');
|
2126
|
+
if (this.actionHandler_) {
|
2127
|
+
this.actionElement_.textContent = this.actionText_;
|
2128
|
+
this.actionElement_.addEventListener('click', this.actionHandler_);
|
2129
|
+
this.setActionHidden_(false);
|
2130
|
+
}
|
2131
|
+
this.textElement_.textContent = this.message_;
|
2132
|
+
this.element_.classList.add(this.cssClasses_.ACTIVE);
|
2133
|
+
this.element_.setAttribute('aria-hidden', 'false');
|
2134
|
+
setTimeout(this.cleanup_.bind(this), this.timeout_);
|
2135
|
+
};
|
2136
|
+
/**
|
2137
|
+
* Show the snackbar.
|
2138
|
+
*
|
2139
|
+
* @param {Object} data The data for the notification.
|
2198
2140
|
* @public
|
2199
2141
|
*/
|
2200
|
-
|
2201
|
-
|
2142
|
+
MaterialSnackbar.prototype.showSnackbar = function (data) {
|
2143
|
+
if (data === undefined) {
|
2144
|
+
throw new Error('Please provide a data object with at least a message to display.');
|
2145
|
+
}
|
2146
|
+
if (data['message'] === undefined) {
|
2147
|
+
throw new Error('Please provide a message to be displayed.');
|
2148
|
+
}
|
2149
|
+
if (data['actionHandler'] && !data['actionText']) {
|
2150
|
+
throw new Error('Please provide action text with the handler.');
|
2151
|
+
}
|
2152
|
+
if (this.active) {
|
2153
|
+
this.queuedNotifications_.push(data);
|
2154
|
+
} else {
|
2155
|
+
this.active = true;
|
2156
|
+
this.message_ = data['message'];
|
2157
|
+
if (data['timeout']) {
|
2158
|
+
this.timeout_ = data['timeout'];
|
2159
|
+
} else {
|
2160
|
+
this.timeout_ = 2750;
|
2161
|
+
}
|
2162
|
+
if (data['actionHandler']) {
|
2163
|
+
this.actionHandler_ = data['actionHandler'];
|
2164
|
+
}
|
2165
|
+
if (data['actionText']) {
|
2166
|
+
this.actionText_ = data['actionText'];
|
2167
|
+
}
|
2168
|
+
this.displaySnackbar_();
|
2169
|
+
}
|
2170
|
+
};
|
2171
|
+
MaterialSnackbar.prototype['showSnackbar'] = MaterialSnackbar.prototype.showSnackbar;
|
2172
|
+
/**
|
2173
|
+
* Check if the queue has items within it.
|
2174
|
+
* If it does, display the next entry.
|
2175
|
+
*
|
2176
|
+
* @private
|
2177
|
+
*/
|
2178
|
+
MaterialSnackbar.prototype.checkQueue_ = function () {
|
2179
|
+
if (this.queuedNotifications_.length > 0) {
|
2180
|
+
this.showSnackbar(this.queuedNotifications_.shift());
|
2181
|
+
}
|
2182
|
+
};
|
2183
|
+
/**
|
2184
|
+
* Cleanup the snackbar event listeners and accessiblity attributes.
|
2185
|
+
*
|
2186
|
+
* @private
|
2187
|
+
*/
|
2188
|
+
MaterialSnackbar.prototype.cleanup_ = function () {
|
2189
|
+
this.element_.classList.remove(this.cssClasses_.ACTIVE);
|
2190
|
+
setTimeout(function () {
|
2191
|
+
this.element_.setAttribute('aria-hidden', 'true');
|
2192
|
+
this.textElement_.textContent = '';
|
2193
|
+
if (!Boolean(this.actionElement_.getAttribute('aria-hidden'))) {
|
2194
|
+
this.setActionHidden_(true);
|
2195
|
+
this.actionElement_.textContent = '';
|
2196
|
+
this.actionElement_.removeEventListener('click', this.actionHandler_);
|
2197
|
+
}
|
2198
|
+
this.actionHandler_ = undefined;
|
2199
|
+
this.message_ = undefined;
|
2200
|
+
this.actionText_ = undefined;
|
2201
|
+
this.active = false;
|
2202
|
+
this.checkQueue_();
|
2203
|
+
}.bind(this), this.Constant_.ANIMATION_LENGTH);
|
2204
|
+
};
|
2205
|
+
/**
|
2206
|
+
* Set the action handler hidden state.
|
2207
|
+
*
|
2208
|
+
* @param {boolean} value
|
2209
|
+
* @private
|
2210
|
+
*/
|
2211
|
+
MaterialSnackbar.prototype.setActionHidden_ = function (value) {
|
2212
|
+
if (value) {
|
2213
|
+
this.actionElement_.setAttribute('aria-hidden', 'true');
|
2214
|
+
} else {
|
2215
|
+
this.actionElement_.removeAttribute('aria-hidden');
|
2216
|
+
}
|
2217
|
+
};
|
2202
2218
|
// The component registers itself. It can assume componentHandler is available
|
2203
2219
|
// in the global scope.
|
2204
2220
|
componentHandler.register({
|
2205
|
-
constructor:
|
2206
|
-
classAsString: '
|
2207
|
-
cssClass: 'mdl-js-
|
2221
|
+
constructor: MaterialSnackbar,
|
2222
|
+
classAsString: 'MaterialSnackbar',
|
2223
|
+
cssClass: 'mdl-js-snackbar',
|
2208
2224
|
widget: true
|
2209
2225
|
});
|
2210
2226
|
/**
|
@@ -2556,27 +2572,6 @@ MaterialSwitch.prototype.init = function () {
|
|
2556
2572
|
this.element_.classList.add('is-upgraded');
|
2557
2573
|
}
|
2558
2574
|
};
|
2559
|
-
/**
|
2560
|
-
* Downgrade the component.
|
2561
|
-
*
|
2562
|
-
* @private
|
2563
|
-
*/
|
2564
|
-
MaterialSwitch.prototype.mdlDowngrade_ = function () {
|
2565
|
-
if (this.rippleContainerElement_) {
|
2566
|
-
this.rippleContainerElement_.removeEventListener('mouseup', this.boundMouseUpHandler);
|
2567
|
-
}
|
2568
|
-
this.inputElement_.removeEventListener('change', this.boundChangeHandler);
|
2569
|
-
this.inputElement_.removeEventListener('focus', this.boundFocusHandler);
|
2570
|
-
this.inputElement_.removeEventListener('blur', this.boundBlurHandler);
|
2571
|
-
this.element_.removeEventListener('mouseup', this.boundMouseUpHandler);
|
2572
|
-
};
|
2573
|
-
/**
|
2574
|
-
* Public alias for the downgrade method.
|
2575
|
-
*
|
2576
|
-
* @public
|
2577
|
-
*/
|
2578
|
-
MaterialSwitch.prototype.mdlDowngrade = MaterialSwitch.prototype.mdlDowngrade_;
|
2579
|
-
MaterialSwitch.prototype['mdlDowngrade'] = MaterialSwitch.prototype.mdlDowngrade;
|
2580
2575
|
// The component registers itself. It can assume componentHandler is available
|
2581
2576
|
// in the global scope.
|
2582
2577
|
componentHandler.register({
|
@@ -2607,7 +2602,7 @@ componentHandler.register({
|
|
2607
2602
|
* https://github.com/jasonmayes/mdl-component-design-pattern
|
2608
2603
|
*
|
2609
2604
|
* @constructor
|
2610
|
-
* @param {
|
2605
|
+
* @param {Element} element The element that will be upgraded.
|
2611
2606
|
*/
|
2612
2607
|
var MaterialTabs = function MaterialTabs(element) {
|
2613
2608
|
// Stores the HTML element.
|
@@ -2691,7 +2686,7 @@ MaterialTabs.prototype.init = function () {
|
|
2691
2686
|
* Constructor for an individual tab.
|
2692
2687
|
*
|
2693
2688
|
* @constructor
|
2694
|
-
* @param {
|
2689
|
+
* @param {Element} tab The HTML element for the tab.
|
2695
2690
|
* @param {MaterialTabs} ctx The MaterialTabs object that owns the tab.
|
2696
2691
|
*/
|
2697
2692
|
function MaterialTab(tab, ctx) {
|
@@ -2813,6 +2808,15 @@ MaterialTextfield.prototype.onFocus_ = function (event) {
|
|
2813
2808
|
MaterialTextfield.prototype.onBlur_ = function (event) {
|
2814
2809
|
this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
|
2815
2810
|
};
|
2811
|
+
/**
|
2812
|
+
* Handle reset event from out side.
|
2813
|
+
*
|
2814
|
+
* @param {Event} event The event that fired.
|
2815
|
+
* @private
|
2816
|
+
*/
|
2817
|
+
MaterialTextfield.prototype.onReset_ = function (event) {
|
2818
|
+
this.updateClasses_();
|
2819
|
+
};
|
2816
2820
|
/**
|
2817
2821
|
* Handle class updates.
|
2818
2822
|
*
|
@@ -2822,6 +2826,7 @@ MaterialTextfield.prototype.updateClasses_ = function () {
|
|
2822
2826
|
this.checkDisabled();
|
2823
2827
|
this.checkValidity();
|
2824
2828
|
this.checkDirty();
|
2829
|
+
this.checkFocus();
|
2825
2830
|
};
|
2826
2831
|
// Public methods.
|
2827
2832
|
/**
|
@@ -2837,6 +2842,19 @@ MaterialTextfield.prototype.checkDisabled = function () {
|
|
2837
2842
|
}
|
2838
2843
|
};
|
2839
2844
|
MaterialTextfield.prototype['checkDisabled'] = MaterialTextfield.prototype.checkDisabled;
|
2845
|
+
/**
|
2846
|
+
* Check the focus state and update field accordingly.
|
2847
|
+
*
|
2848
|
+
* @public
|
2849
|
+
*/
|
2850
|
+
MaterialTextfield.prototype.checkFocus = function () {
|
2851
|
+
if (Boolean(this.element_.querySelector(':focus'))) {
|
2852
|
+
this.element_.classList.add(this.CssClasses_.IS_FOCUSED);
|
2853
|
+
} else {
|
2854
|
+
this.element_.classList.remove(this.CssClasses_.IS_FOCUSED);
|
2855
|
+
}
|
2856
|
+
};
|
2857
|
+
MaterialTextfield.prototype['checkFocus'] = MaterialTextfield.prototype.checkFocus;
|
2840
2858
|
/**
|
2841
2859
|
* Check the validity state and update field accordingly.
|
2842
2860
|
*
|
@@ -2913,9 +2931,11 @@ MaterialTextfield.prototype.init = function () {
|
|
2913
2931
|
this.boundUpdateClassesHandler = this.updateClasses_.bind(this);
|
2914
2932
|
this.boundFocusHandler = this.onFocus_.bind(this);
|
2915
2933
|
this.boundBlurHandler = this.onBlur_.bind(this);
|
2934
|
+
this.boundResetHandler = this.onReset_.bind(this);
|
2916
2935
|
this.input_.addEventListener('input', this.boundUpdateClassesHandler);
|
2917
2936
|
this.input_.addEventListener('focus', this.boundFocusHandler);
|
2918
2937
|
this.input_.addEventListener('blur', this.boundBlurHandler);
|
2938
|
+
this.input_.addEventListener('reset', this.boundResetHandler);
|
2919
2939
|
if (this.maxRows !== this.Constant_.NO_MAX_ROWS) {
|
2920
2940
|
// TODO: This should handle pasting multi line text.
|
2921
2941
|
// Currently doesn't.
|
@@ -2928,29 +2948,13 @@ MaterialTextfield.prototype.init = function () {
|
|
2928
2948
|
if (invalid) {
|
2929
2949
|
this.element_.classList.add(this.CssClasses_.IS_INVALID);
|
2930
2950
|
}
|
2951
|
+
if (this.input_.hasAttribute('autofocus')) {
|
2952
|
+
this.element_.focus();
|
2953
|
+
this.checkFocus();
|
2954
|
+
}
|
2931
2955
|
}
|
2932
2956
|
}
|
2933
2957
|
};
|
2934
|
-
/**
|
2935
|
-
* Downgrade the component
|
2936
|
-
*
|
2937
|
-
* @private
|
2938
|
-
*/
|
2939
|
-
MaterialTextfield.prototype.mdlDowngrade_ = function () {
|
2940
|
-
this.input_.removeEventListener('input', this.boundUpdateClassesHandler);
|
2941
|
-
this.input_.removeEventListener('focus', this.boundFocusHandler);
|
2942
|
-
this.input_.removeEventListener('blur', this.boundBlurHandler);
|
2943
|
-
if (this.boundKeyDownHandler) {
|
2944
|
-
this.input_.removeEventListener('keydown', this.boundKeyDownHandler);
|
2945
|
-
}
|
2946
|
-
};
|
2947
|
-
/**
|
2948
|
-
* Public alias for the downgrade method.
|
2949
|
-
*
|
2950
|
-
* @public
|
2951
|
-
*/
|
2952
|
-
MaterialTextfield.prototype.mdlDowngrade = MaterialTextfield.prototype.mdlDowngrade_;
|
2953
|
-
MaterialTextfield.prototype['mdlDowngrade'] = MaterialTextfield.prototype.mdlDowngrade;
|
2954
2958
|
// The component registers itself. It can assume componentHandler is available
|
2955
2959
|
// in the global scope.
|
2956
2960
|
componentHandler.register({
|
@@ -3004,7 +3008,13 @@ MaterialTooltip.prototype.Constant_ = {};
|
|
3004
3008
|
* @enum {string}
|
3005
3009
|
* @private
|
3006
3010
|
*/
|
3007
|
-
MaterialTooltip.prototype.CssClasses_ = {
|
3011
|
+
MaterialTooltip.prototype.CssClasses_ = {
|
3012
|
+
IS_ACTIVE: 'is-active',
|
3013
|
+
BOTTOM: 'mdl-tooltip--bottom',
|
3014
|
+
LEFT: 'mdl-tooltip--left',
|
3015
|
+
RIGHT: 'mdl-tooltip--right',
|
3016
|
+
TOP: 'mdl-tooltip--top'
|
3017
|
+
};
|
3008
3018
|
/**
|
3009
3019
|
* Handle mouseenter for tooltip.
|
3010
3020
|
*
|
@@ -3012,33 +3022,47 @@ MaterialTooltip.prototype.CssClasses_ = { IS_ACTIVE: 'is-active' };
|
|
3012
3022
|
* @private
|
3013
3023
|
*/
|
3014
3024
|
MaterialTooltip.prototype.handleMouseEnter_ = function (event) {
|
3015
|
-
event.stopPropagation();
|
3016
3025
|
var props = event.target.getBoundingClientRect();
|
3017
3026
|
var left = props.left + props.width / 2;
|
3027
|
+
var top = props.top + props.height / 2;
|
3018
3028
|
var marginLeft = -1 * (this.element_.offsetWidth / 2);
|
3019
|
-
|
3020
|
-
|
3021
|
-
|
3029
|
+
var marginTop = -1 * (this.element_.offsetHeight / 2);
|
3030
|
+
if (this.element_.classList.contains(this.CssClasses_.LEFT) || this.element_.classList.contains(this.CssClasses_.RIGHT)) {
|
3031
|
+
left = props.width / 2;
|
3032
|
+
if (top + marginTop < 0) {
|
3033
|
+
this.element_.style.top = 0;
|
3034
|
+
this.element_.style.marginTop = 0;
|
3035
|
+
} else {
|
3036
|
+
this.element_.style.top = top + 'px';
|
3037
|
+
this.element_.style.marginTop = marginTop + 'px';
|
3038
|
+
}
|
3039
|
+
} else {
|
3040
|
+
if (left + marginLeft < 0) {
|
3041
|
+
this.element_.style.left = 0;
|
3042
|
+
this.element_.style.marginLeft = 0;
|
3043
|
+
} else {
|
3044
|
+
this.element_.style.left = left + 'px';
|
3045
|
+
this.element_.style.marginLeft = marginLeft + 'px';
|
3046
|
+
}
|
3047
|
+
}
|
3048
|
+
if (this.element_.classList.contains(this.CssClasses_.TOP)) {
|
3049
|
+
this.element_.style.top = props.top - this.element_.offsetHeight - 10 + 'px';
|
3050
|
+
} else if (this.element_.classList.contains(this.CssClasses_.RIGHT)) {
|
3051
|
+
this.element_.style.left = props.left + props.width + 10 + 'px';
|
3052
|
+
} else if (this.element_.classList.contains(this.CssClasses_.LEFT)) {
|
3053
|
+
this.element_.style.left = props.left - this.element_.offsetWidth - 10 + 'px';
|
3022
3054
|
} else {
|
3023
|
-
this.element_.style.
|
3024
|
-
this.element_.style.marginLeft = marginLeft + 'px';
|
3055
|
+
this.element_.style.top = props.top + props.height + 10 + 'px';
|
3025
3056
|
}
|
3026
|
-
this.element_.style.top = props.top + props.height + 10 + 'px';
|
3027
3057
|
this.element_.classList.add(this.CssClasses_.IS_ACTIVE);
|
3028
|
-
window.addEventListener('scroll', this.boundMouseLeaveHandler, false);
|
3029
|
-
window.addEventListener('touchmove', this.boundMouseLeaveHandler, false);
|
3030
3058
|
};
|
3031
3059
|
/**
|
3032
3060
|
* Handle mouseleave for tooltip.
|
3033
3061
|
*
|
3034
|
-
* @param {Event} event The event that fired.
|
3035
3062
|
* @private
|
3036
3063
|
*/
|
3037
|
-
MaterialTooltip.prototype.handleMouseLeave_ = function (
|
3038
|
-
event.stopPropagation();
|
3064
|
+
MaterialTooltip.prototype.handleMouseLeave_ = function () {
|
3039
3065
|
this.element_.classList.remove(this.CssClasses_.IS_ACTIVE);
|
3040
|
-
window.removeEventListener('scroll', this.boundMouseLeaveHandler);
|
3041
|
-
window.removeEventListener('touchmove', this.boundMouseLeaveHandler, false);
|
3042
3066
|
};
|
3043
3067
|
/**
|
3044
3068
|
* Initialize element.
|
@@ -3050,40 +3074,19 @@ MaterialTooltip.prototype.init = function () {
|
|
3050
3074
|
this.forElement_ = document.getElementById(forElId);
|
3051
3075
|
}
|
3052
3076
|
if (this.forElement_) {
|
3053
|
-
//
|
3077
|
+
// It's left here because it prevents accidental text selection on Android
|
3054
3078
|
if (!this.forElement_.hasAttribute('tabindex')) {
|
3055
3079
|
this.forElement_.setAttribute('tabindex', '0');
|
3056
3080
|
}
|
3057
3081
|
this.boundMouseEnterHandler = this.handleMouseEnter_.bind(this);
|
3058
3082
|
this.boundMouseLeaveHandler = this.handleMouseLeave_.bind(this);
|
3059
3083
|
this.forElement_.addEventListener('mouseenter', this.boundMouseEnterHandler, false);
|
3060
|
-
this.forElement_.addEventListener('
|
3061
|
-
this.forElement_.addEventListener('
|
3062
|
-
|
3063
|
-
this.forElement_.addEventListener('mouseleave', this.boundMouseLeaveHandler);
|
3084
|
+
this.forElement_.addEventListener('touchend', this.boundMouseEnterHandler, false);
|
3085
|
+
this.forElement_.addEventListener('mouseleave', this.boundMouseLeaveHandler, false);
|
3086
|
+
window.addEventListener('touchstart', this.boundMouseLeaveHandler);
|
3064
3087
|
}
|
3065
3088
|
}
|
3066
3089
|
};
|
3067
|
-
/**
|
3068
|
-
* Downgrade the component
|
3069
|
-
*
|
3070
|
-
* @private
|
3071
|
-
*/
|
3072
|
-
MaterialTooltip.prototype.mdlDowngrade_ = function () {
|
3073
|
-
if (this.forElement_) {
|
3074
|
-
this.forElement_.removeEventListener('mouseenter', this.boundMouseEnterHandler, false);
|
3075
|
-
this.forElement_.removeEventListener('click', this.boundMouseEnterHandler, false);
|
3076
|
-
this.forElement_.removeEventListener('touchstart', this.boundMouseEnterHandler, false);
|
3077
|
-
this.forElement_.removeEventListener('mouseleave', this.boundMouseLeaveHandler);
|
3078
|
-
}
|
3079
|
-
};
|
3080
|
-
/**
|
3081
|
-
* Public alias for the downgrade method.
|
3082
|
-
*
|
3083
|
-
* @public
|
3084
|
-
*/
|
3085
|
-
MaterialTooltip.prototype.mdlDowngrade = MaterialTooltip.prototype.mdlDowngrade_;
|
3086
|
-
MaterialTooltip.prototype['mdlDowngrade'] = MaterialTooltip.prototype.mdlDowngrade;
|
3087
3090
|
// The component registers itself. It can assume componentHandler is available
|
3088
3091
|
// in the global scope.
|
3089
3092
|
componentHandler.register({
|
@@ -3130,10 +3133,21 @@ window['MaterialLayout'] = MaterialLayout;
|
|
3130
3133
|
MaterialLayout.prototype.Constant_ = {
|
3131
3134
|
MAX_WIDTH: '(max-width: 1024px)',
|
3132
3135
|
TAB_SCROLL_PIXELS: 100,
|
3133
|
-
MENU_ICON: '
|
3136
|
+
MENU_ICON: '',
|
3134
3137
|
CHEVRON_LEFT: 'chevron_left',
|
3135
3138
|
CHEVRON_RIGHT: 'chevron_right'
|
3136
3139
|
};
|
3140
|
+
/**
|
3141
|
+
* Keycodes, for code readability.
|
3142
|
+
*
|
3143
|
+
* @enum {number}
|
3144
|
+
* @private
|
3145
|
+
*/
|
3146
|
+
MaterialLayout.prototype.Keycodes_ = {
|
3147
|
+
ENTER: 13,
|
3148
|
+
ESCAPE: 27,
|
3149
|
+
SPACE: 32
|
3150
|
+
};
|
3137
3151
|
/**
|
3138
3152
|
* Modes.
|
3139
3153
|
*
|
@@ -3209,6 +3223,17 @@ MaterialLayout.prototype.contentScrollHandler_ = function () {
|
|
3209
3223
|
this.header_.classList.add(this.CssClasses_.IS_ANIMATING);
|
3210
3224
|
}
|
3211
3225
|
};
|
3226
|
+
/**
|
3227
|
+
* Handles a keyboard event on the drawer.
|
3228
|
+
*
|
3229
|
+
* @param {Event} evt The event that fired.
|
3230
|
+
* @private
|
3231
|
+
*/
|
3232
|
+
MaterialLayout.prototype.keyboardEventHandler_ = function (evt) {
|
3233
|
+
if (evt.keyCode === this.Keycodes_.ESCAPE) {
|
3234
|
+
this.toggleDrawer();
|
3235
|
+
}
|
3236
|
+
};
|
3212
3237
|
/**
|
3213
3238
|
* Handles changes in screen size.
|
3214
3239
|
*
|
@@ -3227,13 +3252,22 @@ MaterialLayout.prototype.screenSizeHandler_ = function () {
|
|
3227
3252
|
}
|
3228
3253
|
};
|
3229
3254
|
/**
|
3230
|
-
* Handles
|
3255
|
+
* Handles events of drawer button.
|
3231
3256
|
*
|
3257
|
+
* @param {Event} evt The event that fired.
|
3232
3258
|
* @private
|
3233
3259
|
*/
|
3234
|
-
MaterialLayout.prototype.drawerToggleHandler_ = function () {
|
3235
|
-
|
3236
|
-
|
3260
|
+
MaterialLayout.prototype.drawerToggleHandler_ = function (evt) {
|
3261
|
+
if (evt && evt.type === 'keydown') {
|
3262
|
+
if (evt.keyCode === this.Keycodes_.SPACE || evt.keyCode === this.Keycodes_.ENTER) {
|
3263
|
+
// prevent scrolling in drawer nav
|
3264
|
+
evt.preventDefault();
|
3265
|
+
} else {
|
3266
|
+
// prevent other keys
|
3267
|
+
return;
|
3268
|
+
}
|
3269
|
+
}
|
3270
|
+
this.toggleDrawer();
|
3237
3271
|
};
|
3238
3272
|
/**
|
3239
3273
|
* Handles (un)setting the `is-animating` class
|
@@ -3274,6 +3308,25 @@ MaterialLayout.prototype.resetPanelState_ = function (panels) {
|
|
3274
3308
|
panels[j].classList.remove(this.CssClasses_.IS_ACTIVE);
|
3275
3309
|
}
|
3276
3310
|
};
|
3311
|
+
/**
|
3312
|
+
* Toggle drawer state
|
3313
|
+
*
|
3314
|
+
* @public
|
3315
|
+
*/
|
3316
|
+
MaterialLayout.prototype.toggleDrawer = function () {
|
3317
|
+
var drawerButton = this.element_.querySelector('.' + this.CssClasses_.DRAWER_BTN);
|
3318
|
+
this.drawer_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);
|
3319
|
+
this.obfuscator_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);
|
3320
|
+
// Set accessibility properties.
|
3321
|
+
if (this.drawer_.classList.contains(this.CssClasses_.IS_DRAWER_OPEN)) {
|
3322
|
+
this.drawer_.setAttribute('aria-hidden', 'false');
|
3323
|
+
drawerButton.setAttribute('aria-expanded', 'true');
|
3324
|
+
} else {
|
3325
|
+
this.drawer_.setAttribute('aria-hidden', 'true');
|
3326
|
+
drawerButton.setAttribute('aria-expanded', 'false');
|
3327
|
+
}
|
3328
|
+
};
|
3329
|
+
MaterialLayout.prototype['toggleDrawer'] = MaterialLayout.prototype.toggleDrawer;
|
3277
3330
|
/**
|
3278
3331
|
* Initialize element.
|
3279
3332
|
*/
|
@@ -3298,6 +3351,16 @@ MaterialLayout.prototype.init = function () {
|
|
3298
3351
|
this.content_ = child;
|
3299
3352
|
}
|
3300
3353
|
}
|
3354
|
+
window.addEventListener('pageshow', function (e) {
|
3355
|
+
if (e.persisted) {
|
3356
|
+
// when page is loaded from back/forward cache
|
3357
|
+
// trigger repaint to let layout scroll in safari
|
3358
|
+
this.element_.style.overflowY = 'hidden';
|
3359
|
+
requestAnimationFrame(function () {
|
3360
|
+
this.element_.style.overflowY = '';
|
3361
|
+
}.bind(this));
|
3362
|
+
}
|
3363
|
+
}.bind(this), false);
|
3301
3364
|
if (this.header_) {
|
3302
3365
|
this.tabBar_ = this.header_.querySelector('.' + this.CssClasses_.TAB_BAR);
|
3303
3366
|
}
|
@@ -3336,10 +3399,13 @@ MaterialLayout.prototype.init = function () {
|
|
3336
3399
|
var drawerButton = this.element_.querySelector('.' + this.CssClasses_.DRAWER_BTN);
|
3337
3400
|
if (!drawerButton) {
|
3338
3401
|
drawerButton = document.createElement('div');
|
3402
|
+
drawerButton.setAttribute('aria-expanded', 'false');
|
3403
|
+
drawerButton.setAttribute('role', 'button');
|
3404
|
+
drawerButton.setAttribute('tabindex', '0');
|
3339
3405
|
drawerButton.classList.add(this.CssClasses_.DRAWER_BTN);
|
3340
3406
|
var drawerButtonIcon = document.createElement('i');
|
3341
3407
|
drawerButtonIcon.classList.add(this.CssClasses_.ICON);
|
3342
|
-
drawerButtonIcon.
|
3408
|
+
drawerButtonIcon.innerHTML = this.Constant_.MENU_ICON;
|
3343
3409
|
drawerButton.appendChild(drawerButtonIcon);
|
3344
3410
|
}
|
3345
3411
|
if (this.drawer_.classList.contains(this.CssClasses_.ON_LARGE_SCREEN)) {
|
@@ -3350,6 +3416,7 @@ MaterialLayout.prototype.init = function () {
|
|
3350
3416
|
drawerButton.classList.add(this.CssClasses_.ON_SMALL_SCREEN);
|
3351
3417
|
}
|
3352
3418
|
drawerButton.addEventListener('click', this.drawerToggleHandler_.bind(this));
|
3419
|
+
drawerButton.addEventListener('keydown', this.drawerToggleHandler_.bind(this));
|
3353
3420
|
// Add a class if the layout has a drawer, for altering the left padding.
|
3354
3421
|
// Adds the HAS_DRAWER to the elements since this.header_ may or may
|
3355
3422
|
// not be present.
|
@@ -3366,6 +3433,8 @@ MaterialLayout.prototype.init = function () {
|
|
3366
3433
|
this.element_.appendChild(obfuscator);
|
3367
3434
|
obfuscator.addEventListener('click', this.drawerToggleHandler_.bind(this));
|
3368
3435
|
this.obfuscator_ = obfuscator;
|
3436
|
+
this.drawer_.addEventListener('keydown', this.keyboardEventHandler_.bind(this));
|
3437
|
+
this.drawer_.setAttribute('aria-hidden', 'true');
|
3369
3438
|
}
|
3370
3439
|
// Keep an eye on screen size, and add/remove auxiliary class for styling
|
3371
3440
|
// of small screens.
|
@@ -3441,6 +3510,17 @@ MaterialLayout.prototype.init = function () {
|
|
3441
3510
|
* @param {MaterialLayout} layout The MaterialLayout object that owns the tab.
|
3442
3511
|
*/
|
3443
3512
|
function MaterialLayoutTab(tab, tabs, panels, layout) {
|
3513
|
+
/**
|
3514
|
+
* Auxiliary method to programmatically select a tab in the UI.
|
3515
|
+
*/
|
3516
|
+
function selectTab() {
|
3517
|
+
var href = tab.href.split('#')[1];
|
3518
|
+
var panel = layout.content_.querySelector('#' + href);
|
3519
|
+
layout.resetTabState_(tabs);
|
3520
|
+
layout.resetPanelState_(panels);
|
3521
|
+
tab.classList.add(layout.CssClasses_.IS_ACTIVE);
|
3522
|
+
panel.classList.add(layout.CssClasses_.IS_ACTIVE);
|
3523
|
+
}
|
3444
3524
|
if (layout.tabBar_.classList.contains(layout.CssClasses_.JS_RIPPLE_EFFECT)) {
|
3445
3525
|
var rippleContainer = document.createElement('span');
|
3446
3526
|
rippleContainer.classList.add(layout.CssClasses_.RIPPLE_CONTAINER);
|
@@ -3450,6 +3530,13 @@ function MaterialLayoutTab(tab, tabs, panels, layout) {
|
|
3450
3530
|
rippleContainer.appendChild(ripple);
|
3451
3531
|
tab.appendChild(rippleContainer);
|
3452
3532
|
}
|
3533
|
+
tab.addEventListener('click', function (e) {
|
3534
|
+
if (tab.getAttribute('href').charAt(0) === '#') {
|
3535
|
+
e.preventDefault();
|
3536
|
+
selectTab();
|
3537
|
+
}
|
3538
|
+
});
|
3539
|
+
tab.show = selectTab;
|
3453
3540
|
tab.addEventListener('click', function (e) {
|
3454
3541
|
e.preventDefault();
|
3455
3542
|
var href = tab.href.split('#')[1];
|
@@ -3460,6 +3547,7 @@ function MaterialLayoutTab(tab, tabs, panels, layout) {
|
|
3460
3547
|
panel.classList.add(layout.CssClasses_.IS_ACTIVE);
|
3461
3548
|
});
|
3462
3549
|
}
|
3550
|
+
window['MaterialLayoutTab'] = MaterialLayoutTab;
|
3463
3551
|
// The component registers itself. It can assume componentHandler is available
|
3464
3552
|
// in the global scope.
|
3465
3553
|
componentHandler.register({
|
@@ -3489,7 +3577,7 @@ componentHandler.register({
|
|
3489
3577
|
* https://github.com/jasonmayes/mdl-component-design-pattern
|
3490
3578
|
*
|
3491
3579
|
* @constructor
|
3492
|
-
* @param {
|
3580
|
+
* @param {Element} element The element that will be upgraded.
|
3493
3581
|
*/
|
3494
3582
|
var MaterialDataTable = function MaterialDataTable(element) {
|
3495
3583
|
this.element_ = element;
|
@@ -3524,7 +3612,7 @@ MaterialDataTable.prototype.CssClasses_ = {
|
|
3524
3612
|
* single row (or multiple rows).
|
3525
3613
|
*
|
3526
3614
|
* @param {Element} checkbox Checkbox that toggles the selection state.
|
3527
|
-
* @param {
|
3615
|
+
* @param {Element} row Row to toggle when checkbox changes.
|
3528
3616
|
* @param {(Array<Object>|NodeList)=} opt_rows Rows to toggle when checkbox changes.
|
3529
3617
|
* @private
|
3530
3618
|
*/
|
@@ -3562,7 +3650,7 @@ MaterialDataTable.prototype.selectRow_ = function (checkbox, row, opt_rows) {
|
|
3562
3650
|
* Creates a checkbox for a single or or multiple rows and hooks up the
|
3563
3651
|
* event handling.
|
3564
3652
|
*
|
3565
|
-
* @param {
|
3653
|
+
* @param {Element} row Row to toggle when checkbox changes.
|
3566
3654
|
* @param {(Array<Object>|NodeList)=} opt_rows Rows to toggle when checkbox changes.
|
3567
3655
|
* @private
|
3568
3656
|
*/
|
@@ -3578,7 +3666,12 @@ MaterialDataTable.prototype.createCheckbox_ = function (row, opt_rows) {
|
|
3578
3666
|
var checkbox = document.createElement('input');
|
3579
3667
|
checkbox.type = 'checkbox';
|
3580
3668
|
checkbox.classList.add('mdl-checkbox__input');
|
3581
|
-
|
3669
|
+
if (row) {
|
3670
|
+
checkbox.checked = row.classList.contains(this.CssClasses_.IS_SELECTED);
|
3671
|
+
checkbox.addEventListener('change', this.selectRow_(checkbox, row));
|
3672
|
+
} else if (opt_rows) {
|
3673
|
+
checkbox.addEventListener('change', this.selectRow_(checkbox, null, opt_rows));
|
3674
|
+
}
|
3582
3675
|
label.appendChild(checkbox);
|
3583
3676
|
componentHandler.upgradeElement(label, 'MaterialCheckbox');
|
3584
3677
|
return label;
|
@@ -3589,7 +3682,9 @@ MaterialDataTable.prototype.createCheckbox_ = function (row, opt_rows) {
|
|
3589
3682
|
MaterialDataTable.prototype.init = function () {
|
3590
3683
|
if (this.element_) {
|
3591
3684
|
var firstHeader = this.element_.querySelector('th');
|
3592
|
-
var
|
3685
|
+
var bodyRows = Array.prototype.slice.call(this.element_.querySelectorAll('tbody tr'));
|
3686
|
+
var footRows = Array.prototype.slice.call(this.element_.querySelectorAll('tfoot tr'));
|
3687
|
+
var rows = bodyRows.concat(footRows);
|
3593
3688
|
if (this.element_.classList.contains(this.CssClasses_.SELECTABLE)) {
|
3594
3689
|
var th = document.createElement('th');
|
3595
3690
|
var headerCheckbox = this.createCheckbox_(null, rows);
|
@@ -3599,13 +3694,15 @@ MaterialDataTable.prototype.init = function () {
|
|
3599
3694
|
var firstCell = rows[i].querySelector('td');
|
3600
3695
|
if (firstCell) {
|
3601
3696
|
var td = document.createElement('td');
|
3602
|
-
|
3603
|
-
|
3697
|
+
if (rows[i].parentNode.nodeName.toUpperCase() === 'TBODY') {
|
3698
|
+
var rowCheckbox = this.createCheckbox_(rows[i]);
|
3699
|
+
td.appendChild(rowCheckbox);
|
3700
|
+
}
|
3604
3701
|
rows[i].insertBefore(td, firstCell);
|
3605
3702
|
}
|
3606
3703
|
}
|
3704
|
+
this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
|
3607
3705
|
}
|
3608
|
-
this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
|
3609
3706
|
}
|
3610
3707
|
};
|
3611
3708
|
// The component registers itself. It can assume componentHandler is available
|
@@ -3727,14 +3824,13 @@ MaterialRipple.prototype.downHandler_ = function (event) {
|
|
3727
3824
|
MaterialRipple.prototype.upHandler_ = function (event) {
|
3728
3825
|
// Don't fire for the artificial "mouseup" generated by a double-click.
|
3729
3826
|
if (event && event.detail !== 2) {
|
3730
|
-
this
|
3827
|
+
// Allow a repaint to occur before removing this class, so the animation
|
3828
|
+
// shows for tap events, which seem to trigger a mouseup too soon after
|
3829
|
+
// mousedown.
|
3830
|
+
window.setTimeout(function () {
|
3831
|
+
this.rippleElement_.classList.remove(this.CssClasses_.IS_VISIBLE);
|
3832
|
+
}.bind(this), 0);
|
3731
3833
|
}
|
3732
|
-
// Allow a repaint to occur before removing this class, so the animation
|
3733
|
-
// shows for tap events, which seem to trigger a mouseup too soon after
|
3734
|
-
// mousedown.
|
3735
|
-
window.setTimeout(function () {
|
3736
|
-
this.rippleElement_.classList.remove(this.CssClasses_.IS_VISIBLE);
|
3737
|
-
}.bind(this), 0);
|
3738
3834
|
};
|
3739
3835
|
/**
|
3740
3836
|
* Initialize element.
|
@@ -3834,26 +3930,6 @@ MaterialRipple.prototype.init = function () {
|
|
3834
3930
|
}
|
3835
3931
|
}
|
3836
3932
|
};
|
3837
|
-
/**
|
3838
|
-
* Downgrade the component
|
3839
|
-
*
|
3840
|
-
* @private
|
3841
|
-
*/
|
3842
|
-
MaterialRipple.prototype.mdlDowngrade_ = function () {
|
3843
|
-
this.element_.removeEventListener('mousedown', this.boundDownHandler);
|
3844
|
-
this.element_.removeEventListener('touchstart', this.boundDownHandler);
|
3845
|
-
this.element_.removeEventListener('mouseup', this.boundUpHandler);
|
3846
|
-
this.element_.removeEventListener('mouseleave', this.boundUpHandler);
|
3847
|
-
this.element_.removeEventListener('touchend', this.boundUpHandler);
|
3848
|
-
this.element_.removeEventListener('blur', this.boundUpHandler);
|
3849
|
-
};
|
3850
|
-
/**
|
3851
|
-
* Public alias for the downgrade method.
|
3852
|
-
*
|
3853
|
-
* @public
|
3854
|
-
*/
|
3855
|
-
MaterialRipple.prototype.mdlDowngrade = MaterialRipple.prototype.mdlDowngrade_;
|
3856
|
-
MaterialRipple.prototype['mdlDowngrade'] = MaterialRipple.prototype.mdlDowngrade;
|
3857
3933
|
// The component registers itself. It can assume componentHandler is available
|
3858
3934
|
// in the global scope.
|
3859
3935
|
componentHandler.register({
|