blob: 1e7746d28c4daa15bb39f98c8e036a0bc319fd6d [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
Polymer({
is: 'print-preview-other-options-settings',
behaviors: [SettingsBehavior, I18nBehavior],
properties: {
disabled: Boolean,
/**
* @private {!Array<!{name: string,
* label: string,
* value: (boolean | undefined),
* managed: (boolean | undefined),
* available: (boolean | undefined)}>}
*/
options_: {
type: Array,
value: function() {
return [
{name: 'headerFooter', label: 'optionHeaderFooter'},
{name: 'cssBackground', label: 'optionBackgroundColorsAndImages'},
{name: 'rasterize', label: 'optionRasterize'},
{name: 'selectionOnly', label: 'optionSelectionOnly'},
];
},
},
/**
* The index of the checkbox that should display the "Options" title.
* @private {number}
*/
firstIndex_: {
type: Number,
value: 0,
},
},
observers: [
'onHeaderFooterSettingChange_(settings.headerFooter.*)',
'onCssBackgroundSettingChange_(settings.cssBackground.*)',
'onRasterizeSettingChange_(settings.rasterize.*)',
'onSelectionOnlySettingChange_(settings.selectionOnly.*)',
],
/** @private {!Map<string, ?number>} */
timeouts_: new Map(),
/** @private {!Map<string, boolean>} */
previousValues_: new Map(),
/**
* @param {string} settingName The name of the setting to updated.
* @param {boolean} newValue The new value for the setting.
*/
updateSettingWithTimeout_: function(settingName, newValue) {
const timeout = this.timeouts_.get(settingName);
if (timeout != null) {
clearTimeout(timeout);
}
this.timeouts_.set(
settingName, setTimeout(() => {
this.timeouts_.delete(settingName);
if (this.previousValues_.get(settingName) == newValue) {
return;
}
this.previousValues_.set(settingName, newValue);
this.setSetting(settingName, newValue);
// For tests only
this.fire('update-checkbox-setting', settingName);
}, 200));
},
/**
* @param {number} index The index of the option to update.
* @private
*/
updateOptionFromSetting_: function(index) {
const setting = this.getSetting(this.options_[index].name);
this.set(`options_.${index}.available`, setting.available);
this.set(`options_.${index}.value`, setting.value);
this.set(`options_.${index}.managed`, setting.setByPolicy);
// Update first index
const availableOptions = this.options_.filter(option => !!option.available);
if (availableOptions.length > 0) {
this.firstIndex_ = this.options_.indexOf(availableOptions[0]);
}
},
/**
* @param {boolean} managed Whether the setting is managed by policy.
* @param {boolean} disabled value of this.disabled
* @return {boolean} Whether the checkbox should be disabled.
* @private
*/
getDisabled_: function(managed, disabled) {
return managed || disabled;
},
/** @private */
onHeaderFooterSettingChange_: function() {
this.updateOptionFromSetting_(0);
},
/** @private */
onCssBackgroundSettingChange_: function() {
this.updateOptionFromSetting_(1);
},
/** @private */
onRasterizeSettingChange_: function() {
this.updateOptionFromSetting_(2);
},
/** @private */
onSelectionOnlySettingChange_: function() {
this.updateOptionFromSetting_(3);
},
/**
* @param {!Event} e Contains the checkbox item that was checked.
* @private
*/
onChange_: function(e) {
const name = e.model.item.name;
this.updateSettingWithTimeout_(name, this.$$(`#${name}`).checked);
},
/**
* @param {number} index The index of the settings section.
* @return {string} Class string containing 'first-visible' if the settings
* section is the first visible.
* @private
*/
getClass_: function(index) {
return index === this.firstIndex_ ? 'first-visible' : '';
},
});