@odoo/o-spreadsheet 19.5.0-alpha.11 → 19.5.0-alpha.13

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.
Files changed (56) hide show
  1. package/dist/material_symbols_outlined.css +9 -0
  2. package/dist/o_spreadsheet.cjs +2578 -900
  3. package/dist/o_spreadsheet.css +182 -41
  4. package/dist/o_spreadsheet.esm.js +2570 -892
  5. package/dist/o_spreadsheet.iife.js +2578 -900
  6. package/dist/o_spreadsheet.min.iife.js +344 -344
  7. package/dist/o_spreadsheet.xml +238 -150
  8. package/dist/types/actions/data_actions.d.ts +1 -0
  9. package/dist/types/components/bottom_bar/bottom_bar_statistic/bottom_bar_statistic.d.ts +3 -0
  10. package/dist/types/components/dashboard/clickable_cell_sort_icon/clickable_cell_sort_icon.d.ts +1 -1
  11. package/dist/types/components/figures/figure/figure.d.ts +1 -0
  12. package/dist/types/components/figures/figure_carousel/figure_carousel.d.ts +10 -0
  13. package/dist/types/components/figures/figure_container/figure_container.d.ts +1 -2
  14. package/dist/types/components/grid/grid.d.ts +1 -0
  15. package/dist/types/components/helpers/chart_drag_and_drop.d.ts +15 -0
  16. package/dist/types/components/helpers/dom_helpers.d.ts +3 -2
  17. package/dist/types/components/link/link_editor/link_editor.d.ts +1 -1
  18. package/dist/types/components/side_panel/carousel_panel/carousel_panel.d.ts +1 -1
  19. package/dist/types/components/side_panel/chart/building_blocks/color_scale/color_scale_picker.d.ts +1 -1
  20. package/dist/types/components/side_panel/chart/scorecard_chart_panel/scorecard_chart_config_panel.d.ts +6 -10
  21. package/dist/types/components/side_panel/data_analysis/chart_suggestion_preview.d.ts +19 -0
  22. package/dist/types/components/side_panel/data_analysis/data_analysis_panel.d.ts +17 -0
  23. package/dist/types/components/side_panel/data_analysis/data_analysis_store.d.ts +15 -0
  24. package/dist/types/components/side_panel/pivot/pivot_layout_configurator/pivot_layout_configurator.d.ts +1 -6
  25. package/dist/types/components/side_panel/side_panel/side_panel_store.d.ts +2 -1
  26. package/dist/types/components/standalone_grid_canvas/carousel_data_view_print.d.ts +32 -0
  27. package/dist/types/components/standalone_grid_canvas/standalone_grid_canvas.d.ts +6 -0
  28. package/dist/types/components/standalone_viewport/standalone_viewport.d.ts +6 -3
  29. package/dist/types/components/standalone_viewport/standalone_viewport_store.d.ts +2 -1
  30. package/dist/types/components/tables/hovered_table_store.d.ts +6 -7
  31. package/dist/types/constants.d.ts +13 -1
  32. package/dist/types/functions/helpers.d.ts +4 -0
  33. package/dist/types/functions/module_operators.d.ts +1 -1
  34. package/dist/types/functions/module_text.d.ts +11 -11
  35. package/dist/types/functions/module_web.d.ts +1 -1
  36. package/dist/types/helpers/carousel_helpers.d.ts +8 -1
  37. package/dist/types/helpers/data_analysis.d.ts +16 -0
  38. package/dist/types/helpers/figures/chart.d.ts +1 -1
  39. package/dist/types/helpers/figures/charts/chart_data_source_helpers.d.ts +10 -0
  40. package/dist/types/helpers/figures/charts/chart_suggestion_engine.d.ts +8 -0
  41. package/dist/types/helpers/figures/charts/chart_ui_common.d.ts +8 -1
  42. package/dist/types/helpers/figures/charts/charts_suggestions_constants.d.ts +37 -0
  43. package/dist/types/helpers/figures/charts/gauge_chart_rendering.d.ts +6 -2
  44. package/dist/types/helpers/text_helper.d.ts +1 -1
  45. package/dist/types/index.d.ts +3 -1
  46. package/dist/types/registries/figures_registry.d.ts +1 -0
  47. package/dist/types/stores/cell_hover_overlay_store.d.ts +15 -0
  48. package/dist/types/stores/chart_drag_store.d.ts +10 -0
  49. package/dist/types/stores/grid_renderer_store.d.ts +3 -2
  50. package/dist/types/stores/main_viewport_store.d.ts +3 -0
  51. package/dist/types/stores/viewports_store.d.ts +0 -1
  52. package/dist/types/types/chart/chart.d.ts +3 -1
  53. package/dist/types/types/chart/chart_suggestion.d.ts +136 -0
  54. package/dist/types/types/chart/scorecard_chart.d.ts +3 -4
  55. package/dist/types/types/commands.d.ts +16 -11
  56. package/package.json +6 -5
@@ -1,9 +1,9 @@
1
1
  <!--
2
2
  This file is generated by o-spreadsheet build tools. Do not edit it.
3
3
  @see https://github.com/odoo/o-spreadsheet
4
- @version 19.5.0-alpha.11
5
- @date 2026-08-12T09:17:25.295Z
6
- @hash bc056d7
4
+ @version 19.5.0-alpha.13
5
+ @date 2026-08-21T15:33:45.089Z
6
+ @hash a73559e
7
7
  -->
8
8
  <odoo>
9
9
  <t t-name="o-spreadsheet-ValidationMessages">
@@ -77,7 +77,7 @@
77
77
  t-if="this.env.model.getters.isReadonly()"
78
78
  class="o-readonly-toolbar d-flex flex-grow-1 align-items-center text-muted">
79
79
  <span>
80
- <i class="fa fa-eye"/>
80
+ <i class="oi" data-icon="visibility"/>
81
81
  Readonly Access
82
82
  </span>
83
83
  </div>
@@ -122,23 +122,25 @@
122
122
  </div>
123
123
  <div
124
124
  t-if="this.fingerprints.isEnabled"
125
- class="topbar-banner irregularity-map d-flex align-items-center justify-content-between border-top">
125
+ class="topbar-banner irregularity-map d-flex align-items-stretch justify-content-between border-top">
126
126
  <div
127
127
  t-on-click="() => this.fingerprints.disable()"
128
128
  role="button"
129
129
  title="This tool analyzes spreadsheet formulas for patterns and highlights inconsistencies. Irregularities may indicate potential errors in formula structures, references, or arguments. (Click to turn off)"
130
- class="h-100 d-flex align-items-center text-info px-3">
131
- <t t-call="o-spreadsheet-Icon.IRREGULARITY_MAP"/>
130
+ class="d-flex align-items-center text-info px-3 text-nowrap">
131
+ <span class="pe-2">
132
+ <t t-call="o-spreadsheet-Icon.IRREGULARITY_MAP"/>
133
+ </span>
132
134
  Irregularity map
133
135
  </div>
134
136
  <div
