@flusys/ng-storage 4.1.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -382
- package/fesm2022/{flusys-ng-storage-file-manager-form.component-AM7JE-s5.mjs → flusys-ng-storage-file-manager-form.component-BLJDAvBX.mjs} +287 -74
- package/fesm2022/flusys-ng-storage-file-manager-form.component-BLJDAvBX.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-file-manager-list.component-bj6oOzOL.mjs → flusys-ng-storage-file-manager-list.component-Dn5hVksO.mjs} +210 -70
- package/fesm2022/flusys-ng-storage-file-manager-list.component-Dn5hVksO.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-folder-form.component-Cc2ybTwu.mjs → flusys-ng-storage-folder-form.component-B8vRSb1T.mjs} +88 -31
- package/fesm2022/flusys-ng-storage-folder-form.component-B8vRSb1T.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-folder-list.component-B2Q41I1g.mjs → flusys-ng-storage-folder-list.component-B4yCKvAV.mjs} +96 -30
- package/fesm2022/flusys-ng-storage-folder-list.component-B4yCKvAV.mjs.map +1 -0
- package/fesm2022/flusys-ng-storage-storage-config-form.component-CMeTif8p.mjs +880 -0
- package/fesm2022/flusys-ng-storage-storage-config-form.component-CMeTif8p.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-storage-config-list.component-DBH_qf9o.mjs → flusys-ng-storage-storage-config-list.component-C7OYYyrQ.mjs} +126 -33
- package/fesm2022/flusys-ng-storage-storage-config-list.component-C7OYYyrQ.mjs.map +1 -0
- package/fesm2022/flusys-ng-storage.mjs +143 -256
- package/fesm2022/flusys-ng-storage.mjs.map +1 -1
- package/package.json +4 -4
- package/types/flusys-ng-storage.d.ts +4 -2
- package/fesm2022/flusys-ng-storage-file-manager-form.component-AM7JE-s5.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-file-manager-list.component-bj6oOzOL.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-folder-form.component-Cc2ybTwu.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-folder-list.component-B2Q41I1g.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-storage-config-form.component-a88XhuPH.mjs +0 -465
- package/fesm2022/flusys-ng-storage-storage-config-form.component-a88XhuPH.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-storage-config-list.component-DBH_qf9o.mjs.map +0 -1
|
@@ -1,465 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, signal, computed, effect, Component } from '@angular/core';
|
|
3
|
-
import { toSignal } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { form, required, FormField } from '@angular/forms/signals';
|
|
5
|
-
import { ActivatedRoute } from '@angular/router';
|
|
6
|
-
import { TranslateService } from '@flusys/ng-localization';
|
|
7
|
-
import { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';
|
|
8
|
-
import { FileLocationEnum, BaseStoragePage, StorageConfigApiService, STORAGE_PROVIDER_OPTIONS } from './flusys-ng-storage.mjs';
|
|
9
|
-
import * as i1 from '@angular/forms';
|
|
10
|
-
import * as i1$1 from 'primeng/button';
|
|
11
|
-
import * as i3 from 'primeng/inputtext';
|
|
12
|
-
import * as i4 from 'primeng/toggleswitch';
|
|
13
|
-
|
|
14
|
-
const DEFAULT_FORM_MODEL = {
|
|
15
|
-
id: '',
|
|
16
|
-
name: '',
|
|
17
|
-
storage: FileLocationEnum.AWS,
|
|
18
|
-
isActive: true,
|
|
19
|
-
isDefault: false,
|
|
20
|
-
awsRegion: '',
|
|
21
|
-
awsBucket: '',
|
|
22
|
-
awsAccessKeyId: '',
|
|
23
|
-
awsSecretAccessKey: '',
|
|
24
|
-
awsEndpoint: '',
|
|
25
|
-
azureAccountName: '',
|
|
26
|
-
azureAccountKey: '',
|
|
27
|
-
azureContainerName: '',
|
|
28
|
-
sftpHost: '',
|
|
29
|
-
sftpPort: '22',
|
|
30
|
-
sftpUsername: '',
|
|
31
|
-
sftpPassword: '',
|
|
32
|
-
sftpBasePath: '',
|
|
33
|
-
localBasePath: '',
|
|
34
|
-
};
|
|
35
|
-
class StorageConfigFormComponent extends BaseStoragePage {
|
|
36
|
-
route = inject(ActivatedRoute);
|
|
37
|
-
configService = inject(StorageConfigApiService);
|
|
38
|
-
translateService = inject(TranslateService);
|
|
39
|
-
routeParams = toSignal(this.route.paramMap);
|
|
40
|
-
initialized = false;
|
|
41
|
-
fileLocationEnum = FileLocationEnum;
|
|
42
|
-
storageProviderOptions = STORAGE_PROVIDER_OPTIONS;
|
|
43
|
-
existingConfig = signal(null, ...(ngDevMode ? [{ debugName: "existingConfig" }] : []));
|
|
44
|
-
isEditMode = computed(() => !!this.existingConfig(), ...(ngDevMode ? [{ debugName: "isEditMode" }] : []));
|
|
45
|
-
formModel = signal({ ...DEFAULT_FORM_MODEL }, ...(ngDevMode ? [{ debugName: "formModel" }] : []));
|
|
46
|
-
configForm = form(this.formModel, (f) => {
|
|
47
|
-
required(f.name, { message: this.translateService.translate('storage.validation.config.name.required') });
|
|
48
|
-
});
|
|
49
|
-
selectedProvider = computed(() => this.formModel().storage, ...(ngDevMode ? [{ debugName: "selectedProvider" }] : []));
|
|
50
|
-
isFormValid = computed(() => this.formModel().name.trim().length > 0, ...(ngDevMode ? [{ debugName: "isFormValid" }] : []));
|
|
51
|
-
constructor() {
|
|
52
|
-
super();
|
|
53
|
-
effect(() => {
|
|
54
|
-
const params = this.routeParams();
|
|
55
|
-
if (!params || this.initialized)
|
|
56
|
-
return;
|
|
57
|
-
this.initialized = true;
|
|
58
|
-
const configId = params.get('id');
|
|
59
|
-
if (configId && configId !== 'new') {
|
|
60
|
-
this.loadConfig(configId);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
async loadConfig(id) {
|
|
65
|
-
this.isLoading.set(true);
|
|
66
|
-
try {
|
|
67
|
-
const response = await this.configService.findByIdAsync(id);
|
|
68
|
-
if (response.success && response.data) {
|
|
69
|
-
const config = response.data;
|
|
70
|
-
this.existingConfig.set(config);
|
|
71
|
-
this.formModel.update((m) => ({
|
|
72
|
-
...m,
|
|
73
|
-
id: config.id,
|
|
74
|
-
name: config.name,
|
|
75
|
-
storage: config.storage,
|
|
76
|
-
isActive: config.isActive ?? true,
|
|
77
|
-
isDefault: config.isDefault ?? false,
|
|
78
|
-
...this.extractProviderConfig(config),
|
|
79
|
-
}));
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
this.showError(this.translateService.translate('storage.config.load.config.failed'));
|
|
84
|
-
this.navigateTo(['/storage/configs']);
|
|
85
|
-
}
|
|
86
|
-
finally {
|
|
87
|
-
this.isLoading.set(false);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
async onSubmit() {
|
|
91
|
-
if (!this.isFormValid())
|
|
92
|
-
return;
|
|
93
|
-
this.isLoading.set(true);
|
|
94
|
-
try {
|
|
95
|
-
const formValue = this.formModel();
|
|
96
|
-
const config = this.buildProviderConfig(formValue);
|
|
97
|
-
if (this.isEditMode()) {
|
|
98
|
-
await this.configService.updateAsync({
|
|
99
|
-
id: formValue.id,
|
|
100
|
-
name: formValue.name,
|
|
101
|
-
storage: formValue.storage,
|
|
102
|
-
config,
|
|
103
|
-
isActive: formValue.isActive,
|
|
104
|
-
isDefault: formValue.isDefault,
|
|
105
|
-
});
|
|
106
|
-
this.showSuccess(this.translateService.translate('storage.config.update.success'));
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
await this.configService.insertAsync({
|
|
110
|
-
name: formValue.name,
|
|
111
|
-
storage: formValue.storage,
|
|
112
|
-
config,
|
|
113
|
-
isActive: formValue.isActive,
|
|
114
|
-
isDefault: formValue.isDefault,
|
|
115
|
-
});
|
|
116
|
-
this.showSuccess(this.translateService.translate('storage.config.create.success'));
|
|
117
|
-
}
|
|
118
|
-
this.navigateTo(['/storage/configs']);
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
const action = this.isEditMode() ? 'update' : 'create';
|
|
122
|
-
this.showError(this.translateService.translate(`storage.config.${action}.failed`));
|
|
123
|
-
}
|
|
124
|
-
finally {
|
|
125
|
-
this.isLoading.set(false);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
onCancel() {
|
|
129
|
-
this.navigateTo(['/storage/configs']);
|
|
130
|
-
}
|
|
131
|
-
extractProviderConfig(config) {
|
|
132
|
-
const c = config.config ?? {};
|
|
133
|
-
switch (config.storage) {
|
|
134
|
-
case FileLocationEnum.AWS:
|
|
135
|
-
return {
|
|
136
|
-
awsRegion: c['region'] || '',
|
|
137
|
-
awsBucket: c['bucket'] || '',
|
|
138
|
-
awsAccessKeyId: c['accessKeyId'] || '',
|
|
139
|
-
awsSecretAccessKey: c['secretAccessKey'] || '',
|
|
140
|
-
awsEndpoint: c['endpoint'] || '',
|
|
141
|
-
};
|
|
142
|
-
case FileLocationEnum.AZURE:
|
|
143
|
-
return {
|
|
144
|
-
azureAccountName: c['accountName'] || '',
|
|
145
|
-
azureAccountKey: c['accountKey'] || '',
|
|
146
|
-
azureContainerName: c['containerName'] || '',
|
|
147
|
-
};
|
|
148
|
-
case FileLocationEnum.SFTP:
|
|
149
|
-
return {
|
|
150
|
-
sftpHost: c['host'] || '',
|
|
151
|
-
sftpPort: (c['port'] || 22).toString(),
|
|
152
|
-
sftpUsername: c['username'] || '',
|
|
153
|
-
sftpPassword: c['password'] || '',
|
|
154
|
-
sftpBasePath: c['basePath'] || '',
|
|
155
|
-
};
|
|
156
|
-
case FileLocationEnum.LOCAL:
|
|
157
|
-
return { localBasePath: c['basePath'] || '' };
|
|
158
|
-
default:
|
|
159
|
-
return {};
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
buildProviderConfig(formValue) {
|
|
163
|
-
switch (formValue.storage) {
|
|
164
|
-
case FileLocationEnum.AWS:
|
|
165
|
-
return {
|
|
166
|
-
region: formValue.awsRegion,
|
|
167
|
-
bucket: formValue.awsBucket,
|
|
168
|
-
accessKeyId: formValue.awsAccessKeyId,
|
|
169
|
-
secretAccessKey: formValue.awsSecretAccessKey,
|
|
170
|
-
...(formValue.awsEndpoint && { endpoint: formValue.awsEndpoint }),
|
|
171
|
-
};
|
|
172
|
-
case FileLocationEnum.AZURE:
|
|
173
|
-
return {
|
|
174
|
-
accountName: formValue.azureAccountName,
|
|
175
|
-
accountKey: formValue.azureAccountKey,
|
|
176
|
-
containerName: formValue.azureContainerName,
|
|
177
|
-
};
|
|
178
|
-
case FileLocationEnum.SFTP:
|
|
179
|
-
return {
|
|
180
|
-
host: formValue.sftpHost,
|
|
181
|
-
port: formValue.sftpPort ? parseInt(formValue.sftpPort, 10) : 22,
|
|
182
|
-
username: formValue.sftpUsername,
|
|
183
|
-
password: formValue.sftpPassword,
|
|
184
|
-
basePath: formValue.sftpBasePath,
|
|
185
|
-
};
|
|
186
|
-
case FileLocationEnum.LOCAL:
|
|
187
|
-
return { basePath: formValue.localBasePath };
|
|
188
|
-
default:
|
|
189
|
-
return {};
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: StorageConfigFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
193
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: StorageConfigFormComponent, isStandalone: true, selector: "lib-storage-config-form", usesInheritance: true, ngImport: i0, template: `
|
|
194
|
-
<div class="card">
|
|
195
|
-
<h3 class="text-lg sm:text-xl font-semibold mb-4">
|
|
196
|
-
{{ (isEditMode() ? 'storage.config.edit.config' : 'storage.config.new.config') | translate }}
|
|
197
|
-
</h3>
|
|
198
|
-
@if (showCompanyInfo()) {
|
|
199
|
-
<p class="text-sm text-muted-color mb-4">{{ 'storage.company' | translate }}: {{ currentCompanyName() }}</p>
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
<form (ngSubmit)="onSubmit()">
|
|
203
|
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
204
|
-
<div class="field">
|
|
205
|
-
<label for="name" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.config.name.required' | translate }}</label>
|
|
206
|
-
<input pInputText id="name" [formField]="configForm.name" [placeholder]="'storage.config.config.name.placeholder' | translate" class="w-full" />
|
|
207
|
-
</div>
|
|
208
|
-
|
|
209
|
-
<div class="field">
|
|
210
|
-
<label for="storage" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.provider.required' | translate }}</label>
|
|
211
|
-
<select id="storage" class="p-select-native w-full" [formField]="configForm.storage">
|
|
212
|
-
@for (provider of storageProviderOptions; track provider.value) {
|
|
213
|
-
<option [value]="provider.value">{{ provider.labelKey | translate }}</option>
|
|
214
|
-
}
|
|
215
|
-
</select>
|
|
216
|
-
</div>
|
|
217
|
-
|
|
218
|
-
<div class="field flex items-center gap-2">
|
|
219
|
-
<p-toggleswitch [formField]="configForm.isActive" />
|
|
220
|
-
<label class="text-sm sm:text-base">{{ 'storage.active' | translate }}</label>
|
|
221
|
-
</div>
|
|
222
|
-
|
|
223
|
-
<div class="field flex items-center gap-2">
|
|
224
|
-
<p-toggleswitch [formField]="configForm.isDefault" />
|
|
225
|
-
<label class="text-sm sm:text-base">{{ 'storage.set.as.default' | translate }}</label>
|
|
226
|
-
</div>
|
|
227
|
-
</div>
|
|
228
|
-
|
|
229
|
-
@if (selectedProvider() === fileLocationEnum.AWS) {
|
|
230
|
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface">
|
|
231
|
-
<div class="md:col-span-2 mb-2">
|
|
232
|
-
<span class="text-sm font-semibold text-muted-color uppercase tracking-wide">{{ 'storage.aws.title' | translate }}</span>
|
|
233
|
-
</div>
|
|
234
|
-
<div class="field">
|
|
235
|
-
<label for="awsRegion" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.region.required' | translate }}</label>
|
|
236
|
-
<input pInputText id="awsRegion" [formField]="configForm.awsRegion" [placeholder]="'storage.aws.region.placeholder' | translate" class="w-full" />
|
|
237
|
-
</div>
|
|
238
|
-
<div class="field">
|
|
239
|
-
<label for="awsBucket" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.bucket.required' | translate }}</label>
|
|
240
|
-
<input pInputText id="awsBucket" [formField]="configForm.awsBucket" [placeholder]="'storage.aws.bucket.placeholder' | translate" class="w-full" />
|
|
241
|
-
</div>
|
|
242
|
-
<div class="field">
|
|
243
|
-
<label for="awsAccessKeyId" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.access.key.required' | translate }}</label>
|
|
244
|
-
<input pInputText id="awsAccessKeyId" [formField]="configForm.awsAccessKeyId" class="w-full" />
|
|
245
|
-
</div>
|
|
246
|
-
<div class="field">
|
|
247
|
-
<label for="awsSecretAccessKey" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.secret.key.required' | translate }}</label>
|
|
248
|
-
<input type="password" pInputText id="awsSecretAccessKey" [formField]="configForm.awsSecretAccessKey" class="w-full" />
|
|
249
|
-
</div>
|
|
250
|
-
<div class="field md:col-span-2">
|
|
251
|
-
<label for="awsEndpoint" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.endpoint.optional' | translate }}</label>
|
|
252
|
-
<input pInputText id="awsEndpoint" [formField]="configForm.awsEndpoint" [placeholder]="'storage.config.endpoint.placeholder' | translate" class="w-full" />
|
|
253
|
-
</div>
|
|
254
|
-
</div>
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
@if (selectedProvider() === fileLocationEnum.AZURE) {
|
|
258
|
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface">
|
|
259
|
-
<div class="md:col-span-2 mb-2">
|
|
260
|
-
<span class="text-sm font-semibold text-muted-color uppercase tracking-wide">{{ 'storage.azure.title' | translate }}</span>
|
|
261
|
-
</div>
|
|
262
|
-
<div class="field">
|
|
263
|
-
<label for="azureAccountName" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.azure.account.name.required' | translate }}</label>
|
|
264
|
-
<input pInputText id="azureAccountName" [formField]="configForm.azureAccountName" class="w-full" />
|
|
265
|
-
</div>
|
|
266
|
-
<div class="field">
|
|
267
|
-
<label for="azureContainerName" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.azure.container.name.required' | translate }}</label>
|
|
268
|
-
<input pInputText id="azureContainerName" [formField]="configForm.azureContainerName" class="w-full" />
|
|
269
|
-
</div>
|
|
270
|
-
<div class="field md:col-span-2">
|
|
271
|
-
<label for="azureAccountKey" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.azure.account.key.required' | translate }}</label>
|
|
272
|
-
<input type="password" pInputText id="azureAccountKey" [formField]="configForm.azureAccountKey" class="w-full" />
|
|
273
|
-
</div>
|
|
274
|
-
</div>
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
@if (selectedProvider() === fileLocationEnum.SFTP) {
|
|
278
|
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface">
|
|
279
|
-
<div class="md:col-span-2 mb-2">
|
|
280
|
-
<span class="text-sm font-semibold text-muted-color uppercase tracking-wide">{{ 'storage.sftp.title' | translate }}</span>
|
|
281
|
-
</div>
|
|
282
|
-
<div class="field">
|
|
283
|
-
<label for="sftpHost" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.sftp.host.required' | translate }}</label>
|
|
284
|
-
<input pInputText id="sftpHost" [formField]="configForm.sftpHost" [placeholder]="'storage.sftp.host.placeholder' | translate" class="w-full" />
|
|
285
|
-
</div>
|
|
286
|
-
<div class="field">
|
|
287
|
-
<label for="sftpPort" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.sftp.port.required' | translate }}</label>
|
|
288
|
-
<input type="number" pInputText id="sftpPort" [formField]="configForm.sftpPort" [placeholder]="'storage.sftp.port.placeholder' | translate" class="w-full" />
|
|
289
|
-
</div>
|
|
290
|
-
<div class="field">
|
|
291
|
-
<label for="sftpUsername" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.sftp.username.required' | translate }}</label>
|
|
292
|
-
<input pInputText id="sftpUsername" [formField]="configForm.sftpUsername" class="w-full" />
|
|
293
|
-
</div>
|
|
294
|
-
<div class="field">
|
|
295
|
-
<label for="sftpPassword" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.sftp.password.required' | translate }}</label>
|
|
296
|
-
<input type="password" pInputText id="sftpPassword" [formField]="configForm.sftpPassword" class="w-full" />
|
|
297
|
-
</div>
|
|
298
|
-
<div class="field md:col-span-2">
|
|
299
|
-
<label for="sftpBasePath" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.sftp.base.path.required' | translate }}</label>
|
|
300
|
-
<input pInputText id="sftpBasePath" [formField]="configForm.sftpBasePath" [placeholder]="'storage.sftp.base.path.placeholder' | translate" class="w-full" />
|
|
301
|
-
</div>
|
|
302
|
-
</div>
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
@if (selectedProvider() === fileLocationEnum.LOCAL) {
|
|
306
|
-
<div class="grid grid-cols-1 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface">
|
|
307
|
-
<div class="mb-2">
|
|
308
|
-
<span class="text-sm font-semibold text-muted-color uppercase tracking-wide">{{ 'storage.local.title' | translate }}</span>
|
|
309
|
-
</div>
|
|
310
|
-
<div class="field">
|
|
311
|
-
<label for="localBasePath" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.local.base.path.required' | translate }}</label>
|
|
312
|
-
<input pInputText id="localBasePath" [formField]="configForm.localBasePath" [placeholder]="'storage.local.base.path.placeholder' | translate" class="w-full" />
|
|
313
|
-
</div>
|
|
314
|
-
</div>
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
<div class="flex justify-end gap-2 mt-4">
|
|
318
|
-
<p-button [label]="'shared.cancel' | translate" severity="secondary" [outlined]="true" (onClick)="onCancel()" />
|
|
319
|
-
<p-button type="submit" [label]="(isEditMode() ? 'shared.update' : 'shared.create') | translate" [loading]="isLoading()" [disabled]="!isFormValid() || isLoading()" />
|
|
320
|
-
</div>
|
|
321
|
-
</form>
|
|
322
|
-
</div>
|
|
323
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PrimeModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: i4.ToggleSwitch, selector: "p-toggleswitch, p-toggleSwitch, p-toggle-switch", inputs: ["styleClass", "tabindex", "inputId", "readonly", "trueValue", "falseValue", "ariaLabel", "size", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
324
|
-
}
|
|
325
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: StorageConfigFormComponent, decorators: [{
|
|
326
|
-
type: Component,
|
|
327
|
-
args: [{
|
|
328
|
-
selector: 'lib-storage-config-form',
|
|
329
|
-
imports: [AngularModule, PrimeModule, FormField, TranslatePipe],
|
|
330
|
-
template: `
|
|
331
|
-
<div class="card">
|
|
332
|
-
<h3 class="text-lg sm:text-xl font-semibold mb-4">
|
|
333
|
-
{{ (isEditMode() ? 'storage.config.edit.config' : 'storage.config.new.config') | translate }}
|
|
334
|
-
</h3>
|
|
335
|
-
@if (showCompanyInfo()) {
|
|
336
|
-
<p class="text-sm text-muted-color mb-4">{{ 'storage.company' | translate }}: {{ currentCompanyName() }}</p>
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
<form (ngSubmit)="onSubmit()">
|
|
340
|
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
341
|
-
<div class="field">
|
|
342
|
-
<label for="name" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.config.name.required' | translate }}</label>
|
|
343
|
-
<input pInputText id="name" [formField]="configForm.name" [placeholder]="'storage.config.config.name.placeholder' | translate" class="w-full" />
|
|
344
|
-
</div>
|
|
345
|
-
|
|
346
|
-
<div class="field">
|
|
347
|
-
<label for="storage" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.provider.required' | translate }}</label>
|
|
348
|
-
<select id="storage" class="p-select-native w-full" [formField]="configForm.storage">
|
|
349
|
-
@for (provider of storageProviderOptions; track provider.value) {
|
|
350
|
-
<option [value]="provider.value">{{ provider.labelKey | translate }}</option>
|
|
351
|
-
}
|
|
352
|
-
</select>
|
|
353
|
-
</div>
|
|
354
|
-
|
|
355
|
-
<div class="field flex items-center gap-2">
|
|
356
|
-
<p-toggleswitch [formField]="configForm.isActive" />
|
|
357
|
-
<label class="text-sm sm:text-base">{{ 'storage.active' | translate }}</label>
|
|
358
|
-
</div>
|
|
359
|
-
|
|
360
|
-
<div class="field flex items-center gap-2">
|
|
361
|
-
<p-toggleswitch [formField]="configForm.isDefault" />
|
|
362
|
-
<label class="text-sm sm:text-base">{{ 'storage.set.as.default' | translate }}</label>
|
|
363
|
-
</div>
|
|
364
|
-
</div>
|
|
365
|
-
|
|
366
|
-
@if (selectedProvider() === fileLocationEnum.AWS) {
|
|
367
|
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface">
|
|
368
|
-
<div class="md:col-span-2 mb-2">
|
|
369
|
-
<span class="text-sm font-semibold text-muted-color uppercase tracking-wide">{{ 'storage.aws.title' | translate }}</span>
|
|
370
|
-
</div>
|
|
371
|
-
<div class="field">
|
|
372
|
-
<label for="awsRegion" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.region.required' | translate }}</label>
|
|
373
|
-
<input pInputText id="awsRegion" [formField]="configForm.awsRegion" [placeholder]="'storage.aws.region.placeholder' | translate" class="w-full" />
|
|
374
|
-
</div>
|
|
375
|
-
<div class="field">
|
|
376
|
-
<label for="awsBucket" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.bucket.required' | translate }}</label>
|
|
377
|
-
<input pInputText id="awsBucket" [formField]="configForm.awsBucket" [placeholder]="'storage.aws.bucket.placeholder' | translate" class="w-full" />
|
|
378
|
-
</div>
|
|
379
|
-
<div class="field">
|
|
380
|
-
<label for="awsAccessKeyId" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.access.key.required' | translate }}</label>
|
|
381
|
-
<input pInputText id="awsAccessKeyId" [formField]="configForm.awsAccessKeyId" class="w-full" />
|
|
382
|
-
</div>
|
|
383
|
-
<div class="field">
|
|
384
|
-
<label for="awsSecretAccessKey" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.secret.key.required' | translate }}</label>
|
|
385
|
-
<input type="password" pInputText id="awsSecretAccessKey" [formField]="configForm.awsSecretAccessKey" class="w-full" />
|
|
386
|
-
</div>
|
|
387
|
-
<div class="field md:col-span-2">
|
|
388
|
-
<label for="awsEndpoint" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.config.endpoint.optional' | translate }}</label>
|
|
389
|
-
<input pInputText id="awsEndpoint" [formField]="configForm.awsEndpoint" [placeholder]="'storage.config.endpoint.placeholder' | translate" class="w-full" />
|
|
390
|
-
</div>
|
|
391
|
-
</div>
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
@if (selectedProvider() === fileLocationEnum.AZURE) {
|
|
395
|
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface">
|
|
396
|
-
<div class="md:col-span-2 mb-2">
|
|
397
|
-
<span class="text-sm font-semibold text-muted-color uppercase tracking-wide">{{ 'storage.azure.title' | translate }}</span>
|
|
398
|
-
</div>
|
|
399
|
-
<div class="field">
|
|
400
|
-
<label for="azureAccountName" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.azure.account.name.required' | translate }}</label>
|
|
401
|
-
<input pInputText id="azureAccountName" [formField]="configForm.azureAccountName" class="w-full" />
|
|
402
|
-
</div>
|
|
403
|
-
<div class="field">
|
|
404
|
-
<label for="azureContainerName" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.azure.container.name.required' | translate }}</label>
|
|
405
|
-
<input pInputText id="azureContainerName" [formField]="configForm.azureContainerName" class="w-full" />
|
|
406
|
-
</div>
|
|
407
|
-
<div class="field md:col-span-2">
|
|
408
|
-
<label for="azureAccountKey" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.azure.account.key.required' | translate }}</label>
|
|
409
|
-
<input type="password" pInputText id="azureAccountKey" [formField]="configForm.azureAccountKey" class="w-full" />
|
|
410
|
-
</div>
|
|
411
|
-
</div>
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
@if (selectedProvider() === fileLocationEnum.SFTP) {
|
|
415
|
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface">
|
|
416
|
-
<div class="md:col-span-2 mb-2">
|
|
417
|
-
<span class="text-sm font-semibold text-muted-color uppercase tracking-wide">{{ 'storage.sftp.title' | translate }}</span>
|
|
418
|
-
</div>
|
|
419
|
-
<div class="field">
|
|
420
|
-
<label for="sftpHost" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.sftp.host.required' | translate }}</label>
|
|
421
|
-
<input pInputText id="sftpHost" [formField]="configForm.sftpHost" [placeholder]="'storage.sftp.host.placeholder' | translate" class="w-full" />
|
|
422
|
-
</div>
|
|
423
|
-
<div class="field">
|
|
424
|
-
<label for="sftpPort" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.sftp.port.required' | translate }}</label>
|
|
425
|
-
<input type="number" pInputText id="sftpPort" [formField]="configForm.sftpPort" [placeholder]="'storage.sftp.port.placeholder' | translate" class="w-full" />
|
|
426
|
-
</div>
|
|
427
|
-
<div class="field">
|
|
428
|
-
<label for="sftpUsername" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.sftp.username.required' | translate }}</label>
|
|
429
|
-
<input pInputText id="sftpUsername" [formField]="configForm.sftpUsername" class="w-full" />
|
|
430
|
-
</div>
|
|
431
|
-
<div class="field">
|
|
432
|
-
<label for="sftpPassword" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.sftp.password.required' | translate }}</label>
|
|
433
|
-
<input type="password" pInputText id="sftpPassword" [formField]="configForm.sftpPassword" class="w-full" />
|
|
434
|
-
</div>
|
|
435
|
-
<div class="field md:col-span-2">
|
|
436
|
-
<label for="sftpBasePath" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.sftp.base.path.required' | translate }}</label>
|
|
437
|
-
<input pInputText id="sftpBasePath" [formField]="configForm.sftpBasePath" [placeholder]="'storage.sftp.base.path.placeholder' | translate" class="w-full" />
|
|
438
|
-
</div>
|
|
439
|
-
</div>
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
@if (selectedProvider() === fileLocationEnum.LOCAL) {
|
|
443
|
-
<div class="grid grid-cols-1 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface">
|
|
444
|
-
<div class="mb-2">
|
|
445
|
-
<span class="text-sm font-semibold text-muted-color uppercase tracking-wide">{{ 'storage.local.title' | translate }}</span>
|
|
446
|
-
</div>
|
|
447
|
-
<div class="field">
|
|
448
|
-
<label for="localBasePath" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.local.base.path.required' | translate }}</label>
|
|
449
|
-
<input pInputText id="localBasePath" [formField]="configForm.localBasePath" [placeholder]="'storage.local.base.path.placeholder' | translate" class="w-full" />
|
|
450
|
-
</div>
|
|
451
|
-
</div>
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
<div class="flex justify-end gap-2 mt-4">
|
|
455
|
-
<p-button [label]="'shared.cancel' | translate" severity="secondary" [outlined]="true" (onClick)="onCancel()" />
|
|
456
|
-
<p-button type="submit" [label]="(isEditMode() ? 'shared.update' : 'shared.create') | translate" [loading]="isLoading()" [disabled]="!isFormValid() || isLoading()" />
|
|
457
|
-
</div>
|
|
458
|
-
</form>
|
|
459
|
-
</div>
|
|
460
|
-
`,
|
|
461
|
-
}]
|
|
462
|
-
}], ctorParameters: () => [] });
|
|
463
|
-
|
|
464
|
-
export { StorageConfigFormComponent };
|
|
465
|
-
//# sourceMappingURL=flusys-ng-storage-storage-config-form.component-a88XhuPH.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-storage-storage-config-form.component-a88XhuPH.mjs","sources":["../../../projects/ng-storage/pages/storage-config/storage-config-form.component.ts"],"sourcesContent":["import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { TranslateService } from '@flusys/ng-localization';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { FileLocationEnum } from '../../enums/file-location.enum';\nimport { IStorageConfig } from '../../interfaces/storage-config.interface';\nimport { StorageConfigApiService } from '../../services/storage-config-api.service';\nimport { BaseStoragePage } from '../../utils/base-storage-page';\nimport { STORAGE_PROVIDER_OPTIONS } from '../../utils/storage-utils';\n\ninterface IStorageConfigFormModel {\n id: string;\n name: string;\n storage: FileLocationEnum;\n isActive: boolean;\n isDefault: boolean;\n awsRegion: string;\n awsBucket: string;\n awsAccessKeyId: string;\n awsSecretAccessKey: string;\n awsEndpoint: string;\n azureAccountName: string;\n azureAccountKey: string;\n azureContainerName: string;\n sftpHost: string;\n sftpPort: string;\n sftpUsername: string;\n sftpPassword: string;\n sftpBasePath: string;\n localBasePath: string;\n}\n\nconst DEFAULT_FORM_MODEL: IStorageConfigFormModel = {\n id: '',\n name: '',\n storage: FileLocationEnum.AWS,\n isActive: true,\n isDefault: false,\n awsRegion: '',\n awsBucket: '',\n awsAccessKeyId: '',\n awsSecretAccessKey: '',\n awsEndpoint: '',\n azureAccountName: '',\n azureAccountKey: '',\n azureContainerName: '',\n sftpHost: '',\n sftpPort: '22',\n sftpUsername: '',\n sftpPassword: '',\n sftpBasePath: '',\n localBasePath: '',\n};\n\n@Component({\n selector: 'lib-storage-config-form',\n imports: [AngularModule, PrimeModule, FormField, TranslatePipe],\n template: `\n <div class=\"card\">\n <h3 class=\"text-lg sm:text-xl font-semibold mb-4\">\n {{ (isEditMode() ? 'storage.config.edit.config' : 'storage.config.new.config') | translate }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mb-4\">{{ 'storage.company' | translate }}: {{ currentCompanyName() }}</p>\n }\n\n <form (ngSubmit)=\"onSubmit()\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"field\">\n <label for=\"name\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.config.config.name.required' | translate }}</label>\n <input pInputText id=\"name\" [formField]=\"configForm.name\" [placeholder]=\"'storage.config.config.name.placeholder' | translate\" class=\"w-full\" />\n </div>\n\n <div class=\"field\">\n <label for=\"storage\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.config.provider.required' | translate }}</label>\n <select id=\"storage\" class=\"p-select-native w-full\" [formField]=\"configForm.storage\">\n @for (provider of storageProviderOptions; track provider.value) {\n <option [value]=\"provider.value\">{{ provider.labelKey | translate }}</option>\n }\n </select>\n </div>\n\n <div class=\"field flex items-center gap-2\">\n <p-toggleswitch [formField]=\"configForm.isActive\" />\n <label class=\"text-sm sm:text-base\">{{ 'storage.active' | translate }}</label>\n </div>\n\n <div class=\"field flex items-center gap-2\">\n <p-toggleswitch [formField]=\"configForm.isDefault\" />\n <label class=\"text-sm sm:text-base\">{{ 'storage.set.as.default' | translate }}</label>\n </div>\n </div>\n\n @if (selectedProvider() === fileLocationEnum.AWS) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface\">\n <div class=\"md:col-span-2 mb-2\">\n <span class=\"text-sm font-semibold text-muted-color uppercase tracking-wide\">{{ 'storage.aws.title' | translate }}</span>\n </div>\n <div class=\"field\">\n <label for=\"awsRegion\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.config.region.required' | translate }}</label>\n <input pInputText id=\"awsRegion\" [formField]=\"configForm.awsRegion\" [placeholder]=\"'storage.aws.region.placeholder' | translate\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"awsBucket\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.config.bucket.required' | translate }}</label>\n <input pInputText id=\"awsBucket\" [formField]=\"configForm.awsBucket\" [placeholder]=\"'storage.aws.bucket.placeholder' | translate\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"awsAccessKeyId\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.config.access.key.required' | translate }}</label>\n <input pInputText id=\"awsAccessKeyId\" [formField]=\"configForm.awsAccessKeyId\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"awsSecretAccessKey\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.config.secret.key.required' | translate }}</label>\n <input type=\"password\" pInputText id=\"awsSecretAccessKey\" [formField]=\"configForm.awsSecretAccessKey\" class=\"w-full\" />\n </div>\n <div class=\"field md:col-span-2\">\n <label for=\"awsEndpoint\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.config.endpoint.optional' | translate }}</label>\n <input pInputText id=\"awsEndpoint\" [formField]=\"configForm.awsEndpoint\" [placeholder]=\"'storage.config.endpoint.placeholder' | translate\" class=\"w-full\" />\n </div>\n </div>\n }\n\n @if (selectedProvider() === fileLocationEnum.AZURE) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface\">\n <div class=\"md:col-span-2 mb-2\">\n <span class=\"text-sm font-semibold text-muted-color uppercase tracking-wide\">{{ 'storage.azure.title' | translate }}</span>\n </div>\n <div class=\"field\">\n <label for=\"azureAccountName\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.azure.account.name.required' | translate }}</label>\n <input pInputText id=\"azureAccountName\" [formField]=\"configForm.azureAccountName\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"azureContainerName\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.azure.container.name.required' | translate }}</label>\n <input pInputText id=\"azureContainerName\" [formField]=\"configForm.azureContainerName\" class=\"w-full\" />\n </div>\n <div class=\"field md:col-span-2\">\n <label for=\"azureAccountKey\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.azure.account.key.required' | translate }}</label>\n <input type=\"password\" pInputText id=\"azureAccountKey\" [formField]=\"configForm.azureAccountKey\" class=\"w-full\" />\n </div>\n </div>\n }\n\n @if (selectedProvider() === fileLocationEnum.SFTP) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface\">\n <div class=\"md:col-span-2 mb-2\">\n <span class=\"text-sm font-semibold text-muted-color uppercase tracking-wide\">{{ 'storage.sftp.title' | translate }}</span>\n </div>\n <div class=\"field\">\n <label for=\"sftpHost\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.sftp.host.required' | translate }}</label>\n <input pInputText id=\"sftpHost\" [formField]=\"configForm.sftpHost\" [placeholder]=\"'storage.sftp.host.placeholder' | translate\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"sftpPort\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.sftp.port.required' | translate }}</label>\n <input type=\"number\" pInputText id=\"sftpPort\" [formField]=\"configForm.sftpPort\" [placeholder]=\"'storage.sftp.port.placeholder' | translate\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"sftpUsername\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.sftp.username.required' | translate }}</label>\n <input pInputText id=\"sftpUsername\" [formField]=\"configForm.sftpUsername\" class=\"w-full\" />\n </div>\n <div class=\"field\">\n <label for=\"sftpPassword\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.sftp.password.required' | translate }}</label>\n <input type=\"password\" pInputText id=\"sftpPassword\" [formField]=\"configForm.sftpPassword\" class=\"w-full\" />\n </div>\n <div class=\"field md:col-span-2\">\n <label for=\"sftpBasePath\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.sftp.base.path.required' | translate }}</label>\n <input pInputText id=\"sftpBasePath\" [formField]=\"configForm.sftpBasePath\" [placeholder]=\"'storage.sftp.base.path.placeholder' | translate\" class=\"w-full\" />\n </div>\n </div>\n }\n\n @if (selectedProvider() === fileLocationEnum.LOCAL) {\n <div class=\"grid grid-cols-1 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface\">\n <div class=\"mb-2\">\n <span class=\"text-sm font-semibold text-muted-color uppercase tracking-wide\">{{ 'storage.local.title' | translate }}</span>\n </div>\n <div class=\"field\">\n <label for=\"localBasePath\" class=\"block font-medium mb-2 text-sm sm:text-base\">{{ 'storage.local.base.path.required' | translate }}</label>\n <input pInputText id=\"localBasePath\" [formField]=\"configForm.localBasePath\" [placeholder]=\"'storage.local.base.path.placeholder' | translate\" class=\"w-full\" />\n </div>\n </div>\n }\n\n <div class=\"flex justify-end gap-2 mt-4\">\n <p-button [label]=\"'shared.cancel' | translate\" severity=\"secondary\" [outlined]=\"true\" (onClick)=\"onCancel()\" />\n <p-button type=\"submit\" [label]=\"(isEditMode() ? 'shared.update' : 'shared.create') | translate\" [loading]=\"isLoading()\" [disabled]=\"!isFormValid() || isLoading()\" />\n </div>\n </form>\n </div>\n `,\n})\nexport class StorageConfigFormComponent extends BaseStoragePage {\n private readonly route = inject(ActivatedRoute);\n private readonly configService = inject(StorageConfigApiService);\n private readonly translateService = inject(TranslateService);\n private readonly routeParams = toSignal(this.route.paramMap);\n private initialized = false;\n\n readonly fileLocationEnum = FileLocationEnum;\n readonly storageProviderOptions = STORAGE_PROVIDER_OPTIONS;\n\n readonly existingConfig = signal<IStorageConfig | null>(null);\n readonly isEditMode = computed(() => !!this.existingConfig());\n readonly formModel = signal<IStorageConfigFormModel>({ ...DEFAULT_FORM_MODEL });\n\n readonly configForm = form(this.formModel, (f) => {\n required(f.name, { message: this.translateService.translate('storage.validation.config.name.required') });\n });\n\n readonly selectedProvider = computed(() => this.formModel().storage);\n readonly isFormValid = computed(() => this.formModel().name.trim().length > 0);\n\n constructor() {\n super();\n effect(() => {\n const params = this.routeParams();\n if (!params || this.initialized) return;\n\n this.initialized = true;\n const configId = params.get('id');\n if (configId && configId !== 'new') {\n this.loadConfig(configId);\n }\n });\n }\n\n async loadConfig(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.configService.findByIdAsync(id);\n if (response.success && response.data) {\n const config = response.data;\n this.existingConfig.set(config);\n this.formModel.update((m) => ({\n ...m,\n id: config.id,\n name: config.name,\n storage: config.storage,\n isActive: config.isActive ?? true,\n isDefault: config.isDefault ?? false,\n ...this.extractProviderConfig(config),\n }));\n }\n } catch {\n this.showError(this.translateService.translate('storage.config.load.config.failed'));\n this.navigateTo(['/storage/configs']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) return;\n\n this.isLoading.set(true);\n try {\n const formValue = this.formModel();\n const config = this.buildProviderConfig(formValue);\n\n if (this.isEditMode()) {\n await this.configService.updateAsync({\n id: formValue.id,\n name: formValue.name,\n storage: formValue.storage,\n config,\n isActive: formValue.isActive,\n isDefault: formValue.isDefault,\n });\n this.showSuccess(this.translateService.translate('storage.config.update.success'));\n } else {\n await this.configService.insertAsync({\n name: formValue.name,\n storage: formValue.storage,\n config,\n isActive: formValue.isActive,\n isDefault: formValue.isDefault,\n });\n this.showSuccess(this.translateService.translate('storage.config.create.success'));\n }\n this.navigateTo(['/storage/configs']);\n } catch {\n const action = this.isEditMode() ? 'update' : 'create';\n this.showError(this.translateService.translate(`storage.config.${action}.failed`));\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.navigateTo(['/storage/configs']);\n }\n\n private extractProviderConfig(config: IStorageConfig): Partial<IStorageConfigFormModel> {\n const c = config.config ?? {};\n switch (config.storage) {\n case FileLocationEnum.AWS:\n return {\n awsRegion: (c['region'] as string) || '',\n awsBucket: (c['bucket'] as string) || '',\n awsAccessKeyId: (c['accessKeyId'] as string) || '',\n awsSecretAccessKey: (c['secretAccessKey'] as string) || '',\n awsEndpoint: (c['endpoint'] as string) || '',\n };\n case FileLocationEnum.AZURE:\n return {\n azureAccountName: (c['accountName'] as string) || '',\n azureAccountKey: (c['accountKey'] as string) || '',\n azureContainerName: (c['containerName'] as string) || '',\n };\n case FileLocationEnum.SFTP:\n return {\n sftpHost: (c['host'] as string) || '',\n sftpPort: ((c['port'] as number) || 22).toString(),\n sftpUsername: (c['username'] as string) || '',\n sftpPassword: (c['password'] as string) || '',\n sftpBasePath: (c['basePath'] as string) || '',\n };\n case FileLocationEnum.LOCAL:\n return { localBasePath: (c['basePath'] as string) || '' };\n default:\n return {};\n }\n }\n\n private buildProviderConfig(formValue: IStorageConfigFormModel): Record<string, unknown> {\n switch (formValue.storage) {\n case FileLocationEnum.AWS:\n return {\n region: formValue.awsRegion,\n bucket: formValue.awsBucket,\n accessKeyId: formValue.awsAccessKeyId,\n secretAccessKey: formValue.awsSecretAccessKey,\n ...(formValue.awsEndpoint && { endpoint: formValue.awsEndpoint }),\n };\n case FileLocationEnum.AZURE:\n return {\n accountName: formValue.azureAccountName,\n accountKey: formValue.azureAccountKey,\n containerName: formValue.azureContainerName,\n };\n case FileLocationEnum.SFTP:\n return {\n host: formValue.sftpHost,\n port: formValue.sftpPort ? parseInt(formValue.sftpPort, 10) : 22,\n username: formValue.sftpUsername,\n password: formValue.sftpPassword,\n basePath: formValue.sftpBasePath,\n };\n case FileLocationEnum.LOCAL:\n return { basePath: formValue.localBasePath };\n default:\n return {};\n }\n }\n}\n"],"names":["i2"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-storage-storage-config-list.component-DBH_qf9o.mjs","sources":["../../../projects/ng-storage/pages/storage-config/storage-config-list.component.ts"],"sourcesContent":["import { Component, inject } from '@angular/core';\nimport { TranslateService } from '@flusys/ng-localization';\nimport { AngularModule, HasPermissionDirective, PrimeModule, STORAGE_CONFIG_PERMISSIONS, TranslatePipe } from '@flusys/ng-shared';\nimport { firstValueFrom } from 'rxjs';\nimport { IStorageConfig } from '../../interfaces/storage-config.interface';\nimport { StorageConfigApiService } from '../../services/storage-config-api.service';\nimport { BaseStorageListPage } from '../../utils/base-storage-page';\nimport { getProviderIcon, getProviderLabelKey, getProviderSeverity } from '../../utils/storage-utils';\n\n@Component({\n selector: 'lib-storage-config-list',\n imports: [AngularModule, PrimeModule, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"card\">\n <div class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4\">\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold\">{{ 'storage.config.title' | translate }}</h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">{{ 'storage.company' | translate }}: {{ currentCompanyName() }}</p>\n }\n </div>\n <p-button *hasPermission=\"STORAGE_CONFIG_PERMISSIONS.CREATE\" [label]=\"'storage.button.new.configuration' | translate\" icon=\"pi pi-plus\" (onClick)=\"onCreate()\" styleClass=\"w-full sm:w-auto\" />\n </div>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"items()\"\n [loading]=\"isLoading()\"\n [paginator]=\"totalRecords() > 0\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-sm\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'storage.table.name' | translate }}</th>\n <th>{{ 'storage.table.provider' | translate }}</th>\n <th class=\"hidden sm:table-cell\">{{ 'storage.table.created' | translate }}</th>\n <th class=\"w-[120px]\">{{ 'storage.table.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-config>\n <tr>\n <td>\n <div class=\"flex items-center gap-2\">\n <i [class]=\"getProviderIcon(config.storage)\"></i>\n <span class=\"truncate max-w-32 sm:max-w-none\">{{ config.name }}</span>\n </div>\n </td>\n <td>\n <p-tag [value]=\"getProviderLabelKey(config.storage) | translate\" [severity]=\"getProviderSeverity(config.storage)\" />\n </td>\n <td class=\"hidden sm:table-cell\">{{ config.createdAt | date: 'short' }}</td>\n <td>\n <div class=\"flex gap-1\">\n <p-button *hasPermission=\"STORAGE_CONFIG_PERMISSIONS.UPDATE\" icon=\"pi pi-pencil\" [text]=\"true\" severity=\"secondary\" size=\"small\" (onClick)=\"onEdit(config.id)\" [pTooltip]=\"'storage.tooltip.edit' | translate\" tooltipPosition=\"top\" />\n <p-button *hasPermission=\"STORAGE_CONFIG_PERMISSIONS.DELETE\" icon=\"pi pi-trash\" [text]=\"true\" severity=\"danger\" size=\"small\" (onClick)=\"onDeleteConfig(config)\" [pTooltip]=\"'storage.tooltip.delete' | translate\" tooltipPosition=\"top\" />\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"4\" class=\"text-center py-4 text-muted-color\">\n {{ (showCompanyInfo() ? 'storage.empty.configs.in.company' : 'storage.empty.configs') | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n `,\n})\nexport class StorageConfigListComponent extends BaseStorageListPage<IStorageConfig> {\n readonly STORAGE_CONFIG_PERMISSIONS = STORAGE_CONFIG_PERMISSIONS;\n\n private readonly configService = inject(StorageConfigApiService);\n private readonly translateService = inject(TranslateService);\n\n readonly getProviderIcon = getProviderIcon;\n readonly getProviderLabelKey = getProviderLabelKey;\n readonly getProviderSeverity = getProviderSeverity;\n\n getResourceRoute(): string {\n return '/storage/configs';\n }\n\n override getDeleteConfirmMessage(config: IStorageConfig): string {\n return this.translateService.translate('storage.delete.confirm.named', { name: config.name });\n }\n\n async loadData(): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await firstValueFrom(\n this.configService.getAll('', { pagination: this.getPaginationParams() }),\n );\n if (response.success) {\n this.items.set(response.data ?? []);\n this.total.set(response.meta?.total ?? 0);\n }\n } catch {\n this.showError(this.translateService.translate('storage.config.load.failed'));\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onDeleteConfig(config: IStorageConfig): void {\n this.onDeleteAsync(\n config,\n (c) => c.id,\n (id) => this.configService.deleteAsync({ id, type: 'delete' }),\n {\n header: this.translateService.translate('storage.config.delete.title'),\n successMessage: this.translateService.translate('storage.config.delete.success'),\n errorMessage: this.translateService.translate('storage.config.delete.failed'),\n },\n );\n }\n}\n"],"names":[],"mappings":"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"}
|