@noatgnu/cupcake-vanilla 1.0.0 → 1.1.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/index.d.ts CHANGED
@@ -1,6 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Observable } from 'rxjs';
3
- import { BaseApiService } from '@cupcake/core';
2
+ import { OnInit, EventEmitter, OnDestroy } from '@angular/core';
3
+ import { Observable, OperatorFunction } from 'rxjs';
4
+ import { BaseApiService, WebSocketService, AuthService, WebSocketMessage, NotificationService as NotificationService$1, ToastService, User, LabGroupService, LabGroup, LabGroupQueryResponse, ResourceVisibility } from '@cupcake/core';
5
+ export { WebSocketMessage } from '@cupcake/core';
6
+ import * as _angular_forms from '@angular/forms';
7
+ import { FormGroup, FormBuilder } from '@angular/forms';
8
+ import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';
9
+ import { FavouriteMetadataOption as FavouriteMetadataOption$1, SyntaxType as SyntaxType$1, FavouriteMetadataOptionService as FavouriteMetadataOptionService$1, MetadataColumnService as MetadataColumnService$1, MetadataColumnTemplateService as MetadataColumnTemplateService$1, OntologySuggestion as OntologySuggestion$1, MetadataValidationConfig as MetadataValidationConfig$1, MetadataTable as MetadataTable$1, MetadataTableService as MetadataTableService$1, OntologyTypeConfig as OntologyTypeConfig$1, ColumnTypeConfig as ColumnTypeConfig$1, MetadataColumnTemplate as MetadataColumnTemplate$1, SdrfColumnConfig as SdrfColumnConfig$1, SdrfSyntaxService as SdrfSyntaxService$1 } from '@cupcake/vanilla';
10
+ import { CdkDragDrop } from '@angular/cdk/drag-drop';
4
11
 
