consumerportal
Version:
mydna Custimised for you
67 lines (47 loc) • 2.04 kB
text/typescript
/// <reference path="../includes.ts" />
/*
"Translates "
Usage:
{{ details.ADH1B | alleles : separator : replacement }}
details.ADH1B = '*1*2';
{{ details.ADH1B | alleles : '' : {'*1':'G', '*2': 'A'} }} => GA
{{ details.ADH1B | alleles : '/' } }} => *1/*2
*/
((angular): void => {
interface IAlleles{
allele1:string,
allele2:string
};
class AllelesFilter {
constructor() {
let getAlleles = (value:string): IAlleles=> {
let alleleLength = value.length / 2; // assuming alleles will have same length
return {allele1:value.substr(0, alleleLength), allele2:value.substr(alleleLength, alleleLength)};
};
let applyReplacement = (value:string, replacement:object) :string =>{
let replaceWith = replacement[value];
return angular.isDefined(replaceWith) ? replaceWith: value;
}
return (value: string, separator?: string, replacement?: object): string => {
if (!value || !value.trim()) {
return value;
}
let hasSeparator = separator && separator.trim();
let hasReplacement = !!replacement;
if (!hasSeparator && !hasReplacement) {
return value;
}
let {allele1, allele2} = getAlleles(value);
if(hasReplacement){
allele1 = applyReplacement(allele1, replacement);
allele2 = applyReplacement(allele2, replacement);
}
if(hasSeparator){
return `${allele1}${separator}${allele2}`;
}
return `${allele1}${allele2}`;
}
}
}
angular.module('app').filter('alleles', AllelesFilter);
})(angular);