| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 cr.define('options', function() { | 5 cr.define('options', function() { |
| 6 const DeletableItem = options.DeletableItem; | 6 const DeletableItem = options.DeletableItem; |
| 7 const DeletableItemList = options.DeletableItemList; | 7 const DeletableItemList = options.DeletableItemList; |
| 8 | 8 |
| 9 /** | 9 /** |
| 10 * Creates a new list item with support for inline editing. | 10 * Creates a new list item with support for inline editing. |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 // Make sure we are still in edit mode by the time we execute. | 144 // Make sure we are still in edit mode by the time we execute. |
| 145 if (self.editing) { | 145 if (self.editing) { |
| 146 focusElement.focus(); | 146 focusElement.focus(); |
| 147 focusElement.select(); | 147 focusElement.select(); |
| 148 } | 148 } |
| 149 }, 50); | 149 }, 50); |
| 150 } | 150 } |
| 151 } else { | 151 } else { |
| 152 if (!this.editCancelled_ && this.hasBeenEdited && | 152 if (!this.editCancelled_ && this.hasBeenEdited && |
| 153 this.currentInputIsValid) { | 153 this.currentInputIsValid) { |
| 154 if (this.isPlaceholder) |
| 155 this.parentNode.focusPlaceholder = true; |
| 156 |
| 154 this.updateStaticValues_(); | 157 this.updateStaticValues_(); |
| 155 cr.dispatchSimpleEvent(this, 'commitedit', true); | 158 cr.dispatchSimpleEvent(this, 'commitedit', true); |
| 156 } else { | 159 } else { |
| 157 this.resetEditableValues_(); | 160 this.resetEditableValues_(); |
| 158 cr.dispatchSimpleEvent(this, 'canceledit', true); | 161 cr.dispatchSimpleEvent(this, 'canceledit', true); |
| 159 } | 162 } |
| 160 } | 163 } |
| 161 }, | 164 }, |
| 162 | 165 |
| 163 /** | 166 /** |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 textEl.setAttribute('displaymode', 'static'); | 238 textEl.setAttribute('displaymode', 'static'); |
| 236 container.appendChild(textEl); | 239 container.appendChild(textEl); |
| 237 } | 240 } |
| 238 | 241 |
| 239 var inputEl = this.ownerDocument.createElement('input'); | 242 var inputEl = this.ownerDocument.createElement('input'); |
| 240 inputEl.type = 'text'; | 243 inputEl.type = 'text'; |
| 241 inputEl.value = text; | 244 inputEl.value = text; |
| 242 if (!this.isPlaceholder) { | 245 if (!this.isPlaceholder) { |
| 243 inputEl.setAttribute('displaymode', 'edit'); | 246 inputEl.setAttribute('displaymode', 'edit'); |
| 244 inputEl.staticVersion = textEl; | 247 inputEl.staticVersion = textEl; |
| 248 } else { |
| 249 // At this point |this| is not attached to the parent list yet, so give |
| 250 // a short timeout in order for the attachment to occur. |
| 251 var self = this; |
| 252 window.setTimeout(function() { |
| 253 var list = self.parentNode; |
| 254 if (list && list.focusPlaceholder) { |
| 255 list.focusPlaceholder = false; |
| 256 inputEl.focus(); |
| 257 } |
| 258 }, 50); |
| 245 } | 259 } |
| 260 |
| 246 inputEl.addEventListener('focus', this.handleFocus_.bind(this)); | 261 inputEl.addEventListener('focus', this.handleFocus_.bind(this)); |
| 247 container.appendChild(inputEl); | 262 container.appendChild(inputEl); |
| 248 this.editFields_.push(inputEl); | 263 this.editFields_.push(inputEl); |
| 249 | 264 |
| 250 return container; | 265 return container; |
| 251 }, | 266 }, |
| 252 | 267 |
| 253 /** | 268 /** |
| 254 * Resets the editable version of any controls created by createEditable* | 269 * Resets the editable version of any controls created by createEditable* |
| 255 * to match the static text. | 270 * to match the static text. |
| 256 * @private | 271 * @private |
| 257 */ | 272 */ |
| 258 resetEditableValues_: function() { | 273 resetEditableValues_: function() { |
| 259 var editFields = this.editFields_; | 274 var editFields = this.editFields_; |
| 260 for (var i = 0; i < editFields.length; i++) { | 275 for (var i = 0; i < editFields.length; i++) { |
| 261 var staticLabel = editFields[i].staticVersion; | 276 var staticLabel = editFields[i].staticVersion; |
| 262 if (!staticLabel && !this.isPlaceholder) | 277 if (!staticLabel && !this.isPlaceholder) |
| 263 continue; | 278 continue; |
| 279 |
| 264 if (editFields[i].tagName == 'INPUT') { | 280 if (editFields[i].tagName == 'INPUT') { |
| 265 editFields[i].value = | 281 editFields[i].value = |
| 266 this.isPlaceholder ? '' : staticLabel.textContent; | 282 this.isPlaceholder ? '' : staticLabel.textContent; |
| 267 } | 283 } |
| 268 // Add more tag types here as new createEditable* methods are added. | 284 // Add more tag types here as new createEditable* methods are added. |
| 269 | 285 |
| 270 editFields[i].setCustomValidity(''); | 286 editFields[i].setCustomValidity(''); |
| 271 } | 287 } |
| 272 }, | 288 }, |
| 273 | 289 |
| 274 /** | 290 /** |
| 275 * Sets the static version of any controls created by createEditable* | 291 * Sets the static version of any controls created by createEditable* |
| 276 * to match the current value of the editable version. Called on commit so | 292 * to match the current value of the editable version. Called on commit so |
| 277 * that there's no flicker of the old value before the model updates. | 293 * that there's no flicker of the old value before the model updates. |
| 278 * @private | 294 * @private |
| 279 */ | 295 */ |
| 280 updateStaticValues_: function() { | 296 updateStaticValues_: function() { |
| 281 var editFields = this.editFields_; | 297 var editFields = this.editFields_; |
| 282 for (var i = 0; i < editFields.length; i++) { | 298 for (var i = 0; i < editFields.length; i++) { |
| 283 var staticLabel = editFields[i].staticVersion; | 299 var staticLabel = editFields[i].staticVersion; |
| 284 if (!staticLabel) | 300 if (!staticLabel) |
| 285 continue; | 301 continue; |
| 302 |
| 286 if (editFields[i].tagName == 'INPUT') | 303 if (editFields[i].tagName == 'INPUT') |
| 287 staticLabel.textContent = editFields[i].value; | 304 staticLabel.textContent = editFields[i].value; |
| 288 // Add more tag types here as new createEditable* methods are added. | 305 // Add more tag types here as new createEditable* methods are added. |
| 289 } | 306 } |
| 290 }, | 307 }, |
| 291 | 308 |
| 292 /** | 309 /** |
| 293 * Called a key is pressed. Handles committing and cancelling edits. | 310 * Called a key is pressed. Handles committing and cancelling edits. |
| 294 * @param {Event} e The key down event. | 311 * @param {Event} e The key down event. |
| 295 * @private | 312 * @private |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 document.activeElement.blur(); | 371 document.activeElement.blur(); |
| 355 }); | 372 }); |
| 356 } | 373 } |
| 357 handleWindowBlurs(); | 374 handleWindowBlurs(); |
| 358 | 375 |
| 359 var InlineEditableItemList = cr.ui.define('list'); | 376 var InlineEditableItemList = cr.ui.define('list'); |
| 360 | 377 |
| 361 InlineEditableItemList.prototype = { | 378 InlineEditableItemList.prototype = { |
| 362 __proto__: DeletableItemList.prototype, | 379 __proto__: DeletableItemList.prototype, |
| 363 | 380 |
| 381 /** |
| 382 * Focuses the input element of the placeholder if true. |
| 383 * @type {boolean} |
| 384 */ |
| 385 focusPlaceholder: false, |
| 386 |
| 364 /** @inheritDoc */ | 387 /** @inheritDoc */ |
| 365 decorate: function() { | 388 decorate: function() { |
| 366 DeletableItemList.prototype.decorate.call(this); | 389 DeletableItemList.prototype.decorate.call(this); |
| 367 this.setAttribute('inlineeditable', ''); | 390 this.setAttribute('inlineeditable', ''); |
| 368 this.addEventListener('hasElementFocusChange', | 391 this.addEventListener('hasElementFocusChange', |
| 369 this.handleListFocusChange_); | 392 this.handleListFocusChange_); |
| 370 }, | 393 }, |
| 371 | 394 |
| 372 /** | 395 /** |
| 373 * Called when the list hierarchy as a whole loses or gains focus; starts | 396 * Called when the list hierarchy as a whole loses or gains focus; starts |
| (...skipping 11 matching lines...) Expand all Loading... |
| 385 } | 408 } |
| 386 }, | 409 }, |
| 387 }; | 410 }; |
| 388 | 411 |
| 389 // Export | 412 // Export |
| 390 return { | 413 return { |
| 391 InlineEditableItem: InlineEditableItem, | 414 InlineEditableItem: InlineEditableItem, |
| 392 InlineEditableItemList: InlineEditableItemList, | 415 InlineEditableItemList: InlineEditableItemList, |
| 393 }; | 416 }; |
| 394 }); | 417 }); |
| OLD | NEW |