summaryrefslogtreecommitdiffstats
path: root/chromium/chrome/browser/resources/settings/printing_page/cups_saved_printers.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/resources/settings/printing_page/cups_saved_printers.js')
-rw-r--r--chromium/chrome/browser/resources/settings/printing_page/cups_saved_printers.js225
1 files changed, 212 insertions, 13 deletions
diff --git a/chromium/chrome/browser/resources/settings/printing_page/cups_saved_printers.js b/chromium/chrome/browser/resources/settings/printing_page/cups_saved_printers.js
index 85ef694f1ec..948bc0526ab 100644
--- a/chromium/chrome/browser/resources/settings/printing_page/cups_saved_printers.js
+++ b/chromium/chrome/browser/resources/settings/printing_page/cups_saved_printers.js
@@ -2,6 +2,24 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+(function() {
+
+// If the Show more button is visible, the minimum number of printers we show
+// is 3.
+const kMinVisiblePrinters = 3;
+
+/**
+ * Move a printer's position in |printerArr| from |fromIndex| to |toIndex|.
+ * @param {!Array<!PrinterListEntry>} printerArr
+ * @param {number} fromIndex
+ * @param {number} toIndex
+ */
+function moveEntryInPrinters(printerArr, fromIndex, toIndex) {
+ const element = printerArr[fromIndex];
+ printerArr.splice(fromIndex, 1);
+ printerArr.splice(toIndex, 0, element);
+}
+
/**
* @fileoverview 'settings-cups-saved-printers' is a list container for Saved
* Printers.
@@ -9,16 +27,14 @@
Polymer({
is: 'settings-cups-saved-printers',
+ // ListPropertyUpdateBehavior is used in CupsPrintersEntryListBehavior.
behaviors: [
- WebUIListenerBehavior,
+ CupsPrintersEntryListBehavior,
+ ListPropertyUpdateBehavior,
+ WebUIListenerBehavior,
],
properties: {
- /** @type {!Array<!PrinterListEntry>} */
- savedPrinters: {
- type: Array,
- },
-
/**
* Search term for filtering |savedPrinters|.
* @type {string}
@@ -28,6 +44,12 @@ Polymer({
value: '',
},
+ /** @type {?CupsPrinterInfo} */
+ activePrinter: {
+ type: Object,
+ notify: true,
+ },
+
/**
* @type {number}
* @private
@@ -37,10 +59,36 @@ Polymer({
value: -1,
},
- /** @type {?CupsPrinterInfo} */
- activePrinter: {
- type: Object,
- notify: true,
+ /**
+ * List of printers filtered through a search term.
+ * @type {!Array<!PrinterListEntry>}
+ * @private
+ */
+ filteredPrinters_: {
+ type: Array,
+ value: () => [],
+ },
+
+ /**
+ * Array of new PrinterListEntry's that were added during this session.
+ * @type {!Array<!PrinterListEntry>}
+ * @private
+ */
+ newPrinters_: {
+ type: Array,
+ value: () => [],
+ },
+
+ /**
+ * Keeps track of whether the user has tapped the Show more button. A search
+ * term will expand the collapsed list, so we need to keep track of whether
+ * the list expanded because of a search term or because the user tapped on
+ * the Show more button.
+ * @private
+ */
+ hasShowMoreBeenTapped_: {
+ type: Boolean,
+ value: false,
},
},
@@ -48,23 +96,50 @@ Polymer({
'open-action-menu': 'onOpenActionMenu_',
},
+ observers: [
+ 'onSearchOrPrintersChanged_(savedPrinters.*, searchTerm,' +
+ 'hasShowMoreBeenTapped_, newPrinters_.*)'
+ ],
+
/** @private {settings.CupsPrintersBrowserProxy} */
browserProxy_: null,
+ /**
+ * The number of printers we display if hidden printers are allowed.
+ * kMinVisiblePrinters is the default value and we never show fewer printers
+ * if the Show more button is visible.
+ */
+ visiblePrinterCounter_: kMinVisiblePrinters,
+
/** @override */
created: function() {
this.browserProxy_ = settings.CupsPrintersBrowserProxyImpl.getInstance();
},
/**
+ * Redoes the search whenever |searchTerm| or |savedPrinters| changes.
+ * @private
+ */
+ onSearchOrPrintersChanged_: function() {
+ if (!this.savedPrinters) {
+ return;
+ }
+
+ const updatedPrinters = this.getVisiblePrinters_();
+
+ this.updateList(
+ 'filteredPrinters_', printer => printer.printerInfo.printerId,
+ updatedPrinters);
+ },
+
+ /**
* @param {!CustomEvent<{target: !HTMLElement, item: !PrinterListEntry}>} e
* @private
*/
onOpenActionMenu_: function(e) {
const item = /** @type {!PrinterListEntry} */(e.detail.item);
- this.activePrinterListEntryIndex_ =
- this.savedPrinters.findIndex(
- printer => printer.printerInfo == item.printerInfo);
+ this.activePrinterListEntryIndex_ = this.savedPrinters.findIndex(
+ printer => printer.printerInfo.printerId == item.printerInfo.printerId);
this.activePrinter =
this.get(['savedPrinters', this.activePrinterListEntryIndex_])
.printerInfo;
@@ -90,7 +165,131 @@ Polymer({
},
/** @private */
+ onShowMoreTap_: function() {
+ this.hasShowMoreBeenTapped_ = true;
+ },
+
+ /**
+ * Gets the printers to be shown in the UI. These printers are filtered
+ * by the search term, alphabetically sorted (if applicable), and are the
+ * printers not hidden by the Show more section.
+ * @return {!Array<!PrinterListEntry>} Returns only the visible printers.
+ * @private
+ */
+ getVisiblePrinters_: function() {
+ // Filter printers through |searchTerm|. If |searchTerm| is empty,
+ // |filteredPrinters_| is just |savedPrinters|.
+ const updatedPrinters = this.searchTerm ?
+ this.savedPrinters.filter(
+ item => settings.printing.matchesSearchTerm(
+ item.printerInfo, this.searchTerm)) :
+ this.savedPrinters.slice();
+
+ updatedPrinters.sort(settings.printing.sortPrinters);
+
+ this.moveNewlyAddedPrinters_(updatedPrinters, 0 /* toIndex */);
+
+ if (this.shouldPrinterListBeCollapsed_()) {
+ // If the Show more button is visible, we only display the first
+ // N < |visiblePrinterCounter_| printers and the rest are hidden.
+ return updatedPrinters.filter(
+ (printer, idx) => idx < this.visiblePrinterCounter_);
+ }
+ return updatedPrinters;
+ },
+
+ /** @private */
closeActionMenu_: function() {
this.$$('cr-action-menu').close();
+ },
+
+ /**
+ * @return {boolean} Returns true if the no search message should be visible.
+ * @private
+ */
+ showNoSearchResultsMessage_: function() {
+ return !!this.searchTerm && !this.filteredPrinters_.length;
+ },
+
+ /** @param{!Array<!PrinterListEntry>} addedPrinters */
+ onSavedPrintersAdded: function(addedPrinters) {
+ const currArr = this.newPrinters_.slice();
+ for (const printer of addedPrinters) {
+ this.visiblePrinterCounter_++;
+ currArr.push(printer);
+ }
+
+ this.set('newPrinters_', currArr);
+ },
+
+ /** @param{!Array<!PrinterListEntry>} removedPrinters */
+ onSavedPrintersRemoved: function(removedPrinters) {
+ const currArr = this.newPrinters_.slice();
+ for (const printer of removedPrinters) {
+ const newPrinterRemovedIdx = currArr.findIndex(
+ p => p.printerInfo.printerId == printer.printerInfo.printerId);
+ // If the removed printer is a recently added printer, remove it from
+ // |currArr|.
+ if (newPrinterRemovedIdx > -1) {
+ currArr.splice(newPrinterRemovedIdx, 1);
+ }
+
+ this.visiblePrinterCounter_ = Math.max(
+ kMinVisiblePrinters, --this.visiblePrinterCounter_);
+ }
+
+ this.set('newPrinters_', currArr);
+ },
+
+ /**
+ * Keeps track of whether the Show more button should be visible which means
+ * that the printer list is collapsed. There are two ways a collapsed list
+ * may be expanded: the Show more button is tapped or if there is a search
+ * term.
+ * @return {boolean} True if the printer list should be collapsed.
+ * @private
+ */
+ shouldPrinterListBeCollapsed_: function() {
+ // If |searchTerm| is set, never collapse the list.
+ if (this.searchTerm) {
+ return false;
+ }
+
+ // If |hasShowMoreBeenTapped_| is set to true, never collapse the list.
+ if (this.hasShowMoreBeenTapped_) {
+ return false;
+ }
+
+ // If the total number of saved printers does not exceed the number of
+ // visible printers, there is no need for the list to be collapsed.
+ if (this.savedPrinters.length - this.visiblePrinterCounter_ < 1) {
+ return false;
+ }
+
+ return true;
+ },
+
+ /**
+ * Moves printers that are in |newPrinters_| to position |toIndex| of
+ * |printerArr|. This moves all recently added printers to the top of the
+ * printer list.
+ * @param {!Array<!PrinterListEntry>} printerArr
+ * @param {number} toIndex
+ * @private
+ */
+ moveNewlyAddedPrinters_: function(printerArr, toIndex) {
+ if (!this.newPrinters_.length) {
+ return;
+ }
+
+ // We have newly added printers, move them to the top of the list.
+ for (const printer of this.newPrinters_) {
+ const idx = printerArr.findIndex(
+ p => p.printerInfo.printerId == printer.printerInfo.printerId);
+ if (idx > -1) {
+ moveEntryInPrinters(printerArr, idx, toIndex);
+ }
+ }
}
});
+})();