@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.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(isOpenByDefault);
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
- setOpen(!isOpen2);
96083
+ const newIsOpen = !isOpen2;
96084
+ setOpen(newIsOpen);
96085
+ if (localStorageKey) {
96086
+ window.localStorage.setItem(localStorageKey, newIsOpen);
96087
+ }
96011
96088
  }, "onClick"),
96012
- style: { cursor: "pointer", display: "flex", alignItems: "flex-end" },
96013
- className: "tg-toggle-advanced-options"
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: { marginLeft: 5 }
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
- function featuresRawSelector(sequenceData2) {
126070
- return sequenceData2.features;
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(sequenceDataSelector, featuresRawSelector);
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(sequenceDataSelector, primersRawSelector);
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(sequenceDataSelector, partsRawSelector);
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.18";
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: "Default Tm (Breslauer)" },
163879
- { value: "neb_tm", label: "NEB Tm (SantaLucia)" }
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, " "), hasWarning && /* @__PURE__ */ React.createElement(
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: InnerWrapperMeltingTemp,
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
  }