Source: setting-time/setting-time.js

'use strict';

  new ExceptionHandler();

  /**
   * Polymer element for selecting a time
   * @namespace SettingTime
   */
  Polymer({
    is: 'setting-time',

    behaviors: [
      Chrome.LocalizeBehavior,
    ],

    properties: {
      /**
       * Local storage key
       * @memberOf SettingTime
       */
      name: {
        type: String,
        value: 'store',
      },

      /**
       * Time value '00:00' format
       * @memberOf SettingTime
       */
      value: {
        type: String,
        value: '00:00',
        observer: '_valueChanged',
      },

      /**
       * Time display label
       * @memberOf SettingTime
       */
      timeLabel: {
        type: String,
        value: '12:00 AM',
      },

      /**
       * Display format 12/24 hr
       * @memberOf SettingTime
       */
      format: {
        type: Number,
        value: 1,
        notify: true,
        observer: '_formatChanged',
      },

      /**
       * Descriptive label
       * @memberOf SettingTime
       */
      mainLabel: {
        type: String,
        value: '',
      },

      /**
       * Secondary descriptive label
       * @memberOf SettingTime
       */
      secondaryLabel: {
        type: String,
        value: '',
      },

      /**
       * Optional group title
       * @memberOf SettingTime
       */
      sectionTitle: {
        type: String,
        value: '',
      },

      /**
       * Disabled state of element
       * @memberOf SettingTime
       */
      disabled: {
        type: Boolean,
        value: false,
      },

      /**
       * Visibility state of optional divider
       * @memberOf SettingTime
       */
      noseparator: {
        type: Boolean,
        value: false,
      },
    },

    /**
     * Event: Show dialog on tap
     * @private
     * @memberOf SettingTime
     */
    _onTap: function() {
      if (!this.disabled) {
        this.$.dialog.open();
      }
    },

    /**
     * Event: Set time on tap of OK button
     * @private
     * @memberOf SettingTime
     */
    _onTimeSelected: function() {
      const picker = this.$.timePicker;
      const hour = ('0' + picker.hour).substr(-2);
      const min = ('0' + picker.minute).substr(-2);
      const value = `${hour}:${min}`;
      this.set('value', value);
      Chrome.GA.event(Chrome.GA.EVENT.BUTTON, `SettingTime.OK: ${this.name}`);
    },

    /**
     * Observer: Value changed
     * @param {string} newValue - value we changed to
     * @private
     * @memberOf SettingTime
     */
    _valueChanged: function(newValue) {
      this._setTimeLabel(newValue);
    },

    /**
     * Observer: Global Time format changed
     * @private
     * @memberOf SettingTime
     */
    _formatChanged: function() {
      this._setTimeLabel(this.get('value'));
    },

    /**
     * Get the time suitable for display
     * @param {string} timeString - format '00:00'
     * @returns {string} formatted time
     * @private
     * @memberOf SettingTime
     */
    _formatTime: function(timeString) {
      let ret = '12:00 AM';
      if (timeString) {
        ret = Chrome.Time.getStringFull(timeString, this.format);
      } else {
        Chrome.Log.error('timeString is null', 'setting-time._formatTime');
      }
      return ret;
    },

    /**
     * Set the time display label
     * @param {string} value - time in '00:00' format
     * @private
     * @memberOf SettingTime
     */
    _setTimeLabel: function(value) {
      this.set('timeLabel', this._formatTime(value));
    },

    /**
     * Initialize value if it is not in localstorage
     * @private
     * @memberOf SettingTime
     */
    _init: function() {
      this.set('value', '00:00');
    },

  });