]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-form/rgw-user-form.component.html
import 15.2.0 Octopus source
[ceph.git] / ceph / src / pybind / mgr / dashboard / frontend / src / app / ceph / rgw / rgw-user-form / rgw-user-form.component.html
index 8feb271497d367bdce39d3b302500247b33cbb08..ce638cceb962424905383bc3f1bb680a1874cacd 100644 (file)
 <cd-loading-panel *ngIf="editing && loading && !error"
                   i18n>Loading user data...</cd-loading-panel>
-<cd-error-panel *ngIf="editing && error"
+<cd-alert-panel type="error"
+                *ngIf="editing && error"
                 (backAction)="goToListView()"
-                i18n>The user data could not be loaded.</cd-error-panel>
+                i18n>The user data could not be loaded.</cd-alert-panel>
 
-<div class="col-sm-12 col-lg-6"
+<div class="cd-col-form"
      *ngIf="!loading && !error">
-  <form class="form-horizontal"
-        #frm="ngForm"
+  <form #frm="ngForm"
         [formGroup]="userForm"
         novalidate>
-    <div class="panel panel-default">
-      <div class="panel-heading">
-        <h3 i18n="form title|Example: Create Pool@@formTitle"
-            class="panel-title">{{ action | titlecase }} {{ resource | upperFirst }}</h3>
-      </div>
-      <div class="panel-body">
+    <div class="card">
+      <div i18n="form title|Example: Create Pool@@formTitle"
+           class="card-header">{{ action | titlecase }} {{ resource | upperFirst }}</div>
 
+      <div class="card-body">
         <!-- Username -->
-        <div class="form-group"
-             [ngClass]="{'has-error': userForm.showError('uid', frm)}">
-          <label class="control-label col-sm-3"
-                 for="uid">
-            <ng-container i18n>Username</ng-container>
-            <span class="required"
-                  *ngIf="!editing">
-            </span>
-          </label>
-          <div class="col-sm-9">
+        <div class="form-group row">
+          <label class="cd-col-form-label"
+                 [ngClass]="{'required': !editing}"
+                 for="uid"
+                 i18n>Username</label>
+          <div class="cd-col-form-input">
             <input id="uid"
                    class="form-control"
                    type="text"
                    formControlName="uid"
                    [readonly]="editing"
                    autofocus>
-            <span class="help-block"
+            <span class="invalid-feedback"
                   *ngIf="userForm.showError('uid', frm, 'required')"
                   i18n>This field is required.</span>
-            <span class="help-block"
+            <span class="invalid-feedback"
                   *ngIf="userForm.showError('uid', frm, 'notUnique')"
                   i18n>The chosen user ID is already in use.</span>
           </div>
         </div>
 
         <!-- Full name -->
-        <div class="form-group"
-             [ngClass]="{'has-error': userForm.showError('display_name', frm)}">
-          <label class="control-label col-sm-3"
-                 for="display_name">
-            <ng-container i18n>Full name</ng-container>
-            <span class="required"
-                  *ngIf="!editing">
-            </span>
-          </label>
-          <div class="col-sm-9">
+        <div class="form-group row">
+          <label class="cd-col-form-label"
+                 [ngClass]="{'required': !editing}"
+                 for="display_name"
+                 i18n>Full name</label>
+          <div class="cd-col-form-input">
             <input id="display_name"
                    class="form-control"
                    type="text"
                    formControlName="display_name">
-            <span class="help-block"
+            <span class="invalid-feedback"
                   *ngIf="userForm.showError('display_name', frm, 'required')"
                   i18n>This field is required.</span>
           </div>
         </div>
 
         <!-- Email address -->
-        <div class="form-group"
-             [ngClass]="{'has-error': userForm.showError('email', frm)}">
-          <label class="control-label col-sm-3"
+        <div class="form-group row">
+          <label class="cd-col-form-label"
                  for="email"
                  i18n>Email address</label>
-          <div class="col-sm-9">
+          <div class="cd-col-form-input">
             <input id="email"
                    class="form-control"
                    type="text"
                    formControlName="email">
-            <span class="help-block"
+            <span class="invalid-feedback"
                   *ngIf="userForm.showError('email', frm, 'email')"
                   i18n>This is not a valid email address.</span>
