@teselagen/ove 0.8.19 → 0.8.21
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/index.cjs.js +327 -45
- package/index.es.js +327 -45
- package/index.umd.js +327 -45
- package/ove.css +46 -0
- package/package.json +3 -3
- package/redux/temporaryAnnotations.d.ts +6 -0
- package/selectors/featuresSelector.d.ts +1 -1
- package/selectors/partsSelector.d.ts +1 -1
- package/selectors/primersSelector.d.ts +1 -1
- package/selectors/temporaryAnnotationsSelector.d.ts +2 -0
- package/src/StatusBar/MeltingTemp.js +16 -5
- package/src/helperComponents/AddOrEditPrimerDialog/index.js +23 -11
- package/src/redux/index.js +3 -1
- package/src/redux/temporaryAnnotations.js +23 -0
- package/src/selectors/featuresSelector.js +8 -3
- package/src/selectors/partsSelector.js +9 -3
- package/src/selectors/primersSelector.js +9 -3
- package/src/selectors/temporaryAnnotationsSelector.js +1 -0
- package/src/updateEditor.js +5 -1
package/index.umd.js
CHANGED
|
@@ -44330,7 +44330,8 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
44330
44330
|
onMultiRowSelect,
|
|
44331
44331
|
noDeselectAll,
|
|
44332
44332
|
onRowSelect,
|
|
44333
|
-
change: change2
|
|
44333
|
+
change: change2,
|
|
44334
|
+
getCheckboxGroupId
|
|
44334
44335
|
}) {
|
|
44335
44336
|
const entity = rowInfo.original;
|
|
44336
44337
|
onRowClick(e2, entity, rowInfo);
|
|
@@ -44402,6 +44403,38 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
44402
44403
|
}
|
|
44403
44404
|
}
|
|
44404
44405
|
}
|
|
44406
|
+
if (getCheckboxGroupId) {
|
|
44407
|
+
const clickedRowId = rowId;
|
|
44408
|
+
const clickedEntity = entity;
|
|
44409
|
+
const clickedGroupId = getCheckboxGroupId(clickedEntity, rowInfo.index);
|
|
44410
|
+
if (!newIdMap[clickedRowId] && clickedGroupId) {
|
|
44411
|
+
entities.forEach((e22, i2) => {
|
|
44412
|
+
if (getCheckboxGroupId(e22, i2) === clickedGroupId) {
|
|
44413
|
+
const id2 = getIdOrCodeOrIndex(e22, i2);
|
|
44414
|
+
delete newIdMap[id2];
|
|
44415
|
+
}
|
|
44416
|
+
});
|
|
44417
|
+
}
|
|
44418
|
+
const selectedGroupIds = /* @__PURE__ */ new Set();
|
|
44419
|
+
entities.forEach((e22, i2) => {
|
|
44420
|
+
const id2 = getIdOrCodeOrIndex(e22, i2);
|
|
44421
|
+
if (newIdMap[id2]) {
|
|
44422
|
+
const gid = getCheckboxGroupId(e22, i2);
|
|
44423
|
+
if (gid) selectedGroupIds.add(gid);
|
|
44424
|
+
}
|
|
44425
|
+
});
|
|
44426
|
+
if (selectedGroupIds.size > 0) {
|
|
44427
|
+
entities.forEach((e22, i2) => {
|
|
44428
|
+
const gid = getCheckboxGroupId(e22, i2);
|
|
44429
|
+
if (gid && selectedGroupIds.has(gid)) {
|
|
44430
|
+
const id2 = getIdOrCodeOrIndex(e22, i2);
|
|
44431
|
+
if (!newIdMap[id2]) {
|
|
44432
|
+
newIdMap[id2] = { entity: e22, time: Date.now() };
|
|
44433
|
+
}
|
|
44434
|
+
}
|
|
44435
|
+
});
|
|
44436
|
+
}
|
|
44437
|
+
}
|
|
44405
44438
|
finalizeSelection({
|
|
44406
44439
|
idMap: newIdMap,
|
|
44407
44440
|
entities,
|
|
@@ -80887,6 +80920,7 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
80887
80920
|
resetDefaultVisibility,
|
|
80888
80921
|
currentParams,
|
|
80889
80922
|
compact,
|
|
80923
|
+
hideExpandSubCompColumn,
|
|
80890
80924
|
editingCell,
|
|
80891
80925
|
editingCellSelectAll,
|
|
80892
80926
|
entities,
|
|
@@ -80934,7 +80968,8 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
80934
80968
|
withSort = true,
|
|
80935
80969
|
recordIdToIsVisibleMap,
|
|
80936
80970
|
setRecordIdToIsVisibleMap,
|
|
80937
|
-
withDisplayOptions
|
|
80971
|
+
withDisplayOptions,
|
|
80972
|
+
getCheckboxGroupId
|
|
80938
80973
|
}) => {
|
|
80939
80974
|
const dispatch = useDispatch();
|
|
80940
80975
|
const change$12 = reactExports.useCallback(
|
|
@@ -81182,6 +81217,14 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
81182
81217
|
return /* @__PURE__ */ React.createElement("div", null);
|
|
81183
81218
|
}
|
|
81184
81219
|
const entity = entities[rowIndex];
|
|
81220
|
+
if (getCheckboxGroupId) {
|
|
81221
|
+
const currentGroupId = getCheckboxGroupId(entity, rowIndex);
|
|
81222
|
+
const previousEntity = entities[rowIndex - 1];
|
|
81223
|
+
const previousGroupId = previousEntity ? getCheckboxGroupId(previousEntity, rowIndex - 1) : void 0;
|
|
81224
|
+
if (currentGroupId && currentGroupId === previousGroupId) {
|
|
81225
|
+
return /* @__PURE__ */ React.createElement("div", null);
|
|
81226
|
+
}
|
|
81227
|
+
}
|
|
81185
81228
|
return /* @__PURE__ */ React.createElement(
|
|
81186
81229
|
Checkbox,
|
|
81187
81230
|
{
|
|
@@ -81200,7 +81243,8 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
81200
81243
|
onMultiRowSelect,
|
|
81201
81244
|
noDeselectAll,
|
|
81202
81245
|
onRowSelect,
|
|
81203
|
-
change: change$12
|
|
81246
|
+
change: change$12,
|
|
81247
|
+
getCheckboxGroupId
|
|
81204
81248
|
});
|
|
81205
81249
|
}, "onClick"),
|
|
81206
81250
|
checked: isSelected
|
|
@@ -81221,7 +81265,8 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
81221
81265
|
onRowSelect,
|
|
81222
81266
|
onSingleRowSelect,
|
|
81223
81267
|
reduxFormSelectedEntityIdMap,
|
|
81224
|
-
withCheckboxes
|
|
81268
|
+
withCheckboxes,
|
|
81269
|
+
getCheckboxGroupId
|
|
81225
81270
|
]
|
|
81226
81271
|
);
|
|
81227
81272
|
const finishCellEdit = reactExports.useCallback(
|
|
@@ -81296,13 +81341,14 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
81296
81341
|
);
|
|
81297
81342
|
}, "Header")
|
|
81298
81343
|
}), {
|
|
81344
|
+
show: !hideExpandSubCompColumn,
|
|
81299
81345
|
expander: true,
|
|
81300
81346
|
Expander: /* @__PURE__ */ __name(({ isExpanded, original: record }) => {
|
|
81301
81347
|
let shouldShow = true;
|
|
81302
81348
|
if (shouldShowSubComponent) {
|
|
81303
81349
|
shouldShow = shouldShowSubComponent(record);
|
|
81304
81350
|
}
|
|
81305
|
-
if (!shouldShow) return null;
|
|
81351
|
+
if (!shouldShow || hideExpandSubCompColumn) return null;
|
|
81306
81352
|
return /* @__PURE__ */ React.createElement(
|
|
81307
81353
|
Button,
|
|
81308
81354
|
{
|
|
@@ -85844,6 +85890,7 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
85844
85890
|
minimalStyle,
|
|
85845
85891
|
mustClickCheckboxToSelect,
|
|
85846
85892
|
noDeselectAll,
|
|
85893
|
+
hideExpandSubCompColumn,
|
|
85847
85894
|
noFooter = isSimple ? !withPaging : false,
|
|
85848
85895
|
noFullscreenButton = isSimple,
|
|
85849
85896
|
noHeader = false,
|
|
@@ -85891,7 +85938,8 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
85891
85938
|
withSort,
|
|
85892
85939
|
withTitle = !isSimple,
|
|
85893
85940
|
noExcessiveCheck,
|
|
85894
|
-
isEntityCountLoading
|
|
85941
|
+
isEntityCountLoading,
|
|
85942
|
+
getCheckboxGroupId
|
|
85895
85943
|
} = props;
|
|
85896
85944
|
const _entities = reactExports.useMemo(
|
|
85897
85945
|
() => ((reduxFormEntities == null ? void 0 : reduxFormEntities.length) ? reduxFormEntities : _origEntities) || [],
|
|
@@ -87428,6 +87476,15 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
87428
87476
|
const isExpanded = expandedEntityIdMap[rowId];
|
|
87429
87477
|
const rowDisabled = isEntityDisabled(entity);
|
|
87430
87478
|
const dataId = entity.id || entity.code;
|
|
87479
|
+
let noGroupBorder = false;
|
|
87480
|
+
if (getCheckboxGroupId) {
|
|
87481
|
+
const currentGroupId = getCheckboxGroupId(entity, rowInfo.index);
|
|
87482
|
+
const nextEntity = entities[rowInfo.index + 1];
|
|
87483
|
+
const nextGroupId = nextEntity ? getCheckboxGroupId(nextEntity, rowInfo.index + 1) : void 0;
|
|
87484
|
+
if (currentGroupId && currentGroupId === nextGroupId) {
|
|
87485
|
+
noGroupBorder = true;
|
|
87486
|
+
}
|
|
87487
|
+
}
|
|
87431
87488
|
return {
|
|
87432
87489
|
onClick: /* @__PURE__ */ __name((e2) => {
|
|
87433
87490
|
if (isCellEditable) return;
|
|
@@ -87454,7 +87511,8 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
87454
87511
|
onMultiRowSelect,
|
|
87455
87512
|
noDeselectAll,
|
|
87456
87513
|
onRowSelect,
|
|
87457
|
-
change: change$12
|
|
87514
|
+
change: change$12,
|
|
87515
|
+
getCheckboxGroupId
|
|
87458
87516
|
});
|
|
87459
87517
|
}, "onClick"),
|
|
87460
87518
|
//row right click
|
|
@@ -87496,9 +87554,11 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
87496
87554
|
{
|
|
87497
87555
|
disabled: rowDisabled,
|
|
87498
87556
|
selected: rowSelected && !withCheckboxes,
|
|
87499
|
-
"rt-tr-last-row": rowInfo.index === entities.length - 1
|
|
87557
|
+
"rt-tr-last-row": rowInfo.index === entities.length - 1,
|
|
87558
|
+
"no-group-border": noGroupBorder
|
|
87500
87559
|
}
|
|
87501
87560
|
),
|
|
87561
|
+
"data-test-selected": !!rowSelected,
|
|
87502
87562
|
"data-test-id": dataId === void 0 ? rowInfo.index : dataId,
|
|
87503
87563
|
"data-index": rowInfo.index,
|
|
87504
87564
|
"data-tip": typeof rowDisabled === "string" ? rowDisabled : void 0,
|
|
@@ -87529,7 +87589,8 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
87529
87589
|
reduxFormSelectedEntityIdMap,
|
|
87530
87590
|
selectedCells,
|
|
87531
87591
|
showContextMenu2,
|
|
87532
|
-
withCheckboxes
|
|
87592
|
+
withCheckboxes,
|
|
87593
|
+
getCheckboxGroupId
|
|
87533
87594
|
]
|
|
87534
87595
|
);
|
|
87535
87596
|
const getTableCellProps = reactExports.useCallback(
|
|
@@ -87842,6 +87903,7 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
87842
87903
|
isSingleSelect,
|
|
87843
87904
|
isSelectionARectangle,
|
|
87844
87905
|
noDeselectAll,
|
|
87906
|
+
hideExpandSubCompColumn,
|
|
87845
87907
|
noSelect,
|
|
87846
87908
|
noUserSelect,
|
|
87847
87909
|
onDeselect,
|
|
@@ -87873,6 +87935,7 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
87873
87935
|
withFilter,
|
|
87874
87936
|
withSort,
|
|
87875
87937
|
recordIdToIsVisibleMap,
|
|
87938
|
+
getCheckboxGroupId,
|
|
87876
87939
|
setRecordIdToIsVisibleMap
|
|
87877
87940
|
});
|
|
87878
87941
|
const scrollToTop = reactExports.useCallback(
|
|
@@ -95997,9 +96060,19 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
95997
96060
|
content: content2,
|
|
95998
96061
|
label,
|
|
95999
96062
|
style: style2,
|
|
96000
|
-
isOpenByDefault
|
|
96063
|
+
isOpenByDefault,
|
|
96064
|
+
localStorageKey
|
|
96001
96065
|
}) {
|
|
96002
|
-
const [isOpen2, setOpen] = reactExports.useState(
|
|
96066
|
+
const [isOpen2, setOpen] = reactExports.useState(() => {
|
|
96067
|
+
if (localStorageKey) {
|
|
96068
|
+
if (window.localStorage.getItem(localStorageKey) === "true") {
|
|
96069
|
+
return true;
|
|
96070
|
+
} else if (window.localStorage.getItem(localStorageKey) === "false") {
|
|
96071
|
+
return false;
|
|
96072
|
+
}
|
|
96073
|
+
}
|
|
96074
|
+
return isOpenByDefault;
|
|
96075
|
+
});
|
|
96003
96076
|
if (!(content2 || children)) {
|
|
96004
96077
|
return null;
|
|
96005
96078
|
}
|
|
@@ -96007,20 +96080,28 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
96007
96080
|
"div",
|
|
96008
96081
|
{
|
|
96009
96082
|
onClick: /* @__PURE__ */ __name(() => {
|
|
96010
|
-
|
|
96083
|
+
const newIsOpen = !isOpen2;
|
|
96084
|
+
setOpen(newIsOpen);
|
|
96085
|
+
if (localStorageKey) {
|
|
96086
|
+
window.localStorage.setItem(localStorageKey, newIsOpen);
|
|
96087
|
+
}
|
|
96011
96088
|
}, "onClick"),
|
|
96012
|
-
style: {
|
|
96013
|
-
|
|
96089
|
+
style: {
|
|
96090
|
+
cursor: "pointer",
|
|
96091
|
+
display: "flex",
|
|
96092
|
+
alignItems: "center",
|
|
96093
|
+
userSelect: "none"
|
|
96094
|
+
},
|
|
96095
|
+
className: `tg-toggle-advanced-options`
|
|
96014
96096
|
},
|
|
96015
|
-
label || "Advanced",
|
|
96016
|
-
" ",
|
|
96017
96097
|
/* @__PURE__ */ React.createElement(
|
|
96018
96098
|
Icon,
|
|
96019
96099
|
{
|
|
96020
96100
|
icon: isOpen2 ? "caret-down" : "caret-right",
|
|
96021
|
-
style: {
|
|
96101
|
+
style: { marginRight: 5 }
|
|
96022
96102
|
}
|
|
96023
|
-
)
|
|
96103
|
+
),
|
|
96104
|
+
/* @__PURE__ */ React.createElement("strong", null, label || "Advanced")
|
|
96024
96105
|
), isOpen2 && /* @__PURE__ */ React.createElement("div", { style: { marginTop: 10 } }, content2 || children));
|
|
96025
96106
|
}
|
|
96026
96107
|
__name(AdvancedOptions, "AdvancedOptions");
|
|
@@ -99308,6 +99389,7 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
99308
99389
|
topLeft: true,
|
|
99309
99390
|
topRight: true
|
|
99310
99391
|
},
|
|
99392
|
+
resizeHandleWrapperClass: "tg-dialog-resize-handle",
|
|
99311
99393
|
maxHeight: windowHeight,
|
|
99312
99394
|
maxWidth: windowWidth,
|
|
99313
99395
|
bounds: "window",
|
|
@@ -113252,6 +113334,160 @@ ${latestSubscriptionCallbackError.current.stack}
|
|
|
113252
113334
|
}
|
|
113253
113335
|
}
|
|
113254
113336
|
__name(calculateNebTm, "calculateNebTm");
|
|
113337
|
+
const PRIMER3_PARAMS = {
|
|
113338
|
+
saltMonovalent: 50,
|
|
113339
|
+
// mM
|
|
113340
|
+
saltDivalent: 1.5,
|
|
113341
|
+
// mM
|
|
113342
|
+
dntpConc: 0.6,
|
|
113343
|
+
// mM
|
|
113344
|
+
dnaConc: 50,
|
|
113345
|
+
// nM
|
|
113346
|
+
R: 1.987
|
|
113347
|
+
// Gas constant (cal/K·mol)
|
|
113348
|
+
};
|
|
113349
|
+
const SANTA_LUCIA_NN = {
|
|
113350
|
+
AA: { dH: -7.9, dS: -22.2 },
|
|
113351
|
+
TT: { dH: -7.9, dS: -22.2 },
|
|
113352
|
+
AT: { dH: -7.2, dS: -20.4 },
|
|
113353
|
+
TA: { dH: -7.2, dS: -21.3 },
|
|
113354
|
+
CA: { dH: -8.5, dS: -22.7 },
|
|
113355
|
+
TG: { dH: -8.5, dS: -22.7 },
|
|
113356
|
+
GT: { dH: -8.4, dS: -22.4 },
|
|
113357
|
+
AC: { dH: -8.4, dS: -22.4 },
|
|
113358
|
+
CT: { dH: -7.8, dS: -21 },
|
|
113359
|
+
AG: { dH: -7.8, dS: -21 },
|
|
113360
|
+
GA: { dH: -8.2, dS: -22.2 },
|
|
113361
|
+
TC: { dH: -8.2, dS: -22.2 },
|
|
113362
|
+
CG: { dH: -10.6, dS: -27.2 },
|
|
113363
|
+
GC: { dH: -9.8, dS: -24.4 },
|
|
113364
|
+
GG: { dH: -8, dS: -19.9 },
|
|
113365
|
+
CC: { dH: -8, dS: -19.9 }
|
|
113366
|
+
};
|
|
113367
|
+
const SANTA_LUCIA_INIT = {
|
|
113368
|
+
GC: { dH: 0.1, dS: -2.8 },
|
|
113369
|
+
// initiation with terminal GC
|
|
113370
|
+
AT: { dH: 2.3, dS: 4.1 }
|
|
113371
|
+
// initiation with terminal AT
|
|
113372
|
+
};
|
|
113373
|
+
function getEffectiveMonovalentConc() {
|
|
113374
|
+
let effectiveMono = PRIMER3_PARAMS.saltMonovalent;
|
|
113375
|
+
{
|
|
113376
|
+
const freeMg = Math.max(
|
|
113377
|
+
0,
|
|
113378
|
+
PRIMER3_PARAMS.saltDivalent - PRIMER3_PARAMS.dntpConc
|
|
113379
|
+
);
|
|
113380
|
+
effectiveMono += 120 * Math.sqrt(freeMg);
|
|
113381
|
+
}
|
|
113382
|
+
return effectiveMono;
|
|
113383
|
+
}
|
|
113384
|
+
__name(getEffectiveMonovalentConc, "getEffectiveMonovalentConc");
|
|
113385
|
+
function applySaltCorrection(deltaS, nnPairs) {
|
|
113386
|
+
const effectiveMono = getEffectiveMonovalentConc();
|
|
113387
|
+
return deltaS + 0.368 * nnPairs * Math.log(effectiveMono / 1e3);
|
|
113388
|
+
}
|
|
113389
|
+
__name(applySaltCorrection, "applySaltCorrection");
|
|
113390
|
+
function isValidSequence(sequence2) {
|
|
113391
|
+
return /^[ATGCN]+$/.test(sequence2);
|
|
113392
|
+
}
|
|
113393
|
+
__name(isValidSequence, "isValidSequence");
|
|
113394
|
+
function calculateSantaLuciaTm(sequence2) {
|
|
113395
|
+
try {
|
|
113396
|
+
sequence2 = sequence2 == null ? void 0 : sequence2.toUpperCase().trim();
|
|
113397
|
+
if (!isValidSequence(sequence2)) {
|
|
113398
|
+
throw new Error("Invalid sequence: contains non-DNA characters");
|
|
113399
|
+
}
|
|
113400
|
+
if (sequence2.length < 2) {
|
|
113401
|
+
throw new Error("Sequence too short: minimum length is 2 bases");
|
|
113402
|
+
}
|
|
113403
|
+
let deltaH = 0;
|
|
113404
|
+
let deltaS = 0;
|
|
113405
|
+
for (let i2 = 0; i2 < sequence2.length - 1; i2++) {
|
|
113406
|
+
const dinucleotide = sequence2.substring(i2, i2 + 2);
|
|
113407
|
+
if (dinucleotide.includes("N")) {
|
|
113408
|
+
continue;
|
|
113409
|
+
}
|
|
113410
|
+
const params = SANTA_LUCIA_NN[dinucleotide];
|
|
113411
|
+
if (params) {
|
|
113412
|
+
deltaH += params.dH;
|
|
113413
|
+
deltaS += params.dS;
|
|
113414
|
+
}
|
|
113415
|
+
}
|
|
113416
|
+
const firstBase = sequence2[0];
|
|
113417
|
+
const lastBase = sequence2[sequence2.length - 1];
|
|
113418
|
+
if (firstBase === "G" || firstBase === "C") {
|
|
113419
|
+
deltaH += SANTA_LUCIA_INIT.GC.dH;
|
|
113420
|
+
deltaS += SANTA_LUCIA_INIT.GC.dS;
|
|
113421
|
+
} else {
|
|
113422
|
+
deltaH += SANTA_LUCIA_INIT.AT.dH;
|
|
113423
|
+
deltaS += SANTA_LUCIA_INIT.AT.dS;
|
|
113424
|
+
}
|
|
113425
|
+
if (lastBase === "G" || lastBase === "C") {
|
|
113426
|
+
deltaH += SANTA_LUCIA_INIT.GC.dH;
|
|
113427
|
+
deltaS += SANTA_LUCIA_INIT.GC.dS;
|
|
113428
|
+
} else {
|
|
113429
|
+
deltaH += SANTA_LUCIA_INIT.AT.dH;
|
|
113430
|
+
deltaS += SANTA_LUCIA_INIT.AT.dS;
|
|
113431
|
+
}
|
|
113432
|
+
const nnPairs = sequence2.length - 1;
|
|
113433
|
+
deltaS = applySaltCorrection(deltaS, nnPairs);
|
|
113434
|
+
const C = PRIMER3_PARAMS.dnaConc * 1e-9;
|
|
113435
|
+
const Tm = deltaH * 1e3 / (deltaS + PRIMER3_PARAMS.R * Math.log(C / 4));
|
|
113436
|
+
return Tm - 273.15;
|
|
113437
|
+
} catch (e2) {
|
|
113438
|
+
return `Error calculating Tm for sequence ${sequence2}. ${e2}`;
|
|
113439
|
+
}
|
|
113440
|
+
}
|
|
113441
|
+
__name(calculateSantaLuciaTm, "calculateSantaLuciaTm");
|
|
113442
|
+
function calculateEndStability(sequence2) {
|
|
113443
|
+
try {
|
|
113444
|
+
sequence2 = sequence2 == null ? void 0 : sequence2.toUpperCase().trim();
|
|
113445
|
+
if (!isValidSequence(sequence2)) {
|
|
113446
|
+
throw new Error("Invalid sequence: contains non-DNA characters");
|
|
113447
|
+
}
|
|
113448
|
+
if (sequence2.length < 5) {
|
|
113449
|
+
throw new Error(
|
|
113450
|
+
"Sequence too short: minimum length is 5 bases for end stability calculation"
|
|
113451
|
+
);
|
|
113452
|
+
}
|
|
113453
|
+
const last5Bases = sequence2.substring(sequence2.length - 5);
|
|
113454
|
+
let deltaH = 0;
|
|
113455
|
+
let deltaS = 0;
|
|
113456
|
+
for (let i2 = 0; i2 < 4; i2++) {
|
|
113457
|
+
const dinucleotide = last5Bases.substring(i2, i2 + 2);
|
|
113458
|
+
if (dinucleotide.includes("N")) {
|
|
113459
|
+
continue;
|
|
113460
|
+
}
|
|
113461
|
+
const params = SANTA_LUCIA_NN[dinucleotide];
|
|
113462
|
+
if (params) {
|
|
113463
|
+
deltaH += params.dH;
|
|
113464
|
+
deltaS += params.dS;
|
|
113465
|
+
}
|
|
113466
|
+
}
|
|
113467
|
+
const firstBase = last5Bases[0];
|
|
113468
|
+
const lastBase = last5Bases[last5Bases.length - 1];
|
|
113469
|
+
if (firstBase === "G" || firstBase === "C") {
|
|
113470
|
+
deltaH += SANTA_LUCIA_INIT.GC.dH;
|
|
113471
|
+
deltaS += SANTA_LUCIA_INIT.GC.dS;
|
|
113472
|
+
} else {
|
|
113473
|
+
deltaH += SANTA_LUCIA_INIT.AT.dH;
|
|
113474
|
+
deltaS += SANTA_LUCIA_INIT.AT.dS;
|
|
113475
|
+
}
|
|
113476
|
+
if (lastBase === "G" || lastBase === "C") {
|
|
113477
|
+
deltaH += SANTA_LUCIA_INIT.GC.dH;
|
|
113478
|
+
deltaS += SANTA_LUCIA_INIT.GC.dS;
|
|
113479
|
+
} else {
|
|
113480
|
+
deltaH += SANTA_LUCIA_INIT.AT.dH;
|
|
113481
|
+
deltaS += SANTA_LUCIA_INIT.AT.dS;
|
|
113482
|
+
}
|
|
113483
|
+
const T2 = 310.15;
|
|
113484
|
+
const deltaG = deltaH - T2 * deltaS / 1e3;
|
|
113485
|
+
return Math.round(Math.abs(deltaG) * 100) / 100;
|
|
113486
|
+
} catch (e2) {
|
|
113487
|
+
return `Error calculating end stability for sequence ${sequence2}. ${e2}`;
|
|
113488
|
+
}
|
|
113489
|
+
}
|
|
113490
|
+
__name(calculateEndStability, "calculateEndStability");
|
|
113255
113491
|
function convertAACaretPositionOrRangeToDna(rangeOrCaret) {
|
|
113256
113492
|
if (typeof rangeOrCaret === "object" && rangeOrCaret !== null) {
|
|
113257
113493
|
return convertAARangeToDnaRange(__spreadProps(__spreadValues({}, rangeOrCaret), {
|
|
@@ -125186,6 +125422,30 @@ ${seq.sequence}
|
|
|
125186
125422
|
default: selectedPartTags,
|
|
125187
125423
|
updateSelectedPartTags
|
|
125188
125424
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
125425
|
+
const updateTemporaryAnnotations = createMetaAction(
|
|
125426
|
+
"TEMPORARY_ANNOTATIONS_UPDATE"
|
|
125427
|
+
);
|
|
125428
|
+
const temporaryAnnotations = createMergedDefaultStateReducer(
|
|
125429
|
+
{
|
|
125430
|
+
TEMPORARY_ANNOTATIONS_UPDATE: /* @__PURE__ */ __name((state2, payload) => {
|
|
125431
|
+
return __spreadValues(__spreadValues({}, state2), payload);
|
|
125432
|
+
}, "TEMPORARY_ANNOTATIONS_UPDATE"),
|
|
125433
|
+
VECTOR_EDITOR_UPDATE: /* @__PURE__ */ __name((state2, payload) => {
|
|
125434
|
+
return __spreadValues(__spreadValues({}, state2), payload.temporaryAnnotations);
|
|
125435
|
+
}, "VECTOR_EDITOR_UPDATE")
|
|
125436
|
+
},
|
|
125437
|
+
{
|
|
125438
|
+
features: {},
|
|
125439
|
+
primers: {},
|
|
125440
|
+
parts: {},
|
|
125441
|
+
selectionLayer: {}
|
|
125442
|
+
}
|
|
125443
|
+
);
|
|
125444
|
+
const temporaryAnnotations$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
125445
|
+
__proto__: null,
|
|
125446
|
+
default: temporaryAnnotations,
|
|
125447
|
+
updateTemporaryAnnotations
|
|
125448
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
125189
125449
|
const vectorEditorMiddleware = /* @__PURE__ */ __name((store2) => (next) => (action2) => {
|
|
125190
125450
|
if (action2.meta && action2.meta.disregardUndo) {
|
|
125191
125451
|
return next(action2);
|
|
@@ -125301,7 +125561,8 @@ ${seq.sequence}
|
|
|
125301
125561
|
partLengthsToHide: partLengthsToHide$1,
|
|
125302
125562
|
primerLengthsToHide: primerLengthsToHide$1,
|
|
125303
125563
|
featureLengthsToHide: featureLengthsToHide$1,
|
|
125304
|
-
selectedPartTags: selectedPartTags$1
|
|
125564
|
+
selectedPartTags: selectedPartTags$1,
|
|
125565
|
+
temporaryAnnotations: temporaryAnnotations$1
|
|
125305
125566
|
};
|
|
125306
125567
|
const vectorEditorInitialize = createMetaAction("VECTOR_EDITOR_UPDATE");
|
|
125307
125568
|
const vectorEditorClear = createMetaAction("VECTOR_EDITOR_CLEAR");
|
|
@@ -126066,11 +126327,16 @@ ${seq.sequence}
|
|
|
126066
126327
|
return searchLayers;
|
|
126067
126328
|
}
|
|
126068
126329
|
);
|
|
126069
|
-
|
|
126070
|
-
|
|
126330
|
+
const temporaryAnnotationsSelector = /* @__PURE__ */ __name((editor) => editor.temporaryAnnotations, "temporaryAnnotationsSelector");
|
|
126331
|
+
function featuresRawSelector(sequenceData2, temporaryAnnotations2) {
|
|
126332
|
+
return __spreadValues(__spreadValues({}, sequenceData2.features), temporaryAnnotations2 == null ? void 0 : temporaryAnnotations2.features);
|
|
126071
126333
|
}
|
|
126072
126334
|
__name(featuresRawSelector, "featuresRawSelector");
|
|
126073
|
-
const featuresSelector = createSelector(
|
|
126335
|
+
const featuresSelector = createSelector(
|
|
126336
|
+
sequenceDataSelector,
|
|
126337
|
+
temporaryAnnotationsSelector,
|
|
126338
|
+
featuresRawSelector
|
|
126339
|
+
);
|
|
126074
126340
|
function cdsFeaturesRawSelector(features2) {
|
|
126075
126341
|
return filter(features2, ({ type: type2 }) => type2 && type2.toUpperCase() === "CDS");
|
|
126076
126342
|
}
|
|
@@ -126350,11 +126616,15 @@ ${seq.sequence}
|
|
|
126350
126616
|
(state2) => state2.featureLengthsToHide,
|
|
126351
126617
|
filteredFeaturesSelector
|
|
126352
126618
|
);
|
|
126353
|
-
function primersRawSelector(sequenceData2) {
|
|
126354
|
-
return sequenceData2.primers;
|
|
126619
|
+
function primersRawSelector(sequenceData2, temporaryAnnotations2) {
|
|
126620
|
+
return __spreadValues(__spreadValues({}, sequenceData2.primers), temporaryAnnotations2 == null ? void 0 : temporaryAnnotations2.primers);
|
|
126355
126621
|
}
|
|
126356
126622
|
__name(primersRawSelector, "primersRawSelector");
|
|
126357
|
-
const primersSelector = createSelector(
|
|
126623
|
+
const primersSelector = createSelector(
|
|
126624
|
+
sequenceDataSelector,
|
|
126625
|
+
temporaryAnnotationsSelector,
|
|
126626
|
+
primersRawSelector
|
|
126627
|
+
);
|
|
126358
126628
|
function filteredPrimersSelector(primers2, seqLen, primerIndividualToHide, lengthsToHide) {
|
|
126359
126629
|
return omitBy(primers2, (ann) => {
|
|
126360
126630
|
const hideIndividually = primerIndividualToHide[ann.id];
|
|
@@ -126369,11 +126639,15 @@ ${seq.sequence}
|
|
|
126369
126639
|
(state2) => state2.primerLengthsToHide,
|
|
126370
126640
|
filteredPrimersSelector
|
|
126371
126641
|
);
|
|
126372
|
-
function partsRawSelector(sequenceData2) {
|
|
126373
|
-
return sequenceData2.parts;
|
|
126642
|
+
function partsRawSelector(sequenceData2, temporaryAnnotations2) {
|
|
126643
|
+
return __spreadValues(__spreadValues({}, sequenceData2.parts), temporaryAnnotations2 == null ? void 0 : temporaryAnnotations2.parts);
|
|
126374
126644
|
}
|
|
126375
126645
|
__name(partsRawSelector, "partsRawSelector");
|
|
126376
|
-
const partsSelector = createSelector(
|
|
126646
|
+
const partsSelector = createSelector(
|
|
126647
|
+
sequenceDataSelector,
|
|
126648
|
+
temporaryAnnotationsSelector,
|
|
126649
|
+
partsRawSelector
|
|
126650
|
+
);
|
|
126377
126651
|
const tagsToBoldSelector = /* @__PURE__ */ __name((state2) => state2.selectedPartTags.parts, "tagsToBoldSelector");
|
|
126378
126652
|
function addWrappedAddons(anns, seqLen) {
|
|
126379
126653
|
return flatMap(anns, (ann) => {
|
|
@@ -127200,7 +127474,8 @@ ${seq.sequence}
|
|
|
127200
127474
|
annotationVisibility: annotationVisibility2,
|
|
127201
127475
|
annotationsToSupport: annotationsToSupport2,
|
|
127202
127476
|
findTool: findTool2,
|
|
127203
|
-
justPassingPartialSeqData
|
|
127477
|
+
justPassingPartialSeqData,
|
|
127478
|
+
temporaryAnnotations: temporaryAnnotations2
|
|
127204
127479
|
} = initialValues2;
|
|
127205
127480
|
const currentEditor = store2.getState().VectorEditor[editorName] || {};
|
|
127206
127481
|
const isAlreadyProteinEditor = currentEditor.sequenceData && currentEditor.sequenceData.isProtein;
|
|
@@ -127322,12 +127597,14 @@ ${seq.sequence}
|
|
|
127322
127597
|
};
|
|
127323
127598
|
}
|
|
127324
127599
|
}
|
|
127325
|
-
payload = __spreadValues(__spreadValues(__spreadValues({}, initialValues2), toSpread), sequenceData2 && {
|
|
127600
|
+
payload = __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, initialValues2), toSpread), sequenceData2 && {
|
|
127326
127601
|
sequenceData: tidyUpSequenceData(sequenceData2, {
|
|
127327
127602
|
convertAnnotationsFromAAIndices,
|
|
127328
127603
|
//if we have sequence data coming in make sure to tidy it up for the user :)
|
|
127329
127604
|
annotationsAsObjects: true
|
|
127330
127605
|
})
|
|
127606
|
+
}), temporaryAnnotations2 && {
|
|
127607
|
+
temporaryAnnotations: temporaryAnnotations2
|
|
127331
127608
|
});
|
|
127332
127609
|
}
|
|
127333
127610
|
annotationTypes.forEach((t2) => {
|
|
@@ -144752,7 +145029,7 @@ Part of ${annotation.translationType} Translation from BPs ${annotation.start +
|
|
|
144752
145029
|
input.click();
|
|
144753
145030
|
}
|
|
144754
145031
|
__name(showFileDialog, "showFileDialog");
|
|
144755
|
-
const version = "0.8.
|
|
145032
|
+
const version = "0.8.20";
|
|
144756
145033
|
const packageJson = {
|
|
144757
145034
|
version
|
|
144758
145035
|
};
|
|
@@ -163850,7 +164127,7 @@ Part of ${annotation.translationType} Translation from BPs ${annotation.start +
|
|
|
163850
164127
|
/* , setMonovalentCationConc */
|
|
163851
164128
|
] = React.useState(0.05);
|
|
163852
164129
|
const [tmType, setTmType] = useTmType();
|
|
163853
|
-
let tm = (tmType === "neb_tm" ? calculateNebTm : calculateTm)(sequence2, {
|
|
164130
|
+
let tm = (tmType === "neb_tm" ? calculateNebTm : tmType === "default" ? calculateSantaLuciaTm : calculateTm)(sequence2, {
|
|
163854
164131
|
monovalentCationConc,
|
|
163855
164132
|
primerConc
|
|
163856
164133
|
});
|
|
@@ -163875,8 +164152,9 @@ Part of ${annotation.translationType} Translation from BPs ${annotation.start +
|
|
|
163875
164152
|
{
|
|
163876
164153
|
label: "Choose Tm Type:",
|
|
163877
164154
|
options: [
|
|
163878
|
-
{ value: "default", label: "
|
|
163879
|
-
{ value: "
|
|
164155
|
+
{ value: "default", label: "Santa Lucia (Default)" },
|
|
164156
|
+
{ value: "breslauer", label: "Breslauer" },
|
|
164157
|
+
{ value: "neb_tm", label: "NEB Tm" }
|
|
163880
164158
|
],
|
|
163881
164159
|
onChange: /* @__PURE__ */ __name((e2) => setTmType(e2.target.value), "onChange"),
|
|
163882
164160
|
selectedValue: tmType
|
|
@@ -163890,7 +164168,7 @@ Part of ${annotation.translationType} Translation from BPs ${annotation.start +
|
|
|
163890
164168
|
}
|
|
163891
164169
|
), hasWarning, /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement("br", null), "Try using the Default Tm"))
|
|
163892
164170
|
},
|
|
163893
|
-
/* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(InnerWrapper, null, "Melting Temp: ", Number(tm) || 0, "
|
|
164171
|
+
/* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(InnerWrapper, null, "Melting Temp: ", Number(tm) || 0, "°C"), hasWarning && /* @__PURE__ */ React.createElement(
|
|
163894
164172
|
Icon,
|
|
163895
164173
|
{
|
|
163896
164174
|
style: { marginLeft: 5, marginRight: 5 },
|
|
@@ -164154,12 +164432,24 @@ Part of ${annotation.translationType} Translation from BPs ${annotation.start +
|
|
|
164154
164432
|
)), /* @__PURE__ */ React.createElement(
|
|
164155
164433
|
MeltingTemp,
|
|
164156
164434
|
{
|
|
164157
|
-
InnerWrapper:
|
|
164435
|
+
InnerWrapper: TextInnerWrapper,
|
|
164158
164436
|
sequence: bases
|
|
164159
164437
|
}
|
|
164160
|
-
))
|
|
164438
|
+
), /* @__PURE__ */ React.createElement(TextInnerWrapper, null, "GC content: ", bases && calculatePercentGC(bases).toFixed(1), "%"), /* @__PURE__ */ React.createElement(TextInnerWrapper, null, "3' Stability: ", bases && calculateEndStability(bases), " kcal/mol"))
|
|
164161
164439
|
);
|
|
164162
164440
|
}, "RenderBases");
|
|
164441
|
+
const TextInnerWrapper = /* @__PURE__ */ __name((p2) => /* @__PURE__ */ React.createElement(
|
|
164442
|
+
"div",
|
|
164443
|
+
{
|
|
164444
|
+
className: "bp3-text-muted bp3-text-small",
|
|
164445
|
+
style: {
|
|
164446
|
+
marginBottom: 15,
|
|
164447
|
+
marginTop: -5,
|
|
164448
|
+
fontStyle: "italic"
|
|
164449
|
+
}
|
|
164450
|
+
},
|
|
164451
|
+
p2.children
|
|
164452
|
+
), "TextInnerWrapper");
|
|
164163
164453
|
const AddOrEditPrimerDialog = AddOrEditAnnotationDialog$1({
|
|
164164
164454
|
formName: "AddOrEditPrimerDialog",
|
|
164165
164455
|
getProps: /* @__PURE__ */ __name((props) => ({
|
|
@@ -164168,14 +164458,6 @@ Part of ${annotation.translationType} Translation from BPs ${annotation.start +
|
|
|
164168
164458
|
RenderBases
|
|
164169
164459
|
}), "getProps")
|
|
164170
164460
|
});
|
|
164171
|
-
const InnerWrapperMeltingTemp = /* @__PURE__ */ __name((p2) => /* @__PURE__ */ React.createElement(
|
|
164172
|
-
"div",
|
|
164173
|
-
{
|
|
164174
|
-
className: "bp3-text-muted bp3-text-small",
|
|
164175
|
-
style: { marginBottom: 15, marginTop: -5, fontStyle: "italic" }
|
|
164176
|
-
},
|
|
164177
|
-
p2.children
|
|
164178
|
-
), "InnerWrapperMeltingTemp");
|
|
164179
164461
|
const Dialogs = {
|
|
164180
164462
|
RenameSequenceDialog,
|
|
164181
164463
|
PrintDialog: PrintDialog$1,
|
package/ove.css
CHANGED
|
@@ -8819,12 +8819,14 @@ span.bp3-popover-target{
|
|
|
8819
8819
|
/*# sourceMappingURL=blueprint-icons.css.map */:root {
|
|
8820
8820
|
--base1: #ffffff;
|
|
8821
8821
|
--base2: #cdcdcd;
|
|
8822
|
+
--base3: #a1a3a5;
|
|
8822
8823
|
--reversed: #293742;
|
|
8823
8824
|
}
|
|
8824
8825
|
|
|
8825
8826
|
body.bp3-dark {
|
|
8826
8827
|
--base1: #393a3a;
|
|
8827
8828
|
--base2: #293742;
|
|
8829
|
+
--base3: #959697;
|
|
8828
8830
|
--reversed: #cdcdcd;
|
|
8829
8831
|
}
|
|
8830
8832
|
|
|
@@ -9611,6 +9613,50 @@ button:not(:disabled):active {
|
|
|
9611
9613
|
border: none;
|
|
9612
9614
|
}
|
|
9613
9615
|
|
|
9616
|
+
.ReactTable.ReactTable .rt-tbody .rt-tr-group.no-group-border {
|
|
9617
|
+
border-bottom: none;
|
|
9618
|
+
}
|
|
9619
|
+
|
|
9620
|
+
.react-draggable .bp3-dialog {
|
|
9621
|
+
/* add little chevrons in the bottom corners of the dialog to show its draggable */
|
|
9622
|
+
position: relative;
|
|
9623
|
+
}
|
|
9624
|
+
|
|
9625
|
+
.react-draggable .bp3-dialog::before,
|
|
9626
|
+
.react-draggable .bp3-dialog::after {
|
|
9627
|
+
content: "";
|
|
9628
|
+
position: absolute;
|
|
9629
|
+
bottom: 3px;
|
|
9630
|
+
width: 10px;
|
|
9631
|
+
height: 10px;
|
|
9632
|
+
border-style: double;
|
|
9633
|
+
border-color: var(--base3);
|
|
9634
|
+
border-width: 0;
|
|
9635
|
+
border-bottom-width: 6px;
|
|
9636
|
+
pointer-events: none;
|
|
9637
|
+
}
|
|
9638
|
+
|
|
9639
|
+
.react-draggable .bp3-dialog::before {
|
|
9640
|
+
left: 3px;
|
|
9641
|
+
border-left-width: 6px;
|
|
9642
|
+
border-bottom-left-radius: 2px;
|
|
9643
|
+
}
|
|
9644
|
+
|
|
9645
|
+
.react-draggable .bp3-dialog::after {
|
|
9646
|
+
right: 3px;
|
|
9647
|
+
border-right-width: 6px;
|
|
9648
|
+
border-bottom-right-radius: 2px;
|
|
9649
|
+
}
|
|
9650
|
+
|
|
9651
|
+
.react-draggable .tg-dialog-resize-handle div:first-child {
|
|
9652
|
+
bottom: 0px !important;
|
|
9653
|
+
left: 0px !important;
|
|
9654
|
+
}
|
|
9655
|
+
.react-draggable .tg-dialog-resize-handle div:nth-child(2) {
|
|
9656
|
+
bottom: 0px !important;
|
|
9657
|
+
right: 0px !important;
|
|
9658
|
+
}
|
|
9659
|
+
|
|
9614
9660
|
.bp3-dark .ReactTable.ReactTable .rt-tbody .rt-tr-group {
|
|
9615
9661
|
border-bottom-color: rgba(16, 22, 26, 0.15);
|
|
9616
9662
|
}
|