Merge lp:~abentley/launchpad/sharing-spinners into lp:launchpad
- sharing-spinners
- Merge into devel
Status: | Merged |
---|---|
Merged at revision: | 12854 |
Proposed branch: | lp:~abentley/launchpad/sharing-spinners |
Merge into: | lp:launchpad |
Diff against target: |
308 lines (+94/-20) 4 files modified
lib/lp/translations/javascript/sourcepackage_sharing_details.js (+31/-15) lib/lp/translations/javascript/tests/test_sourcepackage_sharing_details.html (+14/-5) lib/lp/translations/javascript/tests/test_sourcepackage_sharing_details.js (+33/-0) lib/lp/translations/templates/sourcepackage-sharing-details.pt (+16/-0) |
To merge this branch: | bzr merge lp:~abentley/launchpad/sharing-spinners |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Abel Deuring (community) | code | Approve | |
Review via email: mp+57888@code.launchpad.net |
Commit message
Add spinners to translation-sharing actions.
Description of the change
= Summary =
Fix bug #758922: Missing spinners on translations +sharing-details js actions
== Proposed fix ==
Add hidden spinners to web page, show them as needed.
== Pre-implementation notes ==
None
== Implementation details ==
Added a new "pending" boolean to checklist items. When this is true, the TranslationShar
== Tests ==
firefox lib/lp/
== Demo and Q/A ==
Go to the +sharing-details page for a SourcePackage. Ensure that when each setting is changed, a spinner is shown. This should happen both when the list item was formlerly uncheckd and when it was formerly checked.
= Launchpad lint =
Checking for conflicts and issues in changed files.
Linting changed files:
lib/lp/
lib/lp/
lib/lp/
lib/lp/
Abel Deuring (adeuring) : | # |
Preview Diff
1 | === modified file 'lib/lp/translations/javascript/sourcepackage_sharing_details.js' | |||
2 | --- lib/lp/translations/javascript/sourcepackage_sharing_details.js 2011-04-18 13:27:33 +0000 | |||
3 | +++ lib/lp/translations/javascript/sourcepackage_sharing_details.js 2011-04-18 13:41:39 +0000 | |||
4 | @@ -26,7 +26,8 @@ | |||
5 | 26 | } | 26 | } |
6 | 27 | }, | 27 | }, |
7 | 28 | // The HTML identifier of the item. | 28 | // The HTML identifier of the item. |
9 | 29 | identifier: null | 29 | identifier: null, |
10 | 30 | pending: {value: false} | ||
11 | 30 | }; | 31 | }; |
12 | 31 | Y.extend(CheckItem, Y.Base, { | 32 | Y.extend(CheckItem, Y.Base, { |
13 | 32 | }); | 33 | }); |
14 | @@ -224,9 +225,8 @@ | |||
15 | 224 | } | 225 | } |
16 | 225 | 226 | ||
17 | 226 | 227 | ||
19 | 227 | function IOHandler(flash_target, error_handler) { | 228 | function IOHandler(controller, check, error_handler) { |
20 | 228 | that = this; | 229 | that = this; |
21 | 229 | this.flash_target = flash_target; | ||
22 | 230 | if (!Y.Lang.isValue(error_handler)){ | 230 | if (!Y.Lang.isValue(error_handler)){ |
23 | 231 | this.error_handler = new Y.lp.client.ErrorHandler(); | 231 | this.error_handler = new Y.lp.client.ErrorHandler(); |
24 | 232 | } | 232 | } |
25 | @@ -234,7 +234,10 @@ | |||
26 | 234 | this.error_handler = error_handler; | 234 | this.error_handler = error_handler; |
27 | 235 | } | 235 | } |
28 | 236 | this.error_handler.showError = function(error_msg) { | 236 | this.error_handler.showError = function(error_msg) { |
30 | 237 | Y.lp.app.errors.display_error(Y.one(that.flash_target), error_msg); | 237 | check.set('pending', false); |
31 | 238 | controller.update_check(check); | ||
32 | 239 | var flash_target = Y.one(controller.visible_check_selector(check)); | ||
33 | 240 | Y.lp.app.errors.display_error(Y.one(flash_target), error_msg); | ||
34 | 238 | }; | 241 | }; |
35 | 239 | } | 242 | } |
36 | 240 | 243 | ||
37 | @@ -373,6 +376,8 @@ | |||
38 | 373 | var productseries_check = that.get('tsconfig').get('product_series'); | 376 | var productseries_check = that.get('tsconfig').get('product_series'); |
39 | 374 | var lp_client = new Y.lp.client.Launchpad(); | 377 | var lp_client = new Y.lp.client.Launchpad(); |
40 | 375 | function save_productseries(config) { | 378 | function save_productseries(config) { |
41 | 379 | productseries_check.set('pending', true); | ||
42 | 380 | that.update_check(productseries_check); | ||
43 | 376 | var source_package = that.get('source_package'); | 381 | var source_package = that.get('source_package'); |
44 | 377 | config.parameters = { | 382 | config.parameters = { |
45 | 378 | productseries: productseries_summary.api_uri}; | 383 | productseries: productseries_summary.api_uri}; |
46 | @@ -398,11 +403,11 @@ | |||
47 | 398 | } | 403 | } |
48 | 399 | function set_usage(product) { | 404 | function set_usage(product) { |
49 | 400 | that.replace_product(product); | 405 | that.replace_product(product); |
50 | 406 | productseries_check.set('pending', false); | ||
51 | 401 | that.update(); | 407 | that.update(); |
52 | 402 | that.flash_check_green(productseries_check); | 408 | that.flash_check_green(productseries_check); |
53 | 403 | } | 409 | } |
56 | 404 | var css_selector = this.visible_check_selector(productseries_check); | 410 | var io_handler = new IOHandler(this, productseries_check); |
55 | 405 | var io_handler = new IOHandler(css_selector); | ||
57 | 406 | save_productseries(io_handler.chain_config( | 411 | save_productseries(io_handler.chain_config( |
58 | 407 | get_productseries, cache_productseries, cache_branch, set_usage)); | 412 | get_productseries, cache_productseries, cache_branch, set_usage)); |
59 | 408 | }, | 413 | }, |
60 | @@ -421,6 +426,8 @@ | |||
61 | 421 | * closure, such as "that" and "branch_summary". | 426 | * closure, such as "that" and "branch_summary". |
62 | 422 | */ | 427 | */ |
63 | 423 | function save_branch(config) { | 428 | function save_branch(config) { |
64 | 429 | branch_check.set('pending', true); | ||
65 | 430 | that.update_check(branch_check); | ||
66 | 424 | productseries.set('branch_link', branch_summary.api_uri); | 431 | productseries.set('branch_link', branch_summary.api_uri); |
67 | 425 | productseries.lp_save(config); | 432 | productseries.lp_save(config); |
68 | 426 | } | 433 | } |
69 | @@ -433,11 +440,11 @@ | |||
70 | 433 | } | 440 | } |
71 | 434 | function finish(new_productseries){ | 441 | function finish(new_productseries){ |
72 | 435 | that.replace_productseries(new_productseries); | 442 | that.replace_productseries(new_productseries); |
73 | 443 | branch_check.set('pending', false); | ||
74 | 436 | that.update(); | 444 | that.update(); |
75 | 437 | that.flash_check_green(branch_check); | 445 | that.flash_check_green(branch_check); |
76 | 438 | } | 446 | } |
79 | 439 | css_selector = that.visible_check_selector(branch_check); | 447 | var io_handler = new IOHandler(this, branch_check); |
78 | 440 | var io_handler = new IOHandler(css_selector); | ||
80 | 441 | save_branch(io_handler.chain_config(get_branch, set_link, finish)); | 448 | save_branch(io_handler.chain_config(get_branch, set_link, finish)); |
81 | 442 | }, | 449 | }, |
82 | 443 | /** | 450 | /** |
83 | @@ -475,6 +482,7 @@ | |||
84 | 475 | */ | 482 | */ |
85 | 476 | update_check: function(check){ | 483 | update_check: function(check){ |
86 | 477 | var complete = Y.one(this.check_selector(check, true)); | 484 | var complete = Y.one(this.check_selector(check, true)); |
87 | 485 | var hide_picker = !check.get('enabled') || check.get('pending'); | ||
88 | 478 | var link = complete.one('.link a'); | 486 | var link = complete.one('.link a'); |
89 | 479 | if (link !== null){ | 487 | if (link !== null){ |
90 | 480 | link.set('href', check.get('url')); | 488 | link.set('href', check.get('url')); |
91 | @@ -484,14 +492,19 @@ | |||
92 | 484 | complete.toggleClass('lowlight', !check.get('enabled')); | 492 | complete.toggleClass('lowlight', !check.get('enabled')); |
93 | 485 | var complete_picker = Y.one(this.picker_selector(check, true)); | 493 | var complete_picker = Y.one(this.picker_selector(check, true)); |
94 | 486 | if (complete_picker !== null) { | 494 | if (complete_picker !== null) { |
96 | 487 | complete_picker.toggleClass('unseen', !check.get('enabled')); | 495 | complete_picker.toggleClass('unseen', hide_picker); |
97 | 488 | } | 496 | } |
98 | 489 | var incomplete = Y.one(this.check_selector(check, false)); | 497 | var incomplete = Y.one(this.check_selector(check, false)); |
99 | 490 | incomplete.toggleClass('unseen', check.get('complete')); | 498 | incomplete.toggleClass('unseen', check.get('complete')); |
100 | 491 | incomplete.toggleClass('lowlight', !check.get('enabled')); | 499 | incomplete.toggleClass('lowlight', !check.get('enabled')); |
101 | 492 | var incomplete_picker = Y.one(this.picker_selector(check, false)); | 500 | var incomplete_picker = Y.one(this.picker_selector(check, false)); |
102 | 493 | if (incomplete_picker !== null) { | 501 | if (incomplete_picker !== null) { |
104 | 494 | incomplete_picker.toggleClass('unseen', !check.get('enabled')); | 502 | incomplete_picker.toggleClass('unseen', hide_picker); |
105 | 503 | } | ||
106 | 504 | var selector = this.visible_check_selector(check) + '-spinner'; | ||
107 | 505 | var spinner = Y.one(selector); | ||
108 | 506 | if (Y.Lang.isValue(spinner)){ | ||
109 | 507 | spinner.toggleClass('unseen', !check.get('pending')); | ||
110 | 495 | } | 508 | } |
111 | 496 | }, | 509 | }, |
112 | 497 | flash_check_green: function(check) { | 510 | flash_check_green: function(check) { |
113 | @@ -542,14 +555,15 @@ | |||
114 | 542 | product_series.set('translations_autoimport_mode', mode); | 555 | product_series.set('translations_autoimport_mode', mode); |
115 | 543 | var autoimport_check = sharing_controller.get( | 556 | var autoimport_check = sharing_controller.get( |
116 | 544 | 'tsconfig').get('autoimport'); | 557 | 'tsconfig').get('autoimport'); |
120 | 545 | var css_selector = sharing_controller.visible_check_selector( | 558 | handler = new IOHandler(sharing_controller, autoimport_check); |
118 | 546 | autoimport_check); | ||
119 | 547 | handler = new IOHandler(css_selector); | ||
121 | 548 | function update_controller() { | 559 | function update_controller() { |
122 | 549 | sharing_controller.set_autoimport_mode(mode); | 560 | sharing_controller.set_autoimport_mode(mode); |
123 | 561 | autoimport_check.set('pending', false); | ||
124 | 550 | sharing_controller.update(); | 562 | sharing_controller.update(); |
125 | 551 | sharing_controller.flash_check_green(autoimport_check); | 563 | sharing_controller.flash_check_green(autoimport_check); |
126 | 552 | } | 564 | } |
127 | 565 | autoimport_check.set('pending', true); | ||
128 | 566 | sharing_controller.update_check(autoimport_check); | ||
129 | 553 | /* XXX: AaronBentley 2011-04-04 bug=369293: Avoid 412 on repeated | 567 | /* XXX: AaronBentley 2011-04-04 bug=369293: Avoid 412 on repeated |
130 | 554 | * changes. This does not increase the risk of changing from a | 568 | * changes. This does not increase the risk of changing from a |
131 | 555 | * stale value, because the staleness check is not reasonable. | 569 | * stale value, because the staleness check is not reasonable. |
132 | @@ -581,12 +595,14 @@ | |||
133 | 581 | } | 595 | } |
134 | 582 | function replace_product(new_product) { | 596 | function replace_product(new_product) { |
135 | 583 | sharing_controller.replace_product(new_product); | 597 | sharing_controller.replace_product(new_product); |
136 | 598 | usage.set('pending', false); | ||
137 | 584 | sharing_controller.update(); | 599 | sharing_controller.update(); |
138 | 585 | sharing_controller.flash_check_green(usage); | 600 | sharing_controller.flash_check_green(usage); |
139 | 586 | } | 601 | } |
140 | 587 | css_selector = sharing_controller.visible_check_selector(usage); | ||
141 | 588 | var io_handler = new IOHandler( | 602 | var io_handler = new IOHandler( |
143 | 589 | css_selector, new Y.lp.client.FormErrorHandler()); | 603 | sharing_controller, usage, new Y.lp.client.FormErrorHandler()); |
144 | 604 | usage.set('pending', true); | ||
145 | 605 | sharing_controller.update_check(usage); | ||
146 | 590 | var config = io_handler.chain_config( | 606 | var config = io_handler.chain_config( |
147 | 591 | get_productseries, replace_productseries, get_product, | 607 | get_productseries, replace_productseries, get_product, |
148 | 592 | replace_product); | 608 | replace_product); |
149 | 593 | 609 | ||
150 | === modified file 'lib/lp/translations/javascript/tests/test_sourcepackage_sharing_details.html' | |||
151 | --- lib/lp/translations/javascript/tests/test_sourcepackage_sharing_details.html 2011-04-04 19:36:27 +0000 | |||
152 | +++ lib/lp/translations/javascript/tests/test_sourcepackage_sharing_details.html 2011-04-18 13:41:39 +0000 | |||
153 | @@ -46,8 +46,13 @@ | |||
154 | 46 | <div id="branch-complete">Branch selected: <span class="link"><a | 46 | <div id="branch-complete">Branch selected: <span class="link"><a |
155 | 47 | href="#" class="link"></a></span> | 47 | href="#" class="link"></a></span> |
156 | 48 | <span id="branch-complete-picker"><a href="#"></a></span> | 48 | <span id="branch-complete-picker"><a href="#"></a></span> |
159 | 49 | </div> | 49 | <img src="../../../../canonical/launchpad/images/spinner.gif" |
160 | 50 | <div id="branch-incomplete">No branch selected.</div> | 50 | id="branch-complete-spinner"/> |
161 | 51 | </div> | ||
162 | 52 | <div id="branch-incomplete">No branch selected. | ||
163 | 53 | <img src="../../../../canonical/launchpad/images/spinner.gif" | ||
164 | 54 | id="branch-incomplete-spinner"/> | ||
165 | 55 | </div> | ||
166 | 51 | <span id="branch-incomplete-picker"><a href="#"></a></span> | 56 | <span id="branch-incomplete-picker"><a href="#"></a></span> |
167 | 52 | <div id="translation-incomplete"> | 57 | <div id="translation-incomplete"> |
168 | 53 | Translations are not enabled on the upstream project. | 58 | Translations are not enabled on the upstream project. |
169 | @@ -58,12 +63,16 @@ | |||
170 | 58 | <a href="#enable-translations"></a> | 63 | <a href="#enable-translations"></a> |
171 | 59 | </div> | 64 | </div> |
172 | 60 | <div id="upstream-sync-incomplete"> | 65 | <div id="upstream-sync-incomplete"> |
175 | 61 | Automatic synchronization of translations is not enabled. | 66 | Automatic synchronization of translations is not enabled. |
176 | 62 | <a href="#enable-sync"></a> | 67 | <img src="../../../../canonical/launchpad/images/spinner.gif" |
177 | 68 | id="upstream-sync-incomplete-spinner"/> | ||
178 | 69 | <span id="upstream-sync-incomplete-picker"><a href="#enable-sync"></a></span> | ||
179 | 63 | </div> | 70 | </div> |
180 | 64 | <div id="upstream-sync-complete"> | 71 | <div id="upstream-sync-complete"> |
181 | 65 | Automatic synchronization of translations is enabled. | 72 | Automatic synchronization of translations is enabled. |
183 | 66 | <a href="#enable-sync"></a> | 73 | <span id="upstream-sync-complete-picker"><a href="#enable-sync"></a></span> |
184 | 74 | <img src="../../../../canonical/launchpad/images/spinner.gif" | ||
185 | 75 | id="upstream-sync-complete-spinner"/> | ||
186 | 67 | </div> | 76 | </div> |
187 | 68 | </div> | 77 | </div> |
188 | 69 | <!-- The test output --> | 78 | <!-- The test output --> |
189 | 70 | 79 | ||
190 | === modified file 'lib/lp/translations/javascript/tests/test_sourcepackage_sharing_details.js' | |||
191 | --- lib/lp/translations/javascript/tests/test_sourcepackage_sharing_details.js 2011-04-14 15:43:14 +0000 | |||
192 | +++ lib/lp/translations/javascript/tests/test_sourcepackage_sharing_details.js 2011-04-18 13:41:39 +0000 | |||
193 | @@ -210,6 +210,39 @@ | |||
194 | 210 | ctrl.update_check(branch); | 210 | ctrl.update_check(branch); |
195 | 211 | Y.Assert.isFalse(incomplete.hasClass('lowlight')); | 211 | Y.Assert.isFalse(incomplete.hasClass('lowlight')); |
196 | 212 | }, | 212 | }, |
197 | 213 | test_update_check_pending: function(){ | ||
198 | 214 | var incomplete_spinner = Y.one( | ||
199 | 215 | '#upstream-sync-incomplete-spinner'); | ||
200 | 216 | var ctrl = new TranslationSharingController(); | ||
201 | 217 | var autoimport = ctrl.get('tsconfig').get('autoimport'); | ||
202 | 218 | var branch = ctrl.get('tsconfig').get('branch'); | ||
203 | 219 | branch.set_link('a', 'b'); | ||
204 | 220 | var incomplete_picker = Y.one( | ||
205 | 221 | ctrl.picker_selector(autoimport, false)); | ||
206 | 222 | ctrl.update_check(autoimport); | ||
207 | 223 | Y.Assert.isTrue( | ||
208 | 224 | incomplete_spinner.hasClass('unseen'), 'spinner unseen'); | ||
209 | 225 | Y.Assert.isFalse( | ||
210 | 226 | incomplete_picker.hasClass('unseen'), 'picker seen'); | ||
211 | 227 | autoimport.set('pending', true); | ||
212 | 228 | ctrl.update_check(autoimport); | ||
213 | 229 | Y.Assert.isFalse( | ||
214 | 230 | incomplete_spinner.hasClass('unseen'), 'spinner seen'); | ||
215 | 231 | Y.Assert.isTrue( | ||
216 | 232 | incomplete_picker.hasClass('unseen'), 'picker unseen'); | ||
217 | 233 | autoimport.set('complete', true); | ||
218 | 234 | var complete_spinner = Y.one( | ||
219 | 235 | '#upstream-sync-complete-spinner'); | ||
220 | 236 | var complete_picker = Y.one( | ||
221 | 237 | ctrl.picker_selector(autoimport, true)); | ||
222 | 238 | ctrl.update_check(autoimport); | ||
223 | 239 | Y.Assert.isFalse(complete_spinner.hasClass('unseen')); | ||
224 | 240 | Y.Assert.isTrue(complete_picker.hasClass('unseen')); | ||
225 | 241 | autoimport.set('pending', false); | ||
226 | 242 | ctrl.update_check(autoimport); | ||
227 | 243 | Y.Assert.isTrue(complete_spinner.hasClass('unseen')); | ||
228 | 244 | Y.Assert.isFalse(complete_picker.hasClass('unseen')); | ||
229 | 245 | }, | ||
230 | 213 | test_set_autoimport_mode: function() { | 246 | test_set_autoimport_mode: function() { |
231 | 214 | var ctrl = new TranslationSharingController(); | 247 | var ctrl = new TranslationSharingController(); |
232 | 215 | var check = ctrl.get('tsconfig').get('autoimport'); | 248 | var check = ctrl.get('tsconfig').get('autoimport'); |
233 | 216 | 249 | ||
234 | === modified file 'lib/lp/translations/templates/sourcepackage-sharing-details.pt' | |||
235 | --- lib/lp/translations/templates/sourcepackage-sharing-details.pt 2011-04-11 17:16:28 +0000 | |||
236 | +++ lib/lp/translations/templates/sourcepackage-sharing-details.pt 2011-04-18 13:41:39 +0000 | |||
237 | @@ -39,6 +39,8 @@ | |||
238 | 39 | <span id="packaging-incomplete-picker"> | 39 | <span id="packaging-incomplete-picker"> |
239 | 40 | <a tal:replace="structure view/set_packaging_link/escapedtext" /> | 40 | <a tal:replace="structure view/set_packaging_link/escapedtext" /> |
240 | 41 | </span> | 41 | </span> |
241 | 42 | <img src="/@@/spinner" class="unseen" | ||
242 | 43 | id="packaging-incomplete-spinner"/> | ||
243 | 42 | </li> | 44 | </li> |
244 | 43 | <li tal:attributes="class view/packaging_complete_class" | 45 | <li tal:attributes="class view/packaging_complete_class" |
245 | 44 | id="packaging-complete"> | 46 | id="packaging-complete"> |
246 | @@ -51,6 +53,8 @@ | |||
247 | 51 | <span id="packaging-complete-picker"> | 53 | <span id="packaging-complete-picker"> |
248 | 52 | <a tal:replace="structure view/change_packaging_link/escapedtext" /> | 54 | <a tal:replace="structure view/change_packaging_link/escapedtext" /> |
249 | 53 | </span> | 55 | </span> |
250 | 56 | <img src="/@@/spinner" class="unseen" | ||
251 | 57 | id="packaging-complete-spinner"/> | ||
252 | 54 | <a tal:replace="structure view/remove_packaging_link/escapedtext" /> | 58 | <a tal:replace="structure view/remove_packaging_link/escapedtext" /> |
253 | 55 | </li> | 59 | </li> |
254 | 56 | <li tal:attributes="class view/branch_incomplete_class" | 60 | <li tal:attributes="class view/branch_incomplete_class" |
255 | @@ -59,6 +63,8 @@ | |||
256 | 59 | <span id="branch-incomplete-picker"> | 63 | <span id="branch-incomplete-picker"> |
257 | 60 | <a tal:replace="structure view/new_branch_link/escapedtext" /> | 64 | <a tal:replace="structure view/new_branch_link/escapedtext" /> |
258 | 61 | </span> | 65 | </span> |
259 | 66 | <img src="/@@/spinner" class="unseen" | ||
260 | 67 | id="branch-incomplete-spinner"/> | ||
261 | 62 | </li> | 68 | </li> |
262 | 63 | <li tal:attributes="class view/branch_complete_class" | 69 | <li tal:attributes="class view/branch_complete_class" |
263 | 64 | id="branch-complete"> | 70 | id="branch-complete"> |
264 | @@ -69,6 +75,8 @@ | |||
265 | 69 | <span id="branch-complete-picker"> | 75 | <span id="branch-complete-picker"> |
266 | 70 | <a tal:replace="structure view/change_branch_link/escapedtext" /> | 76 | <a tal:replace="structure view/change_branch_link/escapedtext" /> |
267 | 71 | </span> | 77 | </span> |
268 | 78 | <img src="/@@/spinner" class="unseen" | ||
269 | 79 | id="branch-complete-spinner"/> | ||
270 | 72 | </li> | 80 | </li> |
271 | 73 | <li tal:attributes="class view/translations_disabled_class" | 81 | <li tal:attributes="class view/translations_disabled_class" |
272 | 74 | id="translation-incomplete"> | 82 | id="translation-incomplete"> |
273 | @@ -76,6 +84,8 @@ | |||
274 | 76 | <span id="translation-incomplete-picker"> | 84 | <span id="translation-incomplete-picker"> |
275 | 77 | <a tal:replace="structure view/configure_translations_link_unconfigured/escapedtext" /> | 85 | <a tal:replace="structure view/configure_translations_link_unconfigured/escapedtext" /> |
276 | 78 | </span> | 86 | </span> |
277 | 87 | <img src="/@@/spinner" class="unseen" | ||
278 | 88 | id="translation-incomplete-spinner"/> | ||
279 | 79 | </li> | 89 | </li> |
280 | 80 | <li tal:attributes="class view/translations_enabled_class" | 90 | <li tal:attributes="class view/translations_enabled_class" |
281 | 81 | id="translation-complete"> | 91 | id="translation-complete"> |
282 | @@ -83,6 +93,8 @@ | |||
283 | 83 | <span id="translation-complete-picker"> | 93 | <span id="translation-complete-picker"> |
284 | 84 | <a tal:replace="structure view/configure_translations_link_configured/escapedtext" /> | 94 | <a tal:replace="structure view/configure_translations_link_configured/escapedtext" /> |
285 | 85 | </span> | 95 | </span> |
286 | 96 | <img src="/@@/spinner" class="unseen" | ||
287 | 97 | id="translation-complete-spinner"/> | ||
288 | 86 | </li> | 98 | </li> |
289 | 87 | <li tal:attributes="class view/upstream_sync_disabled_class" | 99 | <li tal:attributes="class view/upstream_sync_disabled_class" |
290 | 88 | id="upstream-sync-incomplete"> | 100 | id="upstream-sync-incomplete"> |
291 | @@ -90,6 +102,8 @@ | |||
292 | 90 | <span id="upstream-sync-incomplete-picker"> | 102 | <span id="upstream-sync-incomplete-picker"> |
293 | 91 | <a tal:replace="structure view/translation_sync_link_unconfigured/escapedtext" /> | 103 | <a tal:replace="structure view/translation_sync_link_unconfigured/escapedtext" /> |
294 | 92 | </span> | 104 | </span> |
295 | 105 | <img src="/@@/spinner" class="unseen" | ||
296 | 106 | id="upstream-sync-incomplete-spinner"/> | ||
297 | 93 | </li> | 107 | </li> |
298 | 94 | <li tal:attributes="class view/upstream_sync_enabled_class" | 108 | <li tal:attributes="class view/upstream_sync_enabled_class" |
299 | 95 | id="upstream-sync-complete"> | 109 | id="upstream-sync-complete"> |
300 | @@ -97,6 +111,8 @@ | |||
301 | 97 | <span id="upstream-sync-complete-picker"> | 111 | <span id="upstream-sync-complete-picker"> |
302 | 98 | <a tal:replace="structure view/translation_sync_link_configured/escapedtext" /> | 112 | <a tal:replace="structure view/translation_sync_link_configured/escapedtext" /> |
303 | 99 | </span> | 113 | </span> |
304 | 114 | <img src="/@@/spinner" class="unseen" | ||
305 | 115 | id="upstream-sync-complete-spinner"/> | ||
306 | 100 | </li> | 116 | </li> |
307 | 101 | </ul> | 117 | </ul> |
308 | 102 | </dd> | 118 | </dd> |