-            <span class="help-block"
+            <span class="invalid-feedback"
                   *ngIf="userForm.showError('email', frm, 'notUnique')"
                   i18n>The chosen email address is already in use.</span>
           </div>
         </div>
 
         <!-- Max. buckets -->
-        <div class="form-group"
-             [ngClass]="{'has-error': userForm.showError('max_buckets', frm)}">
-          <label class="control-label col-sm-3"
-                 for="max_buckets">
-            <ng-container i18n>Max. buckets</ng-container>
-            <span class="required"></span>
-          </label>
-          <div class="col-sm-9">
+        <div class="form-group row">
+          <label class="cd-col-form-label"
+                 for="max_buckets_mode"
+                 i18n>Max. buckets</label>
+          <div class="cd-col-form-input">
+            <select class="form-control custom-select"
+                    formControlName="max_buckets_mode"
+                    name="max_buckets_mode"
+                    id="max_buckets_mode">
+              <option i18n
+                      value="-1">Disabled</option>
+              <option i18n
+                      value="0">Unlimited</option>
+              <option i18n
+                      value="1">Custom</option>
+            </select>
+          </div>
+        </div>
+        <div *ngIf="1 == userForm.get('max_buckets_mode').value"
+             class="form-group row">
+          <label class="cd-col-form-label"></label>
+          <div class="cd-col-form-input">
             <input id="max_buckets"
                    class="form-control"
                    type="number"
-                   formControlName="max_buckets">
-            <span class="help-block"
+                   formControlName="max_buckets"
+                   min="1">
+            <span class="invalid-feedback"
                   *ngIf="userForm.showError('max_buckets', frm, 'required')"
                   i18n>This field is required.</span>
-            <span class="help-block"
+            <span class="invalid-feedback"
                   *ngIf="userForm.showError('max_buckets', frm, 'min')"
-                  i18n>The entered value must be >= 0.</span>
+                  i18n>The entered value must be >= 1.</span>
           </div>
         </div>
 
         <!-- Suspended -->
-        <div class="form-group">
-          <div class="col-sm-offset-3 col-sm-9">
-            <div class="checkbox checkbox-primary">
-              <input id="suspended"
+        <div class="form-group row">
+          <div class="cd-col-form-offset">
+            <div class="custom-control custom-checkbox">
+              <input class="custom-control-input"
+                     id="suspended"
                      type="checkbox"
                      formControlName="suspended">
-              <label for="suspended"
+              <label class="custom-control-label"
+                     for="suspended"
                      i18n>Suspended</label>
             </div>
           </div>
           <legend i18n>S3 key</legend>
 
           <!-- Auto-generate key -->
-          <div class="form-group">
-            <div class="col-sm-offset-3 col-sm-9">
-              <div class="checkbox checkbox-primary">
-                <input id="generate_key"
+          <div class="form-group row">
+            <div class="cd-col-form-offset">
+              <div class="custom-control custom-checkbox">
+                <input class="custom-control-input"
+                       id="generate_key"
                        type="checkbox"
                        formControlName="generate_key">
-                <label for="generate_key"
+                <label class="custom-control-label"
+                       for="generate_key"
                        i18n>Auto-generate key</label>
               </div>
             </div>
           </div>
 
           <!-- Access key -->
-          <div class="form-group"
-               [ngClass]="{'has-error': userForm.showError('access_key', frm)}"
+          <div class="form-group row"
                *ngIf="!editing && !userForm.getValue('generate_key')">
-            <label class="control-label col-sm-3"
-                   for="access_key">
-              <ng-container i18n>Access key</ng-container>
-              <span class="required"></span>
-            </label>
-            <div class="col-sm-9">
+            <label class="cd-col-form-label required"
+                   for="access_key"
+                   i18n>Access key</label>
+            <div class="cd-col-form-input">
               <div class="input-group">
                 <input id="access_key"
                        class="form-control"
                        type="password"
                        formControlName="access_key">
-                <span class="input-group-btn">
+                <span class="input-group-append">
                   <button type="button"
-                          class="btn btn-default"
+                          class="btn btn-light"
                           cdPasswordButton="access_key">
                   </button>
                   <button type="button"
-                          class="btn btn-default"
+                          class="btn btn-light"
                           cdCopy2ClipboardButton="access_key">
                   </button>
                 </span>
               </div>
-              <span class="help-block"
+              <span class="invalid-feedback"
                     *ngIf="userForm.showError('access_key', frm, 'required')"
                     i18n>This field is required.</span>
             </div>
           </div>
 
           <!-- Secret key -->