135
- class="ps-3 h-100 flex-fill d-flex justify-content-between rounded-0 alert alert-info ps-0 py-0 my-0">
137
+ class="ps-3 flex-fill d-flex justify-content-between align-items-center rounded-0 alert alert-info ps-0 py-1 my-0">
136
138
  <span class="d-flex align-items-center">
137
139
  This tool analyzes formulas for patterns and highlights inconsistencies. Irregularities
138
140
  may indicate potential errors in formula structures, references or arguments.
139
141
  </span>
140
142
  <div
141
- class="ps-3 btn o-button-link flex-shrink-0"
143
+ class="ps-3 btn o-button-link flex-shrink-0 py-0"
142
144
  t-on-click="() => this.fingerprints.disable()">
143
145
  Turn off
144
146
  </div>
@@ -146,18 +148,18 @@
146
148
  </div>
147
149
  <div
148
150
  t-if="!this.env.model.getters.isAutomaticEvaluationEnabled()"
149
- class="topbar-banner manual-evaluation d-flex align-items-center justify-content-between border-top">
150
- <div class="h-100 d-flex align-items-center text-warning px-3">
151
- <i class="fa fa-pause-circle me-1"/>
151
+ class="topbar-banner manual-evaluation d-flex align-items-stretch justify-content-between border-top">
152
+ <div class="d-flex align-items-center text-warning px-3 text-nowrap">
153
+ <i class="oi me-2" data-icon="pause_circle"/>
152
154
  Manual calculation
153
155
  </div>
154
156
  <div
155
- class="ps-3 h-100 flex-fill d-flex justify-content-between rounded-0 alert alert-warning ps-0 py-0 my-0">
157
+ class="ps-3 flex-fill d-flex justify-content-between align-items-center rounded-0 alert alert-warning ps-0 py-1 my-0">
156
158
  <span class="d-flex align-items-center">
157
159
  Automatic evaluation is disabled. Press F9 to recalculate.
158
160
  </span>
159
161
  <div
160
- class="ps-3 btn o-button-link flex-shrink-0"
162
+ class="ps-3 btn o-button-link flex-shrink-0 py-0"
161
163
  t-on-click="() => this.env.model.dispatch('SET_AUTOMATIC_EVALUATION', { enabled: true })">
162
164
  Re-enable
163
165
  </div>
@@ -477,6 +479,9 @@
477
479
 
478
480
  <t t-name="o-spreadsheet-StandaloneGridCanvas">
479
481
  <canvas t-ref="this.canvasRef"/>
482
+ <t t-foreach="this.carouselDataViews" t-as="carouselDataView" t-key="carouselDataView_index">
483
+ <CarouselDataViewPrint t-props="carouselDataView"/>
484
+ </t>
480
485
  </t>
481
486
 
482
487
  <t t-name="o-spreadsheet-SpreadsheetPrint">
@@ -660,7 +665,7 @@
660
665
  <div class="d-flex flex-fill align-items-center bottom-bar-menu border-top border-bottom">
661
666
  <Ripple>
662
667
  <div class="py-1 px-1 mx-2 ribbon-toggler" t-on-click="this.toggleRibbon">
663
- <i class="o-icon fa fa-cog"/>
668
+ <i class="o-icon oi oi-filled" data-icon="settings_f"/>
664
669
  </div>
665
670
  </Ripple>
666
671
  <BottomBar onClick="this.props.onClick"/>
@@ -676,7 +681,7 @@
676
681
  class="o-previous-button px-3 py-1 mx-2 rounded"
677
682
  t-on-click="this.onClickBack"
678
683
  t-att-title="this.backTitle">
679
- <i class="fa fa-angle-left"/>
684
+ <i class="oi" data-icon="keyboard_arrow_left"/>
680
685
  </div>
681
686
  <span class="d-flex align-items-center" t-out="this.state.title"/>
682
687
  </div>
@@ -913,14 +918,14 @@
913
918
  t-if="this.props.onToggleCollapsePanel"
914
919
  class="o-collapse-panel o-sidePanelAction rounded"
915
920
  t-on-click="this.props.onToggleCollapsePanel">
916
- <i class="fa fa-angle-double-right"/>
921
+ <i class="oi" data-icon="keyboard_double_arrow_right"/>
917
922
  </div>
918
923
  <div class="o-sidePanelTitle o-fw-bold ms-2" t-out="this.getTitle()"/>
919
924
  <div
920
925
  t-if="this.props.isPinned"
921
926
  class="o-pin-panel o-sidePanelAction ms-auto rounded active"
922
927
  t-on-click="this.props.onTogglePinPanel">
923
- <i class="fa fa-thumb-tack"/>
928
+ <i class="oi" data-icon="push_pin"/>
924
929
  </div>
925
930
  <div
926
931
  class="o-sidePanelClose o-sidePanelAction rounded"
@@ -959,13 +964,13 @@
959
964
  <div
960
965
  t-if="this.props.onToggleCollapsePanel"
961
966
  class="o-collapse-panel o-sidePanelAction rounded mb-1">
962
- <i class="fa fa-angle-double-left"/>
967
+ <i class="oi" data-icon="keyboard_double_arrow_left"/>
963
968
  </div>
964
969
  <div
965
970
  t-if="this.props.isPinned"
966
971
  class="o-pin-panel o-sidePanelAction ms-auto rounded active"
967
972
  t-on-click="this.props.onTogglePinPanel">
968
- <i class="fa fa-thumb-tack"/>
973
+ <i class="oi" data-icon="push_pin"/>
969
974
  </div>
970
975
  <div
971
976
  class="o-sidePanelClose o-sidePanelAction rounded mb-1"
@@ -1084,17 +1089,17 @@
1084
1089
  <div class="o-pivot-panel d-flex flex-column h-100">
1085
1090
  <div class="o-panel d-flex">
1086
1091
  <div
1087
- class="o-sidePanel-tab o-panel-configuration d-flew flex-grow-1 text-center"
1092
+ class="o-sidePanel-tab o-panel-configuration d-flex flex-grow-1 justify-content-center"
1088
1093
  t-att-class="this.state.panel !== 'configuration' ? 'inactive' : ''"
1089
1094
  t-on-click="this.switchPanel.bind(this, 'configuration')">
1090
- <i class="fa fa-sliders me-1"/>
1095
+ <i class="oi me-2" data-icon="tune"/>
1091
1096
  Configuration
1092
1097
  </div>
1093
1098
  <div
1094
- class="o-sidePanel-tab o-panel-design d-flew flex-grow-1 text-center"
1099
+ class="o-sidePanel-tab o-panel-design d-flex flex-grow-1 justify-content-center"
1095
1100
  t-att-class="this.state.panel !== 'design' ? 'inactive' : ''"
1096
1101
  t-on-click="this.switchPanel.bind(this, 'design')">
1097
- <i class="fa fa-paint-brush me-1"/>
1102
+ <i class="oi me-2" data-icon="design_services"/>
1098
1103
  Design
1099
1104
  </div>
1100
1105
  </div>
