Merge lp:~stephen-stewart/snapweb/success-and-failure-messaging-view into lp:~snappy-dev/snapweb/trunk

Proposed by Stephen Stewart on 2015-05-05
Status: Merged
Approved by: John Lenton on 2015-05-05
Approved revision: 156
Merged at revision: 113
Proposed branch: lp:~stephen-stewart/snapweb/success-and-failure-messaging-view
Merge into: lp:~snappy-dev/snapweb/trunk
Prerequisite: lp:~stephen-stewart/snapweb/bem-html-css-for-great-justice
Diff against target: 377 lines (+182/-18)
16 files modified
www/src/css/alert.css (+31/-0)
www/src/css/base.css (+25/-0)
www/src/css/install.css (+6/-0)
www/src/css/snap.css (+0/-1)
www/src/js/app.js (+7/-7)
www/src/js/models/snap.js (+0/-1)
www/src/js/templates/alerts.hbs (+6/-0)
www/src/js/templates/layout.hbs (+1/-0)
www/src/js/templates/snap-layout.hbs (+1/-2)
www/src/js/views/alerts.js (+33/-0)
www/src/js/views/layout.js (+12/-3)
www/src/js/views/snap-layout.js (+4/-2)
www/src/js/views/snap-menu.js (+2/-0)
www/tests/alertViewSpec.js (+52/-0)
www/tests/snapItemViewSpec.js (+1/-1)
www/tests/snapLayoutViewSpec.js (+1/-1)
To merge this branch: bzr merge lp:~stephen-stewart/snapweb/success-and-failure-messaging-view
Reviewer Review Type Date Requested Status
John Lenton 2015-05-05 Approve on 2015-05-05
Review via email: mp+258266@code.launchpad.net

Commit Message

add a failure view