-          <div class="form-group"
-               [ngClass]="{'has-error': userForm.showError('secret_key', frm)}"
+          <div class="form-group row"
                *ngIf="!editing && !userForm.getValue('generate_key')">
-            <label class="control-label col-sm-3"
-                   for="secret_key">
-              <ng-container i18n>Secret key</ng-container>
-              <span class="required"></span>
-            </label>
-            <div class="col-sm-9">
+            <label class="cd-col-form-label required"
+                   for="secret_key"
+                   i18n>Secret key</label>
+            <div class="cd-col-form-input">
               <div class="input-group">
                 <input id="secret_key"
                        class="form-control"
                        type="password"
                        formControlName="secret_key">
-                <span class="input-group-btn">
+                <span class="input-group-append">
                   <button type="button"
-                          class="btn btn-default"
+                          class="btn btn-light"
                           cdPasswordButton="secret_key">
                   </button>
                   <button type="button"
-                          class="btn btn-default"
+                          class="btn btn-light"
                           cdCopy2ClipboardButton="secret_key">
                   </button>
                 </span>
               </div>
-              <span class="help-block"
+              <span class="invalid-feedback"
                     *ngIf="userForm.showError('secret_key', frm, 'required')"
                     i18n>This field is required.</span>
             </div>
         <!-- Subusers -->
         <fieldset *ngIf="editing">
           <legend i18n>Subusers</legend>
-
-          <div class="col-sm-offset-3 col-sm-9">
-            <span *ngIf="subusers.length === 0"
-                  class="form-control no-border">
-              <span class="text-muted"
-                    i18n>There are no subusers.</span>
-            </span>
-
-            <span *ngFor="let subuser of subusers; let i=index;">
-              <div class="input-group">
-                <span class="input-group-addon">
-                  <i class="icon-prepend fa fa-user"></i>
-                </span>
-                <input type="text"
-                       class="form-control"
-                       value="{{ subuser.id }}"
-                       readonly>
-                <span class="input-group-addon"
-                      style="border-left: 0; border-right: 0;">
-                  <i class="icon-prepend fa fa-share-alt"></i>
-                </span>
-                <input type="text"
-                       class="form-control"
-                       value="{{ ('full-control' === subuser.permissions) ? 'full' : subuser.permissions }}"
-                       readonly>
-                <span class="input-group-btn">
+          <div class="row">
+            <div class="cd-col-form-offset">
+              <span *ngIf="subusers.length === 0"
+                    class="no-border">
+                <span class="form-text text-muted"
+                      i18n>There are no subusers.</span>
+              </span>
+
+              <span *ngFor="let subuser of subusers; let i=index;">
+                <div class="input-group">
+                  <div class="input-group-prepend">
+                    <span class="input-group-text">
+                      <i class="{{ icons.user }}"></i>
+                    </span>
+                  </div>
+                  <input type="text"
+                         class="cd-form-control"
+                         value="{{ subuser.id }}"
+                         readonly>
+                  <div class="input-group-prepend border-left-0 border-right-0">
+                    <span class="input-group-text">
+                      <i class="{{ icons.share }}"></i>
+                    </span>
+                  </div>
+                  <input type="text"
+                         class="cd-form-control"
+                         value="{{ ('full-control' === subuser.permissions) ? 'full' : subuser.permissions }}"
+                         readonly>
+                  <span class="input-group-append">
+                    <button type="button"
+                            class="btn btn-light tc_showSubuserButton"
+                            i18n-tooltip
+                            tooltip="Edit"
+                            (click)="showSubuserModal(i)">
+                      <i [ngClass]="[icons.edit]"></i>
+                    </button>
+                    <button type="button"
+                            class="btn btn-light tc_deleteSubuserButton"
+                            i18n-tooltip
+                            tooltip="Delete"
+                            (click)="deleteSubuser(i)">
+                      <i [ngClass]="[icons.destroy]"></i>
+                    </button>
+                  </span>
+                </div>
+                <span class="form-text text-muted"></span>
+              </span>
+
+              <div class="row">
+                <div class="col-12">
                   <button type="button"