@@ -1372,7 +1377,8 @@
1372
1377
  <t t-set="errorMessage" t-value="this.getHugeDimensionErrorMessage(col)"/>
1373
1378
  <i
1374
1379
  t-if="errorMessage"
1375
- class="text-warning fa fa-exclamation-triangle"
1380
+ class="text-warning oi"
1381
+ data-icon="warning"
1376
1382
  t-att-title="errorMessage"
1377
1383
  />
1378
1384
  </t>
@@ -1413,7 +1419,8 @@
1413
1419
  <t t-set="errorMessage" t-value="this.getHugeDimensionErrorMessage(row)"/>
1414
1420
  <i
1415
1421
  t-if="errorMessage"
1416
- class="text-warning fa fa-exclamation-triangle"
1422
+ class="text-warning oi"
1423
+ data-icon="warning"
1417
1424
  t-att-title="errorMessage"
1418
1425
  />
1419
1426
  </t>
@@ -1504,13 +1511,14 @@
1504
1511
  <t t-if="measure.isHidden" t-set="hideTitle">Show</t>
1505
1512
  <t t-else="" t-set="hideTitle">Hide</t>
1506
1513
  <i
1507
- t-att-class="measure.isHidden ? 'fa fa-eye-slash': 'fa fa-eye'"
1514
+ t-att-data-icon="measure.isHidden ? 'visibility_off_f' : 'visibility_f'"
1508
1515
  t-att-title="hideTitle"
1509
- class="o-button-icon pe-1 ps-2"
1516
+ class="o-button-icon pe-1 ps-1 oi"
1510
1517
  t-on-click="this.toggleMeasureVisibility"
1511
1518
  />
1512
1519
  <i
1513
- class="o-button-icon pe-1 ps-2 fa fa-cog"
1520
+ class="o-button-icon pe-1 ps-1 oi oi-filled"
1521
+ data-icon="settings_f"
1514
1522
  title="Show values as"
1515
1523
  t-on-click="this.openShowValuesAs"
1516
1524
  />
@@ -1598,7 +1606,8 @@
1598
1606
  <div class="d-flex flex-rows">
1599
1607
  <t t-call-slot="upper-right-icons"/>
1600
1608
  <i
1601
- class="o-button-icon fa fa-trash pe-1 ps-2"
1609
+ class="o-button-icon oi oi-filled pe-1 ps-1"
1610
+ data-icon="delete_f"
1602
1611
  t-if="this.props.onRemoved"
1603
1612
  t-on-click="() => this.props.onRemoved(this.props.dimension)"
1604
1613
  />
@@ -1678,7 +1687,8 @@
1678
1687
  />
1679
1688
  <div t-if="this.props.isDirty" class="d-flex align-items-center">
1680
1689
  <i
1681
- class="o-button-icon pe-0 fa fa-undo"
1690
+ class="o-button-icon pe-0 oi"
1691
+ data-icon="undo"
1682
1692
  title="Discard all changes"
1683
1693
  t-on-click="() => this.props.discard()"
1684
1694
  />
@@ -1711,7 +1721,8 @@
1711
1721
  selectContentOnFocus="true"
1712
1722
  />
1713
1723
  <i
1714
- class="o-button-icon ps-3 fa fa-trash"
1724
+ class="o-button-icon ps-3 oi oi-filled"
1725
+ data-icon="delete_f"
1715
1726
  t-on-click="() => this.onDeleteGroup(group_index)"
1716
1727
  />
1717
1728
  </div>
@@ -1746,8 +1757,10 @@
1746
1757
  <div class="d-flex flex-column gap-1">
1747
1758
  <div class="d-flex justify-content-center mb-3">
1748
1759
  <button class="o-button" t-on-click="this.startProfiling">
1749
- <i class="fa fa-refresh me-1"/>
1750
- Re-analyze
1760
+ <div class="d-flex justify-content-center align-content-center">
1761
+ <i class="oi me-1" data-icon="refresh"/>
1762
+ Re-analyze
1763
+ </div>
1751
1764
  </button>
1752
1765
  </div>
1753
1766
  <div class="d-flex justify-content-between">
@@ -2193,6 +2206,41 @@
2193
2206
  </div>
2194
2207
  </t>
2195
2208
 
2209
+ <div t-name="o-spreadsheet-DataAnalysisPanel" class="o-data-analysis-panel">
2210
+ <Section title.translate="Suggested charts">
2211
+ <div t-if="this.store.hasData" class="px-2 pb-2">
2212
+ <div t-if="this.store.chartSuggestions.length" class="o-chart-suggestions-grid">
2213
+ <t t-foreach="this.store.chartSuggestions" t-as="suggestion" t-key="suggestion_index">
2214
+ <ChartSuggestionPreview
2215
+ definition="suggestion.definition"
2216
+ description="suggestion.description"
2217
+ onPointerDown="(ev) => this.onStartChartSuggestionDrag(suggestion.definition, ev)"
2218
+ />
2219
+ </t>
2220
+ </div>
2221
+ <div t-else="" class="o-data-analysis-empty text-muted p-3 text-center">
2222
+ No chart suggestions available for the selected data.
2223
+ </div>
2224
+ </div>
2225
+ <div t-else="" class="o-data-analysis-empty text-muted p-3 text-center">
2226
+ Select cells containing data to see chart suggestions. Note that the order of selected
2227
+ columns can impact chart suggestions.
2228
+ </div>
2229
+ </Section>
2230
+ </div>
2231
+
2232
+ <t t-name="o-spreadsheet-ChartSuggestionPreview">
2233
+ <div
2234
+ class="o-suggestion-canvas-wrap os-theme-dependant overflow-hidden position-relative border rounded"
2235
+ t-on-pointerdown="(ev) => this.props.onPointerDown(ev)"
2236
+ t-att-title="this.props.description">
2237
+ <canvas class="w-100 h-100" t-ref="this.chartCanvasRef"/>
2238
+ <div class="o-suggestion-insert-icon d-flex align-items-center justify-content-center">
2239
+ <t t-call="o-spreadsheet-Icon.INSERT_CHART_SUGGESTION"/>
2240
+ </div>
2241
+ </div>
2242
+ </t>
2243
+
2196
2244
  <t t-name="o-spreadsheet-ValueInRangeCriterionForm">
2197
2245
  <SelectionInput
2198
2246
  ranges="[this.props.criterion.values[0] || '']"
@@ -2381,7 +2429,8 @@
2381
2429
  <t t-name="o-spreadsheet-CalendarButton">
2382
2430
  <div class="o-calendar-button ms-1">
2383
2431
  <button type="button" class="o-button btn" t-on-click="this.openCalendar">
2384
- <i class="fa fa-calendar"/>
2432
+ <!-- TODORAR see how we can make filled versions -->
2433
+ <i class="oi oi-filled" data-icon="calendar_today"/>
2385
2434
  </button>
2386
2435
  <input
2387
2436
  type="date"
@@ -2895,17 +2944,17 @@
2895
2944
 
2896
2945
  <t t-name="o-spreadsheet-SidePanelCollapsible">
