Merge ~deadlight/maas:icon-fixes into ~deadlight/maas:vanilla

Proposed by Karl Williams
Status: Merged
Approved by: Karl Williams
Approved revision: 98089e319085958b2a8e56f6ec3347cc6a8091f6
Merged at revision: e631496a8b036a163110c72ebc6db2b3357b600d
Proposed branch: ~deadlight/maas:icon-fixes
Merge into: ~deadlight/maas:vanilla
Diff against target: 874 lines (+126/-115)
24 files modified
src/maasserver/static/js/angular/controllers/node_details.js (+1/-1)
src/maasserver/static/js/angular/directives/controller_image_status.js (+1/-1)
src/maasserver/static/js/angular/directives/controller_status.js (+1/-1)
src/maasserver/static/js/angular/directives/error_overlay.js (+1/-1)
src/maasserver/static/js/angular/directives/maas_obj_form.js (+2/-2)
src/maasserver/static/js/angular/directives/script_status.js (+7/-7)
src/maasserver/static/js/angular/directives/tests/test_script_status.js (+10/-10)
src/maasserver/static/partials/boot-images.html (+10/-17)
src/maasserver/static/partials/cards/services.html (+5/-2)
src/maasserver/static/partials/intro-user.html (+4/-5)
src/maasserver/static/partials/intro.html (+1/-2)
src/maasserver/static/partials/machines-table.html (+6/-6)
src/maasserver/static/partials/networks-list.html (+1/-1)
src/maasserver/static/partials/node-details.html (+23/-27)
src/maasserver/static/partials/node-events.html (+1/-1)
src/maasserver/static/partials/pod-details.html (+2/-2)
src/maasserver/static/partials/script-results-list.html (+1/-4)
src/maasserver/static/partials/settings.html (+1/-1)
src/maasserver/static/partials/switches-table.html (+2/-2)
src/maasserver/static/partials/vlan-details.html (+1/-1)
src/maasserver/static/scss/_patterns_icons.scss (+32/-18)
src/maasserver/static/scss/_utils.scss (+9/-0)
src/maasserver/static/scss/build.scss (+1/-0)
src/maasserver/templates/maasserver/zone_list.html (+3/-3)
Reviewer Review Type Date Requested Status
Anthony Dillon (community) Approve
Review via email: mp+337231@code.launchpad.net

Description of the change

Fixes for the styling of icons across the app.

QA:

Nodes list: see all of the icons positioned
Nodes -> contollers -> controller details:
  - see the services card icon correctly positioned
  - click the Events tab - see the icon displayed in the table
  - click the Commissioning tab - see the icon displayed close to the name

Pod details
  - see that all of the icons in the summary table are displayed correctly

Machine details:
  - select the hardware tests tab - see the icon displayed closely to the name
  - check Commissioning and Evens in this context and see that they're also displaying correctly

Ensure that all of the above icons work in Firefox too.

To post a comment you must log in.
Revision history for this message
Anthony Dillon (ya-bo-ng) wrote :

Good stuff, two very small comments.

review: Needs Fixing
Revision history for this message
Karl Williams (deadlight) wrote :

I've fixed the issues that you identified.

Revision history for this message
Anthony Dillon (ya-bo-ng) wrote :