-                          class="btn btn-default tc_showSubuserButton"
-                          i18n-tooltip
-                          tooltip="Edit"
-                          (click)="showSubuserModal(i)">
-                    <i class="fa fa-cogs"></i>
+                          class="btn btn-light float-right tc_addSubuserButton"
+                          (click)="showSubuserModal()">
+                    <i [ngClass]="[icons.add]"></i>
+                    <ng-container i18n>{{ actionLabels.CREATE | titlecase }}
+                      {{ subuserLabel | upperFirst }}</ng-container>
                   </button>
-                  <button type="button"
-                          class="btn btn-default tc_deleteSubuserButton"
-                          i18n-tooltip
-                          tooltip="Delete"
-                          (click)="deleteSubuser(i)">
-                    <i class="fa fa-times"></i>
-                  </button>
-                </span>
+                </div>
               </div>
               <span class="help-block"></span>
-            </span>
-
-            <span class="form-control no-border">
-              <button type="button"
-                      class="btn btn-sm btn-default btn-label pull-right tc_addSubuserButton"
-                      (click)="showSubuserModal()">
-                <i class="fa fa-fw fa-plus"></i>
-                <ng-container i18n>{{ actionLabels.CREATE | titlecase }} {{ subuserLabel | upperFirst }}</ng-container>
-              </button>
-            </span>
+            </div>
           </div>
         </fieldset>
 
           <legend i18n>Keys</legend>
 
           <!-- S3 keys -->
-          <label class="col-sm-3 control-label"
-                 i18n>S3</label>
-          <div class="col-sm-9">
-            <span *ngIf="s3Keys.length === 0"
-                  class="form-control no-border">
-              <span class="text-muted"
-                    i18n>There are no keys.</span>
-            </span>
-
-            <span *ngFor="let key of s3Keys; let i=index;">
-              <div class="input-group">
-                <span class="input-group-addon">
-                  <i class="icon-prepend fa fa-key"></i>
-                </span>
-                <input type="text"
-                       class="form-control"
-                       value="{{ key.user }}"
-                       readonly>
-                <span class="input-group-btn">
+          <div class="form-group row">
+            <label class="cd-col-form-label"
+                   i18n>S3</label>
+            <div class="cd-col-form-input">
+              <span *ngIf="s3Keys.length === 0"
+                    class="no-border">
+                <span class="form-text text-muted"
+                      i18n>There are no keys.</span>
+              </span>
+
+              <span *ngFor="let key of s3Keys; let i=index;">
+                <div class="input-group">
+                  <div class="input-group-prepend">
+                    <div class="input-group-text">
+                      <i class="{{ icons.key }}"></i>
+                    </div>
+                  </div>
+                  <input type="text"
+                         class="cd-form-control"
+                         value="{{ key.user }}"
+                         readonly>
+                  <span class="input-group-append">
+                    <button type="button"
+                            class="btn btn-light tc_showS3KeyButton"
+                            i18n-tooltip
+                            tooltip="Show"
+                            (click)="showS3KeyModal(i)">
+                      <i [ngClass]="[icons.show]"></i>
+                    </button>
+                    <button type="button"
+                            class="btn btn-light tc_deleteS3KeyButton"
+                            i18n-tooltip
+                            tooltip="Delete"
+                            (click)="deleteS3Key(i)">
+                      <i [ngClass]="[icons.destroy]"></i>
+                    </button>
+                  </span>
+                </div>
+                <span class="form-text text-muted"></span>
+              </span>
+
+              <div class="row">
+                <div class="col-12">
                   <button type="button"
-                          class="btn btn-default tc_showS3KeyButton"
-                          i18n-tooltip
-                          tooltip="Show"
-                          (click)="showS3KeyModal(i)">
-                    <i class="fa fa-eye"></i>
-                  </button>
-                  <button type="button"
-                          class="btn btn-default tc_deleteS3KeyButton"
-                          i18n-tooltip
-                          tooltip="Delete"
-                          (click)="deleteS3Key(i)">
-                    <i class="fa fa-times"></i>
+                          class="btn btn-light float-right tc_addS3KeyButton"
+                          (click)="showS3KeyModal()">
+                    <i [ngClass]="[icons.add]"></i>
+                    <ng-container i18n>{{ actionLabels.CREATE | titlecase }}
+                      {{ s3keyLabel | upperFirst }}</ng-container>
                   </button>
-                </span>
+                </div>
               </div>
+
               <span class="help-block"></span>