2897
2946
  <div class="" t-att-class="this.props.class">
2898
- <div
2899
- class="o_side_panel_collapsible_title o-fw-bold d-flex align-items-center"
2900
- t-on-click="() => this.toggle()">
2947
+ <div class="o_side_panel_collapsible_title o-fw-bold d-flex align-items-center">
2901
2948
  <div
2902
2949
  class="collapsor w-100 d-flex align-items-center ps-1"
2903
- t-att-class="this.state.isCollapsed ? 'collapsed' : ''">
2950
+ t-att-class="this.state.isCollapsed ? 'collapsed' : ''"
2951
+ t-on-click="() => this.toggle()">
2904
2952
  <span class="collapsor-arrow">
2905
2953
  <t t-call="o-spreadsheet-Icon.ANGLE_DOWN"/>
2906
2954
  </span>
2907
2955
  <div class="ps-2" t-out="this.props.title"/>
2908
2956
  </div>
2957
+ <t t-call-slot="titleButton"/>
2909
2958
  </div>
2910
2959
  <Collapse isCollapsed="this.state.isCollapsed">
2911
2960
  <div class="pt-2">
@@ -2923,7 +2972,8 @@
2923
2972
 
2924
2973
  <t t-name="o-spreadsheet-CogWheelMenu">
2925
2974
  <span
2926
- class="fa fa-cog os-cog-wheel-menu-icon o-button-icon"
2975
+ class="oi oi-filled os-cog-wheel-menu-icon o-button-icon"
2976
+ data-icon="settings_f"
2927
2977
  t-on-click="this.toggleMenu"
2928
2978
  t-ref="this.buttonRef"
2929
2979
  />
@@ -3436,23 +3486,22 @@
3436
3486
  <t t-name="o-spreadsheet-ScorecardChartConfigPanel">
3437
3487
  <div>
3438
3488
  <Section class="'o-data-series'" title.translate="Key value">
3439
- <SelectionInput
3440
- ranges="[this.getKeyValueRange()]"
3441
- isInvalid="this.isKeyValueInvalid"
3442
- hasSingleRange="true"
3443
- required="true"
3444
- onSelectionChanged="(ranges) => this.onKeyValueRangeChanged(ranges)"
3445
- onSelectionConfirmed="() => this.updateKeyValueRange()"
3489
+ <StandaloneComposer
3490
+ placeholder.translate="Formula"
3491
+ title.translate=""
3492
+ composerContent="this.getKeyValue()"
3493
+ defaultRangeSheetId="this.env.model.getters.getActiveSheetId()"
3494
+ onConfirm.bind="this.onConfirmKeyValue"
3446
3495
  />
3447
3496
  </Section>
3448
3497
  <Section class="'o-data-labels'" title.translate="Baseline configuration">
3449
3498
  <div class="o-section-subtitle">Value</div>
3450
- <SelectionInput
3451
- ranges="[this.getBaselineRange()]"
3452
- isInvalid="this.isBaselineInvalid"
3453
- hasSingleRange="true"
3454
- onSelectionChanged="(ranges) => this.onBaselineRangeChanged(ranges)"
3455
- onSelectionConfirmed="() => this.updateBaselineRange()"
3499
+ <StandaloneComposer
3500
+ placeholder.translate="Formula"
3501
+ title.translate=""
3502
+ composerContent="this.getBaseline()"
3503
+ defaultRangeSheetId="this.env.model.getters.getActiveSheetId()"
3504
+ onConfirm.bind="this.onConfirmBaseline"
3456
3505
  />
3457
3506
  <div class="o-section-subtitle">Format</div>
3458
3507
  <Select
@@ -3544,17 +3593,17 @@
3544
3593
  <div class="o-chart d-flex flex-column h-100" t-if="this.chartId">
3545
3594
  <div class="o-panel d-flex">
3546
3595
  <div
3547
- class="o-sidePanel-tab o-panel-configuration d-flew flex-grow-1 text-center"
3596
+ class="o-sidePanel-tab o-panel-configuration d-flex flex-grow-1 justify-content-center"
3548
3597
  t-att-class="this.store.panel !== 'configuration' ? 'inactive' : ''"
3549
3598
  t-on-click="this.switchPanel.bind(this, 'configuration')">
3550
- <i class="fa fa-sliders me-1"/>
3599
+ <i class="oi me-2" data-icon="tune"/>
3551
3600
  Configuration
3552
3601
  </div>
3553
3602
  <div
3554
- class="o-sidePanel-tab o-panel-design d-flew flex-grow-1 text-center"
3603
+ class="o-sidePanel-tab o-panel-design d-flex flex-grow-1 justify-content-center"
3555
3604
  t-att-class="this.store.panel !== 'design' ? 'inactive' : ''"
3556
3605
  t-on-click="this.switchPanel.bind(this, 'design')">
3557
- <i class="fa fa-paint-brush me-1"/>
3606
+ <i class="oi me-2" data-icon="design_services"/>
3558
3607
  Design
3559
3608
  </div>
3560
3609
  </div>
@@ -5830,7 +5879,7 @@
5830
5879
  t-on-click="this.removeLink"
5831
5880
  class="o-remove-url o-button-icon"
5832
5881
  t-translation="off">
5833
- <i class="fa fa-times"/>
5882
+ <i class="oi" data-icon="close"/>
5834
5883
  </button>
5835
5884
  </div>
5836
5885
  </div>
@@ -6007,12 +6056,12 @@
6007
6056
  </t>
6008
6057
  <t t-name="o-spreadsheet-Icon.CLIPBOARD">
6009
6058
  <div class="o-icon">
6010
- <i class="fa fa-clipboard"/>
6059
+ <i class="oi" data-icon="assignment"/>
6011
6060
  </div>
6012
6061
  </t>
6013
6062
  <t t-name="o-spreadsheet-Icon.COPY">
6014
6063
  <div class="o-icon">
6015
- <i class="fa fa-clone"/>
6064
+ <i class="oi" data-icon="content_copy"/>
6016
6065
  </div>
6017
6066
  </t>
6018
6067
  <t t-name="o-spreadsheet-Icon.CUT">
@@ -6070,7 +6119,7 @@
6070
6119
  </t>
6071
6120
  <t t-name="o-spreadsheet-Icon.SHOW">
6072
6121
  <div class="o-icon">
6073
- <i class="fa fa-eye"/>
6122
+ <i class="oi" data-icon="visibility"/>
6074
6123
  </div>
6075
6124
  </t>
6076
6125
  <t t-name="o-spreadsheet-Icon.FORMULA">
@@ -6203,22 +6252,22 @@
6203
6252
  </t>
6204
6253
  <t t-name="o-spreadsheet-Icon.INSERT_CHART">
6205
6254
  <div class="o-icon">
6206
- <i class="fa fa-bar-chart"/>
6255
+ <i class="oi" data-icon="bar_chart"/>
6207
6256
  </div>
6208
6257
  </t>
6209
6258
  <t t-name="o-spreadsheet-Icon.INSERT_IMAGE">
6210
6259
  <div class="o-icon">
