@odoo/o-spreadsheet 19.1.0-alpha.0 → 19.1.0-alpha.2

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 19.1.0-alpha.0
6
- * @date 2025-09-11T07:49:49.483Z
7
- * @hash 587c928
5
+ * @version 19.1.0-alpha.2
6
+ * @date 2025-09-19T07:26:49.306Z
7
+ * @hash 8cc543d
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -588,7 +588,6 @@
588
588
  const CANVAS_SHIFT = 0.5;
589
589
  // Colors
590
590
  const HIGHLIGHT_COLOR = "#017E84";
591
- const BACKGROUND_GRAY_COLOR = "#f5f5f5";
592
591
  const BACKGROUND_HEADER_COLOR = "#F8F9FA";
593
592
  const BACKGROUND_HEADER_SELECTED_COLOR = "#E8EAED";
594
593
  const BACKGROUND_HEADER_ACTIVE_COLOR = "#595959";
@@ -598,15 +597,10 @@
598
597
  const HEADER_BORDER_COLOR = "#C0C0C0";
599
598
  const CELL_BORDER_COLOR = "#E2E3E3";
600
599
  const BACKGROUND_CHART_COLOR = "#FFFFFF";
601
- const DISABLED_TEXT_COLOR = "#CACACA";
602
600
  const DEFAULT_COLOR_SCALE_MIDPOINT_COLOR = 0xb6d7a8;
603
601
  const LINK_COLOR = HIGHLIGHT_COLOR;
604
602
  const FILTERS_COLOR = "#188038";
605
- const SEPARATOR_COLOR = "#E0E2E4";
606
- const ICONS_COLOR = "#4A4F59";
607
- const HEADER_GROUPING_BACKGROUND_COLOR = "#F5F5F5";
608
603
  const HEADER_GROUPING_BORDER_COLOR = "#999";
609
- const GRID_BORDER_COLOR = "#E2E3E3";
610
604
  const FROZEN_PANE_HEADER_BORDER_COLOR = "#BCBCBC";
611
605
  const FROZEN_PANE_BORDER_COLOR = "#DADFE8";
612
606
  const COMPOSER_ASSISTANT_COLOR = "#9B359B";
@@ -618,30 +612,9 @@
618
612
  const GRAY_900 = "#111827";
619
613
  const GRAY_300 = "#D8DADD";
620
614
  const GRAY_200 = "#E7E9ED";
621
- const GRAY_100 = "#F9FAFB";
622
615
  const TEXT_BODY = "#374151";
623
616
  const TEXT_BODY_MUTED = TEXT_BODY + "C2";
624
- const TEXT_HEADING = "#111827";
625
- const PRIMARY_BUTTON_BG = "#714B67";
626
- const PRIMARY_BUTTON_HOVER_BG = "#624159";
627
- const PRIMARY_BUTTON_ACTIVE_BG = "#f1edf0";
628
- const BUTTON_BG = GRAY_200;
629
- const BUTTON_HOVER_BG = GRAY_300;
630
- const BUTTON_HOVER_TEXT_COLOR = "#111827";
631
- const BUTTON_ACTIVE_BG = "#e6f2f3";
632
- const BUTTON_ACTIVE_TEXT_COLOR = "#111827";
633
617
  const ACTION_COLOR = HIGHLIGHT_COLOR;
634
- const ACTION_COLOR_HOVER = "#01585c";
635
- const ALERT_WARNING_BG = "#FBEBCC";
636
- const ALERT_WARNING_BORDER = "#F8E2B3";
637
- const ALERT_WARNING_TEXT_COLOR = "#946D23";
638
- const ALERT_DANGER_BG = "#D44C591A";
639
- const ALERT_DANGER_BORDER = "#C34A41";
640
- const ALERT_DANGER_TEXT_COLOR = "#C34A41";
641
- const ALERT_INFO_BG = "#CDEDF1";
642
- const ALERT_INFO_BORDER = "#98DBE2";
643
- const ALERT_INFO_TEXT_COLOR = "#09414A";
644
- const BADGE_SELECTED_COLOR = "#E6F2F3";
645
618
  const CHART_PADDING = 20;
646
619
  const CHART_PADDING_BOTTOM = 10;
647
620
  const CHART_PADDING_TOP = 15;
@@ -739,9 +712,7 @@
739
712
  const HEADER_HEIGHT = 26;
740
713
  const HEADER_WIDTH = 48;
741
714
  const DESKTOP_TOPBAR_TOOLBAR_HEIGHT = 34;
742
- const MOBILE_TOPBAR_TOOLBAR_HEIGHT = 44;
743
715
  const DESKTOP_BOTTOMBAR_HEIGHT = 36;
744
- const MOBILE_BOTTOMBAR_HEIGHT = 44;
745
716
  const DEFAULT_CELL_WIDTH = 96;
746
717
  const DEFAULT_CELL_HEIGHT = 23;
747
718
  const SCROLLBAR_WIDTH = 15;
@@ -749,7 +720,6 @@
749
720
  const ICON_EDGE_LENGTH = 18;
750
721
  const MIN_CF_ICON_MARGIN = 4;
751
722
  const MIN_CELL_TEXT_MARGIN = 4;
752
- const CF_ICON_EDGE_LENGTH = 15;
753
723
  const PADDING_AUTORESIZE_VERTICAL = 3;
754
724
  const PADDING_AUTORESIZE_HORIZONTAL = MIN_CELL_TEXT_MARGIN;
755
725
  const GROUP_LAYER_WIDTH = 21;
@@ -764,11 +734,6 @@
764
734
  const MENU_WIDTH = 250;
765
735
  const MENU_VERTICAL_PADDING = 6;
766
736
  const DESKTOP_MENU_ITEM_HEIGHT = 26;
767
- const MOBILE_MENU_ITEM_HEIGHT = 35;
768
- const MENU_ITEM_PADDING_HORIZONTAL = 11;
769
- const MENU_ITEM_PADDING_VERTICAL = 4;
770
- const MENU_SEPARATOR_BORDER_WIDTH = 1;
771
- const MENU_SEPARATOR_PADDING = 5;
772
737
  // Style
773
738
  const DEFAULT_STYLE = {
774
739
  align: "left",
@@ -822,23 +787,6 @@
822
787
  const FORBIDDEN_SHEETNAME_CHARS_IN_EXCEL_REGEX = /'|\*|\?|\/|\\|\[|\]/;
823
788
  // Cells
824
789
  const FORMULA_REF_IDENTIFIER = "|";
825
- // Components
826
- var ComponentsImportance;
827
- (function (ComponentsImportance) {
828
- ComponentsImportance[ComponentsImportance["Grid"] = 0] = "Grid";
829
- ComponentsImportance[ComponentsImportance["Highlight"] = 5] = "Highlight";
830
- ComponentsImportance[ComponentsImportance["HeaderGroupingButton"] = 6] = "HeaderGroupingButton";
831
- ComponentsImportance[ComponentsImportance["Figure"] = 10] = "Figure";
832
- ComponentsImportance[ComponentsImportance["ScrollBar"] = 15] = "ScrollBar";
833
- ComponentsImportance[ComponentsImportance["GridPopover"] = 19] = "GridPopover";
834
- ComponentsImportance[ComponentsImportance["GridComposer"] = 20] = "GridComposer";
835
- ComponentsImportance[ComponentsImportance["IconPicker"] = 25] = "IconPicker";
836
- ComponentsImportance[ComponentsImportance["TopBarComposer"] = 30] = "TopBarComposer";
837
- ComponentsImportance[ComponentsImportance["Popover"] = 35] = "Popover";
838
- ComponentsImportance[ComponentsImportance["FigureAnchor"] = 1000] = "FigureAnchor";
839
- ComponentsImportance[ComponentsImportance["FigureSnapLine"] = 1001] = "FigureSnapLine";
840
- ComponentsImportance[ComponentsImportance["FigureTooltip"] = 1002] = "FigureTooltip";
841
- })(ComponentsImportance || (ComponentsImportance = {}));
842
790
  let DEFAULT_SHEETVIEW_SIZE = 0;
843
791
  function getDefaultSheetViewSize() {
844
792
  return DEFAULT_SHEETVIEW_SIZE;
@@ -889,6 +837,7 @@
889
837
  ARG_SEPARATOR: functionColor,
890
838
  ORPHAN_RIGHT_PAREN: "#ff0000",
891
839
  };
840
+ const DRAG_THRESHOLD = 5; // in pixels, to avoid unwanted drag when clicking
892
841
 
893
842
  //------------------------------------------------------------------------------
894
843
  // Miscellaneous
@@ -1367,8 +1316,19 @@
1367
1316
  },
1368
1317
  }[funcName];
1369
1318
  }
1319
+ /**
1320
+ * Removes the specified indexes from the array.
1321
+ * Sparse (empty) elements are transformed to undefined (unless their index is explicitly removed).
1322
+ */
1370
1323
  function removeIndexesFromArray(array, indexes) {
1371
- return array.filter((_, index) => !indexes.includes(index));
1324
+ const toRemove = new Set(indexes);
1325
+ const newArray = [];
1326
+ for (let i = 0; i < array.length; i++) {
1327
+ if (!toRemove.has(i)) {
1328
+ newArray.push(array[i]);
1329
+ }
1330
+ }
1331
+ return newArray;
1372
1332
  }
1373
1333
  function insertItemsAtIndex(array, items, index) {
1374
1334
  const newArray = [...array];
@@ -10664,153 +10624,6 @@ stores.inject(MyMetaStore, storeInstance);
10664
10624
  }
10665
10625
  }
10666
10626
 
10667
- /**
10668
- * This file is largely inspired by owl 1.
10669
- * `css` tag has been removed from owl 2 without workaround to manage css.
10670
- * So, the solution was to import the behavior of owl 1 directly in our
10671
- * codebase, with one difference: the css is added to the sheet as soon as the
10672
- * css tag is executed. In owl 1, the css was added as soon as a Component was
10673
- * created for the first time.
10674
- */
10675
- const STYLESHEETS = {};
10676
- let nextId = 0;
10677
- /**
10678
- * CSS tag helper for defining inline stylesheets. With this, one can simply define
10679
- * an inline stylesheet with just the following code:
10680
- * ```js
10681
- * css`.component-a { color: red; }`;
10682
- * ```
10683
- */
10684
- function css(strings, ...args) {
10685
- const name = `__sheet__${nextId++}`;
10686
- const value = String.raw(strings, ...args);
10687
- registerSheet(name, value);
10688
- activateSheet(name);
10689
- return name;
10690
- }
10691
- function processSheet(str) {
10692
- const tokens = str.split(/(\{|\}|;)/).map((s) => s.trim());
10693
- const selectorStack = [];
10694
- const parts = [];
10695
- let rules = [];
10696
- function generateSelector(stackIndex, parentSelector) {
10697
- const parts = [];
10698
- for (const selector of selectorStack[stackIndex]) {
10699
- let part = (parentSelector && parentSelector + " " + selector) || selector;
10700
- if (part.includes("&")) {
10701
- part = selector.replace(/&/g, parentSelector || "");
10702
- }
10703
- if (stackIndex < selectorStack.length - 1) {
10704
- part = generateSelector(stackIndex + 1, part);
10705
- }
10706
- parts.push(part);
10707
- }
10708
- return parts.join(", ");
10709
- }
10710
- function generateRules() {
10711
- if (rules.length) {
10712
- parts.push(generateSelector(0) + " {");
10713
- parts.push(...rules);
10714
- parts.push("}");
10715
- rules = [];
10716
- }
10717
- }
10718
- while (tokens.length) {
10719
- const token = tokens.shift();
10720
- if (token === "}") {
10721
- generateRules();
10722
- selectorStack.pop();
10723
- }
10724
- else {
10725
- if (tokens[0] === "{") {
10726
- generateRules();
10727
- selectorStack.push(token.split(/\s*,\s*/));
10728
- tokens.shift();
10729
- }
10730
- if (tokens[0] === ";") {
10731
- rules.push(" " + token + ";");
10732
- }
10733
- }
10734
- }
10735
- return parts.join("\n");
10736
- }
10737
- function registerSheet(id, css) {
10738
- const sheet = document.createElement("style");
10739
- sheet.textContent = processSheet(css);
10740
- STYLESHEETS[id] = sheet;
10741
- }
10742
- function activateSheet(id) {
10743
- const sheet = STYLESHEETS[id];
10744
- sheet.setAttribute("component", id);
10745
- document.head.appendChild(sheet);
10746
- }
10747
- function getTextDecoration({ strikethrough, underline, }) {
10748
- if (!strikethrough && !underline) {
10749
- return "none";
10750
- }
10751
- return `${strikethrough ? "line-through" : ""} ${underline ? "underline" : ""}`;
10752
- }
10753
- /**
10754
- * Convert the cell style to CSS properties.
10755
- */
10756
- function cellStyleToCss(style) {
10757
- const attributes = cellTextStyleToCss(style);
10758
- if (!style)
10759
- return attributes;
10760
- if (style.fillColor) {
10761
- attributes["background"] = style.fillColor;
10762
- }
10763
- return attributes;
10764
- }
10765
- /**
10766
- * Convert the cell text style to CSS properties.
10767
- */
10768
- function cellTextStyleToCss(style) {
10769
- const attributes = {};
10770
- if (!style)
10771
- return attributes;
10772
- if (style.bold) {
10773
- attributes["font-weight"] = "bold";
10774
- }
10775
- if (style.italic) {
10776
- attributes["font-style"] = "italic";
10777
- }
10778
- if (style.fontSize) {
10779
- attributes["font-size"] = `${style.fontSize}px`;
10780
- }
10781
- if (style.strikethrough || style.underline) {
10782
- let decoration = style.strikethrough ? "line-through" : "";
10783
- decoration = style.underline ? decoration + " underline" : decoration;
10784
- attributes["text-decoration"] = decoration;
10785
- }
10786
- if (style.textColor) {
10787
- attributes["color"] = style.textColor;
10788
- }
10789
- return attributes;
10790
- }
10791
- /**
10792
- * Transform CSS properties into a CSS string.
10793
- */
10794
- function cssPropertiesToCss(attributes) {
10795
- let styleStr = "";
10796
- for (const attName in attributes) {
10797
- if (!attributes[attName]) {
10798
- continue;
10799
- }
10800
- styleStr += `${attName}:${attributes[attName]}; `;
10801
- }
10802
- return styleStr;
10803
- }
10804
- function getElementMargins(el) {
10805
- const style = window.getComputedStyle(el);
10806
- return {
10807
- top: parseInt(style.marginTop, 10) || 0,
10808
- bottom: parseInt(style.marginBottom, 10) || 0,
10809
- left: parseInt(style.marginLeft, 10) || 0,
10810
- right: parseInt(style.marginRight, 10) || 0,
10811
- };
10812
- }
10813
-
10814
10627
  const chartJsExtensionRegistry = new Registry();
10815
10628
  function areChartJSExtensionsLoaded() {
10816
10629
  return !!window.Chart.registry.plugins.get("chartShowValuesPlugin");
@@ -16083,8 +15896,9 @@ stores.inject(MyMetaStore, storeInstance);
16083
15896
  }
16084
15897
 
