@noatgnu/cupcake-vanilla 1.2.5 → 1.2.7
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noatgnu-cupcake-vanilla.mjs","sources":["../../../projects/cupcake-vanilla/src/lib/models/enums.ts","../../../projects/cupcake-vanilla/src/lib/models/ontology-utils.ts","../../../projects/cupcake-vanilla/src/lib/models/ontology-config.ts","../../../projects/cupcake-vanilla/src/lib/models/sdrf-config.ts","../../../projects/cupcake-vanilla/src/lib/models/async-task.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-table.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-column.ts","../../../projects/cupcake-vanilla/src/lib/services/sample-pool.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-table-template.ts","../../../projects/cupcake-vanilla/src/lib/services/favourite-metadata-option.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-column-template.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-column-template-share.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-management.ts","../../../projects/cupcake-vanilla/src/lib/services/websocket.ts","../../../projects/cupcake-vanilla/src/lib/services/admin-websocket.ts","../../../projects/cupcake-vanilla/src/lib/services/notification.ts","../../../projects/cupcake-vanilla/src/lib/services/ontology-search.ts","../../../projects/cupcake-vanilla/src/lib/services/schema.ts","../../../projects/cupcake-vanilla/src/lib/services/sdrf-defaults.ts","../../../projects/cupcake-vanilla/src/lib/services/async-task.ts","../../../projects/cupcake-vanilla/src/lib/services/async-export.ts","../../../projects/cupcake-vanilla/src/lib/services/chunked-upload.ts","../../../projects/cupcake-vanilla/src/lib/services/async-import.ts","../../../projects/cupcake-vanilla/src/lib/services/async-validation.ts","../../../projects/cupcake-vanilla/src/lib/services/chunked-import.ts","../../../projects/cupcake-vanilla/src/lib/services/sdrf-syntax.ts","../../../projects/cupcake-vanilla/src/lib/services/electron.ts","../../../projects/cupcake-vanilla/src/lib/components/sdrf-age-input/sdrf-age-input.ts","../../../projects/cupcake-vanilla/src/lib/components/sdrf-age-input/sdrf-age-input.html","../../../projects/cupcake-vanilla/src/lib/components/sdrf-modification-input/sdrf-modification-input.ts","../../../projects/cupcake-vanilla/src/lib/components/sdrf-modification-input/sdrf-modification-input.html","../../../projects/cupcake-vanilla/src/lib/components/sdrf-spiked-compound-input/sdrf-spiked-compound-input.ts","../../../projects/cupcake-vanilla/src/lib/components/sdrf-spiked-compound-input/sdrf-spiked-compound-input.html","../../../projects/cupcake-vanilla/src/lib/components/sdrf-cleavage-input/sdrf-cleavage-input.ts","../../../projects/cupcake-vanilla/src/lib/components/sdrf-cleavage-input/sdrf-cleavage-input.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-value-edit-modal/metadata-value-edit-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-value-edit-modal/metadata-value-edit-modal.html","../../../projects/cupcake-vanilla/src/lib/components/excel-export-modal/excel-export-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/excel-export-modal/excel-export-modal.html","../../../projects/cupcake-vanilla/src/lib/components/validation-results-modal/validation-results-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/validation-results-modal/validation-results-modal.html","../../../projects/cupcake-vanilla/src/lib/components/async-task-ui.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-validation-modal/metadata-validation-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-validation-modal/metadata-validation-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-edit-modal/metadata-table-edit-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-edit-modal/metadata-table-edit-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/column-edit-modal/column-edit-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/column-edit-modal/column-edit-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/metadata-table-template-edit-modal/metadata-table-template-edit-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/metadata-table-template-edit-modal/metadata-table-template-edit-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/schema-selection-modal/schema-selection-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/schema-selection-modal/schema-selection-modal.html","../../../projects/cupcake-vanilla/src/lib/components/schema-selection-modal/schema-selection-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/schema-selection-modal/schema-selection-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/table-creation-modal/table-creation-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/table-creation-modal/table-creation-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/metadata-table-templates.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/metadata-table-templates.html","../../../projects/cupcake-vanilla/src/lib/cupcake-vanilla.ts","../../../projects/cupcake-vanilla/src/public-api.ts","../../../projects/cupcake-vanilla/src/noatgnu-cupcake-vanilla.ts"],"sourcesContent":["export enum OntologyType {\r\n NONE = '',\r\n SPECIES = 'species',\r\n TISSUE = 'tissue',\r\n HUMAN_DISEASE = 'human_disease',\r\n SUBCELLULAR_LOCATION = 'subcellular_location',\r\n UNIMOD = 'unimod',\r\n NCBI_TAXONOMY = 'ncbi_taxonomy',\r\n MONDO = 'mondo',\r\n UBERON = 'uberon',\r\n CHEBI = 'chebi',\r\n CELL_ONTOLOGY = 'cell_ontology',\r\n MS_UNIQUE_VOCABULARIES = 'ms_unique_vocabularies',\r\n PSI_MS = 'psi_ms'\r\n}\r\n\r\nexport const OntologyTypeLabels: Record<OntologyType, string> = {\r\n [OntologyType.NONE]: 'None',\r\n [OntologyType.SPECIES]: 'Species',\r\n [OntologyType.TISSUE]: 'Tissue',\r\n [OntologyType.HUMAN_DISEASE]: 'Human Disease',\r\n [OntologyType.SUBCELLULAR_LOCATION]: 'Subcellular Location',\r\n [OntologyType.UNIMOD]: 'Unimod Modifications',\r\n [OntologyType.NCBI_TAXONOMY]: 'NCBI Taxonomy',\r\n [OntologyType.MONDO]: 'MONDO Disease',\r\n [OntologyType.UBERON]: 'UBERON Anatomy',\r\n [OntologyType.CHEBI]: 'ChEBI',\r\n [OntologyType.CELL_ONTOLOGY]: 'Cell Ontology',\r\n [OntologyType.MS_UNIQUE_VOCABULARIES]: 'MS Unique Vocabularies',\r\n [OntologyType.PSI_MS]: 'PSI-MS Controlled Vocabulary'\r\n};\r\n\r\nexport enum TemplatePermissionLevel {\r\n READ = 'read',\r\n WRITE = 'write',\r\n ADMIN = 'admin'\r\n}\r\n\r\nexport const TemplatePermissionLabels: Record<TemplatePermissionLevel, string> = {\r\n [TemplatePermissionLevel.READ]: 'Read Only',\r\n [TemplatePermissionLevel.WRITE]: 'Read & Write',\r\n [TemplatePermissionLevel.ADMIN]: 'Administrator'\r\n};\r\n\r\nexport enum ColumnType {\r\n CHARACTERISTICS = 'characteristics',\r\n COMMENT = 'comment',\r\n FACTOR_VALUE = 'factor_value',\r\n SOURCE_NAME = 'source_name',\r\n SPECIAL = 'special'\r\n}","export interface UnimodSpecification {\r\n accession: string;\r\n name: string;\r\n definition: string;\r\n additionalData: Array<{id: string; description: string}>;\r\n generalProperties: Record<string, string>;\r\n specifications: Record<string, UnimodSpecification>;\r\n deltaMonoMass: string;\r\n deltaAvgeMass: string;\r\n deltaComposition: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface UnimodFullData {\r\n accession: string;\r\n name: string;\r\n definition: string;\r\n additionalData: Array<{id: string; description: string}>;\r\n generalProperties: Record<string, string>;\r\n specifications: Record<string, UnimodSpecification>;\r\n deltaMonoMass: string;\r\n deltaAvgeMass: string;\r\n deltaComposition: string;\r\n [key: string]: any;\r\n}\r\n\r\nimport { OntologyType } from './enums';\r\n\r\nexport function isUnimodFullData(suggestion: any): suggestion is { fullData: UnimodFullData } {\r\n return suggestion &&\r\n suggestion.ontologyType === OntologyType.UNIMOD &&\r\n !!suggestion.fullData;\r\n}\r\n\r\nexport class OntologyUtils {\r\n static getUnimodSpecifications(suggestion: any): (UnimodSpecification & { specNumber: string })[] {\r\n if (!isUnimodFullData(suggestion)) return [];\r\n \r\n return Object.entries(suggestion.fullData.specifications).map(([specNum, spec]) => ({\r\n ...spec,\r\n specNumber: specNum\r\n }));\r\n }\r\n\r\n static getActiveUnimodSpecifications(suggestion: any): (UnimodSpecification & { specNumber: string })[] {\r\n return this.getUnimodSpecifications(suggestion).filter(spec => !spec['hidden']);\r\n }\r\n\r\n static formatUnimodName(data: UnimodFullData): string {\r\n return `${data.name} (${data.accession})`;\r\n }\r\n}","import { OntologyType, ColumnType } from './enums';\r\n\r\nexport interface OntologyCustomFilter {\r\n [ontologyType: string]: {\r\n [filterKey: string]: string | number | boolean;\r\n };\r\n}\r\n\r\nexport interface OntologyTypeConfig {\r\n value: string;\r\n label: string;\r\n customFilters?: OntologyCustomFilter;\r\n}\r\n\r\nexport interface ColumnTypeConfig {\r\n value: string;\r\n label: string;\r\n}\r\n\r\n// MS Unique Vocabularies term types based on backend load_ms_term.py\r\nexport enum MSTermType {\r\n INSTRUMENT = 'instrument',\r\n CLEAVAGE_AGENT = 'cleavage agent',\r\n DISSOCIATION_METHOD = 'dissociation method',\r\n SAMPLE_ATTRIBUTE = 'sample attribute',\r\n CELL_LINE = 'cell line',\r\n ENRICHMENT_PROCESS = 'enrichment process',\r\n FRACTIONATION_METHOD = 'fractionation method',\r\n DATA_ACQUISITION_METHOD = 'proteomics data acquisition method',\r\n REDUCTION_REAGENT = 'reduction reagent',\r\n ALKYLATION_REAGENT = 'alkylation reagent',\r\n MASS_ANALYZER_TYPE = 'mass analyzer type',\r\n ANCESTRAL_CATEGORY = 'ancestral category',\r\n SEX = 'sex',\r\n DEVELOPMENTAL_STAGE = 'developmental stage'\r\n}\r\n\r\n\r\n// Predefined ontology type configurations matching backend load_column_templates.py\r\nexport const ONTOLOGY_TYPE_CONFIGS: OntologyTypeConfig[] = [\r\n { value: OntologyType.NONE, label: 'None', customFilters: undefined },\r\n\r\n // Basic ontology types without custom filters\r\n { value: OntologyType.SPECIES, label: 'Species (UniProt)', customFilters: undefined },\r\n { value: OntologyType.NCBI_TAXONOMY, label: 'NCBI Taxonomy', customFilters: undefined },\r\n { value: OntologyType.TISSUE, label: 'Tissue (UniProt)', customFilters: undefined },\r\n { value: OntologyType.HUMAN_DISEASE, label: 'Human Disease (UniProt)', customFilters: undefined },\r\n { value: OntologyType.MONDO, label: 'MONDO Disease', customFilters: undefined },\r\n { value: OntologyType.UNIMOD, label: 'Modification (Unimod)', customFilters: undefined },\r\n { value: OntologyType.UBERON, label: 'Uberon Anatomy', customFilters: undefined },\r\n { value: OntologyType.SUBCELLULAR_LOCATION, label: 'Subcellular Location (UniProt)', customFilters: undefined },\r\n { value: OntologyType.CHEBI, label: 'ChEbi', customFilters: undefined },\r\n { value: OntologyType.CELL_ONTOLOGY, label: 'Cell Ontology', customFilters: undefined },\r\n { value: OntologyType.PSI_MS, label: 'PSI-MS', customFilters: undefined },\r\n\r\n // MS Unique Vocabularies with specific term_type filters\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Sample Attribute (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.SAMPLE_ATTRIBUTE } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Instrument (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.INSTRUMENT } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'MS Analyzer Type (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.MASS_ANALYZER_TYPE } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Cleavage Agent (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.CLEAVAGE_AGENT } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Dissociation Method (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.DISSOCIATION_METHOD } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Cell Line (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.CELL_LINE } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Enrichment Process (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.ENRICHMENT_PROCESS } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Fractionation Method (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.FRACTIONATION_METHOD } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Data Acquisition Method (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.DATA_ACQUISITION_METHOD } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Reduction Reagent (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.REDUCTION_REAGENT } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Alkylation Reagent (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.ALKYLATION_REAGENT } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Ancestral Category (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.ANCESTRAL_CATEGORY } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Sex (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.SEX } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Developmental Stage (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.DEVELOPMENTAL_STAGE } }\r\n }\r\n];\r\n\r\nexport const COLUMN_TYPE_CONFIGS: ColumnTypeConfig[] = [\r\n { value: ColumnType.CHARACTERISTICS, label: 'Characteristics' },\r\n { value: ColumnType.COMMENT, label: 'Comment' },\r\n { value: ColumnType.FACTOR_VALUE, label: 'Factor Value' },\r\n { value: ColumnType.SOURCE_NAME, label: 'Source Name' },\r\n { value: ColumnType.SPECIAL, label: 'Special' }\r\n];","import { ColumnType } from './enums';\r\n\r\nexport interface SdrfColumnConfig {\r\n name: string;\r\n type: string;\r\n description: string;\r\n category?: SdrfColumnCategory;\r\n isRequired?: boolean;\r\n}\r\n\r\nexport enum SdrfColumnCategory {\r\n CORE_SAMPLE = 'Core Sample Metadata',\r\n CHARACTERISTICS = 'Characteristics',\r\n ASSAY = 'Assay Information',\r\n COMMENTS = 'Comments',\r\n MODIFICATIONS = 'Modifications & Enzymes',\r\n MASS_TOLERANCES = 'Mass Tolerances',\r\n TECHNICAL_PARAMS = 'Technical Parameters',\r\n SAMPLE_PREP = 'Sample Preparation',\r\n FILE_PROJECT = 'File & Project Information'\r\n}\r\n\r\n// Official SDRF-Proteomics column configurations based on specification\r\nexport const OFFICIAL_SDRF_COLUMNS: SdrfColumnConfig[] = [\r\n // Core sample metadata\r\n {\r\n name: 'source name',\r\n type: ColumnType.SOURCE_NAME,\r\n description: 'Unique sample identifier',\r\n category: SdrfColumnCategory.CORE_SAMPLE,\r\n isRequired: true\r\n },\r\n\r\n // Required characteristics\r\n {\r\n name: 'characteristics[organism]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Organism of the sample',\r\n category: SdrfColumnCategory.CHARACTERISTICS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'characteristics[disease]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Disease under study',\r\n category: SdrfColumnCategory.CHARACTERISTICS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'characteristics[organism part]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Part of organism anatomy',\r\n category: SdrfColumnCategory.CHARACTERISTICS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'characteristics[cell type]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Cell type',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n\r\n // Additional characteristics\r\n {\r\n name: 'characteristics[age]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Age of the individual',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[enrichment process]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Enrichment process applied',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[pooled sample]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Pooled sample indicator',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[spiked compound]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Spiked compound details',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[synthetic peptide]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Synthetic peptide indicator',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[xenograft]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Xenograft description',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[source name]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Reference to source sample',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[individual]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Patient identifier',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[mass]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Sample mass',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[biological replicate]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Biological replicate number',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[phenotype]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Sample phenotype',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[compound]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Compound applied',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n\r\n // Assay information\r\n {\r\n name: 'assay name',\r\n type: ColumnType.SPECIAL,\r\n description: 'MS run identifier',\r\n category: SdrfColumnCategory.ASSAY,\r\n isRequired: true\r\n },\r\n {\r\n name: 'technology type',\r\n type: ColumnType.SPECIAL,\r\n description: 'Technology used for data generation',\r\n category: SdrfColumnCategory.ASSAY,\r\n isRequired: true\r\n },\r\n\r\n // Required comment fields\r\n {\r\n name: 'comment[fraction identifier]',\r\n type: ColumnType.COMMENT,\r\n description: 'Fraction number',\r\n category: SdrfColumnCategory.COMMENTS\r\n },\r\n {\r\n name: 'comment[label]',\r\n type: ColumnType.COMMENT,\r\n description: 'Label applied to sample',\r\n category: SdrfColumnCategory.COMMENTS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'comment[data file]',\r\n type: ColumnType.COMMENT,\r\n description: 'Raw data file name',\r\n category: SdrfColumnCategory.COMMENTS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'comment[instrument]',\r\n type: ColumnType.COMMENT,\r\n description: 'Mass spectrometer model',\r\n category: SdrfColumnCategory.COMMENTS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'comment[technical replicate]',\r\n type: ColumnType.COMMENT,\r\n description: 'Technical replicate number',\r\n category: SdrfColumnCategory.COMMENTS\r\n },\r\n\r\n // Modification and enzyme information\r\n {\r\n name: 'comment[modification parameters]',\r\n type: ColumnType.COMMENT,\r\n description: 'Protein modifications',\r\n category: SdrfColumnCategory.MODIFICATIONS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'comment[cleavage agent details]',\r\n type: ColumnType.COMMENT,\r\n description: 'Digestion enzyme information',\r\n category: SdrfColumnCategory.MODIFICATIONS,\r\n isRequired: true\r\n },\r\n\r\n // Mass tolerances\r\n {\r\n name: 'comment[fragment mass tolerance]',\r\n type: ColumnType.COMMENT,\r\n description: 'Fragment ion mass tolerance',\r\n category: SdrfColumnCategory.MASS_TOLERANCES\r\n },\r\n {\r\n name: 'comment[precursor mass tolerance]',\r\n type: ColumnType.COMMENT,\r\n description: 'Precursor ion mass tolerance',\r\n category: SdrfColumnCategory.MASS_TOLERANCES\r\n },\r\n\r\n // Additional technical parameters\r\n {\r\n name: 'comment[MS2 analyzer type]',\r\n type: ColumnType.COMMENT,\r\n description: 'MS2 analyzer type',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[collision energy]',\r\n type: ColumnType.COMMENT,\r\n description: 'Collision energy used',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[dissociation method]',\r\n type: ColumnType.COMMENT,\r\n description: 'Fragmentation method',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[proteomics data acquisition method]',\r\n type: ColumnType.COMMENT,\r\n description: 'DDA, DIA, etc.',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[MS1 scan range]',\r\n type: ColumnType.COMMENT,\r\n description: 'MS1 scan range for DIA',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[scan window lower limit]',\r\n type: ColumnType.COMMENT,\r\n description: 'Scan window lower limit',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[scan window upper limit]',\r\n type: ColumnType.COMMENT,\r\n description: 'Scan window upper limit',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n\r\n // Sample preparation\r\n {\r\n name: 'comment[depletion]',\r\n type: ColumnType.COMMENT,\r\n description: 'Depletion method applied',\r\n category: SdrfColumnCategory.SAMPLE_PREP\r\n },\r\n {\r\n name: 'comment[reduction reagent]',\r\n type: ColumnType.COMMENT,\r\n description: 'Reduction reagent used',\r\n category: SdrfColumnCategory.SAMPLE_PREP\r\n },\r\n {\r\n name: 'comment[alkylation reagent]',\r\n type: ColumnType.COMMENT,\r\n description: 'Alkylation reagent used',\r\n category: SdrfColumnCategory.SAMPLE_PREP\r\n },\r\n {\r\n name: 'comment[fractionation method]',\r\n type: ColumnType.COMMENT,\r\n description: 'Fractionation method',\r\n category: SdrfColumnCategory.SAMPLE_PREP\r\n },\r\n\r\n // File and project information\r\n {\r\n name: 'comment[file uri]',\r\n type: ColumnType.COMMENT,\r\n description: 'Public URI of the file',\r\n category: SdrfColumnCategory.FILE_PROJECT\r\n },\r\n {\r\n name: 'comment[proteomexchange accession number]',\r\n type: ColumnType.COMMENT,\r\n description: 'ProteomeXchange accession',\r\n category: SdrfColumnCategory.FILE_PROJECT\r\n }\r\n];\r\n\r\n// Helper functions\r\nexport function getSdrfColumnsByCategory(category?: SdrfColumnCategory): SdrfColumnConfig[] {\r\n if (!category) {\r\n return OFFICIAL_SDRF_COLUMNS;\r\n }\r\n return OFFICIAL_SDRF_COLUMNS.filter(col => col.category === category);\r\n}\r\n\r\nexport function getRequiredSdrfColumns(): SdrfColumnConfig[] {\r\n return OFFICIAL_SDRF_COLUMNS.filter(col => col.isRequired === true);\r\n}\r\n\r\nexport function getSdrfColumnByName(name: string): SdrfColumnConfig | undefined {\r\n return OFFICIAL_SDRF_COLUMNS.find(col => col.name.toLowerCase() === name.toLowerCase());\r\n}\r\n\r\nexport function isSdrfColumnRequired(name: string): boolean {\r\n const column = getSdrfColumnByName(name);\r\n return column?.isRequired === true;\r\n}","// Task status and type definitions\r\nexport type TaskStatus = 'QUEUED' | 'STARTED' | 'SUCCESS' | 'FAILURE' | 'CANCELLED';\r\n\r\nexport type TaskType =\r\n | 'EXPORT_EXCEL'\r\n | 'EXPORT_SDRF'\r\n | 'IMPORT_SDRF'\r\n | 'IMPORT_EXCEL'\r\n | 'EXPORT_MULTIPLE_SDRF'\r\n | 'EXPORT_MULTIPLE_EXCEL'\r\n | 'VALIDATE_TABLE'\r\n | 'REORDER_TABLE_COLUMNS'\r\n | 'REORDER_TEMPLATE_COLUMNS';\r\n\r\nexport interface AsyncTaskStatus {\r\n id: string;\r\n taskType: TaskType;\r\n status: TaskStatus;\r\n user: number;\r\n userUsername?: string;\r\n metadataTable?: number;\r\n metadataTableName?: string;\r\n taskTypeDisplay?: string;\r\n statusDisplay?: string;\r\n parameters?: any;\r\n result?: any;\r\n errorMessage?: string;\r\n traceback?: string;\r\n createdAt: string;\r\n startedAt?: string;\r\n completedAt?: string;\r\n rqJobId?: string;\r\n queueName?: string;\r\n progressCurrent?: number;\r\n progressTotal?: number;\r\n progressDescription?: string;\r\n duration?: number;\r\n progressPercentage?: number;\r\n}\r\n\r\nexport interface TaskListItem {\r\n id: string;\r\n taskType: TaskType;\r\n taskTypeDisplay: string;\r\n status: TaskStatus;\r\n statusDisplay: string;\r\n user: number;\r\n userUsername: string;\r\n metadataTable: number | null;\r\n metadataTableName: string | null;\r\n progressPercentage: number;\r\n progressDescription: string;\r\n createdAt: string;\r\n startedAt: string | null;\r\n completedAt: string | null;\r\n duration: number | null;\r\n errorMessage: string | null;\r\n}\r\n\r\nexport interface TaskResult {\r\n id: number;\r\n task: string;\r\n file?: string;\r\n fileName?: string;\r\n contentType?: string;\r\n fileSize?: number;\r\n expiresAt: string;\r\n downloadCount?: number;\r\n lastDownloadedAt?: string;\r\n createdAt: string;\r\n}\r\n\r\n// Async Task Request/Response Interfaces\r\nexport interface MetadataExportRequest {\r\n metadataTableId: number;\r\n includePools?: boolean;\r\n metadataColumnIds?: number[];\r\n sampleNumber?: number;\r\n exportFormat?: string;\r\n labGroupIds?: number[];\r\n}\r\n\r\nexport interface BulkExportRequest {\r\n metadataTableIds: number[];\r\n includePools?: boolean;\r\n validateSdrf?: boolean;\r\n}\r\n\r\nexport interface BulkExcelExportRequest extends BulkExportRequest {\r\n metadataColumnIds?: number[];\r\n labGroupIds?: number[];\r\n}\r\n\r\nexport interface MetadataImportRequest {\r\n metadataTableId: number;\r\n file: File;\r\n replaceExisting?: boolean;\r\n validateOntologies?: boolean;\r\n}\r\n\r\nexport interface ChunkedImportRequest {\r\n metadataTableId: number;\r\n chunkedUploadId: string;\r\n replaceExisting?: boolean;\r\n validateOntologies?: boolean;\r\n createPools?: boolean;\r\n}\r\n\r\nexport interface MetadataValidationRequest {\r\n metadataTableId: number;\r\n validateSdrfFormat?: boolean;\r\n includePools?: boolean;\r\n}\r\n\r\nexport interface MetadataValidationConfig {\r\n metadataTableId: number;\r\n metadataTableName: string;\r\n}\r\n\r\nexport interface AsyncTaskCreateResponse {\r\n taskId: string;\r\n message: string;\r\n}\r\n\r\nexport interface DownloadUrlResponse {\r\n downloadUrl: string;\r\n filename: string;\r\n contentType: string;\r\n fileSize: number;\r\n expiresAt: string;\r\n expiresInHours: number;\r\n}\r\n\r\n// Query parameters for async tasks\r\nexport interface AsyncTaskQueryParams {\r\n taskType?: string;\r\n status?: string;\r\n metadataTable?: number;\r\n search?: string;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n// Helper constants\r\nexport const TASK_TYPE_LABELS: Record<TaskType, string> = {\r\n 'EXPORT_EXCEL': 'Export Excel Template',\r\n 'EXPORT_SDRF': 'Export SDRF File',\r\n 'IMPORT_SDRF': 'Import SDRF File',\r\n 'IMPORT_EXCEL': 'Import Excel File',\r\n 'EXPORT_MULTIPLE_SDRF': 'Export Multiple SDRF Files',\r\n 'EXPORT_MULTIPLE_EXCEL': 'Export Multiple Excel Templates',\r\n 'VALIDATE_TABLE': 'Validate Metadata Table',\r\n 'REORDER_TABLE_COLUMNS': 'Reorder Table Columns',\r\n 'REORDER_TEMPLATE_COLUMNS': 'Reorder Template Columns',\r\n};\r\n\r\nexport const TASK_STATUS_LABELS: Record<TaskStatus, string> = {\r\n 'QUEUED': 'Queued',\r\n 'STARTED': 'In Progress',\r\n 'SUCCESS': 'Completed',\r\n 'FAILURE': 'Failed',\r\n 'CANCELLED': 'Cancelled',\r\n};\r\n\r\nexport const TASK_STATUS_COLORS: Record<TaskStatus, string> = {\r\n 'QUEUED': 'secondary',\r\n 'STARTED': 'primary',\r\n 'SUCCESS': 'success',\r\n 'FAILURE': 'danger',\r\n 'CANCELLED': 'warning',\r\n};","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataTable,\r\n MetadataTableCreateRequest,\r\n MetadataTableUpdateRequest,\r\n MetadataTableQueryResponse,\r\n MetadataColumn,\r\n PaginatedResponse,\r\n SampleCountValidationRequest,\r\n SampleCountValidationResponse,\r\n SampleCountConfirmationError\r\n} from '../models';\r\n\r\nexport interface MetadataTableQueryParams {\r\n search?: string;\r\n ownerId?: number;\r\n labGroupId?: number;\r\n isPublished?: boolean;\r\n isLocked?: boolean;\r\n showShared?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataTableService extends BaseApiService {\r\n\r\n /**\r\n * Get all metadata tables with optional filtering\r\n */\r\n getMetadataTables(params?: MetadataTableQueryParams): Observable<MetadataTableQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<MetadataTableQueryResponse>(`${this.apiUrl}/metadata-tables/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single metadata table by ID\r\n */\r\n getMetadataTable(id: number): Observable<MetadataTable> {\r\n return this.get<MetadataTable>(`${this.apiUrl}/metadata-tables/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new metadata table\r\n */\r\n createMetadataTable(table: MetadataTableCreateRequest): Observable<MetadataTable> {\r\n return this.post<MetadataTable>(`${this.apiUrl}/metadata-tables/`, table);\r\n }\r\n\r\n /**\r\n * Update an existing metadata table\r\n */\r\n updateMetadataTable(id: number, table: MetadataTableUpdateRequest): Observable<MetadataTable> {\r\n return this.put<MetadataTable>(`${this.apiUrl}/metadata-tables/${id}/`, table);\r\n }\r\n\r\n /**\r\n * Partially update a metadata table\r\n */\r\n patchMetadataTable(id: number, table: Partial<MetadataTableUpdateRequest>): Observable<MetadataTable> {\r\n return this.patch<MetadataTable>(`${this.apiUrl}/metadata-tables/${id}/`, table);\r\n }\r\n\r\n /**\r\n * Delete a metadata table\r\n */\r\n deleteMetadataTable(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/metadata-tables/${id}/`);\r\n }\r\n\r\n /**\r\n * Add a column to the metadata table\r\n */\r\n addColumn(id: number, columnData: any, position?: number): Observable<{ message: string; column: MetadataColumn }> {\r\n return this.post<{ message: string; column: MetadataColumn }>(`${this.apiUrl}/metadata-tables/${id}/add_column/`, {\r\n column_data: columnData,\r\n position\r\n });\r\n }\r\n\r\n /**\r\n * Add a column with automatic reordering\r\n */\r\n addColumnWithAutoReorder(id: number, request: { columnData: any }): Observable<{ message: string; column: MetadataColumn; reordered: boolean; schemaIdsUsed: number[] }> {\r\n return this.post<{ message: string; column: MetadataColumn; reordered: boolean; schemaIdsUsed: number[] }>(`${this.apiUrl}/metadata-tables/${id}/add_column_with_auto_reorder/`, request);\r\n }\r\n\r\n /**\r\n * Remove a column from the metadata table\r\n */\r\n removeColumn(id: number, columnId: number): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-tables/${id}/remove_column/`, {\r\n column_id: columnId\r\n });\r\n }\r\n\r\n /**\r\n * Reorder a column in the metadata table\r\n */\r\n reorderColumn(id: number, columnId: number, newPosition: number): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-tables/${id}/reorder_column/`, {\r\n column_id: columnId,\r\n new_position: newPosition\r\n });\r\n }\r\n\r\n /**\r\n * Normalize column positions\r\n */\r\n normalizeColumnPositions(id: number): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-tables/${id}/normalize_column_positions/`, {});\r\n }\r\n\r\n /**\r\n * Start async reordering of table columns by schema\r\n */\r\n reorderColumnsBySchemaAsync(id: number, schemaIds?: number[]): Observable<{\r\n taskId: string;\r\n message: string;\r\n metadataTableId: number;\r\n schemaIds: number[];\r\n }> {\r\n return this.post<{\r\n taskId: string;\r\n message: string;\r\n metadataTableId: number;\r\n schemaIds: number[];\r\n }>(`${this.apiUrl}/metadata-tables/${id}/reorder_columns_by_schema_async/`, {\r\n schemaIds: schemaIds || []\r\n });\r\n }\r\n\r\n /**\r\n * Get all tables (admin only)\r\n */\r\n getAdminAllTables(): Observable<MetadataTable[]> {\r\n return this.get<MetadataTable[]>(`${this.apiUrl}/metadata-tables/admin_all_tables/`);\r\n }\r\n\r\n /**\r\n * Search metadata tables\r\n */\r\n searchMetadataTables(query: string): Observable<MetadataTableQueryResponse> {\r\n return this.getMetadataTables({ search: query });\r\n }\r\n\r\n /**\r\n * Get metadata tables by owner\r\n */\r\n getMetadataTablesByOwner(ownerId: number): Observable<MetadataTableQueryResponse> {\r\n return this.getMetadataTables({ ownerId: ownerId });\r\n }\r\n\r\n /**\r\n * Get shared metadata tables\r\n */\r\n getSharedMetadataTables(): Observable<MetadataTableQueryResponse> {\r\n return this.getMetadataTables({ showShared: true });\r\n }\r\n\r\n /**\r\n * Combine columns column-wise\r\n */\r\n combineColumnwise(request: { columnIds: number[] }): Observable<{ message: string; combinedColumn: any }> {\r\n return this.post<{ message: string; combinedColumn: any }>(`${this.apiUrl}/metadata-tables/combine_columnwise/`, request);\r\n }\r\n\r\n /**\r\n * Combine columns row-wise\r\n */\r\n combineRowwise(request: { columnIds: number[] }): Observable<{ message: string; combinedColumn: any }> {\r\n return this.post<{ message: string; combinedColumn: any }>(`${this.apiUrl}/metadata-tables/combine_rowwise/`, request);\r\n }\r\n\r\n validateSampleCountChange(id: number, request: SampleCountValidationRequest): Observable<SampleCountValidationResponse> {\r\n return this.post<SampleCountValidationResponse>(`${this.apiUrl}/metadata-tables/${id}/validate_sample_count_change/`, request);\r\n }\r\n\r\n updateSampleCount(id: number, newSampleCount: number, confirmed: boolean = false): Observable<{ message: string; oldSampleCount: number; newSampleCount: number; cleanupPerformed: boolean }> {\r\n return this.post<{ message: string; oldSampleCount: number; newSampleCount: number; cleanupPerformed: boolean }>(`${this.apiUrl}/metadata-tables/${id}/update_sample_count/`, {\r\n newSampleCount,\r\n confirmed\r\n });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataColumn,\r\n MetadataColumnCreateRequest,\r\n MetadataColumnUpdateRequest,\r\n PaginatedResponse,\r\n OntologySuggestion\r\n} from '../models';\r\n\r\nexport interface MetadataColumnQueryParams {\r\n search?: string;\r\n metadataTableId?: number;\r\n type?: string;\r\n name?: string;\r\n hidden?: boolean;\r\n mandatory?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataColumnService extends BaseApiService {\r\n\r\n /**\r\n * Get all metadata columns with optional filtering\r\n */\r\n getMetadataColumns(params?: MetadataColumnQueryParams): Observable<PaginatedResponse<MetadataColumn>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<MetadataColumn>>(`${this.apiUrl}/metadata-columns/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single metadata column by ID\r\n */\r\n getMetadataColumn(id: number): Observable<MetadataColumn> {\r\n return this.get<MetadataColumn>(`${this.apiUrl}/metadata-columns/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new metadata column\r\n */\r\n createMetadataColumn(column: MetadataColumnCreateRequest): Observable<MetadataColumn> {\r\n return this.post<MetadataColumn>(`${this.apiUrl}/metadata-columns/`, column);\r\n }\r\n\r\n /**\r\n * Update an existing metadata column\r\n */\r\n updateMetadataColumn(id: number, column: MetadataColumnUpdateRequest): Observable<MetadataColumn> {\r\n return this.put<MetadataColumn>(`${this.apiUrl}/metadata-columns/${id}/`, column);\r\n }\r\n\r\n /**\r\n * Partially update a metadata column\r\n */\r\n patchMetadataColumn(id: number, column: Partial<MetadataColumnUpdateRequest>): Observable<MetadataColumn> {\r\n return this.patch<MetadataColumn>(`${this.apiUrl}/metadata-columns/${id}/`, column);\r\n }\r\n\r\n /**\r\n * Delete a metadata column\r\n */\r\n deleteMetadataColumn(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/metadata-columns/${id}/`);\r\n }\r\n\r\n /**\r\n * Bulk create metadata columns\r\n */\r\n bulkCreate(request: { columns: MetadataColumnCreateRequest[] }): Observable<MetadataColumn[]> {\r\n return this.post<MetadataColumn[]>(`${this.apiUrl}/metadata-columns/bulk_create/`, request);\r\n }\r\n\r\n /**\r\n * Validate SDRF data\r\n */\r\n validateSdrfData(request: { metadataIds: number[]; sampleNumber?: number }): Observable<{ valid: boolean; errors: any[]; sampleCount: number }> {\r\n return this.post<{ valid: boolean; errors: any[]; sampleCount: number }>(`${this.apiUrl}/metadata-columns/validate_sdrf_data/`, request);\r\n }\r\n\r\n /**\r\n * Get ontology suggestions for a column\r\n */\r\n getOntologySuggestions(params: { \r\n columnId: number; \r\n search?: string; \r\n limit?: number; \r\n searchType?: 'icontains' | 'istartswith' | 'exact';\r\n }): Observable<{\r\n ontologyType: string;\r\n suggestions: OntologySuggestion[];\r\n searchTerm: string;\r\n searchType: string;\r\n limit: number;\r\n count: number;\r\n customFilters: any;\r\n hasMore: boolean;\r\n }> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get(`${this.apiUrl}/metadata-columns/ontology_suggestions/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Validate value against column's ontology\r\n */\r\n validateValue(id: number, request: { value: string }): Observable<{ valid: boolean; value: string; ontologyType: string; suggestions?: any[] }> {\r\n return this.post(`${this.apiUrl}/metadata-columns/${id}/validate_value/`, request);\r\n }\r\n\r\n /**\r\n * Update column value with automatic modifier calculation\r\n */\r\n updateColumnValue(id: number, request: { \r\n value: string; \r\n sampleIndices?: number[]; \r\n valueType?: 'default' | 'sample_specific' | 'replace_all';\r\n }): Observable<{\r\n message: string;\r\n column: MetadataColumn;\r\n changes: any;\r\n valueType: string;\r\n }> {\r\n return this.post(`${this.apiUrl}/metadata-columns/${id}/update_column_value/`, request);\r\n }\r\n\r\n /**\r\n * Apply automatic ontology mapping to a column\r\n */\r\n applyOntologyMapping(id: number): Observable<{ applied: boolean; ontologyType: string; message: string }> {\r\n return this.post(`${this.apiUrl}/metadata-columns/${id}/apply_ontology_mapping/`, {});\r\n }\r\n\r\n /**\r\n * Detect ontology type for given column name and type\r\n */\r\n detectOntologyType(params: { name: string; type: string }): Observable<{ columnName: string; columnType: string; detectedOntologyType: string }> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get(`${this.apiUrl}/metadata-columns/detect_ontology_type/`, { params: httpParams });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n SamplePool,\r\n SamplePoolCreateRequest,\r\n SamplePoolUpdateRequest,\r\n MetadataColumn,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface SamplePoolQueryParams {\r\n search?: string;\r\n metadataTable?: number;\r\n isReference?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SamplePoolService extends BaseApiService {\r\n\r\n /**\r\n * Get all sample pools with optional filtering\r\n */\r\n getSamplePools(params?: SamplePoolQueryParams): Observable<PaginatedResponse<SamplePool>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<SamplePool>>(`${this.apiUrl}/sample-pools/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single sample pool by ID\r\n */\r\n getSamplePool(id: number): Observable<SamplePool> {\r\n return this.get<SamplePool>(`${this.apiUrl}/sample-pools/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new sample pool\r\n */\r\n createSamplePool(pool: SamplePoolCreateRequest): Observable<SamplePool> {\r\n return this.post<SamplePool>(`${this.apiUrl}/sample-pools/`, pool);\r\n }\r\n\r\n /**\r\n * Update an existing sample pool\r\n */\r\n updateSamplePool(id: number, pool: SamplePoolUpdateRequest): Observable<SamplePool> {\r\n return this.put<SamplePool>(`${this.apiUrl}/sample-pools/${id}/`, pool);\r\n }\r\n\r\n /**\r\n * Partially update a sample pool\r\n */\r\n patchSamplePool(id: number, pool: Partial<SamplePoolUpdateRequest>): Observable<SamplePool> {\r\n return this.patch<SamplePool>(`${this.apiUrl}/sample-pools/${id}/`, pool);\r\n }\r\n\r\n /**\r\n * Delete a sample pool\r\n */\r\n deleteSamplePool(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/sample-pools/${id}/`);\r\n }\r\n\r\n /**\r\n * Get metadata columns associated with this pool\r\n */\r\n getMetadataColumns(id: number): Observable<MetadataColumn[]> {\r\n return this.get<MetadataColumn[]>(`${this.apiUrl}/sample-pools/${id}/metadata_columns/`);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataTableTemplate,\r\n MetadataTableTemplateCreateRequest,\r\n MetadataTableTemplateUpdateRequest,\r\n MetadataTableTemplateQueryResponse,\r\n MetadataTable,\r\n MetadataColumn,\r\n Schema,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MetadataTableTemplateQueryParams {\r\n search?: string;\r\n ownerId?: number;\r\n labGroupId?: number;\r\n visibility?: string;\r\n isDefault?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataTableTemplateService extends BaseApiService {\r\n\r\n /**\r\n * Get all metadata table templates with optional filtering\r\n */\r\n getMetadataTableTemplates(params?: MetadataTableTemplateQueryParams): Observable<MetadataTableTemplateQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<MetadataTableTemplateQueryResponse>(`${this.apiUrl}/metadata-table-templates/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single metadata table template by ID\r\n */\r\n getMetadataTableTemplate(id: number): Observable<MetadataTableTemplate> {\r\n return this.get<MetadataTableTemplate>(`${this.apiUrl}/metadata-table-templates/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new metadata table template\r\n */\r\n createMetadataTableTemplate(template: MetadataTableTemplateCreateRequest): Observable<MetadataTableTemplate> {\r\n return this.post<MetadataTableTemplate>(`${this.apiUrl}/metadata-table-templates/`, template);\r\n }\r\n\r\n /**\r\n * Update an existing metadata table template\r\n */\r\n updateMetadataTableTemplate(id: number, template: MetadataTableTemplateUpdateRequest): Observable<MetadataTableTemplate> {\r\n return this.put<MetadataTableTemplate>(`${this.apiUrl}/metadata-table-templates/${id}/`, template);\r\n }\r\n\r\n /**\r\n * Partially update a metadata table template\r\n */\r\n patchMetadataTableTemplate(id: number, template: Partial<MetadataTableTemplateUpdateRequest>): Observable<MetadataTableTemplate> {\r\n return this.patch<MetadataTableTemplate>(`${this.apiUrl}/metadata-table-templates/${id}/`, template);\r\n }\r\n\r\n /**\r\n * Delete a metadata table template\r\n */\r\n deleteMetadataTableTemplate(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/metadata-table-templates/${id}/`);\r\n }\r\n\r\n /**\r\n * Add a column to the template\r\n */\r\n addColumn(id: number, request: { column_data: any; position?: number }): Observable<{ message: string; column: MetadataColumn }> {\r\n return this.post<{ message: string; column: MetadataColumn }>(`${this.apiUrl}/metadata-table-templates/${id}/add_column/`, request);\r\n }\r\n\r\n /**\r\n * Remove a column from the template\r\n */\r\n removeColumn(id: number, request: { column_id: number }): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-table-templates/${id}/remove_column/`, request);\r\n }\r\n\r\n /**\r\n * Reorder a column within the template\r\n */\r\n reorderColumn(id: number, request: { column_id: number; new_position: number }): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-table-templates/${id}/reorder_column/`, request);\r\n }\r\n\r\n /**\r\n * Add a column with automatic reordering\r\n */\r\n addColumnWithAutoReorder(id: number, request: { columnData: any }): Observable<{ message: string; column: MetadataColumn; reordered: boolean; schemaIdsUsed: number[] }> {\r\n return this.post<{ message: string; column: MetadataColumn; reordered: boolean; schemaIdsUsed: number[] }>(`${this.apiUrl}/metadata-table-templates/${id}/add_column_with_auto_reorder/`, request);\r\n }\r\n\r\n /**\r\n * Duplicate a column within the template\r\n */\r\n duplicateColumn(id: number, request: { column_id: number }): Observable<{ message: string; duplicated_column: MetadataColumn }> {\r\n return this.post<{ message: string; duplicated_column: MetadataColumn }>(`${this.apiUrl}/metadata-table-templates/${id}/duplicate_column/`, request);\r\n }\r\n\r\n /**\r\n * Normalize column positions\r\n */\r\n normalizeColumnPositions(id: number): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-table-templates/${id}/normalize_column_positions/`, {});\r\n }\r\n\r\n /**\r\n * Start async reordering of template columns by schema\r\n */\r\n reorderColumnsBySchemaAsync(id: number, schemaIds?: number[]): Observable<{\r\n taskId: string;\r\n message: string;\r\n templateId: number;\r\n schemaIds: number[];\r\n }> {\r\n return this.post<{\r\n taskId: string;\r\n message: string;\r\n templateId: number;\r\n schemaIds: number[];\r\n }>(`${this.apiUrl}/metadata-table-templates/${id}/reorder_columns_by_schema_async/`, {\r\n schemaIds: schemaIds || []\r\n });\r\n }\r\n\r\n /**\r\n * Apply this template to a metadata table\r\n */\r\n applyToMetadataTable(id: number, request: { metadata_table_id: number }): Observable<{ message: string; applied_columns: MetadataColumn[] }> {\r\n return this.post<{ message: string; applied_columns: MetadataColumn[] }>(`${this.apiUrl}/metadata-table-templates/${id}/apply_to_metadata_table/`, request);\r\n }\r\n\r\n /**\r\n * Update field mask for template\r\n */\r\n updateFieldMask(id: number, request: { field_mask: any }): Observable<{ message: string; field_mask: any }> {\r\n return this.post<{ message: string; field_mask: any }>(`${this.apiUrl}/metadata-table-templates/${id}/update_field_mask/`, request);\r\n }\r\n\r\n /**\r\n * Get field mask for template\r\n */\r\n getFieldMask(id: number): Observable<{ field_mask: any }> {\r\n return this.get<{ field_mask: any }>(`${this.apiUrl}/metadata-table-templates/${id}/get_field_mask/`);\r\n }\r\n\r\n /**\r\n * Get columns with field masks\r\n */\r\n getColumnsWithFieldMasks(id: number): Observable<{ columns: any[] }> {\r\n return this.get<{ columns: any[] }>(`${this.apiUrl}/metadata-table-templates/${id}/get_columns_with_field_masks/`);\r\n }\r\n\r\n /**\r\n * Get available schemas for creating templates\r\n */\r\n getAvailableSchemas(): Observable<Schema[]> {\r\n return this.get<Schema[]>(`${this.apiUrl}/metadata-table-templates/available_schemas/`);\r\n }\r\n\r\n /**\r\n * Create a new template from schema definitions\r\n */\r\n createFromSchema(request: { schemaIds: number[]; name: string; description?: string }): Observable<{ message: string; template: MetadataTableTemplate }> {\r\n return this.post<{ message: string; template: MetadataTableTemplate }>(`${this.apiUrl}/metadata-table-templates/create_from_schema/`, request);\r\n }\r\n\r\n /**\r\n * Create a new metadata table from an existing template\r\n */\r\n createTableFromTemplate(request: { templateId: number; name: string; description?: string; sampleCount: number }): Observable<MetadataTable> {\r\n return this.post<MetadataTable>(`${this.apiUrl}/metadata-table-templates/create_table_from_template/`, request);\r\n }\r\n\r\n /**\r\n * Create a new metadata table directly from schema definitions\r\n */\r\n createTableFromSchemas(request: { schemaIds: number[]; name: string; description?: string; sampleCount: number }): Observable<MetadataTable> {\r\n return this.post<MetadataTable>(`${this.apiUrl}/metadata-table-templates/create_table_from_schemas/`, request);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n FavouriteMetadataOption,\r\n FavouriteMetadataOptionCreateRequest,\r\n FavouriteMetadataOptionUpdateRequest,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface FavouriteMetadataOptionQueryParams {\r\n search?: string;\r\n name?: string;\r\n type?: string;\r\n userId?: number;\r\n labGroupId?: number;\r\n isGlobal?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FavouriteMetadataOptionService extends BaseApiService {\r\n\r\n /**\r\n * Get all favourite metadata options with optional filtering\r\n */\r\n getFavouriteMetadataOptions(params?: FavouriteMetadataOptionQueryParams): Observable<PaginatedResponse<FavouriteMetadataOption>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<FavouriteMetadataOption>>(`${this.apiUrl}/favourite-options/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single favourite metadata option by ID\r\n */\r\n getFavouriteMetadataOption(id: number): Observable<FavouriteMetadataOption> {\r\n return this.get<FavouriteMetadataOption>(`${this.apiUrl}/favourite-options/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new favourite metadata option\r\n */\r\n createFavouriteMetadataOption(option: FavouriteMetadataOptionCreateRequest): Observable<FavouriteMetadataOption> {\r\n return this.post<FavouriteMetadataOption>(`${this.apiUrl}/favourite-options/`, option);\r\n }\r\n\r\n /**\r\n * Update an existing favourite metadata option\r\n */\r\n updateFavouriteMetadataOption(id: number, option: FavouriteMetadataOptionUpdateRequest): Observable<FavouriteMetadataOption> {\r\n return this.put<FavouriteMetadataOption>(`${this.apiUrl}/favourite-options/${id}/`, option);\r\n }\r\n\r\n /**\r\n * Partially update a favourite metadata option\r\n */\r\n patchFavouriteMetadataOption(id: number, option: Partial<FavouriteMetadataOptionUpdateRequest>): Observable<FavouriteMetadataOption> {\r\n return this.patch<FavouriteMetadataOption>(`${this.apiUrl}/favourite-options/${id}/`, option);\r\n }\r\n\r\n /**\r\n * Delete a favourite metadata option\r\n */\r\n deleteFavouriteMetadataOption(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/favourite-options/${id}/`);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataColumnTemplate,\r\n MetadataColumnTemplateCreateRequest,\r\n MetadataColumnTemplateUpdateRequest,\r\n MetadataColumn,\r\n OntologySuggestion,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MetadataColumnTemplateQueryParams {\r\n search?: string;\r\n type?: string;\r\n ontologyType?: string;\r\n isRequired?: boolean;\r\n isPublic?: boolean;\r\n ownerId?: number;\r\n labGroupId?: number;\r\n visibility?: string;\r\n isActive?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataColumnTemplateService extends BaseApiService {\r\n\r\n /**\r\n * Get all metadata column templates with optional filtering\r\n */\r\n getMetadataColumnTemplates(params?: MetadataColumnTemplateQueryParams): Observable<PaginatedResponse<MetadataColumnTemplate>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<MetadataColumnTemplate>>(`${this.apiUrl}/column-templates/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single metadata column template by ID\r\n */\r\n getMetadataColumnTemplate(id: number): Observable<MetadataColumnTemplate> {\r\n return this.get<MetadataColumnTemplate>(`${this.apiUrl}/column-templates/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new metadata column template\r\n */\r\n createMetadataColumnTemplate(template: MetadataColumnTemplateCreateRequest): Observable<MetadataColumnTemplate> {\r\n return this.post<MetadataColumnTemplate>(`${this.apiUrl}/column-templates/`, template);\r\n }\r\n\r\n /**\r\n * Update an existing metadata column template\r\n */\r\n updateMetadataColumnTemplate(id: number, template: MetadataColumnTemplateUpdateRequest): Observable<MetadataColumnTemplate> {\r\n return this.put<MetadataColumnTemplate>(`${this.apiUrl}/column-templates/${id}/`, template);\r\n }\r\n\r\n /**\r\n * Partially update a metadata column template\r\n */\r\n patchMetadataColumnTemplate(id: number, template: Partial<MetadataColumnTemplateUpdateRequest>): Observable<MetadataColumnTemplate> {\r\n return this.patch<MetadataColumnTemplate>(`${this.apiUrl}/column-templates/${id}/`, template);\r\n }\r\n\r\n /**\r\n * Delete a metadata column template\r\n */\r\n deleteMetadataColumnTemplate(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/column-templates/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a MetadataColumn from this template\r\n */\r\n createMetadataColumn(id: number, request: { metadataTableId: number; columnPosition?: number }): Observable<{ message: string; column: MetadataColumn }> {\r\n return this.post<{ message: string; column: MetadataColumn }>(`${this.apiUrl}/column-templates/${id}/create_metadata_column/`, request);\r\n }\r\n\r\n /**\r\n * Share this template with another user\r\n */\r\n shareTemplate(id: number, request: { userId: number; canEdit?: boolean }): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/column-templates/${id}/share_template/`, request);\r\n }\r\n\r\n /**\r\n * Remove template sharing for a user\r\n */\r\n unshareTemplate(id: number, request: { userId: number }): Observable<{ message: string }> {\r\n return this.delete<{ message: string }>(`${this.apiUrl}/column-templates/${id}/unshare_template/`, { body: request });\r\n }\r\n\r\n /**\r\n * Get templates created by the current user\r\n */\r\n getMyTemplates(): Observable<MetadataColumnTemplate[]> {\r\n return this.get<MetadataColumnTemplate[]>(`${this.apiUrl}/column-templates/my_templates/`);\r\n }\r\n\r\n /**\r\n * Get most popular public templates\r\n */\r\n getPopularTemplates(): Observable<MetadataColumnTemplate[]> {\r\n return this.get<MetadataColumnTemplate[]>(`${this.apiUrl}/column-templates/popular_templates/`);\r\n }\r\n\r\n /**\r\n * Get ontology suggestions for this column template\r\n */\r\n getOntologySuggestions(params?: { \r\n search?: string; \r\n templateId?: number;\r\n limit?: number;\r\n searchType?: 'icontains' | 'istartswith' | 'exact';\r\n }): Observable<{\r\n ontologyType: string;\r\n suggestions: OntologySuggestion[];\r\n searchTerm: string;\r\n searchType: string;\r\n limit: number;\r\n count: number;\r\n customFilters: any;\r\n hasMore: boolean;\r\n }> {\r\n const httpParams = this.buildHttpParams({\r\n template_id: params?.templateId,\r\n search: params?.search,\r\n limit: params?.limit,\r\n search_type: params?.searchType\r\n });\r\n return this.get<{\r\n ontologyType: string;\r\n suggestions: OntologySuggestion[];\r\n searchTerm: string;\r\n searchType: string;\r\n limit: number;\r\n count: number;\r\n customFilters: any;\r\n hasMore: boolean;\r\n }>(`${this.apiUrl}/column-templates/ontology_suggestions/`, { params: httpParams });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataColumnTemplateShare,\r\n MetadataColumnTemplateShareCreateRequest,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MetadataColumnTemplateShareQueryParams {\r\n template?: number;\r\n sharedWith?: number;\r\n sharedBy?: number;\r\n canEdit?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataColumnTemplateShareService extends BaseApiService {\r\n\r\n /**\r\n * Get all template shares with optional filtering\r\n */\r\n getMetadataColumnTemplateShares(params?: MetadataColumnTemplateShareQueryParams): Observable<PaginatedResponse<MetadataColumnTemplateShare>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<MetadataColumnTemplateShare>>(`${this.apiUrl}/template-shares/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single template share by ID\r\n */\r\n getMetadataColumnTemplateShare(id: number): Observable<MetadataColumnTemplateShare> {\r\n return this.get<MetadataColumnTemplateShare>(`${this.apiUrl}/template-shares/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new template share\r\n */\r\n createMetadataColumnTemplateShare(share: MetadataColumnTemplateShareCreateRequest): Observable<MetadataColumnTemplateShare> {\r\n return this.post<MetadataColumnTemplateShare>(`${this.apiUrl}/template-shares/`, share);\r\n }\r\n\r\n /**\r\n * Update an existing template share\r\n */\r\n updateMetadataColumnTemplateShare(id: number, share: { canEdit?: boolean }): Observable<MetadataColumnTemplateShare> {\r\n return this.put<MetadataColumnTemplateShare>(`${this.apiUrl}/template-shares/${id}/`, share);\r\n }\r\n\r\n /**\r\n * Delete a template share\r\n */\r\n deleteMetadataColumnTemplateShare(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/template-shares/${id}/`);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataManagementService extends BaseApiService {\r\n\r\n /**\r\n * Export metadata as Excel template (matching original CUPCAKE)\r\n */\r\n exportExcelTemplate(request: any): Observable<Blob> {\r\n return this.post(`${this.apiUrl}/metadata-management/export_excel_template/`, request, { responseType: 'blob' });\r\n }\r\n\r\n /**\r\n * Import metadata from SDRF file with intelligent column matching and schema organization\r\n */\r\n importSdrfFile(file: File, additionalData?: any): Observable<any> {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n if (additionalData) {\r\n Object.keys(additionalData).forEach(key => {\r\n formData.append(key, additionalData[key]);\r\n });\r\n }\r\n return this.post<any>(`${this.apiUrl}/metadata-management/import_sdrf_file/`, formData);\r\n }\r\n\r\n /**\r\n * Import metadata from Excel file (matching original CUPCAKE)\r\n */\r\n importExcelFile(file: File, additionalData?: any): Observable<any> {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n if (additionalData) {\r\n Object.keys(additionalData).forEach(key => {\r\n formData.append(key, additionalData[key]);\r\n });\r\n }\r\n return this.post<any>(`${this.apiUrl}/metadata-management/import_excel_file/`, formData);\r\n }\r\n\r\n /**\r\n * Collect metadata from metadata table\r\n */\r\n collectMetadata(params: any): Observable<any> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<any>(`${this.apiUrl}/metadata-management/collect_metadata/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Export metadata as SDRF file (matching original CUPCAKE)\r\n */\r\n exportSdrfFile(request: any): Observable<Blob> {\r\n return this.post(`${this.apiUrl}/metadata-management/export_sdrf_file/`, request, { responseType: 'blob' });\r\n }\r\n}","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WebSocketService as BaseWebSocketService, WebSocketMessage, AuthService, WEBSOCKET_ENDPOINT } from '@noatgnu/cupcake-core';\n\nexport type { WebSocketMessage };\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Websocket extends BaseWebSocketService {\n\n constructor(authService: AuthService) {\n super(authService);\n this.endpoint = 'ccv/notifications';\n this.config.endpoint = 'ccv/notifications';\n this.config.url = this.getWebSocketUrl();\n }\n\n\n getMetadataTableUpdates(): Observable<WebSocketMessage> {\n return this.filterMessages('metadata_table.update');\n }\n\n getLabGroupUpdates(): Observable<WebSocketMessage> {\n return this.filterMessages('lab_group.update');\n }\n}\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { WebSocketService as BaseWebSocketService, WebSocketMessage, AuthService } from '@noatgnu/cupcake-core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AdminWebSocketService extends BaseWebSocketService {\r\n\r\n constructor(authService: AuthService) {\r\n super(authService);\r\n this.endpoint = 'ccv/admin';\r\n this.config.endpoint = 'ccv/admin';\r\n this.config.url = this.getWebSocketUrl();\r\n }\r\n\r\n getAdminNotifications(): Observable<WebSocketMessage> {\r\n return this.filterMessages('admin.notification');\r\n }\r\n\r\n override getSystemNotifications(): Observable<WebSocketMessage> {\r\n return this.filterMessages('system.notification');\r\n }\r\n}","import { Injectable, signal, computed, inject } from '@angular/core';\r\nimport { NotificationService as BaseNotificationService, NotificationItem, ToastService } from '@noatgnu/cupcake-core';\r\nimport { Websocket, WebSocketMessage } from './websocket';\r\nimport { AdminWebSocketService } from './admin-websocket';\r\n\r\nexport enum NotificationType {\r\n SYSTEM = 'system',\r\n METADATA_TABLE = 'metadata_table',\r\n LAB_GROUP = 'lab_group',\r\n FILE_UPLOAD = 'file_upload',\r\n DATA_PROCESSING = 'data_processing',\r\n ASYNC_TASK = 'async_task',\r\n USER = 'user'\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService extends BaseNotificationService {\r\n private isConnected = signal(false);\r\n private isAdminConnected = signal(false);\r\n\r\n readonly isWebSocketConnected = computed(() => this.isConnected());\r\n readonly isAdminWebSocketConnected = computed(() => this.isAdminConnected());\r\n\r\n constructor(\r\n private websocketService: Websocket,\r\n private adminWebSocketService: AdminWebSocketService,\r\n toastService: ToastService\r\n ) {\r\n super(toastService);\r\n this.initializeWebSocket();\r\n }\r\n\r\n private initializeWebSocket(): void {\r\n this.websocketService.isConnected$.subscribe(connected => {\r\n this.isConnected.set(connected);\r\n if (connected) {\r\n console.log('CCV WebSocket connected - notifications active');\r\n }\r\n });\r\n\r\n this.adminWebSocketService.isConnected$.subscribe(connected => {\r\n this.isAdminConnected.set(connected);\r\n if (connected) {\r\n console.log('CCV Admin WebSocket connected - admin notifications active');\r\n }\r\n });\r\n\r\n this.websocketService.messages$.subscribe(message => {\r\n this.handleWebSocketMessage(message);\r\n });\r\n\r\n this.adminWebSocketService.messages$.subscribe(message => {\r\n this.handleAdminWebSocketMessage(message);\r\n });\r\n\r\n this.setupNotificationHandlers();\r\n }\r\n\r\n private setupNotificationHandlers(): void {\r\n this.websocketService.getSystemNotifications().subscribe(message => {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.SYSTEM);\r\n this.addNotification(notification);\r\n\r\n if (message['level'] === 'error') {\r\n this.toastService.error(message.message || message['title']);\r\n } else if (message['level'] === 'warning') {\r\n this.toastService.warning(message.message || message['title']);\r\n } else if (message['level'] === 'success') {\r\n this.toastService.success(message.message || message['title']);\r\n } else {\r\n this.toastService.info(message.message || message['title']);\r\n }\r\n });\r\n\r\n this.adminWebSocketService.getAdminNotifications().subscribe(message => {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.SYSTEM);\r\n this.addNotification(notification);\r\n\r\n const level = message['level'] || 'info';\r\n const title = message['title'] || 'Admin Notification';\r\n const messageText = message.message || '';\r\n\r\n if (level === 'error') {\r\n this.toastService.error(`${title}: ${messageText}`, 10000);\r\n } else if (level === 'warning') {\r\n this.toastService.warning(`${title}: ${messageText}`, 8000);\r\n } else if (level === 'success') {\r\n this.toastService.success(`${title}: ${messageText}`, 6000);\r\n } else {\r\n this.toastService.info(`${title}: ${messageText}`, 5000);\r\n }\r\n });\r\n\r\n this.websocketService.getMetadataTableUpdates().subscribe(message => {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.METADATA_TABLE);\r\n this.addNotification(notification);\r\n });\r\n\r\n this.websocketService.getLabGroupUpdates().subscribe(message => {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.LAB_GROUP);\r\n this.addNotification(notification);\r\n });\r\n\r\n this.websocketService.filterMessages('async_task.update').subscribe(message => {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.ASYNC_TASK);\r\n this.addNotification(notification);\r\n });\r\n\r\n this.websocketService.filterMessages('notification_message').subscribe(message => {\r\n const notificationData = message['message'] || message;\r\n\r\n let notificationType = 'info';\r\n let title = 'Notification';\r\n let messageText = '';\r\n\r\n if (typeof notificationData === 'object' && notificationData !== null) {\r\n notificationType = (notificationData as any)['type'] || 'info';\r\n title = (notificationData as any)['title'] || 'Notification';\r\n messageText = (notificationData as any)['message'] || '';\r\n } else if (typeof notificationData === 'string') {\r\n messageText = notificationData;\r\n }\r\n\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.SYSTEM);\r\n this.addNotification(notification);\r\n\r\n if (notificationType === 'error') {\r\n this.toastService.error(`${title}: ${messageText}`, 8000);\r\n } else if (notificationType === 'warning') {\r\n this.toastService.warning(`${title}: ${messageText}`, 6000);\r\n } else if (notificationType === 'success') {\r\n this.toastService.success(`${title}: ${messageText}`, 5000);\r\n } else {\r\n this.toastService.info(`${title}: ${messageText}`, 4000);\r\n }\r\n });\r\n }\r\n\r\n private handleWebSocketMessage(message: WebSocketMessage): void {\r\n if (message.type === 'connection.established') {\r\n console.log('WebSocket connection established:', message);\r\n return;\r\n }\r\n\r\n if (message.type.includes('file.upload')) {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.FILE_UPLOAD);\r\n this.addNotification(notification);\r\n\r\n if (message.type === 'file.upload.completed') {\r\n this.toastService.success(`File upload completed: ${message['filename']}`);\r\n } else if (message.type === 'file.upload.failed') {\r\n this.toastService.error(`File upload failed: ${message['filename']}`);\r\n }\r\n } else if (message.type.includes('data.processing')) {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.DATA_PROCESSING);\r\n this.addNotification(notification);\r\n\r\n if (message.type === 'data.processing.completed') {\r\n this.toastService.success('Data processing completed');\r\n } else if (message.type === 'data.processing.failed') {\r\n this.toastService.error('Data processing failed');\r\n }\r\n }\r\n }\r\n\r\n private createNotificationFromWebSocket(message: WebSocketMessage, type: NotificationType): NotificationItem {\r\n const id = this.generateNotificationId();\r\n const timestamp = message.timestamp ? new Date(message.timestamp) : new Date();\r\n\r\n let title = '';\r\n let level: 'info' | 'success' | 'warning' | 'error' = 'info';\r\n\r\n switch (type) {\r\n case NotificationType.SYSTEM:\r\n title = message['title'] || 'System Notification';\r\n level = (message['level'] as any) || 'info';\r\n break;\r\n case NotificationType.METADATA_TABLE:\r\n title = 'Metadata Table Update';\r\n level = message['action'] === 'deleted' ? 'warning' : 'info';\r\n break;\r\n case NotificationType.LAB_GROUP:\r\n title = 'Lab Group Update';\r\n level = 'info';\r\n break;\r\n case NotificationType.FILE_UPLOAD:\r\n title = 'File Upload';\r\n level = message.type.includes('failed') ? 'error' : 'success';\r\n break;\r\n case NotificationType.DATA_PROCESSING:\r\n title = 'Data Processing';\r\n level = message.type.includes('failed') ? 'error' : 'success';\r\n break;\r\n case NotificationType.ASYNC_TASK:\r\n title = this.getAsyncTaskTitle(message);\r\n level = this.getAsyncTaskLevel(message);\r\n break;\r\n default:\r\n title = 'Notification';\r\n }\r\n\r\n return {\r\n id,\r\n type,\r\n title,\r\n message: message.message || '',\r\n timestamp,\r\n read: false,\r\n level,\r\n autoClose: level === 'success' || level === 'info',\r\n data: message\r\n };\r\n }\r\n\r\n private getAsyncTaskTitle(message: WebSocketMessage): string {\r\n const taskType = message['task_type'];\r\n const status = message['status'];\r\n\r\n let operation = 'Task';\r\n switch (taskType) {\r\n case 'EXPORT_EXCEL':\r\n operation = 'Excel Export';\r\n break;\r\n case 'EXPORT_SDRF':\r\n operation = 'SDRF Export';\r\n break;\r\n case 'IMPORT_SDRF':\r\n operation = 'SDRF Import';\r\n break;\r\n case 'IMPORT_EXCEL':\r\n operation = 'Excel Import';\r\n break;\r\n case 'EXPORT_MULTIPLE_SDRF':\r\n operation = 'Bulk SDRF Export';\r\n break;\r\n case 'EXPORT_MULTIPLE_EXCEL':\r\n operation = 'Bulk Excel Export';\r\n break;\r\n case 'VALIDATE_TABLE':\r\n operation = 'Table Validation';\r\n break;\r\n case 'REORDER_TABLE_COLUMNS':\r\n operation = 'Column Reordering';\r\n break;\r\n case 'REORDER_TEMPLATE_COLUMNS':\r\n operation = 'Template Column Reordering';\r\n break;\r\n }\r\n\r\n switch (status) {\r\n case 'QUEUED':\r\n return `${operation} Queued`;\r\n case 'STARTED':\r\n return `${operation} In Progress`;\r\n case 'SUCCESS':\r\n return `${operation} Completed`;\r\n case 'FAILURE':\r\n return `${operation} Failed`;\r\n case 'CANCELLED':\r\n return `${operation} Cancelled`;\r\n default:\r\n return `${operation} Update`;\r\n }\r\n }\r\n\r\n private getAsyncTaskLevel(message: WebSocketMessage): 'info' | 'success' | 'warning' | 'error' {\r\n const status = message['status'];\r\n\r\n switch (status) {\r\n case 'SUCCESS':\r\n return 'success';\r\n case 'FAILURE':\r\n return 'error';\r\n case 'CANCELLED':\r\n return 'warning';\r\n case 'STARTED':\r\n case 'QUEUED':\r\n default:\r\n return 'info';\r\n }\r\n }\r\n\r\n private handleAdminWebSocketMessage(message: WebSocketMessage): void {\r\n if (message.type === 'admin.notification') {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.SYSTEM);\r\n this.addNotification(notification);\r\n }\r\n }\r\n\r\n connect(): void {\r\n this.websocketService.connect();\r\n }\r\n\r\n connectAdmin(): void {\r\n this.adminWebSocketService.connect();\r\n }\r\n\r\n disconnect(): void {\r\n this.websocketService.disconnect();\r\n }\r\n\r\n disconnectAdmin(): void {\r\n this.adminWebSocketService.disconnect();\r\n }\r\n\r\n subscribeToMetadataTable(tableId: number): void {\r\n this.websocketService.subscribe('metadata_table_updates', { table_id: tableId });\r\n }\r\n\r\n createVanillaNotification(\r\n type: NotificationType,\r\n title: string,\r\n message: string,\r\n level: 'info' | 'success' | 'warning' | 'error' = 'info',\r\n autoClose = true\r\n ): void {\r\n this.createLocalNotification(type, title, message, level, autoClose);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n OntologySuggestion\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class OntologySearchService extends BaseApiService {\r\n\r\n /**\r\n * Get ontology suggestions across all sources for SDRF validation\r\n */\r\n suggest(params?: { query?: string; sources?: string[] }): Observable<OntologySuggestion[]> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<OntologySuggestion[]>(`${this.apiUrl}/ontology-search/suggest/`, { params: httpParams });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n Schema,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface SchemaQueryParams {\r\n search?: string;\r\n category?: string;\r\n isActive?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SchemaService extends BaseApiService {\r\n\r\n /**\r\n * Get all schemas with optional filtering\r\n */\r\n getSchemas(params?: SchemaQueryParams): Observable<PaginatedResponse<Schema>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<Schema>>(`${this.apiUrl}/schemas/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single schema by ID\r\n */\r\n getSchema(id: number): Observable<Schema> {\r\n return this.get<Schema>(`${this.apiUrl}/schemas/${id}/`);\r\n }\r\n\r\n /**\r\n * Get list of available schemas for creating templates\r\n */\r\n getAvailableSchemas(): Observable<Schema[]> {\r\n return this.get<Schema[]>(`${this.apiUrl}/schemas/available/`);\r\n }\r\n\r\n /**\r\n * Sync builtin schemas from sdrf-pipelines package (admin only)\r\n */\r\n syncBuiltin(): Observable<{ message: string; synced_count: number }> {\r\n return this.post<{ message: string; synced_count: number }>(`${this.apiUrl}/schemas/sync_builtin/`, {});\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SDRFDefaultsService extends BaseApiService {\r\n\r\n /**\r\n * Get all available SDRF columns with their default values\r\n */\r\n getColumns(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/columns/`);\r\n }\r\n\r\n /**\r\n * Get default values for a specific column\r\n */\r\n getColumnValues(params: { column: string }): Observable<any[]> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/column_values/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Search for columns containing the query string\r\n */\r\n searchColumns(params: { query: string }): Observable<any[]> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/search/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get options for structured fields (key-value pairs)\r\n */\r\n getStructuredOptions(params: { field: string }): Observable<any[]> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/structured_options/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get all label options (TMT, SILAC, label-free)\r\n */\r\n getLabels(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/labels/`);\r\n }\r\n\r\n /**\r\n * Get protein modification options (fixed and variable)\r\n */\r\n getModifications(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/modifications/`);\r\n }\r\n\r\n /**\r\n * Get list of common instrument models\r\n */\r\n getInstruments(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/instruments/`);\r\n }\r\n\r\n /**\r\n * Get cleavage agent options\r\n */\r\n getCleavageAgents(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/cleavage_agents/`);\r\n }\r\n\r\n /**\r\n * Get all compound fields that require special handling\r\n */\r\n getCompoundFields(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/compound_fields/`);\r\n }\r\n\r\n /**\r\n * Get schema for a specific compound field\r\n */\r\n getCompoundSchema(params: { field: string }): Observable<any> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<any>(`${this.apiUrl}/sdrf-defaults/compound_schema/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Validate a compound field value against its schema\r\n */\r\n validateCompound(request: { field: string; value: any }): Observable<{ valid: boolean; errors?: string[] }> {\r\n return this.post<{ valid: boolean; errors?: string[] }>(`${this.apiUrl}/sdrf-defaults/validate_compound/`, request);\r\n }\r\n\r\n /**\r\n * Get column name suggestions based on partial input\r\n */\r\n getSuggestions(params: { query: string }): Observable<string[]> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<string[]>(`${this.apiUrl}/sdrf-defaults/suggestions/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get quick access to commonly used value categories\r\n */\r\n getQuickValues(): Observable<any> {\r\n return this.get<any>(`${this.apiUrl}/sdrf-defaults/quick_values/`);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n AsyncTaskStatus,\r\n AsyncTaskQueryParams,\r\n AsyncTaskCreateResponse,\r\n DownloadUrlResponse,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AsyncTaskService extends BaseApiService {\r\n\r\n /**\r\n * Get all async tasks for the current user with optional filtering\r\n */\r\n getAsyncTasks(params?: AsyncTaskQueryParams): Observable<PaginatedResponse<AsyncTaskStatus>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<AsyncTaskStatus>>(`${this.apiUrl}/async-tasks/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a specific async task by ID\r\n */\r\n getAsyncTask(id: string): Observable<AsyncTaskStatus> {\r\n return this.get<AsyncTaskStatus>(`${this.apiUrl}/async-tasks/${id}/`);\r\n }\r\n\r\n /**\r\n * Cancel a queued or running task\r\n */\r\n cancelTask(id: string): Observable<{ message: string }> {\r\n return this.delete<{ message: string }>(`${this.apiUrl}/async-tasks/${id}/cancel/`);\r\n }\r\n\r\n /**\r\n * Generate a signed download URL for task result file\r\n */\r\n getDownloadUrl(id: string): Observable<DownloadUrlResponse> {\r\n return this.get<DownloadUrlResponse>(`${this.apiUrl}/async-tasks/${id}/download_url/`);\r\n }\r\n\r\n /**\r\n * Direct download endpoint (returns blob for file download)\r\n */\r\n downloadTaskFile(id: string, token: string): Observable<Blob> {\r\n const httpParams = this.buildHttpParams({ token });\r\n return this.get(`${this.apiUrl}/async-tasks/${id}/download/`, { params: httpParams, responseType: 'blob' });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataExportRequest,\r\n BulkExportRequest,\r\n BulkExcelExportRequest,\r\n AsyncTaskCreateResponse\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AsyncExportService extends BaseApiService {\r\n\r\n excelTemplate(request: MetadataExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-export/excel_template/`, request);\r\n }\r\n\r\n sdrfFile(request: MetadataExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-export/sdrf_file/`, request);\r\n }\r\n\r\n multipleSdrfFiles(request: BulkExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-export/multiple_sdrf_files/`, request);\r\n }\r\n\r\n multipleExcelTemplates(request: BulkExcelExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-export/multiple_excel_templates/`, request);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable, from } from 'rxjs';\r\nimport { switchMap } from 'rxjs/operators';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\nimport jsSHA from 'jssha';\r\n\r\nimport {\r\n ChunkedUploadStatus,\r\n ChunkedUploadRequest,\r\n ChunkedUploadResponse,\r\n ChunkedUploadCompletionRequest,\r\n ChunkedUploadCompletionResponse\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ChunkedUploadService extends BaseApiService {\r\n\r\n\r\n /**\r\n * Initialize or continue a chunked upload\r\n */\r\n uploadChunk(\r\n request: ChunkedUploadRequest,\r\n uploadId?: string,\r\n offset?: number,\r\n totalSize?: number\r\n ): Observable<ChunkedUploadResponse> {\r\n const formData = new FormData();\r\n formData.append('file', request.file);\r\n\r\n if (request.filename) {\r\n formData.append('filename', request.filename);\r\n }\r\n if (request.uploadSessionId) {\r\n formData.append('upload_session_id', request.uploadSessionId);\r\n }\r\n if (request.metadataTableId) {\r\n formData.append('metadata_table_id', request.metadataTableId.toString());\r\n }\r\n if (request.createPools !== undefined) {\r\n formData.append('create_pools', request.createPools.toString());\r\n }\r\n if (request.replaceExisting !== undefined) {\r\n formData.append('replace_existing', request.replaceExisting.toString());\r\n }\r\n\r\n const url = uploadId\r\n ? `${this.apiUrl}/chunked-upload/${uploadId}/`\r\n : `${this.apiUrl}/chunked-upload/`;\r\n\r\n const httpOptions: any = {};\r\n if (offset !== undefined && totalSize !== undefined) {\r\n const chunkEnd = offset + request.file.size - 1;\r\n httpOptions.headers = {\r\n 'Content-Range': `bytes ${offset}-${chunkEnd}/${totalSize}`\r\n };\r\n }\r\n\r\n if (uploadId) {\r\n return this.put<ChunkedUploadResponse>(url, formData, httpOptions);\r\n } else {\r\n return this.post<ChunkedUploadResponse>(url, formData, httpOptions);\r\n }\r\n }\r\n\r\n /**\r\n * Get chunked upload status\r\n */\r\n getUploadStatus(uploadId: string): Observable<ChunkedUploadStatus> {\r\n return this.get<ChunkedUploadStatus>(`${this.apiUrl}/chunked-upload/${uploadId}/`);\r\n }\r\n\r\n /**\r\n * Complete the chunked upload and process the file\r\n */\r\n completeUpload(uploadId: string, request?: ChunkedUploadCompletionRequest): Observable<ChunkedUploadCompletionResponse> {\r\n const formData = new FormData();\r\n\r\n if (request?.sha256) {\r\n formData.append('sha256', request.sha256);\r\n }\r\n if (request?.metadataTableId) {\r\n formData.append('metadata_table_id', request.metadataTableId.toString());\r\n }\r\n if (request?.createPools !== undefined) {\r\n formData.append('create_pools', request.createPools.toString());\r\n }\r\n if (request?.replaceExisting !== undefined) {\r\n formData.append('replace_existing', request.replaceExisting.toString());\r\n }\r\n\r\n return this.post<ChunkedUploadCompletionResponse>(`${this.apiUrl}/chunked-upload/${uploadId}/`, formData);\r\n }\r\n\r\n /**\r\n * Complete the chunked upload by uploading the entire file at once\r\n */\r\n completeUploadWithFile(request: ChunkedUploadRequest): Observable<ChunkedUploadCompletionResponse> {\r\n const hasher = new jsSHA('SHA-256', 'ARRAYBUFFER');\r\n const arrayBufferPromise = request.file.arrayBuffer();\r\n\r\n return from(arrayBufferPromise).pipe(\r\n switchMap((arrayBuffer) => {\r\n hasher.update(arrayBuffer);\r\n const hash = hasher.getHash('HEX');\r\n\r\n const formData = new FormData();\r\n formData.append('file', request.file);\r\n if (request.filename) {\r\n formData.append('filename', request.filename);\r\n }\r\n if (request.uploadSessionId) {\r\n formData.append('upload_session_id', request.uploadSessionId);\r\n }\r\n if (request.metadataTableId) {\r\n formData.append('metadata_table_id', request.metadataTableId.toString());\r\n }\r\n if (request.createPools !== undefined) {\r\n formData.append('create_pools', request.createPools.toString());\r\n }\r\n if (request.replaceExisting !== undefined) {\r\n formData.append('replace_existing', request.replaceExisting.toString());\r\n }\r\n formData.append('sha256', hash);\r\n\r\n return this.post<ChunkedUploadCompletionResponse>(`${this.apiUrl}/chunked-upload/`, formData);\r\n })\r\n );\r\n\r\n }\r\n\r\n /**\r\n * Delete/cancel a chunked upload\r\n */\r\n cancelUpload(uploadId: string): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/chunked-upload/${uploadId}/`);\r\n }\r\n\r\n /**\r\n * Helper method to upload a file in chunks with progress tracking\r\n */\r\n uploadFileInChunks(\r\n file: File,\r\n chunkSize: number = 1024 * 1024, // 1MB chunks by default\r\n options?: {\r\n metadataTableId?: number;\r\n createPools?: boolean;\r\n replaceExisting?: boolean;\r\n uploadSessionId?: string;\r\n onProgress?: (progress: number) => void;\r\n }\r\n ): Observable<ChunkedUploadCompletionResponse> {\r\n return new Observable(subscriber => {\r\n let uploadId: string | undefined;\r\n let offset = 0;\r\n const totalSize = file.size;\r\n const sha256 = new jsSHA('SHA-256', 'ARRAYBUFFER');\r\n if (totalSize <= chunkSize) {\r\n this.completeUploadWithFile({\r\n file: file,\r\n filename: file.name,\r\n uploadSessionId: options?.uploadSessionId,\r\n metadataTableId: options?.metadataTableId,\r\n createPools: options?.createPools,\r\n replaceExisting: options?.replaceExisting\r\n }).subscribe({\r\n next: (result) => {\r\n subscriber.next(result);\r\n subscriber.complete();\r\n }\r\n })\r\n return;\r\n }\r\n const uploadNextChunk = () => {\r\n if (offset >= totalSize) {\r\n if (uploadId) {\r\n const calculatedHash = sha256.getHash('HEX');\r\n this.completeUpload(uploadId, {\r\n sha256: calculatedHash,\r\n metadataTableId: options?.metadataTableId,\r\n createPools: options?.createPools,\r\n replaceExisting: options?.replaceExisting\r\n }).subscribe({\r\n next: (result) => {\r\n subscriber.next(result);\r\n subscriber.complete();\r\n },\r\n error: (error) => subscriber.error(error)\r\n });\r\n } else {\r\n subscriber.error(new Error('Upload failed: No upload ID'));\r\n }\r\n return;\r\n }\r\n\r\n const end = Math.min(offset + chunkSize, totalSize);\r\n const chunk = file.slice(offset, end);\r\n const chunkFile = new File([chunk], file.name, { type: file.type });\r\n\r\n chunk.arrayBuffer().then(arrayBuffer => {\r\n sha256.update(arrayBuffer);\r\n\r\n this.uploadChunk({\r\n file: chunkFile,\r\n filename: file.name,\r\n uploadSessionId: options?.uploadSessionId,\r\n metadataTableId: options?.metadataTableId,\r\n createPools: options?.createPools,\r\n replaceExisting: options?.replaceExisting\r\n }, uploadId, offset, totalSize).subscribe({\r\n next: (response) => {\r\n uploadId = response.id;\r\n offset = response.offset;\r\n\r\n const progress = (offset / totalSize) * 100;\r\n if (options?.onProgress) {\r\n options.onProgress(progress);\r\n }\r\n\r\n uploadNextChunk();\r\n },\r\n error: (error) => subscriber.error(error)\r\n });\r\n }).catch(error => subscriber.error(error));\r\n };\r\n\r\n uploadNextChunk();\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, from } from 'rxjs';\r\nimport { switchMap, map } from 'rxjs/operators';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\nimport { ChunkedUploadService } from './chunked-upload';\r\n\r\nimport {\r\n MetadataImportRequest,\r\n AsyncTaskCreateResponse\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AsyncImportService extends BaseApiService {\r\n\r\n constructor(private chunkedUploadService: ChunkedUploadService) {\r\n super();\r\n }\r\n\r\n sdrfFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse> {\r\n // Always use chunked upload - it handles everything (SHA256, chunking, processing)\r\n return this.chunkedUploadService.uploadFileInChunks(\r\n request.file,\r\n 1024 * 1024, // 1MB chunks\r\n {\r\n metadataTableId: request.metadataTableId,\r\n createPools: true,\r\n replaceExisting: request.replaceExisting,\r\n onProgress: (progress) => {\r\n console.log(`SDRF upload progress: ${Math.round(progress)}%`);\r\n }\r\n }\r\n ).pipe(\r\n map(result => ({\r\n taskId: 'chunked-completed', // Processing is done immediately\r\n message: result.message || 'SDRF file processed successfully',\r\n result: result\r\n } as AsyncTaskCreateResponse))\r\n );\r\n }\r\n\r\n excelFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse> {\r\n // Always use chunked upload - it handles everything (SHA256, chunking, processing)\r\n return this.chunkedUploadService.uploadFileInChunks(\r\n request.file,\r\n 1024 * 1024, // 1MB chunks\r\n {\r\n metadataTableId: request.metadataTableId,\r\n createPools: true,\r\n replaceExisting: request.replaceExisting,\r\n onProgress: (progress) => {\r\n console.log(`Excel upload progress: ${Math.round(progress)}%`);\r\n }\r\n }\r\n ).pipe(\r\n map(result => ({\r\n taskId: 'chunked-completed', // Processing is done immediately\r\n message: result.message || 'Excel file processed successfully',\r\n result: result\r\n } as AsyncTaskCreateResponse))\r\n );\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataValidationRequest,\r\n AsyncTaskCreateResponse\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AsyncValidationService extends BaseApiService {\r\n\r\n metadataTable(request: MetadataValidationRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-validation/metadata_table/`, request);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable, from, throwError } from 'rxjs';\r\nimport { switchMap, map, tap } from 'rxjs/operators';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\nimport { ChunkedUploadService } from './chunked-upload';\r\nimport { AsyncTaskCreateResponse, ChunkedImportRequest } from '../models';\r\n\r\nexport interface ChunkedFileImportRequest {\r\n file: File;\r\n metadataTableId: number;\r\n replaceExisting?: boolean;\r\n validateOntologies?: boolean;\r\n createPools?: boolean;\r\n}\r\n\r\nexport interface ChunkedImportProgress {\r\n uploadProgress: number;\r\n phase: 'uploading' | 'processing' | 'completed' | 'failed';\r\n taskId?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ChunkedImportService extends BaseApiService {\r\n\r\n constructor(private chunkedUploadService: ChunkedUploadService) {\r\n super();\r\n }\r\n\r\n /**\r\n * Import SDRF file using chunked upload for better performance with large files\r\n */\r\n importSdrfFileChunked(request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.validateFileType(request.file, ['.txt', '.tsv', '.sdrf']).pipe(\r\n switchMap(() => this.uploadFileChunked(request))\r\n );\r\n }\r\n\r\n /**\r\n * Import Excel file using chunked upload for better performance with large files\r\n */\r\n importExcelFileChunked(request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.validateFileType(request.file, ['.xlsx', '.xls']).pipe(\r\n switchMap(() => this.uploadFileChunked(request))\r\n );\r\n }\r\n\r\n /**\r\n * Generic chunked import that auto-detects file type\r\n */\r\n importFileChunked(request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse> {\r\n const fileExtension = this.getFileExtension(request.file.name);\r\n\r\n if (['.txt', '.tsv', '.sdrf'].includes(fileExtension)) {\r\n return this.importSdrfFileChunked(request);\r\n } else if (['.xlsx', '.xls'].includes(fileExtension)) {\r\n return this.importExcelFileChunked(request);\r\n } else {\r\n return throwError(() => new Error(`Unsupported file type: ${fileExtension}`));\r\n }\r\n }\r\n\r\n /**\r\n * Upload file using chunked upload with metadata processing\r\n */\r\n private uploadFileChunked(request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.chunkedUploadService.uploadFileInChunks(\r\n request.file,\r\n 1024 * 1024, // 1MB chunks\r\n {\r\n metadataTableId: request.metadataTableId,\r\n createPools: request.createPools,\r\n replaceExisting: request.replaceExisting,\r\n onProgress: (progress: number) => {\r\n // Upload progress callback - can be used for UI updates\r\n console.log(`Upload progress: ${Math.round(progress)}%`);\r\n }\r\n }\r\n ).pipe(\r\n switchMap((uploadResult) => {\r\n // Once upload is complete, trigger async processing\r\n return this.triggerAsyncImport(uploadResult, request);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Trigger async import processing after chunked upload completion\r\n * This uses the existing async-import endpoints but with chunked upload completion\r\n */\r\n private triggerAsyncImport(uploadResult: any, request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse> {\r\n // The chunked upload has completed, now we need to trigger async processing\r\n // We'll use the file from the completed upload result\r\n\r\n const fileExtension = this.getFileExtension(request.file?.name || '');\r\n\r\n if (['.txt', '.tsv', '.sdrf'].includes(fileExtension)) {\r\n // For SDRF files, we need to read the file content as text\r\n return from(request.file.text()).pipe(\r\n switchMap(fileContent => {\r\n const formData = new FormData();\r\n formData.append('metadata_table_id', request.metadataTableId.toString());\r\n formData.append('file_content', fileContent);\r\n formData.append('filename', request.file.name);\r\n\r\n if (request.replaceExisting !== undefined) {\r\n formData.append('replace_existing', request.replaceExisting.toString());\r\n }\r\n if (request.validateOntologies !== undefined) {\r\n formData.append('validate_ontologies', request.validateOntologies.toString());\r\n }\r\n\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-import/sdrf_file/`, formData);\r\n })\r\n );\r\n } else {\r\n // For Excel files, we can pass the file directly\r\n const formData = new FormData();\r\n formData.append('metadata_table_id', request.metadataTableId.toString());\r\n formData.append('file', request.file);\r\n\r\n if (request.replaceExisting !== undefined) {\r\n formData.append('replace_existing', request.replaceExisting.toString());\r\n }\r\n if (request.validateOntologies !== undefined) {\r\n formData.append('validate_ontologies', request.validateOntologies.toString());\r\n }\r\n\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-import/excel_file/`, formData);\r\n }\r\n }\r\n\r\n /**\r\n * Validate file type\r\n */\r\n private validateFileType(file: File, allowedExtensions: string[]): Observable<File> {\r\n const fileExtension = this.getFileExtension(file.name);\r\n\r\n if (!allowedExtensions.includes(fileExtension)) {\r\n return throwError(() => new Error(\r\n `Invalid file type. Expected: ${allowedExtensions.join(', ')}, got: ${fileExtension}`\r\n ));\r\n }\r\n\r\n return from(Promise.resolve(file));\r\n }\r\n\r\n /**\r\n * Get file extension from filename\r\n */\r\n private getFileExtension(filename: string): string {\r\n const lastDot = filename.lastIndexOf('.');\r\n return lastDot !== -1 ? filename.substring(lastDot).toLowerCase() : '';\r\n }\r\n\r\n /**\r\n * Create progress observable for UI updates\r\n */\r\n createProgressObservable(\r\n request: ChunkedFileImportRequest,\r\n onProgress?: (progress: ChunkedImportProgress) => void\r\n ): Observable<AsyncTaskCreateResponse> {\r\n return new Observable(observer => {\r\n let currentPhase: ChunkedImportProgress['phase'] = 'uploading';\r\n\r\n // Report initial state\r\n if (onProgress) {\r\n onProgress({ uploadProgress: 0, phase: currentPhase });\r\n }\r\n\r\n // Start chunked upload with progress tracking\r\n this.chunkedUploadService.uploadFileInChunks(\r\n request.file,\r\n 1024 * 1024, // 1MB chunks\r\n {\r\n metadataTableId: request.metadataTableId,\r\n createPools: request.createPools,\r\n replaceExisting: request.replaceExisting,\r\n onProgress: (progress: number) => {\r\n if (onProgress && currentPhase === 'uploading') {\r\n onProgress({\r\n uploadProgress: progress,\r\n phase: currentPhase\r\n });\r\n }\r\n }\r\n }\r\n ).pipe(\r\n tap(() => {\r\n // Upload completed, now processing\r\n currentPhase = 'processing';\r\n if (onProgress) {\r\n onProgress({ uploadProgress: 100, phase: currentPhase });\r\n }\r\n }),\r\n switchMap((uploadResult) => {\r\n return this.triggerAsyncImport(uploadResult, request);\r\n })\r\n ).subscribe({\r\n next: (result) => {\r\n currentPhase = 'completed';\r\n if (onProgress) {\r\n onProgress({\r\n uploadProgress: 100,\r\n phase: currentPhase,\r\n taskId: result.taskId\r\n });\r\n }\r\n observer.next(result);\r\n observer.complete();\r\n },\r\n error: (error) => {\r\n currentPhase = 'failed';\r\n if (onProgress) {\r\n onProgress({ uploadProgress: 0, phase: currentPhase });\r\n }\r\n observer.error(error);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Queue chunked file import task using completed chunked upload\r\n * This uses the new backend endpoint that processes already uploaded chunks\r\n */\r\n processChunkedUpload(request: ChunkedImportRequest): Observable<AsyncTaskCreateResponse> {\r\n const payload = {\r\n metadataTableId: request.metadataTableId,\r\n chunkedUploadId: request.chunkedUploadId,\r\n replaceExisting: request.replaceExisting,\r\n validateOntologies: request.validateOntologies,\r\n createPools: request.createPools\r\n };\r\n\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-import/chunked_file/`, payload);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\n\nexport interface AgeFormat {\n years?: number;\n months?: number;\n days?: number;\n isRange?: boolean;\n rangeStart?: AgeFormat;\n rangeEnd?: AgeFormat;\n}\n\nexport interface ModificationParameters {\n NT?: string; // Name of Term (supports typeahead)\n AC?: string; // Accession\n CF?: string; // Chemical Formula\n MT?: string; // Modification Type (Fixed/Variable/Annotated)\n PP?: string; // Position in Polypeptide\n TA?: string; // Target Amino acid\n MM?: string; // Monoisotopic Mass\n TS?: string; // Target Site regex\n}\n\nexport interface CleavageAgentDetails {\n NT?: string; // Name of Term (supports typeahead)\n AC?: string; // Accession\n CS?: string; // Cleavage Site regex\n}\n\nexport interface SpikedCompound {\n SP?: string; // spike name\n CT?: string; // compound type\n QY?: string; // quantity\n PS?: string; // purity specification\n AC?: string; // accession\n CN?: string; // compound name\n CV?: string; // controlled vocabulary\n CS?: string; // chemical structure\n CF?: string; // chemical formula\n}\n\nexport interface PooledSample {\n value: 'not pooled' | 'pooled' | string; // string for SN=sample1,sample2 format\n sourceNames?: string[]; // parsed source names when SN= format is used\n}\n\nexport interface SyntheticPeptide {\n value: 'synthetic' | 'not synthetic';\n}\n\nexport interface ValidationResult {\n isValid: boolean;\n errors: string[];\n warnings?: string[];\n}\n\nexport type SyntaxType = 'age' | 'modification' | 'cleavage' | 'spiked_compound' | 'pooled_sample' | 'synthetic_peptide';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SdrfSyntaxService {\n\n private readonly SPECIAL_COLUMN_PATTERNS = {\n age: /^characteristics\\[age\\]$/i,\n modification: /^comment\\[modification parameters\\]$/i,\n cleavage: /^comment\\[cleavage agent details\\]$/i,\n spiked_compound: /^characteristics\\[spiked compound\\]$/i,\n pooled_sample: /^characteristics\\[pooled sample\\]$/i,\n synthetic_peptide: /^characteristics\\[synthetic peptide\\]$/i\n };\n\n private readonly MODIFICATION_KEYS = ['NT', 'AC', 'CF', 'MT', 'PP', 'TA', 'MM', 'TS'];\n private readonly CLEAVAGE_KEYS = ['NT', 'AC', 'CS'];\n private readonly SPIKED_COMPOUND_KEYS = ['SP', 'CT', 'QY', 'PS', 'AC', 'CN', 'CV', 'CS', 'CF'];\n private readonly POOLED_SAMPLE_VALUES = ['not pooled', 'pooled'];\n private readonly SYNTHETIC_PEPTIDE_VALUES = ['synthetic', 'not synthetic'];\n\n /**\n * Detects if a column requires special SDRF syntax handling\n */\n detectSpecialSyntax(columnName: string, columnType: string): SyntaxType | null {\n const name = columnName.toLowerCase();\n const type = columnType.toLowerCase();\n\n if (this.SPECIAL_COLUMN_PATTERNS.age.test(name) || this.SPECIAL_COLUMN_PATTERNS.age.test(type)) {\n return 'age';\n }\n \n if (this.SPECIAL_COLUMN_PATTERNS.modification.test(name) || this.SPECIAL_COLUMN_PATTERNS.modification.test(type)) {\n return 'modification';\n }\n \n if (this.SPECIAL_COLUMN_PATTERNS.cleavage.test(name) || this.SPECIAL_COLUMN_PATTERNS.cleavage.test(type)) {\n return 'cleavage';\n }\n \n if (this.SPECIAL_COLUMN_PATTERNS.spiked_compound.test(name) || this.SPECIAL_COLUMN_PATTERNS.spiked_compound.test(type)) {\n return 'spiked_compound';\n }\n\n return null;\n }\n\n /**\n * Parses a value based on the syntax type\n */\n parseValue(syntaxType: SyntaxType, value: string): any {\n if (!value || value.trim() === '') {\n return null;\n }\n\n try {\n switch (syntaxType) {\n case 'age':\n return this.parseAgeFormat(value);\n case 'modification':\n return this.parseKeyValuePairs(value, this.MODIFICATION_KEYS);\n case 'cleavage':\n return this.parseKeyValuePairs(value, this.CLEAVAGE_KEYS);\n case 'spiked_compound':\n return this.parseKeyValuePairs(value, this.SPIKED_COMPOUND_KEYS);\n default:\n throw new Error(`Unknown syntax type: ${syntaxType}`);\n }\n } catch (error) {\n console.error(`Error parsing ${syntaxType} value:`, error);\n return null;\n }\n }\n\n /**\n * Formats parsed data back to string format\n */\n formatValue(syntaxType: SyntaxType, data: any): string {\n if (!data) {\n return '';\n }\n\n try {\n switch (syntaxType) {\n case 'age':\n return this.formatAgeFormat(data as AgeFormat);\n case 'modification':\n case 'cleavage':\n case 'spiked_compound':\n return this.formatKeyValuePairs(data);\n default:\n throw new Error(`Unknown syntax type: ${syntaxType}`);\n }\n } catch (error) {\n console.error(`Error formatting ${syntaxType} value:`, error);\n return '';\n }\n }\n\n /**\n * Validates parsed data\n */\n validateValue(syntaxType: SyntaxType, data: any): ValidationResult {\n const result: ValidationResult = {\n isValid: true,\n errors: [],\n warnings: []\n };\n\n if (!data) {\n result.isValid = false;\n result.errors.push('Value is required');\n return result;\n }\n\n try {\n switch (syntaxType) {\n case 'age':\n return this.validateAgeFormat(data as AgeFormat);\n case 'modification':\n return this.validateModificationParameters(data as ModificationParameters);\n case 'cleavage':\n return this.validateCleavageAgentDetails(data as CleavageAgentDetails);\n case 'spiked_compound':\n return this.validateSpikedCompound(data as SpikedCompound);\n default:\n result.isValid = false;\n result.errors.push(`Unknown syntax type: ${syntaxType}`);\n }\n } catch (error) {\n result.isValid = false;\n result.errors.push(`Validation error: ${error}`);\n }\n\n return result;\n }\n\n\n private parseAgeFormat(value: string): AgeFormat {\n const trimmed = value.trim();\n \n if (trimmed.includes('-')) {\n const [startStr, endStr] = trimmed.split('-').map(s => s.trim());\n return {\n isRange: true,\n rangeStart: this.parseSingleAge(startStr),\n rangeEnd: this.parseSingleAge(endStr)\n };\n }\n\n return this.parseSingleAge(trimmed);\n }\n\n private parseSingleAge(ageStr: string): AgeFormat {\n const age: AgeFormat = {};\n \n const yearMatch = ageStr.match(/(\\d+)Y/);\n const monthMatch = ageStr.match(/(\\d+)M/);\n const dayMatch = ageStr.match(/(\\d+)D/);\n\n if (yearMatch) {\n age.years = parseInt(yearMatch[1], 10);\n }\n if (monthMatch) {\n age.months = parseInt(monthMatch[1], 10);\n }\n if (dayMatch) {\n age.days = parseInt(dayMatch[1], 10);\n }\n\n return age;\n }\n\n private formatAgeFormat(age: AgeFormat): string {\n if (age.isRange && age.rangeStart && age.rangeEnd) {\n return `${this.formatSingleAge(age.rangeStart)}-${this.formatSingleAge(age.rangeEnd)}`;\n }\n\n return this.formatSingleAge(age);\n }\n\n private formatSingleAge(age: AgeFormat): string {\n let result = '';\n if (age.years) result += `${age.years}Y`;\n if (age.months) result += `${age.months}M`;\n if (age.days) result += `${age.days}D`;\n return result;\n }\n\n private parseKeyValuePairs(value: string, validKeys: string[]): any {\n const result: any = {};\n \n const pairs = value.split(';').map(pair => pair.trim()).filter(pair => pair);\n \n for (const pair of pairs) {\n const [key, ...valueParts] = pair.split('=');\n const keyTrimmed = key?.trim();\n const valueTrimmed = valueParts.join('=').trim();\n\n if (keyTrimmed && validKeys.includes(keyTrimmed)) {\n result[keyTrimmed] = valueTrimmed;\n }\n }\n\n return result;\n }\n\n private formatKeyValuePairs(data: any): string {\n const pairs: string[] = [];\n \n for (const [key, value] of Object.entries(data)) {\n if (value !== null && value !== undefined && value !== '') {\n pairs.push(`${key}=${value}`);\n }\n }\n\n return pairs.join(';');\n }\n\n private validateAgeFormat(age: AgeFormat): ValidationResult {\n const result: ValidationResult = { isValid: true, errors: [], warnings: [] };\n\n if (age.isRange) {\n if (!age.rangeStart || !age.rangeEnd) {\n result.isValid = false;\n result.errors.push('Range format requires both start and end values');\n return result;\n }\n\n const startValidation = this.validateSingleAge(age.rangeStart);\n const endValidation = this.validateSingleAge(age.rangeEnd);\n\n if (!startValidation.isValid) {\n result.isValid = false;\n result.errors.push(...startValidation.errors.map(e => `Range start: ${e}`));\n }\n\n if (!endValidation.isValid) {\n result.isValid = false;\n result.errors.push(...endValidation.errors.map(e => `Range end: ${e}`));\n }\n } else {\n const singleValidation = this.validateSingleAge(age);\n if (!singleValidation.isValid) {\n result.isValid = false;\n result.errors.push(...singleValidation.errors);\n }\n }\n\n return result;\n }\n\n private validateSingleAge(age: AgeFormat): ValidationResult {\n const result: ValidationResult = { isValid: true, errors: [] };\n\n if (!age.years && !age.months && !age.days) {\n result.isValid = false;\n result.errors.push('At least one age component (years, months, or days) is required');\n }\n\n if (age.years !== undefined && (age.years < 0 || age.years > 200)) {\n result.isValid = false;\n result.errors.push('Years must be between 0 and 200');\n }\n\n if (age.months !== undefined && (age.months < 0 || age.months > 11)) {\n result.isValid = false;\n result.errors.push('Months must be between 0 and 11');\n }\n\n if (age.days !== undefined && (age.days < 0 || age.days > 31)) {\n result.isValid = false;\n result.errors.push('Days must be between 0 and 31');\n }\n\n return result;\n }\n\n private validateModificationParameters(params: ModificationParameters): ValidationResult {\n const result: ValidationResult = { isValid: true, errors: [], warnings: [] };\n\n const hasAnyParam = Object.values(params).some(value => value !== undefined && value !== '');\n if (!hasAnyParam) {\n result.isValid = false;\n result.errors.push('At least one modification parameter is required');\n }\n\n if (params.PP && !/^\\d+$/.test(params.PP)) {\n result.errors.push('PP (protein position) must be a number');\n result.isValid = false;\n }\n\n if (params.MM && !/^\\d+(\\.\\d+)?$/.test(params.MM)) {\n result.errors.push('MM (monoisotopic mass) must be a valid number');\n result.isValid = false;\n }\n\n return result;\n }\n\n private validateCleavageAgentDetails(details: CleavageAgentDetails): ValidationResult {\n const result: ValidationResult = { isValid: true, errors: [] };\n\n const hasAnyDetail = Object.values(details).some(value => value !== undefined && value !== '');\n if (!hasAnyDetail) {\n result.isValid = false;\n result.errors.push('At least one cleavage agent detail is required');\n }\n\n return result;\n }\n\n private validateSpikedCompound(compound: SpikedCompound): ValidationResult {\n const result: ValidationResult = { isValid: true, errors: [], warnings: [] };\n\n const hasAnyParam = Object.values(compound).some(value => value !== undefined && value !== '');\n if (!hasAnyParam) {\n result.isValid = false;\n result.errors.push('At least one spiked compound parameter is required');\n }\n\n if (compound.QY && !/^\\d+(\\.\\d+)?\\s*(mg|g|kg|μg|ng|pg|M|mM|μM|nM|pM)?$/i.test(compound.QY)) {\n result.warnings?.push('QY (quantity) format may not be standard - consider using standard units');\n }\n\n return result;\n }\n\n getPooledSampleValues(): string[] {\n return [...this.POOLED_SAMPLE_VALUES];\n }\n\n getSyntheticPeptideValues(): string[] {\n return [...this.SYNTHETIC_PEPTIDE_VALUES];\n }\n}\n","import { Injectable } from '@angular/core';\r\nimport { Observable, NEVER } from 'rxjs';\r\n\r\nexport interface ElectronAPI {\r\n platform: string;\r\n isElectron: boolean;\r\n getAppVersion(): Promise<string>;\r\n getElectronVersion(): Promise<string>;\r\n minimize(): void;\r\n maximize(): void;\r\n close(): void;\r\n isMaximized(): Promise<boolean>;\r\n showOpenDialog(options?: any): Promise<any>;\r\n showSaveDialog(options?: any): Promise<any>;\r\n showMessageBox(options: any): Promise<any>;\r\n downloadFile(url: string, filename?: string): Promise<string>;\r\n getBackendPort(): Promise<number>;\r\n isBackendReady(): Promise<boolean>;\r\n onBackendStatusChange(callback: (status: any) => void): () => void;\r\n onWindowStateChange(callback: (state: 'maximized' | 'unmaximized') => void): () => void;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n electronAPI?: ElectronAPI;\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ElectronService {\r\n private electronAPI: ElectronAPI | null = null;\r\n\r\n constructor() {\r\n this.electronAPI = window.electronAPI || null;\r\n }\r\n\r\n get isElectron(): boolean {\r\n return this.electronAPI?.isElectron ?? false;\r\n }\r\n\r\n get platform(): string {\r\n return this.electronAPI?.platform ?? 'web';\r\n }\r\n\r\n async getAppVersion(): Promise<string> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.getAppVersion();\r\n }\r\n\r\n async getElectronVersion(): Promise<string> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.getElectronVersion();\r\n }\r\n\r\n minimize(): void {\r\n if (!this.electronAPI) return;\r\n this.electronAPI.minimize();\r\n }\r\n\r\n maximize(): void {\r\n if (!this.electronAPI) return;\r\n this.electronAPI.maximize();\r\n }\r\n\r\n close(): void {\r\n if (!this.electronAPI) return;\r\n this.electronAPI.close();\r\n }\r\n\r\n async isMaximized(): Promise<boolean> {\r\n if (!this.electronAPI) return false;\r\n return this.electronAPI.isMaximized();\r\n }\r\n\r\n async showOpenDialog(options?: any): Promise<any> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.showOpenDialog(options);\r\n }\r\n\r\n async showSaveDialog(options?: any): Promise<any> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.showSaveDialog(options);\r\n }\r\n\r\n async showMessageBox(options: any): Promise<any> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.showMessageBox(options);\r\n }\r\n\r\n async downloadFile(url: string, filename?: string): Promise<string> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.downloadFile(url, filename);\r\n }\r\n\r\n async getBackendPort(): Promise<number> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.getBackendPort();\r\n }\r\n\r\n async isBackendReady(): Promise<boolean> {\r\n if (!this.electronAPI) return false;\r\n return this.electronAPI.isBackendReady();\r\n }\r\n\r\n onBackendStatusChange(): Observable<any> {\r\n if (!this.electronAPI) return NEVER;\r\n\r\n return new Observable(observer => {\r\n const unsubscribe = this.electronAPI!.onBackendStatusChange((status: any) => {\r\n observer.next(status);\r\n });\r\n\r\n return () => unsubscribe();\r\n });\r\n }\r\n\r\n onWindowStateChange(): Observable<'maximized' | 'unmaximized'> {\r\n if (!this.electronAPI) return NEVER;\r\n\r\n return new Observable(observer => {\r\n const unsubscribe = this.electronAPI!.onWindowStateChange((state: 'maximized' | 'unmaximized') => {\r\n observer.next(state);\r\n });\r\n\r\n return () => unsubscribe();\r\n });\r\n }\r\n}","import { Component, Input, Output, EventEmitter, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { SdrfSyntaxService, AgeFormat } from '../../services/sdrf-syntax';\n\n@Component({\n selector: 'ccv-sdrf-age-input',\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: './sdrf-age-input.html',\n styleUrl: './sdrf-age-input.scss'\n})\nexport class SdrfAgeInput implements OnInit {\n @Input() value: string = '';\n @Output() valueChange = new EventEmitter<string>();\n\n private fb = inject(FormBuilder);\n private sdrfSyntax = inject(SdrfSyntaxService);\n\n ageForm!: FormGroup;\n isRange = false;\n\n ngOnInit() {\n this.ageForm = this.fb.group({\n isRange: [false],\n years: [null, [Validators.min(0), Validators.max(200)]],\n months: [null, [Validators.min(0), Validators.max(11)]],\n days: [null, [Validators.min(0), Validators.max(31)]],\n weeks: [null, [Validators.min(0), Validators.max(520)]],\n rangeStartYears: [null, [Validators.min(0), Validators.max(200)]],\n rangeStartMonths: [null, [Validators.min(0), Validators.max(11)]],\n rangeEndYears: [null, [Validators.min(0), Validators.max(200)]],\n rangeEndMonths: [null, [Validators.min(0), Validators.max(11)]]\n });\n\n // Parse initial value\n if (this.value) {\n this.parseAndSetValue(this.value);\n }\n\n // Subscribe to form changes\n this.ageForm.valueChanges.subscribe(() => {\n this.updateValue();\n });\n\n // Subscribe to range toggle\n this.ageForm.get('isRange')?.valueChanges.subscribe((isRange) => {\n this.isRange = isRange;\n this.updateValue();\n });\n }\n\n private parseAndSetValue(value: string) {\n try {\n const parsed = this.sdrfSyntax.parseValue('age', value) as AgeFormat;\n if (parsed.isRange && parsed.rangeStart && parsed.rangeEnd) {\n this.ageForm.patchValue({\n isRange: true,\n rangeStartYears: parsed.rangeStart.years,\n rangeStartMonths: parsed.rangeStart.months,\n rangeEndYears: parsed.rangeEnd.years,\n rangeEndMonths: parsed.rangeEnd.months\n });\n this.isRange = true;\n } else {\n this.ageForm.patchValue({\n isRange: false,\n years: parsed.years,\n months: parsed.months,\n days: parsed.days\n });\n }\n } catch (error) {\n console.warn('Could not parse age value:', value);\n }\n }\n\n private updateValue() {\n const formValue = this.ageForm.value;\n \n if (formValue.isRange) {\n if (formValue.rangeStartYears || formValue.rangeEndYears) {\n const ageData: AgeFormat = {\n isRange: true,\n rangeStart: {\n years: formValue.rangeStartYears || 0,\n months: formValue.rangeStartMonths || 0\n },\n rangeEnd: {\n years: formValue.rangeEndYears || 0,\n months: formValue.rangeEndMonths || 0\n }\n };\n \n const formatted = this.sdrfSyntax.formatValue('age', ageData);\n this.valueChange.emit(formatted);\n }\n } else {\n if (formValue.years || formValue.months || formValue.days || formValue.weeks) {\n const ageData: AgeFormat = {\n years: formValue.years || undefined,\n months: formValue.months || undefined,\n days: formValue.days || undefined\n };\n \n // Handle weeks separately (convert to special format)\n if (formValue.weeks && !formValue.years && !formValue.months && !formValue.days) {\n const formatted = `${formValue.weeks}W`;\n this.valueChange.emit(formatted);\n } else {\n const formatted = this.sdrfSyntax.formatValue('age', ageData);\n this.valueChange.emit(formatted);\n }\n }\n }\n }\n}\n","<form [formGroup]=\"ageForm\" class=\"age-input-form\">\n <!-- Range Toggle -->\n <div class=\"form-check mb-3\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"isRange\" formControlName=\"isRange\">\n <label class=\"form-check-label\" for=\"isRange\">\n Age Range\n </label>\n </div>\n\n <!-- Single Age Input -->\n @if (!isRange) {\n <div class=\"row g-2 mb-2\">\n <div class=\"col-sm-3\">\n <label for=\"years\" class=\"form-label\">Years</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"years\" \n formControlName=\"years\" placeholder=\"0\" min=\"0\" max=\"200\">\n </div>\n <div class=\"col-sm-3\">\n <label for=\"months\" class=\"form-label\">Months</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"months\" \n formControlName=\"months\" placeholder=\"0\" min=\"0\" max=\"11\">\n </div>\n <div class=\"col-sm-3\">\n <label for=\"days\" class=\"form-label\">Days</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"days\" \n formControlName=\"days\" placeholder=\"0\" min=\"0\" max=\"31\">\n </div>\n <div class=\"col-sm-3\">\n <label for=\"weeks\" class=\"form-label\">Weeks <small class=\"text-muted\">(alternative)</small></label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"weeks\" \n formControlName=\"weeks\" placeholder=\"0\" min=\"0\" max=\"520\">\n </div>\n </div>\n <div class=\"form-text\">\n Use weeks for very young subjects (e.g., \"8W\" for 8 weeks). Otherwise use years/months/days.\n </div>\n }\n\n <!-- Age Range Input -->\n @if (isRange) {\n <div class=\"row g-2 mb-2\">\n <div class=\"col-sm-6\">\n <label class=\"form-label fw-semibold\">Start Age</label>\n <div class=\"row g-1\">\n <div class=\"col-6\">\n <label for=\"rangeStartYears\" class=\"form-label small\">Years</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"rangeStartYears\" \n formControlName=\"rangeStartYears\" placeholder=\"0\" min=\"0\" max=\"200\">\n </div>\n <div class=\"col-6\">\n <label for=\"rangeStartMonths\" class=\"form-label small\">Months</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"rangeStartMonths\" \n formControlName=\"rangeStartMonths\" placeholder=\"0\" min=\"0\" max=\"11\">\n </div>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <label class=\"form-label fw-semibold\">End Age</label>\n <div class=\"row g-1\">\n <div class=\"col-6\">\n <label for=\"rangeEndYears\" class=\"form-label small\">Years</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"rangeEndYears\" \n formControlName=\"rangeEndYears\" placeholder=\"0\" min=\"0\" max=\"200\">\n </div>\n <div class=\"col-6\">\n <label for=\"rangeEndMonths\" class=\"form-label small\">Months</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"rangeEndMonths\" \n formControlName=\"rangeEndMonths\" placeholder=\"0\" min=\"0\" max=\"11\">\n </div>\n </div>\n </div>\n </div>\n <div class=\"form-text\">\n Age range format: \"25Y-30Y\" or \"2Y6M-3Y\"\n </div>\n }\n\n <!-- Validation Messages -->\n @if (ageForm.invalid && ageForm.touched) {\n <div class=\"alert alert-warning alert-sm mt-2\">\n <small>\n <i class=\"bi bi-exclamation-triangle me-1\"></i>\n Please enter valid age values (0-200 years, 0-11 months, 0-31 days)\n </small>\n </div>\n }\n</form>\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbTypeahead, NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { Observable, OperatorFunction, debounceTime, distinctUntilChanged, filter, map, switchMap, of, catchError } from 'rxjs';\nimport { SdrfSyntaxService, ModificationParameters } from '../../services/sdrf-syntax';\nimport {\n OntologySuggestion,\n UnimodFullData,\n UnimodSpecification,\n isUnimodFullData,\n OntologyUtils,\n OntologyType\n} from '../../models';\nimport {\n MetadataColumnService,\n MetadataColumnTemplateService\n} from '../../services';\n\n@Component({\n selector: 'ccv-sdrf-modification-input',\n imports: [CommonModule, ReactiveFormsModule, NgbTypeahead, NgbModule],\n templateUrl: './sdrf-modification-input.html',\n styleUrl: './sdrf-modification-input.scss'\n})\nexport class SdrfModificationInput implements OnInit {\n @Input() value: string = '';\n @Input() templateId: number | null = null; // Template ID for ontology suggestions\n @Input() columnId: number | null = null; // Column ID for ontology suggestions (actual metadata column)\n @Output() valueChange = new EventEmitter<string>();\n\n // Search type for typeahead - internal signal\n searchType = signal<'icontains' | 'istartswith'>('icontains');\n\n private fb = inject(FormBuilder);\n private sdrfSyntax = inject(SdrfSyntaxService);\n private metadataColumnService = inject(MetadataColumnService);\n private metadataColumnTemplateService = inject(MetadataColumnTemplateService);\n\n modificationForm!: FormGroup;\n\n // Predefined options for dropdowns\n modificationTypes = ['Fixed', 'Variable', 'Annotated'];\n positions = ['Anywhere', 'Protein N-term', 'Protein C-term', 'Any N-term', 'Any C-term'];\n\n // Unimod specification support\n selectedUnimodData = signal<UnimodFullData | null>(null);\n availableSpecifications = signal<(UnimodSpecification & { specNumber: string })[]>([]);\n selectedSpecification = signal<string | null>(null);\n showSpecifications = signal(false);\n showHiddenSpecifications = signal(false);\n hiddenSpecificationCount = signal(0);\n\n ngOnInit() {\n this.modificationForm = this.fb.group({\n NT: ['', Validators.required], // Name of Term - with typeahead\n AC: [''], // Accession\n CF: [''], // Chemical Formula\n MT: [''], // Modification Type\n PP: [''], // Position in Polypeptide\n TA: ['', Validators.required], // Target Amino acid\n MM: ['', [Validators.pattern(/^\\d+(\\.\\d+)?$/)]], // Monoisotopic Mass\n TS: [''] // Target Site regex\n });\n\n // Parse initial value\n if (this.value) {\n this.parseAndSetValue(this.value);\n }\n\n // Subscribe to form changes\n this.modificationForm.valueChanges.subscribe(() => {\n this.updateValue();\n });\n }\n\n private parseAndSetValue(value: string) {\n try {\n const parsed = this.sdrfSyntax.parseValue('modification', value) as ModificationParameters;\n this.modificationForm.patchValue(parsed);\n } catch (error) {\n console.warn('Could not parse modification value:', value);\n }\n }\n\n // Helper method to ensure we get string values from form controls\n private getStringValue(value: any): string {\n if (typeof value === 'string') {\n return value.trim();\n }\n \n // Handle objects from typeahead selection (OntologySuggestion)\n if (value && typeof value === 'object') {\n // For Unimod modifications, use the name from full_data\n if (value.fullData && value.fullData.name) {\n return value.fullData.name;\n }\n // For other ontology types, use the value property\n if (value.value) return value.value;\n if (value.name) return value.name;\n }\n \n // Fallback to string conversion\n return value ? String(value).trim() : '';\n }\n\n private updateValue() {\n const formValue = this.modificationForm.value;\n\n // Only emit if we have required fields\n if (formValue.NT && formValue.TA) {\n // Build cleaned value, ensuring NT is always included and properly stringified\n const cleanedValue: ModificationParameters = {\n NT: this.getStringValue(formValue.NT), // Always include NT field as string\n TA: this.getStringValue(formValue.TA) // Always include TA field as string\n };\n\n // Add other non-empty fields\n Object.keys(formValue).forEach(key => {\n if (key !== 'NT' && key !== 'TA') { // Skip NT and TA as they're already added\n const value = formValue[key];\n const stringValue = this.getStringValue(value);\n if (stringValue) {\n cleanedValue[key as keyof ModificationParameters] = stringValue;\n }\n }\n });\n\n const formatted = this.sdrfSyntax.formatValue('modification', cleanedValue);\n this.valueChange.emit(formatted);\n } else if (!formValue.NT && !formValue.TA) {\n // If both required fields are empty, emit empty string\n this.valueChange.emit('');\n }\n }\n\n // Typeahead for NT field (Name of Term) - using ontology suggestions from API\n searchModificationTerms: OperatorFunction<string, readonly OntologySuggestion[]> = (text$: Observable<string>) =>\n text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n filter(term => term.length >= 2),\n switchMap(term => {\n // Use column ID first if available (for actual metadata columns), otherwise template ID (for templates/favorites)\n if (this.columnId) {\n return this.metadataColumnService.getOntologySuggestions({\n columnId: this.columnId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n map(response => response.suggestions || []),\n catchError(error => {\n console.warn(`Failed to get ontology suggestions for column ${this.columnId}:`, error);\n return of([]);\n })\n );\n } else if (this.templateId) {\n return this.metadataColumnTemplateService.getOntologySuggestions({\n templateId: this.templateId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n map(response => response.suggestions || []),\n catchError(error => {\n console.warn(`Failed to get ontology suggestions for template ${this.templateId}:`, error);\n return of([]);\n })\n );\n } else {\n // No ID available, return empty suggestions\n return of([]);\n }\n })\n );\n\n // Formatter for ontology suggestions\n formatOntologySuggestion = (suggestion: OntologySuggestion): string => {\n return suggestion.displayName || suggestion.value;\n };\n\n // Handle ontology suggestion selection\n onOntologySuggestionSelected = (event: any): void => {\n const suggestion: OntologySuggestion = event.item;\n if (suggestion) {\n // Set the NT field value - use display name for Unimod, otherwise use value\n const ntValue = isUnimodFullData(suggestion) && suggestion.fullData.name\n ? suggestion.fullData.name\n : (suggestion.displayName || suggestion.value);\n this.modificationForm.patchValue({ NT: ntValue });\n\n // Check if this is a Unimod modification with specifications\n if (isUnimodFullData(suggestion)) {\n this.selectedUnimodData.set(suggestion.fullData);\n this.updateAvailableSpecifications(suggestion);\n this.showSpecifications.set(this.availableSpecifications().length > 0);\n\n // Auto-fill some fields from main Unimod data\n if (suggestion.fullData.accession) {\n this.modificationForm.patchValue({ AC: suggestion.fullData.accession });\n }\n if (suggestion.fullData.deltaComposition) {\n this.modificationForm.patchValue({ CF: suggestion.fullData.deltaComposition });\n }\n if (suggestion.fullData.deltaMonoMass) {\n this.modificationForm.patchValue({ MM: suggestion.fullData.deltaMonoMass });\n }\n } else {\n // Not a Unimod modification, clear specification data\n this.selectedUnimodData.set(null);\n this.availableSpecifications.set([]);\n this.showSpecifications.set(false);\n this.selectedSpecification.set(null);\n }\n }\n };\n\n // Format TA field display (amino acids)\n formatTargetAminoAcids(value: string): string {\n if (!value) return '';\n // Split by comma and clean up\n return value.split(',').map(aa => aa.trim().toUpperCase()).join(', ');\n }\n\n onTargetAminoAcidChange(event: any) {\n const value = event.target.value;\n if (value) {\n // Format as uppercase and validate amino acid letters\n const formatted = value\n .replace(/[^A-Za-z,]/g, '') // Only allow letters and commas\n .split(',')\n .map((aa: string) => aa.trim().toUpperCase())\n .filter((aa: string) => aa.length > 0)\n .join(',');\n\n this.modificationForm.patchValue({ TA: formatted });\n }\n }\n\n // Handle specification selection\n onSpecificationSelected(specNumber: string): void {\n this.selectedSpecification.set(specNumber);\n const unimodData = this.selectedUnimodData();\n\n if (unimodData && unimodData.specifications[specNumber]) {\n const spec = unimodData.specifications[specNumber];\n\n // Ensure NT field is preserved (use the Unimod name)\n const currentNT = this.modificationForm.get('NT')?.value;\n if (!currentNT && unimodData.name) {\n this.modificationForm.patchValue({ NT: unimodData.name });\n }\n\n // Update form fields with specification data\n if (spec['site']) {\n this.modificationForm.patchValue({ TA: spec['site'] });\n }\n if (spec['position']) {\n // Map Unimod position to our dropdown values\n const mappedPosition = this.mapUnimodPosition(spec['position']);\n this.modificationForm.patchValue({ PP: mappedPosition });\n }\n if (spec['classification']) {\n // Map classification to modification type if possible\n const mappedType = this.mapClassificationToType(spec['classification']);\n if (mappedType) {\n this.modificationForm.patchValue({ MT: mappedType });\n }\n }\n }\n }\n\n // Map Unimod position to our dropdown values\n private mapUnimodPosition(unimodPosition: string): string {\n const positionMap: Record<string, string> = {\n 'Anywhere': 'Anywhere',\n 'Protein N-term': 'Protein N-term',\n 'Protein C-term': 'Protein C-term',\n 'Any N-term': 'Any N-term',\n 'Any C-term': 'Any C-term'\n };\n\n return positionMap[unimodPosition] || 'Anywhere';\n }\n\n // Map classification to modification type\n private mapClassificationToType(classification: string): string | null {\n const classificationMap: Record<string, string> = {\n 'Post-translational': 'Variable',\n 'Chemical derivatization': 'Fixed',\n 'Artefact': 'Variable',\n 'Pre-translational': 'Fixed',\n 'Multiple': 'Variable',\n 'Other': 'Variable'\n };\n\n return classificationMap[classification] || null;\n }\n\n // Get specification display text\n getSpecificationDisplay(spec: UnimodSpecification & { specNumber: string }): string {\n const parts = [];\n if (spec['site']) parts.push(`Site: ${spec['site']}`);\n if (spec['position']) parts.push(`Position: ${spec['position']}`);\n if (spec['classification']) parts.push(`Class: ${spec['classification']}`);\n\n return parts.join(' | ') || `Specification ${spec.specNumber}`;\n }\n\n // Handle search type change\n onSearchTypeChange(type: 'icontains' | 'istartswith'): void {\n this.searchType.set(type);\n }\n\n // Update available specifications based on toggle state\n private updateAvailableSpecifications(suggestion: OntologySuggestion): void {\n if (!isUnimodFullData(suggestion)) return;\n\n const allSpecs = OntologyUtils.getUnimodSpecifications(suggestion);\n const activeSpecs = OntologyUtils.getActiveUnimodSpecifications(suggestion);\n \n // Calculate hidden count\n this.hiddenSpecificationCount.set(allSpecs.length - activeSpecs.length);\n \n // Set available specifications based on toggle\n const specsToShow = this.showHiddenSpecifications() ? allSpecs : activeSpecs;\n this.availableSpecifications.set(specsToShow);\n }\n\n // Toggle hidden specifications visibility\n toggleHiddenSpecifications(): void {\n this.showHiddenSpecifications.set(!this.showHiddenSpecifications());\n \n // Update available specifications\n const unimodData = this.selectedUnimodData();\n if (unimodData) {\n // Create a mock suggestion object to pass to updateAvailableSpecifications\n const mockSuggestion: OntologySuggestion = {\n id: '',\n value: '',\n displayName: '',\n ontologyType: OntologyType.UNIMOD,\n fullData: unimodData\n };\n this.updateAvailableSpecifications(mockSuggestion);\n }\n }\n}\n","<form [formGroup]=\"modificationForm\" class=\"modification-input-form\">\n\n <!-- Search Type Selection for Typeahead -->\n @if (templateId || columnId) {\n <div class=\"mb-3\">\n <small class=\"text-muted d-block mb-1\">Search Mode for Name of Term:</small>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'icontains' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('icontains')\">\n <i class=\"bi bi-search me-1\"></i>Contains\n </button>\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'istartswith' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('istartswith')\">\n <i class=\"bi bi-arrow-right me-1\"></i>Starts with\n </button>\n </div>\n </div>\n }\n\n <div class=\"row g-3\">\n\n <!-- Name of Term (NT) - Required with Typeahead -->\n <div class=\"col-md-6\">\n <label for=\"NT\" class=\"form-label\">\n Name of Term <span class=\"text-danger\">*</span>\n <small class=\"text-muted\">(NT)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"NT\"\n formControlName=\"NT\"\n placeholder=\"e.g., Oxidation, Acetyl, Phospho\"\n [ngbTypeahead]=\"searchModificationTerms\"\n [resultFormatter]=\"formatOntologySuggestion\"\n [inputFormatter]=\"formatOntologySuggestion\"\n (selectItem)=\"onOntologySuggestionSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\"\n [class.is-invalid]=\"modificationForm.get('NT')?.invalid && modificationForm.get('NT')?.touched\">\n <div class=\"form-text\">\n @if (templateId || columnId) {\n Typeahead search: {{ searchType() === 'icontains' ? 'Contains' : 'Starts with' }} mode\n } @else {\n Common modifications: Oxidation, Carbamidomethyl, Acetyl\n }\n </div>\n <div class=\"invalid-feedback\">\n Name of Term is required\n </div>\n </div>\n\n <!-- Unimod Specification Selection -->\n @if (showSpecifications() && availableSpecifications().length > 0) {\n <div class=\"col-md-12\">\n <div class=\"mb-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <label class=\"form-label mb-0\">\n Unimod Specifications\n <small class=\"text-muted\">(Select to auto-fill fields)</small>\n </label>\n \n @if (hiddenSpecificationCount() > 0) {\n <div class=\"form-check form-switch\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n id=\"showHiddenSpecs\"\n [checked]=\"showHiddenSpecifications()\"\n (change)=\"toggleHiddenSpecifications()\">\n <label class=\"form-check-label small text-muted\" for=\"showHiddenSpecs\">\n Show {{ hiddenSpecificationCount() }} hidden spec{{ hiddenSpecificationCount() === 1 ? '' : 's' }}\n </label>\n </div>\n }\n </div>\n \n <div class=\"border rounded p-2 bg-body-secondary\">\n <div class=\"mb-2\">\n <small class=\"text-info fw-semibold\">\n <i class=\"bi bi-info-circle me-1\"></i>\n {{ showHiddenSpecifications() ? 'All' : 'Visible' }} specifications for {{ selectedUnimodData()?.name }}\n @if (!showHiddenSpecifications() && hiddenSpecificationCount() > 0) {\n <span class=\"text-muted\">({{ hiddenSpecificationCount() }} hidden)</span>\n }\n </small>\n </div>\n <div class=\"row g-2\">\n @for (spec of availableSpecifications(); track spec.specNumber) {\n <div class=\"col-md-6\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"radio\"\n [id]=\"'spec_' + spec.specNumber\"\n [value]=\"spec.specNumber\"\n [checked]=\"selectedSpecification() === spec.specNumber\"\n (change)=\"onSpecificationSelected(spec.specNumber)\">\n <label\n class=\"form-check-label small\"\n [for]=\"'spec_' + spec.specNumber\">\n <div class=\"fw-semibold\">\n Spec {{ spec.specNumber }}\n @if (spec['hidden'] === '1') {\n <span class=\"badge bg-warning text-dark ms-1\" title=\"Hidden specification\">Hidden</span>\n }\n </div>\n <div class=\"text-muted\">{{ getSpecificationDisplay(spec) }}</div>\n </label>\n </div>\n </div>\n }\n </div>\n @if (selectedSpecification()) {\n <div class=\"mt-2 p-2 bg-body border rounded\">\n <small class=\"text-success\">\n <i class=\"bi bi-check-circle me-1\"></i>\n Fields auto-filled from specification {{ selectedSpecification() }}\n </small>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Target Amino Acid (TA) - Required -->\n <div class=\"col-md-6\">\n <label for=\"TA\" class=\"form-label\">\n Target Amino Acid <span class=\"text-danger\">*</span>\n <small class=\"text-muted\">(TA)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"TA\"\n formControlName=\"TA\"\n placeholder=\"e.g., M, S,T,Y, C\"\n (input)=\"onTargetAminoAcidChange($event)\"\n [class.is-invalid]=\"modificationForm.get('TA')?.invalid && modificationForm.get('TA')?.touched\">\n <div class=\"form-text\">Single letter amino acid codes, comma-separated</div>\n <div class=\"invalid-feedback\">\n Target amino acid is required\n </div>\n </div>\n\n <!-- Accession (AC) -->\n <div class=\"col-md-6\">\n <label for=\"AC\" class=\"form-label\">\n Accession <small class=\"text-muted\">(AC)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"AC\"\n formControlName=\"AC\"\n placeholder=\"e.g., UNIMOD:35, PSI-MOD:00719\">\n <div class=\"form-text\">UNIMOD or PSI-MOD accession</div>\n </div>\n\n <!-- Modification Type (MT) -->\n <div class=\"col-md-6\">\n <label for=\"MT\" class=\"form-label\">\n Modification Type <small class=\"text-muted\">(MT)</small>\n </label>\n <select class=\"form-select\" id=\"MT\" formControlName=\"MT\">\n <option value=\"\">Select type...</option>\n @for (type of modificationTypes; track type) {\n <option [value]=\"type\">{{ type }}</option>\n }\n </select>\n <div class=\"form-text\">Fixed, Variable, or Annotated</div>\n </div>\n\n <!-- Position (PP) -->\n <div class=\"col-md-6\">\n <label for=\"PP\" class=\"form-label\">\n Position <small class=\"text-muted\">(PP)</small>\n </label>\n <select class=\"form-select\" id=\"PP\" formControlName=\"PP\">\n <option value=\"\">Select position...</option>\n @for (position of positions; track position) {\n <option [value]=\"position\">{{ position }}</option>\n }\n </select>\n <div class=\"form-text\">Where the modification occurs</div>\n </div>\n\n <!-- Chemical Formula (CF) -->\n <div class=\"col-md-6\">\n <label for=\"CF\" class=\"form-label\">\n Chemical Formula <small class=\"text-muted\">(CF)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"CF\"\n formControlName=\"CF\"\n placeholder=\"e.g., H(2)C(2)O\">\n <div class=\"form-text\">Follow UNIMOD format: H(2)C(2)O</div>\n </div>\n\n <!-- Monoisotopic Mass (MM) -->\n <div class=\"col-md-6\">\n <label for=\"MM\" class=\"form-label\">\n Monoisotopic Mass <small class=\"text-muted\">(MM)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"MM\"\n formControlName=\"MM\"\n placeholder=\"e.g., 42.010565\"\n [class.is-invalid]=\"modificationForm.get('MM')?.invalid && modificationForm.get('MM')?.touched\">\n <div class=\"form-text\">Mass shift in Da (5+ decimal places)</div>\n <div class=\"invalid-feedback\">\n Please enter a valid mass (numbers and decimal point only)\n </div>\n </div>\n\n <!-- Target Site (TS) -->\n <div class=\"col-md-6\">\n <label for=\"TS\" class=\"form-label\">\n Target Site <small class=\"text-muted\">(TS)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"TS\"\n formControlName=\"TS\"\n placeholder=\"e.g., N[^P][ST]\">\n <div class=\"form-text\">Regular expression for complex site rules</div>\n </div>\n\n </div>\n\n <!-- Preview -->\n @if (modificationForm.valid && (modificationForm.get('NT')?.value || modificationForm.get('TA')?.value)) {\n <div class=\"mt-3 p-2 bg-body-secondary border rounded\">\n <small class=\"text-muted fw-semibold\">Preview:</small>\n <div class=\"font-monospace small\">{{ value || 'Building...' }}</div>\n </div>\n }\n\n <!-- Validation Summary -->\n @if (modificationForm.invalid && modificationForm.touched) {\n <div class=\"alert alert-warning mt-3\">\n <small>\n <i class=\"bi bi-exclamation-triangle me-1\"></i>\n <strong>Required fields:</strong> Name of Term (NT) and Target Amino Acid (TA) must be filled.\n </small>\n </div>\n }\n</form>\n","import { Component, Input, Output, EventEmitter, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { SdrfSyntaxService, SpikedCompound } from '../../services/sdrf-syntax';\n\n@Component({\n selector: 'ccv-sdrf-spiked-compound-input',\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: './sdrf-spiked-compound-input.html',\n styleUrl: './sdrf-spiked-compound-input.scss'\n})\nexport class SdrfSpikedCompoundInput implements OnInit {\n @Input() value: string = '';\n @Output() valueChange = new EventEmitter<string>();\n\n private fb = inject(FormBuilder);\n private sdrfSyntax = inject(SdrfSyntaxService);\n\n spikedForm!: FormGroup;\n \n // Predefined options\n compoundTypes = ['protein', 'peptide', 'mixture', 'other'];\n\n ngOnInit() {\n this.spikedForm = this.fb.group({\n CT: ['', Validators.required], // Compound type - MANDATORY\n QY: ['', Validators.required], // Quantity - MANDATORY\n SP: [''], // Species - Optional\n PS: [''], // Peptide sequence - For peptides\n AC: [''], // Uniprot Accession - For proteins\n CN: [''], // Compound name - Optional\n CV: [''], // Compound vendor - Optional\n CS: [''], // Compound specification URI - Optional\n CF: [''] // Compound formula - Optional\n });\n\n // Parse initial value\n if (this.value) {\n this.parseAndSetValue(this.value);\n }\n\n // Subscribe to form changes\n this.spikedForm.valueChanges.subscribe(() => {\n this.updateValue();\n });\n }\n\n private parseAndSetValue(value: string) {\n try {\n const parsed = this.sdrfSyntax.parseValue('spiked_compound', value) as SpikedCompound;\n this.spikedForm.patchValue(parsed);\n } catch (error) {\n console.warn('Could not parse spiked compound value:', value);\n }\n }\n\n // Helper method to ensure we get string values from form controls\n private getStringValue(value: any): string {\n if (typeof value === 'string') {\n return value.trim();\n }\n \n // Handle objects from typeahead selection (OntologySuggestion)\n if (value && typeof value === 'object') {\n // For ontology suggestions, use the value property\n if (value.value) return value.value;\n if (value.name) return value.name;\n }\n \n // Fallback to string conversion\n return value ? String(value).trim() : '';\n }\n\n private updateValue() {\n const formValue = this.spikedForm.value;\n \n // Only emit if we have both required fields\n if (formValue.CT && formValue.QY) {\n // Filter out empty values and convert to strings\n const cleanedValue: SpikedCompound = {};\n Object.keys(formValue).forEach(key => {\n const stringValue = this.getStringValue(formValue[key]);\n if (stringValue) {\n cleanedValue[key as keyof SpikedCompound] = stringValue;\n }\n });\n\n const formatted = this.sdrfSyntax.formatValue('spiked_compound', cleanedValue);\n this.valueChange.emit(formatted);\n } else if (!formValue.CT && !formValue.QY) {\n // If both required fields are empty, emit empty string\n this.valueChange.emit('');\n }\n }\n\n get showProteinFields(): boolean {\n return this.spikedForm.get('CT')?.value === 'protein';\n }\n\n get showPeptideFields(): boolean {\n return this.spikedForm.get('CT')?.value === 'peptide';\n }\n}\n","<form [formGroup]=\"spikedForm\" class=\"spiked-compound-input-form\">\n <div class=\"row g-3\">\n \n <!-- Compound Type (CT) - Required -->\n <div class=\"col-md-6\">\n <label for=\"CT\" class=\"form-label\">\n Compound Type <span class=\"text-danger\">*</span>\n <small class=\"text-muted\">(CT)</small>\n </label>\n <select class=\"form-select\" id=\"CT\" formControlName=\"CT\"\n [class.is-invalid]=\"spikedForm.get('CT')?.invalid && spikedForm.get('CT')?.touched\">\n <option value=\"\">Select compound type...</option>\n @for (type of compoundTypes; track type) {\n <option [value]=\"type\">{{ type }}</option>\n }\n </select>\n <div class=\"form-text\">Type of spiked compound</div>\n <div class=\"invalid-feedback\">\n Compound type is required\n </div>\n </div>\n\n <!-- Quantity (QY) - Required -->\n <div class=\"col-md-6\">\n <label for=\"QY\" class=\"form-label\">\n Quantity <span class=\"text-danger\">*</span>\n <small class=\"text-muted\">(QY)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"QY\"\n formControlName=\"QY\"\n placeholder=\"e.g., 10 fmol, 50 ng\"\n [class.is-invalid]=\"spikedForm.get('QY')?.invalid && spikedForm.get('QY')?.touched\">\n <div class=\"form-text\">Quantity with units (molar or mass)</div>\n <div class=\"invalid-feedback\">\n Quantity is required\n </div>\n </div>\n\n <!-- Species (SP) -->\n <div class=\"col-md-6\">\n <label for=\"SP\" class=\"form-label\">\n Species <small class=\"text-muted\">(SP)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"SP\"\n formControlName=\"SP\"\n placeholder=\"e.g., homo sapiens\">\n <div class=\"form-text\">Species of origin</div>\n </div>\n\n <!-- Compound Name (CN) -->\n <div class=\"col-md-6\">\n <label for=\"CN\" class=\"form-label\">\n Compound Name <small class=\"text-muted\">(CN)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"CN\"\n formControlName=\"CN\"\n placeholder=\"e.g., Myoglobin\">\n <div class=\"form-text\">Name of the compound</div>\n </div>\n\n <!-- Protein-specific fields -->\n @if (showProteinFields) {\n <div class=\"col-md-12\">\n <label for=\"AC\" class=\"form-label\">\n Uniprot Accession <small class=\"text-muted\">(AC)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"AC\"\n formControlName=\"AC\"\n placeholder=\"e.g., P68871\">\n <div class=\"form-text\">Uniprot accession for protein compounds</div>\n </div>\n }\n\n <!-- Peptide-specific fields -->\n @if (showPeptideFields) {\n <div class=\"col-md-12\">\n <label for=\"PS\" class=\"form-label\">\n Peptide Sequence <small class=\"text-muted\">(PS)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"PS\"\n formControlName=\"PS\"\n placeholder=\"e.g., PEPTIDESEQ\">\n <div class=\"form-text\">Peptide sequence for peptide compounds</div>\n </div>\n }\n\n <!-- Compound Vendor (CV) -->\n <div class=\"col-md-6\">\n <label for=\"CV\" class=\"form-label\">\n Compound Vendor <small class=\"text-muted\">(CV)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"CV\"\n formControlName=\"CV\"\n placeholder=\"e.g., Sigma-Aldrich\">\n <div class=\"form-text\">Vendor or supplier name</div>\n </div>\n\n <!-- Compound Formula (CF) -->\n <div class=\"col-md-6\">\n <label for=\"CF\" class=\"form-label\">\n Compound Formula <small class=\"text-muted\">(CF)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"CF\"\n formControlName=\"CF\"\n placeholder=\"e.g., C8H14N4O2\">\n <div class=\"form-text\">Chemical formula</div>\n </div>\n\n <!-- Compound Specification URI (CS) -->\n <div class=\"col-md-12\">\n <label for=\"CS\" class=\"form-label\">\n Compound Specification URI <small class=\"text-muted\">(CS)</small>\n </label>\n <input \n type=\"url\" \n class=\"form-control\" \n id=\"CS\"\n formControlName=\"CS\"\n placeholder=\"https://example.com/compound-spec\">\n <div class=\"form-text\">URI to compound specification or documentation</div>\n </div>\n\n </div>\n\n <!-- Preview -->\n @if (spikedForm.valid && (spikedForm.get('CT')?.value && spikedForm.get('QY')?.value)) {\n <div class=\"mt-3 p-2 bg-body-secondary border rounded\">\n <small class=\"text-muted fw-semibold\">Preview:</small>\n <div class=\"font-monospace small\">{{ value || 'Building...' }}</div>\n </div>\n }\n\n <!-- Validation Summary -->\n @if (spikedForm.invalid && spikedForm.touched) {\n <div class=\"alert alert-warning mt-3\">\n <small>\n <i class=\"bi bi-exclamation-triangle me-1\"></i>\n <strong>Required fields:</strong> Compound Type (CT) and Quantity (QY) must be filled.\n </small>\n </div>\n }\n</form>\n","import { Component, Input, Output, EventEmitter, OnInit, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbTypeahead, NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { Observable, OperatorFunction, debounceTime, distinctUntilChanged, filter, map, switchMap, of, catchError } from 'rxjs';\nimport { SdrfSyntaxService, CleavageAgentDetails } from '../../services/sdrf-syntax';\nimport { OntologySuggestion } from '../../models';\nimport { MetadataColumnService, MetadataColumnTemplateService } from '../../services';\n\n@Component({\n selector: 'ccv-sdrf-cleavage-input',\n imports: [CommonModule, ReactiveFormsModule, NgbTypeahead, NgbModule],\n templateUrl: './sdrf-cleavage-input.html',\n styleUrl: './sdrf-cleavage-input.scss'\n})\nexport class SdrfCleavageInput implements OnInit {\n @Input() value: string = '';\n @Input() templateId: number | null = null; // Template ID for ontology suggestions\n @Input() columnId: number | null = null; // Column ID for ontology suggestions (actual metadata column)\n @Output() valueChange = new EventEmitter<string>();\n\n // Search type for typeahead - internal signal\n searchType = signal<'icontains' | 'istartswith'>('icontains');\n\n private fb = inject(FormBuilder);\n private sdrfSyntax = inject(SdrfSyntaxService);\n private metadataColumnService = inject(MetadataColumnService);\n private metadataColumnTemplateService = inject(MetadataColumnTemplateService);\n\n cleavageForm!: FormGroup;\n\n ngOnInit() {\n this.cleavageForm = this.fb.group({\n NT: ['', Validators.required], // Name of Term - will use ontology typeahead from parent\n AC: [''], // Accession\n CS: [''] // Cleavage Site pattern\n });\n\n // Parse initial value\n if (this.value) {\n this.parseAndSetValue(this.value);\n }\n\n // Subscribe to form changes\n this.cleavageForm.valueChanges.subscribe(() => {\n this.updateValue();\n });\n }\n\n private parseAndSetValue(value: string) {\n try {\n const parsed = this.sdrfSyntax.parseValue('cleavage', value) as CleavageAgentDetails;\n this.cleavageForm.patchValue(parsed);\n } catch (error) {\n console.warn('Could not parse cleavage agent value:', value);\n }\n }\n\n // Helper method to ensure we get string values from form controls\n private getStringValue(value: any): string {\n if (typeof value === 'string') {\n return value.trim();\n }\n \n // Handle objects from typeahead selection (OntologySuggestion)\n if (value && typeof value === 'object') {\n // For cleavage agents: display_name for NT, value for AC\n if (value.displayName) return value.displayName;\n if (value.value) return value.value;\n if (value.name) return value.name;\n }\n \n // Fallback to string conversion\n return value ? String(value).trim() : '';\n }\n\n private updateValue() {\n const formValue = this.cleavageForm.value;\n\n // Only emit if we have required field\n if (formValue.NT) {\n // Filter out empty values and convert to strings\n const cleanedValue: CleavageAgentDetails = {};\n Object.keys(formValue).forEach(key => {\n const stringValue = this.getStringValue(formValue[key]);\n if (stringValue) {\n cleanedValue[key as keyof CleavageAgentDetails] = stringValue;\n }\n });\n\n const formatted = this.sdrfSyntax.formatValue('cleavage', cleanedValue);\n this.valueChange.emit(formatted);\n } else if (!formValue.NT) {\n // If required field is empty, emit empty string\n this.valueChange.emit('');\n }\n }\n\n // Typeahead for NT field (Name of Term) - using ontology suggestions from API\n searchCleavageTerms: OperatorFunction<string, readonly OntologySuggestion[]> = (text$: Observable<string>) =>\n text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n filter(term => term.length >= 2),\n switchMap(term => {\n // Use column ID first if available (for actual metadata columns), otherwise template ID (for templates/favorites)\n if (this.columnId) {\n return this.metadataColumnService.getOntologySuggestions({\n columnId: this.columnId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n map(response => response.suggestions || []),\n catchError(error => {\n console.warn(`Failed to get ontology suggestions for column ${this.columnId}:`, error);\n return of([]);\n })\n );\n } else if (this.templateId) {\n return this.metadataColumnTemplateService.getOntologySuggestions({\n templateId: this.templateId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n map(response => response.suggestions || []),\n catchError(error => {\n console.warn(`Failed to get ontology suggestions for template ${this.templateId}:`, error);\n return of([]);\n })\n );\n } else {\n // No ID available, return empty suggestions\n return of([]);\n }\n })\n );\n\n // Formatter for ontology suggestions\n formatOntologySuggestion = (suggestion: OntologySuggestion): string => {\n return suggestion.displayName || suggestion.value;\n };\n\n // Handle ontology suggestion selection\n onOntologySuggestionSelected = (event: any): void => {\n const suggestion: OntologySuggestion = event.item;\n if (suggestion) {\n // Set the NT field value\n this.cleavageForm.patchValue({ NT: suggestion.value });\n\n // Auto-fill AC field if available (use the ID as accession)\n if (suggestion.id) {\n this.cleavageForm.patchValue({ AC: suggestion.id });\n }\n }\n };\n\n // Handle search type change\n onSearchTypeChange(type: 'icontains' | 'istartswith'): void {\n this.searchType.set(type);\n }\n}\n","<form [formGroup]=\"cleavageForm\" class=\"cleavage-input-form\">\n\n <!-- Search Type Selection for Typeahead -->\n @if (templateId || columnId) {\n <div class=\"mb-3\">\n <small class=\"text-muted d-block mb-1\">Search Mode for Name of Term:</small>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'icontains' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('icontains')\">\n <i class=\"bi bi-search me-1\"></i>Contains\n </button>\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'istartswith' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('istartswith')\">\n <i class=\"bi bi-arrow-right me-1\"></i>Starts with\n </button>\n </div>\n </div>\n }\n\n <div class=\"row g-3\">\n\n <!-- Name of Term (NT) - Required -->\n <div class=\"col-md-6\">\n <label for=\"NT\" class=\"form-label\">\n Name of Term <span class=\"text-danger\">*</span>\n <small class=\"text-muted\">(NT)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"NT\"\n formControlName=\"NT\"\n placeholder=\"e.g., Trypsin, Chymotrypsin\"\n [ngbTypeahead]=\"searchCleavageTerms\"\n [resultFormatter]=\"formatOntologySuggestion\"\n [inputFormatter]=\"formatOntologySuggestion\"\n (selectItem)=\"onOntologySuggestionSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\"\n [class.is-invalid]=\"cleavageForm.get('NT')?.invalid && cleavageForm.get('NT')?.touched\">\n <div class=\"form-text\">\n @if (templateId || columnId) {\n Typeahead search: {{ searchType() === 'icontains' ? 'Contains' : 'Starts with' }} mode\n } @else {\n Cleavage agent name (uses ontology typeahead when available)\n }\n </div>\n <div class=\"invalid-feedback\">\n Name of Term is required\n </div>\n </div>\n\n <!-- Accession (AC) -->\n <div class=\"col-md-6\">\n <label for=\"AC\" class=\"form-label\">\n Accession <small class=\"text-muted\">(AC)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"AC\"\n formControlName=\"AC\"\n placeholder=\"e.g., PSI-MS:1001251\">\n <div class=\"form-text\">PSI-MS or other ontology accession</div>\n </div>\n\n <!-- Cleavage Site (CS) -->\n <div class=\"col-md-12\">\n <label for=\"CS\" class=\"form-label\">\n Cleavage Site <small class=\"text-muted\">(CS)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"CS\"\n formControlName=\"CS\"\n placeholder=\"e.g., (?<=[KR])(?![P])\">\n <div class=\"form-text\">Regular expression pattern for cleavage site specificity</div>\n </div>\n\n </div>\n\n <!-- Preview -->\n @if (cleavageForm.valid && cleavageForm.get('NT')?.value) {\n <div class=\"mt-3 p-2 bg-body-secondary border rounded\">\n <small class=\"text-muted fw-semibold\">Preview:</small>\n <div class=\"font-monospace small\">{{ value || 'Building...' }}</div>\n </div>\n }\n\n <!-- Validation Summary -->\n @if (cleavageForm.invalid && cleavageForm.touched) {\n <div class=\"alert alert-warning mt-3\">\n <small>\n <i class=\"bi bi-exclamation-triangle me-1\"></i>\n <strong>Required field:</strong> Name of Term (NT) must be filled.\n </small>\n </div>\n }\n</form>\n","import { Component, Input, Output, EventEmitter, OnInit, signal, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbActiveModal, NgbModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap';\nimport { Observable, of, catchError, debounceTime, distinctUntilChanged, tap, switchMap, map } from 'rxjs';\nimport { MetadataColumn, OntologySuggestion, FavouriteMetadataOption, FavouriteMetadataOptionCreateRequest, OntologyType } from '../../models';\nimport { FavouriteMetadataOptionService, MetadataColumnService, MetadataColumnTemplateService } from '../../services';\nimport { AuthService, User, LabGroupService } from '@noatgnu/cupcake-core';\nimport { SdrfSyntaxService, SyntaxType } from '../../services/sdrf-syntax';\nimport { SdrfAgeInput, SdrfModificationInput, SdrfCleavageInput, SdrfSpikedCompoundInput } from '../';\n\n\nexport interface MetadataValueEditConfig {\n columnId?: number;\n columnName: string;\n columnType: string;\n ontologyType?: string;\n enableTypeahead?: boolean;\n currentValue?: string;\n context: 'template' | 'table' | 'pool' | 'favorite_management';\n templateId?: number;\n tableId?: number;\n poolId?: number;\n customOntologyFilters?: Record<string, any>;\n enableMultiSampleEdit?: boolean;\n sampleData?: { index: number; value: string; sourceName?: string }[];\n maxSampleCount?: number;\n}\n\n@Component({\n selector: 'ccv-metadata-value-edit-modal',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n NgbModule,\n NgbNavModule,\n SdrfAgeInput,\n SdrfModificationInput,\n SdrfCleavageInput,\n SdrfSpikedCompoundInput\n ],\n templateUrl: './metadata-value-edit-modal.html',\n styleUrl: './metadata-value-edit-modal.scss'\n})\nexport class MetadataValueEditModal implements OnInit {\n @Input() config!: MetadataValueEditConfig;\n @Output() valueSaved = new EventEmitter<string | { value: string; sampleIndices: number[] }>();\n\n editForm: FormGroup;\n isLoading = signal(false);\n isLoadingSuggestions = signal(false);\n searchType = signal<'icontains' | 'istartswith'>('icontains');\n\n isLoadingFavorites = signal(false);\n userFavorites = signal<FavouriteMetadataOption[]>([]);\n labGroupFavorites = signal<FavouriteMetadataOption[]>([]);\n globalFavorites = signal<FavouriteMetadataOption[]>([]);\n selectedFavorite = signal<FavouriteMetadataOption | null>(null);\n\n currentUser = signal<User | null>(null);\n userLabGroups = signal<number[]>([]);\n\n activeFavoritesTab: 'user' | 'lab_group' | 'global' = 'user';\n\n private sdrfSyntaxService = inject(SdrfSyntaxService);\n specialSyntaxType = signal<SyntaxType | null>(null);\n showSpecialInput = signal(false);\n specialInputValue = signal('');\n\n selectedSampleIndices = signal<Set<number>>(new Set());\n showSamplePanel = signal(false);\n\n constructor(\n private fb: FormBuilder,\n private activeModal: NgbActiveModal,\n private authService: AuthService,\n private favouriteMetadataOptionService: FavouriteMetadataOptionService,\n private metadataColumnService: MetadataColumnService,\n private metadataColumnTemplateService: MetadataColumnTemplateService,\n private labGroupService: LabGroupService\n ) {\n this.editForm = this.fb.group({\n value: ['', [Validators.maxLength(500)]]\n });\n }\n\n ngOnInit() {\n\n const syntaxType = this.sdrfSyntaxService.detectSpecialSyntax(\n this.config.columnName,\n this.config.columnType\n );\n\n if (syntaxType) {\n this.specialSyntaxType.set(syntaxType);\n this.showSpecialInput.set(true);\n this.specialInputValue.set(this.config?.currentValue || '');\n }\n\n if (this.config?.currentValue) {\n this.editForm.patchValue({\n value: this.config.currentValue\n });\n }\n\n this.currentUser.set(this.authService.getCurrentUser());\n\n if (this.currentUser()) {\n this.loadUserLabGroups();\n }\n\n this.loadFavoriteOptions();\n\n\n if (this.config?.enableMultiSampleEdit && this.config?.sampleData) {\n this.showSamplePanel.set(true);\n console.log('Multi-sample editing enabled with', this.config.sampleData.length, 'samples');\n } else {\n console.log('Multi-sample editing not enabled:', {\n enableMultiSampleEdit: this.config?.enableMultiSampleEdit,\n hasSampleData: !!this.config?.sampleData,\n sampleDataLength: this.config?.sampleData?.length\n });\n }\n\n this.editForm.get('value')?.valueChanges.subscribe((newValue) => {\n const selected = this.selectedFavorite();\n if (selected && selected.value !== newValue) {\n this.selectedFavorite.set(null);\n }\n });\n }\n\n\n onCancel() {\n this.activeModal.dismiss();\n }\n\n onClose() {\n this.isLoading.set(false);\n this.activeModal.close();\n }\n\n get title(): string {\n return `Edit ${this.config?.columnName || 'Metadata Value'}`;\n }\n\n get hasOntologyType(): boolean {\n return !!(this.config?.ontologyType && this.config.ontologyType.length > 0 && this.config.enableTypeahead);\n }\n\n get ontologyTypeLabel(): string {\n return this.config?.ontologyType || '';\n }\n\n get isFromFavoriteManagement(): boolean {\n return this.config?.context === 'favorite_management';\n }\n\n // Ontology autocomplete methods\n searchOntology = (text$: Observable<string>): Observable<OntologySuggestion[]> => {\n return text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n tap(() => this.isLoadingSuggestions.set(true)),\n switchMap(term => {\n if (term.length < 2 || !this.hasOntologyType) {\n this.isLoadingSuggestions.set(false);\n return of([]);\n }\n\n if (this.config.context === 'table' && this.config.columnId) {\n return this.metadataColumnService.getOntologySuggestions({\n columnId: this.config.columnId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n switchMap(response => of(response.suggestions || [])),\n catchError(() => of([])),\n tap(() => this.isLoadingSuggestions.set(false))\n );\n } else if ((this.config.context === 'template' || this.config.context === 'favorite_management') && this.config.templateId) {\n return this.metadataColumnTemplateService.getOntologySuggestions({\n templateId: this.config.templateId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n map(response => response.suggestions || []),\n catchError(error => {\n console.error('Error getting ontology suggestions:', error);\n return of([]);\n }),\n tap(() => this.isLoadingSuggestions.set(false))\n );\n } else {\n this.isLoadingSuggestions.set(false);\n return of([]);\n }\n })\n );\n };\n\n formatSuggestion = (suggestion: OntologySuggestion): string => {\n return suggestion.displayName || suggestion.value;\n };\n\n inputFormatter = (suggestion: OntologySuggestion): string => {\n if (suggestion && suggestion.ontologyType === OntologyType.MS_UNIQUE_VOCABULARIES && suggestion.fullData && suggestion.fullData.name) {\n if (suggestion.fullData.accession) {\n return `NT=${suggestion.fullData.name};AC=${suggestion.fullData.accession}`;\n } else {\n return suggestion.fullData.name;\n }\n }\n\n // For other ontology types, use regular value\n return suggestion.displayName || suggestion.value || String(suggestion);\n };\n\n onSuggestionSelected = (event: any): void => {\n if (event.item) {\n const suggestion = event.item;\n let displayValue: string;\n\n // Extract the proper display value based on suggestion type\n if (suggestion.fullData && suggestion.fullData.name) {\n // For ontology suggestions with fullData, format according to SDRF syntax\n if (suggestion.fullData.accession) {\n // Use SDRF syntax: NT={name};AC={accession}\n displayValue = `NT=${suggestion.fullData.name};AC=${suggestion.fullData.accession}`;\n } else {\n // Only name available, use just the name\n displayValue = suggestion.fullData.name;\n }\n } else if (suggestion.displayName) {\n // For standard ontology suggestions, use displayName\n displayValue = suggestion.displayName;\n } else if (suggestion.value) {\n // Fallback to basic value\n displayValue = suggestion.value;\n } else {\n // Last resort\n displayValue = String(suggestion);\n }\n\n this.editForm.get('value')?.setValue(displayValue);\n this.editForm.get('value')?.markAsTouched();\n }\n };\n\n onSearchTypeChange(type: 'icontains' | 'istartswith'): void {\n this.searchType.set(type);\n }\n\n clearValue(): void {\n this.editForm.get('value')?.setValue('');\n this.editForm.get('value')?.markAsTouched();\n this.selectedFavorite.set(null); // Clear selected favorite when manually clearing\n }\n\n // Favorite options methods\n loadFavoriteOptions(): void {\n if (!this.config?.columnName || !this.config?.columnType) return;\n\n this.isLoadingFavorites.set(true);\n\n // Build base query parameters for column name\n const baseQueryParams = {\n name: this.config.columnName,\n limit: 10\n };\n\n // Load user favorites\n const currentUser = this.currentUser();\n if (currentUser?.id) {\n this.favouriteMetadataOptionService.getFavouriteMetadataOptions({\n ...baseQueryParams,\n userId: currentUser.id\n }).subscribe({\n next: (response) => {\n this.userFavorites.set(response.results);\n },\n error: () => this.userFavorites.set([])\n });\n }\n\n // Load lab group favorites - load for first lab group if user has any\n const userLabGroups = this.userLabGroups();\n if (userLabGroups.length > 0) {\n this.favouriteMetadataOptionService.getFavouriteMetadataOptions({\n ...baseQueryParams,\n labGroupId: userLabGroups[0] // Use first lab group for now\n }).subscribe({\n next: (response) => {\n this.labGroupFavorites.set(response.results);\n },\n error: () => this.labGroupFavorites.set([])\n });\n } else {\n this.labGroupFavorites.set([]);\n }\n\n // Load global favorites\n this.favouriteMetadataOptionService.getFavouriteMetadataOptions({\n ...baseQueryParams,\n isGlobal: true\n }).subscribe({\n next: (response) => {\n this.globalFavorites.set(response.results);\n this.isLoadingFavorites.set(false);\n // Set initial active tab based on available favorites\n this.setInitialActiveFavoritesTab();\n },\n error: () => {\n this.globalFavorites.set([]);\n this.isLoadingFavorites.set(false);\n // Set initial active tab based on available favorites\n this.setInitialActiveFavoritesTab();\n }\n });\n }\n\n selectFavorite(favorite: FavouriteMetadataOption): void {\n const favoriteValue = favorite.value || '';\n\n // Set the form value\n this.editForm.get('value')?.setValue(favoriteValue);\n this.editForm.get('value')?.markAsTouched();\n this.selectedFavorite.set(favorite);\n\n if (this.showSpecialInput() && this.specialSyntaxType()) {\n this.specialInputValue.set(favoriteValue);\n }\n\n if (favorite.columnTemplate && favorite.columnTemplate !== this.config.templateId) {\n this.config.templateId = favorite.columnTemplate;\n }\n\n if (this.hasCustomDisplayValue(favorite)) {\n console.log(`Selected \"${favorite.displayValue}\" (value: ${favorite.value})`);\n }\n }\n\n onFavoriteSelected(event: Event, favoritesList: FavouriteMetadataOption[]): void {\n const selectElement = event.target as HTMLSelectElement;\n const favoriteId = selectElement.value;\n\n if (!favoriteId) {\n return; // No selection made\n }\n\n const selectedFavorite = favoritesList.find(fav => fav.id?.toString() === favoriteId);\n if (selectedFavorite) {\n this.selectFavorite(selectedFavorite);\n }\n }\n\n setActiveFavoritesTab(tab: 'user' | 'lab_group' | 'global'): void {\n this.activeFavoritesTab = tab;\n }\n\n setInitialActiveFavoritesTab(): void {\n // Set the first available tab as active\n if (this.userFavorites().length > 0) {\n this.activeFavoritesTab = 'user';\n } else if (this.labGroupFavorites().length > 0) {\n this.activeFavoritesTab = 'lab_group';\n } else if (this.globalFavorites().length > 0) {\n this.activeFavoritesTab = 'global';\n }\n }\n\n addToFavorites(scope: 'user' | 'lab_group' | 'global' = 'user'): void {\n const value = this.editForm.get('value')?.value;\n if (!value || !this.config?.columnName || !this.config?.columnType) return;\n\n const newFavorite: FavouriteMetadataOptionCreateRequest = {\n name: this.config.columnName,\n type: this.config.columnType,\n columnTemplate: this.config.templateId || undefined,\n value: value,\n displayValue: value,\n isGlobal: scope === 'global',\n user: scope === 'user' ? this.currentUser()?.id : undefined,\n labGroup: scope === 'lab_group' ? this.userLabGroups()[0] || undefined : undefined\n };\n\n this.favouriteMetadataOptionService.createFavouriteMetadataOption(newFavorite).subscribe({\n next: (created) => {\n // Add to appropriate list\n if (scope === 'user') {\n this.userFavorites.set([...this.userFavorites(), created]);\n } else if (scope === 'lab_group') {\n this.labGroupFavorites.set([...this.labGroupFavorites(), created]);\n } else {\n this.globalFavorites.set([...this.globalFavorites(), created]);\n }\n },\n error: (error) => {\n console.error('Error adding to favorites:', error);\n }\n });\n }\n\n get hasFavorites(): boolean {\n return this.userFavorites().length > 0 ||\n this.labGroupFavorites().length > 0 ||\n this.globalFavorites().length > 0;\n }\n\n getFavoriteDisplayValue(favorite: FavouriteMetadataOption): string {\n return favorite.displayValue || favorite.value || '';\n }\n\n getFavoriteTooltip(favorite: FavouriteMetadataOption): string {\n const displayValue = favorite.displayValue || favorite.value || '';\n const actualValue = favorite.value || '';\n\n if (favorite.displayValue && favorite.displayValue !== actualValue) {\n return `${displayValue}\\n\\nActual value: ${actualValue}`;\n }\n\n return displayValue;\n }\n\n hasCustomDisplayValue(favorite: FavouriteMetadataOption): boolean {\n return !!(favorite.displayValue &&\n favorite.displayValue !== favorite.value &&\n favorite.displayValue.trim() !== '');\n }\n\n getSelectedFavoriteInfo(): string {\n const selected = this.selectedFavorite();\n const currentValue = this.editForm.get('value')?.value;\n\n if (!selected || !currentValue || selected.value !== currentValue) {\n return '';\n }\n\n if (this.hasCustomDisplayValue(selected)) {\n return `Selected from favorite: \"${selected.displayValue}\"`;\n }\n\n return '';\n }\n\n loadUserLabGroups(): void {\n // Load user's lab groups\n this.labGroupService.getMyLabGroups({ limit: 10 }).subscribe({\n next: (response) => {\n const labGroupIds = response.results.map(group => group.id!);\n this.userLabGroups.set(labGroupIds);\n },\n error: (error) => {\n console.error('Error loading user lab groups:', error);\n this.userLabGroups.set([]);\n }\n });\n }\n\n // SDRF Special Syntax Methods\n onSpecialInputChange(value: string): void {\n this.specialInputValue.set(value);\n this.editForm.patchValue({ value });\n }\n\n toggleSpecialInput(): void {\n this.showSpecialInput.set(!this.showSpecialInput());\n\n if (!this.showSpecialInput()) {\n // Switching to normal input, sync the current value\n this.editForm.patchValue({ value: this.specialInputValue() });\n }\n }\n\n getSpecialInputTitle(): string {\n const syntaxType = this.specialSyntaxType();\n switch (syntaxType) {\n case 'age': return 'Age Format Editor';\n case 'modification': return 'Modification Parameters Editor';\n case 'cleavage': return 'Cleavage Agent Editor';\n case 'spiked_compound': return 'Spiked Compound Editor';\n default: return 'Special Format Editor';\n }\n }\n\n // Multi-sample editing methods\n get hasMultiSampleEdit(): boolean {\n return !!(this.config?.enableMultiSampleEdit && this.config?.sampleData && this.config.sampleData.length > 0);\n }\n\n get sampleData(): { index: number; value: string; sourceName?: string }[] {\n return this.config?.sampleData || [];\n }\n\n toggleSampleSelection(sampleIndex: number): void {\n const current = new Set(this.selectedSampleIndices());\n if (current.has(sampleIndex)) {\n current.delete(sampleIndex);\n } else {\n current.add(sampleIndex);\n }\n this.selectedSampleIndices.set(current);\n }\n\n selectAllSamples(): void {\n const allIndices = new Set(this.sampleData.map(s => s.index));\n this.selectedSampleIndices.set(allIndices);\n }\n\n clearSampleSelection(): void {\n this.selectedSampleIndices.set(new Set());\n }\n\n get selectedSampleCount(): number {\n return this.selectedSampleIndices().size;\n }\n\n get totalSampleCount(): number {\n return this.sampleData.length;\n }\n\n isSampleSelected(sampleIndex: number): boolean {\n return this.selectedSampleIndices().has(sampleIndex);\n }\n\n // Override the onSubmit method to handle multi-sample editing\n onSubmit(): void {\n if (this.editForm.valid) {\n this.isLoading.set(true);\n const rawValue = this.editForm.get('value')?.value || '';\n\n // If the form contains an object (ontology suggestion), format it properly\n let value: string;\n if (typeof rawValue === 'object' && rawValue !== null) {\n // For MS Unique Vocabularies, use SDRF formatting\n if (rawValue.ontologyType === OntologyType.MS_UNIQUE_VOCABULARIES && rawValue.fullData && rawValue.fullData.name) {\n if (rawValue.fullData.accession) {\n value = `NT=${rawValue.fullData.name};AC=${rawValue.fullData.accession}`;\n } else {\n value = rawValue.fullData.name;\n }\n } else {\n // For other ontology types, use the regular value\n value = rawValue.displayName || rawValue.value || String(rawValue);\n }\n } else {\n value = String(rawValue);\n }\n\n\n // If multi-sample editing is enabled and samples are selected, include the sample indices\n if (this.hasMultiSampleEdit && this.selectedSampleCount > 0) {\n const selectedIndices = Array.from(this.selectedSampleIndices());\n this.valueSaved.emit({ value, sampleIndices: selectedIndices });\n } else {\n this.valueSaved.emit(value);\n }\n }\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-pencil-square me-2\"></i>{{ title }}\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"onCancel()\"></button>\n</div>\n\n<div class=\"modal-body\">\n <div class=\"row\">\n <!-- Main Content -->\n <div [class]=\"hasMultiSampleEdit ? 'col-md-8' : 'col-12'\">\n <form [formGroup]=\"editForm\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Column Information -->\n <div class=\"mb-3\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Column Name:</small>\n <div class=\"fw-semibold\">{{ config.columnName }}</div>\n </div>\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Column Type:</small>\n <div><span class=\"badge bg-light text-dark\">{{ config.columnType }}</span></div>\n </div>\n </div>\n @if (hasOntologyType) {\n <div class=\"mt-2\">\n <small class=\"text-muted\">Ontology Type:</small>\n <div><span class=\"badge bg-info\">{{ ontologyTypeLabel }}</span></div>\n </div>\n }\n </div>\n\n <hr class=\"mb-4\">\n\n <!-- Favorite Options Section -->\n @if (hasFavorites && !isLoadingFavorites()) {\n <div class=\"mb-4\">\n <h6 class=\"text-muted mb-3\">\n <i class=\"bi bi-heart-fill me-2 text-danger\"></i>Recommended Values\n </h6>\n\n <!-- Favorites Navigation Tabs -->\n <ul ngbNav #favoritesNav=\"ngbNav\" [(activeId)]=\"activeFavoritesTab\" class=\"nav-tabs\">\n @if (userFavorites().length > 0) {\n <li [ngbNavItem]=\"'user'\">\n <button ngbNavLink>\n <i class=\"bi bi-person-fill me-1\"></i>Your Favorites\n <span class=\"badge bg-primary ms-1\">{{ userFavorites().length }}</span>\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-3\">\n <select \n class=\"form-select\" \n size=\"5\" \n (change)=\"onFavoriteSelected($event, userFavorites())\">\n <option value=\"\">Select a favorite value...</option>\n @for (favorite of userFavorites(); track favorite.id) {\n <option [value]=\"favorite.id\">\n {{ getFavoriteDisplayValue(favorite) }}\n @if (hasCustomDisplayValue(favorite)) { (Custom Display) }\n </option>\n }\n </select>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>Your personal favorite values for this column\n </div>\n </div>\n </ng-template>\n </li>\n }\n\n @if (labGroupFavorites().length > 0) {\n <li [ngbNavItem]=\"'lab_group'\">\n <button ngbNavLink>\n <i class=\"bi bi-people-fill me-1\"></i>Lab Group\n <span class=\"badge bg-info ms-1\">{{ labGroupFavorites().length }}</span>\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-3\">\n <select \n class=\"form-select\" \n size=\"5\" \n (change)=\"onFavoriteSelected($event, labGroupFavorites())\">\n <option value=\"\">Select a favorite value...</option>\n @for (favorite of labGroupFavorites(); track favorite.id) {\n <option [value]=\"favorite.id\">\n {{ getFavoriteDisplayValue(favorite) }}\n @if (hasCustomDisplayValue(favorite)) { (Custom Display) }\n </option>\n }\n </select>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>Favorite values shared by your lab group\n </div>\n </div>\n </ng-template>\n </li>\n }\n\n @if (globalFavorites().length > 0) {\n <li [ngbNavItem]=\"'global'\">\n <button ngbNavLink>\n <i class=\"bi bi-globe me-1\"></i>Global\n <span class=\"badge bg-success ms-1\">{{ globalFavorites().length }}</span>\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-3\">\n <select \n class=\"form-select\" \n size=\"5\" \n (change)=\"onFavoriteSelected($event, globalFavorites())\">\n <option value=\"\">Select a favorite value...</option>\n @for (favorite of globalFavorites(); track favorite.id) {\n <option [value]=\"favorite.id\">\n {{ getFavoriteDisplayValue(favorite) }}\n @if (hasCustomDisplayValue(favorite)) { (Custom Display) }\n </option>\n }\n </select>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>Globally recommended values for this column\n </div>\n </div>\n </ng-template>\n </li>\n }\n </ul>\n\n <div [ngbNavOutlet]=\"favoritesNav\" class=\"mt-3\"></div>\n\n <hr class=\"my-3\">\n </div>\n }\n\n @if (isLoadingFavorites()) {\n <div class=\"text-center mb-4\">\n <div class=\"spinner-border spinner-border-sm text-primary me-2\"></div>\n <small class=\"text-muted\">Loading favorite options...</small>\n </div>\n <hr class=\"my-3\">\n }\n\n <!-- Value Input Section -->\n <div class=\"mb-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <label for=\"metadataValue\" class=\"form-label mb-0\">\n Metadata Value\n @if (hasOntologyType) {\n <span class=\"badge bg-success ms-2\">\n <i class=\"bi bi-search me-1\"></i>Autocomplete Available\n </span>\n }\n @if (specialSyntaxType()) {\n <span class=\"badge bg-info ms-2\">\n <i class=\"bi bi-gear me-1\"></i>{{ getSpecialInputTitle() }}\n </span>\n }\n </label>\n\n @if (specialSyntaxType()) {\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"specialInputToggle\"\n [checked]=\"showSpecialInput()\"\n (change)=\"toggleSpecialInput()\">\n <label class=\"form-check-label small text-muted\" for=\"specialInputToggle\">\n Enhanced Editor\n </label>\n </div>\n }\n </div>\n\n <!-- Special SDRF Syntax Input Components -->\n @if (showSpecialInput() && specialSyntaxType()) {\n <div class=\"border rounded p-3 mb-3 bg-body-secondary\">\n <div class=\"mb-2\">\n <small class=\"text-muted fw-semibold\">\n <i class=\"bi bi-gear me-1\"></i>{{ getSpecialInputTitle() }}\n </small>\n </div>\n\n @switch (specialSyntaxType()) {\n @case ('age') {\n <ccv-sdrf-age-input\n [value]=\"specialInputValue()\"\n (valueChange)=\"onSpecialInputChange($event)\">\n </ccv-sdrf-age-input>\n }\n @case ('modification') {\n <ccv-sdrf-modification-input\n [value]=\"specialInputValue()\"\n [columnId]=\"config.columnId ?? null\"\n [templateId]=\"config.templateId ?? null\"\n (valueChange)=\"onSpecialInputChange($event)\">\n </ccv-sdrf-modification-input>\n }\n @case ('cleavage') {\n <ccv-sdrf-cleavage-input\n [value]=\"specialInputValue()\"\n [columnId]=\"config.columnId ?? null\"\n [templateId]=\"config.templateId ?? null\"\n (valueChange)=\"onSpecialInputChange($event)\">\n </ccv-sdrf-cleavage-input>\n }\n @case ('spiked_compound') {\n <ccv-sdrf-spiked-compound-input\n [value]=\"specialInputValue()\"\n (valueChange)=\"onSpecialInputChange($event)\">\n </ccv-sdrf-spiked-compound-input>\n }\n }\n\n <div class=\"form-text mt-2\">\n <i class=\"bi bi-info-circle me-1\"></i>\n Use the enhanced editor for structured input, or toggle off for manual text entry.\n </div>\n </div>\n }\n\n @if (hasOntologyType && !showSpecialInput()) {\n <!-- Search type selection for ontology -->\n <div class=\"mb-2\">\n <small class=\"text-muted d-block mb-1\">Search Mode:</small>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'icontains' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('icontains')\">\n <i class=\"bi bi-search me-1\"></i>Contains\n </button>\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'istartswith' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('istartswith')\">\n <i class=\"bi bi-arrow-right me-1\"></i>Starts with\n </button>\n </div>\n </div>\n\n <!-- Typeahead input for ontology suggestions -->\n <div class=\"input-group\">\n <input\n type=\"text\"\n class=\"form-control\"\n [class.border-success]=\"selectedFavorite() !== null\"\n id=\"metadataValue\"\n formControlName=\"value\"\n placeholder=\"Type to search ontology suggestions...\"\n [ngbTypeahead]=\"searchOntology\"\n [resultFormatter]=\"formatSuggestion\"\n [inputFormatter]=\"inputFormatter\"\n (selectItem)=\"onSuggestionSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\">\n @if (isLoadingSuggestions()) {\n <span class=\"input-group-text\">\n <div class=\"spinner-border spinner-border-sm\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </span>\n } @else {\n <span class=\"input-group-text\">\n <i class=\"bi bi-search text-muted\"></i>\n </span>\n }\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"clearValue()\"\n title=\"Clear value\">\n <i class=\"bi bi-x\"></i>\n </button>\n </div>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>\n Search {{ searchType() === 'icontains' ? 'contains' : 'starts with' }} for {{ ontologyTypeLabel }} ontology\n </div>\n } @else if (!showSpecialInput()) {\n <!-- Regular input when no ontology type or special input is disabled -->\n <div class=\"input-group\">\n <input\n type=\"text\"\n class=\"form-control\"\n [class.border-success]=\"selectedFavorite() !== null\"\n id=\"metadataValue\"\n formControlName=\"value\"\n placeholder=\"Enter metadata value\">\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"clearValue()\"\n title=\"Clear value\">\n <i class=\"bi bi-x\"></i>\n </button>\n </div>\n <div class=\"form-text text-muted\">\n @if (specialSyntaxType()) {\n Manual text entry mode. Use the Enhanced Editor toggle for structured {{ specialSyntaxType() }} input.\n } @else {\n Enter the value manually (no ontology suggestions available for this column type)\n }\n </div>\n }\n </div>\n\n <!-- Character count and value info -->\n <div class=\"mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <small class=\"text-muted\">\n Characters: {{ editForm.get('value')?.value?.length || 0 }}/500\n </small>\n @if (getSelectedFavoriteInfo()) {\n <small class=\"text-info\">\n <i class=\"bi bi-info-circle me-1\"></i>{{ getSelectedFavoriteInfo() }}\n </small>\n }\n </div>\n </div>\n\n </form>\n </div>\n\n <!-- Sample Selection Panel -->\n @if (hasMultiSampleEdit) {\n <div class=\"col-md-4\">\n <div class=\"border-start ps-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <h6 class=\"mb-0 text-muted\">\n <i class=\"bi bi-list-check me-1\"></i>Apply to Samples\n </h6>\n <span class=\"badge bg-primary\">\n {{ selectedSampleCount }}/{{ totalSampleCount }}\n </span>\n </div>\n\n <!-- Select All/Clear All Controls -->\n <div class=\"d-flex gap-1 mb-3\">\n <button \n type=\"button\" \n class=\"btn btn-outline-primary btn-sm flex-fill\"\n (click)=\"selectAllSamples()\"\n [disabled]=\"selectedSampleCount === totalSampleCount\">\n <i class=\"bi bi-check-all me-1\"></i>All\n </button>\n <button \n type=\"button\" \n class=\"btn btn-outline-secondary btn-sm flex-fill\"\n (click)=\"clearSampleSelection()\"\n [disabled]=\"selectedSampleCount === 0\">\n <i class=\"bi bi-x me-1\"></i>Clear\n </button>\n </div>\n\n <!-- Sample List -->\n <div class=\"sample-list\" style=\"max-height: 400px; overflow-y: auto;\">\n @for (sample of sampleData; track sample.index) {\n <div class=\"form-check d-flex align-items-center mb-2 p-2 rounded border-bottom\">\n <input \n class=\"form-check-input me-2\" \n type=\"checkbox\" \n [id]=\"'sample-' + sample.index\"\n [checked]=\"isSampleSelected(sample.index)\"\n (change)=\"toggleSampleSelection(sample.index)\">\n <label \n [for]=\"'sample-' + sample.index\" \n class=\"form-check-label flex-grow-1 cursor-pointer\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div>\n <div class=\"fw-semibold\">Sample {{ sample.index }}</div>\n @if (sample.sourceName) {\n <small class=\"text-muted\">{{ sample.sourceName }}</small>\n }\n </div>\n <div class=\"text-end\">\n <small class=\"text-muted\">Current:</small>\n <div class=\"small fw-mono\" [title]=\"sample.value || ''\">\n {{ (sample.value && sample.value.length > 15) ? (sample.value | slice:0:15) + '...' : (sample.value || '-') }}\n </div>\n </div>\n </div>\n </label>\n </div>\n }\n </div>\n\n @if (selectedSampleCount > 0) {\n <div class=\"alert alert-info mt-3 p-2\">\n <small>\n <i class=\"bi bi-info-circle me-1\"></i>\n The value will be applied to {{ selectedSampleCount }} selected sample{{ selectedSampleCount !== 1 ? 's' : '' }}.\n </small>\n </div>\n }\n </div>\n </div>\n }\n </div>\n</div>\n\n<div class=\"modal-footer\">\n <div class=\"me-auto\">\n @if (editForm.get('value')?.value && !isLoading() && !isFromFavoriteManagement) {\n <div class=\"btn-group dropup\" ngbDropdown>\n <button\n type=\"button\"\n class=\"btn btn-outline-warning btn-sm dropdown-toggle\"\n ngbDropdownToggle>\n <i class=\"bi bi-heart me-1\"></i>Add to Favorites\n </button>\n <div class=\"dropdown-menu\" ngbDropdownMenu>\n <button\n type=\"button\"\n class=\"dropdown-item\"\n (click)=\"addToFavorites('user')\">\n <i class=\"bi bi-person me-2\"></i>Personal Favorite\n </button>\n <button\n type=\"button\"\n class=\"dropdown-item\"\n (click)=\"addToFavorites('lab_group')\">\n <i class=\"bi bi-people me-2\"></i>Lab Group Favorite\n </button>\n <button\n type=\"button\"\n class=\"dropdown-item\"\n (click)=\"addToFavorites('global')\">\n <i class=\"bi bi-globe me-2\"></i>Global Recommendation\n </button>\n </div>\n </div>\n }\n </div>\n\n <div class=\"d-flex gap-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"onCancel()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"onSubmit()\"\n [disabled]=\"editForm.invalid || isLoading()\">\n @if (isLoading()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-check-circle me-1\"></i>\n Save Value\n </button>\n </div>\n</div>\n","import { Component, inject, signal, computed, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\nimport { LabGroup, LabGroupService } from '@noatgnu/cupcake-core';\n\nexport interface ExcelExportOptions {\n includeLabGroups: 'none' | 'selected' | 'all';\n selectedLabGroupIds: number[];\n includePools: boolean;\n}\n\n@Component({\n selector: 'ccv-excel-export-modal',\n standalone: true,\n imports: [CommonModule, FormsModule],\n templateUrl: './excel-export-modal.html',\n styleUrl: './excel-export-modal.scss'\n})\nexport class ExcelExportModalComponent implements OnInit {\n activeModal = inject(NgbActiveModal);\n labGroupService = inject(LabGroupService);\n\n // State\n isLoadingLabGroups = signal(false);\n availableLabGroups = signal<LabGroup[]>([]);\n \n // Form data\n includeLabGroups = signal<'none' | 'selected' | 'all'>('none');\n selectedLabGroupIds = signal<number[]>([]);\n includePools = signal(true);\n\n // Computed\n showLabGroupSelection = computed(() => this.includeLabGroups() === 'selected');\n canConfirm = computed(() => {\n if (this.includeLabGroups() === 'selected') {\n return this.selectedLabGroupIds().length > 0;\n }\n return true;\n });\n\n ngOnInit(): void {\n this.loadLabGroups();\n }\n\n private loadLabGroups(): void {\n this.isLoadingLabGroups.set(true);\n this.labGroupService.getMyLabGroups().subscribe({\n next: (response) => {\n this.availableLabGroups.set(response.results || []);\n this.isLoadingLabGroups.set(false);\n },\n error: (error) => {\n console.error('Error loading lab groups:', error);\n this.isLoadingLabGroups.set(false);\n }\n });\n }\n\n onLabGroupToggle(labGroupId: number, checked: boolean): void {\n const currentIds = this.selectedLabGroupIds();\n if (checked) {\n if (!currentIds.includes(labGroupId)) {\n this.selectedLabGroupIds.set([...currentIds, labGroupId]);\n }\n } else {\n this.selectedLabGroupIds.set(currentIds.filter(id => id !== labGroupId));\n }\n }\n\n isLabGroupSelected(labGroupId: number): boolean {\n return this.selectedLabGroupIds().includes(labGroupId);\n }\n\n onIncludeLabGroupsChange(value: 'none' | 'selected' | 'all'): void {\n this.includeLabGroups.set(value);\n if (value !== 'selected') {\n this.selectedLabGroupIds.set([]);\n }\n }\n\n selectAllLabGroups(): void {\n const allIds = this.availableLabGroups().map(lg => lg.id);\n this.selectedLabGroupIds.set(allIds);\n }\n\n deselectAllLabGroups(): void {\n this.selectedLabGroupIds.set([]);\n }\n\n confirm(): void {\n const options: ExcelExportOptions = {\n includeLabGroups: this.includeLabGroups(),\n selectedLabGroupIds: this.selectedLabGroupIds(),\n includePools: this.includePools()\n };\n this.activeModal.close(options);\n }\n\n cancel(): void {\n this.activeModal.dismiss();\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">Excel Export Options</h4>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"cancel()\"></button>\n</div>\n\n<div class=\"modal-body\">\n <!-- Lab Groups Section -->\n <div class=\"mb-4\">\n <h6 class=\"fw-semibold mb-3\">\n <i class=\"bi bi-people me-2\"></i>Lab Group Recommendations\n </h6>\n \n <div class=\"form-check mb-2\">\n <input \n class=\"form-check-input\" \n type=\"radio\" \n name=\"includeLabGroups\"\n id=\"labGroups_none\"\n [checked]=\"includeLabGroups() === 'none'\"\n (change)=\"onIncludeLabGroupsChange('none')\">\n <label class=\"form-check-label\" for=\"labGroups_none\">\n <strong>None</strong> - Only user-specific and global recommendations\n </label>\n </div>\n\n <div class=\"form-check mb-2\">\n <input \n class=\"form-check-input\" \n type=\"radio\" \n name=\"includeLabGroups\"\n id=\"labGroups_selected\"\n [checked]=\"includeLabGroups() === 'selected'\"\n (change)=\"onIncludeLabGroupsChange('selected')\">\n <label class=\"form-check-label\" for=\"labGroups_selected\">\n <strong>Selected groups</strong> - Choose specific lab groups\n </label>\n </div>\n\n <div class=\"form-check mb-3\">\n <input \n class=\"form-check-input\" \n type=\"radio\" \n name=\"includeLabGroups\"\n id=\"labGroups_all\"\n [checked]=\"includeLabGroups() === 'all'\"\n (change)=\"onIncludeLabGroupsChange('all')\">\n <label class=\"form-check-label\" for=\"labGroups_all\">\n <strong>All groups</strong> - Include all available lab group recommendations\n </label>\n </div>\n\n <!-- Lab Group Selection -->\n @if (showLabGroupSelection()) {\n <div class=\"border rounded p-3 bg-light\">\n @if (isLoadingLabGroups()) {\n <div class=\"text-center\">\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></div>\n Loading lab groups...\n </div>\n } @else if (availableLabGroups().length === 0) {\n <div class=\"text-muted text-center\">\n <i class=\"bi bi-info-circle me-2\"></i>\n No lab groups available\n </div>\n } @else {\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <h6 class=\"mb-0\">Select Lab Groups:</h6>\n <div class=\"btn-group btn-group-sm\">\n <button \n type=\"button\" \n class=\"btn btn-outline-secondary btn-sm\"\n (click)=\"selectAllLabGroups()\"\n [disabled]=\"selectedLabGroupIds().length === availableLabGroups().length\">\n Select All\n </button>\n <button \n type=\"button\" \n class=\"btn btn-outline-secondary btn-sm\"\n (click)=\"deselectAllLabGroups()\"\n [disabled]=\"selectedLabGroupIds().length === 0\">\n Clear All\n </button>\n </div>\n </div>\n\n <div class=\"row\">\n @for (labGroup of availableLabGroups(); track labGroup.id) {\n <div class=\"col-md-6 mb-2\">\n <div class=\"form-check\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n [id]=\"'labGroup_' + labGroup.id\"\n [checked]=\"isLabGroupSelected(labGroup.id)\"\n (change)=\"onLabGroupToggle(labGroup.id, $event.target.checked)\">\n <label class=\"form-check-label\" [for]=\"'labGroup_' + labGroup.id\">\n {{ labGroup.name }}\n @if (labGroup.description) {\n <small class=\"text-muted d-block\">{{ labGroup.description }}</small>\n }\n </label>\n </div>\n </div>\n }\n </div>\n\n @if (selectedLabGroupIds().length > 0) {\n <div class=\"mt-2\">\n <small class=\"text-success\">\n <i class=\"bi bi-check-circle me-1\"></i>\n {{ selectedLabGroupIds().length }} group{{ selectedLabGroupIds().length > 1 ? 's' : '' }} selected\n </small>\n </div>\n }\n }\n </div>\n }\n </div>\n\n <!-- Pools Section -->\n <div class=\"mb-4\">\n <h6 class=\"fw-semibold mb-3\">\n <i class=\"bi bi-collection me-2\"></i>Sample Pools\n </h6>\n <div class=\"form-check\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n id=\"includePools\"\n [checked]=\"includePools()\"\n (change)=\"includePools.set($event.target.checked)\">\n <label class=\"form-check-label\" for=\"includePools\">\n Include sample pools in export\n </label>\n <small class=\"form-text text-muted d-block mt-1\">\n Creates additional worksheets with pool information and mappings\n </small>\n </div>\n </div>\n\n <!-- Summary -->\n <div class=\"alert alert-info\">\n <h6 class=\"alert-heading\">\n <i class=\"bi bi-info-circle me-2\"></i>Export Summary\n </h6>\n <ul class=\"mb-0\">\n <li>\n <strong>Lab Groups:</strong>\n @switch (includeLabGroups()) {\n @case ('none') { None - only user and global recommendations }\n @case ('selected') { \n @if (selectedLabGroupIds().length > 0) {\n {{ selectedLabGroupIds().length }} selected group{{ selectedLabGroupIds().length > 1 ? 's' : '' }}\n } @else {\n No groups selected\n }\n }\n @case ('all') { All available lab groups }\n }\n </li>\n <li><strong>Sample Pools:</strong> {{ includePools() ? 'Included' : 'Excluded' }}</li>\n </ul>\n </div>\n</div>\n\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"cancel()\">\n Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn btn-primary\"\n [disabled]=\"!canConfirm()\"\n (click)=\"confirm()\">\n <i class=\"bi bi-file-earmark-spreadsheet me-2\"></i>\n Export Excel\n </button>\n</div>\n","import { Component, inject, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';\n\nexport interface ValidationResults {\n success: boolean;\n metadata_table_id: number;\n metadata_table_name: string;\n validation_timestamp: string;\n errors: string[];\n warnings: string[];\n}\n\n@Component({\n selector: 'ccv-validation-results-modal',\n imports: [CommonModule, NgbModule],\n templateUrl: './validation-results-modal.html',\n styleUrl: './validation-results-modal.scss'\n})\nexport class ValidationResultsModal {\n @Input() results?: ValidationResults;\n \n activeModal = inject(NgbActiveModal);\n \n formatTimestamp(timestamp: string): string {\n try {\n const date = new Date(timestamp);\n return date.toLocaleString();\n } catch (error) {\n return timestamp;\n }\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n @if (results?.success) {\n <i class=\"fa fa-check-circle me-2 text-success\"></i>\n Validation Passed\n } @else {\n <i class=\"fa fa-exclamation-triangle me-2 text-danger\"></i>\n Validation Failed\n }\n </h4>\n <button \n type=\"button\" \n class=\"btn-close\" \n aria-label=\"Close\"\n (click)=\"activeModal.dismiss()\">\n </button>\n</div>\n\n<div class=\"modal-body\">\n @if (results) {\n <div class=\"mb-3\">\n <h6 class=\"mb-2\">\n <i class=\"fa fa-table me-2 text-primary\"></i>\n {{ results.metadata_table_name }}\n </h6>\n <small class=\"text-muted\">\n <i class=\"fa fa-clock me-1\"></i>\n Validated: {{ formatTimestamp(results.validation_timestamp) }}\n </small>\n </div>\n\n @if (results.success) {\n <!-- Success message -->\n <div class=\"alert alert-success\">\n <i class=\"fa fa-check-circle me-2\"></i>\n <strong>Validation Successful!</strong>\n <p class=\"mb-0 mt-2\">\n Your metadata table complies with SDRF format standards and contains no validation errors.\n </p>\n </div>\n } @else {\n <!-- Validation failed - show errors and warnings -->\n <div class=\"alert alert-danger mb-3\">\n <i class=\"fa fa-exclamation-triangle me-2\"></i>\n <strong>Validation Failed</strong>\n <p class=\"mb-0 mt-2\">\n Your metadata table contains validation issues that need to be resolved.\n </p>\n </div>\n\n <!-- Summary -->\n <div class=\"row mb-3\">\n <div class=\"col-md-6\">\n <div class=\"card border-danger\">\n <div class=\"card-body text-center\">\n <h5 class=\"card-title text-danger\">{{ results.errors.length }}</h5>\n <p class=\"card-text\">Error{{ results.errors.length !== 1 ? 's' : '' }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"card border-warning\">\n <div class=\"card-body text-center\">\n <h5 class=\"card-title text-warning\">{{ results.warnings.length }}</h5>\n <p class=\"card-text\">Warning{{ results.warnings.length !== 1 ? 's' : '' }}</p>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Errors -->\n @if (results.errors.length > 0) {\n <div class=\"mb-3\">\n <h6 class=\"text-danger\">\n <i class=\"fa fa-times-circle me-2\"></i>\n Errors ({{ results.errors.length }})\n </h6>\n <div class=\"validation-issues\">\n @for (error of results.errors; track $index) {\n <div class=\"alert alert-danger py-2 px-3\">\n <i class=\"fa fa-times-circle me-2\"></i>\n {{ error }}\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Warnings -->\n @if (results.warnings.length > 0) {\n <div class=\"mb-3\">\n <h6 class=\"text-warning\">\n <i class=\"fa fa-exclamation-triangle me-2\"></i>\n Warnings ({{ results.warnings.length }})\n </h6>\n <div class=\"validation-issues\">\n @for (warning of results.warnings; track $index) {\n <div class=\"alert alert-warning py-2 px-3\">\n <i class=\"fa fa-exclamation-triangle me-2\"></i>\n {{ warning }}\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Help text -->\n <div class=\"alert alert-info\">\n <i class=\"fa fa-info-circle me-2\"></i>\n <strong>Need Help?</strong>\n <ul class=\"mb-0 mt-2\">\n <li>Errors must be fixed before your metadata can be exported as valid SDRF</li>\n <li>Warnings indicate potential issues but don't prevent SDRF export</li>\n <li>Check the <a href=\"/help/sdrf-validation\" target=\"_blank\">SDRF validation guide</a> for detailed explanations</li>\n </ul>\n </div>\n }\n }\n</div>\n\n<div class=\"modal-footer\">\n <button \n type=\"button\" \n class=\"btn btn-secondary\"\n (click)=\"activeModal.dismiss()\">\n Close\n </button>\n</div>\n","import { Injectable, OnDestroy, inject } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\r\nimport { takeUntil, filter, map, tap } from 'rxjs/operators';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport {\r\n AsyncTaskStatus,\r\n AsyncTaskCreateResponse,\r\n MetadataImportRequest,\r\n MetadataExportRequest,\r\n BulkExportRequest,\r\n BulkExcelExportRequest,\r\n MetadataValidationRequest\r\n} from '../models';\r\nimport {\r\n AsyncTaskService as LibraryAsyncTaskService,\r\n AsyncExportService,\r\n AsyncImportService,\r\n AsyncValidationService,\r\n Websocket,\r\n ElectronService\r\n} from '../services';\r\nimport { ToastService } from '@noatgnu/cupcake-core';\r\nimport { ValidationResultsModal, ValidationResults } from './validation-results-modal/validation-results-modal';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AsyncTaskUIService implements OnDestroy {\r\n private destroy$ = new Subject<void>();\r\n private tasksSubject = new BehaviorSubject<AsyncTaskStatus[]>([]);\r\n private isSubscribed = false;\r\n private metadataTableRefreshSubject = new Subject<number>();\r\n private taskCompletedSubject = new Subject<AsyncTaskStatus>();\r\n private exportTaskCompletedSubject = new Subject<AsyncTaskStatus>();\r\n\r\n private readonly sessionId = this.generateSessionId();\r\n private initiatedTasks = new Set<string>();\r\n\r\n private libraryAsyncTaskService = inject(LibraryAsyncTaskService);\r\n private asyncExportService = inject(AsyncExportService);\r\n private asyncImportService = inject(AsyncImportService);\r\n private asyncValidationService = inject(AsyncValidationService);\r\n private toastService = inject(ToastService);\r\n private websocket = inject(Websocket);\r\n private modalService = inject(NgbModal);\r\n private electronService = inject(ElectronService);\r\n\r\n public tasks$ = this.tasksSubject.asObservable();\r\n public activeTasks$ = this.tasks$.pipe(\r\n map(tasks => {\r\n const taskArray = Array.isArray(tasks) ? tasks : [];\r\n return taskArray.filter(task => task.status === 'QUEUED' || task.status === 'STARTED');\r\n })\r\n );\r\n\r\n public metadataTableRefresh$ = this.metadataTableRefreshSubject.asObservable();\r\n public taskCompleted$ = this.taskCompletedSubject.asObservable();\r\n public exportTaskCompleted$ = this.exportTaskCompletedSubject.asObservable();\r\n\r\n constructor() {\r\n this.initializeService();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n private initializeService(): void {\r\n this.startRealtimeUpdates();\r\n }\r\n\r\n startRealtimeUpdates(): void {\r\n if (this.isSubscribed) {\r\n return;\r\n }\r\n\r\n this.isSubscribed = true;\r\n\r\n if (!this.websocket.connectionState$() || this.websocket.connectionState$() === 'disconnected') {\r\n this.websocket.connect();\r\n }\r\n\r\n this.websocket.isConnected$.pipe(\r\n takeUntil(this.destroy$),\r\n filter(connected => connected)\r\n ).subscribe(() => {\r\n this.websocket.subscribe('async_task_updates');\r\n });\r\n\r\n this.websocket.filterMessages('async_task.update').pipe(\r\n takeUntil(this.destroy$)\r\n ).subscribe((message: any) => {\r\n this.handleTaskUpdate(message);\r\n });\r\n\r\n this.getTasks().subscribe({\r\n next: tasks => {\r\n const taskArray = Array.isArray(tasks) ? tasks : [];\r\n this.tasksSubject.next(taskArray);\r\n },\r\n error: error => {\r\n console.error('Error loading initial tasks:', error);\r\n }\r\n });\r\n }\r\n\r\n stopRealtimeUpdates(): void {\r\n this.isSubscribed = false;\r\n this.destroy$.next();\r\n }\r\n\r\n getTasks(): Observable<AsyncTaskStatus[]> {\r\n return this.libraryAsyncTaskService.getAsyncTasks().pipe(\r\n map(response => response.results || [])\r\n );\r\n }\r\n\r\n getTask(taskId: string): Observable<AsyncTaskStatus> {\r\n return this.libraryAsyncTaskService.getAsyncTask(taskId);\r\n }\r\n\r\n cancelTask(taskId: string): Observable<{message: string}> {\r\n return this.libraryAsyncTaskService.cancelTask(taskId);\r\n }\r\n\r\n private generateSessionId(): string {\r\n return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n private isTaskInitiatedByThisTab(taskId: string): boolean {\r\n return this.initiatedTasks.has(taskId);\r\n }\r\n\r\n /**\r\n * Mark a task as initiated by this tab for tracking purposes\r\n */\r\n monitorTask(taskId: string): void {\r\n this.initiatedTasks.add(taskId);\r\n }\r\n\r\n queueExcelExport(request: MetadataExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncExportService.excelTemplate(request).pipe(\r\n tap(response => {\r\n this.initiatedTasks.add(response.taskId);\r\n })\r\n );\r\n }\r\n\r\n queueSdrfExport(request: MetadataExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncExportService.sdrfFile(request).pipe(\r\n tap(response => {\r\n this.initiatedTasks.add(response.taskId);\r\n })\r\n );\r\n }\r\n\r\n queueSdrfImport(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncImportService.sdrfFile(request).pipe(\r\n tap(response => {\r\n this.initiatedTasks.add(response.taskId);\r\n })\r\n );\r\n }\r\n\r\n queueExcelImport(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncImportService.excelFile(request);\r\n }\r\n\r\n queueBulkSdrfExport(request: BulkExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncExportService.multipleSdrfFiles(request).pipe(\r\n tap(response => {\r\n this.initiatedTasks.add(response.taskId);\r\n })\r\n );\r\n }\r\n\r\n queueBulkExcelExport(request: BulkExcelExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncExportService.multipleExcelTemplates(request);\r\n }\r\n\r\n downloadTaskResult(taskId: string): void {\r\n this.libraryAsyncTaskService.getDownloadUrl(taskId).subscribe({\r\n next: (response) => {\r\n console.log('Download task result - checking Electron service:', {\r\n isElectron: this.electronService.isElectron,\r\n downloadUrl: response.downloadUrl\r\n });\r\n\r\n if (this.electronService.isElectron) {\r\n console.log('Using Electron download for:', response.downloadUrl);\r\n this.electronService.downloadFile(response.downloadUrl)\r\n .then((filePath: string) => {\r\n console.log('Electron download successful:', filePath);\r\n this.toastService.success(`File downloaded to: ${filePath}`);\r\n })\r\n .catch((error: any) => {\r\n console.error('Error downloading file with Electron:', error);\r\n this.toastService.error('Failed to download file');\r\n });\r\n } else {\r\n console.log('Using browser fallback for:', response.downloadUrl);\r\n window.open(response.downloadUrl, '_blank');\r\n }\r\n },\r\n error: (error) => {\r\n console.error('Error getting download URL:', error);\r\n this.toastService.error('Failed to get download URL');\r\n }\r\n });\r\n }\r\n\r\n validateMetadataTable(validationRequest: MetadataValidationRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncValidationService.metadataTable(validationRequest).pipe(\r\n tap(response => {\r\n this.initiatedTasks.add(response.taskId);\r\n })\r\n );\r\n }\r\n\r\n private handleTaskUpdate(message: any): void {\r\n const taskId = message.task_id;\r\n const currentTasks = this.tasksSubject.value;\r\n const existingTaskIndex = currentTasks.findIndex(t => t.id === taskId);\r\n\r\n if (existingTaskIndex >= 0) {\r\n const existingTask = currentTasks[existingTaskIndex];\r\n const wasRunning = existingTask.status === 'QUEUED' || existingTask.status === 'STARTED';\r\n\r\n const updatedTask: AsyncTaskStatus = {\r\n ...existingTask,\r\n status: message.status,\r\n progressPercentage: message.progress_percentage || existingTask.progressPercentage,\r\n progressDescription: message.progress_description || existingTask.progressDescription,\r\n errorMessage: message.error_message || existingTask.errorMessage,\r\n result: message.result || existingTask.result,\r\n };\r\n\r\n const updatedTasks = [...currentTasks];\r\n updatedTasks[existingTaskIndex] = updatedTask;\r\n this.tasksSubject.next(updatedTasks);\r\n\r\n if (message.status === 'STARTED') {\r\n this.showTaskProgressNotification(updatedTask, existingTask);\r\n }\r\n\r\n if (wasRunning && (message.status === 'SUCCESS' || message.status === 'FAILURE' || message.status === 'CANCELLED')) {\r\n this.showTaskCompletionNotification(updatedTask);\r\n \r\n const isTaskFromThisTab = this.isTaskInitiatedByThisTab(updatedTask.id);\r\n this.taskCompletedSubject.next(updatedTask);\r\n\r\n if (message.status === 'SUCCESS') {\r\n if (this.isImportTask(updatedTask.taskType) && updatedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(updatedTask.metadataTable);\r\n }\r\n\r\n if (this.isExportTask(updatedTask.taskType)) {\r\n this.exportTaskCompletedSubject.next(updatedTask);\r\n this.handleExportTaskCompletion(updatedTask);\r\n }\r\n\r\n if (updatedTask.taskType === 'VALIDATE_TABLE' && updatedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(updatedTask.metadataTable);\r\n }\r\n\r\n if ((updatedTask.taskType === 'REORDER_TABLE_COLUMNS') && updatedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(updatedTask.metadataTable);\r\n }\r\n }\r\n\r\n if (isTaskFromThisTab) {\r\n this.initiatedTasks.delete(updatedTask.id);\r\n }\r\n }\r\n } else {\r\n this.getTasks().subscribe(tasks => {\r\n const taskArray = Array.isArray(tasks) ? tasks : [];\r\n this.tasksSubject.next(taskArray);\r\n\r\n const refreshedTask = taskArray.find(t => t.id === taskId);\r\n if (refreshedTask && (message.status === 'SUCCESS' || message.status === 'FAILURE' || message.status === 'CANCELLED')) {\r\n this.showTaskCompletionNotification(refreshedTask);\r\n \r\n const isTaskFromThisTab = this.isTaskInitiatedByThisTab(refreshedTask.id);\r\n this.taskCompletedSubject.next(refreshedTask);\r\n\r\n if (message.status === 'SUCCESS') {\r\n if (this.isImportTask(refreshedTask.taskType) && refreshedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(refreshedTask.metadataTable);\r\n }\r\n\r\n if (this.isExportTask(refreshedTask.taskType)) {\r\n this.exportTaskCompletedSubject.next(refreshedTask);\r\n this.handleExportTaskCompletion(refreshedTask);\r\n }\r\n\r\n if (refreshedTask.taskType === 'VALIDATE_TABLE' && refreshedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(refreshedTask.metadataTable);\r\n }\r\n\r\n if ((refreshedTask.taskType === 'REORDER_TABLE_COLUMNS') && refreshedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(refreshedTask.metadataTable);\r\n }\r\n }\r\n\r\n if (isTaskFromThisTab) {\r\n this.initiatedTasks.delete(refreshedTask.id);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n private showTaskProgressNotification(updatedTask: AsyncTaskStatus, previousTask: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(updatedTask.taskType);\r\n const tableName = updatedTask.metadataTableName ? ` for \"${updatedTask.metadataTableName}\"` : '';\r\n\r\n const progressChanged = Math.floor((updatedTask.progressPercentage || 0) / 25) !== Math.floor((previousTask.progressPercentage || 0) / 25);\r\n const descriptionChanged = updatedTask.progressDescription !== previousTask.progressDescription;\r\n\r\n if (progressChanged || (descriptionChanged && updatedTask.progressDescription)) {\r\n let message = `${taskName}${tableName}`;\r\n if (updatedTask.progressPercentage && updatedTask.progressPercentage > 0) {\r\n message += ` (${updatedTask.progressPercentage}%)`;\r\n }\r\n if (updatedTask.progressDescription) {\r\n message += `: ${updatedTask.progressDescription}`;\r\n }\r\n\r\n this.toastService.info(message, 3000);\r\n }\r\n }\r\n\r\n private showTaskCompletionNotification(task: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(task.taskType);\r\n const tableName = task.metadataTableName ? ` for \"${task.metadataTableName}\"` : '';\r\n\r\n if (task.taskType === 'VALIDATE_TABLE') {\r\n this.handleValidationTaskCompletion(task);\r\n return;\r\n }\r\n\r\n if (task.taskType === 'IMPORT_SDRF' || task.taskType === 'IMPORT_EXCEL') {\r\n this.handleImportTaskCompletion(task);\r\n return;\r\n }\r\n\r\n if (task.taskType === 'REORDER_TABLE_COLUMNS' || task.taskType === 'REORDER_TEMPLATE_COLUMNS') {\r\n this.handleReorderTaskCompletion(task);\r\n return;\r\n }\r\n\r\n const progressInfo = task.progressPercentage && task.progressPercentage > 0 ? ` (${task.progressPercentage}%)` : '';\r\n const progressDesc = task.progressDescription ? `: ${task.progressDescription}` : '';\r\n\r\n switch (task.status) {\r\n case 'SUCCESS':\r\n this.toastService.success(\r\n `Task Completed: ${taskName}${tableName}${progressInfo} completed successfully${progressDesc}`\r\n );\r\n break;\r\n case 'FAILURE':\r\n this.toastService.error(\r\n `Task Failed: ${taskName}${tableName}${progressInfo} failed: ${task.errorMessage || 'Unknown error'}${progressDesc}`\r\n );\r\n break;\r\n case 'CANCELLED':\r\n this.toastService.warning(\r\n `Task Cancelled: ${taskName}${tableName}${progressInfo} was cancelled${progressDesc}`\r\n );\r\n break;\r\n }\r\n }\r\n\r\n getTaskDisplayName(taskType: string): string {\r\n const typeMap: Record<string, string> = {\r\n 'EXPORT_EXCEL': 'Excel export',\r\n 'EXPORT_SDRF': 'SDRF export',\r\n 'IMPORT_SDRF': 'SDRF import',\r\n 'IMPORT_EXCEL': 'Excel import',\r\n 'EXPORT_MULTIPLE_SDRF': 'Bulk SDRF export',\r\n 'EXPORT_MULTIPLE_EXCEL': 'Bulk Excel export',\r\n 'VALIDATE_TABLE': 'Table validation',\r\n 'REORDER_TABLE_COLUMNS': 'Column reordering',\r\n 'REORDER_TEMPLATE_COLUMNS': 'Template column reordering',\r\n };\r\n return typeMap[taskType] || taskType;\r\n }\r\n\r\n getTaskStatusClass(status: string): string {\r\n const statusMap: Record<string, string> = {\r\n 'QUEUED': 'badge-secondary',\r\n 'STARTED': 'badge-primary',\r\n 'SUCCESS': 'badge-success',\r\n 'FAILURE': 'badge-danger',\r\n 'CANCELLED': 'badge-warning',\r\n };\r\n return statusMap[status] || 'badge-secondary';\r\n }\r\n\r\n formatDuration(duration: number | null): string {\r\n if (!duration) {\r\n return '-';\r\n }\r\n\r\n if (duration < 60) {\r\n return `${Math.round(duration)}s`;\r\n } else if (duration < 3600) {\r\n return `${Math.round(duration / 60)}m`;\r\n } else {\r\n const hours = Math.floor(duration / 3600);\r\n const minutes = Math.round((duration % 3600) / 60);\r\n return `${hours}h ${minutes}m`;\r\n }\r\n }\r\n\r\n canCancelTask(status: string): boolean {\r\n return status === 'QUEUED' || status === 'STARTED';\r\n }\r\n\r\n canDownloadResult(task: AsyncTaskStatus): boolean {\r\n return task.status === 'SUCCESS' &&\r\n (task.taskType === 'EXPORT_EXCEL' || task.taskType === 'EXPORT_SDRF' ||\r\n task.taskType === 'EXPORT_MULTIPLE_SDRF' || task.taskType === 'EXPORT_MULTIPLE_EXCEL');\r\n }\r\n\r\n private isImportTask(taskType: string): boolean {\r\n return taskType === 'IMPORT_SDRF' || taskType === 'IMPORT_EXCEL';\r\n }\r\n\r\n private isExportTask(taskType: string): boolean {\r\n return taskType === 'EXPORT_SDRF' || taskType === 'EXPORT_EXCEL' ||\r\n taskType === 'EXPORT_MULTIPLE_SDRF' || taskType === 'EXPORT_MULTIPLE_EXCEL';\r\n }\r\n\r\n private handleExportTaskCompletion(task: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(task.taskType);\r\n const tableName = task.metadataTableName ? ` for \"${task.metadataTableName}\"` : '';\r\n\r\n if (task.taskType === 'EXPORT_SDRF' || task.taskType === 'EXPORT_EXCEL') {\r\n setTimeout(() => {\r\n this.downloadTaskResult(task.id);\r\n }, 1500);\r\n\r\n this.toastService.success(\r\n `${taskName}${tableName} completed! Starting download...`,\r\n 4000\r\n );\r\n } else {\r\n this.toastService.success(\r\n `${taskName}${tableName} completed! Check your downloads.`,\r\n 6000\r\n );\r\n }\r\n }\r\n\r\n private handleValidationTaskCompletion(task: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(task.taskType);\r\n const tableName = task.metadataTableName ? ` for \"${task.metadataTableName}\"` : '';\r\n const progressInfo = task.progressPercentage && task.progressPercentage > 0 ? ` (${task.progressPercentage}%)` : '';\r\n const progressDesc = task.progressDescription ? `: ${task.progressDescription}` : '';\r\n\r\n switch (task.status) {\r\n case 'SUCCESS':\r\n const result = task.result as any;\r\n if (result && result.success === false) {\r\n const errorCount = result.errors?.length || 0;\r\n const warningCount = result.warnings?.length || 0;\r\n\r\n this.toastService.error(\r\n `Validation Failed${progressInfo}: Found ${errorCount} error(s) and ${warningCount} warning(s) in \"${task.metadataTableName}\". Click to view details.${progressDesc}`,\r\n 10000\r\n );\r\n\r\n this.showValidationResultsModal(result);\r\n } else {\r\n this.toastService.success(\r\n `Validation Passed${progressInfo}: ${task.metadataTableName} is valid and complies with SDRF format${progressDesc}`\r\n );\r\n\r\n if (result) {\r\n this.showValidationResultsModal(result);\r\n }\r\n }\r\n break;\r\n case 'FAILURE':\r\n this.toastService.error(\r\n `Validation Error: ${taskName}${tableName} failed: ${task.errorMessage || 'Unknown error'}`\r\n );\r\n break;\r\n case 'CANCELLED':\r\n this.toastService.warning(\r\n `Validation Cancelled: ${taskName}${tableName} was cancelled`\r\n );\r\n break;\r\n }\r\n }\r\n\r\n private showValidationResultsModal(validationResults: ValidationResults): void {\r\n const modalRef = this.modalService.open(ValidationResultsModal, {\r\n size: 'lg',\r\n backdrop: 'static',\r\n keyboard: false\r\n });\r\n\r\n modalRef.componentInstance.results = validationResults;\r\n\r\n modalRef.result.then((result) => {\r\n if (result === 'edit') {\r\n console.log('User wants to edit table to fix validation issues');\r\n }\r\n }).catch(() => {\r\n // Modal dismissed\r\n });\r\n }\r\n\r\n private handleImportTaskCompletion(task: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(task.taskType);\r\n const tableName = task.metadataTableName ? ` for \"${task.metadataTableName}\"` : '';\r\n const progressInfo = task.progressPercentage && task.progressPercentage > 0 ? ` (${task.progressPercentage}%)` : '';\r\n const progressDesc = task.progressDescription ? `: ${task.progressDescription}` : '';\r\n\r\n switch (task.status) {\r\n case 'SUCCESS':\r\n const result = task.result as any;\r\n let message = `${taskName}${tableName} completed successfully!`;\r\n\r\n if (result) {\r\n const details = [];\r\n if (result.columnsCreated || result.totalColumns) {\r\n details.push(`${result.columnsCreated || result.totalColumns || 0} columns processed`);\r\n }\r\n if (result.poolsCreated) {\r\n details.push(`${result.poolsCreated} pools created`);\r\n }\r\n if (result.samplesProcessed) {\r\n details.push(`${result.samplesProcessed} samples processed`);\r\n }\r\n\r\n if (details.length > 0) {\r\n message = `${taskName}${tableName}${progressInfo} completed! ${details.join(', ')}.${progressDesc}`;\r\n } else {\r\n message = `${taskName}${tableName}${progressInfo} completed successfully!${progressDesc}`;\r\n }\r\n }\r\n\r\n this.toastService.success(message, 6000);\r\n break;\r\n\r\n case 'FAILURE':\r\n this.toastService.error(\r\n `${taskName} Failed${progressInfo}: ${task.errorMessage || 'Import failed due to an unknown error'}${progressDesc}`\r\n );\r\n break;\r\n\r\n case 'CANCELLED':\r\n this.toastService.warning(\r\n `${taskName} Cancelled${progressInfo}: Import was cancelled${progressDesc}`\r\n );\r\n break;\r\n }\r\n }\r\n\r\n private handleReorderTaskCompletion(task: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(task.taskType);\r\n const tableName = task.metadataTableName ? ` for \"${task.metadataTableName}\"` : '';\r\n const progressInfo = task.progressPercentage && task.progressPercentage > 0 ? ` (${task.progressPercentage}%)` : '';\r\n const progressDesc = task.progressDescription ? `: ${task.progressDescription}` : '';\r\n\r\n switch (task.status) {\r\n case 'SUCCESS':\r\n const result = task.result as any;\r\n let message = `${taskName}${tableName} completed successfully!`;\r\n\r\n if (result) {\r\n const details = [];\r\n if (result.reorderedColumns) {\r\n details.push(`${result.reorderedColumns} columns reordered`);\r\n }\r\n if (result.reorderedPools) {\r\n details.push(`${result.reorderedPools} pools updated`);\r\n }\r\n if (result.schemaIdsUsed && result.schemaIdsUsed.length > 0) {\r\n details.push(`using ${result.schemaIdsUsed.length} schema(s)`);\r\n }\r\n\r\n if (details.length > 0) {\r\n message += `\\n${details.join(', ')}`;\r\n }\r\n }\r\n\r\n this.toastService.success(message, 5000);\r\n break;\r\n\r\n case 'FAILURE':\r\n this.toastService.error(\r\n `${taskName} Failed: ${task.errorMessage || 'Unknown error'}${progressInfo}${progressDesc}`\r\n );\r\n break;\r\n\r\n case 'CANCELLED':\r\n this.toastService.warning(\r\n `${taskName} Cancelled: ${taskName}${tableName} was cancelled`\r\n );\r\n break;\r\n }\r\n }\r\n}","import { Component, inject, Input, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormBuilder } from '@angular/forms';\r\nimport { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';\r\n\r\nimport { AsyncTaskUIService } from '../async-task-ui';\r\nimport { ToastService } from '@noatgnu/cupcake-core';\r\nimport { MetadataValidationRequest, MetadataValidationConfig, AsyncTaskCreateResponse } from '../../models/async-task';\r\n\r\n@Component({\r\n selector: 'ccv-metadata-validation-modal',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\r\n templateUrl: './metadata-validation-modal.html',\r\n styleUrl: './metadata-validation-modal.scss'\r\n})\r\nexport class MetadataValidationModal {\r\n @Input() config?: MetadataValidationConfig;\r\n \r\n private fb = inject(FormBuilder);\r\n private asyncTaskService = inject(AsyncTaskUIService);\r\n private toastService = inject(ToastService);\r\n \r\n activeModal = inject(NgbActiveModal);\r\n \r\n isValidating = signal(false);\r\n validationError = signal<string | null>(null);\r\n \r\n validationForm = this.fb.group({\r\n validate_sdrf_format: [true]\r\n });\r\n \r\n onSubmit(): void {\r\n if (this.validationForm.invalid || !this.config) {\r\n return;\r\n }\r\n \r\n this.isValidating.set(true);\r\n this.validationError.set(null);\r\n \r\n const formValue = this.validationForm.value;\r\n const request: MetadataValidationRequest = {\r\n metadataTableId: this.config.metadataTableId,\r\n validateSdrfFormat: formValue.validate_sdrf_format ?? true\r\n };\r\n \r\n this.asyncTaskService.validateMetadataTable(request).subscribe({\r\n next: (response) => {\r\n this.toastService.success(\r\n `Validation started successfully for \"${this.config?.metadataTableName}\"`\r\n );\r\n this.activeModal.close({\r\n success: true,\r\n task_id: response.taskId,\r\n message: response.message\r\n });\r\n },\r\n error: (error) => {\r\n this.isValidating.set(false);\r\n const errorMessage = error?.error?.error || error?.message || 'Failed to start validation';\r\n this.validationError.set(errorMessage);\r\n this.toastService.error(`Validation failed: ${errorMessage}`);\r\n }\r\n });\r\n }\r\n}","<div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n <i class=\"bi bi-check-circle me-2 text-success\"></i>\r\n Validate Metadata Table\r\n </h4>\r\n <button \r\n type=\"button\" \r\n class=\"btn-close\" \r\n aria-label=\"Close\"\r\n (click)=\"activeModal.dismiss()\"\r\n [disabled]=\"isValidating()\">\r\n </button>\r\n</div>\r\n\r\n<form [formGroup]=\"validationForm\" (ngSubmit)=\"onSubmit()\">\r\n <div class=\"modal-body\">\r\n <div class=\"alert alert-info\">\r\n <i class=\"bi bi-info-circle me-2\"></i>\r\n <strong>{{ config?.metadataTableName }}</strong> will be validated against SDRF format standards using SDRFDataFrame.\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <h6 class=\"mb-3\">Validation Options</h6>\r\n \r\n <div class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n id=\"validate_sdrf_format\"\r\n formControlName=\"validate_sdrf_format\">\r\n <label class=\"form-check-label\" for=\"validate_sdrf_format\">\r\n <i class=\"bi bi-file-earmark-text me-1 text-warning\"></i>\r\n SDRF Format Validation\r\n </label>\r\n <small class=\"form-text text-muted d-block\">\r\n Validate against MAGE-TAB SDRF standard format using SDRFDataFrame\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <h6 class=\"mb-3\">What gets checked?</h6>\r\n \r\n <div class=\"validation-info\">\r\n <div class=\"mb-2\">\r\n <i class=\"bi bi-check-circle text-success me-2\"></i>\r\n Required SDRF columns presence\r\n </div>\r\n <div class=\"mb-2\">\r\n <i class=\"bi bi-check-circle text-success me-2\"></i>\r\n SDRF format compliance\r\n </div>\r\n <div class=\"mb-2\">\r\n <i class=\"bi bi-check-circle text-success me-2\"></i>\r\n Column header validation\r\n </div>\r\n <div class=\"mb-2\">\r\n <i class=\"bi bi-check-circle text-success me-2\"></i>\r\n Data structure integrity\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (validationError()) {\r\n <div class=\"alert alert-danger mt-3\">\r\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\r\n {{ validationError() }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"modal-footer\">\r\n <button \r\n type=\"button\" \r\n class=\"btn btn-secondary\"\r\n (click)=\"activeModal.dismiss()\"\r\n [disabled]=\"isValidating()\">\r\n Cancel\r\n </button>\r\n \r\n <button \r\n type=\"submit\" \r\n class=\"btn btn-success\"\r\n [disabled]=\"validationForm.invalid || isValidating()\">\r\n @if (isValidating()) {\r\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></span>\r\n Starting Validation...\r\n } @else {\r\n <i class=\"bi bi-play me-2\"></i>\r\n Start Validation\r\n }\r\n </button>\r\n </div>\r\n</form>","import { Component, Input, Output, EventEmitter, OnInit, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbActiveModal, NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { MetadataTable, MetadataTableUpdateRequest, MetadataTableCreateRequest, SampleCountConfirmationError } from '../../models/metadata-table';\nimport { MetadataTableService } from '../../services/metadata-table';\nimport { LabGroupService, LabGroup } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-metadata-table-edit-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './metadata-table-edit-modal.html',\n styleUrl: './metadata-table-edit-modal.scss'\n})\nexport class MetadataTableEditModal implements OnInit {\n @Input() table?: MetadataTable; // Make optional for creation mode\n @Input() isCreateMode: boolean = false; // Add flag to determine mode\n @Output() tableSaved = new EventEmitter<MetadataTable>();\n\n editForm: FormGroup;\n isLoading = signal(false);\n availableLabGroups = signal<LabGroup[]>([]);\n isLoadingLabGroups = signal(false);\n\n constructor(\n private fb: FormBuilder,\n private activeModal: NgbActiveModal,\n private modalService: NgbModal,\n private metadataTableService: MetadataTableService,\n private labGroupService: LabGroupService\n ) {\n this.editForm = this.fb.group({\n name: ['', [Validators.required, Validators.maxLength(255)]],\n description: [''],\n sampleCount: [1, [Validators.required, Validators.min(1), Validators.max(10000)]],\n version: ['', [Validators.maxLength(50)]],\n labGroup: [null]\n });\n }\n\n ngOnInit() {\n if (this.table) {\n this.editForm.patchValue({\n name: this.table.name,\n description: this.table.description || '',\n sampleCount: this.table.sampleCount,\n version: this.table.version,\n labGroup: this.table.labGroup || null\n });\n }\n \n this.loadLabGroups();\n }\n\n loadLabGroups(): void {\n this.isLoadingLabGroups.set(true);\n \n this.labGroupService.getMyLabGroups({ limit: 10 }).subscribe({\n next: (response) => {\n this.availableLabGroups.set(response.results);\n this.isLoadingLabGroups.set(false);\n },\n error: (error) => {\n console.error('Error loading lab groups:', error);\n this.availableLabGroups.set([]);\n this.isLoadingLabGroups.set(false);\n }\n });\n }\n\n onSubmit(): void {\n if (this.editForm.valid) {\n this.isLoading.set(true);\n\n const formValue = this.editForm.value;\n\n if (this.isCreateMode) {\n const createData: MetadataTableCreateRequest = {\n name: formValue.name.trim(),\n description: formValue.description?.trim() || undefined,\n sampleCount: formValue.sampleCount,\n version: formValue.version?.trim() || undefined,\n labGroup: formValue.labGroup || undefined,\n sourceApp: 'cupcake-vanilla'\n };\n\n this.performCreate(createData);\n } else if (this.table?.id) {\n const updateData: MetadataTableUpdateRequest = {\n name: formValue.name.trim(),\n description: formValue.description?.trim() || undefined,\n sampleCount: formValue.sampleCount,\n version: formValue.version?.trim() || undefined,\n labGroup: formValue.labGroup || undefined\n };\n\n this.performUpdate(updateData);\n }\n }\n }\n\n private performCreate(createData: MetadataTableCreateRequest): void {\n this.metadataTableService.createMetadataTable(createData).subscribe({\n next: (newTable) => {\n this.tableSaved.emit(newTable);\n this.activeModal.close(newTable);\n },\n error: (error) => {\n console.error('Error creating metadata table:', error);\n this.isLoading.set(false);\n }\n });\n }\n\n private performUpdate(updateData: MetadataTableUpdateRequest, confirmed: boolean = false): void {\n if (!this.table?.id) return;\n\n if (confirmed) {\n updateData.sampleCountConfirmed = true;\n }\n\n this.metadataTableService.updateMetadataTable(this.table.id, updateData).subscribe({\n next: (updatedTable) => {\n this.tableSaved.emit(updatedTable);\n this.activeModal.close(updatedTable);\n },\n error: (error) => {\n if (this.isSampleCountConfirmationError(error)) {\n this.handleSampleCountConfirmation(error.error, updateData);\n } else {\n console.error('Error updating metadata table:', error);\n this.isLoading.set(false);\n }\n }\n });\n }\n\n private handleSampleCountConfirmation(errorData: SampleCountConfirmationError, updateData: MetadataTableUpdateRequest): void {\n this.isLoading.set(false);\n const details = errorData.sampleCountConfirmationDetails;\n\n const message = `Reducing sample count from ${details.currentSampleCount} to ${details.newSampleCount} will remove data:\n\n${details.validationResult.warnings.join('\\n')}\n\n${this.formatAffectedData(details.validationResult)}\n\nDo you want to continue?`;\n\n if (confirm(message)) {\n this.isLoading.set(true);\n this.performUpdate(updateData, true);\n }\n }\n\n private formatAffectedData(validationResult: any): string {\n let message = '';\n\n if (validationResult.affectedModifiers?.length > 0) {\n message += `\\nAffected column modifiers (${validationResult.affectedModifiers.length}):`;\n validationResult.affectedModifiers.slice(0, 5).forEach((modifier: any) => {\n message += `\\n- ${modifier.columnName} (samples: ${modifier.samples})`;\n });\n if (validationResult.affectedModifiers.length > 5) {\n message += `\\n- ... and ${validationResult.affectedModifiers.length - 5} more`;\n }\n }\n\n if (validationResult.affectedPools?.length > 0) {\n message += `\\nAffected sample pools (${validationResult.affectedPools.length}):`;\n validationResult.affectedPools.slice(0, 5).forEach((pool: any) => {\n message += `\\n- ${pool.poolName}`;\n });\n if (validationResult.affectedPools.length > 5) {\n message += `\\n- ... and ${validationResult.affectedPools.length - 5} more`;\n }\n }\n\n return message;\n }\n\n private isSampleCountConfirmationError(error: any): error is { error: SampleCountConfirmationError } {\n return error?.error?.sampleCountConfirmationDetails &&\n error?.error?.sampleCountConfirmationDetails?.requiresConfirmation === true;\n }\n\n onCancel(): void {\n this.activeModal.dismiss();\n }\n\n get title(): string {\n if (this.isCreateMode) {\n return 'Create New Metadata Table';\n }\n return `Edit ${this.table?.name || 'Metadata Table'}`;\n }\n\n get hasChanges(): boolean {\n if (this.isCreateMode) {\n return this.editForm.dirty; // For creation mode, any change is valid\n }\n\n if (!this.table) return false;\n\n const formValue = this.editForm.value;\n return (\n formValue.name !== this.table.name ||\n formValue.description !== (this.table.description || '') ||\n formValue.sampleCount !== this.table.sampleCount ||\n formValue.version !== this.table.version ||\n formValue.labGroup !== this.table.labGroup\n );\n }\n\n // Form validation helpers\n isFieldInvalid(fieldName: string): boolean {\n const field = this.editForm.get(fieldName);\n return !!(field && field.invalid && field.touched);\n }\n\n getFieldError(fieldName: string): string {\n const field = this.editForm.get(fieldName);\n if (!field || !field.errors) return '';\n \n const displayName = this.getFieldDisplayName(fieldName);\n \n if (field.errors['required']) {\n return `${displayName} is required`;\n }\n if (field.errors['maxlength']) {\n return `${displayName} must be less than ${field.errors['maxlength'].requiredLength} characters`;\n }\n if (field.errors['min']) {\n return `${displayName} must be at least ${field.errors['min'].min}`;\n }\n if (field.errors['max']) {\n return `${displayName} must be no more than ${field.errors['max'].max}`;\n }\n \n return 'Invalid value';\n }\n\n private getFieldDisplayName(fieldName: string): string {\n const displayNames: Record<string, string> = {\n 'name': 'Table name',\n 'description': 'Description', \n 'sampleCount': 'Sample count',\n 'version': 'Version',\n 'labGroup': 'Lab group'\n };\n return displayNames[fieldName] || fieldName;\n }\n}","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-table me-2\"></i>{{ title }}\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"onCancel()\"></button>\n</div>\n\n<div class=\"modal-body\">\n <form [formGroup]=\"editForm\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Table Name -->\n <div class=\"mb-3\">\n <label for=\"tableName\" class=\"form-label\">\n Table Name *\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"tableName\"\n formControlName=\"name\"\n [class.is-invalid]=\"isFieldInvalid('name')\"\n placeholder=\"Enter table name\"\n maxlength=\"255\">\n @if (isFieldInvalid('name')) {\n <div class=\"invalid-feedback\">\n {{ getFieldError('name') }}\n </div>\n }\n </div>\n\n <!-- Description -->\n <div class=\"mb-3\">\n <label for=\"tableDescription\" class=\"form-label\">\n Description\n </label>\n <textarea\n class=\"form-control\"\n id=\"tableDescription\"\n formControlName=\"description\"\n rows=\"3\"\n placeholder=\"Optional description of the metadata table\"></textarea>\n <div class=\"form-text\">\n Provide a brief description of what this metadata table contains or its purpose.\n </div>\n </div>\n\n <!-- Sample Count and Version Row -->\n <div class=\"row\">\n <div class=\"col-md-6 mb-3\">\n <label for=\"sampleCount\" class=\"form-label\">\n Sample Count *\n </label>\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"sampleCount\"\n formControlName=\"sampleCount\"\n [class.is-invalid]=\"isFieldInvalid('sampleCount')\"\n placeholder=\"Number of samples\"\n min=\"1\"\n max=\"10000\">\n @if (isFieldInvalid('sampleCount')) {\n <div class=\"invalid-feedback\">\n {{ getFieldError('sampleCount') }}\n </div>\n }\n <div class=\"form-text\">\n Number of samples in this metadata table (1-10,000).\n </div>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"version\" class=\"form-label\">\n Version\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"version\"\n formControlName=\"version\"\n [class.is-invalid]=\"isFieldInvalid('version')\"\n placeholder=\"e.g., 1.0, v2.1\"\n maxlength=\"50\">\n @if (isFieldInvalid('version')) {\n <div class=\"invalid-feedback\">\n {{ getFieldError('version') }}\n </div>\n }\n <div class=\"form-text\">\n Version identifier for this table.\n </div>\n </div>\n </div>\n\n <!-- Lab Group Assignment -->\n <div class=\"mb-3\">\n <label for=\"labGroup\" class=\"form-label\">\n Lab Group Assignment\n </label>\n @if (isLoadingLabGroups()) {\n <div class=\"d-flex align-items-center\">\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n <span class=\"text-muted\">Loading lab groups...</span>\n </div>\n } @else {\n <select\n class=\"form-select\"\n id=\"labGroup\"\n formControlName=\"labGroup\">\n <option [value]=\"null\">No lab group (Personal)</option>\n @for (group of availableLabGroups(); track group.id) {\n <option [value]=\"group.id\">{{ group.name }}</option>\n }\n </select>\n }\n <div class=\"form-text\">\n Assign this table to a lab group for shared access, or leave unassigned for personal use.\n </div>\n </div>\n\n <!-- Table Status Info (Read-only) -->\n @if (table) {\n <div class=\"mb-3\">\n <label class=\"form-label\">Current Status</label>\n <div class=\"d-flex gap-2\">\n @if (table.isLocked) {\n <span class=\"badge bg-warning\">\n <i class=\"bi bi-lock me-1\"></i>Locked\n </span>\n } @else {\n <span class=\"badge bg-success\">\n <i class=\"bi bi-unlock me-1\"></i>Unlocked\n </span>\n }\n @if (table.isPublished) {\n <span class=\"badge bg-info\">\n <i class=\"bi bi-check-circle me-1\"></i>Published\n </span>\n } @else {\n <span class=\"badge bg-secondary\">\n <i class=\"bi bi-clock me-1\"></i>Draft\n </span>\n }\n </div>\n <div class=\"form-text\">\n Lock status and publication state can be managed through advanced options.\n </div>\n </div>\n }\n\n <!-- Character Count -->\n <div class=\"mb-2\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <small class=\"text-muted\">\n Name: {{ editForm.get('name')?.value?.length || 0 }}/255 characters\n </small>\n @if (hasChanges) {\n <small class=\"text-info\">\n <i class=\"bi bi-info-circle me-1\"></i>Changes detected\n </small>\n }\n </div>\n </div>\n\n </form>\n</div>\n\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"onCancel()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"onSubmit()\"\n [disabled]=\"editForm.invalid || isLoading() || (!isCreateMode && !hasChanges)\">\n @if (isLoading()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n @if (isCreateMode) {\n <i class=\"bi bi-plus-circle me-1\"></i>\n Create Table\n } @else {\n <i class=\"bi bi-check-circle me-1\"></i>\n Save Changes\n }\n </button>\n</div>\n","import { Component, Input, Output, EventEmitter, OnInit, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormsModule } from '@angular/forms';\nimport { NgbActiveModal, NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { MetadataColumn, PaginatedResponse, MetadataColumnTemplate, ONTOLOGY_TYPE_CONFIGS, COLUMN_TYPE_CONFIGS, OntologyTypeConfig, ColumnTypeConfig, ColumnType, OntologyType, OFFICIAL_SDRF_COLUMNS, SdrfColumnConfig, getSdrfColumnsByCategory, getSdrfColumnByName } from '../../../models';\nimport { MetadataValueEditModal, MetadataValueEditConfig } from '../../metadata-value-edit-modal/metadata-value-edit-modal';\nimport { MetadataColumnTemplateService, MetadataColumnTemplateQueryParams } from '../../../services/metadata-column-template';\nimport { SdrfSyntaxService } from '../../../services/sdrf-syntax';\n\n@Component({\n selector: 'ccv-column-edit-modal',\n imports: [CommonModule, ReactiveFormsModule, FormsModule, NgbModule],\n templateUrl: './column-edit-modal.html',\n styleUrl: './column-edit-modal.scss'\n})\nexport class ColumnEditModal implements OnInit {\n @Input() column: MetadataColumn | null = null;\n @Input() templateId: number | null = null; // Add template ID for API calls\n @Input() isEdit = false;\n @Output() columnSaved = new EventEmitter<Partial<MetadataColumn>>();\n\n editForm: FormGroup;\n isLoading = signal(false);\n showAdvancedMode = signal(false);\n\n // Selected ontology configuration (includes custom filters)\n selectedOntologyConfig: OntologyTypeConfig | null = null;\n\n // Available options for dropdowns from library\n columnTypes: ColumnTypeConfig[] = COLUMN_TYPE_CONFIGS;\n ontologyTypes: OntologyTypeConfig[] = ONTOLOGY_TYPE_CONFIGS;\n\n // Template selection properties\n templateFilter = '';\n selectedTemplateId: number | string = '';\n selectedTemplate: MetadataColumnTemplate | null = null;\n templates: MetadataColumnTemplate[] = [];\n isLoadingTemplates = false;\n\n // Pagination\n currentTemplatePage = 1;\n templatePageSize = 5;\n totalTemplates = 0;\n totalTemplatePages = 0;\n Math = Math;\n\n // Official SDRF column configurations from library\n officialSdrfColumns: SdrfColumnConfig[] = OFFICIAL_SDRF_COLUMNS;\n\n // Column selection mode\n showOfficialColumns = false;\n selectedOfficialColumn: SdrfColumnConfig | null = null;\n availableOfficialColumns: SdrfColumnConfig[] = [];\n\n // Template swapping for existing columns\n showTemplateSwap = false;\n showCreateCustomTemplate = false;\n\n constructor(\n private fb: FormBuilder,\n private activeModal: NgbActiveModal,\n private modalService: NgbModal,\n private metadataColumnTemplateService: MetadataColumnTemplateService,\n private sdrfSyntaxService: SdrfSyntaxService\n ) {\n this.editForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(1)]],\n type: [ColumnType.CHARACTERISTICS, Validators.required],\n value: [''],\n ontologyType: ['0'],\n enableTypeahead: [false],\n mandatory: [false],\n hidden: [false],\n readonly: [false],\n notApplicable: [false]\n });\n }\n\n ngOnInit() {\n // Always disable name and type fields since they're managed through templates\n this.editForm.get('name')?.disable();\n this.editForm.get('type')?.disable();\n\n if (this.column && this.isEdit) {\n this.populateForm();\n }\n\n if (!this.isEdit) {\n this.loadColumnTemplates();\n }\n }\n\n private populateForm() {\n if (this.column) {\n const ontologyTypeIndex = this.column.ontologyType\n ? this.ontologyTypes.findIndex(o => o.value === this.column!.ontologyType)\n : 0;\n\n this.editForm.patchValue({\n name: this.column.name,\n type: this.getCorrectedColumnType(this.column.name, this.column.type),\n value: this.column.value || '',\n ontologyType: ontologyTypeIndex >= 0 ? ontologyTypeIndex.toString() : '0',\n enableTypeahead: this.column.enableTypeahead || false,\n mandatory: this.column.mandatory || false,\n hidden: this.column.hidden || false,\n readonly: this.column.readonly || false,\n notApplicable: this.column.notApplicable || false\n });\n }\n }\n\n onSubmit() {\n // For new columns, require either template or official column selection\n if (!this.isEdit && !this.selectedTemplate && !this.selectedOfficialColumn) {\n alert('Please select from official SDRF columns or choose an existing template before proceeding.');\n return;\n }\n\n if (this.editForm.valid) {\n this.isLoading.set(true);\n const formValue = this.editForm.getRawValue();\n\n const ontologyTypeIndex = parseInt(formValue.ontologyType);\n const ontologyTypeValue = ontologyTypeIndex > 0 ? this.ontologyTypes[ontologyTypeIndex]?.value as OntologyType : undefined;\n\n const columnData: Partial<MetadataColumn> = {\n name: formValue.name,\n type: formValue.type,\n value: formValue.value || '',\n ontologyType: ontologyTypeValue,\n enableTypeahead: formValue.enableTypeahead || false,\n mandatory: formValue.mandatory || false,\n hidden: formValue.hidden || false,\n readonly: formValue.readonly || false,\n notApplicable: formValue.notApplicable || false\n };\n\n this.columnSaved.emit(columnData);\n } else {\n this.markFormGroupTouched();\n }\n }\n\n private markFormGroupTouched() {\n Object.keys(this.editForm.controls).forEach(key => {\n const control = this.editForm.get(key);\n control?.markAsTouched();\n });\n }\n\n onCancel() {\n this.activeModal.dismiss();\n }\n\n onClose() {\n this.isLoading.set(false);\n this.activeModal.close();\n }\n\n getFieldError(fieldName: string): string {\n const control = this.editForm.get(fieldName);\n if (control?.errors && control.touched) {\n if (control.errors['required']) return `${fieldName} is required`;\n if (control.errors['minlength']) return `${fieldName} must be at least ${control.errors['minlength'].requiredLength} characters`;\n }\n return '';\n }\n\n get title(): string {\n return this.isEdit ? 'Edit Column' : 'Add Column';\n }\n\n get hasOntologyType(): boolean {\n const ontologyTypeIndex = this.editForm.get('ontologyType')?.value;\n return !!(ontologyTypeIndex && ontologyTypeIndex !== '0');\n }\n\n get hasTypeaheadEnabled(): boolean {\n return this.hasOntologyType && this.editForm.get('enableTypeahead')?.value === true;\n }\n\n openValueEditModal(): void {\n // Get custom filters from selected ontology type or template\n let customFilters = this.selectedTemplate?.customOntologyFilters;\n let ontologyType = '';\n\n // If in advanced mode and an ontology type is selected, use its custom filters\n if (this.showAdvancedMode() && this.selectedOntologyConfig) {\n ontologyType = this.selectedOntologyConfig.value;\n if (this.selectedOntologyConfig.customFilters) {\n customFilters = this.selectedOntologyConfig.customFilters;\n }\n }\n\n const config: MetadataValueEditConfig = {\n columnId: this.column?.id,\n columnName: this.editForm.get('name')?.value || 'Column',\n columnType: this.editForm.get('type')?.value || '',\n ontologyType: ontologyType,\n enableTypeahead: this.editForm.get('enableTypeahead')?.value || false,\n currentValue: this.editForm.get('value')?.value || '',\n context: this.isEdit ? 'table' : 'template',\n templateId: this.selectedTemplate?.id || this.templateId || undefined,\n customOntologyFilters: customFilters\n };\n\n const modalRef = this.modalService.open(MetadataValueEditModal, {\n size: 'lg',\n backdrop: 'static'\n });\n\n modalRef.componentInstance.config = config;\n modalRef.componentInstance.valueSaved.subscribe((result: string | { value: string; sampleIndices: number[] }) => {\n // Extract the actual value from the result\n const newValue = typeof result === 'string' ? result : result.value;\n this.editForm.get('value')?.setValue(newValue);\n this.editForm.get('value')?.markAsTouched();\n modalRef.componentInstance.onClose();\n });\n }\n\n // Template selection methods\n private loadColumnTemplates(): void {\n this.isLoadingTemplates = true;\n const offset = (this.currentTemplatePage - 1) * this.templatePageSize;\n const params: MetadataColumnTemplateQueryParams = {\n limit: this.templatePageSize,\n offset: offset,\n isActive: true,\n search: this.templateFilter || undefined\n };\n\n this.metadataColumnTemplateService.getMetadataColumnTemplates(params).subscribe({\n next: (response: PaginatedResponse<MetadataColumnTemplate>) => {\n this.templates = response.results || [];\n this.totalTemplates = response.count || 0;\n this.totalTemplatePages = Math.ceil(this.totalTemplates / this.templatePageSize);\n this.isLoadingTemplates = false;\n },\n error: (error: any) => {\n console.error('Error loading column templates:', error);\n this.isLoadingTemplates = false;\n }\n });\n }\n\n onTemplateFilterChange(): void {\n this.currentTemplatePage = 1;\n this.loadColumnTemplates();\n }\n\n clearTemplateFilter(): void {\n this.templateFilter = '';\n this.currentTemplatePage = 1;\n this.loadColumnTemplates();\n }\n\n onTemplatePageChange(page: number): void {\n this.currentTemplatePage = page;\n this.loadColumnTemplates();\n }\n\n onTemplateSelectionChange(): void {\n if (this.selectedTemplateId) {\n const template = this.templates.find(t => t.id === Number(this.selectedTemplateId));\n if (template) {\n this.selectedTemplate = template;\n\n // Enable controls to update values, then disable again\n this.editForm.get('name')?.enable();\n this.editForm.get('type')?.enable();\n\n // Auto-fill form with template data\n const ontologyTypeIndex = template.ontologyType\n ? this.ontologyTypes.findIndex(o => o.value === template.ontologyType)\n : 0;\n\n this.editForm.patchValue({\n name: template.columnName,\n type: template.columnType,\n value: template.defaultValue || '',\n ontologyType: ontologyTypeIndex >= 0 ? ontologyTypeIndex.toString() : '0',\n enableTypeahead: template.enableTypeahead || false,\n mandatory: false,\n hidden: false,\n readonly: false,\n notApplicable: false\n });\n\n // Disable controls again\n this.editForm.get('name')?.disable();\n this.editForm.get('type')?.disable();\n\n // Mark form as touched to trigger validation display\n Object.keys(this.editForm.controls).forEach(key => {\n this.editForm.get(key)?.markAsTouched();\n });\n }\n } else {\n this.clearTemplate();\n }\n }\n\n clearTemplate(): void {\n this.selectedTemplate = null;\n this.selectedTemplateId = '';\n\n // Enable controls to reset values, then disable again\n this.editForm.get('name')?.enable();\n this.editForm.get('type')?.enable();\n\n // Reset form to default values\n this.editForm.reset({\n name: '',\n type: ColumnType.CHARACTERISTICS,\n value: '',\n ontologyType: '0',\n enableTypeahead: false,\n mandatory: false,\n hidden: false,\n readonly: false,\n notApplicable: false\n });\n\n // Disable controls again\n this.editForm.get('name')?.disable();\n this.editForm.get('type')?.disable();\n }\n\n getOntologyTypeLabel(ontologyType: string): string {\n const ontology = this.ontologyTypes.find(o => o.value === ontologyType);\n return ontology ? ontology.label : ontologyType;\n }\n\n // Official column selection methods\n toggleOfficialColumns(): void {\n this.showOfficialColumns = !this.showOfficialColumns;\n if (this.showOfficialColumns) {\n this.filterOfficialColumns();\n }\n }\n\n selectOfficialColumn(column: SdrfColumnConfig): void {\n this.selectedOfficialColumn = column;\n\n // Enable controls to update values, then disable again\n this.editForm.get('name')?.enable();\n this.editForm.get('type')?.enable();\n\n const ontologyTypeValue = this.getDefaultOntologyTypeForColumn(column.name);\n const ontologyTypeIndex = ontologyTypeValue\n ? this.ontologyTypes.findIndex(o => o.value === ontologyTypeValue)\n : 0;\n\n this.editForm.patchValue({\n name: column.name,\n type: column.type,\n value: '',\n ontologyType: ontologyTypeIndex >= 0 ? ontologyTypeIndex.toString() : '0',\n enableTypeahead: this.shouldEnableTypeaheadForColumn(column.name),\n mandatory: this.isColumnMandatory(column.name),\n hidden: false,\n readonly: false,\n notApplicable: false\n });\n\n // Disable controls again\n this.editForm.get('name')?.disable();\n this.editForm.get('type')?.disable();\n\n // Mark form as touched\n Object.keys(this.editForm.controls).forEach(key => {\n this.editForm.get(key)?.markAsTouched();\n });\n\n this.showOfficialColumns = false;\n }\n\n private filterOfficialColumns(): void {\n // Filter out columns that already have templates with the same name\n this.availableOfficialColumns = this.officialSdrfColumns.filter(officialCol => {\n return !this.templates.some(template =>\n template.columnName.toLowerCase() === officialCol.name.toLowerCase()\n );\n });\n }\n\n private getDefaultOntologyTypeForColumn(columnName: string): string {\n const lowerName = columnName.toLowerCase();\n\n // Based on backend configure_ontology_options method - use exact matches\n switch (lowerName) {\n case 'characteristics[organism]':\n return 'species';\n case 'characteristics[disease]':\n return 'human_disease';\n case 'characteristics[organism part]':\n return 'tissue';\n case 'characteristics[cell type]':\n return 'cell_ontology';\n case 'comment[instrument]':\n return 'ms_unique_vocabularies';\n case 'comment[modification parameters]':\n return 'unimod';\n case 'comment[ms2 analyzer type]':\n return 'ms_unique_vocabularies';\n case 'comment[cleavage agent details]':\n return 'ms_unique_vocabularies';\n case 'characteristics[ancestry category]':\n return 'ms_unique_vocabularies';\n case 'characteristics[sex]':\n return 'ms_unique_vocabularies';\n case 'characteristics[developmental stage]':\n return 'ms_unique_vocabularies';\n case 'comment[label]':\n return 'ms_unique_vocabularies';\n default:\n return '';\n }\n }\n\n private shouldEnableTypeaheadForColumn(columnName: string): boolean {\n const ontologyType = this.getDefaultOntologyTypeForColumn(columnName);\n return ontologyType.length > 0;\n }\n\n private isColumnMandatory(columnName: string): boolean {\n const lowerName = columnName.toLowerCase();\n\n switch (lowerName) {\n case 'source name':\n case 'characteristics[organism]':\n case 'characteristics[disease]':\n case 'characteristics[organism part]':\n case 'characteristics[cell type]':\n case 'assay name':\n case 'comment[fraction identifier]':\n case 'comment[label]':\n case 'comment[data file]':\n case 'comment[instrument]':\n case 'comment[technical replicate]':\n case 'characteristics[biological replicate]':\n return true;\n default:\n return false;\n }\n }\n\n\n // Template swapping methods\n showTemplateSwapOptions(): void {\n if (!this.isEdit) return;\n\n this.showTemplateSwap = true;\n this.loadColumnTemplates();\n }\n\n swapToTemplate(template: MetadataColumnTemplate): void {\n this.selectedTemplate = template;\n this.selectedTemplateId = template.id;\n\n // Update form with template data, preserving current value\n const currentValue = this.editForm.get('value')?.value || '';\n\n // Enable controls to update values, then disable again\n this.editForm.get('name')?.enable();\n this.editForm.get('type')?.enable();\n\n const ontologyTypeIndex = template.ontologyType\n ? this.ontologyTypes.findIndex(o => o.value === template.ontologyType)\n : 0;\n\n this.editForm.patchValue({\n name: template.columnName,\n type: template.columnType,\n value: currentValue,\n ontologyType: ontologyTypeIndex >= 0 ? ontologyTypeIndex.toString() : '0',\n enableTypeahead: template.enableTypeahead || false,\n mandatory: this.editForm.get('mandatory')?.value || false,\n hidden: this.editForm.get('hidden')?.value || false,\n readonly: this.editForm.get('readonly')?.value || false,\n notApplicable: this.editForm.get('notApplicable')?.value || false\n });\n\n // Disable controls again\n this.editForm.get('name')?.disable();\n this.editForm.get('type')?.disable();\n\n // Mark form as touched\n Object.keys(this.editForm.controls).forEach(key => {\n this.editForm.get(key)?.markAsTouched();\n });\n\n this.showTemplateSwap = false;\n }\n\n showCreateCustomTemplateOption(): void {\n this.showCreateCustomTemplate = true;\n }\n\n createCustomTemplate(): void {\n // This would open a new modal to create a custom template\n // For now, we'll just enable manual editing\n this.editForm.get('name')?.enable();\n this.showCreateCustomTemplate = false;\n\n // Show info message\n alert('Custom template creation would open a new dialog. For now, you can manually edit the column name.');\n }\n\n cancelTemplateSwap(): void {\n this.showTemplateSwap = false;\n this.showCreateCustomTemplate = false;\n }\n\n // Toggle advanced mode\n toggleAdvancedMode(): void {\n this.showAdvancedMode.set(!this.showAdvancedMode());\n\n // Reset ontology type when disabling advanced mode\n if (!this.showAdvancedMode()) {\n this.editForm.patchValue({\n ontologyType: '0',\n enableTypeahead: false\n });\n this.selectedOntologyConfig = null;\n }\n }\n\n // Handle ontology type selection change\n onOntologyTypeChange(event: Event): void {\n const selectElement = event.target as HTMLSelectElement;\n const selectedIndex = parseInt(selectElement.value);\n this.selectedOntologyConfig = this.ontologyTypes[selectedIndex] || null;\n }\n\n private getCorrectedColumnType(columnName: string, columnType: string): string {\n const syntaxType = this.sdrfSyntaxService.detectSpecialSyntax(columnName, columnType);\n if (syntaxType) {\n // Return a specific type based on SDRF syntax detection\n switch (syntaxType) {\n case 'age':\n return 'characteristics[age]';\n case 'modification':\n return 'comment[modification parameters]';\n case 'cleavage':\n return 'comment[cleavage agent details]';\n case 'spiked_compound':\n return 'characteristics[spiked compound]';\n default:\n return columnType;\n }\n }\n return columnType;\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-columns-gap me-2\"></i>{{ title }}\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"onCancel()\"></button>\n</div>\n\n<div class=\"modal-body\">\n <form [formGroup]=\"editForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"row\">\n <!-- Selection Required Notice for New Columns -->\n @if (!isEdit) {\n <div class=\"col-12 mb-3\">\n <div class=\"alert alert-warning\">\n <h6 class=\"alert-heading\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>Column Selection Required\n </h6>\n <p class=\"mb-0\">\n You must select from official SDRF columns or existing templates to ensure data compliance and consistency.\n </p>\n </div>\n </div>\n }\n\n <!-- Official SDRF Columns -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-file-earmark-check me-2\"></i>Official SDRF Columns\n <small class=\"text-muted ms-2\">\n @if (!isEdit) {\n (Step 1: Select from standardized SDRF-Proteomics column names)\n } @else {\n (Recommended - select from standardized SDRF-Proteomics column names)\n }\n </small>\n </h6>\n </div>\n\n @if (!isEdit) {\n <div class=\"col-12 mb-3\">\n @if (!showOfficialColumns) {\n <button\n type=\"button\"\n class=\"btn btn-primary mb-3\"\n (click)=\"toggleOfficialColumns()\">\n <i class=\"bi bi-list-ul me-2\"></i>\n Select from Official SDRF Columns\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary mb-3\"\n (click)=\"toggleOfficialColumns()\">\n <i class=\"bi bi-x me-2\"></i>\n Hide Official Columns\n </button>\n }\n </div>\n } @else {\n <div class=\"col-12 mb-3\">\n <button\n type=\"button\"\n class=\"btn btn-outline-info mb-3\"\n (click)=\"toggleOfficialColumns()\">\n <i class=\"bi bi-list-ul me-2\"></i>\n {{ showOfficialColumns ? 'Hide' : 'Show' }} Official Column Names\n </button>\n </div>\n }\n\n @if (showOfficialColumns) {\n <div class=\"col-12 mb-3\">\n <div class=\"border rounded p-3\">\n <p class=\"mb-3 text-muted\">\n <i class=\"bi bi-info-circle me-2\"></i>\n Select from official SDRF-Proteomics column names. Only columns without existing templates are shown.\n </p>\n\n @if (availableOfficialColumns.length === 0) {\n <div class=\"alert alert-warning\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\n All official SDRF columns already have templates created.\n </div>\n } @else {\n <div class=\"row\">\n @for (column of availableOfficialColumns; track column.name) {\n <div class=\"col-md-6 mb-2\">\n <div class=\"card h-100 cursor-pointer border-info\"\n (click)=\"selectOfficialColumn(column)\"\n [class.border-primary]=\"selectedOfficialColumn?.name === column.name\">\n <div class=\"card-body py-2\">\n <h6 class=\"card-title mb-1 font-monospace\">\n {{ column.name }}\n </h6>\n <p class=\"card-text small mb-1\">\n <span class=\"badge\"\n [class]=\"column.type === 'characteristics' ? 'bg-primary' :\n column.type === 'comment' ? 'bg-success' :\n column.type === 'factor_value' ? 'bg-warning' : 'bg-secondary'\">\n {{ column.type }}\n </span>\n </p>\n <p class=\"card-text small mb-0\">{{ column.description }}</p>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Template Swapping for Edit Mode -->\n @if (isEdit && showTemplateSwap) {\n <div class=\"col-12 mb-3\">\n <div class=\"alert alert-info\">\n <h6 class=\"alert-heading\">\n <i class=\"bi bi-arrow-left-right me-2\"></i>Swap to Different Template\n </h6>\n <p class=\"mb-3\">\n Choose a different template to change the column name and settings. Your current value will be preserved.\n </p>\n\n <div class=\"mb-3\">\n <input\n type=\"text\"\n class=\"form-control mb-2\"\n placeholder=\"Search templates...\"\n [(ngModel)]=\"templateFilter\"\n [ngModelOptions]=\"{standalone: true}\"\n (input)=\"onTemplateFilterChange()\">\n\n <select\n class=\"form-select mb-3\"\n size=\"4\"\n [disabled]=\"isLoadingTemplates\">\n @if (isLoadingTemplates) {\n <option value=\"\" disabled>Loading templates...</option>\n } @else {\n @for (template of templates; track template.id) {\n <option\n [value]=\"template.id\"\n (click)=\"swapToTemplate(template)\"\n style=\"cursor: pointer;\">\n {{ template.columnName }} - {{ template.columnType }}@if (template.ontologyType) { ({{ getOntologyTypeLabel(template.ontologyType) }})}\n </option>\n }\n }\n </select>\n </div>\n\n <div class=\"d-flex justify-content-between\">\n <button\n type=\"button\"\n class=\"btn btn-success\"\n (click)=\"showCreateCustomTemplateOption()\">\n <i class=\"bi bi-plus-circle me-1\"></i>Create Custom Template\n </button>\n <button\n type=\"button\"\n class=\"btn btn-secondary\"\n (click)=\"cancelTemplateSwap()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Custom Template Creation Option -->\n @if (isEdit && showCreateCustomTemplate) {\n <div class=\"col-12 mb-3\">\n <div class=\"alert alert-warning\">\n <h6 class=\"alert-heading\">\n <i class=\"bi bi-plus-circle me-2\"></i>Create Custom Template\n </h6>\n <p class=\"mb-3\">\n This will create a new custom template with your desired column name and settings.\n </p>\n\n <div class=\"d-flex justify-content-between\">\n <button\n type=\"button\"\n class=\"btn btn-warning\"\n (click)=\"createCustomTemplate()\">\n <i class=\"bi bi-gear me-1\"></i>Create & Apply Template\n </button>\n <button\n type=\"button\"\n class=\"btn btn-secondary\"\n (click)=\"cancelTemplateSwap()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Template Selection -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>Template Selection\n <small class=\"text-muted ms-2\">\n @if (!isEdit) {\n (Step 2: Or select from existing templates)\n } @else {\n (Optional - select a template to auto-fill column settings)\n }\n </small>\n </h6>\n </div>\n\n <div class=\"col-12 mb-3\">\n <div class=\"input-group mb-3\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-search\"></i>\n </span>\n <input \n type=\"text\" \n class=\"form-control\" \n placeholder=\"Search column templates...\"\n [(ngModel)]=\"templateFilter\"\n [ngModelOptions]=\"{standalone: true}\"\n (input)=\"onTemplateFilterChange()\">\n @if (templateFilter) {\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"clearTemplateFilter()\">\n <i class=\"bi bi-x\"></i>\n </button>\n }\n </div>\n\n <select \n class=\"form-select mb-3\"\n size=\"5\"\n [(ngModel)]=\"selectedTemplateId\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"onTemplateSelectionChange()\"\n [disabled]=\"isLoadingTemplates\">\n <option value=\"\">No template selected</option>\n @if (isLoadingTemplates) {\n <option value=\"\" disabled>Loading templates...</option>\n } @else {\n @for (template of templates; track template.id) {\n <option [value]=\"template.id\">\n {{ template.columnName }} - {{ template.columnType }}@if (template.ontologyType) { ({{ getOntologyTypeLabel(template.ontologyType) }})}\n </option>\n }\n }\n </select>\n\n @if (totalTemplatePages > 1) {\n <div class=\"d-flex justify-content-between align-items-center\">\n <small class=\"text-muted\">\n Showing {{ (currentTemplatePage - 1) * templatePageSize + 1 }}-{{ Math.min(currentTemplatePage * templatePageSize, totalTemplates) }}\n of {{ totalTemplates }}\n </small>\n <ngb-pagination\n [collectionSize]=\"totalTemplates\"\n [page]=\"currentTemplatePage\"\n [pageSize]=\"templatePageSize\"\n [maxSize]=\"3\"\n [boundaryLinks]=\"true\"\n [rotate]=\"true\"\n (pageChange)=\"onTemplatePageChange($event)\"\n class=\"pagination-sm mb-0\">\n </ngb-pagination>\n </div>\n }\n\n @if (selectedTemplate) {\n <div class=\"alert alert-info mt-3\">\n <i class=\"bi bi-info-circle me-2\"></i>\n Template \"{{ selectedTemplate.name }}\" selected. Settings will be applied automatically.\n <button type=\"button\" class=\"btn btn-sm btn-outline-info float-end\" (click)=\"clearTemplate()\">\n Clear Selection\n </button>\n </div>\n }\n </div>\n\n <!-- Manual Entry -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-pencil me-2\"></i>Column Details\n @if (selectedTemplate) {\n <small class=\"text-muted ms-2\">(Auto-filled from template - you can modify as needed)</small>\n }\n </h6>\n </div>\n \n <div class=\"col-12 mb-3\">\n <label for=\"columnName\" class=\"form-label\">\n Column Name *\n <span class=\"text-muted ms-2\">\n <i class=\"bi bi-info-circle\"></i>\n Column names are managed through templates\n </span>\n </label>\n <div class=\"input-group\">\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"columnName\"\n formControlName=\"name\"\n [class.is-invalid]=\"editForm.get('name')?.invalid && editForm.get('name')?.touched\"\n readonly\n placeholder=\"Select from official columns or templates below\">\n @if (isEdit) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"showTemplateSwapOptions()\"\n title=\"Change to different template\">\n <i class=\"bi bi-arrow-left-right\"></i> Swap Template\n </button>\n }\n </div>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>\n @if (isEdit) {\n To change the column name, swap to a different template or create a new custom template.\n } @else {\n Select from official SDRF columns or existing templates below to ensure compliance.\n }\n </div>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"columnType\" class=\"form-label\">\n Column Type *\n <span class=\"text-muted ms-2\">\n <i class=\"bi bi-info-circle\"></i>\n Managed through templates\n </span>\n </label>\n <select\n class=\"form-select\"\n id=\"columnType\"\n formControlName=\"type\"\n [class.is-invalid]=\"editForm.get('type')?.invalid && editForm.get('type')?.touched\">\n @for (type of columnTypes; track type.value) {\n <option [value]=\"type.value\">{{ type.label }}</option>\n }\n </select>\n </div>\n\n <!-- Advanced Mode Toggle -->\n <div class=\"col-12 mb-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"advancedMode\"\n [checked]=\"showAdvancedMode()\"\n (change)=\"toggleAdvancedMode()\">\n <label class=\"form-check-label\" for=\"advancedMode\">\n <i class=\"bi bi-gear me-1\"></i>Advanced Mode\n </label>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>\n Show advanced options for ontology configuration and column settings\n </div>\n </div>\n </div>\n\n @if (showAdvancedMode()) {\n <div class=\"col-md-6 mb-3\">\n <label for=\"ontologyType\" class=\"form-label\">\n Ontology Type\n <span class=\"badge bg-warning ms-2\">\n <i class=\"bi bi-exclamation-triangle me-1\"></i>Advanced\n </span>\n </label>\n <select\n class=\"form-select\"\n id=\"ontologyType\"\n formControlName=\"ontologyType\"\n (change)=\"onOntologyTypeChange($event)\">\n @for (ontology of ontologyTypes; track $index) {\n <option [value]=\"$index\">{{ ontology.label }}</option>\n }\n </select>\n\n @if (hasOntologyType) {\n <div class=\"form-text mt-2\">\n <i class=\"bi bi-info-circle me-1\"></i>\n Custom ontology filters will be applied based on the selected type\n </div>\n }\n </div>\n\n @if (hasOntologyType) {\n <div class=\"col-12 mb-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"enableTypeahead\"\n formControlName=\"enableTypeahead\">\n <label class=\"form-check-label\" for=\"enableTypeahead\">\n <i class=\"bi bi-search me-1\"></i>Enable Typeahead Autocomplete\n </label>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>\n Enable autocomplete suggestions from {{ selectedOntologyConfig?.label || 'selected' }} ontology when editing values\n </div>\n </div>\n </div>\n }\n\n <!-- Column Options - Advanced Mode Only -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-sliders me-2\"></i>Column Options\n <span class=\"badge bg-warning ms-2\">\n <i class=\"bi bi-exclamation-triangle me-1\"></i>Advanced\n </span>\n </h6>\n </div>\n\n <div class=\"col-12 mb-3\">\n <div class=\"row\">\n <div class=\"col-md-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"mandatory\"\n formControlName=\"mandatory\">\n <label class=\"form-check-label\" for=\"mandatory\">\n <i class=\"bi bi-exclamation-circle me-1\"></i>Mandatory\n </label>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"hidden\"\n formControlName=\"hidden\">\n <label class=\"form-check-label\" for=\"hidden\">\n <i class=\"bi bi-eye-slash me-1\"></i>Hidden\n </label>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"readonly\"\n formControlName=\"readonly\">\n <label class=\"form-check-label\" for=\"readonly\">\n <i class=\"bi bi-lock me-1\"></i>Read Only\n </label>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"notApplicable\"\n formControlName=\"notApplicable\">\n <label class=\"form-check-label\" for=\"notApplicable\">\n <i class=\"bi bi-dash-circle me-1\"></i>N/A\n </label>\n </div>\n </div>\n </div>\n </div>\n }\n\n <div class=\"col-12 mb-3\">\n <label for=\"defaultValue\" class=\"form-label\">\n Default Value\n @if (hasTypeaheadEnabled) {\n <span class=\"badge bg-success ms-2\">\n <i class=\"bi bi-search me-1\"></i>Typeahead Enabled\n </span>\n }\n </label>\n \n <div class=\"input-group\">\n <input \n type=\"text\" \n class=\"form-control\"\n id=\"defaultValue\"\n formControlName=\"value\"\n placeholder=\"Enter default value\"\n readonly>\n <button \n type=\"button\" \n class=\"btn btn-outline-primary\"\n (click)=\"openValueEditModal()\"\n title=\"Open advanced value editor\">\n <i class=\"bi bi-pencil me-1\"></i>Edit\n </button>\n </div>\n \n <div class=\"form-text\">\n @if (hasTypeaheadEnabled) {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to use autocomplete suggestions from {{ selectedOntologyConfig?.label || 'selected' }} ontology\n } @else if (hasOntologyType) {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to set default value. Enable typeahead in Advanced Mode for autocomplete suggestions.\n } @else if (showAdvancedMode()) {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to set the default value (select an ontology type above for smart suggestions)\n } @else {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to set the default value (enable Advanced Mode for ontology autocomplete)\n }\n </div>\n </div>\n\n </div>\n </form>\n</div>\n\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"onCancel()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn btn-primary\" \n (click)=\"onSubmit()\"\n [disabled]=\"editForm.invalid || isLoading()\">\n @if (isLoading()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-check-circle me-1\"></i>\n {{ isEdit ? 'Update' : 'Add' }} Column\n </button>\n</div>\n","import { Component, Input, Output, EventEmitter, OnInit, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbActiveModal, NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { LabGroup, ResourceVisibility } from '@noatgnu/cupcake-core';\nimport { MetadataTableTemplate, MetadataColumn } from '../../../models';\nimport { MetadataTableTemplateService } from '../../../services/metadata-table-template';\nimport { ColumnEditModal } from '../column-edit-modal/column-edit-modal';\nimport { ToastService } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-metadata-table-template-edit-modal',\n imports: [CommonModule, ReactiveFormsModule, NgbModule, DragDropModule],\n templateUrl: './metadata-table-template-edit-modal.html',\n styleUrl: './metadata-table-template-edit-modal.scss'\n})\nexport class MetadataTableTemplateEditModal implements OnInit {\n @Input() template: MetadataTableTemplate | null = null;\n @Input() labGroups: LabGroup[] = [];\n @Input() isEdit = false;\n @Output() templateSaved = new EventEmitter<Partial<MetadataTableTemplate>>();\n\n editForm: FormGroup;\n isLoading = signal(false);\n \n // Column management\n _templateColumns = signal<MetadataColumn[]>([]);\n templateColumns = computed(() => {\n // Sort columns by position, then by name+type for grouping same columns together\n return this._templateColumns().sort((a, b) => {\n if (a.columnPosition !== b.columnPosition) {\n return (a.columnPosition || 0) - (b.columnPosition || 0);\n }\n // Secondary sort: group columns with same name and type together\n const aKey = `${a.name}_${a.type}`;\n const bKey = `${b.name}_${b.type}`;\n return aKey.localeCompare(bKey);\n });\n });\n\n // Available options for dropdowns\n visibilityOptions = [\n { value: ResourceVisibility.PRIVATE, label: 'Private' },\n { value: ResourceVisibility.GROUP, label: 'Lab Group' },\n { value: ResourceVisibility.PUBLIC, label: 'Public' }\n ];\n\n constructor(\n private fb: FormBuilder,\n private activeModal: NgbActiveModal,\n private modalService: NgbModal,\n private metadataTableTemplateService: MetadataTableTemplateService,\n private toastService: ToastService\n ) {\n this.editForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(3)]],\n description: [''],\n visibility: [ResourceVisibility.PRIVATE],\n isDefault: [false],\n labGroupId: [null]\n });\n }\n\n ngOnInit() {\n if (this.template && this.isEdit) {\n this.populateForm();\n }\n }\n\n private populateForm() {\n if (this.template) {\n const labGroupId = this.template.labGroup;\n \n this.editForm.patchValue({\n name: this.template.name,\n description: this.template.description || '',\n visibility: this.template.visibility || ResourceVisibility.PRIVATE,\n isDefault: this.template.isDefault || false,\n labGroupId: labGroupId || null\n });\n \n // Load existing columns if editing\n if (this.template.userColumns) {\n this._templateColumns.set([...this.template.userColumns]);\n }\n }\n }\n\n onSubmit() {\n if (this.editForm.valid) {\n this.isLoading.set(true);\n const formValue = this.editForm.value;\n \n // Clean up form data\n const templateData: Partial<MetadataTableTemplate> = {\n name: formValue.name,\n description: formValue.description || '',\n visibility: formValue.visibility || ResourceVisibility.PRIVATE,\n isDefault: formValue.isDefault || false,\n labGroup: formValue.labGroupId || null,\n // Include updated columns\n userColumns: this._templateColumns(),\n // Keep existing field mapping if editing\n ...(this.template && {\n fieldMaskMapping: this.template.fieldMaskMapping\n })\n };\n\n this.templateSaved.emit(templateData);\n } else {\n this.markFormGroupTouched();\n }\n }\n\n private markFormGroupTouched() {\n Object.keys(this.editForm.controls).forEach(key => {\n const control = this.editForm.get(key);\n control?.markAsTouched();\n });\n }\n\n onCancel() {\n this.activeModal.dismiss();\n }\n\n onClose() {\n this.isLoading.set(false);\n this.activeModal.close();\n }\n\n getFieldError(fieldName: string): string {\n const control = this.editForm.get(fieldName);\n if (control?.errors && control.touched) {\n if (control.errors['required']) return `${fieldName} is required`;\n if (control.errors['minlength']) return `${fieldName} must be at least ${control.errors['minlength'].requiredLength} characters`;\n }\n return '';\n }\n\n get title(): string {\n return this.isEdit ? 'Edit Table Template' : 'Create Table Template';\n }\n\n // Column Management Methods\n\n addColumn() {\n this.openColumnModal(null, false);\n }\n\n addColumnWithAutoReorder() {\n // Only available for existing templates\n if (!this.isEdit || !this.template?.id) {\n this.toastService.error('Auto-reorder is only available for existing templates');\n return;\n }\n this.openColumnModal(null, false, true);\n }\n\n editColumn(column: MetadataColumn) {\n this.openColumnModal(column, true);\n }\n\n duplicateColumn(column: MetadataColumn) {\n const currentColumns = this._templateColumns();\n const newColumn: MetadataColumn = {\n ...column,\n id: this.generateTempId(), // Generate temporary ID for tracking\n name: `${column.name} (Copy)`,\n columnPosition: this.getNextPositionForSameType(column)\n };\n\n // Add the duplicated column right after columns with same name/type\n const updatedColumns = [...currentColumns, newColumn];\n this.normalizeColumnPositions(updatedColumns);\n this._templateColumns.set(updatedColumns);\n }\n\n removeColumn(column: MetadataColumn) {\n const confirmMessage = `Are you sure you want to remove the column \"${column.name}\"?`;\n \n if (confirm(confirmMessage)) {\n const currentColumns = this._templateColumns();\n const updatedColumns = currentColumns.filter(col => col.id !== column.id);\n this.normalizeColumnPositions(updatedColumns);\n this._templateColumns.set(updatedColumns);\n }\n }\n\n onColumnDrop(event: CdkDragDrop<MetadataColumn[]>) {\n // If dropped in the same position, no action needed\n if (event.previousIndex === event.currentIndex) {\n return;\n }\n\n const currentColumns = [...this._templateColumns()];\n \n // Move the item in the array\n moveItemInArray(currentColumns, event.previousIndex, event.currentIndex);\n \n // Normalize positions and ensure same name/type grouping\n this.normalizeColumnPositions(currentColumns);\n this.enforceGrouping(currentColumns);\n \n this._templateColumns.set(currentColumns);\n }\n\n private openColumnModal(column: MetadataColumn | null, isEdit: boolean, useAutoReorder: boolean = false) {\n const modalRef = this.modalService.open(ColumnEditModal, {\n size: 'lg',\n backdrop: 'static',\n keyboard: false\n });\n\n modalRef.componentInstance.column = column;\n modalRef.componentInstance.templateId = this.template?.id || null;\n modalRef.componentInstance.isEdit = isEdit;\n\n modalRef.componentInstance.columnSaved.subscribe((columnData: Partial<MetadataColumn>) => {\n if (useAutoReorder && this.template?.id) {\n this.handleColumnSaveWithAutoReorder(columnData);\n } else {\n this.handleColumnSave(columnData, column, isEdit);\n }\n modalRef.componentInstance.onClose();\n });\n }\n\n private handleColumnSave(columnData: Partial<MetadataColumn>, originalColumn: MetadataColumn | null, isEdit: boolean) {\n const currentColumns = this._templateColumns();\n \n if (isEdit && originalColumn) {\n // Update existing column\n const updatedColumns = currentColumns.map(col => \n col.id === originalColumn.id \n ? { ...col, ...columnData }\n : col\n );\n \n // Check if name/type changed and needs regrouping\n if (columnData.name !== originalColumn.name || columnData.type !== originalColumn.type) {\n this.enforceGrouping(updatedColumns);\n }\n \n this.normalizeColumnPositions(updatedColumns);\n this._templateColumns.set(updatedColumns);\n } else {\n // Add new column\n const newColumn: MetadataColumn = {\n ...columnData as MetadataColumn,\n id: this.generateTempId(),\n columnPosition: this.getNextPositionForNameType(columnData.name!, columnData.type!)\n };\n \n const updatedColumns = [...currentColumns, newColumn];\n this.enforceGrouping(updatedColumns);\n this.normalizeColumnPositions(updatedColumns);\n this._templateColumns.set(updatedColumns);\n }\n }\n\n private handleColumnSaveWithAutoReorder(columnData: Partial<MetadataColumn>): void {\n if (!this.template?.id) {\n this.toastService.error('Template ID not found');\n return;\n }\n\n this.isLoading.set(true);\n \n this.metadataTableTemplateService.addColumnWithAutoReorder(this.template.id, {\n columnData: columnData\n }).subscribe({\n next: (response: { message: string; column: any; reordered: boolean; schemaIdsUsed: number[] }) => {\n this.isLoading.set(false);\n \n // Refresh the template data by reloading it\n this.reloadTemplateColumns();\n \n // Show success message with reordering info\n let message = `Column \"${response.column.name}\" added successfully!`;\n if (response.reordered) {\n message += ` Columns reordered using ${response.schemaIdsUsed.length} schema(s).`;\n }\n \n this.toastService.success(message);\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error adding column with auto-reorder:', error);\n this.toastService.error('Failed to add column with auto-reorder');\n }\n });\n }\n\n private reloadTemplateColumns(): void {\n if (this.template?.id) {\n this.metadataTableTemplateService.getMetadataTableTemplate(this.template.id).subscribe({\n next: (updatedTemplate) => {\n this._templateColumns.set([...updatedTemplate.userColumns || []]);\n },\n error: (error) => {\n console.error('Error reloading template columns:', error);\n }\n });\n }\n }\n\n private generateTempId(): number {\n // Generate a temporary negative ID for new columns\n const currentColumns = this._templateColumns();\n const minId = Math.min(0, ...currentColumns.map(col => col.id || 0));\n return minId - 1;\n }\n\n private getNextPositionForSameType(column: MetadataColumn): number {\n const currentColumns = this._templateColumns();\n const sameNameTypeColumns = currentColumns.filter(col => \n col.name === column.name && col.type === column.type\n );\n \n if (sameNameTypeColumns.length === 0) {\n return currentColumns.length;\n }\n \n const maxPosition = Math.max(...sameNameTypeColumns.map(col => col.columnPosition || 0));\n return maxPosition + 1;\n }\n\n private getNextPositionForNameType(name: string, type: string): number {\n const currentColumns = this._templateColumns();\n const sameNameTypeColumns = currentColumns.filter(col => \n col.name === name && col.type === type\n );\n \n if (sameNameTypeColumns.length === 0) {\n return currentColumns.length;\n }\n \n const maxPosition = Math.max(...sameNameTypeColumns.map(col => col.columnPosition || 0));\n return maxPosition + 1;\n }\n\n private normalizeColumnPositions(columns: MetadataColumn[]) {\n columns.forEach((col, index) => {\n col.columnPosition = index;\n });\n }\n\n private enforceGrouping(columns: MetadataColumn[]) {\n // Group columns by name+type and ensure they are together\n const groups = new Map<string, MetadataColumn[]>();\n \n columns.forEach(col => {\n const key = `${col.name}_${col.type}`;\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(col);\n });\n \n // Rebuild array with proper grouping\n let position = 0;\n const regroupedColumns: MetadataColumn[] = [];\n \n for (const [key, groupColumns] of groups) {\n // Sort within group by original position to maintain relative order\n groupColumns.sort((a, b) => (a.columnPosition || 0) - (b.columnPosition || 0));\n \n groupColumns.forEach(col => {\n col.columnPosition = position++;\n regroupedColumns.push(col);\n });\n }\n \n // Replace original array contents\n columns.length = 0;\n columns.push(...regroupedColumns);\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>{{ title }}\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"onCancel()\"></button>\n</div>\n\n<div class=\"modal-body\">\n <form [formGroup]=\"editForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"row\">\n <!-- Basic Information -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-info-circle me-2\"></i>Basic Information\n </h6>\n </div>\n \n <div class=\"col-12 mb-3\">\n <label for=\"templateName\" class=\"form-label\">Template Name *</label>\n <input \n type=\"text\" \n class=\"form-control\"\n id=\"templateName\"\n formControlName=\"name\"\n [class.is-invalid]=\"editForm.get('name')?.invalid && editForm.get('name')?.touched\"\n placeholder=\"Enter template name\">\n <div class=\"invalid-feedback\">\n {{ getFieldError('name') }}\n </div>\n </div>\n\n <div class=\"col-12 mb-3\">\n <label for=\"description\" class=\"form-label\">Description</label>\n <textarea \n class=\"form-control\" \n id=\"description\"\n formControlName=\"description\"\n rows=\"3\"\n placeholder=\"Optional description\"></textarea>\n </div>\n\n <!-- Configuration -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-gear me-2\"></i>Configuration\n </h6>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"labGroup\" class=\"form-label\">Lab Group</label>\n <select \n class=\"form-select\"\n id=\"labGroup\"\n formControlName=\"labGroupId\">\n <option [ngValue]=\"null\">No Lab Group</option>\n @for (group of labGroups; track group.id) {\n <option [ngValue]=\"group.id\">{{ group.name }}</option>\n }\n </select>\n </div>\n\n <div class=\"col-12 mb-3\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <label for=\"visibility\" class=\"form-label\">Visibility</label>\n <select \n class=\"form-select\"\n id=\"visibility\"\n formControlName=\"visibility\">\n @for (option of visibilityOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-check form-switch\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n id=\"isDefault\"\n formControlName=\"isDefault\">\n <label class=\"form-check-label\" for=\"isDefault\">\n <i class=\"bi bi-star me-1\"></i>Default Template\n </label>\n <small class=\"form-text text-muted d-block\">Use as default for new projects</small>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Column Management -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-columns-gap me-2\"></i>Template Columns\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary ms-2\" (click)=\"addColumn()\">\n <i class=\"bi bi-plus me-1\"></i>Add Column\n </button>\n @if (isEdit && template?.id) {\n <button type=\"button\" class=\"btn btn-sm btn-success ms-2\" (click)=\"addColumnWithAutoReorder()\" \n [disabled]=\"isLoading()\"\n title=\"Add column with automatic schema-based reordering\">\n <i class=\"bi bi-plus-circle me-1\"></i>Add Column (Auto-Reorder)\n </button>\n }\n </h6>\n </div>\n\n <div class=\"col-12 mb-3\">\n @if (templateColumns().length > 0) {\n <div class=\"table-responsive\">\n <table class=\"table table-sm table-hover\">\n <thead class=\"table-light\">\n <tr>\n <th style=\"width: 40px;\"><i class=\"bi bi-arrows-move\"></i></th>\n <th>Position</th>\n <th>Column Name</th>\n <th>Type</th>\n <th>Default Value</th>\n <th>Options</th>\n <th style=\"width: 120px;\">Actions</th>\n </tr>\n </thead>\n <tbody cdkDropList (cdkDropListDropped)=\"onColumnDrop($event)\" [cdkDropListData]=\"_templateColumns()\">\n @for (column of _templateColumns(); track column.id; let i = $index) {\n <tr cdkDrag [cdkDragData]=\"column\" class=\"column-row\" [attr.data-column-id]=\"column.id\">\n <td class=\"text-center\">\n <i class=\"bi bi-grip-vertical drag-handle\" cdkDragHandle></i>\n </td>\n <td>\n <span class=\"badge bg-secondary\">{{ i + 1 }}</span>\n </td>\n <td>\n <strong>{{ column.name }}</strong>\n </td>\n <td>\n <span class=\"badge bg-info\">{{ column.type }}</span>\n </td>\n <td>\n <span class=\"text-muted\">{{ column.value || '-' }}</span>\n </td>\n <td>\n <div class=\"d-flex gap-1\">\n @if (column.mandatory) {\n <span class=\"badge badge-pill bg-warning\" title=\"Mandatory\">\n <i class=\"bi bi-exclamation-circle\"></i>\n </span>\n }\n @if (column.hidden) {\n <span class=\"badge badge-pill bg-secondary\" title=\"Hidden\">\n <i class=\"bi bi-eye-slash\"></i>\n </span>\n }\n @if (column.readonly) {\n <span class=\"badge badge-pill bg-dark\" title=\"Read Only\">\n <i class=\"bi bi-lock\"></i>\n </span>\n }\n @if (column.ontologyType) {\n <span class=\"badge badge-pill bg-success\" title=\"Has Ontology\">\n <i class=\"bi bi-tags\"></i>\n </span>\n }\n </div>\n </td>\n <td>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button \n type=\"button\"\n class=\"btn btn-outline-primary\" \n (click)=\"editColumn(column)\"\n title=\"Edit column\">\n <i class=\"bi bi-pencil\"></i>\n </button>\n <button \n type=\"button\"\n class=\"btn btn-outline-info\" \n (click)=\"duplicateColumn(column)\"\n title=\"Duplicate column\">\n <i class=\"bi bi-copy\"></i>\n </button>\n <button \n type=\"button\"\n class=\"btn btn-outline-danger\" \n (click)=\"removeColumn(column)\"\n title=\"Remove column\">\n <i class=\"bi bi-trash\"></i>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"text-center py-4 text-muted\">\n <i class=\"bi bi-columns-gap fs-1 mb-2\"></i>\n <p>No columns in this template yet.</p>\n <div class=\"d-flex gap-2 justify-content-center\">\n <button type=\"button\" class=\"btn btn-primary btn-sm\" (click)=\"addColumn()\">\n <i class=\"bi bi-plus me-1\"></i>Add First Column\n </button>\n @if (isEdit && template?.id) {\n <button type=\"button\" class=\"btn btn-success btn-sm\" (click)=\"addColumnWithAutoReorder()\" \n [disabled]=\"isLoading()\"\n title=\"Add column with automatic schema-based reordering\">\n <i class=\"bi bi-plus-circle me-1\"></i>Add with Auto-Reorder\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </form>\n</div>\n\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"onCancel()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn btn-primary\" \n (click)=\"onSubmit()\"\n [disabled]=\"editForm.invalid || isLoading()\">\n @if (isLoading()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-check-circle me-1\"></i>\n {{ isEdit ? 'Update' : 'Create' }} Template\n </button>\n</div>\n","import { Component, EventEmitter, Input, Output, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { ResourceVisibility } from '@noatgnu/cupcake-core';\n\nexport interface TemplateSchemaSelectionResult {\n name: string;\n description: string;\n schemaIds: number[];\n labGroupId?: number;\n visibility: ResourceVisibility;\n isDefault: boolean;\n}\n\n@Component({\n selector: 'ccv-template-schema-selection-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './schema-selection-modal.html',\n styleUrl: './schema-selection-modal.scss'\n})\nexport class TemplateSchemaSelectionModal {\n @Input() availableSchemas: any[] = [];\n @Input() labGroups: any[] = [];\n @Output() templateCreated = new EventEmitter<TemplateSchemaSelectionResult>();\n\n templateForm: FormGroup;\n selectedSchemas = signal<Set<number>>(new Set());\n\n // Computed values\n selectedSchemasCount = computed(() => this.selectedSchemas().size);\n\n constructor(\n private fb: FormBuilder,\n public activeModal: NgbActiveModal\n ) {\n this.templateForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(1)]],\n description: [''],\n labGroupId: [null],\n visibility: [ResourceVisibility.PRIVATE],\n isDefault: [false]\n });\n }\n\n toggleSchema(schemaId: number) {\n const current = this.selectedSchemas();\n const updated = new Set(current);\n \n if (updated.has(schemaId)) {\n updated.delete(schemaId);\n } else {\n updated.add(schemaId);\n }\n \n this.selectedSchemas.set(updated);\n this.updateDescription();\n }\n\n onSchemaCheckChange(event: Event, schemaId: number) {\n // Prevent event propagation to avoid double-toggle from card click\n event.stopPropagation();\n // Toggle the schema selection when checkbox is clicked\n this.toggleSchema(schemaId);\n }\n\n isSchemaSelected(schemaId: number): boolean {\n return this.selectedSchemas().has(schemaId);\n }\n\n getSelectedSchemas(): number[] {\n return [...this.selectedSchemas()];\n }\n\n removeSchema(schemaId: number) {\n const current = this.selectedSchemas();\n const updated = new Set(current);\n updated.delete(schemaId);\n this.selectedSchemas.set(updated);\n this.updateDescription();\n }\n\n getSchemaDisplayName(schemaId: number): string {\n const schema = this.availableSchemas.find(s => s.id === schemaId);\n return schema?.displayName || schema?.name || `Schema ${schemaId}`;\n }\n\n private updateDescription() {\n const selectedSchemas = this.getSelectedSchemas();\n if (selectedSchemas.length > 0 && !this.templateForm.get('description')?.dirty) {\n const schemaNames = selectedSchemas.map(id => this.getSchemaDisplayName(id)).join(', ');\n this.templateForm.patchValue({\n description: `Template created from schemas: ${schemaNames}`\n });\n }\n }\n\n canCreateTemplate(): boolean {\n const formValid = this.templateForm.valid;\n const hasSchemas = this.selectedSchemasCount() > 0;\n \n // Debug logging\n if (!formValid) {\n console.log('Form errors:', this.templateForm.errors);\n console.log('Form controls errors:', Object.keys(this.templateForm.controls).reduce((acc, key) => {\n const control = this.templateForm.get(key);\n if (control?.errors) {\n acc[key] = control.errors;\n }\n return acc;\n }, {} as any));\n }\n \n console.log('canCreateTemplate:', { formValid, hasSchemas, result: formValid && hasSchemas });\n return formValid && hasSchemas;\n }\n\n onCreateTemplate() {\n if (!this.canCreateTemplate()) {\n // Mark all fields as touched to show validation errors\n this.templateForm.markAllAsTouched();\n return;\n }\n\n const formValue = this.templateForm.value;\n const result: TemplateSchemaSelectionResult = {\n name: formValue.name,\n description: formValue.description || '',\n schemaIds: this.getSelectedSchemas(),\n labGroupId: formValue.labGroupId || undefined,\n visibility: formValue.visibility || ResourceVisibility.PRIVATE,\n isDefault: formValue.isDefault || false\n };\n\n this.templateCreated.emit(result);\n }\n\n onCancel() {\n this.activeModal.dismiss();\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-file-earmark-plus me-2\"></i>Create Template from Schemas\n </h4>\n <button\n type=\"button\"\n class=\"btn-close\"\n aria-label=\"Close\"\n (click)=\"onCancel()\">\n </button>\n</div>\n\n<div class=\"modal-body\">\n <form [formGroup]=\"templateForm\" class=\"needs-validation\" novalidate>\n <!-- Template Basic Information -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-info-circle me-1\"></i>Template Information\n </h6>\n </div>\n <div class=\"card-body\">\n <div class=\"row\">\n <div class=\"col-12 mb-3\">\n <div class=\"form-floating\">\n <input\n type=\"text\"\n class=\"form-control\"\n [class.is-invalid]=\"templateForm.get('name')?.invalid && templateForm.get('name')?.touched\"\n id=\"templateName\"\n formControlName=\"name\"\n placeholder=\"Enter template name\">\n <label for=\"templateName\">Template Name *</label>\n @if (templateForm.get('name')?.invalid && templateForm.get('name')?.touched) {\n <div class=\"invalid-feedback\">\n Template name is required.\n </div>\n }\n </div>\n </div>\n <div class=\"col-12 mb-3\">\n <div class=\"form-floating\">\n <textarea\n class=\"form-control\"\n id=\"templateDescription\"\n formControlName=\"description\"\n style=\"height: 80px\"\n placeholder=\"Enter template description\">\n </textarea>\n <label for=\"templateDescription\">Description</label>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Schema Selection -->\n <div class=\"card mb-4\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-check2-square me-1\"></i>Select Schemas\n </h6>\n <small class=\"text-muted\">{{ selectedSchemasCount() }} selected</small>\n </div>\n <div class=\"card-body\">\n @if (availableSchemas.length === 0) {\n <div class=\"text-center text-muted py-3\">\n <i class=\"bi bi-exclamation-triangle fs-4 d-block mb-2\"></i>\n No schemas available\n </div>\n } @else {\n <div class=\"row\">\n @for (schema of availableSchemas; track schema.id) {\n <div class=\"col-md-6 mb-2\">\n <div class=\"card schema-card\"\n [class.selected]=\"isSchemaSelected(schema.id)\"\n (click)=\"toggleSchema(schema.id)\">\n <div class=\"card-body p-3\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n [id]=\"'schema-' + schema.id\"\n [checked]=\"isSchemaSelected(schema.id)\"\n (change)=\"onSchemaCheckChange($event, schema.id)\">\n <label class=\"form-check-label w-100\" [for]=\"'schema-' + schema.id\">\n <div class=\"d-flex justify-content-between align-items-start\">\n <div class=\"flex-grow-1\">\n <strong class=\"schema-title\">{{ schema.displayName }}</strong>\n @if (schema.description) {\n <p class=\"schema-description text-muted small mb-1\">\n {{ schema.description }}\n </p>\n }\n <div class=\"schema-metadata\">\n @if (schema.tags && schema.tags.length > 0) {\n @for (tag of schema.tags; track tag) {\n <span class=\"badge bg-secondary me-1\">{{ tag }}</span>\n }\n }\n @if (schema.usage_count > 0) {\n <small class=\"text-muted\">\n <i class=\"bi bi-graph-up me-1\"></i>{{ schema.usage_count }} uses\n </small>\n }\n </div>\n </div>\n </div>\n </label>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (selectedSchemasCount() === 0) {\n <div class=\"alert alert-warning mt-3\" role=\"alert\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\n Please select at least one schema to create a template.\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Template Settings -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-gear me-1\"></i>Template Settings\n </h6>\n </div>\n <div class=\"card-body\">\n <div class=\"row\">\n <div class=\"col-md-6 mb-3\">\n <div class=\"form-floating\">\n <select\n class=\"form-select\"\n id=\"labGroup\"\n formControlName=\"labGroupId\">\n <option [ngValue]=\"null\">No Lab Group</option>\n @for (group of labGroups; track group.id) {\n <option [ngValue]=\"group.id\">{{ group.name }}</option>\n }\n </select>\n <label for=\"labGroup\">Lab Group</label>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-check form-switch mb-3\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"isDefault\"\n formControlName=\"isDefault\">\n <label class=\"form-check-label\" for=\"isDefault\">\n <i class=\"bi bi-star me-1\"></i>Default Template\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Preview Section -->\n @if (selectedSchemasCount() > 0) {\n <div class=\"card\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-eye me-1\"></i>Selected Schemas Preview\n </h6>\n </div>\n <div class=\"card-body\">\n <div class=\"d-flex flex-wrap gap-2\">\n @for (schemaId of getSelectedSchemas(); track schemaId) {\n <span class=\"badge bg-primary fs-6 py-2 px-3\">\n {{ getSchemaDisplayName(schemaId) }}\n <button\n type=\"button\"\n class=\"btn-close btn-close-white ms-2\"\n style=\"font-size: 0.6em;\"\n (click)=\"removeSchema(schemaId)\"\n [attr.aria-label]=\"'Remove ' + getSchemaDisplayName(schemaId)\">\n </button>\n </span>\n }\n </div>\n <p class=\"text-muted small mt-2 mb-0\">\n This template will combine columns from {{ selectedSchemasCount() }} schema{{ selectedSchemasCount() === 1 ? '' : 's' }}.\n </p>\n </div>\n </div>\n }\n </form>\n</div>\n\n<div class=\"modal-footer\">\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"onCancel()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!canCreateTemplate()\"\n (click)=\"onCreateTemplate()\">\n <i class=\"bi bi-plus-circle me-1\"></i>Create Template\n </button>\n</div>\n","import { Component, OnInit, OnDestroy, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { Schema } from '../../models';\r\nimport { SchemaService } from '../../services';\r\nimport { ToastService } from '@noatgnu/cupcake-core';\r\n\r\nexport interface SchemaSelectionResult {\r\n selectedSchemaIds: number[];\r\n}\r\n\r\n@Component({\r\n selector: 'ccv-schema-selection-modal',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, NgbModule],\r\n templateUrl: './schema-selection-modal.html',\r\n styleUrl: './schema-selection-modal.scss'\r\n})\r\nexport class SchemaSelectionModal implements OnInit, OnDestroy {\r\n private destroy$ = new Subject<void>();\r\n\r\n // Modal configuration - set from parent\r\n title = 'Select Schemas for Column Reordering';\r\n description = 'Choose which schemas to use for reordering columns. Columns will be ordered based on the selected schemas.';\r\n\r\n // State signals\r\n isLoading = signal(false);\r\n availableSchemas = signal<Schema[]>([]);\r\n selectedSchemaIds = signal<Set<number>>(new Set());\r\n searchTerm = signal('');\r\n\r\n constructor(\r\n public activeModal: NgbActiveModal,\r\n private schemaService: SchemaService,\r\n private toastService: ToastService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.loadAvailableSchemas();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n private loadAvailableSchemas(): void {\r\n this.isLoading.set(true);\r\n\r\n this.schemaService.getAvailableSchemas().pipe(\r\n takeUntil(this.destroy$)\r\n ).subscribe({\r\n next: (schemas) => {\r\n this.availableSchemas.set(schemas.filter(schema => schema.isActive));\r\n this.isLoading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('Error loading schemas:', error);\r\n this.toastService.error('Failed to load available schemas');\r\n this.isLoading.set(false);\r\n }\r\n });\r\n }\r\n\r\n get filteredSchemas(): Schema[] {\r\n const schemas = this.availableSchemas();\r\n const search = this.searchTerm().toLowerCase();\r\n\r\n if (!search) {\r\n return schemas;\r\n }\r\n\r\n return schemas.filter(schema =>\r\n schema.name.toLowerCase().includes(search) ||\r\n schema.description?.toLowerCase().includes(search) ||\r\n schema.category?.toLowerCase().includes(search)\r\n );\r\n }\r\n\r\n toggleSchemaSelection(schemaId: number): void {\r\n const selected = new Set(this.selectedSchemaIds());\r\n\r\n if (selected.has(schemaId)) {\r\n selected.delete(schemaId);\r\n } else {\r\n selected.add(schemaId);\r\n }\r\n\r\n this.selectedSchemaIds.set(selected);\r\n }\r\n\r\n isSchemaSelected(schemaId: number): boolean {\r\n return this.selectedSchemaIds().has(schemaId);\r\n }\r\n\r\n selectAll(): void {\r\n const allIds = new Set(this.filteredSchemas.map(schema => schema.id));\r\n this.selectedSchemaIds.set(allIds);\r\n }\r\n\r\n clearSelection(): void {\r\n this.selectedSchemaIds.set(new Set());\r\n }\r\n\r\n onCancel(): void {\r\n this.activeModal.dismiss();\r\n }\r\n\r\n onConfirm(): void {\r\n const selectedIds = Array.from(this.selectedSchemaIds());\r\n\r\n if (selectedIds.length === 0) {\r\n this.toastService.warning('Please select at least one schema');\r\n return;\r\n }\r\n\r\n const result: SchemaSelectionResult = {\r\n selectedSchemaIds: selectedIds\r\n };\r\n\r\n this.activeModal.close(result);\r\n }\r\n\r\n getBadgeClass(category?: string): string {\r\n if (!category) return 'bg-secondary';\r\n\r\n const categoryMap: Record<string, string> = {\r\n 'proteomics': 'bg-primary',\r\n 'genomics': 'bg-success',\r\n 'metabolomics': 'bg-info',\r\n 'general': 'bg-secondary',\r\n 'custom': 'bg-warning'\r\n };\r\n\r\n return categoryMap[category.toLowerCase()] || 'bg-secondary';\r\n }\r\n}","<!-- Schema Selection Modal -->\r\n<div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n <i class=\"bi bi-arrows-move me-2\"></i>{{ title }}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"onCancel()\"></button>\r\n</div>\r\n\r\n<div class=\"modal-body\">\r\n <!-- Description -->\r\n <div class=\"alert alert-info mb-4\">\r\n <div class=\"d-flex align-items-start\">\r\n <i class=\"bi bi-info-circle-fill me-2 mt-1\"></i>\r\n <div>\r\n <small>{{ description }}</small>\r\n <br>\r\n <small class=\"text-muted\">\r\n Leave empty to use all available schemas or select specific ones for custom ordering.\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Search and Actions -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-md-8\">\r\n <div class=\"input-group\">\r\n <span class=\"input-group-text\">\r\n <i class=\"bi bi-search\"></i>\r\n </span>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Search schemas...\"\r\n [(ngModel)]=\"searchTerm\"\r\n [ngModelOptions]=\"{updateOn: 'change'}\"\r\n >\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"btn-group w-100\" role=\"group\">\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline-primary btn-sm\"\r\n (click)=\"selectAll()\"\r\n [disabled]=\"filteredSchemas.length === 0\"\r\n title=\"Select All Visible\">\r\n <i class=\"bi bi-check-all\"></i> All\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline-secondary btn-sm\"\r\n (click)=\"clearSelection()\"\r\n [disabled]=\"selectedSchemaIds().size === 0\"\r\n title=\"Clear Selection\">\r\n <i class=\"bi bi-x-circle\"></i> Clear\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Selection Summary -->\r\n @if (selectedSchemaIds().size > 0) {\r\n <div class=\"alert alert-success mb-3\">\r\n <i class=\"bi bi-check-circle me-2\"></i>\r\n <strong>{{ selectedSchemaIds().size }}</strong> schema{{ selectedSchemaIds().size !== 1 ? 's' : '' }} selected\r\n </div>\r\n }\r\n\r\n <!-- Loading State -->\r\n @if (isLoading()) {\r\n <div class=\"text-center py-4\">\r\n <div class=\"spinner-border text-primary\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading schemas...</span>\r\n </div>\r\n <p class=\"text-muted mt-2\">Loading available schemas...</p>\r\n </div>\r\n } @else {\r\n <!-- Schema List -->\r\n <div class=\"schema-list\" style=\"max-height: 400px; overflow-y: auto;\">\r\n @if (filteredSchemas.length === 0) {\r\n <div class=\"text-center py-4 text-muted\">\r\n <i class=\"bi bi-search fs-1 mb-3 opacity-50\"></i>\r\n <h6>No schemas found</h6>\r\n <p class=\"small mb-0\">\r\n @if (searchTerm()) {\r\n Try adjusting your search terms\r\n } @else {\r\n No schemas are currently available\r\n }\r\n </p>\r\n </div>\r\n } @else {\r\n @for (schema of filteredSchemas; track schema.id) {\r\n <div\r\n class=\"schema-item border rounded p-3 mb-2\"\r\n [class.selected]=\"isSchemaSelected(schema.id)\"\r\n (click)=\"toggleSchemaSelection(schema.id)\"\r\n role=\"button\">\r\n\r\n <div class=\"d-flex align-items-start\">\r\n <!-- Checkbox -->\r\n <div class=\"form-check me-3\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"isSchemaSelected(schema.id)\"\r\n [id]=\"'schema-' + schema.id\"\r\n (click)=\"$event.stopPropagation()\">\r\n <label class=\"form-check-label visually-hidden\" [for]=\"'schema-' + schema.id\">\r\n Select {{ schema.name }}\r\n </label>\r\n </div>\r\n\r\n <!-- Schema Info -->\r\n <div class=\"flex-grow-1\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-2\">\r\n <h6 class=\"mb-0 text-truncate me-2\">\r\n {{ schema.name }}\r\n @if (schema.version) {\r\n <small class=\"text-muted\">v{{ schema.version }}</small>\r\n }\r\n </h6>\r\n\r\n <div class=\"flex-shrink-0\">\r\n @if (schema.category) {\r\n <span class=\"badge\" [class]=\"getBadgeClass(schema.category)\">\r\n {{ schema.category }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (schema.description) {\r\n <p class=\"text-muted small mb-1\">{{ schema.description }}</p>\r\n }\r\n\r\n <div class=\"d-flex align-items-center justify-content-between\">\r\n @if (schema.columnsCount !== undefined) {\r\n <small class=\"text-muted\">\r\n <i class=\"bi bi-columns me-1\"></i>{{ schema.columnsCount }} columns\r\n </small>\r\n }\r\n\r\n @if (schema.url) {\r\n <a\r\n [href]=\"schema.url\"\r\n target=\"_blank\"\r\n class=\"btn btn-sm btn-outline-secondary\"\r\n title=\"View Schema Documentation\"\r\n (click)=\"$event.stopPropagation()\">\r\n <i class=\"bi bi-box-arrow-up-right\"></i>\r\n </a>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n<div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\r\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-primary\"\r\n (click)=\"onConfirm()\"\r\n [disabled]=\"isLoading()\">\r\n <i class=\"bi bi-arrows-move me-1\"></i>\r\n @if (selectedSchemaIds().size > 0) {\r\n Reorder with {{ selectedSchemaIds().size }} Schema{{ selectedSchemaIds().size !== 1 ? 's' : '' }}\r\n } @else {\r\n Reorder with All Schemas\r\n }\r\n </button>\r\n</div>","import { Component, EventEmitter, Output, Input, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\nimport { LabGroup } from '@noatgnu/cupcake-core';\nimport { MetadataTableTemplate } from '../../../models';\n\nexport interface TableCreationData {\n name: string;\n templateId: number;\n sampleCount?: number;\n description?: string;\n labGroupId?: number;\n}\n\n@Component({\n selector: 'ccv-table-creation-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: './table-creation-modal.html',\n styleUrl: './table-creation-modal.scss'\n})\nexport class TableCreationModalComponent implements OnInit {\n @Input() template!: MetadataTableTemplate;\n @Input() labGroups: LabGroup[] = [];\n @Input() selectedLabGroupId?: number;\n @Output() tableCreated = new EventEmitter<TableCreationData>();\n\n tableForm: FormGroup;\n isCreating = false;\n errorMessage: string | null = null;\n\n constructor(\n private fb: FormBuilder,\n public activeModal: NgbActiveModal\n ) {\n this.tableForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(2)]],\n sampleCount: [1, [Validators.required, Validators.min(1), Validators.max(10000)]],\n description: [''],\n labGroupId: [null]\n });\n }\n\n ngOnInit() {\n // Set default values\n if (this.template) {\n this.tableForm.patchValue({\n name: `${this.template.name} - Table`,\n labGroupId: this.selectedLabGroupId\n });\n }\n }\n\n onSubmit() {\n if (this.tableForm.valid && this.template) {\n this.isCreating = true;\n this.errorMessage = null;\n \n const formValue = this.tableForm.value;\n const tableData: TableCreationData = {\n name: formValue.name,\n templateId: this.template.id!,\n sampleCount: formValue.sampleCount || 1,\n description: formValue.description || undefined,\n labGroupId: formValue.labGroupId || undefined\n };\n\n this.tableCreated.emit(tableData);\n }\n }\n\n onClose() {\n this.activeModal.dismiss();\n }\n\n setCreatingState(isCreating: boolean) {\n this.isCreating = isCreating;\n }\n\n setErrorMessage(message: string | null) {\n this.errorMessage = message;\n }\n\n getFieldError(fieldName: string): string | null {\n const field = this.tableForm.get(fieldName);\n if (field?.invalid && field?.touched) {\n if (field.errors?.['required']) {\n return `${this.getFieldLabel(fieldName)} is required`;\n }\n if (field.errors?.['minlength']) {\n return `${this.getFieldLabel(fieldName)} must be at least ${field.errors['minlength'].requiredLength} characters`;\n }\n if (field.errors?.['min']) {\n return `${this.getFieldLabel(fieldName)} must be at least ${field.errors['min'].min}`;\n }\n if (field.errors?.['max']) {\n return `${this.getFieldLabel(fieldName)} must be at most ${field.errors['max'].max}`;\n }\n }\n return null;\n }\n\n private getFieldLabel(fieldName: string): string {\n const labels: { [key: string]: string } = {\n name: 'Table name',\n sampleCount: 'Sample count',\n description: 'Description',\n labGroupId: 'Lab group'\n };\n return labels[fieldName] || fieldName;\n }\n}\n","<div class=\"modal-header\">\n <h5 class=\"modal-title\">\n <i class=\"bi bi-table me-2\"></i>Create Table from Template\n </h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"onClose()\" aria-label=\"Close\"></button>\n</div>\n\n<div class=\"modal-body\">\n @if (template) {\n <div class=\"alert alert-info d-flex align-items-center mb-4\">\n <i class=\"bi bi-info-circle me-2\"></i>\n <div>\n <strong>Template:</strong> {{ template.name }}\n @if (template.description) {\n <br><small>{{ template.description }}</small>\n }\n </div>\n </div>\n\n @if (errorMessage) {\n <div class=\"alert alert-danger d-flex align-items-center\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\n {{ errorMessage }}\n </div>\n }\n\n <form [formGroup]=\"tableForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"row g-3\">\n <!-- Table Name -->\n <div class=\"col-12\">\n <div class=\"form-floating\">\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"tableName\"\n formControlName=\"name\"\n placeholder=\"Table name\"\n [class.is-invalid]=\"getFieldError('name')\">\n <label for=\"tableName\">Table Name *</label>\n </div>\n @if (getFieldError('name')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldError('name') }}\n </div>\n }\n </div>\n\n <!-- Sample Count -->\n <div class=\"col-md-6\">\n <div class=\"form-floating\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"sampleCount\"\n formControlName=\"sampleCount\"\n placeholder=\"Sample count\"\n min=\"1\"\n max=\"10000\"\n [class.is-invalid]=\"getFieldError('sampleCount')\">\n <label for=\"sampleCount\">Number of Samples *</label>\n </div>\n @if (getFieldError('sampleCount')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldError('sampleCount') }}\n </div>\n }\n <div class=\"form-text\">\n Number of sample rows to create in the table (1-10,000)\n </div>\n </div>\n\n <!-- Lab Group -->\n <div class=\"col-md-6\">\n <div class=\"form-floating\">\n <select\n class=\"form-select\"\n id=\"labGroupSelect\"\n formControlName=\"labGroupId\">\n <option [ngValue]=\"null\">No Lab Group</option>\n @for (group of labGroups; track group.id) {\n <option [ngValue]=\"group.id\">{{ group.name }}</option>\n }\n </select>\n <label for=\"labGroupSelect\">Lab Group</label>\n </div>\n <div class=\"form-text\">\n Optional: Assign table to a specific lab group\n </div>\n </div>\n\n <!-- Description -->\n <div class=\"col-12\">\n <div class=\"form-floating\">\n <textarea\n class=\"form-control\"\n id=\"tableDescription\"\n formControlName=\"description\"\n placeholder=\"Description\"\n style=\"height: 100px\"></textarea>\n <label for=\"tableDescription\">Description (optional)</label>\n </div>\n <div class=\"form-text\">\n Optional description for the metadata table\n </div>\n </div>\n </div>\n </form>\n }\n</div>\n\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onClose()\" [disabled]=\"isCreating\">\n Cancel\n </button>\n <button\n type=\"submit\"\n class=\"btn btn-success\"\n (click)=\"onSubmit()\"\n [disabled]=\"tableForm.invalid || isCreating\">\n @if (isCreating) {\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></span>\n }\n <i class=\"bi bi-table me-1\"></i>Create Table\n </button>\n</div>\n","import { Component, OnInit, signal, computed, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { debounceTime, distinctUntilChanged } from 'rxjs';\nimport { MetadataTableTemplateEditModal } from './metadata-table-template-edit-modal/metadata-table-template-edit-modal';\nimport { TemplateSchemaSelectionModal, TemplateSchemaSelectionResult } from './schema-selection-modal/schema-selection-modal';\nimport { SchemaSelectionModal as ReorderSchemaSelectionModal, SchemaSelectionResult as ReorderSchemaSelectionResult } from '../schema-selection-modal/schema-selection-modal';\nimport { TableCreationModalComponent, TableCreationData } from './table-creation-modal/table-creation-modal';\nimport { LabGroupService } from '@noatgnu/cupcake-core';\nimport { AsyncTaskUIService } from '../async-task-ui';\nimport { LabGroup, LabGroupQueryResponse, ResourceVisibility } from '@noatgnu/cupcake-core';\nimport {\n MetadataTableTemplate,\n MetadataTableTemplateQueryResponse,\n MetadataTable,\n MetadataTableTemplateCreateRequest\n} from '../../models';\nimport { MetadataTableTemplateService } from '../../services/metadata-table-template';\nimport { ToastService } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-metadata-table-templates',\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './metadata-table-templates.html',\n styleUrl: './metadata-table-templates.scss'\n})\nexport class MetadataTableTemplates implements OnInit {\n searchForm: FormGroup;\n\n // Signals for reactive state management\n private searchParams = signal({\n search: '',\n labGroupId: null as number | null,\n visibility: ResourceVisibility.PRIVATE,\n isDefault: false,\n limit: 10,\n offset: 0\n });\n\n private labGroupParams = signal({\n limit: 10,\n offset: 0\n });\n\n // Computed signals for better performance\n isLoading = signal(false);\n selectedLabGroup = signal<LabGroup | null>(null);\n currentPage = signal(1);\n pageSize = signal(10);\n totalItems = signal(0);\n\n labGroupsCurrentPage = signal(1);\n labGroupsPageSize = signal(10);\n labGroupsTotalItems = signal(0);\n\n // Direct signal-based data management\n templatesData = signal<MetadataTableTemplateQueryResponse>({ count: 0, results: [] });\n labGroupsData = signal<LabGroupQueryResponse>({ count: 0, results: [] });\n\n\n // Computed values for better performance\n hasTemplates = computed(() => this.templatesData().results.length > 0);\n hasLabGroups = computed(() => this.labGroupsData().results.length > 0);\n showTemplatesPagination = computed(() => this.templatesData().count > this.pageSize());\n showLabGroupsPagination = computed(() => this.labGroupsData().count > this.labGroupsPageSize());\n\n // Schema-related properties\n availableSchemas = signal<any[]>([]);\n isLoadingSchemas = signal(false);\n\n constructor(\n private fb: FormBuilder,\n private metadataTableTemplateService: MetadataTableTemplateService,\n private labGroupService: LabGroupService,\n private modalService: NgbModal,\n private toastService: ToastService,\n private asyncTaskService: AsyncTaskUIService\n ) {\n this.searchForm = this.fb.group({\n search: [''],\n labGroupId: [null],\n visibility: [ResourceVisibility.PRIVATE],\n isDefault: [false]\n });\n\n // Effect to automatically reload templates when search params change\n effect(() => {\n const params = this.searchParams();\n this.loadTemplatesWithParams(params);\n });\n\n // Effect to automatically reload lab groups when params change\n effect(() => {\n const params = this.labGroupParams();\n this.loadLabGroupsWithParams(params);\n });\n }\n\n ngOnInit() {\n this.setupSearch();\n this.loadInitialData();\n this.loadAvailableSchemas();\n }\n\n private loadInitialData() {\n // Initial load - signals will handle subsequent updates via effects\n this.labGroupParams.set({\n limit: this.labGroupsPageSize(),\n offset: 0\n });\n\n this.searchParams.set({\n search: '',\n labGroupId: null,\n visibility: ResourceVisibility.PRIVATE,\n isDefault: false,\n limit: this.pageSize(),\n offset: 0\n });\n }\n\n private loadLabGroupsWithParams(params: { limit: number; offset: number }) {\n this.labGroupService.getMyLabGroups(params).subscribe({\n next: (response) => {\n this.labGroupsTotalItems.set(response.count);\n this.labGroupsData.set(response);\n },\n error: (error) => {\n console.error('Error loading lab groups:', error);\n this.labGroupsData.set({ count: 0, results: [] });\n }\n });\n }\n\n private setupSearch() {\n // Subscribe to form changes and update search params signal\n this.searchForm.valueChanges.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(formValue => {\n // Reset to first page when searching\n this.currentPage.set(1);\n\n // Update search params signal - this will trigger the effect\n this.searchParams.set({\n search: formValue.search || '',\n labGroupId: formValue.labGroupId || null,\n visibility: formValue.visibility || ResourceVisibility.PRIVATE,\n isDefault: formValue.isDefault || false,\n limit: this.pageSize(),\n offset: 0 // Always start from first page when searching\n });\n });\n }\n\n private loadTemplatesWithParams(params: any) {\n this.isLoading.set(true);\n\n this.metadataTableTemplateService.getMetadataTableTemplates({\n search: params.search || undefined,\n labGroupId: params.labGroupId || undefined,\n visibility: params.visibility || undefined,\n isDefault: params.isDefault || undefined,\n limit: params.limit,\n offset: params.offset\n }).subscribe({\n next: (response) => {\n this.isLoading.set(false);\n this.totalItems.set(response.count);\n this.templatesData.set(response);\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error loading metadata table templates:', error);\n this.templatesData.set({ count: 0, results: [] });\n }\n });\n }\n\n onLabGroupChange(event: Event) {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n const id = value === 'null' ? null : Number(value);\n const labGroup = id ? this.findLabGroupById(id) : null;\n this.selectedLabGroup.set(labGroup);\n this.currentPage.set(1);\n\n // Update search params - effect will trigger reload\n this.searchParams.update(params => ({\n ...params,\n labGroupId: id,\n offset: 0\n }));\n }\n\n private findLabGroupById(id: number): LabGroup | null {\n const labGroups = this.labGroupsData();\n return labGroups.results.find((group: LabGroup) => group.id === id) || null;\n }\n\n getLabGroupName(labGroupId: number | undefined): string {\n if (!labGroupId) return '-';\n const labGroup = this.findLabGroupById(labGroupId);\n return labGroup?.name || labGroupId.toString();\n }\n\n onPageChange(page: number) {\n this.currentPage.set(page);\n this.searchParams.update(params => ({\n ...params,\n offset: (page - 1) * this.pageSize()\n }));\n }\n\n onLabGroupsPageChange(page: number) {\n this.labGroupsCurrentPage.set(page);\n this.labGroupParams.set({\n limit: this.labGroupsPageSize(),\n offset: (page - 1) * this.labGroupsPageSize()\n });\n }\n\n createTemplate() {\n this.openTemplateModal(null, false);\n }\n\n editTemplate(template: MetadataTableTemplate) {\n this.openTemplateModal(template, true);\n }\n\n deleteTemplate(template: MetadataTableTemplate) {\n // Enhanced delete confirmation with better UX\n const confirmMessage = `Are you sure you want to delete the template \"${template.name}\"?\\n\\nThis action cannot be undone.`;\n\n if (confirm(confirmMessage)) {\n this.isLoading.set(true);\n this.metadataTableTemplateService.deleteMetadataTableTemplate(template.id!).subscribe({\n next: () => {\n this.isLoading.set(false);\n console.log('Template deleted successfully');\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error deleting template:', error);\n alert('Failed to delete template. Please try again.');\n }\n });\n }\n }\n\n duplicateTemplate(template: MetadataTableTemplate) {\n const duplicatedTemplate: MetadataTableTemplateCreateRequest = {\n name: `${template.name} (Copy)`,\n description: template.description,\n userColumnIds: [...(template.userColumnIds || [])],\n fieldMaskMapping: { ...template.fieldMaskMapping },\n visibility: ResourceVisibility.PRIVATE, // Always create as private\n isDefault: false, // Never default\n labGroup: template.labGroup || this.selectedLabGroup()?.id || undefined\n };\n\n this.isLoading.set(true);\n this.metadataTableTemplateService.createMetadataTableTemplate(duplicatedTemplate).subscribe({\n next: (newTemplate) => {\n this.isLoading.set(false);\n console.log('Template duplicated:', newTemplate);\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error duplicating template:', error);\n alert('Failed to duplicate template. Please try again.');\n }\n });\n }\n\n private openTemplateModal(template: MetadataTableTemplate | null, isEdit: boolean) {\n const modalRef = this.modalService.open(MetadataTableTemplateEditModal, {\n size: 'lg',\n backdrop: 'static',\n keyboard: false\n });\n\n modalRef.componentInstance.template = template;\n modalRef.componentInstance.labGroups = this.labGroupsData().results;\n modalRef.componentInstance.isEdit = isEdit;\n\n modalRef.componentInstance.templateSaved.subscribe((templateData: Partial<MetadataTableTemplate>) => {\n this.handleTemplateSave(templateData, template?.id || null, isEdit);\n modalRef.componentInstance.onClose();\n });\n }\n\n private handleTemplateSave(templateData: Partial<MetadataTableTemplate>, templateId: number | null, isEdit: boolean) {\n this.isLoading.set(true);\n\n const apiCall = isEdit && templateId\n ? this.metadataTableTemplateService.updateMetadataTableTemplate(templateId, templateData)\n : this.metadataTableTemplateService.createMetadataTableTemplate(templateData as MetadataTableTemplateCreateRequest);\n\n apiCall.subscribe({\n next: (template) => {\n this.isLoading.set(false);\n console.log(`Metadata table template ${isEdit ? 'updated' : 'created'}:`, template);\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error(`Error ${isEdit ? 'updating' : 'creating'} metadata table template:`, error);\n alert(`Failed to ${isEdit ? 'update' : 'create'} template. Please try again.`);\n }\n });\n }\n\n private refreshTemplates() {\n // Trigger a refresh by updating the search params\n this.searchParams.update(params => ({ ...params }));\n }\n\n private loadAvailableSchemas() {\n this.isLoadingSchemas.set(true);\n\n this.metadataTableTemplateService.getAvailableSchemas().subscribe({\n next: (schemas) => {\n this.availableSchemas.set(schemas);\n this.isLoadingSchemas.set(false);\n },\n error: (error) => {\n console.error('Error loading schemas:', error);\n this.isLoadingSchemas.set(false);\n }\n });\n }\n\n\n createTemplateWithCustomSchemas() {\n this.openSchemaSelectionModal();\n }\n\n private openSchemaSelectionModal() {\n const modalRef = this.modalService.open(TemplateSchemaSelectionModal, {\n size: 'xl',\n backdrop: 'static',\n keyboard: false\n });\n\n // Pass data to the modal\n modalRef.componentInstance.availableSchemas = this.availableSchemas();\n modalRef.componentInstance.labGroups = this.labGroupsData().results;\n\n // Handle modal result\n modalRef.componentInstance.templateCreated.subscribe((result: TemplateSchemaSelectionResult) => {\n this.handleSchemaTemplateCreation(result);\n modalRef.close();\n });\n }\n\n private handleSchemaTemplateCreation(result: TemplateSchemaSelectionResult) {\n this.isLoading.set(true);\n\n const templateData = {\n name: result.name,\n schemaIds: result.schemaIds,\n description: result.description,\n labGroupId: result.labGroupId,\n visibility: result.visibility,\n isDefault: result.isDefault\n };\n\n this.metadataTableTemplateService.createFromSchema({\n schemaIds: result.schemaIds,\n name: result.name,\n description: result.description\n }).subscribe({\n next: (response) => {\n this.isLoading.set(false);\n console.log('Template created from schemas:', response);\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error creating template from schemas:', error);\n alert('Failed to create template from schemas. Please try again.');\n }\n });\n }\n\n createTableFromTemplate(template: MetadataTableTemplate) {\n this.openTableCreationModal(template);\n }\n\n private openTableCreationModal(template: MetadataTableTemplate) {\n const modalRef = this.modalService.open(TableCreationModalComponent, {\n size: 'lg',\n backdrop: 'static',\n keyboard: false\n });\n\n modalRef.componentInstance.template = template;\n modalRef.componentInstance.labGroups = this.labGroupsData().results;\n modalRef.componentInstance.selectedLabGroupId = this.selectedLabGroup()?.id;\n\n modalRef.componentInstance.tableCreated.subscribe((tableData: TableCreationData) => {\n this.handleTableCreation(tableData, modalRef);\n });\n }\n\n private handleTableCreation = (data: TableCreationData, modalRef?: any): void => {\n this.isLoading.set(true);\n\n // Set creating state on modal if provided\n if (modalRef?.componentInstance) {\n modalRef.componentInstance.setCreatingState(true);\n }\n\n this.metadataTableTemplateService.createTableFromTemplate({\n templateId: data.templateId,\n name: data.name,\n description: data.description,\n sampleCount: data.sampleCount || 1\n }).subscribe({\n next: (response: MetadataTable) => {\n this.isLoading.set(false);\n console.log('Metadata table created from template:', response);\n\n // Close modal and show success message\n if (modalRef) {\n modalRef.close();\n }\n\n this.toastService.success(`Table \"${response.name}\" created successfully!`);\n },\n error: (error: { error?: { detail?: string; message?: string }; message?: string }) => {\n this.isLoading.set(false);\n console.error('Error creating table from template:', error);\n\n // Reset creating state on modal if provided and show error\n if (modalRef?.componentInstance) {\n modalRef.componentInstance.setCreatingState(false);\n const errorMsg = error?.error?.detail || error?.error?.message || error?.message || 'Failed to create table from template. Please try again.';\n modalRef.componentInstance.setErrorMessage(errorMsg);\n } else {\n const errorMsg = error?.error?.detail || error?.error?.message || error?.message || 'Failed to create table from template. Please try again.';\n this.toastService.error(errorMsg);\n }\n }\n });\n }\n\n /**\n * Reorder template columns by schema selection\n */\n reorderTemplateColumns(template: MetadataTableTemplate): void {\n if (!template.columnCount || template.columnCount === 0) {\n this.toastService.warning('Template has no columns to reorder');\n return;\n }\n\n const modalRef = this.modalService.open(ReorderSchemaSelectionModal, {\n size: 'lg',\n backdrop: 'static'\n });\n\n modalRef.componentInstance.title = 'Reorder Template Columns by Schema';\n modalRef.componentInstance.description = `Select schemas to reorder columns in template \"${template.name}\". Columns will be arranged based on the selected schema order.`;\n\n modalRef.result.then((result: ReorderSchemaSelectionResult) => {\n if (result && result.selectedSchemaIds) {\n this.performTemplateColumnReorder(template.id, result.selectedSchemaIds);\n }\n }).catch(() => {\n // Modal was dismissed - no action needed\n });\n }\n\n /**\n * Perform the actual template column reordering with async task monitoring\n */\n private performTemplateColumnReorder(templateId: number, schemaIds: number[]): void {\n this.isLoading.set(true);\n\n this.metadataTableTemplateService.reorderColumnsBySchemaAsync(templateId, schemaIds).subscribe({\n next: (response) => {\n console.log('Template column reorder task started:', response);\n this.toastService.success(`Template column reorder task queued successfully! Task ID: ${response.taskId}`);\n \n // Mark task for monitoring and start real-time updates (same pattern as other async operations)\n this.asyncTaskService.monitorTask(response.taskId);\n this.asyncTaskService.startRealtimeUpdates();\n \n this.isLoading.set(false);\n },\n error: (error) => {\n console.error('Error starting template column reorder:', error);\n this.toastService.error('Failed to start template column reordering');\n this.isLoading.set(false);\n }\n });\n }\n}\n","<div class=\"metadata-table-templates-container\">\n <!-- Header Section -->\n <nav class=\"navbar navbar-expand-lg bg-body-tertiary shadow-sm\">\n <div class=\"container-fluid\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center\">\n <h4 class=\"navbar-brand m-0 fw-bold\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>Table Templates\n </h4>\n @if (selectedLabGroup()) {\n <span class=\"badge bg-primary ms-3\">{{ selectedLabGroup()!.name }}</span>\n }\n </div>\n <div class=\"d-flex gap-2\">\n <div class=\"btn-group\" ngbDropdown>\n <button type=\"button\" class=\"btn btn-primary btn-sm dropdown-toggle\" ngbDropdownToggle>\n <i class=\"bi bi-plus me-1\"></i>New Template\n </button>\n <div class=\"dropdown-menu dropdown-menu-end\" ngbDropdownMenu>\n <a class=\"dropdown-item\" href=\"#\" (click)=\"createTemplateWithCustomSchemas(); $event.preventDefault()\"\n title=\"Select one or multiple schemas to create template\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>\n <strong>Create from Schemas</strong>\n </a>\n <div class=\"dropdown-divider\"></div>\n <a class=\"dropdown-item\" href=\"#\" (click)=\"createTemplate(); $event.preventDefault()\"\n title=\"Create from scratch\">\n <i class=\"bi bi-wrench me-2\"></i>\n <strong>Manual Configuration</strong>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </nav>\n\n <div class=\"templates-content p-4\">\n <!-- Search and Filters Section -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-search me-2\"></i>Search & Filters\n </h5>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"searchForm\" class=\"row g-3\">\n <div class=\"col-md-3\">\n <div class=\"form-floating\">\n <input\n type=\"search\"\n class=\"form-control\"\n id=\"templateSearch\"\n formControlName=\"search\"\n placeholder=\"Search templates...\">\n <label for=\"templateSearch\">\n <i class=\"bi bi-search me-1\"></i>Search Templates\n </label>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"form-floating\">\n <select\n class=\"form-select\"\n id=\"labGroupSelect\"\n formControlName=\"labGroupId\"\n (change)=\"onLabGroupChange($event)\">\n <option [ngValue]=\"null\">All Lab Groups</option>\n @if (hasLabGroups()) {\n @for (group of labGroupsData().results; track group.id) {\n <option [ngValue]=\"group.id\">{{ group.name }}</option>\n }\n }\n </select>\n <label for=\"labGroupSelect\">Lab Group</label>\n </div>\n\n <!-- Lab Groups Pagination -->\n @if (showLabGroupsPagination()) {\n <div class=\"d-flex justify-content-center mt-2\">\n <ngb-pagination\n [collectionSize]=\"labGroupsData().count\"\n [page]=\"labGroupsCurrentPage()\"\n [pageSize]=\"labGroupsPageSize()\"\n [maxSize]=\"3\"\n [boundaryLinks]=\"false\"\n [rotate]=\"true\"\n (pageChange)=\"onLabGroupsPageChange($event)\"\n class=\"pagination-sm\">\n </ngb-pagination>\n </div>\n }\n </div>\n <div class=\"col-md-3\">\n <div class=\"form-check form-switch mt-3\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"defaultTemplates\"\n formControlName=\"isDefault\">\n <label class=\"form-check-label\" for=\"defaultTemplates\">\n <i class=\"bi bi-star me-1\"></i>Default Templates Only\n </label>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Templates Table -->\n <div class=\"card\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>Table Templates\n <span class=\"badge bg-primary ms-2\">{{ templatesData().count }}</span>\n </h5>\n @if (isLoading()) {\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n }\n </div>\n <div class=\"card-body p-0\">\n @if (hasTemplates()) {\n <div class=\"table-responsive\">\n <table class=\"table table-hover mb-0\">\n <thead>\n <tr>\n <th><i class=\"bi bi-tag me-1\"></i>Template Name</th>\n <th><i class=\"bi bi-person me-1\"></i>Creator</th>\n <th><i class=\"bi bi-folder me-1\"></i>Lab Group</th>\n <th><i class=\"bi bi-list me-1\"></i>Columns</th>\n <th><i class=\"bi bi-eye me-1\"></i>Visibility</th>\n <th><i class=\"bi bi-star me-1\"></i>Default</th>\n <th><i class=\"bi bi-gear me-1\"></i>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (template of templatesData().results; track template.id) {\n <tr>\n <td>\n <strong>{{ template.name }}</strong>\n @if (template.description) {\n <br><small class=\"text-muted\">{{ template.description }}</small>\n }\n </td>\n <td>{{ template.ownerUsername || 'System' }}</td>\n <td>\n @if (template.labGroup) {\n <span class=\"badge bg-info\">{{ getLabGroupName(template.labGroup) }}</span>\n } @else {\n <span class=\"text-muted\">-</span>\n }\n </td>\n <td>\n <span class=\"badge bg-secondary\">{{ template.columnCount || 0 }}</span>\n </td>\n <td>\n @switch (template.visibility) {\n @case ('public') {\n <span class=\"badge bg-success\">Public</span>\n }\n @case ('group') {\n <span class=\"badge bg-info\">Lab Group</span>\n }\n @case ('private') {\n <span class=\"badge bg-warning\">Private</span>\n }\n @default {\n <span class=\"badge bg-secondary\">{{ template.visibility }}</span>\n }\n }\n </td>\n <td>\n @if (template.isDefault) {\n <i class=\"bi bi-star-fill text-warning\"></i>\n } @else {\n <span class=\"text-muted\">-</span>\n }\n </td>\n <td>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button\n class=\"btn btn-outline-success\"\n (click)=\"createTableFromTemplate(template)\"\n title=\"Create metadata table from this template\">\n <i class=\"bi bi-table\"></i>\n </button>\n <button\n class=\"btn btn-outline-primary\"\n (click)=\"editTemplate(template)\"\n title=\"Edit template\">\n <i class=\"bi bi-pencil\"></i>\n </button>\n <button\n class=\"btn btn-outline-info\"\n (click)=\"duplicateTemplate(template)\"\n title=\"Duplicate template\">\n <i class=\"bi bi-copy\"></i>\n </button>\n <button\n class=\"btn btn-outline-warning\"\n (click)=\"reorderTemplateColumns(template)\"\n title=\"Reorder columns by schema\"\n [disabled]=\"!template.columnCount || template.columnCount === 0\">\n <i class=\"bi bi-arrows-move\"></i>\n </button>\n <button\n class=\"btn btn-outline-danger\"\n (click)=\"deleteTemplate(template)\"\n title=\"Delete template\">\n <i class=\"bi bi-trash\"></i>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Pagination -->\n @if (showTemplatesPagination()) {\n <div class=\"d-flex justify-content-center mt-3 p-3\">\n <ngb-pagination\n [collectionSize]=\"templatesData().count\"\n [page]=\"currentPage()\"\n [pageSize]=\"pageSize()\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"true\"\n [rotate]=\"true\"\n (pageChange)=\"onPageChange($event)\"\n class=\"pagination-sm\">\n </ngb-pagination>\n </div>\n }\n } @else {\n <div class=\"empty-state text-center py-5\">\n <i class=\"bi bi-file-earmark-text fs-1 text-muted mb-3\"></i>\n <h5 class=\"text-muted\">No Table Templates Found</h5>\n <p class=\"text-muted\">\n @if (searchForm.get('search')?.value || searchForm.get('labGroupId')?.value) {\n Try adjusting your search criteria or create a new template.\n } @else {\n Get started by creating your first table template.\n }\n </p>\n <button class=\"btn btn-primary\" (click)=\"createTemplate()\">\n <i class=\"bi bi-plus me-1\"></i>Create First Template\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n","export * from './models';\nexport * from './services';\nexport * from './components';\n\nimport { Component } from '@angular/core';\n\n@Component({\n selector: 'ccv-cupcake-vanilla',\n imports: [],\n template: `\n <p>\n cupcake-vanilla works!\n </p>\n `,\n styles: ``\n})\nexport class CupcakeVanilla {\n\n}\n","/*\n * Public API Surface of cupcake-vanilla\n */\n\nexport * from './lib/cupcake-vanilla';\nexport * from './lib/models';\nexport * from './lib/services';\nexport * from './lib/components';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["BaseWebSocketService","i1","BaseNotificationService","i1.Websocket","i2.AdminWebSocketService","i1.ChunkedUploadService","switchMap","map","tap","i4.FavouriteMetadataOptionService","i4.MetadataColumnService","i4.MetadataColumnTemplateService","LibraryAsyncTaskService","filter","i3.MetadataTableService","i4","i3.MetadataColumnTemplateService","i4.SdrfSyntaxService","i3.MetadataTableTemplateService","i5","i2.SchemaService","ReorderSchemaSelectionModal","i2.MetadataTableTemplateService","i5.AsyncTaskUIService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"noatgnu-cupcake-vanilla.mjs","sources":["../../../projects/cupcake-vanilla/src/lib/models/enums.ts","../../../projects/cupcake-vanilla/src/lib/models/ontology-utils.ts","../../../projects/cupcake-vanilla/src/lib/models/ontology-config.ts","../../../projects/cupcake-vanilla/src/lib/models/sdrf-config.ts","../../../projects/cupcake-vanilla/src/lib/models/async-task.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-table.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-column.ts","../../../projects/cupcake-vanilla/src/lib/services/sample-pool.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-table-template.ts","../../../projects/cupcake-vanilla/src/lib/services/favourite-metadata-option.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-column-template.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-column-template-share.ts","../../../projects/cupcake-vanilla/src/lib/services/metadata-management.ts","../../../projects/cupcake-vanilla/src/lib/services/websocket.ts","../../../projects/cupcake-vanilla/src/lib/services/admin-websocket.ts","../../../projects/cupcake-vanilla/src/lib/services/notification.ts","../../../projects/cupcake-vanilla/src/lib/services/ontology-search.ts","../../../projects/cupcake-vanilla/src/lib/services/schema.ts","../../../projects/cupcake-vanilla/src/lib/services/sdrf-defaults.ts","../../../projects/cupcake-vanilla/src/lib/services/async-task.ts","../../../projects/cupcake-vanilla/src/lib/services/async-export.ts","../../../projects/cupcake-vanilla/src/lib/services/chunked-upload.ts","../../../projects/cupcake-vanilla/src/lib/services/async-import.ts","../../../projects/cupcake-vanilla/src/lib/services/async-validation.ts","../../../projects/cupcake-vanilla/src/lib/services/chunked-import.ts","../../../projects/cupcake-vanilla/src/lib/services/sdrf-syntax.ts","../../../projects/cupcake-vanilla/src/lib/services/electron.ts","../../../projects/cupcake-vanilla/src/lib/components/sdrf-age-input/sdrf-age-input.ts","../../../projects/cupcake-vanilla/src/lib/components/sdrf-age-input/sdrf-age-input.html","../../../projects/cupcake-vanilla/src/lib/components/sdrf-modification-input/sdrf-modification-input.ts","../../../projects/cupcake-vanilla/src/lib/components/sdrf-modification-input/sdrf-modification-input.html","../../../projects/cupcake-vanilla/src/lib/components/sdrf-spiked-compound-input/sdrf-spiked-compound-input.ts","../../../projects/cupcake-vanilla/src/lib/components/sdrf-spiked-compound-input/sdrf-spiked-compound-input.html","../../../projects/cupcake-vanilla/src/lib/components/sdrf-cleavage-input/sdrf-cleavage-input.ts","../../../projects/cupcake-vanilla/src/lib/components/sdrf-cleavage-input/sdrf-cleavage-input.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-value-edit-modal/metadata-value-edit-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-value-edit-modal/metadata-value-edit-modal.html","../../../projects/cupcake-vanilla/src/lib/components/excel-export-modal/excel-export-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/excel-export-modal/excel-export-modal.html","../../../projects/cupcake-vanilla/src/lib/components/validation-results-modal/validation-results-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/validation-results-modal/validation-results-modal.html","../../../projects/cupcake-vanilla/src/lib/components/async-task-ui.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-validation-modal/metadata-validation-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-validation-modal/metadata-validation-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-edit-modal/metadata-table-edit-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-edit-modal/metadata-table-edit-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/column-edit-modal/column-edit-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/column-edit-modal/column-edit-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/metadata-table-template-edit-modal/metadata-table-template-edit-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/metadata-table-template-edit-modal/metadata-table-template-edit-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/schema-selection-modal/schema-selection-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/schema-selection-modal/schema-selection-modal.html","../../../projects/cupcake-vanilla/src/lib/components/schema-selection-modal/schema-selection-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/schema-selection-modal/schema-selection-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/table-creation-modal/table-creation-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/table-creation-modal/table-creation-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/metadata-table-templates.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-templates/metadata-table-templates.html","../../../projects/cupcake-vanilla/src/lib/cupcake-vanilla.ts","../../../projects/cupcake-vanilla/src/public-api.ts","../../../projects/cupcake-vanilla/src/noatgnu-cupcake-vanilla.ts"],"sourcesContent":["export enum OntologyType {\r\n NONE = '',\r\n SPECIES = 'species',\r\n TISSUE = 'tissue',\r\n HUMAN_DISEASE = 'human_disease',\r\n SUBCELLULAR_LOCATION = 'subcellular_location',\r\n UNIMOD = 'unimod',\r\n NCBI_TAXONOMY = 'ncbi_taxonomy',\r\n MONDO = 'mondo',\r\n UBERON = 'uberon',\r\n CHEBI = 'chebi',\r\n CELL_ONTOLOGY = 'cell_ontology',\r\n MS_UNIQUE_VOCABULARIES = 'ms_unique_vocabularies',\r\n PSI_MS = 'psi_ms'\r\n}\r\n\r\nexport const OntologyTypeLabels: Record<OntologyType, string> = {\r\n [OntologyType.NONE]: 'None',\r\n [OntologyType.SPECIES]: 'Species',\r\n [OntologyType.TISSUE]: 'Tissue',\r\n [OntologyType.HUMAN_DISEASE]: 'Human Disease',\r\n [OntologyType.SUBCELLULAR_LOCATION]: 'Subcellular Location',\r\n [OntologyType.UNIMOD]: 'Unimod Modifications',\r\n [OntologyType.NCBI_TAXONOMY]: 'NCBI Taxonomy',\r\n [OntologyType.MONDO]: 'MONDO Disease',\r\n [OntologyType.UBERON]: 'UBERON Anatomy',\r\n [OntologyType.CHEBI]: 'ChEBI',\r\n [OntologyType.CELL_ONTOLOGY]: 'Cell Ontology',\r\n [OntologyType.MS_UNIQUE_VOCABULARIES]: 'MS Unique Vocabularies',\r\n [OntologyType.PSI_MS]: 'PSI-MS Controlled Vocabulary'\r\n};\r\n\r\nexport enum TemplatePermissionLevel {\r\n READ = 'read',\r\n WRITE = 'write',\r\n ADMIN = 'admin'\r\n}\r\n\r\nexport const TemplatePermissionLabels: Record<TemplatePermissionLevel, string> = {\r\n [TemplatePermissionLevel.READ]: 'Read Only',\r\n [TemplatePermissionLevel.WRITE]: 'Read & Write',\r\n [TemplatePermissionLevel.ADMIN]: 'Administrator'\r\n};\r\n\r\nexport enum ColumnType {\r\n CHARACTERISTICS = 'characteristics',\r\n COMMENT = 'comment',\r\n FACTOR_VALUE = 'factor_value',\r\n SOURCE_NAME = 'source_name',\r\n SPECIAL = 'special'\r\n}","export interface UnimodSpecification {\r\n accession: string;\r\n name: string;\r\n definition: string;\r\n additionalData: Array<{id: string; description: string}>;\r\n generalProperties: Record<string, string>;\r\n specifications: Record<string, UnimodSpecification>;\r\n deltaMonoMass: string;\r\n deltaAvgeMass: string;\r\n deltaComposition: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface UnimodFullData {\r\n accession: string;\r\n name: string;\r\n definition: string;\r\n additionalData: Array<{id: string; description: string}>;\r\n generalProperties: Record<string, string>;\r\n specifications: Record<string, UnimodSpecification>;\r\n deltaMonoMass: string;\r\n deltaAvgeMass: string;\r\n deltaComposition: string;\r\n [key: string]: any;\r\n}\r\n\r\nimport { OntologyType } from './enums';\r\n\r\nexport function isUnimodFullData(suggestion: any): suggestion is { fullData: UnimodFullData } {\r\n return suggestion &&\r\n suggestion.ontologyType === OntologyType.UNIMOD &&\r\n !!suggestion.fullData;\r\n}\r\n\r\nexport class OntologyUtils {\r\n static getUnimodSpecifications(suggestion: any): (UnimodSpecification & { specNumber: string })[] {\r\n if (!isUnimodFullData(suggestion)) return [];\r\n \r\n return Object.entries(suggestion.fullData.specifications).map(([specNum, spec]) => ({\r\n ...spec,\r\n specNumber: specNum\r\n }));\r\n }\r\n\r\n static getActiveUnimodSpecifications(suggestion: any): (UnimodSpecification & { specNumber: string })[] {\r\n return this.getUnimodSpecifications(suggestion).filter(spec => !spec['hidden']);\r\n }\r\n\r\n static formatUnimodName(data: UnimodFullData): string {\r\n return `${data.name} (${data.accession})`;\r\n }\r\n}","import { OntologyType, ColumnType } from './enums';\r\n\r\nexport interface OntologyCustomFilter {\r\n [ontologyType: string]: {\r\n [filterKey: string]: string | number | boolean;\r\n };\r\n}\r\n\r\nexport interface OntologyTypeConfig {\r\n value: string;\r\n label: string;\r\n customFilters?: OntologyCustomFilter;\r\n}\r\n\r\nexport interface ColumnTypeConfig {\r\n value: string;\r\n label: string;\r\n}\r\n\r\n// MS Unique Vocabularies term types based on backend load_ms_term.py\r\nexport enum MSTermType {\r\n INSTRUMENT = 'instrument',\r\n CLEAVAGE_AGENT = 'cleavage agent',\r\n DISSOCIATION_METHOD = 'dissociation method',\r\n SAMPLE_ATTRIBUTE = 'sample attribute',\r\n CELL_LINE = 'cell line',\r\n ENRICHMENT_PROCESS = 'enrichment process',\r\n FRACTIONATION_METHOD = 'fractionation method',\r\n DATA_ACQUISITION_METHOD = 'proteomics data acquisition method',\r\n REDUCTION_REAGENT = 'reduction reagent',\r\n ALKYLATION_REAGENT = 'alkylation reagent',\r\n MASS_ANALYZER_TYPE = 'mass analyzer type',\r\n ANCESTRAL_CATEGORY = 'ancestral category',\r\n SEX = 'sex',\r\n DEVELOPMENTAL_STAGE = 'developmental stage'\r\n}\r\n\r\n\r\n// Predefined ontology type configurations matching backend load_column_templates.py\r\nexport const ONTOLOGY_TYPE_CONFIGS: OntologyTypeConfig[] = [\r\n { value: OntologyType.NONE, label: 'None', customFilters: undefined },\r\n\r\n // Basic ontology types without custom filters\r\n { value: OntologyType.SPECIES, label: 'Species (UniProt)', customFilters: undefined },\r\n { value: OntologyType.NCBI_TAXONOMY, label: 'NCBI Taxonomy', customFilters: undefined },\r\n { value: OntologyType.TISSUE, label: 'Tissue (UniProt)', customFilters: undefined },\r\n { value: OntologyType.HUMAN_DISEASE, label: 'Human Disease (UniProt)', customFilters: undefined },\r\n { value: OntologyType.MONDO, label: 'MONDO Disease', customFilters: undefined },\r\n { value: OntologyType.UNIMOD, label: 'Modification (Unimod)', customFilters: undefined },\r\n { value: OntologyType.UBERON, label: 'Uberon Anatomy', customFilters: undefined },\r\n { value: OntologyType.SUBCELLULAR_LOCATION, label: 'Subcellular Location (UniProt)', customFilters: undefined },\r\n { value: OntologyType.CHEBI, label: 'ChEbi', customFilters: undefined },\r\n { value: OntologyType.CELL_ONTOLOGY, label: 'Cell Ontology', customFilters: undefined },\r\n { value: OntologyType.PSI_MS, label: 'PSI-MS', customFilters: undefined },\r\n\r\n // MS Unique Vocabularies with specific term_type filters\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Sample Attribute (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.SAMPLE_ATTRIBUTE } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Instrument (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.INSTRUMENT } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'MS Analyzer Type (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.MASS_ANALYZER_TYPE } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Cleavage Agent (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.CLEAVAGE_AGENT } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Dissociation Method (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.DISSOCIATION_METHOD } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Cell Line (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.CELL_LINE } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Enrichment Process (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.ENRICHMENT_PROCESS } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Fractionation Method (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.FRACTIONATION_METHOD } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Data Acquisition Method (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.DATA_ACQUISITION_METHOD } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Reduction Reagent (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.REDUCTION_REAGENT } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Alkylation Reagent (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.ALKYLATION_REAGENT } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Ancestral Category (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.ANCESTRAL_CATEGORY } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Sex (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.SEX } }\r\n },\r\n {\r\n value: OntologyType.MS_UNIQUE_VOCABULARIES,\r\n label: 'Developmental Stage (MS)',\r\n customFilters: { [OntologyType.MS_UNIQUE_VOCABULARIES]: { term_type: MSTermType.DEVELOPMENTAL_STAGE } }\r\n }\r\n];\r\n\r\nexport const COLUMN_TYPE_CONFIGS: ColumnTypeConfig[] = [\r\n { value: ColumnType.CHARACTERISTICS, label: 'Characteristics' },\r\n { value: ColumnType.COMMENT, label: 'Comment' },\r\n { value: ColumnType.FACTOR_VALUE, label: 'Factor Value' },\r\n { value: ColumnType.SOURCE_NAME, label: 'Source Name' },\r\n { value: ColumnType.SPECIAL, label: 'Special' }\r\n];","import { ColumnType } from './enums';\r\n\r\nexport interface SdrfColumnConfig {\r\n name: string;\r\n type: string;\r\n description: string;\r\n category?: SdrfColumnCategory;\r\n isRequired?: boolean;\r\n}\r\n\r\nexport enum SdrfColumnCategory {\r\n CORE_SAMPLE = 'Core Sample Metadata',\r\n CHARACTERISTICS = 'Characteristics',\r\n ASSAY = 'Assay Information',\r\n COMMENTS = 'Comments',\r\n MODIFICATIONS = 'Modifications & Enzymes',\r\n MASS_TOLERANCES = 'Mass Tolerances',\r\n TECHNICAL_PARAMS = 'Technical Parameters',\r\n SAMPLE_PREP = 'Sample Preparation',\r\n FILE_PROJECT = 'File & Project Information'\r\n}\r\n\r\n// Official SDRF-Proteomics column configurations based on specification\r\nexport const OFFICIAL_SDRF_COLUMNS: SdrfColumnConfig[] = [\r\n // Core sample metadata\r\n {\r\n name: 'source name',\r\n type: ColumnType.SOURCE_NAME,\r\n description: 'Unique sample identifier',\r\n category: SdrfColumnCategory.CORE_SAMPLE,\r\n isRequired: true\r\n },\r\n\r\n // Required characteristics\r\n {\r\n name: 'characteristics[organism]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Organism of the sample',\r\n category: SdrfColumnCategory.CHARACTERISTICS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'characteristics[disease]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Disease under study',\r\n category: SdrfColumnCategory.CHARACTERISTICS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'characteristics[organism part]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Part of organism anatomy',\r\n category: SdrfColumnCategory.CHARACTERISTICS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'characteristics[cell type]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Cell type',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n\r\n // Additional characteristics\r\n {\r\n name: 'characteristics[age]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Age of the individual',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[enrichment process]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Enrichment process applied',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[pooled sample]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Pooled sample indicator',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[spiked compound]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Spiked compound details',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[synthetic peptide]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Synthetic peptide indicator',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[xenograft]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Xenograft description',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[source name]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Reference to source sample',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[individual]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Patient identifier',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[mass]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Sample mass',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[biological replicate]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Biological replicate number',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[phenotype]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Sample phenotype',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n {\r\n name: 'characteristics[compound]',\r\n type: ColumnType.CHARACTERISTICS,\r\n description: 'Compound applied',\r\n category: SdrfColumnCategory.CHARACTERISTICS\r\n },\r\n\r\n // Assay information\r\n {\r\n name: 'assay name',\r\n type: ColumnType.SPECIAL,\r\n description: 'MS run identifier',\r\n category: SdrfColumnCategory.ASSAY,\r\n isRequired: true\r\n },\r\n {\r\n name: 'technology type',\r\n type: ColumnType.SPECIAL,\r\n description: 'Technology used for data generation',\r\n category: SdrfColumnCategory.ASSAY,\r\n isRequired: true\r\n },\r\n\r\n // Required comment fields\r\n {\r\n name: 'comment[fraction identifier]',\r\n type: ColumnType.COMMENT,\r\n description: 'Fraction number',\r\n category: SdrfColumnCategory.COMMENTS\r\n },\r\n {\r\n name: 'comment[label]',\r\n type: ColumnType.COMMENT,\r\n description: 'Label applied to sample',\r\n category: SdrfColumnCategory.COMMENTS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'comment[data file]',\r\n type: ColumnType.COMMENT,\r\n description: 'Raw data file name',\r\n category: SdrfColumnCategory.COMMENTS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'comment[instrument]',\r\n type: ColumnType.COMMENT,\r\n description: 'Mass spectrometer model',\r\n category: SdrfColumnCategory.COMMENTS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'comment[technical replicate]',\r\n type: ColumnType.COMMENT,\r\n description: 'Technical replicate number',\r\n category: SdrfColumnCategory.COMMENTS\r\n },\r\n\r\n // Modification and enzyme information\r\n {\r\n name: 'comment[modification parameters]',\r\n type: ColumnType.COMMENT,\r\n description: 'Protein modifications',\r\n category: SdrfColumnCategory.MODIFICATIONS,\r\n isRequired: true\r\n },\r\n {\r\n name: 'comment[cleavage agent details]',\r\n type: ColumnType.COMMENT,\r\n description: 'Digestion enzyme information',\r\n category: SdrfColumnCategory.MODIFICATIONS,\r\n isRequired: true\r\n },\r\n\r\n // Mass tolerances\r\n {\r\n name: 'comment[fragment mass tolerance]',\r\n type: ColumnType.COMMENT,\r\n description: 'Fragment ion mass tolerance',\r\n category: SdrfColumnCategory.MASS_TOLERANCES\r\n },\r\n {\r\n name: 'comment[precursor mass tolerance]',\r\n type: ColumnType.COMMENT,\r\n description: 'Precursor ion mass tolerance',\r\n category: SdrfColumnCategory.MASS_TOLERANCES\r\n },\r\n\r\n // Additional technical parameters\r\n {\r\n name: 'comment[MS2 analyzer type]',\r\n type: ColumnType.COMMENT,\r\n description: 'MS2 analyzer type',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[collision energy]',\r\n type: ColumnType.COMMENT,\r\n description: 'Collision energy used',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[dissociation method]',\r\n type: ColumnType.COMMENT,\r\n description: 'Fragmentation method',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[proteomics data acquisition method]',\r\n type: ColumnType.COMMENT,\r\n description: 'DDA, DIA, etc.',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[MS1 scan range]',\r\n type: ColumnType.COMMENT,\r\n description: 'MS1 scan range for DIA',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[scan window lower limit]',\r\n type: ColumnType.COMMENT,\r\n description: 'Scan window lower limit',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n {\r\n name: 'comment[scan window upper limit]',\r\n type: ColumnType.COMMENT,\r\n description: 'Scan window upper limit',\r\n category: SdrfColumnCategory.TECHNICAL_PARAMS\r\n },\r\n\r\n // Sample preparation\r\n {\r\n name: 'comment[depletion]',\r\n type: ColumnType.COMMENT,\r\n description: 'Depletion method applied',\r\n category: SdrfColumnCategory.SAMPLE_PREP\r\n },\r\n {\r\n name: 'comment[reduction reagent]',\r\n type: ColumnType.COMMENT,\r\n description: 'Reduction reagent used',\r\n category: SdrfColumnCategory.SAMPLE_PREP\r\n },\r\n {\r\n name: 'comment[alkylation reagent]',\r\n type: ColumnType.COMMENT,\r\n description: 'Alkylation reagent used',\r\n category: SdrfColumnCategory.SAMPLE_PREP\r\n },\r\n {\r\n name: 'comment[fractionation method]',\r\n type: ColumnType.COMMENT,\r\n description: 'Fractionation method',\r\n category: SdrfColumnCategory.SAMPLE_PREP\r\n },\r\n\r\n // File and project information\r\n {\r\n name: 'comment[file uri]',\r\n type: ColumnType.COMMENT,\r\n description: 'Public URI of the file',\r\n category: SdrfColumnCategory.FILE_PROJECT\r\n },\r\n {\r\n name: 'comment[proteomexchange accession number]',\r\n type: ColumnType.COMMENT,\r\n description: 'ProteomeXchange accession',\r\n category: SdrfColumnCategory.FILE_PROJECT\r\n }\r\n];\r\n\r\n// Helper functions\r\nexport function getSdrfColumnsByCategory(category?: SdrfColumnCategory): SdrfColumnConfig[] {\r\n if (!category) {\r\n return OFFICIAL_SDRF_COLUMNS;\r\n }\r\n return OFFICIAL_SDRF_COLUMNS.filter(col => col.category === category);\r\n}\r\n\r\nexport function getRequiredSdrfColumns(): SdrfColumnConfig[] {\r\n return OFFICIAL_SDRF_COLUMNS.filter(col => col.isRequired === true);\r\n}\r\n\r\nexport function getSdrfColumnByName(name: string): SdrfColumnConfig | undefined {\r\n return OFFICIAL_SDRF_COLUMNS.find(col => col.name.toLowerCase() === name.toLowerCase());\r\n}\r\n\r\nexport function isSdrfColumnRequired(name: string): boolean {\r\n const column = getSdrfColumnByName(name);\r\n return column?.isRequired === true;\r\n}","// Task status and type definitions\r\nexport type TaskStatus = 'QUEUED' | 'STARTED' | 'SUCCESS' | 'FAILURE' | 'CANCELLED';\r\n\r\nexport type TaskType =\r\n | 'EXPORT_EXCEL'\r\n | 'EXPORT_SDRF'\r\n | 'IMPORT_SDRF'\r\n | 'IMPORT_EXCEL'\r\n | 'EXPORT_MULTIPLE_SDRF'\r\n | 'EXPORT_MULTIPLE_EXCEL'\r\n | 'VALIDATE_TABLE'\r\n | 'REORDER_TABLE_COLUMNS'\r\n | 'REORDER_TEMPLATE_COLUMNS';\r\n\r\nexport interface AsyncTaskStatus {\r\n id: string;\r\n taskType: TaskType;\r\n status: TaskStatus;\r\n user: number;\r\n userUsername?: string;\r\n metadataTable?: number;\r\n metadataTableName?: string;\r\n taskTypeDisplay?: string;\r\n statusDisplay?: string;\r\n parameters?: any;\r\n result?: any;\r\n errorMessage?: string;\r\n traceback?: string;\r\n createdAt: string;\r\n startedAt?: string;\r\n completedAt?: string;\r\n rqJobId?: string;\r\n queueName?: string;\r\n progressCurrent?: number;\r\n progressTotal?: number;\r\n progressDescription?: string;\r\n duration?: number;\r\n progressPercentage?: number;\r\n}\r\n\r\nexport interface TaskListItem {\r\n id: string;\r\n taskType: TaskType;\r\n taskTypeDisplay: string;\r\n status: TaskStatus;\r\n statusDisplay: string;\r\n user: number;\r\n userUsername: string;\r\n metadataTable: number | null;\r\n metadataTableName: string | null;\r\n progressPercentage: number;\r\n progressDescription: string;\r\n createdAt: string;\r\n startedAt: string | null;\r\n completedAt: string | null;\r\n duration: number | null;\r\n errorMessage: string | null;\r\n}\r\n\r\nexport interface TaskResult {\r\n id: number;\r\n task: string;\r\n file?: string;\r\n fileName?: string;\r\n contentType?: string;\r\n fileSize?: number;\r\n expiresAt: string;\r\n downloadCount?: number;\r\n lastDownloadedAt?: string;\r\n createdAt: string;\r\n}\r\n\r\n// Async Task Request/Response Interfaces\r\nexport interface MetadataExportRequest {\r\n metadataTableId: number;\r\n includePools?: boolean;\r\n metadataColumnIds?: number[];\r\n sampleNumber?: number;\r\n exportFormat?: string;\r\n labGroupIds?: number[];\r\n}\r\n\r\nexport interface BulkExportRequest {\r\n metadataTableIds: number[];\r\n includePools?: boolean;\r\n validateSdrf?: boolean;\r\n}\r\n\r\nexport interface BulkExcelExportRequest extends BulkExportRequest {\r\n metadataColumnIds?: number[];\r\n labGroupIds?: number[];\r\n}\r\n\r\nexport interface MetadataImportRequest {\r\n metadataTableId: number;\r\n file: File;\r\n replaceExisting?: boolean;\r\n validateOntologies?: boolean;\r\n}\r\n\r\nexport interface ChunkedImportRequest {\r\n metadataTableId: number;\r\n chunkedUploadId: string;\r\n replaceExisting?: boolean;\r\n validateOntologies?: boolean;\r\n createPools?: boolean;\r\n}\r\n\r\nexport interface MetadataValidationRequest {\r\n metadataTableId: number;\r\n validateSdrfFormat?: boolean;\r\n includePools?: boolean;\r\n}\r\n\r\nexport interface MetadataValidationConfig {\r\n metadataTableId: number;\r\n metadataTableName: string;\r\n}\r\n\r\nexport interface AsyncTaskCreateResponse {\r\n taskId: string;\r\n message: string;\r\n}\r\n\r\nexport interface DownloadUrlResponse {\r\n downloadUrl: string;\r\n filename: string;\r\n contentType: string;\r\n fileSize: number;\r\n expiresAt: string;\r\n expiresInHours: number;\r\n}\r\n\r\n// Query parameters for async tasks\r\nexport interface AsyncTaskQueryParams {\r\n taskType?: string;\r\n status?: string;\r\n metadataTable?: number;\r\n search?: string;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n// Helper constants\r\nexport const TASK_TYPE_LABELS: Record<TaskType, string> = {\r\n 'EXPORT_EXCEL': 'Export Excel Template',\r\n 'EXPORT_SDRF': 'Export SDRF File',\r\n 'IMPORT_SDRF': 'Import SDRF File',\r\n 'IMPORT_EXCEL': 'Import Excel File',\r\n 'EXPORT_MULTIPLE_SDRF': 'Export Multiple SDRF Files',\r\n 'EXPORT_MULTIPLE_EXCEL': 'Export Multiple Excel Templates',\r\n 'VALIDATE_TABLE': 'Validate Metadata Table',\r\n 'REORDER_TABLE_COLUMNS': 'Reorder Table Columns',\r\n 'REORDER_TEMPLATE_COLUMNS': 'Reorder Template Columns',\r\n};\r\n\r\nexport const TASK_STATUS_LABELS: Record<TaskStatus, string> = {\r\n 'QUEUED': 'Queued',\r\n 'STARTED': 'In Progress',\r\n 'SUCCESS': 'Completed',\r\n 'FAILURE': 'Failed',\r\n 'CANCELLED': 'Cancelled',\r\n};\r\n\r\nexport const TASK_STATUS_COLORS: Record<TaskStatus, string> = {\r\n 'QUEUED': 'secondary',\r\n 'STARTED': 'primary',\r\n 'SUCCESS': 'success',\r\n 'FAILURE': 'danger',\r\n 'CANCELLED': 'warning',\r\n};","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataTable,\r\n MetadataTableCreateRequest,\r\n MetadataTableUpdateRequest,\r\n MetadataTableQueryResponse,\r\n MetadataColumn,\r\n PaginatedResponse,\r\n SampleCountValidationRequest,\r\n SampleCountValidationResponse,\r\n SampleCountConfirmationError\r\n} from '../models';\r\n\r\nexport interface MetadataTableQueryParams {\r\n search?: string;\r\n ownerId?: number;\r\n labGroupId?: number;\r\n isPublished?: boolean;\r\n isLocked?: boolean;\r\n showShared?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataTableService extends BaseApiService {\r\n\r\n /**\r\n * Get all metadata tables with optional filtering\r\n */\r\n getMetadataTables(params?: MetadataTableQueryParams): Observable<MetadataTableQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<MetadataTableQueryResponse>(`${this.apiUrl}/metadata-tables/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single metadata table by ID\r\n */\r\n getMetadataTable(id: number): Observable<MetadataTable> {\r\n return this.get<MetadataTable>(`${this.apiUrl}/metadata-tables/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new metadata table\r\n */\r\n createMetadataTable(table: MetadataTableCreateRequest): Observable<MetadataTable> {\r\n return this.post<MetadataTable>(`${this.apiUrl}/metadata-tables/`, table);\r\n }\r\n\r\n /**\r\n * Update an existing metadata table\r\n */\r\n updateMetadataTable(id: number, table: MetadataTableUpdateRequest): Observable<MetadataTable> {\r\n return this.put<MetadataTable>(`${this.apiUrl}/metadata-tables/${id}/`, table);\r\n }\r\n\r\n /**\r\n * Partially update a metadata table\r\n */\r\n patchMetadataTable(id: number, table: Partial<MetadataTableUpdateRequest>): Observable<MetadataTable> {\r\n return this.patch<MetadataTable>(`${this.apiUrl}/metadata-tables/${id}/`, table);\r\n }\r\n\r\n /**\r\n * Delete a metadata table\r\n */\r\n deleteMetadataTable(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/metadata-tables/${id}/`);\r\n }\r\n\r\n /**\r\n * Add a column to the metadata table\r\n */\r\n addColumn(id: number, columnData: any, position?: number): Observable<{ message: string; column: MetadataColumn }> {\r\n return this.post<{ message: string; column: MetadataColumn }>(`${this.apiUrl}/metadata-tables/${id}/add_column/`, {\r\n column_data: columnData,\r\n position\r\n });\r\n }\r\n\r\n /**\r\n * Add a column with automatic reordering\r\n */\r\n addColumnWithAutoReorder(id: number, request: { columnData: any }): Observable<{ message: string; column: MetadataColumn; reordered: boolean; schemaIdsUsed: number[] }> {\r\n return this.post<{ message: string; column: MetadataColumn; reordered: boolean; schemaIdsUsed: number[] }>(`${this.apiUrl}/metadata-tables/${id}/add_column_with_auto_reorder/`, request);\r\n }\r\n\r\n /**\r\n * Remove a column from the metadata table\r\n */\r\n removeColumn(id: number, columnId: number): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-tables/${id}/remove_column/`, {\r\n column_id: columnId\r\n });\r\n }\r\n\r\n /**\r\n * Reorder a column in the metadata table\r\n */\r\n reorderColumn(id: number, columnId: number, newPosition: number): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-tables/${id}/reorder_column/`, {\r\n column_id: columnId,\r\n new_position: newPosition\r\n });\r\n }\r\n\r\n /**\r\n * Normalize column positions\r\n */\r\n normalizeColumnPositions(id: number): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-tables/${id}/normalize_column_positions/`, {});\r\n }\r\n\r\n /**\r\n * Start async reordering of table columns by schema\r\n */\r\n reorderColumnsBySchemaAsync(id: number, schemaIds?: number[]): Observable<{\r\n taskId: string;\r\n message: string;\r\n metadataTableId: number;\r\n schemaIds: number[];\r\n }> {\r\n return this.post<{\r\n taskId: string;\r\n message: string;\r\n metadataTableId: number;\r\n schemaIds: number[];\r\n }>(`${this.apiUrl}/metadata-tables/${id}/reorder_columns_by_schema_async/`, {\r\n schemaIds: schemaIds || []\r\n });\r\n }\r\n\r\n /**\r\n * Get all tables (admin only)\r\n */\r\n getAdminAllTables(): Observable<MetadataTable[]> {\r\n return this.get<MetadataTable[]>(`${this.apiUrl}/metadata-tables/admin_all_tables/`);\r\n }\r\n\r\n /**\r\n * Search metadata tables\r\n */\r\n searchMetadataTables(query: string): Observable<MetadataTableQueryResponse> {\r\n return this.getMetadataTables({ search: query });\r\n }\r\n\r\n /**\r\n * Get metadata tables by owner\r\n */\r\n getMetadataTablesByOwner(ownerId: number): Observable<MetadataTableQueryResponse> {\r\n return this.getMetadataTables({ ownerId: ownerId });\r\n }\r\n\r\n /**\r\n * Get shared metadata tables\r\n */\r\n getSharedMetadataTables(): Observable<MetadataTableQueryResponse> {\r\n return this.getMetadataTables({ showShared: true });\r\n }\r\n\r\n /**\r\n * Combine columns column-wise\r\n */\r\n combineColumnwise(request: { columnIds: number[] }): Observable<{ message: string; combinedColumn: any }> {\r\n return this.post<{ message: string; combinedColumn: any }>(`${this.apiUrl}/metadata-tables/combine_columnwise/`, request);\r\n }\r\n\r\n /**\r\n * Combine columns row-wise\r\n */\r\n combineRowwise(request: { columnIds: number[] }): Observable<{ message: string; combinedColumn: any }> {\r\n return this.post<{ message: string; combinedColumn: any }>(`${this.apiUrl}/metadata-tables/combine_rowwise/`, request);\r\n }\r\n\r\n validateSampleCountChange(id: number, request: SampleCountValidationRequest): Observable<SampleCountValidationResponse> {\r\n return this.post<SampleCountValidationResponse>(`${this.apiUrl}/metadata-tables/${id}/validate_sample_count_change/`, request);\r\n }\r\n\r\n updateSampleCount(id: number, newSampleCount: number, confirmed: boolean = false): Observable<{ message: string; oldSampleCount: number; newSampleCount: number; cleanupPerformed: boolean }> {\r\n return this.post<{ message: string; oldSampleCount: number; newSampleCount: number; cleanupPerformed: boolean }>(`${this.apiUrl}/metadata-tables/${id}/update_sample_count/`, {\r\n newSampleCount,\r\n confirmed\r\n });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataColumn,\r\n MetadataColumnCreateRequest,\r\n MetadataColumnUpdateRequest,\r\n PaginatedResponse,\r\n OntologySuggestion\r\n} from '../models';\r\n\r\nexport interface MetadataColumnQueryParams {\r\n search?: string;\r\n metadataTableId?: number;\r\n type?: string;\r\n name?: string;\r\n hidden?: boolean;\r\n mandatory?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataColumnService extends BaseApiService {\r\n\r\n /**\r\n * Get all metadata columns with optional filtering\r\n */\r\n getMetadataColumns(params?: MetadataColumnQueryParams): Observable<PaginatedResponse<MetadataColumn>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<MetadataColumn>>(`${this.apiUrl}/metadata-columns/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single metadata column by ID\r\n */\r\n getMetadataColumn(id: number): Observable<MetadataColumn> {\r\n return this.get<MetadataColumn>(`${this.apiUrl}/metadata-columns/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new metadata column\r\n */\r\n createMetadataColumn(column: MetadataColumnCreateRequest): Observable<MetadataColumn> {\r\n return this.post<MetadataColumn>(`${this.apiUrl}/metadata-columns/`, column);\r\n }\r\n\r\n /**\r\n * Update an existing metadata column\r\n */\r\n updateMetadataColumn(id: number, column: MetadataColumnUpdateRequest): Observable<MetadataColumn> {\r\n return this.put<MetadataColumn>(`${this.apiUrl}/metadata-columns/${id}/`, column);\r\n }\r\n\r\n /**\r\n * Partially update a metadata column\r\n */\r\n patchMetadataColumn(id: number, column: Partial<MetadataColumnUpdateRequest>): Observable<MetadataColumn> {\r\n return this.patch<MetadataColumn>(`${this.apiUrl}/metadata-columns/${id}/`, column);\r\n }\r\n\r\n /**\r\n * Delete a metadata column\r\n */\r\n deleteMetadataColumn(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/metadata-columns/${id}/`);\r\n }\r\n\r\n /**\r\n * Bulk create metadata columns\r\n */\r\n bulkCreate(request: { columns: MetadataColumnCreateRequest[] }): Observable<MetadataColumn[]> {\r\n return this.post<MetadataColumn[]>(`${this.apiUrl}/metadata-columns/bulk_create/`, request);\r\n }\r\n\r\n /**\r\n * Validate SDRF data\r\n */\r\n validateSdrfData(request: { metadataIds: number[]; sampleNumber?: number }): Observable<{ valid: boolean; errors: any[]; sampleCount: number }> {\r\n return this.post<{ valid: boolean; errors: any[]; sampleCount: number }>(`${this.apiUrl}/metadata-columns/validate_sdrf_data/`, request);\r\n }\r\n\r\n /**\r\n * Get ontology suggestions for a column\r\n */\r\n getOntologySuggestions(params: { \r\n columnId: number; \r\n search?: string; \r\n limit?: number; \r\n searchType?: 'icontains' | 'istartswith' | 'exact';\r\n }): Observable<{\r\n ontologyType: string;\r\n suggestions: OntologySuggestion[];\r\n searchTerm: string;\r\n searchType: string;\r\n limit: number;\r\n count: number;\r\n customFilters: any;\r\n hasMore: boolean;\r\n }> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get(`${this.apiUrl}/metadata-columns/ontology_suggestions/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Validate value against column's ontology\r\n */\r\n validateValue(id: number, request: { value: string }): Observable<{ valid: boolean; value: string; ontologyType: string; suggestions?: any[] }> {\r\n return this.post(`${this.apiUrl}/metadata-columns/${id}/validate_value/`, request);\r\n }\r\n\r\n /**\r\n * Update column value with automatic modifier calculation\r\n */\r\n updateColumnValue(id: number, request: { \r\n value: string; \r\n sampleIndices?: number[]; \r\n valueType?: 'default' | 'sample_specific' | 'replace_all';\r\n }): Observable<{\r\n message: string;\r\n column: MetadataColumn;\r\n changes: any;\r\n valueType: string;\r\n }> {\r\n return this.post(`${this.apiUrl}/metadata-columns/${id}/update_column_value/`, request);\r\n }\r\n\r\n /**\r\n * Apply automatic ontology mapping to a column\r\n */\r\n applyOntologyMapping(id: number): Observable<{ applied: boolean; ontologyType: string; message: string }> {\r\n return this.post(`${this.apiUrl}/metadata-columns/${id}/apply_ontology_mapping/`, {});\r\n }\r\n\r\n /**\r\n * Detect ontology type for given column name and type\r\n */\r\n detectOntologyType(params: { name: string; type: string }): Observable<{ columnName: string; columnType: string; detectedOntologyType: string }> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get(`${this.apiUrl}/metadata-columns/detect_ontology_type/`, { params: httpParams });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n SamplePool,\r\n SamplePoolCreateRequest,\r\n SamplePoolUpdateRequest,\r\n MetadataColumn,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface SamplePoolQueryParams {\r\n search?: string;\r\n metadataTable?: number;\r\n isReference?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SamplePoolService extends BaseApiService {\r\n\r\n /**\r\n * Get all sample pools with optional filtering\r\n */\r\n getSamplePools(params?: SamplePoolQueryParams): Observable<PaginatedResponse<SamplePool>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<SamplePool>>(`${this.apiUrl}/sample-pools/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single sample pool by ID\r\n */\r\n getSamplePool(id: number): Observable<SamplePool> {\r\n return this.get<SamplePool>(`${this.apiUrl}/sample-pools/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new sample pool\r\n */\r\n createSamplePool(pool: SamplePoolCreateRequest): Observable<SamplePool> {\r\n return this.post<SamplePool>(`${this.apiUrl}/sample-pools/`, pool);\r\n }\r\n\r\n /**\r\n * Update an existing sample pool\r\n */\r\n updateSamplePool(id: number, pool: SamplePoolUpdateRequest): Observable<SamplePool> {\r\n return this.put<SamplePool>(`${this.apiUrl}/sample-pools/${id}/`, pool);\r\n }\r\n\r\n /**\r\n * Partially update a sample pool\r\n */\r\n patchSamplePool(id: number, pool: Partial<SamplePoolUpdateRequest>): Observable<SamplePool> {\r\n return this.patch<SamplePool>(`${this.apiUrl}/sample-pools/${id}/`, pool);\r\n }\r\n\r\n /**\r\n * Delete a sample pool\r\n */\r\n deleteSamplePool(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/sample-pools/${id}/`);\r\n }\r\n\r\n /**\r\n * Get metadata columns associated with this pool\r\n */\r\n getMetadataColumns(id: number): Observable<MetadataColumn[]> {\r\n return this.get<MetadataColumn[]>(`${this.apiUrl}/sample-pools/${id}/metadata_columns/`);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataTableTemplate,\r\n MetadataTableTemplateCreateRequest,\r\n MetadataTableTemplateUpdateRequest,\r\n MetadataTableTemplateQueryResponse,\r\n MetadataTable,\r\n MetadataColumn,\r\n Schema,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MetadataTableTemplateQueryParams {\r\n search?: string;\r\n ownerId?: number;\r\n labGroupId?: number;\r\n visibility?: string;\r\n isDefault?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataTableTemplateService extends BaseApiService {\r\n\r\n /**\r\n * Get all metadata table templates with optional filtering\r\n */\r\n getMetadataTableTemplates(params?: MetadataTableTemplateQueryParams): Observable<MetadataTableTemplateQueryResponse> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<MetadataTableTemplateQueryResponse>(`${this.apiUrl}/metadata-table-templates/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single metadata table template by ID\r\n */\r\n getMetadataTableTemplate(id: number): Observable<MetadataTableTemplate> {\r\n return this.get<MetadataTableTemplate>(`${this.apiUrl}/metadata-table-templates/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new metadata table template\r\n */\r\n createMetadataTableTemplate(template: MetadataTableTemplateCreateRequest): Observable<MetadataTableTemplate> {\r\n return this.post<MetadataTableTemplate>(`${this.apiUrl}/metadata-table-templates/`, template);\r\n }\r\n\r\n /**\r\n * Update an existing metadata table template\r\n */\r\n updateMetadataTableTemplate(id: number, template: MetadataTableTemplateUpdateRequest): Observable<MetadataTableTemplate> {\r\n return this.put<MetadataTableTemplate>(`${this.apiUrl}/metadata-table-templates/${id}/`, template);\r\n }\r\n\r\n /**\r\n * Partially update a metadata table template\r\n */\r\n patchMetadataTableTemplate(id: number, template: Partial<MetadataTableTemplateUpdateRequest>): Observable<MetadataTableTemplate> {\r\n return this.patch<MetadataTableTemplate>(`${this.apiUrl}/metadata-table-templates/${id}/`, template);\r\n }\r\n\r\n /**\r\n * Delete a metadata table template\r\n */\r\n deleteMetadataTableTemplate(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/metadata-table-templates/${id}/`);\r\n }\r\n\r\n /**\r\n * Add a column to the template\r\n */\r\n addColumn(id: number, request: { column_data: any; position?: number }): Observable<{ message: string; column: MetadataColumn }> {\r\n return this.post<{ message: string; column: MetadataColumn }>(`${this.apiUrl}/metadata-table-templates/${id}/add_column/`, request);\r\n }\r\n\r\n /**\r\n * Remove a column from the template\r\n */\r\n removeColumn(id: number, request: { column_id: number }): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-table-templates/${id}/remove_column/`, request);\r\n }\r\n\r\n /**\r\n * Reorder a column within the template\r\n */\r\n reorderColumn(id: number, request: { column_id: number; new_position: number }): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-table-templates/${id}/reorder_column/`, request);\r\n }\r\n\r\n /**\r\n * Add a column with automatic reordering\r\n */\r\n addColumnWithAutoReorder(id: number, request: { columnData: any }): Observable<{ message: string; column: MetadataColumn; reordered: boolean; schemaIdsUsed: number[] }> {\r\n return this.post<{ message: string; column: MetadataColumn; reordered: boolean; schemaIdsUsed: number[] }>(`${this.apiUrl}/metadata-table-templates/${id}/add_column_with_auto_reorder/`, request);\r\n }\r\n\r\n /**\r\n * Duplicate a column within the template\r\n */\r\n duplicateColumn(id: number, request: { column_id: number }): Observable<{ message: string; duplicated_column: MetadataColumn }> {\r\n return this.post<{ message: string; duplicated_column: MetadataColumn }>(`${this.apiUrl}/metadata-table-templates/${id}/duplicate_column/`, request);\r\n }\r\n\r\n /**\r\n * Normalize column positions\r\n */\r\n normalizeColumnPositions(id: number): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/metadata-table-templates/${id}/normalize_column_positions/`, {});\r\n }\r\n\r\n /**\r\n * Start async reordering of template columns by schema\r\n */\r\n reorderColumnsBySchemaAsync(id: number, schemaIds?: number[]): Observable<{\r\n taskId: string;\r\n message: string;\r\n templateId: number;\r\n schemaIds: number[];\r\n }> {\r\n return this.post<{\r\n taskId: string;\r\n message: string;\r\n templateId: number;\r\n schemaIds: number[];\r\n }>(`${this.apiUrl}/metadata-table-templates/${id}/reorder_columns_by_schema_async/`, {\r\n schemaIds: schemaIds || []\r\n });\r\n }\r\n\r\n /**\r\n * Apply this template to a metadata table\r\n */\r\n applyToMetadataTable(id: number, request: { metadata_table_id: number }): Observable<{ message: string; applied_columns: MetadataColumn[] }> {\r\n return this.post<{ message: string; applied_columns: MetadataColumn[] }>(`${this.apiUrl}/metadata-table-templates/${id}/apply_to_metadata_table/`, request);\r\n }\r\n\r\n /**\r\n * Update field mask for template\r\n */\r\n updateFieldMask(id: number, request: { field_mask: any }): Observable<{ message: string; field_mask: any }> {\r\n return this.post<{ message: string; field_mask: any }>(`${this.apiUrl}/metadata-table-templates/${id}/update_field_mask/`, request);\r\n }\r\n\r\n /**\r\n * Get field mask for template\r\n */\r\n getFieldMask(id: number): Observable<{ field_mask: any }> {\r\n return this.get<{ field_mask: any }>(`${this.apiUrl}/metadata-table-templates/${id}/get_field_mask/`);\r\n }\r\n\r\n /**\r\n * Get columns with field masks\r\n */\r\n getColumnsWithFieldMasks(id: number): Observable<{ columns: any[] }> {\r\n return this.get<{ columns: any[] }>(`${this.apiUrl}/metadata-table-templates/${id}/get_columns_with_field_masks/`);\r\n }\r\n\r\n /**\r\n * Get available schemas for creating templates\r\n */\r\n getAvailableSchemas(): Observable<Schema[]> {\r\n return this.get<Schema[]>(`${this.apiUrl}/metadata-table-templates/available_schemas/`);\r\n }\r\n\r\n /**\r\n * Create a new template from schema definitions\r\n */\r\n createFromSchema(request: { schemaIds: number[]; name: string; description?: string }): Observable<{ message: string; template: MetadataTableTemplate }> {\r\n return this.post<{ message: string; template: MetadataTableTemplate }>(`${this.apiUrl}/metadata-table-templates/create_from_schema/`, request);\r\n }\r\n\r\n /**\r\n * Create a new metadata table from an existing template\r\n */\r\n createTableFromTemplate(request: { templateId: number; name: string; description?: string; sampleCount: number }): Observable<MetadataTable> {\r\n return this.post<MetadataTable>(`${this.apiUrl}/metadata-table-templates/create_table_from_template/`, request);\r\n }\r\n\r\n /**\r\n * Create a new metadata table directly from schema definitions\r\n */\r\n createTableFromSchemas(request: { schemaIds: number[]; name: string; description?: string; sampleCount: number }): Observable<MetadataTable> {\r\n return this.post<MetadataTable>(`${this.apiUrl}/metadata-table-templates/create_table_from_schemas/`, request);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n FavouriteMetadataOption,\r\n FavouriteMetadataOptionCreateRequest,\r\n FavouriteMetadataOptionUpdateRequest,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface FavouriteMetadataOptionQueryParams {\r\n search?: string;\r\n name?: string;\r\n type?: string;\r\n userId?: number;\r\n labGroupId?: number;\r\n isGlobal?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FavouriteMetadataOptionService extends BaseApiService {\r\n\r\n /**\r\n * Get all favourite metadata options with optional filtering\r\n */\r\n getFavouriteMetadataOptions(params?: FavouriteMetadataOptionQueryParams): Observable<PaginatedResponse<FavouriteMetadataOption>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<FavouriteMetadataOption>>(`${this.apiUrl}/favourite-options/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single favourite metadata option by ID\r\n */\r\n getFavouriteMetadataOption(id: number): Observable<FavouriteMetadataOption> {\r\n return this.get<FavouriteMetadataOption>(`${this.apiUrl}/favourite-options/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new favourite metadata option\r\n */\r\n createFavouriteMetadataOption(option: FavouriteMetadataOptionCreateRequest): Observable<FavouriteMetadataOption> {\r\n return this.post<FavouriteMetadataOption>(`${this.apiUrl}/favourite-options/`, option);\r\n }\r\n\r\n /**\r\n * Update an existing favourite metadata option\r\n */\r\n updateFavouriteMetadataOption(id: number, option: FavouriteMetadataOptionUpdateRequest): Observable<FavouriteMetadataOption> {\r\n return this.put<FavouriteMetadataOption>(`${this.apiUrl}/favourite-options/${id}/`, option);\r\n }\r\n\r\n /**\r\n * Partially update a favourite metadata option\r\n */\r\n patchFavouriteMetadataOption(id: number, option: Partial<FavouriteMetadataOptionUpdateRequest>): Observable<FavouriteMetadataOption> {\r\n return this.patch<FavouriteMetadataOption>(`${this.apiUrl}/favourite-options/${id}/`, option);\r\n }\r\n\r\n /**\r\n * Delete a favourite metadata option\r\n */\r\n deleteFavouriteMetadataOption(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/favourite-options/${id}/`);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataColumnTemplate,\r\n MetadataColumnTemplateCreateRequest,\r\n MetadataColumnTemplateUpdateRequest,\r\n MetadataColumn,\r\n OntologySuggestion,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MetadataColumnTemplateQueryParams {\r\n search?: string;\r\n type?: string;\r\n ontologyType?: string;\r\n isRequired?: boolean;\r\n isPublic?: boolean;\r\n ownerId?: number;\r\n labGroupId?: number;\r\n visibility?: string;\r\n isActive?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataColumnTemplateService extends BaseApiService {\r\n\r\n /**\r\n * Get all metadata column templates with optional filtering\r\n */\r\n getMetadataColumnTemplates(params?: MetadataColumnTemplateQueryParams): Observable<PaginatedResponse<MetadataColumnTemplate>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<MetadataColumnTemplate>>(`${this.apiUrl}/column-templates/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single metadata column template by ID\r\n */\r\n getMetadataColumnTemplate(id: number): Observable<MetadataColumnTemplate> {\r\n return this.get<MetadataColumnTemplate>(`${this.apiUrl}/column-templates/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new metadata column template\r\n */\r\n createMetadataColumnTemplate(template: MetadataColumnTemplateCreateRequest): Observable<MetadataColumnTemplate> {\r\n return this.post<MetadataColumnTemplate>(`${this.apiUrl}/column-templates/`, template);\r\n }\r\n\r\n /**\r\n * Update an existing metadata column template\r\n */\r\n updateMetadataColumnTemplate(id: number, template: MetadataColumnTemplateUpdateRequest): Observable<MetadataColumnTemplate> {\r\n return this.put<MetadataColumnTemplate>(`${this.apiUrl}/column-templates/${id}/`, template);\r\n }\r\n\r\n /**\r\n * Partially update a metadata column template\r\n */\r\n patchMetadataColumnTemplate(id: number, template: Partial<MetadataColumnTemplateUpdateRequest>): Observable<MetadataColumnTemplate> {\r\n return this.patch<MetadataColumnTemplate>(`${this.apiUrl}/column-templates/${id}/`, template);\r\n }\r\n\r\n /**\r\n * Delete a metadata column template\r\n */\r\n deleteMetadataColumnTemplate(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/column-templates/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a MetadataColumn from this template\r\n */\r\n createMetadataColumn(id: number, request: { metadataTableId: number; columnPosition?: number }): Observable<{ message: string; column: MetadataColumn }> {\r\n return this.post<{ message: string; column: MetadataColumn }>(`${this.apiUrl}/column-templates/${id}/create_metadata_column/`, request);\r\n }\r\n\r\n /**\r\n * Share this template with another user\r\n */\r\n shareTemplate(id: number, request: { userId: number; canEdit?: boolean }): Observable<{ message: string }> {\r\n return this.post<{ message: string }>(`${this.apiUrl}/column-templates/${id}/share_template/`, request);\r\n }\r\n\r\n /**\r\n * Remove template sharing for a user\r\n */\r\n unshareTemplate(id: number, request: { userId: number }): Observable<{ message: string }> {\r\n return this.delete<{ message: string }>(`${this.apiUrl}/column-templates/${id}/unshare_template/`, { body: request });\r\n }\r\n\r\n /**\r\n * Get templates created by the current user\r\n */\r\n getMyTemplates(): Observable<MetadataColumnTemplate[]> {\r\n return this.get<MetadataColumnTemplate[]>(`${this.apiUrl}/column-templates/my_templates/`);\r\n }\r\n\r\n /**\r\n * Get most popular public templates\r\n */\r\n getPopularTemplates(): Observable<MetadataColumnTemplate[]> {\r\n return this.get<MetadataColumnTemplate[]>(`${this.apiUrl}/column-templates/popular_templates/`);\r\n }\r\n\r\n /**\r\n * Get ontology suggestions for this column template\r\n */\r\n getOntologySuggestions(params?: { \r\n search?: string; \r\n templateId?: number;\r\n limit?: number;\r\n searchType?: 'icontains' | 'istartswith' | 'exact';\r\n }): Observable<{\r\n ontologyType: string;\r\n suggestions: OntologySuggestion[];\r\n searchTerm: string;\r\n searchType: string;\r\n limit: number;\r\n count: number;\r\n customFilters: any;\r\n hasMore: boolean;\r\n }> {\r\n const httpParams = this.buildHttpParams({\r\n template_id: params?.templateId,\r\n search: params?.search,\r\n limit: params?.limit,\r\n search_type: params?.searchType\r\n });\r\n return this.get<{\r\n ontologyType: string;\r\n suggestions: OntologySuggestion[];\r\n searchTerm: string;\r\n searchType: string;\r\n limit: number;\r\n count: number;\r\n customFilters: any;\r\n hasMore: boolean;\r\n }>(`${this.apiUrl}/column-templates/ontology_suggestions/`, { params: httpParams });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataColumnTemplateShare,\r\n MetadataColumnTemplateShareCreateRequest,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface MetadataColumnTemplateShareQueryParams {\r\n template?: number;\r\n sharedWith?: number;\r\n sharedBy?: number;\r\n canEdit?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataColumnTemplateShareService extends BaseApiService {\r\n\r\n /**\r\n * Get all template shares with optional filtering\r\n */\r\n getMetadataColumnTemplateShares(params?: MetadataColumnTemplateShareQueryParams): Observable<PaginatedResponse<MetadataColumnTemplateShare>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<MetadataColumnTemplateShare>>(`${this.apiUrl}/template-shares/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single template share by ID\r\n */\r\n getMetadataColumnTemplateShare(id: number): Observable<MetadataColumnTemplateShare> {\r\n return this.get<MetadataColumnTemplateShare>(`${this.apiUrl}/template-shares/${id}/`);\r\n }\r\n\r\n /**\r\n * Create a new template share\r\n */\r\n createMetadataColumnTemplateShare(share: MetadataColumnTemplateShareCreateRequest): Observable<MetadataColumnTemplateShare> {\r\n return this.post<MetadataColumnTemplateShare>(`${this.apiUrl}/template-shares/`, share);\r\n }\r\n\r\n /**\r\n * Update an existing template share\r\n */\r\n updateMetadataColumnTemplateShare(id: number, share: { canEdit?: boolean }): Observable<MetadataColumnTemplateShare> {\r\n return this.put<MetadataColumnTemplateShare>(`${this.apiUrl}/template-shares/${id}/`, share);\r\n }\r\n\r\n /**\r\n * Delete a template share\r\n */\r\n deleteMetadataColumnTemplateShare(id: number): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/template-shares/${id}/`);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MetadataManagementService extends BaseApiService {\r\n\r\n /**\r\n * Export metadata as Excel template (matching original CUPCAKE)\r\n */\r\n exportExcelTemplate(request: any): Observable<Blob> {\r\n return this.post(`${this.apiUrl}/metadata-management/export_excel_template/`, request, { responseType: 'blob' });\r\n }\r\n\r\n /**\r\n * Import metadata from SDRF file with intelligent column matching and schema organization\r\n */\r\n importSdrfFile(file: File, additionalData?: any): Observable<any> {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n if (additionalData) {\r\n Object.keys(additionalData).forEach(key => {\r\n formData.append(key, additionalData[key]);\r\n });\r\n }\r\n return this.post<any>(`${this.apiUrl}/metadata-management/import_sdrf_file/`, formData);\r\n }\r\n\r\n /**\r\n * Import metadata from Excel file (matching original CUPCAKE)\r\n */\r\n importExcelFile(file: File, additionalData?: any): Observable<any> {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n if (additionalData) {\r\n Object.keys(additionalData).forEach(key => {\r\n formData.append(key, additionalData[key]);\r\n });\r\n }\r\n return this.post<any>(`${this.apiUrl}/metadata-management/import_excel_file/`, formData);\r\n }\r\n\r\n /**\r\n * Collect metadata from metadata table\r\n */\r\n collectMetadata(params: any): Observable<any> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<any>(`${this.apiUrl}/metadata-management/collect_metadata/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Export metadata as SDRF file (matching original CUPCAKE)\r\n */\r\n exportSdrfFile(request: any): Observable<Blob> {\r\n return this.post(`${this.apiUrl}/metadata-management/export_sdrf_file/`, request, { responseType: 'blob' });\r\n }\r\n}","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WebSocketService as BaseWebSocketService, WebSocketMessage, AuthService, WEBSOCKET_ENDPOINT } from '@noatgnu/cupcake-core';\n\nexport type { WebSocketMessage };\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Websocket extends BaseWebSocketService {\n\n constructor(authService: AuthService) {\n super(authService);\n this.endpoint = 'ccv/notifications';\n this.config.endpoint = 'ccv/notifications';\n this.config.url = this.getWebSocketUrl();\n }\n\n\n getMetadataTableUpdates(): Observable<WebSocketMessage> {\n return this.filterMessages('metadata_table.update');\n }\n\n getLabGroupUpdates(): Observable<WebSocketMessage> {\n return this.filterMessages('lab_group.update');\n }\n}\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { WebSocketService as BaseWebSocketService, WebSocketMessage, AuthService } from '@noatgnu/cupcake-core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AdminWebSocketService extends BaseWebSocketService {\r\n\r\n constructor(authService: AuthService) {\r\n super(authService);\r\n this.endpoint = 'ccv/admin';\r\n this.config.endpoint = 'ccv/admin';\r\n this.config.url = this.getWebSocketUrl();\r\n }\r\n\r\n getAdminNotifications(): Observable<WebSocketMessage> {\r\n return this.filterMessages('admin.notification');\r\n }\r\n\r\n override getSystemNotifications(): Observable<WebSocketMessage> {\r\n return this.filterMessages('system.notification');\r\n }\r\n}","import { Injectable, signal, computed, inject } from '@angular/core';\r\nimport { NotificationService as BaseNotificationService, NotificationItem, ToastService } from '@noatgnu/cupcake-core';\r\nimport { Websocket, WebSocketMessage } from './websocket';\r\nimport { AdminWebSocketService } from './admin-websocket';\r\n\r\nexport enum NotificationType {\r\n SYSTEM = 'system',\r\n METADATA_TABLE = 'metadata_table',\r\n LAB_GROUP = 'lab_group',\r\n FILE_UPLOAD = 'file_upload',\r\n DATA_PROCESSING = 'data_processing',\r\n ASYNC_TASK = 'async_task',\r\n USER = 'user'\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService extends BaseNotificationService {\r\n private isConnected = signal(false);\r\n private isAdminConnected = signal(false);\r\n\r\n readonly isWebSocketConnected = computed(() => this.isConnected());\r\n readonly isAdminWebSocketConnected = computed(() => this.isAdminConnected());\r\n\r\n constructor(\r\n private websocketService: Websocket,\r\n private adminWebSocketService: AdminWebSocketService,\r\n toastService: ToastService\r\n ) {\r\n super(toastService);\r\n this.initializeWebSocket();\r\n }\r\n\r\n private initializeWebSocket(): void {\r\n this.websocketService.isConnected$.subscribe(connected => {\r\n this.isConnected.set(connected);\r\n if (connected) {\r\n console.log('CCV WebSocket connected - notifications active');\r\n }\r\n });\r\n\r\n this.adminWebSocketService.isConnected$.subscribe(connected => {\r\n this.isAdminConnected.set(connected);\r\n if (connected) {\r\n console.log('CCV Admin WebSocket connected - admin notifications active');\r\n }\r\n });\r\n\r\n this.websocketService.messages$.subscribe(message => {\r\n this.handleWebSocketMessage(message);\r\n });\r\n\r\n this.adminWebSocketService.messages$.subscribe(message => {\r\n this.handleAdminWebSocketMessage(message);\r\n });\r\n\r\n this.setupNotificationHandlers();\r\n }\r\n\r\n private setupNotificationHandlers(): void {\r\n this.websocketService.getSystemNotifications().subscribe(message => {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.SYSTEM);\r\n this.addNotification(notification);\r\n\r\n if (message['level'] === 'error') {\r\n this.toastService.error(message.message || message['title']);\r\n } else if (message['level'] === 'warning') {\r\n this.toastService.warning(message.message || message['title']);\r\n } else if (message['level'] === 'success') {\r\n this.toastService.success(message.message || message['title']);\r\n } else {\r\n this.toastService.info(message.message || message['title']);\r\n }\r\n });\r\n\r\n this.adminWebSocketService.getAdminNotifications().subscribe(message => {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.SYSTEM);\r\n this.addNotification(notification);\r\n\r\n const level = message['level'] || 'info';\r\n const title = message['title'] || 'Admin Notification';\r\n const messageText = message.message || '';\r\n\r\n if (level === 'error') {\r\n this.toastService.error(`${title}: ${messageText}`, 10000);\r\n } else if (level === 'warning') {\r\n this.toastService.warning(`${title}: ${messageText}`, 8000);\r\n } else if (level === 'success') {\r\n this.toastService.success(`${title}: ${messageText}`, 6000);\r\n } else {\r\n this.toastService.info(`${title}: ${messageText}`, 5000);\r\n }\r\n });\r\n\r\n this.websocketService.getMetadataTableUpdates().subscribe(message => {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.METADATA_TABLE);\r\n this.addNotification(notification);\r\n });\r\n\r\n this.websocketService.getLabGroupUpdates().subscribe(message => {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.LAB_GROUP);\r\n this.addNotification(notification);\r\n });\r\n\r\n this.websocketService.filterMessages('async_task.update').subscribe(message => {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.ASYNC_TASK);\r\n this.addNotification(notification);\r\n });\r\n\r\n this.websocketService.filterMessages('notification_message').subscribe(message => {\r\n const notificationData = message['message'] || message;\r\n\r\n let notificationType = 'info';\r\n let title = 'Notification';\r\n let messageText = '';\r\n\r\n if (typeof notificationData === 'object' && notificationData !== null) {\r\n notificationType = (notificationData as any)['type'] || 'info';\r\n title = (notificationData as any)['title'] || 'Notification';\r\n messageText = (notificationData as any)['message'] || '';\r\n } else if (typeof notificationData === 'string') {\r\n messageText = notificationData;\r\n }\r\n\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.SYSTEM);\r\n this.addNotification(notification);\r\n\r\n if (notificationType === 'error') {\r\n this.toastService.error(`${title}: ${messageText}`, 8000);\r\n } else if (notificationType === 'warning') {\r\n this.toastService.warning(`${title}: ${messageText}`, 6000);\r\n } else if (notificationType === 'success') {\r\n this.toastService.success(`${title}: ${messageText}`, 5000);\r\n } else {\r\n this.toastService.info(`${title}: ${messageText}`, 4000);\r\n }\r\n });\r\n }\r\n\r\n private handleWebSocketMessage(message: WebSocketMessage): void {\r\n if (message.type === 'connection.established') {\r\n console.log('WebSocket connection established:', message);\r\n return;\r\n }\r\n\r\n if (message.type.includes('file.upload')) {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.FILE_UPLOAD);\r\n this.addNotification(notification);\r\n\r\n if (message.type === 'file.upload.completed') {\r\n this.toastService.success(`File upload completed: ${message['filename']}`);\r\n } else if (message.type === 'file.upload.failed') {\r\n this.toastService.error(`File upload failed: ${message['filename']}`);\r\n }\r\n } else if (message.type.includes('data.processing')) {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.DATA_PROCESSING);\r\n this.addNotification(notification);\r\n\r\n if (message.type === 'data.processing.completed') {\r\n this.toastService.success('Data processing completed');\r\n } else if (message.type === 'data.processing.failed') {\r\n this.toastService.error('Data processing failed');\r\n }\r\n }\r\n }\r\n\r\n private createNotificationFromWebSocket(message: WebSocketMessage, type: NotificationType): NotificationItem {\r\n const id = this.generateNotificationId();\r\n const timestamp = message.timestamp ? new Date(message.timestamp) : new Date();\r\n\r\n let title = '';\r\n let level: 'info' | 'success' | 'warning' | 'error' = 'info';\r\n\r\n switch (type) {\r\n case NotificationType.SYSTEM:\r\n title = message['title'] || 'System Notification';\r\n level = (message['level'] as any) || 'info';\r\n break;\r\n case NotificationType.METADATA_TABLE:\r\n title = 'Metadata Table Update';\r\n level = message['action'] === 'deleted' ? 'warning' : 'info';\r\n break;\r\n case NotificationType.LAB_GROUP:\r\n title = 'Lab Group Update';\r\n level = 'info';\r\n break;\r\n case NotificationType.FILE_UPLOAD:\r\n title = 'File Upload';\r\n level = message.type.includes('failed') ? 'error' : 'success';\r\n break;\r\n case NotificationType.DATA_PROCESSING:\r\n title = 'Data Processing';\r\n level = message.type.includes('failed') ? 'error' : 'success';\r\n break;\r\n case NotificationType.ASYNC_TASK:\r\n title = this.getAsyncTaskTitle(message);\r\n level = this.getAsyncTaskLevel(message);\r\n break;\r\n default:\r\n title = 'Notification';\r\n }\r\n\r\n return {\r\n id,\r\n type,\r\n title,\r\n message: message.message || '',\r\n timestamp,\r\n read: false,\r\n level,\r\n autoClose: level === 'success' || level === 'info',\r\n data: message\r\n };\r\n }\r\n\r\n private getAsyncTaskTitle(message: WebSocketMessage): string {\r\n const taskType = message['task_type'];\r\n const status = message['status'];\r\n\r\n let operation = 'Task';\r\n switch (taskType) {\r\n case 'EXPORT_EXCEL':\r\n operation = 'Excel Export';\r\n break;\r\n case 'EXPORT_SDRF':\r\n operation = 'SDRF Export';\r\n break;\r\n case 'IMPORT_SDRF':\r\n operation = 'SDRF Import';\r\n break;\r\n case 'IMPORT_EXCEL':\r\n operation = 'Excel Import';\r\n break;\r\n case 'EXPORT_MULTIPLE_SDRF':\r\n operation = 'Bulk SDRF Export';\r\n break;\r\n case 'EXPORT_MULTIPLE_EXCEL':\r\n operation = 'Bulk Excel Export';\r\n break;\r\n case 'VALIDATE_TABLE':\r\n operation = 'Table Validation';\r\n break;\r\n case 'REORDER_TABLE_COLUMNS':\r\n operation = 'Column Reordering';\r\n break;\r\n case 'REORDER_TEMPLATE_COLUMNS':\r\n operation = 'Template Column Reordering';\r\n break;\r\n }\r\n\r\n switch (status) {\r\n case 'QUEUED':\r\n return `${operation} Queued`;\r\n case 'STARTED':\r\n return `${operation} In Progress`;\r\n case 'SUCCESS':\r\n return `${operation} Completed`;\r\n case 'FAILURE':\r\n return `${operation} Failed`;\r\n case 'CANCELLED':\r\n return `${operation} Cancelled`;\r\n default:\r\n return `${operation} Update`;\r\n }\r\n }\r\n\r\n private getAsyncTaskLevel(message: WebSocketMessage): 'info' | 'success' | 'warning' | 'error' {\r\n const status = message['status'];\r\n\r\n switch (status) {\r\n case 'SUCCESS':\r\n return 'success';\r\n case 'FAILURE':\r\n return 'error';\r\n case 'CANCELLED':\r\n return 'warning';\r\n case 'STARTED':\r\n case 'QUEUED':\r\n default:\r\n return 'info';\r\n }\r\n }\r\n\r\n private handleAdminWebSocketMessage(message: WebSocketMessage): void {\r\n if (message.type === 'admin.notification') {\r\n const notification = this.createNotificationFromWebSocket(message, NotificationType.SYSTEM);\r\n this.addNotification(notification);\r\n }\r\n }\r\n\r\n connect(): void {\r\n this.websocketService.connect();\r\n }\r\n\r\n connectAdmin(): void {\r\n this.adminWebSocketService.connect();\r\n }\r\n\r\n disconnect(): void {\r\n this.websocketService.disconnect();\r\n }\r\n\r\n disconnectAdmin(): void {\r\n this.adminWebSocketService.disconnect();\r\n }\r\n\r\n subscribeToMetadataTable(tableId: number): void {\r\n this.websocketService.subscribe('metadata_table_updates', { table_id: tableId });\r\n }\r\n\r\n createVanillaNotification(\r\n type: NotificationType,\r\n title: string,\r\n message: string,\r\n level: 'info' | 'success' | 'warning' | 'error' = 'info',\r\n autoClose = true\r\n ): void {\r\n this.createLocalNotification(type, title, message, level, autoClose);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n OntologySuggestion\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class OntologySearchService extends BaseApiService {\r\n\r\n /**\r\n * Get ontology suggestions across all sources for SDRF validation\r\n */\r\n suggest(params?: { query?: string; sources?: string[] }): Observable<OntologySuggestion[]> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<OntologySuggestion[]>(`${this.apiUrl}/ontology-search/suggest/`, { params: httpParams });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n Schema,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\nexport interface SchemaQueryParams {\r\n search?: string;\r\n category?: string;\r\n isActive?: boolean;\r\n limit?: number;\r\n offset?: number;\r\n ordering?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SchemaService extends BaseApiService {\r\n\r\n /**\r\n * Get all schemas with optional filtering\r\n */\r\n getSchemas(params?: SchemaQueryParams): Observable<PaginatedResponse<Schema>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<Schema>>(`${this.apiUrl}/schemas/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a single schema by ID\r\n */\r\n getSchema(id: number): Observable<Schema> {\r\n return this.get<Schema>(`${this.apiUrl}/schemas/${id}/`);\r\n }\r\n\r\n /**\r\n * Get list of available schemas for creating templates\r\n */\r\n getAvailableSchemas(): Observable<Schema[]> {\r\n return this.get<Schema[]>(`${this.apiUrl}/schemas/available/`);\r\n }\r\n\r\n /**\r\n * Sync builtin schemas from sdrf-pipelines package (admin only)\r\n */\r\n syncBuiltin(): Observable<{ message: string; synced_count: number }> {\r\n return this.post<{ message: string; synced_count: number }>(`${this.apiUrl}/schemas/sync_builtin/`, {});\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SDRFDefaultsService extends BaseApiService {\r\n\r\n /**\r\n * Get all available SDRF columns with their default values\r\n */\r\n getColumns(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/columns/`);\r\n }\r\n\r\n /**\r\n * Get default values for a specific column\r\n */\r\n getColumnValues(params: { column: string }): Observable<any[]> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/column_values/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Search for columns containing the query string\r\n */\r\n searchColumns(params: { query: string }): Observable<any[]> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/search/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get options for structured fields (key-value pairs)\r\n */\r\n getStructuredOptions(params: { field: string }): Observable<any[]> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/structured_options/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get all label options (TMT, SILAC, label-free)\r\n */\r\n getLabels(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/labels/`);\r\n }\r\n\r\n /**\r\n * Get protein modification options (fixed and variable)\r\n */\r\n getModifications(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/modifications/`);\r\n }\r\n\r\n /**\r\n * Get list of common instrument models\r\n */\r\n getInstruments(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/instruments/`);\r\n }\r\n\r\n /**\r\n * Get cleavage agent options\r\n */\r\n getCleavageAgents(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/cleavage_agents/`);\r\n }\r\n\r\n /**\r\n * Get all compound fields that require special handling\r\n */\r\n getCompoundFields(): Observable<any[]> {\r\n return this.get<any[]>(`${this.apiUrl}/sdrf-defaults/compound_fields/`);\r\n }\r\n\r\n /**\r\n * Get schema for a specific compound field\r\n */\r\n getCompoundSchema(params: { field: string }): Observable<any> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<any>(`${this.apiUrl}/sdrf-defaults/compound_schema/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Validate a compound field value against its schema\r\n */\r\n validateCompound(request: { field: string; value: any }): Observable<{ valid: boolean; errors?: string[] }> {\r\n return this.post<{ valid: boolean; errors?: string[] }>(`${this.apiUrl}/sdrf-defaults/validate_compound/`, request);\r\n }\r\n\r\n /**\r\n * Get column name suggestions based on partial input\r\n */\r\n getSuggestions(params: { query: string }): Observable<string[]> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<string[]>(`${this.apiUrl}/sdrf-defaults/suggestions/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get quick access to commonly used value categories\r\n */\r\n getQuickValues(): Observable<any> {\r\n return this.get<any>(`${this.apiUrl}/sdrf-defaults/quick_values/`);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n AsyncTaskStatus,\r\n AsyncTaskQueryParams,\r\n AsyncTaskCreateResponse,\r\n DownloadUrlResponse,\r\n PaginatedResponse\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AsyncTaskService extends BaseApiService {\r\n\r\n /**\r\n * Get all async tasks for the current user with optional filtering\r\n */\r\n getAsyncTasks(params?: AsyncTaskQueryParams): Observable<PaginatedResponse<AsyncTaskStatus>> {\r\n const httpParams = this.buildHttpParams(params);\r\n return this.get<PaginatedResponse<AsyncTaskStatus>>(`${this.apiUrl}/async-tasks/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get a specific async task by ID\r\n */\r\n getAsyncTask(id: string): Observable<AsyncTaskStatus> {\r\n return this.get<AsyncTaskStatus>(`${this.apiUrl}/async-tasks/${id}/`);\r\n }\r\n\r\n /**\r\n * Cancel a queued or running task\r\n */\r\n cancelTask(id: string): Observable<{ message: string }> {\r\n return this.delete<{ message: string }>(`${this.apiUrl}/async-tasks/${id}/cancel/`);\r\n }\r\n\r\n /**\r\n * Generate a signed download URL for task result file\r\n */\r\n getDownloadUrl(id: string): Observable<DownloadUrlResponse> {\r\n return this.get<DownloadUrlResponse>(`${this.apiUrl}/async-tasks/${id}/download_url/`);\r\n }\r\n\r\n /**\r\n * Direct download endpoint (returns blob for file download)\r\n */\r\n downloadTaskFile(id: string, token: string): Observable<Blob> {\r\n const httpParams = this.buildHttpParams({ token });\r\n return this.get(`${this.apiUrl}/async-tasks/${id}/download/`, { params: httpParams, responseType: 'blob' });\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataExportRequest,\r\n BulkExportRequest,\r\n BulkExcelExportRequest,\r\n AsyncTaskCreateResponse\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AsyncExportService extends BaseApiService {\r\n\r\n excelTemplate(request: MetadataExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-export/excel_template/`, request);\r\n }\r\n\r\n sdrfFile(request: MetadataExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-export/sdrf_file/`, request);\r\n }\r\n\r\n multipleSdrfFiles(request: BulkExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-export/multiple_sdrf_files/`, request);\r\n }\r\n\r\n multipleExcelTemplates(request: BulkExcelExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-export/multiple_excel_templates/`, request);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable, from } from 'rxjs';\r\nimport { switchMap } from 'rxjs/operators';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\nimport jsSHA from 'jssha';\r\n\r\nimport {\r\n ChunkedUploadStatus,\r\n ChunkedUploadRequest,\r\n ChunkedUploadResponse,\r\n ChunkedUploadCompletionRequest,\r\n ChunkedUploadCompletionResponse\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ChunkedUploadService extends BaseApiService {\r\n\r\n\r\n /**\r\n * Initialize or continue a chunked upload\r\n */\r\n uploadChunk(\r\n request: ChunkedUploadRequest,\r\n uploadId?: string,\r\n offset?: number,\r\n totalSize?: number\r\n ): Observable<ChunkedUploadResponse> {\r\n const formData = new FormData();\r\n formData.append('file', request.file);\r\n\r\n if (request.filename) {\r\n formData.append('filename', request.filename);\r\n }\r\n if (request.uploadSessionId) {\r\n formData.append('upload_session_id', request.uploadSessionId);\r\n }\r\n if (request.metadataTableId) {\r\n formData.append('metadata_table_id', request.metadataTableId.toString());\r\n }\r\n if (request.createPools !== undefined) {\r\n formData.append('create_pools', request.createPools.toString());\r\n }\r\n if (request.replaceExisting !== undefined) {\r\n formData.append('replace_existing', request.replaceExisting.toString());\r\n }\r\n\r\n const url = uploadId\r\n ? `${this.apiUrl}/chunked-upload/${uploadId}/`\r\n : `${this.apiUrl}/chunked-upload/`;\r\n\r\n const httpOptions: any = {};\r\n const isChunkedUpload = offset !== undefined && totalSize !== undefined;\r\n\r\n if (isChunkedUpload) {\r\n const chunkEnd = offset + request.file.size - 1;\r\n httpOptions.headers = {\r\n 'Content-Range': `bytes ${offset}-${chunkEnd}/${totalSize}`\r\n };\r\n }\r\n\r\n if (isChunkedUpload || uploadId) {\r\n return this.put<ChunkedUploadResponse>(url, formData, httpOptions);\r\n } else {\r\n return this.post<ChunkedUploadResponse>(url, formData, httpOptions);\r\n }\r\n }\r\n\r\n /**\r\n * Get chunked upload status\r\n */\r\n getUploadStatus(uploadId: string): Observable<ChunkedUploadStatus> {\r\n return this.get<ChunkedUploadStatus>(`${this.apiUrl}/chunked-upload/${uploadId}/`);\r\n }\r\n\r\n /**\r\n * Complete the chunked upload and process the file\r\n */\r\n completeUpload(uploadId: string, request?: ChunkedUploadCompletionRequest): Observable<ChunkedUploadCompletionResponse> {\r\n const formData = new FormData();\r\n\r\n if (request?.sha256) {\r\n formData.append('sha256', request.sha256);\r\n }\r\n if (request?.metadataTableId) {\r\n formData.append('metadata_table_id', request.metadataTableId.toString());\r\n }\r\n if (request?.createPools !== undefined) {\r\n formData.append('create_pools', request.createPools.toString());\r\n }\r\n if (request?.replaceExisting !== undefined) {\r\n formData.append('replace_existing', request.replaceExisting.toString());\r\n }\r\n\r\n return this.post<ChunkedUploadCompletionResponse>(`${this.apiUrl}/chunked-upload/${uploadId}/`, formData);\r\n }\r\n\r\n /**\r\n * Complete the chunked upload by uploading the entire file at once\r\n */\r\n completeUploadWithFile(request: ChunkedUploadRequest): Observable<ChunkedUploadCompletionResponse> {\r\n const hasher = new jsSHA('SHA-256', 'ARRAYBUFFER');\r\n const arrayBufferPromise = request.file.arrayBuffer();\r\n\r\n return from(arrayBufferPromise).pipe(\r\n switchMap((arrayBuffer) => {\r\n hasher.update(arrayBuffer);\r\n const hash = hasher.getHash('HEX');\r\n\r\n const formData = new FormData();\r\n formData.append('file', request.file);\r\n if (request.filename) {\r\n formData.append('filename', request.filename);\r\n }\r\n if (request.uploadSessionId) {\r\n formData.append('upload_session_id', request.uploadSessionId);\r\n }\r\n if (request.metadataTableId) {\r\n formData.append('metadata_table_id', request.metadataTableId.toString());\r\n }\r\n if (request.createPools !== undefined) {\r\n formData.append('create_pools', request.createPools.toString());\r\n }\r\n if (request.replaceExisting !== undefined) {\r\n formData.append('replace_existing', request.replaceExisting.toString());\r\n }\r\n formData.append('sha256', hash);\r\n\r\n return this.post<ChunkedUploadCompletionResponse>(`${this.apiUrl}/chunked-upload/`, formData);\r\n })\r\n );\r\n\r\n }\r\n\r\n /**\r\n * Delete/cancel a chunked upload\r\n */\r\n cancelUpload(uploadId: string): Observable<void> {\r\n return this.delete<void>(`${this.apiUrl}/chunked-upload/${uploadId}/`);\r\n }\r\n\r\n /**\r\n * Helper method to upload a file in chunks with progress tracking\r\n */\r\n uploadFileInChunks(\r\n file: File,\r\n chunkSize: number = 1024 * 1024, // 1MB chunks by default\r\n options?: {\r\n metadataTableId?: number;\r\n createPools?: boolean;\r\n replaceExisting?: boolean;\r\n uploadSessionId?: string;\r\n onProgress?: (progress: number) => void;\r\n }\r\n ): Observable<ChunkedUploadCompletionResponse> {\r\n return new Observable(subscriber => {\r\n let uploadId: string | undefined;\r\n let offset = 0;\r\n const totalSize = file.size;\r\n const sha256 = new jsSHA('SHA-256', 'ARRAYBUFFER');\r\n if (totalSize <= chunkSize) {\r\n this.completeUploadWithFile({\r\n file: file,\r\n filename: file.name,\r\n uploadSessionId: options?.uploadSessionId,\r\n metadataTableId: options?.metadataTableId,\r\n createPools: options?.createPools,\r\n replaceExisting: options?.replaceExisting\r\n }).subscribe({\r\n next: (result) => {\r\n subscriber.next(result);\r\n subscriber.complete();\r\n }\r\n })\r\n return;\r\n }\r\n const uploadNextChunk = () => {\r\n if (offset >= totalSize) {\r\n if (uploadId) {\r\n const calculatedHash = sha256.getHash('HEX');\r\n this.completeUpload(uploadId, {\r\n sha256: calculatedHash,\r\n metadataTableId: options?.metadataTableId,\r\n createPools: options?.createPools,\r\n replaceExisting: options?.replaceExisting\r\n }).subscribe({\r\n next: (result) => {\r\n subscriber.next(result);\r\n subscriber.complete();\r\n },\r\n error: (error) => subscriber.error(error)\r\n });\r\n } else {\r\n subscriber.error(new Error('Upload failed: No upload ID'));\r\n }\r\n return;\r\n }\r\n\r\n const end = Math.min(offset + chunkSize, totalSize);\r\n const chunk = file.slice(offset, end);\r\n const chunkFile = new File([chunk], file.name, { type: file.type });\r\n\r\n chunk.arrayBuffer().then(arrayBuffer => {\r\n sha256.update(arrayBuffer);\r\n\r\n this.uploadChunk({\r\n file: chunkFile,\r\n filename: file.name,\r\n uploadSessionId: options?.uploadSessionId,\r\n metadataTableId: options?.metadataTableId,\r\n createPools: options?.createPools,\r\n replaceExisting: options?.replaceExisting\r\n }, uploadId, offset, totalSize).subscribe({\r\n next: (response) => {\r\n uploadId = response.id;\r\n offset = response.offset;\r\n\r\n const progress = (offset / totalSize) * 100;\r\n if (options?.onProgress) {\r\n options.onProgress(progress);\r\n }\r\n\r\n uploadNextChunk();\r\n },\r\n error: (error) => subscriber.error(error)\r\n });\r\n }).catch(error => subscriber.error(error));\r\n };\r\n\r\n uploadNextChunk();\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, from } from 'rxjs';\r\nimport { switchMap, map } from 'rxjs/operators';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\nimport { ChunkedUploadService } from './chunked-upload';\r\n\r\nimport {\r\n MetadataImportRequest,\r\n AsyncTaskCreateResponse\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AsyncImportService extends BaseApiService {\r\n\r\n constructor(private chunkedUploadService: ChunkedUploadService) {\r\n super();\r\n }\r\n\r\n sdrfFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse> {\r\n // Always use chunked upload - it handles everything (SHA256, chunking, processing)\r\n return this.chunkedUploadService.uploadFileInChunks(\r\n request.file,\r\n 1024 * 1024, // 1MB chunks\r\n {\r\n metadataTableId: request.metadataTableId,\r\n createPools: true,\r\n replaceExisting: request.replaceExisting,\r\n onProgress: (progress) => {\r\n console.log(`SDRF upload progress: ${Math.round(progress)}%`);\r\n }\r\n }\r\n ).pipe(\r\n map(result => ({\r\n taskId: 'chunked-completed', // Processing is done immediately\r\n message: result.message || 'SDRF file processed successfully',\r\n result: result\r\n } as AsyncTaskCreateResponse))\r\n );\r\n }\r\n\r\n excelFile(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse> {\r\n // Always use chunked upload - it handles everything (SHA256, chunking, processing)\r\n return this.chunkedUploadService.uploadFileInChunks(\r\n request.file,\r\n 1024 * 1024, // 1MB chunks\r\n {\r\n metadataTableId: request.metadataTableId,\r\n createPools: true,\r\n replaceExisting: request.replaceExisting,\r\n onProgress: (progress) => {\r\n console.log(`Excel upload progress: ${Math.round(progress)}%`);\r\n }\r\n }\r\n ).pipe(\r\n map(result => ({\r\n taskId: 'chunked-completed', // Processing is done immediately\r\n message: result.message || 'Excel file processed successfully',\r\n result: result\r\n } as AsyncTaskCreateResponse))\r\n );\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\n\r\nimport {\r\n MetadataValidationRequest,\r\n AsyncTaskCreateResponse\r\n} from '../models';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AsyncValidationService extends BaseApiService {\r\n\r\n metadataTable(request: MetadataValidationRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-validation/metadata_table/`, request);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable, from, throwError } from 'rxjs';\r\nimport { switchMap, map, tap } from 'rxjs/operators';\r\nimport { BaseApiService } from '@noatgnu/cupcake-core';\r\nimport { ChunkedUploadService } from './chunked-upload';\r\nimport { AsyncTaskCreateResponse, ChunkedImportRequest } from '../models';\r\n\r\nexport interface ChunkedFileImportRequest {\r\n file: File;\r\n metadataTableId: number;\r\n replaceExisting?: boolean;\r\n validateOntologies?: boolean;\r\n createPools?: boolean;\r\n}\r\n\r\nexport interface ChunkedImportProgress {\r\n uploadProgress: number;\r\n phase: 'uploading' | 'processing' | 'completed' | 'failed';\r\n taskId?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ChunkedImportService extends BaseApiService {\r\n\r\n constructor(private chunkedUploadService: ChunkedUploadService) {\r\n super();\r\n }\r\n\r\n /**\r\n * Import SDRF file using chunked upload for better performance with large files\r\n */\r\n importSdrfFileChunked(request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.validateFileType(request.file, ['.txt', '.tsv', '.sdrf']).pipe(\r\n switchMap(() => this.uploadFileChunked(request))\r\n );\r\n }\r\n\r\n /**\r\n * Import Excel file using chunked upload for better performance with large files\r\n */\r\n importExcelFileChunked(request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.validateFileType(request.file, ['.xlsx', '.xls']).pipe(\r\n switchMap(() => this.uploadFileChunked(request))\r\n );\r\n }\r\n\r\n /**\r\n * Generic chunked import that auto-detects file type\r\n */\r\n importFileChunked(request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse> {\r\n const fileExtension = this.getFileExtension(request.file.name);\r\n\r\n if (['.txt', '.tsv', '.sdrf'].includes(fileExtension)) {\r\n return this.importSdrfFileChunked(request);\r\n } else if (['.xlsx', '.xls'].includes(fileExtension)) {\r\n return this.importExcelFileChunked(request);\r\n } else {\r\n return throwError(() => new Error(`Unsupported file type: ${fileExtension}`));\r\n }\r\n }\r\n\r\n /**\r\n * Upload file using chunked upload with metadata processing\r\n */\r\n private uploadFileChunked(request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.chunkedUploadService.uploadFileInChunks(\r\n request.file,\r\n 1024 * 1024, // 1MB chunks\r\n {\r\n metadataTableId: request.metadataTableId,\r\n createPools: request.createPools,\r\n replaceExisting: request.replaceExisting,\r\n onProgress: (progress: number) => {\r\n // Upload progress callback - can be used for UI updates\r\n console.log(`Upload progress: ${Math.round(progress)}%`);\r\n }\r\n }\r\n ).pipe(\r\n switchMap((uploadResult) => {\r\n // Once upload is complete, trigger async processing\r\n return this.triggerAsyncImport(uploadResult, request);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Trigger async import processing after chunked upload completion\r\n * This uses the existing async-import endpoints but with chunked upload completion\r\n */\r\n private triggerAsyncImport(uploadResult: any, request: ChunkedFileImportRequest): Observable<AsyncTaskCreateResponse> {\r\n // The chunked upload has completed, now we need to trigger async processing\r\n // We'll use the file from the completed upload result\r\n\r\n const fileExtension = this.getFileExtension(request.file?.name || '');\r\n\r\n if (['.txt', '.tsv', '.sdrf'].includes(fileExtension)) {\r\n // For SDRF files, we need to read the file content as text\r\n return from(request.file.text()).pipe(\r\n switchMap(fileContent => {\r\n const formData = new FormData();\r\n formData.append('metadata_table_id', request.metadataTableId.toString());\r\n formData.append('file_content', fileContent);\r\n formData.append('filename', request.file.name);\r\n\r\n if (request.replaceExisting !== undefined) {\r\n formData.append('replace_existing', request.replaceExisting.toString());\r\n }\r\n if (request.validateOntologies !== undefined) {\r\n formData.append('validate_ontologies', request.validateOntologies.toString());\r\n }\r\n\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-import/sdrf_file/`, formData);\r\n })\r\n );\r\n } else {\r\n // For Excel files, we can pass the file directly\r\n const formData = new FormData();\r\n formData.append('metadata_table_id', request.metadataTableId.toString());\r\n formData.append('file', request.file);\r\n\r\n if (request.replaceExisting !== undefined) {\r\n formData.append('replace_existing', request.replaceExisting.toString());\r\n }\r\n if (request.validateOntologies !== undefined) {\r\n formData.append('validate_ontologies', request.validateOntologies.toString());\r\n }\r\n\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-import/excel_file/`, formData);\r\n }\r\n }\r\n\r\n /**\r\n * Validate file type\r\n */\r\n private validateFileType(file: File, allowedExtensions: string[]): Observable<File> {\r\n const fileExtension = this.getFileExtension(file.name);\r\n\r\n if (!allowedExtensions.includes(fileExtension)) {\r\n return throwError(() => new Error(\r\n `Invalid file type. Expected: ${allowedExtensions.join(', ')}, got: ${fileExtension}`\r\n ));\r\n }\r\n\r\n return from(Promise.resolve(file));\r\n }\r\n\r\n /**\r\n * Get file extension from filename\r\n */\r\n private getFileExtension(filename: string): string {\r\n const lastDot = filename.lastIndexOf('.');\r\n return lastDot !== -1 ? filename.substring(lastDot).toLowerCase() : '';\r\n }\r\n\r\n /**\r\n * Create progress observable for UI updates\r\n */\r\n createProgressObservable(\r\n request: ChunkedFileImportRequest,\r\n onProgress?: (progress: ChunkedImportProgress) => void\r\n ): Observable<AsyncTaskCreateResponse> {\r\n return new Observable(observer => {\r\n let currentPhase: ChunkedImportProgress['phase'] = 'uploading';\r\n\r\n // Report initial state\r\n if (onProgress) {\r\n onProgress({ uploadProgress: 0, phase: currentPhase });\r\n }\r\n\r\n // Start chunked upload with progress tracking\r\n this.chunkedUploadService.uploadFileInChunks(\r\n request.file,\r\n 1024 * 1024, // 1MB chunks\r\n {\r\n metadataTableId: request.metadataTableId,\r\n createPools: request.createPools,\r\n replaceExisting: request.replaceExisting,\r\n onProgress: (progress: number) => {\r\n if (onProgress && currentPhase === 'uploading') {\r\n onProgress({\r\n uploadProgress: progress,\r\n phase: currentPhase\r\n });\r\n }\r\n }\r\n }\r\n ).pipe(\r\n tap(() => {\r\n // Upload completed, now processing\r\n currentPhase = 'processing';\r\n if (onProgress) {\r\n onProgress({ uploadProgress: 100, phase: currentPhase });\r\n }\r\n }),\r\n switchMap((uploadResult) => {\r\n return this.triggerAsyncImport(uploadResult, request);\r\n })\r\n ).subscribe({\r\n next: (result) => {\r\n currentPhase = 'completed';\r\n if (onProgress) {\r\n onProgress({\r\n uploadProgress: 100,\r\n phase: currentPhase,\r\n taskId: result.taskId\r\n });\r\n }\r\n observer.next(result);\r\n observer.complete();\r\n },\r\n error: (error) => {\r\n currentPhase = 'failed';\r\n if (onProgress) {\r\n onProgress({ uploadProgress: 0, phase: currentPhase });\r\n }\r\n observer.error(error);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Queue chunked file import task using completed chunked upload\r\n * This uses the new backend endpoint that processes already uploaded chunks\r\n */\r\n processChunkedUpload(request: ChunkedImportRequest): Observable<AsyncTaskCreateResponse> {\r\n const payload = {\r\n metadataTableId: request.metadataTableId,\r\n chunkedUploadId: request.chunkedUploadId,\r\n replaceExisting: request.replaceExisting,\r\n validateOntologies: request.validateOntologies,\r\n createPools: request.createPools\r\n };\r\n\r\n return this.post<AsyncTaskCreateResponse>(`${this.apiUrl}/async-import/chunked_file/`, payload);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\n\nexport interface AgeFormat {\n years?: number;\n months?: number;\n days?: number;\n isRange?: boolean;\n rangeStart?: AgeFormat;\n rangeEnd?: AgeFormat;\n}\n\nexport interface ModificationParameters {\n NT?: string; // Name of Term (supports typeahead)\n AC?: string; // Accession\n CF?: string; // Chemical Formula\n MT?: string; // Modification Type (Fixed/Variable/Annotated)\n PP?: string; // Position in Polypeptide\n TA?: string; // Target Amino acid\n MM?: string; // Monoisotopic Mass\n TS?: string; // Target Site regex\n}\n\nexport interface CleavageAgentDetails {\n NT?: string; // Name of Term (supports typeahead)\n AC?: string; // Accession\n CS?: string; // Cleavage Site regex\n}\n\nexport interface SpikedCompound {\n SP?: string; // spike name\n CT?: string; // compound type\n QY?: string; // quantity\n PS?: string; // purity specification\n AC?: string; // accession\n CN?: string; // compound name\n CV?: string; // controlled vocabulary\n CS?: string; // chemical structure\n CF?: string; // chemical formula\n}\n\nexport interface PooledSample {\n value: 'not pooled' | 'pooled' | string; // string for SN=sample1,sample2 format\n sourceNames?: string[]; // parsed source names when SN= format is used\n}\n\nexport interface SyntheticPeptide {\n value: 'synthetic' | 'not synthetic';\n}\n\nexport interface ValidationResult {\n isValid: boolean;\n errors: string[];\n warnings?: string[];\n}\n\nexport type SyntaxType = 'age' | 'modification' | 'cleavage' | 'spiked_compound' | 'pooled_sample' | 'synthetic_peptide';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SdrfSyntaxService {\n\n private readonly SPECIAL_COLUMN_PATTERNS = {\n age: /^characteristics\\[age\\]$/i,\n modification: /^comment\\[modification parameters\\]$/i,\n cleavage: /^comment\\[cleavage agent details\\]$/i,\n spiked_compound: /^characteristics\\[spiked compound\\]$/i,\n pooled_sample: /^characteristics\\[pooled sample\\]$/i,\n synthetic_peptide: /^characteristics\\[synthetic peptide\\]$/i\n };\n\n private readonly MODIFICATION_KEYS = ['NT', 'AC', 'CF', 'MT', 'PP', 'TA', 'MM', 'TS'];\n private readonly CLEAVAGE_KEYS = ['NT', 'AC', 'CS'];\n private readonly SPIKED_COMPOUND_KEYS = ['SP', 'CT', 'QY', 'PS', 'AC', 'CN', 'CV', 'CS', 'CF'];\n private readonly POOLED_SAMPLE_VALUES = ['not pooled', 'pooled'];\n private readonly SYNTHETIC_PEPTIDE_VALUES = ['synthetic', 'not synthetic'];\n\n /**\n * Detects if a column requires special SDRF syntax handling\n */\n detectSpecialSyntax(columnName: string, columnType: string): SyntaxType | null {\n const name = columnName.toLowerCase();\n const type = columnType.toLowerCase();\n\n if (this.SPECIAL_COLUMN_PATTERNS.age.test(name) || this.SPECIAL_COLUMN_PATTERNS.age.test(type)) {\n return 'age';\n }\n \n if (this.SPECIAL_COLUMN_PATTERNS.modification.test(name) || this.SPECIAL_COLUMN_PATTERNS.modification.test(type)) {\n return 'modification';\n }\n \n if (this.SPECIAL_COLUMN_PATTERNS.cleavage.test(name) || this.SPECIAL_COLUMN_PATTERNS.cleavage.test(type)) {\n return 'cleavage';\n }\n \n if (this.SPECIAL_COLUMN_PATTERNS.spiked_compound.test(name) || this.SPECIAL_COLUMN_PATTERNS.spiked_compound.test(type)) {\n return 'spiked_compound';\n }\n\n return null;\n }\n\n /**\n * Parses a value based on the syntax type\n */\n parseValue(syntaxType: SyntaxType, value: string): any {\n if (!value || value.trim() === '') {\n return null;\n }\n\n try {\n switch (syntaxType) {\n case 'age':\n return this.parseAgeFormat(value);\n case 'modification':\n return this.parseKeyValuePairs(value, this.MODIFICATION_KEYS);\n case 'cleavage':\n return this.parseKeyValuePairs(value, this.CLEAVAGE_KEYS);\n case 'spiked_compound':\n return this.parseKeyValuePairs(value, this.SPIKED_COMPOUND_KEYS);\n default:\n throw new Error(`Unknown syntax type: ${syntaxType}`);\n }\n } catch (error) {\n console.error(`Error parsing ${syntaxType} value:`, error);\n return null;\n }\n }\n\n /**\n * Formats parsed data back to string format\n */\n formatValue(syntaxType: SyntaxType, data: any): string {\n if (!data) {\n return '';\n }\n\n try {\n switch (syntaxType) {\n case 'age':\n return this.formatAgeFormat(data as AgeFormat);\n case 'modification':\n case 'cleavage':\n case 'spiked_compound':\n return this.formatKeyValuePairs(data);\n default:\n throw new Error(`Unknown syntax type: ${syntaxType}`);\n }\n } catch (error) {\n console.error(`Error formatting ${syntaxType} value:`, error);\n return '';\n }\n }\n\n /**\n * Validates parsed data\n */\n validateValue(syntaxType: SyntaxType, data: any): ValidationResult {\n const result: ValidationResult = {\n isValid: true,\n errors: [],\n warnings: []\n };\n\n if (!data) {\n result.isValid = false;\n result.errors.push('Value is required');\n return result;\n }\n\n try {\n switch (syntaxType) {\n case 'age':\n return this.validateAgeFormat(data as AgeFormat);\n case 'modification':\n return this.validateModificationParameters(data as ModificationParameters);\n case 'cleavage':\n return this.validateCleavageAgentDetails(data as CleavageAgentDetails);\n case 'spiked_compound':\n return this.validateSpikedCompound(data as SpikedCompound);\n default:\n result.isValid = false;\n result.errors.push(`Unknown syntax type: ${syntaxType}`);\n }\n } catch (error) {\n result.isValid = false;\n result.errors.push(`Validation error: ${error}`);\n }\n\n return result;\n }\n\n\n private parseAgeFormat(value: string): AgeFormat {\n const trimmed = value.trim();\n \n if (trimmed.includes('-')) {\n const [startStr, endStr] = trimmed.split('-').map(s => s.trim());\n return {\n isRange: true,\n rangeStart: this.parseSingleAge(startStr),\n rangeEnd: this.parseSingleAge(endStr)\n };\n }\n\n return this.parseSingleAge(trimmed);\n }\n\n private parseSingleAge(ageStr: string): AgeFormat {\n const age: AgeFormat = {};\n \n const yearMatch = ageStr.match(/(\\d+)Y/);\n const monthMatch = ageStr.match(/(\\d+)M/);\n const dayMatch = ageStr.match(/(\\d+)D/);\n\n if (yearMatch) {\n age.years = parseInt(yearMatch[1], 10);\n }\n if (monthMatch) {\n age.months = parseInt(monthMatch[1], 10);\n }\n if (dayMatch) {\n age.days = parseInt(dayMatch[1], 10);\n }\n\n return age;\n }\n\n private formatAgeFormat(age: AgeFormat): string {\n if (age.isRange && age.rangeStart && age.rangeEnd) {\n return `${this.formatSingleAge(age.rangeStart)}-${this.formatSingleAge(age.rangeEnd)}`;\n }\n\n return this.formatSingleAge(age);\n }\n\n private formatSingleAge(age: AgeFormat): string {\n let result = '';\n if (age.years) result += `${age.years}Y`;\n if (age.months) result += `${age.months}M`;\n if (age.days) result += `${age.days}D`;\n return result;\n }\n\n private parseKeyValuePairs(value: string, validKeys: string[]): any {\n const result: any = {};\n \n const pairs = value.split(';').map(pair => pair.trim()).filter(pair => pair);\n \n for (const pair of pairs) {\n const [key, ...valueParts] = pair.split('=');\n const keyTrimmed = key?.trim();\n const valueTrimmed = valueParts.join('=').trim();\n\n if (keyTrimmed && validKeys.includes(keyTrimmed)) {\n result[keyTrimmed] = valueTrimmed;\n }\n }\n\n return result;\n }\n\n private formatKeyValuePairs(data: any): string {\n const pairs: string[] = [];\n \n for (const [key, value] of Object.entries(data)) {\n if (value !== null && value !== undefined && value !== '') {\n pairs.push(`${key}=${value}`);\n }\n }\n\n return pairs.join(';');\n }\n\n private validateAgeFormat(age: AgeFormat): ValidationResult {\n const result: ValidationResult = { isValid: true, errors: [], warnings: [] };\n\n if (age.isRange) {\n if (!age.rangeStart || !age.rangeEnd) {\n result.isValid = false;\n result.errors.push('Range format requires both start and end values');\n return result;\n }\n\n const startValidation = this.validateSingleAge(age.rangeStart);\n const endValidation = this.validateSingleAge(age.rangeEnd);\n\n if (!startValidation.isValid) {\n result.isValid = false;\n result.errors.push(...startValidation.errors.map(e => `Range start: ${e}`));\n }\n\n if (!endValidation.isValid) {\n result.isValid = false;\n result.errors.push(...endValidation.errors.map(e => `Range end: ${e}`));\n }\n } else {\n const singleValidation = this.validateSingleAge(age);\n if (!singleValidation.isValid) {\n result.isValid = false;\n result.errors.push(...singleValidation.errors);\n }\n }\n\n return result;\n }\n\n private validateSingleAge(age: AgeFormat): ValidationResult {\n const result: ValidationResult = { isValid: true, errors: [] };\n\n if (!age.years && !age.months && !age.days) {\n result.isValid = false;\n result.errors.push('At least one age component (years, months, or days) is required');\n }\n\n if (age.years !== undefined && (age.years < 0 || age.years > 200)) {\n result.isValid = false;\n result.errors.push('Years must be between 0 and 200');\n }\n\n if (age.months !== undefined && (age.months < 0 || age.months > 11)) {\n result.isValid = false;\n result.errors.push('Months must be between 0 and 11');\n }\n\n if (age.days !== undefined && (age.days < 0 || age.days > 31)) {\n result.isValid = false;\n result.errors.push('Days must be between 0 and 31');\n }\n\n return result;\n }\n\n private validateModificationParameters(params: ModificationParameters): ValidationResult {\n const result: ValidationResult = { isValid: true, errors: [], warnings: [] };\n\n const hasAnyParam = Object.values(params).some(value => value !== undefined && value !== '');\n if (!hasAnyParam) {\n result.isValid = false;\n result.errors.push('At least one modification parameter is required');\n }\n\n if (params.PP && !/^\\d+$/.test(params.PP)) {\n result.errors.push('PP (protein position) must be a number');\n result.isValid = false;\n }\n\n if (params.MM && !/^\\d+(\\.\\d+)?$/.test(params.MM)) {\n result.errors.push('MM (monoisotopic mass) must be a valid number');\n result.isValid = false;\n }\n\n return result;\n }\n\n private validateCleavageAgentDetails(details: CleavageAgentDetails): ValidationResult {\n const result: ValidationResult = { isValid: true, errors: [] };\n\n const hasAnyDetail = Object.values(details).some(value => value !== undefined && value !== '');\n if (!hasAnyDetail) {\n result.isValid = false;\n result.errors.push('At least one cleavage agent detail is required');\n }\n\n return result;\n }\n\n private validateSpikedCompound(compound: SpikedCompound): ValidationResult {\n const result: ValidationResult = { isValid: true, errors: [], warnings: [] };\n\n const hasAnyParam = Object.values(compound).some(value => value !== undefined && value !== '');\n if (!hasAnyParam) {\n result.isValid = false;\n result.errors.push('At least one spiked compound parameter is required');\n }\n\n if (compound.QY && !/^\\d+(\\.\\d+)?\\s*(mg|g|kg|μg|ng|pg|M|mM|μM|nM|pM)?$/i.test(compound.QY)) {\n result.warnings?.push('QY (quantity) format may not be standard - consider using standard units');\n }\n\n return result;\n }\n\n getPooledSampleValues(): string[] {\n return [...this.POOLED_SAMPLE_VALUES];\n }\n\n getSyntheticPeptideValues(): string[] {\n return [...this.SYNTHETIC_PEPTIDE_VALUES];\n }\n}\n","import { Injectable } from '@angular/core';\r\nimport { Observable, NEVER } from 'rxjs';\r\n\r\nexport interface ElectronAPI {\r\n platform: string;\r\n isElectron: boolean;\r\n getAppVersion(): Promise<string>;\r\n getElectronVersion(): Promise<string>;\r\n minimize(): void;\r\n maximize(): void;\r\n close(): void;\r\n isMaximized(): Promise<boolean>;\r\n showOpenDialog(options?: any): Promise<any>;\r\n showSaveDialog(options?: any): Promise<any>;\r\n showMessageBox(options: any): Promise<any>;\r\n downloadFile(url: string, filename?: string): Promise<string>;\r\n getBackendPort(): Promise<number>;\r\n isBackendReady(): Promise<boolean>;\r\n onBackendStatusChange(callback: (status: any) => void): () => void;\r\n onWindowStateChange(callback: (state: 'maximized' | 'unmaximized') => void): () => void;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n electronAPI?: ElectronAPI;\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ElectronService {\r\n private electronAPI: ElectronAPI | null = null;\r\n\r\n constructor() {\r\n this.electronAPI = window.electronAPI || null;\r\n }\r\n\r\n get isElectron(): boolean {\r\n return this.electronAPI?.isElectron ?? false;\r\n }\r\n\r\n get platform(): string {\r\n return this.electronAPI?.platform ?? 'web';\r\n }\r\n\r\n async getAppVersion(): Promise<string> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.getAppVersion();\r\n }\r\n\r\n async getElectronVersion(): Promise<string> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.getElectronVersion();\r\n }\r\n\r\n minimize(): void {\r\n if (!this.electronAPI) return;\r\n this.electronAPI.minimize();\r\n }\r\n\r\n maximize(): void {\r\n if (!this.electronAPI) return;\r\n this.electronAPI.maximize();\r\n }\r\n\r\n close(): void {\r\n if (!this.electronAPI) return;\r\n this.electronAPI.close();\r\n }\r\n\r\n async isMaximized(): Promise<boolean> {\r\n if (!this.electronAPI) return false;\r\n return this.electronAPI.isMaximized();\r\n }\r\n\r\n async showOpenDialog(options?: any): Promise<any> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.showOpenDialog(options);\r\n }\r\n\r\n async showSaveDialog(options?: any): Promise<any> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.showSaveDialog(options);\r\n }\r\n\r\n async showMessageBox(options: any): Promise<any> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.showMessageBox(options);\r\n }\r\n\r\n async downloadFile(url: string, filename?: string): Promise<string> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.downloadFile(url, filename);\r\n }\r\n\r\n async getBackendPort(): Promise<number> {\r\n if (!this.electronAPI) throw new Error('Not running in Electron');\r\n return this.electronAPI.getBackendPort();\r\n }\r\n\r\n async isBackendReady(): Promise<boolean> {\r\n if (!this.electronAPI) return false;\r\n return this.electronAPI.isBackendReady();\r\n }\r\n\r\n onBackendStatusChange(): Observable<any> {\r\n if (!this.electronAPI) return NEVER;\r\n\r\n return new Observable(observer => {\r\n const unsubscribe = this.electronAPI!.onBackendStatusChange((status: any) => {\r\n observer.next(status);\r\n });\r\n\r\n return () => unsubscribe();\r\n });\r\n }\r\n\r\n onWindowStateChange(): Observable<'maximized' | 'unmaximized'> {\r\n if (!this.electronAPI) return NEVER;\r\n\r\n return new Observable(observer => {\r\n const unsubscribe = this.electronAPI!.onWindowStateChange((state: 'maximized' | 'unmaximized') => {\r\n observer.next(state);\r\n });\r\n\r\n return () => unsubscribe();\r\n });\r\n }\r\n}","import { Component, Input, Output, EventEmitter, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { SdrfSyntaxService, AgeFormat } from '../../services/sdrf-syntax';\n\n@Component({\n selector: 'ccv-sdrf-age-input',\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: './sdrf-age-input.html',\n styleUrl: './sdrf-age-input.scss'\n})\nexport class SdrfAgeInput implements OnInit {\n @Input() value: string = '';\n @Output() valueChange = new EventEmitter<string>();\n\n private fb = inject(FormBuilder);\n private sdrfSyntax = inject(SdrfSyntaxService);\n\n ageForm!: FormGroup;\n isRange = false;\n\n ngOnInit() {\n this.ageForm = this.fb.group({\n isRange: [false],\n years: [null, [Validators.min(0), Validators.max(200)]],\n months: [null, [Validators.min(0), Validators.max(11)]],\n days: [null, [Validators.min(0), Validators.max(31)]],\n weeks: [null, [Validators.min(0), Validators.max(520)]],\n rangeStartYears: [null, [Validators.min(0), Validators.max(200)]],\n rangeStartMonths: [null, [Validators.min(0), Validators.max(11)]],\n rangeEndYears: [null, [Validators.min(0), Validators.max(200)]],\n rangeEndMonths: [null, [Validators.min(0), Validators.max(11)]]\n });\n\n // Parse initial value\n if (this.value) {\n this.parseAndSetValue(this.value);\n }\n\n // Subscribe to form changes\n this.ageForm.valueChanges.subscribe(() => {\n this.updateValue();\n });\n\n // Subscribe to range toggle\n this.ageForm.get('isRange')?.valueChanges.subscribe((isRange) => {\n this.isRange = isRange;\n this.updateValue();\n });\n }\n\n private parseAndSetValue(value: string) {\n try {\n const parsed = this.sdrfSyntax.parseValue('age', value) as AgeFormat;\n if (parsed.isRange && parsed.rangeStart && parsed.rangeEnd) {\n this.ageForm.patchValue({\n isRange: true,\n rangeStartYears: parsed.rangeStart.years,\n rangeStartMonths: parsed.rangeStart.months,\n rangeEndYears: parsed.rangeEnd.years,\n rangeEndMonths: parsed.rangeEnd.months\n });\n this.isRange = true;\n } else {\n this.ageForm.patchValue({\n isRange: false,\n years: parsed.years,\n months: parsed.months,\n days: parsed.days\n });\n }\n } catch (error) {\n console.warn('Could not parse age value:', value);\n }\n }\n\n private updateValue() {\n const formValue = this.ageForm.value;\n \n if (formValue.isRange) {\n if (formValue.rangeStartYears || formValue.rangeEndYears) {\n const ageData: AgeFormat = {\n isRange: true,\n rangeStart: {\n years: formValue.rangeStartYears || 0,\n months: formValue.rangeStartMonths || 0\n },\n rangeEnd: {\n years: formValue.rangeEndYears || 0,\n months: formValue.rangeEndMonths || 0\n }\n };\n \n const formatted = this.sdrfSyntax.formatValue('age', ageData);\n this.valueChange.emit(formatted);\n }\n } else {\n if (formValue.years || formValue.months || formValue.days || formValue.weeks) {\n const ageData: AgeFormat = {\n years: formValue.years || undefined,\n months: formValue.months || undefined,\n days: formValue.days || undefined\n };\n \n // Handle weeks separately (convert to special format)\n if (formValue.weeks && !formValue.years && !formValue.months && !formValue.days) {\n const formatted = `${formValue.weeks}W`;\n this.valueChange.emit(formatted);\n } else {\n const formatted = this.sdrfSyntax.formatValue('age', ageData);\n this.valueChange.emit(formatted);\n }\n }\n }\n }\n}\n","<form [formGroup]=\"ageForm\" class=\"age-input-form\">\n <!-- Range Toggle -->\n <div class=\"form-check mb-3\">\n <input class=\"form-check-input\" type=\"checkbox\" id=\"isRange\" formControlName=\"isRange\">\n <label class=\"form-check-label\" for=\"isRange\">\n Age Range\n </label>\n </div>\n\n <!-- Single Age Input -->\n @if (!isRange) {\n <div class=\"row g-2 mb-2\">\n <div class=\"col-sm-3\">\n <label for=\"years\" class=\"form-label\">Years</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"years\" \n formControlName=\"years\" placeholder=\"0\" min=\"0\" max=\"200\">\n </div>\n <div class=\"col-sm-3\">\n <label for=\"months\" class=\"form-label\">Months</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"months\" \n formControlName=\"months\" placeholder=\"0\" min=\"0\" max=\"11\">\n </div>\n <div class=\"col-sm-3\">\n <label for=\"days\" class=\"form-label\">Days</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"days\" \n formControlName=\"days\" placeholder=\"0\" min=\"0\" max=\"31\">\n </div>\n <div class=\"col-sm-3\">\n <label for=\"weeks\" class=\"form-label\">Weeks <small class=\"text-muted\">(alternative)</small></label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"weeks\" \n formControlName=\"weeks\" placeholder=\"0\" min=\"0\" max=\"520\">\n </div>\n </div>\n <div class=\"form-text\">\n Use weeks for very young subjects (e.g., \"8W\" for 8 weeks). Otherwise use years/months/days.\n </div>\n }\n\n <!-- Age Range Input -->\n @if (isRange) {\n <div class=\"row g-2 mb-2\">\n <div class=\"col-sm-6\">\n <label class=\"form-label fw-semibold\">Start Age</label>\n <div class=\"row g-1\">\n <div class=\"col-6\">\n <label for=\"rangeStartYears\" class=\"form-label small\">Years</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"rangeStartYears\" \n formControlName=\"rangeStartYears\" placeholder=\"0\" min=\"0\" max=\"200\">\n </div>\n <div class=\"col-6\">\n <label for=\"rangeStartMonths\" class=\"form-label small\">Months</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"rangeStartMonths\" \n formControlName=\"rangeStartMonths\" placeholder=\"0\" min=\"0\" max=\"11\">\n </div>\n </div>\n </div>\n <div class=\"col-sm-6\">\n <label class=\"form-label fw-semibold\">End Age</label>\n <div class=\"row g-1\">\n <div class=\"col-6\">\n <label for=\"rangeEndYears\" class=\"form-label small\">Years</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"rangeEndYears\" \n formControlName=\"rangeEndYears\" placeholder=\"0\" min=\"0\" max=\"200\">\n </div>\n <div class=\"col-6\">\n <label for=\"rangeEndMonths\" class=\"form-label small\">Months</label>\n <input type=\"number\" class=\"form-control form-control-sm\" id=\"rangeEndMonths\" \n formControlName=\"rangeEndMonths\" placeholder=\"0\" min=\"0\" max=\"11\">\n </div>\n </div>\n </div>\n </div>\n <div class=\"form-text\">\n Age range format: \"25Y-30Y\" or \"2Y6M-3Y\"\n </div>\n }\n\n <!-- Validation Messages -->\n @if (ageForm.invalid && ageForm.touched) {\n <div class=\"alert alert-warning alert-sm mt-2\">\n <small>\n <i class=\"bi bi-exclamation-triangle me-1\"></i>\n Please enter valid age values (0-200 years, 0-11 months, 0-31 days)\n </small>\n </div>\n }\n</form>\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbTypeahead, NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { Observable, OperatorFunction, debounceTime, distinctUntilChanged, filter, map, switchMap, of, catchError } from 'rxjs';\nimport { SdrfSyntaxService, ModificationParameters } from '../../services/sdrf-syntax';\nimport {\n OntologySuggestion,\n UnimodFullData,\n UnimodSpecification,\n isUnimodFullData,\n OntologyUtils,\n OntologyType\n} from '../../models';\nimport {\n MetadataColumnService,\n MetadataColumnTemplateService\n} from '../../services';\n\n@Component({\n selector: 'ccv-sdrf-modification-input',\n imports: [CommonModule, ReactiveFormsModule, NgbTypeahead, NgbModule],\n templateUrl: './sdrf-modification-input.html',\n styleUrl: './sdrf-modification-input.scss'\n})\nexport class SdrfModificationInput implements OnInit {\n @Input() value: string = '';\n @Input() templateId: number | null = null; // Template ID for ontology suggestions\n @Input() columnId: number | null = null; // Column ID for ontology suggestions (actual metadata column)\n @Output() valueChange = new EventEmitter<string>();\n\n // Search type for typeahead - internal signal\n searchType = signal<'icontains' | 'istartswith'>('icontains');\n\n private fb = inject(FormBuilder);\n private sdrfSyntax = inject(SdrfSyntaxService);\n private metadataColumnService = inject(MetadataColumnService);\n private metadataColumnTemplateService = inject(MetadataColumnTemplateService);\n\n modificationForm!: FormGroup;\n\n // Predefined options for dropdowns\n modificationTypes = ['Fixed', 'Variable', 'Annotated'];\n positions = ['Anywhere', 'Protein N-term', 'Protein C-term', 'Any N-term', 'Any C-term'];\n\n // Unimod specification support\n selectedUnimodData = signal<UnimodFullData | null>(null);\n availableSpecifications = signal<(UnimodSpecification & { specNumber: string })[]>([]);\n selectedSpecification = signal<string | null>(null);\n showSpecifications = signal(false);\n showHiddenSpecifications = signal(false);\n hiddenSpecificationCount = signal(0);\n\n ngOnInit() {\n this.modificationForm = this.fb.group({\n NT: ['', Validators.required], // Name of Term - with typeahead\n AC: [''], // Accession\n CF: [''], // Chemical Formula\n MT: [''], // Modification Type\n PP: [''], // Position in Polypeptide\n TA: ['', Validators.required], // Target Amino acid\n MM: ['', [Validators.pattern(/^\\d+(\\.\\d+)?$/)]], // Monoisotopic Mass\n TS: [''] // Target Site regex\n });\n\n // Parse initial value\n if (this.value) {\n this.parseAndSetValue(this.value);\n }\n\n // Subscribe to form changes\n this.modificationForm.valueChanges.subscribe(() => {\n this.updateValue();\n });\n }\n\n private parseAndSetValue(value: string) {\n try {\n const parsed = this.sdrfSyntax.parseValue('modification', value) as ModificationParameters;\n this.modificationForm.patchValue(parsed);\n } catch (error) {\n console.warn('Could not parse modification value:', value);\n }\n }\n\n // Helper method to ensure we get string values from form controls\n private getStringValue(value: any): string {\n if (typeof value === 'string') {\n return value.trim();\n }\n \n // Handle objects from typeahead selection (OntologySuggestion)\n if (value && typeof value === 'object') {\n // For Unimod modifications, use the name from full_data\n if (value.fullData && value.fullData.name) {\n return value.fullData.name;\n }\n // For other ontology types, use the value property\n if (value.value) return value.value;\n if (value.name) return value.name;\n }\n \n // Fallback to string conversion\n return value ? String(value).trim() : '';\n }\n\n private updateValue() {\n const formValue = this.modificationForm.value;\n\n // Only emit if we have required fields\n if (formValue.NT && formValue.TA) {\n // Build cleaned value, ensuring NT is always included and properly stringified\n const cleanedValue: ModificationParameters = {\n NT: this.getStringValue(formValue.NT), // Always include NT field as string\n TA: this.getStringValue(formValue.TA) // Always include TA field as string\n };\n\n // Add other non-empty fields\n Object.keys(formValue).forEach(key => {\n if (key !== 'NT' && key !== 'TA') { // Skip NT and TA as they're already added\n const value = formValue[key];\n const stringValue = this.getStringValue(value);\n if (stringValue) {\n cleanedValue[key as keyof ModificationParameters] = stringValue;\n }\n }\n });\n\n const formatted = this.sdrfSyntax.formatValue('modification', cleanedValue);\n this.valueChange.emit(formatted);\n } else if (!formValue.NT && !formValue.TA) {\n // If both required fields are empty, emit empty string\n this.valueChange.emit('');\n }\n }\n\n // Typeahead for NT field (Name of Term) - using ontology suggestions from API\n searchModificationTerms: OperatorFunction<string, readonly OntologySuggestion[]> = (text$: Observable<string>) =>\n text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n filter(term => term.length >= 2),\n switchMap(term => {\n // Use column ID first if available (for actual metadata columns), otherwise template ID (for templates/favorites)\n if (this.columnId) {\n return this.metadataColumnService.getOntologySuggestions({\n columnId: this.columnId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n map(response => response.suggestions || []),\n catchError(error => {\n console.warn(`Failed to get ontology suggestions for column ${this.columnId}:`, error);\n return of([]);\n })\n );\n } else if (this.templateId) {\n return this.metadataColumnTemplateService.getOntologySuggestions({\n templateId: this.templateId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n map(response => response.suggestions || []),\n catchError(error => {\n console.warn(`Failed to get ontology suggestions for template ${this.templateId}:`, error);\n return of([]);\n })\n );\n } else {\n // No ID available, return empty suggestions\n return of([]);\n }\n })\n );\n\n // Formatter for ontology suggestions\n formatOntologySuggestion = (suggestion: OntologySuggestion): string => {\n return suggestion.displayName || suggestion.value;\n };\n\n // Handle ontology suggestion selection\n onOntologySuggestionSelected = (event: any): void => {\n const suggestion: OntologySuggestion = event.item;\n if (suggestion) {\n // Set the NT field value - use display name for Unimod, otherwise use value\n const ntValue = isUnimodFullData(suggestion) && suggestion.fullData.name\n ? suggestion.fullData.name\n : (suggestion.displayName || suggestion.value);\n this.modificationForm.patchValue({ NT: ntValue });\n\n // Check if this is a Unimod modification with specifications\n if (isUnimodFullData(suggestion)) {\n this.selectedUnimodData.set(suggestion.fullData);\n this.updateAvailableSpecifications(suggestion);\n this.showSpecifications.set(this.availableSpecifications().length > 0);\n\n // Auto-fill some fields from main Unimod data\n if (suggestion.fullData.accession) {\n this.modificationForm.patchValue({ AC: suggestion.fullData.accession });\n }\n if (suggestion.fullData.deltaComposition) {\n this.modificationForm.patchValue({ CF: suggestion.fullData.deltaComposition });\n }\n if (suggestion.fullData.deltaMonoMass) {\n this.modificationForm.patchValue({ MM: suggestion.fullData.deltaMonoMass });\n }\n } else {\n // Not a Unimod modification, clear specification data\n this.selectedUnimodData.set(null);\n this.availableSpecifications.set([]);\n this.showSpecifications.set(false);\n this.selectedSpecification.set(null);\n }\n }\n };\n\n // Format TA field display (amino acids)\n formatTargetAminoAcids(value: string): string {\n if (!value) return '';\n // Split by comma and clean up\n return value.split(',').map(aa => aa.trim().toUpperCase()).join(', ');\n }\n\n onTargetAminoAcidChange(event: any) {\n const value = event.target.value;\n if (value) {\n // Format as uppercase and validate amino acid letters\n const formatted = value\n .replace(/[^A-Za-z,]/g, '') // Only allow letters and commas\n .split(',')\n .map((aa: string) => aa.trim().toUpperCase())\n .filter((aa: string) => aa.length > 0)\n .join(',');\n\n this.modificationForm.patchValue({ TA: formatted });\n }\n }\n\n // Handle specification selection\n onSpecificationSelected(specNumber: string): void {\n this.selectedSpecification.set(specNumber);\n const unimodData = this.selectedUnimodData();\n\n if (unimodData && unimodData.specifications[specNumber]) {\n const spec = unimodData.specifications[specNumber];\n\n // Ensure NT field is preserved (use the Unimod name)\n const currentNT = this.modificationForm.get('NT')?.value;\n if (!currentNT && unimodData.name) {\n this.modificationForm.patchValue({ NT: unimodData.name });\n }\n\n // Update form fields with specification data\n if (spec['site']) {\n this.modificationForm.patchValue({ TA: spec['site'] });\n }\n if (spec['position']) {\n // Map Unimod position to our dropdown values\n const mappedPosition = this.mapUnimodPosition(spec['position']);\n this.modificationForm.patchValue({ PP: mappedPosition });\n }\n if (spec['classification']) {\n // Map classification to modification type if possible\n const mappedType = this.mapClassificationToType(spec['classification']);\n if (mappedType) {\n this.modificationForm.patchValue({ MT: mappedType });\n }\n }\n }\n }\n\n // Map Unimod position to our dropdown values\n private mapUnimodPosition(unimodPosition: string): string {\n const positionMap: Record<string, string> = {\n 'Anywhere': 'Anywhere',\n 'Protein N-term': 'Protein N-term',\n 'Protein C-term': 'Protein C-term',\n 'Any N-term': 'Any N-term',\n 'Any C-term': 'Any C-term'\n };\n\n return positionMap[unimodPosition] || 'Anywhere';\n }\n\n // Map classification to modification type\n private mapClassificationToType(classification: string): string | null {\n const classificationMap: Record<string, string> = {\n 'Post-translational': 'Variable',\n 'Chemical derivatization': 'Fixed',\n 'Artefact': 'Variable',\n 'Pre-translational': 'Fixed',\n 'Multiple': 'Variable',\n 'Other': 'Variable'\n };\n\n return classificationMap[classification] || null;\n }\n\n // Get specification display text\n getSpecificationDisplay(spec: UnimodSpecification & { specNumber: string }): string {\n const parts = [];\n if (spec['site']) parts.push(`Site: ${spec['site']}`);\n if (spec['position']) parts.push(`Position: ${spec['position']}`);\n if (spec['classification']) parts.push(`Class: ${spec['classification']}`);\n\n return parts.join(' | ') || `Specification ${spec.specNumber}`;\n }\n\n // Handle search type change\n onSearchTypeChange(type: 'icontains' | 'istartswith'): void {\n this.searchType.set(type);\n }\n\n // Update available specifications based on toggle state\n private updateAvailableSpecifications(suggestion: OntologySuggestion): void {\n if (!isUnimodFullData(suggestion)) return;\n\n const allSpecs = OntologyUtils.getUnimodSpecifications(suggestion);\n const activeSpecs = OntologyUtils.getActiveUnimodSpecifications(suggestion);\n \n // Calculate hidden count\n this.hiddenSpecificationCount.set(allSpecs.length - activeSpecs.length);\n \n // Set available specifications based on toggle\n const specsToShow = this.showHiddenSpecifications() ? allSpecs : activeSpecs;\n this.availableSpecifications.set(specsToShow);\n }\n\n // Toggle hidden specifications visibility\n toggleHiddenSpecifications(): void {\n this.showHiddenSpecifications.set(!this.showHiddenSpecifications());\n \n // Update available specifications\n const unimodData = this.selectedUnimodData();\n if (unimodData) {\n // Create a mock suggestion object to pass to updateAvailableSpecifications\n const mockSuggestion: OntologySuggestion = {\n id: '',\n value: '',\n displayName: '',\n ontologyType: OntologyType.UNIMOD,\n fullData: unimodData\n };\n this.updateAvailableSpecifications(mockSuggestion);\n }\n }\n}\n","<form [formGroup]=\"modificationForm\" class=\"modification-input-form\">\n\n <!-- Search Type Selection for Typeahead -->\n @if (templateId || columnId) {\n <div class=\"mb-3\">\n <small class=\"text-muted d-block mb-1\">Search Mode for Name of Term:</small>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'icontains' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('icontains')\">\n <i class=\"bi bi-search me-1\"></i>Contains\n </button>\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'istartswith' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('istartswith')\">\n <i class=\"bi bi-arrow-right me-1\"></i>Starts with\n </button>\n </div>\n </div>\n }\n\n <div class=\"row g-3\">\n\n <!-- Name of Term (NT) - Required with Typeahead -->\n <div class=\"col-md-6\">\n <label for=\"NT\" class=\"form-label\">\n Name of Term <span class=\"text-danger\">*</span>\n <small class=\"text-muted\">(NT)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"NT\"\n formControlName=\"NT\"\n placeholder=\"e.g., Oxidation, Acetyl, Phospho\"\n [ngbTypeahead]=\"searchModificationTerms\"\n [resultFormatter]=\"formatOntologySuggestion\"\n [inputFormatter]=\"formatOntologySuggestion\"\n (selectItem)=\"onOntologySuggestionSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\"\n [class.is-invalid]=\"modificationForm.get('NT')?.invalid && modificationForm.get('NT')?.touched\">\n <div class=\"form-text\">\n @if (templateId || columnId) {\n Typeahead search: {{ searchType() === 'icontains' ? 'Contains' : 'Starts with' }} mode\n } @else {\n Common modifications: Oxidation, Carbamidomethyl, Acetyl\n }\n </div>\n <div class=\"invalid-feedback\">\n Name of Term is required\n </div>\n </div>\n\n <!-- Unimod Specification Selection -->\n @if (showSpecifications() && availableSpecifications().length > 0) {\n <div class=\"col-md-12\">\n <div class=\"mb-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <label class=\"form-label mb-0\">\n Unimod Specifications\n <small class=\"text-muted\">(Select to auto-fill fields)</small>\n </label>\n \n @if (hiddenSpecificationCount() > 0) {\n <div class=\"form-check form-switch\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n id=\"showHiddenSpecs\"\n [checked]=\"showHiddenSpecifications()\"\n (change)=\"toggleHiddenSpecifications()\">\n <label class=\"form-check-label small text-muted\" for=\"showHiddenSpecs\">\n Show {{ hiddenSpecificationCount() }} hidden spec{{ hiddenSpecificationCount() === 1 ? '' : 's' }}\n </label>\n </div>\n }\n </div>\n \n <div class=\"border rounded p-2 bg-body-secondary\">\n <div class=\"mb-2\">\n <small class=\"text-info fw-semibold\">\n <i class=\"bi bi-info-circle me-1\"></i>\n {{ showHiddenSpecifications() ? 'All' : 'Visible' }} specifications for {{ selectedUnimodData()?.name }}\n @if (!showHiddenSpecifications() && hiddenSpecificationCount() > 0) {\n <span class=\"text-muted\">({{ hiddenSpecificationCount() }} hidden)</span>\n }\n </small>\n </div>\n <div class=\"row g-2\">\n @for (spec of availableSpecifications(); track spec.specNumber) {\n <div class=\"col-md-6\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"radio\"\n [id]=\"'spec_' + spec.specNumber\"\n [value]=\"spec.specNumber\"\n [checked]=\"selectedSpecification() === spec.specNumber\"\n (change)=\"onSpecificationSelected(spec.specNumber)\">\n <label\n class=\"form-check-label small\"\n [for]=\"'spec_' + spec.specNumber\">\n <div class=\"fw-semibold\">\n Spec {{ spec.specNumber }}\n @if (spec['hidden'] === '1') {\n <span class=\"badge bg-warning text-dark ms-1\" title=\"Hidden specification\">Hidden</span>\n }\n </div>\n <div class=\"text-muted\">{{ getSpecificationDisplay(spec) }}</div>\n </label>\n </div>\n </div>\n }\n </div>\n @if (selectedSpecification()) {\n <div class=\"mt-2 p-2 bg-body border rounded\">\n <small class=\"text-success\">\n <i class=\"bi bi-check-circle me-1\"></i>\n Fields auto-filled from specification {{ selectedSpecification() }}\n </small>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Target Amino Acid (TA) - Required -->\n <div class=\"col-md-6\">\n <label for=\"TA\" class=\"form-label\">\n Target Amino Acid <span class=\"text-danger\">*</span>\n <small class=\"text-muted\">(TA)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"TA\"\n formControlName=\"TA\"\n placeholder=\"e.g., M, S,T,Y, C\"\n (input)=\"onTargetAminoAcidChange($event)\"\n [class.is-invalid]=\"modificationForm.get('TA')?.invalid && modificationForm.get('TA')?.touched\">\n <div class=\"form-text\">Single letter amino acid codes, comma-separated</div>\n <div class=\"invalid-feedback\">\n Target amino acid is required\n </div>\n </div>\n\n <!-- Accession (AC) -->\n <div class=\"col-md-6\">\n <label for=\"AC\" class=\"form-label\">\n Accession <small class=\"text-muted\">(AC)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"AC\"\n formControlName=\"AC\"\n placeholder=\"e.g., UNIMOD:35, PSI-MOD:00719\">\n <div class=\"form-text\">UNIMOD or PSI-MOD accession</div>\n </div>\n\n <!-- Modification Type (MT) -->\n <div class=\"col-md-6\">\n <label for=\"MT\" class=\"form-label\">\n Modification Type <small class=\"text-muted\">(MT)</small>\n </label>\n <select class=\"form-select\" id=\"MT\" formControlName=\"MT\">\n <option value=\"\">Select type...</option>\n @for (type of modificationTypes; track type) {\n <option [value]=\"type\">{{ type }}</option>\n }\n </select>\n <div class=\"form-text\">Fixed, Variable, or Annotated</div>\n </div>\n\n <!-- Position (PP) -->\n <div class=\"col-md-6\">\n <label for=\"PP\" class=\"form-label\">\n Position <small class=\"text-muted\">(PP)</small>\n </label>\n <select class=\"form-select\" id=\"PP\" formControlName=\"PP\">\n <option value=\"\">Select position...</option>\n @for (position of positions; track position) {\n <option [value]=\"position\">{{ position }}</option>\n }\n </select>\n <div class=\"form-text\">Where the modification occurs</div>\n </div>\n\n <!-- Chemical Formula (CF) -->\n <div class=\"col-md-6\">\n <label for=\"CF\" class=\"form-label\">\n Chemical Formula <small class=\"text-muted\">(CF)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"CF\"\n formControlName=\"CF\"\n placeholder=\"e.g., H(2)C(2)O\">\n <div class=\"form-text\">Follow UNIMOD format: H(2)C(2)O</div>\n </div>\n\n <!-- Monoisotopic Mass (MM) -->\n <div class=\"col-md-6\">\n <label for=\"MM\" class=\"form-label\">\n Monoisotopic Mass <small class=\"text-muted\">(MM)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"MM\"\n formControlName=\"MM\"\n placeholder=\"e.g., 42.010565\"\n [class.is-invalid]=\"modificationForm.get('MM')?.invalid && modificationForm.get('MM')?.touched\">\n <div class=\"form-text\">Mass shift in Da (5+ decimal places)</div>\n <div class=\"invalid-feedback\">\n Please enter a valid mass (numbers and decimal point only)\n </div>\n </div>\n\n <!-- Target Site (TS) -->\n <div class=\"col-md-6\">\n <label for=\"TS\" class=\"form-label\">\n Target Site <small class=\"text-muted\">(TS)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"TS\"\n formControlName=\"TS\"\n placeholder=\"e.g., N[^P][ST]\">\n <div class=\"form-text\">Regular expression for complex site rules</div>\n </div>\n\n </div>\n\n <!-- Preview -->\n @if (modificationForm.valid && (modificationForm.get('NT')?.value || modificationForm.get('TA')?.value)) {\n <div class=\"mt-3 p-2 bg-body-secondary border rounded\">\n <small class=\"text-muted fw-semibold\">Preview:</small>\n <div class=\"font-monospace small\">{{ value || 'Building...' }}</div>\n </div>\n }\n\n <!-- Validation Summary -->\n @if (modificationForm.invalid && modificationForm.touched) {\n <div class=\"alert alert-warning mt-3\">\n <small>\n <i class=\"bi bi-exclamation-triangle me-1\"></i>\n <strong>Required fields:</strong> Name of Term (NT) and Target Amino Acid (TA) must be filled.\n </small>\n </div>\n }\n</form>\n","import { Component, Input, Output, EventEmitter, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { SdrfSyntaxService, SpikedCompound } from '../../services/sdrf-syntax';\n\n@Component({\n selector: 'ccv-sdrf-spiked-compound-input',\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: './sdrf-spiked-compound-input.html',\n styleUrl: './sdrf-spiked-compound-input.scss'\n})\nexport class SdrfSpikedCompoundInput implements OnInit {\n @Input() value: string = '';\n @Output() valueChange = new EventEmitter<string>();\n\n private fb = inject(FormBuilder);\n private sdrfSyntax = inject(SdrfSyntaxService);\n\n spikedForm!: FormGroup;\n \n // Predefined options\n compoundTypes = ['protein', 'peptide', 'mixture', 'other'];\n\n ngOnInit() {\n this.spikedForm = this.fb.group({\n CT: ['', Validators.required], // Compound type - MANDATORY\n QY: ['', Validators.required], // Quantity - MANDATORY\n SP: [''], // Species - Optional\n PS: [''], // Peptide sequence - For peptides\n AC: [''], // Uniprot Accession - For proteins\n CN: [''], // Compound name - Optional\n CV: [''], // Compound vendor - Optional\n CS: [''], // Compound specification URI - Optional\n CF: [''] // Compound formula - Optional\n });\n\n // Parse initial value\n if (this.value) {\n this.parseAndSetValue(this.value);\n }\n\n // Subscribe to form changes\n this.spikedForm.valueChanges.subscribe(() => {\n this.updateValue();\n });\n }\n\n private parseAndSetValue(value: string) {\n try {\n const parsed = this.sdrfSyntax.parseValue('spiked_compound', value) as SpikedCompound;\n this.spikedForm.patchValue(parsed);\n } catch (error) {\n console.warn('Could not parse spiked compound value:', value);\n }\n }\n\n // Helper method to ensure we get string values from form controls\n private getStringValue(value: any): string {\n if (typeof value === 'string') {\n return value.trim();\n }\n \n // Handle objects from typeahead selection (OntologySuggestion)\n if (value && typeof value === 'object') {\n // For ontology suggestions, use the value property\n if (value.value) return value.value;\n if (value.name) return value.name;\n }\n \n // Fallback to string conversion\n return value ? String(value).trim() : '';\n }\n\n private updateValue() {\n const formValue = this.spikedForm.value;\n \n // Only emit if we have both required fields\n if (formValue.CT && formValue.QY) {\n // Filter out empty values and convert to strings\n const cleanedValue: SpikedCompound = {};\n Object.keys(formValue).forEach(key => {\n const stringValue = this.getStringValue(formValue[key]);\n if (stringValue) {\n cleanedValue[key as keyof SpikedCompound] = stringValue;\n }\n });\n\n const formatted = this.sdrfSyntax.formatValue('spiked_compound', cleanedValue);\n this.valueChange.emit(formatted);\n } else if (!formValue.CT && !formValue.QY) {\n // If both required fields are empty, emit empty string\n this.valueChange.emit('');\n }\n }\n\n get showProteinFields(): boolean {\n return this.spikedForm.get('CT')?.value === 'protein';\n }\n\n get showPeptideFields(): boolean {\n return this.spikedForm.get('CT')?.value === 'peptide';\n }\n}\n","<form [formGroup]=\"spikedForm\" class=\"spiked-compound-input-form\">\n <div class=\"row g-3\">\n \n <!-- Compound Type (CT) - Required -->\n <div class=\"col-md-6\">\n <label for=\"CT\" class=\"form-label\">\n Compound Type <span class=\"text-danger\">*</span>\n <small class=\"text-muted\">(CT)</small>\n </label>\n <select class=\"form-select\" id=\"CT\" formControlName=\"CT\"\n [class.is-invalid]=\"spikedForm.get('CT')?.invalid && spikedForm.get('CT')?.touched\">\n <option value=\"\">Select compound type...</option>\n @for (type of compoundTypes; track type) {\n <option [value]=\"type\">{{ type }}</option>\n }\n </select>\n <div class=\"form-text\">Type of spiked compound</div>\n <div class=\"invalid-feedback\">\n Compound type is required\n </div>\n </div>\n\n <!-- Quantity (QY) - Required -->\n <div class=\"col-md-6\">\n <label for=\"QY\" class=\"form-label\">\n Quantity <span class=\"text-danger\">*</span>\n <small class=\"text-muted\">(QY)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"QY\"\n formControlName=\"QY\"\n placeholder=\"e.g., 10 fmol, 50 ng\"\n [class.is-invalid]=\"spikedForm.get('QY')?.invalid && spikedForm.get('QY')?.touched\">\n <div class=\"form-text\">Quantity with units (molar or mass)</div>\n <div class=\"invalid-feedback\">\n Quantity is required\n </div>\n </div>\n\n <!-- Species (SP) -->\n <div class=\"col-md-6\">\n <label for=\"SP\" class=\"form-label\">\n Species <small class=\"text-muted\">(SP)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"SP\"\n formControlName=\"SP\"\n placeholder=\"e.g., homo sapiens\">\n <div class=\"form-text\">Species of origin</div>\n </div>\n\n <!-- Compound Name (CN) -->\n <div class=\"col-md-6\">\n <label for=\"CN\" class=\"form-label\">\n Compound Name <small class=\"text-muted\">(CN)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"CN\"\n formControlName=\"CN\"\n placeholder=\"e.g., Myoglobin\">\n <div class=\"form-text\">Name of the compound</div>\n </div>\n\n <!-- Protein-specific fields -->\n @if (showProteinFields) {\n <div class=\"col-md-12\">\n <label for=\"AC\" class=\"form-label\">\n Uniprot Accession <small class=\"text-muted\">(AC)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"AC\"\n formControlName=\"AC\"\n placeholder=\"e.g., P68871\">\n <div class=\"form-text\">Uniprot accession for protein compounds</div>\n </div>\n }\n\n <!-- Peptide-specific fields -->\n @if (showPeptideFields) {\n <div class=\"col-md-12\">\n <label for=\"PS\" class=\"form-label\">\n Peptide Sequence <small class=\"text-muted\">(PS)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"PS\"\n formControlName=\"PS\"\n placeholder=\"e.g., PEPTIDESEQ\">\n <div class=\"form-text\">Peptide sequence for peptide compounds</div>\n </div>\n }\n\n <!-- Compound Vendor (CV) -->\n <div class=\"col-md-6\">\n <label for=\"CV\" class=\"form-label\">\n Compound Vendor <small class=\"text-muted\">(CV)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"CV\"\n formControlName=\"CV\"\n placeholder=\"e.g., Sigma-Aldrich\">\n <div class=\"form-text\">Vendor or supplier name</div>\n </div>\n\n <!-- Compound Formula (CF) -->\n <div class=\"col-md-6\">\n <label for=\"CF\" class=\"form-label\">\n Compound Formula <small class=\"text-muted\">(CF)</small>\n </label>\n <input \n type=\"text\" \n class=\"form-control\" \n id=\"CF\"\n formControlName=\"CF\"\n placeholder=\"e.g., C8H14N4O2\">\n <div class=\"form-text\">Chemical formula</div>\n </div>\n\n <!-- Compound Specification URI (CS) -->\n <div class=\"col-md-12\">\n <label for=\"CS\" class=\"form-label\">\n Compound Specification URI <small class=\"text-muted\">(CS)</small>\n </label>\n <input \n type=\"url\" \n class=\"form-control\" \n id=\"CS\"\n formControlName=\"CS\"\n placeholder=\"https://example.com/compound-spec\">\n <div class=\"form-text\">URI to compound specification or documentation</div>\n </div>\n\n </div>\n\n <!-- Preview -->\n @if (spikedForm.valid && (spikedForm.get('CT')?.value && spikedForm.get('QY')?.value)) {\n <div class=\"mt-3 p-2 bg-body-secondary border rounded\">\n <small class=\"text-muted fw-semibold\">Preview:</small>\n <div class=\"font-monospace small\">{{ value || 'Building...' }}</div>\n </div>\n }\n\n <!-- Validation Summary -->\n @if (spikedForm.invalid && spikedForm.touched) {\n <div class=\"alert alert-warning mt-3\">\n <small>\n <i class=\"bi bi-exclamation-triangle me-1\"></i>\n <strong>Required fields:</strong> Compound Type (CT) and Quantity (QY) must be filled.\n </small>\n </div>\n }\n</form>\n","import { Component, Input, Output, EventEmitter, OnInit, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbTypeahead, NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { Observable, OperatorFunction, debounceTime, distinctUntilChanged, filter, map, switchMap, of, catchError } from 'rxjs';\nimport { SdrfSyntaxService, CleavageAgentDetails } from '../../services/sdrf-syntax';\nimport { OntologySuggestion } from '../../models';\nimport { MetadataColumnService, MetadataColumnTemplateService } from '../../services';\n\n@Component({\n selector: 'ccv-sdrf-cleavage-input',\n imports: [CommonModule, ReactiveFormsModule, NgbTypeahead, NgbModule],\n templateUrl: './sdrf-cleavage-input.html',\n styleUrl: './sdrf-cleavage-input.scss'\n})\nexport class SdrfCleavageInput implements OnInit {\n @Input() value: string = '';\n @Input() templateId: number | null = null; // Template ID for ontology suggestions\n @Input() columnId: number | null = null; // Column ID for ontology suggestions (actual metadata column)\n @Output() valueChange = new EventEmitter<string>();\n\n // Search type for typeahead - internal signal\n searchType = signal<'icontains' | 'istartswith'>('icontains');\n\n private fb = inject(FormBuilder);\n private sdrfSyntax = inject(SdrfSyntaxService);\n private metadataColumnService = inject(MetadataColumnService);\n private metadataColumnTemplateService = inject(MetadataColumnTemplateService);\n\n cleavageForm!: FormGroup;\n\n ngOnInit() {\n this.cleavageForm = this.fb.group({\n NT: ['', Validators.required], // Name of Term - will use ontology typeahead from parent\n AC: [''], // Accession\n CS: [''] // Cleavage Site pattern\n });\n\n // Parse initial value\n if (this.value) {\n this.parseAndSetValue(this.value);\n }\n\n // Subscribe to form changes\n this.cleavageForm.valueChanges.subscribe(() => {\n this.updateValue();\n });\n }\n\n private parseAndSetValue(value: string) {\n try {\n const parsed = this.sdrfSyntax.parseValue('cleavage', value) as CleavageAgentDetails;\n this.cleavageForm.patchValue(parsed);\n } catch (error) {\n console.warn('Could not parse cleavage agent value:', value);\n }\n }\n\n // Helper method to ensure we get string values from form controls\n private getStringValue(value: any): string {\n if (typeof value === 'string') {\n return value.trim();\n }\n \n // Handle objects from typeahead selection (OntologySuggestion)\n if (value && typeof value === 'object') {\n // For cleavage agents: display_name for NT, value for AC\n if (value.displayName) return value.displayName;\n if (value.value) return value.value;\n if (value.name) return value.name;\n }\n \n // Fallback to string conversion\n return value ? String(value).trim() : '';\n }\n\n private updateValue() {\n const formValue = this.cleavageForm.value;\n\n // Only emit if we have required field\n if (formValue.NT) {\n // Filter out empty values and convert to strings\n const cleanedValue: CleavageAgentDetails = {};\n Object.keys(formValue).forEach(key => {\n const stringValue = this.getStringValue(formValue[key]);\n if (stringValue) {\n cleanedValue[key as keyof CleavageAgentDetails] = stringValue;\n }\n });\n\n const formatted = this.sdrfSyntax.formatValue('cleavage', cleanedValue);\n this.valueChange.emit(formatted);\n } else if (!formValue.NT) {\n // If required field is empty, emit empty string\n this.valueChange.emit('');\n }\n }\n\n // Typeahead for NT field (Name of Term) - using ontology suggestions from API\n searchCleavageTerms: OperatorFunction<string, readonly OntologySuggestion[]> = (text$: Observable<string>) =>\n text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n filter(term => term.length >= 2),\n switchMap(term => {\n // Use column ID first if available (for actual metadata columns), otherwise template ID (for templates/favorites)\n if (this.columnId) {\n return this.metadataColumnService.getOntologySuggestions({\n columnId: this.columnId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n map(response => response.suggestions || []),\n catchError(error => {\n console.warn(`Failed to get ontology suggestions for column ${this.columnId}:`, error);\n return of([]);\n })\n );\n } else if (this.templateId) {\n return this.metadataColumnTemplateService.getOntologySuggestions({\n templateId: this.templateId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n map(response => response.suggestions || []),\n catchError(error => {\n console.warn(`Failed to get ontology suggestions for template ${this.templateId}:`, error);\n return of([]);\n })\n );\n } else {\n // No ID available, return empty suggestions\n return of([]);\n }\n })\n );\n\n // Formatter for ontology suggestions\n formatOntologySuggestion = (suggestion: OntologySuggestion): string => {\n return suggestion.displayName || suggestion.value;\n };\n\n // Handle ontology suggestion selection\n onOntologySuggestionSelected = (event: any): void => {\n const suggestion: OntologySuggestion = event.item;\n if (suggestion) {\n // Set the NT field value\n this.cleavageForm.patchValue({ NT: suggestion.value });\n\n // Auto-fill AC field if available (use the ID as accession)\n if (suggestion.id) {\n this.cleavageForm.patchValue({ AC: suggestion.id });\n }\n }\n };\n\n // Handle search type change\n onSearchTypeChange(type: 'icontains' | 'istartswith'): void {\n this.searchType.set(type);\n }\n}\n","<form [formGroup]=\"cleavageForm\" class=\"cleavage-input-form\">\n\n <!-- Search Type Selection for Typeahead -->\n @if (templateId || columnId) {\n <div class=\"mb-3\">\n <small class=\"text-muted d-block mb-1\">Search Mode for Name of Term:</small>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'icontains' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('icontains')\">\n <i class=\"bi bi-search me-1\"></i>Contains\n </button>\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'istartswith' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('istartswith')\">\n <i class=\"bi bi-arrow-right me-1\"></i>Starts with\n </button>\n </div>\n </div>\n }\n\n <div class=\"row g-3\">\n\n <!-- Name of Term (NT) - Required -->\n <div class=\"col-md-6\">\n <label for=\"NT\" class=\"form-label\">\n Name of Term <span class=\"text-danger\">*</span>\n <small class=\"text-muted\">(NT)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"NT\"\n formControlName=\"NT\"\n placeholder=\"e.g., Trypsin, Chymotrypsin\"\n [ngbTypeahead]=\"searchCleavageTerms\"\n [resultFormatter]=\"formatOntologySuggestion\"\n [inputFormatter]=\"formatOntologySuggestion\"\n (selectItem)=\"onOntologySuggestionSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\"\n [class.is-invalid]=\"cleavageForm.get('NT')?.invalid && cleavageForm.get('NT')?.touched\">\n <div class=\"form-text\">\n @if (templateId || columnId) {\n Typeahead search: {{ searchType() === 'icontains' ? 'Contains' : 'Starts with' }} mode\n } @else {\n Cleavage agent name (uses ontology typeahead when available)\n }\n </div>\n <div class=\"invalid-feedback\">\n Name of Term is required\n </div>\n </div>\n\n <!-- Accession (AC) -->\n <div class=\"col-md-6\">\n <label for=\"AC\" class=\"form-label\">\n Accession <small class=\"text-muted\">(AC)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"AC\"\n formControlName=\"AC\"\n placeholder=\"e.g., PSI-MS:1001251\">\n <div class=\"form-text\">PSI-MS or other ontology accession</div>\n </div>\n\n <!-- Cleavage Site (CS) -->\n <div class=\"col-md-12\">\n <label for=\"CS\" class=\"form-label\">\n Cleavage Site <small class=\"text-muted\">(CS)</small>\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"CS\"\n formControlName=\"CS\"\n placeholder=\"e.g., (?<=[KR])(?![P])\">\n <div class=\"form-text\">Regular expression pattern for cleavage site specificity</div>\n </div>\n\n </div>\n\n <!-- Preview -->\n @if (cleavageForm.valid && cleavageForm.get('NT')?.value) {\n <div class=\"mt-3 p-2 bg-body-secondary border rounded\">\n <small class=\"text-muted fw-semibold\">Preview:</small>\n <div class=\"font-monospace small\">{{ value || 'Building...' }}</div>\n </div>\n }\n\n <!-- Validation Summary -->\n @if (cleavageForm.invalid && cleavageForm.touched) {\n <div class=\"alert alert-warning mt-3\">\n <small>\n <i class=\"bi bi-exclamation-triangle me-1\"></i>\n <strong>Required field:</strong> Name of Term (NT) must be filled.\n </small>\n </div>\n }\n</form>\n","import { Component, Input, Output, EventEmitter, OnInit, signal, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbActiveModal, NgbModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap';\nimport { Observable, of, catchError, debounceTime, distinctUntilChanged, tap, switchMap, map } from 'rxjs';\nimport { MetadataColumn, OntologySuggestion, FavouriteMetadataOption, FavouriteMetadataOptionCreateRequest, OntologyType } from '../../models';\nimport { FavouriteMetadataOptionService, MetadataColumnService, MetadataColumnTemplateService } from '../../services';\nimport { AuthService, User, LabGroupService } from '@noatgnu/cupcake-core';\nimport { SdrfSyntaxService, SyntaxType } from '../../services/sdrf-syntax';\nimport { SdrfAgeInput, SdrfModificationInput, SdrfCleavageInput, SdrfSpikedCompoundInput } from '../';\n\n\nexport interface MetadataValueEditConfig {\n columnId?: number;\n columnName: string;\n columnType: string;\n ontologyType?: string;\n enableTypeahead?: boolean;\n currentValue?: string;\n context: 'template' | 'table' | 'pool' | 'favorite_management';\n templateId?: number;\n tableId?: number;\n poolId?: number;\n customOntologyFilters?: Record<string, any>;\n enableMultiSampleEdit?: boolean;\n sampleData?: { index: number; value: string; sourceName?: string }[];\n maxSampleCount?: number;\n}\n\n@Component({\n selector: 'ccv-metadata-value-edit-modal',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n NgbModule,\n NgbNavModule,\n SdrfAgeInput,\n SdrfModificationInput,\n SdrfCleavageInput,\n SdrfSpikedCompoundInput\n ],\n templateUrl: './metadata-value-edit-modal.html',\n styleUrl: './metadata-value-edit-modal.scss'\n})\nexport class MetadataValueEditModal implements OnInit {\n @Input() config!: MetadataValueEditConfig;\n @Output() valueSaved = new EventEmitter<string | { value: string; sampleIndices: number[] }>();\n\n editForm: FormGroup;\n isLoading = signal(false);\n isLoadingSuggestions = signal(false);\n searchType = signal<'icontains' | 'istartswith'>('icontains');\n\n isLoadingFavorites = signal(false);\n userFavorites = signal<FavouriteMetadataOption[]>([]);\n labGroupFavorites = signal<FavouriteMetadataOption[]>([]);\n globalFavorites = signal<FavouriteMetadataOption[]>([]);\n selectedFavorite = signal<FavouriteMetadataOption | null>(null);\n\n currentUser = signal<User | null>(null);\n userLabGroups = signal<number[]>([]);\n\n activeFavoritesTab: 'user' | 'lab_group' | 'global' = 'user';\n\n private sdrfSyntaxService = inject(SdrfSyntaxService);\n specialSyntaxType = signal<SyntaxType | null>(null);\n showSpecialInput = signal(false);\n specialInputValue = signal('');\n\n selectedSampleIndices = signal<Set<number>>(new Set());\n showSamplePanel = signal(false);\n\n constructor(\n private fb: FormBuilder,\n private activeModal: NgbActiveModal,\n private authService: AuthService,\n private favouriteMetadataOptionService: FavouriteMetadataOptionService,\n private metadataColumnService: MetadataColumnService,\n private metadataColumnTemplateService: MetadataColumnTemplateService,\n private labGroupService: LabGroupService\n ) {\n this.editForm = this.fb.group({\n value: ['', [Validators.maxLength(500)]]\n });\n }\n\n ngOnInit() {\n\n const syntaxType = this.sdrfSyntaxService.detectSpecialSyntax(\n this.config.columnName,\n this.config.columnType\n );\n\n if (syntaxType) {\n this.specialSyntaxType.set(syntaxType);\n this.showSpecialInput.set(true);\n this.specialInputValue.set(this.config?.currentValue || '');\n }\n\n if (this.config?.currentValue) {\n this.editForm.patchValue({\n value: this.config.currentValue\n });\n }\n\n this.currentUser.set(this.authService.getCurrentUser());\n\n if (this.currentUser()) {\n this.loadUserLabGroups();\n }\n\n this.loadFavoriteOptions();\n\n\n if (this.config?.enableMultiSampleEdit && this.config?.sampleData) {\n this.showSamplePanel.set(true);\n console.log('Multi-sample editing enabled with', this.config.sampleData.length, 'samples');\n } else {\n console.log('Multi-sample editing not enabled:', {\n enableMultiSampleEdit: this.config?.enableMultiSampleEdit,\n hasSampleData: !!this.config?.sampleData,\n sampleDataLength: this.config?.sampleData?.length\n });\n }\n\n this.editForm.get('value')?.valueChanges.subscribe((newValue) => {\n const selected = this.selectedFavorite();\n if (selected && selected.value !== newValue) {\n this.selectedFavorite.set(null);\n }\n });\n }\n\n\n onCancel() {\n this.activeModal.dismiss();\n }\n\n onClose() {\n this.isLoading.set(false);\n this.activeModal.close();\n }\n\n get title(): string {\n return `Edit ${this.config?.columnName || 'Metadata Value'}`;\n }\n\n get hasOntologyType(): boolean {\n return !!(this.config?.ontologyType && this.config.ontologyType.length > 0 && this.config.enableTypeahead);\n }\n\n get ontologyTypeLabel(): string {\n return this.config?.ontologyType || '';\n }\n\n get isFromFavoriteManagement(): boolean {\n return this.config?.context === 'favorite_management';\n }\n\n // Ontology autocomplete methods\n searchOntology = (text$: Observable<string>): Observable<OntologySuggestion[]> => {\n return text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n tap(() => this.isLoadingSuggestions.set(true)),\n switchMap(term => {\n if (term.length < 2 || !this.hasOntologyType) {\n this.isLoadingSuggestions.set(false);\n return of([]);\n }\n\n if (this.config.context === 'table' && this.config.columnId) {\n return this.metadataColumnService.getOntologySuggestions({\n columnId: this.config.columnId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n switchMap(response => of(response.suggestions || [])),\n catchError(() => of([])),\n tap(() => this.isLoadingSuggestions.set(false))\n );\n } else if ((this.config.context === 'template' || this.config.context === 'favorite_management') && this.config.templateId) {\n return this.metadataColumnTemplateService.getOntologySuggestions({\n templateId: this.config.templateId,\n search: term,\n limit: 10,\n searchType: this.searchType()\n }).pipe(\n map(response => response.suggestions || []),\n catchError(error => {\n console.error('Error getting ontology suggestions:', error);\n return of([]);\n }),\n tap(() => this.isLoadingSuggestions.set(false))\n );\n } else {\n this.isLoadingSuggestions.set(false);\n return of([]);\n }\n })\n );\n };\n\n formatSuggestion = (suggestion: OntologySuggestion): string => {\n return suggestion.displayName || suggestion.value;\n };\n\n inputFormatter = (suggestion: OntologySuggestion): string => {\n if (suggestion && suggestion.ontologyType === OntologyType.MS_UNIQUE_VOCABULARIES && suggestion.fullData && suggestion.fullData.name) {\n if (suggestion.fullData.accession) {\n return `NT=${suggestion.fullData.name};AC=${suggestion.fullData.accession}`;\n } else {\n return suggestion.fullData.name;\n }\n }\n\n // For other ontology types, use regular value\n return suggestion.displayName || suggestion.value || String(suggestion);\n };\n\n onSuggestionSelected = (event: any): void => {\n if (event.item) {\n const suggestion = event.item;\n let displayValue: string;\n\n // Extract the proper display value based on suggestion type\n if (suggestion.fullData && suggestion.fullData.name) {\n // For ontology suggestions with fullData, format according to SDRF syntax\n if (suggestion.fullData.accession) {\n // Use SDRF syntax: NT={name};AC={accession}\n displayValue = `NT=${suggestion.fullData.name};AC=${suggestion.fullData.accession}`;\n } else {\n // Only name available, use just the name\n displayValue = suggestion.fullData.name;\n }\n } else if (suggestion.displayName) {\n // For standard ontology suggestions, use displayName\n displayValue = suggestion.displayName;\n } else if (suggestion.value) {\n // Fallback to basic value\n displayValue = suggestion.value;\n } else {\n // Last resort\n displayValue = String(suggestion);\n }\n\n this.editForm.get('value')?.setValue(displayValue);\n this.editForm.get('value')?.markAsTouched();\n }\n };\n\n onSearchTypeChange(type: 'icontains' | 'istartswith'): void {\n this.searchType.set(type);\n }\n\n clearValue(): void {\n this.editForm.get('value')?.setValue('');\n this.editForm.get('value')?.markAsTouched();\n this.selectedFavorite.set(null); // Clear selected favorite when manually clearing\n }\n\n // Favorite options methods\n loadFavoriteOptions(): void {\n if (!this.config?.columnName || !this.config?.columnType) return;\n\n this.isLoadingFavorites.set(true);\n\n // Build base query parameters for column name\n const baseQueryParams = {\n name: this.config.columnName,\n limit: 10\n };\n\n // Load user favorites\n const currentUser = this.currentUser();\n if (currentUser?.id) {\n this.favouriteMetadataOptionService.getFavouriteMetadataOptions({\n ...baseQueryParams,\n userId: currentUser.id\n }).subscribe({\n next: (response) => {\n this.userFavorites.set(response.results);\n },\n error: () => this.userFavorites.set([])\n });\n }\n\n // Load lab group favorites - load for first lab group if user has any\n const userLabGroups = this.userLabGroups();\n if (userLabGroups.length > 0) {\n this.favouriteMetadataOptionService.getFavouriteMetadataOptions({\n ...baseQueryParams,\n labGroupId: userLabGroups[0] // Use first lab group for now\n }).subscribe({\n next: (response) => {\n this.labGroupFavorites.set(response.results);\n },\n error: () => this.labGroupFavorites.set([])\n });\n } else {\n this.labGroupFavorites.set([]);\n }\n\n // Load global favorites\n this.favouriteMetadataOptionService.getFavouriteMetadataOptions({\n ...baseQueryParams,\n isGlobal: true\n }).subscribe({\n next: (response) => {\n this.globalFavorites.set(response.results);\n this.isLoadingFavorites.set(false);\n // Set initial active tab based on available favorites\n this.setInitialActiveFavoritesTab();\n },\n error: () => {\n this.globalFavorites.set([]);\n this.isLoadingFavorites.set(false);\n // Set initial active tab based on available favorites\n this.setInitialActiveFavoritesTab();\n }\n });\n }\n\n selectFavorite(favorite: FavouriteMetadataOption): void {\n const favoriteValue = favorite.value || '';\n\n // Set the form value\n this.editForm.get('value')?.setValue(favoriteValue);\n this.editForm.get('value')?.markAsTouched();\n this.selectedFavorite.set(favorite);\n\n if (this.showSpecialInput() && this.specialSyntaxType()) {\n this.specialInputValue.set(favoriteValue);\n }\n\n if (favorite.columnTemplate && favorite.columnTemplate !== this.config.templateId) {\n this.config.templateId = favorite.columnTemplate;\n }\n\n if (this.hasCustomDisplayValue(favorite)) {\n console.log(`Selected \"${favorite.displayValue}\" (value: ${favorite.value})`);\n }\n }\n\n onFavoriteSelected(event: Event, favoritesList: FavouriteMetadataOption[]): void {\n const selectElement = event.target as HTMLSelectElement;\n const favoriteId = selectElement.value;\n\n if (!favoriteId) {\n return; // No selection made\n }\n\n const selectedFavorite = favoritesList.find(fav => fav.id?.toString() === favoriteId);\n if (selectedFavorite) {\n this.selectFavorite(selectedFavorite);\n }\n }\n\n setActiveFavoritesTab(tab: 'user' | 'lab_group' | 'global'): void {\n this.activeFavoritesTab = tab;\n }\n\n setInitialActiveFavoritesTab(): void {\n // Set the first available tab as active\n if (this.userFavorites().length > 0) {\n this.activeFavoritesTab = 'user';\n } else if (this.labGroupFavorites().length > 0) {\n this.activeFavoritesTab = 'lab_group';\n } else if (this.globalFavorites().length > 0) {\n this.activeFavoritesTab = 'global';\n }\n }\n\n addToFavorites(scope: 'user' | 'lab_group' | 'global' = 'user'): void {\n const value = this.editForm.get('value')?.value;\n if (!value || !this.config?.columnName || !this.config?.columnType) return;\n\n const newFavorite: FavouriteMetadataOptionCreateRequest = {\n name: this.config.columnName,\n type: this.config.columnType,\n columnTemplate: this.config.templateId || undefined,\n value: value,\n displayValue: value,\n isGlobal: scope === 'global',\n user: scope === 'user' ? this.currentUser()?.id : undefined,\n labGroup: scope === 'lab_group' ? this.userLabGroups()[0] || undefined : undefined\n };\n\n this.favouriteMetadataOptionService.createFavouriteMetadataOption(newFavorite).subscribe({\n next: (created) => {\n // Add to appropriate list\n if (scope === 'user') {\n this.userFavorites.set([...this.userFavorites(), created]);\n } else if (scope === 'lab_group') {\n this.labGroupFavorites.set([...this.labGroupFavorites(), created]);\n } else {\n this.globalFavorites.set([...this.globalFavorites(), created]);\n }\n },\n error: (error) => {\n console.error('Error adding to favorites:', error);\n }\n });\n }\n\n get hasFavorites(): boolean {\n return this.userFavorites().length > 0 ||\n this.labGroupFavorites().length > 0 ||\n this.globalFavorites().length > 0;\n }\n\n getFavoriteDisplayValue(favorite: FavouriteMetadataOption): string {\n return favorite.displayValue || favorite.value || '';\n }\n\n getFavoriteTooltip(favorite: FavouriteMetadataOption): string {\n const displayValue = favorite.displayValue || favorite.value || '';\n const actualValue = favorite.value || '';\n\n if (favorite.displayValue && favorite.displayValue !== actualValue) {\n return `${displayValue}\\n\\nActual value: ${actualValue}`;\n }\n\n return displayValue;\n }\n\n hasCustomDisplayValue(favorite: FavouriteMetadataOption): boolean {\n return !!(favorite.displayValue &&\n favorite.displayValue !== favorite.value &&\n favorite.displayValue.trim() !== '');\n }\n\n getSelectedFavoriteInfo(): string {\n const selected = this.selectedFavorite();\n const currentValue = this.editForm.get('value')?.value;\n\n if (!selected || !currentValue || selected.value !== currentValue) {\n return '';\n }\n\n if (this.hasCustomDisplayValue(selected)) {\n return `Selected from favorite: \"${selected.displayValue}\"`;\n }\n\n return '';\n }\n\n loadUserLabGroups(): void {\n // Load user's lab groups\n this.labGroupService.getMyLabGroups({ limit: 10 }).subscribe({\n next: (response) => {\n const labGroupIds = response.results.map(group => group.id!);\n this.userLabGroups.set(labGroupIds);\n },\n error: (error) => {\n console.error('Error loading user lab groups:', error);\n this.userLabGroups.set([]);\n }\n });\n }\n\n // SDRF Special Syntax Methods\n onSpecialInputChange(value: string): void {\n this.specialInputValue.set(value);\n this.editForm.patchValue({ value });\n }\n\n toggleSpecialInput(): void {\n this.showSpecialInput.set(!this.showSpecialInput());\n\n if (!this.showSpecialInput()) {\n // Switching to normal input, sync the current value\n this.editForm.patchValue({ value: this.specialInputValue() });\n }\n }\n\n getSpecialInputTitle(): string {\n const syntaxType = this.specialSyntaxType();\n switch (syntaxType) {\n case 'age': return 'Age Format Editor';\n case 'modification': return 'Modification Parameters Editor';\n case 'cleavage': return 'Cleavage Agent Editor';\n case 'spiked_compound': return 'Spiked Compound Editor';\n default: return 'Special Format Editor';\n }\n }\n\n // Multi-sample editing methods\n get hasMultiSampleEdit(): boolean {\n return !!(this.config?.enableMultiSampleEdit && this.config?.sampleData && this.config.sampleData.length > 0);\n }\n\n get sampleData(): { index: number; value: string; sourceName?: string }[] {\n return this.config?.sampleData || [];\n }\n\n toggleSampleSelection(sampleIndex: number): void {\n const current = new Set(this.selectedSampleIndices());\n if (current.has(sampleIndex)) {\n current.delete(sampleIndex);\n } else {\n current.add(sampleIndex);\n }\n this.selectedSampleIndices.set(current);\n }\n\n selectAllSamples(): void {\n const allIndices = new Set(this.sampleData.map(s => s.index));\n this.selectedSampleIndices.set(allIndices);\n }\n\n clearSampleSelection(): void {\n this.selectedSampleIndices.set(new Set());\n }\n\n get selectedSampleCount(): number {\n return this.selectedSampleIndices().size;\n }\n\n get totalSampleCount(): number {\n return this.sampleData.length;\n }\n\n isSampleSelected(sampleIndex: number): boolean {\n return this.selectedSampleIndices().has(sampleIndex);\n }\n\n // Override the onSubmit method to handle multi-sample editing\n onSubmit(): void {\n if (this.editForm.valid) {\n this.isLoading.set(true);\n const rawValue = this.editForm.get('value')?.value || '';\n\n // If the form contains an object (ontology suggestion), format it properly\n let value: string;\n if (typeof rawValue === 'object' && rawValue !== null) {\n // For MS Unique Vocabularies, use SDRF formatting\n if (rawValue.ontologyType === OntologyType.MS_UNIQUE_VOCABULARIES && rawValue.fullData && rawValue.fullData.name) {\n if (rawValue.fullData.accession) {\n value = `NT=${rawValue.fullData.name};AC=${rawValue.fullData.accession}`;\n } else {\n value = rawValue.fullData.name;\n }\n } else {\n // For other ontology types, use the regular value\n value = rawValue.displayName || rawValue.value || String(rawValue);\n }\n } else {\n value = String(rawValue);\n }\n\n\n // If multi-sample editing is enabled and samples are selected, include the sample indices\n if (this.hasMultiSampleEdit && this.selectedSampleCount > 0) {\n const selectedIndices = Array.from(this.selectedSampleIndices());\n this.valueSaved.emit({ value, sampleIndices: selectedIndices });\n } else {\n this.valueSaved.emit(value);\n }\n }\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-pencil-square me-2\"></i>{{ title }}\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"onCancel()\"></button>\n</div>\n\n<div class=\"modal-body\">\n <div class=\"row\">\n <!-- Main Content -->\n <div [class]=\"hasMultiSampleEdit ? 'col-md-8' : 'col-12'\">\n <form [formGroup]=\"editForm\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Column Information -->\n <div class=\"mb-3\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Column Name:</small>\n <div class=\"fw-semibold\">{{ config.columnName }}</div>\n </div>\n <div class=\"col-md-6\">\n <small class=\"text-muted\">Column Type:</small>\n <div><span class=\"badge bg-light text-dark\">{{ config.columnType }}</span></div>\n </div>\n </div>\n @if (hasOntologyType) {\n <div class=\"mt-2\">\n <small class=\"text-muted\">Ontology Type:</small>\n <div><span class=\"badge bg-info\">{{ ontologyTypeLabel }}</span></div>\n </div>\n }\n </div>\n\n <hr class=\"mb-4\">\n\n <!-- Favorite Options Section -->\n @if (hasFavorites && !isLoadingFavorites()) {\n <div class=\"mb-4\">\n <h6 class=\"text-muted mb-3\">\n <i class=\"bi bi-heart-fill me-2 text-danger\"></i>Recommended Values\n </h6>\n\n <!-- Favorites Navigation Tabs -->\n <ul ngbNav #favoritesNav=\"ngbNav\" [(activeId)]=\"activeFavoritesTab\" class=\"nav-tabs\">\n @if (userFavorites().length > 0) {\n <li [ngbNavItem]=\"'user'\">\n <button ngbNavLink>\n <i class=\"bi bi-person-fill me-1\"></i>Your Favorites\n <span class=\"badge bg-primary ms-1\">{{ userFavorites().length }}</span>\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-3\">\n <select \n class=\"form-select\" \n size=\"5\" \n (change)=\"onFavoriteSelected($event, userFavorites())\">\n <option value=\"\">Select a favorite value...</option>\n @for (favorite of userFavorites(); track favorite.id) {\n <option [value]=\"favorite.id\">\n {{ getFavoriteDisplayValue(favorite) }}\n @if (hasCustomDisplayValue(favorite)) { (Custom Display) }\n </option>\n }\n </select>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>Your personal favorite values for this column\n </div>\n </div>\n </ng-template>\n </li>\n }\n\n @if (labGroupFavorites().length > 0) {\n <li [ngbNavItem]=\"'lab_group'\">\n <button ngbNavLink>\n <i class=\"bi bi-people-fill me-1\"></i>Lab Group\n <span class=\"badge bg-info ms-1\">{{ labGroupFavorites().length }}</span>\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-3\">\n <select \n class=\"form-select\" \n size=\"5\" \n (change)=\"onFavoriteSelected($event, labGroupFavorites())\">\n <option value=\"\">Select a favorite value...</option>\n @for (favorite of labGroupFavorites(); track favorite.id) {\n <option [value]=\"favorite.id\">\n {{ getFavoriteDisplayValue(favorite) }}\n @if (hasCustomDisplayValue(favorite)) { (Custom Display) }\n </option>\n }\n </select>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>Favorite values shared by your lab group\n </div>\n </div>\n </ng-template>\n </li>\n }\n\n @if (globalFavorites().length > 0) {\n <li [ngbNavItem]=\"'global'\">\n <button ngbNavLink>\n <i class=\"bi bi-globe me-1\"></i>Global\n <span class=\"badge bg-success ms-1\">{{ globalFavorites().length }}</span>\n </button>\n <ng-template ngbNavContent>\n <div class=\"mt-3\">\n <select \n class=\"form-select\" \n size=\"5\" \n (change)=\"onFavoriteSelected($event, globalFavorites())\">\n <option value=\"\">Select a favorite value...</option>\n @for (favorite of globalFavorites(); track favorite.id) {\n <option [value]=\"favorite.id\">\n {{ getFavoriteDisplayValue(favorite) }}\n @if (hasCustomDisplayValue(favorite)) { (Custom Display) }\n </option>\n }\n </select>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>Globally recommended values for this column\n </div>\n </div>\n </ng-template>\n </li>\n }\n </ul>\n\n <div [ngbNavOutlet]=\"favoritesNav\" class=\"mt-3\"></div>\n\n <hr class=\"my-3\">\n </div>\n }\n\n @if (isLoadingFavorites()) {\n <div class=\"text-center mb-4\">\n <div class=\"spinner-border spinner-border-sm text-primary me-2\"></div>\n <small class=\"text-muted\">Loading favorite options...</small>\n </div>\n <hr class=\"my-3\">\n }\n\n <!-- Value Input Section -->\n <div class=\"mb-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <label for=\"metadataValue\" class=\"form-label mb-0\">\n Metadata Value\n @if (hasOntologyType) {\n <span class=\"badge bg-success ms-2\">\n <i class=\"bi bi-search me-1\"></i>Autocomplete Available\n </span>\n }\n @if (specialSyntaxType()) {\n <span class=\"badge bg-info ms-2\">\n <i class=\"bi bi-gear me-1\"></i>{{ getSpecialInputTitle() }}\n </span>\n }\n </label>\n\n @if (specialSyntaxType()) {\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"specialInputToggle\"\n [checked]=\"showSpecialInput()\"\n (change)=\"toggleSpecialInput()\">\n <label class=\"form-check-label small text-muted\" for=\"specialInputToggle\">\n Enhanced Editor\n </label>\n </div>\n }\n </div>\n\n <!-- Special SDRF Syntax Input Components -->\n @if (showSpecialInput() && specialSyntaxType()) {\n <div class=\"border rounded p-3 mb-3 bg-body-secondary\">\n <div class=\"mb-2\">\n <small class=\"text-muted fw-semibold\">\n <i class=\"bi bi-gear me-1\"></i>{{ getSpecialInputTitle() }}\n </small>\n </div>\n\n @switch (specialSyntaxType()) {\n @case ('age') {\n <ccv-sdrf-age-input\n [value]=\"specialInputValue()\"\n (valueChange)=\"onSpecialInputChange($event)\">\n </ccv-sdrf-age-input>\n }\n @case ('modification') {\n <ccv-sdrf-modification-input\n [value]=\"specialInputValue()\"\n [columnId]=\"config.columnId ?? null\"\n [templateId]=\"config.templateId ?? null\"\n (valueChange)=\"onSpecialInputChange($event)\">\n </ccv-sdrf-modification-input>\n }\n @case ('cleavage') {\n <ccv-sdrf-cleavage-input\n [value]=\"specialInputValue()\"\n [columnId]=\"config.columnId ?? null\"\n [templateId]=\"config.templateId ?? null\"\n (valueChange)=\"onSpecialInputChange($event)\">\n </ccv-sdrf-cleavage-input>\n }\n @case ('spiked_compound') {\n <ccv-sdrf-spiked-compound-input\n [value]=\"specialInputValue()\"\n (valueChange)=\"onSpecialInputChange($event)\">\n </ccv-sdrf-spiked-compound-input>\n }\n }\n\n <div class=\"form-text mt-2\">\n <i class=\"bi bi-info-circle me-1\"></i>\n Use the enhanced editor for structured input, or toggle off for manual text entry.\n </div>\n </div>\n }\n\n @if (hasOntologyType && !showSpecialInput()) {\n <!-- Search type selection for ontology -->\n <div class=\"mb-2\">\n <small class=\"text-muted d-block mb-1\">Search Mode:</small>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'icontains' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('icontains')\">\n <i class=\"bi bi-search me-1\"></i>Contains\n </button>\n <button\n type=\"button\"\n class=\"btn\"\n [class]=\"searchType() === 'istartswith' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"onSearchTypeChange('istartswith')\">\n <i class=\"bi bi-arrow-right me-1\"></i>Starts with\n </button>\n </div>\n </div>\n\n <!-- Typeahead input for ontology suggestions -->\n <div class=\"input-group\">\n <input\n type=\"text\"\n class=\"form-control\"\n [class.border-success]=\"selectedFavorite() !== null\"\n id=\"metadataValue\"\n formControlName=\"value\"\n placeholder=\"Type to search ontology suggestions...\"\n [ngbTypeahead]=\"searchOntology\"\n [resultFormatter]=\"formatSuggestion\"\n [inputFormatter]=\"inputFormatter\"\n (selectItem)=\"onSuggestionSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\">\n @if (isLoadingSuggestions()) {\n <span class=\"input-group-text\">\n <div class=\"spinner-border spinner-border-sm\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </span>\n } @else {\n <span class=\"input-group-text\">\n <i class=\"bi bi-search text-muted\"></i>\n </span>\n }\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"clearValue()\"\n title=\"Clear value\">\n <i class=\"bi bi-x\"></i>\n </button>\n </div>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>\n Search {{ searchType() === 'icontains' ? 'contains' : 'starts with' }} for {{ ontologyTypeLabel }} ontology\n </div>\n } @else if (!showSpecialInput()) {\n <!-- Regular input when no ontology type or special input is disabled -->\n <div class=\"input-group\">\n <input\n type=\"text\"\n class=\"form-control\"\n [class.border-success]=\"selectedFavorite() !== null\"\n id=\"metadataValue\"\n formControlName=\"value\"\n placeholder=\"Enter metadata value\">\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"clearValue()\"\n title=\"Clear value\">\n <i class=\"bi bi-x\"></i>\n </button>\n </div>\n <div class=\"form-text text-muted\">\n @if (specialSyntaxType()) {\n Manual text entry mode. Use the Enhanced Editor toggle for structured {{ specialSyntaxType() }} input.\n } @else {\n Enter the value manually (no ontology suggestions available for this column type)\n }\n </div>\n }\n </div>\n\n <!-- Character count and value info -->\n <div class=\"mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <small class=\"text-muted\">\n Characters: {{ editForm.get('value')?.value?.length || 0 }}/500\n </small>\n @if (getSelectedFavoriteInfo()) {\n <small class=\"text-info\">\n <i class=\"bi bi-info-circle me-1\"></i>{{ getSelectedFavoriteInfo() }}\n </small>\n }\n </div>\n </div>\n\n </form>\n </div>\n\n <!-- Sample Selection Panel -->\n @if (hasMultiSampleEdit) {\n <div class=\"col-md-4\">\n <div class=\"border-start ps-3\">\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <h6 class=\"mb-0 text-muted\">\n <i class=\"bi bi-list-check me-1\"></i>Apply to Samples\n </h6>\n <span class=\"badge bg-primary\">\n {{ selectedSampleCount }}/{{ totalSampleCount }}\n </span>\n </div>\n\n <!-- Select All/Clear All Controls -->\n <div class=\"d-flex gap-1 mb-3\">\n <button \n type=\"button\" \n class=\"btn btn-outline-primary btn-sm flex-fill\"\n (click)=\"selectAllSamples()\"\n [disabled]=\"selectedSampleCount === totalSampleCount\">\n <i class=\"bi bi-check-all me-1\"></i>All\n </button>\n <button \n type=\"button\" \n class=\"btn btn-outline-secondary btn-sm flex-fill\"\n (click)=\"clearSampleSelection()\"\n [disabled]=\"selectedSampleCount === 0\">\n <i class=\"bi bi-x me-1\"></i>Clear\n </button>\n </div>\n\n <!-- Sample List -->\n <div class=\"sample-list\" style=\"max-height: 400px; overflow-y: auto;\">\n @for (sample of sampleData; track sample.index) {\n <div class=\"form-check d-flex align-items-center mb-2 p-2 rounded border-bottom\">\n <input \n class=\"form-check-input me-2\" \n type=\"checkbox\" \n [id]=\"'sample-' + sample.index\"\n [checked]=\"isSampleSelected(sample.index)\"\n (change)=\"toggleSampleSelection(sample.index)\">\n <label \n [for]=\"'sample-' + sample.index\" \n class=\"form-check-label flex-grow-1 cursor-pointer\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div>\n <div class=\"fw-semibold\">Sample {{ sample.index }}</div>\n @if (sample.sourceName) {\n <small class=\"text-muted\">{{ sample.sourceName }}</small>\n }\n </div>\n <div class=\"text-end\">\n <small class=\"text-muted\">Current:</small>\n <div class=\"small fw-mono\" [title]=\"sample.value || ''\">\n {{ (sample.value && sample.value.length > 15) ? (sample.value | slice:0:15) + '...' : (sample.value || '-') }}\n </div>\n </div>\n </div>\n </label>\n </div>\n }\n </div>\n\n @if (selectedSampleCount > 0) {\n <div class=\"alert alert-info mt-3 p-2\">\n <small>\n <i class=\"bi bi-info-circle me-1\"></i>\n The value will be applied to {{ selectedSampleCount }} selected sample{{ selectedSampleCount !== 1 ? 's' : '' }}.\n </small>\n </div>\n }\n </div>\n </div>\n }\n </div>\n</div>\n\n<div class=\"modal-footer\">\n <div class=\"me-auto\">\n @if (editForm.get('value')?.value && !isLoading() && !isFromFavoriteManagement) {\n <div class=\"btn-group dropup\" ngbDropdown>\n <button\n type=\"button\"\n class=\"btn btn-outline-warning btn-sm dropdown-toggle\"\n ngbDropdownToggle>\n <i class=\"bi bi-heart me-1\"></i>Add to Favorites\n </button>\n <div class=\"dropdown-menu\" ngbDropdownMenu>\n <button\n type=\"button\"\n class=\"dropdown-item\"\n (click)=\"addToFavorites('user')\">\n <i class=\"bi bi-person me-2\"></i>Personal Favorite\n </button>\n <button\n type=\"button\"\n class=\"dropdown-item\"\n (click)=\"addToFavorites('lab_group')\">\n <i class=\"bi bi-people me-2\"></i>Lab Group Favorite\n </button>\n <button\n type=\"button\"\n class=\"dropdown-item\"\n (click)=\"addToFavorites('global')\">\n <i class=\"bi bi-globe me-2\"></i>Global Recommendation\n </button>\n </div>\n </div>\n }\n </div>\n\n <div class=\"d-flex gap-2\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"onCancel()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"onSubmit()\"\n [disabled]=\"editForm.invalid || isLoading()\">\n @if (isLoading()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-check-circle me-1\"></i>\n Save Value\n </button>\n </div>\n</div>\n","import { Component, inject, signal, computed, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\nimport { LabGroup, LabGroupService } from '@noatgnu/cupcake-core';\n\nexport interface ExcelExportOptions {\n includeLabGroups: 'none' | 'selected' | 'all';\n selectedLabGroupIds: number[];\n includePools: boolean;\n}\n\n@Component({\n selector: 'ccv-excel-export-modal',\n standalone: true,\n imports: [CommonModule, FormsModule],\n templateUrl: './excel-export-modal.html',\n styleUrl: './excel-export-modal.scss'\n})\nexport class ExcelExportModalComponent implements OnInit {\n activeModal = inject(NgbActiveModal);\n labGroupService = inject(LabGroupService);\n\n // State\n isLoadingLabGroups = signal(false);\n availableLabGroups = signal<LabGroup[]>([]);\n \n // Form data\n includeLabGroups = signal<'none' | 'selected' | 'all'>('none');\n selectedLabGroupIds = signal<number[]>([]);\n includePools = signal(true);\n\n // Computed\n showLabGroupSelection = computed(() => this.includeLabGroups() === 'selected');\n canConfirm = computed(() => {\n if (this.includeLabGroups() === 'selected') {\n return this.selectedLabGroupIds().length > 0;\n }\n return true;\n });\n\n ngOnInit(): void {\n this.loadLabGroups();\n }\n\n private loadLabGroups(): void {\n this.isLoadingLabGroups.set(true);\n this.labGroupService.getMyLabGroups().subscribe({\n next: (response) => {\n this.availableLabGroups.set(response.results || []);\n this.isLoadingLabGroups.set(false);\n },\n error: (error) => {\n console.error('Error loading lab groups:', error);\n this.isLoadingLabGroups.set(false);\n }\n });\n }\n\n onLabGroupToggle(labGroupId: number, checked: boolean): void {\n const currentIds = this.selectedLabGroupIds();\n if (checked) {\n if (!currentIds.includes(labGroupId)) {\n this.selectedLabGroupIds.set([...currentIds, labGroupId]);\n }\n } else {\n this.selectedLabGroupIds.set(currentIds.filter(id => id !== labGroupId));\n }\n }\n\n isLabGroupSelected(labGroupId: number): boolean {\n return this.selectedLabGroupIds().includes(labGroupId);\n }\n\n onIncludeLabGroupsChange(value: 'none' | 'selected' | 'all'): void {\n this.includeLabGroups.set(value);\n if (value !== 'selected') {\n this.selectedLabGroupIds.set([]);\n }\n }\n\n selectAllLabGroups(): void {\n const allIds = this.availableLabGroups().map(lg => lg.id);\n this.selectedLabGroupIds.set(allIds);\n }\n\n deselectAllLabGroups(): void {\n this.selectedLabGroupIds.set([]);\n }\n\n confirm(): void {\n const options: ExcelExportOptions = {\n includeLabGroups: this.includeLabGroups(),\n selectedLabGroupIds: this.selectedLabGroupIds(),\n includePools: this.includePools()\n };\n this.activeModal.close(options);\n }\n\n cancel(): void {\n this.activeModal.dismiss();\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">Excel Export Options</h4>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"cancel()\"></button>\n</div>\n\n<div class=\"modal-body\">\n <!-- Lab Groups Section -->\n <div class=\"mb-4\">\n <h6 class=\"fw-semibold mb-3\">\n <i class=\"bi bi-people me-2\"></i>Lab Group Recommendations\n </h6>\n \n <div class=\"form-check mb-2\">\n <input \n class=\"form-check-input\" \n type=\"radio\" \n name=\"includeLabGroups\"\n id=\"labGroups_none\"\n [checked]=\"includeLabGroups() === 'none'\"\n (change)=\"onIncludeLabGroupsChange('none')\">\n <label class=\"form-check-label\" for=\"labGroups_none\">\n <strong>None</strong> - Only user-specific and global recommendations\n </label>\n </div>\n\n <div class=\"form-check mb-2\">\n <input \n class=\"form-check-input\" \n type=\"radio\" \n name=\"includeLabGroups\"\n id=\"labGroups_selected\"\n [checked]=\"includeLabGroups() === 'selected'\"\n (change)=\"onIncludeLabGroupsChange('selected')\">\n <label class=\"form-check-label\" for=\"labGroups_selected\">\n <strong>Selected groups</strong> - Choose specific lab groups\n </label>\n </div>\n\n <div class=\"form-check mb-3\">\n <input \n class=\"form-check-input\" \n type=\"radio\" \n name=\"includeLabGroups\"\n id=\"labGroups_all\"\n [checked]=\"includeLabGroups() === 'all'\"\n (change)=\"onIncludeLabGroupsChange('all')\">\n <label class=\"form-check-label\" for=\"labGroups_all\">\n <strong>All groups</strong> - Include all available lab group recommendations\n </label>\n </div>\n\n <!-- Lab Group Selection -->\n @if (showLabGroupSelection()) {\n <div class=\"border rounded p-3 bg-light\">\n @if (isLoadingLabGroups()) {\n <div class=\"text-center\">\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></div>\n Loading lab groups...\n </div>\n } @else if (availableLabGroups().length === 0) {\n <div class=\"text-muted text-center\">\n <i class=\"bi bi-info-circle me-2\"></i>\n No lab groups available\n </div>\n } @else {\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <h6 class=\"mb-0\">Select Lab Groups:</h6>\n <div class=\"btn-group btn-group-sm\">\n <button \n type=\"button\" \n class=\"btn btn-outline-secondary btn-sm\"\n (click)=\"selectAllLabGroups()\"\n [disabled]=\"selectedLabGroupIds().length === availableLabGroups().length\">\n Select All\n </button>\n <button \n type=\"button\" \n class=\"btn btn-outline-secondary btn-sm\"\n (click)=\"deselectAllLabGroups()\"\n [disabled]=\"selectedLabGroupIds().length === 0\">\n Clear All\n </button>\n </div>\n </div>\n\n <div class=\"row\">\n @for (labGroup of availableLabGroups(); track labGroup.id) {\n <div class=\"col-md-6 mb-2\">\n <div class=\"form-check\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n [id]=\"'labGroup_' + labGroup.id\"\n [checked]=\"isLabGroupSelected(labGroup.id)\"\n (change)=\"onLabGroupToggle(labGroup.id, $event.target.checked)\">\n <label class=\"form-check-label\" [for]=\"'labGroup_' + labGroup.id\">\n {{ labGroup.name }}\n @if (labGroup.description) {\n <small class=\"text-muted d-block\">{{ labGroup.description }}</small>\n }\n </label>\n </div>\n </div>\n }\n </div>\n\n @if (selectedLabGroupIds().length > 0) {\n <div class=\"mt-2\">\n <small class=\"text-success\">\n <i class=\"bi bi-check-circle me-1\"></i>\n {{ selectedLabGroupIds().length }} group{{ selectedLabGroupIds().length > 1 ? 's' : '' }} selected\n </small>\n </div>\n }\n }\n </div>\n }\n </div>\n\n <!-- Pools Section -->\n <div class=\"mb-4\">\n <h6 class=\"fw-semibold mb-3\">\n <i class=\"bi bi-collection me-2\"></i>Sample Pools\n </h6>\n <div class=\"form-check\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n id=\"includePools\"\n [checked]=\"includePools()\"\n (change)=\"includePools.set($event.target.checked)\">\n <label class=\"form-check-label\" for=\"includePools\">\n Include sample pools in export\n </label>\n <small class=\"form-text text-muted d-block mt-1\">\n Creates additional worksheets with pool information and mappings\n </small>\n </div>\n </div>\n\n <!-- Summary -->\n <div class=\"alert alert-info\">\n <h6 class=\"alert-heading\">\n <i class=\"bi bi-info-circle me-2\"></i>Export Summary\n </h6>\n <ul class=\"mb-0\">\n <li>\n <strong>Lab Groups:</strong>\n @switch (includeLabGroups()) {\n @case ('none') { None - only user and global recommendations }\n @case ('selected') { \n @if (selectedLabGroupIds().length > 0) {\n {{ selectedLabGroupIds().length }} selected group{{ selectedLabGroupIds().length > 1 ? 's' : '' }}\n } @else {\n No groups selected\n }\n }\n @case ('all') { All available lab groups }\n }\n </li>\n <li><strong>Sample Pools:</strong> {{ includePools() ? 'Included' : 'Excluded' }}</li>\n </ul>\n </div>\n</div>\n\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"cancel()\">\n Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn btn-primary\"\n [disabled]=\"!canConfirm()\"\n (click)=\"confirm()\">\n <i class=\"bi bi-file-earmark-spreadsheet me-2\"></i>\n Export Excel\n </button>\n</div>\n","import { Component, inject, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';\n\nexport interface ValidationResults {\n success: boolean;\n metadata_table_id: number;\n metadata_table_name: string;\n validation_timestamp: string;\n errors: string[];\n warnings: string[];\n}\n\n@Component({\n selector: 'ccv-validation-results-modal',\n imports: [CommonModule, NgbModule],\n templateUrl: './validation-results-modal.html',\n styleUrl: './validation-results-modal.scss'\n})\nexport class ValidationResultsModal {\n @Input() results?: ValidationResults;\n \n activeModal = inject(NgbActiveModal);\n \n formatTimestamp(timestamp: string): string {\n try {\n const date = new Date(timestamp);\n return date.toLocaleString();\n } catch (error) {\n return timestamp;\n }\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n @if (results?.success) {\n <i class=\"fa fa-check-circle me-2 text-success\"></i>\n Validation Passed\n } @else {\n <i class=\"fa fa-exclamation-triangle me-2 text-danger\"></i>\n Validation Failed\n }\n </h4>\n <button \n type=\"button\" \n class=\"btn-close\" \n aria-label=\"Close\"\n (click)=\"activeModal.dismiss()\">\n </button>\n</div>\n\n<div class=\"modal-body\">\n @if (results) {\n <div class=\"mb-3\">\n <h6 class=\"mb-2\">\n <i class=\"fa fa-table me-2 text-primary\"></i>\n {{ results.metadata_table_name }}\n </h6>\n <small class=\"text-muted\">\n <i class=\"fa fa-clock me-1\"></i>\n Validated: {{ formatTimestamp(results.validation_timestamp) }}\n </small>\n </div>\n\n @if (results.success) {\n <!-- Success message -->\n <div class=\"alert alert-success\">\n <i class=\"fa fa-check-circle me-2\"></i>\n <strong>Validation Successful!</strong>\n <p class=\"mb-0 mt-2\">\n Your metadata table complies with SDRF format standards and contains no validation errors.\n </p>\n </div>\n } @else {\n <!-- Validation failed - show errors and warnings -->\n <div class=\"alert alert-danger mb-3\">\n <i class=\"fa fa-exclamation-triangle me-2\"></i>\n <strong>Validation Failed</strong>\n <p class=\"mb-0 mt-2\">\n Your metadata table contains validation issues that need to be resolved.\n </p>\n </div>\n\n <!-- Summary -->\n <div class=\"row mb-3\">\n <div class=\"col-md-6\">\n <div class=\"card border-danger\">\n <div class=\"card-body text-center\">\n <h5 class=\"card-title text-danger\">{{ results.errors.length }}</h5>\n <p class=\"card-text\">Error{{ results.errors.length !== 1 ? 's' : '' }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"card border-warning\">\n <div class=\"card-body text-center\">\n <h5 class=\"card-title text-warning\">{{ results.warnings.length }}</h5>\n <p class=\"card-text\">Warning{{ results.warnings.length !== 1 ? 's' : '' }}</p>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Errors -->\n @if (results.errors.length > 0) {\n <div class=\"mb-3\">\n <h6 class=\"text-danger\">\n <i class=\"fa fa-times-circle me-2\"></i>\n Errors ({{ results.errors.length }})\n </h6>\n <div class=\"validation-issues\">\n @for (error of results.errors; track $index) {\n <div class=\"alert alert-danger py-2 px-3\">\n <i class=\"fa fa-times-circle me-2\"></i>\n {{ error }}\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Warnings -->\n @if (results.warnings.length > 0) {\n <div class=\"mb-3\">\n <h6 class=\"text-warning\">\n <i class=\"fa fa-exclamation-triangle me-2\"></i>\n Warnings ({{ results.warnings.length }})\n </h6>\n <div class=\"validation-issues\">\n @for (warning of results.warnings; track $index) {\n <div class=\"alert alert-warning py-2 px-3\">\n <i class=\"fa fa-exclamation-triangle me-2\"></i>\n {{ warning }}\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Help text -->\n <div class=\"alert alert-info\">\n <i class=\"fa fa-info-circle me-2\"></i>\n <strong>Need Help?</strong>\n <ul class=\"mb-0 mt-2\">\n <li>Errors must be fixed before your metadata can be exported as valid SDRF</li>\n <li>Warnings indicate potential issues but don't prevent SDRF export</li>\n <li>Check the <a href=\"/help/sdrf-validation\" target=\"_blank\">SDRF validation guide</a> for detailed explanations</li>\n </ul>\n </div>\n }\n }\n</div>\n\n<div class=\"modal-footer\">\n <button \n type=\"button\" \n class=\"btn btn-secondary\"\n (click)=\"activeModal.dismiss()\">\n Close\n </button>\n</div>\n","import { Injectable, OnDestroy, inject } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\r\nimport { takeUntil, filter, map, tap } from 'rxjs/operators';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport {\r\n AsyncTaskStatus,\r\n AsyncTaskCreateResponse,\r\n MetadataImportRequest,\r\n MetadataExportRequest,\r\n BulkExportRequest,\r\n BulkExcelExportRequest,\r\n MetadataValidationRequest\r\n} from '../models';\r\nimport {\r\n AsyncTaskService as LibraryAsyncTaskService,\r\n AsyncExportService,\r\n AsyncImportService,\r\n AsyncValidationService,\r\n Websocket,\r\n ElectronService\r\n} from '../services';\r\nimport { ToastService } from '@noatgnu/cupcake-core';\r\nimport { ValidationResultsModal, ValidationResults } from './validation-results-modal/validation-results-modal';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AsyncTaskUIService implements OnDestroy {\r\n private destroy$ = new Subject<void>();\r\n private tasksSubject = new BehaviorSubject<AsyncTaskStatus[]>([]);\r\n private isSubscribed = false;\r\n private metadataTableRefreshSubject = new Subject<number>();\r\n private taskCompletedSubject = new Subject<AsyncTaskStatus>();\r\n private exportTaskCompletedSubject = new Subject<AsyncTaskStatus>();\r\n\r\n private readonly sessionId = this.generateSessionId();\r\n private initiatedTasks = new Set<string>();\r\n\r\n private libraryAsyncTaskService = inject(LibraryAsyncTaskService);\r\n private asyncExportService = inject(AsyncExportService);\r\n private asyncImportService = inject(AsyncImportService);\r\n private asyncValidationService = inject(AsyncValidationService);\r\n private toastService = inject(ToastService);\r\n private websocket = inject(Websocket);\r\n private modalService = inject(NgbModal);\r\n private electronService = inject(ElectronService);\r\n\r\n public tasks$ = this.tasksSubject.asObservable();\r\n public activeTasks$ = this.tasks$.pipe(\r\n map(tasks => {\r\n const taskArray = Array.isArray(tasks) ? tasks : [];\r\n return taskArray.filter(task => task.status === 'QUEUED' || task.status === 'STARTED');\r\n })\r\n );\r\n\r\n public metadataTableRefresh$ = this.metadataTableRefreshSubject.asObservable();\r\n public taskCompleted$ = this.taskCompletedSubject.asObservable();\r\n public exportTaskCompleted$ = this.exportTaskCompletedSubject.asObservable();\r\n\r\n constructor() {\r\n this.initializeService();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n private initializeService(): void {\r\n this.startRealtimeUpdates();\r\n }\r\n\r\n startRealtimeUpdates(): void {\r\n if (this.isSubscribed) {\r\n return;\r\n }\r\n\r\n this.isSubscribed = true;\r\n\r\n if (!this.websocket.connectionState$() || this.websocket.connectionState$() === 'disconnected') {\r\n this.websocket.connect();\r\n }\r\n\r\n this.websocket.isConnected$.pipe(\r\n takeUntil(this.destroy$),\r\n filter(connected => connected)\r\n ).subscribe(() => {\r\n this.websocket.subscribe('async_task_updates');\r\n });\r\n\r\n this.websocket.filterMessages('async_task.update').pipe(\r\n takeUntil(this.destroy$)\r\n ).subscribe((message: any) => {\r\n this.handleTaskUpdate(message);\r\n });\r\n\r\n this.getTasks().subscribe({\r\n next: tasks => {\r\n const taskArray = Array.isArray(tasks) ? tasks : [];\r\n this.tasksSubject.next(taskArray);\r\n },\r\n error: error => {\r\n console.error('Error loading initial tasks:', error);\r\n }\r\n });\r\n }\r\n\r\n stopRealtimeUpdates(): void {\r\n this.isSubscribed = false;\r\n this.destroy$.next();\r\n }\r\n\r\n getTasks(): Observable<AsyncTaskStatus[]> {\r\n return this.libraryAsyncTaskService.getAsyncTasks().pipe(\r\n map(response => response.results || [])\r\n );\r\n }\r\n\r\n getTask(taskId: string): Observable<AsyncTaskStatus> {\r\n return this.libraryAsyncTaskService.getAsyncTask(taskId);\r\n }\r\n\r\n cancelTask(taskId: string): Observable<{message: string}> {\r\n return this.libraryAsyncTaskService.cancelTask(taskId);\r\n }\r\n\r\n private generateSessionId(): string {\r\n return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n private isTaskInitiatedByThisTab(taskId: string): boolean {\r\n return this.initiatedTasks.has(taskId);\r\n }\r\n\r\n /**\r\n * Mark a task as initiated by this tab for tracking purposes\r\n */\r\n monitorTask(taskId: string): void {\r\n this.initiatedTasks.add(taskId);\r\n }\r\n\r\n queueExcelExport(request: MetadataExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncExportService.excelTemplate(request).pipe(\r\n tap(response => {\r\n this.initiatedTasks.add(response.taskId);\r\n })\r\n );\r\n }\r\n\r\n queueSdrfExport(request: MetadataExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncExportService.sdrfFile(request).pipe(\r\n tap(response => {\r\n this.initiatedTasks.add(response.taskId);\r\n })\r\n );\r\n }\r\n\r\n queueSdrfImport(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncImportService.sdrfFile(request).pipe(\r\n tap(response => {\r\n this.initiatedTasks.add(response.taskId);\r\n })\r\n );\r\n }\r\n\r\n queueExcelImport(request: MetadataImportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncImportService.excelFile(request);\r\n }\r\n\r\n queueBulkSdrfExport(request: BulkExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncExportService.multipleSdrfFiles(request).pipe(\r\n tap(response => {\r\n this.initiatedTasks.add(response.taskId);\r\n })\r\n );\r\n }\r\n\r\n queueBulkExcelExport(request: BulkExcelExportRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncExportService.multipleExcelTemplates(request);\r\n }\r\n\r\n downloadTaskResult(taskId: string): void {\r\n this.libraryAsyncTaskService.getDownloadUrl(taskId).subscribe({\r\n next: (response) => {\r\n console.log('Download task result - checking Electron service:', {\r\n isElectron: this.electronService.isElectron,\r\n downloadUrl: response.downloadUrl\r\n });\r\n\r\n if (this.electronService.isElectron) {\r\n console.log('Using Electron download for:', response.downloadUrl);\r\n this.electronService.downloadFile(response.downloadUrl)\r\n .then((filePath: string) => {\r\n console.log('Electron download successful:', filePath);\r\n this.toastService.success(`File downloaded to: ${filePath}`);\r\n })\r\n .catch((error: any) => {\r\n console.error('Error downloading file with Electron:', error);\r\n this.toastService.error('Failed to download file');\r\n });\r\n } else {\r\n console.log('Using browser fallback for:', response.downloadUrl);\r\n window.open(response.downloadUrl, '_blank');\r\n }\r\n },\r\n error: (error) => {\r\n console.error('Error getting download URL:', error);\r\n this.toastService.error('Failed to get download URL');\r\n }\r\n });\r\n }\r\n\r\n validateMetadataTable(validationRequest: MetadataValidationRequest): Observable<AsyncTaskCreateResponse> {\r\n return this.asyncValidationService.metadataTable(validationRequest).pipe(\r\n tap(response => {\r\n this.initiatedTasks.add(response.taskId);\r\n })\r\n );\r\n }\r\n\r\n private handleTaskUpdate(message: any): void {\r\n const taskId = message.task_id;\r\n const currentTasks = this.tasksSubject.value;\r\n const existingTaskIndex = currentTasks.findIndex(t => t.id === taskId);\r\n\r\n if (existingTaskIndex >= 0) {\r\n const existingTask = currentTasks[existingTaskIndex];\r\n const wasRunning = existingTask.status === 'QUEUED' || existingTask.status === 'STARTED';\r\n\r\n const updatedTask: AsyncTaskStatus = {\r\n ...existingTask,\r\n status: message.status,\r\n progressPercentage: message.progress_percentage || existingTask.progressPercentage,\r\n progressDescription: message.progress_description || existingTask.progressDescription,\r\n errorMessage: message.error_message || existingTask.errorMessage,\r\n result: message.result || existingTask.result,\r\n };\r\n\r\n const updatedTasks = [...currentTasks];\r\n updatedTasks[existingTaskIndex] = updatedTask;\r\n this.tasksSubject.next(updatedTasks);\r\n\r\n if (message.status === 'STARTED') {\r\n this.showTaskProgressNotification(updatedTask, existingTask);\r\n }\r\n\r\n if (wasRunning && (message.status === 'SUCCESS' || message.status === 'FAILURE' || message.status === 'CANCELLED')) {\r\n this.showTaskCompletionNotification(updatedTask);\r\n \r\n const isTaskFromThisTab = this.isTaskInitiatedByThisTab(updatedTask.id);\r\n this.taskCompletedSubject.next(updatedTask);\r\n\r\n if (message.status === 'SUCCESS') {\r\n if (this.isImportTask(updatedTask.taskType) && updatedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(updatedTask.metadataTable);\r\n }\r\n\r\n if (this.isExportTask(updatedTask.taskType)) {\r\n this.exportTaskCompletedSubject.next(updatedTask);\r\n this.handleExportTaskCompletion(updatedTask);\r\n }\r\n\r\n if (updatedTask.taskType === 'VALIDATE_TABLE' && updatedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(updatedTask.metadataTable);\r\n }\r\n\r\n if ((updatedTask.taskType === 'REORDER_TABLE_COLUMNS') && updatedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(updatedTask.metadataTable);\r\n }\r\n }\r\n\r\n if (isTaskFromThisTab) {\r\n this.initiatedTasks.delete(updatedTask.id);\r\n }\r\n }\r\n } else {\r\n this.getTasks().subscribe(tasks => {\r\n const taskArray = Array.isArray(tasks) ? tasks : [];\r\n this.tasksSubject.next(taskArray);\r\n\r\n const refreshedTask = taskArray.find(t => t.id === taskId);\r\n if (refreshedTask && (message.status === 'SUCCESS' || message.status === 'FAILURE' || message.status === 'CANCELLED')) {\r\n this.showTaskCompletionNotification(refreshedTask);\r\n \r\n const isTaskFromThisTab = this.isTaskInitiatedByThisTab(refreshedTask.id);\r\n this.taskCompletedSubject.next(refreshedTask);\r\n\r\n if (message.status === 'SUCCESS') {\r\n if (this.isImportTask(refreshedTask.taskType) && refreshedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(refreshedTask.metadataTable);\r\n }\r\n\r\n if (this.isExportTask(refreshedTask.taskType)) {\r\n this.exportTaskCompletedSubject.next(refreshedTask);\r\n this.handleExportTaskCompletion(refreshedTask);\r\n }\r\n\r\n if (refreshedTask.taskType === 'VALIDATE_TABLE' && refreshedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(refreshedTask.metadataTable);\r\n }\r\n\r\n if ((refreshedTask.taskType === 'REORDER_TABLE_COLUMNS') && refreshedTask.metadataTable) {\r\n this.metadataTableRefreshSubject.next(refreshedTask.metadataTable);\r\n }\r\n }\r\n\r\n if (isTaskFromThisTab) {\r\n this.initiatedTasks.delete(refreshedTask.id);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n private showTaskProgressNotification(updatedTask: AsyncTaskStatus, previousTask: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(updatedTask.taskType);\r\n const tableName = updatedTask.metadataTableName ? ` for \"${updatedTask.metadataTableName}\"` : '';\r\n\r\n const progressChanged = Math.floor((updatedTask.progressPercentage || 0) / 25) !== Math.floor((previousTask.progressPercentage || 0) / 25);\r\n const descriptionChanged = updatedTask.progressDescription !== previousTask.progressDescription;\r\n\r\n if (progressChanged || (descriptionChanged && updatedTask.progressDescription)) {\r\n let message = `${taskName}${tableName}`;\r\n if (updatedTask.progressPercentage && updatedTask.progressPercentage > 0) {\r\n message += ` (${updatedTask.progressPercentage}%)`;\r\n }\r\n if (updatedTask.progressDescription) {\r\n message += `: ${updatedTask.progressDescription}`;\r\n }\r\n\r\n this.toastService.info(message, 3000);\r\n }\r\n }\r\n\r\n private showTaskCompletionNotification(task: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(task.taskType);\r\n const tableName = task.metadataTableName ? ` for \"${task.metadataTableName}\"` : '';\r\n\r\n if (task.taskType === 'VALIDATE_TABLE') {\r\n this.handleValidationTaskCompletion(task);\r\n return;\r\n }\r\n\r\n if (task.taskType === 'IMPORT_SDRF' || task.taskType === 'IMPORT_EXCEL') {\r\n this.handleImportTaskCompletion(task);\r\n return;\r\n }\r\n\r\n if (task.taskType === 'REORDER_TABLE_COLUMNS' || task.taskType === 'REORDER_TEMPLATE_COLUMNS') {\r\n this.handleReorderTaskCompletion(task);\r\n return;\r\n }\r\n\r\n const progressInfo = task.progressPercentage && task.progressPercentage > 0 ? ` (${task.progressPercentage}%)` : '';\r\n const progressDesc = task.progressDescription ? `: ${task.progressDescription}` : '';\r\n\r\n switch (task.status) {\r\n case 'SUCCESS':\r\n this.toastService.success(\r\n `Task Completed: ${taskName}${tableName}${progressInfo} completed successfully${progressDesc}`\r\n );\r\n break;\r\n case 'FAILURE':\r\n this.toastService.error(\r\n `Task Failed: ${taskName}${tableName}${progressInfo} failed: ${task.errorMessage || 'Unknown error'}${progressDesc}`\r\n );\r\n break;\r\n case 'CANCELLED':\r\n this.toastService.warning(\r\n `Task Cancelled: ${taskName}${tableName}${progressInfo} was cancelled${progressDesc}`\r\n );\r\n break;\r\n }\r\n }\r\n\r\n getTaskDisplayName(taskType: string): string {\r\n const typeMap: Record<string, string> = {\r\n 'EXPORT_EXCEL': 'Excel export',\r\n 'EXPORT_SDRF': 'SDRF export',\r\n 'IMPORT_SDRF': 'SDRF import',\r\n 'IMPORT_EXCEL': 'Excel import',\r\n 'EXPORT_MULTIPLE_SDRF': 'Bulk SDRF export',\r\n 'EXPORT_MULTIPLE_EXCEL': 'Bulk Excel export',\r\n 'VALIDATE_TABLE': 'Table validation',\r\n 'REORDER_TABLE_COLUMNS': 'Column reordering',\r\n 'REORDER_TEMPLATE_COLUMNS': 'Template column reordering',\r\n };\r\n return typeMap[taskType] || taskType;\r\n }\r\n\r\n getTaskStatusClass(status: string): string {\r\n const statusMap: Record<string, string> = {\r\n 'QUEUED': 'badge-secondary',\r\n 'STARTED': 'badge-primary',\r\n 'SUCCESS': 'badge-success',\r\n 'FAILURE': 'badge-danger',\r\n 'CANCELLED': 'badge-warning',\r\n };\r\n return statusMap[status] || 'badge-secondary';\r\n }\r\n\r\n formatDuration(duration: number | null): string {\r\n if (!duration) {\r\n return '-';\r\n }\r\n\r\n if (duration < 60) {\r\n return `${Math.round(duration)}s`;\r\n } else if (duration < 3600) {\r\n return `${Math.round(duration / 60)}m`;\r\n } else {\r\n const hours = Math.floor(duration / 3600);\r\n const minutes = Math.round((duration % 3600) / 60);\r\n return `${hours}h ${minutes}m`;\r\n }\r\n }\r\n\r\n canCancelTask(status: string): boolean {\r\n return status === 'QUEUED' || status === 'STARTED';\r\n }\r\n\r\n canDownloadResult(task: AsyncTaskStatus): boolean {\r\n return task.status === 'SUCCESS' &&\r\n (task.taskType === 'EXPORT_EXCEL' || task.taskType === 'EXPORT_SDRF' ||\r\n task.taskType === 'EXPORT_MULTIPLE_SDRF' || task.taskType === 'EXPORT_MULTIPLE_EXCEL');\r\n }\r\n\r\n private isImportTask(taskType: string): boolean {\r\n return taskType === 'IMPORT_SDRF' || taskType === 'IMPORT_EXCEL';\r\n }\r\n\r\n private isExportTask(taskType: string): boolean {\r\n return taskType === 'EXPORT_SDRF' || taskType === 'EXPORT_EXCEL' ||\r\n taskType === 'EXPORT_MULTIPLE_SDRF' || taskType === 'EXPORT_MULTIPLE_EXCEL';\r\n }\r\n\r\n private handleExportTaskCompletion(task: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(task.taskType);\r\n const tableName = task.metadataTableName ? ` for \"${task.metadataTableName}\"` : '';\r\n\r\n if (task.taskType === 'EXPORT_SDRF' || task.taskType === 'EXPORT_EXCEL') {\r\n setTimeout(() => {\r\n this.downloadTaskResult(task.id);\r\n }, 1500);\r\n\r\n this.toastService.success(\r\n `${taskName}${tableName} completed! Starting download...`,\r\n 4000\r\n );\r\n } else {\r\n this.toastService.success(\r\n `${taskName}${tableName} completed! Check your downloads.`,\r\n 6000\r\n );\r\n }\r\n }\r\n\r\n private handleValidationTaskCompletion(task: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(task.taskType);\r\n const tableName = task.metadataTableName ? ` for \"${task.metadataTableName}\"` : '';\r\n const progressInfo = task.progressPercentage && task.progressPercentage > 0 ? ` (${task.progressPercentage}%)` : '';\r\n const progressDesc = task.progressDescription ? `: ${task.progressDescription}` : '';\r\n\r\n switch (task.status) {\r\n case 'SUCCESS':\r\n const result = task.result as any;\r\n if (result && result.success === false) {\r\n const errorCount = result.errors?.length || 0;\r\n const warningCount = result.warnings?.length || 0;\r\n\r\n this.toastService.error(\r\n `Validation Failed${progressInfo}: Found ${errorCount} error(s) and ${warningCount} warning(s) in \"${task.metadataTableName}\". Click to view details.${progressDesc}`,\r\n 10000\r\n );\r\n\r\n this.showValidationResultsModal(result);\r\n } else {\r\n this.toastService.success(\r\n `Validation Passed${progressInfo}: ${task.metadataTableName} is valid and complies with SDRF format${progressDesc}`\r\n );\r\n\r\n if (result) {\r\n this.showValidationResultsModal(result);\r\n }\r\n }\r\n break;\r\n case 'FAILURE':\r\n this.toastService.error(\r\n `Validation Error: ${taskName}${tableName} failed: ${task.errorMessage || 'Unknown error'}`\r\n );\r\n break;\r\n case 'CANCELLED':\r\n this.toastService.warning(\r\n `Validation Cancelled: ${taskName}${tableName} was cancelled`\r\n );\r\n break;\r\n }\r\n }\r\n\r\n private showValidationResultsModal(validationResults: ValidationResults): void {\r\n const modalRef = this.modalService.open(ValidationResultsModal, {\r\n size: 'lg',\r\n backdrop: 'static',\r\n keyboard: false\r\n });\r\n\r\n modalRef.componentInstance.results = validationResults;\r\n\r\n modalRef.result.then((result) => {\r\n if (result === 'edit') {\r\n console.log('User wants to edit table to fix validation issues');\r\n }\r\n }).catch(() => {\r\n // Modal dismissed\r\n });\r\n }\r\n\r\n private handleImportTaskCompletion(task: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(task.taskType);\r\n const tableName = task.metadataTableName ? ` for \"${task.metadataTableName}\"` : '';\r\n const progressInfo = task.progressPercentage && task.progressPercentage > 0 ? ` (${task.progressPercentage}%)` : '';\r\n const progressDesc = task.progressDescription ? `: ${task.progressDescription}` : '';\r\n\r\n switch (task.status) {\r\n case 'SUCCESS':\r\n const result = task.result as any;\r\n let message = `${taskName}${tableName} completed successfully!`;\r\n\r\n if (result) {\r\n const details = [];\r\n if (result.columnsCreated || result.totalColumns) {\r\n details.push(`${result.columnsCreated || result.totalColumns || 0} columns processed`);\r\n }\r\n if (result.poolsCreated) {\r\n details.push(`${result.poolsCreated} pools created`);\r\n }\r\n if (result.samplesProcessed) {\r\n details.push(`${result.samplesProcessed} samples processed`);\r\n }\r\n\r\n if (details.length > 0) {\r\n message = `${taskName}${tableName}${progressInfo} completed! ${details.join(', ')}.${progressDesc}`;\r\n } else {\r\n message = `${taskName}${tableName}${progressInfo} completed successfully!${progressDesc}`;\r\n }\r\n }\r\n\r\n this.toastService.success(message, 6000);\r\n break;\r\n\r\n case 'FAILURE':\r\n this.toastService.error(\r\n `${taskName} Failed${progressInfo}: ${task.errorMessage || 'Import failed due to an unknown error'}${progressDesc}`\r\n );\r\n break;\r\n\r\n case 'CANCELLED':\r\n this.toastService.warning(\r\n `${taskName} Cancelled${progressInfo}: Import was cancelled${progressDesc}`\r\n );\r\n break;\r\n }\r\n }\r\n\r\n private handleReorderTaskCompletion(task: AsyncTaskStatus): void {\r\n const taskName = this.getTaskDisplayName(task.taskType);\r\n const tableName = task.metadataTableName ? ` for \"${task.metadataTableName}\"` : '';\r\n const progressInfo = task.progressPercentage && task.progressPercentage > 0 ? ` (${task.progressPercentage}%)` : '';\r\n const progressDesc = task.progressDescription ? `: ${task.progressDescription}` : '';\r\n\r\n switch (task.status) {\r\n case 'SUCCESS':\r\n const result = task.result as any;\r\n let message = `${taskName}${tableName} completed successfully!`;\r\n\r\n if (result) {\r\n const details = [];\r\n if (result.reorderedColumns) {\r\n details.push(`${result.reorderedColumns} columns reordered`);\r\n }\r\n if (result.reorderedPools) {\r\n details.push(`${result.reorderedPools} pools updated`);\r\n }\r\n if (result.schemaIdsUsed && result.schemaIdsUsed.length > 0) {\r\n details.push(`using ${result.schemaIdsUsed.length} schema(s)`);\r\n }\r\n\r\n if (details.length > 0) {\r\n message += `\\n${details.join(', ')}`;\r\n }\r\n }\r\n\r\n this.toastService.success(message, 5000);\r\n break;\r\n\r\n case 'FAILURE':\r\n this.toastService.error(\r\n `${taskName} Failed: ${task.errorMessage || 'Unknown error'}${progressInfo}${progressDesc}`\r\n );\r\n break;\r\n\r\n case 'CANCELLED':\r\n this.toastService.warning(\r\n `${taskName} Cancelled: ${taskName}${tableName} was cancelled`\r\n );\r\n break;\r\n }\r\n }\r\n}","import { Component, inject, Input, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormBuilder } from '@angular/forms';\r\nimport { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';\r\n\r\nimport { AsyncTaskUIService } from '../async-task-ui';\r\nimport { ToastService } from '@noatgnu/cupcake-core';\r\nimport { MetadataValidationRequest, MetadataValidationConfig, AsyncTaskCreateResponse } from '../../models/async-task';\r\n\r\n@Component({\r\n selector: 'ccv-metadata-validation-modal',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\r\n templateUrl: './metadata-validation-modal.html',\r\n styleUrl: './metadata-validation-modal.scss'\r\n})\r\nexport class MetadataValidationModal {\r\n @Input() config?: MetadataValidationConfig;\r\n \r\n private fb = inject(FormBuilder);\r\n private asyncTaskService = inject(AsyncTaskUIService);\r\n private toastService = inject(ToastService);\r\n \r\n activeModal = inject(NgbActiveModal);\r\n \r\n isValidating = signal(false);\r\n validationError = signal<string | null>(null);\r\n \r\n validationForm = this.fb.group({\r\n validate_sdrf_format: [true]\r\n });\r\n \r\n onSubmit(): void {\r\n if (this.validationForm.invalid || !this.config) {\r\n return;\r\n }\r\n \r\n this.isValidating.set(true);\r\n this.validationError.set(null);\r\n \r\n const formValue = this.validationForm.value;\r\n const request: MetadataValidationRequest = {\r\n metadataTableId: this.config.metadataTableId,\r\n validateSdrfFormat: formValue.validate_sdrf_format ?? true\r\n };\r\n \r\n this.asyncTaskService.validateMetadataTable(request).subscribe({\r\n next: (response) => {\r\n this.toastService.success(\r\n `Validation started successfully for \"${this.config?.metadataTableName}\"`\r\n );\r\n this.activeModal.close({\r\n success: true,\r\n task_id: response.taskId,\r\n message: response.message\r\n });\r\n },\r\n error: (error) => {\r\n this.isValidating.set(false);\r\n const errorMessage = error?.error?.error || error?.message || 'Failed to start validation';\r\n this.validationError.set(errorMessage);\r\n this.toastService.error(`Validation failed: ${errorMessage}`);\r\n }\r\n });\r\n }\r\n}","<div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n <i class=\"bi bi-check-circle me-2 text-success\"></i>\r\n Validate Metadata Table\r\n </h4>\r\n <button \r\n type=\"button\" \r\n class=\"btn-close\" \r\n aria-label=\"Close\"\r\n (click)=\"activeModal.dismiss()\"\r\n [disabled]=\"isValidating()\">\r\n </button>\r\n</div>\r\n\r\n<form [formGroup]=\"validationForm\" (ngSubmit)=\"onSubmit()\">\r\n <div class=\"modal-body\">\r\n <div class=\"alert alert-info\">\r\n <i class=\"bi bi-info-circle me-2\"></i>\r\n <strong>{{ config?.metadataTableName }}</strong> will be validated against SDRF format standards using SDRFDataFrame.\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <h6 class=\"mb-3\">Validation Options</h6>\r\n \r\n <div class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n id=\"validate_sdrf_format\"\r\n formControlName=\"validate_sdrf_format\">\r\n <label class=\"form-check-label\" for=\"validate_sdrf_format\">\r\n <i class=\"bi bi-file-earmark-text me-1 text-warning\"></i>\r\n SDRF Format Validation\r\n </label>\r\n <small class=\"form-text text-muted d-block\">\r\n Validate against MAGE-TAB SDRF standard format using SDRFDataFrame\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-6\">\r\n <h6 class=\"mb-3\">What gets checked?</h6>\r\n \r\n <div class=\"validation-info\">\r\n <div class=\"mb-2\">\r\n <i class=\"bi bi-check-circle text-success me-2\"></i>\r\n Required SDRF columns presence\r\n </div>\r\n <div class=\"mb-2\">\r\n <i class=\"bi bi-check-circle text-success me-2\"></i>\r\n SDRF format compliance\r\n </div>\r\n <div class=\"mb-2\">\r\n <i class=\"bi bi-check-circle text-success me-2\"></i>\r\n Column header validation\r\n </div>\r\n <div class=\"mb-2\">\r\n <i class=\"bi bi-check-circle text-success me-2\"></i>\r\n Data structure integrity\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (validationError()) {\r\n <div class=\"alert alert-danger mt-3\">\r\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\r\n {{ validationError() }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"modal-footer\">\r\n <button \r\n type=\"button\" \r\n class=\"btn btn-secondary\"\r\n (click)=\"activeModal.dismiss()\"\r\n [disabled]=\"isValidating()\">\r\n Cancel\r\n </button>\r\n \r\n <button \r\n type=\"submit\" \r\n class=\"btn btn-success\"\r\n [disabled]=\"validationForm.invalid || isValidating()\">\r\n @if (isValidating()) {\r\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></span>\r\n Starting Validation...\r\n } @else {\r\n <i class=\"bi bi-play me-2\"></i>\r\n Start Validation\r\n }\r\n </button>\r\n </div>\r\n</form>","import { Component, Input, Output, EventEmitter, OnInit, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbActiveModal, NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { MetadataTable, MetadataTableUpdateRequest, MetadataTableCreateRequest, SampleCountConfirmationError } from '../../models/metadata-table';\nimport { MetadataTableService } from '../../services/metadata-table';\nimport { LabGroupService, LabGroup } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-metadata-table-edit-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './metadata-table-edit-modal.html',\n styleUrl: './metadata-table-edit-modal.scss'\n})\nexport class MetadataTableEditModal implements OnInit {\n @Input() table?: MetadataTable; // Make optional for creation mode\n @Input() isCreateMode: boolean = false; // Add flag to determine mode\n @Output() tableSaved = new EventEmitter<MetadataTable>();\n\n editForm: FormGroup;\n isLoading = signal(false);\n availableLabGroups = signal<LabGroup[]>([]);\n isLoadingLabGroups = signal(false);\n\n constructor(\n private fb: FormBuilder,\n private activeModal: NgbActiveModal,\n private modalService: NgbModal,\n private metadataTableService: MetadataTableService,\n private labGroupService: LabGroupService\n ) {\n this.editForm = this.fb.group({\n name: ['', [Validators.required, Validators.maxLength(255)]],\n description: [''],\n sampleCount: [1, [Validators.required, Validators.min(1), Validators.max(10000)]],\n version: ['', [Validators.maxLength(50)]],\n labGroup: [null]\n });\n }\n\n ngOnInit() {\n if (this.table) {\n this.editForm.patchValue({\n name: this.table.name,\n description: this.table.description || '',\n sampleCount: this.table.sampleCount,\n version: this.table.version,\n labGroup: this.table.labGroup || null\n });\n }\n \n this.loadLabGroups();\n }\n\n loadLabGroups(): void {\n this.isLoadingLabGroups.set(true);\n \n this.labGroupService.getMyLabGroups({ limit: 10 }).subscribe({\n next: (response) => {\n this.availableLabGroups.set(response.results);\n this.isLoadingLabGroups.set(false);\n },\n error: (error) => {\n console.error('Error loading lab groups:', error);\n this.availableLabGroups.set([]);\n this.isLoadingLabGroups.set(false);\n }\n });\n }\n\n onSubmit(): void {\n if (this.editForm.valid) {\n this.isLoading.set(true);\n\n const formValue = this.editForm.value;\n\n if (this.isCreateMode) {\n const createData: MetadataTableCreateRequest = {\n name: formValue.name.trim(),\n description: formValue.description?.trim() || undefined,\n sampleCount: formValue.sampleCount,\n version: formValue.version?.trim() || undefined,\n labGroup: formValue.labGroup || undefined,\n sourceApp: 'cupcake-vanilla'\n };\n\n this.performCreate(createData);\n } else if (this.table?.id) {\n const updateData: MetadataTableUpdateRequest = {\n name: formValue.name.trim(),\n description: formValue.description?.trim() || undefined,\n sampleCount: formValue.sampleCount,\n version: formValue.version?.trim() || undefined,\n labGroup: formValue.labGroup || undefined\n };\n\n this.performUpdate(updateData);\n }\n }\n }\n\n private performCreate(createData: MetadataTableCreateRequest): void {\n this.metadataTableService.createMetadataTable(createData).subscribe({\n next: (newTable) => {\n this.tableSaved.emit(newTable);\n this.activeModal.close(newTable);\n },\n error: (error) => {\n console.error('Error creating metadata table:', error);\n this.isLoading.set(false);\n }\n });\n }\n\n private performUpdate(updateData: MetadataTableUpdateRequest, confirmed: boolean = false): void {\n if (!this.table?.id) return;\n\n if (confirmed) {\n updateData.sampleCountConfirmed = true;\n }\n\n this.metadataTableService.updateMetadataTable(this.table.id, updateData).subscribe({\n next: (updatedTable) => {\n this.tableSaved.emit(updatedTable);\n this.activeModal.close(updatedTable);\n },\n error: (error) => {\n if (this.isSampleCountConfirmationError(error)) {\n this.handleSampleCountConfirmation(error.error, updateData);\n } else {\n console.error('Error updating metadata table:', error);\n this.isLoading.set(false);\n }\n }\n });\n }\n\n private handleSampleCountConfirmation(errorData: SampleCountConfirmationError, updateData: MetadataTableUpdateRequest): void {\n this.isLoading.set(false);\n const details = errorData.sampleCountConfirmationDetails;\n\n const message = `Reducing sample count from ${details.currentSampleCount} to ${details.newSampleCount} will remove data:\n\n${details.validationResult.warnings.join('\\n')}\n\n${this.formatAffectedData(details.validationResult)}\n\nDo you want to continue?`;\n\n if (confirm(message)) {\n this.isLoading.set(true);\n this.performUpdate(updateData, true);\n }\n }\n\n private formatAffectedData(validationResult: any): string {\n let message = '';\n\n if (validationResult.affectedModifiers?.length > 0) {\n message += `\\nAffected column modifiers (${validationResult.affectedModifiers.length}):`;\n validationResult.affectedModifiers.slice(0, 5).forEach((modifier: any) => {\n message += `\\n- ${modifier.columnName} (samples: ${modifier.samples})`;\n });\n if (validationResult.affectedModifiers.length > 5) {\n message += `\\n- ... and ${validationResult.affectedModifiers.length - 5} more`;\n }\n }\n\n if (validationResult.affectedPools?.length > 0) {\n message += `\\nAffected sample pools (${validationResult.affectedPools.length}):`;\n validationResult.affectedPools.slice(0, 5).forEach((pool: any) => {\n message += `\\n- ${pool.poolName}`;\n });\n if (validationResult.affectedPools.length > 5) {\n message += `\\n- ... and ${validationResult.affectedPools.length - 5} more`;\n }\n }\n\n return message;\n }\n\n private isSampleCountConfirmationError(error: any): error is { error: SampleCountConfirmationError } {\n return error?.error?.sampleCountConfirmationDetails &&\n error?.error?.sampleCountConfirmationDetails?.requiresConfirmation === true;\n }\n\n onCancel(): void {\n this.activeModal.dismiss();\n }\n\n get title(): string {\n if (this.isCreateMode) {\n return 'Create New Metadata Table';\n }\n return `Edit ${this.table?.name || 'Metadata Table'}`;\n }\n\n get hasChanges(): boolean {\n if (this.isCreateMode) {\n return this.editForm.dirty; // For creation mode, any change is valid\n }\n\n if (!this.table) return false;\n\n const formValue = this.editForm.value;\n return (\n formValue.name !== this.table.name ||\n formValue.description !== (this.table.description || '') ||\n formValue.sampleCount !== this.table.sampleCount ||\n formValue.version !== this.table.version ||\n formValue.labGroup !== this.table.labGroup\n );\n }\n\n // Form validation helpers\n isFieldInvalid(fieldName: string): boolean {\n const field = this.editForm.get(fieldName);\n return !!(field && field.invalid && field.touched);\n }\n\n getFieldError(fieldName: string): string {\n const field = this.editForm.get(fieldName);\n if (!field || !field.errors) return '';\n \n const displayName = this.getFieldDisplayName(fieldName);\n \n if (field.errors['required']) {\n return `${displayName} is required`;\n }\n if (field.errors['maxlength']) {\n return `${displayName} must be less than ${field.errors['maxlength'].requiredLength} characters`;\n }\n if (field.errors['min']) {\n return `${displayName} must be at least ${field.errors['min'].min}`;\n }\n if (field.errors['max']) {\n return `${displayName} must be no more than ${field.errors['max'].max}`;\n }\n \n return 'Invalid value';\n }\n\n private getFieldDisplayName(fieldName: string): string {\n const displayNames: Record<string, string> = {\n 'name': 'Table name',\n 'description': 'Description', \n 'sampleCount': 'Sample count',\n 'version': 'Version',\n 'labGroup': 'Lab group'\n };\n return displayNames[fieldName] || fieldName;\n }\n}","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-table me-2\"></i>{{ title }}\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"onCancel()\"></button>\n</div>\n\n<div class=\"modal-body\">\n <form [formGroup]=\"editForm\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Table Name -->\n <div class=\"mb-3\">\n <label for=\"tableName\" class=\"form-label\">\n Table Name *\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"tableName\"\n formControlName=\"name\"\n [class.is-invalid]=\"isFieldInvalid('name')\"\n placeholder=\"Enter table name\"\n maxlength=\"255\">\n @if (isFieldInvalid('name')) {\n <div class=\"invalid-feedback\">\n {{ getFieldError('name') }}\n </div>\n }\n </div>\n\n <!-- Description -->\n <div class=\"mb-3\">\n <label for=\"tableDescription\" class=\"form-label\">\n Description\n </label>\n <textarea\n class=\"form-control\"\n id=\"tableDescription\"\n formControlName=\"description\"\n rows=\"3\"\n placeholder=\"Optional description of the metadata table\"></textarea>\n <div class=\"form-text\">\n Provide a brief description of what this metadata table contains or its purpose.\n </div>\n </div>\n\n <!-- Sample Count and Version Row -->\n <div class=\"row\">\n <div class=\"col-md-6 mb-3\">\n <label for=\"sampleCount\" class=\"form-label\">\n Sample Count *\n </label>\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"sampleCount\"\n formControlName=\"sampleCount\"\n [class.is-invalid]=\"isFieldInvalid('sampleCount')\"\n placeholder=\"Number of samples\"\n min=\"1\"\n max=\"10000\">\n @if (isFieldInvalid('sampleCount')) {\n <div class=\"invalid-feedback\">\n {{ getFieldError('sampleCount') }}\n </div>\n }\n <div class=\"form-text\">\n Number of samples in this metadata table (1-10,000).\n </div>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"version\" class=\"form-label\">\n Version\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"version\"\n formControlName=\"version\"\n [class.is-invalid]=\"isFieldInvalid('version')\"\n placeholder=\"e.g., 1.0, v2.1\"\n maxlength=\"50\">\n @if (isFieldInvalid('version')) {\n <div class=\"invalid-feedback\">\n {{ getFieldError('version') }}\n </div>\n }\n <div class=\"form-text\">\n Version identifier for this table.\n </div>\n </div>\n </div>\n\n <!-- Lab Group Assignment -->\n <div class=\"mb-3\">\n <label for=\"labGroup\" class=\"form-label\">\n Lab Group Assignment\n </label>\n @if (isLoadingLabGroups()) {\n <div class=\"d-flex align-items-center\">\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n <span class=\"text-muted\">Loading lab groups...</span>\n </div>\n } @else {\n <select\n class=\"form-select\"\n id=\"labGroup\"\n formControlName=\"labGroup\">\n <option [value]=\"null\">No lab group (Personal)</option>\n @for (group of availableLabGroups(); track group.id) {\n <option [value]=\"group.id\">{{ group.name }}</option>\n }\n </select>\n }\n <div class=\"form-text\">\n Assign this table to a lab group for shared access, or leave unassigned for personal use.\n </div>\n </div>\n\n <!-- Table Status Info (Read-only) -->\n @if (table) {\n <div class=\"mb-3\">\n <label class=\"form-label\">Current Status</label>\n <div class=\"d-flex gap-2\">\n @if (table.isLocked) {\n <span class=\"badge bg-warning\">\n <i class=\"bi bi-lock me-1\"></i>Locked\n </span>\n } @else {\n <span class=\"badge bg-success\">\n <i class=\"bi bi-unlock me-1\"></i>Unlocked\n </span>\n }\n @if (table.isPublished) {\n <span class=\"badge bg-info\">\n <i class=\"bi bi-check-circle me-1\"></i>Published\n </span>\n } @else {\n <span class=\"badge bg-secondary\">\n <i class=\"bi bi-clock me-1\"></i>Draft\n </span>\n }\n </div>\n <div class=\"form-text\">\n Lock status and publication state can be managed through advanced options.\n </div>\n </div>\n }\n\n <!-- Character Count -->\n <div class=\"mb-2\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <small class=\"text-muted\">\n Name: {{ editForm.get('name')?.value?.length || 0 }}/255 characters\n </small>\n @if (hasChanges) {\n <small class=\"text-info\">\n <i class=\"bi bi-info-circle me-1\"></i>Changes detected\n </small>\n }\n </div>\n </div>\n\n </form>\n</div>\n\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"onCancel()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"onSubmit()\"\n [disabled]=\"editForm.invalid || isLoading() || (!isCreateMode && !hasChanges)\">\n @if (isLoading()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n @if (isCreateMode) {\n <i class=\"bi bi-plus-circle me-1\"></i>\n Create Table\n } @else {\n <i class=\"bi bi-check-circle me-1\"></i>\n Save Changes\n }\n </button>\n</div>\n","import { Component, Input, Output, EventEmitter, OnInit, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormsModule } from '@angular/forms';\nimport { NgbActiveModal, NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { MetadataColumn, PaginatedResponse, MetadataColumnTemplate, ONTOLOGY_TYPE_CONFIGS, COLUMN_TYPE_CONFIGS, OntologyTypeConfig, ColumnTypeConfig, ColumnType, OntologyType, OFFICIAL_SDRF_COLUMNS, SdrfColumnConfig, getSdrfColumnsByCategory, getSdrfColumnByName } from '../../../models';\nimport { MetadataValueEditModal, MetadataValueEditConfig } from '../../metadata-value-edit-modal/metadata-value-edit-modal';\nimport { MetadataColumnTemplateService, MetadataColumnTemplateQueryParams } from '../../../services/metadata-column-template';\nimport { SdrfSyntaxService } from '../../../services/sdrf-syntax';\n\n@Component({\n selector: 'ccv-column-edit-modal',\n imports: [CommonModule, ReactiveFormsModule, FormsModule, NgbModule],\n templateUrl: './column-edit-modal.html',\n styleUrl: './column-edit-modal.scss'\n})\nexport class ColumnEditModal implements OnInit {\n @Input() column: MetadataColumn | null = null;\n @Input() templateId: number | null = null; // Add template ID for API calls\n @Input() isEdit = false;\n @Output() columnSaved = new EventEmitter<Partial<MetadataColumn>>();\n\n editForm: FormGroup;\n isLoading = signal(false);\n showAdvancedMode = signal(false);\n\n // Selected ontology configuration (includes custom filters)\n selectedOntologyConfig: OntologyTypeConfig | null = null;\n\n // Available options for dropdowns from library\n columnTypes: ColumnTypeConfig[] = COLUMN_TYPE_CONFIGS;\n ontologyTypes: OntologyTypeConfig[] = ONTOLOGY_TYPE_CONFIGS;\n\n // Template selection properties\n templateFilter = '';\n selectedTemplateId: number | string = '';\n selectedTemplate: MetadataColumnTemplate | null = null;\n templates: MetadataColumnTemplate[] = [];\n isLoadingTemplates = false;\n\n // Pagination\n currentTemplatePage = 1;\n templatePageSize = 5;\n totalTemplates = 0;\n totalTemplatePages = 0;\n Math = Math;\n\n // Official SDRF column configurations from library\n officialSdrfColumns: SdrfColumnConfig[] = OFFICIAL_SDRF_COLUMNS;\n\n // Column selection mode\n showOfficialColumns = false;\n selectedOfficialColumn: SdrfColumnConfig | null = null;\n availableOfficialColumns: SdrfColumnConfig[] = [];\n\n // Template swapping for existing columns\n showTemplateSwap = false;\n showCreateCustomTemplate = false;\n\n constructor(\n private fb: FormBuilder,\n private activeModal: NgbActiveModal,\n private modalService: NgbModal,\n private metadataColumnTemplateService: MetadataColumnTemplateService,\n private sdrfSyntaxService: SdrfSyntaxService\n ) {\n this.editForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(1)]],\n type: [ColumnType.CHARACTERISTICS, Validators.required],\n value: [''],\n ontologyType: ['0'],\n enableTypeahead: [false],\n mandatory: [false],\n hidden: [false],\n readonly: [false],\n notApplicable: [false]\n });\n }\n\n ngOnInit() {\n // Always disable name and type fields since they're managed through templates\n this.editForm.get('name')?.disable();\n this.editForm.get('type')?.disable();\n\n if (this.column && this.isEdit) {\n this.populateForm();\n }\n\n if (!this.isEdit) {\n this.loadColumnTemplates();\n }\n }\n\n private populateForm() {\n if (this.column) {\n const ontologyTypeIndex = this.column.ontologyType\n ? this.ontologyTypes.findIndex(o => o.value === this.column!.ontologyType)\n : 0;\n\n this.editForm.patchValue({\n name: this.column.name,\n type: this.getCorrectedColumnType(this.column.name, this.column.type),\n value: this.column.value || '',\n ontologyType: ontologyTypeIndex >= 0 ? ontologyTypeIndex.toString() : '0',\n enableTypeahead: this.column.enableTypeahead || false,\n mandatory: this.column.mandatory || false,\n hidden: this.column.hidden || false,\n readonly: this.column.readonly || false,\n notApplicable: this.column.notApplicable || false\n });\n }\n }\n\n onSubmit() {\n // For new columns, require either template or official column selection\n if (!this.isEdit && !this.selectedTemplate && !this.selectedOfficialColumn) {\n alert('Please select from official SDRF columns or choose an existing template before proceeding.');\n return;\n }\n\n if (this.editForm.valid) {\n this.isLoading.set(true);\n const formValue = this.editForm.getRawValue();\n\n const ontologyTypeIndex = parseInt(formValue.ontologyType);\n const ontologyTypeValue = ontologyTypeIndex > 0 ? this.ontologyTypes[ontologyTypeIndex]?.value as OntologyType : undefined;\n\n const columnData: Partial<MetadataColumn> = {\n name: formValue.name,\n type: formValue.type,\n value: formValue.value || '',\n ontologyType: ontologyTypeValue,\n enableTypeahead: formValue.enableTypeahead || false,\n mandatory: formValue.mandatory || false,\n hidden: formValue.hidden || false,\n readonly: formValue.readonly || false,\n notApplicable: formValue.notApplicable || false\n };\n\n this.columnSaved.emit(columnData);\n } else {\n this.markFormGroupTouched();\n }\n }\n\n private markFormGroupTouched() {\n Object.keys(this.editForm.controls).forEach(key => {\n const control = this.editForm.get(key);\n control?.markAsTouched();\n });\n }\n\n onCancel() {\n this.activeModal.dismiss();\n }\n\n onClose() {\n this.isLoading.set(false);\n this.activeModal.close();\n }\n\n getFieldError(fieldName: string): string {\n const control = this.editForm.get(fieldName);\n if (control?.errors && control.touched) {\n if (control.errors['required']) return `${fieldName} is required`;\n if (control.errors['minlength']) return `${fieldName} must be at least ${control.errors['minlength'].requiredLength} characters`;\n }\n return '';\n }\n\n get title(): string {\n return this.isEdit ? 'Edit Column' : 'Add Column';\n }\n\n get hasOntologyType(): boolean {\n const ontologyTypeIndex = this.editForm.get('ontologyType')?.value;\n return !!(ontologyTypeIndex && ontologyTypeIndex !== '0');\n }\n\n get hasTypeaheadEnabled(): boolean {\n return this.hasOntologyType && this.editForm.get('enableTypeahead')?.value === true;\n }\n\n openValueEditModal(): void {\n // Get custom filters from selected ontology type or template\n let customFilters = this.selectedTemplate?.customOntologyFilters;\n let ontologyType = '';\n\n // If in advanced mode and an ontology type is selected, use its custom filters\n if (this.showAdvancedMode() && this.selectedOntologyConfig) {\n ontologyType = this.selectedOntologyConfig.value;\n if (this.selectedOntologyConfig.customFilters) {\n customFilters = this.selectedOntologyConfig.customFilters;\n }\n }\n\n const config: MetadataValueEditConfig = {\n columnId: this.column?.id,\n columnName: this.editForm.get('name')?.value || 'Column',\n columnType: this.editForm.get('type')?.value || '',\n ontologyType: ontologyType,\n enableTypeahead: this.editForm.get('enableTypeahead')?.value || false,\n currentValue: this.editForm.get('value')?.value || '',\n context: this.isEdit ? 'table' : 'template',\n templateId: this.selectedTemplate?.id || this.templateId || undefined,\n customOntologyFilters: customFilters\n };\n\n const modalRef = this.modalService.open(MetadataValueEditModal, {\n size: 'lg',\n backdrop: 'static'\n });\n\n modalRef.componentInstance.config = config;\n modalRef.componentInstance.valueSaved.subscribe((result: string | { value: string; sampleIndices: number[] }) => {\n // Extract the actual value from the result\n const newValue = typeof result === 'string' ? result : result.value;\n this.editForm.get('value')?.setValue(newValue);\n this.editForm.get('value')?.markAsTouched();\n modalRef.componentInstance.onClose();\n });\n }\n\n // Template selection methods\n private loadColumnTemplates(): void {\n this.isLoadingTemplates = true;\n const offset = (this.currentTemplatePage - 1) * this.templatePageSize;\n const params: MetadataColumnTemplateQueryParams = {\n limit: this.templatePageSize,\n offset: offset,\n isActive: true,\n search: this.templateFilter || undefined\n };\n\n this.metadataColumnTemplateService.getMetadataColumnTemplates(params).subscribe({\n next: (response: PaginatedResponse<MetadataColumnTemplate>) => {\n this.templates = response.results || [];\n this.totalTemplates = response.count || 0;\n this.totalTemplatePages = Math.ceil(this.totalTemplates / this.templatePageSize);\n this.isLoadingTemplates = false;\n },\n error: (error: any) => {\n console.error('Error loading column templates:', error);\n this.isLoadingTemplates = false;\n }\n });\n }\n\n onTemplateFilterChange(): void {\n this.currentTemplatePage = 1;\n this.loadColumnTemplates();\n }\n\n clearTemplateFilter(): void {\n this.templateFilter = '';\n this.currentTemplatePage = 1;\n this.loadColumnTemplates();\n }\n\n onTemplatePageChange(page: number): void {\n this.currentTemplatePage = page;\n this.loadColumnTemplates();\n }\n\n onTemplateSelectionChange(): void {\n if (this.selectedTemplateId) {\n const template = this.templates.find(t => t.id === Number(this.selectedTemplateId));\n if (template) {\n this.selectedTemplate = template;\n\n // Enable controls to update values, then disable again\n this.editForm.get('name')?.enable();\n this.editForm.get('type')?.enable();\n\n // Auto-fill form with template data\n const ontologyTypeIndex = template.ontologyType\n ? this.ontologyTypes.findIndex(o => o.value === template.ontologyType)\n : 0;\n\n this.editForm.patchValue({\n name: template.columnName,\n type: template.columnType,\n value: template.defaultValue || '',\n ontologyType: ontologyTypeIndex >= 0 ? ontologyTypeIndex.toString() : '0',\n enableTypeahead: template.enableTypeahead || false,\n mandatory: false,\n hidden: false,\n readonly: false,\n notApplicable: false\n });\n\n // Disable controls again\n this.editForm.get('name')?.disable();\n this.editForm.get('type')?.disable();\n\n // Mark form as touched to trigger validation display\n Object.keys(this.editForm.controls).forEach(key => {\n this.editForm.get(key)?.markAsTouched();\n });\n }\n } else {\n this.clearTemplate();\n }\n }\n\n clearTemplate(): void {\n this.selectedTemplate = null;\n this.selectedTemplateId = '';\n\n // Enable controls to reset values, then disable again\n this.editForm.get('name')?.enable();\n this.editForm.get('type')?.enable();\n\n // Reset form to default values\n this.editForm.reset({\n name: '',\n type: ColumnType.CHARACTERISTICS,\n value: '',\n ontologyType: '0',\n enableTypeahead: false,\n mandatory: false,\n hidden: false,\n readonly: false,\n notApplicable: false\n });\n\n // Disable controls again\n this.editForm.get('name')?.disable();\n this.editForm.get('type')?.disable();\n }\n\n getOntologyTypeLabel(ontologyType: string): string {\n const ontology = this.ontologyTypes.find(o => o.value === ontologyType);\n return ontology ? ontology.label : ontologyType;\n }\n\n // Official column selection methods\n toggleOfficialColumns(): void {\n this.showOfficialColumns = !this.showOfficialColumns;\n if (this.showOfficialColumns) {\n this.filterOfficialColumns();\n }\n }\n\n selectOfficialColumn(column: SdrfColumnConfig): void {\n this.selectedOfficialColumn = column;\n\n // Enable controls to update values, then disable again\n this.editForm.get('name')?.enable();\n this.editForm.get('type')?.enable();\n\n const ontologyTypeValue = this.getDefaultOntologyTypeForColumn(column.name);\n const ontologyTypeIndex = ontologyTypeValue\n ? this.ontologyTypes.findIndex(o => o.value === ontologyTypeValue)\n : 0;\n\n this.editForm.patchValue({\n name: column.name,\n type: column.type,\n value: '',\n ontologyType: ontologyTypeIndex >= 0 ? ontologyTypeIndex.toString() : '0',\n enableTypeahead: this.shouldEnableTypeaheadForColumn(column.name),\n mandatory: this.isColumnMandatory(column.name),\n hidden: false,\n readonly: false,\n notApplicable: false\n });\n\n // Disable controls again\n this.editForm.get('name')?.disable();\n this.editForm.get('type')?.disable();\n\n // Mark form as touched\n Object.keys(this.editForm.controls).forEach(key => {\n this.editForm.get(key)?.markAsTouched();\n });\n\n this.showOfficialColumns = false;\n }\n\n private filterOfficialColumns(): void {\n // Filter out columns that already have templates with the same name\n this.availableOfficialColumns = this.officialSdrfColumns.filter(officialCol => {\n return !this.templates.some(template =>\n template.columnName.toLowerCase() === officialCol.name.toLowerCase()\n );\n });\n }\n\n private getDefaultOntologyTypeForColumn(columnName: string): string {\n const lowerName = columnName.toLowerCase();\n\n // Based on backend configure_ontology_options method - use exact matches\n switch (lowerName) {\n case 'characteristics[organism]':\n return 'species';\n case 'characteristics[disease]':\n return 'human_disease';\n case 'characteristics[organism part]':\n return 'tissue';\n case 'characteristics[cell type]':\n return 'cell_ontology';\n case 'comment[instrument]':\n return 'ms_unique_vocabularies';\n case 'comment[modification parameters]':\n return 'unimod';\n case 'comment[ms2 analyzer type]':\n return 'ms_unique_vocabularies';\n case 'comment[cleavage agent details]':\n return 'ms_unique_vocabularies';\n case 'characteristics[ancestry category]':\n return 'ms_unique_vocabularies';\n case 'characteristics[sex]':\n return 'ms_unique_vocabularies';\n case 'characteristics[developmental stage]':\n return 'ms_unique_vocabularies';\n case 'comment[label]':\n return 'ms_unique_vocabularies';\n default:\n return '';\n }\n }\n\n private shouldEnableTypeaheadForColumn(columnName: string): boolean {\n const ontologyType = this.getDefaultOntologyTypeForColumn(columnName);\n return ontologyType.length > 0;\n }\n\n private isColumnMandatory(columnName: string): boolean {\n const lowerName = columnName.toLowerCase();\n\n switch (lowerName) {\n case 'source name':\n case 'characteristics[organism]':\n case 'characteristics[disease]':\n case 'characteristics[organism part]':\n case 'characteristics[cell type]':\n case 'assay name':\n case 'comment[fraction identifier]':\n case 'comment[label]':\n case 'comment[data file]':\n case 'comment[instrument]':\n case 'comment[technical replicate]':\n case 'characteristics[biological replicate]':\n return true;\n default:\n return false;\n }\n }\n\n\n // Template swapping methods\n showTemplateSwapOptions(): void {\n if (!this.isEdit) return;\n\n this.showTemplateSwap = true;\n this.loadColumnTemplates();\n }\n\n swapToTemplate(template: MetadataColumnTemplate): void {\n this.selectedTemplate = template;\n this.selectedTemplateId = template.id;\n\n // Update form with template data, preserving current value\n const currentValue = this.editForm.get('value')?.value || '';\n\n // Enable controls to update values, then disable again\n this.editForm.get('name')?.enable();\n this.editForm.get('type')?.enable();\n\n const ontologyTypeIndex = template.ontologyType\n ? this.ontologyTypes.findIndex(o => o.value === template.ontologyType)\n : 0;\n\n this.editForm.patchValue({\n name: template.columnName,\n type: template.columnType,\n value: currentValue,\n ontologyType: ontologyTypeIndex >= 0 ? ontologyTypeIndex.toString() : '0',\n enableTypeahead: template.enableTypeahead || false,\n mandatory: this.editForm.get('mandatory')?.value || false,\n hidden: this.editForm.get('hidden')?.value || false,\n readonly: this.editForm.get('readonly')?.value || false,\n notApplicable: this.editForm.get('notApplicable')?.value || false\n });\n\n // Disable controls again\n this.editForm.get('name')?.disable();\n this.editForm.get('type')?.disable();\n\n // Mark form as touched\n Object.keys(this.editForm.controls).forEach(key => {\n this.editForm.get(key)?.markAsTouched();\n });\n\n this.showTemplateSwap = false;\n }\n\n showCreateCustomTemplateOption(): void {\n this.showCreateCustomTemplate = true;\n }\n\n createCustomTemplate(): void {\n // This would open a new modal to create a custom template\n // For now, we'll just enable manual editing\n this.editForm.get('name')?.enable();\n this.showCreateCustomTemplate = false;\n\n // Show info message\n alert('Custom template creation would open a new dialog. For now, you can manually edit the column name.');\n }\n\n cancelTemplateSwap(): void {\n this.showTemplateSwap = false;\n this.showCreateCustomTemplate = false;\n }\n\n // Toggle advanced mode\n toggleAdvancedMode(): void {\n this.showAdvancedMode.set(!this.showAdvancedMode());\n\n // Reset ontology type when disabling advanced mode\n if (!this.showAdvancedMode()) {\n this.editForm.patchValue({\n ontologyType: '0',\n enableTypeahead: false\n });\n this.selectedOntologyConfig = null;\n }\n }\n\n // Handle ontology type selection change\n onOntologyTypeChange(event: Event): void {\n const selectElement = event.target as HTMLSelectElement;\n const selectedIndex = parseInt(selectElement.value);\n this.selectedOntologyConfig = this.ontologyTypes[selectedIndex] || null;\n }\n\n private getCorrectedColumnType(columnName: string, columnType: string): string {\n const syntaxType = this.sdrfSyntaxService.detectSpecialSyntax(columnName, columnType);\n if (syntaxType) {\n // Return a specific type based on SDRF syntax detection\n switch (syntaxType) {\n case 'age':\n return 'characteristics[age]';\n case 'modification':\n return 'comment[modification parameters]';\n case 'cleavage':\n return 'comment[cleavage agent details]';\n case 'spiked_compound':\n return 'characteristics[spiked compound]';\n default:\n return columnType;\n }\n }\n return columnType;\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-columns-gap me-2\"></i>{{ title }}\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"onCancel()\"></button>\n</div>\n\n<div class=\"modal-body\">\n <form [formGroup]=\"editForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"row\">\n <!-- Selection Required Notice for New Columns -->\n @if (!isEdit) {\n <div class=\"col-12 mb-3\">\n <div class=\"alert alert-warning\">\n <h6 class=\"alert-heading\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>Column Selection Required\n </h6>\n <p class=\"mb-0\">\n You must select from official SDRF columns or existing templates to ensure data compliance and consistency.\n </p>\n </div>\n </div>\n }\n\n <!-- Official SDRF Columns -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-file-earmark-check me-2\"></i>Official SDRF Columns\n <small class=\"text-muted ms-2\">\n @if (!isEdit) {\n (Step 1: Select from standardized SDRF-Proteomics column names)\n } @else {\n (Recommended - select from standardized SDRF-Proteomics column names)\n }\n </small>\n </h6>\n </div>\n\n @if (!isEdit) {\n <div class=\"col-12 mb-3\">\n @if (!showOfficialColumns) {\n <button\n type=\"button\"\n class=\"btn btn-primary mb-3\"\n (click)=\"toggleOfficialColumns()\">\n <i class=\"bi bi-list-ul me-2\"></i>\n Select from Official SDRF Columns\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary mb-3\"\n (click)=\"toggleOfficialColumns()\">\n <i class=\"bi bi-x me-2\"></i>\n Hide Official Columns\n </button>\n }\n </div>\n } @else {\n <div class=\"col-12 mb-3\">\n <button\n type=\"button\"\n class=\"btn btn-outline-info mb-3\"\n (click)=\"toggleOfficialColumns()\">\n <i class=\"bi bi-list-ul me-2\"></i>\n {{ showOfficialColumns ? 'Hide' : 'Show' }} Official Column Names\n </button>\n </div>\n }\n\n @if (showOfficialColumns) {\n <div class=\"col-12 mb-3\">\n <div class=\"border rounded p-3\">\n <p class=\"mb-3 text-muted\">\n <i class=\"bi bi-info-circle me-2\"></i>\n Select from official SDRF-Proteomics column names. Only columns without existing templates are shown.\n </p>\n\n @if (availableOfficialColumns.length === 0) {\n <div class=\"alert alert-warning\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\n All official SDRF columns already have templates created.\n </div>\n } @else {\n <div class=\"row\">\n @for (column of availableOfficialColumns; track column.name) {\n <div class=\"col-md-6 mb-2\">\n <div class=\"card h-100 cursor-pointer border-info\"\n (click)=\"selectOfficialColumn(column)\"\n [class.border-primary]=\"selectedOfficialColumn?.name === column.name\">\n <div class=\"card-body py-2\">\n <h6 class=\"card-title mb-1 font-monospace\">\n {{ column.name }}\n </h6>\n <p class=\"card-text small mb-1\">\n <span class=\"badge\"\n [class]=\"column.type === 'characteristics' ? 'bg-primary' :\n column.type === 'comment' ? 'bg-success' :\n column.type === 'factor_value' ? 'bg-warning' : 'bg-secondary'\">\n {{ column.type }}\n </span>\n </p>\n <p class=\"card-text small mb-0\">{{ column.description }}</p>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Template Swapping for Edit Mode -->\n @if (isEdit && showTemplateSwap) {\n <div class=\"col-12 mb-3\">\n <div class=\"alert alert-info\">\n <h6 class=\"alert-heading\">\n <i class=\"bi bi-arrow-left-right me-2\"></i>Swap to Different Template\n </h6>\n <p class=\"mb-3\">\n Choose a different template to change the column name and settings. Your current value will be preserved.\n </p>\n\n <div class=\"mb-3\">\n <input\n type=\"text\"\n class=\"form-control mb-2\"\n placeholder=\"Search templates...\"\n [(ngModel)]=\"templateFilter\"\n [ngModelOptions]=\"{standalone: true}\"\n (input)=\"onTemplateFilterChange()\">\n\n <select\n class=\"form-select mb-3\"\n size=\"4\"\n [disabled]=\"isLoadingTemplates\">\n @if (isLoadingTemplates) {\n <option value=\"\" disabled>Loading templates...</option>\n } @else {\n @for (template of templates; track template.id) {\n <option\n [value]=\"template.id\"\n (click)=\"swapToTemplate(template)\"\n style=\"cursor: pointer;\">\n {{ template.columnName }} - {{ template.columnType }}@if (template.ontologyType) { ({{ getOntologyTypeLabel(template.ontologyType) }})}\n </option>\n }\n }\n </select>\n </div>\n\n <div class=\"d-flex justify-content-between\">\n <button\n type=\"button\"\n class=\"btn btn-success\"\n (click)=\"showCreateCustomTemplateOption()\">\n <i class=\"bi bi-plus-circle me-1\"></i>Create Custom Template\n </button>\n <button\n type=\"button\"\n class=\"btn btn-secondary\"\n (click)=\"cancelTemplateSwap()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Custom Template Creation Option -->\n @if (isEdit && showCreateCustomTemplate) {\n <div class=\"col-12 mb-3\">\n <div class=\"alert alert-warning\">\n <h6 class=\"alert-heading\">\n <i class=\"bi bi-plus-circle me-2\"></i>Create Custom Template\n </h6>\n <p class=\"mb-3\">\n This will create a new custom template with your desired column name and settings.\n </p>\n\n <div class=\"d-flex justify-content-between\">\n <button\n type=\"button\"\n class=\"btn btn-warning\"\n (click)=\"createCustomTemplate()\">\n <i class=\"bi bi-gear me-1\"></i>Create & Apply Template\n </button>\n <button\n type=\"button\"\n class=\"btn btn-secondary\"\n (click)=\"cancelTemplateSwap()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Template Selection -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>Template Selection\n <small class=\"text-muted ms-2\">\n @if (!isEdit) {\n (Step 2: Or select from existing templates)\n } @else {\n (Optional - select a template to auto-fill column settings)\n }\n </small>\n </h6>\n </div>\n\n <div class=\"col-12 mb-3\">\n <div class=\"input-group mb-3\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-search\"></i>\n </span>\n <input \n type=\"text\" \n class=\"form-control\" \n placeholder=\"Search column templates...\"\n [(ngModel)]=\"templateFilter\"\n [ngModelOptions]=\"{standalone: true}\"\n (input)=\"onTemplateFilterChange()\">\n @if (templateFilter) {\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"clearTemplateFilter()\">\n <i class=\"bi bi-x\"></i>\n </button>\n }\n </div>\n\n <select \n class=\"form-select mb-3\"\n size=\"5\"\n [(ngModel)]=\"selectedTemplateId\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"onTemplateSelectionChange()\"\n [disabled]=\"isLoadingTemplates\">\n <option value=\"\">No template selected</option>\n @if (isLoadingTemplates) {\n <option value=\"\" disabled>Loading templates...</option>\n } @else {\n @for (template of templates; track template.id) {\n <option [value]=\"template.id\">\n {{ template.columnName }} - {{ template.columnType }}@if (template.ontologyType) { ({{ getOntologyTypeLabel(template.ontologyType) }})}\n </option>\n }\n }\n </select>\n\n @if (totalTemplatePages > 1) {\n <div class=\"d-flex justify-content-between align-items-center\">\n <small class=\"text-muted\">\n Showing {{ (currentTemplatePage - 1) * templatePageSize + 1 }}-{{ Math.min(currentTemplatePage * templatePageSize, totalTemplates) }}\n of {{ totalTemplates }}\n </small>\n <ngb-pagination\n [collectionSize]=\"totalTemplates\"\n [page]=\"currentTemplatePage\"\n [pageSize]=\"templatePageSize\"\n [maxSize]=\"3\"\n [boundaryLinks]=\"true\"\n [rotate]=\"true\"\n (pageChange)=\"onTemplatePageChange($event)\"\n class=\"pagination-sm mb-0\">\n </ngb-pagination>\n </div>\n }\n\n @if (selectedTemplate) {\n <div class=\"alert alert-info mt-3\">\n <i class=\"bi bi-info-circle me-2\"></i>\n Template \"{{ selectedTemplate.name }}\" selected. Settings will be applied automatically.\n <button type=\"button\" class=\"btn btn-sm btn-outline-info float-end\" (click)=\"clearTemplate()\">\n Clear Selection\n </button>\n </div>\n }\n </div>\n\n <!-- Manual Entry -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-pencil me-2\"></i>Column Details\n @if (selectedTemplate) {\n <small class=\"text-muted ms-2\">(Auto-filled from template - you can modify as needed)</small>\n }\n </h6>\n </div>\n \n <div class=\"col-12 mb-3\">\n <label for=\"columnName\" class=\"form-label\">\n Column Name *\n <span class=\"text-muted ms-2\">\n <i class=\"bi bi-info-circle\"></i>\n Column names are managed through templates\n </span>\n </label>\n <div class=\"input-group\">\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"columnName\"\n formControlName=\"name\"\n [class.is-invalid]=\"editForm.get('name')?.invalid && editForm.get('name')?.touched\"\n readonly\n placeholder=\"Select from official columns or templates below\">\n @if (isEdit) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"showTemplateSwapOptions()\"\n title=\"Change to different template\">\n <i class=\"bi bi-arrow-left-right\"></i> Swap Template\n </button>\n }\n </div>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>\n @if (isEdit) {\n To change the column name, swap to a different template or create a new custom template.\n } @else {\n Select from official SDRF columns or existing templates below to ensure compliance.\n }\n </div>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"columnType\" class=\"form-label\">\n Column Type *\n <span class=\"text-muted ms-2\">\n <i class=\"bi bi-info-circle\"></i>\n Managed through templates\n </span>\n </label>\n <select\n class=\"form-select\"\n id=\"columnType\"\n formControlName=\"type\"\n [class.is-invalid]=\"editForm.get('type')?.invalid && editForm.get('type')?.touched\">\n @for (type of columnTypes; track type.value) {\n <option [value]=\"type.value\">{{ type.label }}</option>\n }\n </select>\n </div>\n\n <!-- Advanced Mode Toggle -->\n <div class=\"col-12 mb-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"advancedMode\"\n [checked]=\"showAdvancedMode()\"\n (change)=\"toggleAdvancedMode()\">\n <label class=\"form-check-label\" for=\"advancedMode\">\n <i class=\"bi bi-gear me-1\"></i>Advanced Mode\n </label>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>\n Show advanced options for ontology configuration and column settings\n </div>\n </div>\n </div>\n\n @if (showAdvancedMode()) {\n <div class=\"col-md-6 mb-3\">\n <label for=\"ontologyType\" class=\"form-label\">\n Ontology Type\n <span class=\"badge bg-warning ms-2\">\n <i class=\"bi bi-exclamation-triangle me-1\"></i>Advanced\n </span>\n </label>\n <select\n class=\"form-select\"\n id=\"ontologyType\"\n formControlName=\"ontologyType\"\n (change)=\"onOntologyTypeChange($event)\">\n @for (ontology of ontologyTypes; track $index) {\n <option [value]=\"$index\">{{ ontology.label }}</option>\n }\n </select>\n\n @if (hasOntologyType) {\n <div class=\"form-text mt-2\">\n <i class=\"bi bi-info-circle me-1\"></i>\n Custom ontology filters will be applied based on the selected type\n </div>\n }\n </div>\n\n @if (hasOntologyType) {\n <div class=\"col-12 mb-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"enableTypeahead\"\n formControlName=\"enableTypeahead\">\n <label class=\"form-check-label\" for=\"enableTypeahead\">\n <i class=\"bi bi-search me-1\"></i>Enable Typeahead Autocomplete\n </label>\n <div class=\"form-text\">\n <i class=\"bi bi-info-circle me-1\"></i>\n Enable autocomplete suggestions from {{ selectedOntologyConfig?.label || 'selected' }} ontology when editing values\n </div>\n </div>\n </div>\n }\n\n <!-- Column Options - Advanced Mode Only -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-sliders me-2\"></i>Column Options\n <span class=\"badge bg-warning ms-2\">\n <i class=\"bi bi-exclamation-triangle me-1\"></i>Advanced\n </span>\n </h6>\n </div>\n\n <div class=\"col-12 mb-3\">\n <div class=\"row\">\n <div class=\"col-md-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"mandatory\"\n formControlName=\"mandatory\">\n <label class=\"form-check-label\" for=\"mandatory\">\n <i class=\"bi bi-exclamation-circle me-1\"></i>Mandatory\n </label>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"hidden\"\n formControlName=\"hidden\">\n <label class=\"form-check-label\" for=\"hidden\">\n <i class=\"bi bi-eye-slash me-1\"></i>Hidden\n </label>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"readonly\"\n formControlName=\"readonly\">\n <label class=\"form-check-label\" for=\"readonly\">\n <i class=\"bi bi-lock me-1\"></i>Read Only\n </label>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"notApplicable\"\n formControlName=\"notApplicable\">\n <label class=\"form-check-label\" for=\"notApplicable\">\n <i class=\"bi bi-dash-circle me-1\"></i>N/A\n </label>\n </div>\n </div>\n </div>\n </div>\n }\n\n <div class=\"col-12 mb-3\">\n <label for=\"defaultValue\" class=\"form-label\">\n Default Value\n @if (hasTypeaheadEnabled) {\n <span class=\"badge bg-success ms-2\">\n <i class=\"bi bi-search me-1\"></i>Typeahead Enabled\n </span>\n }\n </label>\n \n <div class=\"input-group\">\n <input \n type=\"text\" \n class=\"form-control\"\n id=\"defaultValue\"\n formControlName=\"value\"\n placeholder=\"Enter default value\"\n readonly>\n <button \n type=\"button\" \n class=\"btn btn-outline-primary\"\n (click)=\"openValueEditModal()\"\n title=\"Open advanced value editor\">\n <i class=\"bi bi-pencil me-1\"></i>Edit\n </button>\n </div>\n \n <div class=\"form-text\">\n @if (hasTypeaheadEnabled) {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to use autocomplete suggestions from {{ selectedOntologyConfig?.label || 'selected' }} ontology\n } @else if (hasOntologyType) {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to set default value. Enable typeahead in Advanced Mode for autocomplete suggestions.\n } @else if (showAdvancedMode()) {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to set the default value (select an ontology type above for smart suggestions)\n } @else {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to set the default value (enable Advanced Mode for ontology autocomplete)\n }\n </div>\n </div>\n\n </div>\n </form>\n</div>\n\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"onCancel()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn btn-primary\" \n (click)=\"onSubmit()\"\n [disabled]=\"editForm.invalid || isLoading()\">\n @if (isLoading()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-check-circle me-1\"></i>\n {{ isEdit ? 'Update' : 'Add' }} Column\n </button>\n</div>\n","import { Component, Input, Output, EventEmitter, OnInit, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbActiveModal, NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { LabGroup, ResourceVisibility } from '@noatgnu/cupcake-core';\nimport { MetadataTableTemplate, MetadataColumn } from '../../../models';\nimport { MetadataTableTemplateService } from '../../../services/metadata-table-template';\nimport { ColumnEditModal } from '../column-edit-modal/column-edit-modal';\nimport { ToastService } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-metadata-table-template-edit-modal',\n imports: [CommonModule, ReactiveFormsModule, NgbModule, DragDropModule],\n templateUrl: './metadata-table-template-edit-modal.html',\n styleUrl: './metadata-table-template-edit-modal.scss'\n})\nexport class MetadataTableTemplateEditModal implements OnInit {\n @Input() template: MetadataTableTemplate | null = null;\n @Input() labGroups: LabGroup[] = [];\n @Input() isEdit = false;\n @Output() templateSaved = new EventEmitter<Partial<MetadataTableTemplate>>();\n\n editForm: FormGroup;\n isLoading = signal(false);\n \n // Column management\n _templateColumns = signal<MetadataColumn[]>([]);\n templateColumns = computed(() => {\n // Sort columns by position, then by name+type for grouping same columns together\n return this._templateColumns().sort((a, b) => {\n if (a.columnPosition !== b.columnPosition) {\n return (a.columnPosition || 0) - (b.columnPosition || 0);\n }\n // Secondary sort: group columns with same name and type together\n const aKey = `${a.name}_${a.type}`;\n const bKey = `${b.name}_${b.type}`;\n return aKey.localeCompare(bKey);\n });\n });\n\n // Available options for dropdowns\n visibilityOptions = [\n { value: ResourceVisibility.PRIVATE, label: 'Private' },\n { value: ResourceVisibility.GROUP, label: 'Lab Group' },\n { value: ResourceVisibility.PUBLIC, label: 'Public' }\n ];\n\n constructor(\n private fb: FormBuilder,\n private activeModal: NgbActiveModal,\n private modalService: NgbModal,\n private metadataTableTemplateService: MetadataTableTemplateService,\n private toastService: ToastService\n ) {\n this.editForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(3)]],\n description: [''],\n visibility: [ResourceVisibility.PRIVATE],\n isDefault: [false],\n labGroupId: [null]\n });\n }\n\n ngOnInit() {\n if (this.template && this.isEdit) {\n this.populateForm();\n }\n }\n\n private populateForm() {\n if (this.template) {\n const labGroupId = this.template.labGroup;\n \n this.editForm.patchValue({\n name: this.template.name,\n description: this.template.description || '',\n visibility: this.template.visibility || ResourceVisibility.PRIVATE,\n isDefault: this.template.isDefault || false,\n labGroupId: labGroupId || null\n });\n \n // Load existing columns if editing\n if (this.template.userColumns) {\n this._templateColumns.set([...this.template.userColumns]);\n }\n }\n }\n\n onSubmit() {\n if (this.editForm.valid) {\n this.isLoading.set(true);\n const formValue = this.editForm.value;\n \n // Clean up form data\n const templateData: Partial<MetadataTableTemplate> = {\n name: formValue.name,\n description: formValue.description || '',\n visibility: formValue.visibility || ResourceVisibility.PRIVATE,\n isDefault: formValue.isDefault || false,\n labGroup: formValue.labGroupId || null,\n // Include updated columns\n userColumns: this._templateColumns(),\n // Keep existing field mapping if editing\n ...(this.template && {\n fieldMaskMapping: this.template.fieldMaskMapping\n })\n };\n\n this.templateSaved.emit(templateData);\n } else {\n this.markFormGroupTouched();\n }\n }\n\n private markFormGroupTouched() {\n Object.keys(this.editForm.controls).forEach(key => {\n const control = this.editForm.get(key);\n control?.markAsTouched();\n });\n }\n\n onCancel() {\n this.activeModal.dismiss();\n }\n\n onClose() {\n this.isLoading.set(false);\n this.activeModal.close();\n }\n\n getFieldError(fieldName: string): string {\n const control = this.editForm.get(fieldName);\n if (control?.errors && control.touched) {\n if (control.errors['required']) return `${fieldName} is required`;\n if (control.errors['minlength']) return `${fieldName} must be at least ${control.errors['minlength'].requiredLength} characters`;\n }\n return '';\n }\n\n get title(): string {\n return this.isEdit ? 'Edit Table Template' : 'Create Table Template';\n }\n\n // Column Management Methods\n\n addColumn() {\n this.openColumnModal(null, false);\n }\n\n addColumnWithAutoReorder() {\n // Only available for existing templates\n if (!this.isEdit || !this.template?.id) {\n this.toastService.error('Auto-reorder is only available for existing templates');\n return;\n }\n this.openColumnModal(null, false, true);\n }\n\n editColumn(column: MetadataColumn) {\n this.openColumnModal(column, true);\n }\n\n duplicateColumn(column: MetadataColumn) {\n const currentColumns = this._templateColumns();\n const newColumn: MetadataColumn = {\n ...column,\n id: this.generateTempId(), // Generate temporary ID for tracking\n name: `${column.name} (Copy)`,\n columnPosition: this.getNextPositionForSameType(column)\n };\n\n // Add the duplicated column right after columns with same name/type\n const updatedColumns = [...currentColumns, newColumn];\n this.normalizeColumnPositions(updatedColumns);\n this._templateColumns.set(updatedColumns);\n }\n\n removeColumn(column: MetadataColumn) {\n const confirmMessage = `Are you sure you want to remove the column \"${column.name}\"?`;\n \n if (confirm(confirmMessage)) {\n const currentColumns = this._templateColumns();\n const updatedColumns = currentColumns.filter(col => col.id !== column.id);\n this.normalizeColumnPositions(updatedColumns);\n this._templateColumns.set(updatedColumns);\n }\n }\n\n onColumnDrop(event: CdkDragDrop<MetadataColumn[]>) {\n // If dropped in the same position, no action needed\n if (event.previousIndex === event.currentIndex) {\n return;\n }\n\n const currentColumns = [...this._templateColumns()];\n \n // Move the item in the array\n moveItemInArray(currentColumns, event.previousIndex, event.currentIndex);\n \n // Normalize positions and ensure same name/type grouping\n this.normalizeColumnPositions(currentColumns);\n this.enforceGrouping(currentColumns);\n \n this._templateColumns.set(currentColumns);\n }\n\n private openColumnModal(column: MetadataColumn | null, isEdit: boolean, useAutoReorder: boolean = false) {\n const modalRef = this.modalService.open(ColumnEditModal, {\n size: 'lg',\n backdrop: 'static',\n keyboard: false\n });\n\n modalRef.componentInstance.column = column;\n modalRef.componentInstance.templateId = this.template?.id || null;\n modalRef.componentInstance.isEdit = isEdit;\n\n modalRef.componentInstance.columnSaved.subscribe((columnData: Partial<MetadataColumn>) => {\n if (useAutoReorder && this.template?.id) {\n this.handleColumnSaveWithAutoReorder(columnData);\n } else {\n this.handleColumnSave(columnData, column, isEdit);\n }\n modalRef.componentInstance.onClose();\n });\n }\n\n private handleColumnSave(columnData: Partial<MetadataColumn>, originalColumn: MetadataColumn | null, isEdit: boolean) {\n const currentColumns = this._templateColumns();\n \n if (isEdit && originalColumn) {\n // Update existing column\n const updatedColumns = currentColumns.map(col => \n col.id === originalColumn.id \n ? { ...col, ...columnData }\n : col\n );\n \n // Check if name/type changed and needs regrouping\n if (columnData.name !== originalColumn.name || columnData.type !== originalColumn.type) {\n this.enforceGrouping(updatedColumns);\n }\n \n this.normalizeColumnPositions(updatedColumns);\n this._templateColumns.set(updatedColumns);\n } else {\n // Add new column\n const newColumn: MetadataColumn = {\n ...columnData as MetadataColumn,\n id: this.generateTempId(),\n columnPosition: this.getNextPositionForNameType(columnData.name!, columnData.type!)\n };\n \n const updatedColumns = [...currentColumns, newColumn];\n this.enforceGrouping(updatedColumns);\n this.normalizeColumnPositions(updatedColumns);\n this._templateColumns.set(updatedColumns);\n }\n }\n\n private handleColumnSaveWithAutoReorder(columnData: Partial<MetadataColumn>): void {\n if (!this.template?.id) {\n this.toastService.error('Template ID not found');\n return;\n }\n\n this.isLoading.set(true);\n \n this.metadataTableTemplateService.addColumnWithAutoReorder(this.template.id, {\n columnData: columnData\n }).subscribe({\n next: (response: { message: string; column: any; reordered: boolean; schemaIdsUsed: number[] }) => {\n this.isLoading.set(false);\n \n // Refresh the template data by reloading it\n this.reloadTemplateColumns();\n \n // Show success message with reordering info\n let message = `Column \"${response.column.name}\" added successfully!`;\n if (response.reordered) {\n message += ` Columns reordered using ${response.schemaIdsUsed.length} schema(s).`;\n }\n \n this.toastService.success(message);\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error adding column with auto-reorder:', error);\n this.toastService.error('Failed to add column with auto-reorder');\n }\n });\n }\n\n private reloadTemplateColumns(): void {\n if (this.template?.id) {\n this.metadataTableTemplateService.getMetadataTableTemplate(this.template.id).subscribe({\n next: (updatedTemplate) => {\n this._templateColumns.set([...updatedTemplate.userColumns || []]);\n },\n error: (error) => {\n console.error('Error reloading template columns:', error);\n }\n });\n }\n }\n\n private generateTempId(): number {\n // Generate a temporary negative ID for new columns\n const currentColumns = this._templateColumns();\n const minId = Math.min(0, ...currentColumns.map(col => col.id || 0));\n return minId - 1;\n }\n\n private getNextPositionForSameType(column: MetadataColumn): number {\n const currentColumns = this._templateColumns();\n const sameNameTypeColumns = currentColumns.filter(col => \n col.name === column.name && col.type === column.type\n );\n \n if (sameNameTypeColumns.length === 0) {\n return currentColumns.length;\n }\n \n const maxPosition = Math.max(...sameNameTypeColumns.map(col => col.columnPosition || 0));\n return maxPosition + 1;\n }\n\n private getNextPositionForNameType(name: string, type: string): number {\n const currentColumns = this._templateColumns();\n const sameNameTypeColumns = currentColumns.filter(col => \n col.name === name && col.type === type\n );\n \n if (sameNameTypeColumns.length === 0) {\n return currentColumns.length;\n }\n \n const maxPosition = Math.max(...sameNameTypeColumns.map(col => col.columnPosition || 0));\n return maxPosition + 1;\n }\n\n private normalizeColumnPositions(columns: MetadataColumn[]) {\n columns.forEach((col, index) => {\n col.columnPosition = index;\n });\n }\n\n private enforceGrouping(columns: MetadataColumn[]) {\n // Group columns by name+type and ensure they are together\n const groups = new Map<string, MetadataColumn[]>();\n \n columns.forEach(col => {\n const key = `${col.name}_${col.type}`;\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(col);\n });\n \n // Rebuild array with proper grouping\n let position = 0;\n const regroupedColumns: MetadataColumn[] = [];\n \n for (const [key, groupColumns] of groups) {\n // Sort within group by original position to maintain relative order\n groupColumns.sort((a, b) => (a.columnPosition || 0) - (b.columnPosition || 0));\n \n groupColumns.forEach(col => {\n col.columnPosition = position++;\n regroupedColumns.push(col);\n });\n }\n \n // Replace original array contents\n columns.length = 0;\n columns.push(...regroupedColumns);\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>{{ title }}\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"onCancel()\"></button>\n</div>\n\n<div class=\"modal-body\">\n <form [formGroup]=\"editForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"row\">\n <!-- Basic Information -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-info-circle me-2\"></i>Basic Information\n </h6>\n </div>\n \n <div class=\"col-12 mb-3\">\n <label for=\"templateName\" class=\"form-label\">Template Name *</label>\n <input \n type=\"text\" \n class=\"form-control\"\n id=\"templateName\"\n formControlName=\"name\"\n [class.is-invalid]=\"editForm.get('name')?.invalid && editForm.get('name')?.touched\"\n placeholder=\"Enter template name\">\n <div class=\"invalid-feedback\">\n {{ getFieldError('name') }}\n </div>\n </div>\n\n <div class=\"col-12 mb-3\">\n <label for=\"description\" class=\"form-label\">Description</label>\n <textarea \n class=\"form-control\" \n id=\"description\"\n formControlName=\"description\"\n rows=\"3\"\n placeholder=\"Optional description\"></textarea>\n </div>\n\n <!-- Configuration -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-gear me-2\"></i>Configuration\n </h6>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"labGroup\" class=\"form-label\">Lab Group</label>\n <select \n class=\"form-select\"\n id=\"labGroup\"\n formControlName=\"labGroupId\">\n <option [ngValue]=\"null\">No Lab Group</option>\n @for (group of labGroups; track group.id) {\n <option [ngValue]=\"group.id\">{{ group.name }}</option>\n }\n </select>\n </div>\n\n <div class=\"col-12 mb-3\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <label for=\"visibility\" class=\"form-label\">Visibility</label>\n <select \n class=\"form-select\"\n id=\"visibility\"\n formControlName=\"visibility\">\n @for (option of visibilityOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-check form-switch\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n id=\"isDefault\"\n formControlName=\"isDefault\">\n <label class=\"form-check-label\" for=\"isDefault\">\n <i class=\"bi bi-star me-1\"></i>Default Template\n </label>\n <small class=\"form-text text-muted d-block\">Use as default for new projects</small>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Column Management -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-columns-gap me-2\"></i>Template Columns\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary ms-2\" (click)=\"addColumn()\">\n <i class=\"bi bi-plus me-1\"></i>Add Column\n </button>\n @if (isEdit && template?.id) {\n <button type=\"button\" class=\"btn btn-sm btn-success ms-2\" (click)=\"addColumnWithAutoReorder()\" \n [disabled]=\"isLoading()\"\n title=\"Add column with automatic schema-based reordering\">\n <i class=\"bi bi-plus-circle me-1\"></i>Add Column (Auto-Reorder)\n </button>\n }\n </h6>\n </div>\n\n <div class=\"col-12 mb-3\">\n @if (templateColumns().length > 0) {\n <div class=\"table-responsive\">\n <table class=\"table table-sm table-hover\">\n <thead class=\"table-light\">\n <tr>\n <th style=\"width: 40px;\"><i class=\"bi bi-arrows-move\"></i></th>\n <th>Position</th>\n <th>Column Name</th>\n <th>Type</th>\n <th>Default Value</th>\n <th>Options</th>\n <th style=\"width: 120px;\">Actions</th>\n </tr>\n </thead>\n <tbody cdkDropList (cdkDropListDropped)=\"onColumnDrop($event)\" [cdkDropListData]=\"_templateColumns()\">\n @for (column of _templateColumns(); track column.id; let i = $index) {\n <tr cdkDrag [cdkDragData]=\"column\" class=\"column-row\" [attr.data-column-id]=\"column.id\">\n <td class=\"text-center\">\n <i class=\"bi bi-grip-vertical drag-handle\" cdkDragHandle></i>\n </td>\n <td>\n <span class=\"badge bg-secondary\">{{ i + 1 }}</span>\n </td>\n <td>\n <strong>{{ column.name }}</strong>\n </td>\n <td>\n <span class=\"badge bg-info\">{{ column.type }}</span>\n </td>\n <td>\n <span class=\"text-muted\">{{ column.value || '-' }}</span>\n </td>\n <td>\n <div class=\"d-flex gap-1\">\n @if (column.mandatory) {\n <span class=\"badge badge-pill bg-warning\" title=\"Mandatory\">\n <i class=\"bi bi-exclamation-circle\"></i>\n </span>\n }\n @if (column.hidden) {\n <span class=\"badge badge-pill bg-secondary\" title=\"Hidden\">\n <i class=\"bi bi-eye-slash\"></i>\n </span>\n }\n @if (column.readonly) {\n <span class=\"badge badge-pill bg-dark\" title=\"Read Only\">\n <i class=\"bi bi-lock\"></i>\n </span>\n }\n @if (column.ontologyType) {\n <span class=\"badge badge-pill bg-success\" title=\"Has Ontology\">\n <i class=\"bi bi-tags\"></i>\n </span>\n }\n </div>\n </td>\n <td>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button \n type=\"button\"\n class=\"btn btn-outline-primary\" \n (click)=\"editColumn(column)\"\n title=\"Edit column\">\n <i class=\"bi bi-pencil\"></i>\n </button>\n <button \n type=\"button\"\n class=\"btn btn-outline-info\" \n (click)=\"duplicateColumn(column)\"\n title=\"Duplicate column\">\n <i class=\"bi bi-copy\"></i>\n </button>\n <button \n type=\"button\"\n class=\"btn btn-outline-danger\" \n (click)=\"removeColumn(column)\"\n title=\"Remove column\">\n <i class=\"bi bi-trash\"></i>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"text-center py-4 text-muted\">\n <i class=\"bi bi-columns-gap fs-1 mb-2\"></i>\n <p>No columns in this template yet.</p>\n <div class=\"d-flex gap-2 justify-content-center\">\n <button type=\"button\" class=\"btn btn-primary btn-sm\" (click)=\"addColumn()\">\n <i class=\"bi bi-plus me-1\"></i>Add First Column\n </button>\n @if (isEdit && template?.id) {\n <button type=\"button\" class=\"btn btn-success btn-sm\" (click)=\"addColumnWithAutoReorder()\" \n [disabled]=\"isLoading()\"\n title=\"Add column with automatic schema-based reordering\">\n <i class=\"bi bi-plus-circle me-1\"></i>Add with Auto-Reorder\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </form>\n</div>\n\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"onCancel()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn btn-primary\" \n (click)=\"onSubmit()\"\n [disabled]=\"editForm.invalid || isLoading()\">\n @if (isLoading()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-check-circle me-1\"></i>\n {{ isEdit ? 'Update' : 'Create' }} Template\n </button>\n</div>\n","import { Component, EventEmitter, Input, Output, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { ResourceVisibility } from '@noatgnu/cupcake-core';\n\nexport interface TemplateSchemaSelectionResult {\n name: string;\n description: string;\n schemaIds: number[];\n labGroupId?: number;\n visibility: ResourceVisibility;\n isDefault: boolean;\n}\n\n@Component({\n selector: 'ccv-template-schema-selection-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './schema-selection-modal.html',\n styleUrl: './schema-selection-modal.scss'\n})\nexport class TemplateSchemaSelectionModal {\n @Input() availableSchemas: any[] = [];\n @Input() labGroups: any[] = [];\n @Output() templateCreated = new EventEmitter<TemplateSchemaSelectionResult>();\n\n templateForm: FormGroup;\n selectedSchemas = signal<Set<number>>(new Set());\n\n // Computed values\n selectedSchemasCount = computed(() => this.selectedSchemas().size);\n\n constructor(\n private fb: FormBuilder,\n public activeModal: NgbActiveModal\n ) {\n this.templateForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(1)]],\n description: [''],\n labGroupId: [null],\n visibility: [ResourceVisibility.PRIVATE],\n isDefault: [false]\n });\n }\n\n toggleSchema(schemaId: number) {\n const current = this.selectedSchemas();\n const updated = new Set(current);\n \n if (updated.has(schemaId)) {\n updated.delete(schemaId);\n } else {\n updated.add(schemaId);\n }\n \n this.selectedSchemas.set(updated);\n this.updateDescription();\n }\n\n onSchemaCheckChange(event: Event, schemaId: number) {\n // Prevent event propagation to avoid double-toggle from card click\n event.stopPropagation();\n // Toggle the schema selection when checkbox is clicked\n this.toggleSchema(schemaId);\n }\n\n isSchemaSelected(schemaId: number): boolean {\n return this.selectedSchemas().has(schemaId);\n }\n\n getSelectedSchemas(): number[] {\n return [...this.selectedSchemas()];\n }\n\n removeSchema(schemaId: number) {\n const current = this.selectedSchemas();\n const updated = new Set(current);\n updated.delete(schemaId);\n this.selectedSchemas.set(updated);\n this.updateDescription();\n }\n\n getSchemaDisplayName(schemaId: number): string {\n const schema = this.availableSchemas.find(s => s.id === schemaId);\n return schema?.displayName || schema?.name || `Schema ${schemaId}`;\n }\n\n private updateDescription() {\n const selectedSchemas = this.getSelectedSchemas();\n if (selectedSchemas.length > 0 && !this.templateForm.get('description')?.dirty) {\n const schemaNames = selectedSchemas.map(id => this.getSchemaDisplayName(id)).join(', ');\n this.templateForm.patchValue({\n description: `Template created from schemas: ${schemaNames}`\n });\n }\n }\n\n canCreateTemplate(): boolean {\n const formValid = this.templateForm.valid;\n const hasSchemas = this.selectedSchemasCount() > 0;\n \n // Debug logging\n if (!formValid) {\n console.log('Form errors:', this.templateForm.errors);\n console.log('Form controls errors:', Object.keys(this.templateForm.controls).reduce((acc, key) => {\n const control = this.templateForm.get(key);\n if (control?.errors) {\n acc[key] = control.errors;\n }\n return acc;\n }, {} as any));\n }\n \n console.log('canCreateTemplate:', { formValid, hasSchemas, result: formValid && hasSchemas });\n return formValid && hasSchemas;\n }\n\n onCreateTemplate() {\n if (!this.canCreateTemplate()) {\n // Mark all fields as touched to show validation errors\n this.templateForm.markAllAsTouched();\n return;\n }\n\n const formValue = this.templateForm.value;\n const result: TemplateSchemaSelectionResult = {\n name: formValue.name,\n description: formValue.description || '',\n schemaIds: this.getSelectedSchemas(),\n labGroupId: formValue.labGroupId || undefined,\n visibility: formValue.visibility || ResourceVisibility.PRIVATE,\n isDefault: formValue.isDefault || false\n };\n\n this.templateCreated.emit(result);\n }\n\n onCancel() {\n this.activeModal.dismiss();\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-file-earmark-plus me-2\"></i>Create Template from Schemas\n </h4>\n <button\n type=\"button\"\n class=\"btn-close\"\n aria-label=\"Close\"\n (click)=\"onCancel()\">\n </button>\n</div>\n\n<div class=\"modal-body\">\n <form [formGroup]=\"templateForm\" class=\"needs-validation\" novalidate>\n <!-- Template Basic Information -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-info-circle me-1\"></i>Template Information\n </h6>\n </div>\n <div class=\"card-body\">\n <div class=\"row\">\n <div class=\"col-12 mb-3\">\n <div class=\"form-floating\">\n <input\n type=\"text\"\n class=\"form-control\"\n [class.is-invalid]=\"templateForm.get('name')?.invalid && templateForm.get('name')?.touched\"\n id=\"templateName\"\n formControlName=\"name\"\n placeholder=\"Enter template name\">\n <label for=\"templateName\">Template Name *</label>\n @if (templateForm.get('name')?.invalid && templateForm.get('name')?.touched) {\n <div class=\"invalid-feedback\">\n Template name is required.\n </div>\n }\n </div>\n </div>\n <div class=\"col-12 mb-3\">\n <div class=\"form-floating\">\n <textarea\n class=\"form-control\"\n id=\"templateDescription\"\n formControlName=\"description\"\n style=\"height: 80px\"\n placeholder=\"Enter template description\">\n </textarea>\n <label for=\"templateDescription\">Description</label>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Schema Selection -->\n <div class=\"card mb-4\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-check2-square me-1\"></i>Select Schemas\n </h6>\n <small class=\"text-muted\">{{ selectedSchemasCount() }} selected</small>\n </div>\n <div class=\"card-body\">\n @if (availableSchemas.length === 0) {\n <div class=\"text-center text-muted py-3\">\n <i class=\"bi bi-exclamation-triangle fs-4 d-block mb-2\"></i>\n No schemas available\n </div>\n } @else {\n <div class=\"row\">\n @for (schema of availableSchemas; track schema.id) {\n <div class=\"col-md-6 mb-2\">\n <div class=\"card schema-card\"\n [class.selected]=\"isSchemaSelected(schema.id)\"\n (click)=\"toggleSchema(schema.id)\">\n <div class=\"card-body p-3\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n [id]=\"'schema-' + schema.id\"\n [checked]=\"isSchemaSelected(schema.id)\"\n (change)=\"onSchemaCheckChange($event, schema.id)\">\n <label class=\"form-check-label w-100\" [for]=\"'schema-' + schema.id\">\n <div class=\"d-flex justify-content-between align-items-start\">\n <div class=\"flex-grow-1\">\n <strong class=\"schema-title\">{{ schema.displayName }}</strong>\n @if (schema.description) {\n <p class=\"schema-description text-muted small mb-1\">\n {{ schema.description }}\n </p>\n }\n <div class=\"schema-metadata\">\n @if (schema.tags && schema.tags.length > 0) {\n @for (tag of schema.tags; track tag) {\n <span class=\"badge bg-secondary me-1\">{{ tag }}</span>\n }\n }\n @if (schema.usage_count > 0) {\n <small class=\"text-muted\">\n <i class=\"bi bi-graph-up me-1\"></i>{{ schema.usage_count }} uses\n </small>\n }\n </div>\n </div>\n </div>\n </label>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (selectedSchemasCount() === 0) {\n <div class=\"alert alert-warning mt-3\" role=\"alert\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\n Please select at least one schema to create a template.\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Template Settings -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-gear me-1\"></i>Template Settings\n </h6>\n </div>\n <div class=\"card-body\">\n <div class=\"row\">\n <div class=\"col-md-6 mb-3\">\n <div class=\"form-floating\">\n <select\n class=\"form-select\"\n id=\"labGroup\"\n formControlName=\"labGroupId\">\n <option [ngValue]=\"null\">No Lab Group</option>\n @for (group of labGroups; track group.id) {\n <option [ngValue]=\"group.id\">{{ group.name }}</option>\n }\n </select>\n <label for=\"labGroup\">Lab Group</label>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"form-check form-switch mb-3\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"isDefault\"\n formControlName=\"isDefault\">\n <label class=\"form-check-label\" for=\"isDefault\">\n <i class=\"bi bi-star me-1\"></i>Default Template\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Preview Section -->\n @if (selectedSchemasCount() > 0) {\n <div class=\"card\">\n <div class=\"card-header\">\n <h6 class=\"mb-0\">\n <i class=\"bi bi-eye me-1\"></i>Selected Schemas Preview\n </h6>\n </div>\n <div class=\"card-body\">\n <div class=\"d-flex flex-wrap gap-2\">\n @for (schemaId of getSelectedSchemas(); track schemaId) {\n <span class=\"badge bg-primary fs-6 py-2 px-3\">\n {{ getSchemaDisplayName(schemaId) }}\n <button\n type=\"button\"\n class=\"btn-close btn-close-white ms-2\"\n style=\"font-size: 0.6em;\"\n (click)=\"removeSchema(schemaId)\"\n [attr.aria-label]=\"'Remove ' + getSchemaDisplayName(schemaId)\">\n </button>\n </span>\n }\n </div>\n <p class=\"text-muted small mt-2 mb-0\">\n This template will combine columns from {{ selectedSchemasCount() }} schema{{ selectedSchemasCount() === 1 ? '' : 's' }}.\n </p>\n </div>\n </div>\n }\n </form>\n</div>\n\n<div class=\"modal-footer\">\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"onCancel()\">\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!canCreateTemplate()\"\n (click)=\"onCreateTemplate()\">\n <i class=\"bi bi-plus-circle me-1\"></i>Create Template\n </button>\n</div>\n","import { Component, OnInit, OnDestroy, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { Schema } from '../../models';\r\nimport { SchemaService } from '../../services';\r\nimport { ToastService } from '@noatgnu/cupcake-core';\r\n\r\nexport interface SchemaSelectionResult {\r\n selectedSchemaIds: number[];\r\n}\r\n\r\n@Component({\r\n selector: 'ccv-schema-selection-modal',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, NgbModule],\r\n templateUrl: './schema-selection-modal.html',\r\n styleUrl: './schema-selection-modal.scss'\r\n})\r\nexport class SchemaSelectionModal implements OnInit, OnDestroy {\r\n private destroy$ = new Subject<void>();\r\n\r\n // Modal configuration - set from parent\r\n title = 'Select Schemas for Column Reordering';\r\n description = 'Choose which schemas to use for reordering columns. Columns will be ordered based on the selected schemas.';\r\n\r\n // State signals\r\n isLoading = signal(false);\r\n availableSchemas = signal<Schema[]>([]);\r\n selectedSchemaIds = signal<Set<number>>(new Set());\r\n searchTerm = signal('');\r\n\r\n constructor(\r\n public activeModal: NgbActiveModal,\r\n private schemaService: SchemaService,\r\n private toastService: ToastService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.loadAvailableSchemas();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n private loadAvailableSchemas(): void {\r\n this.isLoading.set(true);\r\n\r\n this.schemaService.getAvailableSchemas().pipe(\r\n takeUntil(this.destroy$)\r\n ).subscribe({\r\n next: (schemas) => {\r\n this.availableSchemas.set(schemas.filter(schema => schema.isActive));\r\n this.isLoading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('Error loading schemas:', error);\r\n this.toastService.error('Failed to load available schemas');\r\n this.isLoading.set(false);\r\n }\r\n });\r\n }\r\n\r\n get filteredSchemas(): Schema[] {\r\n const schemas = this.availableSchemas();\r\n const search = this.searchTerm().toLowerCase();\r\n\r\n if (!search) {\r\n return schemas;\r\n }\r\n\r\n return schemas.filter(schema =>\r\n schema.name.toLowerCase().includes(search) ||\r\n schema.description?.toLowerCase().includes(search) ||\r\n schema.category?.toLowerCase().includes(search)\r\n );\r\n }\r\n\r\n toggleSchemaSelection(schemaId: number): void {\r\n const selected = new Set(this.selectedSchemaIds());\r\n\r\n if (selected.has(schemaId)) {\r\n selected.delete(schemaId);\r\n } else {\r\n selected.add(schemaId);\r\n }\r\n\r\n this.selectedSchemaIds.set(selected);\r\n }\r\n\r\n isSchemaSelected(schemaId: number): boolean {\r\n return this.selectedSchemaIds().has(schemaId);\r\n }\r\n\r\n selectAll(): void {\r\n const allIds = new Set(this.filteredSchemas.map(schema => schema.id));\r\n this.selectedSchemaIds.set(allIds);\r\n }\r\n\r\n clearSelection(): void {\r\n this.selectedSchemaIds.set(new Set());\r\n }\r\n\r\n onCancel(): void {\r\n this.activeModal.dismiss();\r\n }\r\n\r\n onConfirm(): void {\r\n const selectedIds = Array.from(this.selectedSchemaIds());\r\n\r\n if (selectedIds.length === 0) {\r\n this.toastService.warning('Please select at least one schema');\r\n return;\r\n }\r\n\r\n const result: SchemaSelectionResult = {\r\n selectedSchemaIds: selectedIds\r\n };\r\n\r\n this.activeModal.close(result);\r\n }\r\n\r\n getBadgeClass(category?: string): string {\r\n if (!category) return 'bg-secondary';\r\n\r\n const categoryMap: Record<string, string> = {\r\n 'proteomics': 'bg-primary',\r\n 'genomics': 'bg-success',\r\n 'metabolomics': 'bg-info',\r\n 'general': 'bg-secondary',\r\n 'custom': 'bg-warning'\r\n };\r\n\r\n return categoryMap[category.toLowerCase()] || 'bg-secondary';\r\n }\r\n}","<!-- Schema Selection Modal -->\r\n<div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n <i class=\"bi bi-arrows-move me-2\"></i>{{ title }}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"onCancel()\"></button>\r\n</div>\r\n\r\n<div class=\"modal-body\">\r\n <!-- Description -->\r\n <div class=\"alert alert-info mb-4\">\r\n <div class=\"d-flex align-items-start\">\r\n <i class=\"bi bi-info-circle-fill me-2 mt-1\"></i>\r\n <div>\r\n <small>{{ description }}</small>\r\n <br>\r\n <small class=\"text-muted\">\r\n Leave empty to use all available schemas or select specific ones for custom ordering.\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Search and Actions -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-md-8\">\r\n <div class=\"input-group\">\r\n <span class=\"input-group-text\">\r\n <i class=\"bi bi-search\"></i>\r\n </span>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Search schemas...\"\r\n [(ngModel)]=\"searchTerm\"\r\n [ngModelOptions]=\"{updateOn: 'change'}\"\r\n >\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"btn-group w-100\" role=\"group\">\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline-primary btn-sm\"\r\n (click)=\"selectAll()\"\r\n [disabled]=\"filteredSchemas.length === 0\"\r\n title=\"Select All Visible\">\r\n <i class=\"bi bi-check-all\"></i> All\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline-secondary btn-sm\"\r\n (click)=\"clearSelection()\"\r\n [disabled]=\"selectedSchemaIds().size === 0\"\r\n title=\"Clear Selection\">\r\n <i class=\"bi bi-x-circle\"></i> Clear\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Selection Summary -->\r\n @if (selectedSchemaIds().size > 0) {\r\n <div class=\"alert alert-success mb-3\">\r\n <i class=\"bi bi-check-circle me-2\"></i>\r\n <strong>{{ selectedSchemaIds().size }}</strong> schema{{ selectedSchemaIds().size !== 1 ? 's' : '' }} selected\r\n </div>\r\n }\r\n\r\n <!-- Loading State -->\r\n @if (isLoading()) {\r\n <div class=\"text-center py-4\">\r\n <div class=\"spinner-border text-primary\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading schemas...</span>\r\n </div>\r\n <p class=\"text-muted mt-2\">Loading available schemas...</p>\r\n </div>\r\n } @else {\r\n <!-- Schema List -->\r\n <div class=\"schema-list\" style=\"max-height: 400px; overflow-y: auto;\">\r\n @if (filteredSchemas.length === 0) {\r\n <div class=\"text-center py-4 text-muted\">\r\n <i class=\"bi bi-search fs-1 mb-3 opacity-50\"></i>\r\n <h6>No schemas found</h6>\r\n <p class=\"small mb-0\">\r\n @if (searchTerm()) {\r\n Try adjusting your search terms\r\n } @else {\r\n No schemas are currently available\r\n }\r\n </p>\r\n </div>\r\n } @else {\r\n @for (schema of filteredSchemas; track schema.id) {\r\n <div\r\n class=\"schema-item border rounded p-3 mb-2\"\r\n [class.selected]=\"isSchemaSelected(schema.id)\"\r\n (click)=\"toggleSchemaSelection(schema.id)\"\r\n role=\"button\">\r\n\r\n <div class=\"d-flex align-items-start\">\r\n <!-- Checkbox -->\r\n <div class=\"form-check me-3\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"isSchemaSelected(schema.id)\"\r\n [id]=\"'schema-' + schema.id\"\r\n (click)=\"$event.stopPropagation()\">\r\n <label class=\"form-check-label visually-hidden\" [for]=\"'schema-' + schema.id\">\r\n Select {{ schema.name }}\r\n </label>\r\n </div>\r\n\r\n <!-- Schema Info -->\r\n <div class=\"flex-grow-1\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-2\">\r\n <h6 class=\"mb-0 text-truncate me-2\">\r\n {{ schema.name }}\r\n @if (schema.version) {\r\n <small class=\"text-muted\">v{{ schema.version }}</small>\r\n }\r\n </h6>\r\n\r\n <div class=\"flex-shrink-0\">\r\n @if (schema.category) {\r\n <span class=\"badge\" [class]=\"getBadgeClass(schema.category)\">\r\n {{ schema.category }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (schema.description) {\r\n <p class=\"text-muted small mb-1\">{{ schema.description }}</p>\r\n }\r\n\r\n <div class=\"d-flex align-items-center justify-content-between\">\r\n @if (schema.columnsCount !== undefined) {\r\n <small class=\"text-muted\">\r\n <i class=\"bi bi-columns me-1\"></i>{{ schema.columnsCount }} columns\r\n </small>\r\n }\r\n\r\n @if (schema.url) {\r\n <a\r\n [href]=\"schema.url\"\r\n target=\"_blank\"\r\n class=\"btn btn-sm btn-outline-secondary\"\r\n title=\"View Schema Documentation\"\r\n (click)=\"$event.stopPropagation()\">\r\n <i class=\"bi bi-box-arrow-up-right\"></i>\r\n </a>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n</div>\r\n\r\n<div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\r\n <i class=\"bi bi-x-circle me-1\"></i>Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-primary\"\r\n (click)=\"onConfirm()\"\r\n [disabled]=\"isLoading()\">\r\n <i class=\"bi bi-arrows-move me-1\"></i>\r\n @if (selectedSchemaIds().size > 0) {\r\n Reorder with {{ selectedSchemaIds().size }} Schema{{ selectedSchemaIds().size !== 1 ? 's' : '' }}\r\n } @else {\r\n Reorder with All Schemas\r\n }\r\n </button>\r\n</div>","import { Component, EventEmitter, Output, Input, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\nimport { LabGroup } from '@noatgnu/cupcake-core';\nimport { MetadataTableTemplate } from '../../../models';\n\nexport interface TableCreationData {\n name: string;\n templateId: number;\n sampleCount?: number;\n description?: string;\n labGroupId?: number;\n}\n\n@Component({\n selector: 'ccv-table-creation-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n templateUrl: './table-creation-modal.html',\n styleUrl: './table-creation-modal.scss'\n})\nexport class TableCreationModalComponent implements OnInit {\n @Input() template!: MetadataTableTemplate;\n @Input() labGroups: LabGroup[] = [];\n @Input() selectedLabGroupId?: number;\n @Output() tableCreated = new EventEmitter<TableCreationData>();\n\n tableForm: FormGroup;\n isCreating = false;\n errorMessage: string | null = null;\n\n constructor(\n private fb: FormBuilder,\n public activeModal: NgbActiveModal\n ) {\n this.tableForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(2)]],\n sampleCount: [1, [Validators.required, Validators.min(1), Validators.max(10000)]],\n description: [''],\n labGroupId: [null]\n });\n }\n\n ngOnInit() {\n // Set default values\n if (this.template) {\n this.tableForm.patchValue({\n name: `${this.template.name} - Table`,\n labGroupId: this.selectedLabGroupId\n });\n }\n }\n\n onSubmit() {\n if (this.tableForm.valid && this.template) {\n this.isCreating = true;\n this.errorMessage = null;\n \n const formValue = this.tableForm.value;\n const tableData: TableCreationData = {\n name: formValue.name,\n templateId: this.template.id!,\n sampleCount: formValue.sampleCount || 1,\n description: formValue.description || undefined,\n labGroupId: formValue.labGroupId || undefined\n };\n\n this.tableCreated.emit(tableData);\n }\n }\n\n onClose() {\n this.activeModal.dismiss();\n }\n\n setCreatingState(isCreating: boolean) {\n this.isCreating = isCreating;\n }\n\n setErrorMessage(message: string | null) {\n this.errorMessage = message;\n }\n\n getFieldError(fieldName: string): string | null {\n const field = this.tableForm.get(fieldName);\n if (field?.invalid && field?.touched) {\n if (field.errors?.['required']) {\n return `${this.getFieldLabel(fieldName)} is required`;\n }\n if (field.errors?.['minlength']) {\n return `${this.getFieldLabel(fieldName)} must be at least ${field.errors['minlength'].requiredLength} characters`;\n }\n if (field.errors?.['min']) {\n return `${this.getFieldLabel(fieldName)} must be at least ${field.errors['min'].min}`;\n }\n if (field.errors?.['max']) {\n return `${this.getFieldLabel(fieldName)} must be at most ${field.errors['max'].max}`;\n }\n }\n return null;\n }\n\n private getFieldLabel(fieldName: string): string {\n const labels: { [key: string]: string } = {\n name: 'Table name',\n sampleCount: 'Sample count',\n description: 'Description',\n labGroupId: 'Lab group'\n };\n return labels[fieldName] || fieldName;\n }\n}\n","<div class=\"modal-header\">\n <h5 class=\"modal-title\">\n <i class=\"bi bi-table me-2\"></i>Create Table from Template\n </h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"onClose()\" aria-label=\"Close\"></button>\n</div>\n\n<div class=\"modal-body\">\n @if (template) {\n <div class=\"alert alert-info d-flex align-items-center mb-4\">\n <i class=\"bi bi-info-circle me-2\"></i>\n <div>\n <strong>Template:</strong> {{ template.name }}\n @if (template.description) {\n <br><small>{{ template.description }}</small>\n }\n </div>\n </div>\n\n @if (errorMessage) {\n <div class=\"alert alert-danger d-flex align-items-center\">\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\n {{ errorMessage }}\n </div>\n }\n\n <form [formGroup]=\"tableForm\" (ngSubmit)=\"onSubmit()\">\n <div class=\"row g-3\">\n <!-- Table Name -->\n <div class=\"col-12\">\n <div class=\"form-floating\">\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"tableName\"\n formControlName=\"name\"\n placeholder=\"Table name\"\n [class.is-invalid]=\"getFieldError('name')\">\n <label for=\"tableName\">Table Name *</label>\n </div>\n @if (getFieldError('name')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldError('name') }}\n </div>\n }\n </div>\n\n <!-- Sample Count -->\n <div class=\"col-md-6\">\n <div class=\"form-floating\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"sampleCount\"\n formControlName=\"sampleCount\"\n placeholder=\"Sample count\"\n min=\"1\"\n max=\"10000\"\n [class.is-invalid]=\"getFieldError('sampleCount')\">\n <label for=\"sampleCount\">Number of Samples *</label>\n </div>\n @if (getFieldError('sampleCount')) {\n <div class=\"invalid-feedback d-block\">\n {{ getFieldError('sampleCount') }}\n </div>\n }\n <div class=\"form-text\">\n Number of sample rows to create in the table (1-10,000)\n </div>\n </div>\n\n <!-- Lab Group -->\n <div class=\"col-md-6\">\n <div class=\"form-floating\">\n <select\n class=\"form-select\"\n id=\"labGroupSelect\"\n formControlName=\"labGroupId\">\n <option [ngValue]=\"null\">No Lab Group</option>\n @for (group of labGroups; track group.id) {\n <option [ngValue]=\"group.id\">{{ group.name }}</option>\n }\n </select>\n <label for=\"labGroupSelect\">Lab Group</label>\n </div>\n <div class=\"form-text\">\n Optional: Assign table to a specific lab group\n </div>\n </div>\n\n <!-- Description -->\n <div class=\"col-12\">\n <div class=\"form-floating\">\n <textarea\n class=\"form-control\"\n id=\"tableDescription\"\n formControlName=\"description\"\n placeholder=\"Description\"\n style=\"height: 100px\"></textarea>\n <label for=\"tableDescription\">Description (optional)</label>\n </div>\n <div class=\"form-text\">\n Optional description for the metadata table\n </div>\n </div>\n </div>\n </form>\n }\n</div>\n\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onClose()\" [disabled]=\"isCreating\">\n Cancel\n </button>\n <button\n type=\"submit\"\n class=\"btn btn-success\"\n (click)=\"onSubmit()\"\n [disabled]=\"tableForm.invalid || isCreating\">\n @if (isCreating) {\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></span>\n }\n <i class=\"bi bi-table me-1\"></i>Create Table\n </button>\n</div>\n","import { Component, OnInit, signal, computed, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { debounceTime, distinctUntilChanged } from 'rxjs';\nimport { MetadataTableTemplateEditModal } from './metadata-table-template-edit-modal/metadata-table-template-edit-modal';\nimport { TemplateSchemaSelectionModal, TemplateSchemaSelectionResult } from './schema-selection-modal/schema-selection-modal';\nimport { SchemaSelectionModal as ReorderSchemaSelectionModal, SchemaSelectionResult as ReorderSchemaSelectionResult } from '../schema-selection-modal/schema-selection-modal';\nimport { TableCreationModalComponent, TableCreationData } from './table-creation-modal/table-creation-modal';\nimport { LabGroupService } from '@noatgnu/cupcake-core';\nimport { AsyncTaskUIService } from '../async-task-ui';\nimport { LabGroup, LabGroupQueryResponse, ResourceVisibility } from '@noatgnu/cupcake-core';\nimport {\n MetadataTableTemplate,\n MetadataTableTemplateQueryResponse,\n MetadataTable,\n MetadataTableTemplateCreateRequest\n} from '../../models';\nimport { MetadataTableTemplateService } from '../../services/metadata-table-template';\nimport { ToastService } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-metadata-table-templates',\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './metadata-table-templates.html',\n styleUrl: './metadata-table-templates.scss'\n})\nexport class MetadataTableTemplates implements OnInit {\n searchForm: FormGroup;\n\n // Signals for reactive state management\n private searchParams = signal({\n search: '',\n labGroupId: null as number | null,\n visibility: ResourceVisibility.PRIVATE,\n isDefault: false,\n limit: 10,\n offset: 0\n });\n\n private labGroupParams = signal({\n limit: 10,\n offset: 0\n });\n\n // Computed signals for better performance\n isLoading = signal(false);\n selectedLabGroup = signal<LabGroup | null>(null);\n currentPage = signal(1);\n pageSize = signal(10);\n totalItems = signal(0);\n\n labGroupsCurrentPage = signal(1);\n labGroupsPageSize = signal(10);\n labGroupsTotalItems = signal(0);\n\n // Direct signal-based data management\n templatesData = signal<MetadataTableTemplateQueryResponse>({ count: 0, results: [] });\n labGroupsData = signal<LabGroupQueryResponse>({ count: 0, results: [] });\n\n\n // Computed values for better performance\n hasTemplates = computed(() => this.templatesData().results.length > 0);\n hasLabGroups = computed(() => this.labGroupsData().results.length > 0);\n showTemplatesPagination = computed(() => this.templatesData().count > this.pageSize());\n showLabGroupsPagination = computed(() => this.labGroupsData().count > this.labGroupsPageSize());\n\n // Schema-related properties\n availableSchemas = signal<any[]>([]);\n isLoadingSchemas = signal(false);\n\n constructor(\n private fb: FormBuilder,\n private metadataTableTemplateService: MetadataTableTemplateService,\n private labGroupService: LabGroupService,\n private modalService: NgbModal,\n private toastService: ToastService,\n private asyncTaskService: AsyncTaskUIService\n ) {\n this.searchForm = this.fb.group({\n search: [''],\n labGroupId: [null],\n visibility: [ResourceVisibility.PRIVATE],\n isDefault: [false]\n });\n\n // Effect to automatically reload templates when search params change\n effect(() => {\n const params = this.searchParams();\n this.loadTemplatesWithParams(params);\n });\n\n // Effect to automatically reload lab groups when params change\n effect(() => {\n const params = this.labGroupParams();\n this.loadLabGroupsWithParams(params);\n });\n }\n\n ngOnInit() {\n this.setupSearch();\n this.loadInitialData();\n this.loadAvailableSchemas();\n }\n\n private loadInitialData() {\n // Initial load - signals will handle subsequent updates via effects\n this.labGroupParams.set({\n limit: this.labGroupsPageSize(),\n offset: 0\n });\n\n this.searchParams.set({\n search: '',\n labGroupId: null,\n visibility: ResourceVisibility.PRIVATE,\n isDefault: false,\n limit: this.pageSize(),\n offset: 0\n });\n }\n\n private loadLabGroupsWithParams(params: { limit: number; offset: number }) {\n this.labGroupService.getMyLabGroups(params).subscribe({\n next: (response) => {\n this.labGroupsTotalItems.set(response.count);\n this.labGroupsData.set(response);\n },\n error: (error) => {\n console.error('Error loading lab groups:', error);\n this.labGroupsData.set({ count: 0, results: [] });\n }\n });\n }\n\n private setupSearch() {\n // Subscribe to form changes and update search params signal\n this.searchForm.valueChanges.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(formValue => {\n // Reset to first page when searching\n this.currentPage.set(1);\n\n // Update search params signal - this will trigger the effect\n this.searchParams.set({\n search: formValue.search || '',\n labGroupId: formValue.labGroupId || null,\n visibility: formValue.visibility || ResourceVisibility.PRIVATE,\n isDefault: formValue.isDefault || false,\n limit: this.pageSize(),\n offset: 0 // Always start from first page when searching\n });\n });\n }\n\n private loadTemplatesWithParams(params: any) {\n this.isLoading.set(true);\n\n this.metadataTableTemplateService.getMetadataTableTemplates({\n search: params.search || undefined,\n labGroupId: params.labGroupId || undefined,\n visibility: params.visibility || undefined,\n isDefault: params.isDefault || undefined,\n limit: params.limit,\n offset: params.offset\n }).subscribe({\n next: (response) => {\n this.isLoading.set(false);\n this.totalItems.set(response.count);\n this.templatesData.set(response);\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error loading metadata table templates:', error);\n this.templatesData.set({ count: 0, results: [] });\n }\n });\n }\n\n onLabGroupChange(event: Event) {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n const id = value === 'null' ? null : Number(value);\n const labGroup = id ? this.findLabGroupById(id) : null;\n this.selectedLabGroup.set(labGroup);\n this.currentPage.set(1);\n\n // Update search params - effect will trigger reload\n this.searchParams.update(params => ({\n ...params,\n labGroupId: id,\n offset: 0\n }));\n }\n\n private findLabGroupById(id: number): LabGroup | null {\n const labGroups = this.labGroupsData();\n return labGroups.results.find((group: LabGroup) => group.id === id) || null;\n }\n\n getLabGroupName(labGroupId: number | undefined): string {\n if (!labGroupId) return '-';\n const labGroup = this.findLabGroupById(labGroupId);\n return labGroup?.name || labGroupId.toString();\n }\n\n onPageChange(page: number) {\n this.currentPage.set(page);\n this.searchParams.update(params => ({\n ...params,\n offset: (page - 1) * this.pageSize()\n }));\n }\n\n onLabGroupsPageChange(page: number) {\n this.labGroupsCurrentPage.set(page);\n this.labGroupParams.set({\n limit: this.labGroupsPageSize(),\n offset: (page - 1) * this.labGroupsPageSize()\n });\n }\n\n createTemplate() {\n this.openTemplateModal(null, false);\n }\n\n editTemplate(template: MetadataTableTemplate) {\n this.openTemplateModal(template, true);\n }\n\n deleteTemplate(template: MetadataTableTemplate) {\n // Enhanced delete confirmation with better UX\n const confirmMessage = `Are you sure you want to delete the template \"${template.name}\"?\\n\\nThis action cannot be undone.`;\n\n if (confirm(confirmMessage)) {\n this.isLoading.set(true);\n this.metadataTableTemplateService.deleteMetadataTableTemplate(template.id!).subscribe({\n next: () => {\n this.isLoading.set(false);\n console.log('Template deleted successfully');\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error deleting template:', error);\n alert('Failed to delete template. Please try again.');\n }\n });\n }\n }\n\n duplicateTemplate(template: MetadataTableTemplate) {\n const duplicatedTemplate: MetadataTableTemplateCreateRequest = {\n name: `${template.name} (Copy)`,\n description: template.description,\n userColumnIds: [...(template.userColumnIds || [])],\n fieldMaskMapping: { ...template.fieldMaskMapping },\n visibility: ResourceVisibility.PRIVATE, // Always create as private\n isDefault: false, // Never default\n labGroup: template.labGroup || this.selectedLabGroup()?.id || undefined\n };\n\n this.isLoading.set(true);\n this.metadataTableTemplateService.createMetadataTableTemplate(duplicatedTemplate).subscribe({\n next: (newTemplate) => {\n this.isLoading.set(false);\n console.log('Template duplicated:', newTemplate);\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error duplicating template:', error);\n alert('Failed to duplicate template. Please try again.');\n }\n });\n }\n\n private openTemplateModal(template: MetadataTableTemplate | null, isEdit: boolean) {\n const modalRef = this.modalService.open(MetadataTableTemplateEditModal, {\n size: 'lg',\n backdrop: 'static',\n keyboard: false\n });\n\n modalRef.componentInstance.template = template;\n modalRef.componentInstance.labGroups = this.labGroupsData().results;\n modalRef.componentInstance.isEdit = isEdit;\n\n modalRef.componentInstance.templateSaved.subscribe((templateData: Partial<MetadataTableTemplate>) => {\n this.handleTemplateSave(templateData, template?.id || null, isEdit);\n modalRef.componentInstance.onClose();\n });\n }\n\n private handleTemplateSave(templateData: Partial<MetadataTableTemplate>, templateId: number | null, isEdit: boolean) {\n this.isLoading.set(true);\n\n const apiCall = isEdit && templateId\n ? this.metadataTableTemplateService.updateMetadataTableTemplate(templateId, templateData)\n : this.metadataTableTemplateService.createMetadataTableTemplate(templateData as MetadataTableTemplateCreateRequest);\n\n apiCall.subscribe({\n next: (template) => {\n this.isLoading.set(false);\n console.log(`Metadata table template ${isEdit ? 'updated' : 'created'}:`, template);\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error(`Error ${isEdit ? 'updating' : 'creating'} metadata table template:`, error);\n alert(`Failed to ${isEdit ? 'update' : 'create'} template. Please try again.`);\n }\n });\n }\n\n private refreshTemplates() {\n // Trigger a refresh by updating the search params\n this.searchParams.update(params => ({ ...params }));\n }\n\n private loadAvailableSchemas() {\n this.isLoadingSchemas.set(true);\n\n this.metadataTableTemplateService.getAvailableSchemas().subscribe({\n next: (schemas) => {\n this.availableSchemas.set(schemas);\n this.isLoadingSchemas.set(false);\n },\n error: (error) => {\n console.error('Error loading schemas:', error);\n this.isLoadingSchemas.set(false);\n }\n });\n }\n\n\n createTemplateWithCustomSchemas() {\n this.openSchemaSelectionModal();\n }\n\n private openSchemaSelectionModal() {\n const modalRef = this.modalService.open(TemplateSchemaSelectionModal, {\n size: 'xl',\n backdrop: 'static',\n keyboard: false\n });\n\n // Pass data to the modal\n modalRef.componentInstance.availableSchemas = this.availableSchemas();\n modalRef.componentInstance.labGroups = this.labGroupsData().results;\n\n // Handle modal result\n modalRef.componentInstance.templateCreated.subscribe((result: TemplateSchemaSelectionResult) => {\n this.handleSchemaTemplateCreation(result);\n modalRef.close();\n });\n }\n\n private handleSchemaTemplateCreation(result: TemplateSchemaSelectionResult) {\n this.isLoading.set(true);\n\n const templateData = {\n name: result.name,\n schemaIds: result.schemaIds,\n description: result.description,\n labGroupId: result.labGroupId,\n visibility: result.visibility,\n isDefault: result.isDefault\n };\n\n this.metadataTableTemplateService.createFromSchema({\n schemaIds: result.schemaIds,\n name: result.name,\n description: result.description\n }).subscribe({\n next: (response) => {\n this.isLoading.set(false);\n console.log('Template created from schemas:', response);\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error creating template from schemas:', error);\n alert('Failed to create template from schemas. Please try again.');\n }\n });\n }\n\n createTableFromTemplate(template: MetadataTableTemplate) {\n this.openTableCreationModal(template);\n }\n\n private openTableCreationModal(template: MetadataTableTemplate) {\n const modalRef = this.modalService.open(TableCreationModalComponent, {\n size: 'lg',\n backdrop: 'static',\n keyboard: false\n });\n\n modalRef.componentInstance.template = template;\n modalRef.componentInstance.labGroups = this.labGroupsData().results;\n modalRef.componentInstance.selectedLabGroupId = this.selectedLabGroup()?.id;\n\n modalRef.componentInstance.tableCreated.subscribe((tableData: TableCreationData) => {\n this.handleTableCreation(tableData, modalRef);\n });\n }\n\n private handleTableCreation = (data: TableCreationData, modalRef?: any): void => {\n this.isLoading.set(true);\n\n // Set creating state on modal if provided\n if (modalRef?.componentInstance) {\n modalRef.componentInstance.setCreatingState(true);\n }\n\n this.metadataTableTemplateService.createTableFromTemplate({\n templateId: data.templateId,\n name: data.name,\n description: data.description,\n sampleCount: data.sampleCount || 1\n }).subscribe({\n next: (response: MetadataTable) => {\n this.isLoading.set(false);\n console.log('Metadata table created from template:', response);\n\n // Close modal and show success message\n if (modalRef) {\n modalRef.close();\n }\n\n this.toastService.success(`Table \"${response.name}\" created successfully!`);\n },\n error: (error: { error?: { detail?: string; message?: string }; message?: string }) => {\n this.isLoading.set(false);\n console.error('Error creating table from template:', error);\n\n // Reset creating state on modal if provided and show error\n if (modalRef?.componentInstance) {\n modalRef.componentInstance.setCreatingState(false);\n const errorMsg = error?.error?.detail || error?.error?.message || error?.message || 'Failed to create table from template. Please try again.';\n modalRef.componentInstance.setErrorMessage(errorMsg);\n } else {\n const errorMsg = error?.error?.detail || error?.error?.message || error?.message || 'Failed to create table from template. Please try again.';\n this.toastService.error(errorMsg);\n }\n }\n });\n }\n\n /**\n * Reorder template columns by schema selection\n */\n reorderTemplateColumns(template: MetadataTableTemplate): void {\n if (!template.columnCount || template.columnCount === 0) {\n this.toastService.warning('Template has no columns to reorder');\n return;\n }\n\n const modalRef = this.modalService.open(ReorderSchemaSelectionModal, {\n size: 'lg',\n backdrop: 'static'\n });\n\n modalRef.componentInstance.title = 'Reorder Template Columns by Schema';\n modalRef.componentInstance.description = `Select schemas to reorder columns in template \"${template.name}\". Columns will be arranged based on the selected schema order.`;\n\n modalRef.result.then((result: ReorderSchemaSelectionResult) => {\n if (result && result.selectedSchemaIds) {\n this.performTemplateColumnReorder(template.id, result.selectedSchemaIds);\n }\n }).catch(() => {\n // Modal was dismissed - no action needed\n });\n }\n\n /**\n * Perform the actual template column reordering with async task monitoring\n */\n private performTemplateColumnReorder(templateId: number, schemaIds: number[]): void {\n this.isLoading.set(true);\n\n this.metadataTableTemplateService.reorderColumnsBySchemaAsync(templateId, schemaIds).subscribe({\n next: (response) => {\n console.log('Template column reorder task started:', response);\n this.toastService.success(`Template column reorder task queued successfully! Task ID: ${response.taskId}`);\n \n // Mark task for monitoring and start real-time updates (same pattern as other async operations)\n this.asyncTaskService.monitorTask(response.taskId);\n this.asyncTaskService.startRealtimeUpdates();\n \n this.isLoading.set(false);\n },\n error: (error) => {\n console.error('Error starting template column reorder:', error);\n this.toastService.error('Failed to start template column reordering');\n this.isLoading.set(false);\n }\n });\n }\n}\n","<div class=\"metadata-table-templates-container\">\n <!-- Header Section -->\n <nav class=\"navbar navbar-expand-lg bg-body-tertiary shadow-sm\">\n <div class=\"container-fluid\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center\">\n <h4 class=\"navbar-brand m-0 fw-bold\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>Table Templates\n </h4>\n @if (selectedLabGroup()) {\n <span class=\"badge bg-primary ms-3\">{{ selectedLabGroup()!.name }}</span>\n }\n </div>\n <div class=\"d-flex gap-2\">\n <div class=\"btn-group\" ngbDropdown>\n <button type=\"button\" class=\"btn btn-primary btn-sm dropdown-toggle\" ngbDropdownToggle>\n <i class=\"bi bi-plus me-1\"></i>New Template\n </button>\n <div class=\"dropdown-menu dropdown-menu-end\" ngbDropdownMenu>\n <a class=\"dropdown-item\" href=\"#\" (click)=\"createTemplateWithCustomSchemas(); $event.preventDefault()\"\n title=\"Select one or multiple schemas to create template\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>\n <strong>Create from Schemas</strong>\n </a>\n <div class=\"dropdown-divider\"></div>\n <a class=\"dropdown-item\" href=\"#\" (click)=\"createTemplate(); $event.preventDefault()\"\n title=\"Create from scratch\">\n <i class=\"bi bi-wrench me-2\"></i>\n <strong>Manual Configuration</strong>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </nav>\n\n <div class=\"templates-content p-4\">\n <!-- Search and Filters Section -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-search me-2\"></i>Search & Filters\n </h5>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"searchForm\" class=\"row g-3\">\n <div class=\"col-md-3\">\n <div class=\"form-floating\">\n <input\n type=\"search\"\n class=\"form-control\"\n id=\"templateSearch\"\n formControlName=\"search\"\n placeholder=\"Search templates...\">\n <label for=\"templateSearch\">\n <i class=\"bi bi-search me-1\"></i>Search Templates\n </label>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"form-floating\">\n <select\n class=\"form-select\"\n id=\"labGroupSelect\"\n formControlName=\"labGroupId\"\n (change)=\"onLabGroupChange($event)\">\n <option [ngValue]=\"null\">All Lab Groups</option>\n @if (hasLabGroups()) {\n @for (group of labGroupsData().results; track group.id) {\n <option [ngValue]=\"group.id\">{{ group.name }}</option>\n }\n }\n </select>\n <label for=\"labGroupSelect\">Lab Group</label>\n </div>\n\n <!-- Lab Groups Pagination -->\n @if (showLabGroupsPagination()) {\n <div class=\"d-flex justify-content-center mt-2\">\n <ngb-pagination\n [collectionSize]=\"labGroupsData().count\"\n [page]=\"labGroupsCurrentPage()\"\n [pageSize]=\"labGroupsPageSize()\"\n [maxSize]=\"3\"\n [boundaryLinks]=\"false\"\n [rotate]=\"true\"\n (pageChange)=\"onLabGroupsPageChange($event)\"\n class=\"pagination-sm\">\n </ngb-pagination>\n </div>\n }\n </div>\n <div class=\"col-md-3\">\n <div class=\"form-check form-switch mt-3\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"defaultTemplates\"\n formControlName=\"isDefault\">\n <label class=\"form-check-label\" for=\"defaultTemplates\">\n <i class=\"bi bi-star me-1\"></i>Default Templates Only\n </label>\n </div>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Templates Table -->\n <div class=\"card\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>Table Templates\n <span class=\"badge bg-primary ms-2\">{{ templatesData().count }}</span>\n </h5>\n @if (isLoading()) {\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n }\n </div>\n <div class=\"card-body p-0\">\n @if (hasTemplates()) {\n <div class=\"table-responsive\">\n <table class=\"table table-hover mb-0\">\n <thead>\n <tr>\n <th><i class=\"bi bi-tag me-1\"></i>Template Name</th>\n <th><i class=\"bi bi-person me-1\"></i>Creator</th>\n <th><i class=\"bi bi-folder me-1\"></i>Lab Group</th>\n <th><i class=\"bi bi-list me-1\"></i>Columns</th>\n <th><i class=\"bi bi-eye me-1\"></i>Visibility</th>\n <th><i class=\"bi bi-star me-1\"></i>Default</th>\n <th><i class=\"bi bi-gear me-1\"></i>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (template of templatesData().results; track template.id) {\n <tr>\n <td>\n <strong>{{ template.name }}</strong>\n @if (template.description) {\n <br><small class=\"text-muted\">{{ template.description }}</small>\n }\n </td>\n <td>{{ template.ownerUsername || 'System' }}</td>\n <td>\n @if (template.labGroup) {\n <span class=\"badge bg-info\">{{ getLabGroupName(template.labGroup) }}</span>\n } @else {\n <span class=\"text-muted\">-</span>\n }\n </td>\n <td>\n <span class=\"badge bg-secondary\">{{ template.columnCount || 0 }}</span>\n </td>\n <td>\n @switch (template.visibility) {\n @case ('public') {\n <span class=\"badge bg-success\">Public</span>\n }\n @case ('group') {\n <span class=\"badge bg-info\">Lab Group</span>\n }\n @case ('private') {\n <span class=\"badge bg-warning\">Private</span>\n }\n @default {\n <span class=\"badge bg-secondary\">{{ template.visibility }}</span>\n }\n }\n </td>\n <td>\n @if (template.isDefault) {\n <i class=\"bi bi-star-fill text-warning\"></i>\n } @else {\n <span class=\"text-muted\">-</span>\n }\n </td>\n <td>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n <button\n class=\"btn btn-outline-success\"\n (click)=\"createTableFromTemplate(template)\"\n title=\"Create metadata table from this template\">\n <i class=\"bi bi-table\"></i>\n </button>\n <button\n class=\"btn btn-outline-primary\"\n (click)=\"editTemplate(template)\"\n title=\"Edit template\">\n <i class=\"bi bi-pencil\"></i>\n </button>\n <button\n class=\"btn btn-outline-info\"\n (click)=\"duplicateTemplate(template)\"\n title=\"Duplicate template\">\n <i class=\"bi bi-copy\"></i>\n </button>\n <button\n class=\"btn btn-outline-warning\"\n (click)=\"reorderTemplateColumns(template)\"\n title=\"Reorder columns by schema\"\n [disabled]=\"!template.columnCount || template.columnCount === 0\">\n <i class=\"bi bi-arrows-move\"></i>\n </button>\n <button\n class=\"btn btn-outline-danger\"\n (click)=\"deleteTemplate(template)\"\n title=\"Delete template\">\n <i class=\"bi bi-trash\"></i>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Pagination -->\n @if (showTemplatesPagination()) {\n <div class=\"d-flex justify-content-center mt-3 p-3\">\n <ngb-pagination\n [collectionSize]=\"templatesData().count\"\n [page]=\"currentPage()\"\n [pageSize]=\"pageSize()\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"true\"\n [rotate]=\"true\"\n (pageChange)=\"onPageChange($event)\"\n class=\"pagination-sm\">\n </ngb-pagination>\n </div>\n }\n } @else {\n <div class=\"empty-state text-center py-5\">\n <i class=\"bi bi-file-earmark-text fs-1 text-muted mb-3\"></i>\n <h5 class=\"text-muted\">No Table Templates Found</h5>\n <p class=\"text-muted\">\n @if (searchForm.get('search')?.value || searchForm.get('labGroupId')?.value) {\n Try adjusting your search criteria or create a new template.\n } @else {\n Get started by creating your first table template.\n }\n </p>\n <button class=\"btn btn-primary\" (click)=\"createTemplate()\">\n <i class=\"bi bi-plus me-1\"></i>Create First Template\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n","export * from './models';\nexport * from './services';\nexport * from './components';\n\nimport { Component } from '@angular/core';\n\n@Component({\n selector: 'ccv-cupcake-vanilla',\n imports: [],\n template: `\n <p>\n cupcake-vanilla works!\n </p>\n `,\n styles: ``\n})\nexport class CupcakeVanilla {\n\n}\n","/*\n * Public API Surface of cupcake-vanilla\n */\n\nexport * from './lib/cupcake-vanilla';\nexport * from './lib/models';\nexport * from './lib/services';\nexport * from './lib/components';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["BaseWebSocketService","i1","BaseNotificationService","i1.Websocket","i2.AdminWebSocketService","i1.ChunkedUploadService","switchMap","map","tap","i4.FavouriteMetadataOptionService","i4.MetadataColumnService","i4.MetadataColumnTemplateService","LibraryAsyncTaskService","filter","i3.MetadataTableService","i4","i3.MetadataColumnTemplateService","i4.SdrfSyntaxService","i3.MetadataTableTemplateService","i5","i2.SchemaService","ReorderSchemaSelectionModal","i2.MetadataTableTemplateService","i5.AsyncTaskUIService"],"mappings":"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"}
|