Merge ~mpontillo/maas:dns-ui--add-record into maas:master

Proposed by Mike Pontillo
Status: Merged
Approved by: Björn Tillenius
Approved revision: dfcf3ba6d53d329625805bff5c6734dcb7f16ec1
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~mpontillo/maas:dns-ui--add-record
Merge into: maas:master
Diff against target: 830 lines (+266/-86)
20 files modified
Makefile (+7/-1)
debian/rules (+1/-1)
package.json (+3/-2)
setup.py (+1/-1)
src/maasserver/static/js/angular/controllers/domain_details.js (+20/-4)
src/maasserver/static/js/angular/controllers/tests/test_domain_details.js (+4/-4)
src/maasserver/static/js/angular/directives/maas_obj_form.js (+17/-3)
src/maasserver/static/js/angular/directives/tests/test_maas_obj_form.js (+25/-0)
src/maasserver/static/js/angular/factories/domains.js (+12/-0)
src/maasserver/static/js/angular/factories/tests/test_domains.js (+47/-0)
src/maasserver/static/js/yui/io.js (+0/-0)
src/maasserver/static/js/yui/os_distro_select.js (+0/-0)
src/maasserver/static/js/yui/prefs.js (+0/-0)
src/maasserver/static/js/yui/reveal.js (+0/-0)
src/maasserver/static/js/yui/shortpoll.js (+0/-0)
src/maasserver/static/partials/domain-details.html (+48/-6)
src/maasserver/templates/maasserver/js-conf.html (+3/-0)
src/maastesting/karma.conf.js (+6/-5)
webpack.config.js (+4/-2)
yarn.lock (+68/-57)
Reviewer Review Type Date Requested Status
Mike Pontillo (community) Approve
Andres Rodriguez Pending
MAAS Lander Pending
Review via email: mp+341140@code.launchpad.net

This proposal supersedes a proposal from 2018-03-08.

Commit message

Add form to create new DNS records.

 * Change karma configuration to use built JavaScript.
 * Reorganize YUI code into a specific directory.
 * Remove react and react-dom from vendor bundle.

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote : Posted in a previous version of this proposal

UNIT TESTS
-b dns-ui--add-record lp:~mpontillo/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/1876/console
COMMIT: 0bc51c7dacfb0c0a403c6918718914ac07fe94ae

review: Needs Fixing
Revision history for this message
Andres Rodriguez (andreserl) wrote : Posted in a previous version of this proposal

Just one thing in line I think it needs fixing.

review: Needs Fixing
Revision history for this message
Andres Rodriguez (andreserl) wrote : Posted in a previous version of this proposal

lgtm!

review: Approve
Revision history for this message
Mike Pontillo (mpontillo) : Posted in a previous version of this proposal
Revision history for this message
Mike Pontillo (mpontillo) wrote : Posted in a previous version of this proposal

Combining this branch with the branch it depends on.

review: Approve
Revision history for this message
Mike Pontillo (mpontillo) wrote :

