123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- <div class="col-sm-9 col-md-10 col-sm-push-3 col-md-push-2">
- <kc-tabs-realm></kc-tabs-realm>
- <ul class="nav nav-tabs nav-tabs-pf">
- <li ng-class="{active: isShowAttributes}"><a href="" data-ng-click="showAttributes()">{{:: 'attributes' | translate}}</a></li>
- <li ng-class="{active: isShowAttributeGroups}"><a href=""
- data-ng-click="showAttributeGroups()">{{:: 'attribute-groups' | translate}}</a>
- <li ng-class="{active: isShowJsonEditor}"><a href=""
- data-ng-click="showJsonEditor()">{{:: 'client-profiles-json-editor' | translate}}</a>
- </li>
- </ul>
- <div data-ng-show="showAttributeListing()">
- <table class="datatable table table-striped table-bordered dataTable no-footer">
- <thead>
- <tr>
- <th class="kc-table-actions" colspan="5">
- <div class="form-inline">
- <div class="pull-right" data-ng-show="access.manageClients">
- <button class="btn btn-default" data-ng-click="createAttribute()">
- {{:: 'create' | translate}}
- </button>
- </div>
- </div>
- </th>
- </tr>
- <tr>
- <th width="25%">{{:: 'name' | translate}}</th>
- <th width="40%">{{:: 'user.profile.attribute.displayName' | translate}}</th>
- <th width="25%">{{:: 'user.profile.attribute.group' | translate}}</th>
- <th colspan="2">{{:: 'actions' | translate}}</th>
- </tr>
- </thead>
- <tbody>
- <tr ng-repeat="attribute in config.attributes">
- <td class="kc-sorter">
- <button data-ng-hide="flow.builtIn" data-ng-disabled="$first" class="btn btn-default btn-sm" data-ng-click="guiOrderUp($index)"><i class="fa fa-angle-up"></i></button>
- <button data-ng-hide="flow.builtIn" data-ng-disabled="$last" class="btn btn-default btn-sm" data-ng-click="guiOrderDown($index)"><i class="fa fa-angle-down"></i></button>
- <span><a href="" data-ng-click="editAttribute(attribute)">{{attribute.name}}</a></span>
- </td>
- <td>{{attribute.displayName}}</td>
- <td>{{attribute.group}}</td>
- <td class="kc-action-cell" data-ng-click="editAttribute(attribute)">{{:: 'edit' | translate}}</td>
- <td class="kc-action-cell" data-ng-click="removeAttribute(attribute)">{{:: 'delete' | translate}}</td>
- </tr>
- </tbody>
- </table>
- </div>
-
- <div data-ng-show="showAttributeGroupListing()">
- <table class="datatable table table-striped table-bordered dataTable no-footer">
- <thead>
- <tr>
- <th class="kc-table-actions" colspan="5">
- <div class="form-inline">
- <div class="pull-right" data-ng-show="access.manageClients">
- <button class="btn btn-default" data-ng-click="createAttributeGroup()">
- {{:: 'create' | translate}}
- </button>
- </div>
- </div>
- </th>
- </tr>
- <tr>
- <th width="25%">{{:: 'name' | translate}}</th>
- <th width="25%">{{:: 'user.profile.attributegroup.displayHeader' | translate}}</th>
- <th width="40%">{{:: 'user.profile.attributegroup.displayDescription' | translate}}</th>
- <th colspan="2">{{:: 'actions' | translate}}</th>
- </tr>
- </thead>
- <tbody>
- <tr ng-repeat="group in config.groups">
- <td class="kc-sorter">
- <span><a href="" data-ng-click="editAttributeGroup(group)">{{group.name}}</a></span>
- </td>
- <td>{{group.displayHeader}}</td>
- <td>{{group.displayDescription}}</td>
- <td class="kc-action-cell" data-ng-click="editAttributeGroup(group)">{{:: 'edit' | translate}}</td>
- <!-- show delete button enabled/disabled depending whether it is referenced in any attribute -->
- <td class="kc-action-cell" ng-if="!(groupIsReferencedInAnyAttribute(group))" data-ng-click="removeAttributeGroup(group)">{{:: 'delete' | translate}}</td>
- <td class="kc-action-cell-disabled" ng-if="(groupIsReferencedInAnyAttribute(group))" align="center" >{{:: 'delete' | translate}}</td>
- </tr>
- </tbody>
- </table>
- </div>
- <form class="form-horizontal" name="realmForm" novalidate kc-read-only="!access.manageRealm"
- data-ng-show="isShowJsonEditor">
- <filedset>
- <div class="form-group">
- <div class="col-md-10">
- <div>
- <textarea id="userProfileConfig" name="userProfileConfig" data-ng-model="rawConfig"
- class="form-control ng-binding" rows="20"></textarea>
- </div>
- </div>
- </div>
- <div class="form-group">
- <div class="col-md-10">
- <button class="btn btn-primary" data-ng-click="save()">{{:: 'save' | translate}}</button>
- <button class="btn btn-default" data-ng-click="reset()">{{:: 'cancel' | translate}}</button>
- </div>
- </div>
- </filedset>
- </form>
- <form class="form-horizontal" name="realmForm" novalidate kc-read-only="!access.manageRealm"
- data-ng-show="currentAttribute != null">
- <p/>
- <legend expanded><span class="text">{{:: 'user.profile.attribute' | translate}} <b
- data-ng-show="!isCreateAttribute">{{currentAttribute.name}}</b> {{:: 'configuration' | translate}}</span>
- </legend>
- <div class="form-group">
- <label class="col-md-2 control-label" for="currentAttribute.name">{{:: 'user.profile.attribute.name' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attribute.name.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-4">
- <input name="currentAttribute.name" data-ng-model="currentAttribute.name" id="currentAttribute.name"
- type="text" class="form-control"
- data-ng-readonly="!isCreateAttribute"
- data-ng-required="currentAttribute != null"/>
- </div>
- </div>
- <div class="form-group">
- <label class="col-md-2 control-label" for="currentAttribute.displayName">{{:: 'user.profile.attribute.displayName' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attribute.displayName.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-4">
- <input name="currentAttribute.displayName" data-ng-model="currentAttribute.displayName" id="currentAttribute.displayName"
- type="text" class="form-control"/>
- </div>
- </div>
- <div class="form-group">
- <label class="col-md-2 control-label" for="currentAttribute.group">{{:: 'user.profile.attribute.group' | translate}}</label>
- <div class="col-md-2">
- <div>
- <select id="select-attributeGroup" data-ng-model="currentAttribute.group" class="form-control"
- data-ng-options="group.name as group.name for group in config.groups" >
- <option value="" /> <!-- add the "no group" option -->
- </select>
- </div>
- </div>
- <kc-tooltip>{{:: 'user.profile.attribute.group.tooltip' | translate}}</kc-tooltip>
- </div>
- <div class="form-group" data-ng-show="isNotUsernameOrEmail(currentAttribute.name)">
- <label class="col-md-2 control-label" for="selectorByScopeSelect">{{:: 'user.profile.attribute.selector.scopes' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attribute.selector.scopes.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-6">
- <input type="hidden" ui-select2="selectorByScopeSelect" id="selectorByScopeSelect" data-ng-model="selectorByScope" data-placeholder="Select a scope..." multiple/>
- </div>
- </div>
- <div class="form-group" data-ng-show="isNotUsernameOrEmail(currentAttribute.name)">
- <label class="col-md-2 control-label" for="isRequired">{{:: 'user.profile.attribute.required' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attribute.required.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-6">
- <input name="isRequired" data-ng-model="isRequired" id="isRequired" onoffswitch
- on-text="{{:: 'onText' | translate}}" off-text="{{:: 'offText' | translate}}"/>
- </div>
- </div>
- <div class="form-group" data-ng-show="isRequired">
- <label class="col-md-2 control-label" for="isRequiredRoles">{{:: 'user.profile.attribute.required.roles' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attribute.required.roles.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-6">
- <input type="hidden" ui-select2="isRequiredRoles" id="isRequiredRoles" data-ng-model="requiredRoles" data-placeholder="Select a role..." multiple/>
- </div>
- </div>
- <div class="form-group" data-ng-show="isRequired">
- <label class="col-md-2 control-label" for="isRequiredScopes">{{:: 'user.profile.attribute.required.scopes' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attribute.required.scopes.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-6">
- <input type="hidden" ui-select2="isRequiredScopes" id="isRequiredScopes" data-ng-model="requiredScopes" data-placeholder="Select a scope..." multiple/>
- </div>
- </div>
- <fieldset class="border-top" data-ng-show="isNotUsernameOrEmail(currentAttribute.name)">
- <legend collapsed><span class="text">{{:: 'user.profile.attribute.permission' | translate}}</span></legend>
- <div class="form-group">
- <label class="col-md-2 control-label" for="canUserView">{{:: 'user.profile.attribute.canUserView' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attribute.canUserView.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-2">
- <input name="canUserView" data-ng-model="canUserView" id="canUserView" onoffswitch
- on-text="{{:: 'onText' | translate}}"
- off-text="{{:: 'offText' | translate}}"/>
- </div>
- </div>
- <div class="form-group">
- <label class="col-md-2 control-label" for="canAdminView">{{:: 'user.profile.attribute.canAdminView' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attribute.canAdminView.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-6">
- <input name="canAdminView" data-ng-model="canAdminView" id="canAdminView" onoffswitch
- on-text="{{:: 'onText' | translate}}"
- off-text="{{:: 'offText' | translate}}"/>
- </div>
- </div>
- <div class="form-group">
- <label class="col-md-2 control-label" for="canUserEdit">{{:: 'user.profile.attribute.canUserEdit' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attribute.canUserEdit.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-6">
- <input name="canUserEdit" data-ng-model="canUserEdit" id="canUserEdit" onoffswitch
- on-text="{{:: 'onText' | translate}}"
- off-text="{{:: 'offText' | translate}}"/>
- </div>
- </div>
- <div class="form-group">
- <label class="col-md-2 control-label" for="canAdminEdit">{{:: 'user.profile.attribute.canAdminEdit' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attribute.canAdminEdit.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-6">
- <input name="canAdminEdit" data-ng-model="canAdminEdit" id="canAdminEdit" onoffswitch
- on-text="{{:: 'onText' | translate}}"
- off-text="{{:: 'offText' | translate}}"/>
- </div>
- </div>
- </fieldset>
- <fieldset>
- <legend collapsed><span class="text">{{:: 'user.profile.attribute.validation' | translate}}</span></legend>
- <div class="form-group">
- <label class="col-md-2 control-label" for="create-validator">{{:: 'user.profile.attribute.validation.add.validator' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attribute.validation.add.validator.tooltip' | translate}}</kc-tooltip>
- <div class="col-sm-4">
- <select id="create-validator" class="form-control" ng-model="newValidator"
- ng-options="p.id for p in validatorProviders"
- data-ng-change="selectValidator(newValidator)">
- <option value="" disabled selected>{{:: 'user.profile.attribute.validation.add.validator' | translate}}...</option>
- </select>
- </div>
- </div>
- <kc-component-config realm="realm" config="newValidator.config"
- properties="newValidator.properties"></kc-component-config>
- <p/>
- <div class="form-group" data-ng-show="newValidator != null">
- <div class="col-md-10 col-md-offset-2" data-ng-show="access.manageRealm">
- <button class="btn btn-primary" data-ng-click="addValidator(newValidator)">{{:: 'add' | translate}}</button>
- <button class="btn btn-primary" data-ng-click="cancelAddValidator()">{{:: 'cancel' | translate}}</button>
- </div>
- </div>
- <div class="form-group col-sm-10">
- <table class="datatable table table-striped table-bordered dataTable no-footer">
- <thead>
- <tr>
- <th width="20%">{{:: 'name' | translate}}</th>
- <th>{{:: 'config' | translate}}</th>
- <th colspan="2">{{:: 'actions' | translate}}</th>
- </tr>
- </thead>
- <tbody>
- <tr ng-repeat="(key, value) in currentAttribute.validations">
- <td>{{key}}</td>
- <td>{{value}}</td>
- <td class="kc-action-cell" data-ng-click="removeValidator(key)">{{:: 'delete' | translate}}</td>
- </tr>
- <tr data-ng-show="!currentAttribute.validations || currentAttribute.validations.length == 0">
- <td class="text-muted" colspan="3">{{:: 'user.profile.attribute.validation.no.validators' | translate}}</td>
- </tr>
- </tbody>
- </table>
- </div>
- </fieldset>
- <fieldset>
- <legend collapsed><span class="text">{{:: 'user.profile.attribute.annotation' | translate}}</span></legend>
- <div class="form-group col-sm-10">
- <table class="table table-striped table-bordered">
- <thead>
- <tr>
- <th>{{:: 'key' | translate}}</th>
- <th>{{:: 'value' | translate}}</th>
- <th>{{:: 'actions' | translate}}</th>
- </tr>
- </thead>
- <tbody>
- <tr ng-repeat="(key, value) in currentAttribute.annotations | toOrderedMapSortedByKey">
- <td>{{key}}</td>
- <td><input ng-model="currentAttribute.annotations[key]" class="form-control" type="text" name="{{key}}"
- id="attribute-{{key}}"/></td>
- <td class="kc-action-cell" data-ng-click="removeAttributeAnnotation(key)">{{:: 'delete' | translate}}</td>
- </tr>
- <tr>
- <td><input ng-model="newAnnotation.key" class="form-control" type="text" id="newAnnotationKey"/></td>
- <td><input ng-model="newAnnotation.value" class="form-control" type="text" id="newAnnotationValue"/></td>
- <td class="kc-action-cell" data-ng-click="addAttributeAnnotation()"
- data-ng-disabled="!newAnnotation.key.length || !newAnnotation.value.length">{{:: 'add' | translate}}
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- </fieldset>
- <div class="form-group">
- <p/>
- <div class="col-md-10 col-md-offset-2" data-ng-show="access.manageRealm">
- <button kc-save>{{:: 'save' | translate}}</button>
- <button kc-reset>{{:: 'cancel' | translate}}</button>
- </div>
- </div>
- </form>
-
- <form class="form-horizontal" name="realmForm" novalidate kc-read-only="!access.manageRealm"
- data-ng-show="currentAttributeGroup != null">
- <p/>
- <legend expanded><span class="text">{{:: 'user.profile.attributegroup' | translate}} <b
- data-ng-show="!isCreateAttributeGroup">{{currentAttributeGroup.name}}</b> {{:: 'configuration' | translate}}</span>
- </legend>
- <div class="form-group">
- <label class="col-md-2 control-label" for="currentAttributeGroup.name">{{:: 'user.profile.attributegroup.name' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attributegroup.name.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-4">
- <input name="currentAttributeGroup.name" data-ng-model="currentAttributeGroup.name" id="currentAttributeGroup.name"
- type="text" class="form-control"
- data-ng-readonly="!isCreateAttributeGroup"
- data-ng-required="currentAttributeGroup != null"/>
- </div>
- </div>
- <div class="form-group">
- <label class="col-md-2 control-label" for="currentAttributeGroup.displayHeader">{{:: 'user.profile.attributegroup.displayHeader' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attributegroup.displayHeader.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-4">
- <input name="currentAttributeGroup.displayHeader" data-ng-model="currentAttributeGroup.displayHeader" id="currentAttributeGroup.displayHeader"
- type="text" class="form-control"/>
- </div>
- </div>
- <div class="form-group">
- <label class="col-md-2 control-label" for="currentAttributeGroup.displayDescription">{{:: 'user.profile.attributegroup.displayDescription' | translate}}</label>
- <kc-tooltip>{{:: 'user.profile.attributegroup.displayDescription.tooltip' | translate}}</kc-tooltip>
- <div class="col-md-4">
- <input name="currentAttributeGroup.displayDescription" data-ng-model="currentAttributeGroup.displayDescription" id="currentAttributeGroup.displayDescription"
- type="text" class="form-control"/>
- </div>
- </div>
-
- <fieldset>
- <legend collapsed><span class="text">{{:: 'user.profile.attributegroup.annotation' | translate}}</span></legend>
- <div class="form-group col-sm-10">
- <table class="table table-striped table-bordered">
- <thead>
- <tr>
- <th>{{:: 'key' | translate}}</th>
- <th>{{:: 'value' | translate}}</th>
- <th>{{:: 'actions' | translate}}</th>
- </tr>
- </thead>
- <tbody>
- <tr ng-repeat="(key, value) in currentAttributeGroup.annotations | toOrderedMapSortedByKey">
- <td>{{key}}</td>
- <td><input ng-model="currentAttributeGroup.annotations[key]" class="form-control" type="text" name="{{key}}"
- id="attributegroup-{{key}}"/></td>
- <td class="kc-action-cell" data-ng-click="removeAttributeGroupAnnotation(key)">{{:: 'delete' | translate}}</td>
- </tr>
- <tr>
- <td><input ng-model="newAttributeGroupAnnotation.key" class="form-control" type="text" id="newAttributeGroupAnnotationKey"/></td>
- <td><input ng-model="newAttributeGroupAnnotation.value" class="form-control" type="text" id="newAttributeGroupAnnotationValue"/></td>
- <td class="kc-action-cell" data-ng-click="addAttributeGroupAnnotation()"
- data-ng-disabled="!newAttributeGroupAnnotation.key.length || !newAttributeGroupAnnotation.value.length">{{:: 'add' | translate}}
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- </fieldset>
- <div class="form-group">
- <p/>
- <div class="col-md-10 col-md-offset-2" data-ng-show="access.manageRealm">
- <button kc-save>{{:: 'save' | translate}}</button>
- <button class="btn btn-default" data-ng-click="cancelEditAttributeGroup()">{{:: 'cancel' | translate}}</button>
- </div>
- </div>
- </form>
- </div>
- <kc-menu></kc-menu>
|