5
12
  interface BaseTimestampedModel {
6
13
  createdAt: string;
@@ -30,6 +37,7 @@ interface MetadataQueryParams {
30
37
  }
31
38
 
32
39
  declare enum OntologyType {
40
+ NONE = "",
33
41
  SPECIES = "species",
34
42
  TISSUE = "tissue",
35
43
  HUMAN_DISEASE = "human_disease",
@@ -50,6 +58,13 @@ declare enum TemplatePermissionLevel {
50
58
  ADMIN = "admin"
51
59
  }
52
60
  declare const TemplatePermissionLabels: Record<TemplatePermissionLevel, string>;
61
+ declare enum ColumnType {
62
+ CHARACTERISTICS = "characteristics",
63
+ COMMENT = "comment",
64
+ FACTOR_VALUE = "factor_value",
65
+ SOURCE_NAME = "source_name",
66
+ SPECIAL = "special"
67
+ }
53
68
 
54
69
  interface MetadataTable extends BaseTimestampedModel {
55
70
  id: number;
@@ -86,10 +101,46 @@ interface MetadataTableUpdateRequest {
86
101
  name?: string;
87
102
  description?: string;
88
103
  sampleCount?: number;
104
+ sampleCountConfirmed?: boolean;
89
105
  version?: string;
106
+ labGroup?: number;
90
107
  isLocked?: boolean;
91
108
  isPublished?: boolean;
92
109
  }
110
+ interface SampleCountValidationRequest {
111
+ newSampleCount: number;
112
+ }
113
+ interface SampleCountValidationResult {
114
+ valid: boolean;
115
+ warnings: string[];
116
+ affectedModifiers: Array<{
117
+ modifierIndex: number;
118
+ columnName: string;
119
+ samples: string;
120
+ invalidIndices: number[];
121
+ value: string;
122
+ }>;
123
+ affectedPools: Array<{
124
+ poolName: string;
125
+ invalidPooledOnly: number[];
126
+ invalidPooledAndIndependent: number[];
127
+ }>;
128
+ samplesToRemove: number[];
129
+ }
130
+ interface SampleCountValidationResponse {
131
+ currentSampleCount: number;
132
+ newSampleCount: number;
133
+ validationResult: SampleCountValidationResult;
134
+ }
135
+ interface SampleCountConfirmationError {
136
+ sampleCount: string[];
137
+ sampleCountConfirmationDetails: {
138
+ currentSampleCount: number;
139
+ newSampleCount: number;
140
+ requiresConfirmation: true;
141
+ validationResult: SampleCountValidationResult;
142
+ };
143
+ }
93
144
  interface MetadataTableQueryResponse {
94
145
  count: number;
95
146
  next?: string;
@@ -417,6 +468,7 @@ interface CellOntology {
417
468
  interface Schema {
418
469
  id: number;
419
470
  name: string;
471
+ displayName?: string;
420
472
  description?: string;
421
473
  category?: string;
422
474
  version?: string;
@@ -427,10 +479,10 @@ interface Schema {
427
479
  interface OntologySuggestion {
428
480
  id: string;
429
481
  value: string;
430
- display_name: string;
482
+ displayName: string;
431
483
  description?: string;
432
- ontology_type: string;
433
- full_data?: any;
484
+ ontologyType: string;
485
+ fullData?: any;
434
486
  }
435
487
  interface OntologySuggestionResponse {
436
488
  count: number;
@@ -443,34 +495,34 @@ interface UnimodSpecification {
443
495
  accession: string;
444
496
  name: string;
445
497
  definition: string;
446
- additional_data: Array<{
498
+ additionalData: Array<{
447
499
  id: string;
448
500
  description: string;
449
501
  }>;
450
- general_properties: Record<string, string>;
502
+ generalProperties: Record<string, string>;
451
503
  specifications: Record<string, UnimodSpecification>;
452
- delta_mono_mass: string;
453
- delta_avge_mass: string;
454
- delta_composition: string;
504
+ deltaMonoMass: string;
505
+ deltaAvgeMass: string;
506
+ deltaComposition: string;
455
507
  [key: string]: any;
456
508
  }
457
509
  interface UnimodFullData {
458
510
  accession: string;
459
511
  name: string;
460
512
  definition: string;
461
- additional_data: Array<{
513
+ additionalData: Array<{
462
514
  id: string;
463
515
  description: string;
464
516
  }>;
465
- general_properties: Record<string, string>;
517
+ generalProperties: Record<string, string>;
466
518
  specifications: Record<string, UnimodSpecification>;
467
- delta_mono_mass: string;
468
- delta_avge_mass: string;
469
- delta_composition: string;
519
+ deltaMonoMass: string;
520
+ deltaAvgeMass: string;
521
+ deltaComposition: string;
470
522
  [key: string]: any;
471
523
  }
472
524
  declare function isUnimodFullData(suggestion: any): suggestion is {
473
- full_data: UnimodFullData;
525
+ fullData: UnimodFullData;
474
526
  };
475
527
  declare class OntologyUtils {
476
528
  static getUnimodSpecifications(suggestion: any): (UnimodSpecification & {
@@ -482,8 +534,65 @@ declare class OntologyUtils {
482
534
  static formatUnimodName(data: UnimodFullData): string;
483
535
  }
484
536
 
537
+ interface OntologyCustomFilter {
538
+ [ontologyType: string]: {
539
+ [filterKey: string]: string | number | boolean;
540
+ };
541
+ }
542
+ interface OntologyTypeConfig {
543
+ value: string;
544
+ label: string;
545
+ customFilters?: OntologyCustomFilter;
546
+ }
547
+ interface ColumnTypeConfig {
548
+ value: string;
549
+ label: string;
550
+ }
551
+ declare enum MSTermType {
552
+ INSTRUMENT = "instrument",
553
+ CLEAVAGE_AGENT = "cleavage agent",
554
+ DISSOCIATION_METHOD = "dissociation method",
555
+ SAMPLE_ATTRIBUTE = "sample attribute",
556
+ CELL_LINE = "cell line",
557
+ ENRICHMENT_PROCESS = "enrichment process",
558
+ FRACTIONATION_METHOD = "fractionation method",
559
+ DATA_ACQUISITION_METHOD = "proteomics data acquisition method",
560
+ REDUCTION_REAGENT = "reduction reagent",
561
+ ALKYLATION_REAGENT = "alkylation reagent",
562
+ MASS_ANALYZER_TYPE = "mass analyzer type",
563
+ ANCESTRAL_CATEGORY = "ancestral category",
564
+ SEX = "sex",
565
+ DEVELOPMENTAL_STAGE = "developmental stage"
566
+ }
567
+ declare const ONTOLOGY_TYPE_CONFIGS: OntologyTypeConfig[];
568
+ declare const COLUMN_TYPE_CONFIGS: ColumnTypeConfig[];
569
+
570
+ interface SdrfColumnConfig {
571
+ name: string;
572
+ type: string;
573
+ description: string;
574
+ category?: SdrfColumnCategory;
575
+ isRequired?: boolean;
576
+ }
577
+ declare enum SdrfColumnCategory {
578
+ CORE_SAMPLE = "Core Sample Metadata",
579
+ CHARACTERISTICS = "Characteristics",
580
+ ASSAY = "Assay Information",
581
+ COMMENTS = "Comments",
582
+ MODIFICATIONS = "Modifications & Enzymes",
583
+ MASS_TOLERANCES = "Mass Tolerances",
584
+ TECHNICAL_PARAMS = "Technical Parameters",
585
+ SAMPLE_PREP = "Sample Preparation",
586
+ FILE_PROJECT = "File & Project Information"
587
+ }
588
+ declare const OFFICIAL_SDRF_COLUMNS: SdrfColumnConfig[];
589
+ declare function getSdrfColumnsByCategory(category?: SdrfColumnCategory): SdrfColumnConfig[];
590
+ declare function getRequiredSdrfColumns(): SdrfColumnConfig[];
591
+ declare function getSdrfColumnByName(name: string): SdrfColumnConfig | undefined;
592
+ declare function isSdrfColumnRequired(name: string): boolean;
593
+
485
594
  type TaskStatus = 'QUEUED' | 'STARTED' | 'SUCCESS' | 'FAILURE' | 'CANCELLED';
486
- type TaskType = 'EXPORT_EXCEL' | 'EXPORT_SDRF' | 'IMPORT_SDRF' | 'IMPORT_EXCEL' | 'EXPORT_MULTIPLE_SDRF' | 'EXPORT_MULTIPLE_EXCEL' | 'VALIDATE_TABLE';
595
+ type TaskType = 'EXPORT_EXCEL' | 'EXPORT_SDRF' | 'IMPORT_SDRF' | 'IMPORT_EXCEL' | 'EXPORT_MULTIPLE_SDRF' | 'EXPORT_MULTIPLE_EXCEL' | 'VALIDATE_TABLE' | 'REORDER_TABLE_COLUMNS' | 'REORDER_TEMPLATE_COLUMNS';
487
596
  interface AsyncTaskStatus {
488
597
  id: string;
489
598
  taskType: TaskType;
@@ -562,6 +671,13 @@ interface MetadataImportRequest {
562
671
  replaceExisting?: boolean;
563
672
  validateOntologies?: boolean;
564
673
  }
674
+ interface ChunkedImportRequest {
675
+ metadataTableId: number;
676
+ chunkedUploadId: string;
677
+ replaceExisting?: boolean;
678
+ validateOntologies?: boolean;
679
+ createPools?: boolean;
680
+ }
565
681
  interface MetadataValidationRequest {
566
682
  metadataTableId: number;
567
683
  validateSdrfFormat?: boolean;
@@ -633,25 +749,11 @@ interface ChunkedUploadCompletionRequest {
633
749
  replaceExisting?: boolean;
634
750
  }
635
751
  interface ChunkedUploadCompletionResponse {
636
- message: string;
752
+ message?: string;
637
753
  filename?: string;
638
754
  warning?: string;
639
755
  error?: string;
640
- createdColumns?: number;
641
- createdPools?: number;
642
- sampleRows?: number;
643
- metadataColumns?: Array<{
644
- id: number;
645
- name: string;
646
- type: string;
647
- position: number;
648
- }>;
649
- samplePools?: Array<{
650
- id: number;
651
- name: string;
652
- totalSamples: number;
653
- isReference: boolean;
654
- }>;
756
+ taskId?: string;
655
757
  }
656
758
 
657
759
  interface MetadataTableQueryParams {
@@ -726,6 +828,15 @@ declare class MetadataTableService extends BaseApiService {
726
828
  normalizeColumnPositions(id: number): Observable<{
727
829
  message: string;
728
830
  }>;
831
+ /**
832
+ * Start async reordering of table columns by schema
833
+ */
834
+ reorderColumnsBySchemaAsync(id: number, schemaIds?: number[]): Observable<{
835
+ taskId: string;
836
+ message: string;
837
+ metadataTableId: number;
838
+ schemaIds: number[];
839
+ }>;
729
840
  /**
730
841
  * Get all tables (admin only)
731
842
  */
@@ -760,6 +871,13 @@ declare class MetadataTableService extends BaseApiService {
760
871
  message: string;
761
872
  combinedColumn: any;
762
873
  }>;
874
+ validateSampleCountChange(id: number, request: SampleCountValidationRequest): Observable<SampleCountValidationResponse>;
875
+ updateSampleCount(id: number, newSampleCount: number, confirmed?: boolean): Observable<{
876
+ message: string;
877
+ oldSampleCount: number;
878
+ newSampleCount: number;
879
+ cleanupPerformed: boolean;
880
+ }>;
763
881
  static ɵfac: i0.ɵɵFactoryDeclaration<MetadataTableService, never>;
764
882
  static ɵprov: i0.ɵɵInjectableDeclaration<MetadataTableService>;
765
883
  }
@@ -1011,6 +1129,15 @@ declare class MetadataTableTemplateService extends BaseApiService {
1011
1129
  normalizeColumnPositions(id: number): Observable<{
1012
1130
  message: string;
1013
1131
  }>;
1132
+ /**
1133
+ * Start async reordering of template columns by schema
1134
+ */
1135
+ reorderColumnsBySchemaAsync(id: number, schemaIds?: number[]): Observable<{
1136
+ taskId: string;
1137
+ message: string;
1138
+ templateId: number;
1139
+ schemaIds: number[];
1140
+ }>;
1014
1141
  /**
1015
1142
  * Apply this template to a metadata table
1016
1143
  */
@@ -1064,10 +1191,7 @@ declare class MetadataTableTemplateService extends BaseApiService {
1064
1191
  name: string;
1065
1192
  description?: string;
1066
1193
  sampleCount: number;
1067
- }): Observable<{
1068
- message: string;
1069
- table: MetadataTable;
1070
- }>;
1194
+ }): Observable<MetadataTable>;
1071
1195
  /**
1072
1196
  * Create a new metadata table directly from schema definitions
1073
1197
  */
@@ -1076,16 +1200,14 @@ declare class MetadataTableTemplateService extends BaseApiService {
1076
1200
  name: string;
1077
1201
  description?: string;
1078
1202
  sampleCount: number;
1079
- }): Observable<{
1080
- message: string;
1081
- table: MetadataTable;
1082
- }>;
1203
+ }): Observable<MetadataTable>;
1083
1204
  static ɵfac: i0.ɵɵFactoryDeclaration<MetadataTableTemplateService, never>;
1084
1205
  static ɵprov: i0.ɵɵInjectableDeclaration<MetadataTableTemplateService>;
1085
1206
  }
1086
1207
 
1087
1208
  interface FavouriteMetadataOptionQueryParams {
1088
1209
  search?: string;
1210
+ name?: string;
1089
1211
  type?: string;
1090
1212
  userId?: number;
1091
1213
  labGroupId?: number;
@@ -1280,6 +1402,56 @@ declare class MetadataManagementService extends BaseApiService {
1280
1402
  static ɵprov: i0.ɵɵInjectableDeclaration<MetadataManagementService>;
1281
1403
  }
1282
1404
 
1405
+ declare class Websocket extends WebSocketService {
1406
+ constructor(authService: AuthService);
1407
+ getMetadataTableUpdates(): Observable<WebSocketMessage>;
1408
+ getLabGroupUpdates(): Observable<WebSocketMessage>;
1409
+ static ɵfac: i0.ɵɵFactoryDeclaration<Websocket, never>;
1410
+ static ɵprov: i0.ɵɵInjectableDeclaration<Websocket>;
1411
+ }
1412
+
1413
+ declare class AdminWebSocketService extends WebSocketService {
1414
+ constructor(authService: AuthService);
1415
+ getAdminNotifications(): Observable<WebSocketMessage>;
1416
+ getSystemNotifications(): Observable<WebSocketMessage>;
1417
+ static ɵfac: i0.ɵɵFactoryDeclaration<AdminWebSocketService, never>;
1418
+ static ɵprov: i0.ɵɵInjectableDeclaration<AdminWebSocketService>;
1419
+ }
1420
+
1421
+ declare enum NotificationType {
1422
+ SYSTEM = "system",
1423
+ METADATA_TABLE = "metadata_table",
1424
+ LAB_GROUP = "lab_group",
1425
+ FILE_UPLOAD = "file_upload",
1426
+ DATA_PROCESSING = "data_processing",
1427
+ ASYNC_TASK = "async_task",
1428
+ USER = "user"
1429
+ }
1430
+ declare class NotificationService extends NotificationService$1 {
1431
+ private websocketService;
1432
+ private adminWebSocketService;
1433
+ private isConnected;
1434
+ private isAdminConnected;
1435
+ readonly isWebSocketConnected: i0.Signal<boolean>;
1436
+ readonly isAdminWebSocketConnected: i0.Signal<boolean>;
1437
+ constructor(websocketService: Websocket, adminWebSocketService: AdminWebSocketService, toastService: ToastService);
1438
+ private initializeWebSocket;
1439
+ private setupNotificationHandlers;
1440
+ private handleWebSocketMessage;
1441
+ private createNotificationFromWebSocket;
1442
+ private getAsyncTaskTitle;
1443
+ private getAsyncTaskLevel;
1444
+ private handleAdminWebSocketMessage;
1445
+ connect(): void;
1446
+ connectAdmin(): void;
1447
+ disconnect(): void;
1448
+ disconnectAdmin(): void;
1449
+ subscribeToMetadataTable(tableId: number): void;
1450
+ createVanillaNotification(type: NotificationType, title: string, message: string, level?: 'info' | 'success' | 'warning' | 'error', autoClose?: boolean): void;
1451
+ static ɵfac: i0.ɵɵFactoryDeclaration<NotificationService, never>;
1452
+ static ɵprov: i0.ɵɵInjectableDeclaration<NotificationService>;
1453
+ }
1454
+
1283
1455
  declare class OntologySearchService extends BaseApiService {
1284
1456
  /**
1285
1457
  * Get ontology suggestions across all sources for SDRF validation
@@ -1433,23 +1605,6 @@ declare class AsyncExportService extends BaseApiService {
1433
1605
  static ɵprov: i0.ɵɵInjectableDeclaration<AsyncExportService>;
1434
1606
  }
1435
1607
 
1436
- declare class AsyncImportService extends BaseApiService {
1437
- /**
1438
- * Calculate SHA256 hash of a file
1439
- */
1440
- private calculateSHA256;
1441
- sdrfFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse>;
1442
- excelFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse>;
1443
- static ɵfac: i0.ɵɵFactoryDeclaration<AsyncImportService, never>;
1444
- static ɵprov: i0.ɵɵInjectableDeclaration<AsyncImportService>;
1445
- }
1446
-
1447
- declare class AsyncValidationService extends BaseApiService {
1448
- metadataTable(request: MetadataValidationRequest): Observable<AsyncTaskCreateResponse>;
1449
- static ɵfac: i0.ɵɵFactoryDeclaration<AsyncValidationService, never>;
1450
- static ɵprov: i0.ɵɵInjectableDeclaration<AsyncValidationService>;
1451
- }
1452
-
1453
1608
  declare class ChunkedUploadService extends BaseApiService {
1454
1609
  /**
1455
1610
  * Initialize or continue a chunked upload
@@ -1463,6 +1618,10 @@ declare class ChunkedUploadService extends BaseApiService {
1463
1618
  * Complete the chunked upload and process the file
1464
1619
  */
1465
1620
  completeUpload(uploadId: string, request?: ChunkedUploadCompletionRequest): Observable<ChunkedUploadCompletionResponse>;
1621
+ /**
1622
+ * Complete the chunked upload by uploading the entire file at once
1623
+ */
1624
+ completeUploadWithFile(request: ChunkedUploadRequest): Observable<ChunkedUploadCompletionResponse>;
1466
1625
  /**
1467
1626
  * Delete/cancel a chunked upload
1468
1627
  */
@@ -1482,10 +1641,835 @@ declare class ChunkedUploadService extends BaseApiService {
1482
1641
  static ɵprov: i0.ɵɵInjectableDeclaration<ChunkedUploadService>;
1483
1642
  }
1484
1643
 
1644
+ declare class AsyncImportService extends BaseApiService {
1645
+ private chunkedUploadService;
1646
+ constructor(chunkedUploadService: ChunkedUploadService);
1647
+ sdrfFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse>;
1648
+ excelFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse>;
1649
+ static ɵfac: i0.ɵɵFactoryDeclaration<AsyncImportService, never>;
1650
+ static ɵprov: i0.ɵɵInjectableDeclaration<AsyncImportService>;
1651
+ }
1652
+
1653
+ declare class AsyncValidationService extends BaseApiService {
1654
+ metadataTable(request: MetadataValidationRequest): Observable<AsyncTaskCreateResponse>;
1655
+ static ɵfac: i0.ɵɵFactoryDeclaration<AsyncValidationService, never>;
1656
+ static ɵprov: i0.ɵɵInjectableDeclaration<AsyncValidationService>;
1657
+ }
1658
+
1659
+ interface ChunkedFileImportRequest {
1660
+ file: File;
1661
+ metadataTableId: number;
1662
+ replaceExisting?: boolean;
1663
+ validateOntologies?: boolean;
1664
+ createPools?: boolean;
1665
+ }
1666
+ interface ChunkedImportProgress {
1667
+ uploadProgress: number;
1668
+ phase: 'uploading' | 'processing' | 'completed' | 'failed';
1669
+ taskId?: string;
1670
+ }
1671
+ declare class ChunkedImportService extends BaseApiService {
1672
+ private chunkedUploadService;
1673
+ constructor(chunkedUploadService: ChunkedUploadService);
1674
+ /**
1675
+ * Import SDRF file using chunked upload for better performance with large files
1676
+ */
1677
+ importSdrfFileChunked(request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse>;
1678
+ /**
1679
+ * Import Excel file using chunked upload for better performance with large files
1680
+ */
1681
+ importExcelFileChunked(request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse>;
1682
+ /**
1683
+ * Generic chunked import that auto-detects file type
1684
+ */
1685
+ importFileChunked(request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse>;
1686
+ /**
1687
+ * Upload file using chunked upload with metadata processing
1688
+ */
1689
+ private uploadFileChunked;
1690
+ /**
1691
+ * Trigger async import processing after chunked upload completion
1692
+ * This uses the existing async-import endpoints but with chunked upload completion
1693
+ */
1694
+ private triggerAsyncImport;
1695
+ /**
1696
+ * Validate file type
1697
+ */
1698
+ private validateFileType;
1699
+ /**
1700
+ * Get file extension from filename
1701
+ */
1702
+ private getFileExtension;
1703
+ /**
1704
+ * Create progress observable for UI updates
1705
+ */
1706
+ createProgressObservable(request: ChunkedFileImportRequest, onProgress?: (progress: ChunkedImportProgress) => void): Observable<AsyncTaskCreateResponse>;
1707
+ /**
1708
+ * Queue chunked file import task using completed chunked upload
1709
+ * This uses the new backend endpoint that processes already uploaded chunks
1710
+ */
1711
+ processChunkedUpload(request: ChunkedImportRequest): Observable<AsyncTaskCreateResponse>;
1712
+ static ɵfac: i0.ɵɵFactoryDeclaration<ChunkedImportService, never>;
1713
+ static ɵprov: i0.ɵɵInjectableDeclaration<ChunkedImportService>;
1714
+ }
1715
+
1716
+ interface AgeFormat {
1717
+ years?: number;
1718
+ months?: number;
1719
+ days?: number;
1720
+ isRange?: boolean;
1721
+ rangeStart?: AgeFormat;
1722
+ rangeEnd?: AgeFormat;
1723
+ }
1724
+ interface ModificationParameters {
1725
+ NT?: string;
1726
+ AC?: string;
1727
+ CF?: string;
1728
+ MT?: string;
1729
+ PP?: string;
1730
+ TA?: string;
1731
+ MM?: string;
1732
+ TS?: string;
1733
+ }
1734
+ interface CleavageAgentDetails {
1735
+ NT?: string;
1736
+ AC?: string;
1737
+ CS?: string;
1738
+ }
1739
+ interface SpikedCompound {
1740
+ SP?: string;
1741
+ CT?: string;
1742
+ QY?: string;
1743
+ PS?: string;
1744
+ AC?: string;
1745
+ CN?: string;
1746
+ CV?: string;
1747
+ CS?: string;
1748
+ CF?: string;
1749
+ }
1750
+ interface PooledSample {
1751
+ value: 'not pooled' | 'pooled' | string;
1752
+ sourceNames?: string[];
1753
+ }
1754
+ interface SyntheticPeptide {
1755
+ value: 'synthetic' | 'not synthetic';
1756
+ }
1757
+ interface ValidationResult {
1758
+ isValid: boolean;
1759
+ errors: string[];
1760
+ warnings?: string[];
1761
+ }
1762
+ type SyntaxType = 'age' | 'modification' | 'cleavage' | 'spiked_compound' | 'pooled_sample' | 'synthetic_peptide';
1763
+ declare class SdrfSyntaxService {
1764
+ private readonly SPECIAL_COLUMN_PATTERNS;
1765
+ private readonly MODIFICATION_KEYS;
1766
+ private readonly CLEAVAGE_KEYS;
1767
+ private readonly SPIKED_COMPOUND_KEYS;
1768
+ private readonly POOLED_SAMPLE_VALUES;
1769
+ private readonly SYNTHETIC_PEPTIDE_VALUES;
1770
+ /**
1771
+ * Detects if a column requires special SDRF syntax handling
1772
+ */
1773
+ detectSpecialSyntax(columnName: string, columnType: string): SyntaxType | null;
1774
+ /**
1775
+ * Parses a value based on the syntax type
1776
+ */
1777
+ parseValue(syntaxType: SyntaxType, value: string): any;
1778
+ /**
1779
+ * Formats parsed data back to string format
1780
+ */
1781
+ formatValue(syntaxType: SyntaxType, data: any): string;
1782
+ /**
1783
+ * Validates parsed data
1784
+ */
1785
+ validateValue(syntaxType: SyntaxType, data: any): ValidationResult;
1786
+ private parseAgeFormat;
1787
+ private parseSingleAge;
1788
+ private formatAgeFormat;
1789
+ private formatSingleAge;
1790
+ private parseKeyValuePairs;
1791
+ private formatKeyValuePairs;
1792
+ private validateAgeFormat;
1793
+ private validateSingleAge;
1794
+ private validateModificationParameters;
1795
+ private validateCleavageAgentDetails;
1796
+ private validateSpikedCompound;
1797
+ getPooledSampleValues(): string[];
1798
+ getSyntheticPeptideValues(): string[];
1799
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdrfSyntaxService, never>;
1800
+ static ɵprov: i0.ɵɵInjectableDeclaration<SdrfSyntaxService>;
1801
+ }
1802
+
1803
+ interface ElectronAPI {
1804
+ platform: string;
1805
+ isElectron: boolean;
1806
+ getAppVersion(): Promise<string>;
1807
+ getElectronVersion(): Promise<string>;
1808
+ minimize(): void;
1809
+ maximize(): void;
1810
+ close(): void;
1811
+ isMaximized(): Promise<boolean>;
1812
+ showOpenDialog(options?: any): Promise<any>;
1813
+ showSaveDialog(options?: any): Promise<any>;
1814
+ showMessageBox(options: any): Promise<any>;
1815
+ downloadFile(url: string, filename?: string): Promise<string>;
1816
+ getBackendPort(): Promise<number>;
1817
+ isBackendReady(): Promise<boolean>;
1818
+ onBackendStatusChange(callback: (status: any) => void): () => void;
1819
+ onWindowStateChange(callback: (state: 'maximized' | 'unmaximized') => void): () => void;
1820
+ }
1821
+ declare global {
1822
+ interface Window {
1823
+ electronAPI?: ElectronAPI;
1824
+ }
1825
+ }
1826
+ declare class ElectronService {
1827
+ private electronAPI;
1828
+ constructor();
1829
+ get isElectron(): boolean;
1830
+ get platform(): string;
1831
+ getAppVersion(): Promise<string>;
1832
+ getElectronVersion(): Promise<string>;
1833
+ minimize(): void;
1834
+ maximize(): void;
1835
+ close(): void;
1836
+ isMaximized(): Promise<boolean>;
1837
+ showOpenDialog(options?: any): Promise<any>;
1838
+ showSaveDialog(options?: any): Promise<any>;
1839
+ showMessageBox(options: any): Promise<any>;
1840
+ downloadFile(url: string, filename?: string): Promise<string>;
1841
+ getBackendPort(): Promise<number>;
1842
+ isBackendReady(): Promise<boolean>;
1843
+ onBackendStatusChange(): Observable<any>;
1844
+ onWindowStateChange(): Observable<'maximized' | 'unmaximized'>;
1845
+ static ɵfac: i0.ɵɵFactoryDeclaration<ElectronService, never>;
1846
+ static ɵprov: i0.ɵɵInjectableDeclaration<ElectronService>;
1847
+ }
1848
+
1849
+ declare class SdrfAgeInput implements OnInit {
1850
+ value: string;
1851
+ valueChange: EventEmitter<string>;
1852
+ private fb;
1853
+ private sdrfSyntax;
1854
+ ageForm: FormGroup;
1855
+ isRange: boolean;
1856
+ ngOnInit(): void;
1857
+ private parseAndSetValue;
1858
+ private updateValue;
1859
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdrfAgeInput, never>;
1860
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdrfAgeInput, "ccv-sdrf-age-input", never, { "value": { "alias": "value"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
1861
+ }
1862
+
1863
+ declare class SdrfModificationInput implements OnInit {
1864
+ value: string;
1865
+ templateId: number | null;
1866
+ columnId: number | null;
1867
+ valueChange: EventEmitter<string>;
1868
+ searchType: i0.WritableSignal<"icontains" | "istartswith">;
1869
+ private fb;
1870
+ private sdrfSyntax;
1871
+ private metadataColumnService;
1872
+ private metadataColumnTemplateService;
1873
+ modificationForm: FormGroup;
1874
+ modificationTypes: string[];
1875
+ positions: string[];
1876
+ selectedUnimodData: i0.WritableSignal<UnimodFullData | null>;
1877
+ availableSpecifications: i0.WritableSignal<(UnimodSpecification & {
1878
+ specNumber: string;
1879
+ })[]>;
1880
+ selectedSpecification: i0.WritableSignal<string | null>;
1881
+ showSpecifications: i0.WritableSignal<boolean>;
1882
+ showHiddenSpecifications: i0.WritableSignal<boolean>;
1883
+ hiddenSpecificationCount: i0.WritableSignal<number>;
1884
+ ngOnInit(): void;
1885
+ private parseAndSetValue;
1886
+ private getStringValue;
1887
+ private updateValue;
1888
+ searchModificationTerms: OperatorFunction<string, readonly OntologySuggestion[]>;
1889
+ formatOntologySuggestion: (suggestion: OntologySuggestion) => string;
1890
+ onOntologySuggestionSelected: (event: any) => void;
1891
+ formatTargetAminoAcids(value: string): string;
1892
+ onTargetAminoAcidChange(event: any): void;
1893
+ onSpecificationSelected(specNumber: string): void;
1894
+ private mapUnimodPosition;
1895
+ private mapClassificationToType;
1896
+ getSpecificationDisplay(spec: UnimodSpecification & {
1897
+ specNumber: string;
1898
+ }): string;
1899
+ onSearchTypeChange(type: 'icontains' | 'istartswith'): void;
1900
+ private updateAvailableSpecifications;
1901
+ toggleHiddenSpecifications(): void;
1902
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdrfModificationInput, never>;
1903
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdrfModificationInput, "ccv-sdrf-modification-input", never, { "value": { "alias": "value"; "required": false; }; "templateId": { "alias": "templateId"; "required": false; }; "columnId": { "alias": "columnId"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
1904
+ }
1905
+
1906
+ declare class SdrfSpikedCompoundInput implements OnInit {
1907
+ value: string;
1908
+ valueChange: EventEmitter<string>;
1909
+ private fb;
1910
+ private sdrfSyntax;
1911
+ spikedForm: FormGroup;
1912
+ compoundTypes: string[];
1913
+ ngOnInit(): void;
1914
+ private parseAndSetValue;
1915
+ private getStringValue;
1916
+ private updateValue;
1917
+ get showProteinFields(): boolean;
1918
+ get showPeptideFields(): boolean;
1919
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdrfSpikedCompoundInput, never>;
1920
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdrfSpikedCompoundInput, "ccv-sdrf-spiked-compound-input", never, { "value": { "alias": "value"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
1921
+ }
1922
+
1923
+ declare class SdrfCleavageInput implements OnInit {
1924
+ value: string;
1925
+ templateId: number | null;
1926
+ columnId: number | null;
1927
+ valueChange: EventEmitter<string>;
1928
+ searchType: i0.WritableSignal<"icontains" | "istartswith">;
1929
+ private fb;
1930
+ private sdrfSyntax;
1931
+ private metadataColumnService;
1932
+ private metadataColumnTemplateService;
1933
+ cleavageForm: FormGroup;
1934
+ ngOnInit(): void;
1935
+ private parseAndSetValue;
1936
+ private getStringValue;
1937
+ private updateValue;
1938
+ searchCleavageTerms: OperatorFunction<string, readonly OntologySuggestion[]>;
1939
+ formatOntologySuggestion: (suggestion: OntologySuggestion) => string;
1940
+ onOntologySuggestionSelected: (event: any) => void;
1941
+ onSearchTypeChange(type: 'icontains' | 'istartswith'): void;
1942
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdrfCleavageInput, never>;
1943
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdrfCleavageInput, "ccv-sdrf-cleavage-input", never, { "value": { "alias": "value"; "required": false; }; "templateId": { "alias": "templateId"; "required": false; }; "columnId": { "alias": "columnId"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
1944
+ }
1945
+
1946
+ interface MetadataValueEditConfig {
1947
+ columnId?: number;
1948
+ columnName: string;
1949
+ columnType: string;
1950
+ ontologyType?: string;
1951
+ enableTypeahead?: boolean;
1952
+ currentValue?: string;
1953
+ context: 'template' | 'table' | 'pool' | 'favorite_management';
1954
+ templateId?: number;
1955
+ tableId?: number;
1956
+ poolId?: number;
1957
+ customOntologyFilters?: Record<string, any>;
1958
+ enableMultiSampleEdit?: boolean;
1959
+ sampleData?: {
1960
+ index: number;
1961
+ value: string;
1962
+ sourceName?: string;
1963
+ }[];
1964
+ maxSampleCount?: number;
1965
+ }
1966
+ declare class MetadataValueEditModal implements OnInit {
1967
+ private fb;
1968
+ private activeModal;
1969
+ private authService;
1970
+ private favouriteMetadataOptionService;
1971
+ private metadataColumnService;
1972
+ private metadataColumnTemplateService;
1973
+ private labGroupService;
1974
+ config: MetadataValueEditConfig;
1975
+ valueSaved: EventEmitter<string | {
1976
+ value: string;
1977
+ sampleIndices: number[];
1978
+ }>;
1979
+ editForm: FormGroup;
1980
+ isLoading: i0.WritableSignal<boolean>;
1981
+ isLoadingSuggestions: i0.WritableSignal<boolean>;
1982
+ searchType: i0.WritableSignal<"icontains" | "istartswith">;
1983
+ isLoadingFavorites: i0.WritableSignal<boolean>;
1984
+ userFavorites: i0.WritableSignal<FavouriteMetadataOption$1[]>;
1985
+ labGroupFavorites: i0.WritableSignal<FavouriteMetadataOption$1[]>;
1986
+ globalFavorites: i0.WritableSignal<FavouriteMetadataOption$1[]>;
1987
+ selectedFavorite: i0.WritableSignal<FavouriteMetadataOption$1 | null>;
1988
+ currentUser: i0.WritableSignal<User | null>;
1989
+ userLabGroups: i0.WritableSignal<number[]>;
1990
+ activeFavoritesTab: 'user' | 'lab_group' | 'global';
1991
+ private sdrfSyntaxService;
1992
+ specialSyntaxType: i0.WritableSignal<SyntaxType$1 | null>;
1993
+ showSpecialInput: i0.WritableSignal<boolean>;
1994
+ specialInputValue: i0.WritableSignal<string>;
1995
+ selectedSampleIndices: i0.WritableSignal<Set<number>>;
1996
+ showSamplePanel: i0.WritableSignal<boolean>;
1997
+ constructor(fb: FormBuilder, activeModal: NgbActiveModal, authService: AuthService, favouriteMetadataOptionService: FavouriteMetadataOptionService$1, metadataColumnService: MetadataColumnService$1, metadataColumnTemplateService: MetadataColumnTemplateService$1, labGroupService: LabGroupService);
1998
+ ngOnInit(): void;
1999
+ onCancel(): void;
2000
+ onClose(): void;
2001
+ get title(): string;
2002
+ get hasOntologyType(): boolean;
2003
+ get ontologyTypeLabel(): string;
2004
+ get isFromFavoriteManagement(): boolean;
2005
+ searchOntology: (text$: Observable<string>) => Observable<OntologySuggestion$1[]>;
2006
+ formatSuggestion: (suggestion: OntologySuggestion$1) => string;
2007
+ inputFormatter: (suggestion: OntologySuggestion$1) => string;
2008
+ onSuggestionSelected: (event: any) => void;
2009
+ onSearchTypeChange(type: 'icontains' | 'istartswith'): void;
2010
+ clearValue(): void;
2011
+ loadFavoriteOptions(): void;
2012
+ selectFavorite(favorite: FavouriteMetadataOption$1): void;
2013
+ onFavoriteSelected(event: Event, favoritesList: FavouriteMetadataOption$1[]): void;
2014
+ setActiveFavoritesTab(tab: 'user' | 'lab_group' | 'global'): void;
2015
+ setInitialActiveFavoritesTab(): void;
2016
+ addToFavorites(scope?: 'user' | 'lab_group' | 'global'): void;
2017
+ get hasFavorites(): boolean;
2018
+ getFavoriteDisplayValue(favorite: FavouriteMetadataOption$1): string;
2019
+ getFavoriteTooltip(favorite: FavouriteMetadataOption$1): string;
2020
+ hasCustomDisplayValue(favorite: FavouriteMetadataOption$1): boolean;
2021
+ getSelectedFavoriteInfo(): string;
2022
+ loadUserLabGroups(): void;
2023
+ onSpecialInputChange(value: string): void;
2024
+ toggleSpecialInput(): void;
2025
+ getSpecialInputTitle(): string;
2026
+ get hasMultiSampleEdit(): boolean;
2027
+ get sampleData(): {
2028
+ index: number;
2029
+ value: string;
2030
+ sourceName?: string;
2031
+ }[];
2032
+ toggleSampleSelection(sampleIndex: number): void;
2033
+ selectAllSamples(): void;
2034
+ clearSampleSelection(): void;
2035
+ get selectedSampleCount(): number;
2036
+ get totalSampleCount(): number;
2037
+ isSampleSelected(sampleIndex: number): boolean;
2038
+ onSubmit(): void;
2039
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetadataValueEditModal, never>;
2040
+ static ɵcmp: i0.ɵɵComponentDeclaration<MetadataValueEditModal, "ccv-metadata-value-edit-modal", never, { "config": { "alias": "config"; "required": false; }; }, { "valueSaved": "valueSaved"; }, never, never, true, never>;
2041
+ }
2042
+
2043
+ interface ExcelExportOptions {
2044
+ includeLabGroups: 'none' | 'selected' | 'all';
2045
+ selectedLabGroupIds: number[];
2046
+ includePools: boolean;
2047
+ }
2048
+ declare class ExcelExportModalComponent implements OnInit {
2049
+ activeModal: NgbActiveModal;
2050
+ labGroupService: LabGroupService;
2051
+ isLoadingLabGroups: i0.WritableSignal<boolean>;
2052
+ availableLabGroups: i0.WritableSignal<LabGroup[]>;
2053
+ includeLabGroups: i0.WritableSignal<"none" | "selected" | "all">;
2054
+ selectedLabGroupIds: i0.WritableSignal<number[]>;
2055
+ includePools: i0.WritableSignal<boolean>;
2056
+ showLabGroupSelection: i0.Signal<boolean>;
2057
+ canConfirm: i0.Signal<boolean>;
2058
+ ngOnInit(): void;
2059
+ private loadLabGroups;
2060
+ onLabGroupToggle(labGroupId: number, checked: boolean): void;
2061
+ isLabGroupSelected(labGroupId: number): boolean;
2062
+ onIncludeLabGroupsChange(value: 'none' | 'selected' | 'all'): void;
2063
+ selectAllLabGroups(): void;
2064
+ deselectAllLabGroups(): void;
2065
+ confirm(): void;
2066
+ cancel(): void;
2067
+ static ɵfac: i0.ɵɵFactoryDeclaration<ExcelExportModalComponent, never>;
2068
+ static ɵcmp: i0.ɵɵComponentDeclaration<ExcelExportModalComponent, "ccv-excel-export-modal", never, {}, {}, never, never, true, never>;
2069
+ }
2070
+
2071
+ interface ValidationResults {
2072
+ success: boolean;
2073
+ metadata_table_id: number;
2074
+ metadata_table_name: string;
2075
+ validation_timestamp: string;
2076
+ errors: string[];
2077
+ warnings: string[];
2078
+ }
2079
+ declare class ValidationResultsModal {
2080
+ results?: ValidationResults;
2081
+ activeModal: NgbActiveModal;
2082
+ formatTimestamp(timestamp: string): string;
2083
+ static ɵfac: i0.ɵɵFactoryDeclaration<ValidationResultsModal, never>;
2084
+ static ɵcmp: i0.ɵɵComponentDeclaration<ValidationResultsModal, "ccv-validation-results-modal", never, { "results": { "alias": "results"; "required": false; }; }, {}, never, never, true, never>;
2085
+ }
2086
+
2087
+ declare class MetadataValidationModal {
2088
+ config?: MetadataValidationConfig$1;
2089
+ private fb;
2090
+ private asyncTaskService;
2091
+ private toastService;
2092
+ activeModal: NgbActiveModal;
2093
+ isValidating: i0.WritableSignal<boolean>;
2094
+ validationError: i0.WritableSignal<string | null>;
2095
+ validationForm: _angular_forms.FormGroup<{
2096
+ validate_sdrf_format: _angular_forms.FormControl<boolean | null>;
2097
+ }>;
2098
+ onSubmit(): void;
2099
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetadataValidationModal, never>;
2100
+ static ɵcmp: i0.ɵɵComponentDeclaration<MetadataValidationModal, "ccv-metadata-validation-modal", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
2101
+ }
2102
+
2103
+ declare class MetadataTableEditModal implements OnInit {
2104
+ private fb;
2105
+ private activeModal;
2106
+ private modalService;
2107
+ private metadataTableService;
2108
+ private labGroupService;
2109
+ table?: MetadataTable$1;
2110
+ isCreateMode: boolean;
2111
+ tableSaved: EventEmitter<MetadataTable$1>;
2112
+ editForm: FormGroup;
2113
+ isLoading: i0.WritableSignal<boolean>;
2114
+ availableLabGroups: i0.WritableSignal<LabGroup[]>;
2115
+ isLoadingLabGroups: i0.WritableSignal<boolean>;
2116
+ constructor(fb: FormBuilder, activeModal: NgbActiveModal, modalService: NgbModal, metadataTableService: MetadataTableService$1, labGroupService: LabGroupService);
2117
+ ngOnInit(): void;
2118
+ loadLabGroups(): void;
2119
+ onSubmit(): void;
2120
+ private performCreate;
2121
+ private performUpdate;
2122
+ private handleSampleCountConfirmation;
2123
+ private formatAffectedData;
2124
+ private isSampleCountConfirmationError;
2125
+ onCancel(): void;
2126
+ get title(): string;
2127
+ get hasChanges(): boolean;
2128
+ isFieldInvalid(fieldName: string): boolean;
2129
+ getFieldError(fieldName: string): string;
2130
+ private getFieldDisplayName;
2131
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetadataTableEditModal, never>;
2132
+ static ɵcmp: i0.ɵɵComponentDeclaration<MetadataTableEditModal, "ccv-metadata-table-edit-modal", never, { "table": { "alias": "table"; "required": false; }; "isCreateMode": { "alias": "isCreateMode"; "required": false; }; }, { "tableSaved": "tableSaved"; }, never, never, true, never>;
2133
+ }
2134
+
2135
+ declare class AsyncTaskUIService implements OnDestroy {
2136
+ private destroy$;
2137
+ private tasksSubject;
2138
+ private isSubscribed;
2139
+ private metadataTableRefreshSubject;
2140
+ private taskCompletedSubject;
2141
+ private exportTaskCompletedSubject;
2142
+ private readonly sessionId;
2143
+ private initiatedTasks;
2144
+ private libraryAsyncTaskService;
2145
+ private asyncExportService;
2146
+ private asyncImportService;
2147
+ private asyncValidationService;
2148
+ private toastService;
2149
+ private websocket;
2150
+ private modalService;
2151
+ private electronService;
2152
+ tasks$: Observable<AsyncTaskStatus[]>;
2153
+ activeTasks$: Observable<AsyncTaskStatus[]>;
2154
+ metadataTableRefresh$: Observable<number>;
2155
+ taskCompleted$: Observable<AsyncTaskStatus>;
2156
+ exportTaskCompleted$: Observable<AsyncTaskStatus>;
2157
+ constructor();
2158
+ ngOnDestroy(): void;
2159
+ private initializeService;
2160
+ startRealtimeUpdates(): void;
2161
+ stopRealtimeUpdates(): void;
2162
+ getTasks(): Observable<AsyncTaskStatus[]>;
2163
+ getTask(taskId: string): Observable<AsyncTaskStatus>;
2164
+ cancelTask(taskId: string): Observable<{
2165
+ message: string;
2166
+ }>;
2167
+ private generateSessionId;
2168
+ private isTaskInitiatedByThisTab;
2169
+ /**
2170
+ * Mark a task as initiated by this tab for tracking purposes
2171
+ */
2172
+ monitorTask(taskId: string): void;
2173
+ queueExcelExport(request: MetadataExportRequest): Observable<AsyncTaskCreateResponse>;
2174
+ queueSdrfExport(request: MetadataExportRequest): Observable<AsyncTaskCreateResponse>;
2175
+ queueSdrfImport(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse>;
2176
+ queueExcelImport(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse>;
2177
+ queueBulkSdrfExport(request: BulkExportRequest): Observable<AsyncTaskCreateResponse>;
2178
+ queueBulkExcelExport(request: BulkExcelExportRequest): Observable<AsyncTaskCreateResponse>;
2179
+ downloadTaskResult(taskId: string): void;
2180
+ validateMetadataTable(validationRequest: MetadataValidationRequest): Observable<AsyncTaskCreateResponse>;
2181
+ private handleTaskUpdate;
2182
+ private showTaskProgressNotification;
2183
+ private showTaskCompletionNotification;
2184
+ getTaskDisplayName(taskType: string): string;
2185
+ getTaskStatusClass(status: string): string;
2186
+ formatDuration(duration: number | null): string;
2187
+ canCancelTask(status: string): boolean;
2188
+ canDownloadResult(task: AsyncTaskStatus): boolean;
2189
+ private isImportTask;
2190
+ private isExportTask;
2191
+ private handleExportTaskCompletion;
2192
+ private handleValidationTaskCompletion;
2193
+ private showValidationResultsModal;
2194
+ private handleImportTaskCompletion;
2195
+ private handleReorderTaskCompletion;
2196
+ static ɵfac: i0.ɵɵFactoryDeclaration<AsyncTaskUIService, never>;
2197
+ static ɵprov: i0.ɵɵInjectableDeclaration<AsyncTaskUIService>;
2198
+ }
2199
+
2200
+ declare class MetadataTableTemplates implements OnInit {
2201
+ private fb;
2202
+ private metadataTableTemplateService;
2203
+ private labGroupService;
2204
+ private modalService;
2205
+ private toastService;
2206
+ private asyncTaskService;
2207
+ searchForm: FormGroup;
2208
+ private searchParams;
2209
+ private labGroupParams;
2210
+ isLoading: i0.WritableSignal<boolean>;
2211
+ selectedLabGroup: i0.WritableSignal<LabGroup | null>;
2212
+ currentPage: i0.WritableSignal<number>;
2213
+ pageSize: i0.WritableSignal<number>;
2214
+ totalItems: i0.WritableSignal<number>;
2215
+ labGroupsCurrentPage: i0.WritableSignal<number>;
2216
+ labGroupsPageSize: i0.WritableSignal<number>;
2217
+ labGroupsTotalItems: i0.WritableSignal<number>;
2218
+ templatesData: i0.WritableSignal<MetadataTableTemplateQueryResponse>;
2219
+ labGroupsData: i0.WritableSignal<LabGroupQueryResponse>;
2220
+ hasTemplates: i0.Signal<boolean>;
2221
+ hasLabGroups: i0.Signal<boolean>;
2222
+ showTemplatesPagination: i0.Signal<boolean>;
2223
+ showLabGroupsPagination: i0.Signal<boolean>;
2224
+ availableSchemas: i0.WritableSignal<any[]>;
2225
+ isLoadingSchemas: i0.WritableSignal<boolean>;
2226
+ constructor(fb: FormBuilder, metadataTableTemplateService: MetadataTableTemplateService, labGroupService: LabGroupService, modalService: NgbModal, toastService: ToastService, asyncTaskService: AsyncTaskUIService);
2227
+ ngOnInit(): void;
2228
+ private loadInitialData;
2229
+ private loadLabGroupsWithParams;
2230
+ private setupSearch;
2231
+ private loadTemplatesWithParams;
2232
+ onLabGroupChange(event: Event): void;
2233
+ private findLabGroupById;
2234
+ getLabGroupName(labGroupId: number | undefined): string;
2235
+ onPageChange(page: number): void;
2236
+ onLabGroupsPageChange(page: number): void;
2237
+ createTemplate(): void;
2238
+ editTemplate(template: MetadataTableTemplate): void;
2239
+ deleteTemplate(template: MetadataTableTemplate): void;
2240
+ duplicateTemplate(template: MetadataTableTemplate): void;
2241
+ private openTemplateModal;
2242
+ private handleTemplateSave;
2243
+ private refreshTemplates;
2244
+ private loadAvailableSchemas;
2245
+ createTemplateWithCustomSchemas(): void;
2246
+ private openSchemaSelectionModal;
2247
+ private handleSchemaTemplateCreation;
2248
+ createTableFromTemplate(template: MetadataTableTemplate): void;
2249
+ private openTableCreationModal;
2250
+ private handleTableCreation;
2251
+ /**
2252
+ * Reorder template columns by schema selection
2253
+ */
2254
+ reorderTemplateColumns(template: MetadataTableTemplate): void;
2255
+ /**
2256
+ * Perform the actual template column reordering with async task monitoring
2257
+ */
2258
+ private performTemplateColumnReorder;
2259
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetadataTableTemplates, never>;
2260
+ static ɵcmp: i0.ɵɵComponentDeclaration<MetadataTableTemplates, "ccv-metadata-table-templates", never, {}, {}, never, never, true, never>;
2261
+ }
2262
+
2263
+ declare class MetadataTableTemplateEditModal implements OnInit {
2264
+ private fb;
2265
+ private activeModal;
2266
+ private modalService;
2267
+ private metadataTableTemplateService;
2268
+ private toastService;
2269
+ template: MetadataTableTemplate | null;
2270
+ labGroups: LabGroup[];
2271
+ isEdit: boolean;
2272
+ templateSaved: EventEmitter<Partial<MetadataTableTemplate>>;
2273
+ editForm: FormGroup;
2274
+ isLoading: i0.WritableSignal<boolean>;
2275
+ _templateColumns: i0.WritableSignal<MetadataColumn[]>;
2276
+ templateColumns: i0.Signal<MetadataColumn[]>;
2277
+ visibilityOptions: {
2278
+ value: ResourceVisibility;
2279
+ label: string;
2280
+ }[];
2281
+ constructor(fb: FormBuilder, activeModal: NgbActiveModal, modalService: NgbModal, metadataTableTemplateService: MetadataTableTemplateService, toastService: ToastService);
2282
+ ngOnInit(): void;
2283
+ private populateForm;
2284
+ onSubmit(): void;
2285
+ private markFormGroupTouched;
2286
+ onCancel(): void;
2287
+ onClose(): void;
2288
+ getFieldError(fieldName: string): string;
2289
+ get title(): string;
2290
+ addColumn(): void;
2291
+ addColumnWithAutoReorder(): void;
2292
+ editColumn(column: MetadataColumn): void;
2293
+ duplicateColumn(column: MetadataColumn): void;
2294
+ removeColumn(column: MetadataColumn): void;
2295
+ onColumnDrop(event: CdkDragDrop<MetadataColumn[]>): void;
2296
+ private openColumnModal;
2297
+ private handleColumnSave;
2298
+ private handleColumnSaveWithAutoReorder;
2299
+ private reloadTemplateColumns;
2300
+ private generateTempId;
2301
+ private getNextPositionForSameType;
2302
+ private getNextPositionForNameType;
2303
+ private normalizeColumnPositions;
2304
+ private enforceGrouping;
2305
+ static ɵfac: i0.ɵɵFactoryDeclaration<MetadataTableTemplateEditModal, never>;
2306
+ static ɵcmp: i0.ɵɵComponentDeclaration<MetadataTableTemplateEditModal, "ccv-metadata-table-template-edit-modal", never, { "template": { "alias": "template"; "required": false; }; "labGroups": { "alias": "labGroups"; "required": false; }; "isEdit": { "alias": "isEdit"; "required": false; }; }, { "templateSaved": "templateSaved"; }, never, never, true, never>;
2307
+ }
2308
+
2309
+ declare class ColumnEditModal implements OnInit {
2310
+ private fb;
2311
+ private activeModal;
2312
+ private modalService;
2313
+ private metadataColumnTemplateService;
2314
+ private sdrfSyntaxService;
2315
+ column: MetadataColumn | null;
2316
+ templateId: number | null;
2317
+ isEdit: boolean;
2318
+ columnSaved: EventEmitter<Partial<MetadataColumn>>;
2319
+ editForm: FormGroup;
2320
+ isLoading: i0.WritableSignal<boolean>;
2321
+ showAdvancedMode: i0.WritableSignal<boolean>;
2322
+ selectedOntologyConfig: OntologyTypeConfig$1 | null;
2323
+ columnTypes: ColumnTypeConfig$1[];
2324
+ ontologyTypes: OntologyTypeConfig$1[];
2325
+ templateFilter: string;
2326
+ selectedTemplateId: number | string;
2327
+ selectedTemplate: MetadataColumnTemplate$1 | null;
2328
+ templates: MetadataColumnTemplate$1[];
2329
+ isLoadingTemplates: boolean;
2330
+ currentTemplatePage: number;
2331
+ templatePageSize: number;
2332
+ totalTemplates: number;
2333
+ totalTemplatePages: number;
2334
+ Math: Math;
2335
+ officialSdrfColumns: SdrfColumnConfig$1[];
2336
+ showOfficialColumns: boolean;
2337
+ selectedOfficialColumn: SdrfColumnConfig$1 | null;
2338
+ availableOfficialColumns: SdrfColumnConfig$1[];
2339
+ showTemplateSwap: boolean;
2340
+ showCreateCustomTemplate: boolean;
2341
+ constructor(fb: FormBuilder, activeModal: NgbActiveModal, modalService: NgbModal, metadataColumnTemplateService: MetadataColumnTemplateService$1, sdrfSyntaxService: SdrfSyntaxService$1);
2342
+ ngOnInit(): void;
2343
+ private populateForm;
2344
+ onSubmit(): void;
2345
+ private markFormGroupTouched;
2346
+ onCancel(): void;
2347
+ onClose(): void;
2348
+ getFieldError(fieldName: string): string;
2349
+ get title(): string;
2350
+ get hasOntologyType(): boolean;
2351
+ get hasTypeaheadEnabled(): boolean;
2352
+ openValueEditModal(): void;
2353
+ private loadColumnTemplates;
2354
+ onTemplateFilterChange(): void;
2355
+ clearTemplateFilter(): void;
2356
+ onTemplatePageChange(page: number): void;
2357
+ onTemplateSelectionChange(): void;
2358
+ clearTemplate(): void;
2359
+ getOntologyTypeLabel(ontologyType: string): string;
2360
+ toggleOfficialColumns(): void;
2361
+ selectOfficialColumn(column: SdrfColumnConfig$1): void;
2362
+ private filterOfficialColumns;
2363
+ private getDefaultOntologyTypeForColumn;
2364
+ private shouldEnableTypeaheadForColumn;
2365
+ private isColumnMandatory;
2366
+ showTemplateSwapOptions(): void;
2367
+ swapToTemplate(template: MetadataColumnTemplate$1): void;
2368
+ showCreateCustomTemplateOption(): void;
2369
+ createCustomTemplate(): void;
2370
+ cancelTemplateSwap(): void;
2371
+ toggleAdvancedMode(): void;
2372
+ onOntologyTypeChange(event: Event): void;
2373
+ private getCorrectedColumnType;
2374
+ static ɵfac: i0.ɵɵFactoryDeclaration<ColumnEditModal, never>;
2375
+ static ɵcmp: i0.ɵɵComponentDeclaration<ColumnEditModal, "ccv-column-edit-modal", never, { "column": { "alias": "column"; "required": false; }; "templateId": { "alias": "templateId"; "required": false; }; "isEdit": { "alias": "isEdit"; "required": false; }; }, { "columnSaved": "columnSaved"; }, never, never, true, never>;
2376
+ }
2377
+
2378
+ interface TemplateSchemaSelectionResult {
2379
+ name: string;
2380
+ description: string;
2381
+ schemaIds: number[];
2382
+ labGroupId?: number;
2383
+ visibility: ResourceVisibility;
2384
+ isDefault: boolean;
2385
+ }
2386
+ declare class TemplateSchemaSelectionModal {
2387
+ private fb;
2388
+ activeModal: NgbActiveModal;
2389
+ availableSchemas: any[];
2390
+ labGroups: any[];
2391
+ templateCreated: EventEmitter<TemplateSchemaSelectionResult>;
2392
+ templateForm: FormGroup;
2393
+ selectedSchemas: i0.WritableSignal<Set<number>>;
2394
+ selectedSchemasCount: i0.Signal<number>;
2395
+ constructor(fb: FormBuilder, activeModal: NgbActiveModal);
2396
+ toggleSchema(schemaId: number): void;
2397
+ onSchemaCheckChange(event: Event, schemaId: number): void;
2398
+ isSchemaSelected(schemaId: number): boolean;
2399
+ getSelectedSchemas(): number[];
2400
+ removeSchema(schemaId: number): void;
2401
+ getSchemaDisplayName(schemaId: number): string;
2402
+ private updateDescription;
2403
+ canCreateTemplate(): boolean;
2404
+ onCreateTemplate(): void;
2405
+ onCancel(): void;
2406
+ static ɵfac: i0.ɵɵFactoryDeclaration<TemplateSchemaSelectionModal, never>;
2407
+ static ɵcmp: i0.ɵɵComponentDeclaration<TemplateSchemaSelectionModal, "ccv-template-schema-selection-modal", never, { "availableSchemas": { "alias": "availableSchemas"; "required": false; }; "labGroups": { "alias": "labGroups"; "required": false; }; }, { "templateCreated": "templateCreated"; }, never, never, true, never>;
2408
+ }
2409
+
2410
+ interface TableCreationData {
2411
+ name: string;
2412
+ templateId: number;
2413
+ sampleCount?: number;
2414
+ description?: string;
2415
+ labGroupId?: number;
2416
+ }
2417
+ declare class TableCreationModalComponent implements OnInit {
2418
+ private fb;
2419
+ activeModal: NgbActiveModal;
2420
+ template: MetadataTableTemplate;
2421
+ labGroups: LabGroup[];
2422
+ selectedLabGroupId?: number;
2423
+ tableCreated: EventEmitter<TableCreationData>;
2424
+ tableForm: FormGroup;
2425
+ isCreating: boolean;
2426
+ errorMessage: string | null;
2427
+ constructor(fb: FormBuilder, activeModal: NgbActiveModal);
2428
+ ngOnInit(): void;
2429
+ onSubmit(): void;
2430
+ onClose(): void;
2431
+ setCreatingState(isCreating: boolean): void;
2432
+ setErrorMessage(message: string | null): void;
2433
+ getFieldError(fieldName: string): string | null;
2434
+ private getFieldLabel;
2435
+ static ɵfac: i0.ɵɵFactoryDeclaration<TableCreationModalComponent, never>;
2436
+ static ɵcmp: i0.ɵɵComponentDeclaration<TableCreationModalComponent, "ccv-table-creation-modal", never, { "template": { "alias": "template"; "required": false; }; "labGroups": { "alias": "labGroups"; "required": false; }; "selectedLabGroupId": { "alias": "selectedLabGroupId"; "required": false; }; }, { "tableCreated": "tableCreated"; }, never, never, true, never>;
2437
+ }
2438
+
2439
+ interface SchemaSelectionResult {
2440
+ selectedSchemaIds: number[];
2441
+ }
2442
+ declare class SchemaSelectionModal implements OnInit, OnDestroy {
2443
+ activeModal: NgbActiveModal;
2444
+ private schemaService;
2445
+ private toastService;
2446
+ private destroy$;
2447
+ title: string;
2448
+ description: string;
2449
+ isLoading: i0.WritableSignal<boolean>;
2450
+ availableSchemas: i0.WritableSignal<Schema[]>;
2451
+ selectedSchemaIds: i0.WritableSignal<Set<number>>;
2452
+ searchTerm: i0.WritableSignal<string>;
2453
+ constructor(activeModal: NgbActiveModal, schemaService: SchemaService, toastService: ToastService);
2454
+ ngOnInit(): void;
2455
+ ngOnDestroy(): void;
2456
+ private loadAvailableSchemas;
2457
+ get filteredSchemas(): Schema[];
2458
+ toggleSchemaSelection(schemaId: number): void;
2459
+ isSchemaSelected(schemaId: number): boolean;
2460
+ selectAll(): void;
2461
+ clearSelection(): void;
2462
+ onCancel(): void;
2463
+ onConfirm(): void;
2464
+ getBadgeClass(category?: string): string;
2465
+ static ɵfac: i0.ɵɵFactoryDeclaration<SchemaSelectionModal, never>;
2466
+ static ɵcmp: i0.ɵɵComponentDeclaration<SchemaSelectionModal, "ccv-schema-selection-modal", never, {}, {}, never, never, true, never>;
2467
+ }
2468
+
1485
2469
  declare class CupcakeVanilla {
1486
2470
  static ɵfac: i0.ɵɵFactoryDeclaration<CupcakeVanilla, never>;
1487
2471
  static ɵcmp: i0.ɵɵComponentDeclaration<CupcakeVanilla, "ccv-cupcake-vanilla", never, {}, {}, never, never, true, never>;
1488
2472
  }
1489
2473
 
1490
- export { AsyncExportService, AsyncImportService, AsyncTaskService, AsyncValidationService, ChunkedUploadService, CupcakeVanilla, FavouriteMetadataOptionService, MetadataColumnService, MetadataColumnTemplateService, MetadataColumnTemplateShareService, MetadataManagementService, MetadataTableService, MetadataTableTemplateService, OntologySearchService, OntologyType, OntologyTypeLabels, OntologyUtils, SDRFDefaultsService, SamplePoolService, SchemaService, TASK_STATUS_COLORS, TASK_STATUS_LABELS, TASK_TYPE_LABELS, TemplatePermissionLabels, TemplatePermissionLevel, isUnimodFullData };
1491
- export type { ApiResponse, AsyncTaskCreateResponse, AsyncTaskQueryParams, AsyncTaskStatus, BaseTimestampedModel, BulkExcelExportRequest, BulkExportRequest, CellOntology, ChEBICompound, ChunkedUploadCompletionRequest, ChunkedUploadCompletionResponse, ChunkedUploadRequest, ChunkedUploadResponse, ChunkedUploadStatus, DownloadUrlResponse, FavouriteMetadataOption, FavouriteMetadataOptionCreateRequest, FavouriteMetadataOptionQueryParams, FavouriteMetadataOptionUpdateRequest, HumanDisease, MSUniqueVocabularies, MetadataColumn, MetadataColumnCreateRequest, MetadataColumnModifier, MetadataColumnQueryParams, MetadataColumnTemplate, MetadataColumnTemplateCreateRequest, MetadataColumnTemplateQueryParams, MetadataColumnTemplateShare, MetadataColumnTemplateShareCreateRequest, MetadataColumnTemplateShareQueryParams, MetadataColumnTemplateUpdateRequest, MetadataColumnUpdateRequest, MetadataExportRequest, MetadataImportRequest, MetadataQueryParams, MetadataTable, MetadataTableCreateRequest, MetadataTableQueryParams, MetadataTableQueryResponse, MetadataTableTemplate, MetadataTableTemplateCreateRequest, MetadataTableTemplateQueryParams, MetadataTableTemplateQueryResponse, MetadataTableTemplateUpdateRequest, MetadataTableUpdateRequest, MetadataValidationConfig, MetadataValidationRequest, MondoDisease, NCBITaxonomy, OntologySuggestion, OntologySuggestionResponse, PSIMSOntology, PaginatedResponse, SamplePool, SamplePoolCreateRequest, SamplePoolQueryParams, SamplePoolUpdateRequest, Schema, SchemaQueryParams, Species, SubcellularLocation, TaskListItem, TaskResult, TaskStatus, TaskType, Tissue, UberonAnatomy, Unimod, UnimodFullData, UnimodSpecification };
2474
+ export { AdminWebSocketService, AsyncExportService, AsyncImportService, AsyncTaskService, AsyncTaskUIService, AsyncValidationService, COLUMN_TYPE_CONFIGS, ChunkedImportService, ChunkedUploadService, ColumnEditModal, ColumnType, CupcakeVanilla, ElectronService, ExcelExportModalComponent, FavouriteMetadataOptionService, MSTermType, MetadataColumnService, MetadataColumnTemplateService, MetadataColumnTemplateShareService, MetadataManagementService, MetadataTableEditModal, MetadataTableService, MetadataTableTemplateEditModal, MetadataTableTemplateService, MetadataTableTemplates, MetadataValidationModal, MetadataValueEditModal, NotificationService, NotificationType, OFFICIAL_SDRF_COLUMNS, ONTOLOGY_TYPE_CONFIGS, OntologySearchService, OntologyType, OntologyTypeLabels, OntologyUtils, SDRFDefaultsService, SamplePoolService, SchemaSelectionModal, SchemaService, SdrfAgeInput, SdrfCleavageInput, SdrfColumnCategory, SdrfModificationInput, SdrfSpikedCompoundInput, SdrfSyntaxService, TASK_STATUS_COLORS, TASK_STATUS_LABELS, TASK_TYPE_LABELS, TableCreationModalComponent, TemplatePermissionLabels, TemplatePermissionLevel, TemplateSchemaSelectionModal, ValidationResultsModal, Websocket, getRequiredSdrfColumns, getSdrfColumnByName, getSdrfColumnsByCategory, isSdrfColumnRequired, isUnimodFullData };
2475
+ export type { AgeFormat, ApiResponse, AsyncTaskCreateResponse, AsyncTaskQueryParams, AsyncTaskStatus, BaseTimestampedModel, BulkExcelExportRequest, BulkExportRequest, CellOntology, ChEBICompound, ChunkedFileImportRequest, ChunkedImportProgress, ChunkedImportRequest, ChunkedUploadCompletionRequest, ChunkedUploadCompletionResponse, ChunkedUploadRequest, ChunkedUploadResponse, ChunkedUploadStatus, CleavageAgentDetails, ColumnTypeConfig, DownloadUrlResponse, ElectronAPI, ExcelExportOptions, FavouriteMetadataOption, FavouriteMetadataOptionCreateRequest, FavouriteMetadataOptionQueryParams, FavouriteMetadataOptionUpdateRequest, HumanDisease, MSUniqueVocabularies, MetadataColumn, MetadataColumnCreateRequest, MetadataColumnModifier, MetadataColumnQueryParams, MetadataColumnTemplate, MetadataColumnTemplateCreateRequest, MetadataColumnTemplateQueryParams, MetadataColumnTemplateShare, MetadataColumnTemplateShareCreateRequest, MetadataColumnTemplateShareQueryParams, MetadataColumnTemplateUpdateRequest, MetadataColumnUpdateRequest, MetadataExportRequest, MetadataImportRequest, MetadataQueryParams, MetadataTable, MetadataTableCreateRequest, MetadataTableQueryParams, MetadataTableQueryResponse, MetadataTableTemplate, MetadataTableTemplateCreateRequest, MetadataTableTemplateQueryParams, MetadataTableTemplateQueryResponse, MetadataTableTemplateUpdateRequest, MetadataTableUpdateRequest, MetadataValidationConfig, MetadataValidationRequest, MetadataValueEditConfig, ModificationParameters, MondoDisease, NCBITaxonomy, OntologyCustomFilter, OntologySuggestion, OntologySuggestionResponse, OntologyTypeConfig, PSIMSOntology, PaginatedResponse, PooledSample, SampleCountConfirmationError, SampleCountValidationRequest, SampleCountValidationResponse, SampleCountValidationResult, SamplePool, SamplePoolCreateRequest, SamplePoolQueryParams, SamplePoolUpdateRequest, Schema, SchemaQueryParams, SchemaSelectionResult, SdrfColumnConfig, Species, SpikedCompound, SubcellularLocation, SyntaxType, SyntheticPeptide, TableCreationData, TaskListItem, TaskResult, TaskStatus, TaskType, TemplateSchemaSelectionResult, Tissue, UberonAnatomy, Unimod, UnimodFullData, UnimodSpecification, ValidationResult, ValidationResults };