2 [columnNumbers]="{ md: 4 }">
3 <ng-container *cdFormLoading="loading">
4 <form name="storageClassForm"
6 [formGroup]="storageClassForm"
10 {{ action | titlecase }} {{ resource | upperFirst }}
12 <cd-help-text [formAllFieldsRequired]="true"></cd-help-text>
14 <div class="form-item">
18 for="storageClassType"
19 formControlName="storageClassType"
20 [helperText]="helpTextLabels.storageClassText"
22 [invalid]="storageClassForm.showError('storageClassType', formDir, 'required')"
23 [invalidText]="storageError"
26 i18n>-- Select Storage Class --</option>
27 <option *ngFor="let opt of storageClassOptions"
33 <ng-template #storageError>
35 class="invalid-feedback"
36 *ngIf="storageClassForm.showError('storageClassType', formDir, 'required')"
38 >This field is required.</span
42 <div class="form-item form-item-append"
47 label="Zone Group Name"
49 formControlName="zonegroup"
51 [invalid]="storageClassForm.showError('zonegroup', formDir, 'required')"
52 (change)="onZonegroupChange()"
53 [invalidText]="zonegroupError"
56 *ngFor="let zonegrp of zonegroupNames"
57 [value]="zonegrp.name"
58 [selected]="zonegrp.name === storageClassForm.getValue('zonegroup')"
64 <ng-template #zonegroupError>
66 class="invalid-feedback"
67 *ngIf="storageClassForm.showError('zonegroup', formDir, 'required')"
69 >This field is required.</span
74 <!-- Placement Target -->
76 label="Placement Target"
78 formControlName="placement_target"
80 [invalid]="storageClassForm.showError('placement_target', formDir, 'required')"
81 [invalidText]="placementError"
84 i18n>--Select--</option>
86 *ngFor="let placementTarget of placementTargets"
87 [value]="placementTarget"
88 [selected]="placementTarget === storageClassForm.getValue('placement_target')"
94 <ng-template #placementError>
96 class="invalid-feedback"
97 *ngIf="storageClassForm.showError('placement_target', formDir, 'required')"
99 >This field is required.</span
104 <!-- Storage Class -->
105 <div class="form-item">
107 labelInputID="storage_class"
111 storageClassForm.controls.storage_class.invalid &&
112 storageClassForm.controls.storage_class.dirty
114 [invalidText]="storageClassError"
120 formControlName="storage_class"
121 [invalid]="storageClassForm.showError('storage_class', formDir, 'required')"
124 <ng-template #storageClassError>
126 class="invalid-feedback"
127 *ngIf="storageClassForm.showError('storage_class', formDir, 'required')"
129 >This field is required.</span
133 @if( isTierMatch( TIER_TYPE.CLOUD_TIER, TIER_TYPE.GLACIER )){
135 <div class="form-item form-item-append"
138 <!-- Target Region -->
140 labelInputID="region"
142 [invalid]="storageClassForm.showError('region', formDir, 'required')"
143 [invalidText]="regionError"
144 [helperText]="helpTextLabels.targetRegionText"
150 formControlName="region"
151 placeholder="e.g, us-east-1"
153 [invalid]="storageClassForm.showError('region', formDir, 'required')"
156 <ng-template #regionError>
158 class="invalid-feedback"
159 *ngIf="storageClassForm.showError('region', formDir, 'required')"
161 >This field is required.</span
166 <!-- Target Endpoint -->
169 [invalid]="storageClassForm.showError('target_endpoint', formDir, 'required') || storageClassForm.showError('target_endpoint', formDir, 'invalidUrl')"
172 storageClassForm.controls['target_endpoint'].errors?.['required'] ? 'This field is required.' :
173 storageClassForm.controls['target_endpoint'].errors?.['invalidUrl'] ? 'Please enter a valid URL.' : ''
179 formControlName="target_endpoint"
180 placeholder="e.g. 192.168.0.10, 192.168.1.0/8"
181 [invalid]="storageClassForm.showError('target_endpoint', formDir, 'required') || storageClassForm.showError('target_endpoint', formDir, 'invalidUrl')"
187 <div class="form-item">
189 [columnNumbers]="{ md: 12 }"
192 labelInputID="access_key"
193 [invalid]="storageClassForm.showError('access_key', formDir, 'required')"
194 [invalidText]="accessError"
195 [helperText]="helpTextLabels.targetAccessKeyText"
202 formControlName="access_key"
203 [invalid]="storageClassForm.showError('access_key', formDir, 'required')"
205 </cds-password-label>
206 <cd-copy-2-clipboard-button class="clipboard"> </cd-copy-2-clipboard-button>
207 <ng-template #accessError>
209 class="invalid-feedback"
210 *ngIf="storageClassForm.showError('access_key', formDir, 'required')"
212 >This field is required.</span
218 <div class="form-item">
220 [columnNumbers]="{ md: 12 }"
223 labelInputID="secret_key"
224 [helperText]="helpTextLabels.targetSecretKeyText"
225 [invalid]="storageClassForm.showError('secret_key', formDir, 'required')"
226 [invalidText]="secretError"
233 formControlName="secret_key"
234 [invalid]="storageClassForm.showError('secret_key', formDir, 'required')"
236 </cds-password-label>
237 <cd-copy-2-clipboard-button class="clipboard"> </cd-copy-2-clipboard-button>
238 <ng-template #secretError>
240 class="invalid-feedback"
241 *ngIf="storageClassForm.showError('secret_key', formDir, 'required')"
243 >This field is required.</span
249 <div class="form-item">
251 labelInputID="target_path"
253 [invalid]="storageClassForm.showError('target_path', formDir, 'required')"
254 [invalidText]="targetError"
255 [helperText]="helpTextLabels.targetPathText"
261 formControlName="target_path"
262 [invalid]="storageClassForm.showError('target_path', formDir, 'required')"
265 <ng-template #targetError>
267 class="invalid-feedback"
268 *ngIf="storageClassForm.showError('target_path', formDir, 'required')"
270 >This field is required.</span
274 <div class="form-item">
276 id="allow_read_through"
277 formControlName="allow_read_through"
278 cdOptionalField="Allow Read Through"
280 (change)="onAllowReadThroughChange($event)"
282 <cd-help-text>{{ helpTextLabels?.allowReadThroughText }}</cd-help-text>
285 <div class="form-item">
287 id="retain_head_object"
288 formControlName="retain_head_object"
289 cdOptionalField="Head Object (Stub File)"
291 >Head Object (Stub File)
292 <cd-help-text>{{ helpTextLabels?.retainHeadObjectText }}</cd-help-text>
295 <div class="form-item form-item-append"
299 name="read_through_restore_days"
300 formControlName="read_through_restore_days"
301 id="read_through_restore_days"
303 label="ReadThrough Restore Days"
304 [helperText]="helpTextLabels.readthroughrestoreDaysText"
309 storageClassForm.controls.read_through_restore_days.invalid &&
310 storageClassForm.controls.read_through_restore_days.dirty
312 [invalidText]="readThroughError"
314 <ng-template #readThroughError>
316 class="invalid-feedback"
317 *ngIf="storageClassForm.showError('read_through_restore_days', formDir, 'pattern')"
319 >The entered value must be a positive integer.</span
322 class="invalid-feedback"
323 *ngIf="storageClassForm.showError('read_through_restore_days', formDir, 'lockDays')"
325 >ReadThrough Restore Days must be positive.</span
331 formControlName="restore_storage_class"
332 label="Restore Storage Class"
333 id="restore_storage_class"
334 [helperText]="helpTextLabels.restoreStorageClassText"
338 i18n>-- Select the glacier restore storage class --</option>
339 <option [ngValue]="standard"
340 i18n>Standard</option>
345 } @if(isTierMatch(TIER_TYPE.GLACIER)){
347 <legend class="cd-header"
348 i18n>Glacier Configuration</legend>
349 <div class="form-item form-item-append"
353 formControlName="glacier_restore_tier_type"
354 label="Glacier Restore Tier Type"
355 cdRequiredField="Glacier Restore Tier Type"
356 id="glacier_restore_tier_type"
358 storageClassForm.controls.glacier_restore_tier_type.invalid &&
359 storageClassForm.controls.glacier_restore_tier_type.dirty
361 [invalidText]="glacierError"
362 [helperText]="helpTextLabels.tiertypeText"
366 i18n>-- Select the glacier restore tier type --</option>
367 <option [ngValue]="standard"
368 i18n>Standard</option>
369 <option [ngValue]="expedited"
370 i18n>Expedited</option>
372 <ng-template #glacierError>
374 class="invalid-feedback"
375 *ngIf="storageClassForm.showError('glacier_restore_tier_type', formDir, 'required')"
377 >This field is required.</span
383 [id]="'glacier_restore_days'"
384 [formControlName]="'glacier_restore_days'"
385 [label]="'Glacier Restore Days'"
386 [helperText]="helpTextLabels.restoreDaysText"
392 storageClassForm.controls.glacier_restore_days.invalid &&
393 storageClassForm.controls.glacier_restore_days.dirty
395 [invalidText]="glacierRestoreError"
398 <ng-template #glacierRestoreError>
400 class="invalid-feedback"
401 *ngIf="storageClassForm.showError('glacier_restore_days', formDir, 'pattern')"
403 >The entered value must be a positive integer.</span
406 class="invalid-feedback"
407 *ngIf="storageClassForm.showError('glacier_restore_days', formDir, 'lockDays')"
409 >Glacier Restore Days must be positive.</span
415 } @if( isTierMatch( TIER_TYPE.CLOUD_TIER, TIER_TYPE.GLACIER )){
419 <h5 class="cds--accordion__title cd-header">Advanced</h5>
422 <cds-accordion size="lg"
426 id="advanced-fieldset"
427 (selected)="showAdvanced = !showAdvanced"
429 <!-- Multi Part Sync Threshold -->
430 <div class="form-item form-item-append"
434 labelInputID="multipart_sync_threshold"
436 [helperText]="helpTextLabels.multipartSyncThresholdText"
437 cdOptionalField="Multipart Sync Threshold"
438 >Multipart Sync Threshold
442 id="multipart_sync_threshold"
443 formControlName="multipart_sync_threshold"
450 labelInputID="multipart_min_part_size"
452 [helperText]="helpTextLabels.multipartMinPartText"
453 cdOptionalField="Multipart Minimum Part Size"
454 >Multipart Minimum Part Size
458 id="multipart_min_part_size"
459 formControlName="multipart_min_part_size"
467 <legend class="cd-header"
468 i18n>ACLs Mapping</legend>
469 <ng-container formArrayName="acls">
470 @for (acl of acls.controls; let i = $index; track acl) {
471 <ng-container [formGroupName]="i">
472 <div class="form-item form-item-append"
475 [columnNumbers]="{ lg: 7 }">
476 <cds-select id="type"
477 formControlName="type"
480 @for (type of typeOptions; track type.value) {
481 <option [value]="type.value"
490 class="form-item form-item-append">
493 labelInputID="source_id"
495 [helperText]="getAclHelperText(acl.get('type')?.value, 'source')"
497 acl.get('source_id')?.invalid && acl.get('source_id')?.touched
500 acl.get('source_id')?.errors?.['required'] ? 'This field is required.' :
501 acl.get('source_id')?.errors?.['email'] ? 'Please enter a valid email address.' :
502 acl.get('source_id')?.errors?.['invalidUrl'] ? 'Please enter a valid URL.' : ''
505 {{ getAclLabel('source', acl.get('type')?.value) }}
509 formControlName="source_id"
511 acl.get('source_id')?.errors?.['required'] ? 'This field is required.' :
512 acl.get('source_id')?.errors?.['email'] ? 'Please enter a valid email address.' :
513 acl.get('source_id')?.errors?.['invalidUrl'] ? 'Please enter a valid URL.' : ''
520 labelInputID="dest_id"
522 [helperText]="getAclHelperText(acl.get('type')?.value, 'destination')"
523 [invalid]="acl.get('dest_id')?.invalid && acl.get('dest_id')?.touched"
525 acl.get('dest_id')?.errors?.['required'] ? 'This field is required.' :
526 acl.get('dest_id')?.errors?.['email'] ? 'Please enter a valid email address.' :
527 acl.get('dest_id')?.errors?.['invalidUrl'] ? 'Please enter a valid URL.' : ''
530 {{ getAclLabel('destination', acl.get('type')?.value) }}
534 formControlName="dest_id"
536 acl.get('dest_id')?.errors?.['required'] ? 'This field is required.' :
537 acl.get('dest_id')?.errors?.['email'] ? 'Please enter a valid email address.' :
538 acl.get('dest_id')?.errors?.['invalidUrl'] ? 'Please enter a valid URL.' : ''
546 [columnNumbers]="{ lg: 1, md: 1 }"
547 class="item-action-btn spacing"
549 <cds-icon-button kind="primary"
551 (click)="addAcls(acls, i)">
554 class="cds--btn__icon"></svg>
558 [columnNumbers]="{ lg: 1, md: 1 }"
559 class="item-action-btn">
560 <cds-icon-button kind="danger"
562 (click)="removeAcl(i)">
563 <svg cdsIcon="trash-can"
565 class="cds--btn__icon"></svg>
573 </cds-accordion-item>
578 } @if( isTierMatch( TIER_TYPE.CLOUD_TIER, TIER_TYPE.GLACIER )){
579 <cd-alert-panel type="warning"
581 <span i18n>RGW service would be restarted after creating the storage class.</span>
584 <cd-form-button-panel
585 (submitActionEvent)="submitAction()"
586 [form]="storageClassForm"
587 [submitText]="(action | titlecase) + ' ' + (resource | upperFirst)"
588 wrappingClass="text-right"
589 ></cd-form-button-panel>