-            </span>
-
-            <span class="form-control no-border">
-              <button type="button"
-                      class="btn btn-sm btn-default btn-label pull-right tc_addS3KeyButton"
-                      (click)="showS3KeyModal()">
-                <i class="fa fa-fw fa-plus"></i>
-                <ng-container i18n>{{ actionLabels.CREATE | titlecase }} {{ s3keyLabel | upperFirst }}</ng-container>
-              </button>
-            </span>
+            </div>
+
             <hr>
           </div>
 
           <!-- Swift keys -->
-          <label class="col-sm-3 control-label"
-                 i18n>Swift</label>
-          <div class="col-sm-9">
-            <span *ngIf="swiftKeys.length === 0"
-                  class="form-control no-border">
-              <span class="text-muted"
-                    i18n>There are no keys.</span>
-            </span>
-
-            <span *ngFor="let key of swiftKeys; let i=index;">
-              <div class="input-group">
-                <span class="input-group-addon">
-                  <i class="icon-prepend fa fa-key"></i>
-                </span>
-                <input type="text"
-                       class="form-control"
-                       value="{{ key.user }}"
-                       readonly>
-                <span class="input-group-btn">
-                  <button type="button"
-                          class="btn btn-default tc_showSwiftKeyButton"
-                          i18n-tooltip
-                          tooltip="Show"
-                          (click)="showSwiftKeyModal(i)">
-                    <i class="fa fa-eye"></i>
-                  </button>
-                </span>
-              </div>
-              <span class="help-block"></span>
-            </span>
+          <div class="form-group row">
+            <label class="cd-col-form-label"
+                   i18n>Swift</label>
+
+            <div class="cd-col-form-input">
+              <span *ngIf="swiftKeys.length === 0"
+                    class="no-border">
+                <span class="form-text text-muted"
+                      i18n>There are no keys.</span>
+              </span>
+
+              <span *ngFor="let key of swiftKeys; let i=index;">
+                <div class="input-group">
+                  <div class="input-group-prepend">
+                    <span class="input-group-text">
+                      <i class="{{ icons.key }}"></i>
+                    </span>
+                  </div>
+                  <input type="text"
+                         class="cd-form-control"
+                         value="{{ key.user }}"
+                         readonly>
+                  <span class="input-group-append">
+                    <button type="button"
+                            class="btn btn-light tc_showSwiftKeyButton"
+                            i18n-tooltip
+                            tooltip="Show"
+                            (click)="showSwiftKeyModal(i)">
+                      <i [ngClass]="[icons.show]"></i>
+                    </button>
+                  </span>
+                </div>
+                <span class="form-text text-muted"></span>
+              </span>
+            </div>
           </div>
         </fieldset>
 
         <fieldset *ngIf="editing">
           <legend i18n>Capabilities</legend>
 
-          <div class="col-sm-offset-3 col-sm-9">
-            <span *ngIf="capabilities.length === 0"
-                  class="form-control no-border">
-              <span class="text-muted"
-                    i18n>There are no capabilities.</span>
-            </span>
-
-            <span *ngFor="let cap of capabilities; let i=index;">
-              <div class="input-group">
-                <span class="input-group-addon">
-                  <i class="icon-prepend fa fa-share-alt"></i>
-                </span>
-                <input type="text"
-                       class="form-control"
-                       value="{{ cap.type }}:{{ cap.perm }}"
-                       readonly>
-                <span class="input-group-btn">
+          <div class="form-group row">
+            <div class="cd-col-form-offset">
+              <span *ngIf="capabilities.length === 0"
+                    class="no-border">
+                <span class="form-text text-muted"
+                      i18n>There are no capabilities.</span>
+              </span>
+
+              <span *ngFor="let cap of capabilities; let i=index;">
+                <div class="input-group">
+                  <span class="input-group-prepend">
+                    <div class="input-group-text">
+                      <i class="{{ icons.share }}"></i>
+                    </div>
+                  </span>
+                  <input type="text"
+                         class="cd-form-control"
+                         value="{{ cap.type }}:{{ cap.perm }}"
+                         readonly>
+                  <span class="input-group-append">
+                    <button type="button"
+                            class="btn btn-light tc_editCapButton"
+                            i18n-tooltip
+                            tooltip="Edit"
+                            (click)="showCapabilityModal(i)">
+                      <i [ngClass]="[icons.edit]"></i>
+                    </button>
+                    <button type="button"
+                            class="btn btn-light tc_deleteCapButton"
+                            i18n-tooltip
+                            tooltip="Delete"
+                            (click)="deleteCapability(i)">
+                      <i [ngClass]="[icons.destroy]"></i>
+                    </button>
+                  </span>
+                </div>
+                <span class="form-text text-muted"></span>
+              </span>
+
+              <div class="row">
+                <div class="col-12">
                   <button type="button"
