@noatgnu/cupcake-vanilla 1.2.12 → 1.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/noatgnu-cupcake-vanilla.mjs +1745 -14
- package/fesm2022/noatgnu-cupcake-vanilla.mjs.map +1 -1
- package/index.d.ts +279 -3
- package/package.json +1 -1
|
@@ -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/components/column-templates/column-template-edit-modal/column-template-edit-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/column-templates/column-template-edit-modal/column-template-edit-modal.html","../../../projects/cupcake-vanilla/src/lib/components/column-templates/column-templates.ts","../../../projects/cupcake-vanilla/src/lib/components/column-templates/column-templates.html","../../../projects/cupcake-vanilla/src/lib/components/favorite-management/favorite-management.ts","../../../projects/cupcake-vanilla/src/lib/components/favorite-management/favorite-management.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\nexport interface OntologySuggestParams {\r\n q: string;\r\n type?: string;\r\n match?: 'contains' | 'startswith';\r\n limit?: number;\r\n customFilters?: Record<string, any>;\r\n}\r\n\r\nexport interface OntologySuggestResponse {\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?: Record<string, any>;\r\n hasMore: boolean;\r\n}\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 * @param params Query parameters\r\n * @param params.q Search query (required, min 2 characters)\r\n * @param params.type Ontology type to search (optional)\r\n * @param params.match Match type - 'contains' or 'startswith' (default: 'contains')\r\n * @param params.limit Maximum number of results (default: 50)\r\n * @param params.customFilters Custom filters to apply (optional)\r\n * Example: {\"organism\": \"Homo sapiens\"} or {\"organism\": {\"icontains\": \"human\"}}\r\n */\r\n suggest(params: OntologySuggestParams): Observable<OntologySuggestResponse> {\r\n const queryParams: any = {\r\n q: params.q,\r\n };\r\n\r\n if (params.type) {\r\n queryParams.type = params.type;\r\n }\r\n\r\n if (params.match) {\r\n queryParams.match = params.match;\r\n }\r\n\r\n if (params.limit) {\r\n queryParams.limit = params.limit;\r\n }\r\n\r\n if (params.customFilters) {\r\n queryParams.custom_filters = JSON.stringify(params.customFilters);\r\n }\r\n\r\n const httpParams = this.buildHttpParams(queryParams);\r\n return this.get<OntologySuggestResponse>(`${this.apiUrl}/ontology/search/suggest/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get ontology suggestions for a specific ontology type with custom filters\r\n */\r\n suggestWithFilters(\r\n query: string,\r\n ontologyType: string,\r\n customFilters: Record<string, any>,\r\n limit: number = 50\r\n ): Observable<OntologySuggestResponse> {\r\n return this.suggest({\r\n q: query,\r\n type: ontologyType,\r\n customFilters,\r\n limit\r\n });\r\n }\r\n\r\n /**\r\n * Search across multiple ontology types\r\n */\r\n searchAll(query: string, limit: number = 50): Observable<OntologySuggestResponse> {\r\n return this.suggest({\r\n q: query,\r\n limit\r\n });\r\n }\r\n\r\n /**\r\n * Search specific ontology type\r\n */\r\n searchType(query: string, ontologyType: string, limit: number = 50): Observable<OntologySuggestResponse> {\r\n return this.suggest({\r\n q: query,\r\n type: ontologyType,\r\n limit\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 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, OntologySearchService } 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 private ontologySearchService: OntologySearchService\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 if (this.config.ontologyType) {\n // Fallback: use OntologySearchService directly with custom filters\n return this.ontologySearchService.suggest({\n q: term,\n type: this.config.ontologyType,\n match: this.searchType() === 'icontains' ? 'contains' : 'startswith',\n customFilters: this.config.customOntologyFilters,\n limit: 10\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 const ontologyTypeIndexStr = this.editForm.get('ontologyType')?.value;\n const ontologyTypeIndex = parseInt(ontologyTypeIndexStr || '0');\n const enableTypeahead = this.editForm.get('enableTypeahead')?.value || false;\n\n let ontologyType = '';\n if (ontologyTypeIndex > 0 && ontologyTypeIndex < this.ontologyTypes.length) {\n ontologyType = this.ontologyTypes[ontologyTypeIndex].value;\n }\n\n const config: MetadataValueEditConfig = {\n columnName: this.editForm.get('name')?.value || 'Column',\n columnType: this.editForm.get('type')?.value || '',\n ontologyType: ontologyType,\n enableTypeahead: enableTypeahead,\n currentValue: this.editForm.get('value')?.value || '',\n context: this.isEdit ? 'table' : 'template'\n };\n\n const hasTemplate = this.selectedTemplate || this.column?.template || this.templateId;\n\n if (hasTemplate) {\n if (this.isEdit && this.column?.id) {\n config.columnId = this.column.id;\n }\n config.templateId = this.selectedTemplate?.id || this.column?.template || this.templateId || undefined;\n } else {\n const columnName = this.editForm.get('name')?.value;\n if (columnName) {\n const ontologyConfig = this.getOntologyConfigForColumn(columnName);\n config.customOntologyFilters = ontologyConfig.customFilters;\n }\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 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 ontologyConfig = this.getOntologyConfigForColumn(column.name);\n const ontologyTypeIndex = ontologyConfig.index;\n\n this.editForm.patchValue({\n name: column.name,\n type: column.type,\n value: '',\n ontologyType: ontologyTypeIndex.toString(),\n enableTypeahead: ontologyTypeIndex > 0,\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 getOntologyConfigForColumn(columnName: string): { index: number; ontologyType: string; customFilters?: any } {\n const lowerName = columnName.toLowerCase();\n const MSTermType = {\n INSTRUMENT: 'instrument',\n MASS_ANALYZER_TYPE: 'mass analyzer type',\n CLEAVAGE_AGENT: 'cleavage agent',\n SAMPLE_ATTRIBUTE: 'sample attribute',\n ANCESTRAL_CATEGORY: 'ancestral category',\n SEX: 'sex',\n DEVELOPMENTAL_STAGE: 'developmental stage'\n };\n\n let ontologyType = '';\n let customFilters: any = undefined;\n\n switch (lowerName) {\n case 'characteristics[organism]':\n ontologyType = 'species';\n break;\n case 'characteristics[disease]':\n ontologyType = 'human_disease';\n break;\n case 'characteristics[organism part]':\n ontologyType = 'tissue';\n break;\n case 'characteristics[cell type]':\n ontologyType = 'cell_ontology';\n break;\n case 'comment[instrument]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.INSTRUMENT } };\n break;\n case 'comment[modification parameters]':\n ontologyType = 'unimod';\n break;\n case 'comment[ms2 analyzer type]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.MASS_ANALYZER_TYPE } };\n break;\n case 'comment[cleavage agent details]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.CLEAVAGE_AGENT } };\n break;\n case 'characteristics[ancestry category]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.ANCESTRAL_CATEGORY } };\n break;\n case 'characteristics[sex]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.SEX } };\n break;\n case 'characteristics[developmental stage]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.DEVELOPMENTAL_STAGE } };\n break;\n case 'comment[label]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.SAMPLE_ATTRIBUTE } };\n break;\n }\n\n if (!ontologyType) {\n return { index: 0, ontologyType: '', customFilters: undefined };\n }\n\n // Find the matching ontology type config with the correct custom filters\n const index = this.ontologyTypes.findIndex(config => {\n if (config.value !== ontologyType) return false;\n if (!customFilters) return !config.customFilters || Object.keys(config.customFilters).length === 0;\n\n // Match custom filters\n if (!config.customFilters) return false;\n const configFilterKey = Object.keys(config.customFilters)[0];\n const customFilterKey = Object.keys(customFilters)[0];\n if (configFilterKey !== customFilterKey) return false;\n\n const configTermType = config.customFilters[configFilterKey]?.['term_type'];\n const customTermType = customFilters[customFilterKey]?.['term_type'];\n return configTermType === customTermType;\n });\n\n return {\n index: index >= 0 ? index : 0,\n ontologyType,\n customFilters\n };\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","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 } from '@ng-bootstrap/ng-bootstrap';\nimport { MetadataColumnTemplate, ONTOLOGY_TYPE_CONFIGS, COLUMN_TYPE_CONFIGS, OntologyTypeConfig, ColumnTypeConfig } from '../../../models';\nimport { LabGroup } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-column-template-edit-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './column-template-edit-modal.html',\n styleUrl: './column-template-edit-modal.scss'\n})\nexport class ColumnTemplateEditModal implements OnInit {\n @Input() template: MetadataColumnTemplate | null = null;\n @Input() labGroups: LabGroup[] = [];\n @Input() isEdit = false;\n @Output() templateSaved = new EventEmitter<Partial<MetadataColumnTemplate>>();\n\n editForm: FormGroup;\n isLoading = signal(false);\n\n // Make Object available in template\n Object = Object;\n\n // Available options for dropdowns\n columnTypes: ColumnTypeConfig[] = COLUMN_TYPE_CONFIGS;\n\n visibilityOptions = [\n { value: 'private', label: 'Private' },\n { value: 'labGroup', label: 'Lab Group' },\n { value: 'public', label: 'Public' },\n { value: 'global', label: 'Global' }\n ];\n\n ontologyTypes: OntologyTypeConfig[] = ONTOLOGY_TYPE_CONFIGS;\n\n constructor(\n private fb: FormBuilder,\n private activeModal: NgbActiveModal\n ) {\n this.editForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(3)]],\n description: [''],\n columnName: ['', [Validators.required, Validators.pattern(/^[a-zA-Z_][a-zA-Z0-9_]*$/)]],\n columnType: ['text', Validators.required],\n defaultValue: [''],\n defaultPosition: [0, [Validators.min(0)]],\n ontologyType: [''],\n customOntologyFilters: [{}],\n visibility: ['private', Validators.required],\n labGroup: [null],\n enableTypeahead: [false],\n excelValidation: [false],\n isActive: [true],\n tags: [''],\n category: ['']\n });\n }\n\n ngOnInit() {\n // Set initial disabled state for labGroup field\n this.onVisibilityChange();\n\n if (this.template && this.isEdit) {\n this.populateForm();\n // Reapply visibility logic after populating form\n this.onVisibilityChange();\n // Apply ontology filters if ontology type is set\n this.onOntologyTypeChange();\n }\n }\n\n private populateForm() {\n if (this.template) {\n this.editForm.patchValue({\n name: this.template.name,\n description: this.template.description || '',\n columnName: this.template.columnName,\n columnType: this.template.columnType,\n defaultValue: this.template.defaultValue || '',\n defaultPosition: this.template.defaultPosition || 0,\n ontologyType: this.template.ontologyType || '',\n customOntologyFilters: this.template.customOntologyFilters || {},\n visibility: this.template.visibility || 'private',\n labGroup: this.template.labGroup || null,\n enableTypeahead: this.template.enableTypeahead || false,\n excelValidation: this.template.excelValidation || false,\n isActive: this.template.isActive !== false,\n tags: this.template.tags || '',\n category: this.template.category || ''\n });\n }\n }\n\n onVisibilityChange() {\n const visibility = this.editForm.get('visibility')?.value;\n const labGroupControl = this.editForm.get('labGroup');\n\n if (visibility === 'labGroup') {\n labGroupControl?.setValidators([Validators.required]);\n labGroupControl?.enable();\n } else {\n labGroupControl?.clearValidators();\n labGroupControl?.setValue(null);\n labGroupControl?.disable();\n }\n labGroupControl?.updateValueAndValidity();\n }\n\n onOntologyTypeChange() {\n const ontologyType = this.editForm.get('ontologyType')?.value;\n const customFiltersControl = this.editForm.get('customOntologyFilters');\n \n // Find the selected ontology type configuration\n const selectedOntology = this.ontologyTypes.find(ont => ont.value === ontologyType);\n \n if (selectedOntology && selectedOntology.customFilters) {\n // Apply the custom filter from the ontology type\n customFiltersControl?.setValue(selectedOntology.customFilters);\n } else {\n // Clear custom filters if no ontology type selected or no custom filter defined\n customFiltersControl?.setValue({});\n }\n \n customFiltersControl?.markAsDirty();\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<MetadataColumnTemplate> = {\n ...formValue,\n labGroup: formValue.visibility === 'labGroup' ? formValue.labGroup : null,\n defaultPosition: Number(formValue.defaultPosition) || 0\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 if (control.errors['pattern']) return `${fieldName} must be a valid identifier (letters, numbers, underscore)`;\n if (control.errors['min']) return `${fieldName} must be at least ${control.errors['min'].min}`;\n }\n return '';\n }\n\n get title(): string {\n return this.isEdit ? 'Edit Column Template' : 'Create Column Template';\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-clipboard-list 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-md-6 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-md-6 mb-3\">\n <label for=\"columnName\" class=\"form-label\">Column Name *</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"columnName\"\n formControlName=\"columnName\"\n [class.is-invalid]=\"editForm.get('columnName')?.invalid && editForm.get('columnName')?.touched\"\n placeholder=\"columnName\">\n <div class=\"invalid-feedback\">\n {{ getFieldError('columnName') }}\n </div>\n <small class=\"form-text text-muted\">Column name based on column type and template name. Example: characteristics[biological replicate]</small>\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=\"2\"\n placeholder=\"Optional description\"></textarea>\n </div>\n\n <!-- Column 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>Column Configuration\n </h6>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"columnType\" class=\"form-label\">Column Type *</label>\n <select\n class=\"form-select\"\n id=\"columnType\"\n formControlName=\"columnType\"\n [class.is-invalid]=\"editForm.get('columnType')?.invalid && editForm.get('columnType')?.touched\">\n @for (type of columnTypes; track type.value) {\n <option [value]=\"type.value\">{{ type.label }}</option>\n }\n </select>\n <div class=\"invalid-feedback\">\n {{ getFieldError('columnType') }}\n </div>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"defaultPosition\" class=\"form-label\">Default Position</label>\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"defaultPosition\"\n formControlName=\"defaultPosition\"\n [class.is-invalid]=\"editForm.get('defaultPosition')?.invalid && editForm.get('defaultPosition')?.touched\"\n min=\"0\"\n placeholder=\"0\">\n <div class=\"invalid-feedback\">\n {{ getFieldError('defaultPosition') }}\n </div>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"defaultValue\" class=\"form-label\">Default Value</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"defaultValue\"\n formControlName=\"defaultValue\"\n placeholder=\"Optional default value\">\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"ontologyType\" class=\"form-label\">Ontology Type</label>\n <select\n class=\"form-select\"\n id=\"ontologyType\"\n formControlName=\"ontologyType\"\n (change)=\"onOntologyTypeChange()\">\n @for (ontology of ontologyTypes; track $index) {\n <option [value]=\"ontology.value\">{{ ontology.label }}</option>\n }\n </select>\n </div>\n\n @if (editForm.get('ontologyType')?.value && editForm.get('customOntologyFilters')?.value && Object.keys(editForm.get('customOntologyFilters')?.value || {}).length > 0) {\n <div class=\"col-12 mb-3\">\n <div class=\"alert alert-info\">\n <h6 class=\"alert-heading\">\n <i class=\"bi bi-filter me-2\"></i>Custom Ontology Filters Applied\n </h6>\n <small class=\"mb-0\">\n The following custom filters will be automatically applied for this ontology type:\n <code class=\"ms-1\">{{ editForm.get('customOntologyFilters')?.value | json }}</code>\n </small>\n </div>\n </div>\n }\n\n <!-- Visibility and Access -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-eye me-2\"></i>Visibility and Access\n </h6>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"visibility\" class=\"form-label\">Visibility *</label>\n <select\n class=\"form-select\"\n id=\"visibility\"\n formControlName=\"visibility\"\n (change)=\"onVisibilityChange()\"\n [class.is-invalid]=\"editForm.get('visibility')?.invalid && editForm.get('visibility')?.touched\">\n @for (option of visibilityOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n <div class=\"invalid-feedback\">\n {{ getFieldError('visibility') }}\n </div>\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=\"labGroup\"\n [class.is-invalid]=\"editForm.get('labGroup')?.invalid && editForm.get('labGroup')?.touched\">\n <option [ngValue]=\"null\">Select Lab Group</option>\n @for (group of labGroups; track group.id) {\n <option [ngValue]=\"group.id\">{{ group.name }}</option>\n }\n </select>\n <div class=\"invalid-feedback\">\n {{ getFieldError('labGroup') }}\n </div>\n </div>\n\n <!-- Additional Options -->\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>Additional Options\n </h6>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"category\" class=\"form-label\">Category</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"category\"\n formControlName=\"category\"\n placeholder=\"Template category\">\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"tags\" class=\"form-label\">Tags</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"tags\"\n formControlName=\"tags\"\n placeholder=\"Comma-separated tags\">\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=\"enableTypeahead\"\n formControlName=\"enableTypeahead\">\n <label class=\"form-check-label\" for=\"enableTypeahead\">\n Enable Typeahead\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=\"excelValidation\"\n formControlName=\"excelValidation\">\n <label class=\"form-check-label\" for=\"excelValidation\">\n Excel Validation\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=\"isActive\"\n formControlName=\"isActive\">\n <label class=\"form-check-label\" for=\"isActive\">\n Active\n </label>\n </div>\n </div>\n </div>\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, OnInit, signal, computed, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { NgbModule, NgbModal, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap';\nimport { debounceTime, distinctUntilChanged } from 'rxjs';\nimport { ColumnTemplateEditModal } from './column-template-edit-modal/column-template-edit-modal';\nimport {\n MetadataColumnTemplate,\n MetadataColumnTemplateCreateRequest\n} from '../../models';\nimport { MetadataColumnTemplateService } from '../../services';\nimport { ResourceVisibility } from '@noatgnu/cupcake-core';\nimport { LabGroupService, LabGroup, LabGroupQueryResponse } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-column-templates',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule, NgbPaginationModule],\n templateUrl: './column-templates.html',\n styleUrl: './column-templates.scss'\n})\nexport class ColumnTemplates 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: null as string | null,\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 // Column filter\n columnFilter = signal('');\n \n // Sorting\n sortField = signal<string>('');\n sortDirection = signal<'asc' | 'desc'>('asc');\n\n // Direct signal-based data management\n templatesData = signal<{count: number, results: MetadataColumnTemplate[]}>({ count: 0, results: [] });\n labGroupsData = signal<LabGroupQueryResponse>({ count: 0, results: [] });\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 // Filtered and sorted templates\n filteredTemplates = computed(() => {\n const templates = this.templatesData().results;\n const filter = this.columnFilter().toLowerCase();\n const sortField = this.sortField();\n const sortDirection = this.sortDirection();\n \n // Apply filter\n let filtered = filter ? \n templates.filter(template => \n template.columnName.toLowerCase().includes(filter) ||\n template.name.toLowerCase().includes(filter)\n ) : templates;\n \n // Apply sorting\n if (sortField) {\n filtered = [...filtered].sort((a, b) => {\n let aValue: any = '';\n let bValue: any = '';\n \n switch (sortField) {\n case 'name':\n aValue = a.name?.toLowerCase() || '';\n bValue = b.name?.toLowerCase() || '';\n break;\n case 'columnName':\n aValue = a.columnName?.toLowerCase() || '';\n bValue = b.columnName?.toLowerCase() || '';\n break;\n case 'columnType':\n aValue = a.columnType?.toLowerCase() || '';\n bValue = b.columnType?.toLowerCase() || '';\n break;\n case 'ontologyType':\n aValue = a.ontologyType?.toLowerCase() || '';\n bValue = b.ontologyType?.toLowerCase() || '';\n break;\n case 'visibility':\n aValue = a.visibility?.toLowerCase() || '';\n bValue = b.visibility?.toLowerCase() || '';\n break;\n default:\n return 0;\n }\n \n if (aValue < bValue) return sortDirection === 'asc' ? -1 : 1;\n if (aValue > bValue) return sortDirection === 'asc' ? 1 : -1;\n return 0;\n });\n }\n \n return filtered;\n });\n\n constructor(\n private fb: FormBuilder,\n private metadataColumnTemplateService: MetadataColumnTemplateService,\n private labGroupService: LabGroupService,\n private modalService: NgbModal\n ) {\n this.searchForm = this.fb.group({\n search: [''],\n labGroupId: [null],\n visibility: [null]\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 }\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: null,\n limit: this.pageSize(),\n offset: 0\n });\n }\n\n private loadLabGroupsWithParams(params: { limit: number; offset: number }) {\n this.labGroupService.getMyLabGroups({ limit: params.limit, offset: params.offset }).subscribe({\n next: (response: LabGroupQueryResponse) => {\n this.labGroupsTotalItems.set(response.count);\n this.labGroupsData.set(response);\n },\n error: (error: any) => {\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 || null,\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.metadataColumnTemplateService.getMetadataColumnTemplates({\n search: params.search || undefined,\n labGroupId: params.labGroupId || undefined,\n visibility: params.visibility || 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 column 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 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 // Column filter methods\n onColumnFilterChange(value: string): void {\n this.columnFilter.set(value);\n }\n\n clearColumnFilter(): void {\n this.columnFilter.set('');\n }\n\n get filteredTemplatesCount(): number {\n return this.filteredTemplates().length;\n }\n\n get totalTemplatesCount(): number {\n return this.templatesData().results.length;\n }\n\n // Sorting methods\n sortBy(field: string): void {\n const currentField = this.sortField();\n const currentDirection = this.sortDirection();\n \n if (currentField === field) {\n // Toggle direction if same field\n this.sortDirection.set(currentDirection === 'asc' ? 'desc' : 'asc');\n } else {\n // New field, default to ascending\n this.sortField.set(field);\n this.sortDirection.set('asc');\n }\n }\n\n getSortIcon(field: string): string {\n const currentField = this.sortField();\n const currentDirection = this.sortDirection();\n \n if (currentField !== field) {\n return 'bi-arrow-down-up'; // Default unsorted icon\n }\n \n return currentDirection === 'asc' ? 'bi-sort-alpha-down' : 'bi-sort-alpha-up';\n }\n\n isSorted(field: string): boolean {\n return this.sortField() === field;\n }\n\n createTemplate() {\n this.openTemplateModal(null, false);\n }\n\n editTemplate(template: MetadataColumnTemplate) {\n this.openTemplateModal(template, true);\n }\n\n private openTemplateModal(template: MetadataColumnTemplate | null, isEdit: boolean) {\n const modalRef = this.modalService.open(ColumnTemplateEditModal, {\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<MetadataColumnTemplate>) => {\n this.handleTemplateSave(templateData, template?.id || null, isEdit);\n modalRef.componentInstance.onClose();\n });\n }\n\n private handleTemplateSave(templateData: Partial<MetadataColumnTemplate>, templateId: number | null, isEdit: boolean) {\n this.isLoading.set(true);\n \n const apiCall = isEdit && templateId\n ? this.metadataColumnTemplateService.updateMetadataColumnTemplate(templateId, templateData)\n : this.metadataColumnTemplateService.createMetadataColumnTemplate(templateData as MetadataColumnTemplateCreateRequest);\n\n apiCall.subscribe({\n next: (template) => {\n this.isLoading.set(false);\n console.log(`Column template ${isEdit ? 'updated' : 'created'}:`, template);\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error(`Error ${isEdit ? 'updating' : 'creating'} column template:`, error);\n alert(`Failed to ${isEdit ? 'update' : 'create'} template. Please try again.`);\n }\n });\n }\n\n deleteTemplate(template: MetadataColumnTemplate) {\n // Enhanced delete confirmation with better UX\n const confirmMessage = `Are you sure you want to delete the column template \"${template.name}\"?\\n\\nThis action cannot be undone.`;\n \n if (confirm(confirmMessage)) {\n this.isLoading.set(true);\n this.metadataColumnTemplateService.deleteMetadataColumnTemplate(template.id!).subscribe({\n next: () => {\n this.isLoading.set(false);\n console.log('Column template deleted successfully');\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error deleting column template:', error);\n alert('Failed to delete template. Please try again.');\n }\n });\n }\n }\n\n duplicateTemplate(template: MetadataColumnTemplate) {\n const duplicatedTemplate: Partial<MetadataColumnTemplate> = {\n name: `${template.name} (Copy)`,\n description: template.description,\n columnName: `${template.columnName}_copy`,\n columnType: template.columnType,\n defaultValue: template.defaultValue,\n ontologyType: template.ontologyType,\n visibility: ResourceVisibility.PRIVATE, // Always create as private\n labGroup: template.labGroup || this.selectedLabGroup()?.id || undefined,\n isActive: true\n };\n \n this.isLoading.set(true);\n this.metadataColumnTemplateService.createMetadataColumnTemplate(duplicatedTemplate as MetadataColumnTemplateCreateRequest).subscribe({\n next: (newTemplate) => {\n this.isLoading.set(false);\n console.log('Column template duplicated:', newTemplate);\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error duplicating column template:', error);\n alert('Failed to duplicate 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","<div class=\"column-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-clipboard-list me-2\"></i>Column 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 <button class=\"btn btn-primary btn-sm\" (click)=\"createTemplate()\">\n <i class=\"bi bi-plus me-1\"></i>New Template\n </button>\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-4\">\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-4\">\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-4\">\n <div class=\"form-check form-switch mt-3\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"globalTemplates\"\n formControlName=\"visibility\">\n <label class=\"form-check-label\" for=\"globalTemplates\">\n <i class=\"bi bi-globe me-1\"></i>Global 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\">\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-table me-2\"></i>Column 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 \n <!-- Column Filter -->\n @if (hasTemplates()) {\n <div class=\"d-flex align-items-center\">\n <div class=\"input-group input-group-sm me-3\" style=\"width: 300px;\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-funnel text-muted\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"Filter by column name or template...\"\n [value]=\"columnFilter()\"\n (input)=\"onColumnFilterChange($any($event.target).value)\">\n @if (columnFilter()) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"clearColumnFilter()\"\n title=\"Clear filter\">\n <i class=\"bi bi-x\"></i>\n </button>\n }\n </div>\n @if (columnFilter()) {\n <small class=\"text-muted\">\n {{ filteredTemplatesCount }}/{{ totalTemplatesCount }} templates\n </small>\n }\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 class=\"sortable\" \n (click)=\"sortBy('name')\"\n [class.sorted]=\"isSorted('name')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span><i class=\"bi bi-tag me-1\"></i>Template Name</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('name')\"></i>\n </div>\n </th>\n <th class=\"sortable\" \n (click)=\"sortBy('columnName')\"\n [class.sorted]=\"isSorted('columnName')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span><i class=\"bi bi-list me-1\"></i>Column Name</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('columnName')\"></i>\n </div>\n </th>\n <th class=\"sortable\" \n (click)=\"sortBy('columnType')\"\n [class.sorted]=\"isSorted('columnType')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span><i class=\"bi bi-layers me-1\"></i>Type</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('columnType')\"></i>\n </div>\n </th>\n <th class=\"sortable\" \n (click)=\"sortBy('ontologyType')\"\n [class.sorted]=\"isSorted('ontologyType')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span><i class=\"bi bi-diagram-3 me-1\"></i>Ontology</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('ontologyType')\"></i>\n </div>\n </th>\n <th class=\"sortable\" \n (click)=\"sortBy('visibility')\"\n [class.sorted]=\"isSorted('visibility')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span><i class=\"bi bi-globe me-1\"></i>Visibility</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('visibility')\"></i>\n </div>\n </th>\n <th><i class=\"bi bi-folder me-1\"></i>Category</th>\n <th><i class=\"bi bi-gear me-1\"></i>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (template of filteredTemplates(); track template.id) {\n <tr>\n <td>\n <strong>{{ template.name }}</strong>\n @if (template.isSystemTemplate) {\n <i class=\"bi bi-shield-check text-success ms-2\" title=\"System template\"></i>\n }\n </td>\n <td>{{ template.columnName }}</td>\n <td>\n <span class=\"badge bg-secondary\">{{ template.columnType }}</span>\n </td>\n <td>\n @if (template.ontologyType) {\n <span class=\"badge bg-success\">{{ template.ontologyType }}</span>\n } @else {\n <span class=\"text-muted\">-</span>\n }\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-warning\">Lab Group</span>\n }\n @case ('private') {\n <span class=\"badge bg-secondary\">Private</span>\n }\n @default {\n <span class=\"badge bg-secondary\">{{ template.visibility }}</span>\n }\n }\n </td>\n <td>\n @if (template.category) {\n <span class=\"badge bg-secondary\">{{ template.category }}</span>\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-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-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-clipboard-list fs-1 text-muted mb-3\"></i>\n <h5 class=\"text-muted\">No Column 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 column 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","import {Component, OnInit, signal, computed, inject} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { NgbModule, NgbModal, NgbTypeahead } from '@ng-bootstrap/ng-bootstrap';\nimport { Observable, OperatorFunction, debounceTime, distinctUntilChanged, filter, map, switchMap, of, catchError, forkJoin, firstValueFrom } from 'rxjs';\nimport {\n FavouriteMetadataOption,\n FavouriteMetadataOptionCreateRequest,\n MetadataColumn,\n MetadataColumnTemplate,\n OntologySuggestion,\n ColumnType\n} from '../../models';\nimport {\n FavouriteMetadataOptionService,\n MetadataColumnTemplateService,\n SdrfSyntaxService,\n SyntaxType\n} from '../../services';\nimport {\n MetadataValueEditModal,\n MetadataValueEditConfig\n} from '../metadata-value-edit-modal/metadata-value-edit-modal';\nimport { AuthService, User, LabGroupService, ToastService, LabGroup } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-favorite-management',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n RouterModule,\n NgbModule,\n NgbTypeahead\n ],\n templateUrl: './favorite-management.html',\n styleUrl: './favorite-management.scss'\n})\nexport class FavoriteManagement implements OnInit {\n\n Math = Math;\n\n isLoading = signal(false);\n favorites = signal<FavouriteMetadataOption[]>([]);\n totalFavoritesCount = signal(0);\n\n searchTerm = signal('');\n scopeFilter = signal('');\n labGroupFilter = signal('');\n columnTypeFilter = signal('');\n\n filteredFavorites = computed(() => {\n const searchTerm = this.searchTerm().toLowerCase();\n const scopeFilter = this.scopeFilter();\n const labGroupFilter = this.labGroupFilter();\n const columnTypeFilter = this.columnTypeFilter();\n\n return this.favorites().filter(fav => {\n const matchesSearch = !searchTerm ||\n fav.name.toLowerCase().includes(searchTerm) ||\n fav.value.toLowerCase().includes(searchTerm) ||\n (fav.displayValue?.toLowerCase().includes(searchTerm) ?? false);\n\n let matchesScope = true;\n if (scopeFilter) {\n if (scopeFilter === 'personal') {\n matchesScope = !!(fav.user && !fav.isGlobal && !fav.labGroup);\n } else if (scopeFilter === 'labGroup') {\n matchesScope = !!(fav.labGroup && !fav.isGlobal);\n } else if (scopeFilter === 'global') {\n matchesScope = !!fav.isGlobal;\n }\n }\n\n const matchesLabGroup = !labGroupFilter ||\n (fav.labGroup && fav.labGroup.toString() === labGroupFilter);\n\n const matchesType = !columnTypeFilter || fav.type.includes(columnTypeFilter);\n\n return matchesSearch && matchesScope && matchesLabGroup && matchesType;\n });\n });\n\n currentPage = signal(1);\n pageSize = signal(10);\n\n paginatedFavorites = computed(() => this.filteredFavorites());\n\n totalPages = computed(() => {\n const totalCount = this.totalFavoritesCount();\n const size = this.pageSize();\n return Math.ceil(totalCount / size);\n });\n\n searchForm: FormGroup;\n editForm: FormGroup;\n isEditMode = signal(false);\n editingFavorite = signal<FavouriteMetadataOption | null>(null);\n showEditModal = signal(false);\n\n private sdrfSyntaxService = inject(SdrfSyntaxService);\n specialSyntaxType = signal<SyntaxType | null>(null);\n showSpecialInput = signal(false);\n specialInputValue = signal('');\n\n currentUser = signal<User | null>(null);\n isAdmin = computed(() => {\n const user = this.currentUser();\n return user?.isStaff || user?.isSuperuser || false;\n });\n currentUserId = computed(() => this.currentUser()?.id || null);\n userLabGroups = signal<LabGroup[]>([]);\n userLabGroupsLoaded = signal(false);\n\n selectedOntologyValue: string | null = null;\n\n availableLabGroups = signal<{id: number, name: string}[]>([]);\n allLabGroups = signal<{id: number, name: string}[]>([]);\n\n availableColumnTemplates = signal<MetadataColumnTemplate[]>([]);\n columnTemplatesLoaded = signal(false);\n\n columnTypes = [\n { value: '', label: 'All Types' },\n { value: ColumnType.CHARACTERISTICS, label: 'Characteristics' },\n { value: ColumnType.FACTOR_VALUE, label: 'Factor Value' },\n { value: ColumnType.COMMENT, label: 'Comment' },\n { value: ColumnType.SOURCE_NAME, label: 'Source Name' },\n { value: ColumnType.SPECIAL, label: 'Special' }\n ];\n\n constructor(\n private fb: FormBuilder,\n private favouriteMetadataOptionService: FavouriteMetadataOptionService,\n private metadataColumnTemplateService: MetadataColumnTemplateService,\n private labGroupService: LabGroupService,\n private toastService: ToastService,\n private modalService: NgbModal,\n private authService: AuthService\n ) {\n this.searchForm = this.fb.group({\n search: [''],\n scope: [''],\n labGroup: [''],\n columnType: ['']\n });\n\n this.editForm = this.fb.group({\n name: ['', [Validators.required, Validators.maxLength(255)]],\n type: ['', [Validators.required, Validators.maxLength(255)]],\n value: ['', [Validators.maxLength(500)]],\n displayValue: ['', [Validators.maxLength(500)]],\n scope: ['personal', Validators.required],\n labGroupId: [null],\n templateId: [null],\n ontologyType: [''],\n enableTypeahead: [false]\n });\n\n this.editForm.get('value')?.valueChanges.subscribe(value => {\n if (typeof value === 'string' && value !== this.selectedOntologyValue) {\n console.log('Manual input detected, clearing stored ontology value');\n this.selectedOntologyValue = null;\n }\n });\n }\n\n ngOnInit() {\n this.currentUser.set(this.authService.getCurrentUser());\n\n\n this.authService.currentUser$.subscribe(user => {\n this.currentUser.set(user);\n if (user) {\n this.loadUserLabGroups();\n } else {\n this.loadFavorites();\n }\n });\n\n if (this.currentUser()) {\n this.loadUserLabGroups();\n } else {\n this.loadFavorites();\n }\n\n this.loadAvailableColumnTemplates();\n\n this.searchForm.valueChanges.subscribe(formValues => {\n this.searchTerm.set(formValues.search || '');\n this.scopeFilter.set(formValues.scope || '');\n this.labGroupFilter.set(formValues.labGroup || '');\n this.columnTypeFilter.set(formValues.columnType || '');\n\n this.currentPage.set(1);\n });\n }\n\n loadFavorites(): void {\n this.isLoading.set(true);\n\n const page = this.currentPage();\n const size = this.pageSize();\n const offset = (page - 1) * size;\n\n this.favouriteMetadataOptionService.getFavouriteMetadataOptions({\n limit: size,\n offset: offset\n }).subscribe({\n next: (response) => {\n this.favorites.set(response.results);\n this.totalFavoritesCount.set(response.count || response.results.length);\n this.isLoading.set(false);\n },\n error: (error) => {\n console.error('Error loading favorites:', error);\n this.toastService.error('Failed to load favorites');\n this.isLoading.set(false);\n }\n });\n }\n\n\n canEditFavorite(favorite: FavouriteMetadataOption): boolean {\n const userId = this.currentUserId();\n\n if (favorite.user && userId && Number(favorite.user) === Number(userId)) {\n return true;\n }\n\n if (favorite.isGlobal && this.isAdmin()) {\n return true;\n }\n\n return false;\n }\n\n canDeleteFavorite(favorite: FavouriteMetadataOption): boolean {\n return this.canEditFavorite(favorite);\n }\n\n openCreateModal(): void {\n this.isEditMode.set(false);\n this.editingFavorite.set(null);\n this.showEditModal.set(true);\n this.selectedOntologyValue = null;\n this.editForm.reset({\n name: '',\n type: '',\n value: '',\n displayValue: '',\n scope: 'personal',\n templateId: null\n });\n }\n\n openEditModal(favorite: FavouriteMetadataOption): void {\n if (!this.canEditFavorite(favorite)) return;\n\n this.isEditMode.set(true);\n this.editingFavorite.set(favorite);\n this.showEditModal.set(true);\n this.selectedOntologyValue = favorite.value; // Store the original value\n\n let scope = 'personal';\n if (favorite.isGlobal) scope = 'global';\n else if (favorite.labGroup) scope = 'labGroup';\n\n let templateId = favorite.columnTemplate || null;\n\n this.editForm.patchValue({\n name: favorite.name,\n type: favorite.type,\n value: favorite.value,\n displayValue: favorite.displayValue || '',\n scope: scope,\n labGroupId: favorite.labGroup || null,\n templateId: templateId,\n ontologyType: '',\n enableTypeahead: false\n });\n\n const syntaxType = this.sdrfSyntaxService.detectSpecialSyntax(\n favorite.name,\n favorite.type\n );\n\n if (syntaxType) {\n this.specialSyntaxType.set(syntaxType);\n this.showSpecialInput.set(true);\n this.specialInputValue.set(favorite.value || '');\n } else {\n this.specialSyntaxType.set(null);\n this.showSpecialInput.set(false);\n this.specialInputValue.set('');\n }\n\n if (!templateId) {\n this.findTemplatesForColumnName(favorite.name).then(templates => {\n const matchingTemplate = templates.find(t =>\n t.columnName === favorite.name && t.columnType === favorite.type\n );\n if (matchingTemplate?.id) {\n this.editForm.patchValue({\n templateId: matchingTemplate.id,\n ontologyType: matchingTemplate.ontologyType || '',\n enableTypeahead: matchingTemplate.enableTypeahead || false\n });\n }\n });\n }\n }\n\n saveFavorite(): void {\n if (this.editForm.invalid) return;\n\n const formValue = this.editForm.value;\n\n let value = this.selectedOntologyValue || formValue.value;\n\n if (typeof value === 'object' && value !== null) {\n value = value.value || value.displayName || String(value);\n }\n\n const favoriteData: FavouriteMetadataOptionCreateRequest = {\n name: formValue.name,\n type: formValue.type,\n columnTemplate: formValue.templateId || undefined,\n value: value,\n displayValue: formValue.displayValue || value,\n isGlobal: formValue.scope === 'global',\n user: formValue.scope === 'personal' ? this.currentUserId() || undefined : undefined,\n labGroup: formValue.scope === 'labGroup' ? formValue.labGroupId || this.userLabGroups()[0]?.id : undefined\n };\n\n const operation = this.isEditMode()\n ? this.favouriteMetadataOptionService.updateFavouriteMetadataOption(this.editingFavorite()!.id!, favoriteData)\n : this.favouriteMetadataOptionService.createFavouriteMetadataOption(favoriteData);\n\n operation.subscribe({\n next: (favorite) => {\n const action = this.isEditMode() ? 'updated' : 'created';\n this.toastService.success(`Favorite ${action} successfully!`);\n this.loadFavorites();\n this.closeEditModal();\n },\n error: (error) => {\n console.error('Error saving favorite:', error);\n const action = this.isEditMode() ? 'updating' : 'creating';\n this.toastService.error(`Failed ${action} favorite`);\n }\n });\n }\n\n deleteFavorite(favorite: FavouriteMetadataOption): void {\n if (!this.canDeleteFavorite(favorite)) return;\n\n const confirmMessage = `Are you sure you want to delete the favorite \"${favorite.displayValue || favorite.value}\"?`;\n\n if (confirm(confirmMessage)) {\n this.favouriteMetadataOptionService.deleteFavouriteMetadataOption(favorite.id!).subscribe({\n next: () => {\n this.toastService.success('Favorite deleted successfully!');\n this.loadFavorites();\n },\n error: (error) => {\n console.error('Error deleting favorite:', error);\n this.toastService.error('Failed to delete favorite');\n }\n });\n }\n }\n\n closeEditModal(): void {\n this.isEditMode.set(false);\n this.editingFavorite.set(null);\n this.showEditModal.set(false);\n this.selectedOntologyValue = null; // Clear stored ontology value\n }\n\n onPageChange(page: number): void {\n this.currentPage.set(page);\n this.loadFavorites();\n }\n\n onPageSizeChange(size: number): void {\n this.pageSize.set(size);\n this.currentPage.set(1);\n this.loadFavorites();\n }\n\n clearFilters(): void {\n this.searchForm.reset();\n this.searchTerm.set('');\n this.scopeFilter.set('');\n this.labGroupFilter.set('');\n this.columnTypeFilter.set('');\n this.currentPage.set(1);\n }\n\n getScopeDisplay(favorite: FavouriteMetadataOption): string {\n if (favorite.isGlobal) return 'Global';\n if (favorite.labGroup) return `Lab Group: ${favorite.labGroupName || favorite.labGroup}`;\n if (favorite.user) return `Personal (${favorite.userUsername || favorite.user})`;\n return 'Unknown';\n }\n\n getScopeClass(favorite: FavouriteMetadataOption): string {\n if (favorite.isGlobal) return 'badge bg-success';\n if (favorite.labGroup) return 'badge bg-info';\n if (favorite.user) return 'badge bg-primary';\n return 'badge bg-secondary';\n }\n\n get editModalTitle(): string {\n return this.isEditMode() ? 'Edit Favorite' : 'Create New Favorite';\n }\n\n loadUserLabGroups(): void {\n this.labGroupService.getMyLabGroups({ limit: 10 }).subscribe({\n next: (response) => {\n this.userLabGroups.set(response.results);\n\n const labGroups = response.results.map(group => ({\n id: group.id!,\n name: group.name\n }));\n this.availableLabGroups.set(labGroups);\n\n this.userLabGroupsLoaded.set(true);\n this.loadFavorites();\n },\n error: (error) => {\n console.error('Error loading user lab groups:', error);\n this.userLabGroups.set([]);\n this.availableLabGroups.set([]);\n this.userLabGroupsLoaded.set(true);\n this.loadFavorites();\n }\n });\n\n this.labGroupService.getLabGroups({ limit: 10 }).subscribe({\n next: (response) => {\n const allLabGroups = response.results.map(group => ({\n id: group.id!,\n name: group.name\n }));\n this.allLabGroups.set(allLabGroups);\n\n if (this.isAdmin()) {\n this.availableLabGroups.set(allLabGroups);\n }\n },\n error: (error) => {\n console.error('Error loading all lab groups:', error);\n }\n });\n }\n\n loadAvailableColumnTemplates(): void {\n this.metadataColumnTemplateService.getMetadataColumnTemplates({ limit: 10 }).subscribe({\n next: (response) => {\n this.availableColumnTemplates.set(response.results);\n this.columnTemplatesLoaded.set(true);\n },\n error: (error) => {\n console.error('Error loading column templates:', error);\n this.availableColumnTemplates.set([]);\n this.columnTemplatesLoaded.set(true);\n }\n });\n }\n\n searchColumnNames: OperatorFunction<string, readonly string[]> = (text$: Observable<string>) =>\n text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n switchMap(term => {\n if (term.length === 0) {\n return of(this.getColumnNameSuggestions(''));\n } else if (term.length >= 1) {\n return this.metadataColumnTemplateService.getMetadataColumnTemplates({\n search: term,\n limit: 10\n }).pipe(\n map(response => {\n const uniqueNames = [...new Set(response.results.map((template: MetadataColumnTemplate) => template.columnName))];\n return uniqueNames.sort();\n }),\n catchError(() => {\n return of(this.getColumnNameSuggestions(term));\n })\n );\n } else {\n return of([]);\n }\n })\n );\n\n private getColumnNameSuggestions(term: string): string[] {\n const templates = this.availableColumnTemplates();\n const uniqueNames = [...new Set(templates.map(template => template.columnName))];\n\n if (!term) {\n return uniqueNames.sort().slice(0, 10);\n }\n\n return uniqueNames\n .filter(name => name.toLowerCase().includes(term.toLowerCase()))\n .sort()\n .slice(0, 10);\n }\n\n searchColumnTypes: OperatorFunction<string, readonly string[]> = (text$: Observable<string>) =>\n text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n filter(term => term.length >= 1),\n map(term => this.getColumnTypeSuggestions(term))\n );\n\n private getColumnTypeSuggestions(term: string): string[] {\n const selectedName = this.editForm.get('name')?.value;\n const templates = this.availableColumnTemplates();\n\n let availableTypes: string[];\n if (selectedName) {\n availableTypes = templates\n .filter(template => template.columnName === selectedName)\n .map(template => template.columnType);\n } else {\n availableTypes = [...new Set(templates.map(template => template.columnType))];\n }\n\n return availableTypes\n .filter(type => type.toLowerCase().includes(term.toLowerCase()))\n .sort()\n .slice(0, 10);\n }\n\n onColumnNameSelected(event: any): void {\n const selectedName = event.item || event;\n if (typeof selectedName === 'string') {\n this.editForm.patchValue({ name: selectedName });\n\n this.findTemplatesForColumnName(selectedName).then(templatesForName => {\n if (templatesForName.length > 0) {\n const currentType = this.editForm.get('type')?.value;\n const typesForName = templatesForName.map(template => template.columnType);\n\n if (!currentType || !typesForName.includes(currentType)) {\n const firstTemplate = templatesForName[0];\n this.editForm.patchValue({\n type: firstTemplate.columnType,\n templateId: firstTemplate.id,\n ontologyType: firstTemplate.ontologyType || '',\n enableTypeahead: firstTemplate.enableTypeahead || false\n });\n } else {\n const matchingTemplate = templatesForName.find(t => t.columnType === currentType);\n if (matchingTemplate) {\n this.editForm.patchValue({\n templateId: matchingTemplate.id,\n ontologyType: matchingTemplate.ontologyType || '',\n enableTypeahead: matchingTemplate.enableTypeahead || false\n });\n } else {\n this.editForm.patchValue({\n templateId: null,\n ontologyType: '',\n enableTypeahead: false\n });\n }\n }\n } else {\n this.editForm.patchValue({\n templateId: null,\n ontologyType: '',\n enableTypeahead: false\n });\n }\n\n this.checkForSpecialSyntax();\n });\n }\n }\n\n private async findTemplatesForColumnName(columnName: string): Promise<MetadataColumnTemplate[]> {\n const cached = this.availableColumnTemplates();\n const cachedMatches = cached.filter(template => template.columnName === columnName);\n\n if (cachedMatches.length > 0) {\n return cachedMatches;\n }\n\n try {\n const response = await firstValueFrom(this.metadataColumnTemplateService.getMetadataColumnTemplates({\n search: columnName,\n limit: 10\n }));\n\n if (response) {\n const exactMatches = response.results.filter((template: MetadataColumnTemplate) => template.columnName === columnName);\n return exactMatches;\n }\n } catch (error) {\n console.warn('Failed to fetch templates for column name:', columnName, error);\n }\n\n return [];\n }\n\n onColumnTypeSelected(event: any): void {\n const selectedType = event.item || event;\n if (typeof selectedType === 'string') {\n this.editForm.patchValue({ type: selectedType });\n\n const selectedName = this.editForm.get('name')?.value;\n if (selectedName) {\n const templates = this.availableColumnTemplates();\n const matchingTemplate = templates.find(template =>\n template.columnName === selectedName && template.columnType === selectedType\n );\n\n if (matchingTemplate && matchingTemplate.id) {\n this.editForm.patchValue({\n templateId: matchingTemplate.id,\n ontologyType: matchingTemplate.ontologyType || '',\n enableTypeahead: matchingTemplate.enableTypeahead || false\n });\n } else {\n this.editForm.patchValue({\n templateId: null,\n ontologyType: '',\n enableTypeahead: false\n });\n }\n }\n\n this.checkForSpecialSyntax();\n }\n }\n\n openValueEditModal(): void {\n const formValue = this.editForm.value;\n\n const config: MetadataValueEditConfig = {\n columnName: formValue.name || 'Column',\n columnType: formValue.type || '',\n ontologyType: formValue.ontologyType || '',\n enableTypeahead: formValue.enableTypeahead || false,\n currentValue: formValue.value || '',\n context: 'favorite_management',\n templateId: formValue.templateId || undefined\n };\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 const newValue = typeof result === 'string' ? result : result.value;\n this.editForm.get('value')?.setValue(newValue);\n this.editForm.get('value')?.markAsTouched();\n this.selectedOntologyValue = newValue;\n modalRef.componentInstance.onClose();\n });\n }\n\n searchLabGroups: OperatorFunction<string, readonly {id: number, name: string}[]> = (text$: Observable<string>) =>\n text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n switchMap(term => {\n if (term.length === 0) {\n return of(this.availableLabGroups().slice(0, 10));\n } else if (term.length >= 1) {\n return this.labGroupService.getLabGroups({\n search: term,\n limit: 10\n }).pipe(\n map(response => response.results.map(group => ({\n id: group.id!,\n name: group.name\n }))),\n catchError(() => {\n return of(this.getLabGroupSuggestions(term));\n })\n );\n } else {\n return of([]);\n }\n })\n );\n\n private getLabGroupSuggestions(term: string): {id: number, name: string}[] {\n const allGroups = this.allLabGroups();\n\n if (!term) {\n return allGroups.slice(0, 10);\n }\n\n return allGroups\n .filter(group => group.name.toLowerCase().includes(term.toLowerCase()))\n .slice(0, 10);\n }\n\n formatLabGroup = (group: {id: number, name: string}): string => {\n return group.name;\n };\n\n inputLabGroupFormatter = (group: {id: number, name: string}): string => {\n return group.name;\n };\n\n onLabGroupSelected = (event: any): void => {\n const selectedGroup = event.item;\n if (selectedGroup && selectedGroup.id) {\n this.searchForm.patchValue({ labGroup: selectedGroup.id.toString() });\n }\n };\n\n getCleanColumnName(name: string): string {\n if (!name) return '';\n\n const bracketMatch = name.match(/\\[(.+?)\\]/);\n if (bracketMatch) {\n return bracketMatch[1];\n }\n\n return name;\n }\n\n getCleanColumnType(type: string): string {\n if (!type) return '';\n\n const cleanType = type.replace(/\\[.*?\\]/g, '').trim();\n\n return cleanType.charAt(0).toUpperCase() + cleanType.slice(1);\n }\n\n isComplexValue(value: string): boolean {\n if (!value) return false;\n\n const sdrfPattern = /^[A-Z]{2,3}=[^;]+(?:;[A-Z]{2,3}=[^;]+)+$/;\n const keyValuePattern = /\\w+[:=][^;,]+[;,]\\w+[:=]/;\n\n return sdrfPattern.test(value) || keyValuePattern.test(value);\n }\n\n parseComplexValue(value: string): {key: string, value: string}[] {\n if (!value) return [];\n\n const pairs: {key: string, value: string}[] = [];\n\n if (value.includes('=') && value.includes(';')) {\n const parts = value.split(';');\n parts.forEach(part => {\n const [key, val] = part.split('=', 2);\n if (key && val) {\n pairs.push({\n key: key.trim(),\n value: val.trim()\n });\n }\n });\n }\n else if (value.includes(':') && (value.includes(';') || value.includes(','))) {\n const separator = value.includes(';') ? ';' : ',';\n const parts = value.split(separator);\n parts.forEach(part => {\n const [key, val] = part.split(':', 2);\n if (key && val) {\n pairs.push({\n key: key.trim(),\n value: val.trim()\n });\n }\n });\n }\n\n return pairs;\n }\n\n checkForSpecialSyntax(): void {\n const columnName = this.editForm.get('name')?.value;\n const columnType = this.editForm.get('type')?.value;\n\n if (columnName && columnType) {\n const syntaxType = this.sdrfSyntaxService.detectSpecialSyntax(columnName, columnType);\n this.specialSyntaxType.set(syntaxType);\n\n if (syntaxType) {\n this.showSpecialInput.set(true);\n const currentValue = this.editForm.get('value')?.value;\n this.specialInputValue.set(currentValue || '');\n // Clear ontology value when switching to enhanced editor\n this.selectedOntologyValue = null;\n } else {\n this.showSpecialInput.set(false);\n this.specialInputValue.set('');\n }\n } else {\n this.specialSyntaxType.set(null);\n this.showSpecialInput.set(false);\n this.specialInputValue.set('');\n }\n }\n\n onSpecialInputChange(value: string): void {\n this.specialInputValue.set(value);\n // When enhanced editor provides a value, clear the ontology value storage\n // because the enhanced editor is providing the final string value\n this.selectedOntologyValue = null;\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 // Clear ontology value when switching back to regular input\n this.selectedOntologyValue = null;\n this.editForm.patchValue({ value: this.specialInputValue() });\n } else {\n // Switching to special input, clear ontology value\n this.selectedOntologyValue = null;\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 getColumnTypeClass(favouriteOption: FavouriteMetadataOption): string {\n const type = favouriteOption.type?.toLowerCase() || '';\n if (type.includes(ColumnType.CHARACTERISTICS)) return 'text-primary';\n if (type.includes(ColumnType.FACTOR_VALUE.replace('_', ' '))) return 'text-success';\n if (type.includes(ColumnType.COMMENT)) return 'text-info';\n if (type.includes(ColumnType.SOURCE_NAME.replace('_', ' '))) return 'text-warning';\n if (type === ColumnType.SPECIAL) return 'text-danger';\n return 'text-muted';\n }\n\n getColumnTypeIcon(favouriteMetadataOption: FavouriteMetadataOption): string {\n const type = favouriteMetadataOption.type?.toLowerCase() || '';\n if (type.includes(ColumnType.CHARACTERISTICS)) return 'bi-tags';\n if (type.includes(ColumnType.FACTOR_VALUE.replace('_', ' '))) return 'bi-sliders';\n if (type.includes(ColumnType.COMMENT)) return 'bi-chat-left-text';\n if (type.includes(ColumnType.SOURCE_NAME.replace('_', ' '))) return 'bi-diagram-3';\n if (type === ColumnType.SPECIAL) return 'bi-star';\n return 'bi-circle';\n }\n}\n","<div class=\"favorite-management-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=\"mb-0\">\n <i class=\"bi bi-heart-fill me-2 text-danger\"></i>Favorite Management\n </h4>\n <span class=\"badge bg-primary ms-3\">{{ filteredFavorites().length }} favorites</span>\n </div>\n\n <div class=\"d-flex gap-2\">\n <button\n type=\"button\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"openCreateModal()\"\n [disabled]=\"isLoading()\">\n <i class=\"bi bi-plus-circle me-1\"></i>Add Favorite\n </button>\n </div>\n </div>\n </div>\n </nav>\n\n <div class=\"tables-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 <label for=\"search\" class=\"form-label\">Search</label>\n <div class=\"input-group\">\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 id=\"search\"\n formControlName=\"search\"\n placeholder=\"Search by name or value\">\n </div>\n </div>\n\n <div class=\"col-md-3\">\n <label for=\"scope\" class=\"form-label\">Scope</label>\n <select class=\"form-select\" id=\"scope\" formControlName=\"scope\">\n <option value=\"\">All Scopes</option>\n <option value=\"personal\">Personal</option>\n <option value=\"lab_group\">Lab Group</option>\n <option value=\"global\">Global</option>\n </select>\n </div>\n\n <div class=\"col-md-3\">\n <label for=\"labGroup\" class=\"form-label\">Lab Group</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"labGroup\"\n formControlName=\"labGroup\"\n placeholder=\"All Lab Groups\"\n [ngbTypeahead]=\"searchLabGroups\"\n [resultFormatter]=\"formatLabGroup\"\n [inputFormatter]=\"inputLabGroupFormatter\"\n (selectItem)=\"onLabGroupSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\">\n </div>\n\n <div class=\"col-md-3\">\n <label for=\"columnType\" class=\"form-label\">Column Type</label>\n <select class=\"form-select\" id=\"columnType\" formControlName=\"columnType\">\n @for (type of columnTypes; track type.value) {\n <option [value]=\"type.value\">{{ type.label }}</option>\n }\n </select>\n </div>\n </form>\n </div>\n </div>\n\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-table me-2\"></i>Favorites options\n <span class=\"badge bg-primary ms-2\"></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 (!isLoading()) {\n\n @if (filteredFavorites().length === 0) {\n <div class=\"text-center py-5\">\n <i class=\"bi bi-heart display-1 text-muted\"></i>\n <h5 class=\"mt-3 text-muted\">No Favorites Found</h5>\n @if (searchTerm() || scopeFilter() || columnTypeFilter()) {\n <p class=\"text-muted\">Try adjusting your search criteria</p>\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"clearFilters()\">\n <i class=\"bi bi-arrow-clockwise me-1\"></i>Clear Filters\n </button>\n } @else {\n <p class=\"text-muted\">Create your first favorite to get started</p>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"openCreateModal()\">\n <i class=\"bi bi-plus-circle me-1\"></i>Add First Favorite\n </button>\n }\n </div>\n }\n\n <!-- Favorites Table -->\n @if (filteredFavorites().length > 0) {\n <div class=\"card\">\n <div class=\"card-body p-0\">\n <div class=\"table-responsive\">\n <table class=\"table table-hover mb-0\">\n <thead>\n <tr>\n <th scope=\"col\" style=\"width: 200px;\">Column</th>\n <th scope=\"col\" style=\"width: 200px;\">Display Name</th>\n <th scope=\"col\">Value</th>\n <th scope=\"col\" style=\"width: 150px;\">Scope</th>\n <th scope=\"col\" style=\"width: 120px;\">Created</th>\n <th scope=\"col\" style=\"width: 120px;\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (favorite of paginatedFavorites(); track favorite.id) {\n <tr>\n <td>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"d-flex align-items-center\">\n <i class=\"me-2\" [class]=\"getColumnTypeIcon(favorite) + ' ' + getColumnTypeClass(favorite)\"></i>\n <span class=\"fw-semibold\">{{ getCleanColumnName(favorite.name) }}</span>\n </div>\n </div>\n </td>\n <td>\n <div class=\"text-truncate\" [title]=\"favorite.displayValue || 'No display name'\">\n @if (favorite.displayValue && favorite.displayValue.trim()) {\n {{ favorite.displayValue }}\n } @else {\n <span class=\"text-muted fst-italic\">No display name</span>\n }\n </div>\n </td>\n <td>\n <div style=\"max-width: 300px;\">\n @if (isComplexValue(favorite.value)) {\n <!-- Complex value with key-value pairs -->\n <div class=\"d-flex flex-wrap gap-1\">\n @for (pair of parseComplexValue(favorite.value); track $index) {\n <span class=\"badge bg-light text-dark border\">\n <small><strong>{{ pair.key }}:</strong> {{ pair.value }}</small>\n </span>\n }\n </div>\n } @else {\n <!-- Simple value -->\n <div class=\"text-truncate\" [title]=\"favorite.value\">\n {{ favorite.value }}\n </div>\n }\n </div>\n </td>\n <td>\n <span [class]=\"getScopeClass(favorite)\">\n @if (favorite.isGlobal) {\n <i class=\"bi bi-globe me-1\"></i>Global\n } @else if (favorite.labGroup) {\n <i class=\"bi bi-people me-1\"></i>Lab Group\n } @else {\n <i class=\"bi bi-person me-1\"></i>Personal\n }\n </span>\n @if (favorite.userUsername && !favorite.isGlobal) {\n <br><small class=\"text-muted\">{{ favorite.userUsername }}</small>\n }\n @if (favorite.labGroupName) {\n <br><small class=\"text-muted\">{{ favorite.labGroupName }}</small>\n }\n </td>\n <td>\n <small class=\"text-muted\">\n {{ favorite.createdAt | date:'MMM d, y' }}\n </small>\n </td>\n <td>\n <div class=\"btn-group btn-group-sm\">\n @if (canEditFavorite(favorite)) {\n <button\n type=\"button\"\n class=\"btn btn-outline-primary\"\n (click)=\"openEditModal(favorite)\"\n title=\"Edit favorite\">\n <i class=\"bi bi-pencil\"></i>\n </button>\n }\n @if (canDeleteFavorite(favorite)) {\n <button\n type=\"button\"\n class=\"btn btn-outline-danger\"\n (click)=\"deleteFavorite(favorite)\"\n title=\"Delete favorite\">\n <i class=\"bi bi-trash\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n <!-- Pagination -->\n @if (totalPages() > 1) {\n <div class=\"d-flex justify-content-between align-items-center mt-4\">\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"text-muted\">Show:</span>\n <select\n class=\"form-select form-select-sm\"\n style=\"width: auto;\"\n [value]=\"pageSize()\"\n (change)=\"onPageSizeChange(+($any($event.target).value))\">\n <option value=\"10\">10</option>\n <option value=\"25\">25</option>\n <option value=\"50\">50</option>\n <option value=\"100\">100</option>\n </select>\n <span class=\"text-muted\">per page</span>\n </div>\n\n <ngb-pagination\n [collectionSize]=\"totalFavoritesCount()\"\n [page]=\"currentPage()\"\n [pageSize]=\"pageSize()\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"true\"\n [rotate]=\"true\"\n (pageChange)=\"onPageChange($event)\"\n class=\"pagination-sm mb-0\">\n </ngb-pagination>\n\n <span class=\"text-muted\">\n Showing {{ ((currentPage() - 1) * pageSize()) + 1 }}-{{ Math.min(currentPage() * pageSize(), totalFavoritesCount()) }}\n of {{ totalFavoritesCount() }} favorites\n </span>\n </div>\n }\n }\n }\n </div>\n </div>\n </div>\n</div>\n\n<!-- Edit/Create Modal -->\n@if (showEditModal()) {\n <div class=\"modal fade show d-block\" tabindex=\"-1\" style=\"background: rgba(0,0,0,0.5);\">\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">\n <i class=\"bi bi-heart me-2\"></i>{{ editModalTitle }}\n </h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"closeEditModal()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <form [formGroup]=\"editForm\" (ngSubmit)=\"saveFavorite()\">\n <div class=\"row\">\n <div class=\"col-md-6 mb-3\">\n <label for=\"favName\" class=\"form-label\">\n Column Name *\n @if (columnTemplatesLoaded()) {\n <small class=\"text-success ms-1\">\n <i class=\"bi bi-search\"></i> Autocomplete Available\n </small>\n }\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"favName\"\n formControlName=\"name\"\n [class.is-invalid]=\"editForm.get('name')?.invalid && editForm.get('name')?.touched\"\n placeholder=\"e.g., organism\"\n [ngbTypeahead]=\"searchColumnNames\"\n (selectItem)=\"onColumnNameSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\">\n <div class=\"form-text\">\n @if (columnTemplatesLoaded()) {\n Type to search available column names from templates\n } @else {\n Loading column suggestions...\n }\n </div>\n <div class=\"invalid-feedback\">\n @if (editForm.get('name')?.errors?.['required']) {\n Column name is required\n }\n @if (editForm.get('name')?.errors?.['maxlength']) {\n Column name must be less than 255 characters\n }\n </div>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"favType\" class=\"form-label\">\n Column Type *\n @if (columnTemplatesLoaded()) {\n <small class=\"text-success ms-1\">\n <i class=\"bi bi-search\"></i> Autocomplete Available\n </small>\n }\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"favType\"\n formControlName=\"type\"\n [class.is-invalid]=\"editForm.get('type')?.invalid && editForm.get('type')?.touched\"\n placeholder=\"e.g., characteristics[organism]\"\n [ngbTypeahead]=\"searchColumnTypes\"\n (selectItem)=\"onColumnTypeSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\">\n <div class=\"form-text\">\n @if (columnTemplatesLoaded()) {\n Type to search available column types (filtered by selected name)\n } @else {\n Loading column suggestions...\n }\n </div>\n <div class=\"invalid-feedback\">\n @if (editForm.get('type')?.errors?.['required']) {\n Column type is required\n }\n @if (editForm.get('type')?.errors?.['maxlength']) {\n Column type must be less than 255 characters\n }\n </div>\n </div>\n </div>\n\n <div class=\"mb-3\">\n <label for=\"favValue\" class=\"form-label\">\n Value\n @if (editForm.get('templateId')?.value) {\n <span class=\"badge bg-success ms-2\">\n <i class=\"bi bi-search me-1\"></i>Advanced Editor 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 <div class=\"input-group\">\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"favValue\"\n formControlName=\"value\"\n [class.is-invalid]=\"editForm.get('value')?.invalid && editForm.get('value')?.touched\"\n placeholder=\"Enter favorite 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 (editForm.get('templateId')?.value) {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to use advanced value editor with ontology autocomplete suggestions\n } @else if (specialSyntaxType()) {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to use enhanced {{ specialSyntaxType() }} editor for structured input\n } @else {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to set the value (select column name and type for smart suggestions)\n }\n </div>\n <div class=\"invalid-feedback\">\n @if (editForm.get('value')?.errors?.['maxlength']) {\n Value must be less than 500 characters\n }\n </div>\n </div>\n\n <div class=\"mb-3\">\n <label for=\"favDisplayValue\" class=\"form-label\">Display Value</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"favDisplayValue\"\n formControlName=\"displayValue\"\n placeholder=\"Optional: Human-readable version\">\n <div class=\"form-text\">If empty, will use the same value as above</div>\n </div>\n\n <div class=\"mb-3\">\n <label for=\"favScope\" class=\"form-label\">Scope *</label>\n <select\n class=\"form-select\"\n id=\"favScope\"\n formControlName=\"scope\">\n <option value=\"personal\">Personal (Only visible to me)</option>\n @if (userLabGroups().length > 0) {\n <option value=\"lab_group\">Lab Group (Visible to my lab group)</option>\n }\n @if (isAdmin()) {\n <option value=\"global\">Global (Visible to everyone)</option>\n }\n </select>\n </div>\n\n <!-- Lab Group Selection (shown when lab_group scope is selected) -->\n @if (editForm.get('scope')?.value === 'lab_group' && userLabGroups().length > 1) {\n <div class=\"mb-3\">\n <label for=\"favLabGroup\" class=\"form-label\">Lab Group *</label>\n <select\n class=\"form-select\"\n id=\"favLabGroup\"\n formControlName=\"labGroupId\">\n <option value=\"\">Select a lab group</option>\n @for (labGroup of userLabGroups(); track labGroup.id) {\n <option [value]=\"labGroup.id\">{{ labGroup.name }}</option>\n }\n </select>\n <div class=\"form-text\">Choose which lab group this favorite will be visible to</div>\n </div>\n }\n </form>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"closeEditModal()\">\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)=\"saveFavorite()\"\n [disabled]=\"editForm.invalid\">\n <i class=\"bi bi-check-circle me-1\"></i>\n {{ isEditMode() ? 'Update' : 'Create' }} Favorite\n </button>\n </div>\n </div>\n </div>\n </div>\n}\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","i4.OntologySearchService","LibraryAsyncTaskService","filter","i3.MetadataTableService","i4","i3.MetadataColumnTemplateService","i4.SdrfSyntaxService","i3.MetadataTableTemplateService","i5","i2.SchemaService","ReorderSchemaSelectionModal","i2.MetadataTableTemplateService","i5.AsyncTaskUIService","i3","i2.MetadataColumnTemplateService","i2.FavouriteMetadataOptionService"],"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/components/column-templates/column-template-edit-modal/column-template-edit-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/column-templates/column-template-edit-modal/column-template-edit-modal.html","../../../projects/cupcake-vanilla/src/lib/components/column-templates/column-templates.ts","../../../projects/cupcake-vanilla/src/lib/components/column-templates/column-templates.html","../../../projects/cupcake-vanilla/src/lib/components/favorite-management/favorite-management.ts","../../../projects/cupcake-vanilla/src/lib/components/favorite-management/favorite-management.html","../../../projects/cupcake-vanilla/src/lib/components/search-replace-modal/search-replace-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/search-replace-modal/search-replace-modal.html","../../../projects/cupcake-vanilla/src/lib/components/sample-pool-details-modal/sample-pool-details-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/sample-pool-details-modal/sample-pool-details-modal.html","../../../projects/cupcake-vanilla/src/lib/components/sample-pool-edit-modal/sample-pool-edit-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/sample-pool-edit-modal/sample-pool-edit-modal.html","../../../projects/cupcake-vanilla/src/lib/components/sample-pool-create-modal/sample-pool-create-modal.ts","../../../projects/cupcake-vanilla/src/lib/components/sample-pool-create-modal/sample-pool-create-modal.html","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-details/metadata-table-details.ts","../../../projects/cupcake-vanilla/src/lib/components/metadata-table-details/metadata-table-details.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\r\n /**\r\n * Replace all occurrences of a specific value across columns in this table\r\n */\r\n replaceColumnValue(id: number, request: {\r\n oldValue: string;\r\n newValue: string;\r\n columnId?: number;\r\n columnName?: string;\r\n updatePools?: boolean;\r\n }): Observable<{\r\n message: string;\r\n oldValue: string;\r\n newValue: string;\r\n columnsChecked: number;\r\n columnsUpdated: number;\r\n modifiersMerged: number;\r\n modifiersDeleted: number;\r\n samplesRevertedToDefault: number;\r\n poolColumnsUpdated: number;\r\n }> {\r\n return this.post(`${this.apiUrl}/metadata-tables/${id}/replace_column_value/`, request);\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\r\n /**\r\n * Replace all occurrences of a specific value with a new value in this column\r\n */\r\n replaceValue(id: number, request: {\r\n oldValue: string;\r\n newValue: string;\r\n updatePools?: boolean;\r\n }): Observable<{\r\n message: string;\r\n oldValue: string;\r\n newValue: string;\r\n defaultValueUpdated: boolean;\r\n modifiersMerged: number;\r\n modifiersDeleted: number;\r\n samplesRevertedToDefault: number;\r\n poolColumnsUpdated: number;\r\n }> {\r\n return this.post(`${this.apiUrl}/metadata-columns/${id}/replace_value/`, request);\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\nexport interface OntologySuggestParams {\r\n q: string;\r\n type?: string;\r\n match?: 'contains' | 'startswith';\r\n limit?: number;\r\n customFilters?: Record<string, any>;\r\n}\r\n\r\nexport interface OntologySuggestResponse {\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?: Record<string, any>;\r\n hasMore: boolean;\r\n}\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 * @param params Query parameters\r\n * @param params.q Search query (required, min 2 characters)\r\n * @param params.type Ontology type to search (optional)\r\n * @param params.match Match type - 'contains' or 'startswith' (default: 'contains')\r\n * @param params.limit Maximum number of results (default: 50)\r\n * @param params.customFilters Custom filters to apply (optional)\r\n * Example: {\"organism\": \"Homo sapiens\"} or {\"organism\": {\"icontains\": \"human\"}}\r\n */\r\n suggest(params: OntologySuggestParams): Observable<OntologySuggestResponse> {\r\n const queryParams: any = {\r\n q: params.q,\r\n };\r\n\r\n if (params.type) {\r\n queryParams.type = params.type;\r\n }\r\n\r\n if (params.match) {\r\n queryParams.match = params.match;\r\n }\r\n\r\n if (params.limit) {\r\n queryParams.limit = params.limit;\r\n }\r\n\r\n if (params.customFilters) {\r\n queryParams.custom_filters = JSON.stringify(params.customFilters);\r\n }\r\n\r\n const httpParams = this.buildHttpParams(queryParams);\r\n return this.get<OntologySuggestResponse>(`${this.apiUrl}/ontology/search/suggest/`, { params: httpParams });\r\n }\r\n\r\n /**\r\n * Get ontology suggestions for a specific ontology type with custom filters\r\n */\r\n suggestWithFilters(\r\n query: string,\r\n ontologyType: string,\r\n customFilters: Record<string, any>,\r\n limit: number = 50\r\n ): Observable<OntologySuggestResponse> {\r\n return this.suggest({\r\n q: query,\r\n type: ontologyType,\r\n customFilters,\r\n limit\r\n });\r\n }\r\n\r\n /**\r\n * Search across multiple ontology types\r\n */\r\n searchAll(query: string, limit: number = 50): Observable<OntologySuggestResponse> {\r\n return this.suggest({\r\n q: query,\r\n limit\r\n });\r\n }\r\n\r\n /**\r\n * Search specific ontology type\r\n */\r\n searchType(query: string, ontologyType: string, limit: number = 50): Observable<OntologySuggestResponse> {\r\n return this.suggest({\r\n q: query,\r\n type: ontologyType,\r\n limit\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 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, OntologySearchService } 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 allowNotApplicable?: boolean;\n allowNotAvailable?: boolean;\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 private ontologySearchService: OntologySearchService\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 if (this.config.ontologyType) {\n // Fallback: use OntologySearchService directly with custom filters\n return this.ontologySearchService.suggest({\n q: term,\n type: this.config.ontologyType,\n match: this.searchType() === 'icontains' ? 'contains' : 'startswith',\n customFilters: this.config.customOntologyFilters,\n limit: 10\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);\n }\n\n setValue(value: string): void {\n this.editForm.get('value')?.setValue(value);\n this.editForm.get('value')?.markAsTouched();\n this.selectedFavorite.set(null);\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 <!-- Quick-select buttons for standard values -->\n @if (config.allowNotApplicable || config.allowNotAvailable) {\n <div class=\"mb-2\">\n <small class=\"text-muted d-block mb-1\">Quick Select:</small>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n @if (config.allowNotApplicable) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"setValue('not applicable')\">\n <i class=\"bi bi-dash-circle me-1\"></i>Not Applicable\n </button>\n }\n @if (config.allowNotAvailable) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"setValue('not available')\">\n <i class=\"bi bi-question-circle me-1\"></i>Not Available\n </button>\n }\n </div>\n </div>\n }\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 notAvailable: [false],\n staffOnly: [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 notAvailable: this.column.notAvailable || false,\n staffOnly: this.column.staffOnly || 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 notAvailable: formValue.notAvailable || false,\n staffOnly: formValue.staffOnly || 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 const ontologyTypeIndexStr = this.editForm.get('ontologyType')?.value;\n const ontologyTypeIndex = parseInt(ontologyTypeIndexStr || '0');\n const enableTypeahead = this.editForm.get('enableTypeahead')?.value || false;\n\n let ontologyType = '';\n if (ontologyTypeIndex > 0 && ontologyTypeIndex < this.ontologyTypes.length) {\n ontologyType = this.ontologyTypes[ontologyTypeIndex].value;\n }\n\n const config: MetadataValueEditConfig = {\n columnName: this.editForm.get('name')?.value || 'Column',\n columnType: this.editForm.get('type')?.value || '',\n ontologyType: ontologyType,\n enableTypeahead: enableTypeahead,\n currentValue: this.editForm.get('value')?.value || '',\n context: this.isEdit ? 'table' : 'template',\n allowNotApplicable: this.editForm.get('notApplicable')?.value || false,\n allowNotAvailable: this.editForm.get('notAvailable')?.value || false\n };\n\n const hasTemplate = this.selectedTemplate || this.column?.template || this.templateId;\n\n if (hasTemplate) {\n if (this.isEdit && this.column?.id) {\n config.columnId = this.column.id;\n }\n config.templateId = this.selectedTemplate?.id || this.column?.template || this.templateId || undefined;\n } else {\n const columnName = this.editForm.get('name')?.value;\n if (columnName) {\n const ontologyConfig = this.getOntologyConfigForColumn(columnName);\n config.customOntologyFilters = ontologyConfig.customFilters;\n }\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 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 setDefaultValue(value: string): void {\n this.editForm.get('value')?.setValue(value);\n this.editForm.get('value')?.markAsTouched();\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 ontologyConfig = this.getOntologyConfigForColumn(column.name);\n const ontologyTypeIndex = ontologyConfig.index;\n\n this.editForm.patchValue({\n name: column.name,\n type: column.type,\n value: '',\n ontologyType: ontologyTypeIndex.toString(),\n enableTypeahead: ontologyTypeIndex > 0,\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 getOntologyConfigForColumn(columnName: string): { index: number; ontologyType: string; customFilters?: any } {\n const lowerName = columnName.toLowerCase();\n const MSTermType = {\n INSTRUMENT: 'instrument',\n MASS_ANALYZER_TYPE: 'mass analyzer type',\n CLEAVAGE_AGENT: 'cleavage agent',\n SAMPLE_ATTRIBUTE: 'sample attribute',\n ANCESTRAL_CATEGORY: 'ancestral category',\n SEX: 'sex',\n DEVELOPMENTAL_STAGE: 'developmental stage'\n };\n\n let ontologyType = '';\n let customFilters: any = undefined;\n\n switch (lowerName) {\n case 'characteristics[organism]':\n ontologyType = 'species';\n break;\n case 'characteristics[disease]':\n ontologyType = 'human_disease';\n break;\n case 'characteristics[organism part]':\n ontologyType = 'tissue';\n break;\n case 'characteristics[cell type]':\n ontologyType = 'cell_ontology';\n break;\n case 'comment[instrument]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.INSTRUMENT } };\n break;\n case 'comment[modification parameters]':\n ontologyType = 'unimod';\n break;\n case 'comment[ms2 analyzer type]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.MASS_ANALYZER_TYPE } };\n break;\n case 'comment[cleavage agent details]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.CLEAVAGE_AGENT } };\n break;\n case 'characteristics[ancestry category]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.ANCESTRAL_CATEGORY } };\n break;\n case 'characteristics[sex]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.SEX } };\n break;\n case 'characteristics[developmental stage]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.DEVELOPMENTAL_STAGE } };\n break;\n case 'comment[label]':\n ontologyType = 'ms_unique_vocabularies';\n customFilters = { ms_unique_vocabularies: { term_type: MSTermType.SAMPLE_ATTRIBUTE } };\n break;\n }\n\n if (!ontologyType) {\n return { index: 0, ontologyType: '', customFilters: undefined };\n }\n\n // Find the matching ontology type config with the correct custom filters\n const index = this.ontologyTypes.findIndex(config => {\n if (config.value !== ontologyType) return false;\n if (!customFilters) return !config.customFilters || Object.keys(config.customFilters).length === 0;\n\n // Match custom filters\n if (!config.customFilters) return false;\n const configFilterKey = Object.keys(config.customFilters)[0];\n const customFilterKey = Object.keys(customFilters)[0];\n if (configFilterKey !== customFilterKey) return false;\n\n const configTermType = config.customFilters[configFilterKey]?.['term_type'];\n const customTermType = customFilters[customFilterKey]?.['term_type'];\n return configTermType === customTermType;\n });\n\n return {\n index: index >= 0 ? index : 0,\n ontologyType,\n customFilters\n };\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>Not Applicable\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=\"notAvailable\"\n formControlName=\"notAvailable\">\n <label class=\"form-check-label\" for=\"notAvailable\">\n <i class=\"bi bi-question-circle me-1\"></i>Not Available\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=\"staffOnly\"\n formControlName=\"staffOnly\">\n <label class=\"form-check-label\" for=\"staffOnly\">\n <i class=\"bi bi-shield-lock me-1\"></i>Staff Only\n </label>\n </div>\n </div>\n </div>\n <div class=\"row mt-2\">\n <div class=\"col-12\">\n <div class=\"alert alert-info py-2\">\n <i class=\"bi bi-info-circle me-1\"></i>\n <small>\n <strong>Staff Only:</strong> When enabled, this column will only be visible and editable by staff members.\n </small>\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 @if (editForm.get('notApplicable')?.value || editForm.get('notAvailable')?.value) {\n <div class=\"mb-2\">\n <small class=\"text-muted d-block mb-1\">Quick Select:</small>\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n @if (editForm.get('notApplicable')?.value) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"setDefaultValue('not applicable')\">\n <i class=\"bi bi-dash-circle me-1\"></i>Not Applicable\n </button>\n }\n @if (editForm.get('notAvailable')?.value) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"setDefaultValue('not available')\">\n <i class=\"bi bi-question-circle me-1\"></i>Not Available\n </button>\n }\n </div>\n </div>\n }\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","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 } from '@ng-bootstrap/ng-bootstrap';\nimport { MetadataColumnTemplate, ONTOLOGY_TYPE_CONFIGS, COLUMN_TYPE_CONFIGS, OntologyTypeConfig, ColumnTypeConfig } from '../../../models';\nimport { LabGroup } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-column-template-edit-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './column-template-edit-modal.html',\n styleUrl: './column-template-edit-modal.scss'\n})\nexport class ColumnTemplateEditModal implements OnInit {\n @Input() template: MetadataColumnTemplate | null = null;\n @Input() labGroups: LabGroup[] = [];\n @Input() isEdit = false;\n @Output() templateSaved = new EventEmitter<Partial<MetadataColumnTemplate>>();\n\n editForm: FormGroup;\n isLoading = signal(false);\n\n // Make Object available in template\n Object = Object;\n\n // Available options for dropdowns\n columnTypes: ColumnTypeConfig[] = COLUMN_TYPE_CONFIGS;\n\n visibilityOptions = [\n { value: 'private', label: 'Private' },\n { value: 'labGroup', label: 'Lab Group' },\n { value: 'public', label: 'Public' },\n { value: 'global', label: 'Global' }\n ];\n\n ontologyTypes: OntologyTypeConfig[] = ONTOLOGY_TYPE_CONFIGS;\n\n constructor(\n private fb: FormBuilder,\n private activeModal: NgbActiveModal\n ) {\n this.editForm = this.fb.group({\n name: ['', [Validators.required, Validators.minLength(3)]],\n description: [''],\n columnName: ['', [Validators.required, Validators.pattern(/^[a-zA-Z_][a-zA-Z0-9_]*$/)]],\n columnType: ['text', Validators.required],\n defaultValue: [''],\n defaultPosition: [0, [Validators.min(0)]],\n ontologyType: [''],\n customOntologyFilters: [{}],\n visibility: ['private', Validators.required],\n labGroup: [null],\n enableTypeahead: [false],\n notApplicable: [false],\n notAvailable: [false],\n excelValidation: [false],\n isActive: [true],\n tags: [''],\n category: ['']\n });\n }\n\n ngOnInit() {\n // Set initial disabled state for labGroup field\n this.onVisibilityChange();\n\n if (this.template && this.isEdit) {\n this.populateForm();\n // Reapply visibility logic after populating form\n this.onVisibilityChange();\n // Apply ontology filters if ontology type is set\n this.onOntologyTypeChange();\n }\n }\n\n private populateForm() {\n if (this.template) {\n this.editForm.patchValue({\n name: this.template.name,\n description: this.template.description || '',\n columnName: this.template.columnName,\n columnType: this.template.columnType,\n defaultValue: this.template.defaultValue || '',\n defaultPosition: this.template.defaultPosition || 0,\n ontologyType: this.template.ontologyType || '',\n customOntologyFilters: this.template.customOntologyFilters || {},\n visibility: this.template.visibility || 'private',\n labGroup: this.template.labGroup || null,\n enableTypeahead: this.template.enableTypeahead || false,\n notApplicable: this.template.notApplicable || false,\n notAvailable: this.template.notAvailable || false,\n excelValidation: this.template.excelValidation || false,\n isActive: this.template.isActive !== false,\n tags: this.template.tags || '',\n category: this.template.category || ''\n });\n }\n }\n\n onVisibilityChange() {\n const visibility = this.editForm.get('visibility')?.value;\n const labGroupControl = this.editForm.get('labGroup');\n\n if (visibility === 'labGroup') {\n labGroupControl?.setValidators([Validators.required]);\n labGroupControl?.enable();\n } else {\n labGroupControl?.clearValidators();\n labGroupControl?.setValue(null);\n labGroupControl?.disable();\n }\n labGroupControl?.updateValueAndValidity();\n }\n\n onOntologyTypeChange() {\n const ontologyType = this.editForm.get('ontologyType')?.value;\n const customFiltersControl = this.editForm.get('customOntologyFilters');\n \n // Find the selected ontology type configuration\n const selectedOntology = this.ontologyTypes.find(ont => ont.value === ontologyType);\n \n if (selectedOntology && selectedOntology.customFilters) {\n // Apply the custom filter from the ontology type\n customFiltersControl?.setValue(selectedOntology.customFilters);\n } else {\n // Clear custom filters if no ontology type selected or no custom filter defined\n customFiltersControl?.setValue({});\n }\n \n customFiltersControl?.markAsDirty();\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<MetadataColumnTemplate> = {\n ...formValue,\n labGroup: formValue.visibility === 'labGroup' ? formValue.labGroup : null,\n defaultPosition: Number(formValue.defaultPosition) || 0\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 setDefaultValue(value: string): void {\n this.editForm.get('defaultValue')?.setValue(value);\n this.editForm.get('defaultValue')?.markAsTouched();\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 if (control.errors['pattern']) return `${fieldName} must be a valid identifier (letters, numbers, underscore)`;\n if (control.errors['min']) return `${fieldName} must be at least ${control.errors['min'].min}`;\n }\n return '';\n }\n\n get title(): string {\n return this.isEdit ? 'Edit Column Template' : 'Create Column Template';\n }\n}\n","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-clipboard-list 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-md-6 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-md-6 mb-3\">\n <label for=\"columnName\" class=\"form-label\">Column Name *</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"columnName\"\n formControlName=\"columnName\"\n [class.is-invalid]=\"editForm.get('columnName')?.invalid && editForm.get('columnName')?.touched\"\n placeholder=\"columnName\">\n <div class=\"invalid-feedback\">\n {{ getFieldError('columnName') }}\n </div>\n <small class=\"form-text text-muted\">Column name based on column type and template name. Example: characteristics[biological replicate]</small>\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=\"2\"\n placeholder=\"Optional description\"></textarea>\n </div>\n\n <!-- Column 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>Column Configuration\n </h6>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"columnType\" class=\"form-label\">Column Type *</label>\n <select\n class=\"form-select\"\n id=\"columnType\"\n formControlName=\"columnType\"\n [class.is-invalid]=\"editForm.get('columnType')?.invalid && editForm.get('columnType')?.touched\">\n @for (type of columnTypes; track type.value) {\n <option [value]=\"type.value\">{{ type.label }}</option>\n }\n </select>\n <div class=\"invalid-feedback\">\n {{ getFieldError('columnType') }}\n </div>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"defaultPosition\" class=\"form-label\">Default Position</label>\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"defaultPosition\"\n formControlName=\"defaultPosition\"\n [class.is-invalid]=\"editForm.get('defaultPosition')?.invalid && editForm.get('defaultPosition')?.touched\"\n min=\"0\"\n placeholder=\"0\">\n <div class=\"invalid-feedback\">\n {{ getFieldError('defaultPosition') }}\n </div>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"defaultValue\" class=\"form-label\">Default Value</label>\n @if (editForm.get('notApplicable')?.value || editForm.get('notAvailable')?.value) {\n <div class=\"mb-2\">\n <div class=\"btn-group btn-group-sm\" role=\"group\">\n @if (editForm.get('notApplicable')?.value) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"setDefaultValue('not applicable')\">\n <i class=\"bi bi-dash-circle me-1\"></i>Not Applicable\n </button>\n }\n @if (editForm.get('notAvailable')?.value) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"setDefaultValue('not available')\">\n <i class=\"bi bi-question-circle me-1\"></i>Not Available\n </button>\n }\n </div>\n </div>\n }\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"defaultValue\"\n formControlName=\"defaultValue\"\n placeholder=\"Optional default value\">\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"ontologyType\" class=\"form-label\">Ontology Type</label>\n <select\n class=\"form-select\"\n id=\"ontologyType\"\n formControlName=\"ontologyType\"\n (change)=\"onOntologyTypeChange()\">\n @for (ontology of ontologyTypes; track $index) {\n <option [value]=\"ontology.value\">{{ ontology.label }}</option>\n }\n </select>\n </div>\n\n @if (editForm.get('ontologyType')?.value && editForm.get('customOntologyFilters')?.value && Object.keys(editForm.get('customOntologyFilters')?.value || {}).length > 0) {\n <div class=\"col-12 mb-3\">\n <div class=\"alert alert-info\">\n <h6 class=\"alert-heading\">\n <i class=\"bi bi-filter me-2\"></i>Custom Ontology Filters Applied\n </h6>\n <small class=\"mb-0\">\n The following custom filters will be automatically applied for this ontology type:\n <code class=\"ms-1\">{{ editForm.get('customOntologyFilters')?.value | json }}</code>\n </small>\n </div>\n </div>\n }\n\n <!-- Visibility and Access -->\n <div class=\"col-12 mb-3\">\n <h6 class=\"text-muted border-bottom pb-2\">\n <i class=\"bi bi-eye me-2\"></i>Visibility and Access\n </h6>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"visibility\" class=\"form-label\">Visibility *</label>\n <select\n class=\"form-select\"\n id=\"visibility\"\n formControlName=\"visibility\"\n (change)=\"onVisibilityChange()\"\n [class.is-invalid]=\"editForm.get('visibility')?.invalid && editForm.get('visibility')?.touched\">\n @for (option of visibilityOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n <div class=\"invalid-feedback\">\n {{ getFieldError('visibility') }}\n </div>\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=\"labGroup\"\n [class.is-invalid]=\"editForm.get('labGroup')?.invalid && editForm.get('labGroup')?.touched\">\n <option [ngValue]=\"null\">Select Lab Group</option>\n @for (group of labGroups; track group.id) {\n <option [ngValue]=\"group.id\">{{ group.name }}</option>\n }\n </select>\n <div class=\"invalid-feedback\">\n {{ getFieldError('labGroup') }}\n </div>\n </div>\n\n <!-- Additional Options -->\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>Additional Options\n </h6>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"category\" class=\"form-label\">Category</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"category\"\n formControlName=\"category\"\n placeholder=\"Template category\">\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"tags\" class=\"form-label\">Tags</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"tags\"\n formControlName=\"tags\"\n placeholder=\"Comma-separated tags\">\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=\"enableTypeahead\"\n formControlName=\"enableTypeahead\">\n <label class=\"form-check-label\" for=\"enableTypeahead\">\n Enable Typeahead\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>Not Applicable\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=\"notAvailable\"\n formControlName=\"notAvailable\">\n <label class=\"form-check-label\" for=\"notAvailable\">\n <i class=\"bi bi-question-circle me-1\"></i>Not Available\n </label>\n </div>\n </div>\n </div>\n </div>\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=\"excelValidation\"\n formControlName=\"excelValidation\">\n <label class=\"form-check-label\" for=\"excelValidation\">\n Excel Validation\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=\"isActive\"\n formControlName=\"isActive\">\n <label class=\"form-check-label\" for=\"isActive\">\n Active\n </label>\n </div>\n </div>\n </div>\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, OnInit, signal, computed, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { NgbModule, NgbModal, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap';\nimport { debounceTime, distinctUntilChanged } from 'rxjs';\nimport { ColumnTemplateEditModal } from './column-template-edit-modal/column-template-edit-modal';\nimport {\n MetadataColumnTemplate,\n MetadataColumnTemplateCreateRequest\n} from '../../models';\nimport { MetadataColumnTemplateService } from '../../services';\nimport { ResourceVisibility } from '@noatgnu/cupcake-core';\nimport { LabGroupService, LabGroup, LabGroupQueryResponse } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-column-templates',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule, NgbPaginationModule],\n templateUrl: './column-templates.html',\n styleUrl: './column-templates.scss'\n})\nexport class ColumnTemplates 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: null as string | null,\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 // Column filter\n columnFilter = signal('');\n \n // Sorting\n sortField = signal<string>('');\n sortDirection = signal<'asc' | 'desc'>('asc');\n\n // Direct signal-based data management\n templatesData = signal<{count: number, results: MetadataColumnTemplate[]}>({ count: 0, results: [] });\n labGroupsData = signal<LabGroupQueryResponse>({ count: 0, results: [] });\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 // Filtered and sorted templates\n filteredTemplates = computed(() => {\n const templates = this.templatesData().results;\n const filter = this.columnFilter().toLowerCase();\n const sortField = this.sortField();\n const sortDirection = this.sortDirection();\n \n // Apply filter\n let filtered = filter ? \n templates.filter(template => \n template.columnName.toLowerCase().includes(filter) ||\n template.name.toLowerCase().includes(filter)\n ) : templates;\n \n // Apply sorting\n if (sortField) {\n filtered = [...filtered].sort((a, b) => {\n let aValue: any = '';\n let bValue: any = '';\n \n switch (sortField) {\n case 'name':\n aValue = a.name?.toLowerCase() || '';\n bValue = b.name?.toLowerCase() || '';\n break;\n case 'columnName':\n aValue = a.columnName?.toLowerCase() || '';\n bValue = b.columnName?.toLowerCase() || '';\n break;\n case 'columnType':\n aValue = a.columnType?.toLowerCase() || '';\n bValue = b.columnType?.toLowerCase() || '';\n break;\n case 'ontologyType':\n aValue = a.ontologyType?.toLowerCase() || '';\n bValue = b.ontologyType?.toLowerCase() || '';\n break;\n case 'visibility':\n aValue = a.visibility?.toLowerCase() || '';\n bValue = b.visibility?.toLowerCase() || '';\n break;\n default:\n return 0;\n }\n \n if (aValue < bValue) return sortDirection === 'asc' ? -1 : 1;\n if (aValue > bValue) return sortDirection === 'asc' ? 1 : -1;\n return 0;\n });\n }\n \n return filtered;\n });\n\n constructor(\n private fb: FormBuilder,\n private metadataColumnTemplateService: MetadataColumnTemplateService,\n private labGroupService: LabGroupService,\n private modalService: NgbModal\n ) {\n this.searchForm = this.fb.group({\n search: [''],\n labGroupId: [null],\n visibility: [null]\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 }\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: null,\n limit: this.pageSize(),\n offset: 0\n });\n }\n\n private loadLabGroupsWithParams(params: { limit: number; offset: number }) {\n this.labGroupService.getMyLabGroups({ limit: params.limit, offset: params.offset }).subscribe({\n next: (response: LabGroupQueryResponse) => {\n this.labGroupsTotalItems.set(response.count);\n this.labGroupsData.set(response);\n },\n error: (error: any) => {\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 || null,\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.metadataColumnTemplateService.getMetadataColumnTemplates({\n search: params.search || undefined,\n labGroupId: params.labGroupId || undefined,\n visibility: params.visibility || 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 column 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 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 // Column filter methods\n onColumnFilterChange(value: string): void {\n this.columnFilter.set(value);\n }\n\n clearColumnFilter(): void {\n this.columnFilter.set('');\n }\n\n get filteredTemplatesCount(): number {\n return this.filteredTemplates().length;\n }\n\n get totalTemplatesCount(): number {\n return this.templatesData().results.length;\n }\n\n // Sorting methods\n sortBy(field: string): void {\n const currentField = this.sortField();\n const currentDirection = this.sortDirection();\n \n if (currentField === field) {\n // Toggle direction if same field\n this.sortDirection.set(currentDirection === 'asc' ? 'desc' : 'asc');\n } else {\n // New field, default to ascending\n this.sortField.set(field);\n this.sortDirection.set('asc');\n }\n }\n\n getSortIcon(field: string): string {\n const currentField = this.sortField();\n const currentDirection = this.sortDirection();\n \n if (currentField !== field) {\n return 'bi-arrow-down-up'; // Default unsorted icon\n }\n \n return currentDirection === 'asc' ? 'bi-sort-alpha-down' : 'bi-sort-alpha-up';\n }\n\n isSorted(field: string): boolean {\n return this.sortField() === field;\n }\n\n createTemplate() {\n this.openTemplateModal(null, false);\n }\n\n editTemplate(template: MetadataColumnTemplate) {\n this.openTemplateModal(template, true);\n }\n\n private openTemplateModal(template: MetadataColumnTemplate | null, isEdit: boolean) {\n const modalRef = this.modalService.open(ColumnTemplateEditModal, {\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<MetadataColumnTemplate>) => {\n this.handleTemplateSave(templateData, template?.id || null, isEdit);\n modalRef.componentInstance.onClose();\n });\n }\n\n private handleTemplateSave(templateData: Partial<MetadataColumnTemplate>, templateId: number | null, isEdit: boolean) {\n this.isLoading.set(true);\n \n const apiCall = isEdit && templateId\n ? this.metadataColumnTemplateService.updateMetadataColumnTemplate(templateId, templateData)\n : this.metadataColumnTemplateService.createMetadataColumnTemplate(templateData as MetadataColumnTemplateCreateRequest);\n\n apiCall.subscribe({\n next: (template) => {\n this.isLoading.set(false);\n console.log(`Column template ${isEdit ? 'updated' : 'created'}:`, template);\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error(`Error ${isEdit ? 'updating' : 'creating'} column template:`, error);\n alert(`Failed to ${isEdit ? 'update' : 'create'} template. Please try again.`);\n }\n });\n }\n\n deleteTemplate(template: MetadataColumnTemplate) {\n // Enhanced delete confirmation with better UX\n const confirmMessage = `Are you sure you want to delete the column template \"${template.name}\"?\\n\\nThis action cannot be undone.`;\n \n if (confirm(confirmMessage)) {\n this.isLoading.set(true);\n this.metadataColumnTemplateService.deleteMetadataColumnTemplate(template.id!).subscribe({\n next: () => {\n this.isLoading.set(false);\n console.log('Column template deleted successfully');\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error deleting column template:', error);\n alert('Failed to delete template. Please try again.');\n }\n });\n }\n }\n\n duplicateTemplate(template: MetadataColumnTemplate) {\n const duplicatedTemplate: Partial<MetadataColumnTemplate> = {\n name: `${template.name} (Copy)`,\n description: template.description,\n columnName: `${template.columnName}_copy`,\n columnType: template.columnType,\n defaultValue: template.defaultValue,\n ontologyType: template.ontologyType,\n visibility: ResourceVisibility.PRIVATE, // Always create as private\n labGroup: template.labGroup || this.selectedLabGroup()?.id || undefined,\n isActive: true\n };\n \n this.isLoading.set(true);\n this.metadataColumnTemplateService.createMetadataColumnTemplate(duplicatedTemplate as MetadataColumnTemplateCreateRequest).subscribe({\n next: (newTemplate) => {\n this.isLoading.set(false);\n console.log('Column template duplicated:', newTemplate);\n this.refreshTemplates();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error duplicating column template:', error);\n alert('Failed to duplicate 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","<div class=\"column-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-clipboard-list me-2\"></i>Column 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 <button class=\"btn btn-primary btn-sm\" (click)=\"createTemplate()\">\n <i class=\"bi bi-plus me-1\"></i>New Template\n </button>\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-4\">\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-4\">\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-4\">\n <div class=\"form-check form-switch mt-3\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n id=\"globalTemplates\"\n formControlName=\"visibility\">\n <label class=\"form-check-label\" for=\"globalTemplates\">\n <i class=\"bi bi-globe me-1\"></i>Global 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\">\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-table me-2\"></i>Column 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 \n <!-- Column Filter -->\n @if (hasTemplates()) {\n <div class=\"d-flex align-items-center\">\n <div class=\"input-group input-group-sm me-3\" style=\"width: 300px;\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-funnel text-muted\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"Filter by column name or template...\"\n [value]=\"columnFilter()\"\n (input)=\"onColumnFilterChange($any($event.target).value)\">\n @if (columnFilter()) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"clearColumnFilter()\"\n title=\"Clear filter\">\n <i class=\"bi bi-x\"></i>\n </button>\n }\n </div>\n @if (columnFilter()) {\n <small class=\"text-muted\">\n {{ filteredTemplatesCount }}/{{ totalTemplatesCount }} templates\n </small>\n }\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 class=\"sortable\" \n (click)=\"sortBy('name')\"\n [class.sorted]=\"isSorted('name')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span><i class=\"bi bi-tag me-1\"></i>Template Name</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('name')\"></i>\n </div>\n </th>\n <th class=\"sortable\" \n (click)=\"sortBy('columnName')\"\n [class.sorted]=\"isSorted('columnName')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span><i class=\"bi bi-list me-1\"></i>Column Name</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('columnName')\"></i>\n </div>\n </th>\n <th class=\"sortable\" \n (click)=\"sortBy('columnType')\"\n [class.sorted]=\"isSorted('columnType')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span><i class=\"bi bi-layers me-1\"></i>Type</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('columnType')\"></i>\n </div>\n </th>\n <th class=\"sortable\" \n (click)=\"sortBy('ontologyType')\"\n [class.sorted]=\"isSorted('ontologyType')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span><i class=\"bi bi-diagram-3 me-1\"></i>Ontology</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('ontologyType')\"></i>\n </div>\n </th>\n <th class=\"sortable\" \n (click)=\"sortBy('visibility')\"\n [class.sorted]=\"isSorted('visibility')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span><i class=\"bi bi-globe me-1\"></i>Visibility</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('visibility')\"></i>\n </div>\n </th>\n <th><i class=\"bi bi-folder me-1\"></i>Category</th>\n <th><i class=\"bi bi-gear me-1\"></i>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (template of filteredTemplates(); track template.id) {\n <tr>\n <td>\n <strong>{{ template.name }}</strong>\n @if (template.isSystemTemplate) {\n <i class=\"bi bi-shield-check text-success ms-2\" title=\"System template\"></i>\n }\n </td>\n <td>{{ template.columnName }}</td>\n <td>\n <span class=\"badge bg-secondary\">{{ template.columnType }}</span>\n </td>\n <td>\n @if (template.ontologyType) {\n <span class=\"badge bg-success\">{{ template.ontologyType }}</span>\n } @else {\n <span class=\"text-muted\">-</span>\n }\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-warning\">Lab Group</span>\n }\n @case ('private') {\n <span class=\"badge bg-secondary\">Private</span>\n }\n @default {\n <span class=\"badge bg-secondary\">{{ template.visibility }}</span>\n }\n }\n </td>\n <td>\n @if (template.category) {\n <span class=\"badge bg-secondary\">{{ template.category }}</span>\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-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-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-clipboard-list fs-1 text-muted mb-3\"></i>\n <h5 class=\"text-muted\">No Column 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 column 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","import {Component, OnInit, signal, computed, inject} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { NgbModule, NgbModal, NgbTypeahead } from '@ng-bootstrap/ng-bootstrap';\nimport { Observable, OperatorFunction, debounceTime, distinctUntilChanged, filter, map, switchMap, of, catchError, forkJoin, firstValueFrom } from 'rxjs';\nimport {\n FavouriteMetadataOption,\n FavouriteMetadataOptionCreateRequest,\n MetadataColumn,\n MetadataColumnTemplate,\n OntologySuggestion,\n ColumnType\n} from '../../models';\nimport {\n FavouriteMetadataOptionService,\n MetadataColumnTemplateService,\n SdrfSyntaxService,\n SyntaxType\n} from '../../services';\nimport {\n MetadataValueEditModal,\n MetadataValueEditConfig\n} from '../metadata-value-edit-modal/metadata-value-edit-modal';\nimport { AuthService, User, LabGroupService, ToastService, LabGroup } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-favorite-management',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n RouterModule,\n NgbModule,\n NgbTypeahead\n ],\n templateUrl: './favorite-management.html',\n styleUrl: './favorite-management.scss'\n})\nexport class FavoriteManagement implements OnInit {\n\n Math = Math;\n\n isLoading = signal(false);\n favorites = signal<FavouriteMetadataOption[]>([]);\n totalFavoritesCount = signal(0);\n\n searchTerm = signal('');\n scopeFilter = signal('');\n labGroupFilter = signal('');\n columnTypeFilter = signal('');\n\n filteredFavorites = computed(() => {\n const searchTerm = this.searchTerm().toLowerCase();\n const scopeFilter = this.scopeFilter();\n const labGroupFilter = this.labGroupFilter();\n const columnTypeFilter = this.columnTypeFilter();\n\n return this.favorites().filter(fav => {\n const matchesSearch = !searchTerm ||\n fav.name.toLowerCase().includes(searchTerm) ||\n fav.value.toLowerCase().includes(searchTerm) ||\n (fav.displayValue?.toLowerCase().includes(searchTerm) ?? false);\n\n let matchesScope = true;\n if (scopeFilter) {\n if (scopeFilter === 'personal') {\n matchesScope = !!(fav.user && !fav.isGlobal && !fav.labGroup);\n } else if (scopeFilter === 'labGroup') {\n matchesScope = !!(fav.labGroup && !fav.isGlobal);\n } else if (scopeFilter === 'global') {\n matchesScope = !!fav.isGlobal;\n }\n }\n\n const matchesLabGroup = !labGroupFilter ||\n (fav.labGroup && fav.labGroup.toString() === labGroupFilter);\n\n const matchesType = !columnTypeFilter || fav.type.includes(columnTypeFilter);\n\n return matchesSearch && matchesScope && matchesLabGroup && matchesType;\n });\n });\n\n currentPage = signal(1);\n pageSize = signal(10);\n\n paginatedFavorites = computed(() => this.filteredFavorites());\n\n totalPages = computed(() => {\n const totalCount = this.totalFavoritesCount();\n const size = this.pageSize();\n return Math.ceil(totalCount / size);\n });\n\n searchForm: FormGroup;\n editForm: FormGroup;\n isEditMode = signal(false);\n editingFavorite = signal<FavouriteMetadataOption | null>(null);\n showEditModal = signal(false);\n\n private sdrfSyntaxService = inject(SdrfSyntaxService);\n specialSyntaxType = signal<SyntaxType | null>(null);\n showSpecialInput = signal(false);\n specialInputValue = signal('');\n\n currentUser = signal<User | null>(null);\n isAdmin = computed(() => {\n const user = this.currentUser();\n return user?.isStaff || user?.isSuperuser || false;\n });\n currentUserId = computed(() => this.currentUser()?.id || null);\n userLabGroups = signal<LabGroup[]>([]);\n userLabGroupsLoaded = signal(false);\n\n selectedOntologyValue: string | null = null;\n\n availableLabGroups = signal<{id: number, name: string}[]>([]);\n allLabGroups = signal<{id: number, name: string}[]>([]);\n\n availableColumnTemplates = signal<MetadataColumnTemplate[]>([]);\n columnTemplatesLoaded = signal(false);\n\n columnTypes = [\n { value: '', label: 'All Types' },\n { value: ColumnType.CHARACTERISTICS, label: 'Characteristics' },\n { value: ColumnType.FACTOR_VALUE, label: 'Factor Value' },\n { value: ColumnType.COMMENT, label: 'Comment' },\n { value: ColumnType.SOURCE_NAME, label: 'Source Name' },\n { value: ColumnType.SPECIAL, label: 'Special' }\n ];\n\n constructor(\n private fb: FormBuilder,\n private favouriteMetadataOptionService: FavouriteMetadataOptionService,\n private metadataColumnTemplateService: MetadataColumnTemplateService,\n private labGroupService: LabGroupService,\n private toastService: ToastService,\n private modalService: NgbModal,\n private authService: AuthService\n ) {\n this.searchForm = this.fb.group({\n search: [''],\n scope: [''],\n labGroup: [''],\n columnType: ['']\n });\n\n this.editForm = this.fb.group({\n name: ['', [Validators.required, Validators.maxLength(255)]],\n type: ['', [Validators.required, Validators.maxLength(255)]],\n value: ['', [Validators.maxLength(500)]],\n displayValue: ['', [Validators.maxLength(500)]],\n scope: ['personal', Validators.required],\n labGroupId: [null],\n templateId: [null],\n ontologyType: [''],\n enableTypeahead: [false]\n });\n\n this.editForm.get('value')?.valueChanges.subscribe(value => {\n if (typeof value === 'string' && value !== this.selectedOntologyValue) {\n console.log('Manual input detected, clearing stored ontology value');\n this.selectedOntologyValue = null;\n }\n });\n }\n\n ngOnInit() {\n this.currentUser.set(this.authService.getCurrentUser());\n\n\n this.authService.currentUser$.subscribe(user => {\n this.currentUser.set(user);\n if (user) {\n this.loadUserLabGroups();\n } else {\n this.loadFavorites();\n }\n });\n\n if (this.currentUser()) {\n this.loadUserLabGroups();\n } else {\n this.loadFavorites();\n }\n\n this.loadAvailableColumnTemplates();\n\n this.searchForm.valueChanges.subscribe(formValues => {\n this.searchTerm.set(formValues.search || '');\n this.scopeFilter.set(formValues.scope || '');\n this.labGroupFilter.set(formValues.labGroup || '');\n this.columnTypeFilter.set(formValues.columnType || '');\n\n this.currentPage.set(1);\n });\n }\n\n loadFavorites(): void {\n this.isLoading.set(true);\n\n const page = this.currentPage();\n const size = this.pageSize();\n const offset = (page - 1) * size;\n\n this.favouriteMetadataOptionService.getFavouriteMetadataOptions({\n limit: size,\n offset: offset\n }).subscribe({\n next: (response) => {\n this.favorites.set(response.results);\n this.totalFavoritesCount.set(response.count || response.results.length);\n this.isLoading.set(false);\n },\n error: (error) => {\n console.error('Error loading favorites:', error);\n this.toastService.error('Failed to load favorites');\n this.isLoading.set(false);\n }\n });\n }\n\n\n canEditFavorite(favorite: FavouriteMetadataOption): boolean {\n const userId = this.currentUserId();\n\n if (favorite.user && userId && Number(favorite.user) === Number(userId)) {\n return true;\n }\n\n if (favorite.isGlobal && this.isAdmin()) {\n return true;\n }\n\n return false;\n }\n\n canDeleteFavorite(favorite: FavouriteMetadataOption): boolean {\n return this.canEditFavorite(favorite);\n }\n\n openCreateModal(): void {\n this.isEditMode.set(false);\n this.editingFavorite.set(null);\n this.showEditModal.set(true);\n this.selectedOntologyValue = null;\n this.editForm.reset({\n name: '',\n type: '',\n value: '',\n displayValue: '',\n scope: 'personal',\n templateId: null\n });\n }\n\n openEditModal(favorite: FavouriteMetadataOption): void {\n if (!this.canEditFavorite(favorite)) return;\n\n this.isEditMode.set(true);\n this.editingFavorite.set(favorite);\n this.showEditModal.set(true);\n this.selectedOntologyValue = favorite.value; // Store the original value\n\n let scope = 'personal';\n if (favorite.isGlobal) scope = 'global';\n else if (favorite.labGroup) scope = 'labGroup';\n\n let templateId = favorite.columnTemplate || null;\n\n this.editForm.patchValue({\n name: favorite.name,\n type: favorite.type,\n value: favorite.value,\n displayValue: favorite.displayValue || '',\n scope: scope,\n labGroupId: favorite.labGroup || null,\n templateId: templateId,\n ontologyType: '',\n enableTypeahead: false\n });\n\n const syntaxType = this.sdrfSyntaxService.detectSpecialSyntax(\n favorite.name,\n favorite.type\n );\n\n if (syntaxType) {\n this.specialSyntaxType.set(syntaxType);\n this.showSpecialInput.set(true);\n this.specialInputValue.set(favorite.value || '');\n } else {\n this.specialSyntaxType.set(null);\n this.showSpecialInput.set(false);\n this.specialInputValue.set('');\n }\n\n if (!templateId) {\n this.findTemplatesForColumnName(favorite.name).then(templates => {\n const matchingTemplate = templates.find(t =>\n t.columnName === favorite.name && t.columnType === favorite.type\n );\n if (matchingTemplate?.id) {\n this.editForm.patchValue({\n templateId: matchingTemplate.id,\n ontologyType: matchingTemplate.ontologyType || '',\n enableTypeahead: matchingTemplate.enableTypeahead || false\n });\n }\n });\n }\n }\n\n saveFavorite(): void {\n if (this.editForm.invalid) return;\n\n const formValue = this.editForm.value;\n\n let value = this.selectedOntologyValue || formValue.value;\n\n if (typeof value === 'object' && value !== null) {\n value = value.value || value.displayName || String(value);\n }\n\n const favoriteData: FavouriteMetadataOptionCreateRequest = {\n name: formValue.name,\n type: formValue.type,\n columnTemplate: formValue.templateId || undefined,\n value: value,\n displayValue: formValue.displayValue || value,\n isGlobal: formValue.scope === 'global',\n user: formValue.scope === 'personal' ? this.currentUserId() || undefined : undefined,\n labGroup: formValue.scope === 'labGroup' ? formValue.labGroupId || this.userLabGroups()[0]?.id : undefined\n };\n\n const operation = this.isEditMode()\n ? this.favouriteMetadataOptionService.updateFavouriteMetadataOption(this.editingFavorite()!.id!, favoriteData)\n : this.favouriteMetadataOptionService.createFavouriteMetadataOption(favoriteData);\n\n operation.subscribe({\n next: (favorite) => {\n const action = this.isEditMode() ? 'updated' : 'created';\n this.toastService.success(`Favorite ${action} successfully!`);\n this.loadFavorites();\n this.closeEditModal();\n },\n error: (error) => {\n console.error('Error saving favorite:', error);\n const action = this.isEditMode() ? 'updating' : 'creating';\n this.toastService.error(`Failed ${action} favorite`);\n }\n });\n }\n\n deleteFavorite(favorite: FavouriteMetadataOption): void {\n if (!this.canDeleteFavorite(favorite)) return;\n\n const confirmMessage = `Are you sure you want to delete the favorite \"${favorite.displayValue || favorite.value}\"?`;\n\n if (confirm(confirmMessage)) {\n this.favouriteMetadataOptionService.deleteFavouriteMetadataOption(favorite.id!).subscribe({\n next: () => {\n this.toastService.success('Favorite deleted successfully!');\n this.loadFavorites();\n },\n error: (error) => {\n console.error('Error deleting favorite:', error);\n this.toastService.error('Failed to delete favorite');\n }\n });\n }\n }\n\n closeEditModal(): void {\n this.isEditMode.set(false);\n this.editingFavorite.set(null);\n this.showEditModal.set(false);\n this.selectedOntologyValue = null; // Clear stored ontology value\n }\n\n onPageChange(page: number): void {\n this.currentPage.set(page);\n this.loadFavorites();\n }\n\n onPageSizeChange(size: number): void {\n this.pageSize.set(size);\n this.currentPage.set(1);\n this.loadFavorites();\n }\n\n clearFilters(): void {\n this.searchForm.reset();\n this.searchTerm.set('');\n this.scopeFilter.set('');\n this.labGroupFilter.set('');\n this.columnTypeFilter.set('');\n this.currentPage.set(1);\n }\n\n getScopeDisplay(favorite: FavouriteMetadataOption): string {\n if (favorite.isGlobal) return 'Global';\n if (favorite.labGroup) return `Lab Group: ${favorite.labGroupName || favorite.labGroup}`;\n if (favorite.user) return `Personal (${favorite.userUsername || favorite.user})`;\n return 'Unknown';\n }\n\n getScopeClass(favorite: FavouriteMetadataOption): string {\n if (favorite.isGlobal) return 'badge bg-success';\n if (favorite.labGroup) return 'badge bg-info';\n if (favorite.user) return 'badge bg-primary';\n return 'badge bg-secondary';\n }\n\n get editModalTitle(): string {\n return this.isEditMode() ? 'Edit Favorite' : 'Create New Favorite';\n }\n\n loadUserLabGroups(): void {\n this.labGroupService.getMyLabGroups({ limit: 10 }).subscribe({\n next: (response) => {\n this.userLabGroups.set(response.results);\n\n const labGroups = response.results.map(group => ({\n id: group.id!,\n name: group.name\n }));\n this.availableLabGroups.set(labGroups);\n\n this.userLabGroupsLoaded.set(true);\n this.loadFavorites();\n },\n error: (error) => {\n console.error('Error loading user lab groups:', error);\n this.userLabGroups.set([]);\n this.availableLabGroups.set([]);\n this.userLabGroupsLoaded.set(true);\n this.loadFavorites();\n }\n });\n\n this.labGroupService.getLabGroups({ limit: 10 }).subscribe({\n next: (response) => {\n const allLabGroups = response.results.map(group => ({\n id: group.id!,\n name: group.name\n }));\n this.allLabGroups.set(allLabGroups);\n\n if (this.isAdmin()) {\n this.availableLabGroups.set(allLabGroups);\n }\n },\n error: (error) => {\n console.error('Error loading all lab groups:', error);\n }\n });\n }\n\n loadAvailableColumnTemplates(): void {\n this.metadataColumnTemplateService.getMetadataColumnTemplates({ limit: 10 }).subscribe({\n next: (response) => {\n this.availableColumnTemplates.set(response.results);\n this.columnTemplatesLoaded.set(true);\n },\n error: (error) => {\n console.error('Error loading column templates:', error);\n this.availableColumnTemplates.set([]);\n this.columnTemplatesLoaded.set(true);\n }\n });\n }\n\n searchColumnNames: OperatorFunction<string, readonly string[]> = (text$: Observable<string>) =>\n text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n switchMap(term => {\n if (term.length === 0) {\n return of(this.getColumnNameSuggestions(''));\n } else if (term.length >= 1) {\n return this.metadataColumnTemplateService.getMetadataColumnTemplates({\n search: term,\n limit: 10\n }).pipe(\n map(response => {\n const uniqueNames = [...new Set(response.results.map((template: MetadataColumnTemplate) => template.columnName))];\n return uniqueNames.sort();\n }),\n catchError(() => {\n return of(this.getColumnNameSuggestions(term));\n })\n );\n } else {\n return of([]);\n }\n })\n );\n\n private getColumnNameSuggestions(term: string): string[] {\n const templates = this.availableColumnTemplates();\n const uniqueNames = [...new Set(templates.map(template => template.columnName))];\n\n if (!term) {\n return uniqueNames.sort().slice(0, 10);\n }\n\n return uniqueNames\n .filter(name => name.toLowerCase().includes(term.toLowerCase()))\n .sort()\n .slice(0, 10);\n }\n\n searchColumnTypes: OperatorFunction<string, readonly string[]> = (text$: Observable<string>) =>\n text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n filter(term => term.length >= 1),\n map(term => this.getColumnTypeSuggestions(term))\n );\n\n private getColumnTypeSuggestions(term: string): string[] {\n const selectedName = this.editForm.get('name')?.value;\n const templates = this.availableColumnTemplates();\n\n let availableTypes: string[];\n if (selectedName) {\n availableTypes = templates\n .filter(template => template.columnName === selectedName)\n .map(template => template.columnType);\n } else {\n availableTypes = [...new Set(templates.map(template => template.columnType))];\n }\n\n return availableTypes\n .filter(type => type.toLowerCase().includes(term.toLowerCase()))\n .sort()\n .slice(0, 10);\n }\n\n onColumnNameSelected(event: any): void {\n const selectedName = event.item || event;\n if (typeof selectedName === 'string') {\n this.editForm.patchValue({ name: selectedName });\n\n this.findTemplatesForColumnName(selectedName).then(templatesForName => {\n if (templatesForName.length > 0) {\n const currentType = this.editForm.get('type')?.value;\n const typesForName = templatesForName.map(template => template.columnType);\n\n if (!currentType || !typesForName.includes(currentType)) {\n const firstTemplate = templatesForName[0];\n this.editForm.patchValue({\n type: firstTemplate.columnType,\n templateId: firstTemplate.id,\n ontologyType: firstTemplate.ontologyType || '',\n enableTypeahead: firstTemplate.enableTypeahead || false\n });\n } else {\n const matchingTemplate = templatesForName.find(t => t.columnType === currentType);\n if (matchingTemplate) {\n this.editForm.patchValue({\n templateId: matchingTemplate.id,\n ontologyType: matchingTemplate.ontologyType || '',\n enableTypeahead: matchingTemplate.enableTypeahead || false\n });\n } else {\n this.editForm.patchValue({\n templateId: null,\n ontologyType: '',\n enableTypeahead: false\n });\n }\n }\n } else {\n this.editForm.patchValue({\n templateId: null,\n ontologyType: '',\n enableTypeahead: false\n });\n }\n\n this.checkForSpecialSyntax();\n });\n }\n }\n\n private async findTemplatesForColumnName(columnName: string): Promise<MetadataColumnTemplate[]> {\n const cached = this.availableColumnTemplates();\n const cachedMatches = cached.filter(template => template.columnName === columnName);\n\n if (cachedMatches.length > 0) {\n return cachedMatches;\n }\n\n try {\n const response = await firstValueFrom(this.metadataColumnTemplateService.getMetadataColumnTemplates({\n search: columnName,\n limit: 10\n }));\n\n if (response) {\n const exactMatches = response.results.filter((template: MetadataColumnTemplate) => template.columnName === columnName);\n return exactMatches;\n }\n } catch (error) {\n console.warn('Failed to fetch templates for column name:', columnName, error);\n }\n\n return [];\n }\n\n onColumnTypeSelected(event: any): void {\n const selectedType = event.item || event;\n if (typeof selectedType === 'string') {\n this.editForm.patchValue({ type: selectedType });\n\n const selectedName = this.editForm.get('name')?.value;\n if (selectedName) {\n const templates = this.availableColumnTemplates();\n const matchingTemplate = templates.find(template =>\n template.columnName === selectedName && template.columnType === selectedType\n );\n\n if (matchingTemplate && matchingTemplate.id) {\n this.editForm.patchValue({\n templateId: matchingTemplate.id,\n ontologyType: matchingTemplate.ontologyType || '',\n enableTypeahead: matchingTemplate.enableTypeahead || false\n });\n } else {\n this.editForm.patchValue({\n templateId: null,\n ontologyType: '',\n enableTypeahead: false\n });\n }\n }\n\n this.checkForSpecialSyntax();\n }\n }\n\n openValueEditModal(): void {\n const formValue = this.editForm.value;\n\n const config: MetadataValueEditConfig = {\n columnName: formValue.name || 'Column',\n columnType: formValue.type || '',\n ontologyType: formValue.ontologyType || '',\n enableTypeahead: formValue.enableTypeahead || false,\n currentValue: formValue.value || '',\n context: 'favorite_management',\n templateId: formValue.templateId || undefined\n };\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 const newValue = typeof result === 'string' ? result : result.value;\n this.editForm.get('value')?.setValue(newValue);\n this.editForm.get('value')?.markAsTouched();\n this.selectedOntologyValue = newValue;\n modalRef.componentInstance.onClose();\n });\n }\n\n searchLabGroups: OperatorFunction<string, readonly {id: number, name: string}[]> = (text$: Observable<string>) =>\n text$.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n switchMap(term => {\n if (term.length === 0) {\n return of(this.availableLabGroups().slice(0, 10));\n } else if (term.length >= 1) {\n return this.labGroupService.getLabGroups({\n search: term,\n limit: 10\n }).pipe(\n map(response => response.results.map(group => ({\n id: group.id!,\n name: group.name\n }))),\n catchError(() => {\n return of(this.getLabGroupSuggestions(term));\n })\n );\n } else {\n return of([]);\n }\n })\n );\n\n private getLabGroupSuggestions(term: string): {id: number, name: string}[] {\n const allGroups = this.allLabGroups();\n\n if (!term) {\n return allGroups.slice(0, 10);\n }\n\n return allGroups\n .filter(group => group.name.toLowerCase().includes(term.toLowerCase()))\n .slice(0, 10);\n }\n\n formatLabGroup = (group: {id: number, name: string}): string => {\n return group.name;\n };\n\n inputLabGroupFormatter = (group: {id: number, name: string}): string => {\n return group.name;\n };\n\n onLabGroupSelected = (event: any): void => {\n const selectedGroup = event.item;\n if (selectedGroup && selectedGroup.id) {\n this.searchForm.patchValue({ labGroup: selectedGroup.id.toString() });\n }\n };\n\n getCleanColumnName(name: string): string {\n if (!name) return '';\n\n const bracketMatch = name.match(/\\[(.+?)\\]/);\n if (bracketMatch) {\n return bracketMatch[1];\n }\n\n return name;\n }\n\n getCleanColumnType(type: string): string {\n if (!type) return '';\n\n const cleanType = type.replace(/\\[.*?\\]/g, '').trim();\n\n return cleanType.charAt(0).toUpperCase() + cleanType.slice(1);\n }\n\n isComplexValue(value: string): boolean {\n if (!value) return false;\n\n const sdrfPattern = /^[A-Z]{2,3}=[^;]+(?:;[A-Z]{2,3}=[^;]+)+$/;\n const keyValuePattern = /\\w+[:=][^;,]+[;,]\\w+[:=]/;\n\n return sdrfPattern.test(value) || keyValuePattern.test(value);\n }\n\n parseComplexValue(value: string): {key: string, value: string}[] {\n if (!value) return [];\n\n const pairs: {key: string, value: string}[] = [];\n\n if (value.includes('=') && value.includes(';')) {\n const parts = value.split(';');\n parts.forEach(part => {\n const [key, val] = part.split('=', 2);\n if (key && val) {\n pairs.push({\n key: key.trim(),\n value: val.trim()\n });\n }\n });\n }\n else if (value.includes(':') && (value.includes(';') || value.includes(','))) {\n const separator = value.includes(';') ? ';' : ',';\n const parts = value.split(separator);\n parts.forEach(part => {\n const [key, val] = part.split(':', 2);\n if (key && val) {\n pairs.push({\n key: key.trim(),\n value: val.trim()\n });\n }\n });\n }\n\n return pairs;\n }\n\n checkForSpecialSyntax(): void {\n const columnName = this.editForm.get('name')?.value;\n const columnType = this.editForm.get('type')?.value;\n\n if (columnName && columnType) {\n const syntaxType = this.sdrfSyntaxService.detectSpecialSyntax(columnName, columnType);\n this.specialSyntaxType.set(syntaxType);\n\n if (syntaxType) {\n this.showSpecialInput.set(true);\n const currentValue = this.editForm.get('value')?.value;\n this.specialInputValue.set(currentValue || '');\n // Clear ontology value when switching to enhanced editor\n this.selectedOntologyValue = null;\n } else {\n this.showSpecialInput.set(false);\n this.specialInputValue.set('');\n }\n } else {\n this.specialSyntaxType.set(null);\n this.showSpecialInput.set(false);\n this.specialInputValue.set('');\n }\n }\n\n onSpecialInputChange(value: string): void {\n this.specialInputValue.set(value);\n // When enhanced editor provides a value, clear the ontology value storage\n // because the enhanced editor is providing the final string value\n this.selectedOntologyValue = null;\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 // Clear ontology value when switching back to regular input\n this.selectedOntologyValue = null;\n this.editForm.patchValue({ value: this.specialInputValue() });\n } else {\n // Switching to special input, clear ontology value\n this.selectedOntologyValue = null;\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 getColumnTypeClass(favouriteOption: FavouriteMetadataOption): string {\n const type = favouriteOption.type?.toLowerCase() || '';\n if (type.includes(ColumnType.CHARACTERISTICS)) return 'text-primary';\n if (type.includes(ColumnType.FACTOR_VALUE.replace('_', ' '))) return 'text-success';\n if (type.includes(ColumnType.COMMENT)) return 'text-info';\n if (type.includes(ColumnType.SOURCE_NAME.replace('_', ' '))) return 'text-warning';\n if (type === ColumnType.SPECIAL) return 'text-danger';\n return 'text-muted';\n }\n\n getColumnTypeIcon(favouriteMetadataOption: FavouriteMetadataOption): string {\n const type = favouriteMetadataOption.type?.toLowerCase() || '';\n if (type.includes(ColumnType.CHARACTERISTICS)) return 'bi-tags';\n if (type.includes(ColumnType.FACTOR_VALUE.replace('_', ' '))) return 'bi-sliders';\n if (type.includes(ColumnType.COMMENT)) return 'bi-chat-left-text';\n if (type.includes(ColumnType.SOURCE_NAME.replace('_', ' '))) return 'bi-diagram-3';\n if (type === ColumnType.SPECIAL) return 'bi-star';\n return 'bi-circle';\n }\n}\n","<div class=\"favorite-management-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=\"mb-0\">\n <i class=\"bi bi-heart-fill me-2 text-danger\"></i>Favorite Management\n </h4>\n <span class=\"badge bg-primary ms-3\">{{ filteredFavorites().length }} favorites</span>\n </div>\n\n <div class=\"d-flex gap-2\">\n <button\n type=\"button\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"openCreateModal()\"\n [disabled]=\"isLoading()\">\n <i class=\"bi bi-plus-circle me-1\"></i>Add Favorite\n </button>\n </div>\n </div>\n </div>\n </nav>\n\n <div class=\"tables-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 <label for=\"search\" class=\"form-label\">Search</label>\n <div class=\"input-group\">\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 id=\"search\"\n formControlName=\"search\"\n placeholder=\"Search by name or value\">\n </div>\n </div>\n\n <div class=\"col-md-3\">\n <label for=\"scope\" class=\"form-label\">Scope</label>\n <select class=\"form-select\" id=\"scope\" formControlName=\"scope\">\n <option value=\"\">All Scopes</option>\n <option value=\"personal\">Personal</option>\n <option value=\"lab_group\">Lab Group</option>\n <option value=\"global\">Global</option>\n </select>\n </div>\n\n <div class=\"col-md-3\">\n <label for=\"labGroup\" class=\"form-label\">Lab Group</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"labGroup\"\n formControlName=\"labGroup\"\n placeholder=\"All Lab Groups\"\n [ngbTypeahead]=\"searchLabGroups\"\n [resultFormatter]=\"formatLabGroup\"\n [inputFormatter]=\"inputLabGroupFormatter\"\n (selectItem)=\"onLabGroupSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\">\n </div>\n\n <div class=\"col-md-3\">\n <label for=\"columnType\" class=\"form-label\">Column Type</label>\n <select class=\"form-select\" id=\"columnType\" formControlName=\"columnType\">\n @for (type of columnTypes; track type.value) {\n <option [value]=\"type.value\">{{ type.label }}</option>\n }\n </select>\n </div>\n </form>\n </div>\n </div>\n\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-table me-2\"></i>Favorites options\n <span class=\"badge bg-primary ms-2\"></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 (!isLoading()) {\n\n @if (filteredFavorites().length === 0) {\n <div class=\"text-center py-5\">\n <i class=\"bi bi-heart display-1 text-muted\"></i>\n <h5 class=\"mt-3 text-muted\">No Favorites Found</h5>\n @if (searchTerm() || scopeFilter() || columnTypeFilter()) {\n <p class=\"text-muted\">Try adjusting your search criteria</p>\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"clearFilters()\">\n <i class=\"bi bi-arrow-clockwise me-1\"></i>Clear Filters\n </button>\n } @else {\n <p class=\"text-muted\">Create your first favorite to get started</p>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"openCreateModal()\">\n <i class=\"bi bi-plus-circle me-1\"></i>Add First Favorite\n </button>\n }\n </div>\n }\n\n <!-- Favorites Table -->\n @if (filteredFavorites().length > 0) {\n <div class=\"card\">\n <div class=\"card-body p-0\">\n <div class=\"table-responsive\">\n <table class=\"table table-hover mb-0\">\n <thead>\n <tr>\n <th scope=\"col\" style=\"width: 200px;\">Column</th>\n <th scope=\"col\" style=\"width: 200px;\">Display Name</th>\n <th scope=\"col\">Value</th>\n <th scope=\"col\" style=\"width: 150px;\">Scope</th>\n <th scope=\"col\" style=\"width: 120px;\">Created</th>\n <th scope=\"col\" style=\"width: 120px;\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (favorite of paginatedFavorites(); track favorite.id) {\n <tr>\n <td>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"d-flex align-items-center\">\n <i class=\"me-2\" [class]=\"getColumnTypeIcon(favorite) + ' ' + getColumnTypeClass(favorite)\"></i>\n <span class=\"fw-semibold\">{{ getCleanColumnName(favorite.name) }}</span>\n </div>\n </div>\n </td>\n <td>\n <div class=\"text-truncate\" [title]=\"favorite.displayValue || 'No display name'\">\n @if (favorite.displayValue && favorite.displayValue.trim()) {\n {{ favorite.displayValue }}\n } @else {\n <span class=\"text-muted fst-italic\">No display name</span>\n }\n </div>\n </td>\n <td>\n <div style=\"max-width: 300px;\">\n @if (isComplexValue(favorite.value)) {\n <!-- Complex value with key-value pairs -->\n <div class=\"d-flex flex-wrap gap-1\">\n @for (pair of parseComplexValue(favorite.value); track $index) {\n <span class=\"badge bg-light text-dark border\">\n <small><strong>{{ pair.key }}:</strong> {{ pair.value }}</small>\n </span>\n }\n </div>\n } @else {\n <!-- Simple value -->\n <div class=\"text-truncate\" [title]=\"favorite.value\">\n {{ favorite.value }}\n </div>\n }\n </div>\n </td>\n <td>\n <span [class]=\"getScopeClass(favorite)\">\n @if (favorite.isGlobal) {\n <i class=\"bi bi-globe me-1\"></i>Global\n } @else if (favorite.labGroup) {\n <i class=\"bi bi-people me-1\"></i>Lab Group\n } @else {\n <i class=\"bi bi-person me-1\"></i>Personal\n }\n </span>\n @if (favorite.userUsername && !favorite.isGlobal) {\n <br><small class=\"text-muted\">{{ favorite.userUsername }}</small>\n }\n @if (favorite.labGroupName) {\n <br><small class=\"text-muted\">{{ favorite.labGroupName }}</small>\n }\n </td>\n <td>\n <small class=\"text-muted\">\n {{ favorite.createdAt | date:'MMM d, y' }}\n </small>\n </td>\n <td>\n <div class=\"btn-group btn-group-sm\">\n @if (canEditFavorite(favorite)) {\n <button\n type=\"button\"\n class=\"btn btn-outline-primary\"\n (click)=\"openEditModal(favorite)\"\n title=\"Edit favorite\">\n <i class=\"bi bi-pencil\"></i>\n </button>\n }\n @if (canDeleteFavorite(favorite)) {\n <button\n type=\"button\"\n class=\"btn btn-outline-danger\"\n (click)=\"deleteFavorite(favorite)\"\n title=\"Delete favorite\">\n <i class=\"bi bi-trash\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n <!-- Pagination -->\n @if (totalPages() > 1) {\n <div class=\"d-flex justify-content-between align-items-center mt-4\">\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"text-muted\">Show:</span>\n <select\n class=\"form-select form-select-sm\"\n style=\"width: auto;\"\n [value]=\"pageSize()\"\n (change)=\"onPageSizeChange(+($any($event.target).value))\">\n <option value=\"10\">10</option>\n <option value=\"25\">25</option>\n <option value=\"50\">50</option>\n <option value=\"100\">100</option>\n </select>\n <span class=\"text-muted\">per page</span>\n </div>\n\n <ngb-pagination\n [collectionSize]=\"totalFavoritesCount()\"\n [page]=\"currentPage()\"\n [pageSize]=\"pageSize()\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"true\"\n [rotate]=\"true\"\n (pageChange)=\"onPageChange($event)\"\n class=\"pagination-sm mb-0\">\n </ngb-pagination>\n\n <span class=\"text-muted\">\n Showing {{ ((currentPage() - 1) * pageSize()) + 1 }}-{{ Math.min(currentPage() * pageSize(), totalFavoritesCount()) }}\n of {{ totalFavoritesCount() }} favorites\n </span>\n </div>\n }\n }\n }\n </div>\n </div>\n </div>\n</div>\n\n<!-- Edit/Create Modal -->\n@if (showEditModal()) {\n <div class=\"modal fade show d-block\" tabindex=\"-1\" style=\"background: rgba(0,0,0,0.5);\">\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">\n <i class=\"bi bi-heart me-2\"></i>{{ editModalTitle }}\n </h5>\n <button type=\"button\" class=\"btn-close\" (click)=\"closeEditModal()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <form [formGroup]=\"editForm\" (ngSubmit)=\"saveFavorite()\">\n <div class=\"row\">\n <div class=\"col-md-6 mb-3\">\n <label for=\"favName\" class=\"form-label\">\n Column Name *\n @if (columnTemplatesLoaded()) {\n <small class=\"text-success ms-1\">\n <i class=\"bi bi-search\"></i> Autocomplete Available\n </small>\n }\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"favName\"\n formControlName=\"name\"\n [class.is-invalid]=\"editForm.get('name')?.invalid && editForm.get('name')?.touched\"\n placeholder=\"e.g., organism\"\n [ngbTypeahead]=\"searchColumnNames\"\n (selectItem)=\"onColumnNameSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\">\n <div class=\"form-text\">\n @if (columnTemplatesLoaded()) {\n Type to search available column names from templates\n } @else {\n Loading column suggestions...\n }\n </div>\n <div class=\"invalid-feedback\">\n @if (editForm.get('name')?.errors?.['required']) {\n Column name is required\n }\n @if (editForm.get('name')?.errors?.['maxlength']) {\n Column name must be less than 255 characters\n }\n </div>\n </div>\n\n <div class=\"col-md-6 mb-3\">\n <label for=\"favType\" class=\"form-label\">\n Column Type *\n @if (columnTemplatesLoaded()) {\n <small class=\"text-success ms-1\">\n <i class=\"bi bi-search\"></i> Autocomplete Available\n </small>\n }\n </label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"favType\"\n formControlName=\"type\"\n [class.is-invalid]=\"editForm.get('type')?.invalid && editForm.get('type')?.touched\"\n placeholder=\"e.g., characteristics[organism]\"\n [ngbTypeahead]=\"searchColumnTypes\"\n (selectItem)=\"onColumnTypeSelected($event)\"\n [editable]=\"true\"\n [showHint]=\"true\"\n [focusFirst]=\"false\"\n container=\"body\">\n <div class=\"form-text\">\n @if (columnTemplatesLoaded()) {\n Type to search available column types (filtered by selected name)\n } @else {\n Loading column suggestions...\n }\n </div>\n <div class=\"invalid-feedback\">\n @if (editForm.get('type')?.errors?.['required']) {\n Column type is required\n }\n @if (editForm.get('type')?.errors?.['maxlength']) {\n Column type must be less than 255 characters\n }\n </div>\n </div>\n </div>\n\n <div class=\"mb-3\">\n <label for=\"favValue\" class=\"form-label\">\n Value\n @if (editForm.get('templateId')?.value) {\n <span class=\"badge bg-success ms-2\">\n <i class=\"bi bi-search me-1\"></i>Advanced Editor 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 <div class=\"input-group\">\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"favValue\"\n formControlName=\"value\"\n [class.is-invalid]=\"editForm.get('value')?.invalid && editForm.get('value')?.touched\"\n placeholder=\"Enter favorite 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 (editForm.get('templateId')?.value) {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to use advanced value editor with ontology autocomplete suggestions\n } @else if (specialSyntaxType()) {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to use enhanced {{ specialSyntaxType() }} editor for structured input\n } @else {\n <i class=\"bi bi-info-circle me-1\"></i>\n Click \"Edit\" to set the value (select column name and type for smart suggestions)\n }\n </div>\n <div class=\"invalid-feedback\">\n @if (editForm.get('value')?.errors?.['maxlength']) {\n Value must be less than 500 characters\n }\n </div>\n </div>\n\n <div class=\"mb-3\">\n <label for=\"favDisplayValue\" class=\"form-label\">Display Value</label>\n <input\n type=\"text\"\n class=\"form-control\"\n id=\"favDisplayValue\"\n formControlName=\"displayValue\"\n placeholder=\"Optional: Human-readable version\">\n <div class=\"form-text\">If empty, will use the same value as above</div>\n </div>\n\n <div class=\"mb-3\">\n <label for=\"favScope\" class=\"form-label\">Scope *</label>\n <select\n class=\"form-select\"\n id=\"favScope\"\n formControlName=\"scope\">\n <option value=\"personal\">Personal (Only visible to me)</option>\n @if (userLabGroups().length > 0) {\n <option value=\"lab_group\">Lab Group (Visible to my lab group)</option>\n }\n @if (isAdmin()) {\n <option value=\"global\">Global (Visible to everyone)</option>\n }\n </select>\n </div>\n\n <!-- Lab Group Selection (shown when lab_group scope is selected) -->\n @if (editForm.get('scope')?.value === 'lab_group' && userLabGroups().length > 1) {\n <div class=\"mb-3\">\n <label for=\"favLabGroup\" class=\"form-label\">Lab Group *</label>\n <select\n class=\"form-select\"\n id=\"favLabGroup\"\n formControlName=\"labGroupId\">\n <option value=\"\">Select a lab group</option>\n @for (labGroup of userLabGroups(); track labGroup.id) {\n <option [value]=\"labGroup.id\">{{ labGroup.name }}</option>\n }\n </select>\n <div class=\"form-text\">Choose which lab group this favorite will be visible to</div>\n </div>\n }\n </form>\n </div>\n\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"closeEditModal()\">\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)=\"saveFavorite()\"\n [disabled]=\"editForm.invalid\">\n <i class=\"bi bi-check-circle me-1\"></i>\n {{ isEditMode() ? 'Update' : 'Create' }} Favorite\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n","import { Component, Input, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { MetadataColumn } from '../../models';\r\n\r\nexport interface SearchReplaceConfig {\r\n context: 'table' | 'column';\r\n tableId?: number;\r\n tableName?: string;\r\n columnId?: number;\r\n columnName?: string;\r\n columns?: MetadataColumn[];\r\n}\r\n\r\n@Component({\r\n selector: 'ccv-search-replace-modal',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule],\r\n templateUrl: './search-replace-modal.html',\r\n styleUrl: './search-replace-modal.scss'\r\n})\r\nexport class SearchReplaceModal {\r\n @Input() config!: SearchReplaceConfig;\r\n\r\n searchReplaceForm: FormGroup;\r\n isProcessing = signal(false);\r\n result = signal<{\r\n message: string;\r\n oldValue: string;\r\n newValue: string;\r\n columnsChecked?: number;\r\n columnsUpdated?: number;\r\n defaultValueUpdated?: boolean;\r\n modifiersMerged?: number;\r\n modifiersDeleted?: number;\r\n } | null>(null);\r\n\r\n constructor(\r\n private fb: FormBuilder,\r\n public activeModal: NgbActiveModal\r\n ) {\r\n this.searchReplaceForm = this.fb.group({\r\n oldValue: ['', [Validators.required, Validators.minLength(1)]],\r\n newValue: ['', [Validators.required]],\r\n columnId: [null],\r\n columnName: [''],\r\n updatePools: [false]\r\n });\r\n }\r\n\r\n get isTableContext(): boolean {\r\n return this.config?.context === 'table';\r\n }\r\n\r\n get isColumnContext(): boolean {\r\n return this.config?.context === 'column';\r\n }\r\n\r\n onSubmit() {\r\n if (this.searchReplaceForm.valid) {\r\n this.activeModal.close({\r\n action: 'replace',\r\n data: this.searchReplaceForm.value\r\n });\r\n } else {\r\n this.markFormGroupTouched();\r\n }\r\n }\r\n\r\n private markFormGroupTouched() {\r\n Object.keys(this.searchReplaceForm.controls).forEach(key => {\r\n const control = this.searchReplaceForm.get(key);\r\n control?.markAsTouched();\r\n });\r\n }\r\n\r\n onCancel() {\r\n this.activeModal.dismiss();\r\n }\r\n\r\n getFieldError(fieldName: string): string {\r\n const control = this.searchReplaceForm.get(fieldName);\r\n if (control?.errors && control.touched) {\r\n if (control.errors['required']) return `${fieldName} is required`;\r\n if (control.errors['minlength']) return `${fieldName} must be at least ${control.errors['minlength'].requiredLength} characters`;\r\n }\r\n return '';\r\n }\r\n}\r\n","<div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n <i class=\"bi bi-search me-2\"></i>Search and Replace Values\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" (click)=\"onCancel()\"></button>\r\n</div>\r\n\r\n<div class=\"modal-body\">\r\n <form [formGroup]=\"searchReplaceForm\" (ngSubmit)=\"onSubmit()\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-3\">\r\n <div class=\"alert alert-info\">\r\n <i class=\"bi bi-info-circle me-2\"></i>\r\n @if (isTableContext) {\r\n <strong>Table Context:</strong> Search and replace values across {{ config.tableName }}\r\n } @else {\r\n <strong>Column Context:</strong> Search and replace values in {{ config.columnName }}\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (isTableContext && config.columns && config.columns.length > 0) {\r\n <div class=\"col-12 mb-3\">\r\n <label for=\"columnSelect\" class=\"form-label\">\r\n Target Column <small class=\"text-muted\">(optional - leave empty to search all columns)</small>\r\n </label>\r\n <select\r\n class=\"form-select\"\r\n id=\"columnSelect\"\r\n formControlName=\"columnId\">\r\n <option [ngValue]=\"null\">All Columns</option>\r\n @for (column of config.columns; track column.id) {\r\n <option [ngValue]=\"column.id\">{{ column.name }}</option>\r\n }\r\n </select>\r\n <div class=\"form-text\">\r\n <i class=\"bi bi-info-circle me-1\"></i>\r\n Select a specific column to limit the search, or leave as \"All Columns\" to search everywhere.\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-3\">\r\n <label for=\"oldValue\" class=\"form-label\">Find Value *</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n id=\"oldValue\"\r\n formControlName=\"oldValue\"\r\n [class.is-invalid]=\"searchReplaceForm.get('oldValue')?.invalid && searchReplaceForm.get('oldValue')?.touched\"\r\n placeholder=\"Enter value to find\">\r\n <div class=\"invalid-feedback\">\r\n {{ getFieldError('oldValue') }}\r\n </div>\r\n <div class=\"form-text\">\r\n <i class=\"bi bi-info-circle me-1\"></i>\r\n Exact match - this will find all cells with exactly this value.\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12 mb-3\">\r\n <label for=\"newValue\" class=\"form-label\">Replace With *</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n id=\"newValue\"\r\n formControlName=\"newValue\"\r\n [class.is-invalid]=\"searchReplaceForm.get('newValue')?.invalid && searchReplaceForm.get('newValue')?.touched\"\r\n placeholder=\"Enter replacement value\">\r\n <div class=\"invalid-feedback\">\r\n {{ getFieldError('newValue') }}\r\n </div>\r\n <div class=\"form-text\">\r\n <i class=\"bi bi-info-circle me-1\"></i>\r\n All matching values will be replaced with this value.\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12 mb-3\">\r\n <div class=\"form-check form-switch\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n id=\"updatePools\"\r\n formControlName=\"updatePools\">\r\n <label class=\"form-check-label\" for=\"updatePools\">\r\n Update Sample Pools\r\n </label>\r\n </div>\r\n <div class=\"form-text\">\r\n <i class=\"bi bi-info-circle me-1\"></i>\r\n When enabled, this will also update values in related sample pools.\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <div class=\"alert alert-warning\">\r\n <i class=\"bi bi-exclamation-triangle me-2\"></i>\r\n <strong>Warning:</strong> This operation cannot be undone. All matching values will be permanently replaced.\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n\r\n<div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-outline-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)=\"onSubmit()\"\r\n [disabled]=\"searchReplaceForm.invalid || isProcessing()\">\r\n @if (isProcessing()) {\r\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\r\n }\r\n <i class=\"bi bi-arrow-repeat me-1\"></i>\r\n Replace All\r\n </button>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { SamplePool } from '../../models';\n\n@Component({\n selector: 'ccv-sample-pool-details-modal',\n standalone: true,\n imports: [CommonModule, NgbModule],\n templateUrl: './sample-pool-details-modal.html',\n styleUrl: './sample-pool-details-modal.scss'\n})\nexport class SamplePoolDetailsModal {\n @Input() pool!: SamplePool;\n\n constructor(private activeModal: NgbActiveModal) {}\n\n onClose(): void {\n this.activeModal.close();\n }\n\n get title(): string {\n return this.pool?.poolName || 'Sample Pool Details';\n }\n\n get poolTypeLabel(): string {\n return this.pool?.isReference ? 'Reference Pool' : 'Sample Pool';\n }\n\n get poolTypeClass(): string {\n return this.pool?.isReference ? 'badge bg-info' : 'badge bg-primary';\n }\n\n get pooledOnlySamplesText(): string {\n if (!this.pool?.pooledOnlySamples || this.pool.pooledOnlySamples.length === 0) {\n return 'None';\n }\n return this.pool.pooledOnlySamples.join(', ');\n }\n\n get pooledAndIndependentSamplesText(): string {\n if (!this.pool?.pooledAndIndependentSamples || this.pool.pooledAndIndependentSamples.length === 0) {\n return 'None';\n }\n return this.pool.pooledAndIndependentSamples.join(', ');\n }\n\n get allSamplesCount(): number {\n const pooledOnly = this.pool?.pooledOnlySamples?.length || 0;\n const pooledAndIndependent = this.pool?.pooledAndIndependentSamples?.length || 0;\n return pooledOnly + pooledAndIndependent;\n }\n}","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-collection me-2\"></i>{{ title }}\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"onClose()\"></button>\n</div>\n\n<div class=\"modal-body\">\n @if (pool) {\n <!-- Pool Type and Basic Info -->\n <div class=\"mb-4\">\n <div class=\"d-flex justify-content-between align-items-start mb-3\">\n <div>\n <h5 class=\"mb-2\">{{ pool.poolName }}</h5>\n <span [class]=\"poolTypeClass\">\n <i class=\"bi bi-collection me-1\"></i>{{ poolTypeLabel }}\n </span>\n </div>\n <div class=\"text-end\">\n <small class=\"text-muted d-block\">Pool ID: {{ pool.id }}</small>\n <small class=\"text-muted\">Total Samples: {{ allSamplesCount }}</small>\n </div>\n </div>\n \n @if (pool.poolDescription) {\n <div class=\"mt-3\">\n <strong>Description:</strong>\n <p class=\"mt-1 mb-0\">{{ pool.poolDescription }}</p>\n </div>\n }\n </div>\n\n <!-- Sample Configuration -->\n <div class=\"mb-4\">\n <h6 class=\"text-muted mb-3\">\n <i class=\"bi bi-diagram-3 me-2\"></i>Sample Configuration\n </h6>\n \n <div class=\"row\">\n <!-- Pooled Only Samples -->\n <div class=\"col-md-6 mb-3\">\n <div class=\"card h-100\">\n <div class=\"card-body\">\n <h6 class=\"card-title\">\n <i class=\"bi bi-collection text-primary me-2\"></i>Pooled Only Samples\n </h6>\n <p class=\"card-text\">\n <small class=\"text-muted\">{{ pool.pooledOnlySamples.length || 0 }} samples</small>\n </p>\n <div class=\"sample-list\">\n @if (pool.pooledOnlySamples && pool.pooledOnlySamples.length > 0) {\n <div class=\"sample-numbers\">{{ pooledOnlySamplesText }}</div>\n } @else {\n <em class=\"text-muted\">No pooled-only samples</em>\n }\n </div>\n </div>\n </div>\n </div>\n\n <!-- Pooled and Independent Samples -->\n <div class=\"col-md-6 mb-3\">\n <div class=\"card h-100\">\n <div class=\"card-body\">\n <h6 class=\"card-title\">\n <i class=\"bi bi-diagram-2 text-success me-2\"></i>Pooled & Independent Samples\n </h6>\n <p class=\"card-text\">\n <small class=\"text-muted\">{{ pool.pooledAndIndependentSamples.length || 0 }} samples</small>\n </p>\n <div class=\"sample-list\">\n @if (pool.pooledAndIndependentSamples && pool.pooledAndIndependentSamples.length > 0) {\n <div class=\"sample-numbers\">{{ pooledAndIndependentSamplesText }}</div>\n } @else {\n <em class=\"text-muted\">No pooled & independent samples</em>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Template Sample -->\n </div>\n\n <!-- Metadata Columns -->\n @if (pool.metadataColumns && pool.metadataColumns.length > 0) {\n <div class=\"mb-4\">\n <h6 class=\"text-muted mb-3\">\n <i class=\"bi bi-table me-2\"></i>Metadata Columns ({{ pool.metadataColumns.length }})\n </h6>\n <div class=\"table-responsive\">\n <table class=\"table table-sm\">\n <thead>\n <tr>\n <th>Column Name</th>\n <th>Type</th>\n <th>Value</th>\n <th>Ontology</th>\n </tr>\n </thead>\n <tbody>\n @for (column of pool.metadataColumns; track column.id) {\n <tr>\n <td>\n <strong>{{ column.name }}</strong>\n </td>\n <td>\n <span class=\"badge bg-light text-dark\">{{ column.type }}</span>\n </td>\n <td>\n @if (column.value) {\n <code>{{ column.value }}</code>\n } @else {\n <em class=\"text-muted\">No default value</em>\n }\n </td>\n <td>\n @if (column.ontologyType) {\n <span class=\"badge bg-info\">{{ column.ontologyType }}</span>\n } @else {\n <em class=\"text-muted\">None</em>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- Timestamps -->\n <div class=\"mt-4\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <small class=\"text-muted\">\n <i class=\"bi bi-calendar-plus me-1\"></i>\n Created: {{ pool.createdAt | date:'MMM d, y, h:mm a' }}\n </small>\n </div>\n <div class=\"col-md-6\">\n <small class=\"text-muted\">\n <i class=\"bi bi-calendar-check me-1\"></i>\n Updated: {{ pool.updatedAt | date:'MMM d, y, h:mm a' }}\n </small>\n </div>\n </div>\n </div>\n\n } @else {\n <div class=\"text-center py-4\">\n <i class=\"bi bi-exclamation-triangle text-warning display-4\"></i>\n <h5 class=\"mt-3 text-muted\">No Pool Data Available</h5>\n <p class=\"text-muted\">Pool information could not be loaded.</p>\n </div>\n }\n</div>\n\n<div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onClose()\">\n <i class=\"bi bi-x-circle me-1\"></i>Close\n </button>\n</div>","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 { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap';\nimport { SamplePool } from '../../models';\nimport { SamplePoolService } from '../../services';\n\n@Component({\n selector: 'ccv-sample-pool-edit-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './sample-pool-edit-modal.html',\n styleUrl: './sample-pool-edit-modal.scss'\n})\nexport class SamplePoolEditModal implements OnInit {\n @Input() pool!: SamplePool;\n @Input() maxSampleCount: number = 100;\n @Output() poolSaved = new EventEmitter<SamplePool>();\n\n editForm: FormGroup;\n isLoading = signal(false);\n\n private fb = inject(FormBuilder);\n private activeModal = inject(NgbActiveModal);\n private samplePoolService = inject(SamplePoolService);\n\n constructor() {\n this.editForm = this.fb.group({\n poolName: ['', [Validators.required, Validators.maxLength(255)]],\n poolDescription: [''],\n isReference: [false],\n pooledOnlySamplesText: [''],\n pooledAndIndependentSamplesText: ['']\n });\n }\n\n ngOnInit() {\n if (this.pool) {\n this.editForm.patchValue({\n poolName: this.pool.poolName,\n poolDescription: this.pool.poolDescription || '',\n isReference: this.pool.isReference,\n pooledOnlySamplesText: this.pool.pooledOnlySamples?.join(', ') || '',\n pooledAndIndependentSamplesText: this.pool.pooledAndIndependentSamples?.join(', ') || ''\n });\n }\n }\n\n onSubmit(): void {\n if (this.editForm.valid && this.pool.id) {\n this.isLoading.set(true);\n \n const formValue = this.editForm.value;\n \n // Parse sample arrays from text input\n const pooledOnlySamples = this.parseSampleNumbers(formValue.pooledOnlySamplesText);\n const pooledAndIndependentSamples = this.parseSampleNumbers(formValue.pooledAndIndependentSamplesText);\n \n const updateData: Partial<SamplePool> = {\n poolName: formValue.poolName.trim(),\n poolDescription: formValue.poolDescription?.trim() || undefined,\n isReference: formValue.isReference,\n pooledOnlySamples: pooledOnlySamples,\n pooledAndIndependentSamples: pooledAndIndependentSamples\n };\n\n this.samplePoolService.updateSamplePool(this.pool.id, updateData).subscribe({\n next: (updatedPool) => {\n this.poolSaved.emit(updatedPool);\n this.activeModal.close(updatedPool);\n },\n error: (error) => {\n console.error('Error updating sample pool:', error);\n this.isLoading.set(false);\n }\n });\n }\n }\n\n onCancel(): void {\n this.activeModal.dismiss();\n }\n\n get title(): string {\n return `Edit ${this.pool?.poolName || 'Sample Pool'}`;\n }\n\n get hasChanges(): boolean {\n if (!this.pool) return false;\n \n const formValue = this.editForm.value;\n return (\n formValue.poolName !== this.pool.poolName ||\n formValue.poolDescription !== (this.pool.poolDescription || '') ||\n formValue.isReference !== this.pool.isReference ||\n formValue.pooledOnlySamplesText !== (this.pool.pooledOnlySamples?.join(', ') || '') ||\n formValue.pooledAndIndependentSamplesText !== (this.pool.pooledAndIndependentSamples?.join(', ') || '')\n );\n }\n\n private parseSampleNumbers(text: string): number[] {\n if (!text?.trim()) return [];\n \n const results: number[] = [];\n \n text\n .split(',')\n .map(s => s.trim())\n .filter(s => s.length > 0)\n .forEach(s => {\n // Check if it's a range (e.g., \"9-12\")\n if (s.includes('-')) {\n const parts = s.split('-').map(p => p.trim());\n if (parts.length === 2) {\n const start = parseInt(parts[0], 10);\n const end = parseInt(parts[1], 10);\n \n if (!isNaN(start) && !isNaN(end) && start > 0 && end > 0 && start <= end && end <= this.maxSampleCount) {\n // Add all numbers in the range\n for (let i = start; i <= end; i++) {\n results.push(i);\n }\n }\n }\n } else {\n // Single number\n const num = parseInt(s, 10);\n if (!isNaN(num) && num > 0 && num <= this.maxSampleCount) {\n results.push(num);\n }\n }\n });\n \n // Remove duplicates and sort\n return [...new Set(results)].sort((a, b) => a - b);\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 if (field.errors['required']) {\n return `${this.getFieldDisplayName(fieldName)} is required`;\n }\n if (field.errors['maxlength']) {\n return `${this.getFieldDisplayName(fieldName)} must be less than ${field.errors['maxlength'].requiredLength} characters`;\n }\n\n return 'Invalid value';\n }\n\n private getFieldDisplayName(fieldName: string): string {\n const displayNames: { [key: string]: string } = {\n 'poolName': 'Pool name',\n 'poolDescription': 'Description',\n 'pooledOnlySamplesText': 'Pooled only samples',\n 'pooledAndIndependentSamplesText': 'Pooled and independent samples'\n };\n return displayNames[fieldName] || fieldName;\n }\n\n // Helper methods for template\n get pooledOnlySamplesCount(): number {\n const text = this.editForm.get('pooledOnlySamplesText')?.value || '';\n return this.parseSampleNumbers(text).length;\n }\n\n get pooledAndIndependentSamplesCount(): number {\n const text = this.editForm.get('pooledAndIndependentSamplesText')?.value || '';\n return this.parseSampleNumbers(text).length;\n }\n\n get totalSamplesCount(): number {\n return this.pooledOnlySamplesCount + this.pooledAndIndependentSamplesCount;\n }\n}","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-collection 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 <!-- Pool Name -->\n <div class=\"mb-3\">\n <label for=\"poolName\" class=\"form-label\">Pool Name *</label>\n <input \n type=\"text\" \n class=\"form-control\"\n id=\"poolName\"\n formControlName=\"poolName\"\n [class.is-invalid]=\"isFieldInvalid('poolName')\"\n placeholder=\"Enter pool name\">\n @if (isFieldInvalid('poolName')) {\n <div class=\"invalid-feedback\">\n {{ getFieldError('poolName') }}\n </div>\n }\n </div>\n\n <!-- Description -->\n <div class=\"mb-3\">\n <label for=\"poolDescription\" class=\"form-label\">Description</label>\n <textarea \n class=\"form-control\"\n id=\"poolDescription\"\n formControlName=\"poolDescription\"\n rows=\"2\"\n placeholder=\"Optional pool description\"></textarea>\n </div>\n\n <!-- Pool Type and Template Sample -->\n <div class=\"row\">\n <div class=\"col-md-6 mb-3\">\n <div class=\"form-check\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n id=\"isReference\" \n formControlName=\"isReference\">\n <label class=\"form-check-label\" for=\"isReference\">\n <strong>Reference Pool</strong>\n <div class=\"form-text\">Check if this is a reference pool</div>\n </label>\n </div>\n </div>\n </div>\n\n <!-- Sample Configuration -->\n <div class=\"mb-4\">\n <h6 class=\"text-muted mb-3\">Sample Configuration</h6>\n \n <!-- Pooled Only Samples -->\n <div class=\"mb-3\">\n <label for=\"pooledOnlySamples\" class=\"form-label\">\n Pooled Only Samples\n <span class=\"badge bg-primary ms-2\">{{ pooledOnlySamplesCount }} samples</span>\n </label>\n <input \n type=\"text\" \n class=\"form-control\"\n id=\"pooledOnlySamples\"\n formControlName=\"pooledOnlySamplesText\"\n placeholder=\"e.g., 1, 2, 3, 5-8\">\n <div class=\"form-text\">\n Enter sample numbers separated by commas. Ranges like \"5-8\" are supported.\n </div>\n </div>\n\n <!-- Pooled and Independent Samples -->\n <div class=\"mb-3\">\n <label for=\"pooledAndIndependentSamples\" class=\"form-label\">\n Pooled & Independent Samples\n <span class=\"badge bg-success ms-2\">{{ pooledAndIndependentSamplesCount }} samples</span>\n </label>\n <input \n type=\"text\" \n class=\"form-control\"\n id=\"pooledAndIndependentSamples\"\n formControlName=\"pooledAndIndependentSamplesText\"\n placeholder=\"e.g., 4, 9, 10-15\">\n <div class=\"form-text\">\n Enter sample numbers that are both pooled and run independently.\n </div>\n </div>\n\n <!-- Total Count Display -->\n <div class=\"alert alert-info\">\n <i class=\"bi bi-info-circle me-2\"></i>\n <strong>Total Samples:</strong> {{ totalSamplesCount }}\n @if (totalSamplesCount > maxSampleCount) {\n <span class=\"text-danger ms-2\">\n (Exceeds maximum of {{ maxSampleCount }})\n </span>\n }\n </div>\n </div>\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('poolName')?.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() || !hasChanges\">\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 Pool\n </button>\n</div>","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 } from '@ng-bootstrap/ng-bootstrap';\nimport { SamplePool, SamplePoolCreateRequest, MetadataTable } from '../../models';\nimport { SamplePoolService } from '../../services';\nimport { ToastService } from '@noatgnu/cupcake-core';\n\ninterface SampleSelectionItem {\n sampleNumber: number;\n selected: boolean;\n pooled: boolean;\n}\n\n@Component({\n selector: 'ccv-sample-pool-create-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, NgbModule],\n templateUrl: './sample-pool-create-modal.html',\n styleUrl: './sample-pool-create-modal.scss'\n})\nexport class SamplePoolCreateModal implements OnInit {\n @Input() metadataTable!: MetadataTable;\n @Output() poolCreated = new EventEmitter<SamplePool>();\n\n // Expose Math to template\n Math = Math;\n\n createForm: FormGroup;\n isLoading = signal(false);\n \n // Sample selection management\n samples = signal<SampleSelectionItem[]>([]);\n pooledOnlySamples = signal<number[]>([]);\n pooledAndIndependentSamples = signal<number[]>([]);\n \n // UI state\n selectionMode = signal<'manual' | 'range'>('manual');\n currentPage = signal(1);\n samplesPerPage = 20;\n\n constructor(\n private fb: FormBuilder,\n private activeModal: NgbActiveModal,\n private samplePoolService: SamplePoolService,\n private toastService: ToastService\n ) {\n this.createForm = this.fb.group({\n poolName: ['', [Validators.required, Validators.maxLength(255)]],\n poolDescription: [''],\n isReference: [false],\n range_start: [1, [Validators.min(1)]],\n range_end: [10, [Validators.min(1)]],\n pooled_only_samples_text: [''],\n pooled_and_independent_samples_text: ['']\n });\n }\n\n ngOnInit() {\n if (!this.metadataTable) {\n this.activeModal.dismiss('No metadata table provided');\n return;\n }\n\n // Initialize sample list\n this.initializeSamples();\n \n // Update range end validator based on sample count\n const rangeEndControl = this.createForm.get('range_end');\n if (rangeEndControl) {\n rangeEndControl.setValidators([\n Validators.min(1), \n Validators.max(this.metadataTable.sampleCount)\n ]);\n rangeEndControl.updateValueAndValidity();\n }\n\n const rangeStartControl = this.createForm.get('range_start');\n if (rangeStartControl) {\n rangeStartControl.setValidators([\n Validators.min(1), \n Validators.max(this.metadataTable.sampleCount)\n ]);\n rangeStartControl.updateValueAndValidity();\n }\n }\n\n private initializeSamples(): void {\n const sampleItems: SampleSelectionItem[] = [];\n const existingPooledSamples = this.getExistingPooledSamples();\n \n for (let i = 1; i <= this.metadataTable.sampleCount; i++) {\n sampleItems.push({\n sampleNumber: i,\n selected: false,\n pooled: existingPooledSamples.includes(i)\n });\n }\n \n this.samples.set(sampleItems);\n }\n\n private getExistingPooledSamples(): number[] {\n if (!this.metadataTable.samplePools) return [];\n \n const pooledSamples: number[] = [];\n this.metadataTable.samplePools.forEach((pool: any) => {\n pooledSamples.push(...pool.pooled_only_samples || []);\n pooledSamples.push(...pool.pooled_and_independent_samples || []);\n });\n \n return [...new Set(pooledSamples)]; // Remove duplicates\n }\n\n // Sample selection methods\n toggleSampleSelection(sampleNumber: number): void {\n const samples = this.samples();\n const sampleIndex = samples.findIndex(s => s.sampleNumber === sampleNumber);\n if (sampleIndex >= 0) {\n samples[sampleIndex].selected = !samples[sampleIndex].selected;\n this.samples.set([...samples]);\n this.updateSampleTextInputs();\n }\n }\n\n selectSamplesInRange(): void {\n const start = this.createForm.get('range_start')?.value || 1;\n const end = this.createForm.get('range_end')?.value || 1;\n \n if (start > end) {\n this.toastService.error('Start sample must be less than or equal to end sample');\n return;\n }\n\n const samples = this.samples();\n for (let i = start; i <= end; i++) {\n const sampleIndex = samples.findIndex(s => s.sampleNumber === i);\n if (sampleIndex >= 0) {\n samples[sampleIndex].selected = true;\n }\n }\n \n this.samples.set([...samples]);\n this.updateSampleTextInputs();\n this.toastService.success(`Selected samples ${start} to ${end}`);\n }\n\n clearAllSelections(): void {\n const samples = this.samples();\n samples.forEach(s => s.selected = false);\n this.samples.set([...samples]);\n this.updateSampleTextInputs();\n }\n\n private updateSampleTextInputs(): void {\n const selectedSamples = this.samples().filter(s => s.selected).map(s => s.sampleNumber);\n const pooledOnly = this.pooledOnlySamples();\n const pooledAndIndependent = this.pooledAndIndependentSamples();\n \n // For now, put all selected samples in pooled_only\n this.createForm.patchValue({\n pooled_only_samples_text: selectedSamples.join(', '),\n pooled_and_independent_samples_text: pooledAndIndependent.join(', ')\n });\n }\n\n // Pool type assignment\n assignToPooledOnly(): void {\n const selectedSamples = this.samples().filter(s => s.selected).map(s => s.sampleNumber);\n this.pooledOnlySamples.set(selectedSamples);\n this.updateSampleTextInputs();\n }\n\n assignToPooledAndIndependent(): void {\n const selectedSamples = this.samples().filter(s => s.selected).map(s => s.sampleNumber);\n this.pooledAndIndependentSamples.set(selectedSamples);\n this.updateSampleTextInputs();\n }\n\n onSubmit(): void {\n if (this.createForm.valid) {\n this.isLoading.set(true);\n \n const formValue = this.createForm.value;\n \n // Parse sample arrays from text input or use current assignments\n const pooledOnlySamples = this.parseSampleNumbers(formValue.pooled_only_samples_text);\n const pooledAndIndependentSamples = this.parseSampleNumbers(formValue.pooled_and_independent_samples_text);\n \n if (pooledOnlySamples.length === 0 && pooledAndIndependentSamples.length === 0) {\n this.toastService.error('Please select at least one sample for the pool');\n this.isLoading.set(false);\n return;\n }\n\n const createData: SamplePoolCreateRequest = {\n poolName: formValue.poolName.trim(),\n poolDescription: formValue.poolDescription?.trim() || undefined,\n isReference: formValue.isReference,\n pooledOnlySamples: pooledOnlySamples,\n pooledAndIndependentSamples: pooledAndIndependentSamples,\n metadataTable: this.metadataTable.id\n };\n\n this.samplePoolService.createSamplePool(createData).subscribe({\n next: (createdPool) => {\n this.toastService.success(`Sample pool \"${createdPool.poolName}\" created successfully`);\n this.poolCreated.emit(createdPool);\n this.activeModal.close(createdPool);\n },\n error: (error) => {\n console.error('Error creating sample pool:', error);\n this.toastService.error('Failed to create sample pool');\n this.isLoading.set(false);\n }\n });\n }\n }\n\n onCancel(): void {\n this.activeModal.dismiss();\n }\n\n // Helper methods\n parseSampleNumbers(text: string): number[] {\n if (!text?.trim()) return [];\n \n const numbers: number[] = [];\n const parts = text.split(',').map(s => s.trim()).filter(s => s.length > 0);\n \n parts.forEach(part => {\n if (part.includes('-')) {\n // Handle range like \"5-8\"\n const [start, end] = part.split('-').map(s => parseInt(s.trim(), 10));\n if (!isNaN(start) && !isNaN(end) && start <= end) {\n for (let i = start; i <= end; i++) {\n if (i > 0 && i <= this.metadataTable.sampleCount) {\n numbers.push(i);\n }\n }\n }\n } else {\n // Handle single number\n const num = parseInt(part, 10);\n if (!isNaN(num) && num > 0 && num <= this.metadataTable.sampleCount) {\n numbers.push(num);\n }\n }\n });\n \n return [...new Set(numbers)].sort((a, b) => a - b); // Remove duplicates and sort\n }\n\n // Computed properties for template\n get selectedSamplesCount(): number {\n return this.samples().filter(s => s.selected).length;\n }\n\n get totalPooledSamplesCount(): number {\n const pooledOnly = this.parseSampleNumbers(this.createForm.get('pooled_only_samples_text')?.value || '');\n const pooledAndIndependent = this.parseSampleNumbers(this.createForm.get('pooled_and_independent_samples_text')?.value || '');\n return pooledOnly.length + pooledAndIndependent.length;\n }\n\n get paginatedSamples(): SampleSelectionItem[] {\n const samples = this.samples();\n const start = (this.currentPage() - 1) * this.samplesPerPage;\n return samples.slice(start, start + this.samplesPerPage);\n }\n\n get totalPages(): number {\n return Math.ceil(this.samples().length / this.samplesPerPage);\n }\n\n // Form validation helpers\n isFieldInvalid(fieldName: string): boolean {\n const field = this.createForm.get(fieldName);\n return !!(field && field.invalid && field.touched);\n }\n\n getFieldError(fieldName: string): string {\n const field = this.createForm.get(fieldName);\n if (!field || !field.errors) return '';\n\n if (field.errors['required']) {\n return `${this.getFieldDisplayName(fieldName)} is required`;\n }\n if (field.errors['maxlength']) {\n return `${this.getFieldDisplayName(fieldName)} must be less than ${field.errors['maxlength'].requiredLength} characters`;\n }\n if (field.errors['min']) {\n return `${this.getFieldDisplayName(fieldName)} must be at least ${field.errors['min'].min}`;\n }\n if (field.errors['max']) {\n return `${this.getFieldDisplayName(fieldName)} 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: { [key: string]: string } = {\n 'poolName': 'Pool name',\n 'poolDescription': 'Description',\n 'range_start': 'Range start',\n 'range_end': 'Range end'\n };\n return displayNames[fieldName] || fieldName;\n }\n\n // Pagination\n goToPage(page: number): void {\n if (page >= 1 && page <= this.totalPages) {\n this.currentPage.set(page);\n }\n }\n\n previousPage(): void {\n if (this.currentPage() > 1) {\n this.currentPage.set(this.currentPage() - 1);\n }\n }\n\n nextPage(): void {\n if (this.currentPage() < this.totalPages) {\n this.currentPage.set(this.currentPage() + 1);\n }\n }\n}","<div class=\"modal-header\">\n <h4 class=\"modal-title\">\n <i class=\"bi bi-plus-circle me-2\"></i>Create Sample Pool\n </h4>\n <button type=\"button\" class=\"btn-close\" (click)=\"onCancel()\"></button>\n</div>\n\n<div class=\"modal-body\" style=\"max-height: 70vh; overflow-y: auto;\">\n <form [formGroup]=\"createForm\" (ngSubmit)=\"onSubmit()\">\n \n <!-- Pool Basic Info -->\n <div class=\"row mb-4\">\n <div class=\"col-12\">\n <h6 class=\"text-primary mb-3\">\n <i class=\"bi bi-info-circle me-2\"></i>Pool Information\n </h6>\n </div>\n \n <!-- Pool Name -->\n <div class=\"col-md-6 mb-3\">\n <label for=\"poolName\" class=\"form-label\">Pool Name *</label>\n <input \n type=\"text\" \n class=\"form-control\"\n id=\"poolName\"\n formControlName=\"poolName\"\n [class.is-invalid]=\"isFieldInvalid('poolName')\"\n placeholder=\"Enter pool name\">\n @if (isFieldInvalid('poolName')) {\n <div class=\"invalid-feedback\">\n {{ getFieldError('poolName') }}\n </div>\n }\n </div>\n\n\n <!-- Description -->\n <div class=\"col-12 mb-3\">\n <label for=\"poolDescription\" class=\"form-label\">Description</label>\n <textarea \n class=\"form-control\"\n id=\"poolDescription\"\n formControlName=\"poolDescription\"\n rows=\"2\"\n placeholder=\"Optional pool description\"></textarea>\n </div>\n\n <!-- Reference Pool Checkbox -->\n <div class=\"col-12 mb-3\">\n <div class=\"form-check\">\n <input \n class=\"form-check-input\" \n type=\"checkbox\" \n id=\"isReference\" \n formControlName=\"isReference\">\n <label class=\"form-check-label\" for=\"isReference\">\n <strong>Reference Pool</strong>\n <div class=\"form-text\">Check if this is a reference pool</div>\n </label>\n </div>\n </div>\n </div>\n\n <!-- Sample Selection Methods -->\n <div class=\"mb-4\">\n <h6 class=\"text-primary mb-3\">\n <i class=\"bi bi-check2-square me-2\"></i>Sample Selection\n </h6>\n\n <!-- Selection Mode Tabs -->\n <div class=\"btn-group mb-3\" role=\"group\">\n <input type=\"radio\" class=\"btn-check\" id=\"manualMode\" [value]=\"'manual'\" \n [checked]=\"selectionMode() === 'manual'\" (click)=\"selectionMode.set('manual')\">\n <label class=\"btn btn-outline-primary\" for=\"manualMode\">\n <i class=\"bi bi-hand-index me-1\"></i>Manual Selection\n </label>\n\n <input type=\"radio\" class=\"btn-check\" id=\"rangeMode\" [value]=\"'range'\" \n [checked]=\"selectionMode() === 'range'\" (click)=\"selectionMode.set('range')\">\n <label class=\"btn btn-outline-primary\" for=\"rangeMode\">\n <i class=\"bi bi-sliders me-1\"></i>Range Selection\n </label>\n </div>\n\n <!-- Range Selection Controls -->\n @if (selectionMode() === 'range') {\n <div class=\"card mb-3\">\n <div class=\"card-body\">\n <div class=\"row align-items-end\">\n <div class=\"col-md-4\">\n <label for=\"rangeStart\" class=\"form-label\">Start Sample</label>\n <input \n type=\"number\" \n class=\"form-control\"\n id=\"rangeStart\"\n formControlName=\"range_start\"\n min=\"1\"\n [max]=\"metadataTable.sampleCount\"\n [class.is-invalid]=\"isFieldInvalid('range_start')\">\n @if (isFieldInvalid('range_start')) {\n <div class=\"invalid-feedback\">\n {{ getFieldError('range_start') }}\n </div>\n }\n </div>\n <div class=\"col-md-4\">\n <label for=\"rangeEnd\" class=\"form-label\">End Sample</label>\n <input \n type=\"number\" \n class=\"form-control\"\n id=\"rangeEnd\"\n formControlName=\"range_end\"\n min=\"1\"\n [max]=\"metadataTable.sampleCount\"\n [class.is-invalid]=\"isFieldInvalid('range_end')\">\n @if (isFieldInvalid('range_end')) {\n <div class=\"invalid-feedback\">\n {{ getFieldError('range_end') }}\n </div>\n }\n </div>\n <div class=\"col-md-4\">\n <button type=\"button\" class=\"btn btn-success w-100\" (click)=\"selectSamplesInRange()\">\n <i class=\"bi bi-plus-square me-1\"></i>Select Range\n </button>\n </div>\n </div>\n <div class=\"form-text mt-2\">\n Select samples from {{ createForm.get('range_start')?.value || 1 }} \n to {{ createForm.get('range_end')?.value || 1 }} \n ({{ Math.abs((createForm.get('range_end')?.value || 1) - (createForm.get('range_start')?.value || 1)) + 1 }} samples)\n </div>\n </div>\n </div>\n }\n\n <!-- Sample Grid for Manual Selection -->\n @if (selectionMode() === 'manual') {\n <div class=\"card mb-3\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>\n <i class=\"bi bi-grid me-2\"></i>Select Samples \n <span class=\"badge bg-info ms-2\">{{ selectedSamplesCount }} selected</span>\n </span>\n <button type=\"button\" class=\"btn btn-sm btn-outline-danger\" (click)=\"clearAllSelections()\">\n <i class=\"bi bi-x-circle me-1\"></i>Clear All\n </button>\n </div>\n <div class=\"card-body\" style=\"max-height: 300px; overflow-y: auto;\">\n <!-- Sample Grid -->\n <div class=\"row g-1 mb-3\">\n @for (sample of paginatedSamples; track sample.sampleNumber) {\n <div class=\"col-2\">\n <button \n type=\"button\" \n class=\"btn btn-sm w-100\"\n [class.btn-primary]=\"sample.selected && !sample.pooled\"\n [class.btn-success]=\"sample.selected && sample.pooled\"\n [class.btn-outline-secondary]=\"!sample.selected && !sample.pooled\"\n [class.btn-outline-warning]=\"!sample.selected && sample.pooled\"\n [disabled]=\"sample.pooled\"\n (click)=\"toggleSampleSelection(sample.sampleNumber)\"\n [title]=\"sample.pooled ? 'Sample already in another pool' : 'Click to select/deselect'\">\n {{ sample.sampleNumber }}\n @if (sample.pooled) {\n <i class=\"bi bi-lock-fill ms-1\"></i>\n }\n </button>\n </div>\n }\n </div>\n\n <!-- Pagination -->\n @if (totalPages > 1) {\n <nav>\n <ul class=\"pagination pagination-sm justify-content-center\">\n <li class=\"page-item\" [class.disabled]=\"currentPage() === 1\">\n <button class=\"page-link\" type=\"button\" (click)=\"previousPage()\">Previous</button>\n </li>\n @for (page of [].constructor(Math.min(5, totalPages)); track $index) {\n @let pageNum = $index + Math.max(1, currentPage() - 2);\n @if (pageNum <= totalPages) {\n <li class=\"page-item\" [class.active]=\"pageNum === currentPage()\">\n <button class=\"page-link\" type=\"button\" (click)=\"goToPage(pageNum)\">{{ pageNum }}</button>\n </li>\n }\n }\n <li class=\"page-item\" [class.disabled]=\"currentPage() === totalPages\">\n <button class=\"page-link\" type=\"button\" (click)=\"nextPage()\">Next</button>\n </li>\n </ul>\n </nav>\n }\n\n <div class=\"form-text text-center\">\n Showing {{ ((currentPage() - 1) * samplesPerPage) + 1 }} - \n {{ Math.min(currentPage() * samplesPerPage, samples().length) }} \n of {{ samples().length }} samples\n </div>\n </div>\n </div>\n }\n\n <!-- Selection Summary -->\n @if (selectedSamplesCount > 0) {\n <div class=\"alert alert-info\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <span>\n <i class=\"bi bi-info-circle me-2\"></i>\n <strong>{{ selectedSamplesCount }}</strong> samples selected\n </span>\n <div class=\"btn-group btn-group-sm\">\n <button type=\"button\" class=\"btn btn-outline-primary\" (click)=\"assignToPooledOnly()\">\n <i class=\"bi bi-arrow-right me-1\"></i>Pooled Only\n </button>\n <button type=\"button\" class=\"btn btn-outline-success\" (click)=\"assignToPooledAndIndependent()\">\n <i class=\"bi bi-arrow-right me-1\"></i>Pooled & Independent\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Sample Configuration -->\n <div class=\"mb-4\">\n <h6 class=\"text-primary mb-3\">\n <i class=\"bi bi-gear me-2\"></i>Sample Configuration\n </h6>\n \n <!-- Pooled Only Samples -->\n <div class=\"mb-3\">\n <label for=\"pooledOnlySamples\" class=\"form-label\">\n Pooled Only Samples\n <span class=\"badge bg-primary ms-2\">{{ parseSampleNumbers(createForm.get('pooled_only_samples_text')?.value || '').length }} samples</span>\n </label>\n <input \n type=\"text\" \n class=\"form-control\"\n id=\"pooledOnlySamples\"\n formControlName=\"pooled_only_samples_text\"\n placeholder=\"e.g., 1, 2, 3, 5-8\">\n <div class=\"form-text\">\n Enter sample numbers separated by commas. Ranges like \"5-8\" are supported.\n </div>\n </div>\n\n <!-- Pooled and Independent Samples -->\n <div class=\"mb-3\">\n <label for=\"pooledAndIndependentSamples\" class=\"form-label\">\n Pooled & Independent Samples\n <span class=\"badge bg-success ms-2\">{{ parseSampleNumbers(createForm.get('pooled_and_independent_samples_text')?.value || '').length }} samples</span>\n </label>\n <input \n type=\"text\" \n class=\"form-control\"\n id=\"pooledAndIndependentSamples\"\n formControlName=\"pooled_and_independent_samples_text\"\n placeholder=\"e.g., 4, 9, 10-15\">\n <div class=\"form-text\">\n Enter sample numbers that are both pooled and run independently.\n </div>\n </div>\n\n <!-- Total Count Display -->\n <div class=\"alert\" \n [class.alert-success]=\"totalPooledSamplesCount > 0 && totalPooledSamplesCount <= metadataTable.sampleCount\"\n [class.alert-warning]=\"totalPooledSamplesCount === 0\"\n [class.alert-danger]=\"totalPooledSamplesCount > metadataTable.sampleCount\">\n <i class=\"bi bi-info-circle me-2\"></i>\n <strong>Total Samples:</strong> {{ totalPooledSamplesCount }}\n @if (totalPooledSamplesCount > metadataTable.sampleCount) {\n <span class=\"text-danger ms-2\">\n (Exceeds maximum of {{ metadataTable.sampleCount }})\n </span>\n } @else if (totalPooledSamplesCount === 0) {\n <span class=\"text-warning ms-2\">\n (Please select at least one sample)\n </span>\n }\n </div>\n </div>\n\n <!-- Form Status -->\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\n <small class=\"text-muted\">\n Name: {{ createForm.get('poolName')?.value?.length || 0 }}/255 characters\n </small>\n @if (totalPooledSamplesCount > 0) {\n <small class=\"text-success\">\n <i class=\"bi bi-check-circle me-1\"></i>Ready to create\n </small>\n }\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]=\"createForm.invalid || isLoading() || totalPooledSamplesCount === 0 || totalPooledSamplesCount > metadataTable.sampleCount\">\n @if (isLoading()) {\n <span class=\"spinner-border spinner-border-sm me-2\"></span>\n }\n <i class=\"bi bi-plus-circle me-1\"></i>\n Create Pool\n </button>\n</div>\n","import { Component, OnInit, OnDestroy, signal, computed, ViewChild, ElementRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule, ActivatedRoute, Router } from '@angular/router';\nimport { NgbModule, NgbModal } from '@ng-bootstrap/ng-bootstrap';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs';\nimport {\n MetadataTable,\n MetadataColumn,\n SamplePool,\n MetadataExportRequest,\n ColumnType\n} from '../../models';\nimport {\n MetadataTableService,\n AsyncExportService,\n SamplePoolService,\n ChunkedUploadService,\n MetadataColumnService\n} from '../../services';\nimport { ExcelExportOptions } from '../excel-export-modal/excel-export-modal';\nimport { MetadataValueEditConfig } from '../metadata-value-edit-modal/metadata-value-edit-modal';\nimport { SchemaSelectionResult } from '../schema-selection-modal/schema-selection-modal';\nimport { AsyncTaskUIService } from '../async-task-ui';\nimport {\n MetadataValueEditModal,\n MetadataTableEditModal,\n ExcelExportModalComponent,\n ColumnEditModal,\n SchemaSelectionModal\n} from '../';\nimport { SamplePoolDetailsModal } from '../sample-pool-details-modal/sample-pool-details-modal';\nimport { SamplePoolEditModal } from '../sample-pool-edit-modal/sample-pool-edit-modal';\nimport { SamplePoolCreateModal } from '../sample-pool-create-modal/sample-pool-create-modal';\nimport { ToastService } from '@noatgnu/cupcake-core';\n\n@Component({\n selector: 'ccv-metadata-table-details',\n standalone: true,\n imports: [CommonModule, RouterModule, NgbModule, DragDropModule],\n templateUrl: './metadata-table-details.html',\n styleUrl: './metadata-table-details.scss'\n})\nexport class MetadataTableDetails implements OnInit, OnDestroy {\n private destroy$ = new Subject<void>();\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n @ViewChild('excelInput') excelInput!: ElementRef<HTMLInputElement>;\n\n Math = Math;\n onColumnFilterChange(value: string): void {\n this.columnFilter.set(value);\n }\n\n clearColumnFilter(): void {\n this.columnFilter.set('');\n }\n\n get filteredColumnCount(): number {\n return this.sortedColumns().length;\n }\n\n get totalColumnCount(): number {\n const columns = this.table()?.columns || [];\n return columns.filter(col => col && col.name).length;\n }\n\n sortBy(field: string): void {\n const currentField = this.sortField();\n const currentDirection = this.sortDirection();\n\n if (currentField === field) {\n this.sortDirection.set(currentDirection === 'asc' ? 'desc' : 'asc');\n } else {\n this.sortField.set(field);\n this.sortDirection.set('asc');\n }\n }\n\n getSortIcon(field: string): string {\n const currentField = this.sortField();\n const currentDirection = this.sortDirection();\n\n if (currentField !== field) {\n return 'bi-arrow-down-up';\n }\n\n return currentDirection === 'asc' ? 'bi-sort-alpha-down' : 'bi-sort-alpha-up';\n }\n\n isSorted(field: string): boolean {\n return this.sortField() === field;\n }\n\n isLoading = signal(false);\n table = signal<MetadataTable | null>(null);\n tableId = signal<number | null>(null);\n viewMode = signal<'list' | 'table'>('table');\n currentPage = signal(1);\n pageSize = signal(10);\n columnFilter = signal('');\n\n sortField = signal<string>('');\n sortDirection = signal<'asc' | 'desc'>('asc');\n hasColumns = computed(() => {\n const table = this.table();\n return table?.columns && table.columns.length > 0;\n });\n hasPools = computed(() => {\n const table = this.table();\n return table?.samplePools && table.samplePools.length > 0;\n });\n sortedColumns = computed(() => {\n const columns = this.table()?.columns || [];\n const filter = this.columnFilter().toLowerCase();\n\n return [...columns]\n .filter(col => col && col.name) \n .filter(col => !filter || col.name.toLowerCase().includes(filter))\n .sort((a, b) => (a.columnPosition || 0) - (b.columnPosition || 0));\n });\n \n dragColumnsForList = signal<MetadataColumn[]>([]);\n\n sortedPools = computed(() => {\n const pools = this.table()?.samplePools || [];\n return [...pools].sort((a, b) => a.poolName.localeCompare(b.poolName));\n });\n\n tableRows = computed(() => {\n const table = this.table();\n if (!table || !this.hasColumns()) return [];\n\n const rows: any[] = [];\n for (let i = 0; i < table.sampleCount; i++) {\n const sampleIndex = i + 1;\n const row: any = { _sampleIndex: sampleIndex };\n\n this.sortedColumns().forEach(column => {\n const value = this.getSampleColumnValue(column, sampleIndex);\n row[`col_${column.id}`] = value;\n });\n\n rows.push(row);\n }\n\n return rows;\n });\n\n poolTableRows = computed(() => {\n const table = this.table();\n if (!table || !this.hasPools() || !this.hasColumns()) return [];\n\n const rows: any[] = [];\n this.sortedPools().forEach(pool => {\n const row: any = {\n _poolName: pool.poolName,\n _poolId: pool.id,\n _poolData: pool\n };\n\n this.sortedColumns().forEach(column => {\n let value = '';\n\n const poolColumn = pool.metadataColumns?.find((pc: any) =>\n (pc.id && column.id && pc.id === column.id) || pc.name === column.name\n );\n if (poolColumn) {\n value = poolColumn.value || '';\n }\n\n row[`col_${column.id}`] = value;\n });\n\n rows.push(row);\n });\n\n return rows;\n });\n\n paginatedRows = computed(() => {\n const rows = this.tableRows();\n const page = this.currentPage();\n const size = this.pageSize();\n const start = (page - 1) * size;\n const end = start + size;\n return rows.slice(start, end);\n });\n\n totalPages = computed(() => {\n const rows = this.tableRows();\n const size = this.pageSize();\n return Math.ceil(rows.length / size);\n });\n\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private metadataTableService: MetadataTableService,\n private asyncExportService: AsyncExportService,\n private chunkedUploadService: ChunkedUploadService,\n private samplePoolService: SamplePoolService,\n private metadataColumnService: MetadataColumnService,\n private toastService: ToastService,\n private asyncTaskService: AsyncTaskUIService,\n private modalService: NgbModal\n ) {}\n\n ngOnInit(): void {\n this.route.params.subscribe(params => {\n const id = Number(params['id']);\n const mode = params['mode'] as 'list' | 'table' || 'list';\n\n if (id && !isNaN(id)) {\n this.tableId.set(id);\n this.viewMode.set(mode);\n this.loadTable(id);\n this.setupAsyncTaskRefreshListener(id);\n } else {\n this.toastService.error('Invalid table ID');\n this.navigateBack();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupAsyncTaskRefreshListener(tableId: number): void {\n this.asyncTaskService.metadataTableRefresh$.pipe(\n takeUntil(this.destroy$)\n ).subscribe((refreshedTableId: number) => {\n if (refreshedTableId === tableId) {\n console.log(`Import task completed for table ${refreshedTableId}, refreshing table details`);\n this.toastService.info('Refreshing table data after successful import');\n this.loadTable(tableId);\n }\n });\n }\n\n private loadTable(id: number): void {\n this.isLoading.set(true);\n\n this.metadataTableService.getMetadataTable(id).subscribe({\n next: (table) => {\n this.isLoading.set(false);\n this.table.set(table);\n const naturalOrder = [...(table.columns || [])].sort((a, b) => (a.columnPosition || 0) - (b.columnPosition || 0));\n this.dragColumnsForList.set(naturalOrder);\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error loading metadata table:', error);\n const errorMsg = error?.error?.detail || 'Table not found';\n this.toastService.error(errorMsg);\n if (error.status === 404) {\n this.navigateBack();\n }\n }\n });\n }\n\n navigateBack(): void {\n this.router.navigate(['/metadata-tables']);\n }\n\n switchToListMode(): void {\n const tableId = this.tableId();\n if (tableId) {\n this.router.navigate(['/metadata-tables', tableId, 'list']);\n }\n }\n\n switchToTableMode(): void {\n const tableId = this.tableId();\n if (tableId) {\n this.router.navigate(['/metadata-tables', tableId, 'table']);\n }\n }\n\n onPageChange(page: number): void {\n this.currentPage.set(page);\n }\n\n onPageSizeChange(size: number): void {\n this.pageSize.set(size);\n this.currentPage.set(1); // Reset to first page when changing page size\n }\n\n editTable(): void {\n const table = this.table();\n if (!table || !table.canEdit) return;\n\n const modalRef = this.modalService.open(MetadataTableEditModal, {\n size: 'lg',\n centered: true\n });\n\n modalRef.componentInstance.table = table;\n\n modalRef.componentInstance.tableSaved.subscribe((updatedTable: MetadataTable) => {\n // Update the local table data\n this.table.set(updatedTable);\n this.toastService.success(`Table \"${updatedTable.name}\" updated successfully!`);\n });\n\n modalRef.result.catch(() => {\n // Modal was dismissed - no action needed\n });\n }\n\n triggerFileInput(): void {\n console.log('triggerFileInput called');\n this.fileInput.nativeElement.click();\n }\n\n triggerExcelInput(): void {\n console.log('triggerExcelInput called');\n this.excelInput.nativeElement.click();\n }\n\n importSdrf(event: Event): void {\n console.log('importSdrf called', event);\n const input = event.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) {\n console.log('No files selected');\n return;\n }\n\n const file = input.files[0];\n const table = this.table();\n if (!table) return;\n\n // Validate file type\n if (!file.name.toLowerCase().endsWith('.txt') && !file.name.toLowerCase().endsWith('.tsv')) {\n this.toastService.error('Please select a valid SDRF file (.txt or .tsv)');\n input.value = ''; // Reset input\n return;\n }\n\n if (confirm(`Import SDRF data into table \"${table.name}\"?\\n\\nThis will add new columns and may modify existing data.`)) {\n input.value = ''; // Reset input early\n\n // Use chunked upload service for import with progress tracking\n this.isLoading.set(true);\n\n console.log('Starting SDRF import using chunked upload:', {\n fileName: file.name,\n fileSize: file.size,\n metadataTableId: table.id\n });\n\n // Use chunked upload - it now triggers async import task on completion\n this.chunkedUploadService.uploadFileInChunks(\n file,\n 1024 * 1024, // 1MB chunks\n {\n metadataTableId: table.id,\n createPools: true,\n replaceExisting: false,\n onProgress: (progress) => {\n console.log(`SDRF upload progress: ${Math.round(progress)}%`);\n }\n }\n ).subscribe({\n next: (result) => {\n this.isLoading.set(false);\n console.log('SDRF chunked upload completed:', result);\n \n // If a taskId is returned, monitor the async import task\n if (result?.taskId) {\n console.log('Starting async task monitoring for taskId:', result.taskId);\n this.toastService.success(`SDRF import task queued successfully! Task ID: ${result.taskId}`);\n \n // Mark task for monitoring and start real-time updates (same pattern as export)\n this.asyncTaskService.monitorTask(result.taskId);\n this.asyncTaskService.startRealtimeUpdates();\n } else {\n // Fallback for immediate processing (backward compatibility)\n this.toastService.success('SDRF file imported successfully!');\n this.loadTable(table.id);\n }\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error importing SDRF:', error);\n const errorMsg = error?.error?.detail || error?.error?.message || 'Failed to import SDRF file';\n this.toastService.error(errorMsg);\n }\n });\n } else {\n input.value = ''; // Reset input if cancelled\n }\n }\n\n importExcel(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) return;\n\n const file = input.files[0];\n const table = this.table();\n if (!table) return;\n\n // Validate file type\n if (!file.name.toLowerCase().endsWith('.xlsx') && !file.name.toLowerCase().endsWith('.xls')) {\n this.toastService.error('Please select a valid Excel file (.xlsx or .xls)');\n input.value = ''; // Reset input\n return;\n }\n\n if (confirm(`Import Excel data into table \"${table.name}\"?\\n\\nThis will update existing columns and may modify data.`)) {\n input.value = ''; // Reset input early\n\n // Use chunked upload service for import with progress tracking\n this.isLoading.set(true);\n\n console.log('Starting Excel import using chunked upload:', {\n fileName: file.name,\n fileSize: file.size,\n metadataTableId: table.id\n });\n\n // Use chunked upload - it now triggers async import task on completion\n this.chunkedUploadService.uploadFileInChunks(\n file,\n 1024 * 1024, // 1MB chunks\n {\n metadataTableId: table.id,\n createPools: true,\n replaceExisting: false,\n onProgress: (progress) => {\n console.log(`Excel upload progress: ${Math.round(progress)}%`);\n }\n }\n ).subscribe({\n next: (result) => {\n this.isLoading.set(false);\n console.log('Excel chunked upload completed:', result);\n \n // If a taskId is returned, monitor the async import task\n if (result?.taskId) {\n console.log('Starting async task monitoring for taskId:', result.taskId);\n this.toastService.success(`Excel import task queued successfully! Task ID: ${result.taskId}`);\n \n // Mark task for monitoring and start real-time updates (same pattern as export)\n this.asyncTaskService.monitorTask(result.taskId);\n this.asyncTaskService.startRealtimeUpdates();\n } else {\n // Fallback for immediate processing (backward compatibility)\n this.toastService.success('Excel file imported successfully!');\n this.loadTable(table.id);\n }\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error importing Excel:', error);\n const errorMsg = error?.error?.detail || error?.error?.message || 'Failed to import Excel file';\n this.toastService.error(errorMsg);\n }\n });\n } else {\n input.value = ''; // Reset input if cancelled\n }\n }\n\n exportToSdrf(format: 'sdrf' | 'excel' = 'sdrf'): void {\n const table = this.table();\n if (!table || !table.columns || table.columns.length === 0) {\n this.toastService.error('No columns available for export');\n return;\n }\n\n if (format === 'excel') {\n // Show Excel export options modal\n const modalRef = this.modalService.open(ExcelExportModalComponent, {\n size: 'lg',\n backdrop: 'static'\n });\n\n modalRef.result.then((options: ExcelExportOptions) => {\n this.performExcelExport(table, options);\n }).catch(() => {\n // Modal was dismissed - no action needed\n });\n } else {\n // Direct SDRF export\n this.performSdrfExport(table);\n }\n }\n\n private performExcelExport(table: MetadataTable, options: ExcelExportOptions): void {\n const columnIds = table.columns!.map(col => col.id!);\n\n // Prepare lab group IDs based on options\n let labGroupIds: number[] | undefined = undefined;\n if (options.includeLabGroups === 'selected') {\n labGroupIds = options.selectedLabGroupIds;\n } else if (options.includeLabGroups === 'all') {\n // Pass empty array to signal \"include all lab groups\"\n labGroupIds = [];\n }\n // For 'none', labGroupIds stays undefined\n\n // Use async export only\n this.asyncExportService.excelTemplate({\n metadataTableId: table.id,\n metadataColumnIds: columnIds,\n sampleNumber: table.sampleCount,\n exportFormat: 'excel',\n includePools: options.includePools,\n labGroupIds: labGroupIds\n }).subscribe({\n next: (response) => {\n this.toastService.success(`Excel export queued successfully! Task ID: ${response.taskId}`);\n // Start monitoring tasks if not already started\n this.asyncTaskService.startRealtimeUpdates();\n },\n error: (error) => {\n console.error('Error queuing Excel export:', error);\n const errorMsg = error?.error?.detail || error?.error?.message || 'Failed to queue Excel export';\n this.toastService.error(errorMsg);\n }\n });\n }\n\n private performSdrfExport(table: MetadataTable): void {\n const columnIds = table.columns!.map(col => col.id!);\n\n // Use async export only\n this.asyncExportService.sdrfFile({\n metadataTableId: table.id,\n metadataColumnIds: columnIds,\n sampleNumber: table.sampleCount,\n exportFormat: 'sdrf',\n includePools: true\n }).subscribe({\n next: (response) => {\n this.toastService.success(`SDRF export queued successfully! Task ID: ${response.taskId}`);\n // Start monitoring tasks if not already started\n this.asyncTaskService.startRealtimeUpdates();\n },\n error: (error) => {\n console.error('Error queuing SDRF export:', error);\n const errorMsg = error?.error?.detail || error?.error?.message || 'Failed to queue SDRF export';\n this.toastService.error(errorMsg);\n }\n });\n }\n\n private handleExportRequest(exportRequest: any, format: 'excel' | 'sdrf'): void {\n exportRequest.subscribe({\n next: (response: { taskId: string; message: string }) => {\n this.isLoading.set(false);\n this.toastService.success(`${format.toUpperCase()} export task queued successfully! Task ID: ${response.taskId}`);\n\n // Start monitoring tasks if not already started\n this.asyncTaskService.startRealtimeUpdates();\n },\n error: (error: any) => {\n this.isLoading.set(false);\n console.error('Error exporting table:', error);\n const errorMsg = error?.error?.detail || 'Failed to export table';\n this.toastService.error(errorMsg);\n }\n });\n }\n\n deleteTable(): void {\n const table = this.table();\n if (!table) return;\n\n const confirmMessage = `Are you sure you want to delete the table \"${table.name}\"?\\n\\nThis action cannot be undone.`;\n\n if (confirm(confirmMessage)) {\n this.isLoading.set(true);\n this.metadataTableService.deleteMetadataTable(table.id).subscribe({\n next: () => {\n this.toastService.success(`Table \"${table.name}\" deleted successfully!`);\n this.navigateBack();\n },\n error: (error) => {\n this.isLoading.set(false);\n console.error('Error deleting metadata table:', error);\n const errorMsg = error?.error?.detail || error?.message || 'Failed to delete table. Please try again.';\n this.toastService.error(errorMsg);\n }\n });\n }\n }\n\n getTableStatusBadge(): string {\n const table = this.table();\n if (!table) return '';\n if (table.isPublished) return 'Published';\n if (table.isLocked) return 'Locked';\n return 'Draft';\n }\n\n getTableStatusClass(): string {\n const table = this.table();\n if (!table) return '';\n if (table.isPublished) return 'bg-success';\n if (table.isLocked) return 'bg-warning';\n return 'bg-secondary';\n }\n\n getColumnTypeIcon(column: MetadataColumn): string {\n const type = column.type?.toLowerCase() || '';\n if (type.includes(ColumnType.CHARACTERISTICS)) return 'bi-tags';\n if (type.includes(ColumnType.FACTOR_VALUE.replace('_', ' '))) return 'bi-sliders';\n if (type.includes(ColumnType.COMMENT)) return 'bi-chat-left-text';\n if (type.includes(ColumnType.SOURCE_NAME.replace('_', ' '))) return 'bi-diagram-3';\n if (type === ColumnType.SPECIAL) return 'bi-star';\n return 'bi-circle';\n }\n\n getColumnTypeClass(column: MetadataColumn): string {\n const type = column.type?.toLowerCase() || '';\n if (type.includes(ColumnType.CHARACTERISTICS)) return 'text-primary';\n if (type.includes(ColumnType.FACTOR_VALUE.replace('_', ' '))) return 'text-success';\n if (type.includes(ColumnType.COMMENT)) return 'text-info';\n if (type.includes(ColumnType.SOURCE_NAME.replace('_', ' '))) return 'text-warning';\n if (type === ColumnType.SPECIAL) return 'text-danger';\n return 'text-muted';\n }\n\n getColumnHeaderClass(column: MetadataColumn): string {\n let baseClass = '';\n const type = column.type?.toLowerCase() || '';\n if (type.includes(ColumnType.CHARACTERISTICS)) baseClass = 'bg-primary-subtle text-primary-emphasis';\n else if (type.includes(ColumnType.FACTOR_VALUE.replace('_', ' '))) baseClass = 'bg-success-subtle text-success-emphasis';\n else if (type.includes(ColumnType.COMMENT)) baseClass = 'bg-info-subtle text-info-emphasis';\n else if (type.includes(ColumnType.SOURCE_NAME.replace('_', ' '))) baseClass = 'bg-warning-subtle text-warning-emphasis';\n else if (type === ColumnType.SPECIAL) baseClass = 'bg-danger-subtle text-danger-emphasis';\n else baseClass = 'bg-body-secondary text-body';\n\n // Add hidden column styling\n if (column.hidden) {\n baseClass += ' opacity-50 text-decoration-line-through';\n }\n\n return baseClass;\n }\n\n getShortColumnName(column: MetadataColumn): string {\n let name = column.name;\n\n // Handle different column types\n const type = column.type?.toLowerCase() || '';\n\n if (type.includes(ColumnType.CHARACTERISTICS)) {\n name = name.replace(/^characteristics\\s*\\[/i, '').replace(/\\]$/, '');\n } else if (type.includes(ColumnType.FACTOR_VALUE.replace('_', ' '))) {\n name = name.replace(/^factor\\s*value\\s*\\[/i, '').replace(/\\]$/, '');\n } else if (type.includes(ColumnType.COMMENT)) {\n name = name.replace(/^comment\\s*\\[/i, '').replace(/\\]$/, '');\n } else if (type === ColumnType.SPECIAL) {\n // Special columns have no prefix or brackets - use name as is\n return name;\n }\n\n // Remove any remaining square brackets for other types\n name = name.replace(/[\\[\\]]/g, '');\n\n // Clean up extra spaces\n name = name.trim();\n\n return name || column.name; // Fallback to original name if cleaning results in empty string\n }\n\n hasModifiers(column: MetadataColumn): boolean {\n return !!(column.modifiers && Array.isArray(column.modifiers) && column.modifiers.length > 0);\n }\n\n getColumnValueDisplay(column: MetadataColumn): string {\n const defaultValue = column.value || '';\n if (!this.hasModifiers(column)) {\n return defaultValue || 'No default value';\n }\n return defaultValue ? `Default: ${defaultValue}` : 'Default: (empty)';\n }\n\n getModifiersDisplay(column: MetadataColumn): string[] {\n if (!this.hasModifiers(column)) {\n return [];\n }\n return column.modifiers!.map(modifier =>\n `Samples ${modifier.samples}: \"${modifier.value}\"`\n );\n }\n\n // Sample Pool Methods\n getPoolSampleCount(pool: SamplePool): number {\n return pool.pooledOnlySamples.length + pool.pooledAndIndependentSamples.length;\n }\n\n getPoolSampleDisplay(pool: SamplePool): string {\n const pooledOnly = pool.pooledOnlySamples.length;\n const pooledAndIndependent = pool.pooledAndIndependentSamples.length;\n const total = pooledOnly + pooledAndIndependent;\n\n if (pooledOnly > 0 && pooledAndIndependent > 0) {\n return `${total} samples (${pooledOnly} pool-only, ${pooledAndIndependent} shared)`;\n } else if (pooledOnly > 0) {\n return `${pooledOnly} pool-only samples`;\n } else if (pooledAndIndependent > 0) {\n return `${pooledAndIndependent} shared samples`;\n } else {\n return '0 samples';\n }\n }\n\n getPoolSamples(pool: SamplePool): string {\n const allSamples = [...pool.pooledOnlySamples, ...pool.pooledAndIndependentSamples].sort((a, b) => a - b);\n if (allSamples.length === 0) return 'None';\n\n // Group consecutive numbers into ranges\n const ranges: string[] = [];\n let start = allSamples[0];\n let end = allSamples[0];\n\n for (let i = 1; i < allSamples.length; i++) {\n if (allSamples[i] === end + 1) {\n end = allSamples[i];\n } else {\n ranges.push(start === end ? start.toString() : `${start}-${end}`);\n start = end = allSamples[i];\n }\n }\n ranges.push(start === end ? start.toString() : `${start}-${end}`);\n\n return ranges.join(', ');\n }\n\n getPoolTypeIcon(pool: SamplePool): string {\n return pool.isReference ? 'bi-star-fill' : 'bi-layers';\n }\n\n getPoolTypeClass(pool: SamplePool): string {\n return pool.isReference ? 'text-warning' : 'text-primary';\n }\n\n getPoolTypeLabel(pool: SamplePool): string {\n return pool.isReference ? 'Reference Pool' : 'Sample Pool';\n }\n\n viewPoolDetails(pool: SamplePool): void {\n const modalRef = this.modalService.open(SamplePoolDetailsModal, {\n size: 'lg',\n centered: true\n });\n\n modalRef.componentInstance.pool = pool;\n }\n\n editPool(pool: SamplePool): void {\n const table = this.table();\n if (!table || !table.canEdit) return;\n\n const modalRef = this.modalService.open(SamplePoolEditModal, {\n size: 'lg',\n centered: true\n });\n\n modalRef.componentInstance.pool = pool;\n modalRef.componentInstance.maxSampleCount = table.sampleCount;\n\n modalRef.componentInstance.poolSaved.subscribe((updatedPool: SamplePool) => {\n // Reload the entire table to sync all pool-related changes\n this.loadTable(table.id);\n this.toastService.success(`Pool \"${updatedPool.poolName}\" updated successfully!`);\n });\n }\n\n createPool(): void {\n const table = this.table();\n if (!table || !table.canEdit) return;\n\n const modalRef = this.modalService.open(SamplePoolCreateModal, {\n size: 'xl',\n centered: true,\n backdrop: 'static'\n });\n\n modalRef.componentInstance.metadataTable = table;\n\n modalRef.componentInstance.poolCreated.subscribe((createdPool: SamplePool) => {\n // Reload the entire table to sync all pool-related changes\n this.loadTable(table.id);\n this.toastService.success(`Pool \"${createdPool.poolName}\" created successfully!`);\n });\n\n modalRef.result.catch(() => {\n // Modal was dismissed - no action needed\n });\n }\n\n deletePool(pool: SamplePool): void {\n const table = this.table();\n if (!table || !pool.id) return;\n\n const confirmMessage = `Are you sure you want to delete the pool \"${pool.poolName}\"?\\n\\nThis action cannot be undone.`;\n\n if (confirm(confirmMessage)) {\n this.samplePoolService.deleteSamplePool(pool.id).subscribe({\n next: () => {\n // Reload the entire table to sync all pool-related changes\n this.loadTable(table.id);\n this.toastService.success(`Pool \"${pool.poolName}\" deleted successfully!`);\n },\n error: (error) => {\n console.error('Error deleting pool:', error);\n this.toastService.error(`Failed to delete pool \"${pool.poolName}\"`);\n }\n });\n }\n }\n\n // Metadata value editing methods\n editColumnValue(column: MetadataColumn): void {\n const table = this.table();\n if (!table || !table.canEdit || !column.id) return;\n\n // Prepare sample data for multi-sample editing\n const sampleData = this.tableRows().map(row => ({\n index: row._sampleIndex,\n value: row[`col_${column.id}`] || column.value || '',\n sourceName: row.sourceName || `Sample ${row._sampleIndex}`\n }));\n\n const config: MetadataValueEditConfig = {\n columnId: column.id,\n columnName: column.name,\n columnType: column.type,\n ontologyType: column.ontologyType,\n enableTypeahead: true,\n currentValue: column.value,\n context: 'table',\n tableId: table.id,\n enableMultiSampleEdit: true,\n sampleData: sampleData,\n maxSampleCount: table.sampleCount\n };\n\n const modalRef = this.modalService.open(MetadataValueEditModal, {\n size: 'xl',\n backdrop: 'static'\n });\n\n modalRef.componentInstance.config = config;\n\n // Debug log to check if multi-sample editing is enabled\n console.log('Multi-sample editing config:', {\n enableMultiSampleEdit: config.enableMultiSampleEdit,\n sampleDataLength: config.sampleData?.length,\n hasMultiSampleEdit: config.enableMultiSampleEdit && config.sampleData && config.sampleData.length > 0\n });\n\n modalRef.componentInstance.valueSaved.subscribe((result: string | { value: string; sampleIndices: number[] }) => {\n let apiData: any;\n\n if (typeof result === 'string') {\n // Simple string value - update default\n apiData = {\n value: result,\n value_type: 'default'\n };\n } else {\n // Multi-sample edit - update specific samples\n apiData = {\n value: result.value,\n sample_indices: result.sampleIndices,\n value_type: 'sample_specific'\n };\n }\n\n // Use the API to update the column value\n const requestData = {\n value: typeof result === 'string' ? result : result.value,\n sampleIndices: typeof result === 'string' ? undefined : result.sampleIndices,\n valueType: typeof result === 'string' ? 'default' as const : 'sample_specific' as const\n };\n\n this.metadataColumnService.updateColumnValue(column.id!, requestData).subscribe({\n next: (response) => {\n // Update the local column data with the returned column\n const currentTable = this.table();\n if (currentTable && currentTable.columns && response.column) {\n const updatedColumns = currentTable.columns.map(col =>\n col.id === column.id ? response.column : col\n );\n this.table.set({ ...currentTable, columns: updatedColumns });\n }\n this.toastService.success('Column value updated successfully!');\n modalRef.componentInstance.onClose();\n },\n error: (error) => {\n console.error('Error updating column value:', error);\n this.toastService.error('Failed to update column value');\n }\n });\n });\n }\n\n // Toggle column hidden property\n toggleColumnHidden(column: MetadataColumn): void {\n const table = this.table();\n if (!table || !table.canEdit || !column.id) return;\n\n const newHiddenValue = !column.hidden;\n\n this.metadataColumnService.patchMetadataColumn(column.id, { hidden: newHiddenValue }).subscribe({\n next: (updatedColumn) => {\n // Update the local column data\n const currentTable = this.table();\n if (currentTable && currentTable.columns) {\n const updatedColumns = currentTable.columns.map(col =>\n col.id === column.id ? updatedColumn : col\n );\n this.table.set({ ...currentTable, columns: updatedColumns });\n\n // Reload the table data to sync pool columns\n this.loadTable(table.id);\n }\n this.toastService.success(`Column \"${column.name}\" visibility updated successfully!`);\n },\n error: (error) => {\n console.error('Error updating column hidden property:', error);\n this.toastService.error('Failed to update column visibility');\n }\n });\n }\n\n // View column details\n viewColumnDetails(column: MetadataColumn): void {\n // For now, we'll show an alert with column details\n // This can be enhanced with a proper modal later\n const details = [\n `Name: ${column.name}`,\n `Type: ${column.type}`,\n `Hidden: ${column.hidden ? 'Yes' : 'No'}`,\n `Mandatory: ${column.mandatory ? 'Yes' : 'No'}`,\n `Read Only: ${column.readonly ? 'Yes' : 'No'}`,\n `Default Value: ${column.value || 'None'}`,\n `Ontology Type: ${column.ontologyType || 'None'}`,\n `Enable Typeahead: ${column.enableTypeahead ? 'Yes' : 'No'}`\n ].join('\\n');\n\n alert(`Column Details:\\n\\n${details}`);\n }\n\n // Edit column settings\n editColumnSettings(column: MetadataColumn): void {\n const table = this.table();\n if (!table || !table.canEdit || !column.id) return;\n\n const modalRef = this.modalService.open(ColumnEditModal, {\n size: 'lg',\n backdrop: 'static',\n keyboard: false\n });\n\n // Configure modal for editing existing column\n modalRef.componentInstance.column = column;\n modalRef.componentInstance.templateId = null;\n modalRef.componentInstance.isEdit = true;\n\n // Handle column save\n modalRef.componentInstance.columnSaved.subscribe((columnData: Partial<MetadataColumn>) => {\n this.updateColumnSettings(column.id!, columnData);\n modalRef.componentInstance.onClose();\n });\n }\n\n // Update column settings\n private updateColumnSettings(columnId: number, columnData: Partial<MetadataColumn>): void {\n this.metadataColumnService.patchMetadataColumn(columnId, columnData).subscribe({\n next: (updatedColumn) => {\n // Update the local column data\n const currentTable = this.table();\n if (currentTable && currentTable.columns) {\n const updatedColumns = currentTable.columns.map(col =>\n col.id === columnId ? updatedColumn : col\n );\n this.table.set({ ...currentTable, columns: updatedColumns });\n }\n this.toastService.success(`Column \"${updatedColumn.name}\" updated successfully!`);\n\n // Reload the table to sync any changes\n this.loadTable(currentTable!.id);\n },\n error: (error) => {\n console.error('Error updating column settings:', error);\n this.toastService.error('Failed to update column settings');\n }\n });\n }\n\n // Pool metadata value editing method\n editPoolColumnValue(pool: SamplePool, column: any): void {\n const table = this.table();\n if (!table || !table.canEdit) return;\n\n // Find the pool's metadata column that corresponds to this table column\n const poolColumn = pool.metadataColumns?.find(pc => pc.name === column.name);\n if (!poolColumn || !poolColumn.id) return;\n\n const config: MetadataValueEditConfig = {\n columnId: poolColumn.id,\n columnName: poolColumn.name,\n columnType: poolColumn.type,\n ontologyType: poolColumn.ontologyType,\n enableTypeahead: true,\n currentValue: poolColumn.value,\n context: 'pool',\n tableId: table.id,\n poolId: pool.id\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((newValue: string) => {\n // Update the pool's metadata column value locally\n const currentTable = this.table();\n if (currentTable && currentTable.samplePools) {\n const updatedPools = currentTable.samplePools.map(p => {\n if (p.id === pool.id) {\n const updatedMetadataColumns = p.metadataColumns.map((mc: MetadataColumn) =>\n mc.id === poolColumn.id ? { ...mc, value: newValue } : mc\n );\n return { ...p, metadataColumns: updatedMetadataColumns };\n }\n return p;\n });\n this.table.set({ ...currentTable, samplePools: updatedPools });\n }\n\n this.toastService.success('Pool column value updated successfully!');\n modalRef.componentInstance.onClose();\n });\n }\n\n // Sample-specific metadata value editing method\n editSampleColumnValue(column: MetadataColumn, sampleIndex: number): void {\n const table = this.table();\n if (!table || !table.canEdit || !column.id) return;\n\n // Get current value for this sample (could be default or modified)\n const currentValue = this.getSampleColumnValue(column, sampleIndex);\n\n const config: MetadataValueEditConfig = {\n columnId: column.id,\n columnName: column.name,\n columnType: column.type,\n ontologyType: column.ontologyType,\n enableTypeahead: true,\n currentValue: currentValue,\n context: 'table',\n tableId: table.id\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((newValue: string) => {\n // Use the API to update the sample-specific value\n this.metadataColumnService.updateColumnValue(column.id!, {\n value: newValue,\n sampleIndices: [sampleIndex],\n valueType: 'sample_specific'\n }).subscribe({\n next: (response) => {\n // Update the local column data with the returned column\n const currentTable = this.table();\n if (currentTable && currentTable.columns && response.column) {\n const updatedColumns = currentTable.columns.map(col =>\n col.id === column.id ? response.column : col\n );\n this.table.set({ ...currentTable, columns: updatedColumns });\n }\n this.toastService.success(`Sample ${sampleIndex} value updated successfully!`);\n modalRef.componentInstance.onClose();\n },\n error: (error) => {\n console.error('Error updating sample value:', error);\n this.toastService.error(`Failed to update sample ${sampleIndex} value`);\n }\n });\n });\n }\n\n // Helper method to get current value for a specific sample\n private getSampleColumnValue(column: MetadataColumn, sampleIndex: number): string {\n // Check if this sample has a specific modifier\n if (column.modifiers && column.modifiers.length > 0) {\n for (const modifier of column.modifiers) {\n if (modifier?.samples) {\n const sampleRanges = modifier.samples.split(',').map((s: string) => s.trim()).filter((s: string) => s.length > 0);\n for (const range of sampleRanges) {\n if (range.includes('-')) {\n const parts = range.split('-').map((n: string) => n.trim());\n if (parts.length === 2) {\n const start = parseInt(parts[0]);\n const end = parseInt(parts[1]);\n if (!isNaN(start) && !isNaN(end) && sampleIndex >= start && sampleIndex <= end) {\n return modifier.value || '';\n }\n }\n } else {\n const sampleNum = parseInt(range);\n if (!isNaN(sampleNum) && sampleNum === sampleIndex) {\n return modifier.value || '';\n }\n }\n }\n }\n }\n }\n // Return default value if no modifier found\n return column.value || '';\n }\n\n\n // Remove column method\n removeColumn(column: MetadataColumn): void {\n const table = this.table();\n if (!table || !table.canEdit || !column.id) return;\n\n const confirmMessage = `Are you sure you want to remove the column \"${column.name}\"?\\n\\nThis action cannot be undone and will remove all data in this column.`;\n\n if (confirm(confirmMessage)) {\n this.metadataColumnService.deleteMetadataColumn(column.id).subscribe({\n next: () => {\n // Remove the column from the local table data\n const currentTable = this.table();\n if (currentTable && currentTable.columns) {\n const updatedColumns = currentTable.columns.filter(col => col.id !== column.id);\n this.table.set({ ...currentTable, columns: updatedColumns });\n }\n this.toastService.success(`Column \"${column.name}\" removed successfully!`);\n },\n error: (error) => {\n console.error('Error removing column:', error);\n this.toastService.error(`Failed to remove column \"${column.name}\"`);\n }\n });\n }\n }\n\n /**\n * Open modal to add a new column with automatic reordering\n */\n openAddColumnModal(): void {\n const modalRef = this.modalService.open(ColumnEditModal, {\n size: 'lg',\n backdrop: 'static',\n keyboard: false\n });\n\n // Configure modal for adding new column\n modalRef.componentInstance.column = null;\n modalRef.componentInstance.templateId = null;\n modalRef.componentInstance.isEdit = false;\n\n // Handle column save\n modalRef.componentInstance.columnSaved.subscribe((columnData: Partial<MetadataColumn>) => {\n this.addColumnWithAutoReorder(columnData);\n modalRef.componentInstance.onClose();\n });\n }\n\n /**\n * Add a new column using the new API with automatic reordering\n */\n private addColumnWithAutoReorder(columnData: Partial<MetadataColumn>): void {\n const currentTable = this.table();\n if (!currentTable) {\n this.toastService.error('No table selected');\n return;\n }\n\n this.isLoading.set(true);\n\n this.metadataTableService.addColumnWithAutoReorder(currentTable.id, {\n columnData: columnData\n }).subscribe({\n next: (response: { message: string; column: MetadataColumn; reordered: boolean; schemaIdsUsed: number[] }) => {\n // Update the local table data with the new column\n const updatedColumns = [...(currentTable.columns || []), response.column];\n this.table.set({ ...currentTable, columns: updatedColumns });\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 // Refresh the table to get the latest column positions\n this.loadTable(currentTable.id);\n },\n error: (error: any) => {\n console.error('Error adding column:', error);\n this.toastService.error('Failed to add column');\n },\n complete: () => {\n this.isLoading.set(false);\n }\n });\n }\n\n /**\n * Reorder columns by schema selection\n */\n reorderColumns(): void {\n const currentTable = this.table();\n if (!currentTable) {\n this.toastService.error('No table selected');\n return;\n }\n\n const modalRef = this.modalService.open(SchemaSelectionModal, {\n size: 'lg',\n backdrop: 'static'\n });\n\n modalRef.componentInstance.title = 'Reorder Columns by Schema';\n modalRef.componentInstance.description = `Select schemas to reorder columns in \"${currentTable.name}\". Columns will be arranged based on the selected schema order.`;\n\n modalRef.result.then((result: SchemaSelectionResult) => {\n if (result && result.selectedSchemaIds) {\n this.performColumnReorder(currentTable.id, result.selectedSchemaIds);\n }\n }).catch(() => {\n // Modal was dismissed - no action needed\n });\n }\n\n /**\n * Perform the actual column reordering with async task monitoring\n */\n private performColumnReorder(tableId: number, schemaIds: number[]): void {\n this.isLoading.set(true);\n\n this.metadataTableService.reorderColumnsBySchemaAsync(tableId, schemaIds).subscribe({\n next: (response) => {\n console.log('Column reorder task started:', response);\n this.toastService.success(`Column reorder task queued successfully! Task ID: ${response.taskId}`);\n \n // Mark task for monitoring and start real-time updates (same pattern as imports)\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 column reorder:', error);\n this.toastService.error('Failed to start column reordering');\n this.isLoading.set(false);\n }\n });\n }\n\n onColumnDrop(event: CdkDragDrop<MetadataColumn[]>): void {\n if (event.previousIndex === event.currentIndex) return;\n\n const currentTable = this.table();\n if (!currentTable?.canEdit) return;\n\n const dragColumns = [...this.dragColumnsForList()];\n moveItemInArray(dragColumns, event.previousIndex, event.currentIndex);\n \n // Update columnPosition for all columns in the new order\n dragColumns.forEach((col, index) => {\n col.columnPosition = index;\n });\n \n this.dragColumnsForList.set(dragColumns);\n\n // Update the main table data too\n const updatedTableColumns = [...(currentTable.columns || [])];\n dragColumns.forEach((dragCol, index) => {\n const tableColIndex = updatedTableColumns.findIndex(col => col.id === dragCol.id);\n if (tableColIndex !== -1) {\n updatedTableColumns[tableColIndex] = { ...updatedTableColumns[tableColIndex], columnPosition: index };\n }\n });\n \n this.table.update(table => table ? { ...table, columns: updatedTableColumns } : null);\n\n const draggedColumn = dragColumns[event.currentIndex];\n const newPosition = event.currentIndex;\n \n console.log(`Moving column \"${draggedColumn.name}\" to position ${newPosition}`);\n\n this.metadataTableService.reorderColumn(currentTable.id, draggedColumn.id, newPosition).subscribe({\n next: () => {\n this.toastService.success('Column reordered successfully');\n this.loadTable(currentTable.id);\n },\n error: () => {\n this.toastService.error('Failed to reorder column');\n this.loadTable(currentTable.id);\n }\n });\n }\n}\n","<div class=\"metadata-table-details-container\">\n <!-- Header Section with Breadcrumbs -->\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 <!-- Breadcrumb Navigation -->\n <nav aria-label=\"breadcrumb\" class=\"me-3\">\n <ol class=\"breadcrumb mb-0\">\n <li class=\"breadcrumb-item\">\n <a routerLink=\"/metadata-tables\" class=\"text-decoration-none\">\n <i class=\"bi bi-table me-1\"></i>Metadata Tables\n </a>\n </li>\n <li class=\"breadcrumb-item active\" aria-current=\"page\">\n @if (table()) {\n {{ table()!.name }}\n } @else {\n Table Details\n }\n </li>\n </ol>\n </nav>\n\n <!-- Table Status Badge -->\n @if (table()) {\n <span class=\"badge ms-2\" [class]=\"getTableStatusClass()\">\n {{ getTableStatusBadge() }}\n </span>\n }\n </div>\n\n <!-- Action Buttons -->\n <div class=\"d-flex gap-2\">\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary btn-sm\"\n (click)=\"navigateBack()\"\n title=\"Back to Tables\">\n <i class=\"bi bi-arrow-left me-1\"></i>Back\n </button>\n\n <!-- View Mode Toggle -->\n @if (hasColumns()) {\n <div class=\"btn-group\" role=\"group\">\n <button\n type=\"button\"\n class=\"btn btn-sm\"\n [class]=\"viewMode() === 'list' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"switchToListMode()\"\n title=\"Column List View\">\n <i class=\"bi bi-list-ul me-1\"></i>List\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm\"\n [class]=\"viewMode() === 'table' ? 'btn-primary' : 'btn-outline-primary'\"\n (click)=\"switchToTableMode()\"\n title=\"Table Data View\">\n <i class=\"bi bi-table me-1\"></i>Table\n </button>\n </div>\n }\n <!-- Import Dropdown -->\n @if (table() && table()!.canEdit) {\n <div class=\"btn-group\" ngbDropdown>\n <!-- Hidden file inputs -->\n <input\n #fileInput\n type=\"file\"\n accept=\".txt,.tsv\"\n style=\"display: none;\"\n (change)=\"importSdrf($event)\">\n <input\n #excelInput\n type=\"file\"\n accept=\".xlsx,.xls\"\n style=\"display: none;\"\n (change)=\"importExcel($event)\">\n \n <button\n type=\"button\"\n class=\"btn btn-outline-success btn-sm dropdown-toggle\"\n ngbDropdownToggle\n [disabled]=\"isLoading()\"\n title=\"Import Data\">\n <i class=\"bi bi-upload me-1\"></i>Import\n </button>\n <div class=\"dropdown-menu\" ngbDropdownMenu>\n <a class=\"dropdown-item\" href=\"#\" (click)=\"triggerFileInput(); $event.preventDefault()\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>Import SDRF File\n </a>\n <a class=\"dropdown-item\" href=\"#\" (click)=\"triggerExcelInput(); $event.preventDefault()\">\n <i class=\"bi bi-file-earmark-spreadsheet me-2\"></i>Import Excel Template\n </a>\n </div>\n </div>\n }\n\n <!-- Export Dropdown -->\n @if (table() && hasColumns()) {\n <div class=\"btn-group\" ngbDropdown>\n <button\n type=\"button\"\n class=\"btn btn-outline-info btn-sm dropdown-toggle\"\n ngbDropdownToggle\n [disabled]=\"isLoading()\"\n title=\"Export Table\">\n <i class=\"bi bi-download me-1\"></i>Export\n </button>\n <div class=\"dropdown-menu dropdown-menu-end\" ngbDropdownMenu>\n <a class=\"dropdown-item\" href=\"#\" (click)=\"exportToSdrf('sdrf'); $event.preventDefault()\">\n <i class=\"bi bi-file-earmark-text me-2\"></i>Export as SDRF\n </a>\n <a class=\"dropdown-item\" href=\"#\" (click)=\"exportToSdrf('excel'); $event.preventDefault()\">\n <i class=\"bi bi-file-earmark-spreadsheet me-2\"></i>Export as Excel\n </a>\n </div>\n </div>\n }\n\n <!-- Edit Button -->\n @if (table() && table()!.canEdit) {\n <button\n type=\"button\"\n class=\"btn btn-outline-primary btn-sm\"\n (click)=\"editTable()\"\n [disabled]=\"isLoading()\"\n title=\"Edit Table\">\n <i class=\"bi bi-pencil me-1\"></i>Edit\n </button>\n }\n\n <!-- Reorder Columns Button -->\n @if (table() && table()!.canEdit && hasColumns()) {\n <button\n type=\"button\"\n class=\"btn btn-outline-warning btn-sm\"\n (click)=\"reorderColumns()\"\n [disabled]=\"isLoading()\"\n title=\"Reorder Columns by Schema\">\n <i class=\"bi bi-arrows-move me-1\"></i>Reorder\n </button>\n }\n\n <!-- Create Pool Button -->\n @if (table() && table()!.canEdit && hasColumns()) {\n <button\n type=\"button\"\n class=\"btn btn-success btn-sm\"\n (click)=\"createPool()\"\n [disabled]=\"isLoading()\"\n title=\"Create Sample Pool\">\n <i class=\"bi bi-plus-circle me-1\"></i>Create Pool\n </button>\n }\n\n <!-- More Actions Dropdown -->\n @if (table() && table()!.canEdit) {\n <div class=\"btn-group\" ngbDropdown>\n <button\n type=\"button\"\n class=\"btn btn-outline-danger btn-sm dropdown-toggle\"\n ngbDropdownToggle\n [disabled]=\"isLoading()\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </button>\n <div class=\"dropdown-menu dropdown-menu-end\" ngbDropdownMenu>\n <a class=\"dropdown-item text-danger\" href=\"#\" (click)=\"deleteTable(); $event.preventDefault()\">\n <i class=\"bi bi-trash me-2\"></i>Delete Table\n </a>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </nav>\n\n <!-- Loading Spinner -->\n @if (isLoading()) {\n <div class=\"d-flex justify-content-center align-items-center\" style=\"height: 400px;\">\n <div class=\"spinner-border text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n }\n\n <!-- Table Details Content -->\n @if (table() && !isLoading()) {\n <div class=\"table-details-content p-4\">\n\n <!-- Table Information Card -->\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-info-circle me-2\"></i>Table Information\n </h5>\n <small class=\"text-muted\">\n Created {{ table()!.createdAt | date:'medium' }}\n </small>\n </div>\n </div>\n <div class=\"card-body\">\n <div class=\"row\">\n <div class=\"col-md-8\">\n <h3 class=\"fw-bold mb-3\">{{ table()!.name }}</h3>\n @if (table()!.description) {\n <p class=\"text-muted mb-3\">{{ table()!.description }}</p>\n }\n <div class=\"row\">\n <div class=\"col-md-6\">\n <div class=\"d-flex align-items-center mb-2\">\n <i class=\"bi bi-hash text-muted me-2\"></i>\n <span class=\"fw-semibold me-2\">Sample Count:</span>\n <span class=\"badge bg-primary\">{{ table()!.sampleCount }}</span>\n </div>\n <div class=\"d-flex align-items-center mb-2\">\n <i class=\"bi bi-columns-gap text-muted me-2\"></i>\n <span class=\"fw-semibold me-2\">Columns:</span>\n <span class=\"badge bg-info\">{{ table()!.columns?.length || 0 }}</span>\n </div>\n </div>\n <div class=\"col-md-6\">\n @if (table()!.ownerUsername) {\n <div class=\"d-flex align-items-center mb-2\">\n <i class=\"bi bi-person text-muted me-2\"></i>\n <span class=\"fw-semibold me-2\">Owner:</span>\n <span>{{ table()!.ownerUsername }}</span>\n </div>\n }\n @if (table()!.labGroupName) {\n <div class=\"d-flex align-items-center mb-2\">\n <i class=\"bi bi-people text-muted me-2\"></i>\n <span class=\"fw-semibold me-2\">Lab Group:</span>\n <span>{{ table()!.labGroupName }}</span>\n </div>\n }\n <div class=\"d-flex align-items-center mb-2\">\n <i class=\"bi bi-tag text-muted me-2\"></i>\n <span class=\"fw-semibold me-2\">Version:</span>\n <span class=\"badge bg-light text-dark\">{{ table()!.version || 'v1.0' }}</span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-4 text-end\">\n <div class=\"d-flex flex-column 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 }\n @if (table()!.isPublished) {\n <span class=\"badge bg-success\">\n <i class=\"bi bi-cloud-check me-1\"></i>Published\n </span>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Sample Pool Table -->\n @if (viewMode() === 'table' && hasPools()) {\n <div class=\"card mb-4\">\n <div class=\"card-header\">\n <h5 class=\"mb-0\">\n <i class=\"bi bi-layers me-2\"></i>Sample Pool Table\n <span class=\"badge bg-warning ms-2\">{{ sortedPools().length }} pools</span>\n </h5>\n </div>\n <div class=\"card-body p-0\">\n <div class=\"table-responsive\">\n <table class=\"table table-hover mb-0\">\n <thead class=\"table-light\">\n <tr>\n <th scope=\"col\" style=\"width: 80px;\" class=\"bg-secondary bg-opacity-10 text-secondary\">Pool</th>\n @for (column of sortedColumns(); track column.id) {\n <th scope=\"col\" [class]=\"getColumnHeaderClass(column)\" [title]=\"column.name\">\n <div class=\"header-cell d-flex justify-content-between align-items-center\">\n <span>{{ getShortColumnName(column) }}</span>\n @if (table()!.canEdit) {\n <div class=\"header-actions\">\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-primary header-edit-btn me-1\"\n (click)=\"editColumnValue(column)\"\n [title]=\"'Edit default value for ' + column.name\">\n <i class=\"bi bi-pencil\"></i>\n </button>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (poolRow of poolTableRows(); track poolRow._poolId) {\n <tr class=\"pool-row\" [class.editable]=\"table()!.canEdit\">\n <td class=\"text-muted fw-semibold\" \n [class.clickable]=\"table()!.canEdit\"\n (click)=\"table()!.canEdit ? editPool(poolRow._poolData) : null\"\n [title]=\"table()!.canEdit ? 'Click to edit pool: ' + poolRow._poolName : poolRow._poolName\">\n <i class=\"bi bi-layers me-2\"></i>{{ poolRow._poolName }}\n @if (table()!.canEdit) {\n <i class=\"bi bi-pencil-square ms-1 text-primary\" style=\"font-size: 0.8em;\"></i>\n }\n </td>\n @for (column of sortedColumns(); track column.id) {\n <td\n class=\"pool-cell\"\n [class.opacity-50]=\"column.hidden\"\n [attr.data-pool-id]=\"poolRow._poolId\"\n [attr.data-column-id]=\"column.id\"\n (click)=\"table()!.canEdit ? editPoolColumnValue(poolRow._poolData, column) : null\"\n [title]=\"table()!.canEdit ? 'Click to edit ' + column.name + ' for pool ' + poolRow._poolName : ''\">\n {{ poolRow['col_' + column.id] || '-' }}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n </div>\n }\n\n <!-- Columns/Table Section -->\n <div class=\"card\">\n <div class=\"card-header\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <h5 class=\"mb-0\">\n @if (viewMode() === 'list') {\n <i class=\"bi bi-list-columns me-2\"></i>Table Columns\n } @else {\n <i class=\"bi bi-table me-2\"></i>Table Data\n }\n </h5>\n \n <!-- Column Filter -->\n @if (hasColumns()) {\n <div class=\"d-flex align-items-center me-3\">\n <div class=\"input-group input-group-sm\" style=\"width: 250px;\">\n <span class=\"input-group-text\">\n <i class=\"bi bi-funnel text-muted\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"Filter columns...\"\n [value]=\"columnFilter()\"\n (input)=\"onColumnFilterChange($any($event.target).value)\">\n @if (columnFilter()) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"clearColumnFilter()\"\n title=\"Clear filter\">\n <i class=\"bi bi-x\"></i>\n </button>\n }\n </div>\n @if (columnFilter()) {\n <small class=\"text-muted ms-2\">\n {{ filteredColumnCount }}/{{ totalColumnCount }}\n </small>\n }\n </div>\n }\n \n <div class=\"d-flex gap-2 align-items-center\">\n @if (viewMode() === 'list') {\n <span class=\"badge bg-primary\">{{ sortedColumns().length }} columns</span>\n @if (table() && table()!.canEdit) {\n <button\n type=\"button\"\n class=\"btn btn-success btn-sm\"\n (click)=\"openAddColumnModal()\"\n [disabled]=\"isLoading()\"\n title=\"Add new column with automatic reordering\">\n <i class=\"bi bi-plus-circle me-1\"></i>Add Column\n </button>\n }\n @if (table() && table()!.canEdit && sortedColumns().length === 0) {\n <small class=\"text-muted\">Import SDRF to add columns</small>\n }\n } @else {\n <span class=\"badge bg-info\">{{ tableRows().length }} samples</span>\n @if (hasPools()) {\n <span class=\"badge bg-warning\">{{ sortedPools().length }} pools</span>\n }\n <span class=\"badge bg-primary\">{{ sortedColumns().length }} columns</span>\n @if (table() && table()!.canEdit) {\n <button\n type=\"button\"\n class=\"btn btn-success btn-sm\"\n (click)=\"openAddColumnModal()\"\n [disabled]=\"isLoading()\"\n title=\"Add new column with automatic reordering\">\n <i class=\"bi bi-plus-circle me-1\"></i>Add Column\n </button>\n }\n }\n </div>\n </div>\n </div>\n\n @if (hasColumns()) {\n <!-- List Mode: Column Definitions -->\n @if (viewMode() === 'list') {\n <div class=\"table-responsive\">\n <table class=\"table table-hover mb-0\">\n <thead>\n <tr>\n <th scope=\"col\" style=\"width: 40px;\">\n @if (table()!.canEdit) {\n <i class=\"bi bi-arrows-move text-muted\" title=\"Drag to reorder\"></i>\n }\n </th>\n <th scope=\"col\" style=\"width: 60px;\" \n class=\"sortable\" \n (click)=\"sortBy('position')\"\n [class.sorted]=\"isSorted('position')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span>#</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('position')\"></i>\n </div>\n </th>\n <th scope=\"col\" \n class=\"sortable\" \n (click)=\"sortBy('name')\"\n [class.sorted]=\"isSorted('name')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span>Column Name</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('name')\"></i>\n </div>\n </th>\n <th scope=\"col\" \n class=\"sortable\" \n (click)=\"sortBy('type')\"\n [class.sorted]=\"isSorted('type')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span>Type</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('type')\"></i>\n </div>\n </th>\n <th scope=\"col\" \n class=\"sortable\" \n (click)=\"sortBy('value')\"\n [class.sorted]=\"isSorted('value')\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span>Value</span>\n <i class=\"bi ms-1\" [class]=\"getSortIcon('value')\"></i>\n </div>\n </th>\n <th scope=\"col\">Properties</th>\n <th scope=\"col\" style=\"width: 100px;\">Actions</th>\n </tr>\n </thead>\n <tbody cdkDropList (cdkDropListDropped)=\"onColumnDrop($event)\" [cdkDropListData]=\"dragColumnsForList()\">\n @for (column of dragColumnsForList(); track column.id) {\n <tr cdkDrag [cdkDragData]=\"column\" [cdkDragDisabled]=\"!table()!.canEdit\">\n <td class=\"text-center\">\n @if (table()!.canEdit) {\n <i class=\"bi bi-grip-vertical drag-handle\" cdkDragHandle></i>\n }\n </td>\n <td class=\"text-muted fw-semibold\">\n {{ (column.columnPosition || 0) + 1 }}\n </td>\n <td>\n <div class=\"d-flex align-items-center\">\n <i class=\"me-2\" [class]=\"getColumnTypeIcon(column) + ' ' + getColumnTypeClass(column)\"></i>\n <span class=\"fw-semibold\">{{ column.name }}</span>\n </div>\n </td>\n <td>\n <span class=\"badge bg-light text-dark\">{{ column.type }}</span>\n </td>\n <td>\n <div>\n <!-- Default Value -->\n <div class=\"fw-semibold\">{{ getColumnValueDisplay(column) }}</div>\n\n <!-- Sample-specific Modifiers -->\n @if (hasModifiers(column)) {\n <div class=\"mt-1\">\n @for (modifierDisplay of getModifiersDisplay(column); track $index) {\n <small class=\"badge bg-light text-dark me-1 mb-1 d-inline-block\"\n style=\"font-size: 0.7rem;\"\n [title]=\"modifierDisplay\">\n {{ modifierDisplay }}\n </small>\n }\n </div>\n }\n </div>\n </td>\n <td>\n <div class=\"d-flex gap-1 flex-wrap\">\n @if (column.mandatory) {\n <span class=\"badge bg-danger\" title=\"Required field\">Required</span>\n }\n @if (column.readonly) {\n <span class=\"badge bg-secondary\" title=\"Read-only field\">Read-only</span>\n }\n @if (column.hidden) {\n <span class=\"badge bg-warning\" title=\"Hidden field\">Hidden</span>\n }\n @if (column.autoGenerated) {\n <span class=\"badge bg-info\" title=\"Auto-generated field\">Auto</span>\n }\n @if (column.ontologyType) {\n <span class=\"badge bg-success\" title=\"Ontology: {{ column.ontologyType }}\">\n {{ column.ontologyType }}\n </span>\n }\n </div>\n </td>\n <td>\n <div class=\"btn-group btn-group-sm\">\n <button type=\"button\" class=\"btn btn-outline-primary\"\n (click)=\"viewColumnDetails(column)\"\n title=\"View column details\">\n <i class=\"bi bi-eye\"></i>\n </button>\n @if (table()!.canEdit) {\n <button type=\"button\" \n class=\"btn\"\n [class]=\"column.hidden ? 'btn-outline-warning' : 'btn-outline-success'\"\n (click)=\"toggleColumnHidden(column)\"\n [title]=\"column.hidden ? 'Show column' : 'Hide column'\">\n <i class=\"bi\" [class]=\"column.hidden ? 'bi-eye-slash' : 'bi-eye'\"></i>\n </button>\n <button type=\"button\" class=\"btn btn-outline-success\"\n (click)=\"editColumnValue(column)\"\n title=\"Edit default value\">\n <i class=\"bi bi-pencil-square\"></i>\n </button>\n <button type=\"button\" class=\"btn btn-outline-secondary\"\n (click)=\"editColumnSettings(column)\"\n title=\"Edit column settings\">\n <i class=\"bi bi-gear\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <!-- Table Data -->\n @if (viewMode() === 'table') {\n <div class=\"card-body p-0\">\n <div class=\"table-responsive\">\n <table class=\"table table-hover mb-0\">\n <thead class=\"table-light\">\n <tr>\n <th scope=\"col\" style=\"width: 80px;\" class=\"bg-secondary bg-opacity-10 text-secondary\">#</th>\n @for (column of sortedColumns(); track column.id) {\n <th scope=\"col\" [class]=\"getColumnHeaderClass(column)\" [title]=\"column.name\">\n <div class=\"header-cell d-flex justify-content-between align-items-center\">\n <span>{{ getShortColumnName(column) }}</span>\n @if (table()!.canEdit) {\n <div class=\"header-actions\">\n <button\n type=\"button\"\n class=\"btn btn-sm header-edit-btn me-1\"\n [class]=\"column.hidden ? 'btn-outline-warning' : 'btn-outline-success'\"\n (click)=\"toggleColumnHidden(column)\"\n [title]=\"column.hidden ? 'Show column' : 'Hide column'\">\n <i class=\"bi\" [class]=\"column.hidden ? 'bi-eye-slash' : 'bi-eye'\"></i>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-primary header-edit-btn me-1\"\n (click)=\"editColumnValue(column)\"\n [title]=\"'Edit default value for ' + column.name\">\n <i class=\"bi bi-pencil\"></i>\n </button>\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-danger header-edit-btn\"\n (click)=\"removeColumn(column)\"\n [title]=\"'Remove ' + column.name + ' column'\">\n <i class=\"bi bi-trash\"></i>\n </button>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of paginatedRows(); track row._sampleIndex) {\n <tr class=\"sample-row\" [class.editable]=\"table()!.canEdit\">\n <td class=\"text-muted fw-semibold\">{{ row._sampleIndex }}</td>\n @for (column of sortedColumns(); track column.id) {\n <td\n class=\"sample-cell\"\n [class.opacity-50]=\"column.hidden\"\n [attr.data-sample-index]=\"row._sampleIndex\"\n [attr.data-column-id]=\"column.id\"\n (click)=\"table()!.canEdit ? editSampleColumnValue(column, row._sampleIndex) : null\"\n [title]=\"table()!.canEdit ? 'Click to edit ' + column.name + ' for sample ' + row._sampleIndex : ''\">\n {{ row['col_' + column.id] || '-' }}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Table Mode Pagination -->\n @if (viewMode() === 'table' && totalPages() > 1) {\n <div class=\"d-flex justify-content-between align-items-center p-3 border-top\">\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"text-muted\">Rows per page:</span>\n <select class=\"form-select form-select-sm\" style=\"width: auto;\"\n [value]=\"pageSize()\"\n (change)=\"onPageSizeChange(+($any($event.target).value))\">\n <option value=\"10\">10</option>\n <option value=\"25\">25</option>\n <option value=\"50\">50</option>\n <option value=\"100\">100</option>\n </select>\n </div>\n <ngb-pagination\n [collectionSize]=\"tableRows().length\"\n [page]=\"currentPage()\"\n [pageSize]=\"pageSize()\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"true\"\n [rotate]=\"true\"\n (pageChange)=\"onPageChange($event)\"\n class=\"pagination-sm mb-0\">\n </ngb-pagination>\n <span class=\"text-muted\">\n Showing {{ (currentPage() - 1) * pageSize() + 1 }}-{{ Math.min(currentPage() * pageSize(), tableRows().length) }}\n of {{ tableRows().length }} samples\n </span>\n </div>\n }\n </div>\n }\n } @else {\n <div class=\"card-body text-center py-5\">\n <div class=\"text-muted\">\n <i class=\"bi bi-inbox display-1 mb-3\"></i>\n <h5>No Columns Found</h5>\n <p>This table doesn't have any columns defined yet.</p>\n @if (table()!.canEdit) {\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"openAddColumnModal()\">\n <i class=\"bi bi-plus me-1\"></i>Add First Column\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n </div>\n }\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","i4.OntologySearchService","LibraryAsyncTaskService","filter","i3.MetadataTableService","i4","i3.MetadataColumnTemplateService","i4.SdrfSyntaxService","i3.MetadataTableTemplateService","i5","i2.SchemaService","ReorderSchemaSelectionModal","i2.MetadataTableTemplateService","i5.AsyncTaskUIService","i3","i2.MetadataColumnTemplateService","i2.FavouriteMetadataOptionService","i2","i3.SamplePoolService","takeUntil","i2.MetadataTableService","i2.AsyncExportService","i2.ChunkedUploadService","i2.SamplePoolService","i2.MetadataColumnService","i4.AsyncTaskUIService","i6","i7"],"mappings":"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"}
|