@noatgnu/cupcake-vanilla 1.3.13 → 1.3.15

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,7 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnInit, EventEmitter, OnDestroy, ElementRef } from '@angular/core';
2
+ import { OnInit, EventEmitter, OnChanges, SimpleChanges, OnDestroy, ElementRef, AfterViewInit, Renderer2 } from '@angular/core';
3
3
  import { Observable, OperatorFunction } from 'rxjs';
4
- import { BaseApiService, WebSocketService, AuthService, WebSocketMessage, NotificationService as NotificationService$1, ToastService, AsyncTaskQueryParams, PaginatedResponse as PaginatedResponse$1, AsyncTaskStatus, DownloadUrlResponse, MetadataExportRequest, AsyncTaskCreateResponse, BulkExportRequest, BulkExcelExportRequest, MetadataImportRequest, ValidationSchema, MetadataValidationRequest, ChunkedImportRequest, User, LabGroupService, LabGroup, MetadataValidationConfig, TaskType, TaskStatus, LabGroupQueryResponse, ResourceVisibility } from '@noatgnu/cupcake-core';
4
+ import { BaseApiService, NotificationService as NotificationService$1, AsyncTaskQueryParams, PaginatedResponse as PaginatedResponse$1, AsyncTaskStatus, DownloadUrlResponse, MetadataExportRequest, AsyncTaskCreateResponse, BulkExportRequest, BulkExcelExportRequest, MetadataImportRequest, ValidationSchema, MetadataValidationRequest, SdrfFileValidationRequest, ChunkedImportRequest, WebSocketService, WebSocketMessage, DesktopRuntime, User, AuthService, LabGroupService, LabGroup, MetadataValidationConfig, TaskType, TaskStatus, LabGroupQueryResponse, ToastService, ResourceVisibility } from '@noatgnu/cupcake-core';
5
5
  export { WebSocketMessage } from '@noatgnu/cupcake-core';
6
6
  import * as _angular_forms from '@angular/forms';
7
7
  import { FormGroup, FormBuilder } from '@angular/forms';
@@ -19,9 +19,15 @@ interface PaginatedResponse<T> {
19
19
  previous?: string;
20
20
  results: T[];
21
21
  }
