Merge pull request #3662 from pedroigor/KEYCLOAK-4034
[KEYCLOAK-4034] - Improvements to UI, performance and some code cleanup
This commit is contained in:
commit
40591cff25
88 files changed
+2667
-1553
No files matched your search
@@ -1036,6 +1036,10 @@ authz-result=Result
|
||||
authz-authorization-services-enabled=Authorization Enabled
|
||||
authz-authorization-services-enabled.tooltip=Enable/Disable fine-grained authorization support for a client
|
||||
authz-required=Required
|
||||
authz-show-details=Show Details
|
||||
authz-hide-details=Hide Details
|
||||
authz-associated-permissions=Associated Permissions
|
||||
authz-no-permission-associated=No permissions associated
|
||||
|
||||
# Authz Settings
|
||||
authz-import-config.tooltip=Import a JSON file containing authorization settings for this resource server.
|
||||
@@ -1056,6 +1060,7 @@ authz-export-settings.tooltip=Export and download all authorization settings for
|
||||
authz-no-resources-available=No resources available.
|
||||
authz-no-scopes-assigned=No scopes assigned.
|
||||
authz-no-type-defined=No type defined.
|
||||
authz-no-uri-defined=No URI defined.
|
||||
authz-no-permission-assigned=No permission assigned.
|
||||
authz-no-policy-assigned=No policy assigned.
|
||||
authz-create-permission=Create permission
|
||||
|
||||
+703
-207
File diff suppressed because it is too large.
Load diff
@@ -16,7 +16,9 @@ module.factory('ResourceServerResource', function($resource) {
|
||||
rsrid : '@rsrid'
|
||||
}, {
|
||||
'update' : {method : 'PUT'},
|
||||
'search' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/resource/search', method : 'GET'}
|
||||
'search' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/resource/search', method : 'GET'},
|
||||
'scopes' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/resource/:rsrid/scopes', method : 'GET', isArray: true},
|
||||
'permissions' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/resource/:rsrid/permissions', method : 'GET', isArray: true}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -27,7 +29,9 @@ module.factory('ResourceServerScope', function($resource) {
|
||||
id : '@id'
|
||||
}, {
|
||||
'update' : {method : 'PUT'},
|
||||
'search' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/scope/search', method : 'GET'}
|
||||
'search' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/scope/search', method : 'GET'},
|
||||
'resources' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/scope/:id/resources', method : 'GET', isArray: true},
|
||||
'permissions' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/scope/:id/permissions', method : 'GET', isArray: true},
|
||||
});
|
||||
});
|
||||
|
||||
@@ -38,7 +42,11 @@ module.factory('ResourceServerPolicy', function($resource) {
|
||||
id : '@id'
|
||||
}, {
|
||||
'update' : {method : 'PUT'},
|
||||
'search' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/search', method : 'GET'}
|
||||
'search' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/search', method : 'GET'},
|
||||
'associatedPolicies' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/:id/associatedPolicies', method : 'GET', isArray: true},
|
||||
'dependentPolicies' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/:id/dependentPolicies', method : 'GET', isArray: true},
|
||||
'scopes' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/:id/scopes', method : 'GET', isArray: true},
|
||||
'resources' : {url: authUrl + '/admin/realms/:realm/clients/:client/authz/resource-server/policy/:id/resources', method : 'GET', isArray: true}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
+2
-6
@@ -39,9 +39,7 @@
|
||||
<label class="col-md-2 control-label" for="reqActions">{{:: 'authz-resources' | translate}} <span class="required">*</span></label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<select ui-select2="{ minimumInputLength: 1}" id="reqActions" data-ng-model="policy.config.resources" data-placeholder="{{:: 'authz-select-resource' | translate}}..." multiple data-ng-required="!policy.config.default">
|
||||
<option ng-repeat="resource in resources" value="{{resource._id}}" ng-selected="true">{{resource.name}}</option>
|
||||
</select>
|
||||
<input type="hidden" ui-select2="resourcesUiSelect" id="reqActions" data-ng-model="policy.config.resources" data-placeholder="{{:: 'authz-select-resource' | translate}}..." data-ng-required="!policy.config.default"/>
|
||||
</div>
|
||||
<kc-tooltip>{{:: 'authz-permission-resource-resource.tooltip' | translate}}</kc-tooltip>
|
||||
</div>
|
||||
@@ -58,9 +56,7 @@
|
||||
<label class="col-md-2 control-label" for="reqActions">{{:: 'authz-policy-apply-policy' | translate}} <span class="required">*</span></label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<select ui-select2 id="reqActions" data-ng-model="policy.config.applyPolicies" data-placeholder="{{:: 'authz-select-a-policy' | translate}}..." multiple required>
|
||||
<option ng-repeat="policy in policies" value="{{policy.id}}" ng-selected="true">{{policy.name}}</option>
|
||||
</select>
|
||||
<input type="hidden" ui-select2="policiesUiSelect" id="reqActions" data-ng-model="policy.config.applyPolicies" data-placeholder="{{:: 'authz-select-a-policy' | translate}}..." multiple required />
|
||||
</div>
|
||||
|
||||
<kc-tooltip>{{:: 'authz-policy-apply-policy.tooltip' | translate}}</kc-tooltip>
|
||||
|
||||
+6
-20
@@ -32,12 +32,7 @@
|
||||
<label class="col-md-2 control-label" for="reqActions">{{:: 'authz-resource' | translate}}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<select class="form-control" id="reqActions"
|
||||
ng-model="policy.config.resources"
|
||||
ng-change="resolveScopes(policy)"
|
||||
data-ng-options="resource._id as resource.name for resource in resources">
|
||||
<option value="">{{:: 'authz-any-resource' | translate}}...</option>
|
||||
</select>
|
||||
<input type="hidden" ui-select2="resourcesUiSelect" data-ng-change="selectResource()" id="reqActions" data-ng-model="policy.config.resources" data-placeholder="{{:: 'authz-any-resource' | translate}}..." />
|
||||
</div>
|
||||
<kc-tooltip>{{:: 'authz-permission-scope-resource.tooltip' | translate}}</kc-tooltip>
|
||||
</div>
|
||||
@@ -45,25 +40,19 @@
|
||||
<label class="col-md-2 control-label" for="reqActions">{{:: 'authz-scopes' | translate}} <span class="required">*</span></label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<select ui-select2 id="reqActions"
|
||||
<select ui-select2 id="reqActions2"
|
||||
data-ng-model="policy.config.scopes"
|
||||
data-placeholder="{{:: 'authz-any-scope' | translate}}..." multiple
|
||||
data-ng-required="policy.config.resources != ''"
|
||||
data-ng-options="scope.id as scope.name for scope in scopes track by scope.id"/>
|
||||
data-ng-required="policy.config.resources != null"
|
||||
data-ng-options="scope.id as scope.name for scope in policy.config.resources.scopes track by scope.id"/>
|
||||
</div>
|
||||
|
||||
<kc-tooltip>{{:: 'authz-permission-scope-scope.tooltip' | translate}}</kc-tooltip>
|
||||
</div>
|
||||
<div class="form-group clearfix" data-ng-show="!policy.config.resources">
|
||||
<label class="col-md-2 control-label" for="reqActions">{{:: 'authz-scopes' | translate}} <span class="required">*</span></label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<select ui-select2="{ minimumInputLength: 1}" id="reqActions"
|
||||
data-ng-model="policy.config.scopes"
|
||||
data-placeholder="{{:: 'authz-any-scope' | translate}}..." multiple
|
||||
data-ng-required="policy.config.resources == ''"
|
||||
data-ng-options="scope.id as scope.name for scope in scopes track by scope.id"/>
|
||||
</select>
|
||||
<input type="hidden" ui-select2="scopesUiSelect" id="reqActions" data-ng-model="policy.config.scopes" data-placeholder="{{:: 'authz-any-scope' | translate}}..." multiple data-ng-required="policy.config.resources == null" />
|
||||
</div>
|
||||
<kc-tooltip>{{:: 'authz-permission-scope-scope.tooltip' | translate}}</kc-tooltip>
|
||||
</div>
|
||||
@@ -71,9 +60,7 @@
|
||||
<label class="col-md-2 control-label" for="reqActions">{{:: 'authz-policy-apply-policy' | translate}} <span class="required">*</span></label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<select ui-select2 id="reqActions" data-ng-model="policy.config.applyPolicies" data-placeholder="{{:: 'authz-select-a-policy' | translate}}..." multiple required>
|
||||
<option ng-repeat="policy in policies" value="{{policy.id}}" ng-selected="true">{{policy.name}}</option>
|
||||
</select>
|
||||
<input type="hidden" ui-select2="policiesUiSelect" id="reqActions" data-ng-model="policy.config.applyPolicies" data-placeholder="{{:: 'authz-select-a-policy' | translate}}..." multiple required />
|
||||
</div>
|
||||
|
||||
<kc-tooltip>{{:: 'authz-policy-apply-policy.tooltip' | translate}}</kc-tooltip>
|
||||
@@ -95,7 +82,6 @@
|
||||
</div>
|
||||
<input type="hidden" data-ng-model="policy.type"/>
|
||||
</fieldset>
|
||||
|
||||
<div class="form-group" data-ng-show="access.manageAuthorization">
|
||||
<div class="col-md-10 col-md-offset-2">
|
||||
<button kc-save data-ng-disabled="!changed">{{:: 'save' | translate}}</button>
|
||||
|
||||
+41
-9
@@ -28,6 +28,12 @@
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<select class="form-control search" data-ng-model="detailsFilter" data-ng-change="searchQuery();">
|
||||
<option value="" selected>Hide Details</option>
|
||||
<option value="true">Show Details</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="pull-right">
|
||||
<select class="form-control" ng-model="policyType"
|
||||
ng-options="p.name for p in policyProviders track by p.type"
|
||||
@@ -42,7 +48,7 @@
|
||||
<th>{{:: 'name' | translate}}</th>
|
||||
<th>{{:: 'description' | translate}}</th>
|
||||
<th>{{:: 'type' | translate}}</th>
|
||||
<th>{{:: 'authz-associated-policies' | translate}}</th>
|
||||
<th>{{:: 'actions' | translate}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot data-ng-show="policies && (policies.length >= query.max || query.first > 0)">
|
||||
@@ -52,22 +58,48 @@
|
||||
<button data-ng-click="firstPage()" class="first" ng-disabled="query.first == 0">{{:: 'first-page' | translate}}</button>
|
||||
<button data-ng-click="previousPage()" class="prev" ng-disabled="query.first == 0">{{:: 'previous-page' | translate}}</button>
|
||||
<button data-ng-click="nextPage()" class="next" ng-disabled="policies.length < query.max">{{:: 'next-page' | translate}}</button>
|
||||
<select class="first" data-ng-model="query.max"
|
||||
ng-options="size for size in listSizes" data-ng-change="firstPage()">
|
||||
</select>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody>
|
||||
<tr ng-repeat="policy in policies | filter: {name: search.name, type: search.type} | orderBy:'name'">
|
||||
<tr ng-repeat-start="policy in policies | filter: {name: search.name, type: search.type} | orderBy:'name'">
|
||||
<td><a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/permission/{{policy.type}}/{{policy.id}}">{{policy.name}}</a></td>
|
||||
<td>{{policy.description}}</td>
|
||||
<td>{{policy.type}}</td>
|
||||
<td>
|
||||
<span data-ng-show="!policy.associatedPolicies.length">{{:: 'authz-no-policy-assigned' | translate}}</span>
|
||||
<span data-ng-show="policy.associatedPolicies.length > 0">
|
||||
<span ng-repeat="policy in policy.associatedPolicies">
|
||||
<a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/policy/{{policy.type}}/{{policy.id}}">{{policy.name}}</a>{{$last ? '' : ', '}}
|
||||
</span>
|
||||
</span>
|
||||
<td ng-if="!policy.details.loaded" class="kc-action-cell" data-ng-click="showDetails(policy);">
|
||||
{{:: 'authz-show-details' | translate}}
|
||||
</td>
|
||||
<td ng-if="policy.details.loaded" class="kc-action-cell" data-ng-click="showDetails(policy);">
|
||||
{{:: 'authz-hide-details' | translate}}
|
||||
</td>
|
||||
</tr>
|
||||
<tr ng-if="policy.details && policy.details.loaded" ng-repeat-end="">
|
||||
<td colspan="4">
|
||||
<div id="details">
|
||||
<table class="table kc-authz-table-expanded table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Associated Permissions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<span data-ng-show="policy.associatedPolicies && !policy.associatedPolicies.length">{{:: 'authz-no-permission-assigned' | translate}}</span>
|
||||
<ul ng-repeat="dep in policy.associatedPolicies" data-ng-show="policy.associatedPolicies.length > 0">
|
||||
<li>
|
||||
<a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/policy/{{dep.type}}/{{dep.id}}">{{dep.name}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr data-ng-show="(policies | filter:search).length == 0">
|
||||
|
||||
+1
-4
@@ -34,11 +34,8 @@
|
||||
<label class="col-md-2 control-label" for="reqActions">{{:: 'authz-policy-apply-policy' | translate}} <span class="required">*</span></label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<select ui-select2 id="reqActions" data-ng-model="policy.config.applyPolicies" data-placeholder="{{:: 'authz-select-a-policy' | translate}}..." multiple required>
|
||||
<option ng-repeat="policy in policies" value="{{policy.id}}" ng-selected="true">{{policy.name}}</option>
|
||||
</select>
|
||||
<input type="hidden" ui-select2="policiesUiSelect" id="reqActions" data-ng-model="policy.config.applyPolicies" data-placeholder="{{:: 'authz-select-a-policy' | translate}}..." multiple required />
|
||||
</div>
|
||||
|
||||
<kc-tooltip>{{:: 'authz-policy-apply-policy.tooltip' | translate}}</kc-tooltip>
|
||||
</div>
|
||||
<div class="form-group clearfix">
|
||||
|
||||
+7
-19
@@ -172,14 +172,7 @@
|
||||
<label class="col-md-2 control-label" for="reqActions">{{:: 'authz-resources' | translate}} <span class="required">*</span></label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<select ui-select2="{ minimumInputLength: 1, allowClear:true }"
|
||||
ng-model="newResource._id"
|
||||
data-placeholder="Select a resource..."
|
||||
data-ng-required="!applyResourceType && authzRequest.resources.length == 0 && !authzRequest.entitlements"
|
||||
data-ng-click="resolveScopes()"
|
||||
ng-options="resource._id as resource.name for resource in resources track by resource._id">
|
||||
<option value=""></option>
|
||||
</select>
|
||||
<input type="hidden" ui-select2="resourcesUiSelect" id="reqActions3" data-ng-change="resolveScopes()" data-ng-model="newResource" data-placeholder="{{:: 'authz-select-resource' | translate}}..." data-ng-required="!applyResourceType && authzRequest.resources.length == 0 && !authzRequest.entitlements" />
|
||||
</div>
|
||||
<kc-tooltip>{{:: 'authz-permission-resource-resource.tooltip' | translate}}</kc-tooltip>
|
||||
</div>
|
||||
@@ -199,12 +192,7 @@
|
||||
<label class="col-md-2 control-label" for="newResource.scopes">{{:: 'authz-scopes' | translate}}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<select ui-select2="{ minimumInputLength: 1}"
|
||||
id="newResource.scopes"
|
||||
multiple
|
||||
data-ng-model="newResource.scopes"
|
||||
data-placeholder="{{:: 'authz-select-scope' | translate}}..."
|
||||
data-ng-options="scope.name as scope.name for scope in scopes track by scope.name"/>
|
||||
<input type="hidden" ui-select2="scopesUiSelect" id="reqActions" data-ng-model="newScopes" data-placeholder="{{:: 'authz-any-scope' | translate}}..." multiple />
|
||||
</div>
|
||||
|
||||
<kc-tooltip>{{:: 'authz-permission-scope-scope.tooltip' | translate}}</kc-tooltip>
|
||||
@@ -215,7 +203,7 @@
|
||||
<div class="col-md-6">
|
||||
<select ui-select2
|
||||
id="newResource.scopes"
|
||||
data-ng-model="newResource.scopes"
|
||||
data-ng-model="newScopes"
|
||||
data-placeholder="{{:: 'authz-any-scope' | translate}}..." multiple>
|
||||
<option ng-repeat="scope in scopes" value="{{scope.name}}">{{scope.name}}</option>
|
||||
</select>
|
||||
@@ -246,11 +234,11 @@
|
||||
<td>{{resource.name ? resource.name : 'authz-evaluation-any-resource-with-scopes' | translate}}</td>
|
||||
<td>
|
||||
<span data-ng-show="!resource.scopes.length">{{:: 'authz-any-scope' | translate}}.</span>
|
||||
<span data-ng-show="resource.scopes.length > 0">
|
||||
<span ng-repeat="scope in resource.scopes">
|
||||
{{scope}} {{$last ? '' : ', '}}
|
||||
<span data-ng-show="resource.scopes.length > 0">
|
||||
<span ng-repeat="scope in resource.scopes">
|
||||
{{scope.name ? scope.name : scope}} {{$last ? '' : ', '}}
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
</td>
|
||||
<td class="kc-action-cell">
|
||||
<button class="btn btn-default btn-block btn-sm"
|
||||
|
||||
+44
-1
@@ -27,8 +27,16 @@
|
||||
<option value="" selected ng-click="query.type = ''">{{:: 'authz-all-types' | translate}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<select class="form-control search" data-ng-model="detailsFilter" data-ng-change="searchQuery();">
|
||||
<option value="" selected>Hide Details</option>
|
||||
<option value="true">Show Details</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pull-right">
|
||||
<a id="hideDetails" data-ng-show="showDetailsFlag" class="btn btn-default" data-ng-click="showDetailsFlag = !showDetailsFlag;showDetails();" href="">{{:: 'authz-hide-details' | translate}}</a>
|
||||
<a id="showDetails" data-ng-hide="showDetailsFlag" class="btn btn-default" data-ng-click="showDetailsFlag = !showDetailsFlag;showDetails();" href="">{{:: 'authz-show-details' | translate}}</a>
|
||||
<select class="form-control" ng-model="policyType"
|
||||
ng-options="p.name for p in policyProviders track by p.type"
|
||||
data-ng-change="addPolicy(policyType);">
|
||||
@@ -42,6 +50,7 @@
|
||||
<th>{{:: 'name' | translate}}</th>
|
||||
<th>{{:: 'description' | translate}}</th>
|
||||
<th>{{:: 'type' | translate}}</th>
|
||||
<th>{{:: 'actions' | translate}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot data-ng-show="policies && (policies.length >= query.max || query.first > 0)">
|
||||
@@ -51,15 +60,49 @@
|
||||
<button data-ng-click="firstPage()" class="first" ng-disabled="query.first == 0">{{:: 'first-page' | translate}}</button>
|
||||
<button data-ng-click="previousPage()" class="prev" ng-disabled="query.first == 0">{{:: 'previous-page' | translate}}</button>
|
||||
<button data-ng-click="nextPage()" class="next" ng-disabled="policies.length < query.max">{{:: 'next-page' | translate}}</button>
|
||||
<select class="first" data-ng-model="query.max"
|
||||
ng-options="size for size in listSizes" data-ng-change="firstPage()">
|
||||
</select>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody>
|
||||
<tr ng-repeat="policy in policies | filter: {name: search.name, type: search.type} | orderBy:'name'">
|
||||
<tr ng-repeat-start="policy in policies | filter: {name: search.name, type: search.type} | orderBy:'name'">
|
||||
<td><a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/policy/{{policy.type}}/{{policy.id}}">{{policy.name}}</a></td>
|
||||
<td>{{policy.description}}</td>
|
||||
<td>{{policy.type}}</td>
|
||||
<td ng-if="!policy.details.loaded" class="kc-action-cell" data-ng-click="showDetails(policy);">
|
||||
{{:: 'authz-show-details' | translate}}
|
||||
</td>
|
||||
<td ng-if="policy.details.loaded" class="kc-action-cell" data-ng-click="showDetails(policy);">
|
||||
{{:: 'authz-hide-details' | translate}}
|
||||
</td>
|
||||
</tr>
|
||||
<tr ng-if="policy.details && policy.details.loaded" ng-repeat-end="">
|
||||
<td colspan="4">
|
||||
<div id="details">
|
||||
<table class="table kc-authz-table-expanded table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Dependent Permissions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<span data-ng-show="policy.dependentPolicies && !policy.dependentPolicies.length">{{:: 'authz-no-permission-assigned' | translate}}</span>
|
||||
<ul ng-repeat="dep in policy.dependentPolicies" data-ng-show="policy.dependentPolicies.length > 0">
|
||||
<li>
|
||||
<a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/permission/{{dep.type}}/{{dep.id}}">{{dep.name}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr data-ng-show="(policies | filter:search).length == 0">
|
||||
<td class="text-muted" colspan="3" data-ng-show="search.name">{{:: 'no-results' | translate}}</td>
|
||||
|
||||
+1
-3
@@ -47,9 +47,7 @@
|
||||
<label class="col-md-2 control-label" for="reqActions">{{:: 'authz-scopes' | translate}}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<select ui-select2 id="reqActions" ng-model="resource.scopes" data-placeholder="{{:: 'authz-select-scope' | translate}}..." multiple>
|
||||
<option ng-repeat="scope in scopes" value="{{scope.name}}" ng-selected="true">{{scope.name}}</option>
|
||||
</select>
|
||||
<input type="hidden" ui-select2="scopesUiSelect" id="reqActions" data-ng-model="resource.scopes" data-placeholder="{{:: 'authz-select-scope' | translate}}..." multiple/>
|
||||
</div>
|
||||
|
||||
<kc-tooltip>{{:: 'authz-resource-scopes.tooltip' | translate}}</kc-tooltip>
|
||||
|
||||
+55
-22
@@ -39,8 +39,13 @@
|
||||
<i class="fa fa-search" type="submit" data-ng-click="firstPage()"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<select class="form-control search" data-ng-model="detailsFilter" data-ng-change="searchQuery();">
|
||||
<option value="" selected>Hide Details</option>
|
||||
<option value="true">Show Details</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pull-right">
|
||||
<a id="createResource" class="btn btn-default" href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/resource/create">{{:: 'create' | translate}}</a>
|
||||
</div>
|
||||
@@ -52,9 +57,7 @@
|
||||
<th>{{:: 'type' | translate}}</th>
|
||||
<th>{{:: 'authz-uri' | translate}}</th>
|
||||
<th>{{:: 'authz-owner' | translate}}</th>
|
||||
<th>{{:: 'authz-scopes' | translate}}</th>
|
||||
<th>{{:: 'authz-permissions' | translate}}</th>
|
||||
<th>{{:: 'actions' | translate}}</th>
|
||||
<th colspan="2">{{:: 'actions' | translate}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot data-ng-show="resources && (resources.length >= query.max || query.first > 0)">
|
||||
@@ -64,37 +67,67 @@
|
||||
<button data-ng-click="firstPage()" class="first" ng-disabled="query.first == 0">{{:: 'first-page' | translate}}</button>
|
||||
<button data-ng-click="previousPage()" class="prev" ng-disabled="query.first == 0">{{:: 'previous-page' | translate}}</button>
|
||||
<button data-ng-click="nextPage()" class="next" ng-disabled="resources.length < query.max">{{:: 'next-page' | translate}}</button>
|
||||
<select class="first" data-ng-model="query.max"
|
||||
ng-options="size for size in listSizes" data-ng-change="firstPage()">
|
||||
</select>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody>
|
||||
<tr ng-repeat="resource in resources | filter:search | orderBy:'name'">
|
||||
<tr ng-repeat-start="resource in resources | filter:search | orderBy:'name'">
|
||||
<td><a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/resource/{{resource._id}}">{{resource.name}}</a></td>
|
||||
<td>
|
||||
<span data-ng-show="resource.type">{{resource.type}}</span>
|
||||
<span data-ng-show="!resource.type">{{:: 'authz-no-type-defined' | translate}}</span>
|
||||
</td>
|
||||
<td>{{resource.uri}}</td>
|
||||
<td>
|
||||
<span data-ng-show="resource.uri">{{resource.uri}}</span>
|
||||
<span data-ng-show="!resource.uri">{{:: 'authz-no-uri-defined' | translate}}</span>
|
||||
</td>
|
||||
<td>{{resource.owner.name}}</td>
|
||||
<td>
|
||||
<span data-ng-show="!resource.scopes.length">{{:: 'authz-no-scopes-assigned' | translate}}</span>
|
||||
<span data-ng-show="resource.scopes.length > 0">
|
||||
<span ng-repeat="scope in resource.scopes">
|
||||
<a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/scope/{{scope.id}}">{{scope.name}}</a>{{$last ? '' : ', '}}
|
||||
</span>
|
||||
</span>
|
||||
<td ng-if="!resource.details.loaded" class="kc-action-cell" data-ng-click="showDetails(resource);">
|
||||
{{:: 'authz-show-details' | translate}}
|
||||
</td>
|
||||
<td>
|
||||
<span data-ng-show="!resource.policies.length">{{:: 'authz-no-permission-assigned' | translate}}</span>
|
||||
<span data-ng-show="resource.policies.length > 0">
|
||||
<span ng-repeat="policy in resource.policies">
|
||||
<a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/permission/{{policy.type}}/{{policy.id}}">{{policy.name}}</a>{{$last ? '' : ', '}}
|
||||
</span>
|
||||
</span>
|
||||
<td ng-if="resource.details.loaded" class="kc-action-cell" data-ng-click="showDetails(resource);">
|
||||
{{:: 'authz-hide-details' | translate}}
|
||||
</td>
|
||||
<td class="kc-action-cell" style="vertical-align: middle">
|
||||
<button class="btn btn-default btn-block btn-sm" ng-click="createPolicy(resource);">{{:: 'authz-create-permission' | translate}}</button>
|
||||
<td class="kc-action-cell" ng-click="createPolicy(resource);">
|
||||
{{:: 'authz-create-permission' | translate}}
|
||||
</td>
|
||||
</tr>
|
||||
<tr ng-if="resource.details && resource.details.loaded" ng-repeat-end="">
|
||||
<td colspan="6">
|
||||
<div id="details">
|
||||
<table class="table kc-authz-table-expanded table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Scopes</th>
|
||||
<th>Associated Permissions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<span data-ng-show="resource.scopes && !resource.scopes.length">{{:: 'authz-no-scopes-assigned' | translate}}</span>
|
||||
<ul ng-repeat="scope in resource.scopes" data-ng-show="resource.scopes.length > 0">
|
||||
<li>
|
||||
<a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/scope/{{scope.id}}">{{scope.name}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<span data-ng-show="resource.policies && !resource.policies.length">{{:: 'authz-no-permission-assigned' | translate}}</span>
|
||||
<ul ng-repeat="policy in resource.policies" data-ng-show="resource.policies.length > 0">
|
||||
<li>
|
||||
<a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/permission/{{policy.type}}/{{policy.id}}">{{policy.name}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr data-ng-show="(resources | filter:search).length == 0">
|
||||
|
||||
+52
-21
@@ -14,6 +14,12 @@
|
||||
<i class="fa fa-search" id="scopeSearch" type="submit" data-ng-click="firstPage()"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<select class="form-control search" data-ng-model="detailsFilter" data-ng-change="showDetails();">
|
||||
<option value="" selected>Hide Details</option>
|
||||
<option value="true">Show Details</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pull-right">
|
||||
<a id="createScope" class="btn btn-default" href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/scope/create">{{:: 'create' | translate}}</a>
|
||||
@@ -23,43 +29,68 @@
|
||||
</tr>
|
||||
<tr data-ng-hide="scopes.length == 0">
|
||||
<th>{{:: 'name' | translate}}</th>
|
||||
<th>{{:: 'authz-resources' | translate}}</th>
|
||||
<th>{{:: 'authz-permissions' | translate}}</th>
|
||||
<th>{{:: 'actions' | translate}}</th>
|
||||
<th colspan="2">{{:: 'actions' | translate}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot data-ng-show="scopes && (scopes.length >= query.max || query.first > 0)">
|
||||
<tr>
|
||||
<td colspan="7">
|
||||
<td colspan="8">
|
||||
<div class="table-nav">
|
||||
<button data-ng-click="firstPage()" class="first" ng-disabled="query.first == 0">{{:: 'first-page' | translate}}</button>
|
||||
<button data-ng-click="previousPage()" class="prev" ng-disabled="query.first == 0">{{:: 'previous-page' | translate}}</button>
|
||||
<button data-ng-click="nextPage()" class="next" ng-disabled="scopes.length < query.max">{{:: 'next-page' | translate}}</button>
|
||||
<select class="first" data-ng-model="query.max"
|
||||
ng-options="size for size in listSizes" data-ng-change="firstPage()">
|
||||
</select>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody>
|
||||
<tr ng-repeat="scope in scopes | filter:search | orderBy:'name'">
|
||||
<tr ng-repeat-start="scope in scopes | filter:search | orderBy:'name'">
|
||||
<td><a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/scope/{{scope.id}}">{{scope.name}}</a></td>
|
||||
<td>
|
||||
<span data-ng-show="!scope.resources.length">{{:: 'authz-no-resources-assigned' | translate}}</span>
|
||||
<span data-ng-show="scope.resources.length > 0">
|
||||
<span ng-repeat="resource in scope.resources">
|
||||
<a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/resource/{{resource._id}}">{{resource.name}}</a>{{$last ? '' : ', '}}
|
||||
</span>
|
||||
</span>
|
||||
<td ng-if="!scope.details.loaded" class="kc-action-cell" data-ng-click="showDetails(scope);">
|
||||
{{:: 'authz-show-details' | translate}}
|
||||
</td>
|
||||
<td>
|
||||
<span data-ng-show="!scope.policies.length">{{:: 'authz-no-permission-assigned' | translate}}</span>
|
||||
<span data-ng-show="scope.policies.length > 0">
|
||||
<span ng-repeat="policy in scope.policies">
|
||||
<a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/permission/{{policy.type}}/{{policy.id}}">{{policy.name}}</a>{{$last ? '' : ', '}}
|
||||
</span>
|
||||
</span>
|
||||
<td ng-if="scope.details.loaded" class="kc-action-cell" data-ng-click="showDetails(scope);">
|
||||
{{:: 'authz-hide-details' | translate}}
|
||||
</td>
|
||||
<td class="kc-action-cell" style="vertical-align: middle">
|
||||
<button class="btn btn-default btn-block btn-sm" ng-click="createPolicy(scope);">{{:: 'authz-create-permission' | translate}}</button>
|
||||
<td class="kc-action-cell" ng-click="createPolicy(scope);">
|
||||
{{:: 'authz-create-permission' | translate}}
|
||||
</td>
|
||||
</tr>
|
||||
<tr ng-if="scope.details && scope.details.loaded" ng-repeat-end="">
|
||||
<td colspan="3">
|
||||
<div id="details">
|
||||
<table class="table kc-authz-table-expanded table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Resources</th>
|
||||
<th>Associated Permissions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<span data-ng-show="scope.resources && !scope.resources.length">{{:: 'authz-no-resources-assigned' | translate}}</span>
|
||||
<ul ng-repeat="resource in scope.resources" data-ng-show="scope.resources.length > 0">
|
||||
<li>
|
||||
<a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/resource/{{resource._id}}">{{resource.name}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<span data-ng-show="scope.policies && !scope.policies.length">{{:: 'authz-no-permission-assigned' | translate}}</span>
|
||||
<ul ng-repeat="policy in scope.policies" data-ng-show="scope.policies.length > 0">
|
||||
<li>
|
||||
<a href="#/realms/{{realm.realm}}/clients/{{client.id}}/authz/resource-server/permission/{{policy.type}}/{{policy.id}}">{{policy.name}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr data-ng-show="(scopes | filter:search).length == 0">
|
||||
|
||||
@@ -390,4 +390,13 @@ h1 i {
|
||||
float: left;
|
||||
margin-left: 2%;
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
table.kc-authz-table-expanded {
|
||||
margin-top: 0px !important;
|
||||
}
|
||||
|
||||
.no-gutter > [class*='col-'] {
|
||||
padding-right:0!important;
|
||||
padding-left:0!important;
|
||||
}
|
||||
Reference in new issue
Block a user