16085
15898
  function sortMatrix(matrix, locale, ...criteria) {
16086
- for (const [i, value] of criteria.entries()) {
16087
- assert(value !== undefined, _t("Value for parameter %d is missing, while the function [[FUNCTION_NAME]] expect a number or a range.", i + 1));
15899
+ for (let i = 0; i < criteria.length; i++) {
15900
+ const param = i % 2 === 0 ? "sort_column" : "is_ascending";
15901
+ assert(criteria[i] !== undefined, _t("Value for parameter %s is missing in [[FUNCTION_NAME]].", param));
16088
15902
  }
16089
15903
  const sortingOrders = [];
16090
15904
  const sortColumns = [];
@@ -24032,15 +23846,6 @@ stores.inject(MyMetaStore, storeInstance);
24032
23846
  return bars.find((bar, i) => i > startIndex && bar.height !== 0);
24033
23847
  }
24034
23848
 
24035
- css /* scss */ `
24036
- .o-spreadsheet {
24037
- .o-chart-custom-tooltip {
24038
- font-size: 12px;
24039
- background-color: #fff;
24040
- z-index: ${ComponentsImportance.FigureTooltip};
24041
- }
24042
- }
24043
- `;
24044
23849
  chartJsExtensionRegistry.add("chartShowValuesPlugin", {
24045
23850
  register: (Chart) => Chart.register(chartShowValuesPlugin),
24046
23851
  unregister: (Chart) => Chart.unregister(chartShowValuesPlugin),
@@ -24538,18 +24343,15 @@ stores.inject(MyMetaStore, storeInstance);
24538
24343
  return {
24539
24344
  title: {
24540
24345
  ...chart.title,
24541
- // chart titles are extracted from .json files and they are translated at runtime here
24542
- text: chart.title.text ? _t(chart.title.text) : "",
24346
+ text: chart.title.text ? getters.dynamicTranslate(chart.title.text) : "",
24543
24347
  },
24544
24348
  keyValue: formattedKeyValue,
24545
- keyDescr: chart.keyDescr?.text
24546
- ? _t(chart.keyDescr.text) // descriptions are extracted from .json files and they are translated at runtime here
24547
- : "",
24349
+ keyDescr: chart.keyDescr?.text ? getters.dynamicTranslate(chart.keyDescr.text) : "",
24548
24350
  baselineDisplay,
24549
24351
  baselineArrow: getBaselineArrowDirection(baselineCell, keyValueCell, chart.baselineMode),
24550
24352
  baselineColor: getBaselineColor(baselineCell, chart.baselineMode, keyValueCell, chart.baselineColorUp, chart.baselineColorDown),
24551
24353
  baselineDescr: chart.baselineMode !== "progress" && chart.baselineDescr?.text
24552
- ? _t(chart.baselineDescr.text) // descriptions are extracted from .json files and they are translated at runtime here
24354
+ ? getters.dynamicTranslate(chart.baselineDescr.text)
24553
24355
  : "",
24554
24356
  fontColor,
24555
24357
  background,
@@ -24849,9 +24651,8 @@ stores.inject(MyMetaStore, storeInstance);
24849
24651
  return this.env.model.getters.getChartRuntime(this.props.chartId);
24850
24652
  }
24851
24653
  get title() {
24852
- const title = this.env.model.getters.getChartDefinition(this.props.chartId).title.text ?? "";
24853
- // chart titles are extracted from .json files and they are translated at runtime here
24854
- return _t(title);
24654
+ const title = this.env.model.getters.getChartDefinition(this.props.chartId).title.text;
24655
+ return title ? this.env.model.getters.dynamicTranslate(title) : "";
24855
24656
  }
24856
24657
  setup() {
24857
24658
  owl.useEffect(this.createChart.bind(this), () => {
@@ -27024,12 +26825,12 @@ stores.inject(MyMetaStore, storeInstance);
27024
26825
  return axisId || "y";
27025
26826
  }
27026
26827
 
27027
- function getChartTitle(definition) {
26828
+ function getChartTitle(definition, getters) {
27028
26829
  const chartTitle = definition.title;
27029
26830
  const fontColor = chartMutedFontColor(definition.background);
27030
26831
  return {
27031
26832
  display: !!chartTitle.text,
27032
- text: _t(chartTitle.text),
26833
+ text: chartTitle.text ? getters.dynamicTranslate(chartTitle.text) : "",
27033
26834
  color: chartTitle?.color ?? fontColor,
27034
26835
  align: chartTitle.align === "center" ? "center" : chartTitle.align === "right" ? "end" : "start",
27035
26836
  font: {
@@ -27597,7 +27398,7 @@ stores.inject(MyMetaStore, storeInstance);
27597
27398
  layout: getChartLayout(definition, chartData),
27598
27399
  scales: getBarChartScales(definition, chartData),
27599
27400
  plugins: {
27600
- title: getChartTitle(definition),
27401
+ title: getChartTitle(definition, getters),
27601
27402
  legend: getBarChartLegend(definition),
27602
27403
  tooltip: getBarChartTooltip(definition, chartData),
27603
27404
  chartShowValuesPlugin: getChartShowValues(definition, chartData),
@@ -27784,13 +27585,6 @@ stores.inject(MyMetaStore, storeInstance);
27784
27585
  },
27785
27586
  };
27786
27587
 
27787
- css /* scss */ `
27788
- .o-spreadsheet {
27789
- .o-master-chart-container {
27790
- height: ${MASTER_CHART_HEIGHT}px;
27791
- }
27792
- }
27793
- `;
27794
27588
  chartJsExtensionRegistry.add("zoomWindowPlugin", {
27795
27589
  register: (Chart) => Chart.register(zoomWindowPlugin),
27796
27590
  unregister: (Chart) => Chart.unregister(zoomWindowPlugin),
@@ -28828,7 +28622,7 @@ stores.inject(MyMetaStore, storeInstance);
28828
28622
  layout: getChartLayout(definition, chartData),
28829
28623
  scales: getBarChartScales(definition, chartData),
28830
28624
  plugins: {
28831
- title: getChartTitle(definition),
28625
+ title: getChartTitle(definition, getters),
28832
28626
  legend: getComboChartLegend(definition),
28833
28627
  tooltip: getBarChartTooltip(definition, chartData),
28834
28628
  chartShowValuesPlugin: getChartShowValues(definition, chartData),
@@ -28974,7 +28768,7 @@ stores.inject(MyMetaStore, storeInstance);
28974
28768
  layout: getChartLayout(definition, chartData),
28975
28769
  scales: getFunnelChartScales(definition, chartData),
28976
28770
  plugins: {
28977
- title: getChartTitle(definition),
28771
+ title: getChartTitle(definition, getters),
28978
28772
  legend: { display: false },
28979
28773
  tooltip: getFunnelChartTooltip(definition, chartData),
28980
28774
  chartShowValuesPlugin: getChartShowValues(definition, chartData),
@@ -29211,8 +29005,7 @@ stores.inject(MyMetaStore, storeInstance);
29211
29005
  background: getters.getStyleOfSingleCellChart(chart.background, dataRange).background,
29212
29006
  title: {
29213
29007
  ...chart.title,
29214
- // chart titles are extracted from .json files and they are translated at runtime here
29215
- text: _t(chart.title.text ?? ""),
29008
+ text: chart.title.text ? getters.dynamicTranslate(chart.title.text) : "",
29216
29009
  },
29217
29010
  minValue: {
29218
29011
  value: minValue,
@@ -29396,7 +29189,7 @@ stores.inject(MyMetaStore, storeInstance);
29396
29189
  layout: getChartLayout(definition, chartData),
29397
29190
  scales: getGeoChartScales(definition, chartData),
29398
29191
  plugins: {
29399
- title: getChartTitle(definition),
29192
+ title: getChartTitle(definition, getters),
29400
29193
  tooltip: getGeoChartTooltip(definition, chartData),
29401
29194
  legend: { display: false },
29402
29195
  },
@@ -29561,7 +29354,7 @@ stores.inject(MyMetaStore, storeInstance);
29561
29354
  layout: getChartLayout(definition, chartData),
29562
29355
  scales: getLineChartScales(definition, chartData),
29563
29356
  plugins: {
29564
- title: getChartTitle(definition),
29357
+ title: getChartTitle(definition, getters),
29565
29358
  legend: getLineChartLegend(definition),
29566
29359
  tooltip: getLineChartTooltip(definition, chartData),
29567
29360
  chartShowValuesPlugin: getChartShowValues(definition, chartData),
@@ -29698,7 +29491,7 @@ stores.inject(MyMetaStore, storeInstance);
29698
29491
  : undefined,
29699
29492
  layout: getChartLayout(definition, chartData),
29700
29493
  plugins: {
29701
- title: getChartTitle(definition),
29494
+ title: getChartTitle(definition, getters),
29702
29495
  legend: getPieChartLegend(definition, chartData),
29703
29496
  tooltip: getPieChartTooltip(definition, chartData),
29704
29497
  chartShowValuesPlugin: getChartShowValues(definition, chartData),
@@ -29852,7 +29645,7 @@ stores.inject(MyMetaStore, storeInstance);
29852
29645
  layout: getChartLayout(definition, chartData),
29853
29646
  scales: getPyramidChartScales(definition, chartData),
29854
29647
  plugins: {
29855
- title: getChartTitle(definition),
29648
+ title: getChartTitle(definition, getters),
29856
29649
  legend: getBarChartLegend(definition),
29857
29650
  tooltip: getPyramidChartTooltip(definition, chartData),
29858
29651
  chartShowValuesPlugin: getPyramidChartShowValues(definition, chartData),
@@ -30001,7 +29794,7 @@ stores.inject(MyMetaStore, storeInstance);
30001
29794
  layout: getChartLayout(definition, chartData),
30002
29795
  scales: getRadarChartScales(definition, chartData),
30003
29796
  plugins: {
30004
- title: getChartTitle(definition),
29797
+ title: getChartTitle(definition, getters),
30005
29798
  legend: getRadarChartLegend(definition),
30006
29799
  tooltip: getRadarChartTooltip(definition, chartData),
30007
29800
  chartShowValuesPlugin: getChartShowValues(definition, chartData),
@@ -30156,7 +29949,7 @@ stores.inject(MyMetaStore, storeInstance);
30156
29949
  layout: getChartLayout(definition, chartData),
30157
29950
  scales: getScatterChartScales(definition, chartData),
30158
29951
  plugins: {
30159
- title: getChartTitle(definition),
29952
+ title: getChartTitle(definition, getters),
30160
29953
  legend: getScatterChartLegend(definition),
30161
29954
  tooltip: getLineChartTooltip(definition, chartData),
30162
29955
  chartShowValuesPlugin: getChartShowValues(definition, chartData),
@@ -30295,7 +30088,7 @@ stores.inject(MyMetaStore, storeInstance);
30295
30088
  ...CHART_COMMON_OPTIONS,
30296
30089
  layout: getChartLayout(definition, chartData),
30297
30090
  plugins: {
30298
- title: getChartTitle(definition),
30091
+ title: getChartTitle(definition, getters),
30299
30092
  legend: getSunburstChartLegend(definition),
30300
30093
  tooltip: getSunburstChartTooltip(definition, chartData),
30301
30094
  sunburstLabelsPlugin: getSunburstShowValues(definition, chartData),
@@ -30445,7 +30238,7 @@ stores.inject(MyMetaStore, storeInstance);
30445
30238
  ...CHART_COMMON_OPTIONS,
30446
30239
  layout: getChartLayout(definition, chartData),
30447
30240
  plugins: {
30448
- title: getChartTitle(definition),
30241
+ title: getChartTitle(definition, getters),
30449
30242
  legend: { display: false },
30450
30243
  tooltip: getTreeMapChartTooltip(definition, chartData),
30451
30244
  },
@@ -30608,7 +30401,7 @@ stores.inject(MyMetaStore, storeInstance);
30608
30401
  layout: getChartLayout(definition, chartData),
30609
30402
  scales: getWaterfallChartScales(definition, chartData),
30610
30403
  plugins: {
30611
- title: getChartTitle(definition),
30404
+ title: getChartTitle(definition, getters),
30612
30405
  legend: getWaterfallChartLegend(definition),
30613
30406
  tooltip: getWaterfallChartTooltip(definition, chartData),
30614
30407
  chartShowValuesPlugin: getWaterfallChartShowValues(definition, chartData),
@@ -31602,6 +31395,81 @@ stores.inject(MyMetaStore, storeInstance);
31602
31395
  return matchedChart.displayName;
31603
31396
  }
31604
31397
 
31398
+ /**
31399
+ * This file is largely inspired by owl 1.
31400
+ * `css` tag has been removed from owl 2 without workaround to manage css.
31401
+ * So, the solution was to import the behavior of owl 1 directly in our
31402
+ * codebase, with one difference: the css is added to the sheet as soon as the
31403
+ * css tag is executed. In owl 1, the css was added as soon as a Component was
31404
+ * created for the first time.
31405
+ */
31406
+ function getTextDecoration({ strikethrough, underline, }) {
31407
+ if (!strikethrough && !underline) {
31408
+ return "none";
31409
+ }
31410
+ return `${strikethrough ? "line-through" : ""} ${underline ? "underline" : ""}`;
31411
+ }
31412
+ /**
31413
+ * Convert the cell style to CSS properties.
31414
+ */
31415
+ function cellStyleToCss(style) {
31416
+ const attributes = cellTextStyleToCss(style);
31417
+ if (!style)
31418
+ return attributes;
31419
+ if (style.fillColor) {
31420
+ attributes["background"] = style.fillColor;
31421
+ }
31422
+ return attributes;
31423
+ }
31424
+ /**
31425
+ * Convert the cell text style to CSS properties.
31426
+ */
31427
+ function cellTextStyleToCss(style) {
31428
+ const attributes = {};
31429
+ if (!style)
31430
+ return attributes;
31431
+ if (style.bold) {
31432
+ attributes["font-weight"] = "bold";
31433
+ }
31434
+ if (style.italic) {
31435
+ attributes["font-style"] = "italic";
31436
+ }
31437
+ if (style.fontSize) {
31438
+ attributes["font-size"] = `${style.fontSize}px`;
31439
+ }
31440
+ if (style.strikethrough || style.underline) {
31441
+ let decoration = style.strikethrough ? "line-through" : "";
31442
+ decoration = style.underline ? decoration + " underline" : decoration;
31443
+ attributes["text-decoration"] = decoration;
31444
+ }
31445
+ if (style.textColor) {
31446
+ attributes["color"] = style.textColor;
31447
+ }
31448
+ return attributes;
31449
+ }
31450
+ /**
31451
+ * Transform CSS properties into a CSS string.
31452
+ */
31453
+ function cssPropertiesToCss(attributes) {
31454
+ let styleStr = "";
31455
+ for (const attName in attributes) {
31456
+ if (!attributes[attName]) {
31457
+ continue;
31458
+ }
31459
+ styleStr += `${attName}:${attributes[attName]}; `;
31460
+ }
31461
+ return styleStr;
31462
+ }
31463
+ function getElementMargins(el) {
31464
+ const style = window.getComputedStyle(el);
31465
+ return {
31466
+ top: parseInt(style.marginTop, 10) || 0,
31467
+ bottom: parseInt(style.marginBottom, 10) || 0,
31468
+ left: parseInt(style.marginLeft, 10) || 0,
31469
+ right: parseInt(style.marginRight, 10) || 0,
31470
+ };
31471
+ }
31472
+
31605
31473
  /**
31606
31474
  * Repeatedly calls a callback function with a time delay between calls.
31607
31475
  */
@@ -31656,59 +31524,6 @@ stores.inject(MyMetaStore, storeInstance);
31656
31524
  };
31657
31525
  }
31658
31526
 
31659
- //------------------------------------------------------------------------------
31660
- // Context Menu Component
31661
- //------------------------------------------------------------------------------
31662
- css /* scss */ `
31663
- .o-menu {
31664
- background-color: white;
31665
- user-select: none;
31666
-
31667
- .o-menu-item {
31668
- height: ${DESKTOP_MENU_ITEM_HEIGHT}px;
31669
- padding: ${MENU_ITEM_PADDING_VERTICAL}px ${MENU_ITEM_PADDING_HORIZONTAL}px;
31670
- cursor: pointer;
31671
- user-select: none;
31672
-
31673
- .o-menu-item-name {
31674
- min-width: 40%;
31675
- }
31676
-
31677
- .o-menu-item-icon {
31678
- display: inline-block;
31679
- margin: 0px 8px 0px 0px;
31680
- width: ${DESKTOP_MENU_ITEM_HEIGHT - 2 * MENU_ITEM_PADDING_VERTICAL}px;
31681
- line-height: ${DESKTOP_MENU_ITEM_HEIGHT - 2 * MENU_ITEM_PADDING_VERTICAL}px;
31682
- }
31683
-
31684
- &:not(.disabled) {
31685
- &:hover,
31686
- &.o-menu-item-active {
31687
- background-color: ${BUTTON_ACTIVE_BG};
31688
- color: ${BUTTON_ACTIVE_TEXT_COLOR};
31689
- }
31690
- .o-menu-item-description {
31691
- color: grey;
31692
- }
31693
- .o-menu-item-icon {
31694
- .o-icon {
31695
- color: ${ICONS_COLOR};
31696
- }
31697
- }
31698
- }
31699
- &.disabled {
31700
- color: ${DISABLED_TEXT_COLOR};
31701
- cursor: not-allowed;
31702
- }
31703
- }
31704
- }
31705
-
31706
- .o-spreadsheet-mobile {
31707
- .o-menu-item {
31708
- height: ${MOBILE_MENU_ITEM_HEIGHT}px;
31709
- }
31710
- }
31711
- `;
31712
31527
  class Menu extends owl.Component {
31713
31528
  static template = "o-spreadsheet-Menu";
31714
31529
  static props = {
@@ -31885,16 +31700,6 @@ stores.inject(MyMetaStore, storeInstance);
31885
31700
  return container;
31886
31701
  }
31887
31702
 
31888
- css /* scss */ `
31889
- .o-popover {
31890
- position: absolute;
31891
- z-index: ${ComponentsImportance.Popover};
31892
- overflow: auto;
31893
- box-shadow: 1px 2px 5px 2px rgb(51 51 51 / 15%);
31894
- width: fit-content;
31895
- height: fit-content;
31896
- }
31897
- `;
31898
31703
  class Popover extends owl.Component {
31899
31704
  static template = "o-spreadsheet-Popover";
31900
31705
  static props = {
@@ -31917,7 +31722,6 @@ stores.inject(MyMetaStore, storeInstance);
31917
31722
  onMouseWheel: () => { },
31918
31723
  onPopoverMoved: () => { },
31919
31724
  onPopoverHidden: () => { },
31920
- zIndex: ComponentsImportance.Popover,
31921
31725
  };
31922
31726
  popoverRef = owl.useRef("popover");
31923
31727
  popoverContentRef = owl.useRef("popoverContent");
@@ -31938,11 +31742,6 @@ stores.inject(MyMetaStore, storeInstance);
31938
31742
  // the element in rendered, so we can still set its position
31939
31743
  owl.useEffect(this.computePopoverPosition.bind(this));
31940
31744
  }
31941
- get popoverStyle() {
31942
- return cssPropertiesToCss({
31943
- "z-index": `${this.props.zIndex}`,
31944
- });
31945
- }
31946
31745
  computePopoverPosition() {
31947
31746
  if (!this.containerRect)
31948
31747
  throw new Error("Popover container is not defined");
@@ -32133,12 +31932,6 @@ stores.inject(MyMetaStore, storeInstance);
32133
31932
  //------------------------------------------------------------------------------
32134
31933
  // Context MenuPopover Component
32135
31934
  //------------------------------------------------------------------------------
32136
- css /* scss */ `
32137
- .o-menu-wrapper {
32138
- padding: ${MENU_VERTICAL_PADDING}px 0px;
32139
- background-color: white;
32140
- }
32141
- `;
32142
31935
  const TIMEOUT_DELAY = 250;
32143
31936
  class MenuPopover extends owl.Component {
32144
31937
  static template = "o-spreadsheet-Menu-Popover";
@@ -32384,7 +32177,11 @@ stores.inject(MyMetaStore, storeInstance);
32384
32177
  onFigureDeleted: Function,
32385
32178
  editFigureStyle: { type: Function, optional: true },
32386
32179
  };
32387
- static components = { ChartDashboardMenu };
32180
+ static components = { ChartDashboardMenu, MenuPopover };
32181
+ carouselTabsRef = owl.useRef("carouselTabs");
32182
+ carouselTabsDropdownRef = owl.useRef("carouselTabsDropdown");
32183
+ menuState = owl.useState({ isOpen: false, anchorRect: null, menuItems: [] });
32184
+ hiddenItems = [];
32388
32185
  animationStore;
32389
32186
  setup() {
32390
32187
  this.animationStore = useStore(ChartAnimationStore);
@@ -32395,6 +32192,7 @@ stores.inject(MyMetaStore, storeInstance);
32395
32192
  else {
32396
32193
  this.props.editFigureStyle?.({ "pointer-events": "auto" });
32397
32194
  }
32195
+ this.updateTabsVisibility();
32398
32196
  });
32399
32197
  }
32400
32198
  get carousel() {
@@ -32454,6 +32252,49 @@ stores.inject(MyMetaStore, storeInstance);
32454
32252
  const style = { ...DEFAULT_CAROUSEL_TITLE_STYLE, ...this.carousel.title };
32455
32253
  return cssPropertiesToCss(cellTextStyleToCss(chartStyleToCellStyle(style)));
32456
32254
  }
32255
+ updateTabsVisibility() {
32256
+ const tabsContainerEl = this.carouselTabsRef.el;
32257
+ const dropDownEl = this.carouselTabsDropdownRef.el;
32258
+ if (!tabsContainerEl || !dropDownEl) {
32259
+ return;
32260
+ }
32261
+ this.hiddenItems = [];
32262
+ const containerRect = getBoundingRectAsPOJO(tabsContainerEl);
32263
+ const tabs = Array.from(tabsContainerEl.children);
32264
+ for (const tab of tabs) {
32265
+ tab.style.display = "block";
32266
+ }
32267
+ const tabWidths = tabs.map((tab) => getBoundingRectAsPOJO(tab).width);
32268
+ let currentWidth = 0;
32269
+ for (let i = 0; i < tabs.length; i++) {
32270
+ const shouldBeHidden = currentWidth + tabWidths[i] > containerRect.width;
32271
+ currentWidth += tabWidths[i];
32272
+ if (shouldBeHidden) {
32273
+ tabs[i].style.display = "none";
32274
+ this.hiddenItems.push(this.carousel.items[i]);
32275
+ }
32276
+ }
32277
+ dropDownEl.style.display = this.hiddenItems.length ? "block" : "none";
32278
+ }
32279
+ get menuId() {
32280
+ return "carousel-tabs-menu-";
32281
+ }
32282
+ toggleMenu(ev) {
32283
+ if (ev.closedMenuId === this.menuId) {
32284
+ this.menuState.isOpen = false;
32285
+ return;
32286
+ }
32287
+ const rect = getRefBoundingRect(this.carouselTabsDropdownRef);
32288
+ const menuItems = this.hiddenItems.map((item) => ({
32289
+ name: this.getItemTitle(item),
32290
+ execute: () => this.onCarouselTabClick(item),
32291
+ isActive: () => this.isItemSelected(item),
32292
+ isReadonlyAllowed: true,
32293
+ }));
32294
+ this.menuState.isOpen = true;
32295
+ this.menuState.anchorRect = rect;
32296
+ this.menuState.menuItems = createActions(menuItems);
32297
+ }
32457
32298
  }
32458
32299
 
32459
32300
  class ChartFigure extends owl.Component {
@@ -32531,79 +32372,6 @@ stores.inject(MyMetaStore, storeInstance);
32531
32372
  const ANCHOR_SIZE = 8;
32532
32373
  const BORDER_WIDTH = 1;
32533
32374
  const ACTIVE_BORDER_WIDTH = 2;
32534
- css /*SCSS*/ `
32535
- div.o-figure {
32536
- position: absolute;
32537
- width: 100%;
32538
- height: 100%;
32539
- user-select: none;
32540
-
32541
- &:focus {
32542
- outline: none;
32543
- }
32544
- }
32545
-
32546
- div.o-figure-border {
32547
- z-index: 1;
32548
- }
32549
-
32550
- .o-figure-wrapper {
32551
- position: absolute;
32552
- box-sizing: content-box;
32553
- pointer-events: auto;
32554
-
32555
- .o-fig-anchor {
32556
- z-index: ${ComponentsImportance.FigureAnchor};
32557
- position: absolute;
32558
- width: ${ANCHOR_SIZE}px;
32559
- height: ${ANCHOR_SIZE}px;
32560
- background-color: #1a73e8;
32561
- outline: ${BORDER_WIDTH}px solid white;
32562
-
32563
- &.o-top {
32564
- cursor: n-resize;
32565
- }
32566
- &.o-topRight {
32567
- cursor: ne-resize;
32568
- }
32569
- &.o-right {
32570
- cursor: e-resize;
32571
- }
32572
- &.o-bottomRight {
32573
- cursor: se-resize;
32574
- }
32575
- &.o-bottom {
32576
- cursor: s-resize;
32577
- }
32578
- &.o-bottomLeft {
32579
- cursor: sw-resize;
32580
- }
32581
- &.o-left {
32582
- cursor: w-resize;
32583
- }
32584
- &.o-topLeft {
32585
- cursor: nw-resize;
32586
- }
32587
- }
32588
-
32589
- .o-figure-menu {
32590
- right: 0px;
32591
- top: 0px;
32592
- display: none;
32593
- }
32594
-
32595
- .o-figure-menu-item {
32596
- cursor: pointer;
32597
- }
32598
-
32599
- .o-figure.active:focus,
32600
- .o-figure:hover {
32601
- .o-figure-menu {
32602
- display: flex;
32603
- }
32604
- }
32605
- }
32606
- `;
32607
32375
  class FigureComponent extends owl.Component {
32608
32376
  static template = "o-spreadsheet-FigureComponent";
32609
32377
  static props = {
@@ -32648,7 +32416,6 @@ stores.inject(MyMetaStore, storeInstance);
32648
32416
  top: `${y}px`,
32649
32417
  width: `${width}px`,
32650
32418
  height: `${height}px`,
32651
- "z-index": String(ComponentsImportance.Figure + (this.isSelected ? 1 : 0)),
32652
32419
  });
32653
32420
  }
32654
32421
  getResizerPosition(resizer) {
@@ -32927,21 +32694,6 @@ stores.inject(MyMetaStore, storeInstance);
32927
32694
  }
32928
32695
 
32929
32696
  const ERROR_TOOLTIP_MAX_HEIGHT = 80;
32930
- const ERROR_TOOLTIP_WIDTH = 180;
32931
- css /* scss */ `
32932
- .o-error-tooltip {
32933
- font-size: 13px;
32934
- background-color: white;
32935
- border-left: 3px solid red;
32936
- padding: 10px;
32937
- width: ${ERROR_TOOLTIP_WIDTH}px;
32938
- overflow-wrap: break-word;
32939
-
32940
- .o-error-tooltip-message {
32941
- overflow: hidden;
32942
- }
32943
- }
32944
- `;
32945
32697
  class ErrorToolTip extends owl.Component {
32946
32698
  static maxSize = { maxHeight: ERROR_TOOLTIP_MAX_HEIGHT };
32947
32699
  static template = "o-spreadsheet-ErrorToolTip";
@@ -33042,34 +32794,6 @@ stores.inject(MyMetaStore, storeInstance);
33042
32794
  }
33043
32795
  }
33044
32796
 
33045
- css /* scss */ `
33046
- .o_side_panel_collapsible_title {
33047
- font-size: 16px;
33048
- cursor: pointer;
33049
- padding: 6px 0px 6px 6px !important;
33050
-
33051
- .collapsor-arrow {
33052
- transform: rotate(-90deg);
33053
- display: inline-block;
33054
- transform-origin: 8px 11px;
33055
- transition: transform 0.2s ease-in-out;
33056
-
33057
- .o-icon {
33058
- width: 16px;
33059
- height: 22px;
33060
- }
33061
- }
33062
- .collapsor:not(.collapsed) .collapsor-arrow {
33063
- transform: rotate(0);
33064
- }
33065
-
33066
- .collapsor {
33067
- width: 100%;
33068
- transition-delay: 0.35s;
33069
- transition-property: all;
33070
- }
33071
- }
33072
- `;
33073
32797
  class SidePanelCollapsible extends owl.Component {
33074
32798
  static template = "o-spreadsheet-SidePanelCollapsible";
33075
32799
  static props = {
@@ -33706,27 +33430,6 @@ stores.inject(MyMetaStore, storeInstance);
33706
33430
  }
33707
33431
  }
33708
33432
 
33709
- css /* scss */ `
33710
- .o-autocomplete-dropdown {
33711
- pointer-events: auto;
33712
- cursor: pointer;
33713
- background-color: #fff;
33714
- max-width: 400px;
33715
- z-index: 1;
33716
-
33717
- .o-autocomplete-value-focus {
33718
- background-color: #f2f2f2;
33719
- }
33720
-
33721
- & > div {
33722
- padding: 1px 5px 5px 5px;
33723
- .o-autocomplete-description {
33724
- padding-left: 5px;
33725
- font-size: 11px;
33726
- }
33727
- }
33728
- }
33729
- `;
33730
33433
  class TextValueProvider extends owl.Component {
33731
33434
  static template = "o-spreadsheet-TextValueProvider";
33732
33435
  static props = {
@@ -34028,36 +33731,6 @@ stores.inject(MyMetaStore, storeInstance);
34028
33731
  }
34029
33732
 
34030
33733
  const BUBBLE_ARROW_SIZE = 7;
34031
- css /* scss */ `
34032
- .o-spreadsheet {
34033
- .o-speech-bubble {
34034
- background-color: white;
34035
- box-sizing: border-box;
34036
- box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
34037
- border: 1px solid #ccc;
34038
- z-index: ${ComponentsImportance.Popover};
34039
-
34040
- &::after {
34041
- content: "";
34042
- position: absolute;
34043
- top: 100%;
34044
- left: 50%;
34045
- background-color: white;
34046
- height: ${BUBBLE_ARROW_SIZE}px;
34047
- width: ${BUBBLE_ARROW_SIZE}px;
34048
- transform-origin: top left;
34049
- transform: translate(0, -67%) rotate(45deg);
34050
- border-right: 1px solid #ccc;
34051
- border-bottom: 1px solid #ccc;
34052
- box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
34053
- }
34054
- }
34055
-
34056
- .o-speech-content {
34057
- max-width: 300px;
34058
- }
34059
- }
34060
- `;
34061
33734
  class SpeechBubble extends owl.Component {
34062
33735
  static template = "o-spreadsheet-SpeechBubble";
34063
33736
  static props = { content: String, anchorRect: Object };
@@ -34086,85 +33759,6 @@ stores.inject(MyMetaStore, storeInstance);
34086
33759
  const selectionIndicatorClass = "selector-flag";
34087
33760
  const highlightParenthesisClass = "highlight-parenthesis-flag";
34088
33761
  const highlightClass = "highlight-flag";
34089
- const selectionIndicatorColor = "#a9a9a9";
34090
- const selectionIndicator = "␣";
34091
- css /* scss */ `
34092
- .o-composer-container {
34093
- .o-composer {
34094
- overflow-y: auto;
34095
- overflow-x: hidden;
34096
- word-break: break-all;
34097
- padding-right: 2px;
34098
-
34099
- caret-color: black;
34100
- padding-left: 3px;
34101
- padding-right: 3px;
34102
- outline: none;
34103
-
34104
- tab-size: 4;
34105
-
34106
- p {
34107
- margin-bottom: 0px;
34108
-
34109
- span {
34110
- white-space: pre-wrap;
34111
- /* On some browsers (chromium ?) it is somehow possible to hover two of the composer's spans at the same time, leading to
34112
- * flickering with a succession of onmouseenter/onmouseleave events. A small invisible padding seems to prevent the issue.*/
34113
- padding-left: 0.01px;
34114
-
34115
- &.${selectionIndicatorClass}:after {
34116
- content: "${selectionIndicator}";
34117
- color: ${selectionIndicatorColor};
34118
- }
34119
-
34120
- &.${highlightParenthesisClass}:not(.${highlightClass}) {
34121
- border-radius: 5px;
34122
- background-color: lightgray;
34123
- padding: 1.5px 0px 1.5px 0px;
34124
- }
34125
-
34126
- &.${highlightClass} {
34127
- background-color: #e6edf3;
34128
- }
34129
- }
34130
- }
34131
- }
34132
- .o-composer[placeholder]:empty:not(:focus):not(.active)::before {
34133
- content: attr(placeholder);
34134
- color: #bdbdbd;
34135
- position: relative;
34136
- top: 0%;
34137
- pointer-events: none;
34138
- }
34139
-
34140
- .fa-stack {
34141
- /* reset stack size which is doubled by default */
34142
- width: ${CLOSE_ICON_RADIUS * 2}px;
34143
- height: ${CLOSE_ICON_RADIUS * 2}px;
34144
- line-height: ${CLOSE_ICON_RADIUS * 2}px;
34145
- }
34146
-
34147
- .force-open-assistant {
34148
- left: -1px;
34149
- top: -1px;
34150
-
34151
- .fa-question-circle {
34152
- color: ${PRIMARY_BUTTON_BG};
34153
- }
34154
- }
34155
-
34156
- .o-composer-assistant {
34157
- margin-top: 1px;
34158
-
34159
- .o-semi-bold {
34160
- /* FIXME: to remove in favor of Bootstrap
34161
- * 'fw-semibold' when we upgrade to Bootstrap 5.2
34162
- */
34163
- font-weight: 600 !important;
34164
- }
34165
- }
34166
- }
34167
- `;
34168
33762
  class Composer extends owl.Component {
34169
33763
  static template = "o-spreadsheet-Composer";
34170
33764
  static props = {
@@ -35837,30 +35431,6 @@ stores.inject(MyMetaStore, storeInstance);
35837
35431
  }
35838
35432
  }
35839
35433
 
35840
- css /* scss */ `
35841
- .o-spreadsheet {
35842
- .o-standalone-composer {
35843
- min-height: 24px;
35844
-
35845
- border-bottom: 1px solid;
35846
- border-color: ${GRAY_300};
35847
-
35848
- &.active {
35849
- border-color: ${ACTION_COLOR};
35850
- }
35851
-
35852
- &.o-invalid {
35853
- border-bottom: 2px solid red;
35854
- }
35855
-
35856
- /* As the standalone composer is potentially very small (eg. in a side panel), we remove the scrollbar display */
35857
- scrollbar-width: none; /* Firefox */
35858
- &::-webkit-scrollbar {
35859
- display: none;
35860
- }
35861
- }
35862
- }
35863
- `;
35864
35434
  class StandaloneComposer extends owl.Component {
35865
35435
  static template = "o-spreadsheet-StandaloneComposer";
35866
35436
  static props = {
@@ -35928,17 +35498,6 @@ stores.inject(MyMetaStore, storeInstance);
35928
35498
  }
35929
35499
  }
35930
35500
 
35931
- css /* scss */ `
35932
- .o-dv-input {
35933
- &.o-invalid {
35934
- background-color: #ffdddd;
35935
- }
35936
- .error-icon {
35937
- right: 7px;
35938
- top: 7px;
35939
- }
35940
- }
35941
- `;
35942
35501
  class CriterionInput extends owl.Component {
35943
35502
  static template = "o-spreadsheet-CriterionInput";
35944
35503
  static props = {
@@ -36106,8 +35665,6 @@ stores.inject(MyMetaStore, storeInstance);
36106
35665
  return removeListeners;
36107
35666
  }
36108
35667
 
36109
- const LINE_VERTICAL_PADDING = 1;
36110
- const PICKER_PADDING = 8;
36111
35668
  const ITEM_BORDER_WIDTH = 1;
36112
35669
  const ITEM_EDGE_LENGTH = 18;
36113
35670
  const ITEMS_PER_LINE = 10;
@@ -36116,170 +35673,6 @@ stores.inject(MyMetaStore, storeInstance);
36116
35673
  const CONTENT_WIDTH = ITEMS_PER_LINE * (ITEM_EDGE_LENGTH + 2 * ITEM_BORDER_WIDTH) + (ITEMS_PER_LINE - 1) * ITEM_GAP;
36117
35674
  const INNER_GRADIENT_WIDTH = CONTENT_WIDTH - 2 * ITEM_BORDER_WIDTH;
36118
35675
  const INNER_GRADIENT_HEIGHT = CONTENT_WIDTH - 30 - 2 * ITEM_BORDER_WIDTH;
36119
- const CONTAINER_WIDTH = CONTENT_WIDTH + 2 * PICKER_PADDING;
36120
- css /* scss */ `
36121
- .o-color-picker {
36122
- padding: ${PICKER_PADDING}px 0;
36123
- /* FIXME: this is useless, overiden by the popover container */
36124
- box-shadow: 1px 2px 5px 2px rgba(51, 51, 51, 0.15);
36125
- background-color: white;
36126
- line-height: 1.2;
36127
- overflow-y: auto;
36128
- overflow-x: hidden;
36129
- width: ${CONTAINER_WIDTH}px;
36130
-
36131
- .o-color-picker-section-name {
36132
- margin: 0px ${ITEM_BORDER_WIDTH}px;
36133
- padding: 4px ${PICKER_PADDING}px;
36134
- }
36135
- .colors-grid {
36136
- display: grid;
36137
- padding: ${LINE_VERTICAL_PADDING}px ${PICKER_PADDING}px;
36138
- grid-template-columns: repeat(${ITEMS_PER_LINE}, 1fr);
36139
- grid-gap: ${ITEM_GAP}px;
36140
- }
36141
- .o-color-picker-toggler-button {
36142
- display: flex;
36143
- .o-color-picker-toggler-sign {
36144
- display: flex;
36145
- margin: auto auto;
36146
- width: 55%;
36147
- height: 55%;
36148
- .o-icon {
36149
- width: 100%;
36150
- height: 100%;
36151
- }
36152
- }
36153
- }
36154
- .o-color-picker-line-item {
36155
- width: ${ITEM_EDGE_LENGTH + 2 * ITEM_BORDER_WIDTH}px;
36156
- height: ${ITEM_EDGE_LENGTH + 2 * ITEM_BORDER_WIDTH}px;
36157
- margin: 0px;
36158
- border-radius: 50px;
36159
- border: ${ITEM_BORDER_WIDTH}px solid #666666;
36160
- padding: 0px;
36161
- font-size: 16px;
36162
- background: white;
36163
- &:hover {
36164
- background-color: rgba(0, 0, 0, 0.08);
36165
- outline: 1px solid gray;
36166
- cursor: pointer;
36167
- }
36168
- }
36169
- .o-buttons {
36170
- padding: ${PICKER_PADDING}px;
36171
- display: flex;
36172
- .o-cancel {
36173
- border: ${ITEM_BORDER_WIDTH}px solid #c0c0c0;
36174
- width: 100%;
36175
- padding: 5px;
36176
- font-size: 14px;
36177
- background: white;
36178
- border-radius: 4px;
36179
- &:hover:enabled {
36180
- background-color: rgba(0, 0, 0, 0.08);
36181
- }
36182
- }
36183
- }
36184
- .o-add-button {
36185
- border: ${ITEM_BORDER_WIDTH}px solid #c0c0c0;
36186
- padding: 4px;
36187
- background: white;
36188
- border-radius: 4px;
36189
- &:hover:enabled {
36190
- background-color: rgba(0, 0, 0, 0.08);
36191
- }
36192
- }
36193
- .o-separator {
36194
- border-bottom: ${MENU_SEPARATOR_BORDER_WIDTH}px solid ${SEPARATOR_COLOR};
36195
- margin-top: ${MENU_SEPARATOR_PADDING}px;
36196
- margin-bottom: ${MENU_SEPARATOR_PADDING}px;
36197
- }
36198
-
36199
- .o-custom-selector {
36200
- padding: ${PICKER_PADDING + 2}px ${PICKER_PADDING}px;
36201
- position: relative;
36202
- .o-gradient {
36203
- margin-bottom: ${MAGNIFIER_EDGE / 2}px;
36204
- border: ${ITEM_BORDER_WIDTH}px solid #c0c0c0;
36205
- width: ${INNER_GRADIENT_WIDTH + 2 * ITEM_BORDER_WIDTH}px;
36206
- height: ${INNER_GRADIENT_HEIGHT + 2 * ITEM_BORDER_WIDTH}px;
36207
- position: relative;
36208
- }
36209
-
36210
- .magnifier {
36211
- height: ${MAGNIFIER_EDGE}px;
36212
- width: ${MAGNIFIER_EDGE}px;
36213
- border-radius: 50%;
36214
- border: 2px solid #fff;
36215
- box-shadow: 0px 0px 3px #c0c0c0;
36216
- position: absolute;
36217
- z-index: 2;
36218
- }
36219
- .saturation {
36220
- background: linear-gradient(to right, #fff 0%, transparent 100%);
36221
- }
36222
- .lightness {
36223
- background: linear-gradient(to top, #000 0%, transparent 100%);
36224
- }
36225
- .o-hue-picker {
36226
- border: ${ITEM_BORDER_WIDTH}px solid #c0c0c0;
36227
- width: 100%;
36228
- height: 12px;
36229
- border-radius: 4px;
36230
- background: linear-gradient(
36231
- to right,
36232
- hsl(0 100% 50%) 0%,
36233
- hsl(0.2turn 100% 50%) 20%,
36234
- hsl(0.3turn 100% 50%) 30%,
36235
- hsl(0.4turn 100% 50%) 40%,
36236
- hsl(0.5turn 100% 50%) 50%,
36237
- hsl(0.6turn 100% 50%) 60%,
36238
- hsl(0.7turn 100% 50%) 70%,
36239
- hsl(0.8turn 100% 50%) 80%,
36240
- hsl(0.9turn 100% 50%) 90%,
36241
- hsl(1turn 100% 50%) 100%
36242
- );
36243
- position: relative;
36244
- cursor: crosshair;
36245
- }
36246
- .o-hue-slider {
36247
- margin-top: -3px;
36248
- }
36249
- .o-custom-input-preview {
36250
- padding: 2px 0px;
36251
- display: flex;
36252
- input {
36253
- width: 50%;
36254
- border-radius: 4px;
36255
- padding: 4px 23px 4px 10px;
36256
- height: 24px;
36257
- border: 1px solid #c0c0c0;
36258
- margin-right: 2px;
36259
- }
36260
- .o-wrong-color {
36261
- /* FIXME bootstrap class instead? */
36262
- outline-color: red;
36263
- border-color: red;
36264
- &:focus {
36265
- outline-style: solid;
36266
- outline-width: 1px;
36267
- }
36268
- }
36269
- }
36270
- .o-custom-input-buttons {
36271
- padding: 2px 0px;
36272
- display: flex;
36273
- justify-content: end;
36274
- }
36275
- .o-color-preview {
36276
- border: 1px solid #c0c0c0;
36277
- border-radius: 4px;
36278
- width: 50%;
36279
- }
36280
- }
36281
- }
36282
- `;
36283
35676
  class ColorPicker extends owl.Component {
36284
35677
  static template = "o-spreadsheet-ColorPicker";
36285
35678
  static props = {
@@ -36434,21 +35827,12 @@ stores.inject(MyMetaStore, storeInstance);
36434
35827
  };
36435
35828
  }
36436
35829
 
36437
- const TRANSPARENT_BACKGROUND_SVG = /*xml*/ `
36438
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
36439
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
36440
- </svg>
36441
- `;
36442
- css /* scss */ `
36443
- .o-round-color-picker-button {
36444
- width: 20px;
36445
- height: 20px;
36446
- cursor: pointer;
36447
- border: 1px solid ${GRAY_300};
36448
- background-position: 1px 1px;
36449
- background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
36450
- }
36451
- `;
35830
+ // FIXME Encoding version used in css
35831
+ // const TRANSPARENT_BACKGROUND_SVG = /*xml*/ `
35832
+ // <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
35833
+ // <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
35834
+ // </svg>
35835
+ // `;
36452
35836
  class RoundColorPicker extends owl.Component {
36453
35837
  static template = "o-spreadsheet.RoundColorPicker";
36454
35838
  static components = { Section, ColorPicker };
@@ -36485,12 +35869,6 @@ stores.inject(MyMetaStore, storeInstance);
36485
35869
  }
36486
35870
  }
36487
35871
 
36488
- css /* scss */ `
36489
- .o-dv-list-item-delete {
36490
- color: #666666;
36491
- cursor: pointer;
36492
- }
36493
- `;
36494
35872
  class ListCriterionForm extends CriterionForm {
36495
35873
  static template = "o-spreadsheet-ListCriterionForm";
36496
35874
  static components = { CriterionInput, RoundColorPicker };
@@ -37204,36 +36582,6 @@ stores.inject(MyMetaStore, storeInstance);
37204
36582
  }
37205
36583
  }
37206
36584
 
37207
- css /* scss */ `
37208
- .o-selection {
37209
- .o-selection-input {
37210
- padding: 2px 0px;
37211
-
37212
- input.o-invalid {
37213
- background-color: ${ALERT_DANGER_BG};
37214
- }
37215
- .input-icon {
37216
- right: 7px;
37217
- top: 4px;
37218
- }
37219
- .o-drag-handle {
37220
- cursor: move;
37221
- }
37222
- }
37223
- .o-disabled-ranges {
37224
- color: #888 !important;
37225
- }
37226
- .o-button {
37227
- flex-grow: 0;
37228
- }
37229
-
37230
- /* Make the character a bit bigger
37231
- compared to its neighbor INPUT box */
37232
- .o-remove-selection {
37233
- font-size: calc(100% + 4px);
37234
- }
37235
- }
37236
- `;
37237
36585
  /**
37238
36586
  * This component can be used when the user needs to input some
37239
36587
  * ranges. He can either input the ranges with the regular DOM `<input/>`
@@ -37732,44 +37080,6 @@ stores.inject(MyMetaStore, storeInstance);
37732
37080
  }
37733
37081
  }
37734
37082
 
37735
- const CHECK_SVG = /*xml*/ `
37736
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
37737
- <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
37738
- </svg>
37739
- `;
37740
- const CHECKBOX_WIDTH = 14;
37741
- css /* scss */ `
37742
- label.o-checkbox {
37743
- input {
37744
- appearance: none;
37745
- -webkit-appearance: none;
37746
- -moz-appearance: none;
37747
- border-radius: 0;
37748
- width: ${CHECKBOX_WIDTH}px;
37749
- height: ${CHECKBOX_WIDTH}px;
37750
- vertical-align: top;
37751
- outline: none;
37752
- border: 1px solid ${GRAY_300};
37753
- cursor: pointer;
37754
-
37755
- &:hover {
37756
- border-color: ${ACTION_COLOR};
37757
- }
37758
-
37759
- &:checked {
37760
- background: url("data:image/svg+xml,${encodeURIComponent(CHECK_SVG)}");
37761
- background-color: ${ACTION_COLOR};
37762
- border-color: ${ACTION_COLOR};
37763
- }
37764
-
37765
- &:focus {
37766
- outline: none;
37767
- box-shadow: 0 0 0 0.25rem rgba(113, 75, 103, 0.25);
37768
- border-color: ${ACTION_COLOR};
37769
- }
37770
- }
37771
- }
37772
- `;
37773
37083
  class Checkbox extends owl.Component {
37774
37084
  static template = "o-spreadsheet.Checkbox";
37775
37085
  static props = {
@@ -37977,60 +37287,6 @@ stores.inject(MyMetaStore, storeInstance);
37977
37287
  }
37978
37288
  }
37979
37289
 
37980
- css /* scss */ `
37981
- .o-filter-menu {
37982
- width: 245px;
37983
- padding: 8px 0;
37984
- user-select: none;
37985
-
37986
- .o-filter-menu-content {
37987
- padding: 0 16px;
37988
- }
37989
-
37990
- .o-sort-item {
37991
- padding-left: 34px;
37992
- }
37993
-
37994
- .o_side_panel_collapsible_title {
37995
- font-size: inherit;
37996
- padding: 0 0 4px 0 !important;
37997
- font-weight: 400 !important;
37998
-
37999
- .collapsor .o-icon {
38000
- opacity: 0.8;
38001
- }
38002
-
38003
- .collapsor-arrow {
38004
- transform-origin: 6px 8px;
38005
-
38006
- .o-icon {
38007
- width: 12px;
38008
- height: 16px;
38009
- }
38010
- }
38011
- }
38012
-
38013
- .o-filter-menu-item {
38014
- display: flex;
38015
- cursor: pointer;
38016
- user-select: none;
38017
- line-height: 1;
38018
-
38019
- &.selected,
38020
- &:hover {
38021
- background-color: ${BUTTON_ACTIVE_BG};
38022
- }
38023
- }
38024
-
38025
- .o-filter-menu-buttons {
38026
- margin-top: 9px;
38027
-
38028
- .o-button {
38029
- height: 26px;
38030
- }
38031
- }
38032
- }
38033
- `;
38034
37290
  class FilterMenu extends owl.Component {
38035
37291
  static template = "o-spreadsheet-FilterMenu";
38036
37292
  static props = {
@@ -38154,55 +37410,6 @@ stores.inject(MyMetaStore, storeInstance);
38154
37410
  },
38155
37411
  };
38156
37412
 
38157
- const LINK_TOOLTIP_HEIGHT = 32;
38158
- const LINK_TOOLTIP_WIDTH = 220;
38159
- css /* scss */ `
38160
- .o-link-tool {
38161
- font-size: 13px;
38162
- background-color: white;
38163
- box-shadow: 0 1px 4px 3px rgba(60, 64, 67, 0.15);
38164
- padding: 6px 12px;
38165
- border-radius: 4px;
38166
- display: flex;
38167
- justify-content: space-between;
38168
- height: ${LINK_TOOLTIP_HEIGHT}px;
38169
- width: ${LINK_TOOLTIP_WIDTH}px;
38170
-
38171
- img {
38172
- margin-right: 3px;
38173
- width: 16px;
38174
- height: 16px;
38175
- }
38176
-
38177
- a.o-link {
38178
- color: ${LINK_COLOR};
38179
- text-decoration: none;
38180
- flex-grow: 2;
38181
- white-space: nowrap;
38182
- overflow: hidden;
38183
- text-overflow: ellipsis;
38184
- }
38185
- a.o-link:hover {
38186
- text-decoration: none;
38187
- color: #001d1f;
38188
- cursor: pointer;
38189
- }
38190
- }
38191
- .o-link-icon {
38192
- float: right;
38193
- padding-left: 5px;
38194
- .o-icon {
38195
- height: 16px;
38196
- }
38197
- }
38198
- .o-link-icon .o-icon {
38199
- height: 13px;
38200
- }
38201
- .o-link-icon:hover {
38202
- cursor: pointer;
38203
- color: #000;
38204
- }
38205
- `;
38206
37413
  class LinkDisplay extends owl.Component {
38207
37414
  static template = "o-spreadsheet-LinkDisplay";
38208
37415
  static props = {
@@ -38433,54 +37640,6 @@ stores.inject(MyMetaStore, storeInstance);
38433
37640
  sequence: 10,
38434
37641
  });
38435
37642
 
38436
- const PADDING = 12;
38437
- const LINK_EDITOR_WIDTH = 340 + 2 * PADDING;
38438
- css /* scss */ `
38439
- .o-link-editor {
38440
- font-size: 13px;
38441
- background-color: white;
38442
- box-shadow: 0 1px 4px 3px rgba(60, 64, 67, 0.15);
38443
- padding: ${PADDING}px;
38444
- display: flex;
38445
- flex-direction: column;
38446
- border-radius: 4px;
38447
- width: ${LINK_EDITOR_WIDTH}px;
38448
-
38449
- .o-section {
38450
- .o-section-title {
38451
- font-weight: bold;
38452
- margin-bottom: 5px;
38453
- }
38454
- }
38455
- .o-buttons {
38456
- padding-left: 16px;
38457
- padding-top: 16px;
38458
- text-align: right;
38459
- }
38460
- input.o-input {
38461
- width: 100%;
38462
- padding: 0 23px 4px 0;
38463
- }
38464
- .o-link-url {
38465
- position: relative;
38466
- flex-grow: 1;
38467
- button {
38468
- position: absolute;
38469
- right: 0px;
38470
- top: 0px;
38471
- border: none;
38472
- height: 20px;
38473
- width: 20px;
38474
- background-color: #fff;
38475
- margin: 2px 3px 1px 0px;
38476
- padding: 0px 1px 0px 0px;
38477
- }
38478
- button:hover {
38479
- cursor: pointer;
38480
- }
38481
- }
38482
- }
38483
- `;
38484
37643
  class LinkEditor extends owl.Component {
38485
37644
  static template = "o-spreadsheet-LinkEditor";
38486
37645
  static props = {
@@ -39208,29 +38367,6 @@ stores.inject(MyMetaStore, storeInstance);
39208
38367
  };
39209
38368
  }
39210
38369
 
39211
- css /* scss */ `
39212
- .o-spreadsheet {
39213
- .o-icon {
39214
- display: flex;
39215
- align-items: center;
39216
- justify-content: center;
39217
- width: ${ICON_EDGE_LENGTH}px;
39218
- height: ${ICON_EDGE_LENGTH}px;
39219
- font-size: ${ICON_EDGE_LENGTH}px;
39220
- vertical-align: middle;
39221
-
39222
- .small-text {
39223
- font: bold 9px sans-serif;
39224
- }
39225
- .heavy-text {
39226
- font: bold 16px sans-serif;
39227
- }
39228
- }
39229
- .fa-small {
39230
- font-size: 14px;
39231
- }
39232
- }
39233
- `;
39234
38370
  // -----------------------------------------------------------------------------
39235
38371
  // We need here the svg of the icons that we need to convert to images for the renderer
39236
38372
  // -----------------------------------------------------------------------------
@@ -39327,6 +38463,14 @@ stores.inject(MyMetaStore, storeInstance);
39327
38463
  paths: [{ fillColor: color.textColor || TEXT_BODY_MUTED, path: "M120 195 h270 l-135 130" }],
39328
38464
  };
39329
38465
  }
38466
+ function getCaretUpSvg(color) {
38467
+ return {
38468
+ name: "CARET_UP",
38469
+ width: 512,
38470
+ height: 512,
38471
+ paths: [{ fillColor: color.textColor || TEXT_BODY_MUTED, path: "M120 325 h270 l-135 -130" }],
38472
+ };
38473
+ }
39330
38474
  function getHoveredCaretDownSvg(color) {
39331
38475
  return {
39332
38476
  name: "CARET_DOWN",
@@ -49096,37 +48240,6 @@ stores.inject(MyMetaStore, storeInstance);
49096
48240
  return index;
49097
48241
  }
49098
48242
 
49099
- // -----------------------------------------------------------------------------
49100
- // Autofill
49101
- // -----------------------------------------------------------------------------
49102
- css /* scss */ `
49103
- .o-autofill {
49104
- position: absolute;
49105
- height: ${AUTOFILL_EDGE_LENGTH}px;
49106
- width: ${AUTOFILL_EDGE_LENGTH}px;
49107
- border: 1px solid white;
49108
- background-color: #1a73e8;
49109
- }
49110
-
49111
- .o-autofill-handler {
49112
- position: absolute;
49113
- height: ${AUTOFILL_EDGE_LENGTH}px;
49114
- width: ${AUTOFILL_EDGE_LENGTH}px;
49115
- &:hover {
49116
- cursor: crosshair;
49117
- }
49118
- }
49119
-
49120
- .o-autofill-nextvalue {
49121
- position: absolute;
49122
- background-color: #ffffff;
49123
- border: 1px solid black;
49124
- padding: 5px;
49125
- font-size: 12px;
49126
- pointer-events: none;
49127
- white-space: nowrap;
49128
- }
49129
- `;
49130
48243
  class Autofill extends owl.Component {
49131
48244
  static template = "o-spreadsheet-Autofill";
49132
48245
  static props = {
@@ -49211,16 +48324,6 @@ stores.inject(MyMetaStore, storeInstance);
49211
48324
  `;
49212
48325
  }
49213
48326
 
49214
- css /* scss */ `
49215
- .o-client-tag {
49216
- position: absolute;
49217
- border-top-left-radius: 4px;
49218
- border-top-right-radius: 4px;
49219
- font-size: ${DEFAULT_FONT_SIZE};
49220
- color: white;
49221
- pointer-events: none;
49222
- }
49223
- `;
49224
48327
  class ClientTag extends owl.Component {
49225
48328
  static template = "o-spreadsheet-ClientTag";
49226
48329
  static props = {
@@ -49770,28 +48873,6 @@ stores.inject(MyMetaStore, storeInstance);
49770
48873
 
49771
48874
  const COMPOSER_BORDER_WIDTH = 3 * 0.4 * window.devicePixelRatio || 1;
49772
48875
  const GRID_CELL_REFERENCE_TOP_OFFSET = 28;
49773
- css /* scss */ `
49774
- div.o-grid-composer {
49775
- z-index: ${ComponentsImportance.GridComposer};
49776
- position: absolute;
49777
- border: ${COMPOSER_BORDER_WIDTH}px solid ${SELECTION_BORDER_COLOR};
49778
- font-family: ${DEFAULT_FONT};
49779
-
49780
- display: flex;
49781
- align-items: center;
49782
- }
49783
-
49784
- div.o-cell-reference {
49785
- position: absolute;
49786
- z-index: ${ComponentsImportance.GridComposer};
49787
- background: ${SELECTION_BORDER_COLOR};
49788
- color: white;
49789
- font-size: 12px;
49790
- line-height: 14px;
49791
- padding: 6px 7px;
49792
- border-radius: 4px;
49793
- }
49794
- `;
49795
48876
  /**
49796
48877
  * This component is a composer which positions itself on the grid at the anchor cell.
49797
48878
  * It also applies the style of the cell to the composer input.
@@ -49917,6 +48998,7 @@ stores.inject(MyMetaStore, storeInstance);
49917
48998
  return cssPropertiesToCss({
49918
48999
  left: `${left - 1}px`,
49919
49000
  top: `${top}px`,
49001
+ border: `${COMPOSER_BORDER_WIDTH}px solid ${SELECTION_BORDER_COLOR}`,
49920
49002
  "min-width": `${minWidth}px`,
49921
49003
  "min-height": `${minHeight}px`,
49922
49004
  "max-width": `${maxWidth}px`,
@@ -50187,24 +49269,6 @@ stores.inject(MyMetaStore, storeInstance);
50187
49269
  return { position, axisType: axisType };
50188
49270
  }
50189
49271
 
50190
- css /*SCSS*/ `
50191
- .o-figure-snap-line {
50192
- position: relative;
50193
- z-index: ${ComponentsImportance.FigureSnapLine};
50194
- &.vertical {
50195
- width: 0px;
50196
- border-left: 1px dashed black;
50197
- }
50198
- &.horizontal {
50199
- border-top: 1px dashed black;
50200
- height: 0px;
50201
- }
50202
- }
50203
- .o-figure-container {
50204
- -webkit-user-select: none; /* safari */
50205
- user-select: none;
50206
- }
50207
- `;
50208
49272
  /**
50209
49273
  * Each figure ⭐ is positioned inside a container `div` placed and sized
50210
49274
  * according to the split pane the figure is part of, or a separate container for the figure
@@ -50433,9 +49497,16 @@ stores.inject(MyMetaStore, storeInstance);
50433
49497
  maxX: this.env.model.getters.getColDimensions(sheetId, this.env.model.getters.getNumberCols(sheetId) - 1).end,
50434
49498
  maxY: this.env.model.getters.getRowDimensions(sheetId, this.env.model.getters.getNumberRows(sheetId) - 1).end,
50435
49499
  };
49500
+ let hasStartedDnd = false;
50436
49501
  const onMouseMove = (ev) => {
50437
49502
  const getters = this.env.model.getters;
50438
49503
  const currentMousePosition = { x: ev.clientX, y: ev.clientY };
49504
+ const offsetX = Math.abs(currentMousePosition.x - initialMousePosition.x);
49505
+ const offsetY = Math.abs(currentMousePosition.y - initialMousePosition.y);
49506
+ if (!hasStartedDnd && offsetX < DRAG_THRESHOLD && offsetY < DRAG_THRESHOLD) {
49507
+ return; // add a small threshold to avoid dnd when just clicking
49508
+ }
49509
+ hasStartedDnd = true;
50439
49510
  const draggedFigure = dragFigureForMove(currentMousePosition, initialMousePosition, initialFigure, maxDimensions, initialScrollPosition, getters.getActiveSheetScrollInfo());
50440
49511
  const otherFigures = this.getOtherFigures(initialFigure.id);
50441
49512
  const overlappingCarousel = this.getCarouselOverlappingChart(draggedFigure, otherFigures);
@@ -50629,38 +49700,6 @@ stores.inject(MyMetaStore, storeInstance);
50629
49700
  }
50630
49701
  }
50631
49702
 
50632
- css /* scss */ `
50633
- .o-validation {
50634
- border-radius: 4px;
50635
- border-width: 0 0 0 3px;
50636
- border-style: solid;
50637
- gap: 3px;
50638
-
50639
- .o-icon {
50640
- margin-right: 5px;
50641
- height: 1.2em;
50642
- width: 1.2em;
50643
- }
50644
- }
50645
-
50646
- .o-validation-warning {
50647
- border-color: ${ALERT_WARNING_BORDER};
50648
- color: ${ALERT_WARNING_TEXT_COLOR};
50649
- background-color: ${ALERT_WARNING_BG};
50650
- }
50651
-
50652
- .o-validation-error {
50653
- border-color: ${ALERT_DANGER_BORDER};
50654
- color: ${ALERT_DANGER_TEXT_COLOR};
50655
- background-color: ${ALERT_DANGER_BG};
50656
- }
50657
-
50658
- .o-validation-info {
50659
- border-color: ${ALERT_INFO_BORDER};
50660
- color: ${ALERT_INFO_TEXT_COLOR};
50661
- background-color: ${ALERT_INFO_BG};
50662
- }
50663
- `;
50664
49703
  class ValidationMessages extends owl.Component {
50665
49704
  static template = "o-spreadsheet-ValidationMessages";
50666
49705
  static props = {
@@ -50682,20 +49721,6 @@ stores.inject(MyMetaStore, storeInstance);
50682
49721
  }
50683
49722
  }
50684
49723
 
50685
- css /* scss */ `
50686
- .o-grid-add-rows {
50687
- input.o-input {
50688
- width: 60px;
50689
- height: 30px;
50690
- }
50691
-
50692
- .o-validation-error {
50693
- display: inline-block !important;
50694
- margin-top: 0;
50695
- margin-left: 8px;
50696
- }
50697
- }
50698
- `;
50699
49724
  class GridAddRowsFooter extends owl.Component {
50700
49725
  static template = "o-spreadsheet-GridAddRowsFooter";
50701
49726
  static props = {
@@ -50940,14 +49965,6 @@ stores.inject(MyMetaStore, storeInstance);
50940
49965
  }
50941
49966
  }
50942
49967
 
50943
- const CURSOR_SVG = /*xml*/ `
50944
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
50945
- `;
50946
- css /* scss */ `
50947
- .o-paint-format-cursor {
50948
- cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
50949
- }
50950
- `;
50951
49968
  function useCellHovered(env, gridRef) {
50952
49969
  const delayedHoveredCell = useStore(DelayedHoveredCellStore);
50953
49970
  const hoveredTable = useStore(HoveredTableStore);
@@ -51193,7 +50210,6 @@ stores.inject(MyMetaStore, storeInstance);
51193
50210
  };
51194
50211
  static components = { Popover };
51195
50212
  cellPopovers;
51196
- zIndex = ComponentsImportance.GridPopover;
51197
50213
  setup() {
51198
50214
  this.cellPopovers = useStore(CellPopoverStore);
51199
50215
  }
@@ -51512,58 +50528,6 @@ stores.inject(MyMetaStore, storeInstance);
51512
50528
  this.props.onOpenContextMenu(type, ev.clientX, ev.clientY);
51513
50529
  }
51514
50530
  }
51515
- css /* scss */ `
51516
- .o-col-resizer {
51517
- position: absolute;
51518
- top: 0;
51519
- left: ${HEADER_WIDTH}px;
51520
- right: ${SCROLLBAR_WIDTH}px;
51521
- height: ${HEADER_HEIGHT}px;
51522
- width: calc(100% - ${HEADER_WIDTH + SCROLLBAR_WIDTH}px);
51523
- &.o-dragging {
51524
- cursor: grabbing;
51525
- }
51526
- &.o-grab {
51527
- cursor: grab;
51528
- }
51529
- .dragging-col-line {
51530
- top: ${HEADER_HEIGHT}px;
51531
- position: absolute;
51532
- width: 2px;
51533
- height: 10000px;
51534
- background-color: black;
51535
- }
51536
- .dragging-col-shadow {
51537
- top: ${HEADER_HEIGHT}px;
51538
- position: absolute;
51539
- height: 10000px;
51540
- background-color: black;
51541
- opacity: 0.1;
51542
- }
51543
- .o-handle {
51544
- position: absolute;
51545
- height: ${HEADER_HEIGHT}px;
51546
- width: 4px;
51547
- cursor: e-resize;
51548
- background-color: ${SELECTION_BORDER_COLOR};
51549
- }
51550
- .dragging-resizer {
51551
- top: ${HEADER_HEIGHT}px;
51552
- position: absolute;
51553
- margin-left: 2px;
51554
- width: 1px;
51555
- height: 10000px;
51556
- background-color: ${SELECTION_BORDER_COLOR};
51557
- }
51558
- .o-unhide {
51559
- color: ${ICONS_COLOR};
51560
- }
51561
- .o-unhide:hover {
51562
- z-index: ${ComponentsImportance.Grid + 1};
51563
- background-color: lightgrey;
51564
- }
51565
- }
51566
- `;
51567
50531
  class ColResizer extends AbstractResizer {
51568
50532
  static props = {
51569
50533
  onOpenContextMenu: Function,
@@ -51706,57 +50670,6 @@ stores.inject(MyMetaStore, storeInstance);
51706
50670
  return this.env.model.getters.getPaneDivisions(this.sheetId).xSplit > 0;
51707
50671
  }
51708
50672
  }
51709
- css /* scss */ `
51710
- .o-row-resizer {
51711
- position: absolute;
51712
- top: ${HEADER_HEIGHT}px;
51713
- left: 0;
51714
- bottom: ${SCROLLBAR_WIDTH}px;
51715
- width: ${HEADER_WIDTH}px;
51716
- &.o-dragging {
51717
- cursor: grabbing;
51718
- }
51719
- &.o-grab {
51720
- cursor: grab;
51721
- }
51722
- .dragging-row-line {
51723
- left: ${HEADER_WIDTH}px;
51724
- position: absolute;
51725
- width: 10000px;
51726
- height: 2px;
51727
- background-color: black;
51728
- }
51729
- .dragging-row-shadow {
51730
- left: ${HEADER_WIDTH}px;
51731
- position: absolute;
51732
- width: 10000px;
51733
- background-color: black;
51734
- opacity: 0.1;
51735
- }
51736
- .o-handle {
51737
- position: absolute;
51738
- height: 4px;
51739
- width: ${HEADER_WIDTH}px;
51740
- cursor: n-resize;
51741
- background-color: ${SELECTION_BORDER_COLOR};
51742
- }
51743
- .dragging-resizer {
51744
- left: ${HEADER_WIDTH}px;
51745
- position: absolute;
51746
- margin-top: 2px;
51747
- width: 10000px;
51748
- height: 1px;
51749
- background-color: ${SELECTION_BORDER_COLOR};
51750
- }
51751
- .o-unhide {
51752
- color: ${ICONS_COLOR};
51753
- }
51754
- .o-unhide:hover {
51755
- z-index: ${ComponentsImportance.Grid + 1};
51756
- background-color: lightgrey;
51757
- }
51758
- }
51759
- `;
51760
50673
  class RowResizer extends AbstractResizer {
51761
50674
  static props = {
51762
50675
  onOpenContextMenu: Function,
@@ -51897,18 +50810,6 @@ stores.inject(MyMetaStore, storeInstance);
51897
50810
  return this.env.model.getters.getPaneDivisions(this.sheetId).ySplit > 0;
51898
50811
  }
51899
50812
  }
51900
- css /* scss */ `
51901
- .o-overlay {
51902
- .all {
51903
- position: absolute;
51904
- top: 0;
51905
- left: 0;
51906
- right: 0;
51907
- width: ${HEADER_WIDTH}px;
51908
- height: ${HEADER_HEIGHT}px;
51909
- }
51910
- }
51911
- `;
51912
50813
  class HeadersOverlay extends owl.Component {
51913
50814
  static props = {
51914
50815
  onOpenContextMenu: Function,
@@ -52863,17 +51764,6 @@ stores.inject(MyMetaStore, storeInstance);
52863
51764
  return onMouseWheel;
52864
51765
  }
52865
51766
 
52866
- css /* scss */ `
52867
- .o-border {
52868
- position: absolute;
52869
- &:hover {
52870
- cursor: grab;
52871
- }
52872
- }
52873
- .o-moving {
52874
- cursor: grabbing;
52875
- }
52876
- `;
52877
51767
  class Border extends owl.Component {
52878
51768
  static template = "o-spreadsheet-Border";
52879
51769
  static props = {
@@ -52912,32 +51802,6 @@ stores.inject(MyMetaStore, storeInstance);
52912
51802
  }
52913
51803
 
52914
51804
  const MOBILE_HANDLER_WIDTH = 40;
52915
- css /* scss */ `
52916
- .o-corner {
52917
- position: absolute;
52918
- }
52919
-
52920
- .o-corner-button {
52921
- border: 1px solid white;
52922
- height: ${AUTOFILL_EDGE_LENGTH}px;
52923
- width: ${AUTOFILL_EDGE_LENGTH}px;
52924
- }
52925
- .o-corner-nw,
52926
- .o-corner-se {
52927
- &:hover {
52928
- cursor: nwse-resize;
52929
- }
52930
- }
52931
- .o-corner-ne,
52932
- .o-corner-sw {
52933
- &:hover {
52934
- cursor: nesw-resize;
52935
- }
52936
- }
52937
- .o-resizing {
52938
- cursor: grabbing;
52939
- }
52940
- `;
52941
51805
  class Corner extends owl.Component {
52942
51806
  static template = "o-spreadsheet-Corner";
52943
51807
  static props = {
@@ -53003,11 +51867,6 @@ stores.inject(MyMetaStore, storeInstance);
53003
51867
  return { dirX, dirY };
53004
51868
  }
53005
51869
 
53006
- css /*SCSS*/ `
53007
- .o-highlight {
53008
- z-index: ${ComponentsImportance.Highlight};
53009
- }
53010
- `;
53011
51870
  class Highlight extends owl.Component {
53012
51871
  static template = "o-spreadsheet-Highlight";
53013
51872
  static props = {
@@ -53142,24 +52001,6 @@ stores.inject(MyMetaStore, storeInstance);
53142
52001
  }
53143
52002
  };
53144
52003
 
53145
- css /* scss */ `
53146
- .o-scrollbar {
53147
- position: absolute;
53148
- overflow: auto;
53149
- z-index: ${ComponentsImportance.ScrollBar};
53150
- background-color: ${BACKGROUND_GRAY_COLOR};
53151
-
53152
- &.corner {
53153
- box-sizing: content-box;
53154
- right: 0px;
53155
- bottom: 0px;
53156
- height: ${SCROLLBAR_WIDTH}px;
53157
- width: ${SCROLLBAR_WIDTH}px;
53158
- border-top: 1px solid #e2e3e3;
53159
- border-left: 1px solid #e2e3e3;
53160
- }
53161
- }
53162
- `;
53163
52004
  class ScrollBar extends owl.Component {
53164
52005
  static props = {
53165
52006
  width: { type: Number, optional: true },
@@ -53322,24 +52163,6 @@ stores.inject(MyMetaStore, storeInstance);
53322
52163
  }, () => [ref.el]);
53323
52164
  }
53324
52165
 
53325
- css /* scss */ `
53326
- .o-spreadsheet {
53327
- .os-input {
53328
- border-width: 0 0 1px 0;
53329
- border-color: transparent;
53330
- outline: none;
53331
- text-overflow: ellipsis;
53332
- color: ${TEXT_BODY};
53333
- }
53334
- .os-input:hover,
53335
- .os-input.o-input-border {
53336
- border-color: ${GRAY_300};
53337
- }
53338
- .os-input:focus {
53339
- border-color: ${ACTION_COLOR};
53340
- }
53341
- }
53342
- `;
53343
52166
  class TextInput extends owl.Component {
53344
52167
  static template = "o-spreadsheet-TextInput";
53345
52168
  static props = {
@@ -53421,21 +52244,6 @@ stores.inject(MyMetaStore, storeInstance);
53421
52244
  }
53422
52245
  }
53423
52246
 
53424
- css /* scss */ `
53425
- .o-menu-item-button {
53426
- display: flex;
53427
- justify-content: center;
53428
- align-items: center;
53429
- margin: 2px 1px;
53430
- padding: 0px 1px;
53431
- border-radius: 2px;
53432
- min-width: 22px;
53433
- }
53434
- .o-disabled {
53435
- opacity: 0.6;
53436
- cursor: default;
53437
- }
53438
- `;
53439
52247
  class ActionButton extends owl.Component {
53440
52248
  static template = "o-spreadsheet-ActionButton";
53441
52249
  static props = {
@@ -53488,41 +52296,6 @@ stores.inject(MyMetaStore, storeInstance);
53488
52296
  }
53489
52297
  }
53490
52298
 
53491
- css /* scss */ `
53492
- .o-color-picker-widget {
53493
- display: flex;
53494
- position: relative;
53495
- align-items: center;
53496
- height: 30px;
53497
-
53498
- .o-color-picker-button-style {
53499
- display: flex;
53500
- justify-content: center;
53501
- align-items: center;
53502
- margin: 2px;
53503
- padding: 3px;
53504
- border-radius: 2px;
53505
- cursor: pointer;
53506
- &:not([disabled]):hover {
53507
- background-color: rgba(0, 0, 0, 0.08);
53508
- }
53509
- }
53510
-
53511
- .o-color-picker-button {
53512
- > span {
53513
- border-bottom: 4px solid;
53514
- height: 20px;
53515
- margin-top: 2px;
53516
- display: block;
53517
- }
53518
-
53519
- &[disabled] {
53520
- pointer-events: none;
53521
- opacity: 0.3;
53522
- }
53523
- }
53524
- }
53525
- `;
53526
52299
  class ColorPickerWidget extends owl.Component {
53527
52300
  static template = "o-spreadsheet-ColorPickerWidget";
53528
52301
  static props = {
@@ -53555,26 +52328,6 @@ stores.inject(MyMetaStore, storeInstance);
53555
52328
  }
53556
52329
  }
53557
52330
 
53558
- css /* scss */ `
53559
- .o-font-size-editor {
53560
- width: max-content !important;
53561
- height: calc(100% - 4px);
53562
- input.o-font-size {
53563
- outline: none;
53564
- height: 20px;
53565
- width: 31px;
53566
- text-align: center;
53567
- }
53568
- }
53569
- .o-text-options > div {
53570
- cursor: pointer;
53571
- line-height: 26px;
53572
- padding: 3px 12px;
53573
- &:hover {
53574
- background-color: rgba(0, 0, 0, 0.08);
53575
- }
53576
- }
53577
- `;
53578
52331
  class FontSizeEditor extends owl.Component {
53579
52332
  static template = "o-spreadsheet-FontSizeEditor";
53580
52333
  static props = {
@@ -53650,41 +52403,6 @@ stores.inject(MyMetaStore, storeInstance);
53650
52403
  }
53651
52404
  }
53652
52405
 
53653
- css /* scss */ `
53654
- .o-chart-title-designer {
53655
- .o-hoverable-button {
53656
- height: 30px;
53657
- }
53658
- .o-dropdown-content .o-hoverable-button {
53659
- height: fit-content;
53660
- }
53661
-
53662
- .o-divider {
53663
- border-right: 1px solid ${GRAY_300};
53664
- margin: 0px 4px;
53665
- height: 14px;
53666
- }
53667
-
53668
- .o-menu-item-button.active {
53669
- background-color: #e6f4ea;
53670
- color: #188038;
53671
- }
53672
-
53673
- .o-dropdown-content {
53674
- overflow-y: auto;
53675
- overflow-x: hidden;
53676
- padding: 2px;
53677
- z-index: 100;
53678
- box-shadow: 1px 2px 5px 2px rgba(51, 51, 51, 0.15);
53679
-
53680
- .o-dropdown-line {
53681
- > span {
53682
- padding: 4px;
53683
- }
53684
- }
53685
- }
53686
- }
53687
- `;
53688
52406
  class TextStyler extends owl.Component {
53689
52407
  static template = "o-spreadsheet.TextStyler";
53690
52408
  static components = { ColorPickerWidget, ActionButton, FontSizeEditor };
@@ -54512,27 +53230,6 @@ stores.inject(MyMetaStore, storeInstance);
54512
53230
  }
54513
53231
  }
54514
53232
 
54515
- css /* scss */ `
54516
- .o-badge-selection {
54517
- gap: 1px;
54518
- button.o-button {
54519
- border-radius: 0;
54520
- &.selected {
54521
- color: ${GRAY_900};
54522
- border-color: ${ACTION_COLOR};
54523
- background: ${BADGE_SELECTED_COLOR};
54524
- font-weight: 600;
54525
- }
54526
-
54527
- &:first-child {
54528
- border-radius: 4px 0 0 4px;
54529
- }
54530
- &:last-child {
54531
- border-radius: 0 4px 4px 0;
54532
- }
54533
- }
54534
- }
54535
- `;
54536
53233
  class BadgeSelection extends owl.Component {
54537
53234
  static template = "o-spreadsheet.BadgeSelection";
54538
53235
  static props = {
@@ -54542,13 +53239,6 @@ stores.inject(MyMetaStore, storeInstance);
54542
53239
  };
54543
53240
  }
54544
53241
 
54545
- css /* scss */ `
54546
- .o-chart-title-designer {
54547
- > span {
54548
- height: 30px;
54549
- }
54550
- }
54551
- `;
54552
53242
  class ChartTitle extends owl.Component {
54553
53243
  static template = "o-spreadsheet.ChartTitle";
54554
53244
  static components = { Section, TextStyler };
@@ -54610,31 +53300,12 @@ stores.inject(MyMetaStore, storeInstance);
54610
53300
  }
54611
53301
  }
54612
53302
 
54613
- const CIRCLE_SVG = /*xml*/ `
54614
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
54615
- <circle r="2" fill="#FFF"/>
54616
- </svg>
54617
- `;
54618
- css /* scss */ `
54619
- .o-radio {
54620
- input {
54621
- appearance: none;
54622
- -webkit-appearance: none;
54623
- -moz-appearance: none;
54624
- width: 14px;
54625
- height: 14px;
54626
- border: 1px solid ${GRAY_300};
54627
- outline: none;
54628
- border-radius: 8px;
54629
-
54630
- &:checked {
54631
- background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
54632
- background-color: ${ACTION_COLOR};
54633
- border-color: ${ACTION_COLOR};
54634
- }
54635
- }
54636
- }
54637
- `;
53303
+ // FIXME Encoding version used in css
53304
+ // const CIRCLE_SVG = /*xml*/ `
53305
+ // <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
53306
+ // <circle r="2" fill="#FFF"/>
53307
+ // </svg>
53308
+ // `;
54638
53309
  class RadioSelection extends owl.Component {
54639
53310
  static template = "o-spreadsheet.RadioSelection";
54640
53311
  static props = {
@@ -55131,45 +53802,6 @@ stores.inject(MyMetaStore, storeInstance);
55131
53802
  }
55132
53803
  }
55133
53804
 
55134
- css /* scss */ `
55135
- .o-gauge-color-set {
55136
- table {
55137
- table-layout: fixed;
55138
- margin-top: 2%;
55139
- display: table;
55140
- text-align: left;
55141
- font-size: 12px;
55142
- line-height: 18px;
55143
- width: 100%;
55144
- font-size: 12px;
55145
- }
55146
-
55147
- td {
55148
- height: 30px;
55149
- padding: 6px 0;
55150
- }
55151
- th.o-gauge-color-set-colorPicker {
55152
- width: 8%;
55153
- }
55154
- th.o-gauge-color-set-text {
55155
- width: 25%;
55156
- }
55157
- th.o-gauge-color-set-operator {
55158
- width: 10%;
55159
- }
55160
- th.o-gauge-color-set-value {
55161
- width: 22%;
55162
- }
55163
- th.o-gauge-color-set-type {
55164
- width: 30%;
55165
- }
55166
- input,
55167
- select {
55168
- width: 100%;
55169
- height: 100%;
55170
- }
55171
- }
55172
- `;
55173
53805
  class GaugeChartDesignPanel extends owl.Component {
55174
53806
  static template = "o-spreadsheet-GaugeChartDesignPanel";
55175
53807
  static components = {
@@ -55635,7 +54267,7 @@ stores.inject(MyMetaStore, storeInstance);
55635
54267
  return SCORECARD_CHART_TITLE_FONT_SIZE;
55636
54268
  }
55637
54269
  translate(term) {
55638
- return _t(term);
54270
+ return this.env.model.getters.dynamicTranslate(term);
55639
54271
  }
55640
54272
  setColor(color, colorPickerId) {
55641
54273
  switch (colorPickerId) {
@@ -55975,40 +54607,6 @@ stores.inject(MyMetaStore, storeInstance);
55975
54607
  design: TreeMapChartDesignPanel,
55976
54608
  });
55977
54609
 
55978
- css /* scss */ `
55979
- .o-section .o-input.o-type-selector {
55980
- height: 30px;
55981
- padding-left: 35px;
55982
- padding-top: 5px;
55983
- }
55984
- .o-type-selector-preview {
55985
- left: 5px;
55986
- top: 3px;
55987
- .o-chart-preview {
55988
- width: 24px;
55989
- height: 24px;
55990
- }
55991
- }
55992
-
55993
- .o-popover .o-chart-select-popover {
55994
- background: #fff;
55995
- .o-chart-type-item {
55996
- cursor: pointer;
55997
- padding: 3px 6px;
55998
- margin: 1px 2px;
55999
- &.selected,
56000
- &:hover {
56001
- border: 1px solid ${ACTION_COLOR};
56002
- background: ${BADGE_SELECTED_COLOR};
56003
- padding: 2px 5px;
56004
- }
56005
- .o-chart-preview {
56006
- width: 48px;
56007
- height: 48px;
56008
- }
56009
- }
56010
- }
56011
- `;
56012
54610
  class ChartTypePicker extends owl.Component {
56013
54611
  static template = "o-spreadsheet-ChartTypePicker";
56014
54612
  static components = { Section, Popover };
@@ -56111,38 +54709,6 @@ stores.inject(MyMetaStore, storeInstance);
56111
54709
  }
56112
54710
  }
56113
54711
 
56114
- css /* scss */ `
56115
- .o-chart {
56116
- .o-panel {
56117
- display: flex;
56118
- .o-panel-element {
56119
- flex: 1 0 auto;
56120
- padding: 8px 0px;
56121
- text-align: center;
56122
- cursor: pointer;
56123
- border-right: 1px solid ${GRAY_300};
56124
-
56125
- &.inactive {
56126
- color: ${TEXT_BODY};
56127
- background-color: ${GRAY_100};
56128
- border-bottom: 1px solid ${GRAY_300};
56129
- }
56130
-
56131
- &:not(.inactive) {
56132
- color: ${TEXT_HEADING};
56133
- border-bottom: 1px solid #fff;
56134
- }
56135
-
56136
- .fa {
56137
- margin-right: 4px;
56138
- }
56139
- }
56140
- .o-panel-element:last-child {
56141
- border-right: none;
56142
- }
56143
- }
56144
- }
56145
- `;
56146
54712
  class ChartPanel extends owl.Component {
56147
54713
  static template = "o-spreadsheet-ChartPanel";
56148
54714
  static components = { Section, ChartTypePicker };
@@ -56231,26 +54797,6 @@ stores.inject(MyMetaStore, storeInstance);
56231
54797
  }
56232
54798
  }
56233
54799
 
56234
- css /* scss */ `
56235
- .o-icon-picker {
56236
- position: absolute;
56237
- z-index: ${ComponentsImportance.IconPicker};
56238
- box-shadow: 1px 2px 5px 2px rgba(51, 51, 51, 0.15);
56239
- background-color: white;
56240
- padding: 2px 1px;
56241
- }
56242
- .o-cf-icon-line {
56243
- display: flex;
56244
- padding: 0 6px;
56245
- }
56246
- .o-icon-picker-item {
56247
- cursor: pointer;
56248
- &:hover {
56249
- background-color: ${BADGE_SELECTED_COLOR};
56250
- outline: ${ACTION_COLOR} solid 1px;
56251
- }
56252
- }
56253
- `;
56254
54800
  class IconPicker extends owl.Component {
56255
54801
  static template = "o-spreadsheet-IconPicker";
56256
54802
  static props = {
@@ -56288,77 +54834,6 @@ stores.inject(MyMetaStore, storeInstance);
56288
54834
  }, () => [highlightProvider.highlights]);
56289
54835
  }
56290
54836
 
56291
- css /* scss */ `
56292
- .o-cf-preview {
56293
- &.o-cf-cursor-ptr {
56294
- cursor: pointer;
56295
- }
56296
-
56297
- border-bottom: 1px solid ${GRAY_300};
56298
- height: 80px;
56299
- padding: 10px;
56300
- position: relative;
56301
- cursor: pointer;
56302
- &:hover,
56303
- &.o-cf-dragging {
56304
- background-color: ${GRAY_200};
56305
- }
56306
-
56307
- &:not(:hover) .o-cf-delete-button {
56308
- display: none;
56309
- }
56310
- .o-cf-preview-icon {
56311
- border: 1px solid ${GRAY_300};
56312
- background-color: #fff;
56313
- position: absolute;
56314
- height: 50px;
56315
- width: 50px;
56316
- .o-icon {
56317
- width: ${CF_ICON_EDGE_LENGTH}px;
56318
- height: ${CF_ICON_EDGE_LENGTH}px;
56319
- }
56320
- }
56321
- .o-cf-preview-description {
56322
- left: 65px;
56323
- margin-bottom: auto;
56324
- margin-right: 8px;
56325
- margin-top: auto;
56326
- position: relative;
56327
- width: 142px;
56328
- .o-cf-preview-description-rule {
56329
- margin-bottom: 4px;
56330
- max-height: 2.8em;
56331
- line-height: 1.4em;
56332
- }
56333
- .o-cf-preview-range {
56334
- font-size: 12px;
56335
- }
56336
- }
56337
- .o-cf-delete {
56338
- left: 90%;
56339
- top: 39%;
56340
- position: absolute;
56341
- }
56342
- &:not(:hover):not(.o-cf-dragging) .o-cf-drag-handle {
56343
- display: none !important;
56344
- }
56345
- .o-cf-drag-handle {
56346
- left: -8px;
56347
- cursor: move;
56348
- .o-icon {
56349
- width: 6px;
56350
- height: 30px;
56351
- }
56352
- }
56353
-
56354
- .o-icon.arrow-down {
56355
- color: #e06666;
56356
- }
56357
- .o-icon.arrow-up {
56358
- color: #6aa84f;
56359
- }
56360
- }
56361
- `;
56362
54837
  class ConditionalFormatPreview extends owl.Component {
56363
54838
  static template = "o-spreadsheet-ConditionalFormatPreview";
56364
54839
  icons = ICONS;
@@ -56477,95 +54952,6 @@ stores.inject(MyMetaStore, storeInstance);
56477
54952
  }
56478
54953
  }
56479
54954
 
56480
- css /* scss */ `
56481
- .o-cf-ruleEditor {
56482
- .o-cf-preview-display {
56483
- border: 1px solid ${GRAY_300};
56484
- padding: 10px;
56485
- }
56486
-
56487
- .o-cf-cell-is-rule {
56488
- .o-divider {
56489
- border-right: 1px solid ${GRAY_300};
56490
- margin: 4px 6px;
56491
- }
56492
- }
56493
- .o-cf-color-scale-editor {
56494
- .o-threshold {
56495
- .o-select-with-input {
56496
- max-width: 150px;
56497
- }
56498
- .o-threshold-value {
56499
- flex-grow: 1;
56500
- flex-basis: 60%;
56501
- min-width: 0px; /* input overflows in Firefox otherwise */
56502
- }
56503
- .o-threshold-value input:disabled {
56504
- background-color: #edebed;
56505
- }
56506
- }
56507
- }
56508
- .o-cf-iconset-rule {
56509
- .o-cf-clickable-icon {
56510
- border: 1px solid ${GRAY_200};
56511
- border-radius: 4px;
56512
- cursor: pointer;
56513
- &:hover {
56514
- border-color: ${ACTION_COLOR};
56515
- background-color: ${BADGE_SELECTED_COLOR};
56516
- }
56517
- .o-icon {
56518
- width: ${CF_ICON_EDGE_LENGTH}px;
56519
- height: ${CF_ICON_EDGE_LENGTH}px;
56520
- }
56521
- }
56522
- .o-cf-iconsets {
56523
- gap: 11px;
56524
- .o-cf-iconset {
56525
- padding: 7px 8px;
56526
- width: 95px;
56527
- .o-icon {
56528
- margin: 0 3px;
56529
- }
56530
- svg {
56531
- vertical-align: baseline;
56532
- }
56533
- }
56534
- }
56535
- .o-inflection {
56536
- .o-cf-icon-button {
56537
- padding: 4px 10px;
56538
- }
56539
- table {
56540
- font-size: 13px;
56541
- td {
56542
- padding: 6px 0;
56543
- }
56544
-
56545
- th.o-cf-iconset-icons {
56546
- width: 25px;
56547
- }
56548
- th.o-cf-iconset-text {
56549
- width: 82px;
56550
- }
56551
- th.o-cf-iconset-operator {
56552
- width: 20px;
56553
- }
56554
- .o-cf-iconset-type {
56555
- min-width: 80px;
56556
- }
56557
- }
56558
- }
56559
- }
56560
-
56561
- .o-icon.arrow-down {
56562
- color: #e06666;
56563
- }
56564
- .o-icon.arrow-up {
56565
- color: #6aa84f;
56566
- }
56567
- }
56568
- `;
56569
54955
  class ConditionalFormattingEditor extends owl.Component {
56570
54956
  static template = "o-spreadsheet-ConditionalFormattingEditor";
56571
54957
  static props = {
@@ -57095,25 +55481,6 @@ stores.inject(MyMetaStore, storeInstance);
57095
55481
  */
57096
55482
  const currenciesRegistry = new Registry();
57097
55483
 
57098
- css /* scss */ `
57099
- .o-custom-currency {
57100
- .o-format-proposals {
57101
- color: black;
57102
- }
57103
-
57104
- .o-format-examples {
57105
- background: #f9fafb;
57106
- padding: 8px;
57107
- border-radius: 4px;
57108
- border: 1px solid #d8dadd;
57109
- color: #374151;
57110
- }
57111
-
57112
- table {
57113
- table-layout: fixed;
57114
- }
57115
- }
57116
- `;
57117
55484
  class CustomCurrencyPanel extends owl.Component {
57118
55485
  static template = "o-spreadsheet-CustomCurrencyPanel";
57119
55486
  static components = { Section, Checkbox };
@@ -57187,7 +55554,7 @@ stores.inject(MyMetaStore, storeInstance);
57187
55554
  });
57188
55555
  }
57189
55556
  const emptyCurrency = {
57190
- name: _t(CustomCurrencyTerms.Custom),
55557
+ name: CustomCurrencyTerms.Custom,
57191
55558
  code: "",
57192
55559
  symbol: "",
57193
55560
  decimalPlaces: 2,
@@ -57346,31 +55713,6 @@ stores.inject(MyMetaStore, storeInstance);
57346
55713
  }
57347
55714
  }
57348
55715
 
57349
- css /* scss */ `
57350
- .o-sidePanel {
57351
- .o-dv-preview {
57352
- height: 70px;
57353
- cursor: pointer;
57354
- border-bottom: 1px solid ${FIGURE_BORDER_COLOR};
57355
-
57356
- .o-dv-container {
57357
- min-width: 0; /* otherwise flex won't shrink correctly */
57358
- }
57359
-
57360
- .o-dv-preview-description {
57361
- font-size: 13px;
57362
- }
57363
-
57364
- &:hover {
57365
- background-color: rgba(0, 0, 0, 0.08);
57366
- }
57367
-
57368
- &:not(:hover) .o-dv-preview-delete {
57369
- display: none !important;
57370
- }
57371
- }
57372
- }
57373
- `;
57374
55716
  class DataValidationPreview extends owl.Component {
57375
55717
  static template = "o-spreadsheet-DataValidationPreview";
57376
55718
  static props = {
@@ -57819,38 +56161,6 @@ stores.inject(MyMetaStore, storeInstance);
57819
56161
  }
57820
56162
  }
57821
56163
 
57822
- css /* scss */ `
57823
- .o-find-and-replace {
57824
- outline: none;
57825
- height: 100%;
57826
- .o-input-search-container {
57827
- display: flex;
57828
- .o-input-with-count {
57829
- flex-grow: 1;
57830
- width: auto;
57831
- }
57832
- .o-input-without-count {
57833
- width: 100%;
57834
- }
57835
- .o-input-count {
57836
- width: fit-content;
57837
- padding: 4px 0 4px 4px;
57838
- white-space: nowrap;
57839
- }
57840
- }
57841
-
57842
- .o-result-buttons {
57843
- .o-button {
57844
- height: 19px;
57845
- width: 19px;
57846
- .o-icon {
57847
- height: 14px;
57848
- width: 14px;
57849
- }
57850
- }
57851
- }
57852
- }
57853
- `;
57854
56164
  class FindAndReplacePanel extends owl.Component {
57855
56165
  static template = "o-spreadsheet-FindAndReplacePanel";
57856
56166
  static components = { SelectionInput, Section, Checkbox, ValidationMessages };
@@ -57961,22 +56271,6 @@ stores.inject(MyMetaStore, storeInstance);
57961
56271
  }
57962
56272
  }
57963
56273
 
57964
- css /* scss */ `
57965
- .o-more-formats-panel {
57966
- .format-preview {
57967
- height: 49px;
57968
- background-color: white;
57969
- cursor: pointer;
57970
-
57971
- &:hover {
57972
- background-color: rgba(0, 0, 0, 0.08);
57973
- }
57974
- }
57975
- .check-icon {
57976
- width: 24px;
57977
- }
57978
- }
57979
- `;
57980
56274
  const DATE_FORMAT_ACTIONS = createActions([
57981
56275
  formatNumberFullDateTime,
57982
56276
  formatNumberISODate,
@@ -58134,21 +56428,6 @@ stores.inject(MyMetaStore, storeInstance);
58134
56428
  }
58135
56429
  }
58136
56430
 
58137
- css /* scss */ `
58138
- .o-sidePanel {
58139
- .o-pivot-measure-display-field,
58140
- .o-pivot-measure-display-value {
58141
- border: solid 1px ${GRAY_300};
58142
- border-radius: 3px;
58143
- }
58144
-
58145
- .o-pivot-measure-display-description {
58146
- white-space: pre-wrap;
58147
- color: dimgray;
58148
- border-left: 2px solid ${GRAY_300};
58149
- }
58150
- }
58151
- `;
58152
56431
  class PivotMeasureDisplayPanel extends owl.Component {
58153
56432
  static template = "o-spreadsheet-PivotMeasureDisplayPanel";
58154
56433
  static props = {
@@ -58207,11 +56486,6 @@ stores.inject(MyMetaStore, storeInstance);
58207
56486
  return positions;
58208
56487
  }
58209
56488
 
58210
- css /* scss */ `
58211
- .pivot-defer-update {
58212
- min-height: 40px;
58213
- }
58214
- `;
58215
56489
  class PivotDeferUpdate extends owl.Component {
58216
56490
  static template = "o-spreadsheet-PivotDeferUpdate";
58217
56491
  static props = {
@@ -58300,25 +56574,6 @@ stores.inject(MyMetaStore, storeInstance);
58300
56574
  return pendingHtmlContent.filter((content) => content.value);
58301
56575
  }
58302
56576
 
58303
- css /* scss */ `
58304
- input.pivot-dimension-search-field:focus {
58305
- outline: none;
58306
- }
58307
- .pivot-dimension-search-field-icon svg {
58308
- width: 13px;
58309
- height: 13px;
58310
- }
58311
- .pivot-dimension-search {
58312
- background-color: white;
58313
- }
58314
- .add-dimension.o-button {
58315
- padding: 2px 7px;
58316
- font-weight: 400;
58317
- font-size: 12px;
58318
- flex-grow: 0;
58319
- height: inherit;
58320
- }
58321
- `;
58322
56577
  class AddDimensionButton extends owl.Component {
58323
56578
  static template = "o-spreadsheet-AddDimensionButton";
58324
56579
  static components = { Popover, TextValueProvider };
@@ -58412,35 +56667,6 @@ stores.inject(MyMetaStore, storeInstance);
58412
56667
  }
58413
56668
  }
58414
56669
 
58415
- // don't use bg-white since it's flipped to dark in dark mode and we don't support dark mode
58416
- css /* scss */ `
58417
- .pivot-dimension {
58418
- background-color: white;
58419
- border: 1px solid ${GRAY_300};
58420
- border-radius: 4px;
58421
-
58422
- select.o-input {
58423
- height: inherit;
58424
- }
58425
-
58426
- select > option {
58427
- background-color: white;
58428
- }
58429
-
58430
- .pivot-dim-operator-label {
58431
- min-width: 120px;
58432
- }
58433
-
58434
- &.pivot-dimension-invalid {
58435
- background-color: #ffdddd;
58436
- border-color: red !important;
58437
- select,
58438
- input {
58439
- background-color: #ffdddd;
58440
- }
58441
- }
58442
- }
58443
- `;
58444
56670
  class PivotDimension extends owl.Component {
58445
56671
  static template = "o-spreadsheet-PivotDimension";
58446
56672
  static props = {
@@ -58592,19 +56818,6 @@ stores.inject(MyMetaStore, storeInstance);
58592
56818
  }
58593
56819
  }
58594
56820
 
58595
- css /* scss */ `
58596
- .o-pivot-sort {
58597
- .o-sort-card {
58598
- width: fit-content;
58599
- background-color: ${GRAY_100};
58600
- border: 1px solid ${GRAY_300};
58601
-
58602
- .o-sort-value {
58603
- color: ${PRIMARY_BUTTON_BG};
58604
- }
58605
- }
58606
- }
58607
- `;
58608
56821
  class PivotSortSection extends owl.Component {
58609
56822
  static template = "o-spreadsheet-PivotSortSection";
58610
56823
  static components = {
@@ -58650,11 +56863,6 @@ stores.inject(MyMetaStore, storeInstance);
58650
56863
  }
58651
56864
  }
58652
56865
 
58653
- css /* scss */ `
58654
- .add-calculated-measure {
58655
- cursor: pointer;
58656
- }
58657
- `;
58658
56866
  class PivotLayoutConfigurator extends owl.Component {
58659
56867
  static template = "o-spreadsheet-PivotLayoutConfigurator";
58660
56868
  static components = {
@@ -58847,12 +57055,13 @@ stores.inject(MyMetaStore, storeInstance);
58847
57055
  addCalculatedMeasure() {
58848
57056
  const { measures } = this.props.definition;
58849
57057
  const measureName = this.env.model.getters.generateNewCalculatedMeasureName(measures);
57058
+ const aggregator = "sum";
58850
57059
  this.props.onDimensionsUpdated({
58851
57060
  measures: measures.concat([
58852
57061
  {
58853
- id: this.getMeasureId(measureName),
57062
+ id: this.getMeasureId(measureName, aggregator),
58854
57063
  fieldName: measureName,
58855
- aggregator: "sum",
57064
+ aggregator,
58856
57065
  computedBy: {
58857
57066
  sheetId: this.env.model.getters.getActiveSheetId(),
58858
57067
  formula: "=0",
@@ -59468,11 +57677,6 @@ stores.inject(MyMetaStore, storeInstance);
59468
57677
  }
59469
57678
  }
59470
57679
 
59471
- css /* scss */ `
59472
- .o-checkbox-selection {
59473
- max-height: 300px;
59474
- }
59475
- `;
59476
57680
  class RemoveDuplicatesPanel extends owl.Component {
59477
57681
  static template = "o-spreadsheet-RemoveDuplicatesPanel";
59478
57682
  static components = { ValidationMessages, Section, Checkbox };
@@ -59559,12 +57763,6 @@ stores.inject(MyMetaStore, storeInstance);
59559
57763
  }
59560
57764
  }
59561
57765
 
59562
- css /* scss */ `
59563
- .o-locale-preview {
59564
- border: 1px solid ${GRAY_300};
59565
- background-color: ${GRAY_100};
59566
- }
59567
- `;
59568
57766
  class SettingsPanel extends owl.Component {
59569
57767
  static template = "o-spreadsheet-SettingsPanel";
59570
57768
  static components = { Section, ValidationMessages, BadgeSelection };
@@ -59838,34 +58036,6 @@ stores.inject(MyMetaStore, storeInstance);
59838
58036
  ctx.restore();
59839
58037
  }
59840
58038
 
59841
- css /* scss */ `
59842
- .o-table-style-list-item {
59843
- border: 1px solid transparent;
59844
- border-radius: 4px;
59845
- &.selected {
59846
- border: 1px solid ${ACTION_COLOR};
59847
- background: ${BADGE_SELECTED_COLOR};
59848
- }
59849
-
59850
- &:hover {
59851
- background: #ddd;
59852
- .o-table-style-edit-button {
59853
- display: block !important;
59854
- right: 0;
59855
- top: 0;
59856
- background: #fff;
59857
- cursor: pointer;
59858
- border: 1px solid #ddd;
59859
- padding: 1px 1px 1px 2px;
59860
- .o-icon {
59861
- font-size: 12px;
59862
- width: 12px;
59863
- height: 12px;
59864
- }
59865
- }
59866
- }
59867
- }
59868
- `;
59869
58039
  class TableStylePreview extends owl.Component {
59870
58040
  static template = "o-spreadsheet-TableStylePreview";
59871
58041
  static components = { MenuPopover };
@@ -59926,52 +58096,6 @@ stores.inject(MyMetaStore, storeInstance);
59926
58096
  }
59927
58097
  }
59928
58098
 
59929
- css /* scss */ `
59930
- .o-table-style-popover {
59931
- /* 7 tables preview + padding by line */
59932
- width: calc((66px + 4px * 2) * 7 + 1.5rem * 2);
59933
- background: #fff;
59934
- font-size: 14px;
59935
- user-select: none;
59936
-
59937
- .o-notebook {
59938
- border-bottom: 1px solid ${GRAY_300};
59939
-
59940
- .o-notebook-tab {
59941
- padding: 5px 15px;
59942
- border: 1px solid ${GRAY_300};
59943
- margin-bottom: -1px;
59944
- margin-left: -1px;
59945
- color: ${TEXT_BODY};
59946
- cursor: pointer;
59947
- transition: color 0.2s, border-color 0.2s;
59948
-
59949
- &.selected {
59950
- border-bottom-color: #fff;
59951
- border-top-color: ${PRIMARY_BUTTON_BG};
59952
- color: ${TEXT_HEADING};
59953
- }
59954
- }
59955
- }
59956
-
59957
- .o-table-style-list-item {
59958
- padding: 3px;
59959
- }
59960
-
59961
- .o-table-style-popover-preview {
59962
- width: 66px;
59963
- height: 51px;
59964
- }
59965
-
59966
- .o-new-table-style {
59967
- font-size: 36px;
59968
- color: #666;
59969
- &:hover {
59970
- background: #f5f5f5;
59971
- }
59972
- }
59973
- }
59974
- `;
59975
58099
  class TableStylesPopover extends owl.Component {
59976
58100
  static template = "o-spreadsheet-TableStylesPopover";
59977
58101
  static components = { Popover, TableStylePreview };
@@ -60011,31 +58135,6 @@ stores.inject(MyMetaStore, storeInstance);
60011
58135
  }
60012
58136
  }
60013
58137
 
60014
- css /* scss */ `
60015
- .o-table-style-picker {
60016
- border: 1px solid ${GRAY_300};
60017
- border-radius: 3px;
60018
-
60019
- .o-table-style-picker-arrow {
60020
- border-left: 1px solid ${GRAY_300};
60021
-
60022
- &:hover {
60023
- background: #f5f5f5;
60024
- cursor: pointer;
60025
- }
60026
- }
60027
-
60028
- .o-table-style-list-item {
60029
- padding: 5px 6px;
60030
- margin: 5px 2px;
60031
-
60032
- .o-table-style-picker-preview {
60033
- width: 51px;
60034
- height: 36px;
60035
- }
60036
- }
60037
- }
60038
- `;
60039
58138
  class TableStylePicker extends owl.Component {
60040
58139
  static template = "o-spreadsheet-TableStylePicker";
60041
58140
  static components = { TableStylesPopover, TableStylePreview };
@@ -60079,19 +58178,6 @@ stores.inject(MyMetaStore, storeInstance);
60079
58178
  }
60080
58179
  }
60081
58180
 
60082
- css /* scss */ `
60083
- .o-table-panel {
60084
- input.o-table-n-of-headers {
60085
- width: 14px;
60086
- text-align: center;
60087
- }
60088
-
60089
- .o-info-icon {
60090
- width: 14px;
60091
- height: 14px;
60092
- }
60093
- }
60094
- `;
60095
58181
  class TablePanel extends owl.Component {
60096
58182
  static template = "o-spreadsheet-TablePanel";
60097
58183
  static components = { TableStylePicker, SelectionInput, ValidationMessages, Checkbox, Section };
@@ -60243,19 +58329,6 @@ stores.inject(MyMetaStore, storeInstance);
60243
58329
  }
60244
58330
  }
60245
58331
 
60246
- css /* scss */ `
60247
- .o-table-style-editor-panel {
60248
- .o-table-style-list-item {
60249
- margin: 2px 7px;
60250
- padding: 6px 9px;
60251
-
60252
- .o-table-style-edit-template-preview {
60253
- width: 71px;
60254
- height: 51px;
60255
- }
60256
- }
60257
- }
60258
- `;
60259
58332
  const DEFAULT_TABLE_STYLE_COLOR = "#3C78D8";
60260
58333
  class TableStyleEditorPanel extends owl.Component {
60261
58334
  static template = "o-spreadsheet-TableStyleEditorPanel";
@@ -60690,15 +58763,6 @@ stores.inject(MyMetaStore, storeInstance);
60690
58763
 
60691
58764
  const SIZE = 3;
60692
58765
  const COLOR = "#777";
60693
- css /* scss */ `
60694
- .o-table-resizer {
60695
- width: ${SIZE * 2}px;
60696
- height: ${SIZE * 2}px;
60697
- border-bottom: ${SIZE}px solid ${COLOR};
60698
- border-right: ${SIZE}px solid ${COLOR};
60699
- cursor: nwse-resize;
60700
- }
60701
- `;
60702
58766
  class TableResizer extends owl.Component {
60703
58767
  static template = "o-spreadsheet-TableResizer";
60704
58768
  static props = { table: Object };
@@ -61444,14 +59508,16 @@ stores.inject(MyMetaStore, storeInstance);
61444
59508
  "background-color": this.getBackgroundColor(cellStyle),
61445
59509
  });
61446
59510
  }
61447
- get icon() {
61448
- switch (this.props.sortDirection) {
61449
- case "asc":
61450
- return "fa-sort-asc";
61451
- case "desc":
61452
- return "fa-sort-desc";
59511
+ get verticalJustifyClass() {
59512
+ const cellStyle = this.env.model.getters.getCellComputedStyle(this.props.position);
59513
+ switch (cellStyle.verticalAlign) {
59514
+ case "top":
59515
+ return "justify-content-start";
59516
+ case "middle":
59517
+ return "justify-content-center";
59518
+ case "bottom":
61453
59519
  default:
61454
- return "fa-sort";
59520
+ return "justify-content-end";
61455
59521
  }
61456
59522
  }
61457
59523
  getBackgroundColor(cellStyle) {
@@ -61513,43 +59579,6 @@ stores.inject(MyMetaStore, storeInstance);
61513
59579
  }
61514
59580
  }
61515
59581
 
61516
- css /* scss */ `
61517
- .o_pivot_html_renderer {
61518
- width: 100%;
61519
- border-collapse: collapse;
61520
-
61521
- &:hover {
61522
- cursor: pointer;
61523
- }
61524
-
61525
- td,
61526
- th {
61527
- border: 1px solid #dee2e6;
61528
- background-color: #fff;
61529
- padding: 0.3rem;
61530
- white-space: nowrap;
61531
-
61532
- &:hover {
61533
- filter: brightness(0.9);
61534
- }
61535
- }
61536
-
61537
- td {
61538
- text-align: right;
61539
- }
61540
-
61541
- th {
61542
- background-color: #f5f5f5;
61543
- font-weight: bold;
61544
- color: black;
61545
- }
61546
-
61547
- .o_missing_value {
61548
- color: #46646d;
61549
- background: #e7f2f6;
61550
- }
61551
- }
61552
- `;
61553
59582
  class PivotHTMLRenderer extends owl.Component {
61554
59583
  static template = "o_spreadsheet.PivotHTMLRenderer";
61555
59584
  static components = { Checkbox };
@@ -70652,6 +68681,30 @@ stores.inject(MyMetaStore, storeInstance);
70652
68681
  pivot: { ...definition, collapsedDomains: newDomains },
70653
68682
  });
70654
68683
  }
68684
+ iconsOnCellRegistry.add("pivot_dashboard_sorting", (getters, position) => {
68685
+ if (!getters.isDashboard()) {
68686
+ return undefined;
68687
+ }
68688
+ const pivotCell = getters.getPivotCellFromPosition(position);
68689
+ if (pivotCell.type !== "MEASURE_HEADER") {
68690
+ return undefined;
68691
+ }
68692
+ const sortDirection = getters.getPivotCellSortDirection(position);
68693
+ if (sortDirection !== "asc" && sortDirection !== "desc") {
68694
+ return undefined;
68695
+ }
68696
+ const cellStyle = getters.getCellComputedStyle(position);
68697
+ return {
68698
+ type: `pivot_dashboard_sorting_${sortDirection}`,
68699
+ priority: 5,
68700
+ horizontalAlign: "right",
68701
+ size: GRID_ICON_EDGE_LENGTH,
68702
+ margin: GRID_ICON_MARGIN,
68703
+ svg: sortDirection === "asc" ? getCaretUpSvg(cellStyle) : getCaretDownSvg(cellStyle),
68704
+ position,
68705
+ onClick: undefined, // click is managed by ClickableCellSortIcon
68706
+ };
68707
+ });
70655
68708
 
70656
68709
  class CellIconPlugin extends CoreViewPlugin {
70657
68710
  static getters = ["doesCellHaveGridIcon", "getCellIcons", "getCellIconRect"];
@@ -71131,7 +69184,7 @@ stores.inject(MyMetaStore, storeInstance);
71131
69184
  return { value: 0 };
71132
69185
  }
71133
69186
  const { columns, rows } = super.definition;
71134
- if (columns.length + rows.length !== domain.length) {
69187
+ if (measure.aggregator && columns.length + rows.length !== domain.length) {
71135
69188
  const values = this.getValuesToAggregate(measure, domain);
71136
69189
  const aggregator = AGGREGATORS_FN[measure.aggregator];
71137
69190
  if (!aggregator) {
@@ -71150,11 +69203,17 @@ stores.inject(MyMetaStore, storeInstance);
71150
69203
  if (columns.find((col) => col.nameWithGranularity === symbolName)) {
71151
69204
  const { colDomain } = domainToColRowDomain(this, domain);
71152
69205
  const symbolIndex = colDomain.findIndex((node) => node.field === symbolName);
69206
+ if (symbolIndex === -1) {
69207
+ return new NotAvailableError();
69208
+ }
71153
69209
  return this.getPivotHeaderValueAndFormat(colDomain.slice(0, symbolIndex + 1));
71154
69210
  }
71155
69211
  if (rows.find((row) => row.nameWithGranularity === symbolName)) {
71156
69212
  const { rowDomain } = domainToColRowDomain(this, domain);
71157
69213
  const symbolIndex = rowDomain.findIndex((row) => row.field === symbolName);
69214
+ if (symbolIndex === -1) {
69215
+ return new NotAvailableError();
69216
+ }
71158
69217
  return this.getPivotHeaderValueAndFormat(rowDomain.slice(0, symbolIndex + 1));
71159
69218
  }
71160
69219
  return this.getPivotCellValueAndFormat(symbolName, domain);
@@ -75548,6 +73607,21 @@ stores.inject(MyMetaStore, storeInstance);
75548
73607
  }
75549
73608
  }
75550
73609
 
73610
+ /**
73611
+ * This plugin provides dynamic translation getter. In o-spreadsheet, it has
73612
+ * no implementation, but this plugin can be replaced by another one to provide
73613
+ * a real implementation.
73614
+ *
73615
+ * For example, in Odoo, the plugin is replaced by a plugin that used the
73616
+ * module namespace to dynamically translate terms.
73617
+ */
73618
+ class DynamicTranslate extends UIPlugin {
73619
+ static getters = ["dynamicTranslate"];
73620
+ dynamicTranslate(term) {
73621
+ return term;
73622
+ }
73623
+ }
73624
+
75551
73625
  const genericRepeatsTransforms = [
75552
73626
  repeatSheetDependantCommand,
75553
73627
  repeatTargetDependantCommand,
@@ -77518,13 +75592,10 @@ stores.inject(MyMetaStore, storeInstance);
77518
75592
  const deltaCol = isBasedBefore && isCol ? thickness : 0;
77519
75593
  const deltaRow = isBasedBefore && !isCol ? thickness : 0;
77520
75594
  const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
77521
- const originalSize = Object.fromEntries(toRemove.map((element) => {
77522
- const size = isCol
77523
- ? this.getters.getColSize(cmd.sheetId, element)
77524
- : this.getters.getUserRowSize(cmd.sheetId, element);
77525
- const isDefaultCol = isCol && size === DEFAULT_CELL_WIDTH;
77526
- return [element, isDefaultCol ? undefined : size];
77527
- }));
75595
+ const originalSize = {};
75596
+ for (const element of toRemove) {
75597
+ originalSize[element] = this.getters.getHeaderSize(cmd.sheetId, cmd.dimension, element);
75598
+ }
77528
75599
  const target = [
77529
75600
  {
77530
75601
  left: isCol ? start + deltaCol : 0,
@@ -77568,11 +75639,11 @@ stores.inject(MyMetaStore, storeInstance);
77568
75639
  for (const element of toRemove) {
77569
75640
  const size = originalSize[element];
77570
75641
  const currentSize = this.getters.getHeaderSize(cmd.sheetId, cmd.dimension, currentIndex);
77571
- if (size && size !== currentSize) {
75642
+ if (size !== currentSize) {
77572
75643
  resizingGroups[size] ??= [];
77573
75644
  resizingGroups[size].push(currentIndex);
77574
- currentIndex += 1;
77575
75645
  }
75646
+ currentIndex += 1;
77576
75647
  }
77577
75648
  for (const size in resizingGroups) {
77578
75649
  this.dispatch("RESIZE_COLUMNS_ROWS", {
@@ -79179,6 +77250,7 @@ stores.inject(MyMetaStore, storeInstance);
79179
77250
  .add("table_ui_resize", TableResizeUI)
79180
77251
  .add("datavalidation_insert", DataValidationInsertionPlugin)
79181
77252
  .add("checkbox_toggle", CheckboxTogglePlugin)
77253
+ .add("dynamic_translate", DynamicTranslate)
79182
77254
  .add("geo_features", GeoFeaturePlugin);
79183
77255
  // Plugins which have a state, but which should not be shared in collaborative
79184
77256
  const statefulUIPluginRegistry = new Registry()
@@ -80490,11 +78562,6 @@ stores.inject(MyMetaStore, storeInstance);
80490
78562
  { transform: "scale(0.8)", offset: 0.33 },
80491
78563
  { opacity: "0", transform: "scale(1)", offset: 1 },
80492
78564
  ];
80493
- css /* scss */ `
80494
- .o-ripple {
80495
- z-index: 1;
80496
- }
80497
- `;
80498
78565
  class RippleEffect extends owl.Component {
80499
78566
  static template = "o-spreadsheet-RippleEffect";
80500
78567
  static props = {
@@ -80666,59 +78733,6 @@ stores.inject(MyMetaStore, storeInstance);
80666
78733
  }
80667
78734
  }
80668
78735
 
80669
- css /* scss */ `
80670
- .o-sheet {
80671
- padding: 0 15px;
80672
- padding-right: 10px;
80673
- height: ${DESKTOP_BOTTOMBAR_HEIGHT}px;
80674
- border-left: 1px solid #c1c1c1;
80675
- border-right: 1px solid #c1c1c1;
80676
- margin-left: -1px;
80677
- cursor: pointer;
80678
- &:hover {
80679
- background-color: rgba(0, 0, 0, 0.08);
80680
- }
80681
-
80682
- &.active {
80683
- color: ${ACTION_COLOR};
80684
- background-color: #ffffff;
80685
- box-shadow: 0 1px 3px 1px rgba(60, 64, 67, 0.15);
80686
- }
80687
-
80688
- .o-sheet-icon {
80689
- z-index: 1;
80690
-
80691
- &:hover {
80692
- background-color: rgba(0, 0, 0, 0.08);
80693
- }
80694
- }
80695
-
80696
- .o-sheet-name {
80697
- outline: none;
80698
- padding: 2px 4px;
80699
-
80700
- &.o-sheet-name-editable {
80701
- border-radius: 2px;
80702
- border: 2px solid mediumblue;
80703
- /* negative margins so nothing moves when the border is added */
80704
- margin-left: -2px;
80705
- margin-right: -2px;
80706
- }
80707
- }
80708
-
80709
- .o-sheet-color {
80710
- bottom: 0;
80711
- left: 0;
80712
- height: 6px;
80713
- z-index: 1;
80714
- width: calc(100% - 1px);
80715
- }
80716
- }
80717
-
80718
- .o-spreadshet-mobile .o-sheet {
80719
- height: ${MOBILE_BOTTOMBAR_HEIGHT}px;
80720
- }
80721
- `;
80722
78736
  class BottomBarSheet extends owl.Component {
80723
78737
  static template = "o-spreadsheet-BottomBarSheet";
80724
78738
  static props = {
@@ -80998,20 +79012,6 @@ stores.inject(MyMetaStore, storeInstance);
80998
79012
  }
80999
79013
  }
81000
79014
 
81001
- // -----------------------------------------------------------------------------
81002
- // SpreadSheet
81003
- // -----------------------------------------------------------------------------
81004
- css /* scss */ `
81005
- .o-selection-statistic {
81006
- margin-right: 20px;
81007
- padding: 4px 4px 4px 8px;
81008
- color: #333;
81009
- cursor: pointer;
81010
- &:hover {
81011
- background-color: rgba(0, 0, 0, 0.08) !important;
81012
- }
81013
- }
81014
- `;
81015
79015
  class BottomBarStatistic extends owl.Component {
81016
79016
  static template = "o-spreadsheet-BottomBarStatistic";
81017
79017
  static props = {
@@ -81068,77 +79068,6 @@ stores.inject(MyMetaStore, storeInstance);
81068
79068
  // SpreadSheet
81069
79069
  // -----------------------------------------------------------------------------
81070
79070
  const MENU_MAX_HEIGHT = 250;
81071
- css /* scss */ `
81072
- .o-spreadsheet-bottom-bar {
81073
- background-color: ${BACKGROUND_GRAY_COLOR};
81074
- padding-left: ${HEADER_WIDTH}px;
81075
- font-size: 15px;
81076
- border-top: 1px solid lightgrey;
81077
-
81078
- .o-sheet-item {
81079
- cursor: pointer;
81080
- &:hover {
81081
- background-color: rgba(0, 0, 0, 0.08);
81082
- }
81083
- }
81084
-
81085
- .o-all-sheets {
81086
- max-width: 70%;
81087
- .o-bottom-bar-fade-out {
81088
- background-image: linear-gradient(-90deg, #cfcfcf, transparent 1%);
81089
- }
81090
-
81091
- .o-bottom-bar-fade-in {
81092
- z-index: 1;
81093
- background-image: linear-gradient(90deg, #cfcfcf, transparent 1%);
81094
- }
81095
-
81096
- .o-sheet-list {
81097
- overflow-y: hidden;
81098
- overflow-x: auto;
81099
-
81100
- &::-webkit-scrollbar {
81101
- display: none; /* Chrome */
81102
- }
81103
- -ms-overflow-style: none; /* IE and Edge */
81104
- scrollbar-width: none; /* Firefox */
81105
- }
81106
- }
81107
-
81108
- .o-bottom-bar-arrows {
81109
- .o-bottom-bar-arrow {
81110
- cursor: pointer;
81111
- &:hover:not([class*="o-disabled"]) {
81112
- .o-icon {
81113
- opacity: 0.9;
81114
- }
81115
- }
81116
-
81117
- .o-icon {
81118
- height: 18px;
81119
- width: 18px;
81120
- font-size: 18px;
81121
- }
81122
- }
81123
- }
81124
- }
81125
-
81126
- .o-spreadsheet-mobile .o-spreadsheet-bottom-bar {
81127
- padding-left: 0;
81128
-
81129
- .add-sheet-container {
81130
- order: 2;
81131
- }
81132
-
81133
- .o-add-sheet {
81134
- margin-left: 0.5rem;
81135
- }
81136
-
81137
- .o-all-sheets {
81138
- max-width: none;
81139
- }
81140
- }
81141
- `;
81142
79071
  class BottomBar extends owl.Component {
81143
79072
  static template = "o-spreadsheet-BottomBar";
81144
79073
  static props = { onClick: Function };
@@ -81394,12 +79323,6 @@ stores.inject(MyMetaStore, storeInstance);
81394
79323
  }
81395
79324
  }
81396
79325
 
81397
- css /* scss */ `
81398
- .o-dashboard-clickable-cell {
81399
- position: absolute;
81400
- cursor: pointer;
81401
- }
81402
- `;
81403
79326
  class SpreadsheetDashboard extends owl.Component {
81404
79327
  static template = "o-spreadsheet-SpreadsheetDashboard";
81405
79328
  static props = { getGridSize: Function };
@@ -81491,27 +79414,6 @@ stores.inject(MyMetaStore, storeInstance);
81491
79414
  }
81492
79415
  }
81493
79416
 
81494
- css /* scss */ `
81495
- .o-header-group {
81496
- .o-header-group-header {
81497
- z-index: ${ComponentsImportance.HeaderGroupingButton};
81498
- .o-group-fold-button {
81499
- cursor: pointer;
81500
- width: 15px;
81501
- height: 15px;
81502
- border: 1px solid ${HEADER_GROUPING_BORDER_COLOR};
81503
- .o-icon {
81504
- width: 7px;
81505
- height: 7px;
81506
- }
81507
-
81508
- &:hover {
81509
- border-color: #777;
81510
- }
81511
- }
81512
- }
81513
- }
81514
- `;
81515
79417
  class AbstractHeaderGroup extends owl.Component {
81516
79418
  static template = "o-spreadsheet-HeaderGroup";
81517
79419
  static props = {
@@ -81662,27 +79564,6 @@ stores.inject(MyMetaStore, storeInstance);
81662
79564
  }
81663
79565
  }
81664
79566
 
81665
- css /* scss */ `
81666
- .o-header-group-frozen-pane-border {
81667
- &.o-group-rows {
81668
- margin-top: -1px;
81669
- border-bottom: 3px solid ${FROZEN_PANE_HEADER_BORDER_COLOR};
81670
- }
81671
- &.o-group-columns {
81672
- margin-left: -1px;
81673
- border-right: 3px solid ${FROZEN_PANE_HEADER_BORDER_COLOR};
81674
- }
81675
- }
81676
-
81677
- .o-header-group-main-pane {
81678
- &.o-group-rows {
81679
- margin-top: -2px; /* Counteract o-header-group-frozen-pane-border offset */
81680
- }
81681
- &.o-group-columns {
81682
- margin-left: -2px;
81683
- }
81684
- }
81685
- `;
81686
79567
  class HeaderGroupContainer extends owl.Component {
81687
79568
  static template = "o-spreadsheet-HeaderGroupContainer";
81688
79569
  static props = {
@@ -81761,121 +79642,6 @@ stores.inject(MyMetaStore, storeInstance);
81761
79642
  };
81762
79643
  }
81763
79644
 
81764
- css /* scss */ `
81765
- .o-sidePanel {
81766
- display: flex;
81767
- flex-direction: column;
81768
- overflow-x: hidden;
81769
- background-color: white;
81770
- border: solid ${GRAY_300};
81771
- border-width: 1px 0 0 1px;
81772
- user-select: none;
81773
- color: ${TEXT_BODY};
81774
-
81775
- &.collapsed {
81776
- padding: 8px;
81777
- cursor: pointer;
81778
-
81779
- .o-sidePanelTitle {
81780
- writing-mode: vertical-rl;
81781
- text-orientation: mixed;
81782
- }
81783
- }
81784
-
81785
- .o-sidePanelTitle {
81786
- line-height: 20px;
81787
- font-size: 16px;
81788
- }
81789
-
81790
- .o-sidePanelHeader {
81791
- padding: 8px;
81792
- border-bottom: 1px solid ${GRAY_300};
81793
- }
81794
-
81795
- .o-sidePanelAction {
81796
- padding: 5px 10px;
81797
- cursor: pointer;
81798
-
81799
- &.active {
81800
- background-color: ${BUTTON_ACTIVE_BG};
81801
- }
81802
-
81803
- &:hover {
81804
- background-color: ${BUTTON_HOVER_BG};
81805
- }
81806
- }
81807
- .o-sidePanelBody-container {
81808
- /* This overwrites the min-height: auto; of flex. Without this, a flex div cannot be smaller than its children */
81809
- min-height: 0;
81810
- }
81811
- .o-sidePanelBody {
81812
- overflow: auto;
81813
- width: 100%;
81814
- height: 100%;
81815
-
81816
- .o-section {
81817
- padding: 16px;
81818
-
81819
- .o-section-title {
81820
- font-weight: 500;
81821
- margin-bottom: 5px;
81822
- }
81823
-
81824
- .o-section-subtitle {
81825
- font-weight: 500;
81826
- font-size: 13px;
81827
- line-height: 14px;
81828
- margin: 8px 0 4px 0;
81829
- }
81830
-
81831
- .o-subsection-left {
81832
- display: inline-block;
81833
- width: 47%;
81834
- margin-right: 3%;
81835
- }
81836
-
81837
- .o-subsection-right {
81838
- display: inline-block;
81839
- width: 47%;
81840
- margin-left: 3%;
81841
- }
81842
- }
81843
-
81844
- .o-sidePanel-composer {
81845
- color: ${TEXT_BODY};
81846
- }
81847
- }
81848
-
81849
- .o-sidePanelButtons {
81850
- display: flex;
81851
- gap: 8px;
81852
- }
81853
-
81854
- .o-invalid {
81855
- border-width: 2px;
81856
- border-color: red;
81857
- }
81858
-
81859
- .o-sidePanel-handle-container {
81860
- width: 8px;
81861
- position: fixed;
81862
- top: 50%;
81863
- z-index: 1;
81864
- }
81865
- .o-sidePanel-handle {
81866
- cursor: col-resize;
81867
- color: #a9a9a9;
81868
- .o-icon {
81869
- height: 25px;
81870
- margin-left: -5px;
81871
- }
81872
- }
81873
- }
81874
-
81875
- .o-fw-bold {
81876
- font-weight: 500;
81877
- }
81878
- `;
81879
79645
  class SidePanel extends owl.Component {
81880
79646
  static template = "o-spreadsheet-SidePanel";
81881
79647
  static props = {
@@ -82050,11 +79816,6 @@ stores.inject(MyMetaStore, storeInstance);
82050
79816
  }
82051
79817
  }
82052
79818
 
82053
- css `
82054
- .o-small-composer {
82055
- z-index: ${ComponentsImportance.TopBarComposer};
82056
- }
82057
- `;
82058
79819
  class SmallBottomBar extends owl.Component {
82059
79820
  static components = { Composer, BottomBar, Ripple, RibbonMenu };
82060
79821
  static template = "o-spreadsheet-SmallBottomBar";
@@ -82142,36 +79903,12 @@ stores.inject(MyMetaStore, storeInstance);
82142
79903
 
82143
79904
  const COMPOSER_MAX_HEIGHT = 300;
82144
79905
  /* svg free of use from https://uxwing.com/formula-fx-icon/ */
82145
- const FX_SVG = /*xml*/ `
82146
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
82147
- <path d='m28 34-4 5v2h10l-6 40c-4 22-6 28-7 30-2 2-3 3-5 3-3 0-7-2-9-4H4c-2 2-4 4-4 7s4 6 8 6 9-2 15-8c8-7 13-17 18-39l7-35 13-1 3-6H49c4-23 7-27 11-27 2 0 5 2 8 6h4c1-1 4-4 4-7 0-2-3-6-9-6-5 0-13 4-20 10-6 7-9 14-11 24h-8zm41 16c4-5 7-7 8-7s2 1 5 9l3 12c-7 11-12 17-16 17l-3-1-2-1c-3 0-6 3-6 7s3 7 7 7c6 0 12-6 22-23l3 10c3 9 6 13 10 13 5 0 11-4 18-15l-3-4c-4 6-7 8-8 8-2 0-4-3-6-10l-5-15 8-10 6-4 3 1 3 2c2 0 6-3 6-7s-2-7-6-7c-6 0-11 5-21 20l-2-6c-3-9-5-14-9-14-5 0-12 6-18 15l3 3z' fill='#BDBDBD'/>
82148
- </svg>
82149
- `;
82150
- css /* scss */ `
82151
- .o-topbar-composer-container {
82152
- height: ${DESKTOP_TOPBAR_TOOLBAR_HEIGHT}px;
82153
- }
82154
-
82155
- .o-topbar-composer {
82156
- height: fit-content;
82157
- margin-top: -1px;
82158
- margin-bottom: -1px;
82159
- border: 1px solid;
82160
- font-family: ${DEFAULT_FONT};
82161
-
82162
- /* In readonly we always show the fx icon if the composer is empty, not matter the focus */
82163
- .o-composer:empty:not(:focus):not(.active)::before,
82164
- &.o-topbar-composer-readonly .o-composer:empty::before {
82165
- content: url("data:image/svg+xml,${encodeURIComponent(FX_SVG)}");
82166
- position: relative;
82167
- top: 20%;
82168
- }
82169
- }
82170
-
82171
- .user-select-text {
82172
- user-select: text;
82173
- }
82174
- `;
79906
+ // FIXME This svg is hardcoded in the css file. We should find a better way to handle it.
79907
+ // const FX_SVG = /*xml*/ `
79908
+ // <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
79909
+ // <path d='m28 34-4 5v2h10l-6 40c-4 22-6 28-7 30-2 2-3 3-5 3-3 0-7-2-9-4H4c-2 2-4 4-4 7s4 6 8 6 9-2 15-8c8-7 13-17 18-39l7-35 13-1 3-6H49c4-23 7-27 11-27 2 0 5 2 8 6h4c1-1 4-4 4-7 0-2-3-6-9-6-5 0-13 4-20 10-6 7-9 14-11 24h-8zm41 16c4-5 7-7 8-7s2 1 5 9l3 12c-7 11-12 17-16 17l-3-1-2-1c-3 0-6 3-6 7s3 7 7 7c6 0 12-6 22-23l3 10c3 9 6 13 10 13 5 0 11-4 18-15l-3-4c-4 6-7 8-8 8-2 0-4-3-6-10l-5-15 8-10 6-4 3 1 3 2c2 0 6-3 6-7s-2-7-6-7c-6 0-11 5-21 20l-2-6c-3-9-5-14-9-14-5 0-12 6-18 15l3 3z' fill='#BDBDBD'/>
79910
+ // </svg>
79911
+ // `;
82175
79912
  class TopBarComposer extends owl.Component {
82176
79913
  static template = "o-spreadsheet-TopBarComposer";
82177
79914
  static props = {};
@@ -82207,18 +79944,6 @@ stores.inject(MyMetaStore, storeInstance);
82207
79944
  style.height = this.focus === "inactive" ? `${DESKTOP_TOPBAR_TOOLBAR_HEIGHT}px` : "fit-content";
82208
79945
  return cssPropertiesToCss(style);
82209
79946
  }
82210
- get containerStyle() {
82211
- if (this.focus === "inactive") {
82212
- return cssPropertiesToCss({
82213
- "border-color": SEPARATOR_COLOR,
82214
- "border-right": "none",
82215
- });
82216
- }
82217
- return cssPropertiesToCss({
82218
- "border-color": SELECTION_BORDER_COLOR,
82219
- "z-index": String(ComponentsImportance.TopBarComposer),
82220
- });
82221
- }
82222
79947
  onFocus(selection) {
82223
79948
  this.composerFocusStore.focusComposer(this.composerInterface, { selection });
82224
79949
  }
@@ -82308,79 +80033,6 @@ stores.inject(MyMetaStore, storeInstance);
82308
80033
  // -----------------------------------------------------------------------------
82309
80034
  // Border Editor
82310
80035
  // -----------------------------------------------------------------------------
82311
- css /* scss */ `
82312
- .o-border-selector {
82313
- padding: 4px;
82314
- background-color: white;
82315
-
82316
- .o-divider {
82317
- border-right: 1px solid ${GRAY_300};
82318
- margin: 0 6px;
82319
- }
82320
-
82321
- .o-border-selector-section {
82322
- .o-dropdown-line {
82323
- height: 30px;
82324
- margin: 1px;
82325
- .o-line-item {
82326
- padding: 4px;
82327
- width: 26px;
82328
- height: 26px;
82329
- &.active {
82330
- background-color: ${BUTTON_ACTIVE_BG};
82331
- }
82332
- }
82333
- }
82334
- .o-border-style-tool {
82335
- padding: 0px 3px;
82336
- margin: 2px;
82337
- height: 25px;
82338
- }
82339
- }
82340
- }
82341
-
82342
- .o-border-style-dropdown {
82343
- background: #ffffff;
82344
- padding: 4px;
82345
- .o-dropdown-line {
82346
- }
82347
- .o-style-preview {
82348
- margin: 7px 5px 7px 5px;
82349
- width: 60px;
82350
- height: 5px;
82351
- }
82352
- .o-style-thin {
82353
- border-bottom: 1px solid #000000;
82354
- }
82355
- .o-style-medium {
82356
- border-bottom: 2px solid #000000;
82357
- }
82358
- .o-style-thick {
82359
- border-bottom: 3px solid #000000;
82360
- }
82361
- .o-style-dashed {
82362
- border-bottom: 1px dashed #000000;
82363
- }
82364
- .o-style-dotted {
82365
- border-bottom: 1px dotted #000000;
82366
- }
82367
- .o-dropdown-border-type {
82368
- cursor: pointer;
82369
- &:not(.o-disabled):not(.active):hover {
82370
- background-color: ${BUTTON_HOVER_BG};
82371
- }
82372
- }
82373
- .o-dropdown-border-check {
82374
- width: 20px;
82375
- font-size: 12px;
82376
- }
82377
- .o-border-picker-button {
82378
- padding: 0px !important;
82379
- margin: 5px 0px 0px 0px !important;
82380
- height: 25px !important;
82381
- }
82382
- }
82383
- `;
82384
80036
  class BorderEditor extends owl.Component {
82385
80037
  static template = "o-spreadsheet-BorderEditor";
82386
80038
  static props = {
@@ -82931,90 +80583,6 @@ stores.inject(MyMetaStore, storeInstance);
82931
80583
  // -----------------------------------------------------------------------------
82932
80584
  // TopBar
82933
80585
  // -----------------------------------------------------------------------------
82934
- css /* scss */ `
82935
- .o-topbar-divider {
82936
- border-right: 1px solid ${SEPARATOR_COLOR};
82937
- width: 0;
82938
- margin: 0 6px;
82939
- height: 30px;
82940
- }
82941
-
82942
- .o-toolbar-button {
82943
- height: 30px;
82944
- }
82945
-
82946
- .o-spreadsheet-topbar {
82947
- line-height: 1.2;
82948
- font-size: 14px;
82949
- font-weight: 500;
82950
- background-color: #fff;
82951
-
82952
- .o-topbar-top {
82953
- border-bottom: 1px solid ${SEPARATOR_COLOR};
82954
- padding: 2px 10px;
82955
-
82956
- /* Menus */
82957
- .o-topbar-topleft {
82958
- .o-topbar-menu {
82959
- padding: 4px 6px;
82960
- margin: 0 2px;
82961
-
82962
- &.active {
82963
- background-color: ${BUTTON_ACTIVE_BG};
82964
- color: ${BUTTON_ACTIVE_TEXT_COLOR};
82965
- }
82966
- }
82967
- }
82968
- }
82969
-
82970
- .irregularity-map {
82971
- border-top: 1px solid ${SEPARATOR_COLOR};
82972
- height: ${DESKTOP_TOPBAR_TOOLBAR_HEIGHT}px;
82973
-
82974
- .alert-info {
82975
- border-left: 3px solid ${ALERT_INFO_BORDER};
82976
- }
82977
- }
82978
-
82979
- .o-topbar-composer {
82980
- flex-grow: 1;
82981
- }
82982
-
82983
- /* Toolbar */
82984
- .o-topbar-toolbar {
82985
- height: ${DESKTOP_TOPBAR_TOOLBAR_HEIGHT}px;
82986
-
82987
- .o-readonly-toolbar {
82988
- background-color: ${BACKGROUND_HEADER_COLOR};
82989
- padding-left: 18px;
82990
- padding-right: 18px;
82991
- }
82992
-
82993
- /* Toolbar */
82994
- .o-toolbar-tools {
82995
- cursor: default;
82996
- }
82997
- }
82998
- }
82999
-
83000
- .o-spreadsheet-mobile {
83001
- .o-topbar-toolbar {
83002
- height: ${MOBILE_TOPBAR_TOOLBAR_HEIGHT}px;
83003
- }
83004
- .o-topbar-divider {
83005
- border-width: 2px;
83006
- border-radius: 4px;
83007
- }
83008
-
83009
- .o-toolbar-button {
83010
- height: 35px;
83011
- width: 31px;
83012
- .o-toolbar-button.o-mobile-disabled * {
83013
- color: ${DISABLED_TEXT_COLOR};
83014
- cursor: not-allowed;
83015
- }
83016
- }
83017
- `;
83018
80586
  class TopBar extends owl.Component {
83019
80587
  static template = "o-spreadsheet-TopBar";
83020
80588
  static props = {
@@ -83288,251 +80856,6 @@ stores.inject(MyMetaStore, storeInstance);
83288
80856
  }
83289
80857
  }
83290
80858
 
83291
- // -----------------------------------------------------------------------------
83292
- // SpreadSheet
83293
- // -----------------------------------------------------------------------------
83294
- const CARET_DOWN_SVG = /*xml*/ `
83295
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
83296
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
83297
- </svg>
83298
- `;
83299
- css /* scss */ `
83300
- .o-spreadsheet {
83301
- position: relative;
83302
- display: grid;
83303
- font-size: 14px;
83304
-
83305
- .text-muted {
83306
- color: ${TEXT_BODY_MUTED} !important;
83307
- }
83308
- .o-disabled {
83309
- opacity: 0.4;
83310
- cursor: default;
83311
- pointer-events: none;
83312
- }
83313
-
83314
- &,
83315
- *,
83316
- *:before,
83317
- *:after {
83318
- /* rtl not supported ATM */
83319
- direction: ltr;
83320
- }
83321
- .o-separator {
83322
- border-bottom: ${MENU_SEPARATOR_BORDER_WIDTH}px solid ${SEPARATOR_COLOR};
83323
- margin-top: ${MENU_SEPARATOR_PADDING}px;
83324
- margin-bottom: ${MENU_SEPARATOR_PADDING}px;
83325
- }
83326
- .o-hoverable-button {
83327
- border-radius: 2px;
83328
- cursor: pointer;
83329
- .o-icon {
83330
- color: ${TEXT_BODY};
83331
- }
83332
- &:not(.o-disabled):not(.active):hover {
83333
- background-color: ${BUTTON_HOVER_BG};
83334
- color: ${BUTTON_HOVER_TEXT_COLOR};
83335
- .o-icon {
83336
- color: ${BUTTON_HOVER_TEXT_COLOR};
83337
- }
83338
- }
83339
- &.active {
83340
- background-color: ${BUTTON_ACTIVE_BG};
83341
- color: ${BUTTON_ACTIVE_TEXT_COLOR};
83342
- .o-icon {
83343
- color: ${BUTTON_ACTIVE_TEXT_COLOR};
83344
- }
83345
- }
83346
- }
83347
-
83348
- .o-grid-container {
83349
- display: grid;
83350
- background-color: ${HEADER_GROUPING_BACKGROUND_COLOR};
83351
-
83352
- .o-top-left {
83353
- border: 1px solid ${GRID_BORDER_COLOR};
83354
- margin-bottom: -1px;
83355
- margin-right: -1px;
83356
- }
83357
-
83358
- .o-column-groups {
83359
- grid-column-start: 2;
83360
- border-top: 1px solid ${GRID_BORDER_COLOR};
83361
- }
83362
-
83363
- .o-row-groups {
83364
- grid-row-start: 2;
83365
- }
83366
-
83367
- .o-group-grid {
83368
- border-top: 1px solid ${GRID_BORDER_COLOR};
83369
- border-left: 1px solid ${GRID_BORDER_COLOR};
83370
- }
83371
- }
83372
-
83373
- .o-input {
83374
- min-width: 0px;
83375
- padding: 1px 0;
83376
- width: 100%;
83377
- outline: none;
83378
- border-color: ${GRAY_300};
83379
- color: ${GRAY_900};
83380
-
83381
- &::placeholder {
83382
- opacity: 0.5;
83383
- }
83384
- &:focus {
83385
- border-color: ${ACTION_COLOR};
83386
- }
83387
- }
83388
-
83389
- select.o-input {
83390
- cursor: pointer;
83391
- border-width: 0 0 1px 0;
83392
- padding: 1px 6px 1px 0px;
83393
-
83394
- appearance: none;
83395
- -webkit-appearance: none;
83396
- -moz-appearance: none;
83397
- background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
83398
- no-repeat right center;
83399
- text-overflow: ellipsis;
83400
-
83401
- &:disabled {
83402
- color: ${DISABLED_TEXT_COLOR};
83403
- opacity: 0.4;
83404
- cursor: default;
83405
- }
83406
- }
83407
-
83408
- .o-input[type="text"] {
83409
- border-width: 0 0 1px 0;
83410
- }
83411
-
83412
- .o-input[type="number"],
83413
- .o-number-input {
83414
- border-width: 0 0 1px 0;
83415
- /* Remove number input arrows */
83416
- appearance: textfield;
83417
- &::-webkit-outer-spin-button,
83418
- &::-webkit-inner-spin-button {
83419
- -webkit-appearance: none;
83420
- margin: 0;
83421
- }
83422
- }
83423
- }
83424
-
83425
- .o-two-columns {
83426
- grid-column: 1 / 3;
83427
- }
83428
-
83429
- .o-text-icon {
83430
- vertical-align: middle;
83431
- }
83432
- `;
83433
- // -----------------------------------------------------------------------------
83434
- // GRID STYLE
83435
- // -----------------------------------------------------------------------------
83436
- css /* scss */ `
83437
- .o-grid {
83438
- position: relative;
83439
- overflow: hidden;
83440
- background-color: ${BACKGROUND_GRAY_COLOR};
83441
- &:focus {
83442
- outline: none;
83443
- }
83444
-
83445
- > canvas {
83446
- box-sizing: content-box;
83447
- border-bottom: 1px solid #e2e3e3;
83448
- border-right: 1px solid #e2e3e3;
83449
- }
83450
-
83451
- .o-grid-overlay {
83452
- position: absolute;
83453
- outline: none;
83454
- }
83455
- }
83456
-
83457
- .o-button {
83458
- border: 1px solid;
83459
- border-radius: 4px;
83460
- font-weight: 500;
83461
- font-size: 14px;
83462
- height: 32px;
83463
- line-height: 16px;
83464
- flex-grow: 1;
83465
- background-color: ${BUTTON_BG};
83466
- border: 1px solid ${GRAY_200};
83467
- color: ${TEXT_BODY};
83468
-
83469
- &:disabled {
83470
- color: ${DISABLED_TEXT_COLOR};
83471
- }
83472
-
83473
- &.primary {
83474
- background-color: ${PRIMARY_BUTTON_BG};
83475
- border-color: ${PRIMARY_BUTTON_BG};
83476
- color: #fff;
83477
- &:hover:enabled {
83478
- color: #fff;
83479
- background-color: ${PRIMARY_BUTTON_HOVER_BG};
83480
- }
83481
- &:active:enabled {
83482
- background-color: ${PRIMARY_BUTTON_ACTIVE_BG};
83483
- color: ${PRIMARY_BUTTON_BG};
83484
- }
83485
- &.o-disabled,
83486
- &:disabled {
83487
- opacity: 0.5;
83488
- }
83489
- }
83490
-
83491
- &:hover:enabled {
83492
- color: ${BUTTON_HOVER_TEXT_COLOR};
83493
- background-color: ${BUTTON_HOVER_BG};
83494
- }
83495
- &:active:enabled {
83496
- color: ${BUTTON_ACTIVE_TEXT_COLOR};
83497
- background-color: ${BUTTON_ACTIVE_BG};
83498
- }
83499
-
83500
- &.o-disabled,
83501
- &:disabled {
83502
- opacity: 0.8;
83503
- }
83504
-
83505
- &.o-button-danger:hover {
83506
- color: #ffffff;
83507
- background: ${ALERT_DANGER_BORDER};
83508
- }
83509
- }
83510
-
83511
- .o-button-link {
83512
- cursor: pointer;
83513
- text-decoration: none;
83514
- color: ${ACTION_COLOR};
83515
- font-weight: 500;
83516
- &:hover,
83517
- &:active {
83518
- color: ${ACTION_COLOR_HOVER};
83519
- }
83520
- }
83521
-
83522
- .o-button-icon {
83523
- cursor: pointer;
83524
- color: ${TEXT_BODY_MUTED};
83525
- font-weight: 500;
83526
- &:hover,
83527
- &:active {
83528
- color: ${TEXT_BODY};
83529
- }
83530
- }
83531
-
83532
- .o-spreadsheet-bottombar-wrapper {
83533
- z-index: ${ComponentsImportance.ScrollBar + 1};
83534
- }
83535
- `;
83536
80859
  class Spreadsheet extends owl.Component {
83537
80860
  static template = "o-spreadsheet-Spreadsheet";
83538
80861
  static props = {
@@ -88389,6 +85712,8 @@ stores.inject(MyMetaStore, storeInstance);
88389
85712
  exports.coreTypes = coreTypes;
88390
85713
  exports.findCellInNewZone = findCellInNewZone;
88391
85714
  exports.functionCache = functionCache;
85715
+ exports.getCaretDownSvg = getCaretDownSvg;
85716
+ exports.getCaretUpSvg = getCaretUpSvg;
88392
85717
  exports.helpers = helpers;
88393
85718
  exports.hooks = hooks;
88394
85719
  exports.invalidateCFEvaluationCommands = invalidateCFEvaluationCommands;
@@ -88409,9 +85734,9 @@ stores.inject(MyMetaStore, storeInstance);
88409
85734
  exports.tokenize = tokenize;
88410
85735
 
88411
85736
 
88412
- __info__.version = "19.1.0-alpha.0";
88413
- __info__.date = "2025-09-11T07:49:49.483Z";
88414
- __info__.hash = "587c928";
85737
+ __info__.version = "19.1.0-alpha.2";
85738
+ __info__.date = "2025-09-19T07:26:49.306Z";
85739
+ __info__.hash = "8cc543d";
88415
85740
 
88416
85741
 
88417
85742
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);