To post a comment you must log in.
John Lenton (chipaca) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'www/src/css/alert.css'
2--- www/src/css/alert.css 1970-01-01 00:00:00 +0000
3+++ www/src/css/alert.css 2015-05-05 15:24:24 +0000
4@@ -0,0 +1,31 @@
5+.b-alert {
6+ position: relative;
7+ width: 600px;
8+ margin: 0 auto;
9+ background-color: rgb(255, 255, 255);
10+ border-radius: 0px;
11+ border: 4px solid #DADADA;
12+ padding: 1em 2em;
13+ border-top: none;
14+ color: #dd4814;
15+ border-bottom-left-radius: 6px;
16+ border-bottom-right-radius: 6px;
17+}
18+
19+.b-alert__close {
20+ position: absolute;
21+ top: 0;
22+ right: 0;
23+ font-size: 14px;
24+ line-height: 1;
25+}
26+
27+.b-alert__close a {
28+ text-decoration:none;
29+ color: #ccc;
30+ display:block;
31+ width:40px;
32+ height:40px;
33+ text-align:right;
34+ padding:6px 10px
35+}
36
37=== added file 'www/src/css/base.css'
38--- www/src/css/base.css 1970-01-01 00:00:00 +0000
39+++ www/src/css/base.css 2015-05-05 15:24:24 +0000
40@@ -0,0 +1,25 @@
41+html {
42+ box-sizing: border-box;
43+}
44+
45+*, *:before, *:after {
46+ box-sizing: inherit;
47+}
48+
49+html, body {
50+ font: normal 300 15px/1.4 'Ubuntu', 'Arial', 'libra sans', sans-serif;
51+ background-color:white;
52+ color:#333;
53+}
54+
55+body {
56+ background: url('../images/image-background-paper.png') repeat-y fixed 50% 0 #f7f7f7;
57+}
58+
59+a {
60+ color:#dd4814;
61+}
62+
63+h1 {
64+ font-weight:300;
65+}
66
67=== modified file 'www/src/css/install.css'
68--- www/src/css/install.css 2015-05-05 15:24:24 +0000
69+++ www/src/css/install.css 2015-05-05 15:24:24 +0000
70@@ -28,6 +28,12 @@
71 cursor:progress;
72 }
73
74+.b-installer__message {
75+ margin-top:4px;
76+ text-align:center;
77+ font-size:12px;
78+}
79+
80 .b-installer__progress {
81 background: white;
82 border-radius:10px;
83
84=== modified file 'www/src/css/snap.css'
85--- www/src/css/snap.css 2015-05-05 15:24:24 +0000
86+++ www/src/css/snap.css 2015-05-05 15:24:24 +0000
87@@ -25,7 +25,6 @@
88 }
89
90 .b-snap__actions {
91- display:flex;
92 flex: 1;
93 }
94
95
96=== modified file 'www/src/js/app.js'
97--- www/src/js/app.js 2015-05-05 15:24:24 +0000
98+++ www/src/js/app.js 2015-05-05 15:24:24 +0000
99@@ -9,17 +9,17 @@
100 if (window.__agent) {
101 window.__agent.start(Backbone, Marionette);
102 }
103-var MainView = require('./views/layout-main.js');
104+var LayoutView = require('./views/layout.js');
105 var router = require('./routers/router.js');
106
107 var webdm = new Marionette.Application();
108-var mainView = new MainView();
109-mainView.render();
110+var layout = new LayoutView();
111+layout.render();
112+
113+$(document).ready(function() {
114+ webdm.start();
115+});
116
117 webdm.on('start', function() {
118 Backbone.history.start({pushState: true});
119 });
120-
121-$(document).ready(function() {
122- webdm.start();
123-});
124
125=== modified file 'www/src/js/models/snap.js'
126--- www/src/js/models/snap.js 2015-05-05 15:24:24 +0000
127+++ www/src/js/models/snap.js 2015-05-05 15:24:24 +0000
128@@ -50,7 +50,6 @@
129 var status = model.get('status') || opts.xhr.status;
130 model.set({
131 'status': model.previous('status'),
132- 'isError': true,
133 'message': response.statusText
134 });
135 });
136
137=== added file 'www/src/js/templates/alerts.hbs'
138--- www/src/js/templates/alerts.hbs 1970-01-01 00:00:00 +0000
139+++ www/src/js/templates/alerts.hbs 2015-05-05 15:24:24 +0000
140@@ -0,0 +1,6 @@
141+<div class="b-alert__message b-alert__message--error">
142+ ERROR: {{ message }}
143+</div>
144+<div class="b-alert__close">
145+ <a href="#">✕</a>
146+</div>
147
148=== renamed file 'www/src/js/templates/layout-main.hbs' => 'www/src/js/templates/layout.hbs'
149--- www/src/js/templates/layout-main.hbs 2015-05-05 15:24:24 +0000
150+++ www/src/js/templates/layout.hbs 2015-05-05 15:24:24 +0000
151@@ -1,3 +1,4 @@
152+<div class="b-layout__alerts"></div>
153 <div class="b-layout__banner"></div>
154 <div class="b-layout__main"></div>
155 <div class="b-layout__footer"></div>
156
157=== modified file 'www/src/js/templates/snap-layout.hbs'
158--- www/src/js/templates/snap-layout.hbs 2015-05-05 15:24:24 +0000
159+++ www/src/js/templates/snap-layout.hbs 2015-05-05 15:24:24 +0000
160@@ -11,9 +11,8 @@
161 {{#if installActionString}}
162 <div class="b-installer__button">{{ installActionString }} {{ name }}</div>
163 {{/if}}
164+ <div class="b-installer__message"></div>
165 </div>
166- <div class="b-installer__message"></div>
167- <div class="b-installer__error">{{ message }}</div>
168 </div>
169 </div>
170
171
172=== added file 'www/src/js/views/alerts.js'
173--- www/src/js/views/alerts.js 1970-01-01 00:00:00 +0000
174+++ www/src/js/views/alerts.js 2015-05-05 15:24:24 +0000
175@@ -0,0 +1,33 @@
176+// global alerts view
177+var $ = require('jquery');
178+var Backbone = require('backbone');
179+Backbone.$ = $;
180+var Marionette = require('backbone.marionette');
181+var template = require('../templates/alerts.hbs');
182+
183+module.exports = Backbone.Marionette.ItemView.extend({
184+
185+ className: 'b-alert',
186+
187+ events: {
188+ 'click @ui.close': 'onClose'
189+ },
190+
191+ ui: {
192+ 'close': '.b-alert__close'
193+ },
194+
195+ template: function(model) {
196+ return template(model);
197+ },
198+
199+ onClose: function(e) {
200+ var model = this.model;
201+ if (e && e.preventDefault) {
202+ e.preventDefault();
203+ }
204+ this.destroy();
205+ model.unset('message', {silent: true});
206+ }
207+
208+});
209
210=== renamed file 'www/src/js/views/layout-main.js' => 'www/src/js/views/layout.js'
211--- www/src/js/views/layout-main.js 2015-05-05 15:24:24 +0000
212+++ www/src/js/views/layout.js 2015-05-05 15:24:24 +0000
213@@ -7,13 +7,15 @@
214 var Radio = require('backbone.radio');
215 var BannerView = require('./layout-banner.js');
216 var FooterView = require('./layout-footer.js');
217-var template = require('../templates/layout-main.hbs');
218+var NotificationsView = require('./alerts.js');
219+var template = require('../templates/layout.hbs');
220 var chan = Radio.channel('root');
221
222 module.exports = Marionette.LayoutView.extend({
223
224 initialize: function() {
225 chan.comply('set:content', this.setContent, this);
226+ chan.comply('alert:error', this.alertError, this);
227 },
228
229 el: '.b-layout',
230@@ -31,9 +33,16 @@
231 this.mainRegion.show(content);
232 },
233
234+ alertError: function(model) {
235+ this.showChildView('alertsRegion', new NotificationsView({
236+ model: model
237+ }));
238+ },
239+
240 regions: {
241 bannerRegion: '.b-layout__banner',
242- mainRegion: '.b-layout__main',
243- footerRegion: '.b-layout__footer'
244+ mainRegion: '.b-layout__main',
245+ footerRegion: '.b-layout__footer',
246+ alertsRegion: '.b-layout__alerts'
247 }
248 });
249
250=== modified file 'www/src/js/views/snap-layout.js'
251--- www/src/js/views/snap-layout.js 2015-05-05 15:24:24 +0000
252+++ www/src/js/views/snap-layout.js 2015-05-05 15:24:24 +0000
253@@ -2,12 +2,14 @@
254 var _ = require('lodash');
255 var Backbone = require('backbone');
256 var Marionette = require('backbone.marionette');
257+var Radio = require('backbone.radio');
258 var SnapMenuView = require('./snap-menu.js');
259 var SnapDetailView = require('./snap-detail.js');
260 var SnapReviewsView = require('./snap-reviews.js');
261 var SnapSettingsView = require('./snap-settings.js');
262 var template = require('../templates/snap-layout.hbs');
263 var CONF = require('../config.js');
264+var chan = Radio.channel('root');
265
266 module.exports = Marionette.LayoutView.extend({
267
268@@ -19,7 +21,7 @@
269 this.model, 'change:status', this.onModelStatusChange
270 );
271 this.listenTo(
272- this.model, 'change:message change:isError', this.onModelError
273+ this.model, 'change:message', this.onModelError
274 );
275 },
276
277@@ -28,7 +30,7 @@
278 },
279
280 onModelError: function(model) {
281- this.ui.errorMessage.text(model.get('message'));
282+ chan.command('alert:error', model);
283 },
284
285 onModelHTMLClassChange: function(model) {
286
287=== modified file 'www/src/js/views/snap-menu.js'
288--- www/src/js/views/snap-menu.js 2015-05-05 15:24:24 +0000
289+++ www/src/js/views/snap-menu.js 2015-05-05 15:24:24 +0000
290@@ -1,5 +1,7 @@
291 // snap menu view
292+var $ = require('jquery');
293 var Backbone = require('backbone');
294+Backbone.$ = $;
295 var Marionette = require('backbone.marionette');
296 var template = require('../templates/snap-menu.hbs');
297
298
299=== added file 'www/tests/alertViewSpec.js'
300--- www/tests/alertViewSpec.js 1970-01-01 00:00:00 +0000
301+++ www/tests/alertViewSpec.js 2015-05-05 15:24:24 +0000
302@@ -0,0 +1,52 @@
303+var $ = require('jquery');
304+var Backbone = require('backbone');
305+Backbone.$ = $;
306+var Backbone = require('backbone');
307+var AlertView = require('../src/js/views/alerts.js');
308+var Snap = require('../src/js/models/snap.js');
309+
310+describe('AlertView', function() {
311+
312+ beforeEach(function() {
313+ var model = this.model = new Snap({
314+ id: 'foo',
315+ message: 'foo'
316+ });
317+ this.view = new AlertView({
318+ model: model
319+ });
320+ });
321+
322+ afterEach(function() {
323+ this.view.destroy();
324+ delete this.view;
325+ });
326+
327+ it('should be an instance of Backbone.View', function() {
328+ expect(AlertView).toBeDefined();
329+ expect(this.view).toEqual(jasmine.any(Backbone.View));
330+ });
331+
332+ it('should destroy the view onClose', function() {
333+ spyOn(this.view, 'destroy');
334+ this.view.onClose();
335+
336+ expect(this.view.destroy).toHaveBeenCalled();
337+ });
338+
339+ it('should preventDefault on close click', function() {
340+ var stubbedEvent = {
341+ preventDefault: function() {}
342+ };
343+ spyOn(stubbedEvent, 'preventDefault');
344+ this.view.onClose(stubbedEvent);
345+ expect(stubbedEvent.preventDefault).toHaveBeenCalled();
346+ });
347+
348+ it('should unset message on the model', function() {
349+ spyOn(this.model, 'unset');
350+ this.view.onClose();
351+ expect(this.model.unset).toHaveBeenCalled();
352+ });
353+
354+});
355
356=== modified file 'www/tests/snapItemViewSpec.js'
357--- www/tests/snapItemViewSpec.js 2015-05-05 15:24:24 +0000
358+++ www/tests/snapItemViewSpec.js 2015-05-05 15:24:24 +0000
359@@ -1,5 +1,5 @@
360+var Backbone = require('backbone');
361 var SnapItemView = require('../src/js/views/snaplist-item.js');
362-var Backbone = require('backbone');
363
364 describe('SnapItemView', function() {
365
366
367=== modified file 'www/tests/snapLayoutViewSpec.js'
368--- www/tests/snapLayoutViewSpec.js 2015-05-05 15:24:24 +0000
369+++ www/tests/snapLayoutViewSpec.js 2015-05-05 15:24:24 +0000
370@@ -1,6 +1,6 @@
371+var Backbone = require('backbone');
372 var Snap = require('../src/js/models/snap.js');
373 var SnapLayoutView = require('../src/js/views/snap-layout.js');
374-var Backbone = require('backbone');
375 var CONF = require('../src/js/config.js');
376
377 describe('SnapLayoutView', function() {

Subscribers

People subscribed via source and target branches