1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 cr
.define('print_preview', function() {
9 * Base class for the printer option element visualizing the generic selection
11 * @param {!print_preview.ticket_items.TicketItem} ticketItem Ticket item
12 * visualized by this component.
14 * @extends {print_preview.SettingsSection}
16 function SettingsSectionSelect(ticketItem
) {
17 print_preview
.SettingsSection
.call(this);
19 /** @private {!print_preview.ticket_items.TicketItem} */
20 this.ticketItem_
= ticketItem
;
23 SettingsSectionSelect
.prototype = {
24 __proto__
: print_preview
.SettingsSection
.prototype,
27 isAvailable: function() {
28 return this.ticketItem_
.isCapabilityAvailable();
32 hasCollapsibleContent: function() {
33 return this.isAvailable();
37 set isEnabled(isEnabled
) {
38 this.select_
.disabled
= !isEnabled
;
42 enterDocument: function() {
43 print_preview
.SettingsSection
.prototype.enterDocument
.call(this);
44 this.tracker
.add(assert(this.select_
),
46 this.onSelectChange_
.bind(this));
47 this.tracker
.add(this.ticketItem_
,
48 print_preview
.ticket_items
.TicketItem
.EventType
.CHANGE
,
49 this.onTicketItemChange_
.bind(this));
53 * @return {HTMLSelectElement} Select element containing option items.
57 return this.getElement().querySelector('.settings-select');
61 * Makes sure the content of the select element matches the capabilities of
65 updateSelect_: function() {
66 var select
= this.select_
;
67 if (!this.isAvailable()) {
68 select
.innerHTML
= '';
71 // Should the select content be updated?
73 this.ticketItem_
.capability
.option
.length
== select
.length
&&
74 this.ticketItem_
.capability
.option
.every(function(option
, index
) {
75 return select
.options
[index
].value
== JSON
.stringify(option
);
77 var indexToSelect
= select
.selectedIndex
;
79 select
.innerHTML
= '';
80 this.ticketItem_
.capability
.option
.forEach(function(option
, index
) {
81 var selectOption
= document
.createElement('option');
82 selectOption
.text
= this.getCustomDisplayName_(option
) ||
83 this.getDefaultDisplayName_(option
);
84 selectOption
.value
= JSON
.stringify(option
);
85 select
.appendChild(selectOption
);
86 if (option
.is_default
)
87 indexToSelect
= index
;
90 // Try to select current ticket item.
91 var valueToSelect
= JSON
.stringify(this.ticketItem_
.getValue());
92 for (var i
= 0, option
; option
= select
.options
[i
]; i
++) {
93 if (option
.value
== valueToSelect
) {
98 select
.selectedIndex
= indexToSelect
;
99 this.onSelectChange_();
103 * @param {!Object} option Option to get the custom display name for.
104 * @return {string} Custom display name for the option.
107 getCustomDisplayName_: function(option
) {
108 var displayName
= option
.custom_display_name
;
109 if (!displayName
&& option
.custom_display_name_localized
) {
111 getStringForCurrentLocale(option
.custom_display_name_localized
);
117 * @param {!Object} option Option to get the default display name for.
118 * @return {string} Default option display name.
121 getDefaultDisplayName_: function(option
) {
122 throw Error('Abstract method not overridden');
126 * Called when the select element is changed. Updates the print ticket.
129 onSelectChange_: function() {
130 var select
= this.select_
;
131 this.ticketItem_
.updateValue(
132 JSON
.parse(select
.options
[select
.selectedIndex
].value
));
136 * Called when the print ticket store changes. Selects the corresponding
140 onTicketItemChange_: function() {
141 this.updateSelect_();
142 this.updateUiStateInternal();
148 SettingsSectionSelect
: SettingsSectionSelect