]>
Commit | Line | Data |
---|---|---|
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> |