@teselagen/ove 0.3.52 → 0.3.53

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 CHANGED
@@ -11359,10 +11359,10 @@ function m$1(n2, r2) {
11359
11359
  tn[n2] || (tn[n2] = r2);
11360
11360
  }
11361
11361
  __name(m$1, "m$1");
11362
- function _$2() {
11362
+ function _$1() {
11363
11363
  return U;
11364
11364
  }
11365
- __name(_$2, "_$2");
11365
+ __name(_$1, "_$1");
11366
11366
  function j$1(n2, r2) {
11367
11367
  r2 && (b$1("Patches"), n2.u = [], n2.s = [], n2.v = r2);
11368
11368
  }
@@ -11456,12 +11456,12 @@ function E(n2) {
11456
11456
  __name(E, "E");
11457
11457
  function N(n2, r2, t2) {
11458
11458
  var e2 = s(r2) ? b$1("MapSet").F(r2, t2) : v$1(r2) ? b$1("MapSet").T(r2, t2) : n2.O ? function(n3, r3) {
11459
- var t3 = Array.isArray(n3), e3 = { i: t3 ? 1 : 0, A: r3 ? r3.A : _$2(), P: false, I: false, R: {}, l: r3, t: n3, k: null, o: null, j: null, C: false }, i = e3, o2 = en;
11459
+ var t3 = Array.isArray(n3), e3 = { i: t3 ? 1 : 0, A: r3 ? r3.A : _$1(), P: false, I: false, R: {}, l: r3, t: n3, k: null, o: null, j: null, C: false }, i = e3, o2 = en;
11460
11460
  t3 && (i = [e3], o2 = on$1);
11461
11461
  var u2 = Proxy.revocable(i, o2), a2 = u2.revoke, f2 = u2.proxy;
11462
11462
  return e3.k = f2, e3.j = a2, f2;
11463
11463
  }(r2, t2) : b$1("ES5").J(r2, t2);
11464
- return (t2 ? t2.A : _$2()).p.push(e2), e2;
11464
+ return (t2 ? t2.A : _$1()).p.push(e2), e2;
11465
11465
  }
11466
11466
  __name(N, "N");
11467
11467
  function R(e2) {
@@ -17738,7 +17738,6 @@ lodash.exports;
17738
17738
  }).call(commonjsGlobal);
17739
17739
  })(lodash, lodash.exports);
17740
17740
  var lodashExports = lodash.exports;
