Commit 36900d641336f1be745acae8afc8cb5d5f386c94

Authored by Andrea Petta
1 parent 38120605

plugin update

paper-date-picker @ 6d5ade55574
  1 +Subproject commit 6d5ade5557443e4402b9b4ac3588d5984ae1f933
... ...
bower_components/paper-date-picker/.gitignore deleted
1   -.bowerrc
2   -components
3   -bower_components
4   -node_modules
5   -gulpfile.js
bower_components/paper-date-picker/.jshintrc deleted
1   -{
2   - "node": true,
3   - "browser": true,
4   - "esnext": true,
5   - "bitwise": true,
6   - "camelcase": true,
7   - "curly": true,
8   - "eqeqeq": true,
9   - "immed": true,
10   - "indent": 2,
11   - "latedef": true,
12   - "noarg": true,
13   - "quotmark": "single",
14   - "undef": true,
15   - "unused": true,
16   - "globals": {
17   - "wrap": true,
18   - "unwrap": true,
19   - "HTMLImports": true,
20   - "Polymer": true,
21   - "Platform": true,
22   - "moment": true
23   - }
24   -}
25   -
bower_components/paper-date-picker/LICENSE deleted
1   -The MIT License (MIT)
2   -
3   -Copyright (c) 2015 Ben Davis <bendavis78@gmail.com>
4   -
5   -Permission is hereby granted, free of charge, to any person obtaining a copy of
6   -this software and associated documentation files (the "Software"), to deal in
7   -the Software without restriction, including without limitation the rights to
8   -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9   -the Software, and to permit persons to whom the Software is furnished to do so,
10   -subject to the following conditions:
11   -
12   -The above copyright notice and this permission notice shall be included in all
13   -copies or substantial portions of the Software.
14   -
15   -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16   -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17   -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18   -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19   -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20   -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
bower_components/paper-date-picker/README.md deleted
1   -paper-date-picker
2   -=================
3   -Material Design date picker, compatible with *Polymer 1.0*
4   -
5   -Provides a responsive date picker based on the material design spec. This
6   -component aims to be a clone of the date picker introduced in Android Lollipop.
7   -
8   -![wide picker screenshot][wide] ![narrow picker screenshot][narrow]
9   -
10   -See the [component page](http://bendavis78.github.io/paper-date-picker/) for
11   -full documentation.
12   -
13   -## Examples:
14   -
15   -Default picker:
16   -
17   -```html
18   -<paper-date-picker></paper-date-picker>
19   -```
20   -
21   -Setting the initial date to April 20, 2015:
22   -```html
23   -<paper-date-picker date="April 20, 2015"></paper-date-picker>
24   -```
25   -
26   -You may also specify a minimum and/or maximum date allowed in this picker using
27   -the same date notation:
28   -```html
29   -<paper-date-picker min-date="April 1, 2015" max-date="June 30, 2015"></paper-date-picker>
30   -```
31   -
32   -If you include this element as part of `paper-dialog`, use the class
33   -`"paper-date-picker-dialog"` on the dialog element in order to give it proper
34   -styling:
35   -```html
36   -<paper-dialog id="dialog" class="paper-date-picker-dialog" modal
37   - on-iron-overlay-closed="dismissDialog">
38   - <paper-date-picker id="picker" date="[[date]]"></paper-date-picker>
39   - <div class="buttons">
40   - <paper-button dialog-dismiss>Cancel</paper-button>
41   - <paper-button dialog-confirm>OK</paper-button>
42   - </div>
43   -</paper-dialog>
44   -```
45   -
46   -# Reporting Bugs
47   -
48   -When filing a bug report, please provide an example of how to repoduce using
49   -plunker, jsbin, jsfiddle, etc. You can use the following plunker as a starting
50   -point: http://plnkr.co/edit/9c787GHiBzX7zI5x6gsX
51   -
52   ----
53   -
54   -If you find this component useful, please show your support by donating to
55   -[Bold Idea](http://boldidea.org). Click the button below!
56   -
57   -[![ideaSpark campaign button][donate]](https://donorbox.org/bold-idea-make-ideaspark-possible-for-dallas-area-students)
58   -
59   -[wide]: http://i.imgur.com/I0SjSWf.png
60   -[narrow]: http://i.imgur.com/SsrLJDo.png
61   -[donate]: http://www.boldidea.org/donate-badge-md-1.png
bower_components/paper-date-picker/bower.json deleted
1   -{
2   - "name": "paper-date-picker",
3   - "version": "1.1.2",
4   - "authors": [
5   - "Ben Davis <bendavis78@gmail.com>"
6   - ],
7   - "description": "Provides a responsive date picker based on the material design spec",
8   - "keywords": [
9   - "web-component",
10   - "web-components",
11   - "polymer",
12   - "datepicker",
13   - "paper-date-picker"
14   - ],
15   - "main": "paper-date-picker.html",
16   - "license": "MIT",
17   - "homepage": "http://bendavis78.github.io/paper-date-picker/",
18   - "ignore": [
19   - "/.*",
20   - "/tests/"
21   - ],
22   - "dependencies": {
23   - "moment-element": "bendavis78/moment-element#^1.1.0",
24   - "polymer": "Polymer/polymer#^1.1.0",
25   - "iron-icons": "PolymerElements/iron-icons#^1.0.0",
26   - "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
27   - "iron-media-query": "PolymerElements/iron-media-query#^1.0.0",
28   - "iron-resizable": "PolymerElements/iron-resizable-behavior#^1.0.0",
29   - "iron-selector": "PolymerElements/iron-selector#^1.0.0",
30   - "neon-animation": "PolymerElements/neon-animation#^1.0.0",
31   - "paper-styles": "PolymerElements/paper-styles#^1.0.0",
32   - "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
33   - "iron-list": "PolymerElements/iron-list#~1.1.7"
34   - },
35   - "devDependencies": {
36   - "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
37   - "paper-dialog": "PolymerElements/paper-dialog#^1.0.0",
38   - "paper-button": "PolymerElements/paper-button#^1.0.0",
39   - "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
40   - },
41   - "resolutions": {
42   - "polymer": "^1.0.0",
43   - "webcomponentsjs": "^0.7.2"
44   - }
45   -}
bower_components/paper-date-picker/demo/index.html deleted
1   -<!doctype html>
2   -<html>
3   -<head>
4   - <meta charset="utf-8">
5   - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6   - <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
7   -
8   - <title>paper-date-picker Demo</title>
9   -
10   - <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
11   -
12   - <link rel="import" href="../paper-date-picker.html">
13   - <link rel="import" href="../../paper-styles/demo-pages.html">
14   - <link rel="import" href="../../paper-dialog/paper-dialog.html">
15   - <link rel="import" href="../../paper-button/paper-button.html">
16   -
17   - <style is="custom-style" include="paper-date-picker-dialog-style">
18   - section {
19   - margin: 24px;
20   - }
21   - </style>
22   -</head>
23   -<body unresolved>
24   - <template is="dom-bind" id="scope">
25   - <section>
26   - <h1>{{dateFormat(date, 'LL')}}</h1>
27   - <paper-button class="btn" on-tap="showDialog" raised>Change Date</paper-button>
28   - <paper-dialog id="dialog" class="paper-date-picker-dialog" modal on-iron-overlay-closed="dismissDialog">
29   - <paper-date-picker id="picker" date="[[date]]"></paper-date-picker>
30   - <div class="buttons">
31   - <paper-button dialog-dismiss>Cancel</paper-button>
32   - <paper-button dialog-confirm>OK</paper-button>
33   - </div>
34   - </paper-dialog>
35   - </section>
36   - </template>
37   - <script>
38   - HTMLImports.whenReady(function() {
39   - var scope = Polymer.dom(document).querySelector('#scope');
40   - scope.dateFormat = function(date, format) {
41   - return moment(date).format(format);
42   - };
43   - scope.dismissDialog = function(event) {
44   - if (event.detail.confirmed) {
45   - scope.date = scope.$.picker.date;
46   - }
47   - };
48   - scope.showDialog = function() {
49   - this.$.dialog.toggle();
50   - };
51   - document.addEventListener('WebComponentsReady', function() {
52   - scope.date = new Date(2017, 3, 13);
53   - scope.showDialog();
54   - });
55   - });
56   - </script>
57   -</body>
58   -</html>
bower_components/paper-date-picker/demo/paper-calendar.html deleted
1   -<!doctype html>
2   -<html>
3   -<head>
4   - <meta charset="utf-8">
5   - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6   - <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
7   -
8   - <title>paper-date-picker Demo</title>
9   -
10   - <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
11   -
12   - <link rel="import" href="../paper-date-picker.html">
13   - <link rel="import" href="../../paper-styles/demo-pages.html">
14   - <link rel="import" href="../../paper-dialog/paper-dialog.html">
15   - <link rel="import" href="../../paper-button/paper-button.html">
16   -
17   - <style is="custom-style">
18   - section {
19   - margin: 24px;
20   - }
21   - h3 {
22   - text-align: center;
23   - }
24   - #container {
25   - margin: 0 auto;
26   - height: 300px;
27   - width: 300px;
28   - }
29   - </style>
30   -</head>
31   -<body unresolved>
32   - <template is="dom-bind" id="scope">
33   - <h3>{{dateFormat(date, 'LLL')}}</h3>
34   - <section>
35   - <div id="container">
36   - <paper-calendar id="picker" date="{{date}}"></paper-calendar>
37   - </div>
38   - </section>
39   - </template>
40   - <script>
41   - var scope = Polymer.dom(document).querySelector('#scope');
42   - scope.dateFormat = function(date, format) {
43   - if (!date) {
44   - return 'No date selected';
45   - }
46   - return moment(date).format(format);
47   - };
48   - scope.date = new Date(2017, 3, 13);
49   - </script>
50   -</body>
51   -</html>
bower_components/paper-date-picker/demo/paper-year-list.html deleted
1   -<!doctype html>
2   -<html>
3   - <head>
4   - <meta charset="utf-8">
5   - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6   - <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
7   -
8   - <title>paper-year-list Demo</title>
9   -
10   - <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
11   -
12   - <link rel="import" href="../paper-year-list.html">
13   - <link rel="import" href="../../paper-styles/demo-pages.html">
14   -
15   - </head>
16   -
17   - <body unresolved>
18   - <style>
19   - paper-year-list {
20   - height: 400px;
21   - width: 200px;
22   - }
23   - </style>
24   - <template is="dom-bind" id="scope">
25   - <paper-year-list id="yearList"></paper-year-list>
26   - <button on-tap="centerSelected">Center selected year</button>
27   - </template>
28   -
29   - <script>
30   - var scope = document.getElementById('scope');
31   - scope.centerSelected = function() {
32   - this.$.yearList.centerSelected();
33   - };
34   - </script>
35   - </body>
36   -</html>
bower_components/paper-date-picker/index.html deleted
1   -<!doctype html>
2   -<html>
3   -<head>
4   -
5   - <meta charset="utf-8">
6   - <meta name="viewport" content="width=device-width, initial-scale=1.0">
7   -
8   - <title>paper-date-picker</title>
9   -
10   - <script src="../webcomponentsjs/webcomponents-lite.js"></script>
11   - <link rel="import" href="../iron-component-page/iron-component-page.html">
12   -
13   -</head>
14   -<body>
15   -
16   - <iron-component-page></iron-component-page>
17   -
18   -</body>
bower_components/paper-date-picker/package.json deleted
1   -{
2   - "name": "paper-date-picker",
3   - "version": "1.1.2",
4   - "description": "Provides a responsive date picker based on the material design spec",
5   - "main": "index.html",
6   - "devDependencies": {
7   - "browser-sync": "^2.8.0",
8   - "del": "^1.2.0",
9   - "gulp": "^3.9.0",
10   - "gulp-add": "0.0.2",
11   - "gulp-bower": "0.0.10",
12   - "gulp-bump": "^0.3.1",
13   - "gulp-copy": "0.0.2",
14   - "gulp-filter": "^2.0.2",
15   - "gulp-gh-pages": "^0.5.2",
16   - "gulp-git": "^1.2.4",
17   - "gulp-tag-version": "^1.3.0",
18   - "merge-stream": "^0.1.8",
19   - "portfinder": "^0.4.0",
20   - "vinyl-paths": "^1.0.0",
21   - "web-component-tester": "^3.3.3"
22   - },
23   - "scripts": {
24   - "test": "echo \"Error: no test specified\" && exit 1"
25   - },
26   - "repository": {
27   - "type": "git",
28   - "url": "git+https://github.com/bendavis78/paper-date-picker.git"
29   - },
30   - "keywords": [
31   - "web-component",
32   - "webcomponents",
33   - "polymer",
34   - "datepicker",
35   - "paper-date-picker"
36   - ],
37   - "author": "Ben Davis <bendavis78@gmail.com>",
38   - "license": "MIT",
39   - "bugs": {
40   - "url": "https://github.com/bendavis78/paper-date-picker/issues"
41   - },
42   - "homepage": "https://github.com/bendavis78/paper-date-picker#readme"
43   -}
bower_components/paper-date-picker/paper-calendar.html deleted
1   -<link rel="import" href="../polymer/polymer.html">
2   -<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
3   -<link rel="import" href="../iron-icons/iron-icons.html">
4   -<link rel="import" href="../paper-button/paper-button.html">
5   -<link rel="import" href="../paper-styles/paper-styles.html">
6   -<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
7   -<link rel="import" href="../iron-selector/iron-selector.html">
8   -<link rel="import" href="../moment-element/moment-with-locales-import.html">
9   -
10   -<dom-module id="paper-calendar">
11   - <template>
12   - <style>
13   - :host {
14   - display: block;
15   - box-sizing: border-box;
16   - padding: 12px 0;
17   - position: relative;
18   - width: 100%;
19   - height: 100%;
20   - min-width: 160px;
21   - min-height: 160px;
22   - color: var(--primary-text-color);
23   - -webkit-font-smoothing: antialiased;
24   - -webkit-tap-highlight-color: rgba(0,0,0,0);
25   - --ease-in-sine: cubic-bezier(0.47, 0, 0.745, 0.715);
26   - --ease-out-sine: cubic-bezier(0.39, 0.575, 0.565, 1);
27   - @apply(--paper-font-body1);
28   - @apply(--paper-calendar);
29   - overflow: hidden;
30   - -webkit-touch-callout: none;
31   - -webkit-user-select: none;
32   - -khtml-user-select: none;
33   - -moz-user-select: none;
34   - -ms-user-select: none;
35   - user-select: none;
36   -
37   - @apply(--paper-calendar);
38   - }
39   - #calendar {
40   - position: relative;
41   - width: 100%;
42   - height: 100%;
43   - @apply(--layout-horizontal);
44   - }
45   - #months {
46   - height: 100%;
47   - @apply(--layout-horizontal);
48   - }
49   - #months.animating .month-nav {
50   - opacity: 1;
51   - }
52   - #months.animating {
53   - transition-property: transform, opacity;
54   - transition-duration: 300ms;
55   - }
56   - #months.animating.swipe {
57   - transition-timing-function: var(--ease-in-sine);
58   - --webkit-transition-timing-function: var(--ease-in-sine);
59   - }
60   - #months.animating.reset {
61   - transition-timing-function: var(--ease-out-sine);
62   - --webkit-transition-timing-function: var(--ease-out-sine);
63   - }
64   - .month {
65   - flex: 1;
66   - height: 100%;
67   - @apply(--layout-vertical);
68   - @apply(--layout-justified);
69   - }
70   -
71   - .month-row, .month-nav {
72   - height: calc(100%/8);
73   - box-sizing: border-box;
74   - padding: 0 calc(100%/36);
75   - }
76   -
77   - .month-col {
78   - position: relative;
79   - @apply(--layout-vertical);
80   - @apply(--layout-flex);
81   - }
82   -
83   - .month-nav {
84   - position: absolute;
85   - top: 0;
86   - left: 0;
87   - width: 100%;
88   - opacity: 1;
89   - }
90   - .month-nav .col {
91   - position: relative;
92   - @apply(--layout-vertical);
93   - @apply(--layout-center-center);
94   - }
95   - .month-nav .btn .icon {
96   - cursor: pointer;
97   - }
98   - .month-nav .btn .ripple {
99   - position: absolute;
100   - width: 48px;
101   - height: 48px;
102   - top: 50%;
103   - left: 50%;
104   - transform: translate(-50%, -50%);
105   - }
106   - .month-nav .btn.right {
107   - text-align: right;
108   - }
109   - .month-name {
110   - line-height: 24px;
111   - vertical-align: middle;
112   - text-align: center;
113   - font-weight: bold;
114   - @apply(--paper-font-body2);
115   - }
116   - .month-weekdays {
117   - color: var(--secondary-text-color);
118   - }
119   - .month-col .day {
120   - cursor: default;
121   - pointer-events: none;
122   - @apply(--layout-fit);
123   - @apply(--layout-vertical);
124   - @apply(--layout-center-center);
125   - }
126   - .day-item {
127   - flex: 1;
128   - object-fit: contain;
129   - }
130   - .day-item::selection {
131   - background: none;
132   - }
133   - .day-item .selection {
134   - fill: rgba(0,0,0,0);
135   - }
136   - .day-item.selected .selection {
137   - fill: var(--default-primary-color);
138   - }
139   - .day-item.selected + .day {
140   - color: var(--text-primary-color);
141   - }
142   - .day-item:not([disabled]) {
143   - cursor: pointer;
144   - }
145   - .day-item[disabled] + .day {
146   - color: var(--text-disabled-color, #9d9d9d);
147   - }
148   - .day-item.today + .day {
149   - color: var(--default-primary-color);
150   - }
151   - .day-item.selected.today + .day {
152   - color: var(--text-primary-color);
153   - }
154   - </style>
155   - <div id="calendar">
156   - <div id="months" on-track="_onTrack" class$="{{_contentClass}}">
157   - <template is="dom-repeat" items="{{_months}}" as="month">
158   - <div class$="{{_getMonthClass('month', month)}}">
159   - <div class="month-row month-name layout horizontal center-center flex">
160   - <span>{{dateFormat(month.date, 'MMMM YYYY', locale)}}</span>
161   - </div>
162   - <div class="month-row month-weekdays week layout horizontal justified flex">
163   - <template is="dom-repeat" items="{{_weekdays}}">
164   - <div class="month-col layout vertical flex">
165   - <div class="day">{{item.0}}</div>
166   - </div>
167   - </template>
168   - </div>
169   - <template is="dom-repeat" items="{{month.weeks}}" as="row">
170   - <div class="month-row layout horizontal justified flex">
171   - <template is="dom-repeat" items="{{row}}">
172   - <div class="month-col">
173   - <svg version="1.1" viewBox="0 0 100 100"
174   - class$="{{_getDayClass('day-item', item.date, today, date)}}"
175   - disabled$="{{_isDisabled(item.day, item.date, minDate, maxDate)}}"
176   - on-tap="_tapDay" date$="{{item.name}}">
177   - <circle cx="50" cy="50" r="49" class="selection"></circle>
178   - </svg>
179   - <div class="day">{{item.day}}</div>
180   - </div>
181   - </template>
182   - </div>
183   - </template>
184   - </div>
185   - </template>
186   - </div>
187   - <div id="monthNav" class="month-nav layout horizontal center">
188   - <div class="flex col self-stretch">
189   - <div class="btn" on-tap="_prevMonth">
190   - <paper-ripple center class="ripple circle"></paper-ripple>
191   - <iron-icon class="icon flex" icon="chevron-left"></iron-icon>
192   - </div>
193   - </div>
194   - <div class="flex-5"></div>
195   - <div class="flex col self-stretch">
196   - <div class="btn" on-tap="_nextMonth">
197   - <paper-ripple center class="ripple circle"></paper-ripple>
198   - <iron-icon class="icon flex" icon="chevron-right"></iron-icon>
199   - </div>
200   - </div>
201   - </div>
202   - </div>
203   - </template>
204   - <script>
205   - (function() {
206   -
207   - // Ignore movement within this distance (px)
208   - var WIGGLE_THRESHOLD = 4;
209   -
210   - // what constitues a flick (px/ms)
211   - var FLICK_SPEED = 0.5;
212   -
213   - // Factor for "springy" resistence effect when swiping too far.
214   - var RESIST_LENGTH = 40;
215   - var RESIST_FACTOR = 2;
216   -
217   - // Number of months to preload on both sides of the current month
218   - var PRELOAD_MONTHS = 1;
219   -
220   - Polymer({
221   - is: 'paper-calendar',
222   - properties: {
223   - /*
224   - * The selected date
225   - */
226   - date: {
227   - type: Date,
228   - notify: true,
229   - value: function() {
230   - return new Date();
231   - },
232   - observer: '_dateChanged'
233   - },
234   - /**
235   - * The current locale
236   - */
237   - locale: {
238   - type: String,
239   - value: 'en',
240   - notify: true,
241   - observer: '_localeChanged'
242   - },
243   - /**
244   - * The minimum allowed date
245   - */
246   - minDate: {
247   - type: Date,
248   - value: null
249   - },
250   - /**
251   - * The maximum allowed date
252   - */
253   - maxDate: {
254   - type: Date,
255   - value: null
256   - },
257   - /**
258   - * The currently selected month (1-12)
259   - */
260   - currentMonth: {
261   - type: Number
262   - },
263   - /**
264   - * The currently selected year
265   - */
266   - currentYear: {
267   - type: Number
268   - },
269   - _contentClass: String,
270   - _months: Array
271   - },
272   - behaviors: [
273   - Polymer.IronResizableBehavior
274   - ],
275   - observers: [
276   - '_populate(currentYear, currentMonth, minDate, maxDate, locale)',
277   - ],
278   - listeners: {
279   - 'iron-resize': '_resizeHandler',
280   - 'swiped': '_onSwipe'
281   - },
282   - ready: function() {
283   - this._updateToday();
284   - this.currentMonth = this.date.getMonth() + 1;
285   - this.currentYear = this.date.getFullYear();
286   - this._transitionEvent = this.style.WebkitTransition ? 'transitionEnd' : 'webkitTransitionEnd';
287   - },
288   - dateFormat: function(date, format, locale) {
289   - if (!date) {
290   - return '';
291   - }
292   - var value = moment(date);
293   - value.locale(locale || this.locale);
294   - return value.format(format);
295   - },
296   - _localeChanged: function(locale) {
297   - var localeMoment = moment();
298   - localeMoment.locale(locale);
299   - var weekdays = [];
300   - for (var i=0; i<7; i++) {
301   - weekdays.push(localeMoment.weekday(i).format('dd'));
302   - }
303   - this._weekdays = weekdays;
304   - this._firstDayOfWeek = localeMoment.weekday(0).format('d');
305   - },
306   - _populate: function(currentYear, currentMonth, minDate, maxDate) {
307   - var date, month, weeks, day, d, dayInfo, monthData, months = [];
308   -
309   - // Make sure currentYear/currentMonth are in min/max range
310   - if (minDate && new Date(currentYear, currentMonth, 0) < minDate) {
311   - this.currentYear = minDate.getFullYear();
312   - this.currentMonth = minDate.getMonth() + 1;
313   - return;
314   - } else if (maxDate && new Date(currentYear, currentMonth - 1, 1) > maxDate) {
315   - this.currentYear = maxDate.getFullYear();
316   - this.currentMonth = maxDate.getMonth() + 1;
317   - return;
318   - }
319   -
320   - for (var i=-PRELOAD_MONTHS; i<=PRELOAD_MONTHS; i++) {
321   - weeks = [[]];
322   - day = 1;
323   - date = new Date(currentYear, currentMonth - 1 + i, 1);
324   - month = date.getMonth();
325   - monthData = {
326   - year: date.getFullYear(),
327   - month: date.getMonth() + 1,
328   - date: new Date(date)
329   - };
330   -
331   - if (!this._monthWithinValidRange(monthData.year, monthData.month)) {
332   - continue;
333   - }
334   -
335   - // add "padding" days
336   - var firstDay = date.getDay() - this._firstDayOfWeek;
337   - if (firstDay < 0) {
338   - firstDay = 7 + firstDay;
339   - }
340   - for (d=0; d<firstDay; d++) {
341   - weeks[0].push({day: null, date: null});
342   - }
343   -
344   - // add actual days
345   - while (date.getMonth() === month) {
346   - if (weeks[0].length && d % 7 === 0) {
347   - // start new week
348   - weeks.push([]);
349   - }
350   - dayInfo = {
351   - date: new Date(date.getFullYear(), month, day),
352   - name: this.dateFormat(date,'YYYY-MM-DD'),
353   - year: currentYear,
354   - month: month,
355   - day: day,
356   - };
357   - weeks[weeks.length-1].push(dayInfo);
358   - date.setDate(++day);
359   - d++;
360   - }
361   -
362   - // add remaining "padding" days
363   - while (d < 42) {
364   - if (d % 7 === 0) {
365   - weeks.push([]);
366   - }
367   - weeks[weeks.length-1].push({day: null, date: null});
368   - d += 1;
369   - }
370   -
371   - monthData.weeks = weeks;
372   - months.push(monthData);
373   - }
374   - if (!months.length) {
375   - return;
376   - }
377   - this.set('_months', months);
378   - this._positionSlider();
379   - },
380   - _getDayClass: function(cssClass, date) {
381   - if (!date) {
382   - return cssClass;
383   - }
384   - if (date.getTime() === this.today.getTime()) {
385   - cssClass += ' today';
386   - }
387   - if (this.date && this.date.getTime() === date.getTime()) {
388   - cssClass += ' selected';
389   - }
390   - return cssClass;
391   - },
392   - _isDisabled: function(day, date) {
393   - return !day || !this._withinValidRange(date);
394   - },
395   - _getMonthClass: function(name, month) {
396   - return name + ' month-' + month.year + '-' + month.month;
397   - },
398   - _onTrack: function(event) {
399   - var detail = event.detail;
400   - var state = detail.state;
401   - var dx = event.detail.dx;
402   - var dy = event.detail.dy;
403   - var adx = Math.abs(dx);
404   - var ady = Math.abs(dy);
405   - var width = this._containerWidth;
406   -
407   - if (state === 'start') {
408   - this._trackStartTime = (new Date()).getTime();
409   - this._startPos = this._currentPos;
410   - this._moveQueue = [];
411   - }
412   -
413   - var x = this._startPos + dx;
414   - if (state === 'track') {
415   - if (this._moveQueue.length >= 4) {
416   - this._moveQueue.shift();
417   - }
418   - this._moveQueue.push(event);
419   -
420   - // ignore movement within WIGGLE_THRESHOLD
421   - var distance = Math.sqrt((dx * dx) + (dy * dy));
422   - if (!this._gesture && distance > WIGGLE_THRESHOLD) {
423   - this._gesture = adx > ady ? 'pan-x' : 'pan-y';
424   - }
425   -
426   - // only drag during pan-x gesture
427   - if (this._gesture !== 'pan-x') {
428   - return;
429   - }
430   -
431   - this._dragging = true;
432   - var fullWidth = width * this._months.length;
433   -
434   - // If we're dragging outside the bounds, add some resistence
435   - if (x > 0 || x < (-fullWidth + width)) {
436   - if (isNaN(parseInt(this._resistStart))) {
437   - this._resistStart = adx;
438   - }
439   - var rdx = adx - this._resistStart;
440   - var p, d, max = RESIST_LENGTH;
441   - p = rdx > width ? 1 : rdx / width;
442   - d = max * (1 - Math.pow(1 - p, RESIST_FACTOR));
443   - x = (dx < 0 ? -this._scrollWidth + width - d : d);
444   - } else {
445   - this._resistStart = null;
446   - }
447   - this._translateX(x);
448   - }
449   - if (state === 'end') {
450   - this._resistStart = null;
451   - var lastIdx = this._getMonthIdx(this._startPos);
452   - var idx = this._getMonthIdx(this._currentPos);
453   - var speed = this._getFastestMovement(event).v;
454   - var move = idx !== lastIdx || speed > FLICK_SPEED;
455   - if (!this._resistStart && this._gesture === 'pan-x' && move) {
456   - if (speed > FLICK_SPEED) {
457   - // calculate an ideal transition duration based on current speed of swipe
458   - var remainingDistance = width - adx;
459   - var newDuration = remainingDistance / speed;
460   - if (newDuration > 300) {
461   - newDuration = 300;
462   - }
463   - this._transitionDuration = newDuration;
464   - }
465   -
466   - var newX = width * idx * -1;
467   - var direction = (dx < 0) ? 'left' : 'right';
468   -
469   - this._translateX(newX, 'swipe', function() {
470   - this.set('_contentClass', '');
471   - this.transform('translateX(' + this._startPos + 'px)', this.$.months);
472   - this.fire('swiped', {direction: direction});
473   - }.bind(this));
474   - } else {
475   - this._translateX(this._startPos, 'reset');
476   - }
477   - this._gesture = null;
478   - }
479   - },
480   - _getMonthIdx: function(pos) {
481   - // returns the index for the visible month according to the given position
482   - var width = this._containerWidth;
483   - var i = Math.floor((-pos + (width/2)) / width);
484   - return i < 0 ? 0 : i;
485   - },
486   - _translateX: function(x, transition, cb) {
487   - if (isNaN(parseInt(x))) {
488   - throw new Error('Not a number: ' + x);
489   - }
490   - this._currentPos = x;
491   - if (transition) {
492   - if (this._transitionDuration) {
493   - this.$.months.style.transitionDuration = this._transitionDuration + 'ms';
494   - }
495   - this._once(this._transitionEvent, function() {
496   - this.set('_contentClass', '');
497   - this.$.months.style.transitionDuration = '';
498   - this._transitionDuration = null;
499   - this.$.monthNav.style.removeProperty('opacity');
500   - if (cb) {
501   - cb();
502   - }
503   - }.bind(this), this.$.months);
504   - this.set('_contentClass', 'animating ' + transition);
505   - this.$.monthNav.style.removeProperty('opacity');
506   - // Fixes odd bug in chrome where we lose touch-events after changing opacity
507   - this._once('touchstart', function() {});
508   - }
509   - window.requestAnimationFrame(function() {
510   - if (!transition) {
511   - var halfWidth = this._containerWidth / 2;
512   - var dx = Math.abs(this._startPos - x);
513   - var p = (1 - (dx / halfWidth)) * 100;
514   - p = (100 - Math.pow(p, 2)) / 100 / 100;
515   - var opacity = Math.abs(parseFloat(p).toFixed(2));
516   - this.$.monthNav.style.opacity = opacity;
517   - }
518   - this.transform('translateX(' + x + 'px)', this.$.months);
519   - }.bind(this));
520   - },
521   - _getFastestMovement: function(event) {
522   - // detect flick based on fastest segment of movement
523   - var l = this._moveQueue.length;
524   - var dt, tx, ty, tv, x = 0, y = 0, v = 0;
525   - for (var i = 0, m; i < l && (m = this._moveQueue[i]); i++) {
526   - dt = event.timeStamp - m.timeStamp;
527   - tx = (event.detail.x - m.detail.x) / dt;
528   - ty = (event.detail.y - m.detail.y) / dt;
529   - tv = Math.sqrt(tx * tx + ty * ty);
530   - if (tv > v) {
531   - x = tx;
532   - y = ty;
533   - v = tv;
534   - }
535   - }
536   - return {x: x, y: y, v: v};
537   - },
538   - _onSwipe: function(event) {
539   - if (event.detail.direction === 'right') {
540   - this._prevMonth();
541   - } else {
542   - this._nextMonth();
543   - }
544   - },
545   - _once: function(eventName, callback, node) {
546   - node = node || this;
547   - function onceCallback() {
548   - node.removeEventListener(eventName, onceCallback);
549   - callback.apply(null, arguments);
550   - }
551   - node.addEventListener(eventName, onceCallback);
552   - },
553   - _incrMonth: function(i) {
554   - var date = new Date(this.currentYear, this.currentMonth - 1 + i);
555   - var year = date.getFullYear();
556   - var month = date.getMonth() + 1;
557   - if (this._monthWithinValidRange(year, month)) {
558   - this.currentYear = year;
559   - this.currentMonth = month;
560   - }
561   - },
562   - _prevMonth: function() {
563   - this._incrMonth(-1);
564   - },
565   - _nextMonth: function() {
566   - this._incrMonth(1);
567   - },
568   - _dateChanged: function(date, oldValue) {
569   - if (!this._isValidDate(date)) {
570   - console.warn('Invalid date: ' + date);
571   - this.date = date = oldValue;
572   - }
573   - if (!this._withinValidRange(date)) {
574   - console.warn('Date outside of valid range: ' + date);
575   - this.date = date = oldValue;
576   - }
577   - this.currentYear = date.getFullYear();
578   - this.currentMonth = date.getMonth() + 1;
579   - if (oldValue && date.getTime && oldValue.getTime && date.getTime() === oldValue.getTime()) {
580   - return;
581   - }
582   - // clone the date object so as not to have unintended effects on bindings
583   - date = new Date(date.getTime());
584   - date.setHours(0, 0, 0, 0);
585   - this.set('date', date);
586   - },
587   - _tapDay: function(event) {
588   - if (!this._withinValidRange(event.model.item.date)) {
589   - return false;
590   - }
591   - this.date = event.model.item.date;
592   - },
593   - _isValidDate: function(date) {
594   - return date && date.getTime && !isNaN(date.getTime());
595   - },
596   - _withinValidRange: function(date) {
597   - if (this._isValidDate(date)) {
598   - return (!this.minDate || date >= this.minDate) && (!this.maxDate || date <= this.maxDate);
599   - }
600   - return false;
601   - },
602   - _monthWithinValidRange: function(year, month) {
603   - var monthStart = new Date(year, month-1, 1);
604   - var monthEnd = new Date(year, month, 0);
605   - return this._withinValidRange(monthStart) || this._withinValidRange(monthEnd);
606   - },
607   - _positionSlider: function() {
608   - if (!this._months || !this._containerWidth) {
609   - return;
610   - }
611   - this._scrollWidth = (this.$.calendar.offsetWidth * this._months.length);
612   - this.$.months.style.minWidth = this._scrollWidth + 'px';
613   - var i = ((this.currentYear * 12) + this.currentMonth) -
614   - ((this._months[0].year * 12) + this._months[0].month);
615   - this._translateX(-i * this._containerWidth);
616   - },
617   - _resizeHandler: function() {
618   - this._containerWidth = this.$.calendar.offsetWidth;
619   - this._positionSlider();
620   - },
621   - _getDayName: function(date) {
622   - return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
623   - },
624   - _updateToday: function() {
625   - this.today = new Date();
626   - this.today.setHours(0, 0, 0, 0);
627   - },
628   - });
629   - })();
630   - </script>
631   -</dom-module>
bower_components/paper-date-picker/paper-date-picker-dialog-style.html deleted
1   -<style is="custom-style">
2   -/* mixin definitions */
3   -:root {
4   - --paper-date-picker-dialog: {
5   - margin: 0;
6   - max-height: 520px !important;
7   - };
8   - --paper-date-picker-dialog-picker: {
9   - margin-top: 0 !important;
10   - padding: 0;
11   - };
12   - --paper-date-picker-dialog-calendar: {
13   - padding-bottom: 0;
14   - };
15   - --paper-date-picker-dialog-heading: {
16   - margin-bottom: -56px;
17   - };
18   -}
19   -</style>
20   -
21   -<dom-module id="paper-date-picker-dialog-style">
22   - <template>
23   - <style>
24   - /* Application of mixins to local .paper-date-picker-dialog elements */
25   - .paper-date-picker-dialog {
26   - @apply(--paper-date-picker-dialog);
27   - }
28   - .paper-date-picker-dialog > paper-date-picker {
29   - --paper-calendar: {
30   - @apply(--paper-date-picker-dialog-calendar);
31   - };
32   - @apply(--paper-date-picker-dialog-picker);
33   - }
34   - .paper-date-picker-dialog > paper-date-picker:not([narrow]) {
35   - --paper-date-picker-heading: {
36   - @apply(--paper-date-picker-dialog-heading);
37   - };
38   - }
39   - </style>
40   - </template>
41   -</dom-module>
bower_components/paper-date-picker/paper-date-picker.html deleted
1   -<link rel="import" href="../polymer/polymer.html">
2   -<link rel="import" href="../iron-media-query/iron-media-query.html">
3   -<link rel="import" href="../neon-animation/neon-animated-pages.html">
4   -<link rel="import" href="../neon-animation/neon-animatable.html">
5   -<link rel="import" href="../neon-animation/animations/fade-in-animation.html">
6   -<link rel="import" href="../neon-animation/animations/fade-out-animation.html">
7   -<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
8   -<link rel="import" href="../iron-selector/iron-selector.html">
9   -<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
10   -<link rel="import" href="../paper-styles/paper-styles.html">
11   -<link rel="import" href="../moment-element/moment-with-locales-import.html">
12   -<link rel="import" href="paper-calendar.html">
13   -<link rel="import" href="paper-date-picker-dialog-style.html">
14   -<link rel="import" href="paper-year-list.html">
15   -
16   -<!--
17   -Material Design [Pickers](http://www.google.com/design/spec/components/pickers.html)
18   -
19   -Provides a responsive date picker based on the material design spec.
20   -
21   -## Examples:
22   -
23   -Default picker:
24   -
25   - <paper-date-picker></paper-date-picker>
26   -
27   -Setting the initial date to April 20, 2015:
28   -
29   - <paper-date-picker date="April 20, 2015"></paper-date-picker>
30   -
31   -You may also specify a minimum and/or maximum date allowed in this picker using
32   -the same date notation:
33   -
34   - <paper-date-picker min-date="April 1, 2015" max-date="June 30, 2015"></paper-date-picker>
35   -
36   -If you include this element as part of `paper-dialog`, use the class
37   -`"paper-date-picker-dialog"` on the dialog element in order to give it proper
38   -styling:
39   -
40   - <paper-dialog id="dialog" class="paper-date-picker-dialog" modal
41   - on-iron-overlay-closed="dismissDialog">
42   - <paper-date-picker id="picker" date="[[date]]"></paper-date-picker>
43   - <div class="buttons">
44   - <paper-button dialog-dismiss>Cancel</paper-button>
45   - <paper-button dialog-confirm>OK</paper-button>
46   - </div>
47   - </paper-dialog>
48   -
49   -@element paper-date-picker
50   -@blurb Provides a responsive date picker based on the material design spec.
51   -@homepage http://bendavis78.github.io/paper-date-picker/
52   -@demo demo/index.html
53   --->
54   -
55   -<style is="custom-style" include="paper-date-picker-dialog-style">
56   - /* includes dialog style at document-level for backward compatibility */
57   -</style>
58   -
59   -<dom-module id="paper-date-picker">
60   - <template>
61   - <style>
62   - :host {
63   - -webkit-touch-callout: none;
64   - -webkit-user-select: none;
65   - -khtml-user-select: none;
66   - -moz-user-select: none;
67   - -ms-user-select: none;
68   - user-select: none;
69   - display: inline-block;
70   - color: var(--primary-text-color);
71   - @apply(--paper-font-body1);
72   - @apply(--paper-date-picker);
73   - }
74   -
75   - /** Landscape ******************/
76   - #datePicker {
77   - width: 512px;
78   - height: 248px;
79   - @apply(--layout-horizontal);
80   - }
81   - #heading {
82   - width: 168px;
83   - @apply(--paper-date-picker-heading);
84   - }
85   -
86   - /** Narrow *********************/
87   - :host([narrow]) #datePicker {
88   - width: 328px;
89   - height: 428px;
90   - @apply(--layout-vertical);
91   - }
92   - :host([narrow]) #heading {
93   - width: auto;
94   - height: 96px;
95   - padding: 16px 24px;
96   - }
97   -
98   - /** Heading ********************/
99   - #heading {
100   - padding: 16px;
101   - box-sizing: border-box;
102   - color: var(--text-primary-color);
103   - background: var(--default-primary-color);
104   - @apply(--layout-vertical);
105   - @apply(--layout-around-justfied);
106   - }
107   - #heading .date,
108   - #heading .year {
109   - cursor: pointer;
110   - }
111   - #heading .date {
112   - @apply(--paper-font-display1);
113   - font-weight: bold;
114   - margin-top: 2px;
115   - @apply(--paper-date-picker-heading-date);
116   - }
117   - #heading div.date {
118   - letter-spacing: 0.025em;
119   - }
120   - #heading .date span {
121   - white-space: nowrap;
122   - }
123   - #heading .year {
124   - @apply(--paper-font-body2);
125   - font-size: 16px;
126   - @apply(--paper-date-picker-heading-date);
127   - }
128   - #heading:not(.pg-chooseYear) .year,
129   - #heading.pg-chooseYear .date {
130   - color: var(--light-primary-color);
131   - }
132   -
133   - /** Calendar/Year picker ********/
134   - :host([isTouch]) paper-year-list::-webkit-scrollbar {
135   - width: 0 !important;
136   - }
137   - #pages {
138   - flex: 1;
139   - width: auto;
140   - background: var(--default-background-color);
141   - }
142   - #calendar {
143   - --paper-calendar: {
144   - @apply(--paper-date-picker-calendar);
145   - }
146   - }
147   - </style>
148   - <iron-media-query query="{{_getMediaQuery(forceNarrow, responsiveWidth)}}" query-matches="{{_queryMatches}}"></iron-media-query>
149   - <div id="datePicker">
150   - <div id="heading" class$="{{_getHeadingClass('heading-content', _selectedPage)}}">
151   - <div class="year" on-tap="_tapHeadingYear">{{dateFormat(date, 'YYYY', locale)}}</div>
152   - <div class="date" on-tap="_tapHeadingDate">
153   - <template is="dom-repeat" items="{{_splitHeadingDate(date, headingFormat, locale)}}">
154   - <span>{{item}}</span>
155   - </template>
156   - </div>
157   - </div>
158   - <neon-animated-pages id="pages" selected="{{_selectedPage}}" attr-for-selected="id"
159   - entry-animation="fade-in-animation" exit-animation="fade-out-animation">
160   - <neon-animatable id="chooseDate">
161   - <paper-calendar id="calendar" locale="{{locale}}" date="{{date}}"
162   - min-date="{{minDate}}" max-date="{{maxDate}}">
163   - </paper-calendar>
164   - </neon-animatable>
165   - <neon-animatable id="chooseYear">
166   - <paper-year-list id="yearList" date="{{date}}" on-tap="_tapHeadingDate" min="[[_minYear]]" max="[[_maxYear]]"></paper-year-list>
167   - </neon-animatable>
168   - </neon-animated-pages>
169   - </div>
170   - </template>
171   - <script>
172   -
173   - Polymer({
174   - is: 'paper-date-picker',
175   - properties: {
176   - /**
177   - * The selected date (YYYY-MM-DD)
178   - */
179   - date: {
180   - type: Date,
181   - notify: true
182   - },
183   - /**
184   - * Maximum screen width at which the picker uses a vertical layout
185   - */
186   - responsiveWidth: {
187   - type: String,
188   - value: '560px'
189   - },
190   - /**
191   - * The current locale
192   - */
193   - locale: {
194   - type: String,
195   - value: 'en'
196   - },
197   - /**
198   - * The format of the date displayed in the heading.
199   - * See docuemntation for Moment.js for more info.
200   - */
201   - headingFormat: {
202   - type: String,
203   - value: 'ddd, MMM D'
204   - },
205   - /**
206   - * The minimum allowed date
207   - */
208   - minDate: {
209   - type: Date,
210   - value: null
211   - },
212   - /**
213   - * The maximum allowed date
214   - */
215   - maxDate: {
216   - type: Date,
217   - value: null
218   - },
219   - /**
220   - * Force narrow layout
221   - */
222   - forceNarrow: {
223   - type: Boolean,
224   - value: false
225   - },
226   - narrow: {
227   - type: Boolean,
228   - reflectToAttribute: true,
229   - notify: true,
230   - computed: '_computeNarrow(forceNarrow, _queryMatches)'
231   - },
232   - isTouch: {
233   - type: Boolean,
234   - value: false,
235   - readOnly: true,
236   - reflectToAttribute: true
237   - },
238   - _queryMatches: {
239   - type: Boolean,
240   - value: false
241   - },
242   - headingBreak: {
243   - type: String,
244   - value: '[,]'
245   - },
246   - _selectedPage: String,
247   - _maxYear: {
248   - type: Number,
249   - computed: '_getFullYear(maxDate)'
250   - },
251   - _minYear: {
252   - type: Number,
253   - computed: '_getFullYear(minDate)'
254   - }
255   - },
256   - behaviors: [
257   - Polymer.IronResizableBehavior
258   - ],
259   - listeners: {
260   - 'iron-resize': '_resizeHandler'
261   - },
262   - ready: function() {
263   - this.today = this.$.calendar.today;
264   - this.isTouch = 'ontouchstart' in window;
265   - this._selectPage('chooseDate');
266   - },
267   - dateFormat: function() {
268   - return this.$.calendar.dateFormat.apply(this.$.calendar, arguments);
269   - },
270   - _tapHeadingDate: function() {
271   - if (this.$.pages.selected !== 'chooseDate') {
272   - this._selectPage('chooseDate');
273   - }
274   - },
275   - _tapHeadingYear: function() {
276   - if (this.$.pages.selected !== 'chooseYear') {
277   - this._selectPage('chooseYear');
278   - this.$.yearList.centerSelected();
279   - }
280   - },
281   - _selectPage: function(page) {
282   - this.$.pages.selected = page;
283   - },
284   - _getMediaQuery: function(forceNarrow, responsiveWidth) {
285   - return '(max-width: ' + (forceNarrow ? '' : responsiveWidth) + ')';
286   - },
287   - _getHeadingClass: function(pfx, selectedPage) {
288   - return pfx + ' pg-' + selectedPage;
289   - },
290   - _getFullYear: function(date) {
291   - return date ? date.getFullYear() : null;
292   - },
293   - _splitHeadingDate: function(date, format, locale) {
294   - var re = new RegExp(this.headingBreak, 'g');
295   - var text = this.dateFormat(date, format, locale);
296   - var seps = text.match(re);
297   - var value;
298   - if (!seps) {
299   - value = [text];
300   - } else {
301   - value = text.split(re).map(function(s, i) {
302   - return s + (seps[i] || '');
303   - });
304   - }
305   - return value;
306   - },
307   - _computeNarrow: function(queryMatches, forceNarrow) {
308   - return queryMatches || forceNarrow;
309   - },
310   - _resizeHandler: function() {
311   - if (this._resizing) {
312   - return;
313   - }
314   - this._resizing = true;
315   - this.$.calendar.notifyResize();
316   - this._resizing = false;
317   -
318   - this.updateStyles();
319   - }
320   - });
321   - </script>
322   -</dom-module>
bower_components/paper-date-picker/paper-year-list.html deleted
1   -<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
2   -<link rel="import" href="../iron-list/iron-list.html">
3   -<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
4   -<link rel="import" href="../paper-ripple/paper-ripple.html">
5   -<link rel="import" href="../paper-styles/default-theme.html">
6   -<link rel="import" href="../polymer/polymer.html">
7   -
8   -<dom-module id="paper-year-list">
9   - <template>
10   - <style>
11   - :host {
12   - display: block;
13   - box-sizing: border-box;
14   - height: 100%;
15   - @apply(--paper-font-common-base);
16   - /* for iron-list to fit */
17   - position: relative;
18   - }
19   - .year {
20   - cursor: pointer;
21   - height: var(--paper-year-list-item-height, 44px);
22   - line-height: var(--paper-year-list-item-height, 44px);
23   - text-align: center;
24   - vertical-align: middle;
25   - }
26   - .selected {
27   - color: var(--default-primary-color);
28   - font-size: 24px;
29   - }
30   - iron-list {
31   - @apply(--layout-fit);
32   - }
33   - </style>
34   - <iron-list id="yearList" items="[[_years]]">
35   - <template>
36   - <div class$="year{{_addSelectedClass(selected)}}" on-tap="_tappedYearHandler">
37   - [[item.year]]
38   - </div>
39   - </template>
40   - </iron-list>
41   - </template>
42   - <script>
43   - Polymer({
44   - is: 'paper-year-list',
45   - properties: {
46   - date: {
47   - type: Date,
48   - notify: true,
49   - observer: '_dateChange'
50   - },
51   - /**
52   - * Maximum allowed year.
53   - */
54   - max: {
55   - type: Number,
56   - value: 2100,
57   - observer: '_maxChange'
58   - },
59   - /**
60   - * Minimum allowed year.
61   - */
62   - min: {
63   - type: Number,
64   - value: 1900,
65   - observer: '_minChange'
66   - },
67   - /**
68   - * The selected year, sync with the year of the given date
69   - * or null if year isn't within range.
70   - */
71   - selected: {
72   - type: Number,
73   - notify: true,
74   - observer: '_selectedChange'
75   - },
76   - /**
77   - * The allowed years array.
78   - */
79   - _years: {
80   - type: Array,
81   - computed: '_computeYears(min, max)',
82   - readOnly: true,
83   - value: function() {
84   - return Date.now().getFullYear;
85   - }
86   - }
87   - },
88   - ready: function() {
89   - // hack for iron-list not to scroll to the first visible index on resize
90   - this.$.yearList._resizeHandler = function() {
91   - this.debounce('resize', function() {
92   - this._render();
93   - if (this._itemsRendered && this._physicalItems && this._isVisible) {
94   - this._resetAverage();
95   - this.updateViewportBoundaries();
96   - }
97   - });
98   - }.bind(this.$.yearList);
99   - },
100   - /**
101   - * Scroll in the years list to center the selected year.
102   - */
103   - centerSelected: function() {
104   - if (this.selected != null) {
105   - var selectedYearIdx = this.selected - this.min;
106   - this.$.yearList.scrollToIndex(selectedYearIdx);
107   - // see https://github.com/PolymerElements/iron-list/issues/140
108   - this.$.yearList._render();
109   - this.async(function() {
110   - var selectedPos = selectedYearIdx * this._physicalAverage + 1;
111   - if (selectedPos != this.scrollTop) {
112   - this._update();
113   - this.scrollTop = selectedPos;
114   - this._refresh();
115   - }
116   - if (this.scrollHeight - this.offsetHeight != this.scrollTop) {
117   - this.scrollTop += (this._physicalAverage - this.offsetHeight) / 2;
118   - this._refresh();
119   - }
120   - }.bind(this.$.yearList));
121   - }
122   - },
123   - /**
124   - * Return the selected class if needed.
125   - */
126   - _addSelectedClass(selected) {
127   - if (selected) {
128   - return ' selected';
129   - }
130   - },
131   - /**
132   - * Compute the years array passed to the iron-list.
133   - */
134   - _computeYears: function(min, max) {
135   - if (!(typeof min == 'number') || !(typeof max == 'number')) {
136   - return;
137   - }
138   - var years = [];
139   - for (;min <= max; min++) {
140   - years.push({year: min});
141   - }
142   - return years;
143   - },
144   - /**
145   - * Set 'selected' attribute to the new date's year if it is within range, else set it to null.
146   - */
147   - _dateChange: function(date) {
148   - var newYear = date.getFullYear();
149   - this.selected = this._withinRange(newYear) ? newYear : null;
150   - },
151   - _maxChange: function(max) {
152   - if (!(typeof max == 'number')) {
153   - this.max = 2100;
154   - }
155   - },
156   - _minChange: function(min) {
157   - if (!(typeof min == 'number')) {
158   - this.min = 1900;
159   - }
160   - },
161   - /**
162   - * If selected is null, clear iron-list selection,
163   - * else select it in iron-list and synchronize 'date' attribute.
164   - */
165   - _selectedChange: function(selected) {
166   - if (selected == null) {
167   - this.$.yearList.clearSelection();
168   - return;
169   - }
170   - if (selected != this.date.getFullYear()) {
171   - // set the year using a new Date instance for notifying to work
172   - this.date = new Date(this.date.setFullYear(selected));
173   - }
174   - this._selectYearInList(selected);
175   - },
176   - /**
177   - * Select the given year in the years list.
178   - */
179   - _selectYearInList: function(year) {
180   - var yearIdx = year - this.min;
181   - this.$.yearList.selectItem(yearIdx);
182   - },
183   - /**
184   - * Update 'selected' attribute and select in iron-list
185   - * from a tapped item's event in the years list.
186   - */
187   - _tappedYearHandler: function(e) {
188   - var yearItem = e.model.__data__.item;
189   - var year = yearItem.year;
190   - if (this.selected != year) {
191   - this.$.yearList.selectItem(yearItem);
192   - this.selected = year;
193   - }
194   - },
195   - /**
196   - * Return true if year is between min and max.
197   - */
198   - _withinRange: function(year) {
199   - return !(this.min && year < this.min || this.max && year > this.max );
200   - },
201   - behaviors: [
202   - Polymer.IronResizableBehavior
203   - ]
204   - });
205   - </script>
206   -</dom-module>