-                          class="btn btn-default tc_editCapButton"
+                          class="btn btn-light float-right tc_addCapButton"
+                          [disabled]="hasAllCapabilities()"
                           i18n-tooltip
-                          tooltip="Edit"
-                          (click)="showCapabilityModal(i)">
-                    <i class="fa fa-cogs"></i>
+                          tooltip="All capabilities are already added."
+                          [isDisabled]="!hasAllCapabilities()"
+                          triggers="pointerenter pointerleave"
+                          (click)="showCapabilityModal()">
+                    <i [ngClass]="[icons.add]"></i>
+                    <ng-container i18n>{{ actionLabels.ADD | titlecase }}
+                      {{ capabilityLabel | upperFirst }}</ng-container>
                   </button>
-                  <button type="button"
-                          class="btn btn-default tc_deleteCapButton"
-                          i18n-tooltip
-                          tooltip="Delete"
-                          (click)="deleteCapability(i)">
-                    <i class="fa fa-times"></i>
-                  </button>
-                </span>
+                </div>
               </div>
               <span class="help-block"></span>
-            </span>
-
-            <span class="form-control no-border">
-              <button type="button"
-                      class="btn btn-sm btn-default btn-label pull-right tc_addCapButton"
-                      [disabled]="hasAllCapabilities()"
-                      i18n-tooltip
-                      tooltip="All capabilities are already added."
-                      [isDisabled]="!hasAllCapabilities()"
-                      triggers="pointerenter pointerleave"
-                      (click)="showCapabilityModal()">
-                <i class="fa fa-fw fa-plus"></i>
-                <ng-container i18n>{{ actionLabels.ADD | titlecase }} {{ capabilityLabel | upperFirst }}</ng-container>
-              </button>
-            </span>
+            </div>
           </div>
         </fieldset>
 
           <legend i18n>User quota</legend>
 
           <!-- Enabled -->
-          <div class="form-group">
-            <div class="col-sm-offset-3 col-sm-9">
-              <div class="checkbox checkbox-primary">
-                <input id="user_quota_enabled"
+          <div class="form-group row">
+            <div class="cd-col-form-offset">
+              <div class="custom-control custom-checkbox">
+                <input class="custom-control-input"
+                       id="user_quota_enabled"
                        type="checkbox"
                        formControlName="user_quota_enabled">
-                <label for="user_quota_enabled"
+                <label class="custom-control-label"
+                       for="user_quota_enabled"
                        i18n>Enabled</label>
               </div>
             </div>
           </div>
 
           <!-- Unlimited size -->
-          <div class="form-group"
+          <div class="form-group row"
                *ngIf="userForm.controls.user_quota_enabled.value">
-            <div class="col-sm-offset-3 col-sm-9">
-              <div class="checkbox checkbox-primary">
-                <input id="user_quota_max_size_unlimited"
+            <div class="cd-col-form-offset">
+              <div class="custom-control custom-checkbox">
+                <input class="custom-control-input"
+                       id="user_quota_max_size_unlimited"
                        type="checkbox"
                        formControlName="user_quota_max_size_unlimited">
-                <label for="user_quota_max_size_unlimited"
+                <label class="custom-control-label"
+                       for="user_quota_max_size_unlimited"
                        i18n>Unlimited size</label>
               </div>
             </div>
           </div>
 
           <!-- Maximum size -->
-          <div class="form-group"
-               [ngClass]="{'has-error': userForm.showError('user_quota_max_size', frm)}"
-               *ngIf="!userForm.getValue('user_quota_max_size_unlimited')">
-            <label class="control-label col-sm-3"
-                   for="user_quota_max_size">
-              <ng-container i18n>Max. size</ng-container>
-              <span class="required"></span>
-            </label>
-            <div class="col-sm-9">
+          <div class="form-group row"
+               *ngIf="userForm.controls.user_quota_enabled.value && !userForm.getValue('user_quota_max_size_unlimited')">
+            <label class="cd-col-form-label required"
+                   for="user_quota_max_size"
+                   i18n>Max. size</label>
+            <div class="cd-col-form-input">
               <input id="user_quota_max_size"
                      class="form-control"
                      type="text"
                      formControlName="user_quota_max_size"
                      cdDimlessBinary>
