Skip to content

Commit 8be0e37

Browse files
committed
feat: further updates
1 parent 3509ff5 commit 8be0e37

2 files changed

Lines changed: 107 additions & 16 deletions

File tree

cms/src/routes/dashboard/sales/plasmid-orders/[id]/+page.svelte

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,56 @@
1313
let editPriceNotes = '';
1414
let editStatus = '';
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: string): 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: string): number {
44+
return Number(stored) || sizeOf(label);
45+
}
46+
47+
function gRNAsSize(cfg: any): number {
48+
return Number(cfg.gRNAsSizeBp) || (cfg.gRNAs ?? []).reduce((sum: number, g: any) => sum + sizeOf(g.type), 0);
49+
}
50+
51+
function markersSize(cfg: any): number {
52+
return Number(cfg.markersSizeBp) || [...(cfg.markersFluorescent ?? []), ...(cfg.markersAntibiotic ?? [])].reduce((sum: number, marker: string) => sum + sizeOf(marker), 0);
53+
}
54+
55+
function totalSize(cfg: any): number {
56+
return Number(cfg.totalSizeBp) ||
57+
displaySize(cfg.backboneSizeBp, cfg.backbone) +
58+
gRNAsSize(cfg) +
59+
displaySize(cfg.promoterSizeBp, cfg.promoter) +
60+
displaySize(cfg.edSizeBp, cfg.ed) +
61+
displaySize(cfg.dcasSizeBp, cfg.dcas) +
62+
markersSize(cfg) +
63+
displaySize(cfg.terminatorSizeBp, cfg.terminator);
64+
}
65+
1666
$: orderId = $page.params.id;
1767
1868
onMount(() => {
@@ -215,20 +265,20 @@
215265
<h3 class="font-bold mb-3">Configurations ({order.configurations.length})</h3>
216266
{#each order.configurations as cfg, i}
217267
<div class="mb-4 p-3 bg-slate-50 rounded border">
218-
<div class="font-bold mb-2">Configuration #{i + 1} — {cfg.totalSizeBp} bp total</div>
268+
<div class="font-bold mb-2">Configuration #{i + 1} — {totalSize(cfg)} bp total</div>
219269
<table class="text-sm w-full">
220270
<tbody>
221-
<tr><td class="text-gray-400 pr-3 py-1">Backbone</td><td>{cfg.backbone} ({cfg.backboneSizeBp} bp)</td></tr>
222-
<tr><td class="text-gray-400 pr-3 py-1">gRNAs</td><td>{cfg.gRNAs?.length ?? 0} ({cfg.gRNAsSizeBp} bp)</td></tr>
271+
<tr><td class="text-gray-400 pr-3 py-1">Backbone</td><td>{cfg.backbone} ({displaySize(cfg.backboneSizeBp, cfg.backbone)} bp)</td></tr>
272+
<tr><td class="text-gray-400 pr-3 py-1">gRNAs</td><td>{cfg.gRNAs?.length ?? 0} ({gRNAsSize(cfg)} bp)</td></tr>
223273
{#each (cfg.gRNAs ?? []) as g, j}
224274
<tr><td></td><td class="text-gray-500 py-0.5">#{j+1} {g.type}{g.name ? ` — ${g.name}` : ''}{g.sequence ? ` — seq: ${g.sequence}` : ''}{g.target ? ` — target: ${g.target}` : ''}</td></tr>
225275
{/each}
226-
<tr><td class="text-gray-400 pr-3 py-1">Promoter</td><td>{cfg.promoter} ({cfg.promoterSizeBp} bp)</td></tr>
227-
<tr><td class="text-gray-400 pr-3 py-1">Effector</td><td>{cfg.ed} ({cfg.edSizeBp} bp)</td></tr>
228-
<tr><td class="text-gray-400 pr-3 py-1">dCas9</td><td>{cfg.dcas} ({cfg.dcasSizeBp} bp)</td></tr>
276+
<tr><td class="text-gray-400 pr-3 py-1">Promoter</td><td>{cfg.promoter} ({displaySize(cfg.promoterSizeBp, cfg.promoter)} bp)</td></tr>
277+
<tr><td class="text-gray-400 pr-3 py-1">Effector</td><td>{cfg.ed} ({displaySize(cfg.edSizeBp, cfg.ed)} bp)</td></tr>
278+
<tr><td class="text-gray-400 pr-3 py-1">dCas9</td><td>{cfg.dcas} ({displaySize(cfg.dcasSizeBp, cfg.dcas)} bp)</td></tr>
229279
<tr><td class="text-gray-400 pr-3 py-1">Markers (fluor)</td><td>{(cfg.markersFluorescent ?? []).join(', ') || ''}</td></tr>
230-
<tr><td class="text-gray-400 pr-3 py-1">Markers (abx)</td><td>{(cfg.markersAntibiotic ?? []).join(', ') || ''} ({cfg.markersSizeBp} bp)</td></tr>
231-
<tr><td class="text-gray-400 pr-3 py-1">Terminator</td><td>{cfg.terminator} ({cfg.terminatorSizeBp} bp)</td></tr>
280+
<tr><td class="text-gray-400 pr-3 py-1">Markers (abx)</td><td>{(cfg.markersAntibiotic ?? []).join(', ') || ''} ({markersSize(cfg)} bp)</td></tr>
281+
<tr><td class="text-gray-400 pr-3 py-1">Terminator</td><td>{cfg.terminator} ({displaySize(cfg.terminatorSizeBp, cfg.terminator)} bp)</td></tr>
232282
</tbody>
233283
</table>
234284
</div>

functions/src/triggers/plasmid-order-updated.ts

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1647
interface PlasmidOrderDoc {
1748
customerEmail: string;
1849
customerName?: string;
@@ -45,6 +76,16 @@ interface PlasmidOrderDoc {
4576

4677
function 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

Comments
 (0)