17741
- const _$1 = /* @__PURE__ */ getDefaultExportFromCjs(lodashExports);
17742
17741
  function _extends$q() {
17743
17742
  _extends$q = Object.assign ? Object.assign.bind() : function(target) {
17744
17743
  for (var i = 1; i < arguments.length; i++) {
@@ -55619,6 +55618,15 @@ const openColumn = __spreadProps(__spreadValues({}, viewColumn), {
55619
55618
  }
55620
55619
  });
55621
55620
  const dataTableEnhancer = compose(
55621
+ // maybe we need this in some cases?
55622
+ // tgFormValues("reduxFormEntities"),
55623
+ // withProps(props => {
55624
+ // const entities = props.reduxFormEntities || props.entities;
55625
+ // return {
55626
+ // _origEntities: props.entities,
55627
+ // entities
55628
+ // };
55629
+ // }),
55622
55630
  //connect to withTableParams here in the dataTable component so that, in the case that the table is not manually connected,
55623
55631
  withTableParams({
55624
55632
  isLocalCall: true
@@ -56477,13 +56485,14 @@ const _DataTable = class _DataTable extends React$2.Component {
56477
56485
  }, "formatAndValidateEntities"));
56478
56486
  __publicField(this, "formatAndValidateTableInitial", /* @__PURE__ */ __name(() => {
56479
56487
  const {
56480
- _origEntities: entities,
56488
+ _origEntities,
56489
+ entities,
56481
56490
  initialEntities,
56482
56491
  change,
56483
56492
  reduxFormCellValidation
56484
56493
  } = this.props;
56485
56494
  const { newEnts, validationErrors } = this.formatAndValidateEntities(
56486
- initialEntities || entities
56495
+ initialEntities || entities || _origEntities
56487
56496
  );
56488
56497
  change("reduxFormEntities", newEnts);
56489
56498
  const toKeep = {};
@@ -56601,16 +56610,33 @@ const _DataTable = class _DataTable extends React$2.Component {
56601
56610
  } else if (e2.clipboardData && e2.clipboardData.getData) {
56602
56611
  toPaste = e2.clipboardData.getData("text/plain");
56603
56612
  }
56604
- if (toPaste.includes(",")) {
56605
- try {
56606
- const { data, errors } = papaparse.parse(toPaste, {
56607
- header: false
56613
+ const jsonToPaste = e2.clipboardData.getData("application/json");
56614
+ try {
56615
+ const pastedJson = [];
56616
+ JSON.parse(jsonToPaste).forEach((row) => {
56617
+ const newRow = [];
56618
+ Object.values(row).forEach((cell) => {
56619
+ const cellVal = JSON.parse(cell);
56620
+ newRow.push(cellVal);
56608
56621
  });
56609
- if ((data == null ? void 0 : data.length) && !(errors == null ? void 0 : errors.length)) {
56610
- pasteData = data;
56622
+ pastedJson.push(newRow);
56623
+ });
56624
+ pasteData = pastedJson;
56625
+ if (pasteData[0] && pasteData[0][0] && pasteData[0][0].__isHeaderCell) {
56626
+ pasteData = pasteData.slice(1);
56627
+ }
56628
+ } catch (e22) {
56629
+ if (toPaste.includes(",")) {
56630
+ try {
56631
+ const { data, errors } = papaparse.parse(toPaste, {
56632
+ header: false
56633
+ });
56634
+ if ((data == null ? void 0 : data.length) && !(errors == null ? void 0 : errors.length)) {
56635
+ pasteData = data;
56636
+ }
56637
+ } catch (error) {
56638
+ console.error(`error p982qhgpf9qh`, error);
56611
56639
  }
56612
- } catch (error) {
56613
- console.error(`error p982qhgpf9qh`, error);
56614
56640
  }
56615
56641
  }
56616
56642
  pasteData = pasteData.length ? pasteData : defaultParsePaste(toPaste);
@@ -56629,7 +56655,7 @@ const _DataTable = class _DataTable extends React$2.Component {
56629
56655
  entity,
56630
56656
  path: path2,
56631
56657
  schema: schema2,
56632
- newVal: newVal2
56658
+ newVal: formatPasteData({ newVal: newVal2, path: path2, schema: schema2 })
56633
56659
  });
56634
56660
  if (error) {
56635
56661
  newCellValidate[cellId] = error;
@@ -56660,8 +56686,8 @@ const _DataTable = class _DataTable extends React$2.Component {
56660
56686
  const indexToPath = lodashExports.invert(pathToIndex);
56661
56687
  const startCellIndex = pathToIndex[primaryCellPath];
56662
56688
  pasteData.forEach((row, i) => {
56663
- row.forEach((cell, j) => {
56664
- if (cell) {
56689
+ row.forEach((newVal2, j) => {
56690
+ if (newVal2) {
56665
56691
  const cellIndexToChange = startCellIndex + j;
56666
56692
  const entity = entitiesToManipulate[i];
56667
56693
  if (entity) {
@@ -56672,7 +56698,11 @@ const _DataTable = class _DataTable extends React$2.Component {
56672
56698
  entity,
56673
56699
  path: path2,
56674
56700
  schema: schema2,
56675
- newVal: cell
56701
+ newVal: formatPasteData({
56702
+ newVal: newVal2,
56703
+ path: path2,
56704
+ schema: schema2
56705
+ })
56676
56706
  });
56677
56707
  const cellId = `${getIdOrCodeOrIndex(entity)}:${path2}`;
56678
56708
  if (!newSelectedCells[cellId]) {
@@ -56782,17 +56812,11 @@ const _DataTable = class _DataTable extends React$2.Component {
56782
56812
  __publicField(this, "getCellCopyText", /* @__PURE__ */ __name((cellWrapper) => {
56783
56813
  const text2 = cellWrapper && cellWrapper.getAttribute("data-copy-text");
56784
56814
  const jsonText = cellWrapper && cellWrapper.getAttribute("data-copy-json");
56785
- const toRet = text2 || cellWrapper.textContent || "";
56786
- return [toRet, jsonText];
56815
+ const textContent = text2 || cellWrapper.textContent || "";
56816
+ return [textContent, jsonText];
56787
56817
  }, "getCellCopyText"));
56788
- __publicField(this, "handleCopyRow", /* @__PURE__ */ __name((rowEl) => {
56789
- const text2 = this.getRowCopyText(rowEl);
56790
- if (!text2)
56791
- return window.toastr.warning("No text to copy");
56792
- this.handleCopyHelper(text2, void 0, "Row Copied");
56793
- }, "handleCopyRow"));
56794
56818
  __publicField(this, "handleCopyColumn", /* @__PURE__ */ __name((e2, cellWrapper, selectedRecords) => {
56795
- const cellType = cellWrapper.getAttribute("data-test");
56819
+ const specificColumn = cellWrapper.getAttribute("data-test");
56796
56820
  let rowElsToCopy = getAllRows(e2);
56797
56821
  if (!rowElsToCopy)
56798
56822
  return;
@@ -56809,14 +56833,24 @@ const _DataTable = class _DataTable extends React$2.Component {
56809
56833
  }
56810
56834
  if (!rowElsToCopy)
56811
56835
  return;
56812
- const textToCopy = lodashExports.map(
56813
- rowElsToCopy,
56814
- (rowEl) => this.getRowCopyText(rowEl, { cellType })
56815
- ).filter((text2) => text2).join("\n");
56836
+ this.handleCopyRows(rowElsToCopy, {
56837
+ specificColumn,
56838
+ onFinishMsg: "Column Copied"
56839
+ });
56840
+ }, "handleCopyColumn"));
56841
+ __publicField(this, "handleCopyRows", /* @__PURE__ */ __name((rowElsToCopy, { specificColumn, onFinishMsg } = {}) => {
56842
+ let textToCopy = [];
56843
+ const jsonToCopy = [];
56844
+ lodashExports.forEach(rowElsToCopy, (rowEl) => {
56845
+ const [t2, j] = this.getRowCopyText(rowEl, { specificColumn });
56846
+ textToCopy.push(t2);
56847
+ jsonToCopy.push(j);
56848
+ });
56849
+ textToCopy = textToCopy.filter((text2) => text2).join("\n");
56816
56850
  if (!textToCopy)
56817
56851
  return window.toastr.warning("No text to copy");
56818
- this.handleCopyHelper(textToCopy, void 0, "Column copied");
56819
- }, "handleCopyColumn"));
56852
+ this.handleCopyHelper(textToCopy, jsonToCopy, onFinishMsg || "Row Copied");
56853
+ }, "handleCopyRows"));
56820
56854
  __publicField(this, "updateEntitiesHelper", /* @__PURE__ */ __name((ents, fn4) => {
56821
56855
  const { change, reduxFormEntitiesUndoRedoStack = { currentVersion: 0 } } = this.props;
56822
56856
  const [nextState, patches, inversePatches] = cn(ents, fn4);
@@ -56835,34 +56869,35 @@ const _DataTable = class _DataTable extends React$2.Component {
56835
56869
  }
56836
56870
  }));
56837
56871
  }, "updateEntitiesHelper"));
56838
- __publicField(this, "getRowCopyText", /* @__PURE__ */ __name((rowEl, { cellType } = {}) => {
56872
+ __publicField(this, "getRowCopyText", /* @__PURE__ */ __name((rowEl, { specificColumn } = {}) => {
56839
56873
  if (!rowEl)
56840
56874
  return;
56841
- return lodashExports.flatMap(rowEl.children, (cellEl) => {
56875
+ const textContent = [];
56876
+ const jsonText = [];
56877
+ lodashExports.forEach(rowEl.children, (cellEl) => {
56842
56878
  const cellChild = cellEl.querySelector(`[data-copy-text]`);
56843
56879
  if (!cellChild) {
56844
- if (cellType)
56880
+ if (specificColumn)
56845
56881
  return [];
56846
56882
  return;
56847
56883
  }
56848
- if (cellType && cellChild.getAttribute("data-test") !== cellType) {
56884
+ if (specificColumn && cellChild.getAttribute("data-test") !== specificColumn) {
56849
56885
  return [];
56850
56886
  }
56851
- return this.getCellCopyText(cellChild);
56852
- }).join(" ");
56887
+ const [t2, j] = this.getCellCopyText(cellChild);
56888
+ textContent.push(t2);
56889
+ jsonText.push(j);
56890
+ });
56891
+ return [lodashExports.flatMap(textContent).join(" "), jsonText];
56853
56892
  }, "getRowCopyText"));
56854
- __publicField(this, "handleCopyHelper", /* @__PURE__ */ __name((stringToCopy, objToCopy, message) => {
56855
- const copyHandler = /* @__PURE__ */ __name((e2) => {
56856
- e2.preventDefault();
56857
- e2.clipboardData.setData("application/json", JSON.stringify(objToCopy));
56858
- e2.clipboardData.setData("text/plain", stringToCopy);
56859
- }, "copyHandler");
56860
- document.addEventListener("copy", copyHandler);
56893
+ __publicField(this, "handleCopyHelper", /* @__PURE__ */ __name((stringToCopy, jsonToCopy, message) => {
56861
56894
  !window.Cypress && copyToClipboard$1(stringToCopy, {
56895
+ onCopy: (clipboardData) => {
56896
+ clipboardData.setData("application/json", JSON.stringify(jsonToCopy));
56897
+ },
56862
56898
  // keep this so that pasting into spreadsheets works.
56863
56899
  format: "text/plain"
56864
56900
  });
56865
- document.removeEventListener("copy", copyHandler);
56866
56901
  window.toastr.success(message);
56867
56902
  }, "handleCopyHelper"));
56868
56903
  __publicField(this, "handleCopyTable", /* @__PURE__ */ __name((e2) => {
@@ -56870,10 +56905,9 @@ const _DataTable = class _DataTable extends React$2.Component {
56870
56905
  const allRowEls = getAllRows(e2);
56871
56906
  if (!allRowEls)
56872
56907
  return;
56873
- const textToCopy = lodashExports.map(allRowEls, (rowEl) => this.getRowCopyText(rowEl)).filter((text2) => text2).join("\n");
56874
- if (!textToCopy)
56875
- return window.toastr.warning("No text to copy");
56876
- this.handleCopyHelper(textToCopy, void 0, "Table copied");
56908
+ this.handleCopyRows(allRowEls, {
56909
+ onFinishMsg: "Table Copied"
56910
+ });
56877
56911
  } catch (error) {
56878
56912
  console.error(`error:`, error);
56879
56913
  window.toastr.error("Error copying rows.");
@@ -56913,6 +56947,7 @@ const _DataTable = class _DataTable extends React$2.Component {
56913
56947
  return;
56914
56948
  const allRows = getAllRows(e2);
56915
56949
  let fullCellText = "";
56950
+ const fullJson = [];
56916
56951
  lodashExports.times(selectionGrid.length, (i) => {
56917
56952
  const row = selectionGrid[i];
56918
56953
  if (fullCellText) {
@@ -56921,20 +56956,24 @@ const _DataTable = class _DataTable extends React$2.Component {
56921
56956
  if (!row) {
56922
56957
  return;
56923
56958
  } else {
56924
- const rowCopyText = this.getRowCopyText(allRows[i + 1]).split(" ");
56959
+ const jsonRow = [];
56960
+ let [rowCopyText, json] = this.getRowCopyText(allRows[i + 1]);
56961
+ rowCopyText = rowCopyText.split(" ");
56925
56962
  lodashExports.times(row.length, (i2) => {
56926
56963
  const cell = row[i2];
56927
56964
  if (cell) {
56928
56965
  fullCellText += rowCopyText[i2];
56966
+ jsonRow.push(json[i2]);
56929
56967
  }
56930
56968
  if (i2 !== row.length - 1 && i2 >= firstCellIndex)
56931
56969
  fullCellText += " ";
56932
56970
  });
56971
+ fullJson.push(jsonRow);
56933
56972
  }
56934
56973
  });
56935
56974
  if (!fullCellText)
56936
56975
  return window.toastr.warning("No text to copy");
56937
- this.handleCopyHelper(fullCellText, void 0, "Selected cells copied");
56976
+ this.handleCopyHelper(fullCellText, fullJson, "Selected cells copied");
56938
56977
  }, "handleCopySelectedCells"));
56939
56978
  __publicField(this, "handleCopySelectedRows", /* @__PURE__ */ __name((selectedRecords, e2) => {
56940
56979
  const { entities = [] } = computePresets(this.props);
@@ -56951,10 +56990,9 @@ const _DataTable = class _DataTable extends React$2.Component {
56951
56990
  if (!allRowEls)
56952
56991
  return;
56953
56992
  const rowEls = rowNumbersToCopy.map((i) => allRowEls[i]);
56954
- const textToCopy = lodashExports.map(rowEls, (rowEl) => this.getRowCopyText(rowEl)).filter((text2) => text2).join("\n");
56955
- if (!textToCopy)
56956
- return window.toastr.warning("No text to copy");
56957
- this.handleCopyHelper(textToCopy, void 0, "Selected rows copied");
56993
+ this.handleCopyRows(rowEls, {
56994
+ onFinishMsg: "Selected rows copied"
56995
+ });
56958
56996
  } catch (error) {
56959
56997
  console.error(`error:`, error);
56960
56998
  window.toastr.error("Error copying rows.");
@@ -57689,6 +57727,7 @@ const _DataTable = class _DataTable extends React$2.Component {
57689
57727
  }
57690
57728
  const oldFunc = tableColumn.Cell;
57691
57729
  tableColumn.Cell = (...args) => {
57730
+ var _a2;
57692
57731
  const [row] = args;
57693
57732
  const rowId = getIdOrCodeOrIndex(row.original, row.index);
57694
57733
  const cellId = `${rowId}:${row.column.path}`;
@@ -57699,6 +57738,7 @@ const _DataTable = class _DataTable extends React$2.Component {
57699
57738
  const dataTest = {
57700
57739
  "data-test": "tgCell_" + column.path
57701
57740
  };
57741
+ const fullValue = (_a2 = row.original) == null ? void 0 : _a2[row.column.path];
57702
57742
  if (isCellEditable && isBool) {
57703
57743
  val2 = /* @__PURE__ */ React$2.createElement(
57704
57744
  core$5.Checkbox,
@@ -57721,6 +57761,7 @@ const _DataTable = class _DataTable extends React$2.Component {
57721
57761
  GenericSelectComp,
57722
57762
  __spreadProps(__spreadValues({
57723
57763
  rowId,
57764
+ fullValue,
57724
57765
  initialValue: text2
57725
57766
  }, dataTest), {
57726
57767
  finishEdit: (newVal2, doNotStopEditing) => {
@@ -57788,6 +57829,13 @@ const _DataTable = class _DataTable extends React$2.Component {
57788
57829
  }, dataTest), {
57789
57830
  className: "tg-cell-wrapper",
57790
57831
  "data-copy-text": text2,
57832
+ "data-copy-json": JSON.stringify(
57833
+ //tnw: eventually we'll parse these back out and use either the fullValue (for the generic selects) or the regular text vals for everything else
57834
+ column.type === "genericSelect" ? {
57835
+ __strVal: fullValue,
57836
+ __genSelCol: column.path
57837
+ } : { __strVal: text2 }
57838
+ ),
57791
57839
  title: title || void 0
57792
57840
  }),
57793
57841
  val2
@@ -58134,8 +58182,13 @@ const _DataTable = class _DataTable extends React$2.Component {
58134
58182
  {
58135
58183
  key: "copyCell",
58136
58184
  onClick: () => {
58185
+ const specificColumn = cellWrapper.getAttribute("data-test");
58186
+ this.handleCopyRows([cellWrapper.closest(".rt-tr")], {
58187
+ specificColumn,
58188
+ onFinishMsg: "Cell copied"
58189
+ });
58137
58190
  const [text2, jsonText] = this.getCellCopyText(cellWrapper);
58138
- this.handleCopyHelper(text2, jsonText, "Cell copied");
58191
+ this.handleCopyHelper(text2, jsonText);
58139
58192
  },
58140
58193
  text: "Cell"
58141
58194
  }
@@ -58177,7 +58230,7 @@ const _DataTable = class _DataTable extends React$2.Component {
58177
58230
  {
58178
58231
  key: "copySelectedRows",
58179
58232
  onClick: () => {
58180
- this.handleCopyRow(row);
58233
+ this.handleCopyRows([row]);
58181
58234
  },
58182
58235
  text: "Row"
58183
58236
  }
@@ -58423,6 +58476,10 @@ const _DataTable = class _DataTable extends React$2.Component {
58423
58476
  "data-test": columnTitleTextified,
58424
58477
  "data-path": path2,
58425
58478
  "data-copy-text": columnTitleTextified,
58479
+ "data-copy-json": JSON.stringify({
58480
+ __strVal: columnTitleTextified,
58481
+ __isHeaderCell: true
58482
+ }),
58426
58483
  className: classNames("tg-react-table-column-header", {
58427
58484
  "sort-active": sortUp || sortDown
58428
58485
  })
@@ -59439,6 +59496,20 @@ function isEntityClean(e2) {
59439
59496
  return isClean;
59440
59497
  }
59441
59498
  __name(isEntityClean, "isEntityClean");
59499
+ const formatPasteData = /* @__PURE__ */ __name(({ schema: schema2, newVal: newVal2, path: path2 }) => {
59500
+ const pathToField = getFieldPathToField(schema2);
59501
+ const column = pathToField[path2];
59502
+ if (column.type === "genericSelect") {
59503
+ if ((newVal2 == null ? void 0 : newVal2.__genSelCol) === path2) {
59504
+ newVal2 = newVal2.__strVal;
59505
+ } else {
59506
+ newVal2 = void 0;
59507
+ }
59508
+ } else {
59509
+ newVal2 = Object.hasOwn(newVal2, "__strVal") ? newVal2.__strVal : newVal2;
59510
+ }
59511
+ return newVal2;
59512
+ }, "formatPasteData");
59442
59513
  const wrapDialog = /* @__PURE__ */ __name((topLevelDialogProps = {}) => (Component) => (props) => {
59443
59514
  const r2 = React$2.useRef();
59444
59515
  const memoedHotkeys = React$2.useMemo(
@@ -104249,7 +104320,7 @@ function gffToJson(string2) {
104249
104320
  if (!features2[feature.seq_id])
104250
104321
  features2[feature.seq_id] = [];
104251
104322
  const attributes = feature.attributes || {};
104252
- const name2 = _$1.get(attributes, "ID[0]");
104323
+ const name2 = lodashExports.get(attributes, "ID[0]");
104253
104324
  features2[feature.seq_id].push({
104254
104325
  name: name2,
104255
104326
  start: feature.start,
@@ -121094,8 +121165,8 @@ function Caret$2(props) {
121094
121165
  }
121095
121166
  __name(Caret$2, "Caret$2");
121096
121167
  const isEq = /* @__PURE__ */ __name((o1, o2) => {
121097
- const isEq2 = _$1.isEqualWith(o1, o2, function(val1, val2) {
121098
- if (_$1.isFunction(val1) && _$1.isFunction(val2)) {
121168
+ const isEq2 = lodashExports.isEqualWith(o1, o2, function(val1, val2) {
121169
+ if (lodashExports.isFunction(val1) && lodashExports.isFunction(val2)) {
121099
121170
  return val1 === val2 || val1.toString() === val2.toString();
121100
121171
  }
121101
121172
  });
@@ -125903,7 +125974,7 @@ function showFileDialog({ multiple = false, onSelect }) {
125903
125974
  }
125904
125975
  __name(showFileDialog, "showFileDialog");
125905
125976
  const name = "@teselagen/ove";
125906
- const version = "0.3.51";
125977
+ const version = "0.3.52";
125907
125978
  const main = "./src/index.js";
125908
125979
  const exports$1 = {
125909
125980
  ".": {
@@ -148909,16 +148980,14 @@ function Ladder({
148909
148980
  onClick: () => __async(this, null, function* () {
148910
148981
  try {
148911
148982
  const canvas = yield Promise.resolve().then(() => require("./html2canvas.esm-388ff992.js"));
148912
- canvas.default(document.querySelector(".ve-digest-container")).then(
148913
- (canvas2) => {
148914
- canvas2.toBlob(
148915
- (blob) => navigator.clipboard.write([
148916
- new window.ClipboardItem({ "image/png": blob })
148917
- ])
148918
- );
148919
- window.toastr.success("Image copied to clipboard!");
148920
- }
148921
- );
148983
+ canvas.default(document.querySelector(".ve-digest-container")).then((canvas2) => {
148984
+ canvas2.toBlob(
148985
+ (blob) => navigator.clipboard.write([
148986
+ new window.ClipboardItem({ "image/png": blob })
148987
+ ])
148988
+ );
148989
+ window.toastr.success("Image copied to clipboard!");
148990
+ });
148922
148991
  } catch (e2) {
148923
148992
  window.toastr.error(
148924
148993
  "Error copying the image, try just taking a screenshot instead ;)"