Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(168)

Side by Side Diff: chrome/browser/resources/file_manager/js/ui/progress_center_panel.js

Issue 39123003: [Files.app] Split the JavaScript files into subdirectories: common, background, and foreground (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed test failure. Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 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.
4
5 'use strict';
6
7 /**
8 * Progress center panel.
9 *
10 * @param {HTMLElement} element DOM Element of the process center panel.
11 * @param {function(string)} cancelCallback Callback to becalled with the ID of
12 * the progress item when the cancel button is clicked.
13 * @constructor
14 */
15 var ProgressCenterPanel = function(element, cancelCallback) {
16 this.element_ = element;
17 this.openView_ = this.element_.querySelector('#progress-center-open-view');
18 this.closeView_ = this.element_.querySelector('#progress-center-close-view');
19 this.cancelCallback_ = cancelCallback;
20
21 /**
22 * Only progress item in the close view.
23 * @type {!HTMLElement}
24 * @private
25 */
26 this.closeViewItem_ = this.closeView_.querySelector('li');
27
28 Object.freeze(this);
29
30 // Register event handlers.
31 element.addEventListener('click', this.onClick_.bind(this));
32 element.addEventListener(
33 'webkitTransitionEnd', this.onItemTransitionEnd_.bind(this));
34 };
35
36 /**
37 * Whether to use the new progress center UI or not.
38 * TODO(hirono): Remove the flag after replacing the old butter bar with the new
39 * progress center.
40 * @type {boolean}
41 * @private
42 */
43 ProgressCenterPanel.ENABLED_ = true;
44
45 /**
46 * Update item element.
47 * @param {HTMLElement} element Element to be updated.
48 * @param {ProgressCenterItem} item Progress center item.
49 * @private
50 */
51 ProgressCenterPanel.updateItemElement_ = function(element, item) {
52 var additionalClass = item.state === ProgressItemState.COMPLETE ? 'complete' :
53 item.state === ProgressItemState.ERROR ? 'error' :
54 item.state === ProgressItemState.CANCELED ? 'canceled' :
55 '';
56 if (item.cancelable)
57 additionalClass += ' cancelable';
58 var previousWidthRate =
59 parseInt(element.querySelector('.progress-track').style.width);
60 if (item.state === ProgressItemState.COMPLETE &&
61 previousWidthRate === item.progressRateByPercent) {
62 // Stop to update the message until the transition ends.
63 element.setAttribute('data-complete-message', item.message);
64 // The class pre-complete means that the actual operation is already done
65 // but the UI transition of progress bar is not complete.
66 additionalClass = 'pre-complete';
67 } else {
68 element.querySelector('label').textContent = item.message;
69 element.removeAttribute('data-complete-message');
70 }
71 // To commit the property change and to trigger the transition even if the
72 // change is done synchronously, assign the width value asynchronously.
73 setTimeout(function() {
74 var track = element.querySelector('.progress-track');
75 // When the progress rate is reverted, we does not use the transition
76 // animation. Specifying '0' overrides the CSS settings and specifying null
77 // re-enables it.
78 track.style.transitionDuration =
79 previousWidthRate > item.progressRateByPercent ? '0' : null;
80 track.style.width = item.progressRateByPercent + '%';
81 }, 0);
82 element.setAttribute('data-progress-id', item.id);
83 element.setAttribute('data-progress-max', item.progressMax);
84 element.setAttribute('data-progress-value', item.progressValue);
85 element.className = additionalClass;
86 };
87
88 /**
89 * Updates an item to the progress center panel.
90 * @param {ProgressCenterItem} item Item including new contents.
91 * @param {ProgressCenterItem} summarizedItem Item to be desplayed in the close
92 * view.
93 */
94 ProgressCenterPanel.prototype.updateItem = function(item, summarizedItem) {
95 var itemElement = this.getItemElement_(item.id);
96 if (!itemElement) {
97 itemElement = this.createNewItemElement_();
98 this.openView_.insertBefore(itemElement, this.openView_.firstNode);
99 }
100 ProgressCenterPanel.updateItemElement_(itemElement, item);
101
102 // Update close view.
103 this.closeView_.classList.toggle('single', !summarizedItem.summarized);
104 ProgressCenterPanel.updateItemElement_(this.closeViewItem_, summarizedItem);
105
106 if (ProgressCenterPanel.ENABLED_)
107 this.element_.hidden = false;
108 };
109
110 /**
111 * Remove all the items.
112 */
113 ProgressCenterPanel.prototype.reset = function() {
114 // Clear the all compete item.
115 this.openView_.innerHTML = '';
116
117 // Hide the progress center.
118 this.element_.hidden = true;
119 this.element_.classList.remove('opened');
120 };
121
122 /**
123 * Gets an item element having the specified ID.
124 * @param {string} id progress item ID.
125 * @return {HTMLElement} Item element having the ID.
126 * @private
127 */
128 ProgressCenterPanel.prototype.getItemElement_ = function(id) {
129 var query = 'li[data-progress-id="' + id + '"]';
130 return this.openView_.querySelector(query);
131 };
132
133 /**
134 * Creates an item element.
135 * @return {HTMLElement} Created item element.
136 * @private
137 */
138 ProgressCenterPanel.prototype.createNewItemElement_ = function() {
139 var label = this.element_.ownerDocument.createElement('label');
140 label.className = 'label';
141
142 var progressBarIndicator = this.element_.ownerDocument.createElement('div');
143 progressBarIndicator.className = 'progress-track';
144
145 var progressBar = this.element_.ownerDocument.createElement('div');
146 progressBar.className = 'progress-bar';
147 progressBar.appendChild(progressBarIndicator);
148
149 var cancelButton = this.element_.ownerDocument.createElement('button');
150 cancelButton.className = 'cancel';
151 cancelButton.setAttribute('tabindex', '-1');
152
153 var progressFrame = this.element_.ownerDocument.createElement('div');
154 progressFrame.className = 'progress-frame';
155 progressFrame.appendChild(progressBar);
156 progressFrame.appendChild(cancelButton);
157
158 var itemElement = this.element_.ownerDocument.createElement('li');
159 itemElement.appendChild(label);
160 itemElement.appendChild(progressFrame);
161
162 return itemElement;
163 };
164
165 /**
166 * Handles the transition end event of items.
167 * @param {Event} event Transition end event.
168 * @private
169 */
170 ProgressCenterPanel.prototype.onItemTransitionEnd_ = function(event) {
171 var itemElement = event.target.parentNode.parentNode.parentNode;
172 if (itemElement.className !== 'pre-complete' ||
173 event.propertyName !== 'width')
174 return;
175 var completeMessage = itemElement.getAttribute('data-complete-message');
176 if (!completeMessage)
177 return;
178 itemElement.className = 'complete';
179 itemElement.querySelector('label').textContent = completeMessage;
180 };
181
182 /**
183 * Handles the click event.
184 * @param {Event} event Click event.
185 * @private
186 */
187 ProgressCenterPanel.prototype.onClick_ = function(event) {
188 if (event.target.classList.contains('toggle') &&
189 !this.closeView_.classList.contains('single'))
190 this.element_.classList.toggle('opened');
191 else if ((event.target.classList.contains('toggle') &&
192 this.closeView_.classList.contains('single')) ||
193 event.target.classList.contains('cancel'))
194 this.cancelCallback_(
195 event.target.parentNode.parentNode.getAttribute('data-progress-id'));
196 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698