-              <span class="help-block"
+              <span class="invalid-feedback"
                     *ngIf="userForm.showError('user_quota_max_size', frm, 'required')"
                     i18n>This field is required.</span>
-              <span class="help-block"
+              <span class="invalid-feedback"
                     *ngIf="userForm.showError('user_quota_max_size', frm, 'quotaMaxSize')"
                     i18n>The value is not valid.</span>
             </div>
           </div>
 
           <!-- Unlimited objects -->
-          <div class="form-group"
+          <div class="form-group row"
                *ngIf="userForm.controls.user_quota_enabled.value">
-            <div class="col-sm-offset-3 col-sm-9">
-              <div class="checkbox checkbox-primary">
-                <input id="user_quota_max_objects_unlimited"
+            <div class="cd-col-form-offset">
+              <div class="custom-control custom-checkbox">
+                <input class="custom-control-input"
+                       id="user_quota_max_objects_unlimited"
                        type="checkbox"
                        formControlName="user_quota_max_objects_unlimited">
-                <label for="user_quota_max_objects_unlimited"
+                <label class="custom-control-label"
+                       for="user_quota_max_objects_unlimited"
                        i18n>Unlimited objects</label>
               </div>
             </div>
           </div>
 
           <!-- Maximum objects -->
-          <div class="form-group"
-               [ngClass]="{'has-error': userForm.showError('user_quota_max_objects', frm)}"
-               *ngIf="!userForm.getValue('user_quota_max_objects_unlimited')">
-            <label class="control-label col-sm-3"
-                   for="user_quota_max_objects">
-              <ng-container i18n>Max. objects</ng-container>
-              <span class="required"></span>
-            </label>
-            <div class="col-sm-9">
+          <div class="form-group row"
+               *ngIf="userForm.controls.user_quota_enabled.value && !userForm.getValue('user_quota_max_objects_unlimited')">
+            <label class="cd-col-form-label required"
+                   for="user_quota_max_objects"
+                   i18n>Max. objects</label>
+            <div class="cd-col-form-input">
               <input id="user_quota_max_objects"
                      class="form-control"
                      type="number"
                      formControlName="user_quota_max_objects">
-              <span class="help-block"
+              <span class="invalid-feedback"
                     *ngIf="userForm.showError('user_quota_max_objects', frm, 'required')"
                     i18n>This field is required.</span>
-              <span class="help-block"
+              <span class="invalid-feedback"
                     *ngIf="userForm.showError('user_quota_max_objects', frm, 'min')"
                     i18n>The entered value must be >= 0.</span>
             </div>
           <legend i18n>Bucket quota</legend>
 
           <!-- Enabled -->
-          <div class="form-group">
-            <div class="col-sm-offset-3 col-sm-9">
-              <div class="checkbox checkbox-primary">
-                <input id="bucket_quota_enabled"
+          <div class="form-group row">
+            <div class="cd-col-form-offset">
+              <div class="custom-control custom-checkbox">
+                <input class="custom-control-input"
+                       id="bucket_quota_enabled"
                        type="checkbox"
                        formControlName="bucket_quota_enabled">
-                <label for="bucket_quota_enabled"
+                <label class="custom-control-label"
+                       for="bucket_quota_enabled"
                        i18n>Enabled</label>
               </div>
             </div>
           </div>
 
           <!-- Unlimited size -->
-          <div class="form-group"
+          <div class="form-group row"
                *ngIf="userForm.controls.bucket_quota_enabled.value">
-            <div class="col-sm-offset-3 col-sm-9">
-              <div class="checkbox checkbox-primary">
-                <input id="bucket_quota_max_size_unlimited"
+            <div class="cd-col-form-offset">
+              <div class="custom-control custom-checkbox">
+                <input class="custom-control-input"
+                       id="bucket_quota_max_size_unlimited"
                        type="checkbox"
                        formControlName="bucket_quota_max_size_unlimited">
-                <label for="bucket_quota_max_size_unlimited"
+                <label class="custom-control-label"
+                       for="bucket_quota_max_size_unlimited"
                        i18n>Unlimited size</label>
               </div>
             </div>
           </div>
 
           <!-- Maximum size -->
