blob: b6dac2e802feb8ab1ce08766715ed019a7ae693c [file] [log] [blame]
// Copyright 2019 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.
import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/cr_elements/shared_style_css.m.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
import './advanced_options_settings.js';
import './button_strip.js';
import './color_settings.js';
import './copies_settings.js';
import './dpi_settings.js';
import './duplex_settings.js';
import './header.js';
import './layout_settings.js';
import './media_size_settings.js';
import './margins_settings.js';
import './more_settings.js';
import './other_options_settings.js';
import './pages_per_sheet_settings.js';
import './pages_settings.js';
// <if expr="chromeos">
import './pin_settings.js';
// </if>
import './print_preview_vars_css.js';
import './scaling_settings.js';
import '../strings.m.js';
// <if expr="not chromeos">
import './link_container.js';
// </if>
import {CrContainerShadowBehavior} from 'chrome://resources/cr_elements/cr_container_shadow_behavior.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {DarkModeBehavior} from '../dark_mode_behavior.js';
import {Destination} from '../data/destination.js';
import {Error, State} from '../data/state.js';
import {Metrics, MetricsContext} from '../metrics.js';
import {DestinationState} from './destination_settings.js';
import {SettingsBehavior} from './settings_behavior.js';
/**
* Number of settings sections to show when "More settings" is collapsed.
* @type {number}
*/
const MAX_SECTIONS_TO_SHOW = 6;
Polymer({
is: 'print-preview-sidebar',
_template: html`{__html_template__}`,
behaviors: [
SettingsBehavior,
CrContainerShadowBehavior,
WebUIListenerBehavior,
DarkModeBehavior,
],
properties: {
cloudPrintErrorMessage: String,
controlsManaged: Boolean,
/** @type {Destination} */
destination: {
type: Object,
notify: true,
},
/** @private {!DestinationState} */
destinationState: {
type: Number,
notify: true,
},
/** @type {!Error} */
error: {
type: Number,
notify: true,
},
isPdf: Boolean,
pageCount: Number,
/** @type {!State} */
state: {
type: Number,
observer: 'onStateChanged_',
},
/** @private {boolean} */
controlsDisabled_: {
type: Boolean,
computed: 'computeControlsDisabled_(state)',
},
maxSheets: Number,
/** @private {number} */
sheetCount_: {
type: Number,
computed: 'computeSheetCount_(' +
'settings.pages.*, settings.duplex.*, settings.copies.*)',
},
/** @private {boolean} */
firstLoad_: {
type: Boolean,
value: true,
},
/** @private {boolean} */
isInAppKioskMode_: {
type: Boolean,
value: false,
},
/** @private {boolean} */
settingsExpandedByUser_: {
type: Boolean,
value: false,
},
/** @private {boolean} */
shouldShowMoreSettings_: {
type: Boolean,
computed: 'computeShouldShowMoreSettings_(settings.pages.available, ' +
'settings.copies.available, settings.layout.available, ' +
'settings.color.available, settings.mediaSize.available, ' +
'settings.dpi.available, settings.margins.available, ' +
'settings.pagesPerSheet.available, settings.scaling.available, ' +
'settings.duplex.available, settings.otherOptions.available, ' +
'settings.vendorItems.available)',
},
},
/**
* @param {boolean} appKioskMode
* @param {string} defaultPrinter The system default printer ID.
* @param {string} serializedDestinationSelectionRulesStr String with rules
* for selecting the default destination.
* @param {?Array<string>} userAccounts The signed in user accounts.
* @param {boolean} syncAvailable
* @param {boolean} pdfPrinterDisabled Whether the PDF printer is disabled.
* @param {boolean} isDriveMounted Whether Google Drive is mounted. Only used
on Chrome OS.
*/
init(
appKioskMode, defaultPrinter, serializedDestinationSelectionRulesStr,
userAccounts, syncAvailable, pdfPrinterDisabled, isDriveMounted) {
this.isInAppKioskMode_ = appKioskMode;
pdfPrinterDisabled = this.isInAppKioskMode_ || pdfPrinterDisabled;
// If PDF printing is disabled, then Save to Drive also needs to be disabled
// on Chrome OS.
isDriveMounted = !pdfPrinterDisabled && isDriveMounted;
this.$.destinationSettings.init(
defaultPrinter, pdfPrinterDisabled, isDriveMounted,
serializedDestinationSelectionRulesStr, userAccounts, syncAvailable);
},
/**
* @return {boolean} Whether the controls should be disabled.
* @private
*/
computeControlsDisabled_() {
return this.state !== State.READY;
},
/**
* @return {number} The number of sheets that will be printed.
* @private
*/
computeSheetCount_() {
let sheets = this.getSettingValue('pages').length;
if (this.getSettingValue('duplex')) {
sheets = Math.ceil(sheets / 2);
}
return sheets * /** @type {number} */ (this.getSettingValue('copies'));
},
/**
* @return {boolean} Whether to show the "More settings" link.
* @private
*/
computeShouldShowMoreSettings_() {
// Destination settings is always available. See if the total number of
// available sections exceeds the maximum number to show.
return [
'pages', 'copies', 'layout', 'color', 'mediaSize', 'margins', 'color',
'pagesPerSheet', 'scaling', 'dpi', 'duplex', 'otherOptions', 'vendorItems'
].reduce((count, setting) => {
return this.getSetting(setting).available ? count + 1 : count;
}, 1) > MAX_SECTIONS_TO_SHOW;
},
/**
* @return {boolean} Whether the "more settings" collapse should be expanded.
* @private
*/
shouldExpandSettings_() {
if (this.settingsExpandedByUser_ === undefined ||
this.shouldShowMoreSettings_ === undefined) {
return false;
}
// Expand the settings if the user has requested them expanded or if more
// settings is not displayed (i.e. less than 6 total settings available).
return this.settingsExpandedByUser_ || !this.shouldShowMoreSettings_;
},
/** @private */
onPrintButtonFocused_() {
this.firstLoad_ = false;
},
onStateChanged_() {
if (this.state !== State.PRINTING) {
return;
}
if (this.shouldShowMoreSettings_) {
MetricsContext.printSettingsUi().record(
this.settingsExpandedByUser_ ?
Metrics.PrintSettingsUiBucket.PRINT_WITH_SETTINGS_EXPANDED :
Metrics.PrintSettingsUiBucket.PRINT_WITH_SETTINGS_COLLAPSED);
}
},
/** @return {boolean} Whether the system dialog link is available. */
systemDialogLinkAvailable() {
const linkContainer = this.$$('print-preview-link-container');
return !!linkContainer && linkContainer.systemDialogLinkAvailable();
},
// <if expr="chromeos">
/** @param {boolean} isDriveMounted */
setIsDriveMounted(isDriveMounted) {
this.$.destinationSettings.setIsDriveMounted(isDriveMounted);
},
// </if>
});