OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 cr.define('options.autofillOptions', function() { | |
6 const DeletableItem = options.DeletableItem; | |
7 const DeletableItemList = options.DeletableItemList; | |
8 const InlineEditableItem = options.InlineEditableItem; | |
9 const InlineEditableItemList = options.InlineEditableItemList; | |
10 | |
11 /** | |
12 * Creates a new address list item. | |
13 * @param {Array} entry An array of the form [guid, label]. | |
14 * @constructor | |
15 * @extends {options.DeletableItem} | |
16 */ | |
17 function AddressListItem(entry) { | |
18 var el = cr.doc.createElement('div'); | |
19 el.guid = entry[0]; | |
20 el.label = entry[1]; | |
21 el.__proto__ = AddressListItem.prototype; | |
22 el.decorate(); | |
23 | |
24 return el; | |
25 } | |
26 | |
27 AddressListItem.prototype = { | |
28 __proto__: DeletableItem.prototype, | |
29 | |
30 /** @inheritDoc */ | |
31 decorate: function() { | |
32 DeletableItem.prototype.decorate.call(this); | |
33 | |
34 // The stored label. | |
35 var label = this.ownerDocument.createElement('div'); | |
36 label.className = 'autofill-list-item'; | |
37 label.textContent = this.label; | |
38 this.contentElement.appendChild(label); | |
39 }, | |
40 }; | |
41 | |
42 /** | |
43 * Creates a new credit card list item. | |
44 * @param {Array} entry An array of the form [guid, label, icon]. | |
45 * @constructor | |
46 * @extends {options.DeletableItem} | |
47 */ | |
48 function CreditCardListItem(entry) { | |
49 var el = cr.doc.createElement('div'); | |
50 el.guid = entry[0]; | |
51 el.label = entry[1]; | |
52 el.icon = entry[2]; | |
53 el.description = entry[3]; | |
54 el.__proto__ = CreditCardListItem.prototype; | |
55 el.decorate(); | |
56 | |
57 return el; | |
58 } | |
59 | |
60 CreditCardListItem.prototype = { | |
61 __proto__: DeletableItem.prototype, | |
62 | |
63 /** @inheritDoc */ | |
64 decorate: function() { | |
65 DeletableItem.prototype.decorate.call(this); | |
66 | |
67 // The stored label. | |
68 var label = this.ownerDocument.createElement('div'); | |
69 label.className = 'autofill-list-item'; | |
70 label.textContent = this.label; | |
71 this.contentElement.appendChild(label); | |
72 | |
73 // The credit card icon. | |
74 var icon = this.ownerDocument.createElement('image'); | |
75 icon.src = this.icon; | |
76 icon.alt = this.description; | |
77 this.contentElement.appendChild(icon); | |
78 }, | |
79 }; | |
80 | |
81 /** | |
82 * Creates a new value list item. | |
83 * @param {AutofillValuesList} list The parent list of this item. | |
84 * @param {String} entry A string value. | |
85 * @constructor | |
86 * @extends {options.InlineEditableItem} | |
87 */ | |
88 function ValuesListItem(list, entry) { | |
89 var el = cr.doc.createElement('div'); | |
90 el.list = list; | |
91 el.value = entry; | |
92 el.__proto__ = ValuesListItem.prototype; | |
93 el.decorate(); | |
94 | |
95 return el; | |
96 } | |
97 | |
98 ValuesListItem.prototype = { | |
99 __proto__: InlineEditableItem.prototype, | |
100 | |
101 /** @inheritDoc */ | |
102 decorate: function() { | |
103 InlineEditableItem.prototype.decorate.call(this); | |
104 | |
105 this.isPlaceholder = !this.value; | |
106 | |
107 // The stored value. | |
108 var cell = this.createEditableTextCell(this.value); | |
109 this.contentElement.appendChild(cell); | |
110 this.input = cell.querySelector('input'); | |
111 | |
112 this.addEventListener('commitedit', this.onEditCommitted_); | |
113 }, | |
114 | |
115 /** | |
116 * Called when committing an edit. | |
117 * @param {Event} e The end event. | |
118 * @private | |
119 */ | |
120 onEditCommitted_: function(e) { | |
121 var i = this.list.items.indexOf(this); | |
122 if (this.input.value == this.list.dataModel.item(i)) | |
123 return; | |
124 | |
125 if (this.input.value && | |
126 this.list.dataModel.indexOf(this.input.value) == -1) { | |
127 // Update with new value. | |
128 this.list.validateAndSave(i, 1, this.input.value); | |
129 } else { | |
130 // Reject empty values and duplicates. | |
131 this.list.dataModel.splice(i, 1); | |
132 } | |
133 }, | |
134 }; | |
135 | |
136 /** | |
137 * Creates a new list item for the Add New Item row, which doesn't represent | |
138 * an actual entry in the values list but allows the user to add new | |
139 * values. | |
140 * @param {AutofillValuesList} entry The parent list of this item. | |
141 * @constructor | |
142 * @extends {cr.ui.ValuesListItem} | |
143 */ | |
144 function ValuesAddRowListItem(list) { | |
145 var el = cr.doc.createElement('div'); | |
146 el.list = list; | |
147 el.__proto__ = ValuesAddRowListItem.prototype; | |
148 el.decorate(); | |
149 | |
150 return el; | |
151 } | |
152 | |
153 ValuesAddRowListItem.prototype = { | |
154 __proto__: ValuesListItem.prototype, | |
155 | |
156 decorate: function() { | |
157 ValuesListItem.prototype.decorate.call(this); | |
158 this.input.value = ''; | |
159 this.input.placeholder = this.list.getAttribute('placeholder'); | |
160 this.deletable = false; | |
161 }, | |
162 | |
163 /** | |
164 * Called when committing an edit. Committing a non-empty value adds it | |
165 * to the end of the values list, leaving this "AddRow" in place. | |
166 * @param {Event} e The end event. | |
167 * @extends {options.ValuesListItem} | |
168 * @private | |
169 */ | |
170 onEditCommitted_: function(e) { | |
171 var i = this.list.items.indexOf(this); | |
172 if (i < 0 || i >= this.list.dataModel.length) | |
173 return; | |
174 | |
175 if (this.input.value && | |
176 this.list.dataModel.indexOf(this.input.value) == -1) { | |
177 this.list.validateAndSave(i, 0, this.input.value); | |
178 } else { | |
179 this.input.value = ''; | |
180 this.list.dataModel.updateIndex(i); | |
181 } | |
182 }, | |
183 }; | |
184 | |
185 /** | |
186 * Create a new address list. | |
187 * @constructor | |
188 * @extends {options.DeletableItemList} | |
189 */ | |
190 var AutofillAddressList = cr.ui.define('list'); | |
191 | |
192 AutofillAddressList.prototype = { | |
193 __proto__: DeletableItemList.prototype, | |
194 | |
195 decorate: function() { | |
196 DeletableItemList.prototype.decorate.call(this); | |
197 | |
198 this.addEventListener('blur', this.onBlur_); | |
199 }, | |
200 | |
201 /** | |
202 * When the list loses focus, unselect all items in the list. | |
203 * @private | |
204 */ | |
205 onBlur_: function() { | |
206 this.selectionModel.unselectAll(); | |
207 }, | |
208 | |
209 /** @inheritDoc */ | |
210 createItem: function(entry) { | |
211 return new AddressListItem(entry); | |
212 }, | |
213 | |
214 /** @inheritDoc */ | |
215 activateItemAtIndex: function(index) { | |
216 AutofillOptions.loadAddressEditor(this.dataModel.item(index)[0]); | |
217 }, | |
218 | |
219 /** @inheritDoc */ | |
220 deleteItemAtIndex: function(index) { | |
221 AutofillOptions.removeAddress(this.dataModel.item(index)[0]); | |
222 }, | |
223 }; | |
224 | |
225 /** | |
226 * Create a new credit card list. | |
227 * @constructor | |
228 * @extends {options.DeletableItemList} | |
229 */ | |
230 var AutofillCreditCardList = cr.ui.define('list'); | |
231 | |
232 AutofillCreditCardList.prototype = { | |
233 __proto__: DeletableItemList.prototype, | |
234 | |
235 decorate: function() { | |
236 DeletableItemList.prototype.decorate.call(this); | |
237 | |
238 this.addEventListener('blur', this.onBlur_); | |
239 }, | |
240 | |
241 /** | |
242 * When the list loses focus, unselect all items in the list. | |
243 * @private | |
244 */ | |
245 onBlur_: function() { | |
246 this.selectionModel.unselectAll(); | |
247 }, | |
248 | |
249 /** @inheritDoc */ | |
250 createItem: function(entry) { | |
251 return new CreditCardListItem(entry); | |
252 }, | |
253 | |
254 /** @inheritDoc */ | |
255 activateItemAtIndex: function(index) { | |
256 AutofillOptions.loadCreditCardEditor(this.dataModel.item(index)[0]); | |
257 }, | |
258 | |
259 /** @inheritDoc */ | |
260 deleteItemAtIndex: function(index) { | |
261 AutofillOptions.removeCreditCard(this.dataModel.item(index)[0]); | |
262 }, | |
263 }; | |
264 | |
265 /** | |
266 * Create a new value list. | |
267 * @constructor | |
268 * @extends {options.InlineEditableItemList} | |
269 */ | |
270 var AutofillValuesList = cr.ui.define('list'); | |
271 | |
272 AutofillValuesList.prototype = { | |
273 __proto__: InlineEditableItemList.prototype, | |
274 | |
275 decorate: function() { | |
276 InlineEditableItemList.prototype.decorate.call(this); | |
277 | |
278 var self = this; | |
279 function handleBlur(e) { | |
280 // When the blur event happens we do not know who is getting focus so we | |
281 // delay this a bit until we know if the new focus node is outside the | |
282 // list. | |
283 var doc = e.target.ownerDocument; | |
284 window.setTimeout(function() { | |
285 var activeElement = doc.activeElement; | |
286 if (!self.contains(activeElement)) | |
287 self.selectionModel.unselectAll(); | |
288 }, 50); | |
289 } | |
290 | |
291 this.addEventListener('blur', handleBlur, true); | |
292 }, | |
293 | |
294 /** @inheritDoc */ | |
295 createItem: function(entry) { | |
296 if (entry != null) | |
297 return new ValuesListItem(this, entry); | |
298 else | |
299 return new ValuesAddRowListItem(this); | |
300 }, | |
301 | |
302 /** @inheritDoc */ | |
303 deleteItemAtIndex: function(index) { | |
304 this.dataModel.splice(index, 1); | |
305 }, | |
306 | |
307 /** | |
308 * Called when a new list item should be validated; subclasses are | |
309 * responsible for implementing if validation is required. | |
310 * @param {number} index The index of the item that was inserted or changed. | |
311 * @param {number} remove The number items to remove. | |
312 * @param {string} value The value of the item to insert. | |
313 */ | |
314 validateAndSave: function(index, remove, value) { | |
315 this.dataModel.splice(index, remove, value); | |
316 }, | |
317 }; | |
318 | |
319 /** | |
320 * Create a new value list for phone number validation. | |
321 * @constructor | |
322 * @extends {options.AutofillValuesList} | |
323 */ | |
324 var AutofillPhoneValuesList = cr.ui.define('list'); | |
325 | |
326 AutofillPhoneValuesList.prototype = { | |
327 __proto__: AutofillValuesList.prototype, | |
328 | |
329 decorate: function() { | |
330 AutofillValuesList.prototype.decorate.call(this); | |
331 }, | |
332 | |
333 /** @inheritDoc */ | |
334 validateAndSave: function(index, remove, value) { | |
335 var numbers = this.dataModel.slice(0, this.dataModel.length - 1); | |
336 numbers.splice(index, remove, value); | |
337 var info = new Array(); | |
338 info[0] = index; | |
339 info[1] = numbers; | |
340 info[2] = $('country').value; | |
341 chrome.send('validatePhoneNumbers', info); | |
342 }, | |
343 }; | |
344 | |
345 /** | |
346 * Create a new value list for fax number validation. | |
347 * @constructor | |
348 * @extends {options.AutofillValuesList} | |
349 */ | |
350 var AutofillFaxValuesList = cr.ui.define('list'); | |
351 | |
352 AutofillFaxValuesList.prototype = { | |
353 __proto__: AutofillValuesList.prototype, | |
354 | |
355 decorate: function() { | |
356 AutofillValuesList.prototype.decorate.call(this); | |
357 }, | |
358 | |
359 /** @inheritDoc */ | |
360 validateAndSave: function(index, remove, value) { | |
361 var numbers = this.dataModel.slice(0, this.dataModel.length - 1); | |
362 numbers.splice(index, remove, value); | |
363 var info = new Array(); | |
364 info[0] = index; | |
365 info[1] = numbers; | |
366 info[2] = $('country').value; | |
367 chrome.send('validateFaxNumbers', info); | |
368 }, | |
369 }; | |
370 | |
371 return { | |
372 AddressListItem: AddressListItem, | |
373 CreditCardListItem: CreditCardListItem, | |
374 ValuesListItem: ValuesListItem, | |
375 ValuesAddRowListItem: ValuesAddRowListItem, | |
376 AutofillAddressList: AutofillAddressList, | |
377 AutofillCreditCardList: AutofillCreditCardList, | |
378 AutofillValuesList: AutofillValuesList, | |
379 AutofillPhoneValuesList: AutofillPhoneValuesList, | |
380 AutofillFaxValuesList: AutofillFaxValuesList, | |
381 }; | |
382 }); | |
OLD | NEW |