22
- interface ApiResponse<T = any> {
22
+ interface ApiError {
23
+ message?: string;
24
+ code?: string;
25
+ details?: Record<string, string[]>;
26
+ [key: string]: unknown;
27
+ }
28
+ interface ApiResponse<T = unknown> {
23
29
  data?: T;
24
- error?: any;
30
+ error?: ApiError;
25
31
  status: number;
26
32
  success: boolean;
27
33
  }
@@ -49,7 +55,9 @@ declare enum OntologyType {
49
55
  CHEBI = "chebi",
50
56
  CELL_ONTOLOGY = "cell_ontology",
51
57
  MS_UNIQUE_VOCABULARIES = "ms_unique_vocabularies",
52
- PSI_MS = "psi_ms"
58
+ PSI_MS = "psi_ms",
59
+ BTO = "bto",
60
+ DOID = "doid"
53
61
  }
54
62
  declare const OntologyTypeLabels: Record<OntologyType, string>;
55
63
  declare enum TemplatePermissionLevel {
@@ -66,6 +74,125 @@ declare enum ColumnType {
66
74
  SPECIAL = "special"
67
75
  }
68
76
 
77
+ type ColumnInputType = 'text' | 'select' | 'number_with_unit' | 'pattern' | 'ontology' | 'semver' | 'accession' | 'identifier';
78
+ interface ColumnValidator {
79
+ type: string;
80
+ params: {
81
+ values?: string[];
82
+ units?: string[];
83
+ pattern?: string;
84
+ ontologies?: string[];
85
+ examples?: (string | number)[];
86
+ description?: string;
87
+ error_level?: string;
88
+ format?: string;
89
+ special_values?: string[];
90
+ [key: string]: unknown;
91
+ };
92
+ }
93
+ interface MetadataColumnTemplate extends BaseTimestampedModel {
94
+ id: number;
95
+ name: string;
96
+ description?: string;
97
+ columnName: string;
98
+ columnType: string;
99
+ defaultValue?: string;
100
+ defaultPosition?: number;
101
+ ontologyType?: string;
102
+ customOntologyFilters?: any;
103
+ enableTypeahead: boolean;
104
+ notApplicable: boolean;
105
+ notAvailable: boolean;
106
+ excelValidation?: any;
107
+ customValidationRules?: any;
108
+ apiEnhancements?: any;
109
+ visibility: string;
110
+ owner?: number;
111
+ ownerUsername?: string;
112
+ labGroup?: number;
113
+ labGroupName?: string;
114
+ schema?: number;
115
+ schemaName?: string;
116
+ sourceSchema?: string;
117
+ isSystemTemplate: boolean;
118
+ isActive: boolean;
119
+ usageCount?: number;
120
+ tags?: string[];
121
+ category?: string;
122
+ lastUsedAt?: string;
123
+ canEdit?: boolean;
124
+ canDelete?: boolean;
125
+ validators?: ColumnValidator[];
126
+ inputType?: ColumnInputType;
127
+ units?: string[];
128
+ possibleDefaultValues?: (string | number)[];
129
+ ontologyOptions?: string[];
130
+ baseColumn?: boolean;
131
+ }
132
+ interface MetadataColumnTemplateShare extends BaseTimestampedModel {
133
+ id: number;
134
+ template: number;
135
+ templateName?: string;
136
+ sharedWith: number;
137
+ sharedWithUsername?: string;
138
+ sharedBy: number;
139
+ sharedByUsername?: string;
140
+ canEdit: boolean;
141
+ }
142
+ interface MetadataColumnTemplateCreateRequest {
143
+ name: string;
144
+ description?: string;
145
+ columnName: string;
146
+ columnType: string;
147
+ defaultValue?: string;
148
+ defaultPosition?: number;
149
+ ontologyType?: string;
150
+ customOntologyFilters?: any;
151
+ enableTypeahead?: boolean;
152
+ notApplicable?: boolean;
153
+ notAvailable?: boolean;
154
+ excelValidation?: any;
155
+ customValidationRules?: any;
156
+ apiEnhancements?: any;
157
+ visibility?: string;
158
+ labGroup?: number;
159
+ tags?: string[];
160
+ category?: string;
161
+ }
162
+ interface MetadataColumnTemplateUpdateRequest {
163
+ name?: string;
164
+ description?: string;
165
+ columnName?: string;
166
+ columnType?: string;
167
+ defaultValue?: string;
168
+ defaultPosition?: number;
169
+ ontologyType?: string;
170
+ customOntologyFilters?: any;
171
+ enableTypeahead?: boolean;
172
+ notApplicable?: boolean;
173
+ notAvailable?: boolean;
174
+ excelValidation?: any;
175
+ customValidationRules?: any;
176
+ apiEnhancements?: any;
177
+ visibility?: string;
178
+ isActive?: boolean;
179
+ tags?: string[];
180
+ category?: string;
181
+ }
182
+ interface MetadataColumnTemplateShareCreateRequest {
183
+ template: number;
184
+ sharedWith: number;
185
+ canEdit?: boolean;
186
+ }
187
+ interface GroupedColumnTemplate {
188
+ columnName: string;
189
+ columnType: string;
190
+ schemaCount: number;
191
+ schemas: string[];
192
+ templateIds: number[];
193
+ sampleTemplate?: MetadataColumnTemplate;
194
+ }
195
+
69
196
  interface MetadataColumnModifier {
70
197
  samples: string;
71
198
  value: string;
@@ -96,6 +223,12 @@ interface MetadataColumn extends BaseTimestampedModel {
96
223
  possibleDefaultValues: any[];
97
224
  staffOnly: boolean;
98
225
  }
226
+ /**
227
+ * A synthetic MetadataColumn with id=0 derived from a template, used for ontology search
228
+ * in sheet mode where no backend table is loaded. id=0 is falsy so column-specific
229
+ * endpoints are not used; only the ontologyType and customOntologyFilters matter.
230
+ */
231
+ declare function createSyntheticColumnFromTemplate(header: string, template: MetadataColumnTemplate): MetadataColumn;
99
232
  interface MetadataColumnCreateRequest {
100
233
  metadataTable: number;
101
234
  template?: number;
@@ -314,94 +447,72 @@ interface AdvancedAutofillResponse {
314
447
  variationsCombinations: number;
315
448
  strategy: string;
316
449
  }
317
-
318
- interface MetadataColumnTemplate extends BaseTimestampedModel {
319
- id: number;
320
- name: string;
321
- description?: string;
322
- columnName: string;
323
- columnType: string;
324
- defaultValue?: string;
325
- defaultPosition?: number;
326
- ontologyType?: string;
327
- customOntologyFilters?: any;
328
- enableTypeahead: boolean;
329
- notApplicable: boolean;
330
- notAvailable: boolean;
331
- excelValidation?: any;
332
- customValidationRules?: any;
333
- apiEnhancements?: any;
334
- visibility: string;
335
- owner?: number;
336
- ownerUsername?: string;
337
- labGroup?: number;
338
- labGroupName?: string;
339
- schema?: number;
340
- schemaName?: string;
341
- sourceSchema?: string;
342
- isSystemTemplate: boolean;
343
- isActive: boolean;
344
- usageCount?: number;
345
- tags?: string[];
346
- category?: string;
347
- lastUsedAt?: string;
348
- canEdit?: boolean;
349
- canDelete?: boolean;
450
+ interface ColumnOverrideMappingEntry {
451
+ fileColIndex: number;
452
+ columnId: number | null;
350
453
  }
351
- interface MetadataColumnTemplateShare extends BaseTimestampedModel {
352
- id: number;
353
- template: number;
354
- templateName?: string;
355
- sharedWith: number;
356
- sharedWithUsername?: string;
357
- sharedBy: number;
358
- sharedByUsername?: string;
359
- canEdit: boolean;
454
+ interface ColumnOverrideImportOptions {
455
+ updateValue: boolean;
456
+ updateModifiers: boolean;
457
+ normalizeOntology?: boolean;
360
458
  }
361
- interface MetadataColumnTemplateCreateRequest {
362
- name: string;
363
- description?: string;
459
+ interface ColumnOverrideSuggestResult {
460
+ fileHeaders: {
461
+ fileColIndex: number;
462
+ header: string;
463
+ }[];
464
+ tableColumns: {
465
+ columnId: number;
466
+ columnName: string;
467
+ columnPosition: number;
468
+ }[];
469
+ suggestedMapping: ColumnOverrideMappingEntry[];
470
+ fileRowCount: number;
471
+ tableSampleCount: number;
472
+ }
473
+ interface ColumnOverrideMatchedColumn {
474
+ columnId: number;
364
475
  columnName: string;
365
- columnType: string;
366
- defaultValue?: string;
367
- defaultPosition?: number;
368
- ontologyType?: string;
369
- customOntologyFilters?: any;
370
- enableTypeahead?: boolean;
371
- notApplicable?: boolean;
372
- notAvailable?: boolean;
373
- excelValidation?: any;
374
- customValidationRules?: any;
375
- apiEnhancements?: any;
376
- visibility?: string;
377
- labGroup?: number;
378
- tags?: string[];
379
- category?: string;
476
+ fileHeader: string;
477
+ fileColIndex: number;
478
+ currentValue: string | null;
479
+ newValue: string | null;
480
+ currentModifiers: {
481
+ samples: string;
482
+ value: string;
483
+ }[];
484
+ newModifiers: {
485
+ samples: string;
486
+ value: string;
487
+ }[];
488
+ rowsChanged: number;
380
489
  }
381
- interface MetadataColumnTemplateUpdateRequest {
382
- name?: string;
383
- description?: string;
384
- columnName?: string;
385
- columnType?: string;
386
- defaultValue?: string;
387
- defaultPosition?: number;
388
- ontologyType?: string;
389
- customOntologyFilters?: any;
390
- enableTypeahead?: boolean;
391
- notApplicable?: boolean;
392
- notAvailable?: boolean;
393
- excelValidation?: any;
394
- customValidationRules?: any;
395
- apiEnhancements?: any;
396
- visibility?: string;
397
- isActive?: boolean;
398
- tags?: string[];
399
- category?: string;
490
+ interface ColumnOverridePreviewResult {
491
+ columnsMatched: ColumnOverrideMatchedColumn[];
492
+ columnsToAdd: {
493
+ fileHeader: string;
494
+ fileColIndex: number;
495
+ columnType: string;
496
+ newValue: string | null;
497
+ newModifiers: {
498
+ samples: string;
499
+ value: string;
500
+ }[];
501
+ warning: string;
502
+ }[];
503
+ warnings: string[];
504
+ sampleCountMismatch: boolean;
505
+ fileRowCount: number;
400
506
  }
401
- interface MetadataColumnTemplateShareCreateRequest {
402
- template: number;
403
- sharedWith: number;
404
- canEdit?: boolean;
507
+ interface ColumnOverrideCommitResult {
508
+ message: string;
509
+ columnsUpdated: number;
510
+ columnsAdded: number;
511
+ warnings: string[];
512
+ updatedColumns: {
513
+ id: number;
514
+ name: string;
515
+ }[];
405
516
  }
406
517
 
407
518
  interface MetadataTableTemplate extends BaseTimestampedModel {
@@ -441,6 +552,19 @@ interface MetadataTableTemplateQueryResponse {
441
552
  previous?: string;
442
553
  results: MetadataTableTemplate[];
443
554
  }
555
+ interface MetadataTableTemplateSyncRequest {
556
+ add_new?: boolean;
557
+ update_existing?: boolean;
558
+ remove_orphans?: boolean;
559
+ }
560
+ interface MetadataTableTemplateSyncResponse {
561
+ message: string;
562
+ added: number;
563
+ updated: number;
564
+ removed: number;
565
+ errors: string[];
566
+ schemas: string[];
567
+ }
444
568
 
445
569
  interface FavouriteMetadataOption extends BaseTimestampedModel {
446
570
  id: number;
@@ -547,6 +671,21 @@ interface CellOntology {
547
671
  synonyms?: any;
548
672
  crossReferences?: any;
549
673
  }
674
+ interface BTOTerm {
675
+ identifier: string;
676
+ name: string;
677
+ synonyms?: any;
678
+ definition?: string;
679
+ xrefs?: any;
680
+ }
681
+ interface DiseaseOntologyTerm {
682
+ identifier: string;
683
+ name: string;
684
+ synonyms?: any;
685
+ definition?: string;
686
+ xrefs?: any;
687
+ }
688
+ type SchemaLayer = 'technology' | 'sample' | 'experiment' | '';
550
689
  interface Schema {
551
690
  id: number;
552
691
  name: string;
@@ -554,6 +693,12 @@ interface Schema {
554
693
  description?: string;
555
694
  category?: string;
556
695
  version?: string;
696
+ extends?: string;
697
+ usableAlone?: boolean;
698
+ layer?: SchemaLayer;
699
+ requires?: any[];
700
+ excludes?: any;
701
+ tags?: string[];
557
702
  url?: string;
558
703
  isActive: boolean;
559
704
  isBuiltin: boolean;
@@ -561,6 +706,23 @@ interface Schema {
561
706
  creator?: number;
562
707
  creatorUsername?: string;
563
708
  columnsCount?: number;
709
+ usageCount?: number;
710
+ }
711
+ interface SchemaColumn {
712
+ id: number;
713
+ columnName: string;
714
+ columnType: string;
715
+ name: string;
716
+ ontologyType: string | null;
717
+ ontologyOptions: string[];
718
+ customOntologyFilters: Record<string, unknown>;
719
+ enableTypeahead: boolean;
720
+ inputType: string;
721
+ possibleDefaultValues: string[];
722
+ units: string[];
723
+ notApplicable: boolean;
724
+ notAvailable: boolean;
725
+ validators: unknown[];
564
726
  }
565
727
  interface OntologySuggestion {
566
728
  id: string;
@@ -692,6 +854,12 @@ interface ChunkedUploadRequest {
692
854
  metadataTableId?: number;
693
855
  createPools?: boolean;
694
856
  replaceExisting?: boolean;
857
+ overrideSampleCount?: boolean;
858
+ validateOnly?: boolean;
859
+ schemaNames?: string[];
860
+ skipOntology?: boolean;
861
+ useOlsCacheOnly?: boolean;
862
+ applySchemaTemplates?: boolean;
695
863
  }
696
864
  interface ChunkedUploadResponse {
697
865
  id: string;
@@ -706,6 +874,12 @@ interface ChunkedUploadCompletionRequest {
706
874
  metadataTableId?: number;
707
875
  createPools?: boolean;
708
876
  replaceExisting?: boolean;
877
+ overrideSampleCount?: boolean;
878
+ validateOnly?: boolean;
879
+ schemaNames?: string[];
880
+ skipOntology?: boolean;
881
+ useOlsCacheOnly?: boolean;
882
+ applySchemaTemplates?: boolean;
709
883
  }
710
884
  interface ChunkedUploadCompletionResponse {
711
885
  message?: string;
@@ -715,6 +889,31 @@ interface ChunkedUploadCompletionResponse {
715
889
  taskId?: string;
716
890
  }
717
891
 
892
+ interface ExcelLaunchRequest {
893
+ tableId: number;
894
+ tableName?: string;
895
+ }
896
+ interface ExcelLaunchCode {
897
+ code: string;
898
+ tableId: number;
899
+ tableName?: string;
900
+ expiresIn: number;
901
+ }
902
+ interface ExcelLaunchClaimRequest {
903
+ code: string;
904
+ }
905
+ interface ExcelLaunchClaimResponse {
906
+ accessToken: string;
907
+ refreshToken: string;
908
+ tableId: number;
909
+ tableName?: string;
910
+ user: {
911
+ id: number;
912
+ username: string;
913
+ email: string;
914
+ };
915
+ }
916
+
718
917
  interface MetadataTableQueryParams {
719
918
  search?: string;
720
919
  ownerId?: number;
@@ -725,6 +924,10 @@ interface MetadataTableQueryParams {
725
924
  limit?: number;
726
925
  offset?: number;
727
926
  ordering?: string;
927
+ columnName?: string;
928
+ columnValue?: string;
929
+ columnType?: string;
930
+ columnMatch?: 'contains' | 'exact';
728
931
  }
729
932
  declare class MetadataTableService extends BaseApiService {
730
933
  /**
@@ -804,6 +1007,18 @@ declare class MetadataTableService extends BaseApiService {
804
1007
  * Search metadata tables
805
1008
  */
806
1009
  searchMetadataTables(query: string): Observable<MetadataTableQueryResponse>;
1010
+ /**
1011
+ * Find tables that contain a column matching the given name and/or value
1012
+ */
1013
+ findByColumnContent(params: {
1014
+ columnName?: string;
1015
+ columnValue?: string;
1016
+ columnType?: string;
1017
+ columnMatch?: 'contains' | 'exact';
1018
+ showShared?: boolean;
1019
+ limit?: number;
1020
+ offset?: number;
1021
+ }): Observable<MetadataTableQueryResponse>;
807
1022
  /**
808
1023
  * Get metadata tables by owner
809
1024
  */
@@ -895,6 +1110,9 @@ declare class MetadataTableService extends BaseApiService {
895
1110
  staffOnly: boolean;
896
1111
  }>;
897
1112
  advancedAutofill(id: number, request: AdvancedAutofillRequest): Observable<AdvancedAutofillResponse>;
1113
+ suggestColumnMapping(tableId: number, file: File, algorithm: 'name' | 'position' | 'none'): Observable<ColumnOverrideSuggestResult>;
1114
+ previewColumnOverride(tableId: number, file: File, mapping: ColumnOverrideMappingEntry[], options: ColumnOverrideImportOptions): Observable<ColumnOverridePreviewResult>;
1115
+ commitColumnOverride(tableId: number, file: File, mapping: ColumnOverrideMappingEntry[], options: ColumnOverrideImportOptions): Observable<ColumnOverrideCommitResult>;
898
1116
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MetadataTableService, never>;
899
1117
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<MetadataTableService>;
900
1118
  }
@@ -1236,6 +1454,9 @@ declare class MetadataTableTemplateService extends BaseApiService {
1236
1454
  schemaIds: number[];
1237
1455
  name: string;
1238
1456
  description?: string;
1457
+ labGroup?: number | null;
1458
+ visibility?: string;
1459
+ isDefault?: boolean;
1239
1460
  }): Observable<{
1240
1461
  message: string;
1241
1462
  template: MetadataTableTemplate;
@@ -1248,6 +1469,7 @@ declare class MetadataTableTemplateService extends BaseApiService {
1248
1469
  name: string;
1249
1470
  description?: string;
1250
1471
  sampleCount: number;
1472
+ labGroup?: number;
1251
1473
  }): Observable<MetadataTable>;
1252
1474
  /**
1253
1475
  * Create a new metadata table directly from schema definitions
@@ -1287,6 +1509,11 @@ declare class MetadataTableTemplateService extends BaseApiService {
1287
1509
  }>;
1288
1510
  staffOnly: boolean;
1289
1511
  }>;
1512
+ /**
1513
+ * Sync template columns from linked schemas.
1514
+ * Updates existing columns with latest ontology settings and optionally adds new columns.
1515
+ */
1516
+ syncFromSchemas(id: number, request?: MetadataTableTemplateSyncRequest): Observable<MetadataTableTemplateSyncResponse>;
1290
1517
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MetadataTableTemplateService, never>;
1291
1518
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<MetadataTableTemplateService>;
1292
1519
  }
@@ -1341,12 +1568,20 @@ interface MetadataColumnTemplateQueryParams {
1341
1568
  labGroupId?: number;
1342
1569
  visibility?: string;
1343
1570
  isActive?: boolean;
1571
+ isSystemTemplate?: boolean;
1344
1572
  schemaId?: number;
1345
1573
  sourceSchema?: string;
1574
+ inputType?: string;
1346
1575
  limit?: number;
1347
1576
  offset?: number;
1348
1577
  ordering?: string;
1349
1578
  }
1579
+ interface GroupedColumnTemplateQueryParams {
1580
+ search?: string;
1581
+ isSystemTemplate?: boolean;
1582
+ limit?: number;
1583
+ offset?: number;
1584
+ }
1350
1585
  declare class MetadataColumnTemplateService extends BaseApiService {
1351
1586
  /**
1352
1587
  * Get all metadata column templates with optional filtering
@@ -1425,6 +1660,14 @@ declare class MetadataColumnTemplateService extends BaseApiService {
1425
1660
  customFilters: any;
1426
1661
  hasMore: boolean;
1427
1662
  }>;
1663
+ /**
1664
+ * Get column templates grouped by (column_name, column_type)
1665
+ */
1666
+ getGroupedColumnTemplates(params?: GroupedColumnTemplateQueryParams): Observable<PaginatedResponse<GroupedColumnTemplate>>;
1667
+ /**
1668
+ * Get all templates for a specific column name and type
1669
+ */
1670
+ getTemplatesByColumnNameAndType(columnName: string, columnType: string): Observable<MetadataColumnTemplate[]>;
1428
1671
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MetadataColumnTemplateService, never>;
1429
1672
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<MetadataColumnTemplateService>;
1430
1673
  }
@@ -1490,14 +1733,6 @@ declare class MetadataManagementService extends BaseApiService {
1490
1733
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<MetadataManagementService>;
1491
1734
  }
1492
1735
 
1493
- declare class Websocket extends WebSocketService {
1494
- constructor(authService: AuthService);
1495
- getMetadataTableUpdates(): Observable<WebSocketMessage>;
1496
- getLabGroupUpdates(): Observable<WebSocketMessage>;
1497
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<Websocket, never>;
1498
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<Websocket>;
1499
- }
1500
-
1501
1736
  declare enum NotificationType {
1502
1737
  SYSTEM = "system",
1503
1738
  METADATA_TABLE = "metadata_table",
@@ -1511,7 +1746,7 @@ declare class NotificationService extends NotificationService$1 {
1511
1746
  private websocketService;
1512
1747
  private isConnected;
1513
1748
  readonly isWebSocketConnected: _angular_core.Signal<boolean>;
1514
- constructor(websocketService: Websocket, toastService: ToastService);
1749
+ constructor();
1515
1750
  private initializeWebSocket;
1516
1751
  private setupNotificationHandlers;
1517
1752
  private handleWebSocketMessage;
@@ -1595,6 +1830,10 @@ declare class SchemaService extends BaseApiService {
1595
1830
  * Get list of available schemas for creating templates
1596
1831
  */
1597
1832
  getAvailableSchemas(): Observable<Schema[]>;
1833
+ /**
1834
+ * Get columns for a schema by its integer ID
1835
+ */
1836
+ getSchemaColumns(id: number): Observable<SchemaColumn[]>;
1598
1837
  /**
1599
1838
  * Sync builtin schemas from sdrf-pipelines package (admin only)
1600
1839
  */
@@ -1679,6 +1918,98 @@ declare class SDRFDefaultsService extends BaseApiService {
1679
1918
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<SDRFDefaultsService>;
1680
1919
  }
1681
1920
 
1921
+ interface ColumnConfig {
1922
+ columnName: string;
1923
+ inputType: ColumnInputType;
1924
+ validators: ColumnValidator[];
1925
+ units: string[];
1926
+ possibleValues: (string | number)[];
1927
+ description: string;
1928
+ schemaName?: string;
1929
+ }
1930
+ declare class OfficialColumnCacheService {
1931
+ private columnTemplateService;
1932
+ private columnsByName;
1933
+ private columnsBySchema;
1934
+ private columnsByKey;
1935
+ private isLoaded;
1936
+ private isLoading;
1937
+ readonly loaded: _angular_core.Signal<boolean>;
1938
+ readonly loading: _angular_core.Signal<boolean>;
1939
+ readonly columnCount: _angular_core.Signal<number>;
1940
+ readonly uniqueColumnNames: _angular_core.Signal<number>;
1941
+ constructor(columnTemplateService: MetadataColumnTemplateService);
1942
+ /**
1943
+ * Initialize the cache by loading all official (system) column templates.
1944
+ * Call this on app initialization or when first needed.
1945
+ */
1946
+ initialize(): Observable<boolean>;
1947
+ private fetchAllSystemTemplates;
1948
+ /**
1949
+ * Get all column templates with a given name (may exist in multiple schemas).
1950
+ */
1951
+ getColumns(columnName: string): MetadataColumnTemplate[];
1952
+ /**
1953
+ * Get column template by name and schema.
1954
+ * Use this when you need the exact configuration for a specific schema.
1955
+ */
1956
+ getColumn(columnName: string, schemaName?: string): MetadataColumnTemplate | undefined;
1957
+ /**
1958
+ * Get column configuration with a simplified interface.
1959
+ * If schema is specified, returns that specific config.
1960
+ * Otherwise returns the first found (typically base schema).
1961
+ */
1962
+ getColumnConfig(columnName: string, schemaName?: string): ColumnConfig | undefined;
1963
+ /**
1964
+ * Get merged configuration from all schemas for a column.
1965
+ * Combines possible values and units from all schema variants.
1966
+ */
1967
+ getMergedColumnConfig(columnName: string): ColumnConfig | undefined;
1968
+ /**
1969
+ * Get all columns for a specific schema.
1970
+ */
1971
+ getColumnsBySchema(schemaName: string): MetadataColumnTemplate[];
1972
+ /**
1973
+ * Get all available schema names.
1974
+ */
1975
+ getSchemaNames(): string[];
1976
+ /**
1977
+ * Search for columns by partial name match.
1978
+ * Returns all variants across all schemas.
1979
+ */
1980
+ searchColumns(query: string): MetadataColumnTemplate[];
1981
+ /**
1982
+ * Get columns filtered by input type.
1983
+ */
1984
+ getColumnsByInputType(inputType: ColumnInputType): MetadataColumnTemplate[];
1985
+ /**
1986
+ * Check if a column exists in official schemas.
1987
+ */
1988
+ hasColumn(columnName: string): boolean;
1989
+ /**
1990
+ * Get all schemas that define a specific column.
1991
+ */
1992
+ getSchemasForColumn(columnName: string): string[];
1993
+ /**
1994
+ * Get possible values for a column, merged from all schemas.
1995
+ */
1996
+ getPossibleValues(columnName: string): (string | number)[];
1997
+ /**
1998
+ * Get units for a number_with_unit column, merged from all schemas.
1999
+ */
2000
+ getUnits(columnName: string): string[];
2001
+ /**
2002
+ * Clear the cache (useful for testing or forced refresh).
2003
+ */
2004
+ clear(): void;
2005
+ /**
2006
+ * Force refresh the cache.
2007
+ */
2008
+ refresh(): Observable<boolean>;
2009
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OfficialColumnCacheService, never>;
2010
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<OfficialColumnCacheService>;
2011
+ }
2012
+
1682
2013
  declare class AsyncTaskService extends BaseApiService {
1683
2014
  /**
1684
2015
  * Get all async tasks for the current user with optional filtering
@@ -1715,6 +2046,24 @@ declare class AsyncExportService extends BaseApiService {
1715
2046
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AsyncExportService>;
1716
2047
  }
1717
2048
 
2049
+ declare class AsyncImportService extends BaseApiService {
2050
+ private chunkedUploadService;
2051
+ constructor();
2052
+ sdrfFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse>;
2053
+ excelFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse>;
2054
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AsyncImportService, never>;
2055
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AsyncImportService>;
2056
+ }
2057
+
2058
+ declare class AsyncValidationService extends BaseApiService {
2059
+ private chunkedUploadService;
2060
+ getAvailableSchemas(): Observable<ValidationSchema[]>;
2061
+ metadataTable(request: MetadataValidationRequest): Observable<AsyncTaskCreateResponse>;
2062
+ sdrfFile(request: SdrfFileValidationRequest): Observable<AsyncTaskCreateResponse>;
2063
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AsyncValidationService, never>;
2064
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AsyncValidationService>;
2065
+ }
2066
+
1718
2067
  declare class ChunkedUploadService extends BaseApiService {
1719
2068
  private siteConfigService;
1720
2069
  /**
@@ -1740,40 +2089,30 @@ declare class ChunkedUploadService extends BaseApiService {
1740
2089
  /**
1741
2090
  * Helper method to upload a file in chunks with progress tracking
1742
2091
  */
1743
- uploadFileInChunks(file: File, chunkSize?: number, // 1MB chunks by default
1744
- options?: {
2092
+ uploadFileInChunks(file: File, chunkSize?: number, options?: {
1745
2093
  metadataTableId?: number;
1746
2094
  createPools?: boolean;
1747
2095
  replaceExisting?: boolean;
2096
+ overrideSampleCount?: boolean;
1748
2097
  uploadSessionId?: string;
2098
+ validateOnly?: boolean;
2099
+ schemaNames?: string[];
2100
+ skipOntology?: boolean;
2101
+ useOlsCacheOnly?: boolean;
2102
+ applySchemaTemplates?: boolean;
1749
2103
  onProgress?: (progress: number) => void;
1750
2104
  }): Observable<ChunkedUploadCompletionResponse>;
1751
2105
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChunkedUploadService, never>;
1752
2106
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<ChunkedUploadService>;
1753
2107
  }
1754
2108
 
1755
- declare class AsyncImportService extends BaseApiService {
1756
- private chunkedUploadService;
1757
- constructor(chunkedUploadService: ChunkedUploadService);
1758
- sdrfFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse>;
1759
- excelFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse>;
1760
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AsyncImportService, never>;
1761
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AsyncImportService>;
1762
- }
1763
-
1764
- declare class AsyncValidationService extends BaseApiService {
1765
- getAvailableSchemas(): Observable<ValidationSchema[]>;
1766
- metadataTable(request: MetadataValidationRequest): Observable<AsyncTaskCreateResponse>;
1767
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AsyncValidationService, never>;
1768
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AsyncValidationService>;
1769
- }
1770
-
1771
2109
  interface ChunkedFileImportRequest {
1772
2110
  file: File;
1773
2111
  metadataTableId: number;
1774
2112
  replaceExisting?: boolean;
1775
2113
  validateOntologies?: boolean;
1776
2114
  createPools?: boolean;
2115
+ applySchemaTemplates?: boolean;
1777
2116
  }
1778
2117
  interface ChunkedImportProgress {
1779
2118
  uploadProgress: number;
@@ -1782,7 +2121,7 @@ interface ChunkedImportProgress {
1782
2121
  }
1783
2122
  declare class ChunkedImportService extends BaseApiService {
1784
2123
  private chunkedUploadService;
1785
- constructor(chunkedUploadService: ChunkedUploadService);
2124
+ constructor();
1786
2125
  /**
1787
2126
  * Import SDRF file using chunked upload for better performance with large files
1788
2127
  */
@@ -1912,9 +2251,23 @@ declare class SdrfSyntaxService {
1912
2251
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<SdrfSyntaxService>;
1913
2252
  }
1914
2253
 
1915
- interface ElectronAPI {
1916
- platform: string;
1917
- isElectron: boolean;
2254
+ declare class Websocket extends WebSocketService {
2255
+ constructor();
2256
+ getMetadataTableUpdates(): Observable<WebSocketMessage>;
2257
+ getLabGroupUpdates(): Observable<WebSocketMessage>;
2258
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Websocket, never>;
2259
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<Websocket>;
2260
+ }
2261
+
2262
+ /**
2263
+ * @deprecated Use DesktopService instead. ElectronService is kept for backwards compatibility.
2264
+ */
2265
+ declare class ElectronService {
2266
+ private desktop;
2267
+ get isElectron(): boolean;
2268
+ get isWails(): boolean;
2269
+ get isDesktop(): boolean;
2270
+ get platform(): string;
1918
2271
  getAppVersion(): Promise<string>;
1919
2272
  getElectronVersion(): Promise<string>;
1920
2273
  minimize(): void;
@@ -1927,16 +2280,30 @@ interface ElectronAPI {
1927
2280
  downloadFile(url: string, filename?: string): Promise<string>;
1928
2281
  getBackendPort(): Promise<number>;
1929
2282
  isBackendReady(): Promise<boolean>;
1930
- onBackendStatusChange(callback: (status: any) => void): () => void;
1931
- onWindowStateChange(callback: (state: 'maximized' | 'unmaximized') => void): () => void;
2283
+ onBackendStatusChange(): Observable<any>;
2284
+ onWindowStateChange(): Observable<'maximized' | 'unmaximized'>;
2285
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElectronService, never>;
2286
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ElectronService>;
1932
2287
  }
1933
- declare class ElectronService {
1934
- private electronAPI;
2288
+
2289
+ declare class DesktopService {
2290
+ private ngZone;
2291
+ private readonly _runtime;
2292
+ private backendStatusSubject;
2293
+ private windowStateSubject;
2294
+ private wailsRuntime;
1935
2295
  constructor();
2296
+ private loadWailsRuntime;
2297
+ private hasElectron;
2298
+ private hasWails;
2299
+ get runtime(): DesktopRuntime;
2300
+ get isDesktop(): boolean;
1936
2301
  get isElectron(): boolean;
2302
+ get isWails(): boolean;
1937
2303
  get platform(): string;
2304
+ private setupWailsListeners;
1938
2305
  getAppVersion(): Promise<string>;
1939
- getElectronVersion(): Promise<string>;
2306
+ getRuntimeVersion(): Promise<string>;
1940
2307
  minimize(): void;
1941
2308
  maximize(): void;
1942
2309
  close(): void;
@@ -1949,8 +2316,16 @@ declare class ElectronService {
1949
2316
  isBackendReady(): Promise<boolean>;
1950
2317
  onBackendStatusChange(): Observable<any>;
1951
2318
  onWindowStateChange(): Observable<'maximized' | 'unmaximized'>;
1952
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElectronService, never>;
1953
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<ElectronService>;
2319
+ logToFile(message: string): Promise<void>;
2320
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DesktopService, never>;
2321
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<DesktopService>;
2322
+ }
2323
+
2324
+ declare class ExcelLaunchService extends BaseApiService {
2325
+ createLaunchCode(request: ExcelLaunchRequest): Observable<ExcelLaunchCode>;
2326
+ claimLaunchCode(code: string): Observable<ExcelLaunchClaimResponse>;
2327
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ExcelLaunchService, never>;
2328
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ExcelLaunchService>;
1954
2329
  }
1955
2330
 
1956
2331
  declare class SdrfAgeInput implements OnInit {
@@ -1960,6 +2335,7 @@ declare class SdrfAgeInput implements OnInit {
1960
2335
  private sdrfSyntax;
1961
2336
  ageForm: FormGroup;
1962
2337
  isRange: boolean;
2338
+ constructor();
1963
2339
  ngOnInit(): void;
1964
2340
  private parseAndSetValue;
1965
2341
  private updateValue;
@@ -1988,6 +2364,7 @@ declare class SdrfModificationInput implements OnInit {
1988
2364
  showSpecifications: _angular_core.WritableSignal<boolean>;
1989
2365
  showHiddenSpecifications: _angular_core.WritableSignal<boolean>;
1990
2366
  hiddenSpecificationCount: _angular_core.WritableSignal<number>;
2367
+ constructor();
1991
2368
  ngOnInit(): void;
1992
2369
  private parseAndSetValue;
1993
2370
  private getStringValue;
@@ -2017,6 +2394,7 @@ declare class SdrfSpikedCompoundInput implements OnInit {
2017
2394
  private sdrfSyntax;
2018
2395
  spikedForm: FormGroup;
2019
2396
  compoundTypes: string[];
2397
+ constructor();
2020
2398
  ngOnInit(): void;
2021
2399
  private parseAndSetValue;
2022
2400
  private getStringValue;
@@ -2038,6 +2416,7 @@ declare class SdrfCleavageInput implements OnInit {
2038
2416
  private metadataColumnService;
2039
2417
  private metadataColumnTemplateService;
2040
2418
  cleavageForm: FormGroup;
2419
+ constructor();
2041
2420
  ngOnInit(): void;
2042
2421
  private parseAndSetValue;
2043
2422
  private getStringValue;
@@ -2050,6 +2429,45 @@ declare class SdrfCleavageInput implements OnInit {
2050
2429
  static ɵcmp: _angular_core.ɵɵ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>;
2051
2430
  }
2052
2431
 
2432
+ declare class SdrfNumberWithUnitInput implements OnInit, OnChanges {
2433
+ private fb;
2434
+ value: string;
2435
+ units: string[];
2436
+ placeholder: string;
2437
+ description: string;
2438
+ examples: (string | number)[];
2439
+ valueChange: EventEmitter<string>;
2440
+ form: FormGroup;
2441
+ constructor(fb: FormBuilder);
2442
+ ngOnInit(): void;
2443
+ ngOnChanges(changes: SimpleChanges): void;
2444
+ private parseAndSetValue;
2445
+ private updateValue;
2446
+ selectExample(example: string | number): void;
2447
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdrfNumberWithUnitInput, never>;
2448
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdrfNumberWithUnitInput, "ccv-sdrf-number-with-unit-input", never, { "value": { "alias": "value"; "required": false; }; "units": { "alias": "units"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "description": { "alias": "description"; "required": false; }; "examples": { "alias": "examples"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
2449
+ }
2450
+
2451
+ declare class SdrfSelectInput implements OnInit, OnChanges {
2452
+ value: string;
2453
+ options: string[];
2454
+ placeholder: string;
2455
+ description: string;
2456
+ allowCustom: boolean;
2457
+ valueChange: EventEmitter<string>;
2458
+ selectedValue: _angular_core.WritableSignal<string>;
2459
+ isCustomMode: _angular_core.WritableSignal<boolean>;
2460
+ customValue: _angular_core.WritableSignal<string>;
2461
+ ngOnInit(): void;
2462
+ ngOnChanges(changes: SimpleChanges): void;
2463
+ private initializeValue;
2464
+ onSelectionChange(value: string): void;
2465
+ onCustomValueChange(value: string): void;
2466
+ toggleCustomMode(): void;
2467
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdrfSelectInput, never>;
2468
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdrfSelectInput, "ccv-sdrf-select-input", never, { "value": { "alias": "value"; "required": false; }; "options": { "alias": "options"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "description": { "alias": "description"; "required": false; }; "allowCustom": { "alias": "allowCustom"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
2469
+ }
2470
+
2053
2471
  interface MetadataValueEditConfig {
2054
2472
  columnId?: number;
2055
2473
  columnName: string;
@@ -2071,6 +2489,10 @@ interface MetadataValueEditConfig {
2071
2489
  maxSampleCount?: number;
2072
2490
  allowNotApplicable?: boolean;
2073
2491
  allowNotAvailable?: boolean;
2492
+ inputType?: ColumnInputType;
2493
+ validators?: ColumnValidator[];
2494
+ units?: string[];
2495
+ possibleDefaultValues?: (string | number)[];
2074
2496
  }
2075
2497
  declare class MetadataValueEditModal implements OnInit {
2076
2498
  private fb;
@@ -2102,10 +2524,17 @@ declare class MetadataValueEditModal implements OnInit {
2102
2524
  specialSyntaxType: _angular_core.WritableSignal<SyntaxType | null>;
2103
2525
  showSpecialInput: _angular_core.WritableSignal<boolean>;
2104
2526
  specialInputValue: _angular_core.WritableSignal<string>;
2527
+ validatorInputType: _angular_core.WritableSignal<ColumnInputType | null>;
2528
+ validatorUnits: _angular_core.WritableSignal<string[]>;
2529
+ validatorOptions: _angular_core.WritableSignal<string[]>;
2530
+ validatorDescription: _angular_core.WritableSignal<string>;
2531
+ validatorExamples: _angular_core.WritableSignal<(string | number)[]>;
2105
2532
  selectedSampleIndices: _angular_core.WritableSignal<Set<number>>;
2106
2533
  showSamplePanel: _angular_core.WritableSignal<boolean>;
2107
2534
  constructor(fb: FormBuilder, activeModal: NgbActiveModal, authService: AuthService, favouriteMetadataOptionService: FavouriteMetadataOptionService, metadataColumnService: MetadataColumnService, metadataColumnTemplateService: MetadataColumnTemplateService, labGroupService: LabGroupService, ontologySearchService: OntologySearchService);
2108
2535
  ngOnInit(): void;
2536
+ private initializeValidatorInputType;
2537
+ onValidatorInputChange(value: string): void;
2109
2538
  onCancel(): void;
2110
2539
  onClose(): void;
2111
2540
  get title(): string;
@@ -2270,9 +2699,9 @@ declare class AsyncTaskUIService implements OnDestroy {
2270
2699
  private toastService;
2271
2700
  private asyncTaskMonitor;
2272
2701
  private modalService;
2273
- private electronService;
2274
- tasks$: Observable<AsyncTaskStatus[]>;
2275
- activeTasks$: Observable<AsyncTaskStatus[]>;
2702
+ private desktopService;
2703
+ tasks: _angular_core.Signal<AsyncTaskStatus[]>;
2704
+ activeTasks: _angular_core.Signal<AsyncTaskStatus[]>;
2276
2705
  metadataTableRefresh$: Observable<number>;
2277
2706
  taskCompleted$: Observable<AsyncTaskStatus>;
2278
2707
  exportTaskCompleted$: Observable<AsyncTaskStatus>;
@@ -2370,6 +2799,11 @@ declare class MetadataTableTemplates implements OnInit {
2370
2799
  * Perform the actual template column reordering with async task monitoring
2371
2800
  */
2372
2801
  private performTemplateColumnReorder;
2802
+ /**
2803
+ * Sync template columns from linked schemas.
2804
+ * Updates columns with latest ontology settings and adds new columns from schemas.
2805
+ */
2806
+ syncTemplateFromSchemas(template: MetadataTableTemplate): void;
2373
2807
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MetadataTableTemplates, never>;
2374
2808
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MetadataTableTemplates, "ccv-metadata-table-templates", never, {}, {}, never, never, true, never>;
2375
2809
  }
@@ -2434,7 +2868,9 @@ declare class ColumnEditModal implements OnInit {
2434
2868
  private activeModal;
2435
2869
  private modalService;
2436
2870
  private metadataColumnTemplateService;
2871
+ private schemaService;
2437
2872
  private sdrfSyntaxService;
2873
+ private officialColumnCache;
2438
2874
  column: MetadataColumn | null;
2439
2875
  templateId: number | null;
2440
2876
  isEdit: boolean;
@@ -2455,13 +2891,13 @@ declare class ColumnEditModal implements OnInit {
2455
2891
  totalTemplates: number;
2456
2892
  totalTemplatePages: number;
2457
2893
  Math: Math;
2458
- officialSdrfColumns: SdrfColumnConfig[];
2459
- showOfficialColumns: boolean;
2460
- selectedOfficialColumn: SdrfColumnConfig | null;
2461
- availableOfficialColumns: SdrfColumnConfig[];
2894
+ showSystemTemplatesOnly: boolean;
2895
+ selectedSchemaFilter: string;
2896
+ availableSchemas: Schema[];
2897
+ validationError: _angular_core.WritableSignal<string | null>;
2462
2898
  showTemplateSwap: boolean;
2463
2899
  showCreateCustomTemplate: boolean;
2464
- constructor(fb: FormBuilder, activeModal: NgbActiveModal, modalService: NgbModal, metadataColumnTemplateService: MetadataColumnTemplateService, sdrfSyntaxService: SdrfSyntaxService);
2900
+ constructor(fb: FormBuilder, activeModal: NgbActiveModal, modalService: NgbModal, metadataColumnTemplateService: MetadataColumnTemplateService, schemaService: SchemaService, sdrfSyntaxService: SdrfSyntaxService, officialColumnCache: OfficialColumnCacheService);
2465
2901
  ngOnInit(): void;
2466
2902
  private populateForm;
2467
2903
  private getOntologyTypeIndex;
@@ -2476,17 +2912,15 @@ declare class ColumnEditModal implements OnInit {
2476
2912
  openValueEditModal(): void;
2477
2913
  setDefaultValue(value: string): void;
2478
2914
  private loadColumnTemplates;
2915
+ private loadAvailableSchemas;
2916
+ toggleSystemTemplatesFilter(systemOnly: boolean): void;
2917
+ onSchemaFilterChange(schema: string): void;
2479
2918
  onTemplateFilterChange(): void;
2480
2919
  clearTemplateFilter(): void;
2481
2920
  onTemplatePageChange(page: number): void;
2482
2921
  onTemplateSelectionChange(): void;
2483
2922
  clearTemplate(): void;
2484
2923
  getOntologyTypeLabel(ontologyType: string): string;
2485
- toggleOfficialColumns(): void;
2486
- selectOfficialColumn(column: SdrfColumnConfig): void;
2487
- private filterOfficialColumns;
2488
- private getOntologyConfigForColumn;
2489
- private isColumnMandatory;
2490
2924
  showTemplateSwapOptions(): void;
2491
2925
  swapToTemplate(template: MetadataColumnTemplate): void;
2492
2926
  showCreateCustomTemplateOption(): void;
@@ -2495,6 +2929,7 @@ declare class ColumnEditModal implements OnInit {
2495
2929
  toggleAdvancedMode(): void;
2496
2930
  onOntologyTypeChange(event: Event): void;
2497
2931
  private getCorrectedColumnType;
2932
+ private getOntologyConfigForColumn;
2498
2933
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColumnEditModal, never>;
2499
2934
  static ɵcmp: _angular_core.ɵɵ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>;
2500
2935
  }
@@ -2503,26 +2938,48 @@ interface TemplateSchemaSelectionResult {
2503
2938
  name: string;
2504
2939
  description: string;
2505
2940
  schemaIds: number[];
2506
- labGroupId?: number;
2941
+ labGroup?: number;
2507
2942
  visibility: ResourceVisibility;
2508
2943
  isDefault: boolean;
2509
2944
  }
2510
- declare class TemplateSchemaSelectionModal {
2945
+ interface SchemasByLayer {
2946
+ technology: Schema[];
2947
+ sample: Schema[];
2948
+ experiment: Schema[];
2949
+ other: Schema[];
2950
+ }
2951
+ declare class TemplateSchemaSelectionModal implements OnInit {
2511
2952
  private fb;
2512
2953
  activeModal: NgbActiveModal;
2513
- availableSchemas: any[];
2954
+ private _availableSchemas;
2955
+ set availableSchemas(value: Schema[]);
2956
+ get availableSchemas(): Schema[];
2514
2957
  labGroups: any[];
2515
2958
  templateCreated: EventEmitter<TemplateSchemaSelectionResult>;
2516
2959
  templateForm: FormGroup;
2517
2960
  selectedSchemas: _angular_core.WritableSignal<Set<number>>;
2961
+ schemasByLayer: _angular_core.WritableSignal<SchemasByLayer>;
2962
+ layerInfo: Record<string, {
2963
+ label: string;
2964
+ icon: string;
2965
+ description: string;
2966
+ color: string;
2967
+ }>;
2518
2968
  selectedSchemasCount: _angular_core.Signal<number>;
2519
2969
  constructor(fb: FormBuilder, activeModal: NgbActiveModal);
2970
+ ngOnInit(): void;
2971
+ private groupSchemasByLayer;
2972
+ getLayerKeys(): string[];
2973
+ hasLayerSchemas(layer: string): boolean;
2974
+ getLayerSchemas(layer: string): Schema[];
2520
2975
  toggleSchema(schemaId: number): void;
2521
2976
  onSchemaCheckChange(event: Event, schemaId: number): void;
2522
2977
  isSchemaSelected(schemaId: number): boolean;
2523
2978
  getSelectedSchemas(): number[];
2524
2979
  removeSchema(schemaId: number): void;
2980
+ getSchemaById(schemaId: number): Schema | undefined;
2525
2981
  getSchemaDisplayName(schemaId: number): string;
2982
+ getSchemaLayer(schemaId: number): string;
2526
2983
  private updateDescription;
2527
2984
  canCreateTemplate(): boolean;
2528
2985
  onCreateTemplate(): void;
@@ -2536,14 +2993,14 @@ interface TableCreationData {
2536
2993
  templateId: number;
2537
2994
  sampleCount?: number;
2538
2995
  description?: string;
2539
- labGroupId?: number;
2996
+ labGroup?: number;
2540
2997
  }
2541
2998
  declare class TableCreationModalComponent implements OnInit {
2542
2999
  private fb;
2543
3000
  activeModal: NgbActiveModal;
2544
3001
  template: MetadataTableTemplate;
2545
3002
  labGroups: LabGroup[];
2546
- selectedLabGroupId?: number;
3003
+ selectedLabGroup?: number;
2547
3004
  tableCreated: EventEmitter<TableCreationData>;
2548
3005
  tableForm: FormGroup;
2549
3006
  isCreating: boolean;
@@ -2557,7 +3014,7 @@ declare class TableCreationModalComponent implements OnInit {
2557
3014
  getFieldError(fieldName: string): string | null;
2558
3015
  private getFieldLabel;
2559
3016
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableCreationModalComponent, never>;
2560
- static ɵcmp: _angular_core.ɵɵ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>;
3017
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableCreationModalComponent, "ccv-table-creation-modal", never, { "template": { "alias": "template"; "required": false; }; "labGroups": { "alias": "labGroups"; "required": false; }; "selectedLabGroup": { "alias": "selectedLabGroup"; "required": false; }; }, { "tableCreated": "tableCreated"; }, never, never, true, never>;
2561
3018
  }
2562
3019
 
2563
3020
  interface SchemaSelectionResult {
@@ -2610,6 +3067,7 @@ declare class ColumnTemplates implements OnInit {
2610
3067
  columnFilter: _angular_core.WritableSignal<string>;
2611
3068
  sortField: _angular_core.WritableSignal<string>;
2612
3069
  sortDirection: _angular_core.WritableSignal<"asc" | "desc">;
3070
+ viewMode: _angular_core.WritableSignal<"flat" | "grouped">;
2613
3071
  templatesData: _angular_core.WritableSignal<{
2614
3072
  count: number;
2615
3073
  results: MetadataColumnTemplate[];
@@ -2619,11 +3077,23 @@ declare class ColumnTemplates implements OnInit {
2619
3077
  selectedSchema: _angular_core.WritableSignal<Schema | null>;
2620
3078
  schemaSearchText: string;
2621
3079
  schemaTypeFilter: _angular_core.WritableSignal<"user" | "all" | "builtin">;
3080
+ groupedTemplatesData: _angular_core.WritableSignal<{
3081
+ count: number;
3082
+ results: GroupedColumnTemplate[];
3083
+ }>;
3084
+ expandedGroups: _angular_core.WritableSignal<Set<string>>;
3085
+ groupTemplatesCache: _angular_core.WritableSignal<Map<string, MetadataColumnTemplate[]>>;
3086
+ loadingGroups: _angular_core.WritableSignal<Set<string>>;
3087
+ isLoadingGrouped: _angular_core.WritableSignal<boolean>;
3088
+ groupedCurrentPage: _angular_core.WritableSignal<number>;
3089
+ groupedPageSize: _angular_core.WritableSignal<number>;
2622
3090
  hasTemplates: _angular_core.Signal<boolean>;
2623
3091
  hasLabGroups: _angular_core.Signal<boolean>;
2624
3092
  hasSchemas: _angular_core.Signal<boolean>;
2625
3093
  showTemplatesPagination: _angular_core.Signal<boolean>;
2626
3094
  showLabGroupsPagination: _angular_core.Signal<boolean>;
3095
+ hasGroupedTemplates: _angular_core.Signal<boolean>;
3096
+ showGroupedPagination: _angular_core.Signal<boolean>;
2627
3097
  filteredTemplates: _angular_core.Signal<MetadataColumnTemplate[]>;
2628
3098
  constructor(fb: FormBuilder, metadataColumnTemplateService: MetadataColumnTemplateService, labGroupService: LabGroupService, schemaService: SchemaService, modalService: NgbModal);
2629
3099
  ngOnInit(): void;
@@ -2658,6 +3128,17 @@ declare class ColumnTemplates implements OnInit {
2658
3128
  deleteTemplate(template: MetadataColumnTemplate): void;
2659
3129
  duplicateTemplate(template: MetadataColumnTemplate): void;
2660
3130
  private refreshTemplates;
3131
+ setViewMode(mode: 'flat' | 'grouped'): void;
3132
+ private loadGroupedTemplates;
3133
+ onGroupedPageChange(page: number): void;
3134
+ getGroupKey(group: GroupedColumnTemplate): string;
3135
+ isGroupExpanded(group: GroupedColumnTemplate): boolean;
3136
+ isGroupLoading(group: GroupedColumnTemplate): boolean;
3137
+ toggleGroup(group: GroupedColumnTemplate): void;
3138
+ private loadGroupTemplates;
3139
+ getGroupTemplates(group: GroupedColumnTemplate): MetadataColumnTemplate[];
3140
+ collapseAllGroups(): void;
3141
+ expandAllGroups(): void;
2661
3142
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColumnTemplates, never>;
2662
3143
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ColumnTemplates, "ccv-column-templates", never, {}, {}, never, never, true, never>;
2663
3144
  }
@@ -2705,13 +3186,6 @@ declare class ColumnTemplateEditModal implements OnInit {
2705
3186
  }
2706
3187
 
2707
3188
  declare class FavoriteManagement implements OnInit {
2708
- private fb;
2709
- private favouriteMetadataOptionService;
2710
- private metadataColumnTemplateService;
2711
- private labGroupService;
2712
- private toastService;
2713
- private modalService;
2714
- private authService;
2715
3189
  Math: Math;
2716
3190
  isLoading: _angular_core.WritableSignal<boolean>;
2717
3191
  favorites: _angular_core.WritableSignal<FavouriteMetadataOption[]>;
@@ -2731,10 +3205,17 @@ declare class FavoriteManagement implements OnInit {
2731
3205
  editingFavorite: _angular_core.WritableSignal<FavouriteMetadataOption | null>;
2732
3206
  showEditModal: _angular_core.WritableSignal<boolean>;
2733
3207
  private sdrfSyntaxService;
3208
+ private fb;
3209
+ private favouriteMetadataOptionService;
3210
+ private metadataColumnTemplateService;
3211
+ private labGroupService;
3212
+ private toastService;
3213
+ private modalService;
3214
+ private authService;
2734
3215
  specialSyntaxType: _angular_core.WritableSignal<SyntaxType | null>;
2735
3216
  showSpecialInput: _angular_core.WritableSignal<boolean>;
2736
3217
  specialInputValue: _angular_core.WritableSignal<string>;
2737
- currentUser: _angular_core.WritableSignal<User | null>;
3218
+ currentUser: _angular_core.Signal<User | null>;
2738
3219
  isAdmin: _angular_core.Signal<boolean>;
2739
3220
  currentUserId: _angular_core.Signal<number | null>;
2740
3221
  userLabGroups: _angular_core.WritableSignal<LabGroup[]>;
@@ -2754,7 +3235,7 @@ declare class FavoriteManagement implements OnInit {
2754
3235
  value: string;
2755
3236
  label: string;
2756
3237
  }[];
2757
- constructor(fb: FormBuilder, favouriteMetadataOptionService: FavouriteMetadataOptionService, metadataColumnTemplateService: MetadataColumnTemplateService, labGroupService: LabGroupService, toastService: ToastService, modalService: NgbModal, authService: AuthService);
3238
+ constructor();
2758
3239
  ngOnInit(): void;
2759
3240
  loadFavorites(): void;
2760
3241
  canEditFavorite(favorite: FavouriteMetadataOption): boolean;
@@ -2857,6 +3338,7 @@ declare class MetadataTableDetails implements OnInit, OnDestroy {
2857
3338
  private toastService;
2858
3339
  private asyncTaskService;
2859
3340
  private modalService;
3341
+ private officialColumnCache;
2860
3342
  private destroy$;
2861
3343
  fileInput: ElementRef<HTMLInputElement>;
2862
3344
  excelInput: ElementRef<HTMLInputElement>;
@@ -2869,6 +3351,8 @@ declare class MetadataTableDetails implements OnInit, OnDestroy {
2869
3351
  getSortIcon(field: string): string;
2870
3352
  isSorted(field: string): boolean;
2871
3353
  isLoading: _angular_core.WritableSignal<boolean>;
3354
+ overrideSampleCount: _angular_core.WritableSignal<boolean>;
3355
+ applySchemaTemplates: _angular_core.WritableSignal<boolean>;
2872
3356
  table: _angular_core.WritableSignal<MetadataTable | null>;
2873
3357
  tableId: _angular_core.WritableSignal<number | null>;
2874
3358
  viewMode: _angular_core.WritableSignal<"list" | "table">;
@@ -2886,7 +3370,7 @@ declare class MetadataTableDetails implements OnInit, OnDestroy {
2886
3370
  poolTableRows: _angular_core.Signal<any[]>;
2887
3371
  paginatedRows: _angular_core.Signal<any[]>;
2888
3372
  totalPages: _angular_core.Signal<number>;
2889
- constructor(route: ActivatedRoute, router: Router, metadataTableService: MetadataTableService, asyncExportService: AsyncExportService, chunkedUploadService: ChunkedUploadService, samplePoolService: SamplePoolService, metadataColumnService: MetadataColumnService, toastService: ToastService, asyncTaskService: AsyncTaskUIService, modalService: NgbModal);
3373
+ constructor(route: ActivatedRoute, router: Router, metadataTableService: MetadataTableService, asyncExportService: AsyncExportService, chunkedUploadService: ChunkedUploadService, samplePoolService: SamplePoolService, metadataColumnService: MetadataColumnService, toastService: ToastService, asyncTaskService: AsyncTaskUIService, modalService: NgbModal, officialColumnCache: OfficialColumnCacheService);
2890
3374
  ngOnInit(): void;
2891
3375
  ngOnDestroy(): void;
2892
3376
  private setupAsyncTaskRefreshListener;
@@ -2931,6 +3415,7 @@ declare class MetadataTableDetails implements OnInit, OnDestroy {
2931
3415
  viewColumnDetails(column: MetadataColumn): void;
2932
3416
  editColumnSettings(column: MetadataColumn): void;
2933
3417
  openColumnHistory(column: MetadataColumn): void;
3418
+ openColumnOverrideImportModal(): void;
2934
3419
  private updateColumnSettings;
2935
3420
  editPoolColumnValue(pool: SamplePool, column: any): void;
2936
3421
  editSampleColumnValue(column: MetadataColumn, sampleIndex: number): void;
@@ -3103,18 +3588,17 @@ interface ColumnHistoryModalConfig {
3103
3588
  columnName: string;
3104
3589
  }
3105
3590
  declare class MetadataColumnHistoryModal implements OnInit {
3106
- activeModal: NgbActiveModal;
3107
- private columnService;
3108
3591
  config: ColumnHistoryModalConfig;
3109
3592
  closed: EventEmitter<void>;
3110
- history: MetadataColumnHistoryRecord[];
3111
- loading: boolean;
3112
- error: string | null;
3113
- totalCount: number;
3114
- limit: number;
3115
- offset: number;
3116
- hasMore: boolean;
3117
- constructor(activeModal: NgbActiveModal, columnService: MetadataColumnService);
3593
+ readonly history: _angular_core.WritableSignal<MetadataColumnHistoryRecord[]>;
3594
+ readonly loading: _angular_core.WritableSignal<boolean>;
3595
+ readonly error: _angular_core.WritableSignal<string | null>;
3596
+ readonly totalCount: _angular_core.WritableSignal<number>;
3597
+ readonly hasMore: _angular_core.WritableSignal<boolean>;
3598
+ private limit;
3599
+ private offset;
3600
+ readonly activeModal: NgbActiveModal;
3601
+ private columnService;
3118
3602
  ngOnInit(): void;
3119
3603
  loadHistory(): void;
3120
3604
  loadMore(): void;
@@ -3126,10 +3610,88 @@ declare class MetadataColumnHistoryModal implements OnInit {
3126
3610
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<MetadataColumnHistoryModal, "ccv-metadata-column-history-modal", never, { "config": { "alias": "config"; "required": false; }; }, { "closed": "closed"; }, never, never, true, never>;
3127
3611
  }
3128
3612
 
3613
+ declare class OpenInExcel {
3614
+ private launchService;
3615
+ readonly tableId: _angular_core.InputSignal<number>;
3616
+ readonly tableName: _angular_core.InputSignal<string>;
3617
+ readonly buttonClass: _angular_core.InputSignal<string>;
3618
+ readonly showIcon: _angular_core.InputSignal<boolean>;
3619
+ readonly buttonText: _angular_core.InputSignal<string>;
3620
+ readonly launched: _angular_core.OutputEmitterRef<ExcelLaunchCode>;
3621
+ readonly error: _angular_core.OutputEmitterRef<string>;
3622
+ readonly isLoading: _angular_core.WritableSignal<boolean>;
3623
+ readonly launchCode: _angular_core.WritableSignal<ExcelLaunchCode | null>;
3624
+ readonly showModal: _angular_core.WritableSignal<boolean>;
3625
+ readonly copySuccess: _angular_core.WritableSignal<boolean>;
3626
+ createLaunchCode(): void;
3627
+ copyCode(): void;
3628
+ closeModal(): void;
3629
+ getExpiryTime(): string;
3630
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OpenInExcel, never>;
3631
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OpenInExcel, "ccv-open-in-excel", never, { "tableId": { "alias": "tableId"; "required": true; "isSignal": true; }; "tableName": { "alias": "tableName"; "required": false; "isSignal": true; }; "buttonClass": { "alias": "buttonClass"; "required": false; "isSignal": true; }; "showIcon": { "alias": "showIcon"; "required": false; "isSignal": true; }; "buttonText": { "alias": "buttonText"; "required": false; "isSignal": true; }; }, { "launched": "launched"; "error": "error"; }, never, never, true, never>;
3632
+ }
3633
+
3634
+ interface ColumnOverrideImportModalConfig {
3635
+ tableId: number;
3636
+ tableName: string;
3637
+ sampleCount: number;
3638
+ }
3639
+ type Step = 'upload' | 'map' | 'preview' | 'confirming' | 'done';
3640
+ declare class ColumnOverrideImportModal {
3641
+ config: ColumnOverrideImportModalConfig;
3642
+ private activeModal;
3643
+ private tableService;
3644
+ private fb;
3645
+ readonly step: _angular_core.WritableSignal<Step>;
3646
+ readonly selectedFile: _angular_core.WritableSignal<File | null>;
3647
+ readonly isLoading: _angular_core.WritableSignal<boolean>;
3648
+ readonly error: _angular_core.WritableSignal<string | null>;
3649
+ readonly suggestResult: _angular_core.WritableSignal<ColumnOverrideSuggestResult | null>;
3650
+ readonly userMapping: _angular_core.WritableSignal<ColumnOverrideMappingEntry[]>;
3651
+ readonly previewResult: _angular_core.WritableSignal<ColumnOverridePreviewResult | null>;
3652
+ readonly commitResult: _angular_core.WritableSignal<ColumnOverrideCommitResult | null>;
3653
+ readonly optionsForm: FormGroup;
3654
+ readonly mappedColumnIds: _angular_core.Signal<Set<number>>;
3655
+ readonly newColumnCount: _angular_core.Signal<number>;
3656
+ onFileChange(event: Event): void;
3657
+ generateMapping(): void;
3658
+ updateMappingEntry(fileColIndex: number, value: string): void;
3659
+ removeMappingEntry(fileColIndex: number): void;
3660
+ restoreMappingEntry(fileColIndex: number): void;
3661
+ isIgnored(fileColIndex: number): boolean;
3662
+ getColumnIdForFileCol(fileColIndex: number): string;
3663
+ reapplyAlgorithm(): void;
3664
+ preview(): void;
3665
+ confirm(): void;
3666
+ backToUpload(): void;
3667
+ backToMap(): void;
3668
+ close(): void;
3669
+ dismiss(): void;
3670
+ private buildOptions;
3671
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColumnOverrideImportModal, never>;
3672
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ColumnOverrideImportModal, "ccv-column-override-import-modal", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
3673
+ }
3674
+
3129
3675
  declare class CupcakeVanilla {
3130
3676
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CupcakeVanilla, never>;
3131
3677
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CupcakeVanilla, "ccv-cupcake-vanilla", never, {}, {}, never, never, true, never>;
3132
3678
  }
3133
3679
 
3134
- export { AsyncExportService, AsyncImportService, AsyncTaskService, AsyncTaskUIService, AsyncValidationService, COLUMN_TYPE_CONFIGS, ChunkedImportService, ChunkedUploadService, ColumnEditModal, ColumnTemplateEditModal, ColumnTemplates, ColumnType, CupcakeVanilla, ElectronService, ExcelExportModalComponent, FavoriteManagement, FavouriteMetadataOptionService, MSTermType, MetadataColumnAutofillModal, MetadataColumnHistoryModal, MetadataColumnService, MetadataColumnTemplateService, MetadataColumnTemplateShareService, MetadataManagementService, MetadataTableDetails, MetadataTableEditModal, MetadataTableService, MetadataTableTemplateEditModal, MetadataTableTemplateService, MetadataTableTemplates, MetadataValidationModal, MetadataValueEditModal, NotificationService, NotificationType, OFFICIAL_SDRF_COLUMNS, ONTOLOGY_TYPE_CONFIGS, OntologySearchService, OntologyType, OntologyTypeLabels, OntologyUtils, SDRFDefaultsService, SamplePoolCreateModal, SamplePoolDetailsModal, SamplePoolEditModal, SamplePoolService, SchemaSelectionModal, SchemaService, SdrfAgeInput, SdrfCleavageInput, SdrfColumnCategory, SdrfModificationInput, SdrfSpikedCompoundInput, SdrfSyntaxService, SearchReplaceModal, TableCreationModalComponent, TemplatePermissionLabels, TemplatePermissionLevel, TemplateSchemaSelectionModal, ValidationResultsModal, Websocket, getRequiredSdrfColumns, getSdrfColumnByName, getSdrfColumnsByCategory, isSdrfColumnRequired, isUnimodFullData };
3135
- export type { AdvancedAutofillRequest, AdvancedAutofillResponse, AgeFormat, ApiResponse, BaseTimestampedModel, CellOntology, ChEBICompound, ChunkedFileImportRequest, ChunkedImportProgress, ChunkedUploadCompletionRequest, ChunkedUploadCompletionResponse, ChunkedUploadRequest, ChunkedUploadResponse, ChunkedUploadStatus, CleavageAgentDetails, ColumnHistoryModalConfig, ColumnTypeConfig, ElectronAPI, ExcelExportOptions, FavouriteMetadataOption, FavouriteMetadataOptionCreateRequest, FavouriteMetadataOptionQueryParams, FavouriteMetadataOptionUpdateRequest, HumanDisease, MSUniqueVocabularies, MetadataColumn, MetadataColumnAutofillConfig, MetadataColumnCreateRequest, MetadataColumnHistoryChange, MetadataColumnHistoryRecord, MetadataColumnHistoryResponse, MetadataColumnHistorySnapshot, MetadataColumnModifier, MetadataColumnQueryParams, MetadataColumnTemplate, MetadataColumnTemplateCreateRequest, MetadataColumnTemplateQueryParams, MetadataColumnTemplateShare, MetadataColumnTemplateShareCreateRequest, MetadataColumnTemplateShareQueryParams, MetadataColumnTemplateUpdateRequest, MetadataColumnUpdateRequest, MetadataQueryParams, MetadataTable, MetadataTableCreateRequest, MetadataTableQueryParams, MetadataTableQueryResponse, MetadataTableTemplate, MetadataTableTemplateCreateRequest, MetadataTableTemplateQueryParams, MetadataTableTemplateQueryResponse, MetadataTableTemplateUpdateRequest, MetadataTableUpdateRequest, MetadataValueEditConfig, ModificationParameters, MondoDisease, NCBITaxonomy, OntologyCustomFilter, OntologySuggestParams, OntologySuggestResponse, OntologySuggestion, OntologyTypeConfig, PSIMSOntology, PaginatedResponse, PooledSample, SampleCountConfirmationError, SampleCountValidationRequest, SampleCountValidationResponse, SampleCountValidationResult, SamplePool, SamplePoolCreateRequest, SamplePoolQueryParams, SamplePoolUpdateRequest, Schema, SchemaQueryParams, SchemaSelectionResult, SdrfColumnConfig, SearchReplaceConfig, Species, SpikedCompound, SubcellularLocation, SyntaxType, SyntheticPeptide, TableCreationData, TemplateSchemaSelectionResult, Tissue, UberonAnatomy, Unimod, UnimodFullData, UnimodSpecification, ValidationResult, ValidationResults, VariationSpec, VariationSpecList, VariationSpecPattern, VariationSpecRange };
3680
+ declare class DualScrollDirective implements AfterViewInit, OnDestroy {
3681
+ private el;
3682
+ private renderer;
3683
+ private topBar;
3684
+ private topBarInner;
3685
+ private resizeObserver;
3686
+ private readonly onHostScroll;
3687
+ private readonly onTopScroll;
3688
+ constructor(el: ElementRef<HTMLElement>, renderer: Renderer2);
3689
+ ngAfterViewInit(): void;
3690
+ private syncWidth;
3691
+ ngOnDestroy(): void;
3692
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DualScrollDirective, never>;
3693
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DualScrollDirective, "[appDualScroll]", never, {}, {}, never, never, true, never>;
3694
+ }
3695
+
3696
+ export { AsyncExportService, AsyncImportService, AsyncTaskService, AsyncTaskUIService, AsyncValidationService, COLUMN_TYPE_CONFIGS, ChunkedImportService, ChunkedUploadService, ColumnEditModal, ColumnOverrideImportModal, ColumnTemplateEditModal, ColumnTemplates, ColumnType, CupcakeVanilla, DesktopService, DualScrollDirective, ElectronService, ExcelExportModalComponent, ExcelLaunchService, FavoriteManagement, FavouriteMetadataOptionService, MSTermType, MetadataColumnAutofillModal, MetadataColumnHistoryModal, MetadataColumnService, MetadataColumnTemplateService, MetadataColumnTemplateShareService, MetadataManagementService, MetadataTableDetails, MetadataTableEditModal, MetadataTableService, MetadataTableTemplateEditModal, MetadataTableTemplateService, MetadataTableTemplates, MetadataValidationModal, MetadataValueEditModal, NotificationService, NotificationType, OFFICIAL_SDRF_COLUMNS, ONTOLOGY_TYPE_CONFIGS, OfficialColumnCacheService, OntologySearchService, OntologyType, OntologyTypeLabels, OntologyUtils, OpenInExcel, SDRFDefaultsService, SamplePoolCreateModal, SamplePoolDetailsModal, SamplePoolEditModal, SamplePoolService, SchemaSelectionModal, SchemaService, SdrfAgeInput, SdrfCleavageInput, SdrfColumnCategory, SdrfModificationInput, SdrfNumberWithUnitInput, SdrfSelectInput, SdrfSpikedCompoundInput, SdrfSyntaxService, SearchReplaceModal, TableCreationModalComponent, TemplatePermissionLabels, TemplatePermissionLevel, TemplateSchemaSelectionModal, ValidationResultsModal, Websocket, createSyntheticColumnFromTemplate, getRequiredSdrfColumns, getSdrfColumnByName, getSdrfColumnsByCategory, isSdrfColumnRequired, isUnimodFullData };
3697
+ export type { AdvancedAutofillRequest, AdvancedAutofillResponse, AgeFormat, ApiError, ApiResponse, BTOTerm, BaseTimestampedModel, CellOntology, ChEBICompound, ChunkedFileImportRequest, ChunkedImportProgress, ChunkedUploadCompletionRequest, ChunkedUploadCompletionResponse, ChunkedUploadRequest, ChunkedUploadResponse, ChunkedUploadStatus, CleavageAgentDetails, ColumnConfig, ColumnHistoryModalConfig, ColumnInputType, ColumnOverrideCommitResult, ColumnOverrideImportModalConfig, ColumnOverrideImportOptions, ColumnOverrideMappingEntry, ColumnOverrideMatchedColumn, ColumnOverridePreviewResult, ColumnOverrideSuggestResult, ColumnTypeConfig, ColumnValidator, DiseaseOntologyTerm, ExcelExportOptions, ExcelLaunchClaimRequest, ExcelLaunchClaimResponse, ExcelLaunchCode, ExcelLaunchRequest, FavouriteMetadataOption, FavouriteMetadataOptionCreateRequest, FavouriteMetadataOptionQueryParams, FavouriteMetadataOptionUpdateRequest, GroupedColumnTemplate, GroupedColumnTemplateQueryParams, HumanDisease, MSUniqueVocabularies, MetadataColumn, MetadataColumnAutofillConfig, MetadataColumnCreateRequest, MetadataColumnHistoryChange, MetadataColumnHistoryRecord, MetadataColumnHistoryResponse, MetadataColumnHistorySnapshot, MetadataColumnModifier, MetadataColumnQueryParams, MetadataColumnTemplate, MetadataColumnTemplateCreateRequest, MetadataColumnTemplateQueryParams, MetadataColumnTemplateShare, MetadataColumnTemplateShareCreateRequest, MetadataColumnTemplateShareQueryParams, MetadataColumnTemplateUpdateRequest, MetadataColumnUpdateRequest, MetadataQueryParams, MetadataTable, MetadataTableCreateRequest, MetadataTableQueryParams, MetadataTableQueryResponse, MetadataTableTemplate, MetadataTableTemplateCreateRequest, MetadataTableTemplateQueryParams, MetadataTableTemplateQueryResponse, MetadataTableTemplateSyncRequest, MetadataTableTemplateSyncResponse, MetadataTableTemplateUpdateRequest, MetadataTableUpdateRequest, MetadataValueEditConfig, ModificationParameters, MondoDisease, NCBITaxonomy, OntologyCustomFilter, OntologySuggestParams, OntologySuggestResponse, OntologySuggestion, OntologyTypeConfig, PSIMSOntology, PaginatedResponse, PooledSample, SampleCountConfirmationError, SampleCountValidationRequest, SampleCountValidationResponse, SampleCountValidationResult, SamplePool, SamplePoolCreateRequest, SamplePoolQueryParams, SamplePoolUpdateRequest, Schema, SchemaColumn, SchemaLayer, SchemaQueryParams, SchemaSelectionResult, SchemasByLayer, SdrfColumnConfig, SearchReplaceConfig, Species, SpikedCompound, SubcellularLocation, SyntaxType, SyntheticPeptide, TableCreationData, TemplateSchemaSelectionResult, Tissue, UberonAnatomy, Unimod, UnimodFullData, UnimodSpecification, ValidationResult, ValidationResults, VariationSpec, VariationSpecList, VariationSpecPattern, VariationSpecRange };