]> git.proxmox.com Git - ceph.git/blame - ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-form/rgw-user-form.component.html
import ceph quincy 17.2.4
[ceph.git] / ceph / src / pybind / mgr / dashboard / frontend / src / app / ceph / rgw / rgw-user-form / rgw-user-form.component.html
CommitLineData
9f95a23c 1<div class="cd-col-form"
f67539c2 2 *cdFormLoading="loading">
9f95a23c 3 <form #frm="ngForm"
11fdf7f2
TL
4 [formGroup]="userForm"
5 novalidate>
9f95a23c 6 <div class="card">
a4b75251 7 <div i18n="form title"
9f95a23c 8 class="card-header">{{ action | titlecase }} {{ resource | upperFirst }}</div>
11fdf7f2 9
9f95a23c 10 <div class="card-body">
f67539c2 11 <!-- User ID -->
9f95a23c
TL
12 <div class="form-group row">
13 <label class="cd-col-form-label"
14 [ngClass]="{'required': !editing}"
f67539c2
TL
15 for="user_id"
16 i18n>User ID</label>
17 <div class="cd-col-form-input">
18 <input id="user_id"
19 class="form-control"
20 type="text"
21 formControlName="user_id"
22 [readonly]="editing">
23 <span class="invalid-feedback"
24 *ngIf="userForm.showError('user_id', frm, 'required')"
25 i18n>This field is required.</span>
26 <span class="invalid-feedback"
27 *ngIf="userForm.showError('user_id', frm, 'pattern')"
28 i18n>The value is not valid.</span>
29 <span class="invalid-feedback"
30 *ngIf="!userForm.getValue('show_tenant') && userForm.showError('user_id', frm, 'notUnique')"
31 i18n>The chosen user ID is already in use.</span>
32 </div>
33 </div>
34
35 <!-- Show Tenant -->
36 <div class="form-group row">
37 <div class="cd-col-form-offset">
38 <div class="custom-control custom-checkbox">
39 <input class="custom-control-input"
40 id="show_tenant"
41 type="checkbox"
42 (click)="updateFieldsWhenTenanted()"
43 formControlName="show_tenant"
44 [readonly]="true">
45 <label class="custom-control-label"
46 for="show_tenant"
47 i18n>Show Tenant</label>
48 </div>
49 </div>
50 </div>
51
52 <!-- Tenant -->
53 <div class="form-group row"
54 *ngIf="userForm.getValue('show_tenant')">
55 <label class="cd-col-form-label"
56 for="tenant"
57 i18n>Tenant</label>
9f95a23c 58 <div class="cd-col-form-input">
f67539c2 59 <input id="tenant"
11fdf7f2
TL
60 class="form-control"
61 type="text"
f67539c2 62 formControlName="tenant"
11fdf7f2
TL
63 [readonly]="editing"
64 autofocus>
9f95a23c 65 <span class="invalid-feedback"
f67539c2
TL
66 *ngIf="userForm.showError('tenant', frm, 'pattern')"
67 i18n>The value is not valid.</span>
9f95a23c 68 <span class="invalid-feedback"
f67539c2
TL
69 *ngIf="userForm.showError('tenant', frm, 'notUnique')"
70 i18n>The chosen user ID exists in this tenant.</span>
11fdf7f2
TL
71 </div>
72 </div>
73
74 <!-- Full name -->
9f95a23c
TL
75 <div class="form-group row">
76 <label class="cd-col-form-label"
77 [ngClass]="{'required': !editing}"
78 for="display_name"
79 i18n>Full name</label>
80 <div class="cd-col-form-input">
11fdf7f2
TL
81 <input id="display_name"
82 class="form-control"
83 type="text"
84 formControlName="display_name">
2a845540
TL
85 <span class="invalid-feedback"
86 *ngIf="userForm.showError('display_name', frm, 'pattern')"
87 i18n>The value is not valid.</span>
9f95a23c 88 <span class="invalid-feedback"
11fdf7f2
TL
89 *ngIf="userForm.showError('display_name', frm, 'required')"
90 i18n>This field is required.</span>
91 </div>
92 </div>
93
94 <!-- Email address -->
9f95a23c
TL
95 <div class="form-group row">
96 <label class="cd-col-form-label"
11fdf7f2
TL
97 for="email"
98 i18n>Email address</label>
9f95a23c 99 <div class="cd-col-form-input">
11fdf7f2
TL
100 <input id="email"
101 class="form-control"
102 type="text"
103 formControlName="email">
9f95a23c 104 <span class="invalid-feedback"
11fdf7f2
TL
105 *ngIf="userForm.showError('email', frm, 'email')"
106 i18n>This is not a valid email address.</span>
9f95a23c 107 <span class="invalid-feedback"
11fdf7f2
TL
108 *ngIf="userForm.showError('email', frm, 'notUnique')"
109 i18n>The chosen email address is already in use.</span>
110 </div>
111 </div>
112
113 <!-- Max. buckets -->
9f95a23c
TL
114 <div class="form-group row">
115 <label class="cd-col-form-label"
116 for="max_buckets_mode"
117 i18n>Max. buckets</label>
118 <div class="cd-col-form-input">
33c7a0ef 119 <select class="form-control"
9f95a23c
TL
120 formControlName="max_buckets_mode"
121 name="max_buckets_mode"
f6b5b4d7
TL
122 id="max_buckets_mode"
123 (change)="onMaxBucketsModeChange($event.target.value)">
9f95a23c
TL
124 <option i18n
125 value="-1">Disabled</option>
126 <option i18n
127 value="0">Unlimited</option>
128 <option i18n
129 value="1">Custom</option>
130 </select>
131 </div>
132 </div>
133 <div *ngIf="1 == userForm.get('max_buckets_mode').value"
134 class="form-group row">
135 <label class="cd-col-form-label"></label>
136 <div class="cd-col-form-input">
11fdf7f2
TL
137 <input id="max_buckets"
138 class="form-control"
139 type="number"
9f95a23c
TL
140 formControlName="max_buckets"
141 min="1">
142 <span class="invalid-feedback"
11fdf7f2
TL
143 *ngIf="userForm.showError('max_buckets', frm, 'required')"
144 i18n>This field is required.</span>
9f95a23c 145 <span class="invalid-feedback"
11fdf7f2 146 *ngIf="userForm.showError('max_buckets', frm, 'min')"
9f95a23c 147 i18n>The entered value must be >= 1.</span>
11fdf7f2
TL
148 </div>
149 </div>
150
151 <!-- Suspended -->
9f95a23c
TL
152 <div class="form-group row">
153 <div class="cd-col-form-offset">
154 <div class="custom-control custom-checkbox">
155 <input class="custom-control-input"
156 id="suspended"
11fdf7f2
TL
157 type="checkbox"
158 formControlName="suspended">
9f95a23c
TL
159 <label class="custom-control-label"
160 for="suspended"
11fdf7f2
TL
161 i18n>Suspended</label>
162 </div>
163 </div>
164 </div>
165
166 <!-- S3 key -->
167 <fieldset *ngIf="!editing">
168 <legend i18n>S3 key</legend>
169
170 <!-- Auto-generate key -->
9f95a23c
TL
171 <div class="form-group row">
172 <div class="cd-col-form-offset">
173 <div class="custom-control custom-checkbox">
174 <input class="custom-control-input"
175 id="generate_key"
11fdf7f2
TL
176 type="checkbox"
177 formControlName="generate_key">
9f95a23c
TL
178 <label class="custom-control-label"
179 for="generate_key"
11fdf7f2
TL
180 i18n>Auto-generate key</label>
181 </div>
182 </div>
183 </div>
184
185 <!-- Access key -->
9f95a23c 186 <div class="form-group row"
11fdf7f2 187 *ngIf="!editing && !userForm.getValue('generate_key')">
9f95a23c
TL
188 <label class="cd-col-form-label required"
189 for="access_key"
190 i18n>Access key</label>
191 <div class="cd-col-form-input">
11fdf7f2
TL
192 <div class="input-group">
193 <input id="access_key"
194 class="form-control"
195 type="password"
196 formControlName="access_key">
9f95a23c 197 <span class="input-group-append">
11fdf7f2 198 <button type="button"
9f95a23c 199 class="btn btn-light"
11fdf7f2
TL
200 cdPasswordButton="access_key">
201 </button>
f67539c2
TL
202 <cd-copy-2-clipboard-button source="access_key">
203 </cd-copy-2-clipboard-button>
11fdf7f2
TL
204 </span>
205 </div>
9f95a23c 206 <span class="invalid-feedback"
11fdf7f2
TL
207 *ngIf="userForm.showError('access_key', frm, 'required')"
208 i18n>This field is required.</span>
209 </div>
210 </div>
211
212 <!-- Secret key -->
9f95a23c 213 <div class="form-group row"
11fdf7f2 214 *ngIf="!editing && !userForm.getValue('generate_key')">
9f95a23c
TL
215 <label class="cd-col-form-label required"
216 for="secret_key"
217 i18n>Secret key</label>
218 <div class="cd-col-form-input">
11fdf7f2
TL
219 <div class="input-group">
220 <input id="secret_key"
221 class="form-control"
222 type="password"
223 formControlName="secret_key">
9f95a23c 224 <span class="input-group-append">
11fdf7f2 225 <button type="button"
9f95a23c 226 class="btn btn-light"
11fdf7f2
TL
227 cdPasswordButton="secret_key">
228 </button>
f67539c2
TL
229 <cd-copy-2-clipboard-button source="secret_key">
230 </cd-copy-2-clipboard-button>
11fdf7f2
TL
231 </span>
232 </div>
9f95a23c 233 <span class="invalid-feedback"
11fdf7f2
TL
234 *ngIf="userForm.showError('secret_key', frm, 'required')"
235 i18n>This field is required.</span>
236 </div>
237 </div>
238 </fieldset>
239
240 <!-- Subusers -->
241 <fieldset *ngIf="editing">
242 <legend i18n>Subusers</legend>
9f95a23c
TL
243 <div class="row">
244 <div class="cd-col-form-offset">
245 <span *ngIf="subusers.length === 0"
246 class="no-border">
247 <span class="form-text text-muted"
248 i18n>There are no subusers.</span>
249 </span>
250
251 <span *ngFor="let subuser of subusers; let i=index;">
252 <div class="input-group">
253 <div class="input-group-prepend">
254 <span class="input-group-text">
255 <i class="{{ icons.user }}"></i>
256 </span>
257 </div>
258 <input type="text"
259 class="cd-form-control"
260 value="{{ subuser.id }}"
261 readonly>
262 <div class="input-group-prepend border-left-0 border-right-0">
263 <span class="input-group-text">
264 <i class="{{ icons.share }}"></i>
265 </span>
266 </div>
267 <input type="text"
268 class="cd-form-control"
269 value="{{ ('full-control' === subuser.permissions) ? 'full' : subuser.permissions }}"
270 readonly>
271 <span class="input-group-append">
272 <button type="button"
273 class="btn btn-light tc_showSubuserButton"
f67539c2
TL
274 i18n-ngbTooltip
275 ngbTooltip="Edit"
9f95a23c
TL
276 (click)="showSubuserModal(i)">
277 <i [ngClass]="[icons.edit]"></i>
278 </button>
279 <button type="button"
280 class="btn btn-light tc_deleteSubuserButton"
f67539c2
TL
281 i18n-ngbTooltip
282 ngbTooltip="Delete"
9f95a23c
TL
283 (click)="deleteSubuser(i)">
284 <i [ngClass]="[icons.destroy]"></i>
285 </button>
286 </span>
287 </div>
288 <span class="form-text text-muted"></span>
289 </span>
290
291 <div class="row">
292 <div class="col-12">
11fdf7f2 293 <button type="button"
9f95a23c
TL
294 class="btn btn-light float-right tc_addSubuserButton"
295 (click)="showSubuserModal()">
296 <i [ngClass]="[icons.add]"></i>
297 <ng-container i18n>{{ actionLabels.CREATE | titlecase }}
298 {{ subuserLabel | upperFirst }}</ng-container>
11fdf7f2 299 </button>
9f95a23c 300 </div>
11fdf7f2
TL
301 </div>
302 <span class="help-block"></span>
9f95a23c 303 </div>
11fdf7f2
TL
304 </div>
305 </fieldset>
306
307 <!-- Keys -->
308 <fieldset *ngIf="editing">
309 <legend i18n>Keys</legend>
310
311 <!-- S3 keys -->
9f95a23c
TL
312 <div class="form-group row">
313 <label class="cd-col-form-label"
314 i18n>S3</label>
315 <div class="cd-col-form-input">
316 <span *ngIf="s3Keys.length === 0"
317 class="no-border">
318 <span class="form-text text-muted"
319 i18n>There are no keys.</span>
320 </span>
321
322 <span *ngFor="let key of s3Keys; let i=index;">
323 <div class="input-group">
324 <div class="input-group-prepend">
325 <div class="input-group-text">
326 <i class="{{ icons.key }}"></i>
327 </div>
328 </div>
329 <input type="text"
330 class="cd-form-control"
331 value="{{ key.user }}"
332 readonly>
333 <span class="input-group-append">
334 <button type="button"
335 class="btn btn-light tc_showS3KeyButton"
f67539c2
TL
336 i18n-ngbTooltip
337 ngbTooltip="Show"
9f95a23c
TL
338 (click)="showS3KeyModal(i)">
339 <i [ngClass]="[icons.show]"></i>
340 </button>
341 <button type="button"
342 class="btn btn-light tc_deleteS3KeyButton"
f67539c2
TL
343 i18n-ngbTooltip
344 ngbTooltip="Delete"
9f95a23c
TL
345 (click)="deleteS3Key(i)">
346 <i [ngClass]="[icons.destroy]"></i>
347 </button>
348 </span>
349 </div>
350 <span class="form-text text-muted"></span>
351 </span>
352
353 <div class="row">
354 <div class="col-12">
11fdf7f2 355 <button type="button"
9f95a23c
TL
356 class="btn btn-light float-right tc_addS3KeyButton"
357 (click)="showS3KeyModal()">
358 <i [ngClass]="[icons.add]"></i>
359 <ng-container i18n>{{ actionLabels.CREATE | titlecase }}
360 {{ s3keyLabel | upperFirst }}</ng-container>
11fdf7f2 361 </button>
9f95a23c 362 </div>
11fdf7f2 363 </div>
9f95a23c 364
11fdf7f2 365 <span class="help-block"></span>
9f95a23c
TL
366 </div>
367
11fdf7f2
TL
368 <hr>
369 </div>
370
371 <!-- Swift keys -->
9f95a23c
TL
372 <div class="form-group row">
373 <label class="cd-col-form-label"
374 i18n>Swift</label>
375
376 <div class="cd-col-form-input">
377 <span *ngIf="swiftKeys.length === 0"
378 class="no-border">
379 <span class="form-text text-muted"
380 i18n>There are no keys.</span>
381 </span>
382
383 <span *ngFor="let key of swiftKeys; let i=index;">
384 <div class="input-group">
385 <div class="input-group-prepend">
386 <span class="input-group-text">
387 <i class="{{ icons.key }}"></i>
388 </span>
389 </div>
390 <input type="text"
391 class="cd-form-control"
392 value="{{ key.user }}"
393 readonly>
394 <span class="input-group-append">
395 <button type="button"
396 class="btn btn-light tc_showSwiftKeyButton"
f67539c2
TL
397 i18n-ngbTooltip
398 ngbTooltip="Show"
9f95a23c
TL
399 (click)="showSwiftKeyModal(i)">
400 <i [ngClass]="[icons.show]"></i>
401 </button>
402 </span>
403 </div>
404 <span class="form-text text-muted"></span>
405 </span>
406 </div>
11fdf7f2
TL
407 </div>
408 </fieldset>
409
410 <!-- Capabilities -->
411 <fieldset *ngIf="editing">
412 <legend i18n>Capabilities</legend>
413
9f95a23c
TL
414 <div class="form-group row">
415 <div class="cd-col-form-offset">
416 <span *ngIf="capabilities.length === 0"
417 class="no-border">
418 <span class="form-text text-muted"
419 i18n>There are no capabilities.</span>
420 </span>
421
422 <span *ngFor="let cap of capabilities; let i=index;">
423 <div class="input-group">
424 <span class="input-group-prepend">
425 <div class="input-group-text">
426 <i class="{{ icons.share }}"></i>
427 </div>
428 </span>
429 <input type="text"
430 class="cd-form-control"
431 value="{{ cap.type }}:{{ cap.perm }}"
432 readonly>
433 <span class="input-group-append">
434 <button type="button"
435 class="btn btn-light tc_editCapButton"
f67539c2
TL
436 i18n-ngbTooltip
437 ngbTooltip="Edit"
9f95a23c
TL
438 (click)="showCapabilityModal(i)">
439 <i [ngClass]="[icons.edit]"></i>
440 </button>
441 <button type="button"
442 class="btn btn-light tc_deleteCapButton"
f67539c2
TL
443 i18n-ngbTooltip
444 ngbTooltip="Delete"
9f95a23c
TL
445 (click)="deleteCapability(i)">
446 <i [ngClass]="[icons.destroy]"></i>
447 </button>
448 </span>
449 </div>
450 <span class="form-text text-muted"></span>
451 </span>
452
453 <div class="row">
454 <div class="col-12">
11fdf7f2 455 <button type="button"
9f95a23c 456 class="btn btn-light float-right tc_addCapButton"
f67539c2
TL
457 [disabled]="capabilities | pipeFunction:hasAllCapabilities"
458 i18n-ngbTooltip
459 ngbTooltip="All capabilities are already added."
460 [disableTooltip]="!(capabilities | pipeFunction:hasAllCapabilities)"
461 triggers="pointerenter:pointerleave"
9f95a23c
TL
462 (click)="showCapabilityModal()">
463 <i [ngClass]="[icons.add]"></i>
464 <ng-container i18n>{{ actionLabels.ADD | titlecase }}
465 {{ capabilityLabel | upperFirst }}</ng-container>
11fdf7f2 466 </button>
9f95a23c 467 </div>
11fdf7f2
TL
468 </div>
469 <span class="help-block"></span>
9f95a23c 470 </div>
11fdf7f2
TL
471 </div>
472 </fieldset>
473
474 <!-- User quota -->
475 <fieldset>
476 <legend i18n>User quota</legend>
477
478 <!-- Enabled -->
9f95a23c
TL
479 <div class="form-group row">
480 <div class="cd-col-form-offset">
481 <div class="custom-control custom-checkbox">
482 <input class="custom-control-input"
483 id="user_quota_enabled"
11fdf7f2
TL
484 type="checkbox"
485 formControlName="user_quota_enabled">
9f95a23c
TL
486 <label class="custom-control-label"
487 for="user_quota_enabled"
11fdf7f2
TL
488 i18n>Enabled</label>
489 </div>
490 </div>
491 </div>
492
493 <!-- Unlimited size -->
9f95a23c 494 <div class="form-group row"
11fdf7f2 495 *ngIf="userForm.controls.user_quota_enabled.value">
9f95a23c
TL
496 <div class="cd-col-form-offset">
497 <div class="custom-control custom-checkbox">
498 <input class="custom-control-input"
499 id="user_quota_max_size_unlimited"
11fdf7f2
TL
500 type="checkbox"
501 formControlName="user_quota_max_size_unlimited">
9f95a23c
TL
502 <label class="custom-control-label"
503 for="user_quota_max_size_unlimited"
11fdf7f2
TL
504 i18n>Unlimited size</label>
505 </div>
506 </div>
507 </div>
508
509 <!-- Maximum size -->
9f95a23c
TL
510 <div class="form-group row"
511 *ngIf="userForm.controls.user_quota_enabled.value && !userForm.getValue('user_quota_max_size_unlimited')">
512 <label class="cd-col-form-label required"
513 for="user_quota_max_size"
514 i18n>Max. size</label>
515 <div class="cd-col-form-input">
11fdf7f2
TL
516 <input id="user_quota_max_size"
517 class="form-control"
518 type="text"
519 formControlName="user_quota_max_size"
520 cdDimlessBinary>
9f95a23c 521 <span class="invalid-feedback"
11fdf7f2
TL
522 *ngIf="userForm.showError('user_quota_max_size', frm, 'required')"
523 i18n>This field is required.</span>
9f95a23c 524 <span class="invalid-feedback"
11fdf7f2
TL
525 *ngIf="userForm.showError('user_quota_max_size', frm, 'quotaMaxSize')"
526 i18n>The value is not valid.</span>
527 </div>
528 </div>
529
530 <!-- Unlimited objects -->
9f95a23c 531 <div class="form-group row"
11fdf7f2 532 *ngIf="userForm.controls.user_quota_enabled.value">
9f95a23c
TL
533 <div class="cd-col-form-offset">
534 <div class="custom-control custom-checkbox">
535 <input class="custom-control-input"
536 id="user_quota_max_objects_unlimited"
11fdf7f2
TL
537 type="checkbox"
538 formControlName="user_quota_max_objects_unlimited">
9f95a23c
TL
539 <label class="custom-control-label"
540 for="user_quota_max_objects_unlimited"
11fdf7f2
TL
541 i18n>Unlimited objects</label>
542 </div>
543 </div>
544 </div>
545
546 <!-- Maximum objects -->
9f95a23c
TL
547 <div class="form-group row"
548 *ngIf="userForm.controls.user_quota_enabled.value && !userForm.getValue('user_quota_max_objects_unlimited')">
549 <label class="cd-col-form-label required"
550 for="user_quota_max_objects"
551 i18n>Max. objects</label>
552 <div class="cd-col-form-input">
11fdf7f2
TL
553 <input id="user_quota_max_objects"
554 class="form-control"
555 type="number"
20effc67
TL
556 formControlName="user_quota_max_objects"
557 min="0">
9f95a23c 558 <span class="invalid-feedback"
11fdf7f2
TL
559 *ngIf="userForm.showError('user_quota_max_objects', frm, 'required')"
560 i18n>This field is required.</span>
9f95a23c 561 <span class="invalid-feedback"
11fdf7f2
TL
562 *ngIf="userForm.showError('user_quota_max_objects', frm, 'min')"
563 i18n>The entered value must be >= 0.</span>
564 </div>
565 </div>
566 </fieldset>
567
568 <!-- Bucket quota -->
569 <fieldset>
570 <legend i18n>Bucket quota</legend>
571
572 <!-- Enabled -->
9f95a23c
TL
573 <div class="form-group row">
574 <div class="cd-col-form-offset">
575 <div class="custom-control custom-checkbox">
576 <input class="custom-control-input"
577 id="bucket_quota_enabled"
11fdf7f2
TL
578 type="checkbox"
579 formControlName="bucket_quota_enabled">
9f95a23c
TL
580 <label class="custom-control-label"
581 for="bucket_quota_enabled"
11fdf7f2
TL
582 i18n>Enabled</label>
583 </div>
584 </div>
585 </div>
586
587 <!-- Unlimited size -->
9f95a23c 588 <div class="form-group row"
11fdf7f2 589 *ngIf="userForm.controls.bucket_quota_enabled.value">
9f95a23c
TL
590 <div class="cd-col-form-offset">
591 <div class="custom-control custom-checkbox">
592 <input class="custom-control-input"
593 id="bucket_quota_max_size_unlimited"
11fdf7f2
TL
594 type="checkbox"
595 formControlName="bucket_quota_max_size_unlimited">
9f95a23c
TL
596 <label class="custom-control-label"
597 for="bucket_quota_max_size_unlimited"
11fdf7f2
TL
598 i18n>Unlimited size</label>
599 </div>
600 </div>
601 </div>
602
603 <!-- Maximum size -->
9f95a23c
TL
604 <div class="form-group row"
605 *ngIf="userForm.controls.bucket_quota_enabled.value && !userForm.getValue('bucket_quota_max_size_unlimited')">
606 <label class="cd-col-form-label required"
607 for="bucket_quota_max_size"
608 i18n>Max. size</label>
609 <div class="cd-col-form-input">
11fdf7f2
TL
610 <input id="bucket_quota_max_size"
611 class="form-control"
612 type="text"
613 formControlName="bucket_quota_max_size"
614 cdDimlessBinary>
9f95a23c 615 <span class="invalid-feedback"
11fdf7f2
TL
616 *ngIf="userForm.showError('bucket_quota_max_size', frm, 'required')"
617 i18n>This field is required.</span>
9f95a23c 618 <span class="invalid-feedback"
11fdf7f2
TL
619 *ngIf="userForm.showError('bucket_quota_max_size', frm, 'quotaMaxSize')"
620 i18n>The value is not valid.</span>
621 </div>
622 </div>
623
624 <!-- Unlimited objects -->
9f95a23c 625 <div class="form-group row"
11fdf7f2 626 *ngIf="userForm.controls.bucket_quota_enabled.value">
9f95a23c
TL
627 <div class="cd-col-form-offset">
628 <div class="custom-control custom-checkbox">
629 <input class="custom-control-input"
630 id="bucket_quota_max_objects_unlimited"
11fdf7f2
TL
631 type="checkbox"
632 formControlName="bucket_quota_max_objects_unlimited">
9f95a23c
TL
633 <label class="custom-control-label"
634 for="bucket_quota_max_objects_unlimited"
11fdf7f2
TL
635 i18n>Unlimited objects</label>
636 </div>
637 </div>
638 </div>
639
640 <!-- Maximum objects -->
9f95a23c
TL
641 <div class="form-group row"
642 *ngIf="userForm.controls.bucket_quota_enabled.value && !userForm.getValue('bucket_quota_max_objects_unlimited')">
643 <label class="cd-col-form-label required"
644 for="bucket_quota_max_objects"
645 i18n>Max. objects</label>
646 <div class="cd-col-form-input">
11fdf7f2
TL
647 <input id="bucket_quota_max_objects"
648 class="form-control"
649 type="number"
20effc67
TL
650 formControlName="bucket_quota_max_objects"
651 min="0">
9f95a23c 652 <span class="invalid-feedback"
11fdf7f2
TL
653 *ngIf="userForm.showError('bucket_quota_max_objects', frm, 'required')"
654 i18n>This field is required.</span>
9f95a23c 655 <span class="invalid-feedback"
11fdf7f2
TL
656 *ngIf="userForm.showError('bucket_quota_max_objects', frm, 'min')"
657 i18n>The entered value must be >= 0.</span>
658 </div>
659 </div>
660 </fieldset>
661 </div>
662
9f95a23c 663 <div class="card-footer">
f67539c2
TL
664 <cd-form-button-panel (submitActionEvent)="onSubmit()"
665 [form]="userForm"
666 [submitText]="(action | titlecase) + ' ' + (resource | upperFirst)"
667 wrappingClass="text-right"></cd-form-button-panel>
11fdf7f2
TL
668 </div>
669 </div>
670 </form>
671</div>