-          <div class="form-group"
-               [ngClass]="{'has-error': userForm.showError('bucket_quota_max_size', frm)}"
-               *ngIf="!userForm.getValue('bucket_quota_max_size_unlimited')">
-            <label class="control-label col-sm-3"
-                   for="bucket_quota_max_size">
-              <ng-container i18n>Max. size</ng-container>
-              <span class="required"></span>
-            </label>
-            <div class="col-sm-9">
+          <div class="form-group row"
+               *ngIf="userForm.controls.bucket_quota_enabled.value && !userForm.getValue('bucket_quota_max_size_unlimited')">
+            <label class="cd-col-form-label required"
+                   for="bucket_quota_max_size"
+                   i18n>Max. size</label>
+            <div class="cd-col-form-input">
               <input id="bucket_quota_max_size"
                      class="form-control"
                      type="text"
                      formControlName="bucket_quota_max_size"
                      cdDimlessBinary>
-              <span class="help-block"
+              <span class="invalid-feedback"
                     *ngIf="userForm.showError('bucket_quota_max_size', frm, 'required')"
                     i18n>This field is required.</span>
-              <span class="help-block"
+              <span class="invalid-feedback"
                     *ngIf="userForm.showError('bucket_quota_max_size', frm, 'quotaMaxSize')"
                     i18n>The value is not valid.</span>
             </div>
           </div>
 
           <!-- Unlimited objects -->
-          <div class="form-group"
+          <div class="form-group row"
                *ngIf="userForm.controls.bucket_quota_enabled.value">
-            <div class="col-sm-offset-3 col-sm-9">
-              <div class="checkbox checkbox-primary">
-                <input id="bucket_quota_max_objects_unlimited"
+            <div class="cd-col-form-offset">
+              <div class="custom-control custom-checkbox">
+                <input class="custom-control-input"
+                       id="bucket_quota_max_objects_unlimited"
                        type="checkbox"
                        formControlName="bucket_quota_max_objects_unlimited">
-                <label for="bucket_quota_max_objects_unlimited"
+                <label class="custom-control-label"
+                       for="bucket_quota_max_objects_unlimited"
                        i18n>Unlimited objects</label>
               </div>
             </div>
           </div>
 
           <!-- Maximum objects -->
-          <div class="form-group"
-               [ngClass]="{'has-error': userForm.showError('bucket_quota_max_objects', frm)}"
-               *ngIf="!userForm.getValue('bucket_quota_max_objects_unlimited')">
-            <label class="control-label col-sm-3"
-                   for="bucket_quota_max_objects">
-              <ng-container i18n>Max. objects</ng-container>
-              <span class="required"></span>
-            </label>
-            <div class="col-sm-9">
+          <div class="form-group row"
+               *ngIf="userForm.controls.bucket_quota_enabled.value && !userForm.getValue('bucket_quota_max_objects_unlimited')">
+            <label class="cd-col-form-label required"
+                   for="bucket_quota_max_objects"
+                   i18n>Max. objects</label>
+            <div class="cd-col-form-input">
               <input id="bucket_quota_max_objects"
                      class="form-control"
                      type="number"
                      formControlName="bucket_quota_max_objects">
-              <span class="help-block"
+              <span class="invalid-feedback"
                     *ngIf="userForm.showError('bucket_quota_max_objects', frm, 'required')"
                     i18n>This field is required.</span>
-              <span class="help-block"
+              <span class="invalid-feedback"
                     *ngIf="userForm.showError('bucket_quota_max_objects', frm, 'min')"
                     i18n>The entered value must be >= 0.</span>
             </div>
         </fieldset>
       </div>
 
-      <div class="panel-footer">
+      <div class="card-footer">
         <div class="button-group text-right">
-          <cd-submit-button
-            (submitAction)="onSubmit()"
-            [form]="userForm"
-            i18n="form action button|Example: Create Pool@@formActionButton"
-            type="button">{{ action | titlecase }} {{ resource | upperFirst }}</cd-submit-button>
+          <cd-submit-button (submitAction)="onSubmit()"
+                            i18n="form action button|Example: Create Pool@@formActionButton"
+                            [form]="userForm">{{ action | titlecase }} {{ resource | upperFirst }}</cd-submit-button>
           <cd-back-button></cd-back-button>
         </div>
       </div>