@odoo/o-spreadsheet 18.1.6 → 18.1.8

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.
@@ -2,9 +2,9 @@
2
2
  /**
3
3
  * This file is generated by o-spreadsheet build tools. Do not edit it.
4
4
  * @see https://github.com/odoo/o-spreadsheet
5
- * @version 18.1.6
6
- * @date 2025-02-05T07:18:57.089Z
7
- * @hash f5b97e0
5
+ * @version 18.1.8
6
+ * @date 2025-02-14T08:42:08.322Z
7
+ * @hash 02682f4
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -769,9 +769,16 @@
769
769
  }
770
770
  return true;
771
771
  }
772
- /** Check if the given array contains all the values of the other array. */
772
+ /**
773
+ * Check if the given array contains all the values of the other array.
774
+ * It makes the assumption that both array do not contain duplicates.
775
+ */
773
776
  function includesAll(arr, values) {
774
- return values.every((value) => arr.includes(value));
777
+ if (arr.length < values.length) {
778
+ return false;
779
+ }
780
+ const set = new Set(arr);
781
+ return values.every((value) => set.has(value));
775
782
  }
776
783
  /**
777
784
  * Return an object with all the keys in the object that have a falsy value removed.
@@ -6473,6 +6480,33 @@
6473
6480
  * https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
6474
6481
  * */
6475
6482
  class UuidGenerator {
6483
+ /**
6484
+ * Generates a custom UUID using a simple 36^12 method (8-character alphanumeric string with lowercase letters)
6485
+ * This has a higher chance of collision than a UUIDv4, but not only faster to generate than an UUIDV4,
6486
+ * it also has a smaller size, which is preferable to alleviate the overall data size.
6487
+ *
6488
+ * This method is preferable when generating uuids for the core data (sheetId, figureId, etc)
6489
+ * as they will appear several times in the revisions and local history.
6490
+ *
6491
+ */
6492
+ smallUuid() {
6493
+ //@ts-ignore
6494
+ if (window.crypto && window.crypto.getRandomValues) {
6495
+ //@ts-ignore
6496
+ return ([1e7] + -1e3).replace(/[018]/g, (c) => (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16));
6497
+ }
6498
+ else {
6499
+ // mainly for jest and other browsers that do not have the crypto functionality
6500
+ return "xxxxxxxx-xxxx".replace(/[xy]/g, function (c) {
6501
+ const r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8;
6502
+ return v.toString(16);
6503
+ });
6504
+ }
6505
+ }
6506
+ /**
6507
+ * Generates an UUIDV4, has astronomically low chance of collision, but is larger in size than the smallUuid.
6508
+ * This method should be used when you need to avoid collisions at all costs, like the id of a revision.
6509
+ */
6476
6510
  uuidv4() {
6477
6511
  //@ts-ignore
6478
6512
  if (window.crypto && window.crypto.getRandomValues) {
@@ -8507,7 +8541,7 @@
8507
8541
  };
8508
8542
  }
8509
8543
  getPasteTarget(sheetId, target, content, options) {
8510
- const newId = new UuidGenerator().uuidv4();
8544
+ const newId = new UuidGenerator().smallUuid();
8511
8545
  return { zones: [], figureId: newId, sheetId };
8512
8546
  }
8513
8547
  paste(target, clippedContent, options) {
@@ -8673,7 +8707,7 @@
8673
8707
  if (!targetCF && queuedCfs) {
8674
8708
  targetCF = queuedCfs.find((queued) => queued.cf.stopIfTrue === originCF.stopIfTrue && deepEquals(queued.cf.rule, originCF.rule))?.cf;
8675
8709
  }
8676
- return targetCF || { ...originCF, id: this.uuidGenerator.uuidv4(), ranges: [] };
8710
+ return targetCF || { ...originCF, id: this.uuidGenerator.smallUuid(), ranges: [] };
8677
8711
  }
8678
8712
  }
8679
8713
 
@@ -8766,7 +8800,7 @@
8766
8800
  }
8767
8801
  return (targetRule || {
8768
8802
  ...originRule,
8769
- id: newId ? this.uuidGenerator.uuidv4() : originRule.id,
8803
+ id: newId ? this.uuidGenerator.smallUuid() : originRule.id,
8770
8804
  ranges: [],
8771
8805
  });
8772
8806
  }
@@ -8828,7 +8862,7 @@
8828
8862
  };
8829
8863
  }
8830
8864
  getPasteTarget(sheetId, target, content, options) {
8831
- const newId = new UuidGenerator().uuidv4();
8865
+ const newId = new UuidGenerator().smallUuid();
8832
8866
  return { sheetId, zones: [], figureId: newId };
8833
8867
  }
8834
8868
  paste(target, clippedContent, options) {
@@ -15103,7 +15137,7 @@ stores.inject(MyMetaStore, storeInstance);
15103
15137
  }
15104
15138
  }
15105
15139
  },
15106
- isExported: true,
15140
+ isExported: false,
15107
15141
  };
15108
15142
  // -----------------------------------------------------------------------------
15109
15143
  // UNIQUE