6211
- <i class="fa fa-file-image-o"/>
6260
+ <i class="oi" data-icon="image"/>
6212
6261
  </div>
6213
6262
  </t>
6214
6263
  <t t-name="o-spreadsheet-Icon.INSERT_LINK">
6215
6264
  <div class="o-icon">
6216
- <i class="fa fa-link"/>
6265
+ <i class="oi" data-icon="link"/>
6217
6266
  </div>
6218
6267
  </t>
6219
6268
  <t t-name="o-spreadsheet-Icon.INSERT_CHECKBOX">
6220
6269
  <div class="o-icon">
6221
- <i class="fa fa-check-square-o"/>
6270
+ <i class="oi" data-icon="check_box"/>
6222
6271
  </div>
6223
6272
  </t>
6224
6273
  <t t-name="o-spreadsheet-Icon.INSERT_DROPDOWN">
@@ -6326,7 +6375,7 @@
6326
6375
  </t>
6327
6376
  <t t-name="o-spreadsheet-Icon.IRREGULARITY_MAP">
6328
6377
  <div class="o-icon">
6329
- <i class="fa fa-align-center fa-rotate-270"/>
6378
+ <i class="oi oi-rotate-270" data-icon="format_align_center"/>
6330
6379
  </div>
6331
6380
  </t>
6332
6381
  <t t-name="o-spreadsheet-Icon.ALIGN_RIGHT">
@@ -6509,67 +6558,67 @@
6509
6558
 
6510
6559
  <t t-name="o-spreadsheet-Icon.FULLSCREEN_OUT">
6511
6560
  <div class="o-icon">
6512
- <i class="fa fa-compress"/>
6561
+ <i class="oi" data-icon="close_fullscreen"/>
6513
6562
  </div>
6514
6563
  </t>
6515
6564
  <t t-name="o-spreadsheet-Icon.FULLSCREEN_IN">
6516
6565
  <div class="o-icon">
6517
- <i class="fa fa-expand"/>
6566
+ <i class="oi" data-icon="expand_content"/>
6518
6567
  </div>
6519
6568
  </t>
6520
6569
  <t t-name="o-spreadsheet-Icon.EDIT">
6521
6570
  <div class="o-icon">
6522
- <i class="fa fa-pencil-square-o"/>
6571
+ <i class="oi" data-icon="edit_square"/>
6523
6572
  </div>
6524
6573
  </t>
6525
6574
  <t t-name="o-spreadsheet-Icon.EXTERNAL">
6526
6575
  <div class="o-icon">
6527
- <i class="fa fa-external-link"/>
6576
+ <i class="oi" data-icon="open_in_new"/>
6528
6577
  </div>
6529
6578
  </t>
6530
6579
  <t t-name="o-spreadsheet-Icon.UNLINK">
6531
6580
  <div class="o-icon">
6532
- <i class="fa fa-chain-broken"/>
6581
+ <i class="oi" data-icon="link_off"/>
6533
6582
  </div>
6534
6583
  </t>
6535
6584
  <t t-name="o-spreadsheet-Icon.CARET_UP">
6536
- <div class="o-icon fa-small">
6537
- <i class="fa fa-caret-up"/>
6585
+ <div class="o-icon">
6586
+ <i class="oi" data-icon="arrow_drop_up"/>
6538
6587
  </div>
6539
6588
  </t>
6540
6589
  <t t-name="o-spreadsheet-Icon.CARET_DOWN">
6541
- <div class="o-icon fa-small">
6542
- <i class="fa fa-caret-down"/>
6590
+ <div class="o-icon">
6591
+ <i class="oi" data-icon="arrow_drop_down"/>
6543
6592
  </div>
6544
6593
  </t>
6545
6594
  <t t-name="o-spreadsheet-Icon.CARET_RIGHT">
6546
- <div class="o-icon fa-small">
6547
- <i class="fa fa-caret-right"/>
6595
+ <div class="o-icon">
6596
+ <i class="oi" data-icon="arrow_right"/>
6548
6597
  </div>
6549
6598
  </t>
6550
6599
  <t t-name="o-spreadsheet-Icon.CARET_LEFT">
6551
- <div class="o-icon fa-small">
6552
- <i class="fa fa-caret-left"/>
6600
+ <div class="o-icon">
6601
+ <i class="oi" data-icon="arrow_left"/>
6553
6602
  </div>
6554
6603
  </t>
6555
6604
  <t t-name="o-spreadsheet-Icon.TRASH">
6556
6605
  <div class="o-icon">
6557
- <i class="fa fa-trash-o"/>
6606
+ <i class="oi" data-icon="delete"/>
6558
6607
  </div>
6559
6608
  </t>
6560
6609
  <t t-name="o-spreadsheet-Icon.TRASH_FILLED">
6561
6610
  <div class="o-icon">
6562
- <i class="fa fa-trash"/>
6611
+ <i class="oi oi-filled" data-icon="delete_f"/>
6563
6612
  </div>
6564
6613
  </t>
6565
6614
  <t t-name="o-spreadsheet-Icon.REFRESH">
6566
6615
  <div class="o-icon">
6567
- <i class="fa fa-refresh"/>
6616
+ <i class="oi" data-icon="refresh"/>
6568
6617
  </div>
6569
6618
  </t>
6570
6619
  <t t-name="o-spreadsheet-Icon.EXCHANGE">
6571
6620
  <div class="o-icon">
6572
- <i class="fa fa-exchange"/>
6621
+ <i class="oi" data-icon="swap_horiz"/>
6573
6622
  </div>
6574
6623
  </t>
6575
6624
  <t t-name="o-spreadsheet-Icon.ARROW_DOWN">
@@ -6672,17 +6721,17 @@
6672
6721
  </t>
6673
6722
  <t t-name="o-spreadsheet-Icon.SORT_ASCENDING">
6674
6723
  <div class="o-icon">
6675
- <i class="fa fa-sort-alpha-asc"/>
6724
+ <i class="oi" data-icon="sort_by_alpha"/>
6676
6725
  </div>
6677
6726
  </t>
6678
6727
  <t t-name="o-spreadsheet-Icon.SORT_DESCENDING">
6679
6728
  <div class="o-icon">
6680
- <i class="fa fa-sort-alpha-desc"/>
6729
+ <i class="oi" data-icon="sort_by_alpha"/>
6681
6730
  </div>
6682
6731
  </t>
6683
6732
  <t t-name="o-spreadsheet-Icon.DATA_CLEANUP">
6684
6733
  <div class="o-icon">
6685
- <i class="fa fa-magic"/>
6734
+ <i class="oi" data-icon="wand_stars"/>
6686
6735
  </div>
6687
6736
  </t>
6688
6737
  <t t-name="o-spreadsheet-Icon.FILTER_ICON">
@@ -6695,17 +6744,17 @@
6695
6744
  </t>
6696
6745
  <t t-name="o-spreadsheet-Icon.FILTER_ICON_ACTIVE">
6697
6746
  <div class="o-icon filter-icon-active">