And again, this time without the prerequisite (so it'll land).

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/Makefile b/Makefile
2index 533934d..b5ba5ea 100644
3--- a/Makefile
4+++ b/Makefile
5@@ -23,7 +23,7 @@ endif
6 # Python enum modules.
7 py_enums := $(wildcard src/*/enum.py)
8 # JavaScript enum module (not modules).
9-js_enums := src/maasserver/static/js/enums.js
10+js_enums := src/maasserver/static/js/yui/enums.js
11
12 # MAAS SASS stylesheets. The first input file (maas-styles.css) imports
13 # the others, so is treated specially in the target definitions.
14@@ -40,6 +40,8 @@ javascript_deps := \
15 javascript_output := \
16 src/maasserver/static/js/bundle/maas-min.js \
17 src/maasserver/static/js/bundle/maas-min.js.map \
18+ src/maasserver/static/js/bundle/maas-yui-min.js \
19+ src/maasserver/static/js/bundle/maas-yui-min.js.map \
20 src/maasserver/static/js/bundle/vendor-min.js \
21 src/maasserver/static/js/bundle/vendor-min.js.map
22
23@@ -249,6 +251,7 @@ define node_packages
24 karma-ng-html2js-preprocessor
25 karma-opera-launcher
26 karma-phantomjs-launcher
27+ karma-sourcemap-loader
28 node-sass
29 phantomjs-prebuilt
30 prop-types
31@@ -286,6 +289,9 @@ test: bin/test.parallel bin/coverage
32 @bin/test.parallel --with-coverage --subprocess-per-core
33 @bin/coverage combine
34
35+test-js: bin/test.js javascript
36+ @bin/test.js
37+
38 test-serial: $(strip $(test-scripts))
39 @bin/maas-region makemigrations --dry-run --exit && exit 1 ||:
40 @$(RM) .coverage .coverage.* .failed
41diff --git a/debian/rules b/debian/rules
42index 36c7be7..2f83647 100755
43--- a/debian/rules
44+++ b/debian/rules
45@@ -53,7 +53,7 @@ override_dh_auto_install:
46 rm -rf $(CURDIR)/debian/tmp/usr/share/maas/web/scss
47
48 # Install built enums.js file.
49- cp $(BUILDHOME)/enums.js $(CURDIR)/debian/tmp/usr/share/maas/web/static/js/
50+ cp $(BUILDHOME)/enums.js $(CURDIR)/debian/tmp/usr/share/maas/web/static/js/yui
51
52 # install the apparmor profile
53 install -d -m 755 $(CURDIR)/debian/tmp/etc/apparmor.d/dhcpd.d
54diff --git a/package.json b/package.json
55index dd52b6d..2398e05 100644
56--- a/package.json
57+++ b/package.json
58@@ -5,7 +5,7 @@
59 "@babel/preset-react": "^7.0.0-beta.40",
60 "@types/prop-types": "^15.5.2",
61 "@types/react": "^16.0.40",
62- "@types/react-dom": "^16.0.4",
63+ "@types/react-dom": "^15.5.7",
64 "babel-loader": "^8.0.0-beta.0",
65 "glob": "^7.1.2",
66 "jasmine-core": "=2.99.1",
67@@ -17,6 +17,7 @@
68 "karma-ng-html2js-preprocessor": "^1.0.0",
69 "karma-opera-launcher": "^1.0.0",
70 "karma-phantomjs-launcher": "^1.0.4",
71+ "karma-sourcemap-loader": "^0.3.7",
72 "node-sass": "^4.7.2",
73 "phantomjs-prebuilt": "^2.1.16",
74 "prop-types": "^15.6.1",
75@@ -27,7 +28,7 @@
76 "uglifyjs-webpack-plugin": "^1.2.2",
77 "vanilla-framework": "^1.6.6",
78 "vanilla-framework-react": "^0.1.2",
79- "webpack": "^4.0.1",
80+ "webpack": "^4.1.1",
81 "webpack-cli": "^2.0.10",
82 "webpack-merge": "^4.1.2"
83 }
84diff --git a/setup.py b/setup.py
85index cd6ad7a..8e35adb 100644
86--- a/setup.py
87+++ b/setup.py
88@@ -56,7 +56,7 @@ class EnumJSCommand(Command):
89 py_files = glob('src/*/enum.py')
90 jsenums = import_jsenums()
91 js_content = jsenums.dump(py_files)
92- with open('src/maasserver/static/js/enums.js', 'w') as fp:
93+ with open('src/maasserver/static/js/yui/enums.js', 'w') as fp:
94 fp.write(js_content)
95
96
97diff --git a/src/maasserver/static/js/angular/controllers/domain_details.js b/src/maasserver/static/js/angular/controllers/domain_details.js
98index d8e50e5..fb0c4a2 100644
99--- a/src/maasserver/static/js/angular/controllers/domain_details.js
100+++ b/src/maasserver/static/js/angular/controllers/domain_details.js
101@@ -23,6 +23,14 @@ angular.module('MAAS').controller('DomainDetailsController', [
102 $scope.domain = null;
103 $scope.predicate = "name";
104 $scope.reverse = false;
105+ $scope.action = null;
106+
107+ $scope.domainsManager = DomainsManager;
108+ $scope.newObject = {};
109+
110+ $scope.supportedRecordTypes = [
111+ 'A', 'AAAA', 'CNAME', 'MX', 'NS', 'SRV', 'SSHFP', 'TXT'
112+ ];
113
114 // Updates the page title.
115 function updateTitle() {
116@@ -61,18 +69,26 @@ angular.module('MAAS').controller('DomainDetailsController', [
117 // Called when the delete domain button is pressed.
118 $scope.deleteButton = function() {
119 $scope.error = null;
120- $scope.confirmingDelete = true;
121+ $scope.actionInProgress = true;
122+ $scope.action = 'delete';
123+ };
124+
125+ // Called when the add record button is pressed.
126+ $scope.addRecordButton = function() {
127+ $scope.error = null;
128+ $scope.actionInProgress = true;
129+ $scope.action = 'add_record';
130 };
131
132 // Called when the cancel delete domain button is pressed.
133- $scope.cancelDeleteButton = function() {
134- $scope.confirmingDelete = false;
135+ $scope.cancelAction = function() {
136+ $scope.actionInProgress = false;
137 };
138
139 // Called when the confirm delete domain button is pressed.
140 $scope.deleteConfirmButton = function() {
141 DomainsManager.deleteDomain($scope.domain).then(function() {
142- $scope.confirmingDelete = false;
143+ $scope.actionInProgress = false;
144 $location.path("/domains");
145 }, function(error) {
146 $scope.error =
147diff --git a/src/maasserver/static/js/angular/controllers/tests/test_domain_details.js b/src/maasserver/static/js/angular/controllers/tests/test_domain_details.js
148index d1cfcb1..391efea 100644
149--- a/src/maasserver/static/js/angular/controllers/tests/test_domain_details.js
150+++ b/src/maasserver/static/js/angular/controllers/tests/test_domain_details.js
151@@ -186,7 +186,7 @@ describe("DomainDetailsController", function() {
152 it("confirms delete", function() {
153 var controller = makeControllerResolveSetActiveItem();
154 $scope.deleteButton();
155- expect($scope.confirmingDelete).toBe(true);
156+ expect($scope.actionInProgress).toBe(true);
157 });
158
159 it("clears error", function() {
160@@ -197,13 +197,13 @@ describe("DomainDetailsController", function() {
161 });
162 });
163
164- describe("cancelDeleteButton", function() {
165+ describe("cancelAction", function() {
166
167 it("cancels delete", function() {
168 var controller = makeControllerResolveSetActiveItem();
169 $scope.deleteButton();
170- $scope.cancelDeleteButton();
171- expect($scope.confirmingDelete).toBe(false);
172+ $scope.cancelAction();
173+ expect($scope.actionInProgress).toBe(false);
174 });
175 });
176
177diff --git a/src/maasserver/static/js/angular/directives/maas_obj_form.js b/src/maasserver/static/js/angular/directives/maas_obj_form.js
178index da907f9..7de2337 100644
179--- a/src/maasserver/static/js/angular/directives/maas_obj_form.js
180+++ b/src/maasserver/static/js/angular/directives/maas_obj_form.js
181@@ -543,10 +543,10 @@ angular.module('MAAS').directive('maasObjField', ['$compile',
182
183 // type and key required.
184 var missingAttrs = [];
185- if(!angular.isString(attrs.type) && attrs.type.length === 0) {
186+ if(!angular.isString(attrs.type) || attrs.type.length === 0) {
187 missingAttrs.push("type");
188 }
189- if(!angular.isString(attrs.key) && attrs.key.length === 0) {
190+ if(!angular.isString(attrs.key) || attrs.key.length === 0) {
191 missingAttrs.push("key");
192 }
193 if(missingAttrs.length > 0) {
194@@ -561,7 +561,8 @@ angular.module('MAAS').directive('maasObjField', ['$compile',
195 // Render the label.
196 var label = attrs.label || attrs.key;
197
198- if(attrs.disableLabel !== "true") {
199+ if(attrs.disableLabel !== "true" &&
200+ !(attrs.type === "hidden")) {
201 var labelElement = angular.element('<label/>');
202 labelElement.attr('for', attrs.key);
203 labelElement.text(label);
204@@ -830,6 +831,19 @@ angular.module('MAAS').directive('maasObjField', ['$compile',
205 return val.text;
206 });
207 };
208+ } else if(attrs.type === "hidden") {
209+ var hiddenScope = scope.$new();
210+ hiddenScope._toggle = controller.registerField(
211+ attrs.key, scope);
212+ inputElement = angular.element([
213+ '<input type="hidden" name="' + attrs.key + '" ',
214+ 'id="' + attrs.key + '" ',
215+ 'value="' + attrs.value + '">',
216+ '</input>'
217+ ].join(''));
218+ inputElement = $compile(inputElement)(hiddenScope);
219+ scope.getValue = () => attrs.value;
220+ scope.updateValue = () => null;
221 } else if(attrs.type === "onoffswitch") {
222 var switchScope = scope.$new();
223 switchScope._toggle = controller.registerField(
224diff --git a/src/maasserver/static/js/angular/directives/tests/test_maas_obj_form.js b/src/maasserver/static/js/angular/directives/tests/test_maas_obj_form.js
225index d37b891..031c881 100644
226--- a/src/maasserver/static/js/angular/directives/tests/test_maas_obj_form.js
227+++ b/src/maasserver/static/js/angular/directives/tests/test_maas_obj_form.js
228@@ -442,6 +442,31 @@ describe("maasObjForm", function() {
229 });
230 });
231
232+ describe("hidden", function() {
233+
234+ var directive, options;
235+ beforeEach(function() {
236+ $scope.obj = {
237+ key: false
238+ };
239+ $scope.manager = {};
240+ var html = [
241+ '<maas-obj-form obj="obj" manager="manager">',
242+ '<maas-obj-field type="hidden" key="key" label="Key" ',
243+ 'value="value">',
244+ '</maas-obj-field>',
245+ '</maas-obj-form>'
246+ ].join('');
247+ directive = compileDirective(html);
248+ });
249+
250+ it("creates hidden input field", function() {
251+ var onoff = angular.element(directive.find("input"));
252+ expect(onoff.length).toBe(1);
253+ });
254+ });
255+
256+
257 describe("single field", function() {
258
259 var directive, updateItemMethod, saveDefer;
260diff --git a/src/maasserver/static/js/angular/factories/domains.js b/src/maasserver/static/js/angular/factories/domains.js
261index 0d3fdf2..2662db8 100644
262--- a/src/maasserver/static/js/angular/factories/domains.js
263+++ b/src/maasserver/static/js/angular/factories/domains.js
264@@ -42,6 +42,18 @@ angular.module('MAAS').factory(
265 return RegionConnection.callMethod("domain.delete", domain);
266 };
267
268+ // Create a DNS record.
269+ DomainsManager.prototype.createDNSRecord = function(record) {
270+ if(record.rrtype === 'A' || record.rrtype === 'AAAA') {
271+ record.ip_addresses = record.rrdata.split(/[ ,]+/);
272+ return RegionConnection.callMethod(
273+ "domain.create_dnsresource", record);
274+ } else {
275+ return RegionConnection.callMethod(
276+ "domain.create_dnsdata", record);
277+ }
278+ };
279+
280 DomainsManager.prototype.getDefaultDomain = function() {
281 if(this._items.length === 0) {
282 return null;
283diff --git a/src/maasserver/static/js/angular/factories/tests/test_domains.js b/src/maasserver/static/js/angular/factories/tests/test_domains.js
284index b740939..7988f01 100644
285--- a/src/maasserver/static/js/angular/factories/tests/test_domains.js
286+++ b/src/maasserver/static/js/angular/factories/tests/test_domains.js
287@@ -14,6 +14,7 @@ describe("DomainsManager", function() {
288 var DomainsManager;
289 beforeEach(inject(function($injector) {
290 DomainsManager = $injector.get("DomainsManager");
291+ RegionConnection = $injector.get("RegionConnection");
292 }));
293
294 // Make a random domain.
295@@ -60,6 +61,52 @@ describe("DomainsManager", function() {
296 });
297 });
298
299+ describe("createDNSRecord", function() {
300+ it("calls create_dnsresource for A record", function() {
301+ spyOn(RegionConnection, "callMethod");
302+ var record = {
303+ 'rrtype': 'A',
304+ 'rrdata': '192.168.0.1'
305+ };
306+ DomainsManager.createDNSRecord(record);
307+ expect(RegionConnection.callMethod).toHaveBeenCalledWith(
308+ "domain.create_dnsresource", record);
309+ });
310+
311+ it("calls create_dnsresource for AAAA record", function() {
312+ spyOn(RegionConnection, "callMethod");
313+ var record = {
314+ 'rrtype': 'AAAA',
315+ 'rrdata': '2001:db8:1'
316+ };
317+ DomainsManager.createDNSRecord(record);
318+ expect(RegionConnection.callMethod).toHaveBeenCalledWith(
319+ "domain.create_dnsresource", record);
320+ });
321+
322+ it("converts rrdata into list for A and AAAA", function() {
323+ spyOn(RegionConnection, "callMethod");
324+ var record = {
325+ 'rrtype': 'AAAA',
326+ 'rrdata': '2001:db8::1, 10.0.0.1 127.0.0.1'
327+ };
328+ DomainsManager.createDNSRecord(record);
329+ expect(record.ip_addresses).toEqual([
330+ '2001:db8::1', '10.0.0.1', '127.0.0.1'
331+ ]);
332+ });
333+
334+ it("calls create_dnsdata for other types", function() {
335+ spyOn(RegionConnection, "callMethod");
336+ var record = {
337+ 'rrtype': 'SRV'
338+ };
339+ DomainsManager.createDNSRecord(record);
340+ expect(RegionConnection.callMethod).toHaveBeenCalledWith(
341+ "domain.create_dnsdata", record);
342+ });
343+ });
344+
345 describe("getDomainByName", function() {
346 it("returns null when no domains", function() {
347 expect(DomainsManager.getDomainByName('meh')).toBe(null);
348diff --git a/src/maasserver/static/js/io.js b/src/maasserver/static/js/yui/io.js
349index 86b15ef..86b15ef 100644
350--- a/src/maasserver/static/js/io.js
351+++ b/src/maasserver/static/js/yui/io.js
352diff --git a/src/maasserver/static/js/os_distro_select.js b/src/maasserver/static/js/yui/os_distro_select.js
353index 2fe0958..2fe0958 100644
354--- a/src/maasserver/static/js/os_distro_select.js
355+++ b/src/maasserver/static/js/yui/os_distro_select.js
356diff --git a/src/maasserver/static/js/prefs.js b/src/maasserver/static/js/yui/prefs.js
357index cff5636..cff5636 100644
358--- a/src/maasserver/static/js/prefs.js
359+++ b/src/maasserver/static/js/yui/prefs.js
360diff --git a/src/maasserver/static/js/reveal.js b/src/maasserver/static/js/yui/reveal.js
361index 7ab922a..7ab922a 100644
362--- a/src/maasserver/static/js/reveal.js
363+++ b/src/maasserver/static/js/yui/reveal.js
364diff --git a/src/maasserver/static/js/shortpoll.js b/src/maasserver/static/js/yui/shortpoll.js
365index 886ba93..886ba93 100644
366--- a/src/maasserver/static/js/shortpoll.js
367+++ b/src/maasserver/static/js/yui/shortpoll.js
368diff --git a/src/maasserver/static/partials/domain-details.html b/src/maasserver/static/partials/domain-details.html
369index 451a203..31343c0 100644
370--- a/src/maasserver/static/partials/domain-details.html
371+++ b/src/maasserver/static/partials/domain-details.html
372@@ -13,14 +13,17 @@
373 </p>
374 </div>
375 <div class="col-4">
376- <div class="page-header__controls ng-hide" data-ng-show="isSuperUser() && !isDefaultDomain() && !loading">
377+ <div class="page-header__controls ng-hide" data-ng-show="isSuperUser() && !loading">
378 <button class="p-button--negative"
379 data-ng-click="deleteButton()"
380- data-ng-hide="confirmingDelete">Delete domain</button>
381+ data-ng-hide="actionInProgress || isDefaultDomain()">Delete domain</button>
382+ <button class="p-button"
383+ data-ng-click="addRecordButton()"
384+ data-ng-hide="actionInProgress">Add record</button>
385 </div>
386 </div>
387 </div>
388- <div data-ng-if="confirmingDelete">
389+ <div data-ng-if="actionInProgress && action === 'delete'">
390 <div class="row u-no-margin--top ng-hide" data-ng-hide="canBeDeleted()">
391 <hr />
392 <div class="row">
393@@ -30,7 +33,7 @@
394 </p>
395 </div>
396 <div class="col-4 u-align--right">
397- <button class="p-button--base" type="button" data-ng-click="cancelDeleteButton()">Cancel</button>
398+ <button class="p-button--base" type="button" data-ng-click="cancelAction()">Cancel</button>
399 </div>
400 </div>
401 </div>
402@@ -43,7 +46,7 @@
403 </p>
404 </div>
405 <div class="col-4 u-align--right">
406- <button class="p-button--base" type="button" data-ng-click="cancelDeleteButton()">Cancel</button>
407+ <button class="p-button--base" type="button" data-ng-click="cancelAction()">Cancel</button>
408 <button class="p-button--negative" data-ng-click="deleteConfirmButton()">Delete domain</button>
409 </div>
410 </div>
411@@ -57,12 +60,51 @@
412 </p>
413 </div>
414 <div class="col-4 u-align--right">
415- <button class="p-button--base" type="button" data-ng-click="cancelDeleteButton()">Cancel</button>
416+ <button class="p-button--base" type="button" data-ng-click="cancelAction()">Cancel</button>
417 <button class="p-button--neutral" data-ng-click="deleteConfirmButton()">Retry</button>
418 </div>
419 </div>
420 </div>
421 </div>
422+ <div data-ng-if="actionInProgress && action === 'add_record'">
423+ <maas-obj-form obj="newObject" manager="domainsManager" manager-method="createDNSRecord" class="p-form--stacked"
424+ table-form="true" save-on-blur="false" after-save="cancelAction">
425+ <!-- pre-process="actionDNSRecordPreSave" -->
426+ <section class="row">
427+ <div class="col-6">
428+ <maas-obj-field
429+ subtle="false" type="text" key="name" label="Name" placeholder="Name"
430+ label-width="two" input-width="three"></maas-obj-field>
431+ <maas-obj-field
432+ subtle="false" type="options" key="rrtype" label="Type"
433+ options="type as type for type in supportedRecordTypes"
434+ label-width="two" input-width="three"></maas-obj-field>
435+ </div>
436+ <div class="col-6">
437+ <maas-obj-field
438+ subtle="false" type="text" key="rrdata" label="Data"
439+ placeholder="Data"
440+ label-width="two" input-width="three"></maas-obj-field>
441+ <maas-obj-field
442+ subtle="false" type="text" key="ttl" label="TTL"
443+ placeholder="TTL in seconds (optional)"
444+ label-width="two" input-width="three"></maas-obj-field>
445+ <maas-obj-field type="hidden" key="domain" value="{$ domain.id $}" />
446+ </div>
447+ </section>
448+ <section class="row">
449+ <div class="col-8">
450+ <maas-obj-errors class="page-header__message page-header__message--error"></maas-obj-errors>
451+ </div>
452+ <div class="col-4">
453+ <div class="u-align--right">
454+ <button class="p-button" data-ng-click="cancelAction()">Cancel</button>
455+ <button class="p-button--positive" maas-obj-save>Add record</button>
456+ </div>
457+ </div>
458+ </div>
459+ </maas-obj-form>
460+ </div>
461 </header>
462 <div class="p-strip" data-ng-show="!loading">
463 <section class="row">
464diff --git a/src/maasserver/templates/maasserver/js-conf.html b/src/maasserver/templates/maasserver/js-conf.html
465index 9999281..cae0420 100644
466--- a/src/maasserver/templates/maasserver/js-conf.html
467+++ b/src/maasserver/templates/maasserver/js-conf.html
468@@ -47,6 +47,9 @@ var MAAS_config = {
469 <script type="text/javascript"
470 src="{{STATIC_URL}}/js/bundle/maas-min.js?v={{files_version}}">
471 </script>
472+<script type="text/javascript"
473+ src="{{STATIC_URL}}/js/bundle/maas-yui-min.js?v={{files_version}}">
474+</script>
475
476 {% if global_options.enable_analytics %}
477 <script async src='https://www.google-analytics.com/analytics.js'></script>
478diff --git a/src/maastesting/karma.conf.js b/src/maastesting/karma.conf.js
479index 79a25a0..abc1026 100644
480--- a/src/maastesting/karma.conf.js
481+++ b/src/maastesting/karma.conf.js
482@@ -21,10 +21,9 @@ module.exports = function(config) {
483 '/usr/share/javascript/angular.js/angular-mocks.js',
484 '/usr/share/javascript/angular.js/angular-cookies.js',
485 '/usr/share/javascript/angular.js/angular-sanitize.js',
486- '../../src/maasserver/static/js/ui/maas-ui.js',
487- '../../src/maasserver/static/js/angular/maas.js',
488+ '../../src/maasserver/static/js/bundle/vendor-min.js',
489+ '../../src/maasserver/static/js/bundle/maas-min.js',
490 '../../src/maasserver/static/js/angular/testing/*.js',
491- '../../src/maasserver/static/js/angular/*/*.js',
492 '../../src/maasserver/static/js/angular/*/tests/test_*.js',
493 '../../src/maasserver/static/partials/*.html'
494 ],
495@@ -38,7 +37,8 @@ module.exports = function(config) {
496 // preprocess matching files before serving them to the browser
497 // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
498 preprocessors: {
499- '../../src/maasserver/static/partials/*.html': ['ng-html2js']
500+ '../../src/maasserver/static/partials/*.html': ['ng-html2js'],
501+ '**/*.js': ['sourcemap']
502 },
503
504 ngHtml2JsPreprocessor: {
505@@ -91,7 +91,8 @@ module.exports = function(config) {
506 'karma-opera-launcher',
507 'karma-phantomjs-launcher',
508 'karma-failed-reporter',
509- 'karma-ng-html2js-preprocessor'
510+ 'karma-ng-html2js-preprocessor',
511+ 'karma-sourcemap-loader'
512 ]
513 });
514 };
515diff --git a/webpack.config.js b/webpack.config.js
516index e8613b5..549f1f9 100644
517--- a/webpack.config.js
518+++ b/webpack.config.js
519@@ -5,8 +5,10 @@ const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
520 module.exports = {
521 entry: {
522 vendor: [].concat(
523- glob.sync('./src/maasserver/static/js/angular/3rdparty/*.js'),
524- ['react', 'react-dom']
525+ glob.sync('./src/maasserver/static/js/angular/3rdparty/*.js')
526+ ),
527+ 'maas-yui': [].concat(
528+ glob.sync('./src/maasserver/static/js/yui/*.js')
529 ),
530 maas: [].concat(
531 glob.sync('./src/maasserver/static/js/*.js'),
532diff --git a/yarn.lock b/yarn.lock
533index 90c4cea..3804cfb 100644
534--- a/yarn.lock
535+++ b/yarn.lock
536@@ -393,10 +393,6 @@
537 version "4.14.104"
538 resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.104.tgz#53ee2357fa2e6e68379341d92eb2ecea4b11bb80"
539
540-"@types/node@*":
541- version "9.4.6"
542- resolved "https://registry.yarnpkg.com/@types/node/-/node-9.4.6.tgz#d8176d864ee48753d053783e4e463aec86b8d82e"
543-
544 "@types/node@^6.0.46":
545 version "6.0.101"
546 resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.101.tgz#0c5911cfb434af4a51c0a499931fe6423207d921"
547@@ -409,14 +405,17 @@
548 version "0.0.32"
549 resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5"
550
551-"@types/react-dom@^16.0.4":
552- version "16.0.4"
553- resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.4.tgz#2e8fd45f5443780ed49bf2cdd9809e6091177a7d"
554+"@types/react-dom@^15.5.7":
555+ version "15.5.7"
556+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-15.5.7.tgz#a5c1c8b315e925d84d59db5ee88ca7e31c5030f9"
557 dependencies:
558- "@types/node" "*"
559- "@types/react" "*"
560+ "@types/react" "^15"
561+
562+"@types/react@^15":
563+ version "15.6.14"
564+ resolved "https://registry.yarnpkg.com/@types/react/-/react-15.6.14.tgz#fe176209b9de3514f9782fa41a239bffd26a3b56"
565
566-"@types/react@*", "@types/react@^16.0.40":
567+"@types/react@^16.0.40":
568 version "16.0.40"
569 resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.40.tgz#caabc2296886f40b67f6fc80f0f3464476461df9"
570
571@@ -460,8 +459,8 @@ acorn@^4.0.3:
572 resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
573
574 acorn@^5.0.0, acorn@^5.2.1, acorn@^5.4.1:
575- version "5.5.0"
576- resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.0.tgz#1abb587fbf051f94e3de20e6b26ef910b1828298"
577+ version "5.5.1"
578+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.1.tgz#84e05a9ea0acbe131227da50301e62464dc9c1d8"
579
580 addressparser@1.0.1:
581 version "1.0.1"
582@@ -507,8 +506,8 @@ ajv@^5.1.0:
583 json-schema-traverse "^0.3.0"
584
585 ajv@^6.1.0:
586- version "6.2.0"
587- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.0.tgz#afac295bbaa0152449e522742e4547c1ae9328d2"
588+ version "6.2.1"
589+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.1.tgz#28a6abc493a2abe0fb4c8507acaedb43fa550671"
590 dependencies:
591 fast-deep-equal "^1.0.0"
592 fast-json-stable-stringify "^2.0.0"
593@@ -552,9 +551,9 @@ ansi-styles@^2.2.1:
594 version "2.2.1"
595 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
596
597-ansi-styles@^3.2.0:
598- version "3.2.0"
599- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88"
600+ansi-styles@^3.2.1:
601+ version "3.2.1"
602+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
603 dependencies:
604 color-convert "^1.9.0"
605
606@@ -1786,12 +1785,12 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
607 supports-color "^2.0.0"
608
609 chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1:
610- version "2.3.1"
611- resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796"
612+ version "2.3.2"
613+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65"
614 dependencies:
615- ansi-styles "^3.2.0"
616+ ansi-styles "^3.2.1"
617 escape-string-regexp "^1.0.5"
618- supports-color "^5.2.0"
619+ supports-color "^5.3.0"
620
621 chalk@~0.4.0:
622 version "0.4.0"
623@@ -1934,12 +1933,12 @@ clone@^2.1.1:
624 resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
625
626 cloneable-readable@^1.0.0:
627- version "1.0.0"
628- resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117"
629+ version "1.1.1"
630+ resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.1.tgz#c27a4f3a943ca37bed9b01c7d572ee61b1302b15"
631 dependencies:
632 inherits "^2.0.1"
633- process-nextick-args "^1.0.6"
634- through2 "^2.0.1"
635+ process-nextick-args "^2.0.0"
636+ readable-stream "^2.3.5"
637
638 co@^4.6.0:
639 version "4.6.0"
640@@ -2021,8 +2020,8 @@ combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
641 delayed-stream "~1.0.0"
642
643 commander@^2.9.0:
644- version "2.14.1"
645- resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
646+ version "2.15.0"
647+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.0.tgz#ad2a23a1c3b036e392469b8012cec6b33b4c1322"
648
649 commander@~2.13.0:
650 version "2.13.0"
651@@ -2200,8 +2199,8 @@ cross-spawn@^5.0.1:
652 which "^1.2.9"
653
654 cross-spawn@^6.0.4:
655- version "6.0.4"
656- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.4.tgz#bbf44ccb30fb8314a08f178b62290c669c36d808"
657+ version "6.0.5"
658+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
659 dependencies:
660 nice-try "^1.0.4"
661 path-key "^2.0.1"
662@@ -2430,8 +2429,8 @@ diff@^2.1.2:
663 resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99"
664
665 diff@^3.3.0, diff@^3.3.1:
666- version "3.4.0"
667- resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
668+ version "3.5.0"
669+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
670
671 diffie-hellman@^5.0.0:
672 version "5.0.2"
673@@ -2477,8 +2476,8 @@ duplexer3@^0.1.4:
674 resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
675
676 duplexify@^3.4.2, duplexify@^3.5.3:
677- version "3.5.3"
678- resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.3.tgz#8b5818800df92fd0125b27ab896491912858243e"
679+ version "3.5.4"
680+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4"
681 dependencies:
682 end-of-stream "^1.0.0"
683 inherits "^2.0.1"
684@@ -2934,8 +2933,8 @@ first-chunk-stream@^2.0.0:
685 readable-stream "^2.0.2"
686
687 flow-parser@^0.*:
688- version "0.66.0"
689- resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.66.0.tgz#be583fefb01192aa5164415d31a6241b35718983"
690+ version "0.67.1"
691+ resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.67.1.tgz#191fed56ccfd8d097dc9d487f2da3b0dae745849"
692
693 flush-write-stream@^1.0.0:
694 version "1.0.2"
695@@ -3494,8 +3493,8 @@ homedir-polyfill@^1.0.1:
696 parse-passwd "^1.0.0"
697
698 hosted-git-info@^2.1.4:
699- version "2.5.0"
700- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
701+ version "2.6.0"
702+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222"
703
704 htmlescape@^1.1.0:
705 version "1.1.1"
706@@ -4219,6 +4218,12 @@ karma-phantomjs-launcher@^1.0.4:
707 lodash "^4.0.1"
708 phantomjs-prebuilt "^2.1.7"
709
710+karma-sourcemap-loader@^0.3.7:
711+ version "0.3.7"
712+ resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8"
713+ dependencies:
714+ graceful-fs "^4.1.2"
715+
716 karma@^2.0.0:
717 version "2.0.0"
718 resolved "https://registry.yarnpkg.com/karma/-/karma-2.0.0.tgz#a02698dd7f0f05ff5eb66ab8f65582490b512e58"
719@@ -5529,14 +5534,14 @@ private@^0.1.6, private@^0.1.7, private@~0.1.5:
720 version "0.1.8"
721 resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
722
723-process-nextick-args@^1.0.6, process-nextick-args@~1.0.6:
724- version "1.0.7"
725- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
726-
727-process-nextick-args@~2.0.0:
728+process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
729 version "2.0.0"
730 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
731
732+process-nextick-args@~1.0.6:
733+ version "1.0.7"
734+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
735+
736 process@^0.11.10, process@~0.11.0:
737 version "0.11.10"
738 resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
739@@ -5802,9 +5807,9 @@ read-pkg@^2.0.0:
740 normalize-package-data "^2.3.2"
741 path-type "^2.0.0"
742
743-"readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3:
744- version "2.3.4"
745- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071"
746+"readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5:
747+ version "2.3.5"
748+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d"
749 dependencies:
750 core-util-is "~1.0.0"
751 inherits "~2.0.3"
752@@ -6743,9 +6748,9 @@ string-width@^2.0.0, string-width@^2.1.0:
753 is-fullwidth-code-point "^2.0.0"
754 strip-ansi "^4.0.0"
755
756-string_decoder@^1.0.0, string_decoder@~1.0.0, string_decoder@~1.0.3:
757- version "1.0.3"
758- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
759+string_decoder@^1.0.0:
760+ version "1.1.0"
761+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.0.tgz#384f322ee8a848e500effde99901bba849c5d403"
762 dependencies:
763 safe-buffer "~5.1.0"
764
765@@ -6753,6 +6758,12 @@ string_decoder@~0.10.x:
766 version "0.10.31"
767 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
768
769+string_decoder@~1.0.0, string_decoder@~1.0.3:
770+ version "1.0.3"
771+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
772+ dependencies:
773+ safe-buffer "~5.1.0"
774+
775 stringstream@~0.0.4, stringstream@~0.0.5:
776 version "0.0.5"
777 resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
778@@ -6814,9 +6825,9 @@ supports-color@^2.0.0:
779 version "2.0.0"
780 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
781
782-supports-color@^5.2.0:
783- version "5.2.0"
784- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a"
785+supports-color@^5.2.0, supports-color@^5.3.0:
786+ version "5.3.0"
787+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0"
788 dependencies:
789 has-flag "^3.0.0"
790
791@@ -6878,7 +6889,7 @@ throttleit@^1.0.0:
792 version "1.0.0"
793 resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
794
795-through2@^2.0.0, through2@^2.0.1:
796+through2@^2.0.0:
797 version "2.0.3"
798 resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
799 dependencies:
800@@ -7292,7 +7303,7 @@ void-elements@^2.0.0:
801 version "2.0.1"
802 resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
803
804-watchpack@^1.4.0:
805+watchpack@^1.5.0:
806 version "1.5.0"
807 resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed"
808 dependencies:
809@@ -7376,9 +7387,9 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0:
810 source-list-map "^2.0.0"
811 source-map "~0.6.1"
812
813-webpack@^4.0.1:
814- version "4.0.1"
815- resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.0.1.tgz#768d708beeca4c5f77f6c2d38a240fb6ff50ba5d"
816+webpack@^4.1.1:
817+ version "4.1.1"
818+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.1.1.tgz#44e4d6a869dd36fdfc0b227f9bd865a4bccfd81c"
819 dependencies:
820 acorn "^5.0.0"
821 acorn-dynamic-import "^3.0.0"
822@@ -7397,7 +7408,7 @@ webpack@^4.0.1:
823 schema-utils "^0.4.2"
824 tapable "^1.0.0"
825 uglifyjs-webpack-plugin "^1.1.1"
826- watchpack "^1.4.0"
827+ watchpack "^1.5.0"
828 webpack-sources "^1.0.1"
829
830 whatwg-fetch@>=0.10.0:

Subscribers

People subscribed via source and target branches