@@ -27616,7 +27650,7 @@ stores.inject(MyMetaStore, storeInstance);
27616
27650
  for (const sheet of data.sheets || []) {
27617
27651
  for (const figure of sheet.figures || []) {
27618
27652
  if (figureIds.has(figure.id)) {
27619
- figure.id += uuidGenerator.uuidv4();
27653
+ figure.id += uuidGenerator.smallUuid();
27620
27654
  }
27621
27655
  figureIds.add(figure.id);
27622
27656
  }
@@ -28201,9 +28235,7 @@ stores.inject(MyMetaStore, storeInstance);
28201
28235
  const labelValues = getChartLabelValues(getters, dataSets, labelRange);
28202
28236
  let labels = labelValues.formattedValues;
28203
28237
  let dataSetsValues = getChartDatasetValues(getters, dataSets);
28204
- if (definition.dataSetsHaveTitle &&
28205
- dataSetsValues[0] &&
28206
- labels.length > dataSetsValues[0].data.length) {
28238
+ if (shouldRemoveFirstLabel(labelRange, dataSets[0], definition.dataSetsHaveTitle || false)) {
28207
28239
  labels.shift();
28208
28240
  }
28209
28241
  ({ labels, dataSetsValues } = filterInvalidDataPoints(labels, dataSetsValues));
@@ -28252,13 +28284,12 @@ stores.inject(MyMetaStore, storeInstance);
28252
28284
  };
28253
28285
  }