6698
- <i class="fa fa-filter"/>
6747
+ <i class="oi oi-filled" data-icon="filter_alt_f"/>
6699
6748
  </div>
6700
6749
  </t>
6701
6750
  <t t-name="o-spreadsheet-Icon.SEARCH">
6702
6751
  <div class="o-icon">
6703
- <i class="fa fa-search"/>
6752
+ <i class="oi" data-icon="search"/>
6704
6753
  </div>
6705
6754
  </t>
6706
6755
  <t t-name="o-spreadsheet-Icon.ZOOM">
6707
6756
  <div class="o-icon">
6708
- <i class="fa fa-search-plus"/>
6757
+ <i class="oi" data-icon="zoom_in"/>
6709
6758
  </div>
6710
6759
  </t>
6711
6760
  <t t-name="o-spreadsheet-Icon.CHECK">
@@ -6739,8 +6788,8 @@
6739
6788
  </svg>
6740
6789
  </t>
6741
6790
  <t t-name="o-spreadsheet-Icon.TRIANGLE_EXCLAMATION">
6742
- <div class="o-icon fa-small">
6743
- <i class="fa fa-exclamation-triangle"/>
6791
+ <div class="o-icon">
6792
+ <i class="oi" data-icon="warning"/>
6744
6793
  </div>
6745
6794
  </t>
6746
6795
  <t t-name="o-spreadsheet-Icon.SPLIT_TEXT">
@@ -6753,7 +6802,7 @@
6753
6802
  </t>
6754
6803
  <t t-name="o-spreadsheet-Icon.ERROR">
6755
6804
  <div class="o-icon">
6756
- <i class="fa fa-exclamation-circle"/>
6805
+ <i class="oi" data-icon="error"/>
6757
6806
  </div>
6758
6807
  </t>
6759
6808
  <t t-name="o-spreadsheet-Icon.DISPLAY_HEADER">
@@ -6891,7 +6940,7 @@
6891
6940
  </t>
6892
6941
  <t t-name="o-spreadsheet-Icon.INFO">
6893
6942
  <div class="o-icon">
6894
- <i class="fa fa-info"/>
6943
+ <i class="oi" data-icon="info"/>
6895
6944
  </div>
6896
6945
  </t>
6897
6946
  <t t-name="o-spreadsheet-Icon.PIVOT">
@@ -6981,12 +7030,12 @@
6981
7030
  </t>
6982
7031
  <t t-name="o-spreadsheet-Icon.HIDE_SHEET">
6983
7032
  <div class="o-icon">
6984
- <i class="fa fa-eye-slash"/>
7033
+ <i class="oi" data-icon="visibility_off"/>
6985
7034
  </div>
6986
7035
  </t>
6987
7036
  <t t-name="o-spreadsheet-Icon.DOWNLOAD">
6988
7037
  <div class="o-icon">
6989
- <i class="fa fa-download"/>
7038
+ <i class="oi" data-icon="download"/>
6990
7039
  </div>
6991
7040
  </t>
6992
7041
  <t t-name="o-spreadsheet-Icon.CAROUSEL">
@@ -7031,7 +7080,7 @@
7031
7080
  </t>
7032
7081
  <t t-name="o-spreadsheet-Icon.DARK_MODE">
7033
7082
  <div class="o-icon">
7034
- <i class="fa fa-moon-o"/>
7083
+ <i class="oi" data-icon="dark_mode"/>
7035
7084
  </div>
7036
7085
  </t>
7037
7086
  <t t-name="o-spreadsheet-Icon.ROTATION-0">
@@ -7077,26 +7126,26 @@
7077
7126
  </t>
7078
7127
  <t t-name="o-spreadsheet-Icon.THUMB_TACK">
7079
7128
  <div class="o-icon">
7080
- <i class="fa fa-thumb-tack"/>
7129
+ <i class="oi" data-icon="push_pin"/>
7081
7130
  </div>
7082
7131
  </t>
7083
7132
  <t t-name="o-spreadsheet-Icon.LOCK">
7084
7133
  <div class="o-icon">
7085
- <i class="fa fa-lock"/>
7134
+ <i class="oi" data-icon="lock_f"/>
7086
7135
  </div>
7087
7136
  </t>
7088
7137
  <t t-name="o-spreadsheet-Icon.UNLOCK">
7089
7138
  <div class="o-icon">
7090
- <i class="fa fa-unlock"/>
7139
+ <i class="oi" data-icon="lock_open_f"/>
7091
7140
  </div>
7092
7141
  </t>
7093
7142
  <t t-name="o-spreadsheet-Icon.PRINT">
7094
7143
  <div class="o-icon">
7095
- <i class="fa fa-print"/>
7144
+ <i class="oi" data-icon="print"/>
7096
7145
  </div>
7097
7146
  </t>
7098
7147
  <t t-name="o-spreadsheet-Icon.COLUMN_STATS">
7099
- <svg width="18px" height="18px" viewBox="0 0 512 512">
7148
+ <svg class="o-icon" viewBox="0 0 512 512">
7100
7149
  <path
7101
7150
  d="M319 174c71 0 129 58 129 129 0 27-8 52-23 73l66 66-33 33-66-66c-21 14-46 23-73 23-71 0-129-58-129-129s57-129 129-129m0 47c-45 0-82 37-82 82s36 82 82 82 82-37 82-82-37-82-82-82m-152 70a155 155 0 0 0 0 12c0 12 1 24 4 35H25v-47zM119 33v235H49V33zm94 94v66c-21 20-36 46-43 75h-28V127zm94-47v71a152 152 0 0 0-70 24V80zm94 23v71a152 152 0 0 0-70-24v-47z"
7102
7151
  fill="currentColor"
@@ -7153,7 +7202,26 @@
7153
7202
  </t>
7154
7203
  <t t-name="o-spreadsheet-Icon.CALCULATOR">
7155
7204
  <div class="o-icon">
7156
- <i class="fa fa-calculator"/>
7205
+ <i class="oi" data-icon="calculate"/>
7206
+ </div>
7207
+ </t>
7208
+ <t t-name="o-spreadsheet-Icon.INSERT_CHART_SUGGESTION">
7209
+ <svg
7210
+ class="o-icon"
7211
+ fill="currentColor"
7212
+ viewBox="0 -960 960 960"
7213
+ xmlns="http://www.w3.org/2000/svg">
7214
+ <!-- Material icon add_chart.
7215
+ TODO remove when we use Material icons directly -->
7216
+ <path
7217
+ xmlns="http://www.w3.org/2000/svg"
7218
+ d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h360v80H200v560h560v-360h80v360q0 33-23.5 56.5T760-120H200Zm80-160h80v-280h-80v280Zm160 0h80v-400h-80v400Zm160 0h80v-160h-80v160Zm80-320v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80ZM480-480Z"
7219
+ />
7220
+ </svg>
7221
+ </t>
7222
+ <t t-name="o-spreadsheet-Icon.MORE_MENU">
7223
+ <div class="o-icon">
7224
+ <i class="oi" data-icon="more_vert"/>
7157
7225
  </div>