LGTM +1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/static/js/angular/controllers/node_details.js b/src/maasserver/static/js/angular/controllers/node_details.js
2index 1633a61..a1a8784 100644
3--- a/src/maasserver/static/js/angular/controllers/node_details.js
4+++ b/src/maasserver/static/js/angular/controllers/node_details.js
5@@ -1083,7 +1083,7 @@ angular.module('MAAS').controller('NodeDetailsController', [
6 if(service.status === "running") {
7 return "success";
8 } else if(service.status === "dead") {
9- return "power-error";
10+ return "error";
11 } else if(service.status === "degraded") {
12 return "warning";
13 } else {
14diff --git a/src/maasserver/static/js/angular/directives/controller_image_status.js b/src/maasserver/static/js/angular/directives/controller_image_status.js
15index 71efc55..003b22a 100644
16--- a/src/maasserver/static/js/angular/directives/controller_image_status.js
17+++ b/src/maasserver/static/js/angular/directives/controller_image_status.js
18@@ -126,7 +126,7 @@ angular.module('MAAS').directive('maasControllerImageStatus',
19 systemId: "="
20 },
21 template: [
22- '<i class="icon icon--loading u-animation--spin"',
23+ '<i class="p-icon--loading u-animation--spin"',
24 'data-ng-if="showSpinner()"></i> ',
25 '{$ getImageStatus() $}'].join(''),
26 link: function(scope, element, attrs) {
27diff --git a/src/maasserver/static/js/angular/directives/controller_status.js b/src/maasserver/static/js/angular/directives/controller_status.js
28index a2b5514..e72607b 100644
29--- a/src/maasserver/static/js/angular/directives/controller_status.js
30+++ b/src/maasserver/static/js/angular/directives/controller_status.js
31@@ -8,7 +8,7 @@ angular.module('MAAS').run(['$templateCache', function ($templateCache) {
32 // Inject the controller-status.html into the template cache.
33 $templateCache.put('directive/templates/controller-status.html', [
34 '<span>',
35- '<span class="icon icon--{$ serviceClass $}" data-ng-if="!textOnly">',
36+ '<span class="p-icon--{$ serviceClass $}" data-ng-if="!textOnly">',
37 '</span>',
38 '<span data-ng-if="textOnly" data-ng-bind="serviceText"></span>',
39 '</span>'
40diff --git a/src/maasserver/static/js/angular/directives/error_overlay.js b/src/maasserver/static/js/angular/directives/error_overlay.js
41index fd33b0e..62baabc 100644
42--- a/src/maasserver/static/js/angular/directives/error_overlay.js
43+++ b/src/maasserver/static/js/angular/directives/error_overlay.js
44@@ -13,7 +13,7 @@ angular.module('MAAS').run(['$templateCache', function ($templateCache) {
45 '<header id="error-header" class="page-header" data-ng-show="show()">',
46 '<div class="row">',
47 '<h1 class="page-header__title">',
48- '<span class="icon icon--loading u-animation--spin ',
49+ '<span class="p-icon--loading u-animation--spin ',
50 'u-margin--right-small"',
51 'data-ng-hide="clientError"></span>',
52 '{$ getTitle() $}',
53diff --git a/src/maasserver/static/js/angular/directives/maas_obj_form.js b/src/maasserver/static/js/angular/directives/maas_obj_form.js
54index 8cd2387..679b8ef 100644
55--- a/src/maasserver/static/js/angular/directives/maas_obj_form.js
56+++ b/src/maasserver/static/js/angular/directives/maas_obj_form.js
57@@ -582,7 +582,7 @@ angular.module('MAAS').directive('maasObjField', ['$compile',
58 && attrs.labelInfo.length > 0) {
59 var infoElement = angular.element('<i/>');
60 infoElement.addClass('icon');
61- infoElement.addClass('icon--info');
62+ infoElement.addClass('p-icon--information');
63 infoElement.addClass('tooltip tooltip--left');
64 infoElement.addClass('u-margin--left-tiny');
65 if(attrs.labelLeft === "true") {
66@@ -1070,7 +1070,7 @@ angular.module('MAAS').directive('maasObjSaving', function() {
67 transclude: true,
68 template: [
69 '<span data-ng-if="saving">',
70- '<i class="icon icon--loading u-animation--spin"></i>',
71+ '<i class="p-icon--loading u-animation--spin"></i>',
72 '<span data-ng-transclude></span>',
73 '</span>'].join(''),
74 link: function(scope, element, attrs, controller) {
75diff --git a/src/maasserver/static/js/angular/directives/script_status.js b/src/maasserver/static/js/angular/directives/script_status.js
76index d6e17d2..b1a3162 100644
77--- a/src/maasserver/static/js/angular/directives/script_status.js
78+++ b/src/maasserver/static/js/angular/directives/script_status.js
79@@ -7,7 +7,7 @@
80 angular.module('MAAS').run(['$templateCache', function ($templateCache) {
81 // Inject the script_status.html into the template cache.
82 $templateCache.put('directive/templates/script_status.html', [
83- '<span class="icon" data-ng-class="icon" data-ng-show="show"></span>'
84+ '<span class="p-icon" data-ng-class="icon" data-ng-show="show"></span>'
85 ].join(''));
86 }]);
87
88@@ -25,17 +25,17 @@ angular.module('MAAS').directive('maasScriptStatus', function() {
89 switch($scope.scriptStatus) {
90 // SCRIPT_STATUS.PENDING
91 case 0:
92- $scope.icon = 'icon--pending';
93+ $scope.icon = 'p-icon--pending';
94 break;
95 // SCRIPT_STATUS.RUNNING
96 case 1:
97 // SCRIPT_STATUS.INSTALLING
98 case 7:
99- $scope.icon = 'icon--running';
100+ $scope.icon = 'p-icon--running';
101 break;
102 // SCRIPT_STATUS.PASSED
103 case 2:
104- $scope.icon = 'icon--pass';
105+ $scope.icon = 'p-icon--pass';
106 break;
107 // SCRIPT_STATUS.FAILED
108 case 3:
109@@ -45,18 +45,18 @@ angular.module('MAAS').directive('maasScriptStatus', function() {
110 case 6:
111 // SCRIPT_STATUS.FAILED_INSTALLING
112 case 8:
113- $scope.icon = 'icon--power-error';
114+ $scope.icon = 'p-icon--power-error';
115 break;
116 // SCRIPT_STATUS.TIMEDOUT
117 case 4:
118- $scope.icon = 'icon--timed-out';
119+ $scope.icon = 'p-icon--timed-out';
120 break;
121 case -1:
122 // No scripts have been run.
123 $scope.show = false;
124 break;
125 default:
126- $scope.icon = 'icon--help';
127+ $scope.icon = 'p-icon--help';
128 break;
129 }
130 }
131diff --git a/src/maasserver/static/js/angular/directives/tests/test_script_status.js b/src/maasserver/static/js/angular/directives/tests/test_script_status.js
132index 70a9a31..c43d192 100644
133--- a/src/maasserver/static/js/angular/directives/tests/test_script_status.js
134+++ b/src/maasserver/static/js/angular/directives/tests/test_script_status.js
135@@ -36,55 +36,55 @@ describe("maasScriptStatus", function() {
136 it("SCRIPT_STATUS.PENDING", function() {
137 var directive = compileDirective("0");
138 var select = directive.find("span");
139- expect(select.attr("class")).toBe("icon icon--pending");
140+ expect(select.attr("class")).toBe("p-icon--pending");
141 });
142
143 it("SCRIPT_STATUS.RUNNING", function() {
144 var directive = compileDirective("1");
145 var select = directive.find("span");
146- expect(select.attr("class")).toBe("icon icon--running");
147+ expect(select.attr("class")).toBe("p-icon--running");
148 });
149
150 it("SCRIPT_STATUS.INSTALLING", function() {
151 var directive = compileDirective("7");
152 var select = directive.find("span");
153- expect(select.attr("class")).toBe("icon icon--running");
154+ expect(select.attr("class")).toBe("p-icon--running");
155 });
156
157 it("SCRIPT_STATUS.PASSED", function() {
158 var directive = compileDirective("2");
159 var select = directive.find("span");
160- expect(select.attr("class")).toBe("icon icon--pass");
161+ expect(select.attr("class")).toBe("p-icon--pass");
162 });
163
164 it("SCRIPT_STATUS.FAILED", function() {
165 var directive = compileDirective("3");
166 var select = directive.find("span");
167- expect(select.attr("class")).toBe("icon icon--power-error");
168+ expect(select.attr("class")).toBe("p-icon--power-error");
169 });
170
171 it("SCRIPT_STATUS.ABORTED", function() {
172 var directive = compileDirective("5");
173 var select = directive.find("span");
174- expect(select.attr("class")).toBe("icon icon--power-error");
175+ expect(select.attr("class")).toBe("p-icon--power-error");
176 });
177
178 it("SCRIPT_STATUS.DEGRADED", function() {
179 var directive = compileDirective("6");
180 var select = directive.find("span");
181- expect(select.attr("class")).toBe("icon icon--power-error");
182+ expect(select.attr("class")).toBe("p-icon--power-error");
183 });
184
185 it("SCRIPT_STATUS.FAILED_INSTALLING", function() {
186 var directive = compileDirective("8");
187 var select = directive.find("span");
188- expect(select.attr("class")).toBe("icon icon--power-error");
189+ expect(select.attr("class")).toBe("p-icon--power-error");
190 });
191
192 it("SCRIPT_STATUS.TIMEDOUT", function() {
193 var directive = compileDirective("4");
194 var select = directive.find("span");
195- expect(select.attr("class")).toBe("icon icon--timed-out");
196+ expect(select.attr("class")).toBe("p-icon--timed-out");
197 });
198
199 it("NONE", function() {
200@@ -96,6 +96,6 @@ describe("maasScriptStatus", function() {
201 it("UNKNOWN", function() {
202 var directive = compileDirective("99");
203 var select = directive.find("span");
204- expect(select.attr("class")).toBe("icon icon--help");
205+ expect(select.attr("class")).toBe("p-icon--help");
206 });
207 });
208diff --git a/src/maasserver/static/partials/boot-images.html b/src/maasserver/static/partials/boot-images.html
209index f0b0d3d..3c9b53b 100644
210--- a/src/maasserver/static/partials/boot-images.html
211+++ b/src/maasserver/static/partials/boot-images.html
212@@ -114,7 +114,7 @@
213 <table data-ng-if="showImagesTable()">
214 <thead>
215 <tr>
216- <th colspan="2">Release</th>
217+ <th>Release</th>
218 <th>Architecture</th>
219 <th>Size</th>
220 <th>Status</th>
221@@ -123,20 +123,18 @@
222 </thead>
223 <tbody>
224 <tr data-ng-if="!ltsIsSelected()">
225- <td colspan="6" aria-label="Error">
226+ <td colspan="5" aria-label="Error">
227 <i class="p-icon--error">Error: </i> Select at least one 14.04+ LTS release and one architecture.
228 </td>
229 </tr>
230 <tr data-ng-if="!commissioningSeriesSelected()">
231- <td colspan="6" aria-label="Error">
232+ <td colspan="5" aria-label="Error">
233 <i class="p-icon--error">Error: </i> Ubuntu {$ bootResources.ubuntu.commissioning_series $} must be selected as it is the operating system used for commissioning.
234 </td>
235 </tr>
236 <tr data-ng-repeat="image in ubuntuImages | orderBy:['-title', 'arch']" data-ng-class="{'is-active': canBeRemoved(image) && ubuntuDeleteId === image.resourceId}">
237- <td>
238- <i class="{$ image.icon $}"></i>
239- </td>
240 <td aria-label="Release">
241+ <i class="{$ image.icon $}"></i>
242 {$ image.title $} <span class="p-tooltip__message" role="tooltip" id="tooltip-{$ image.resourceId}" data-ng-if="canBeRemoved(image)"><i class="p-icon--warning p-tooltip p-tooltip--top-right" aria-describedby="tooltip-{$ image.resourceId}">Image no longer exists at the source.</span></i>
243 </td>
244 <td aria-label="Architecture">{$ image.arch $}</td>
245@@ -180,7 +178,7 @@
246 <table class="p-table-expanding">
247 <thead>
248 <tr>
249- <th colspan="2">Name</th>
250+ <th>Name</th>
251 <th>Architecture</th>
252 <th>Size</th>
253 <th>Status</th>
254@@ -188,13 +186,10 @@
255 </thead>
256 <tbody>
257 <tr data-ng-if="!ubuntuCoreImages.length">
258- <td colspan="5">No images have been selected for syncing.</td>
259+ <td colspan="4">No images have been selected for syncing.</td>
260 </tr>
261 <tr data-ng-repeat="image in ubuntuCoreImages | orderBy:['-title', 'arch']">
262- <td>
263- <i class="{$ image.icon $}"></i>
264- </td>
265- <td aria-label="Name">{$ image.title $}</td>
266+ <td aria-label="Name"><i class="{$ image.icon $}"></i>{$ image.title $}</td>
267 <td aria-label="Architecture">{$ image.arch $}</td>
268 <td aria-label="Size">{$ image.size $}</td>
269 <td aria-label="Status">{$ image.status $}</td>
270@@ -227,7 +222,7 @@
271 <table>
272 <thead>
273 <tr>
274- <th colspan="2">Release</th>
275+ <th>Release</th>
276 <th>Architecture</th>
277 <th>Size</th>
278 <th>Status</th>
279@@ -235,15 +230,13 @@
280 </thead>
281 <tbody>
282 <tr data-ng-if="!otherImages.length">
283- <td colspan="5">
284+ <td colspan="4">
285 No images have been selected for syncing.
286 </td>
287 </tr>
288 <tr data-ng-repeat="image in otherImages | orderBy:['-title', 'arch']">
289- <td>
290- <i class="{$ image.icon $}"></i>
291- </td>
292 <td aria-label="Release">
293+ <i class="{$ image.icon $}"></i>
294 {$ image.title $}
295 </td>
296 <td aria-label="Architecture">{$ image.arch $}</td>
297diff --git a/src/maasserver/static/partials/cards/services.html b/src/maasserver/static/partials/cards/services.html
298index 66c57f5..4a8bc8a 100644
299--- a/src/maasserver/static/partials/cards/services.html
300+++ b/src/maasserver/static/partials/cards/services.html
301@@ -1,6 +1,9 @@
302 <header class="p-card__header">
303- <h2 class="p-heading--four">Services</h2>
304- <h3 class="p-heading--three"><span data-maas-controller-status="node" data-maas-services="services" aria-label="Status"></span> <span data-maas-controller-status="node" data-maas-services="services" data-maas-text-only="true"></span></h3>
305+ <h2 class="p-heading--four">Services</h2>
306+ <div class="u-vertically-center">
307+ <span data-maas-controller-status="node" data-maas-services="services" aria-label="Status" class="u-hide--small"></span>
308+ <h3 class="p-heading--three u-no-margin--top"><span data-maas-controller-status="node" data-maas-services="services" data-maas-text-only="true"></span></h3>
309+ </div>
310 </header>
311 <div>
312 <ul class="p-list-tree" aria-multiselectable="true" role="tablist">
313diff --git a/src/maasserver/static/partials/intro-user.html b/src/maasserver/static/partials/intro-user.html
314index 160e343..3e0384e 100644
315--- a/src/maasserver/static/partials/intro-user.html
316+++ b/src/maasserver/static/partials/intro-user.html
317@@ -2,8 +2,7 @@
318 <div class="row">
319 <div class="p-card--highlighted col-12">
320 <h2 class="p-card__title">
321- <i class="icon icon--large u-margin--right-tiny"
322- data-ng-class="{'icon--success': canContinue(), 'p-icon--success-muted': !canContinue()}"></i>
323+ <i data-ng-class="{'p-icon--success': canContinue(), 'p-icon--success-muted': !canContinue()}"></i>
324 SSH keys for {$ user.username $}
325 </h2>
326 <div class="p-card__content">
327@@ -19,9 +18,9 @@
328 MAAS has been successfully set up
329 </h2>
330 <div class="p-card__content">
331- <p class="u-margin--top"><i class="icon icon--success u-margin--right-small"></i>Once DHCP is enabled, set your machines to PXE boot and they will be automatically enlisted in the Nodes tab.</p>
332- <p class="u-margin--top"><i class="icon icon--success u-margin--right-small"></i>Discovered MAC/IP pairs in your network will be listed on your dashboard and can be added to MAAS.</p>
333- <p class="u-margin--top u-margin--bottom"><i class="icon icon--success u-margin--right-small"></i>The fabrics, VLANs and subnets in your network will be automatically added to MAAS in Networks.</p>
334+ <p class="u-margin--top"><i class="p-icon--success"></i>Once DHCP is enabled, set your machines to PXE boot and they will be automatically enlisted in the Nodes tab.</p>
335+ <p class="u-margin--top"><i class="p-icon--success"></i>Discovered MAC/IP pairs in your network will be listed on your dashboard and can be added to MAAS.</p>
336+ <p class="u-margin--top u-margin--bottom"><i class="p-icon--success"></i>The fabrics, VLANs and subnets in your network will be automatically added to MAAS in Networks.</p>
337 </div>
338 </div>
339 </div>
340diff --git a/src/maasserver/static/partials/intro.html b/src/maasserver/static/partials/intro.html
341index a481a5a..8a9b323 100644
342--- a/src/maasserver/static/partials/intro.html
343+++ b/src/maasserver/static/partials/intro.html
344@@ -3,8 +3,7 @@
345 <div class="col-10">
346 <div class="p-card--highlighted">
347 <h2 class="p-card__title">
348- <i class="icon icon--large u-margin--right-tiny"
349- data-ng-class="{ 'icon--success': !welcomeInError(), 'icon--error': welcomeInError() }"></i>
350+ <i data-ng-class="{ 'p-icon--success': !welcomeInError(), 'p-icon--error': welcomeInError() }"></i>
351 Welcome to MAAS
352 </h2>
353 <div class="p-card__content">
354diff --git a/src/maasserver/static/partials/machines-table.html b/src/maasserver/static/partials/machines-table.html
355index d4bd159..a5adfd3 100644
356--- a/src/maasserver/static/partials/machines-table.html
357+++ b/src/maasserver/static/partials/machines-table.html
358@@ -52,7 +52,7 @@
359 <a href="#/node/{$ node.system_id $}" class="extra-macs" data-ng-show="node.extra_macs.length">(+{$ node.extra_macs.length $})</a>
360 </td>
361 <td class="powerstate u-upper-case--first" aria-label="Power state">
362- <span data-ng-if="node.power_state != 'unknown'" class="icon icon--power-{$ node.power_state $} u-margin--right-tiny"></span> {$ node.power_state $}
363+ <span data-ng-if="node.power_state != 'unknown'" class="p-icon--power-{$ node.power_state $} u-margin--right-tiny"></span> {$ node.power_state $}
364 </td>
365 <td class="u-hide--small">
366 <i data-ng-if="showSpinner(node)" class="p-icon--spinner u-animation--spin u-hide--small"></i>
367@@ -66,28 +66,28 @@
368 {$ getStatusText(node) $}
369 <span class="u-hide--medium u-hide--large">
370 <i data-ng-if="showSpinner(node)" class="p-icon--spinner u-animation--spin"></i>
371- <span class="p-tooltip p-tooltip--top-right">
372+ <span class="p-tooltip p-tooltip--left">
373 <i data-ng-if="showNodeStatus(node)" data-maas-script-status="script-status" data-script-status="node.other_test_status" aria-labelledby="{$ node.other_test_status_tooltip $}"></i>
374 <span class="p-tooltip__message" role="tooltip" id="other-status-tooltip-{$ node.fqdn $}">{$ node.other_test_status_tooltip $}</span>
375 </span>
376- <span class="p-tooltip p-tooltip--top-right">
377+ <span class="p-tooltip p-tooltip--left">
378 <i data-ng-if="showFailedTestWarning(node)" class="p-icon--warning" aria-describedby="failed-test-tooltip-large-{$ node.fqdn $}"></i>
379 <span class="p-tooltip__message" role="tooltip" id="failed-test-tooltip-large-{$ node.fqdn $}">{$ node.other_test_status_tooltip $}</span>
380 </span>
381 </span>
382 </td>
383 <td aria-label="Owner">&nbsp;{$ node.owner $}</td>
384- <td class="u-align--right u-hide--small p-tooltip p-tooltip--top-right" aria-label="CPU">
385+ <td class="u-align--right u-hide--small p-tooltip p-tooltip--left" aria-label="CPU">
386 <span data-maas-script-status="script-status" data-script-status="node.cpu_test_status" data-ng-if="node.cpu_test_status !== 2" aria-describedby="node-cpu-tooltip-{$ node.fqdn $}"></span>
387 {$ node.cpu_count $}
388 <span class="p-tooltip__message" role="tooltip" id="node-cpu-tooltip-{$ node.fqdn $}">{$ node.cpu_test_status_tooltip $}</span>
389 </td>
390- <td class="u-align--right u-hide--small p-tooltip p-tooltip--top-right" aria-label="Memory">
391+ <td class="u-align--right u-hide--small p-tooltip p-tooltip--left" aria-label="Memory">
392 <span data-maas-script-status="script-status" data-script-status="node.memory_test_status" data-ng-if="node.memory_test_status !== 2" aria-describedby="node-memory-tooltip-{$ node.fqdn $}"></span>
393 {$ node.memory $}
394 <span class="p-tooltip__message" role="tooltip" id="node-memory-tooltip-{$ node.fqdn $}">{$ node.memory_test_status_tooltip $}</span>
395 </td>
396- <td class="u-align--right u-hide--small p-tooltip p-tooltip--top-right" aria-label="Disks">
397+ <td class="u-align--right u-hide--small p-tooltip p-tooltip--left" aria-label="Disks">
398 <span class="" data-maas-script-status="script-status" data-script-status="node.storage_test_status" data-ng-if="node.storage_test_status !== 2" aria-describedby="disk-count-tooltip-{$ node.fqdn $}">
399 </span>
400 {$ node.physical_disk_count $}
401diff --git a/src/maasserver/static/partials/networks-list.html b/src/maasserver/static/partials/networks-list.html
402index c7ca14c..0efb77e 100644
403--- a/src/maasserver/static/partials/networks-list.html
404+++ b/src/maasserver/static/partials/networks-list.html
405@@ -190,7 +190,7 @@
406 <tr data-ng-repeat="row in group.spaces.orphanVLANs">
407 <td aria-label="Space">
408 <a data-ng-if="$index === 0" href="#/space/{$ row.space.id $}">(undefined)</a>
409- <span data-ng-if="$index === 0" class="icon icon--warning tooltip tooltip--right u-margin--left-small u-display--desktop"
410+ <span data-ng-if="$index === 0" class="p-icon--warning tooltip tooltip--right u-margin--left-small u-display--desktop"
411 aria-label="MAAS integrations require a space in order to determine the purpose of a network.&#xa;Define a space for each subnet by selecting the space on the VLAN details page.&#xa;If an approprate space does not exist, one may be created on this page."></span>
412 </td>
413 <td>
414diff --git a/src/maasserver/static/partials/node-details.html b/src/maasserver/static/partials/node-details.html
415index c7b7ca3..c8014de 100755
416--- a/src/maasserver/static/partials/node-details.html
417+++ b/src/maasserver/static/partials/node-details.html
418@@ -274,7 +274,7 @@
419 </ul>
420 </nav>
421 </header>
422-
423+
424 <section class="p-strip is-shallow" data-ng-if="section.area === 'summary'">
425 <div class="row">
426 <div data-ng-if="isSuperUser()">
427@@ -288,7 +288,7 @@
428 data-ng-if="!isController && !isDevice && hasInvalidArchitecture() && isRackControllerConnected() && hasUsableArchitectures()">
429 <p class="p-notification__response">
430 <span class="p-notification__status">Error:</span> This machine currently has an invalid architecture. Update the architecture of this machine to make it deployable.
431- </p
432+ </p>
433 </div>
434 <div class="p-notification--negative"
435 data-ng-if="!isController && !isDevice && hasInvalidArchitecture() && isRackControllerConnected() && !hasUsableArchitectures()">
436@@ -594,28 +594,28 @@
437 <ul class="p-list-tree" aria-multiselectable="true" role="tablist">
438 <li class="p-list-tree__item">
439 <span>
440- <span class="icon icon--{$ getServiceClass(services.regiond) $}"></span>
441+ <span class="p-icon--{$ getServiceClass(services.regiond) $}"></span>
442 &nbsp;regiond
443 <span data-ng-if="services.regiond.status_info"> &mdash; {$ services.regiond.status_info $}</span>
444 </span>
445 </li>
446 <li class="p-list-tree__item">
447 <span>
448- <span class="icon icon--{$ getServiceClass(services.bind9) $}"></span>
449+ <span class="p-icon--{$ getServiceClass(services.bind9) $}"></span>
450 &nbsp;bind9
451 <span data-ng-if="services.bind9.status_info"> &mdash; {$ services.bind9.status_info $}</span>
452 </span>
453 </li>
454 <li class="p-list-tree__item">
455 <span>
456- <span class="icon icon--{$ getServiceClass(services.proxy) $}"></span>
457+ <span class="p-icon--{$ getServiceClass(services.proxy) $}"></span>
458 &nbsp;proxy
459 <span data-ng-if="services.proxy.status_info"> &mdash; {$ services.proxy.status_info $}</span>
460 </span>
461 </li>
462 <li class="p-list-tree__item" data-ng-if="services.ntp_region">
463 <span>
464- <span class="icon icon--{$ getServiceClass(services.ntp_region) $}"></span>
465+ <span class="p-icon--{$ getServiceClass(services.ntp_region) $}"></span>
466 &nbsp;ntp
467 <span data-ng-if="services.ntp_region.status_info"> &mdash; {$ services.ntp_region.status_info $}</span>
468 </span>
469@@ -629,21 +629,21 @@
470 <ul class="p-list-tree" aria-multiselectable="true" role="tablist">
471 <li class="p-list-tree__item p-list-tree__item--group">
472 <span>
473- <span class="icon icon--{$ getServiceClass(services.rackd) $}"></span>
474+ <span class="p-icon--{$ getServiceClass(services.rackd) $}"></span>
475 &nbsp;rackd
476 <span data-ng-if="services.rackd.status_info"> &mdash; {$ services.rackd.status_info $}</span>
477 </span>
478 <ul class="p-list-tree" role="tabpanel" aria-hidden="true">
479 <li class="p-list-tree__item">
480 <span>
481- <span class="icon icon--{$ getServiceClass(services.http) $}"></span>
482+ <span class="p-icon--{$ getServiceClass(services.http) $}"></span>
483 &nbsp;http
484 <span data-ng-if="services.http.status_info"> &mdash; {$ services.http.status_info $}</span>
485 </span>
486 </li>
487 <li class="p-list-tree__item">
488 <span>
489- <span class="icon icon--{$ getServiceClass(services.tftp) $}"></span>
490+ <span class="p-icon--{$ getServiceClass(services.tftp) $}"></span>
491 &nbsp;tftp
492 <span data-ng-if="services.tftp.status_info"> &mdash; {$ services.tftp.status_info $}</span>
493 </span>
494@@ -652,28 +652,28 @@
495 </li>
496 <li class="p-list-tree__item">
497 <span>
498- <span class="icon icon--{$ getServiceClass(services.dhcpd) $}"></span>
499+ <span class="p-icon--{$ getServiceClass(services.dhcpd) $}"></span>
500 &nbsp;dhcpd
501 <span data-ng-if="services.dhcpd.status_info"> &mdash; {$ services.dhcpd.status_info $}</span>
502 </span>
503 </li>
504 <li class="p-list-tree__item">
505 <span>
506- <span class="icon icon--{$ getServiceClass(services.dhcpd6) $}"></span>
507+ <span class="p-icon--{$ getServiceClass(services.dhcpd6) $}"></span>
508 &nbsp;dhcpd6
509 <span data-ng-if="services.dhcpd6.status_info"> &mdash; {$ services.dhcpd6.status_info $}</span>
510 </span>
511 </li>
512 <li class="p-list-tree__item">
513 <span>
514- <span class="icon icon--{$ getServiceClass(services.tgt) $}"></span>
515+ <span class="p-icon--{$ getServiceClass(services.tgt) $}"></span>
516 &nbsp;tgt
517 <span data-ng-if="services.tgt.status_info"> &mdash; {$ services.tgt.status_info $}</span>
518 </span>
519 </li>
520 <li class="p-list-tree__item" data-ng-if="services.ntp_rack">
521 <span>
522- <span class="icon icon--{$ getServiceClass(services.ntp_rack) $}"></span>
523+ <span class="p-icon--{$ getServiceClass(services.ntp_rack) $}"></span>
524 &nbsp;ntp
525 <span data-ng-if="services.ntp_rack.status_info"> &mdash; {$ services.ntp_rack.status_info $}</span>
526 </span>
527@@ -869,7 +869,7 @@
528 </div>
529 </td>
530 <td class="p-table-expanding__panel" data-ng-if="isShowingMembers(interface)">
531- <div class="row" data-ng-class="{ 'is-active': isShowingMembers(interface) }"
532+ <div class="row" data-ng-class="{ 'is-active': isShowingMembers(interface) }"
533 data-ng-repeat="member in interface.members"
534 data-ng-show="isShowingMembers(interface)">
535 <div class="col-1"></div>
536@@ -1395,7 +1395,7 @@
537 </select>
538 </div>
539 </div>
540- <div class="p-form__group p-form-validation" data-ng-if="newInterface.mode == 'static'"
541+ <div class="p-form__group p-form-validation" data-ng-if="newInterface.mode == 'static'"
542 data-ng-class="{ 'is-error': isIPAddressInvalid(newInterface) }">
543 <label for="ip-address" class="p-form__label">IP address</label>
544 <div class="p-form__control">
545@@ -1415,7 +1415,7 @@
546 data-ng-class="{ 'is-error': isMACAddressInvalid(newInterface.mac_address, true) }">
547 <label for="mac" class="p-form__label">MAC address</label>
548 <div class="p-form__control">
549- <input name="mac" type="text"
550+ <input name="mac" type="text"
551 class="p-form-validation__input"
552 placeholder="00:00:00:00:00:00"
553 data-ng-model="newInterface.mac_address"
554@@ -1558,7 +1558,7 @@
555 <td class="col-2" aria-label="Mount options">{$ filesystem.mount_options $}</td>
556 <td class="col-2 u-align--right">
557 <div class="p-contextual-menu" toggle-ctrl data-ng-if="!isAllStorageDisabled()">
558- <button class="p-contextual-menu__toggle" aria-controls="#{$ item.name $}-menu"
559+ <button class="p-contextual-menu__toggle" aria-controls="#{$ item.name $}-menu"
560 data-ng-click="toggleMenu()" aria-haspopup="true">View actions</button>
561 <div class="p-contextual-menu__dropdown" role="menu" data-ng-show="isToggled" id="{$ item.name $}-menu">
562 <a href="" class="p-contextual-menu__link"
563@@ -1608,7 +1608,7 @@
564 <tr class="is-active" data-ng-if="dropdown" data-ng-switch="dropdown">
565 <!-- Adding a new TMPFS or RAMFPS file system -->
566 <td class="p-table-expanding__panel" data-ng-controller="NodeAddSpecialFilesystemController" data-ng-switch-when="special">
567- <div class="row" data-ng-if="windowWidth <= 768">
568+ <div class="row" data-ng-if="windowWidth <= 768">
569 <div class="col-8">
570 <h2 data-ng-click="cancel()">Adding filesystem</h2>
571 </div>
572@@ -1831,7 +1831,7 @@
573 <td class="col-2 u-align--right">
574 <div class="p-contextual-menu" toggle-ctrl
575 data-ng-if="canAddLogicalVolume(item) || canAddPartition(item) || canEdit(item) || canDelete(item)">
576- <button class="p-contextual-menu__toggle" aria-controls="#{$ item.name $}-menu"
577+ <button class="p-contextual-menu__toggle" aria-controls="#{$ item.name $}-menu"
578 data-ng-click="toggleMenu()" aria-haspopup="true">View actions</button>
579 <div class="p-contextual-menu__dropdown" role="menu" data-ng-show="isToggled" id="{$ item.name $}-menu">
580 <a href="" class="p-contextual-menu__link"
581@@ -1853,7 +1853,7 @@
582 </div>
583 </div>
584 </td>
585- <td class="p-table-expanding__panel"
586+ <td class="p-table-expanding__panel"
587 data-ng-if="(availableMode === 'edit' || availableMode === 'format-mount' || availableMode === 'partition' || availableMode === 'logical-volume' || availableMode === 'delete') && item.$selected">
588 <div class="row" data-ng-if="windowWidth <= 768">
589 <div class="col-8">
590@@ -2012,7 +2012,7 @@
591 <span>Partition</span>
592 </div>
593 </div>
594- <div class="p-form__group p-form-validation"
595+ <div class="p-form__group p-form-validation"
596 data-ng-class="{ 'is-error': isAddPartitionSizeInvalid(item) }">
597 <label class="p-form__label" for="size">Size</label>
598 <div class="p-form__controls">
599@@ -2629,18 +2629,14 @@
600 <table data-ng-if="node.events.length">
601 <thead>
602 <tr>
603- <th class="col-1"></th>
604- <th class="col-9">Event</th>
605+ <th class="col-10">Event</th>
606 <th class="col-2">Time</th>
607 </tr>
608 </thead>
609 <tbody>
610 <tr
611 data-ng-repeat="event in node.events | orderByDate:'created':'id' | limitTo:events.limit">
612- <td class="col-1" aria-label="{$ event.type.level $}">
613- <span class="p-icon--{$ event.type.level $}"></span>
614- </td>
615- <td class="col-9" aria-label="Event">{$ getEventText(event) $}</td>
616+ <td class="col-10" aria-label="Event"><span class="p-icon--{$ event.type.level $}"></span>{$ getEventText(event) $}</td>
617 <td class="col-2" aria-label="Created">{$ event.created $}</td>
618 </tr>
619 </tbody>
620diff --git a/src/maasserver/static/partials/node-events.html b/src/maasserver/static/partials/node-events.html
621index 636c59d..f355177 100644
622--- a/src/maasserver/static/partials/node-events.html
623+++ b/src/maasserver/static/partials/node-events.html
624@@ -43,7 +43,7 @@
625 <tr
626 data-ng-repeat="event in events | filter:search | orderByDate:'created':'id' track by event.id">
627 <td class="table-col--1 u-padding--right-none u-padding--left-none">
628- <span class="icon icon--{$ event.type.level $}"></span>
629+ <span class="p-icon--{$ event.type.level $}"></span>
630 </td>
631 <td class="table-col--79">
632 {$ getEventText(event) $}
633diff --git a/src/maasserver/static/partials/pod-details.html b/src/maasserver/static/partials/pod-details.html
634index 9fa43e1..facbbff 100644
635--- a/src/maasserver/static/partials/pod-details.html
636+++ b/src/maasserver/static/partials/pod-details.html
637@@ -137,7 +137,7 @@
638 </form>
639 </div>
640 </div>
641- <div class="p-strip is-shallow u-no-padding--bottom" media-query="min-width: 769px" offset="89" data-ng-class="{ 'u-hide': action.option }">
642+ <div class="p-strip is-shallow u-no-padding--bottom" media-query="min-width: 769px" offset="89" data-ng-class="{ 'u-hide': action.option }">
643 <nav class="p-tabs">
644 <ul class="p-tabs__list" role="tablist">
645 <li class="p-tabs__item" role="presentation">
646@@ -194,7 +194,7 @@
647
648 <div class="col-9" data-ng-if="!pod.composed_machines_count">
649 <div class="u-align--center u-vertical--align u-align--center">
650- <i class="icon icon--compose-machine icon--huge" style="width: 128px; height: 128px;"></i>
651+ <i class="p-icon--compose-machine" style="width: 128px; height: 128px;"></i>
652 <h3>You have not composed any machines yet.</h3>
653 <button class="p-button--positive is-inline" data-ng-if="canCompose()" data-ng-click="composeMachine()">Compose machine</button>
654 </div>
655diff --git a/src/maasserver/static/partials/script-results-list.html b/src/maasserver/static/partials/script-results-list.html
656index 9f2fc46..87323d3 100644
657--- a/src/maasserver/static/partials/script-results-list.html
658+++ b/src/maasserver/static/partials/script-results-list.html
659@@ -13,7 +13,6 @@
660 <table class="p-table-expanding">
661 <thead>
662 <tr>
663- <th class="col-1"></th>
664 <th class="col-3">Name</th>
665 <th class="col-2">Tags</th>
666 <th class="col-1">Runtime</th>
667@@ -24,10 +23,8 @@
668 </thead>
669 <tbody>
670 <tr data-ng-repeat="result in results" data-ng-class="{'is-active': result.showing_results || result.showing_history}">
671- <td class="col-1" aria-label="Status">
672- <span data-maas-script-status="script-status" data-script-status="result.status"></span>
673- </td>
674 <td class="col-3" data-ng-click="result.showing_results = !result.showing_results" aria-label="Name">
675+ <span data-maas-script-status="script-status" data-script-status="result.status"></span>
676 {$ result.name $}
677 <button class="p-button--base u-float--right" data-ng-class="{'p-icon--chevron': !result.showing_results, 'p-icon--close': result.showing_results}" data-ng-if="!result.showing_history"></button>
678 </td>
679diff --git a/src/maasserver/static/partials/settings.html b/src/maasserver/static/partials/settings.html
680index 0339ac2..f700394 100644
681--- a/src/maasserver/static/partials/settings.html
682+++ b/src/maasserver/static/partials/settings.html
683@@ -463,7 +463,7 @@
684 </div>
685 <div class="is-active">
686 <div class=" u-float--left">
687- <p><span class="icon icon--warning"></span> Are you sure you want to remove this repository?</p>
688+ <p><span class="p-icon--warning"></span> Are you sure you want to remove this repository?</p>
689 </div>
690 <div class=" u-float--right">
691 <button class="button--base" data-ng-click="repositoryExitRemove()">Cancel</button>
692diff --git a/src/maasserver/static/partials/switches-table.html b/src/maasserver/static/partials/switches-table.html
693index cefe8f3..0b5ee74 100644
694--- a/src/maasserver/static/partials/switches-table.html
695+++ b/src/maasserver/static/partials/switches-table.html
696@@ -49,10 +49,10 @@
697 <a href="#/node/{$ node.link_type $}/{$ node.system_id $}" class="extra-macs" data-ng-show="node.extra_macs.length">(+{$ node.extra_macs.length $})</a>
698 </td>
699 <td class="powerstate u-upper-case--first" aria-label="Power state">
700- <span title="{$ node.power_state $}" data-ng-if="node.power_state != 'unknown'" class="icon icon--power-{$ node.power_state $} u-margin--right-tiny"></span> {$ node.power_state $}
701+ <span title="{$ node.power_state $}" data-ng-if="node.power_state != 'unknown'" class="p-icon--power-{$ node.power_state $}"></span> {$ node.power_state $}
702 </td>
703 <td class="table-col--3 u-display--desktop"><i data-ng-if="showSpinner(node)" class="p-icon--spinner u-animation--spin u-display--desktop"></i></td>
704- <td class="status u-text--truncate" aria-label="Status">{$ getStatusText(node) $} <span class="u-display--mobile"><i data-ng-if="showSpinner(node)" class="p-icon--spinner u-animation--spin u-margin--left-tiny"></i></span></td>
705+ <td class="status u-text--truncate" aria-label="Status">{$ getStatusText(node) $} <span class="u-display--mobile"><i data-ng-if="showSpinner(node)" class="p-icon--spinner u-animation--spin"></i></span></td>
706 <td class="table-col--10" aria-label="Owner">{$ node.owner $}</td>
707 <td class="u-align--right u-display--desktop" aria-label="Model">{$ node.metadata['physical-mfg-name'] + ' ' + node.metadata['physical-model-name']$}</td>
708 <td class="u-align--right u-display--desktop" aria-label="Serial">{$ node.metadata['physical-serial-num'] $}</td>
709diff --git a/src/maasserver/static/partials/vlan-details.html b/src/maasserver/static/partials/vlan-details.html
710index a8f7cc0..b2b7dee 100644
711--- a/src/maasserver/static/partials/vlan-details.html
712+++ b/src/maasserver/static/partials/vlan-details.html
713@@ -260,7 +260,7 @@
714 <i class="p-icon--information">Help:</i>
715 <span class="p-tooltip__message" role="tooltip">A rack controller controls hosts and images and runs network services&#xa;like DHCP for connected VLANs.</span>
716 </span>
717- <span class="icon icon--information tooltip" aria-label="A rack controller controls hosts and images and runs network services&#xa;like DHCP for connected VLANs."></span>
718+ <span class="p-icon--information tooltip" aria-label="A rack controller controls hosts and images and runs network services&#xa;like DHCP for connected VLANs."></span>
719 </dt>
720 <dd>
721 <span data-ng-repeat="rack in vlanDetails.relatedControllers">
722diff --git a/src/maasserver/static/scss/_patterns_icons.scss b/src/maasserver/static/scss/_patterns_icons.scss
723index d09e5f1..aa5a8e9 100644
724--- a/src/maasserver/static/scss/_patterns_icons.scss
725+++ b/src/maasserver/static/scss/_patterns_icons.scss
726@@ -1,20 +1,14 @@
727-// MAAS Status icon colours
728-$status-failed: $color-negative;
729-$status-in-progress: $color-information;
730-$status-queued: $color-mid-dark;
731-$status-succeeded: $color-positive;
732-$status-waiting: $color-caution;
733-
734 @mixin maas-icon-edit($color) {
735- background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg width='22' height='22' viewBox='0 0 22 22' xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3eedit%3c/title%3e%3cg fill='#{$color}' fill-rule='evenodd'%3e%3cpath d='M17 15h5v1h-5zm-3 3h8v1h-8zm-3 3h11v1H11zm5.75-21L3.47 13.517S.956 17.465 0 21.987v.004l.002.004V22c4.532-.955 8.48-3.472 8.48-3.472L22 5.25 16.75 0zM4.51 14.555L7.454 17.5c-.2.114-2.99 2.064-5.544 2.602V20.093l-.002-.003c.537-2.546 2.485-5.334 2.602-5.537v.002z'/%3e%3cpath d='M2.234 18l1.85 1.85L1 21'/%3e%3c/g%3e%3c/svg%3e");
736+ background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg width='22' height='22' viewBox='0 0 22 22' xmlns='http://www.w3.org/2000/svg'%3e%3ctitle%3eedit%3c/title%3e%3cg fill='" + rgba($color, 1) + "' fill-rule='evenodd'%3e%3cpath d='M17 15h5v1h-5zm-3 3h8v1h-8zm-3 3h11v1H11zm5.75-21L3.47 13.517S.956 17.465 0 21.987v.004l.002.004V22c4.532-.955 8.48-3.472 8.48-3.472L22 5.25 16.75 0zM4.51 14.555L7.454 17.5c-.2.114-2.99 2.064-5.544 2.602V20.093l-.002-.003c.537-2.546 2.485-5.334 2.602-5.537v.002z'/%3e%3cpath d='M2.234 18l1.85 1.85L1 21'/%3e%3c/g%3e%3c/svg%3e");
737 }
738
739 @mixin maas-icon-power-on($color) {
740- background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2215%22%20width%3D%2214%22%3E%3Cpath%20d%3D%22M11.04%202.323l-.324%202.268a5.017%205.017%200%200%201%201.352%203.426c0%202.787-2.274%205.056-5.068%205.056s-5.067-2.269-5.067-5.056a5.02%205.02%200%200%201%201.351-3.426L2.96%202.323A6.935%206.935%200%200%200%200%208.017C0%2011.868%203.14%2015%207%2015s7-3.132%207-6.983a6.933%206.933%200%200%200-2.96-5.694zM6%200h2v7H6V0z%22%20fill%3D%22%230E8420%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E");
741+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2215%22%20width%3D%2214%22%3E%3Cpath%20d%3D%22M11.04%202.323l-.324%202.268a5.017%205.017%200%200%201%201.352%203.426c0%202.787-2.274%205.056-5.068%205.056s-5.067-2.269-5.067-5.056a5.02%205.02%200%200%201%201.351-3.426L2.96%202.323A6.935%206.935%200%200%200%200%208.017C0%2011.868%203.14%2015%207%2015s7-3.132%207-6.983a6.933%206.933%200%200%200-2.96-5.694zM6%200h2v7H6V0z%22%20fill%3D%22" + encodecolor($color) + "%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E");
742 }
743
744 @mixin maas-icons {
745 .p-icon {
746+ padding-right: $sp-small;
747
748 &--edit {
749 @extend %icon;
750@@ -27,37 +21,41 @@ $status-waiting: $color-caution;
751
752 &--status-failed {
753 @extend %icon;
754- background: url('data:image/svg+xml;utf8,%3Csvg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cg id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"%3E%3Cg id="status-queued" transform="translate(1, 1)"%3E%3Cg id="Page-1"%3E%3Cg id="status-queued"%3E%3Cg id="Group"%3E%3Ccircle id="Oval" stroke="' + rgba($status-failed, 1) + '" stroke-width="2" cx="6" cy="6" r="6"%3E%3C/circle%3E%3Ccircle id="Oval-Copy" class="status-circle" fill="' + rgba($status-failed, 1) + '" cx="6" cy="6" r="4"%3E%3C/circle%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E');
755+ background: url('data:image/svg+xml;utf8,%3Csvg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cg id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"%3E%3Cg id="status-queued" transform="translate(1, 1)"%3E%3Cg id="Page-1"%3E%3Cg id="status-queued"%3E%3Cg id="Group"%3E%3Ccircle id="Oval" stroke="' + encodecolor($color-negative) + '" stroke-width="2" cx="6" cy="6" r="6"%3E%3C/circle%3E%3Ccircle id="Oval-Copy" class="status-circle" fill="' + encodecolor($color-negative) + '" cx="6" cy="6" r="4"%3E%3C/circle%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E');
756 }
757
758 &--status-in-progress {
759 @extend %icon;
760- background: url('data:image/svg+xml;utf8, %3Csvg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cg id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"%3E%3Cg id="status-queued" transform="translate(1, 1)"%3E%3Cg id="Page-1"%3E%3Cg id="status-queued"%3E%3Cg id="Group"%3E%3Ccircle id="Oval" stroke="' + rgba($status-in-progress, 1) +'" stroke-width="2" cx="6" cy="6" r="6"%3E%3C/circle%3E%3Ccircle id="Oval-Copy" class="status-circle" fill="' + rgba($status-in-progress, 1) +'" cx="6" cy="6" r="4"%3E%3C/circle%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E');
761+ background: url('data:image/svg+xml;utf8, %3Csvg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cg id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"%3E%3Cg id="status-queued" transform="translate(1, 1)"%3E%3Cg id="Page-1"%3E%3Cg id="status-queued"%3E%3Cg id="Group"%3E%3Ccircle id="Oval" stroke="' + encodecolor($color-information) +'" stroke-width="2" cx="6" cy="6" r="6"%3E%3C/circle%3E%3Ccircle id="Oval-Copy" class="status-circle" fill="' + encodecolor($color-information) +'" cx="6" cy="6" r="4"%3E%3C/circle%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E');
762 }
763
764 &--status-queued {
765 @extend %icon;
766- background: url('data:image/svg+xml;utf8, %3Csvg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cg id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"%3E%3Cg id="status-queued" transform="translate(1, 1)"%3E%3Cg id="Page-1"%3E%3Cg id="status-queued"%3E%3Cg id="Group"%3E%3Ccircle id="Oval" stroke="' + rgba($status-queued, 1) + '" stroke-width="2" cx="6" cy="6" r="6"%3E%3C/circle%3E%3Ccircle id="Oval-Copy" class="status-circle" fill="' + rgba($status-queued, 1) + '" cx="6" cy="6" r="4"%3E%3C/circle%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E');
767+ background: url('data:image/svg+xml;utf8, %3Csvg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cg id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"%3E%3Cg id="status-queued" transform="translate(1, 1)"%3E%3Cg id="Page-1"%3E%3Cg id="status-queued"%3E%3Cg id="Group"%3E%3Ccircle id="Oval" stroke="' + encodecolor($color-mid-dark) + '" stroke-width="2" cx="6" cy="6" r="6"%3E%3C/circle%3E%3Ccircle id="Oval-Copy" class="status-circle" fill="' + encodecolor($color-mid-dark) + '" cx="6" cy="6" r="4"%3E%3C/circle%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E');
768 }
769
770 &--status-succeeded {
771 @extend %icon;
772- background: url('data:image/svg+xml;utf8, %3Csvg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cg id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"%3E%3Cg id="status-queued" transform="translate(1, 1)"%3E%3Cg id="Page-1"%3E%3Cg id="status-queued"%3E%3Cg id="Group"%3E%3Ccircle id="Oval" stroke="' + rgba($status-succeeded, 1) + '" stroke-width="2" cx="6" cy="6" r="6"%3E%3C/circle%3E%3Ccircle id="Oval-Copy" class="status-circle" fill="' + rgba($status-succeeded, 1) + '" cx="6" cy="6" r="4"%3E%3C/circle%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E');
773+ background: url('data:image/svg+xml;utf8, %3Csvg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cg id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"%3E%3Cg id="status-queued" transform="translate(1, 1)"%3E%3Cg id="Page-1"%3E%3Cg id="status-queued"%3E%3Cg id="Group"%3E%3Ccircle id="Oval" stroke="' + encodecolor($color-positive) + '" stroke-width="2" cx="6" cy="6" r="6"%3E%3C/circle%3E%3Ccircle id="Oval-Copy" class="status-circle" fill="' + encodecolor($color-positive) + '" cx="6" cy="6" r="4"%3E%3C/circle%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E');
774 }
775
776 &--status-waiting {
777 @extend %icon;
778- background: url('data:image/svg+xml;utf8, %3Csvg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cg id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"%3E%3Cg id="status-queued" transform="translate(1, 1)"%3E%3Cg id="Page-1"%3E%3Cg id="status-queued"%3E%3Cg id="Group"%3E%3Ccircle id="Oval" stroke="' + rgba($status-waiting, 1) + '" stroke-width="2" cx="6" cy="6" r="6"%3E%3C/circle%3E%3Ccircle id="Oval-Copy" class="status-circle" fill="' + rgba($status-waiting, 1) + '" cx="6" cy="6" r="4"%3E%3C/circle%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E');
779+ background: url('data:image/svg+xml;utf8, %3Csvg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"%3E%3Cg id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"%3E%3Cg id="status-queued" transform="translate(1, 1)"%3E%3Cg id="Page-1"%3E%3Cg id="status-queued"%3E%3Cg id="Group"%3E%3Ccircle id="Oval" stroke="' + encodecolor($color-caution) + '" stroke-width="2" cx="6" cy="6" r="6"%3E%3C/circle%3E%3Ccircle id="Oval-Copy" class="status-circle" fill="' + encodecolor($color-caution) + '" cx="6" cy="6" r="4"%3E%3C/circle%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E');
780+ }
781+
782+ &--timed-out {
783+ @extend %icon;
784+ background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8' standalone='no'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' height='16px' width='16px' version='1.1' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 16'%3E%3Ctitle%3Etimed out%3C/title%3E%3Cg id='Page-1' fill-rule='evenodd' fill='none'%3E%3Cg id='smoke-testing-status' transform='translate%28-62 -206%29'%3E%3Cg id='timed-out' transform='translate%2850 191%29'%3E%3Cg transform='translate%2812 15%29'%3E%3Crect id='rect4970' y='0.00002' x='0' height='16' width='16'/%3E%3Ccircle id='circle4972' stroke-width='1.5' cy='8' stroke='%23E95420' cx='8' r='7.25'/%3E%3Cpolyline id='path839' stroke='%23E95420' stroke-width='2' points='11.8 11.8 7.9999 8 7.9999 3'/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E%0A");
785 }
786
787 &--success-muted {
788 @extend %icon;
789- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='17' height='17' viewBox='0 0 17 17'%3E%3Cg transform='translate(1 1)' fill='none' fill-rule='evenodd'%3E%3Ccircle stroke='" + rgba($color-mid-light, 1) + "' stroke-width='1.5' fill='" + rgba($color-mid-light, 1) + "' cx='7.25001' cy='7.25001' r='7.25001'/%3E%3Cpath fill='%23fff' d='M11.0503 4.17345l-.0659.0577-4.73475 4.14722-2.77557-2.38094-.83906.94888 3.61532 3.80373L11.75 4.96278l-.6997-.7893'/%3E%3C/g%3E%3C/svg%3E");
790+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='17' height='17' viewBox='0 0 17 17'%3E%3Cg transform='translate(1 1)' fill='none' fill-rule='evenodd'%3E%3Ccircle stroke='" + encodecolor($color-mid-light) + "' stroke-width='1.5' fill='" + encodecolor($color-mid-light) + "' cx='7.25001' cy='7.25001' r='7.25001'/%3E%3Cpath fill='%23fff' d='M11.0503 4.17345l-.0659.0577-4.73475 4.14722-2.77557-2.38094-.83906.94888 3.61532 3.80373L11.75 4.96278l-.6997-.7893'/%3E%3C/g%3E%3C/svg%3E");
791 }
792 }
793
794- .p-icon--power-error,
795- .icon--power-error {
796+ .p-icon--power-error {
797 @extend .p-icon--error;
798 }
799
800@@ -66,7 +64,23 @@ $status-waiting: $color-caution;
801 @include maas-icon-power-on(rgba($color-positive, .999999));
802 }
803
804- .icon--pass {
805+ .p-icon--power-off {
806+ @extend %icon;
807+ @include maas-icon-power-on(rgba($color-mid-light, .999999));
808+ }
809+
810+ .p-icon--pass {
811 @extend .p-icon--success;
812 }
813+
814+ .p-icon--info {
815+ @extend .p-icon--information;
816+ }
817+
818+ [class^="p-icon"] {
819+ margin-right: $sp-x-small;
820+ }
821 }
822+
823+
824+//TODO: do something about p-icon--none
825diff --git a/src/maasserver/static/scss/_utils.scss b/src/maasserver/static/scss/_utils.scss
826new file mode 100644
827index 0000000..a887ebf
828--- /dev/null
829+++ b/src/maasserver/static/scss/_utils.scss
830@@ -0,0 +1,9 @@
831+//does not work with colors containing alpha
832+@function encodecolor($string) {
833+ @if type-of($string) == 'color' {
834+ $hex: str-slice(ie-hex-str($string), 4);
835+ $string:unquote("#{$hex}");
836+ }
837+ $string: '%23' + $string;
838+ @return $string;
839+}
840diff --git a/src/maasserver/static/scss/build.scss b/src/maasserver/static/scss/build.scss
841index 832c8d5..c72ec45 100644
842--- a/src/maasserver/static/scss/build.scss
843+++ b/src/maasserver/static/scss/build.scss
844@@ -1,5 +1,6 @@
845 // Import MAAS-specific Vanilla configuration
846 @import 'settings';
847+@import 'utils';
848
849 // Import Vanilla framework
850 @import '../../../../include/nodejs/node_modules/vanilla-framework/scss/vanilla';
851diff --git a/src/maasserver/templates/maasserver/zone_list.html b/src/maasserver/templates/maasserver/zone_list.html
852index 4473d65..fc9f081 100755
853--- a/src/maasserver/templates/maasserver/zone_list.html
854+++ b/src/maasserver/templates/maasserver/zone_list.html
855@@ -7,7 +7,7 @@
856
857 {% block content %}
858 <div id="zones">
859- <h2>Physical zones <span class="icon icon--help tooltip tooltip--right"
860+ <h2>Physical zones <span class="p-icon--help tooltip tooltip--right"
861 aria-label="A representation of a grouping of nodes, typically by physical location.">
862 </span></h2>
863 <table>
864@@ -36,8 +36,8 @@
865 {% if user.is_superuser %}
866 <td class="u-align--right table--mobile-controls">
867 {% if not zone_item.is_default %}
868- <a href="{% url 'zone-edit' zone_item.name %}" title="Edit zone {{ zone_item.name }}" class="icon icon--edit u-margin--right-small">edit</a>
869- <a title="Delete zone {{ zone_item.name }}" class="icon icon--delete" href="{% url 'zone-del' zone_item.name %}">delete</a>
870+ <a href="{% url 'zone-edit' zone_item.name %}" title="Edit zone {{ zone_item.name }}" class="p-icon--edit u-margin--right-small">edit</a>
871+ <a title="Delete zone {{ zone_item.name }}" class="p-icon--delete" href="{% url 'zone-del' zone_item.name %}">delete</a>
872 <form method="POST" action="{% url 'zone-del' zone_item.name %}">
873 {% csrf_token %}
874 <input type="hidden" name="name" value="{{ zone_item.name }}" />

Subscribers

People subscribed via source and target branches

to all changes: