Skip to content

Commit f531ad0

Browse files
Merge pull request #2622 from rhamilto/bz-1530162
Automatic merge from submit-queue. Check if user can add to existing project during create from url Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1530162 If user cannot add to project, add error message on select of project ![screen shot 2018-01-02 at 3 50 08 pm](https://user-images.githubusercontent.com/895728/34499887-452cdfb8-efd6-11e7-9070-787b1dc76e73.PNG)
2 parents 4ddbb2d + 5fa3962 commit f531ad0

File tree

4 files changed

+124
-56
lines changed

4 files changed

+124
-56
lines changed

app/scripts/controllers/createFromURL.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Controller of the openshiftConsole
88
*/
99
angular.module('openshiftConsole')
10-
.controller('CreateFromURLController', function ($scope, $routeParams, $location, $filter, AuthService, DataService, Navigate, ProjectsService ) {
10+
.controller('CreateFromURLController', function ($scope, $routeParams, $location, $filter, AuthService, AuthorizationService, DataService, Navigate, ProjectsService ) {
1111
AuthService.withUser();
1212

1313
$scope.alerts = {};
@@ -174,4 +174,18 @@ angular.module('openshiftConsole')
174174
$scope.canCreateProject = false;
175175
});
176176

177+
$scope.forms = {};
178+
// assume the user can add to project by default
179+
$scope.canIAddToProject = true;
180+
181+
$scope.canIAddToSelectedProject = function(selectedProject) {
182+
var selectedProjectName = _.get(selectedProject, 'metadata.name');
183+
AuthorizationService.getProjectRules(selectedProjectName).then(function() {
184+
$scope.canIAddToProject = AuthorizationService.canIAddToProject(selectedProjectName);
185+
if($scope.forms) {
186+
$scope.forms.selectProjectForm.selectProject.$setValidity('cannotAddToProject', $scope.canIAddToProject);
187+
}
188+
});
189+
};
190+
177191
});

app/views/create-from-url.html

+51-24
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,9 @@ <h2>Create a New Project</h2>
1515
</div>
1616
<div ng-if="!noProjects && !canCreateProject">
1717
<h2>Choose a Project</h2>
18-
<ui-select ng-model="selected.project">
19-
<ui-select-match placeholder="Project name">
20-
{{$select.selected | displayName}}
21-
</ui-select-match>
22-
<ui-select-choices repeat="project in projects | searchProjects : $select.search">
23-
<span ng-bind-html="project | displayName | highlightKeywords : $select.search"></span>
24-
<span ng-if="project | displayName : true" class="small text-muted">
25-
&ndash;
26-
<span ng-bind-html="project.metadata.name | highlightKeywords : $select.search"></span>
27-
</span>
28-
</ui-select-choices>
29-
</ui-select>
30-
</div>
31-
<div ng-if="!noProjects && canCreateProject">
32-
<uib-tabset>
33-
<uib-tab>
34-
<uib-tab-heading>Choose Existing Project</uib-tab-heading>
35-
<ui-select ng-model="selected.project">
18+
<form name="forms.selectProjectForm">
19+
<div class="form-group" ng-class="{'has-error': forms.selectProjectForm.selectProject.$error.cannotAddToProject}">
20+
<ui-select ng-model="selected.project" name="selectProject" on-select="canIAddToSelectedProject($item)">
3621
<ui-select-match placeholder="Project name">
3722
{{$select.selected | displayName}}
3823
</ui-select-match>
@@ -44,15 +29,57 @@ <h2>Choose a Project</h2>
4429
</span>
4530
</ui-select-choices>
4631
</ui-select>
32+
<div ng-if="forms.selectProjectForm.selectProject.$error.cannotAddToProject">
33+
<span class="help-block">
34+
You are not authorized to add to this project.
35+
</span>
36+
</div>
4737
<div class="button-group mar-bottom-lg mar-top-lg">
4838
<button
49-
type="submit"
50-
class="btn btn-primary btn-lg"
51-
ng-click="createWithProject()"
52-
ng-disabled="!(selected.project)"
53-
value="">Next</button>
54-
<a class="btn btn-default btn-lg" href="#" back>Cancel</a>
39+
type="submit"
40+
class="btn btn-primary"
41+
ng-click="createWithProject()"
42+
ng-disabled="!(selected.project) || !canIAddToProject"
43+
value="">Next</button>
44+
<a class="btn btn-default" href="#" back>Cancel</a>
5545
</div>
46+
</div>
47+
</form>
48+
</div>
49+
<div ng-if="!noProjects && canCreateProject">
50+
<uib-tabset>
51+
<uib-tab>
52+
<uib-tab-heading>Choose Existing Project</uib-tab-heading>
53+
<form name="forms.selectProjectForm">
54+
<div class="form-group" ng-class="{'has-error': forms.selectProjectForm.selectProject.$error.cannotAddToProject}">
55+
<ui-select ng-model="selected.project" name="selectProject" on-select="canIAddToSelectedProject($item)">
56+
<ui-select-match placeholder="Project name">
57+
{{$select.selected | displayName}}
58+
</ui-select-match>
59+
<ui-select-choices repeat="project in projects | searchProjects : $select.search">
60+
<span ng-bind-html="project | displayName | highlightKeywords : $select.search"></span>
61+
<span ng-if="project | displayName : true" class="small text-muted">
62+
&ndash;
63+
<span ng-bind-html="project.metadata.name | highlightKeywords : $select.search"></span>
64+
</span>
65+
</ui-select-choices>
66+
</ui-select>
67+
<div ng-if="forms.selectProjectForm.selectProject.$error.cannotAddToProject">
68+
<span class="help-block">
69+
You are not authorized to add to this project.
70+
</span>
71+
</div>
72+
<div class="button-group mar-bottom-lg mar-top-lg">
73+
<button
74+
type="submit"
75+
class="btn btn-primary"
76+
ng-click="createWithProject()"
77+
ng-disabled="!(selected.project) || !canIAddToProject"
78+
value="">Next</button>
79+
<a class="btn btn-default" href="#" back>Cancel</a>
80+
</div>
81+
</div>
82+
</form>
5683
</uib-tab>
5784
<uib-tab>
5885
<uib-tab-heading>Create a New Project</uib-tab-heading>

dist/scripts/scripts.js

+32-27
Original file line numberDiff line numberDiff line change
@@ -8404,24 +8404,24 @@ partialObjectMetadataList: !0
84048404
e.projectTemplates = t.by("metadata.name");
84058405
}));
84068406
}));
8407-
} ]), angular.module("openshiftConsole").controller("CreateFromURLController", [ "$scope", "$routeParams", "$location", "$filter", "AuthService", "DataService", "Navigate", "ProjectsService", function(e, t, n, r, a, o, i, s) {
8407+
} ]), angular.module("openshiftConsole").controller("CreateFromURLController", [ "$scope", "$routeParams", "$location", "$filter", "AuthService", "AuthorizationService", "DataService", "Navigate", "ProjectsService", function(e, t, n, r, a, o, i, s, c) {
84088408
a.withUser(), e.alerts = {}, e.selected = {};
8409-
var c = function(t) {
8409+
var l = function(t) {
84108410
e.alerts.invalidImageStream = {
84118411
type: "error",
84128412
message: 'The requested image stream "' + t + '" could not be loaded.'
84138413
};
8414-
}, l = function(t) {
8414+
}, u = function(t) {
84158415
e.alerts.invalidImageTag = {
84168416
type: "error",
84178417
message: 'The requested image stream tag "' + t + '" could not be loaded.'
84188418
};
8419-
}, u = function(t) {
8419+
}, d = function(t) {
84208420
e.alerts.invalidTemplate = {
84218421
type: "error",
84228422
message: 'The requested template "' + t + '" could not be loaded.'
84238423
};
8424-
}, d = function() {
8424+
}, m = function() {
84258425
try {
84268426
return t.templateParamsMap && JSON.parse(t.templateParamsMap) || {};
84278427
} catch (t) {
@@ -8430,44 +8430,44 @@ type: "error",
84308430
message: "The templateParamsMap is not valid JSON. " + t
84318431
};
84328432
}
8433-
}, m = window.OPENSHIFT_CONSTANTS.CREATE_FROM_URL_WHITELIST, p = [ "namespace", "name", "imageStream", "imageTag", "sourceURI", "sourceRef", "contextDir", "template", "templateParamsMap" ], f = _.pickBy(t, function(e, t) {
8434-
return _.includes(p, t) && _.isString(e);
8433+
}, p = window.OPENSHIFT_CONSTANTS.CREATE_FROM_URL_WHITELIST, f = [ "namespace", "name", "imageStream", "imageTag", "sourceURI", "sourceRef", "contextDir", "template", "templateParamsMap" ], g = _.pickBy(t, function(e, t) {
8434+
return _.includes(f, t) && _.isString(e);
84358435
});
8436-
f.namespace = f.namespace || "openshift";
8437-
_.includes(m, f.namespace) ? f.imageStream && f.template ? e.alerts.invalidResource = {
8436+
g.namespace = g.namespace || "openshift";
8437+
_.includes(p, g.namespace) ? g.imageStream && g.template ? e.alerts.invalidResource = {
84388438
type: "error",
84398439
message: "Image streams and templates cannot be combined."
8440-
} : f.imageStream || f.template ? f.name && !function(e) {
8440+
} : g.imageStream || g.template ? g.name && !function(e) {
84418441
return _.size(e) < 25 && /^[a-z]([-a-z0-9]*[a-z0-9])?$/.test(e);
8442-
}(f.name) ? function(t) {
8442+
}(g.name) ? function(t) {
84438443
e.alerts.invalidImageStream = {
84448444
type: "error",
84458445
message: 'The app name "' + t + "\" is not valid. An app name is an alphanumeric (a-z, and 0-9) string with a maximum length of 24 characters, where the first character is a letter (a-z), and the '-' character is allowed anywhere except the first or last character."
84468446
};
8447-
}(f.name) : (f.imageStream && o.get("imagestreams", f.imageStream, {
8448-
namespace: f.namespace
8447+
}(g.name) : (g.imageStream && i.get("imagestreams", g.imageStream, {
8448+
namespace: g.namespace
84498449
}, {
84508450
errorNotification: !1
84518451
}).then(function(t) {
8452-
e.imageStream = t, o.get("imagestreamtags", t.metadata.name + ":" + f.imageTag, {
8453-
namespace: f.namespace
8452+
e.imageStream = t, i.get("imagestreamtags", t.metadata.name + ":" + g.imageTag, {
8453+
namespace: g.namespace
84548454
}, {
84558455
errorNotification: !1
84568456
}).then(function(t) {
8457-
e.imageStreamTag = t, e.validationPassed = !0, e.resource = t, f.displayName = r("displayName")(t);
8457+
e.imageStreamTag = t, e.validationPassed = !0, e.resource = t, g.displayName = r("displayName")(t);
84588458
}, function() {
8459-
l(f.imageTag);
8459+
u(g.imageTag);
84608460
});
84618461
}, function() {
8462-
c(f.imageStream);
8463-
}), f.template && o.get("templates", f.template, {
8464-
namespace: f.namespace
8462+
l(g.imageStream);
8463+
}), g.template && i.get("templates", g.template, {
8464+
namespace: g.namespace
84658465
}, {
84668466
errorNotification: !1
84678467
}).then(function(t) {
8468-
e.template = t, d() && (e.validationPassed = !0, e.resource = t);
8468+
e.template = t, m() && (e.validationPassed = !0, e.resource = t);
84698469
}, function() {
8470-
u(f.template);
8470+
d(g.template);
84718471
})) : e.alerts.resourceRequired = {
84728472
type: "error",
84738473
message: "An image stream or template is required."
@@ -8476,20 +8476,25 @@ e.alerts.invalidNamespace = {
84768476
type: "error",
84778477
message: 'Resources from the namespace "' + t + '" are not permitted.'
84788478
};
8479-
}(f.namespace), angular.extend(e, {
8480-
createDetails: f,
8479+
}(g.namespace), angular.extend(e, {
8480+
createDetails: g,
84818481
createWithProject: function(r) {
84828482
r = r || e.selected.project.metadata.name;
8483-
var a = t.imageStream ? i.createFromImageURL(e.imageStream, f.imageTag, r, f) : i.createFromTemplateURL(e.template, r, f);
8483+
var a = t.imageStream ? s.createFromImageURL(e.imageStream, g.imageTag, r, g) : s.createFromTemplateURL(e.template, r, g);
84848484
n.url(a);
84858485
}
8486-
}), e.projects = {}, e.canCreateProject = void 0, s.list().then(function(t) {
8486+
}), e.projects = {}, e.canCreateProject = void 0, c.list().then(function(t) {
84878487
e.loaded = !0, e.projects = r("orderByDisplayName")(t.by("metadata.name")), e.noProjects = _.isEmpty(e.projects);
8488-
}), s.canCreate().then(function() {
8488+
}), c.canCreate().then(function() {
84898489
e.canCreateProject = !0;
84908490
}, function() {
84918491
e.canCreateProject = !1;
8492+
}), e.forms = {}, e.canIAddToProject = !0, e.canIAddToSelectedProject = function(t) {
8493+
var n = _.get(t, "metadata.name");
8494+
o.getProjectRules(n).then(function() {
8495+
e.canIAddToProject = o.canIAddToProject(n), e.forms && e.forms.selectProjectForm.selectProject.$setValidity("cannotAddToProject", e.canIAddToProject);
84928496
});
8497+
};
84938498
} ]), angular.module("openshiftConsole").controller("CreateProjectController", [ "$scope", "$location", "$window", "AuthService", "Constants", function(e, t, n, r, a) {
84948499
var o = !a.DISABLE_SERVICE_CATALOG_LANDING_PAGE;
84958500
e.onProjectCreated = function(e) {

dist/scripts/templates.js

+26-4
Original file line numberDiff line numberDiff line change
@@ -4554,7 +4554,9 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
45544554
"</div>\n" +
45554555
"<div ng-if=\"!noProjects && !canCreateProject\">\n" +
45564556
"<h2>Choose a Project</h2>\n" +
4557-
"<ui-select ng-model=\"selected.project\">\n" +
4557+
"<form name=\"forms.selectProjectForm\">\n" +
4558+
"<div class=\"form-group\" ng-class=\"{'has-error': forms.selectProjectForm.selectProject.$error.cannotAddToProject}\">\n" +
4559+
"<ui-select ng-model=\"selected.project\" name=\"selectProject\" on-select=\"canIAddToSelectedProject($item)\">\n" +
45584560
"<ui-select-match placeholder=\"Project name\">\n" +
45594561
"{{$select.selected | displayName}}\n" +
45604562
"</ui-select-match>\n" +
@@ -4566,12 +4568,25 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
45664568
"</span>\n" +
45674569
"</ui-select-choices>\n" +
45684570
"</ui-select>\n" +
4571+
"<div ng-if=\"forms.selectProjectForm.selectProject.$error.cannotAddToProject\">\n" +
4572+
"<span class=\"help-block\">\n" +
4573+
"You are not authorized to add to this project.\n" +
4574+
"</span>\n" +
4575+
"</div>\n" +
4576+
"<div class=\"button-group mar-bottom-lg mar-top-lg\">\n" +
4577+
"<button type=\"submit\" class=\"btn btn-primary\" ng-click=\"createWithProject()\" ng-disabled=\"!(selected.project) || !canIAddToProject\" value=\"\">Next</button>\n" +
4578+
"<a class=\"btn btn-default\" href=\"#\" back>Cancel</a>\n" +
4579+
"</div>\n" +
4580+
"</div>\n" +
4581+
"</form>\n" +
45694582
"</div>\n" +
45704583
"<div ng-if=\"!noProjects && canCreateProject\">\n" +
45714584
"<uib-tabset>\n" +
45724585
"<uib-tab>\n" +
45734586
"<uib-tab-heading>Choose Existing Project</uib-tab-heading>\n" +
4574-
"<ui-select ng-model=\"selected.project\">\n" +
4587+
"<form name=\"forms.selectProjectForm\">\n" +
4588+
"<div class=\"form-group\" ng-class=\"{'has-error': forms.selectProjectForm.selectProject.$error.cannotAddToProject}\">\n" +
4589+
"<ui-select ng-model=\"selected.project\" name=\"selectProject\" on-select=\"canIAddToSelectedProject($item)\">\n" +
45754590
"<ui-select-match placeholder=\"Project name\">\n" +
45764591
"{{$select.selected | displayName}}\n" +
45774592
"</ui-select-match>\n" +
@@ -4583,10 +4598,17 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
45834598
"</span>\n" +
45844599
"</ui-select-choices>\n" +
45854600
"</ui-select>\n" +
4601+
"<div ng-if=\"forms.selectProjectForm.selectProject.$error.cannotAddToProject\">\n" +
4602+
"<span class=\"help-block\">\n" +
4603+
"You are not authorized to add to this project.\n" +
4604+
"</span>\n" +
4605+
"</div>\n" +
45864606
"<div class=\"button-group mar-bottom-lg mar-top-lg\">\n" +
4587-
"<button type=\"submit\" class=\"btn btn-primary btn-lg\" ng-click=\"createWithProject()\" ng-disabled=\"!(selected.project)\" value=\"\">Next</button>\n" +
4588-
"<a class=\"btn btn-default btn-lg\" href=\"#\" back>Cancel</a>\n" +
4607+
"<button type=\"submit\" class=\"btn btn-primary\" ng-click=\"createWithProject()\" ng-disabled=\"!(selected.project) || !canIAddToProject\" value=\"\">Next</button>\n" +
4608+
"<a class=\"btn btn-default\" href=\"#\" back>Cancel</a>\n" +
4609+
"</div>\n" +
45894610
"</div>\n" +
4611+
"</form>\n" +
45904612
"</uib-tab>\n" +
45914613
"<uib-tab>\n" +
45924614
"<uib-tab-heading>Create a New Project</uib-tab-heading>\n" +

0 commit comments

Comments
 (0)