7158
7226
  </t>
7159
7227
 
@@ -7615,7 +7683,7 @@
7615
7683
  onClose="() => this.closeMenu()"
7616
7684
  />
7617
7685
  <t
7618
- t-if="!this.env.model.getters.isReadonly()"
7686
+ t-if="this.displayTableResizer"
7619
7687
  t-foreach="this.staticTables"
7620
7688
  t-as="table"
7621
7689
  t-key="table.id">
@@ -7853,13 +7921,14 @@
7853
7921
 
7854
7922
  <t t-name="o-spreadsheet-ImageFigure">
7855
7923
  <img t-att-src="this.getImagePath" class="w-100 h-100"/>
7856
- <div class="o-figure-menu position-absolute m-2" t-if="this.shouldShowMenuButton">
7924
+ <div
7925
+ class="o-figure-menu position-absolute m-2 align-items-center"
7926
+ t-if="this.shouldShowMenuButton">
7857
7927
  <div
7858
- class="o-figure-menu-item d-flex-align-items-center"
7859
- t-on-click="this.showMenu"
7928
+ class="o-figure-menu-item d-flex align-items-center justify-content-center rounded p-1"
7860
7929
  t-ref="this.menuButtonRef"
7861
- t-on-contextmenu.prevent.stop="this.showMenu">
7862
- <t t-call="o-spreadsheet-Icon.LIST"/>
7930
+ t-on-click="this.showMenu">
7931
+ <t t-call="o-spreadsheet-Icon.MORE_MENU"/>
7863
7932
  </div>
7864
7933
  </div>
7865
7934
  </t>
@@ -7925,11 +7994,13 @@
7925
7994
 
7926
7995
  <t t-name="o-spreadsheet-CarouselFigure">
7927
7996
  <div
7928
- class="o-carousel w-100 h-100 d-flex flex-column px-4 py-2"
7997
+ class="o-carousel w-100 h-100 position-relative"
7929
7998
  t-att-style="this.carouselStyle"
7930
7999
  t-on-dblclick="this.onCarouselDoubleClick">
7931
8000
  <t t-set="selectedItem" t-value="this.selectedCarouselItem"/>
7932
- <div class="o-carousel-header d-flex align-items-baseline flex-shrink-0 pt-1 pe-auto">
8001
+ <div
8002
+ class="o-carousel-header d-flex align-items-baseline position-absolute"
8003
+ t-att-style="this.headerStyle">
7933
8004
  <div
7934
8005
  class="o-carousel-title text-truncate flex-shrink-0 pe-2"
7935
8006
  t-out="this.title"
@@ -7945,7 +8016,7 @@
7945
8016
  t-key="item_index"
7946
8017
  t-if="this.carousel.items.length > 1">
7947
8018
  <div
7948
- class="o-carousel-tab text-truncate px-2 mt-1 flex-shrink-0"
8019
+ class="o-carousel-tab text-truncate px-2 flex-shrink-0"
7949
8020
  t-att-class="{ 'selected': this.isItemSelected(item) }"
7950
8021
  t-att-data-type="item.type"
7951
8022
  t-out="this.getItemTitle(item)"
@@ -7954,11 +8025,13 @@
7954
8025
  </t>
7955
8026
  </div>
7956
8027
  <div
7957
- class="o-carousel-tabs-dropdown o-carousel-button flex-shrink-0 rounded p-1"
8028
+ class="o-carousel-button o-carousel-tabs-dropdown flex-shrink-0 rounded"
7958
8029
  t-att-class="{'active': this.menuState.isOpen}"
7959
8030
  t-ref="this.carouselTabsDropdownRef"
7960
8031
  t-on-click="this.toggleMenu">
7961
- <div class="fa fa-angle-down"/>
8032
+ <div class="o-icon">
8033
+ <i class="oi" data-icon="keyboard_arrow_down"/>
8034
+ </div>
7962
8035
  <MenuPopover
7963
8036
  t-if="this.menuState.isOpen"
7964
8037
  menuId="this.menuId"
@@ -7971,28 +8044,32 @@
7971
8044
  <div
7972
8045
  t-if="this.env.model.getters.isDashboard()"
7973
8046
  t-att-title="this.fullScreenButtonTitle"
7974
- class="o-carousel-full-screen-button fa o-carousel-button rounded p-1 ms-1"
7975
- t-att-class="{
7976
- 'fa-compress': this.props.isFullScreen,
7977
- 'fa-expand': !this.props.isFullScreen,
7978
- }"
8047
+ class="o-carousel-full-screen-button oi o-carousel-button rounded p-1 ms-1"
8048
+ t-att-data-icon="this.props.isFullScreen ? 'close_fullscreen' : 'expand_content'"
7979
8049
  t-on-click="this.toggleFullScreen"
7980
8050
  />
7981
8051
  <div
7982
8052
  t-if="!this.env.model.getters.isDashboard()"
7983
- class="o-carousel-menu-button o-carousel-button fa fa-ellipsis-v rounded ms-1"
7984
- t-on-click="this.openContextMenu"
7985
- />
8053
+ class="o-carousel-menu-button o-carousel-button rounded ms-1"
8054
+ t-on-click="this.openContextMenu">
8055
+ <t t-call="o-spreadsheet-Icon.MORE_MENU"/>
8056
+ </div>
7986
8057
  </div>
7987
- <div t-if="this.title" class="w-100 mt-2 border-bottom"/>
8058
+ <div
8059
+ t-if="this.separatorStyle"
8060
+ class="o-carousel-separator position-absolute"
8061
+ t-att-style="this.separatorStyle"
8062
+ />
7988
8063
  <div
7989
8064
  t-if="!selectedItem"
7990
- class="o-carousel-empty o-carousel-content w-100 flex-fill d-flex align-items-center justify-content-center">
8065
+ class="o-carousel-empty o-carousel-content position-absolute d-flex align-items-center justify-content-center"
8066
+ t-att-style="this.contentStyle">
7991
8067
  <t t-call="o-spreadsheet-Icon.CAROUSEL"/>
7992
8068
  </div>
7993
8069
  <div
7994
8070
  t-elif="selectedItem.type === 'chart'"
7995
- class="o-carousel-content w-100 flex-fill position-relative">
8071
+ class="o-carousel-content position-absolute"
8072
+ t-att-style="this.contentStyle">
7996
8073
  <div
7997
8074
  class="o-chart-container w-100 h-100"
7998
8075
  t-on-dblclick.stop="this.onCarouselChartDoubleClick">
@@ -8012,12 +8089,14 @@
8012
8089
  </div>
8013
8090
  <div
8014
8091
  t-elif="selectedItem.type === 'carouselDataView' and selectedItem.range"
8015
- class="o-carousel-content mb-2 mt-3 h-100 w-100 overflow-hidden">
8092
+ class="o-carousel-content position-absolute overflow-hidden"
8093
+ t-att-style="this.contentStyle">
8016
8094
  <StandaloneViewport
8017
8095
  range="this.removeEmptyHeadersFromRange(selectedItem.range)"