28254
28286
  function getLineChartData(definition, dataSets, labelRange, getters) {
28255
- const axisType = getChartAxisType(definition, labelRange, getters);
28287
+ const axisType = getChartAxisType(definition, dataSets, labelRange, getters);
28256
28288
  const labelValues = getChartLabelValues(getters, dataSets, labelRange);
28257
28289
  let labels = axisType === "linear" ? labelValues.values : labelValues.formattedValues;
28258
28290
  let dataSetsValues = getChartDatasetValues(getters, dataSets);
28259
- if (definition.dataSetsHaveTitle &&
28260
- dataSetsValues[0] &&
28261
- labels.length > dataSetsValues[0].data.length) {
28291
+ const removeFirstLabel = shouldRemoveFirstLabel(labelRange, dataSets[0], definition.dataSetsHaveTitle || false);
28292
+ if (removeFirstLabel) {
28262
28293
  labels.shift();
28263
28294
  }
28264
28295
  ({ labels, dataSetsValues } = filterInvalidDataPoints(labels, dataSetsValues));
@@ -28270,7 +28301,7 @@ stores.inject(MyMetaStore, storeInstance);
28270
28301
  }
28271
28302
  const leftAxisFormat = getChartDatasetFormat(getters, dataSets, "left");
28272
28303
  const rightAxisFormat = getChartDatasetFormat(getters, dataSets, "right");
28273
- const labelsFormat = getChartLabelFormat(getters, labelRange);
28304
+ const labelsFormat = getChartLabelFormat(getters, labelRange, removeFirstLabel);
28274
28305
  const axisFormats = { y: leftAxisFormat, y1: rightAxisFormat, x: labelsFormat };
28275
28306
  const trendDataSetsValues = [];
28276
28307
  for (const index in dataSetsValues) {
@@ -28306,9 +28337,7 @@ stores.inject(MyMetaStore, storeInstance);
28306
28337
  const labelValues = getChartLabelValues(getters, dataSets, labelRange);
28307
28338
  let labels = labelValues.formattedValues;
28308
28339
  let dataSetsValues = getChartDatasetValues(getters, dataSets);
28309
- if (definition.dataSetsHaveTitle &&
28310
- dataSetsValues[0] &&
28311
- labels.length > dataSetsValues[0].data.length) {
28340
+ if (shouldRemoveFirstLabel(labelRange, dataSets[0], definition.dataSetsHaveTitle || false)) {
28312
28341
  labels.shift();
28313
28342
  }
28314
28343
  ({ labels, dataSetsValues } = filterInvalidDataPoints(labels, dataSetsValues));
@@ -28328,9 +28357,7 @@ stores.inject(MyMetaStore, storeInstance);
28328
28357
  const labelValues = getChartLabelValues(getters, dataSets, labelRange);
28329
28358
  let labels = labelValues.formattedValues;
28330
28359
  let dataSetsValues = getChartDatasetValues(getters, dataSets);
28331
- if (definition.dataSetsHaveTitle &&
28332
- dataSetsValues[0] &&
28333
- labels.length > dataSetsValues[0].data.length) {
28360
+ if (shouldRemoveFirstLabel(labelRange, dataSets[0], definition.dataSetsHaveTitle || false)) {
28334
28361
  labels.shift();
28335
28362
  }
28336
28363
  ({ labels, dataSetsValues } = filterInvalidDataPoints(labels, dataSetsValues));
@@ -28350,7 +28377,7 @@ stores.inject(MyMetaStore, storeInstance);
28350
28377
  function getGeoChartData(definition, dataSets, labelRange, getters) {
28351
28378
  const labelValues = getChartLabelValues(getters, dataSets, labelRange);
28352
28379
  let labels = labelValues.formattedValues;
28353
- if (definition.dataSetsHaveTitle) {
28380
+ if (shouldRemoveFirstLabel(labelRange, dataSets[0], definition.dataSetsHaveTitle || false)) {
28354
28381
  labels.shift();
28355
28382
  }
28356
28383
  let dataSetsValues = getChartDatasetValues(getters, dataSets);
@@ -28511,36 +28538,41 @@ stores.inject(MyMetaStore, storeInstance);
28511
28538
  }
28512
28539
  return { normalizedLabels, normalizedNewLabels };
28513
28540
  }
28514
- function getChartAxisType(chart, labelRange, getters) {
28515
- if (isDateChart(chart, labelRange, getters) && isLuxonTimeAdapterInstalled()) {
28541
+ function getChartAxisType(definition, dataSets, labelRange, getters) {
28542
+ if (isDateChart(definition, dataSets, labelRange, getters) && isLuxonTimeAdapterInstalled()) {
28516
28543
  return "time";
28517
28544
  }
28518
- if (isLinearChart(chart, labelRange, getters)) {
28545
+ if (isLinearChart(definition, dataSets, labelRange, getters)) {
28519
28546
  return "linear";
28520
28547
  }
28521
28548
  return "category";
28522
28549
  }
28523
- function isDateChart(definition, labelRange, getters) {
28524
- return !definition.labelsAsText && canBeDateChart(labelRange, getters);
28550
+ function isDateChart(definition, dataSets, labelRange, getters) {
28551
+ return !definition.labelsAsText && canBeDateChart(definition, dataSets, labelRange, getters);
28525
28552
  }
28526
- function isLinearChart(definition, labelRange, getters) {
28527
- return !definition.labelsAsText && canBeLinearChart(labelRange, getters);
28553
+ function isLinearChart(definition, dataSets, labelRange, getters) {
28554
+ return !definition.labelsAsText && canBeLinearChart(definition, dataSets, labelRange, getters);
28528
28555
  }
28529
- function canChartParseLabels(labelRange, getters) {
28530
- return canBeDateChart(labelRange, getters) || canBeLinearChart(labelRange, getters);
28556
+ function canChartParseLabels(definition, dataSets, labelRange, getters) {
28557
+ return (canBeDateChart(definition, dataSets, labelRange, getters) ||
28558
+ canBeLinearChart(definition, dataSets, labelRange, getters));
28531
28559
  }
28532
- function canBeDateChart(labelRange, getters) {
28533
- if (!labelRange || !canBeLinearChart(labelRange, getters)) {
28560
+ function canBeDateChart(definition, dataSets, labelRange, getters) {
28561
+ if (!labelRange || !canBeLinearChart(definition, dataSets, labelRange, getters)) {
28534
28562
  return false;
28535
28563
  }
28536
- const labelFormat = getChartLabelFormat(getters, labelRange);
28564
+ const removeFirstLabel = shouldRemoveFirstLabel(labelRange, dataSets[0], definition.dataSetsHaveTitle || false);
28565
+ const labelFormat = getChartLabelFormat(getters, labelRange, removeFirstLabel);
28537
28566
  return Boolean(labelFormat && timeFormatLuxonCompatible.test(labelFormat));
28538
28567
  }
28539
- function canBeLinearChart(labelRange, getters) {
28568
+ function canBeLinearChart(definition, dataSets, labelRange, getters) {
28540
28569
  if (!labelRange) {
28541
28570
  return false;
28542
28571
  }
28543
28572
  const labels = getters.getRangeValues(labelRange);
28573
+ if (shouldRemoveFirstLabel(labelRange, dataSets[0], definition.dataSetsHaveTitle || false)) {
28574
+ labels.shift();
28575
+ }
28544
28576
  if (labels.some((label) => isNaN(Number(label)) && label)) {
28545
28577
  return false;
28546
28578
  }
@@ -28649,17 +28681,15 @@ stores.inject(MyMetaStore, storeInstance);
28649
28681
  })),
28650
28682
  };
28651
28683
  }
28652
- function getChartLabelFormat(getters, range) {
28684
+ function getChartLabelFormat(getters, range, shouldRemoveFirstLabel) {
28653
28685
  if (!range)
28654
28686
  return undefined;
28655
- const { sheetId, zone: { left, top, bottom }, } = range;
28656
- for (let row = top; row <= bottom; row++) {
28657
- const format = getters.getEvaluatedCell({ sheetId, col: left, row }).format;
28658
- if (format) {
28659
- return format;
28660
- }
28687
+ const { sheetId, zone } = range;
28688
+ const formats = positions(zone).map((position) => getters.getEvaluatedCell({ sheetId, ...position }).format);
28689
+ if (shouldRemoveFirstLabel) {
28690
+ formats.shift();
28661
28691
  }
28662
- return undefined;
28692
+ return formats.find((format) => format !== undefined);
28663
28693
  }
28664
28694
  function getChartLabelValues(getters, dataSets, labelRange) {
28665
28695
  let labels = { values: [], formattedValues: [] };
@@ -32892,7 +32922,7 @@ stores.inject(MyMetaStore, storeInstance);
32892
32922
  const deleteSheet = {
32893
32923
  name: _t("Delete"),
32894
32924
  isVisible: (env) => {
32895
- return env.model.getters.getSheetIds().length > 1;
32925
+ return env.model.getters.getVisibleSheetIds().length > 1;
32896
32926
  },
32897
32927
  execute: (env) => env.askConfirmation(_t("Are you sure you want to delete this sheet?"), () => {
32898
32928
  env.model.dispatch("DELETE_SHEET", { sheetId: env.model.getters.getActiveSheetId() });
@@ -32903,7 +32933,7 @@ stores.inject(MyMetaStore, storeInstance);
32903
32933
  name: _t("Duplicate"),
32904
32934
  execute: (env) => {
32905
32935
  const sheetIdFrom = env.model.getters.getActiveSheetId();
32906
- const sheetIdTo = env.model.uuidGenerator.uuidv4();
32936
+ const sheetIdTo = env.model.uuidGenerator.smallUuid();
32907
32937
  env.model.dispatch("DUPLICATE_SHEET", {
32908
32938
  sheetId: sheetIdFrom,
32909
32939
  sheetIdTo,
@@ -33606,20 +33636,21 @@ stores.inject(MyMetaStore, storeInstance);
33606
33636
  }
33607
33637
  // Only display legend for several datasets.
33608
33638
  const newLegendPos = dataSetZone.right === dataSetZone.left ? "none" : "top";
33609
- const labelRange = labelRangeXc ? getters.getRangeFromSheetXC(sheetId, labelRangeXc) : undefined;
33610
- if (canChartParseLabels(labelRange, getters)) {
33611
- return {
33612
- title: {},
33613
- dataSets,
33614
- labelsAsText: false,
33615
- stacked: false,
33616
- aggregated: false,
33617
- cumulative: false,
33618
- labelRange: labelRangeXc,
33619
- type: "line",
33620
- dataSetsHaveTitle,
33621
- legendPosition: newLegendPos,
33622
- };
33639
+ const lineChartDefinition = {
33640
+ title: {},
33641
+ dataSets,
33642
+ labelsAsText: false,
33643
+ stacked: false,
33644
+ aggregated: false,
33645
+ cumulative: false,
33646
+ labelRange: labelRangeXc,
33647
+ type: "line",
33648
+ dataSetsHaveTitle,
33649
+ legendPosition: newLegendPos,
33650
+ };
33651
+ const chart = new LineChart(lineChartDefinition, sheetId, getters);
33652
+ if (canChartParseLabels(lineChartDefinition, chart.dataSets, chart.labelRange, getters)) {
33653
+ return lineChartDefinition;
33623
33654
  }
33624
33655
  const _dataSets = createDataSets(getters, dataSets, sheetId, dataSetsHaveTitle);
33625
33656
  if (singleColumn &&
@@ -34033,7 +34064,7 @@ stores.inject(MyMetaStore, storeInstance);
34033
34064
  //------------------------------------------------------------------------------
34034
34065
  const CREATE_CHART = (env) => {
34035
34066
  const getters = env.model.getters;
34036
- const id = env.model.uuidGenerator.uuidv4();
34067
+ const id = env.model.uuidGenerator.smallUuid();
34037
34068
  const sheetId = getters.getActiveSheetId();
34038
34069
  if (getZoneArea(env.model.getters.getSelectedZone()) === 1) {
34039
34070
  env.model.selection.selectTableAroundSelection();
@@ -34056,8 +34087,8 @@ stores.inject(MyMetaStore, storeInstance);
34056
34087
  // Pivots
34057
34088
  //------------------------------------------------------------------------------
34058
34089
  const CREATE_PIVOT = (env) => {
34059
- const pivotId = env.model.uuidGenerator.uuidv4();
34060
- const newSheetId = env.model.uuidGenerator.uuidv4();
34090
+ const pivotId = env.model.uuidGenerator.smallUuid();
34091
+ const newSheetId = env.model.uuidGenerator.smallUuid();
34061
34092
  const result = env.model.dispatch("INSERT_NEW_PIVOT", { pivotId, newSheetId });
34062
34093
  if (result.isSuccessful) {
34063
34094
  env.openSidePanel("PivotSidePanel", { pivotId });
@@ -34116,7 +34147,7 @@ stores.inject(MyMetaStore, storeInstance);
34116
34147
  const CREATE_IMAGE = async (env) => {
34117
34148
  if (env.imageProvider) {
34118
34149
  const sheetId = env.model.getters.getActiveSheetId();
34119
- const figureId = env.model.uuidGenerator.uuidv4();
34150
+ const figureId = env.model.uuidGenerator.smallUuid();
34120
34151
  const image = await requestImage(env);
34121
34152
  if (!image) {
34122
34153
  throw new Error("No image provider was given to the environment");
@@ -34669,7 +34700,7 @@ stores.inject(MyMetaStore, storeInstance);
34669
34700
  ranges,
34670
34701
  sheetId,
34671
34702
  rule: {
34672
- id: env.model.uuidGenerator.uuidv4(),
34703
+ id: env.model.uuidGenerator.smallUuid(),
34673
34704
  criterion: {
34674
34705
  type: "isBoolean",
34675
34706
  values: [],
@@ -34685,7 +34716,7 @@ stores.inject(MyMetaStore, storeInstance);
34685
34716
  const zones = env.model.getters.getSelectedZones();
34686
34717
  const sheetId = env.model.getters.getActiveSheetId();
34687
34718
  const ranges = zones.map((zone) => env.model.getters.getRangeDataFromZone(sheetId, zone));
34688
- const ruleID = env.model.uuidGenerator.uuidv4();
34719
+ const ruleID = env.model.uuidGenerator.smallUuid();
34689
34720
  env.model.dispatch("ADD_DATA_VALIDATION_RULE", {
34690
34721
  ranges,
34691
34722
  sheetId,
@@ -34716,7 +34747,7 @@ stores.inject(MyMetaStore, storeInstance);
34716
34747
  execute: (env) => {
34717
34748
  const activeSheetId = env.model.getters.getActiveSheetId();
34718
34749
  const position = env.model.getters.getSheetIds().indexOf(activeSheetId) + 1;
34719
- const sheetId = env.model.uuidGenerator.uuidv4();
34750
+ const sheetId = env.model.uuidGenerator.smallUuid();
34720
34751
  env.model.dispatch("CREATE_SHEET", { sheetId, position });
34721
34752
  env.model.dispatch("ACTIVATE_SHEET", { sheetIdFrom: activeSheetId, sheetIdTo: sheetId });
34722
34753
  },
@@ -39205,7 +39236,7 @@ stores.inject(MyMetaStore, storeInstance);
39205
39236
  get canTreatLabelsAsText() {
39206
39237
  const chart = this.env.model.getters.getChart(this.props.figureId);
39207
39238
  if (chart && chart instanceof LineChart) {
39208
- return canChartParseLabels(chart.labelRange, this.env.model.getters);
39239
+ return canChartParseLabels(chart.getDefinition(), chart.dataSets, chart.labelRange, this.env.model.getters);
39209
39240
  }
39210
39241
  return false;
39211
39242
  }
@@ -39282,7 +39313,7 @@ stores.inject(MyMetaStore, storeInstance);
39282
39313
  get canTreatLabelsAsText() {
39283
39314
  const chart = this.env.model.getters.getChart(this.props.figureId);
39284
39315
  if (chart && chart instanceof ScatterChart) {
39285
- return canChartParseLabels(chart.labelRange, this.env.model.getters);
39316
+ return canChartParseLabels(chart.getDefinition(), chart.dataSets, chart.labelRange, this.env.model.getters);
39286
39317
  }
39287
39318
  return false;
39288
39319
  }
@@ -41030,8 +41061,8 @@ stores.inject(MyMetaStore, storeInstance);
41030
41061
  document.body.style.cursor = "move";
41031
41062
  state.draggedItemId = args.draggedItemId;
41032
41063
  const container = direction === "horizontal"
41033
- ? new HorizontalContainer(args.containerEl)
41034
- : new VerticalContainer(args.containerEl);
41064
+ ? new HorizontalContainer(args.scrollableContainerEl)
41065
+ : new VerticalContainer(args.scrollableContainerEl);
41035
41066
  dndHelper = new DOMDndHelper({
41036
41067
  ...args,
41037
41068
  container,
@@ -41042,8 +41073,8 @@ stores.inject(MyMetaStore, storeInstance);
41042
41073
  const stopListening = startDnd(dndHelper.onMouseMove.bind(dndHelper), dndHelper.onMouseUp.bind(dndHelper));
41043
41074
  cleanupFns.push(stopListening);
41044
41075
  const onScroll = dndHelper.onScroll.bind(dndHelper);
41045
- args.containerEl.addEventListener("scroll", onScroll);
41046
- cleanupFns.push(() => args.containerEl.removeEventListener("scroll", onScroll));
41076
+ args.scrollableContainerEl.addEventListener("scroll", onScroll);
41077
+ cleanupFns.push(() => args.scrollableContainerEl.removeEventListener("scroll", onScroll));
41047
41078
  cleanupFns.push(dndHelper.destroy.bind(dndHelper));
41048
41079
  };
41049
41080
  owl.onWillUnmount(() => {
@@ -41500,7 +41531,7 @@ stores.inject(MyMetaStore, storeInstance);
41500
41531
  draggedItemId: cf.id,
41501
41532
  initialMousePosition: event.clientY,
41502
41533
  items: items,
41503
- containerEl: this.cfListRef.el,
41534
+ scrollableContainerEl: this.cfListRef.el,
41504
41535
  onDragEnd: (cfId, finalIndex) => this.onDragEnd(cfId, finalIndex),
41505
41536
  });
41506
41537
  }
@@ -42060,7 +42091,7 @@ stores.inject(MyMetaStore, storeInstance);
42060
42091
  this.originalEditedCf = undefined;
42061
42092
  }
42062
42093
  addConditionalFormat() {
42063
- const cfId = this.env.model.uuidGenerator.uuidv4();
42094
+ const cfId = this.env.model.uuidGenerator.smallUuid();
42064
42095
  this.env.model.dispatch("ADD_CONDITIONAL_FORMAT", {
42065
42096
  sheetId: this.activeSheetId,
42066
42097
  ranges: this.env.model.getters
@@ -43330,7 +43361,7 @@ stores.inject(MyMetaStore, storeInstance);
43330
43361
  .getSelectedZones()
43331
43362
  .map((zone) => zoneToXc(this.env.model.getters.getUnboundedZone(sheetId, zone)));
43332
43363
  return {
43333
- id: this.env.model.uuidGenerator.uuidv4(),
43364
+ id: this.env.model.uuidGenerator.smallUuid(),
43334
43365
  criterion: { type: "textContains", values: [""] },
43335
43366
  ranges,
43336
43367
  };
@@ -44682,6 +44713,7 @@ stores.inject(MyMetaStore, storeInstance);
44682
44713
  unusedGranularities: Object,
44683
44714
  dateGranularities: Array,
44684
44715
  datetimeGranularities: Array,
44716
+ getScrollableContainerEl: { type: Function, optional: true },
44685
44717
  pivotId: String,
44686
44718
  };
44687
44719
  dimensionsRef = owl.useRef("pivot-dimensions");
@@ -44715,7 +44747,7 @@ stores.inject(MyMetaStore, storeInstance);
44715
44747
  draggedItemId: dimension.nameWithGranularity,
44716
44748
  initialMousePosition: event.clientY,
44717
44749
  items: draggableItems,
44718
- containerEl: this.dimensionsRef.el,
44750
+ scrollableContainerEl: this.props.getScrollableContainerEl?.() || this.dimensionsRef.el,
44719
44751
  onDragEnd: (dimensionName, finalIndex) => {
44720
44752
  const originalIndex = draggableIds.findIndex((id) => id === dimensionName);
44721
44753
  if (originalIndex === finalIndex) {
@@ -44764,7 +44796,7 @@ stores.inject(MyMetaStore, storeInstance);
44764
44796
  draggedItemId: measure.id,
44765
44797
  initialMousePosition: event.clientY,
44766
44798
  items: draggableItems,
44767
- containerEl: this.dimensionsRef.el,
44799
+ scrollableContainerEl: this.props.getScrollableContainerEl?.() || this.dimensionsRef.el,
44768
44800
  onDragEnd: (measureName, finalIndex) => {
44769
44801
  const originalIndex = draggableIds.findIndex((id) => id === measureName);
44770
44802
  if (originalIndex === finalIndex) {
@@ -44947,8 +44979,8 @@ stores.inject(MyMetaStore, storeInstance);
44947
44979
  return this.env.model.getters.getPivotDisplayName(this.props.pivotId);
44948
44980
  }
44949
44981
  duplicatePivot() {
44950
- const newPivotId = this.env.model.uuidGenerator.uuidv4();
44951
- const newSheetId = this.env.model.uuidGenerator.uuidv4();
44982
+ const newPivotId = this.env.model.uuidGenerator.smallUuid();
44983
+ const newSheetId = this.env.model.uuidGenerator.smallUuid();
44952
44984
  const result = this.env.model.dispatch("DUPLICATE_PIVOT_IN_NEW_SHEET", {
44953
44985
  pivotId: this.props.pivotId,
44954
44986
  newPivotId,
@@ -45397,7 +45429,7 @@ stores.inject(MyMetaStore, storeInstance);
45397
45429
  rowTreeToRows(tree, parentRow) {
45398
45430
  return tree.flatMap((node) => {
45399
45431
  const row = {
45400
- indent: parentRow ? parentRow.indent + 1 : 0,
45432
+ indent: parentRow ? parentRow.indent + 1 : 1,
45401
45433
  fields: [...(parentRow?.fields || []), node.field],
45402
45434
  values: [...(parentRow?.values || []), node.value],
45403
45435
  };
@@ -45453,7 +45485,7 @@ stores.inject(MyMetaStore, storeInstance);
45453
45485
  pivotTableRows.push({
45454
45486
  fields: _fields,
45455
45487
  values: _values,
45456
- indent: index,
45488
+ indent: index + 1,
45457
45489
  });
45458
45490
  const record = groups[value];
45459
45491
  if (record) {
@@ -46451,6 +46483,7 @@ stores.inject(MyMetaStore, storeInstance);
46451
46483
  };
46452
46484
  store;
46453
46485
  state;
46486
+ pivotSidePanelRef = owl.useRef("pivotSidePanel");
46454
46487
  setup() {
46455
46488
  this.store = useLocalStore(PivotSidePanelStore, this.props.pivotId);
46456
46489
  this.state = owl.useState({
@@ -46479,6 +46512,9 @@ stores.inject(MyMetaStore, storeInstance);
46479
46512
  get definition() {
46480
46513
  return this.store.definition;
46481
46514
  }
46515
+ getScrollableContainerEl() {
46516
+ return this.pivotSidePanelRef.el;
46517
+ }
46482
46518
  onSelectionChanged(ranges) {
46483
46519
  this.state.rangeHasChanged = true;
46484
46520
  this.state.range = ranges[0];
@@ -47569,7 +47605,7 @@ stores.inject(MyMetaStore, storeInstance);
47569
47605
  this.state.selectedTemplateName = templateName;
47570
47606
  }
47571
47607
  onConfirm() {
47572
- const tableStyleId = this.props.styleId || this.env.model.uuidGenerator.uuidv4();
47608
+ const tableStyleId = this.props.styleId || this.env.model.uuidGenerator.smallUuid();
47573
47609
  this.env.model.dispatch("CREATE_TABLE_STYLE", {
47574
47610
  tableStyleId,
47575
47611
  tableStyleName: this.state.styleName,
@@ -56143,7 +56179,7 @@ stores.inject(MyMetaStore, storeInstance);
56143
56179
  ? "Success" /* CommandResult.Success */
56144
56180
  : "InvalidColor" /* CommandResult.InvalidColor */;
56145
56181
  case "DELETE_SHEET":
56146
- return this.orderedSheetIds.length > 1
56182
+ return this.getVisibleSheetIds().length > 1
56147
56183
  ? "Success" /* CommandResult.Success */
56148
56184
  : "NotEnoughSheets" /* CommandResult.NotEnoughSheets */;
56149
56185
  case "ADD_COLUMNS_ROWS":
@@ -63502,6 +63538,15 @@ stores.inject(MyMetaStore, storeInstance);
63502
63538
  }
63503
63539
  this.sendPendingMessage();
63504
63540
  }
63541
+ dropPendingRevision(revisionId) {
63542
+ this.revisions.drop(revisionId);
63543
+ const revisionIds = this.pendingMessages
63544
+ .filter((message) => message.type === "REMOTE_REVISION")
63545
+ .map((message) => message.nextRevisionId);
63546
+ this.trigger("pending-revisions-dropped", { revisionIds });
63547
+ this.waitingAck = false;
63548
+ this.waitingUndoRedoAck = false;
63549
+ }
63505
63550
  /**
63506
63551
  * Send the next pending message
63507
63552
  */
@@ -63516,13 +63561,7 @@ stores.inject(MyMetaStore, storeInstance);
63516
63561
  * The command is empty, we have to drop all the next local revisions
63517
63562
  * to avoid issues with undo/redo
63518
63563
  */
63519
- this.revisions.drop(revision.id);
63520
- const revisionIds = this.pendingMessages
63521
- .filter((message) => message.type === "REMOTE_REVISION")
63522
- .map((message) => message.nextRevisionId);
63523
- this.trigger("pending-revisions-dropped", { revisionIds });
63524
- this.waitingAck = false;
63525
- this.waitingUndoRedoAck = false;
63564
+ this.dropPendingRevision(revision.id);
63526
63565
  this.pendingMessages = [];
63527
63566
  return;
63528
63567
  }
@@ -63549,7 +63588,6 @@ stores.inject(MyMetaStore, storeInstance);
63549
63588
  switch (message.type) {
63550
63589
  case "REMOTE_REVISION":
63551
63590
  case "REVISION_REDONE":
63552
- case "REVISION_UNDONE":
63553
63591
  case "SNAPSHOT_CREATED":
63554
63592
  this.waitingAck = false;
63555
63593
  this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
@@ -63558,6 +63596,27 @@ stores.inject(MyMetaStore, storeInstance);
63558
63596
  this.lastRevisionMessage = message;
63559
63597
  this.sendPendingMessage();
63560
63598
  break;
63599
+ case "REVISION_UNDONE": {
63600
+ this.waitingAck = false;
63601
+ this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
63602
+ const pendingRemoteRevisions = this.pendingMessages.filter((message) => message.type === "REMOTE_REVISION");
63603
+ const firstTransformedRevisionIndex = pendingRemoteRevisions.findIndex((message) => !deepEquals(message.commands, this.revisions.get(message.nextRevisionId).commands));
63604
+ if (firstTransformedRevisionIndex !== -1) {
63605
+ /**
63606
+ * Some revisions undergo transformations that may cause issues with
63607
+ * undo/redo if the transformation is destructive (we don't get back
63608
+ * the original command by transforming it with the inverse).
63609
+ * To prevent these problems, we must discard all subsequent local
63610
+ * revisions.
63611
+ */
63612
+ this.dropPendingRevision(this.pendingMessages[firstTransformedRevisionIndex].nextRevisionId);
63613
+ this.pendingMessages = this.pendingMessages.slice(0, firstTransformedRevisionIndex);
63614
+ }
63615
+ this.serverRevisionId = message.nextRevisionId;
63616
+ this.processedRevisions.add(message.nextRevisionId);
63617
+ this.sendPendingMessage();
63618
+ break;
63619
+ }
63561
63620
  }
63562
63621
  }
63563
63622
  isAlreadyProcessed(message) {
@@ -65028,23 +65087,23 @@ stores.inject(MyMetaStore, storeInstance);
65028
65087
  function repeatCreateChartCommand(getters, cmd) {
65029
65088
  return {
65030
65089
  ...repeatSheetDependantCommand(getters, cmd),
65031
- id: uuidGenerator.uuidv4(),
65090
+ id: uuidGenerator.smallUuid(),
65032
65091
  };
65033
65092
  }
65034
65093
  function repeatCreateImageCommand(getters, cmd) {
65035
65094
  return {
65036
65095
  ...repeatSheetDependantCommand(getters, cmd),
65037
- figureId: uuidGenerator.uuidv4(),
65096
+ figureId: uuidGenerator.smallUuid(),
65038
65097
  };
65039
65098
  }
65040
65099
  function repeatCreateFigureCommand(getters, cmd) {
65041
65100
  const newCmd = repeatSheetDependantCommand(getters, cmd);
65042
- newCmd.figure.id = uuidGenerator.uuidv4();
65101
+ newCmd.figure.id = uuidGenerator.smallUuid();
65043
65102
  return newCmd;
65044
65103
  }
65045
65104
  function repeatCreateSheetCommand(getters, cmd) {
65046
65105
  const newCmd = deepCopy(cmd);
65047
- newCmd.sheetId = uuidGenerator.uuidv4();
65106
+ newCmd.sheetId = uuidGenerator.smallUuid();
65048
65107
  const sheetName = cmd.name || getters.getSheet(getters.getActiveSheetId()).name;
65049
65108
  // Extract the prefix of the sheet name (everything before the number at the end of the name)
65050
65109
  const namePrefix = sheetName.match(/(.+?)\d*$/)?.[1] || sheetName;
@@ -66507,23 +66566,7 @@ stores.inject(MyMetaStore, storeInstance);
66507
66566
  gridSelection: deepCopy(gridSelection),
66508
66567
  };
66509
66568
  }
66510
- if (!this.getters.tryGetSheet(this.getters.getActiveSheetId())) {
66511
- const currentSheetIds = this.getters.getVisibleSheetIds();
66512
- this.activeSheet = this.getters.getSheet(currentSheetIds[0]);
66513
- if (this.activeSheet.id in this.sheetsData) {
66514
- const { anchor } = this.clipSelection(this.activeSheet.id, this.sheetsData[this.activeSheet.id].gridSelection);
66515
- this.selectCell(anchor.cell.col, anchor.cell.row);
66516
- }
66517
- else {
66518
- this.selectCell(0, 0);
66519
- }
66520
- const { col, row } = this.gridSelection.anchor.cell;
66521
- this.moveClient({
66522
- sheetId: this.getters.getActiveSheetId(),
66523
- col,
66524
- row,
66525
- });
66526
- }
66569
+ this.fallbackToVisibleSheet();
66527
66570
  const sheetId = this.getters.getActiveSheetId();
66528
66571
  this.gridSelection.zones = this.gridSelection.zones.map((z) => this.getters.expandZone(sheetId, z));
66529
66572
  this.gridSelection.anchor.zone = this.getters.expandZone(sheetId, this.gridSelection.anchor.zone);
@@ -66533,6 +66576,7 @@ stores.inject(MyMetaStore, storeInstance);
66533
66576
  }
66534
66577
  }
66535
66578
  finalize() {
66579
+ this.fallbackToVisibleSheet();
66536
66580
  /** Any change to the selection has to be reflected in the selection processor. */
66537
66581
  this.selection.resetDefaultAnchor(this, deepCopy(this.gridSelection.anchor));
66538
66582
  }
@@ -66843,6 +66887,25 @@ stores.inject(MyMetaStore, storeInstance);
66843
66887
  }
66844
66888
  return "Success" /* CommandResult.Success */;
66845
66889
  }
66890
+ fallbackToVisibleSheet() {
66891
+ if (!this.getters.tryGetSheet(this.getters.getActiveSheetId())) {
66892
+ const currentSheetIds = this.getters.getVisibleSheetIds();
66893
+ this.activeSheet = this.getters.getSheet(currentSheetIds[0]);
66894
+ if (this.activeSheet.id in this.sheetsData) {
66895
+ const { anchor } = this.clipSelection(this.activeSheet.id, this.sheetsData[this.activeSheet.id].gridSelection);
66896
+ this.selectCell(anchor.cell.col, anchor.cell.row);
66897
+ }
66898
+ else {
66899
+ this.selectCell(0, 0);
66900
+ }
66901
+ const { col, row } = this.gridSelection.anchor.cell;
66902
+ this.moveClient({
66903
+ sheetId: this.getters.getActiveSheetId(),
66904
+ col,
66905
+ row,
66906
+ });
66907
+ }
66908
+ }
66846
66909
  //-------------------------------------------
66847
66910
  // Helpers for extensions
66848
66911
  // ------------------------------------------
@@ -68843,7 +68906,7 @@ stores.inject(MyMetaStore, storeInstance);
68843
68906
  clickAddSheet(ev) {
68844
68907
  const activeSheetId = this.env.model.getters.getActiveSheetId();
68845
68908
  const position = this.env.model.getters.getSheetIds().findIndex((sheetId) => sheetId === activeSheetId) + 1;
68846
- const sheetId = this.env.model.uuidGenerator.uuidv4();
68909
+ const sheetId = this.env.model.uuidGenerator.smallUuid();
68847
68910
  const name = this.env.model.getters.getNextSheetName(_t("Sheet"));
68848
68911
  this.env.model.dispatch("CREATE_SHEET", { sheetId, position, name });
68849
68912
  this.env.model.dispatch("ACTIVATE_SHEET", { sheetIdFrom: activeSheetId, sheetIdTo: sheetId });
@@ -68960,7 +69023,7 @@ stores.inject(MyMetaStore, storeInstance);
68960
69023
  draggedItemId: sheetId,
68961
69024
  initialMousePosition: event.clientX,
68962
69025
  items: sheets,
68963
- containerEl: this.sheetListRef.el,
69026
+ scrollableContainerEl: this.sheetListRef.el,
68964
69027
  onDragEnd: (sheetId, finalIndex) => this.onDragEnd(sheetId, finalIndex),
68965
69028
  });
68966
69029
  }
@@ -69858,6 +69921,10 @@ stores.inject(MyMetaStore, storeInstance);
69858
69921
  </svg>
69859
69922
  `;
69860
69923
  css /* scss */ `
69924
+ .o-topbar-composer-container {
69925
+ height: ${TOPBAR_TOOLBAR_HEIGHT}px;
69926
+ }
69927
+
69861
69928
  .o-topbar-composer {
69862
69929
  height: fit-content;
69863
69930
  margin-top: -1px;
@@ -71131,7 +71198,7 @@ stores.inject(MyMetaStore, storeInstance);
71131
71198
  }
71132
71199
  /**
71133
71200
  * Drop the operation and all following operations in every
71134
- * branch
71201
+ * branches
71135
71202
  */
71136
71203
  drop(operationId) {
71137
71204
  for (const branch of this.branches) {
@@ -74576,7 +74643,7 @@ stores.inject(MyMetaStore, storeInstance);
74576
74643
  }
74577
74644
  setupConfig(config) {
74578
74645
  const client = config.client || {
74579
- id: this.uuidGenerator.uuidv4(),
74646
+ id: this.uuidGenerator.smallUuid(),
74580
74647
  name: _t("Anonymous").toString(),
74581
74648
  };
74582
74649
  const transportService = config.transportService || new LocalTransportService();
@@ -75099,9 +75166,9 @@ stores.inject(MyMetaStore, storeInstance);
75099
75166
  exports.tokenize = tokenize;
75100
75167
 
75101
75168
 
75102
- __info__.version = "18.1.6";
75103
- __info__.date = "2025-02-05T07:18:57.089Z";
75104
- __info__.hash = "f5b97e0";
75169
+ __info__.version = "18.1.8";
75170
+ __info__.date = "2025-02-14T08:42:08.322Z";
75171
+ __info__.hash = "02682f4";
75105
75172
 
75106
75173
 
75107
75174
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);