@praxisui/files-upload 10.0.0-rc.34 → 10.0.0-rc.36
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.
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-10-
|
|
3
|
+
"generatedAt": "2026-10-21T13:45:30.091Z",
|
|
4
4
|
"packageName": "@praxisui/files-upload",
|
|
5
|
-
"packageVersion": "10.0.0-rc.
|
|
5
|
+
"packageVersion": "10.0.0-rc.36",
|
|
6
6
|
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
7
|
"sourceRegistryVersion": "1.0.0",
|
|
8
8
|
"componentCount": 1,
|
|
@@ -32,7 +32,7 @@ import { MatTooltipModule } from '@angular/material/tooltip';
|
|
|
32
32
|
import * as i2 from '@angular/material/snack-bar';
|
|
33
33
|
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
|
34
34
|
import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
35
|
-
import { of, throwError, BehaviorSubject, map as map$1, startWith, retry, debounceTime, from, Subscription } from 'rxjs';
|
|
35
|
+
import { of, throwError, BehaviorSubject, map as map$1, startWith, combineLatest, retry, debounceTime, from, Subscription } from 'rxjs';
|
|
36
36
|
import * as i1$3 from '@praxisui/settings-panel';
|
|
37
37
|
import { SETTINGS_PANEL_DATA } from '@praxisui/settings-panel';
|
|
38
38
|
import { map, catchError, take, concatMap, toArray, tap, filter, defaultIfEmpty } from 'rxjs/operators';
|
|
@@ -1146,6 +1146,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1146
1146
|
errorCodes = Object.values(ErrorCode);
|
|
1147
1147
|
errorEntries = [];
|
|
1148
1148
|
isDirty$ = new BehaviorSubject(false);
|
|
1149
|
+
jsonValid$ = new BehaviorSubject(true);
|
|
1149
1150
|
isValid$;
|
|
1150
1151
|
isBusy$ = new BehaviorSubject(false);
|
|
1151
1152
|
jsonError = null;
|
|
@@ -1156,6 +1157,51 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1156
1157
|
const normalized = String(code);
|
|
1157
1158
|
return this.tx(`editor.errors.${normalized}`, normalized);
|
|
1158
1159
|
}
|
|
1160
|
+
toCsvString(val) {
|
|
1161
|
+
if (Array.isArray(val)) {
|
|
1162
|
+
return val.map((item) => String(item ?? '').trim()).filter(Boolean).join(',');
|
|
1163
|
+
}
|
|
1164
|
+
return typeof val === 'string' ? val : '';
|
|
1165
|
+
}
|
|
1166
|
+
toStringArray(val) {
|
|
1167
|
+
if (Array.isArray(val)) {
|
|
1168
|
+
return val.map((item) => String(item ?? '').trim()).filter(Boolean);
|
|
1169
|
+
}
|
|
1170
|
+
if (typeof val === 'string') {
|
|
1171
|
+
return val
|
|
1172
|
+
.split(',')
|
|
1173
|
+
.map((s) => s.trim())
|
|
1174
|
+
.filter(Boolean);
|
|
1175
|
+
}
|
|
1176
|
+
return [];
|
|
1177
|
+
}
|
|
1178
|
+
normalizeIncomingPatch(raw) {
|
|
1179
|
+
if (!raw || typeof raw !== 'object')
|
|
1180
|
+
return raw;
|
|
1181
|
+
const patch = { ...raw };
|
|
1182
|
+
if (patch.ui && typeof patch.ui === 'object') {
|
|
1183
|
+
patch.ui = { ...patch.ui };
|
|
1184
|
+
if (patch.ui.accept !== undefined) {
|
|
1185
|
+
patch.ui.accept = this.toCsvString(patch.ui.accept);
|
|
1186
|
+
}
|
|
1187
|
+
if (patch.ui.list && typeof patch.ui.list === 'object') {
|
|
1188
|
+
patch.ui.list = { ...patch.ui.list };
|
|
1189
|
+
if (patch.ui.list.detailsFields !== undefined) {
|
|
1190
|
+
patch.ui.list.detailsFields = this.toCsvString(patch.ui.list.detailsFields);
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
if (patch.options && typeof patch.options === 'object') {
|
|
1195
|
+
patch.options = { ...patch.options };
|
|
1196
|
+
if (patch.options.allowedExtensions !== undefined) {
|
|
1197
|
+
patch.options.allowedExtensions = this.toCsvString(patch.options.allowedExtensions);
|
|
1198
|
+
}
|
|
1199
|
+
if (patch.options.acceptMimeTypes !== undefined) {
|
|
1200
|
+
patch.options.acceptMimeTypes = this.toCsvString(patch.options.acceptMimeTypes);
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
return patch;
|
|
1204
|
+
}
|
|
1159
1205
|
constructor(fb, panelData, snackBar, destroyRef) {
|
|
1160
1206
|
this.fb = fb;
|
|
1161
1207
|
this.panelData = panelData;
|
|
@@ -1239,7 +1285,8 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1239
1285
|
this.errorCodes.forEach((code) => {
|
|
1240
1286
|
errorsGroup.addControl(code, this.fb.control(''));
|
|
1241
1287
|
});
|
|
1242
|
-
|
|
1288
|
+
const formValid$ = this.form.statusChanges.pipe(map$1((s) => s === 'VALID'), startWith(this.form.valid));
|
|
1289
|
+
this.isValid$ = combineLatest([formValid$, this.jsonValid$]).pipe(map$1(([formValid, jsonValid]) => formValid && jsonValid));
|
|
1243
1290
|
// Definir baseUrl e inicializar hook em contexto de injeção
|
|
1244
1291
|
this.baseUrl = this.panelData?.baseUrl ?? this.panelData?.__baseUrl;
|
|
1245
1292
|
this.state = useEffectiveUploadConfig(this.baseUrl ?? '/api/files', () => this.getHeadersForFetch());
|
|
@@ -1252,39 +1299,19 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1252
1299
|
// baseUrl opcional vinda do componente pai (Settings Panel inputs)
|
|
1253
1300
|
// (já definida no construtor)
|
|
1254
1301
|
if (this.panelData) {
|
|
1255
|
-
|
|
1256
|
-
if (patch.ui?.accept) {
|
|
1257
|
-
patch.ui = { ...patch.ui, accept: patch.ui.accept.join(',') };
|
|
1258
|
-
}
|
|
1259
|
-
// Normalizar lista de detalhes para CSV
|
|
1260
|
-
if (patch.ui?.list?.detailsFields) {
|
|
1261
|
-
patch.ui = {
|
|
1262
|
-
...patch.ui,
|
|
1263
|
-
list: {
|
|
1264
|
-
...patch.ui.list,
|
|
1265
|
-
detailsFields: patch.ui.list.detailsFields.join(','),
|
|
1266
|
-
},
|
|
1267
|
-
};
|
|
1268
|
-
}
|
|
1269
|
-
if (patch.options?.allowedExtensions) {
|
|
1270
|
-
patch.options = {
|
|
1271
|
-
...patch.options,
|
|
1272
|
-
allowedExtensions: patch.options.allowedExtensions.join(','),
|
|
1273
|
-
};
|
|
1274
|
-
}
|
|
1275
|
-
if (patch.options?.acceptMimeTypes) {
|
|
1276
|
-
patch.options = {
|
|
1277
|
-
...patch.options,
|
|
1278
|
-
acceptMimeTypes: patch.options.acceptMimeTypes.join(','),
|
|
1279
|
-
};
|
|
1280
|
-
}
|
|
1281
|
-
this.form.patchValue(patch);
|
|
1302
|
+
this.form.patchValue(this.normalizeIncomingPatch(this.panelData));
|
|
1282
1303
|
}
|
|
1283
1304
|
// Sempre que cabeçalhos mudarem, atualiza contexto da consulta (e refaz fetch)
|
|
1284
1305
|
this.headersGroup.valueChanges.subscribe(() => {
|
|
1285
1306
|
this.state.refetch();
|
|
1286
1307
|
});
|
|
1287
|
-
this.form.valueChanges.subscribe(() =>
|
|
1308
|
+
this.form.valueChanges.subscribe(() => {
|
|
1309
|
+
this.isDirty$.next(true);
|
|
1310
|
+
if (this.jsonError) {
|
|
1311
|
+
this.jsonError = null;
|
|
1312
|
+
this.jsonValid$.next(true);
|
|
1313
|
+
}
|
|
1314
|
+
});
|
|
1288
1315
|
}
|
|
1289
1316
|
applyServerConfig(cfg) {
|
|
1290
1317
|
if (!cfg)
|
|
@@ -1371,10 +1398,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1371
1398
|
const accept = this.uiGroup.get('accept')?.value;
|
|
1372
1399
|
if (accept !== undefined) {
|
|
1373
1400
|
value.ui = value.ui ?? {};
|
|
1374
|
-
value.ui.accept = accept
|
|
1375
|
-
.split(',')
|
|
1376
|
-
.map((s) => s.trim())
|
|
1377
|
-
.filter((s) => !!s);
|
|
1401
|
+
value.ui.accept = this.toStringArray(accept);
|
|
1378
1402
|
}
|
|
1379
1403
|
// NOVO: detailsFields (UI)
|
|
1380
1404
|
const df = this.uiGroup.get('list')?.get('detailsFields')
|
|
@@ -1382,29 +1406,19 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1382
1406
|
if (df !== undefined) {
|
|
1383
1407
|
value.ui = value.ui ?? {};
|
|
1384
1408
|
value.ui.list = value.ui.list ?? {};
|
|
1385
|
-
value.ui.list.detailsFields = df
|
|
1386
|
-
.split(',')
|
|
1387
|
-
.map((s) => s.trim())
|
|
1388
|
-
.filter((s) => !!s);
|
|
1409
|
+
value.ui.list.detailsFields = this.toStringArray(df);
|
|
1389
1410
|
}
|
|
1390
1411
|
// options.allowedExtensions
|
|
1391
|
-
const allowedExt = this.optionsGroup.get('allowedExtensions')
|
|
1392
|
-
?.value;
|
|
1412
|
+
const allowedExt = this.optionsGroup.get('allowedExtensions')?.value;
|
|
1393
1413
|
if (allowedExt !== undefined) {
|
|
1394
1414
|
value.options = value.options ?? {};
|
|
1395
|
-
value.options.allowedExtensions = allowedExt
|
|
1396
|
-
.split(',')
|
|
1397
|
-
.map((s) => s.trim())
|
|
1398
|
-
.filter((s) => !!s);
|
|
1415
|
+
value.options.allowedExtensions = this.toStringArray(allowedExt);
|
|
1399
1416
|
}
|
|
1400
1417
|
// options.acceptMimeTypes
|
|
1401
1418
|
const mime = this.optionsGroup.get('acceptMimeTypes')?.value;
|
|
1402
1419
|
if (mime !== undefined) {
|
|
1403
1420
|
value.options = value.options ?? {};
|
|
1404
|
-
value.options.acceptMimeTypes = mime
|
|
1405
|
-
.split(',')
|
|
1406
|
-
.map((s) => s.trim())
|
|
1407
|
-
.filter((s) => !!s);
|
|
1421
|
+
value.options.acceptMimeTypes = this.toStringArray(mime);
|
|
1408
1422
|
}
|
|
1409
1423
|
return value;
|
|
1410
1424
|
}
|
|
@@ -1424,11 +1438,13 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1424
1438
|
onJsonChange(json) {
|
|
1425
1439
|
try {
|
|
1426
1440
|
const parsed = JSON.parse(json);
|
|
1427
|
-
this.form.patchValue(parsed);
|
|
1441
|
+
this.form.patchValue(this.normalizeIncomingPatch(parsed));
|
|
1428
1442
|
this.jsonError = null;
|
|
1443
|
+
this.jsonValid$.next(true);
|
|
1429
1444
|
}
|
|
1430
1445
|
catch {
|
|
1431
1446
|
this.jsonError = this.tx('editor.json.invalid', 'Invalid JSON: check the syntax.');
|
|
1447
|
+
this.jsonValid$.next(false);
|
|
1432
1448
|
this.snackBar.open(this.tx('editor.snackbar.invalidJson', 'Invalid JSON'), undefined, { duration: 2000 });
|
|
1433
1449
|
}
|
|
1434
1450
|
}
|
|
@@ -1625,7 +1641,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1625
1641
|
</section>
|
|
1626
1642
|
<section class="config-section">
|
|
1627
1643
|
<form [formGroup]="form">
|
|
1628
|
-
<mat-form-field appearance="
|
|
1644
|
+
<mat-form-field appearance="outline">
|
|
1629
1645
|
<mat-label>{{ tx('editor.behavior.strategy.label', 'Upload strategy') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1630
1646
|
<mat-select formControlName="strategy">
|
|
1631
1647
|
<mat-option value="direct">{{ tx('editor.behavior.strategy.direct', 'Direct (standard HTTP)') }}</mat-option>
|
|
@@ -1656,7 +1672,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1656
1672
|
<p class="section-note">
|
|
1657
1673
|
{{ tx('editor.behavior.bulk.note', 'Use parallelism and retries in moderation. In enterprise environments these controls affect throughput, perceived experience and backend load.') }}
|
|
1658
1674
|
</p>
|
|
1659
|
-
<mat-form-field appearance="
|
|
1675
|
+
<mat-form-field appearance="outline">
|
|
1660
1676
|
<mat-label>{{ tx('editor.behavior.bulk.parallel', 'Parallel uploads') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1661
1677
|
<input matInput type="number" formControlName="parallelUploads" />
|
|
1662
1678
|
<button
|
|
@@ -1670,7 +1686,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1670
1686
|
>
|
|
1671
1687
|
</button>
|
|
1672
1688
|
</mat-form-field>
|
|
1673
|
-
<mat-form-field appearance="
|
|
1689
|
+
<mat-form-field appearance="outline">
|
|
1674
1690
|
<mat-label>{{ tx('editor.behavior.bulk.retryCount', 'Retry count') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1675
1691
|
<input matInput type="number" formControlName="retryCount" />
|
|
1676
1692
|
<button
|
|
@@ -1684,7 +1700,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1684
1700
|
>
|
|
1685
1701
|
</button>
|
|
1686
1702
|
</mat-form-field>
|
|
1687
|
-
<mat-form-field appearance="
|
|
1703
|
+
<mat-form-field appearance="outline">
|
|
1688
1704
|
<mat-label>{{ tx('editor.behavior.bulk.retryBackoff', 'Retry interval (ms)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1689
1705
|
<input matInput type="number" formControlName="retryBackoffMs" />
|
|
1690
1706
|
<button
|
|
@@ -1731,7 +1747,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1731
1747
|
<mat-checkbox formControlName="manualUpload"
|
|
1732
1748
|
>{{ tx('editor.interface.manualUpload', 'Require clicking "Upload" (manual mode)') }}</mat-checkbox>
|
|
1733
1749
|
<mat-checkbox formControlName="dense">{{ tx('editor.interface.dense', 'Compact layout') }}</mat-checkbox>
|
|
1734
|
-
<mat-form-field appearance="
|
|
1750
|
+
<mat-form-field appearance="outline">
|
|
1735
1751
|
<mat-label>{{ tx('editor.interface.accept', 'Allowed types (accept)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1736
1752
|
<input
|
|
1737
1753
|
matInput
|
|
@@ -1762,22 +1778,22 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1762
1778
|
<mat-checkbox formControlName="expandOnDragProximity">
|
|
1763
1779
|
{{ tx('editor.interface.dropzone.expandOnProximity', 'Expand when a file gets close during drag') }}
|
|
1764
1780
|
</mat-checkbox>
|
|
1765
|
-
<mat-form-field appearance="
|
|
1781
|
+
<mat-form-field appearance="outline">
|
|
1766
1782
|
<mat-label>{{ tx('editor.interface.dropzone.proximity', 'Proximity radius (px)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1767
1783
|
<input matInput type="number" formControlName="proximityPx" />
|
|
1768
1784
|
</mat-form-field>
|
|
1769
|
-
<mat-form-field appearance="
|
|
1785
|
+
<mat-form-field appearance="outline">
|
|
1770
1786
|
<mat-label>{{ tx('editor.interface.dropzone.mode', 'Expansion mode') }}</mat-label>
|
|
1771
1787
|
<mat-select formControlName="expandMode">
|
|
1772
1788
|
<mat-option value="overlay">{{ tx('editor.interface.dropzone.mode.overlay', 'Overlay (recommended)') }}</mat-option>
|
|
1773
1789
|
<mat-option value="inline">{{ tx('editor.interface.dropzone.mode.inline', 'Inline') }}</mat-option>
|
|
1774
1790
|
</mat-select>
|
|
1775
1791
|
</mat-form-field>
|
|
1776
|
-
<mat-form-field appearance="
|
|
1792
|
+
<mat-form-field appearance="outline">
|
|
1777
1793
|
<mat-label>{{ tx('editor.interface.dropzone.height', 'Overlay height (px)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1778
1794
|
<input matInput type="number" formControlName="expandHeight" />
|
|
1779
1795
|
</mat-form-field>
|
|
1780
|
-
<mat-form-field appearance="
|
|
1796
|
+
<mat-form-field appearance="outline">
|
|
1781
1797
|
<mat-label>{{ tx('editor.interface.dropzone.debounce', 'Drag debounce (ms)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1782
1798
|
<input matInput type="number" formControlName="expandDebounceMs" />
|
|
1783
1799
|
</mat-form-field>
|
|
@@ -1789,11 +1805,11 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1789
1805
|
<mat-icon aria-hidden="true">view_list</mat-icon>
|
|
1790
1806
|
{{ tx('editor.interface.list.title', 'List and details') }}
|
|
1791
1807
|
</legend>
|
|
1792
|
-
<mat-form-field appearance="
|
|
1808
|
+
<mat-form-field appearance="outline">
|
|
1793
1809
|
<mat-label>{{ tx('editor.interface.list.collapseAfter', 'Collapse after (items)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1794
1810
|
<input matInput type="number" formControlName="collapseAfter" />
|
|
1795
1811
|
</mat-form-field>
|
|
1796
|
-
<mat-form-field appearance="
|
|
1812
|
+
<mat-form-field appearance="outline">
|
|
1797
1813
|
<mat-label>{{ tx('editor.interface.list.detailsMode', 'Details mode') }}</mat-label>
|
|
1798
1814
|
<mat-select formControlName="detailsMode">
|
|
1799
1815
|
<mat-option value="auto">{{ tx('editor.interface.list.detailsMode.auto', 'Automatic') }}</mat-option>
|
|
@@ -1801,14 +1817,14 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1801
1817
|
<mat-option value="sidesheet">{{ tx('editor.interface.list.detailsMode.sidesheet', 'Side-sheet') }}</mat-option>
|
|
1802
1818
|
</mat-select>
|
|
1803
1819
|
</mat-form-field>
|
|
1804
|
-
<mat-form-field appearance="
|
|
1820
|
+
<mat-form-field appearance="outline">
|
|
1805
1821
|
<mat-label>{{ tx('editor.interface.list.detailsWidth', 'Maximum card width (px)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1806
1822
|
<input matInput type="number" formControlName="detailsMaxWidth" />
|
|
1807
1823
|
</mat-form-field>
|
|
1808
1824
|
<mat-checkbox formControlName="detailsShowTechnical">
|
|
1809
1825
|
{{ tx('editor.interface.list.showTechnical', 'Show technical details by default') }}
|
|
1810
1826
|
</mat-checkbox>
|
|
1811
|
-
<mat-form-field appearance="
|
|
1827
|
+
<mat-form-field appearance="outline">
|
|
1812
1828
|
<mat-label>{{ tx('editor.interface.list.detailsFields', 'Metadata fields (whitelist)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1813
1829
|
<input matInput formControlName="detailsFields" [placeholder]="tx('editor.placeholders.detailsFields', 'e.g.: id,fileName,contentType')" />
|
|
1814
1830
|
<button
|
|
@@ -1822,7 +1838,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1822
1838
|
>
|
|
1823
1839
|
</button>
|
|
1824
1840
|
</mat-form-field>
|
|
1825
|
-
<mat-form-field appearance="
|
|
1841
|
+
<mat-form-field appearance="outline">
|
|
1826
1842
|
<mat-label>{{ tx('editor.interface.list.anchor', 'Overlay anchor') }}</mat-label>
|
|
1827
1843
|
<mat-select formControlName="detailsAnchor">
|
|
1828
1844
|
<mat-option value="item">{{ tx('editor.interface.list.anchor.item', 'Item') }}</mat-option>
|
|
@@ -1851,7 +1867,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1851
1867
|
<p class="section-note">
|
|
1852
1868
|
{{ tx('editor.validation.local.note', 'Local limits improve immediate feedback, but do not replace the effective server policy.') }}
|
|
1853
1869
|
</p>
|
|
1854
|
-
<mat-form-field appearance="
|
|
1870
|
+
<mat-form-field appearance="outline">
|
|
1855
1871
|
<mat-label>{{ tx('editor.validation.local.maxFileSize', 'Maximum file size (bytes)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1856
1872
|
<input matInput type="number" formControlName="maxFileSizeBytes" />
|
|
1857
1873
|
<button
|
|
@@ -1865,11 +1881,11 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1865
1881
|
>
|
|
1866
1882
|
</button>
|
|
1867
1883
|
</mat-form-field>
|
|
1868
|
-
<mat-form-field appearance="
|
|
1884
|
+
<mat-form-field appearance="outline">
|
|
1869
1885
|
<mat-label>{{ tx('editor.validation.local.maxFilesPerBulk', 'Max files per batch') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1870
1886
|
<input matInput type="number" formControlName="maxFilesPerBulk" />
|
|
1871
1887
|
</mat-form-field>
|
|
1872
|
-
<mat-form-field appearance="
|
|
1888
|
+
<mat-form-field appearance="outline">
|
|
1873
1889
|
<mat-label>{{ tx('editor.validation.local.maxBulkSize', 'Maximum batch size (bytes)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1874
1890
|
<input matInput type="number" formControlName="maxBulkSizeBytes" />
|
|
1875
1891
|
</mat-form-field>
|
|
@@ -1884,7 +1900,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1884
1900
|
<p class="section-note">
|
|
1885
1901
|
{{ tx('editor.validation.backend.note', 'These options directly impact the server contract and operational governance. Treat changes here as policy decisions, not only UI changes.') }}
|
|
1886
1902
|
</p>
|
|
1887
|
-
<mat-form-field appearance="
|
|
1903
|
+
<mat-form-field appearance="outline">
|
|
1888
1904
|
<mat-label>{{ tx('editor.validation.backend.conflictPolicy', 'Conflict policy (default)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1889
1905
|
<mat-select formControlName="defaultConflictPolicy">
|
|
1890
1906
|
<mat-option value="RENAME">{{ tx('editor.validation.backend.conflictPolicy.rename', 'Rename automatically') }}</mat-option>
|
|
@@ -1903,18 +1919,18 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1903
1919
|
matTooltipPosition="above"
|
|
1904
1920
|
>
|
|
1905
1921
|
</button>
|
|
1906
|
-
@if (optionsGroup.get('defaultConflictPolicy')?.value === 'OVERWRITE') {
|
|
1907
|
-
<div class="warn">
|
|
1908
|
-
<mat-icon color="warn" aria-hidden="true">warning</mat-icon>
|
|
1909
|
-
{{ tx('editor.validation.backend.overwriteWarn', 'Warning: OVERWRITE may replace existing files.') }}
|
|
1910
|
-
</div>
|
|
1911
|
-
}
|
|
1912
1922
|
</mat-form-field>
|
|
1923
|
+
@if (optionsGroup.get('defaultConflictPolicy')?.value === 'OVERWRITE') {
|
|
1924
|
+
<div class="warn">
|
|
1925
|
+
<mat-icon color="warn" aria-hidden="true">warning</mat-icon>
|
|
1926
|
+
{{ tx('editor.validation.backend.overwriteWarn', 'Warning: OVERWRITE may replace existing files.') }}
|
|
1927
|
+
</div>
|
|
1928
|
+
}
|
|
1913
1929
|
<mat-checkbox formControlName="strictValidation"
|
|
1914
1930
|
>{{ tx('editor.validation.backend.strictValidation', 'Strict validation (backend)') }}</mat-checkbox
|
|
1915
1931
|
>
|
|
1916
|
-
<mat-form-field appearance="
|
|
1917
|
-
<mat-label>{{ tx('editor.validation.backend.maxUploadSizeMb', 'Maximum size per file (MB)') }} <span class="req-tag">mandatório</span></mat-label>
|
|
1932
|
+
<mat-form-field appearance="outline">
|
|
1933
|
+
<mat-label>{{ tx('editor.validation.backend.maxUploadSizeMb', 'Maximum size per file (MB)') }} <span class="req-tag">{{ tx('editor.shared.requiredTag', 'mandatório') }}</span></mat-label>
|
|
1918
1934
|
<input matInput type="number" formControlName="maxUploadSizeMb" required />
|
|
1919
1935
|
<button
|
|
1920
1936
|
praxisIconButton="help_outline"
|
|
@@ -1927,7 +1943,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1927
1943
|
>
|
|
1928
1944
|
</button>
|
|
1929
1945
|
</mat-form-field>
|
|
1930
|
-
<mat-form-field appearance="
|
|
1946
|
+
<mat-form-field appearance="outline">
|
|
1931
1947
|
<mat-label>{{ tx('editor.validation.backend.allowedExtensions', 'Allowed extensions') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1932
1948
|
<input
|
|
1933
1949
|
matInput
|
|
@@ -1945,7 +1961,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1945
1961
|
>
|
|
1946
1962
|
</button>
|
|
1947
1963
|
</mat-form-field>
|
|
1948
|
-
<mat-form-field appearance="
|
|
1964
|
+
<mat-form-field appearance="outline">
|
|
1949
1965
|
<mat-label>{{ tx('editor.validation.backend.acceptMimeTypes', 'Accepted MIME types') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1950
1966
|
<input
|
|
1951
1967
|
matInput
|
|
@@ -1963,7 +1979,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
1963
1979
|
>
|
|
1964
1980
|
</button>
|
|
1965
1981
|
</mat-form-field>
|
|
1966
|
-
<mat-form-field appearance="
|
|
1982
|
+
<mat-form-field appearance="outline">
|
|
1967
1983
|
<mat-label>{{ tx('editor.validation.backend.targetDirectory', 'Target directory') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
1968
1984
|
<input
|
|
1969
1985
|
matInput
|
|
@@ -2011,11 +2027,11 @@ class PraxisFilesUploadConfigEditor {
|
|
|
2011
2027
|
<mat-checkbox formControlName="autoRetryOn429"
|
|
2012
2028
|
>{{ tx('editor.validation.rateLimit.autoRetry', 'Retry automatically') }}</mat-checkbox
|
|
2013
2029
|
>
|
|
2014
|
-
<mat-form-field appearance="
|
|
2030
|
+
<mat-form-field appearance="outline">
|
|
2015
2031
|
<mat-label>{{ tx('editor.validation.rateLimit.maxAutoRetry', 'Maximum automatic retries') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2016
2032
|
<input matInput type="number" formControlName="maxAutoRetry" />
|
|
2017
2033
|
</mat-form-field>
|
|
2018
|
-
<mat-form-field appearance="
|
|
2034
|
+
<mat-form-field appearance="outline">
|
|
2019
2035
|
<mat-label>{{ tx('editor.validation.rateLimit.baseBackoff', 'Base retry interval (ms)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2020
2036
|
<input matInput type="number" formControlName="baseBackoffMs" />
|
|
2021
2037
|
</mat-form-field>
|
|
@@ -2051,7 +2067,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
2051
2067
|
<p class="section-note">
|
|
2052
2068
|
{{ tx('editor.messages.section.note', 'Short and objective messages work better in high-frequency contexts. Use this group to adapt the interface voice to your environment.') }}
|
|
2053
2069
|
</p>
|
|
2054
|
-
<mat-form-field appearance="
|
|
2070
|
+
<mat-form-field appearance="outline">
|
|
2055
2071
|
<mat-label>{{ tx('editor.messages.successSingle', 'Success (single)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2056
2072
|
<input
|
|
2057
2073
|
matInput
|
|
@@ -2059,7 +2075,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
2059
2075
|
[placeholder]="tx('editor.placeholders.successSingle', 'e.g.: File uploaded successfully')"
|
|
2060
2076
|
/>
|
|
2061
2077
|
</mat-form-field>
|
|
2062
|
-
<mat-form-field appearance="
|
|
2078
|
+
<mat-form-field appearance="outline">
|
|
2063
2079
|
<mat-label>{{ tx('editor.messages.successBulk', 'Success (batch)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2064
2080
|
<input
|
|
2065
2081
|
matInput
|
|
@@ -2069,7 +2085,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
2069
2085
|
</mat-form-field>
|
|
2070
2086
|
<div [formGroup]="errorsGroup">
|
|
2071
2087
|
@for (e of errorEntries; track e) {
|
|
2072
|
-
<mat-form-field appearance="
|
|
2088
|
+
<mat-form-field appearance="outline">
|
|
2073
2089
|
<mat-label>{{ e.label }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2074
2090
|
<input matInput [formControlName]="e.code" />
|
|
2075
2091
|
<mat-hint class="code-hint">{{ e.code }}</mat-hint>
|
|
@@ -2094,7 +2110,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
2094
2110
|
<mat-icon aria-hidden="true">edit</mat-icon>
|
|
2095
2111
|
{{ tx('editor.headers.section.title', 'Configurable options — Headers (query)') }}
|
|
2096
2112
|
</h4>
|
|
2097
|
-
<mat-form-field appearance="
|
|
2113
|
+
<mat-form-field appearance="outline">
|
|
2098
2114
|
<mat-label>{{ tx('editor.headers.tenantHeader', 'Tenant header') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2099
2115
|
<input
|
|
2100
2116
|
matInput
|
|
@@ -2102,7 +2118,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
2102
2118
|
placeholder="X-Tenant-Id"
|
|
2103
2119
|
/>
|
|
2104
2120
|
</mat-form-field>
|
|
2105
|
-
<mat-form-field appearance="
|
|
2121
|
+
<mat-form-field appearance="outline">
|
|
2106
2122
|
<mat-label>{{ tx('editor.headers.tenantValue', 'Tenant value') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2107
2123
|
<input
|
|
2108
2124
|
matInput
|
|
@@ -2110,7 +2126,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
2110
2126
|
[placeholder]="tx('editor.placeholders.tenantValue', 'e.g.: demo-tenant')"
|
|
2111
2127
|
/>
|
|
2112
2128
|
</mat-form-field>
|
|
2113
|
-
<mat-form-field appearance="
|
|
2129
|
+
<mat-form-field appearance="outline">
|
|
2114
2130
|
<mat-label>{{ tx('editor.headers.userHeader', 'User header') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2115
2131
|
<input
|
|
2116
2132
|
matInput
|
|
@@ -2118,7 +2134,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
2118
2134
|
placeholder="X-User-Id"
|
|
2119
2135
|
/>
|
|
2120
2136
|
</mat-form-field>
|
|
2121
|
-
<mat-form-field appearance="
|
|
2137
|
+
<mat-form-field appearance="outline">
|
|
2122
2138
|
<mat-label>{{ tx('editor.headers.userValue', 'User value') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2123
2139
|
<input matInput formControlName="userValue" [placeholder]="tx('editor.placeholders.userValue', 'e.g.: 42')" />
|
|
2124
2140
|
</mat-form-field>
|
|
@@ -2256,7 +2272,7 @@ class PraxisFilesUploadConfigEditor {
|
|
|
2256
2272
|
</mat-tab-group>
|
|
2257
2273
|
</div>
|
|
2258
2274
|
</div>
|
|
2259
|
-
`, isInline: true, styles: [".editor-layout{display:grid;grid-template-columns:minmax(260px,320px) minmax(0,1fr);gap:16px;align-items:start}.summary-panel{position:sticky;top:0;display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--pfx-surface-border, #d8d8d8);border-radius:16px;background:linear-gradient(180deg,#fafbfc,#fff)}.summary-panel h3{margin:0;font-size:1rem;font-weight:600}.summary-panel .summary-intro{margin:0;color:#000000a6;line-height:1.4;font-size:.88rem}.summary-grid{display:grid;gap:10px}.summary-card{padding:12px;border-radius:12px;background:#fff;border:1px solid #e7e9ee}.summary-card .eyebrow{display:block;margin-bottom:4px;font-size:.72rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:#5f6b7a}.summary-card strong{display:block;margin-bottom:4px;font-size:.95rem}.summary-card p{margin:0;font-size:.85rem;line-height:1.45;color:#000000b8}.risk-panel{padding:12px;border-radius:12px;background:#fff8e8;border:1px solid #f0d29a}.risk-panel.safe{background:#f4fbf6;border-color:#b8ddc1}.risk-panel h4{display:flex;align-items:center;gap:6px;margin:0 0 8px;font-size:.92rem}.risk-list{display:grid;gap:8px}.risk-item{padding:10px;border-radius:10px;background:#ffffffb8}.risk-item strong{display:block;margin-bottom:2px;font-size:.84rem}.risk-item p,.risk-panel .safe-copy{margin:0;font-size:.82rem;line-height:1.4;color:#000000b8}.editor-main{min-width:0}.tab-panel{display:grid;gap:16px;padding-top:8px}.tab-intro{padding:16px 18px;border:1px solid #e5e8ef;border-radius:16px;background:linear-gradient(180deg,#fff,#f7f9fc)}.tab-intro h3{margin:0 0 6px;font-size:1rem;font-weight:600}.tab-intro p{margin:0;font-size:.9rem;line-height:1.5;color:#000000b8}.config-section{padding:18px;border:1px solid #e5e8ef;border-radius:16px;background:#fff}.config-section+.config-section{margin-top:0}.section-note{margin:0 0 16px;color:#000000b3;font-size:.88rem;line-height:1.45}.advanced-note{padding:14px 16px;border-radius:14px;border:1px solid #f0d29a;background:#fff8e8;color:#000000c7;font-size:.88rem;line-height:1.45}.json-textarea{width:100%;min-height:280px;padding:14px 16px;border-radius:14px;border:1px solid #d7dce5;background:#0f172a;color:#e5eefc;font:500 .84rem/1.55 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;resize:vertical}.server-tab{display:grid;gap:16px}.toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.summary{display:grid;gap:8px;padding-left:18px}.summary li{line-height:1.45}details{margin-top:12px;padding:14px 16px;border:1px solid #e5e8ef;border-radius:14px;background:#fbfcfe}details pre{white-space:pre-wrap;word-break:break-word}@media(max-width:1100px){.editor-layout{grid-template-columns:1fr}.summary-panel{position:static}}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "pipe", type: i18.JsonPipe, name: "json" }] });
|
|
2275
|
+
`, isInline: true, styles: [":host{display:block;min-width:0;container-type:inline-size;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.editor-layout{display:grid;grid-template-columns:minmax(250px,310px) minmax(0,1fr);gap:16px;align-items:start}.summary-panel{position:sticky;top:0;display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));border-radius:16px;background:var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low));color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.summary-panel h3{margin:0;font-size:1rem;font-weight:600;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.summary-panel .summary-intro{margin:0;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant));line-height:1.4;font-size:.88rem}.summary-grid{display:grid;gap:10px}.summary-card{padding:12px;border-radius:12px;background:var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container));border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant))}.summary-card .eyebrow{display:block;margin-bottom:4px;font-size:.72rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.summary-card strong{display:block;margin-bottom:4px;font-size:.95rem;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.summary-card p{margin:0;font-size:.85rem;line-height:1.45;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.risk-panel{padding:12px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 12%,var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low)));border:1px solid color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 38%,var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant)))}.risk-panel.safe{background:color-mix(in srgb,var(--pfx-settings-panel-primary, var(--md-sys-color-primary)) 10%,var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low)));border-color:color-mix(in srgb,var(--pfx-settings-panel-primary, var(--md-sys-color-primary)) 32%,var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant)))}.risk-panel h4{display:flex;align-items:center;gap:6px;margin:0 0 8px;font-size:.92rem;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.risk-list{display:grid;gap:8px}.risk-item{padding:10px;border-radius:10px;background:var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container));border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant))}.risk-item strong{display:block;margin-bottom:2px;font-size:.84rem;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.risk-item p,.risk-panel .safe-copy{margin:0;font-size:.82rem;line-height:1.4;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.editor-main{min-width:0}.tab-panel{display:grid;gap:16px;padding-top:8px}.tab-intro{padding:14px 16px;border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));border-radius:14px;background:var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low))}.tab-intro h3{margin:0 0 6px;font-size:1rem;font-weight:600;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.tab-intro p{margin:0;font-size:.9rem;line-height:1.5;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.config-section{padding:16px;border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));border-radius:14px;background:var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low));display:grid;gap:12px}.config-section form{display:grid;gap:12px}.config-section+.config-section{margin-top:0}.section-subtitle{display:flex;align-items:center;gap:8px;margin:0;font-size:.95rem;font-weight:600;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.section-note{margin:0 0 4px;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant));font-size:.86rem;line-height:1.45}.subgroup{margin:8px 0 0;padding:14px 0 0;border:0;border-top:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));border-radius:0;background:transparent;display:grid;gap:12px}.subgroup legend{display:inline-flex;align-items:center;gap:6px;padding:0 8px 0 0;font-size:.88rem;font-weight:600;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.opt-tag,.req-tag{font-size:.72rem;font-weight:500;margin-left:4px;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.req-tag{color:var(--pfx-settings-panel-primary, var(--md-sys-color-primary));font-weight:600}.warn{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:10px;font-size:.84rem;line-height:1.4;background:color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 14%,var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container)));border:1px solid color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 38%,var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant)));color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.error{padding:10px 12px;border-radius:10px;font-size:.84rem;background:color-mix(in srgb,var(--pfx-settings-panel-error, var(--md-sys-color-error)) 14%,transparent);border:1px solid var(--pfx-settings-panel-error, var(--md-sys-color-error));color:var(--pfx-settings-panel-error, var(--md-sys-color-error))}.badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;font-size:.72rem;font-weight:600;background:var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container-high));color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.hint,.note{font-size:.84rem;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.advanced-note{padding:14px 16px;border-radius:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 38%,var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant)));background:color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 12%,var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low)));color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface));font-size:.88rem;line-height:1.45}.json-textarea{box-sizing:border-box;width:100%;min-height:280px;padding:14px 16px;border-radius:14px;border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));background:var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container-highest));color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface));font:500 .84rem/1.55 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;resize:vertical}.server-tab{display:grid;gap:16px}.toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.summary{display:grid;gap:8px;padding-left:18px}.summary li{line-height:1.45}details{margin-top:12px;padding:14px 16px;border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));border-radius:14px;background:var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container))}details pre{white-space:pre-wrap;word-break:break-word}@container (max-width: 820px){.editor-layout{grid-template-columns:1fr}.summary-panel{position:static}}@media(max-width:960px){.editor-layout{grid-template-columns:1fr}.summary-panel{position:static}}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "pipe", type: i18.JsonPipe, name: "json" }] });
|
|
2260
2276
|
}
|
|
2261
2277
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisFilesUploadConfigEditor, decorators: [{
|
|
2262
2278
|
type: Component,
|
|
@@ -2344,7 +2360,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2344
2360
|
</section>
|
|
2345
2361
|
<section class="config-section">
|
|
2346
2362
|
<form [formGroup]="form">
|
|
2347
|
-
<mat-form-field appearance="
|
|
2363
|
+
<mat-form-field appearance="outline">
|
|
2348
2364
|
<mat-label>{{ tx('editor.behavior.strategy.label', 'Upload strategy') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2349
2365
|
<mat-select formControlName="strategy">
|
|
2350
2366
|
<mat-option value="direct">{{ tx('editor.behavior.strategy.direct', 'Direct (standard HTTP)') }}</mat-option>
|
|
@@ -2375,7 +2391,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2375
2391
|
<p class="section-note">
|
|
2376
2392
|
{{ tx('editor.behavior.bulk.note', 'Use parallelism and retries in moderation. In enterprise environments these controls affect throughput, perceived experience and backend load.') }}
|
|
2377
2393
|
</p>
|
|
2378
|
-
<mat-form-field appearance="
|
|
2394
|
+
<mat-form-field appearance="outline">
|
|
2379
2395
|
<mat-label>{{ tx('editor.behavior.bulk.parallel', 'Parallel uploads') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2380
2396
|
<input matInput type="number" formControlName="parallelUploads" />
|
|
2381
2397
|
<button
|
|
@@ -2389,7 +2405,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2389
2405
|
>
|
|
2390
2406
|
</button>
|
|
2391
2407
|
</mat-form-field>
|
|
2392
|
-
<mat-form-field appearance="
|
|
2408
|
+
<mat-form-field appearance="outline">
|
|
2393
2409
|
<mat-label>{{ tx('editor.behavior.bulk.retryCount', 'Retry count') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2394
2410
|
<input matInput type="number" formControlName="retryCount" />
|
|
2395
2411
|
<button
|
|
@@ -2403,7 +2419,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2403
2419
|
>
|
|
2404
2420
|
</button>
|
|
2405
2421
|
</mat-form-field>
|
|
2406
|
-
<mat-form-field appearance="
|
|
2422
|
+
<mat-form-field appearance="outline">
|
|
2407
2423
|
<mat-label>{{ tx('editor.behavior.bulk.retryBackoff', 'Retry interval (ms)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2408
2424
|
<input matInput type="number" formControlName="retryBackoffMs" />
|
|
2409
2425
|
<button
|
|
@@ -2450,7 +2466,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2450
2466
|
<mat-checkbox formControlName="manualUpload"
|
|
2451
2467
|
>{{ tx('editor.interface.manualUpload', 'Require clicking "Upload" (manual mode)') }}</mat-checkbox>
|
|
2452
2468
|
<mat-checkbox formControlName="dense">{{ tx('editor.interface.dense', 'Compact layout') }}</mat-checkbox>
|
|
2453
|
-
<mat-form-field appearance="
|
|
2469
|
+
<mat-form-field appearance="outline">
|
|
2454
2470
|
<mat-label>{{ tx('editor.interface.accept', 'Allowed types (accept)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2455
2471
|
<input
|
|
2456
2472
|
matInput
|
|
@@ -2481,22 +2497,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2481
2497
|
<mat-checkbox formControlName="expandOnDragProximity">
|
|
2482
2498
|
{{ tx('editor.interface.dropzone.expandOnProximity', 'Expand when a file gets close during drag') }}
|
|
2483
2499
|
</mat-checkbox>
|
|
2484
|
-
<mat-form-field appearance="
|
|
2500
|
+
<mat-form-field appearance="outline">
|
|
2485
2501
|
<mat-label>{{ tx('editor.interface.dropzone.proximity', 'Proximity radius (px)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2486
2502
|
<input matInput type="number" formControlName="proximityPx" />
|
|
2487
2503
|
</mat-form-field>
|
|
2488
|
-
<mat-form-field appearance="
|
|
2504
|
+
<mat-form-field appearance="outline">
|
|
2489
2505
|
<mat-label>{{ tx('editor.interface.dropzone.mode', 'Expansion mode') }}</mat-label>
|
|
2490
2506
|
<mat-select formControlName="expandMode">
|
|
2491
2507
|
<mat-option value="overlay">{{ tx('editor.interface.dropzone.mode.overlay', 'Overlay (recommended)') }}</mat-option>
|
|
2492
2508
|
<mat-option value="inline">{{ tx('editor.interface.dropzone.mode.inline', 'Inline') }}</mat-option>
|
|
2493
2509
|
</mat-select>
|
|
2494
2510
|
</mat-form-field>
|
|
2495
|
-
<mat-form-field appearance="
|
|
2511
|
+
<mat-form-field appearance="outline">
|
|
2496
2512
|
<mat-label>{{ tx('editor.interface.dropzone.height', 'Overlay height (px)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2497
2513
|
<input matInput type="number" formControlName="expandHeight" />
|
|
2498
2514
|
</mat-form-field>
|
|
2499
|
-
<mat-form-field appearance="
|
|
2515
|
+
<mat-form-field appearance="outline">
|
|
2500
2516
|
<mat-label>{{ tx('editor.interface.dropzone.debounce', 'Drag debounce (ms)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2501
2517
|
<input matInput type="number" formControlName="expandDebounceMs" />
|
|
2502
2518
|
</mat-form-field>
|
|
@@ -2508,11 +2524,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2508
2524
|
<mat-icon aria-hidden="true">view_list</mat-icon>
|
|
2509
2525
|
{{ tx('editor.interface.list.title', 'List and details') }}
|
|
2510
2526
|
</legend>
|
|
2511
|
-
<mat-form-field appearance="
|
|
2527
|
+
<mat-form-field appearance="outline">
|
|
2512
2528
|
<mat-label>{{ tx('editor.interface.list.collapseAfter', 'Collapse after (items)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2513
2529
|
<input matInput type="number" formControlName="collapseAfter" />
|
|
2514
2530
|
</mat-form-field>
|
|
2515
|
-
<mat-form-field appearance="
|
|
2531
|
+
<mat-form-field appearance="outline">
|
|
2516
2532
|
<mat-label>{{ tx('editor.interface.list.detailsMode', 'Details mode') }}</mat-label>
|
|
2517
2533
|
<mat-select formControlName="detailsMode">
|
|
2518
2534
|
<mat-option value="auto">{{ tx('editor.interface.list.detailsMode.auto', 'Automatic') }}</mat-option>
|
|
@@ -2520,14 +2536,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2520
2536
|
<mat-option value="sidesheet">{{ tx('editor.interface.list.detailsMode.sidesheet', 'Side-sheet') }}</mat-option>
|
|
2521
2537
|
</mat-select>
|
|
2522
2538
|
</mat-form-field>
|
|
2523
|
-
<mat-form-field appearance="
|
|
2539
|
+
<mat-form-field appearance="outline">
|
|
2524
2540
|
<mat-label>{{ tx('editor.interface.list.detailsWidth', 'Maximum card width (px)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2525
2541
|
<input matInput type="number" formControlName="detailsMaxWidth" />
|
|
2526
2542
|
</mat-form-field>
|
|
2527
2543
|
<mat-checkbox formControlName="detailsShowTechnical">
|
|
2528
2544
|
{{ tx('editor.interface.list.showTechnical', 'Show technical details by default') }}
|
|
2529
2545
|
</mat-checkbox>
|
|
2530
|
-
<mat-form-field appearance="
|
|
2546
|
+
<mat-form-field appearance="outline">
|
|
2531
2547
|
<mat-label>{{ tx('editor.interface.list.detailsFields', 'Metadata fields (whitelist)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2532
2548
|
<input matInput formControlName="detailsFields" [placeholder]="tx('editor.placeholders.detailsFields', 'e.g.: id,fileName,contentType')" />
|
|
2533
2549
|
<button
|
|
@@ -2541,7 +2557,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2541
2557
|
>
|
|
2542
2558
|
</button>
|
|
2543
2559
|
</mat-form-field>
|
|
2544
|
-
<mat-form-field appearance="
|
|
2560
|
+
<mat-form-field appearance="outline">
|
|
2545
2561
|
<mat-label>{{ tx('editor.interface.list.anchor', 'Overlay anchor') }}</mat-label>
|
|
2546
2562
|
<mat-select formControlName="detailsAnchor">
|
|
2547
2563
|
<mat-option value="item">{{ tx('editor.interface.list.anchor.item', 'Item') }}</mat-option>
|
|
@@ -2570,7 +2586,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2570
2586
|
<p class="section-note">
|
|
2571
2587
|
{{ tx('editor.validation.local.note', 'Local limits improve immediate feedback, but do not replace the effective server policy.') }}
|
|
2572
2588
|
</p>
|
|
2573
|
-
<mat-form-field appearance="
|
|
2589
|
+
<mat-form-field appearance="outline">
|
|
2574
2590
|
<mat-label>{{ tx('editor.validation.local.maxFileSize', 'Maximum file size (bytes)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2575
2591
|
<input matInput type="number" formControlName="maxFileSizeBytes" />
|
|
2576
2592
|
<button
|
|
@@ -2584,11 +2600,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2584
2600
|
>
|
|
2585
2601
|
</button>
|
|
2586
2602
|
</mat-form-field>
|
|
2587
|
-
<mat-form-field appearance="
|
|
2603
|
+
<mat-form-field appearance="outline">
|
|
2588
2604
|
<mat-label>{{ tx('editor.validation.local.maxFilesPerBulk', 'Max files per batch') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2589
2605
|
<input matInput type="number" formControlName="maxFilesPerBulk" />
|
|
2590
2606
|
</mat-form-field>
|
|
2591
|
-
<mat-form-field appearance="
|
|
2607
|
+
<mat-form-field appearance="outline">
|
|
2592
2608
|
<mat-label>{{ tx('editor.validation.local.maxBulkSize', 'Maximum batch size (bytes)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2593
2609
|
<input matInput type="number" formControlName="maxBulkSizeBytes" />
|
|
2594
2610
|
</mat-form-field>
|
|
@@ -2603,7 +2619,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2603
2619
|
<p class="section-note">
|
|
2604
2620
|
{{ tx('editor.validation.backend.note', 'These options directly impact the server contract and operational governance. Treat changes here as policy decisions, not only UI changes.') }}
|
|
2605
2621
|
</p>
|
|
2606
|
-
<mat-form-field appearance="
|
|
2622
|
+
<mat-form-field appearance="outline">
|
|
2607
2623
|
<mat-label>{{ tx('editor.validation.backend.conflictPolicy', 'Conflict policy (default)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2608
2624
|
<mat-select formControlName="defaultConflictPolicy">
|
|
2609
2625
|
<mat-option value="RENAME">{{ tx('editor.validation.backend.conflictPolicy.rename', 'Rename automatically') }}</mat-option>
|
|
@@ -2622,18 +2638,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2622
2638
|
matTooltipPosition="above"
|
|
2623
2639
|
>
|
|
2624
2640
|
</button>
|
|
2625
|
-
@if (optionsGroup.get('defaultConflictPolicy')?.value === 'OVERWRITE') {
|
|
2626
|
-
<div class="warn">
|
|
2627
|
-
<mat-icon color="warn" aria-hidden="true">warning</mat-icon>
|
|
2628
|
-
{{ tx('editor.validation.backend.overwriteWarn', 'Warning: OVERWRITE may replace existing files.') }}
|
|
2629
|
-
</div>
|
|
2630
|
-
}
|
|
2631
2641
|
</mat-form-field>
|
|
2642
|
+
@if (optionsGroup.get('defaultConflictPolicy')?.value === 'OVERWRITE') {
|
|
2643
|
+
<div class="warn">
|
|
2644
|
+
<mat-icon color="warn" aria-hidden="true">warning</mat-icon>
|
|
2645
|
+
{{ tx('editor.validation.backend.overwriteWarn', 'Warning: OVERWRITE may replace existing files.') }}
|
|
2646
|
+
</div>
|
|
2647
|
+
}
|
|
2632
2648
|
<mat-checkbox formControlName="strictValidation"
|
|
2633
2649
|
>{{ tx('editor.validation.backend.strictValidation', 'Strict validation (backend)') }}</mat-checkbox
|
|
2634
2650
|
>
|
|
2635
|
-
<mat-form-field appearance="
|
|
2636
|
-
<mat-label>{{ tx('editor.validation.backend.maxUploadSizeMb', 'Maximum size per file (MB)') }} <span class="req-tag">mandatório</span></mat-label>
|
|
2651
|
+
<mat-form-field appearance="outline">
|
|
2652
|
+
<mat-label>{{ tx('editor.validation.backend.maxUploadSizeMb', 'Maximum size per file (MB)') }} <span class="req-tag">{{ tx('editor.shared.requiredTag', 'mandatório') }}</span></mat-label>
|
|
2637
2653
|
<input matInput type="number" formControlName="maxUploadSizeMb" required />
|
|
2638
2654
|
<button
|
|
2639
2655
|
praxisIconButton="help_outline"
|
|
@@ -2646,7 +2662,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2646
2662
|
>
|
|
2647
2663
|
</button>
|
|
2648
2664
|
</mat-form-field>
|
|
2649
|
-
<mat-form-field appearance="
|
|
2665
|
+
<mat-form-field appearance="outline">
|
|
2650
2666
|
<mat-label>{{ tx('editor.validation.backend.allowedExtensions', 'Allowed extensions') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2651
2667
|
<input
|
|
2652
2668
|
matInput
|
|
@@ -2664,7 +2680,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2664
2680
|
>
|
|
2665
2681
|
</button>
|
|
2666
2682
|
</mat-form-field>
|
|
2667
|
-
<mat-form-field appearance="
|
|
2683
|
+
<mat-form-field appearance="outline">
|
|
2668
2684
|
<mat-label>{{ tx('editor.validation.backend.acceptMimeTypes', 'Accepted MIME types') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2669
2685
|
<input
|
|
2670
2686
|
matInput
|
|
@@ -2682,7 +2698,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2682
2698
|
>
|
|
2683
2699
|
</button>
|
|
2684
2700
|
</mat-form-field>
|
|
2685
|
-
<mat-form-field appearance="
|
|
2701
|
+
<mat-form-field appearance="outline">
|
|
2686
2702
|
<mat-label>{{ tx('editor.validation.backend.targetDirectory', 'Target directory') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2687
2703
|
<input
|
|
2688
2704
|
matInput
|
|
@@ -2730,11 +2746,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2730
2746
|
<mat-checkbox formControlName="autoRetryOn429"
|
|
2731
2747
|
>{{ tx('editor.validation.rateLimit.autoRetry', 'Retry automatically') }}</mat-checkbox
|
|
2732
2748
|
>
|
|
2733
|
-
<mat-form-field appearance="
|
|
2749
|
+
<mat-form-field appearance="outline">
|
|
2734
2750
|
<mat-label>{{ tx('editor.validation.rateLimit.maxAutoRetry', 'Maximum automatic retries') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2735
2751
|
<input matInput type="number" formControlName="maxAutoRetry" />
|
|
2736
2752
|
</mat-form-field>
|
|
2737
|
-
<mat-form-field appearance="
|
|
2753
|
+
<mat-form-field appearance="outline">
|
|
2738
2754
|
<mat-label>{{ tx('editor.validation.rateLimit.baseBackoff', 'Base retry interval (ms)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2739
2755
|
<input matInput type="number" formControlName="baseBackoffMs" />
|
|
2740
2756
|
</mat-form-field>
|
|
@@ -2770,7 +2786,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2770
2786
|
<p class="section-note">
|
|
2771
2787
|
{{ tx('editor.messages.section.note', 'Short and objective messages work better in high-frequency contexts. Use this group to adapt the interface voice to your environment.') }}
|
|
2772
2788
|
</p>
|
|
2773
|
-
<mat-form-field appearance="
|
|
2789
|
+
<mat-form-field appearance="outline">
|
|
2774
2790
|
<mat-label>{{ tx('editor.messages.successSingle', 'Success (single)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2775
2791
|
<input
|
|
2776
2792
|
matInput
|
|
@@ -2778,7 +2794,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2778
2794
|
[placeholder]="tx('editor.placeholders.successSingle', 'e.g.: File uploaded successfully')"
|
|
2779
2795
|
/>
|
|
2780
2796
|
</mat-form-field>
|
|
2781
|
-
<mat-form-field appearance="
|
|
2797
|
+
<mat-form-field appearance="outline">
|
|
2782
2798
|
<mat-label>{{ tx('editor.messages.successBulk', 'Success (batch)') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2783
2799
|
<input
|
|
2784
2800
|
matInput
|
|
@@ -2788,7 +2804,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2788
2804
|
</mat-form-field>
|
|
2789
2805
|
<div [formGroup]="errorsGroup">
|
|
2790
2806
|
@for (e of errorEntries; track e) {
|
|
2791
|
-
<mat-form-field appearance="
|
|
2807
|
+
<mat-form-field appearance="outline">
|
|
2792
2808
|
<mat-label>{{ e.label }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2793
2809
|
<input matInput [formControlName]="e.code" />
|
|
2794
2810
|
<mat-hint class="code-hint">{{ e.code }}</mat-hint>
|
|
@@ -2813,7 +2829,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2813
2829
|
<mat-icon aria-hidden="true">edit</mat-icon>
|
|
2814
2830
|
{{ tx('editor.headers.section.title', 'Configurable options — Headers (query)') }}
|
|
2815
2831
|
</h4>
|
|
2816
|
-
<mat-form-field appearance="
|
|
2832
|
+
<mat-form-field appearance="outline">
|
|
2817
2833
|
<mat-label>{{ tx('editor.headers.tenantHeader', 'Tenant header') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2818
2834
|
<input
|
|
2819
2835
|
matInput
|
|
@@ -2821,7 +2837,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2821
2837
|
placeholder="X-Tenant-Id"
|
|
2822
2838
|
/>
|
|
2823
2839
|
</mat-form-field>
|
|
2824
|
-
<mat-form-field appearance="
|
|
2840
|
+
<mat-form-field appearance="outline">
|
|
2825
2841
|
<mat-label>{{ tx('editor.headers.tenantValue', 'Tenant value') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2826
2842
|
<input
|
|
2827
2843
|
matInput
|
|
@@ -2829,7 +2845,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2829
2845
|
[placeholder]="tx('editor.placeholders.tenantValue', 'e.g.: demo-tenant')"
|
|
2830
2846
|
/>
|
|
2831
2847
|
</mat-form-field>
|
|
2832
|
-
<mat-form-field appearance="
|
|
2848
|
+
<mat-form-field appearance="outline">
|
|
2833
2849
|
<mat-label>{{ tx('editor.headers.userHeader', 'User header') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2834
2850
|
<input
|
|
2835
2851
|
matInput
|
|
@@ -2837,7 +2853,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2837
2853
|
placeholder="X-User-Id"
|
|
2838
2854
|
/>
|
|
2839
2855
|
</mat-form-field>
|
|
2840
|
-
<mat-form-field appearance="
|
|
2856
|
+
<mat-form-field appearance="outline">
|
|
2841
2857
|
<mat-label>{{ tx('editor.headers.userValue', 'User value') }} <span class="opt-tag">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>
|
|
2842
2858
|
<input matInput formControlName="userValue" [placeholder]="tx('editor.placeholders.userValue', 'e.g.: 42')" />
|
|
2843
2859
|
</mat-form-field>
|
|
@@ -2975,7 +2991,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
2975
2991
|
</mat-tab-group>
|
|
2976
2992
|
</div>
|
|
2977
2993
|
</div>
|
|
2978
|
-
`, styles: [".editor-layout{display:grid;grid-template-columns:minmax(
|
|
2994
|
+
`, styles: [":host{display:block;min-width:0;container-type:inline-size;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.editor-layout{display:grid;grid-template-columns:minmax(250px,310px) minmax(0,1fr);gap:16px;align-items:start}.summary-panel{position:sticky;top:0;display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));border-radius:16px;background:var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low));color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.summary-panel h3{margin:0;font-size:1rem;font-weight:600;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.summary-panel .summary-intro{margin:0;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant));line-height:1.4;font-size:.88rem}.summary-grid{display:grid;gap:10px}.summary-card{padding:12px;border-radius:12px;background:var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container));border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant))}.summary-card .eyebrow{display:block;margin-bottom:4px;font-size:.72rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.summary-card strong{display:block;margin-bottom:4px;font-size:.95rem;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.summary-card p{margin:0;font-size:.85rem;line-height:1.45;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.risk-panel{padding:12px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 12%,var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low)));border:1px solid color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 38%,var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant)))}.risk-panel.safe{background:color-mix(in srgb,var(--pfx-settings-panel-primary, var(--md-sys-color-primary)) 10%,var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low)));border-color:color-mix(in srgb,var(--pfx-settings-panel-primary, var(--md-sys-color-primary)) 32%,var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant)))}.risk-panel h4{display:flex;align-items:center;gap:6px;margin:0 0 8px;font-size:.92rem;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.risk-list{display:grid;gap:8px}.risk-item{padding:10px;border-radius:10px;background:var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container));border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant))}.risk-item strong{display:block;margin-bottom:2px;font-size:.84rem;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.risk-item p,.risk-panel .safe-copy{margin:0;font-size:.82rem;line-height:1.4;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.editor-main{min-width:0}.tab-panel{display:grid;gap:16px;padding-top:8px}.tab-intro{padding:14px 16px;border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));border-radius:14px;background:var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low))}.tab-intro h3{margin:0 0 6px;font-size:1rem;font-weight:600;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.tab-intro p{margin:0;font-size:.9rem;line-height:1.5;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.config-section{padding:16px;border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));border-radius:14px;background:var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low));display:grid;gap:12px}.config-section form{display:grid;gap:12px}.config-section+.config-section{margin-top:0}.section-subtitle{display:flex;align-items:center;gap:8px;margin:0;font-size:.95rem;font-weight:600;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.section-note{margin:0 0 4px;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant));font-size:.86rem;line-height:1.45}.subgroup{margin:8px 0 0;padding:14px 0 0;border:0;border-top:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));border-radius:0;background:transparent;display:grid;gap:12px}.subgroup legend{display:inline-flex;align-items:center;gap:6px;padding:0 8px 0 0;font-size:.88rem;font-weight:600;color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.opt-tag,.req-tag{font-size:.72rem;font-weight:500;margin-left:4px;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.req-tag{color:var(--pfx-settings-panel-primary, var(--md-sys-color-primary));font-weight:600}.warn{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:10px;font-size:.84rem;line-height:1.4;background:color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 14%,var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container)));border:1px solid color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 38%,var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant)));color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface))}.error{padding:10px 12px;border-radius:10px;font-size:.84rem;background:color-mix(in srgb,var(--pfx-settings-panel-error, var(--md-sys-color-error)) 14%,transparent);border:1px solid var(--pfx-settings-panel-error, var(--md-sys-color-error));color:var(--pfx-settings-panel-error, var(--md-sys-color-error))}.badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;font-size:.72rem;font-weight:600;background:var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container-high));color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.hint,.note{font-size:.84rem;color:var(--pfx-settings-panel-on-surface-variant, var(--md-sys-color-on-surface-variant))}.advanced-note{padding:14px 16px;border-radius:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 38%,var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant)));background:color-mix(in srgb,var(--md-sys-color-tertiary, #f59e0b) 12%,var(--pfx-settings-panel-surface-container-low, var(--md-sys-color-surface-container-low)));color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface));font-size:.88rem;line-height:1.45}.json-textarea{box-sizing:border-box;width:100%;min-height:280px;padding:14px 16px;border-radius:14px;border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));background:var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container-highest));color:var(--pfx-settings-panel-on-surface, var(--md-sys-color-on-surface));font:500 .84rem/1.55 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;resize:vertical}.server-tab{display:grid;gap:16px}.toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.summary{display:grid;gap:8px;padding-left:18px}.summary li{line-height:1.45}details{margin-top:12px;padding:14px 16px;border:1px solid var(--pfx-settings-panel-outline-variant, var(--md-sys-color-outline-variant));border-radius:14px;background:var(--pfx-settings-panel-surface, var(--md-sys-color-surface-container))}details pre{white-space:pre-wrap;word-break:break-word}@container (max-width: 820px){.editor-layout{grid-template-columns:1fr}.summary-panel{position:static}}@media(max-width:960px){.editor-layout{grid-template-columns:1fr}.summary-panel{position:static}}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
|
|
2979
2995
|
}], ctorParameters: () => [{ type: i1$1.FormBuilder }, { type: undefined, decorators: [{
|
|
2980
2996
|
type: Inject,
|
|
2981
2997
|
args: [SETTINGS_PANEL_DATA]
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/files-upload",
|
|
3
|
-
"version": "10.0.0-rc.
|
|
3
|
+
"version": "10.0.0-rc.36",
|
|
4
4
|
"description": "File upload components and services for Praxis UI with presigned and direct strategies, quotas and rate-limit handling.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^21.0.0",
|
|
7
7
|
"@angular/cdk": "^21.0.0",
|
|
8
8
|
"@angular/core": "^21.0.0",
|
|
9
9
|
"@angular/material": "^21.0.0",
|
|
10
|
-
"@praxisui/core": "^10.0.0-rc.
|
|
11
|
-
"@praxisui/dynamic-fields": "^10.0.0-rc.
|
|
12
|
-
"@praxisui/settings-panel": "^10.0.0-rc.
|
|
10
|
+
"@praxisui/core": "^10.0.0-rc.36",
|
|
11
|
+
"@praxisui/dynamic-fields": "^10.0.0-rc.36",
|
|
12
|
+
"@praxisui/settings-panel": "^10.0.0-rc.36",
|
|
13
13
|
"@angular/forms": "^21.0.0",
|
|
14
14
|
"@angular/router": "^21.0.0",
|
|
15
|
-
"@praxisui/ai": "^10.0.0-rc.
|
|
15
|
+
"@praxisui/ai": "^10.0.0-rc.36",
|
|
16
16
|
"rxjs": "~7.8.0"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
@@ -774,11 +774,15 @@ declare class PraxisFilesUploadConfigEditor implements OnInit, SettingsValueProv
|
|
|
774
774
|
label: string;
|
|
775
775
|
}>;
|
|
776
776
|
isDirty$: BehaviorSubject<boolean>;
|
|
777
|
+
private readonly jsonValid$;
|
|
777
778
|
isValid$: Observable<boolean>;
|
|
778
779
|
isBusy$: BehaviorSubject<boolean>;
|
|
779
780
|
jsonError: string | null;
|
|
780
781
|
tx(key: string, fallback: string): string;
|
|
781
782
|
private getFriendlyErrorLabel;
|
|
783
|
+
private toCsvString;
|
|
784
|
+
private toStringArray;
|
|
785
|
+
private normalizeIncomingPatch;
|
|
782
786
|
constructor(fb: FormBuilder, panelData: any, snackBar: MatSnackBar, destroyRef: DestroyRef);
|
|
783
787
|
ngOnInit(): void;
|
|
784
788
|
private applyServerConfig;
|