@@ -13,6 +13,37 @@ function esc(value: unknown): string {
1313 return String ( value ?? '' ) . replace ( / [ & < > " ' ] / g, ( m ) => ESC_MAP [ m ] ) ;
1414}
1515
16+ const SIZE_BP : Record < string , number > = {
17+ 'Standard Backbone' : 2013 , 'Lentiviral backbone' : 7528 ,
18+ 'PiggyBac compatible backbone' : 3187 , 'Sleeping Beauty compatible backbone' : 3174 ,
19+ 'Secondary backbone - Puro' : 3147 , 'Secondary backbone - mClover3' : 3264 ,
20+ 'SaCas9-gRNA' : 390 , 'SpCas9-gRNA' : 390 ,
21+ CbH : 848 , SV40 : 369 , EF1a : 1204 , EFS : 281 ,
22+ DNMT3A : 1001 , TET1 : 2219 , VPR : 1643 , KRAB : 275 ,
23+ p300 : 1958 , HDAC3 : 1334 , LSD1 : 2609 , KDM5A : 2447 ,
24+ RIOX1 : 1973 , PRDM9 : 965 , G9a : 1181 , 'G9a-me3' : 1181 ,
25+ dSpCas9 : 4290 , dSaCas9 : 3276 ,
26+ mRuby3 : 809 , mClover3 : 815 , mCerulean3 : 810 ,
27+ 'Puromycin resistance' : 676 , 'Hygromycin resistance' : 1105 ,
28+ 'Blasticidin resistance' : 472 ,
29+ 'BGH terminator' : 213 , 'SV40 terminator' : 151
30+ } ;
31+
32+ function baseED ( label : string ) : string {
33+ if ( ! label ) return '' ;
34+ if ( label === 'Custom' ) return 'Custom' ;
35+ return label . split ( ' ' ) [ 0 ] ;
36+ }
37+
38+ function sizeOf ( label : unknown ) : number {
39+ const normalized = String ( label ?? '' ) . trim ( ) ;
40+ return SIZE_BP [ normalized ] || SIZE_BP [ baseED ( normalized ) ] || 0 ;
41+ }
42+
43+ function displaySize ( stored : unknown , label : unknown ) : number {
44+ return Number ( stored ) || sizeOf ( label ) ;
45+ }
46+
1647interface PlasmidOrderDoc {
1748 customerEmail : string ;
1849 customerName ?: string ;
@@ -45,6 +76,16 @@ interface PlasmidOrderDoc {
4576
4677function configSummaryHtml ( cfg : NonNullable < PlasmidOrderDoc [ 'configurations' ] > [ number ] , idx : number , lang : 'en' | 'hr' ) : string {
4778 const t = ( en : string , hr : string ) => ( lang === 'hr' ? hr : en ) ;
79+ const gRNAsSizeBp = Number ( cfg . gRNAsSizeBp ) || ( cfg . gRNAs ?? [ ] ) . reduce ( ( sum , g ) => sum + sizeOf ( g . type ) , 0 ) ;
80+ const markersSizeBp = Number ( cfg . markersSizeBp ) || [ ...( cfg . markersFluorescent ?? [ ] ) , ...( cfg . markersAntibiotic ?? [ ] ) ] . reduce ( ( sum , marker ) => sum + sizeOf ( marker ) , 0 ) ;
81+ const totalSizeBp = Number ( cfg . totalSizeBp ) ||
82+ displaySize ( cfg . backboneSizeBp , cfg . backbone ) +
83+ gRNAsSizeBp +
84+ displaySize ( cfg . promoterSizeBp , cfg . promoter ) +
85+ displaySize ( cfg . edSizeBp , cfg . ed ) +
86+ displaySize ( cfg . dcasSizeBp , cfg . dcas ) +
87+ markersSizeBp +
88+ displaySize ( cfg . terminatorSizeBp , cfg . terminator ) ;
4889 const gRNA = ( cfg . gRNAs ?? [ ] )
4990 . map (
5091 ( g ) =>
@@ -58,15 +99,15 @@ function configSummaryHtml(cfg: NonNullable<PlasmidOrderDoc['configurations']>[n
5899 return `
59100 <h3 style="margin:20px 0 8px;font-family:sans-serif;">${ t ( 'Configuration' , 'Konfiguracija' ) } #${ idx + 1 } </h3>
60101 <table cellpadding="6" cellspacing="0" border="0" style="border-collapse:collapse;font-family:sans-serif;font-size:13px;border:1px solid #ddd;">
61- <tr><td><b>${ t ( 'Backbone' , 'Okosnica' ) } </b></td><td>${ esc ( cfg . backbone ) } (${ cfg . backboneSizeBp ?? 0 } bp)</td></tr>
62- <tr><td><b>gRNAs</b></td><td>${ cfg . gRNAs ?. length ?? 0 } (${ cfg . gRNAsSizeBp ?? 0 } bp)<ul>${ gRNA } </ul></td></tr>
63- <tr><td><b>${ t ( 'Promoter' , 'Promotor' ) } </b></td><td>${ esc ( cfg . promoter ) } (${ cfg . promoterSizeBp ?? 0 } bp)</td></tr>
64- <tr><td><b>${ t ( 'Effector domain' , 'Efektorska domena' ) } </b></td><td>${ esc ( cfg . ed ) } (${ cfg . edSizeBp ?? 0 } bp)</td></tr>
65- <tr><td><b>dCas9</b></td><td>${ esc ( cfg . dcas ) } (${ cfg . dcasSizeBp ?? 0 } bp)</td></tr>
102+ <tr><td><b>${ t ( 'Backbone' , 'Okosnica' ) } </b></td><td>${ esc ( cfg . backbone ) } (${ displaySize ( cfg . backboneSizeBp , cfg . backbone ) } bp)</td></tr>
103+ <tr><td><b>gRNAs</b></td><td>${ cfg . gRNAs ?. length ?? 0 } (${ gRNAsSizeBp } bp)<ul>${ gRNA } </ul></td></tr>
104+ <tr><td><b>${ t ( 'Promoter' , 'Promotor' ) } </b></td><td>${ esc ( cfg . promoter ) } (${ displaySize ( cfg . promoterSizeBp , cfg . promoter ) } bp)</td></tr>
105+ <tr><td><b>${ t ( 'Effector domain' , 'Efektorska domena' ) } </b></td><td>${ esc ( cfg . ed ) } (${ displaySize ( cfg . edSizeBp , cfg . ed ) } bp)</td></tr>
106+ <tr><td><b>dCas9</b></td><td>${ esc ( cfg . dcas ) } (${ displaySize ( cfg . dcasSizeBp , cfg . dcas ) } bp)</td></tr>
66107 <tr><td><b>${ t ( 'Markers (fluor)' , 'Markeri (fluor)' ) } </b></td><td>${ fluor } </td></tr>
67- <tr><td><b>${ t ( 'Markers (abx)' , 'Markeri (abx)' ) } </b></td><td>${ abx } </td></tr>
68- <tr><td><b>${ t ( 'Terminator' , 'Terminator' ) } </b></td><td>${ esc ( cfg . terminator ) } (${ cfg . terminatorSizeBp ?? 0 } bp)</td></tr>
69- <tr><td><b>${ t ( 'Total size' , 'Ukupna veličina' ) } </b></td><td>${ cfg . totalSizeBp ?? 0 } bp</td></tr>
108+ <tr><td><b>${ t ( 'Markers (abx)' , 'Markeri (abx)' ) } </b></td><td>${ abx } ( ${ markersSizeBp } bp) </td></tr>
109+ <tr><td><b>${ t ( 'Terminator' , 'Terminator' ) } </b></td><td>${ esc ( cfg . terminator ) } (${ displaySize ( cfg . terminatorSizeBp , cfg . terminator ) } bp)</td></tr>
110+ <tr><td><b>${ t ( 'Total size' , 'Ukupna veličina' ) } </b></td><td>${ totalSizeBp } bp</td></tr>
70111 </table>
71112 ` ;
72113}
0 commit comments