8018
8096
  columnWeights="selectedItem.columnWeights"
8019
8097
  canResizeColumns="this.canResizeDataViewColumns"
8020
8098
  onResizeColumns.bind="this.onResizeColumns"
8099
+ size="this.carouselLayout.contentRect"
8021
8100
  />
8022
8101
  </div>
8023
8102
  </div>
@@ -8025,8 +8104,8 @@
8025
8104
 
8026
8105
  <t t-name="o-spreadsheet-FigureComponent">
8027
8106
  <div
8028
- class="o-figure-wrapper os-theme-dependant"
8029
- t-att-class="{'o-figure-selected': this.isSelected}"
8107
+ class="o-figure-wrapper"
8108
+ t-att-class="{'o-figure-selected': this.isSelected, 'os-theme-dependant': this.isThemeDependant}"
8030
8109
  t-att-style="this.wrapperStyle">
8031
8110
  <div
8032
8111
  class="o-figure w-100 h-100 overflow-hidden"
@@ -8119,7 +8198,7 @@
8119
8198
  <t t-name="o-spreadsheet-ChartMenu">
8120
8199
  <div class="o-chart-menu position-absolute top-0 end-0" t-on-click.stop="">
8121
8200
  <div class="d-flex align-items-center gap-1 p-1 rounded" t-att-style="backgroundColor">
8122
- <t t-if="this.regionOptions.length > 1">
8201
+ <t t-if="this.env.model.getters.isDashboard() and this.regionOptions.length > 1">
8123
8202
  <Select
8124
8203
  class="'o-chart-menu-item w-auto py-0 px-1 text-muted text-nowrap rounded border-0'"
8125
8204
  popoverClass="'w-auto'"
@@ -8138,10 +8217,11 @@
8138
8217
  </div>
8139
8218
  </t>
8140
8219
  <t t-if="this.isMenuAvailable()">
8141
- <button
8142
- class="o-chart-menu-item btn text-muted lh-1 p-1 fa fa-ellipsis-v"
8143
- t-on-click="this.openContextMenu"
8144
- />
8220
+ <div
8221
+ class="o-chart-menu-item border-0 lh-1 p-1 d-flex align-items-center justify-content-center rounded"
8222
+ t-on-click="this.openContextMenu">
8223
+ <t t-call="o-spreadsheet-Icon.MORE_MENU"/>
8224
+ </div>
8145
8225
  </t>
8146
8226
  </div>
8147
8227
  <InfoPopover
@@ -8433,9 +8513,9 @@
8433
8513
  t-on-click.stop="this.openAssistant"
8434
8514
  t-on-pointerdown.prevent.stop=""
8435
8515
  t-on-pointerup.stop=""
8436
- class="fa-stack position-absolute translate-middle force-open-assistant fs-4">
8437
- <i class="fa fa-circle fa-stack-1x fa-inverse"/>
8438
- <i class="fa fa-question-circle fa-stack-1x"/>
8516
+ class="oi-stack position-absolute translate-middle force-open-assistant fs-4">
8517
+ <i class="oi oi-filled oi-stack-1x o-composer-assistant-icon-bg" data-icon="circle_f"/>
8518
+ <i class="oi oi-filled oi-stack-1x" data-icon="help_f"/>
8439
8519
  </span>
8440
8520
  <div
8441
8521
  class="o-composer w-100 text-start"
@@ -8476,9 +8556,9 @@
8476
8556
  role="button"
8477
8557
  t-on-click="this.closeAssistant"
8478
8558
  t-on-pointerdown.prevent.stop=""
8479
- class="fa-stack position-absolute top-0 start-100 translate-middle fs-4">
8480
- <i class="fa fa-circle fa-stack-1x fa-inverse"/>
8481
- <i class="fa fa-times-circle fa-stack-1x"/>
8559
+ class="oi-stack position-absolute top-0 start-100 translate-middle fs-4">
8560
+ <i class="oi oi-filled oi-stack-1x o-composer-assistant-icon-bg" data-icon="circle_f"/>
8561
+ <i class="oi oi-filled oi-stack-1x" data-icon="cancel_f"/>
8482
8562
  </span>
8483
8563
  <div class="o-composer-assistant overflow-auto" t-att-style="this.assistantStyle">
8484
8564
  <FunctionDescriptionProvider
@@ -8625,7 +8705,7 @@
8625
8705
  class="eyedropper d-flex align-items-center justify-content-center rounded-circle"
8626
8706
  t-if="this.canUseEyeDropper"
8627
8707
  t-on-click.stop="this.activateEyedropper">
8628
- <i class="fa fa-eyedropper"/>
8708
+ <i class="oi" data-icon="colorize"/>
8629
8709
  </div>
8630
8710
  </div>
8631
8711
  <div t-if="this.state.showGradient" class="o-custom-selector">
@@ -8802,16 +8882,24 @@
8802
8882
 
8803
8883
  <t t-name="o-spreadsheet-BottomBarStatistic">
8804
8884
  <t t-set="selectedStatistic" t-value="this.getSelectedStatistic()"/>
8805
- <Ripple class="'ms-auto bottom-statistics'" t-if="selectedStatistic !== undefined">
8806
- <div
8807
- class="o-selection-statistic text-truncate user-select-none me-4 bg-white rounded shadow d-flex align-items-center"
8808
- t-on-click="this.listSelectionStatistics">
8809
- <t t-out="selectedStatistic"/>
8810
- <span class="ms-2">
8811
- <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
8812
- </span>
8813
- </div>
8814
- </Ripple>
8885
+ <div class="ms-auto d-flex o-bottom-bar-statistic">
8886
+ <Ripple t-if="selectedStatistic !== undefined">
8887
+ <div
8888
+ class="o-selection-statistic text-truncate user-select-none me-4 bg-white rounded shadow d-flex align-items-center"
8889
+ t-on-click="this.listSelectionStatistics">
8890
+ <t t-out="selectedStatistic"/>
8891
+ <span class="ms-2">
8892
+ <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
8893
+ </span>
8894
+ </div>
8895
+ </Ripple>
8896
+ <span
8897
+ class="o-data-analysis-button me-4 rounded"
8898
+ t-att-class="{ 'active': this.isDataAnalysisOpen }"
8899
+ t-on-click="this.toggleDataAnalysisPanel">
8900
+ <t t-call="o-spreadsheet-Icon.COLUMN_STATS"/>
8901
+ </span>
8902
+ </div>
8815
8903
  </t>
8816
8904
 
8817
8905
  <t t-name="o-spreadsheet-BottomBarSheet">
@@ -8829,7 +8917,7 @@
8829
8917
  t-att-title="this.sheetName"
8830
8918
  t-att-data-id="this.props.sheetId"
8831
8919
  t-att-class="{active: this.isSheetActive}">
8832
- <span t-if="this.isSheetLocked" class="me-1">
8920
+ <span t-if="this.isSheetLocked" class="me-1 lock-icon">
8833
8921
  <t t-call="o-spreadsheet-Icon.LOCK"/>
8834
8922
  </span>
8835
8923
  <span