@odoo/o-spreadsheet 19.5.0-alpha.8 → 20.0.0

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 (175) hide show
  1. package/dist/material_symbols_outlined.css +11 -0
  2. package/dist/o_spreadsheet.cjs +34960 -32701
  3. package/dist/o_spreadsheet.css +271 -127
  4. package/dist/o_spreadsheet.esm.js +29778 -27524
  5. package/dist/o_spreadsheet.iife.js +30467 -28208
  6. package/dist/o_spreadsheet.min.iife.js +408 -354
  7. package/dist/o_spreadsheet.xml +303 -239
  8. package/dist/types/actions/data_actions.d.ts +1 -0
  9. package/dist/types/actions/menu_items_actions.d.ts +3 -2
  10. package/dist/types/collaborative/command_squisher.d.ts +1 -1
  11. package/dist/types/collaborative/session.d.ts +3 -1
  12. package/dist/types/components/autofill/autofill.d.ts +1 -1
  13. package/dist/types/components/autofill/autofill_store.d.ts +1 -1
  14. package/dist/types/components/bottom_bar/bottom_bar_statistic/bottom_bar_statistic.d.ts +3 -0
  15. package/dist/types/components/dashboard/clickable_cell_sort_icon/clickable_cell_sort_icon.d.ts +1 -1
  16. package/dist/types/components/dashboard/dashboard.d.ts +1 -0
  17. package/dist/types/components/figures/chart/chartJs/chartjs_geo_projection_plugin.d.ts +12 -0
  18. package/dist/types/components/figures/chart/chartJs/zoomable_chart/zoomable_chartjs.d.ts +1 -0
  19. package/dist/types/components/figures/chart/gauge/gauge_chart_component.d.ts +1 -1
  20. package/dist/types/components/figures/chart/scorecard/chart_scorecard.d.ts +1 -1
  21. package/dist/types/components/figures/figure/figure.d.ts +7 -3
  22. package/dist/types/components/figures/figure_carousel/figure_carousel.d.ts +10 -2
  23. package/dist/types/components/figures/figure_container/figure_container.d.ts +8 -4
  24. package/dist/types/components/full_screen_figure/full_screen_figure.d.ts +12 -1
  25. package/dist/types/components/grid/grid.d.ts +3 -0
  26. package/dist/types/components/grid_overlay/grid_overlay.d.ts +2 -0
  27. package/dist/types/components/grid_popover/grid_popover.d.ts +1 -1
  28. package/dist/types/components/headers_overlay/headers_overlay.d.ts +2 -0
  29. package/dist/types/components/helpers/chart_drag_and_drop.d.ts +15 -0
  30. package/dist/types/components/helpers/dom_helpers.d.ts +3 -2
  31. package/dist/types/components/helpers/draw_grid_hook.d.ts +1 -2
  32. package/dist/types/components/helpers/figure_drag_helper.d.ts +3 -3
  33. package/dist/types/components/helpers/figure_snap_helper.d.ts +8 -3
  34. package/dist/types/components/helpers/zoom.d.ts +0 -14
  35. package/dist/types/components/highlight/highlight/highlight.d.ts +1 -0
  36. package/dist/types/components/link/link_editor/link_editor.d.ts +2 -1
  37. package/dist/types/components/popover/popover.d.ts +0 -1
  38. package/dist/types/components/popover/popover_container_owl_plugin.d.ts +5 -0
  39. package/dist/types/components/scrollbar/scrollbar_horizontal.d.ts +1 -0
  40. package/dist/types/components/scrollbar/scrollbar_vertical.d.ts +1 -0
  41. package/dist/types/components/side_panel/carousel_panel/carousel_panel.d.ts +1 -1
  42. package/dist/types/components/side_panel/chart/building_blocks/chart_title/chart_title.d.ts +1 -0
  43. package/dist/types/components/side_panel/chart/building_blocks/color_scale/color_scale_picker.d.ts +1 -1
  44. package/dist/types/components/side_panel/chart/calendar_chart/calendar_chart_config_panel.d.ts +0 -2
  45. package/dist/types/components/side_panel/chart/chart_type_picker_popover/chart_type_picker_popover.d.ts +0 -1
  46. package/dist/types/components/side_panel/chart/scorecard_chart_panel/scorecard_chart_config_panel.d.ts +6 -10
  47. package/dist/types/components/side_panel/components/radio_selection/radio_selection.d.ts +1 -1
  48. package/dist/types/components/side_panel/data_analysis/chart_suggestion_preview.d.ts +19 -0
  49. package/dist/types/components/side_panel/data_analysis/data_analysis_panel.d.ts +17 -0
  50. package/dist/types/components/side_panel/data_analysis/data_analysis_store.d.ts +15 -0
  51. package/dist/types/components/side_panel/find_and_replace/find_and_replace.d.ts +1 -0
  52. package/dist/types/components/side_panel/find_and_replace/find_and_replace_store.d.ts +2 -1
  53. package/dist/types/components/side_panel/pivot/pivot_layout_configurator/pivot_layout_configurator.d.ts +1 -6
  54. package/dist/types/components/side_panel/side_panel/side_panel_store.d.ts +2 -1
  55. package/dist/types/components/side_panel/table_panel/table_panel.d.ts +6 -0
  56. package/dist/types/components/side_panel/table_style_editor_panel/table_style_editor_panel.d.ts +2 -0
  57. package/dist/types/components/spreadsheet/spreadsheet.d.ts +11 -5
  58. package/dist/types/components/spreadsheet_print/print_iframe.d.ts +15 -0
  59. package/dist/types/components/spreadsheet_print/spreadsheet_print.d.ts +4 -0
  60. package/dist/types/components/standalone_grid_canvas/carousel_data_view_print.d.ts +32 -0
  61. package/dist/types/components/standalone_grid_canvas/standalone_grid_canvas.d.ts +396 -1
  62. package/dist/types/components/standalone_viewport/standalone_viewport.d.ts +8 -4
  63. package/dist/types/components/standalone_viewport/standalone_viewport_store.d.ts +2 -1
  64. package/dist/types/components/tables/hovered_table_store.d.ts +6 -7
  65. package/dist/types/components/tables/table_resizer/table_resizer.d.ts +1 -0
  66. package/dist/types/components/tables/table_styles_popover/table_styles_popover.d.ts +0 -1
  67. package/dist/types/components/top_bar/color_editor/color_editor.d.ts +1 -1
  68. package/dist/types/components/top_bar/zoom_editor/zoom_editor.d.ts +1 -1
  69. package/dist/types/constants.d.ts +17 -2
  70. package/dist/types/formulas/compiler.d.ts +1 -1
  71. package/dist/types/functions/function_registry.d.ts +3 -0
  72. package/dist/types/functions/helper_lookup.d.ts +1 -1
  73. package/dist/types/functions/helpers.d.ts +4 -0
  74. package/dist/types/functions/module_operators.d.ts +1 -1
  75. package/dist/types/functions/module_text.d.ts +16 -13
  76. package/dist/types/functions/module_web.d.ts +1 -1
  77. package/dist/types/helpers/carousel_helpers.d.ts +8 -1
  78. package/dist/types/helpers/cells/cell_evaluation.d.ts +1 -1
  79. package/dist/types/helpers/color.d.ts +1 -1
  80. package/dist/types/helpers/color_themes.d.ts +2 -0
  81. package/dist/types/helpers/data_analysis.d.ts +17 -0
  82. package/dist/types/helpers/figures/chart.d.ts +7 -6
  83. package/dist/types/helpers/figures/charts/chart_common.d.ts +3 -3
  84. package/dist/types/helpers/figures/charts/chart_data_source_helpers.d.ts +10 -0
  85. package/dist/types/helpers/figures/charts/chart_data_sources.d.ts +3 -3
  86. package/dist/types/helpers/figures/charts/chart_suggestion_engine.d.ts +8 -0
  87. package/dist/types/helpers/figures/charts/chart_ui_common.d.ts +11 -4
  88. package/dist/types/helpers/figures/charts/charts_suggestions_constants.d.ts +37 -0
  89. package/dist/types/helpers/figures/charts/gauge_chart_rendering.d.ts +6 -2
  90. package/dist/types/helpers/figures/charts/runtime/chart_data_extractor.d.ts +13 -12
  91. package/dist/types/helpers/figures/charts/runtime/chartjs_title.d.ts +2 -2
  92. package/dist/types/helpers/filter_helpers.d.ts +2 -2
  93. package/dist/types/helpers/links.d.ts +1 -1
  94. package/dist/types/helpers/owl3_helpers.d.ts +4 -0
  95. package/dist/types/helpers/pivot/pivot_composer_helpers.d.ts +1 -1
  96. package/dist/types/helpers/pivot/pivot_presentation.d.ts +2 -2
  97. package/dist/types/helpers/pivot/pivot_registry.d.ts +4 -5
  98. package/dist/types/helpers/pivot/spreadsheet_pivot/runtime_definition_spreadsheet_pivot.d.ts +2 -2
  99. package/dist/types/helpers/range.d.ts +1 -1
  100. package/dist/types/helpers/rectangle.d.ts +4 -0
  101. package/dist/types/helpers/text_helper.d.ts +1 -1
  102. package/dist/types/helpers/viewport_collection.d.ts +2 -6
  103. package/dist/types/index.d.ts +24 -10
  104. package/dist/types/model.d.ts +17 -10
  105. package/dist/types/owl3_compatibility_layer.d.ts +1 -14
  106. package/dist/types/plugins/core/carousel.d.ts +1 -1
  107. package/dist/types/plugins/core/image.d.ts +2 -1
  108. package/dist/types/plugins/core/range.d.ts +4 -2
  109. package/dist/types/plugins/core/squisher.d.ts +6 -2
  110. package/dist/types/plugins/core/tables.d.ts +2 -1
  111. package/dist/types/plugins/core/unsquisher.d.ts +1 -1
  112. package/dist/types/plugins/core_plugin.d.ts +1 -1
  113. package/dist/types/plugins/{ui_stateful → evaluation}/cell_computed_style.d.ts +4 -4
  114. package/dist/types/plugins/{ui_core_views/cell_evaluation/evaluation_plugin.d.ts → evaluation/cell_evaluation/cell_evaluation_plugin.d.ts} +7 -7
  115. package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/compilation_parameters.d.ts +2 -2
  116. package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/evaluator.d.ts +2 -2
  117. package/dist/types/plugins/{ui_core_views → evaluation}/custom_colors.d.ts +5 -5
  118. package/dist/types/plugins/{ui_core_views → evaluation}/dynamic_tables.d.ts +4 -4
  119. package/dist/types/plugins/{ui_feature → evaluation}/dynamic_translate.d.ts +2 -2
  120. package/dist/types/plugins/evaluation/evaluation_chart.d.ts +27 -0
  121. package/dist/types/plugins/{ui_core_views → evaluation}/evaluation_conditional_format.d.ts +4 -4
  122. package/dist/types/plugins/{ui_core_views → evaluation}/evaluation_data_validation.d.ts +4 -4
  123. package/dist/types/plugins/{ui_stateful → evaluation}/filter_evaluation.d.ts +5 -5
  124. package/dist/types/plugins/{ui_core_views → evaluation}/fingerprint.d.ts +2 -2
  125. package/dist/types/plugins/evaluation/formula_tracker.d.ts +8 -0
  126. package/dist/types/plugins/evaluation/geo_loader.d.ts +13 -0
  127. package/dist/types/plugins/{ui_core_views → evaluation}/header_sizes_ui.d.ts +5 -5
  128. package/dist/types/plugins/{ui_stateful/header_visibility_ui.d.ts → evaluation/header_visibility_evaluation.d.ts} +2 -2
  129. package/dist/types/plugins/evaluation/pivot_presence_plugin.d.ts +12 -0
  130. package/dist/types/plugins/{ui_core_views → evaluation}/pivot_ui.d.ts +6 -6
  131. package/dist/types/plugins/evaluation/subtotal_evaluation.d.ts +5 -0
  132. package/dist/types/plugins/{ui_stateful → evaluation}/table_computed_style.d.ts +7 -7
  133. package/dist/types/plugins/evaluation_plugin.d.ts +31 -0
  134. package/dist/types/plugins/plugin_registries.d.ts +11 -5
  135. package/dist/types/plugins/ui_feature/chart_ui.d.ts +6 -0
  136. package/dist/types/plugins/ui_feature/color_theme.d.ts +0 -3
  137. package/dist/types/plugins/ui_feature/geo_features.d.ts +1 -6
  138. package/dist/types/plugins/ui_plugin.d.ts +1 -4
  139. package/dist/types/plugins/{ui_core_views → ui_stateful}/cell_icon_plugin.d.ts +2 -2
  140. package/dist/types/registries/chart_data_source_registry.d.ts +4 -5
  141. package/dist/types/registries/chart_registry.d.ts +5 -5
  142. package/dist/types/registries/criterion_registry.d.ts +4 -4
  143. package/dist/types/registries/evaluation_registry.d.ts +2 -2
  144. package/dist/types/registries/figures_registry.d.ts +6 -2
  145. package/dist/types/stores/cell_hover_overlay_store.d.ts +15 -0
  146. package/dist/types/stores/chart_drag_store.d.ts +10 -0
  147. package/dist/types/{plugins/ui_stateful/clipboard.d.ts → stores/clipboard_store.d.ts} +11 -11
  148. package/dist/types/stores/grid_renderer_store.d.ts +3 -2
  149. package/dist/types/stores/main_viewport_store.d.ts +3 -0
  150. package/dist/types/stores/viewports_store.d.ts +3 -6
  151. package/dist/types/stores/zoom_store.d.ts +27 -0
  152. package/dist/types/types/chart/chart.d.ts +3 -1
  153. package/dist/types/types/chart/chart_suggestion.d.ts +137 -0
  154. package/dist/types/types/chart/scorecard_chart.d.ts +3 -4
  155. package/dist/types/types/collaborative/transport_service.d.ts +4 -1
  156. package/dist/types/types/commands.d.ts +39 -19
  157. package/dist/types/types/functions.d.ts +2 -2
  158. package/dist/types/types/getters.d.ts +102 -21
  159. package/dist/types/types/model.d.ts +2 -4
  160. package/dist/types/types/rendering.d.ts +21 -1
  161. package/package.json +7 -6
  162. package/dist/types/plugins/core_view_plugin.d.ts +0 -29
  163. package/dist/types/plugins/ui_core_views/evaluation_chart.d.ts +0 -26
  164. package/dist/types/plugins/ui_core_views/formula_tracker.d.ts +0 -8
  165. package/dist/types/plugins/ui_feature/pivot_presence_plugin.d.ts +0 -11
  166. package/dist/types/plugins/ui_feature/subtotal_evaluation.d.ts +0 -5
  167. package/dist/types/types/core_getters.d.ts +0 -77
  168. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/binary_grid.d.ts +0 -0
  169. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/formula_dependency_graph.d.ts +0 -0
  170. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/interval_tree.d.ts +0 -0
  171. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/position_set.d.ts +0 -0
  172. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/r_tree.d.ts +0 -0
  173. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/range_set.d.ts +0 -0
  174. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/spreading_relation.d.ts +0 -0
  175. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/zone_set.d.ts +0 -0
@@ -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.8
5
- @date 2026-08-04T07:11:41.047Z
6
- @hash c1baebe
4
+ @version 20.0.0
5
+ @date 2026-09-17T07:58:19.411Z
6
+ @hash 9d84039
7
7
  -->
8
8
  <odoo>
9
9
  <t t-name="o-spreadsheet-ValidationMessages">
@@ -16,7 +16,7 @@
16
16
  <t t-else="" t-call="o-spreadsheet-Icon.TRIANGLE_EXCLAMATION"/>
17
17
  </div>
18
18
  <div class="d-flex flex-column overflow-hidden">
19
- <span class="ps-2 text-truncate" t-out="msg"/>
19
+ <span class="ps-2" t-out="msg"/>
20
20
  </div>
21
21
  </div>
22
22
  </div>
@@ -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>
@@ -476,13 +478,15 @@
476
478
  </t>
477
479
 
478
480
  <t t-name="o-spreadsheet-StandaloneGridCanvas">
479
- <canvas t-ref="this.canvasRef"/>
481
+ <t t-foreach="this.carouselDataViews" t-as="carouselDataView" t-key="carouselDataView_index">
482
+ <CarouselDataViewPrint t-props="carouselDataView"/>
483
+ </t>
480
484
  </t>
481
485
 
482
486
  <t t-name="o-spreadsheet-SpreadsheetPrint">
483
487
  <div class="o-spreadsheet-print d-flex flex-column h-100 w-100">
484
488
  <t t-set="pages" t-value="this.printStore.printPages"/>
485
- <div class="o-print-header flex-shrink-0 d-flex align-items-center d-print-none">
489
+ <div class="o-print-header flex-shrink-0 d-flex align-items-center">
486
490
  <h3 class="m-0 p-3 ps-4 text-white">Print Preview</h3>
487
491
  <span class="text-white">
488
492
  <t t-out="pages.length"/>
@@ -494,30 +498,8 @@
494
498
  <button class="o-button primary flex-grow-0 me-4" t-on-click="this.onPrint">Next</button>
495
499
  </div>
496
500
  <div class="o-print-container d-flex flex-grow-1 overflow-hidden">
497
- <div class="o-print-preview w-100 overflow-auto d-flex flex-column">
498
- <div class="mx-auto">
499
- <div
500
- t-if="pages.length === 0"
501
- class="o-print-page o-empty-print-page m-4 shadow d-flex flex-column align-items-center justify-content-center flex-shrink-0"
502
- t-att-style="this.pageStyle">
503
- <h4 class="fst-italic text-muted">No content to print</h4>
504
- </div>
505
- <div
506
- t-else=""
507
- t-foreach="pages"
508
- t-as="page"
509
- t-key="page_index"
510
- class="o-print-page m-4 shadow d-flex justify-content-center flex-shrink-0"
511
- t-att-style="this.pageStyle">
512
- <StandaloneGridCanvas
513
- sheetId="page.sheetId"
514
- zone="page.zone"
515
- renderingCtx="page.renderingCtx"
516
- />
517
- </div>
518
- </div>
519
- </div>
520
- <div class="o-sidePanel flex-shrink-0 bg-white border-top border-start d-print-none">
501
+ <iframe class="o-print-preview" t-ref="this.iframeRef" title="Print preview"/>
502
+ <div class="o-sidePanel flex-shrink-0 bg-white border-top border-start">
521
503
  <div class="o-sidePanelBody pt-4">
522
504
  <Section t-if="!this.env.model.getters.isDashboard()">
523
505
  <div class="o-section-title">Print content</div>
@@ -571,6 +553,16 @@
571
553
  </div>
572
554
  </div>
573
555
  </div>
556
+
557
+ <t t-foreach="pages" t-as="page" t-key="page_index">
558
+ <StandaloneGridCanvas
559
+ t-if="this.printIframe.canvases()[page_index]"
560
+ canvas="this.printIframe.canvases()[page_index]"
561
+ sheetId="page.sheetId"
562
+ zone="page.zone"
563
+ renderingCtx="page.renderingCtx"
564
+ />
565
+ </t>
574
566
  </div>
575
567
  </t>
576
568
 
@@ -660,7 +652,7 @@
660
652
  <div class="d-flex flex-fill align-items-center bottom-bar-menu border-top border-bottom">
661
653
  <Ripple>
662
654
  <div class="py-1 px-1 mx-2 ribbon-toggler" t-on-click="this.toggleRibbon">
663
- <i class="o-icon fa fa-cog"/>
655
+ <i class="o-icon oi oi-filled" data-icon="settings_f"/>
664
656
  </div>
665
657
  </Ripple>
666
658
  <BottomBar onClick="this.props.onClick"/>
@@ -676,7 +668,7 @@
676
668
  class="o-previous-button px-3 py-1 mx-2 rounded"
677
669
  t-on-click="this.onClickBack"
678
670
  t-att-title="this.backTitle">
679
- <i class="fa fa-angle-left"/>
671
+ <i class="oi" data-icon="keyboard_arrow_left"/>
680
672
  </div>
681
673
  <span class="d-flex align-items-center" t-out="this.state.title"/>
682
674
  </div>
@@ -692,7 +684,11 @@
692
684
  <t t-name="o-spreadsheet-TableStyleEditorPanel">
693
685
  <div class="o-table-style-editor-panel">
694
686
  <Section title.translate="Style name">
695
- <input type="text" class="o-input" t-custom-model="this.state.styleName"/>
687
+ <TextInput
688
+ value="this.state.styleName"
689
+ onChange="(value) => this.state.styleName = value"
690
+ alwaysShowBorder="true"
691
+ />
696
692
  </Section>
697
693
  <Section class="'pt-1'" title.translate="Style color">
698
694
  <RoundColorPicker
@@ -913,14 +909,14 @@
913
909
  t-if="this.props.onToggleCollapsePanel"
914
910
  class="o-collapse-panel o-sidePanelAction rounded"
915
911
  t-on-click="this.props.onToggleCollapsePanel">
916
- <i class="fa fa-angle-double-right"/>
912
+ <i class="oi" data-icon="keyboard_double_arrow_right"/>
917
913
  </div>
918
914
  <div class="o-sidePanelTitle o-fw-bold ms-2" t-out="this.getTitle()"/>
919
915
  <div
920
916
  t-if="this.props.isPinned"
921
917
  class="o-pin-panel o-sidePanelAction ms-auto rounded active"
922
918
  t-on-click="this.props.onTogglePinPanel">
923
- <i class="fa fa-thumb-tack"/>
919
+ <i class="oi" data-icon="push_pin"/>
924
920
  </div>
925
921
  <div
926
922
  class="o-sidePanelClose o-sidePanelAction rounded"
@@ -959,13 +955,13 @@
959
955
  <div
960
956
  t-if="this.props.onToggleCollapsePanel"
961
957
  class="o-collapse-panel o-sidePanelAction rounded mb-1">
962
- <i class="fa fa-angle-double-left"/>
958
+ <i class="oi" data-icon="keyboard_double_arrow_left"/>
963
959
  </div>
964
960
  <div
965
961
  t-if="this.props.isPinned"
966
962
  class="o-pin-panel o-sidePanelAction ms-auto rounded active"
967
963
  t-on-click="this.props.onTogglePinPanel">
968
- <i class="fa fa-thumb-tack"/>
964
+ <i class="oi" data-icon="push_pin"/>
969
965
  </div>
970
966
  <div
971
967
  class="o-sidePanelClose o-sidePanelAction rounded mb-1"
@@ -1084,17 +1080,17 @@
1084
1080
  <div class="o-pivot-panel d-flex flex-column h-100">
1085
1081
  <div class="o-panel d-flex">
1086
1082
  <div
1087
- class="o-sidePanel-tab o-panel-configuration d-flew flex-grow-1 text-center"
1083
+ class="o-sidePanel-tab o-panel-configuration d-flex flex-grow-1 justify-content-center"
1088
1084
  t-att-class="this.state.panel !== 'configuration' ? 'inactive' : ''"
1089
1085
  t-on-click="this.switchPanel.bind(this, 'configuration')">
1090
- <i class="fa fa-sliders me-1"/>
1086
+ <i class="oi me-2" data-icon="tune"/>
1091
1087
  Configuration
1092
1088
  </div>
1093
1089
  <div
1094
- class="o-sidePanel-tab o-panel-design d-flew flex-grow-1 text-center"
1090
+ class="o-sidePanel-tab o-panel-design d-flex flex-grow-1 justify-content-center"
1095
1091
  t-att-class="this.state.panel !== 'design' ? 'inactive' : ''"
1096
1092
  t-on-click="this.switchPanel.bind(this, 'design')">
1097
- <i class="fa fa-paint-brush me-1"/>
1093
+ <i class="oi me-2" data-icon="design_services"/>
1098
1094
  Design
1099
1095
  </div>
1100
1096
  </div>
@@ -1372,7 +1368,8 @@
1372
1368
  <t t-set="errorMessage" t-value="this.getHugeDimensionErrorMessage(col)"/>
1373
1369
  <i
1374
1370
  t-if="errorMessage"
1375
- class="text-warning fa fa-exclamation-triangle"
1371
+ class="text-warning oi"
1372
+ data-icon="warning"
1376
1373
  t-att-title="errorMessage"
1377
1374
  />
1378
1375
  </t>
@@ -1413,7 +1410,8 @@
1413
1410
  <t t-set="errorMessage" t-value="this.getHugeDimensionErrorMessage(row)"/>
1414
1411
  <i
1415
1412
  t-if="errorMessage"
1416
- class="text-warning fa fa-exclamation-triangle"
1413
+ class="text-warning oi"
1414
+ data-icon="warning"
1417
1415
  t-att-title="errorMessage"
1418
1416
  />
1419
1417
  </t>
@@ -1504,13 +1502,14 @@
1504
1502
  <t t-if="measure.isHidden" t-set="hideTitle">Show</t>
1505
1503
  <t t-else="" t-set="hideTitle">Hide</t>
1506
1504
  <i
1507
- t-att-class="measure.isHidden ? 'fa fa-eye-slash': 'fa fa-eye'"
1505
+ t-att-data-icon="measure.isHidden ? 'visibility_off_f' : 'visibility_f'"
1508
1506
  t-att-title="hideTitle"
1509
- class="o-button-icon pe-1 ps-2"
1507
+ class="o-button-icon pe-1 ps-1 oi"
1510
1508
  t-on-click="this.toggleMeasureVisibility"
1511
1509
  />
1512
1510
  <i
1513
- class="o-button-icon pe-1 ps-2 fa fa-cog"
1511
+ class="o-button-icon pe-1 ps-1 oi oi-filled"
1512
+ data-icon="settings_f"
1514
1513
  title="Show values as"
1515
1514
  t-on-click="this.openShowValuesAs"
1516
1515
  />
@@ -1598,7 +1597,8 @@
1598
1597
  <div class="d-flex flex-rows">
1599
1598
  <t t-call-slot="upper-right-icons"/>
1600
1599
  <i
1601
- class="o-button-icon fa fa-trash pe-1 ps-2"
1600
+ class="o-button-icon oi oi-filled pe-1 ps-1"
1601
+ data-icon="delete_f"
1602
1602
  t-if="this.props.onRemoved"
1603
1603
  t-on-click="() => this.props.onRemoved(this.props.dimension)"
1604
1604
  />
@@ -1678,7 +1678,8 @@
1678
1678
  />
1679
1679
  <div t-if="this.props.isDirty" class="d-flex align-items-center">
1680
1680
  <i
1681
- class="o-button-icon pe-0 fa fa-undo"
1681
+ class="o-button-icon pe-0 oi"
1682
+ data-icon="undo"
1682
1683
  title="Discard all changes"
1683
1684
  t-on-click="() => this.props.discard()"
1684
1685
  />
@@ -1711,7 +1712,8 @@
1711
1712
  selectContentOnFocus="true"
1712
1713
  />
1713
1714
  <i
1714
- class="o-button-icon ps-3 fa fa-trash"
1715
+ class="o-button-icon ps-3 oi oi-filled"
1716
+ data-icon="delete_f"
1715
1717
  t-on-click="() => this.onDeleteGroup(group_index)"
1716
1718
  />
1717
1719
  </div>
@@ -1746,8 +1748,10 @@
1746
1748
  <div class="d-flex flex-column gap-1">
1747
1749
  <div class="d-flex justify-content-center mb-3">
1748
1750
  <button class="o-button" t-on-click="this.startProfiling">
1749
- <i class="fa fa-refresh me-1"/>
1750
- Re-analyze
1751
+ <div class="d-flex justify-content-center align-content-center">
1752
+ <i class="oi me-1" data-icon="refresh"/>
1753
+ Re-analyze
1754
+ </div>
1751
1755
  </button>
1752
1756
  </div>
1753
1757
  <div class="d-flex justify-content-between">
@@ -2059,7 +2063,8 @@
2059
2063
  type="text"
2060
2064
  class="o-input o-input-without-count o-replace"
2061
2065
  t-on-keydown="this.onKeydownReplace"
2062
- t-custom-model="this.store.toReplace"
2066
+ t-att-value="this.store.toReplace"
2067
+ t-on-input="this.onReplaceInput"
2063
2068
  placeholder="e.g. 'replace me'"
2064
2069
  />
2065
2070
  </div>
@@ -2193,6 +2198,42 @@
2193
2198
  </div>
2194
2199
  </t>
2195
2200
 
2201
+ <div t-name="o-spreadsheet-DataAnalysisPanel" class="o-data-analysis-panel">
2202
+ <Section title.translate="Suggested charts">
2203
+ <div t-if="this.store.hasData" class="px-2 pb-2">
2204
+ <div t-if="this.store.chartSuggestions.length" class="o-chart-suggestions-grid">
2205
+ <t t-foreach="this.store.chartSuggestions" t-as="suggestion" t-key="suggestion_index">
2206
+ <ChartSuggestionPreview
2207
+ definition="suggestion.definition"
2208
+ description="suggestion.description"
2209
+ onPointerDown="(ev) => this.onStartChartSuggestionDrag(suggestion.definition, ev)"
2210
+ />
2211
+ </t>
2212
+ </div>
2213
+ <div t-else="" class="o-data-analysis-empty text-muted p-3 text-center">
2214
+ No chart suggestions available for the selected data. Note that the order of selected
2215
+ columns can impact chart suggestions.
2216
+ </div>
2217
+ </div>
2218
+ <div t-else="" class="o-data-analysis-empty text-muted p-3 text-center">
2219
+ Select cells containing data to see chart suggestions. Note that the order of selected
2220
+ columns can impact chart suggestions.
2221
+ </div>
2222
+ </Section>
2223
+ </div>
2224
+
2225
+ <t t-name="o-spreadsheet-ChartSuggestionPreview">
2226
+ <div
2227
+ class="o-suggestion-canvas-wrap os-theme-dependant overflow-hidden position-relative border rounded"
2228
+ t-on-pointerdown="(ev) => this.props.onPointerDown(ev)"
2229
+ t-att-title="this.props.description">
2230
+ <canvas class="w-100 h-100" t-ref="this.chartCanvasRef"/>
2231
+ <div class="o-suggestion-insert-icon d-flex align-items-center justify-content-center">
2232
+ <t t-call="o-spreadsheet-Icon.INSERT_CHART_SUGGESTION"/>
2233
+ </div>
2234
+ </div>
2235
+ </t>
2236
+
2196
2237
  <t t-name="o-spreadsheet-ValueInRangeCriterionForm">
2197
2238
  <SelectionInput
2198
2239
  ranges="[this.props.criterion.values[0] || '']"
@@ -2381,7 +2422,8 @@
2381
2422
  <t t-name="o-spreadsheet-CalendarButton">
2382
2423
  <div class="o-calendar-button ms-1">
2383
2424
  <button type="button" class="o-button btn" t-on-click="this.openCalendar">
2384
- <i class="fa fa-calendar"/>
2425
+ <!-- TODORAR see how we can make filled versions -->
2426
+ <i class="oi oi-filled" data-icon="calendar_today"/>
2385
2427
  </button>
2386
2428
  <input
2387
2429
  type="date"
@@ -2895,17 +2937,17 @@
2895
2937
 
2896
2938
  <t t-name="o-spreadsheet-SidePanelCollapsible">
2897
2939
  <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()">
2940
+ <div class="o_side_panel_collapsible_title o-fw-bold d-flex align-items-center">
2901
2941
  <div
2902
2942
  class="collapsor w-100 d-flex align-items-center ps-1"
2903
- t-att-class="this.state.isCollapsed ? 'collapsed' : ''">
2943
+ t-att-class="this.state.isCollapsed ? 'collapsed' : ''"
2944
+ t-on-click="() => this.toggle()">
2904
2945
  <span class="collapsor-arrow">
2905
2946
  <t t-call="o-spreadsheet-Icon.ANGLE_DOWN"/>
2906
2947
  </span>
2907
2948
  <div class="ps-2" t-out="this.props.title"/>
2908
2949
  </div>
2950
+ <t t-call-slot="titleButton"/>
2909
2951
  </div>
2910
2952
  <Collapse isCollapsed="this.state.isCollapsed">
2911
2953
  <div class="pt-2">
@@ -2923,7 +2965,8 @@
2923
2965
 
2924
2966
  <t t-name="o-spreadsheet-CogWheelMenu">
2925
2967
  <span
2926
- class="fa fa-cog os-cog-wheel-menu-icon o-button-icon"
2968
+ class="oi oi-filled os-cog-wheel-menu-icon o-button-icon"
2969
+ data-icon="settings_f"
2927
2970
  t-on-click="this.toggleMenu"
2928
2971
  t-ref="this.buttonRef"
2929
2972
  />
@@ -3390,19 +3433,21 @@
3390
3433
  </Section>
3391
3434
  </t>
3392
3435
  </GeneralDesignEditor>
3393
- <ChartTitle
3394
- title="this.props.definition.keyDescr?.text ?? ''"
3395
- updateTitle="(text) => this.setKeyText(text)"
3396
- name.translate="Key Value Style"
3397
- placeholder.translate="Add a key value description"
3398
- updateStyle.bind="this.updateKeyStyle"
3399
- style="this.keyStyle"
3400
- />
3401
- <SidePanelCollapsible isInitiallyCollapsed="false" title.translate="Baseline">
3436
+ <SidePanelCollapsible isInitiallyCollapsed="false" title.translate="Scorecard Design">
3402
3437
  <t t-set-slot="content">
3403
3438
  <ChartTitle
3439
+ class="'pt-0'"
3440
+ title="this.props.definition.keyDescr?.text ?? ''"
3441
+ updateTitle.bind="this.setKeyText"
3442
+ name.translate="Key Value Style"
3443
+ placeholder.translate="Add a key value description"
3444
+ updateStyle.bind="this.updateKeyStyle"
3445
+ style="this.keyStyle"
3446
+ />
3447
+ <ChartTitle
3448
+ class="'pt-0'"
3404
3449
  title="this.props.definition.baselineDescr?.text ?? ''"
3405
- updateTitle="(text) => this.setBaselineText(text)"
3450
+ updateTitle.bind="this.setBaselineText"
3406
3451
  name.translate="Baseline Style"
3407
3452
  placeholder.translate="Add a baseline description"
3408
3453
  updateStyle.bind="this.updateBaselineStyle"
@@ -3434,23 +3479,22 @@
3434
3479
  <t t-name="o-spreadsheet-ScorecardChartConfigPanel">
3435
3480
  <div>
3436
3481
  <Section class="'o-data-series'" title.translate="Key value">
3437
- <SelectionInput
3438
- ranges="[this.getKeyValueRange()]"
3439
- isInvalid="this.isKeyValueInvalid"
3440
- hasSingleRange="true"
3441
- required="true"
3442
- onSelectionChanged="(ranges) => this.onKeyValueRangeChanged(ranges)"
3443
- onSelectionConfirmed="() => this.updateKeyValueRange()"
3482
+ <StandaloneComposer
3483
+ placeholder.translate="Formula"
3484
+ title.translate=""
3485
+ composerContent="this.getKeyValue()"
3486
+ defaultRangeSheetId="this.env.model.getters.getActiveSheetId()"
3487
+ onConfirm.bind="this.onConfirmKeyValue"
3444
3488
  />
3445
3489
  </Section>
3446
3490
  <Section class="'o-data-labels'" title.translate="Baseline configuration">
3447
3491
  <div class="o-section-subtitle">Value</div>
3448
- <SelectionInput
3449
- ranges="[this.getBaselineRange()]"
3450
- isInvalid="this.isBaselineInvalid"
3451
- hasSingleRange="true"
3452
- onSelectionChanged="(ranges) => this.onBaselineRangeChanged(ranges)"
3453
- onSelectionConfirmed="() => this.updateBaselineRange()"
3492
+ <StandaloneComposer
3493
+ placeholder.translate="Formula"
3494
+ title.translate=""
3495
+ composerContent="this.getBaseline()"
3496
+ defaultRangeSheetId="this.env.model.getters.getActiveSheetId()"
3497
+ onConfirm.bind="this.onConfirmBaseline"
3454
3498
  />
3455
3499
  <div class="o-section-subtitle">Format</div>
3456
3500
  <Select
@@ -3542,17 +3586,17 @@
3542
3586
  <div class="o-chart d-flex flex-column h-100" t-if="this.chartId">
3543
3587
  <div class="o-panel d-flex">
3544
3588
  <div
3545
- class="o-sidePanel-tab o-panel-configuration d-flew flex-grow-1 text-center"
3589
+ class="o-sidePanel-tab o-panel-configuration d-flex flex-grow-1 justify-content-center"
3546
3590
  t-att-class="this.store.panel !== 'configuration' ? 'inactive' : ''"
3547
3591
  t-on-click="this.switchPanel.bind(this, 'configuration')">
3548
- <i class="fa fa-sliders me-1"/>
3592
+ <i class="oi me-2" data-icon="tune"/>
3549
3593
  Configuration
3550
3594
  </div>
3551
3595
  <div
3552
- class="o-sidePanel-tab o-panel-design d-flew flex-grow-1 text-center"
3596
+ class="o-sidePanel-tab o-panel-design d-flex flex-grow-1 justify-content-center"
3553
3597
  t-att-class="this.store.panel !== 'design' ? 'inactive' : ''"
3554
3598
  t-on-click="this.switchPanel.bind(this, 'design')">
3555
- <i class="fa fa-paint-brush me-1"/>
3599
+ <i class="oi me-2" data-icon="design_services"/>
3556
3600
  Design
3557
3601
  </div>
3558
3602
  </div>
@@ -3662,7 +3706,7 @@
3662
3706
  updateChart="this.props.updateChart"
3663
3707
  canUpdateChart="this.props.canUpdateChart"
3664
3708
  onErrorMessagesChanged.bind="this.onErrorMessagesChanged"
3665
- getLabelRangeOptions.bind="this.getLabelRangeOptions"
3709
+ getLabelRangeOptions="() => []"
3666
3710
  dataSeriesTitle.translate="Hierarchy"
3667
3711
  labelRangeTitle.translate="Values"
3668
3712
  />
@@ -4534,7 +4578,7 @@
4534
4578
  updateChart="this.props.updateChart"
4535
4579
  canUpdateChart="this.props.canUpdateChart"
4536
4580
  onErrorMessagesChanged.bind="this.onErrorMessagesChanged"
4537
- getLabelRangeOptions.bind="this.getLabelRangeOptions"
4581
+ getLabelRangeOptions="() => []"
4538
4582
  labelRangeTitle.translate="Date range"
4539
4583
  />
4540
4584
 
@@ -4543,7 +4587,7 @@
4543
4587
  <span class="w-100">Horizontal axis</span>
4544
4588
  <Select
4545
4589
  selectedValue="this.getGroupByType('horizontal') || ''"
4546
- values="this.getGroupByOptions()"
4590
+ values="this.groupByChoices"
4547
4591
  class="'o-horizontal-group-by'"
4548
4592
  onChange="(value) => this.updateGroupBy('horizontal', value)"
4549
4593
  />
@@ -4552,7 +4596,7 @@
4552
4596
  <span class="w-100">Vertical axis</span>
4553
4597
  <Select
4554
4598
  selectedValue="this.getGroupByType('vertical') || ''"
4555
- values="this.getGroupByOptions()"
4599
+ values="this.groupByChoices"
4556
4600
  class="'o-vertical-group-by'"
4557
4601
  onChange="(value) => this.updateGroupBy('vertical', value)"
4558
4602
  />
@@ -5024,7 +5068,7 @@
5024
5068
  </t>
5025
5069
 
5026
5070
  <t t-name="o-spreadsheet.ChartTitle">
5027
- <Section class="'o-chart-title'" title="this.props.name">
5071
+ <Section class="'o-chart-title ' + (this.props.class ?? '')" title="this.props.name">
5028
5072
  <TextInput
5029
5073
  value="this.props.title"
5030
5074
  onChange.bind="this.updateTitle"
@@ -5543,7 +5587,7 @@
5543
5587
  </t>
5544
5588
 
5545
5589
  <t t-name="o_spreadsheet.PivotHTMLRenderer">
5546
- <div class="o_pivot_html_renderer">
5590
+ <div class="w-100">
5547
5591
  <Checkbox
5548
5592
  name="'missing_values'"
5549
5593
  label.translate="Display missing cells only"
@@ -5793,7 +5837,8 @@
5793
5837
  title="Link label"
5794
5838
  placeholder="e.g. 'Link label'"
5795
5839
  class="o-input"
5796
- t-custom-model="this.state.label"
5840
+ t-att-value="this.state.label"
5841
+ t-on-input="(ev) => this.state.label = ev.target.value"
5797
5842
  />
5798
5843
  </div>
5799
5844
 
@@ -5810,8 +5855,8 @@
5810
5855
  placeholder="e.g. 'http://www.odoo.com'"
5811
5856
  title="Link URL"
5812
5857
  t-ref="this.urlInput"
5813
- t-custom-model="this.state.url"
5814
- t-on-input="this.computeLinks"
5858
+ t-att-value="this.state.url"
5859
+ t-on-input="this.onLinkUrlInput"
5815
5860
  />
5816
5861
  </t>
5817
5862
  <t t-else="">
@@ -5828,7 +5873,7 @@
5828
5873
  t-on-click="this.removeLink"
5829
5874
  class="o-remove-url o-button-icon"
5830
5875
  t-translation="off">
5831
- <i class="fa fa-times"/>
5876
+ <i class="oi" data-icon="close"/>
5832
5877
  </button>
5833
5878
  </div>
5834
5879
  </div>
@@ -6005,12 +6050,12 @@
6005
6050
  </t>
6006
6051
  <t t-name="o-spreadsheet-Icon.CLIPBOARD">
6007
6052
  <div class="o-icon">
6008
- <i class="fa fa-clipboard"/>
6053
+ <i class="oi" data-icon="assignment"/>
6009
6054
  </div>
6010
6055
  </t>
6011
6056
  <t t-name="o-spreadsheet-Icon.COPY">
6012
6057
  <div class="o-icon">
6013
- <i class="fa fa-clone"/>
6058
+ <i class="oi" data-icon="content_copy"/>
6014
6059
  </div>
6015
6060
  </t>
6016
6061
  <t t-name="o-spreadsheet-Icon.CUT">
@@ -6068,7 +6113,7 @@
6068
6113
  </t>
6069
6114
  <t t-name="o-spreadsheet-Icon.SHOW">
6070
6115
  <div class="o-icon">
6071
- <i class="fa fa-eye"/>
6116
+ <i class="oi" data-icon="visibility"/>
6072
6117
  </div>
6073
6118
  </t>
6074
6119
  <t t-name="o-spreadsheet-Icon.FORMULA">
@@ -6201,22 +6246,22 @@
6201
6246
  </t>
6202
6247
  <t t-name="o-spreadsheet-Icon.INSERT_CHART">
6203
6248
  <div class="o-icon">
6204
- <i class="fa fa-bar-chart"/>
6249
+ <i class="oi" data-icon="bar_chart"/>
6205
6250
  </div>
6206
6251
  </t>
6207
6252
  <t t-name="o-spreadsheet-Icon.INSERT_IMAGE">
6208
6253
  <div class="o-icon">
6209
- <i class="fa fa-file-image-o"/>
6254
+ <i class="oi" data-icon="image"/>
6210
6255
  </div>
6211
6256
  </t>
6212
6257
  <t t-name="o-spreadsheet-Icon.INSERT_LINK">
6213
6258
  <div class="o-icon">
6214
- <i class="fa fa-link"/>
6259
+ <i class="oi" data-icon="link"/>
6215
6260
  </div>
6216
6261
  </t>
6217
6262
  <t t-name="o-spreadsheet-Icon.INSERT_CHECKBOX">
6218
6263
  <div class="o-icon">
6219
- <i class="fa fa-check-square-o"/>
6264
+ <i class="oi" data-icon="check_box"/>
6220
6265
  </div>
6221
6266
  </t>
6222
6267
  <t t-name="o-spreadsheet-Icon.INSERT_DROPDOWN">
@@ -6324,7 +6369,7 @@
6324
6369
  </t>
6325
6370
  <t t-name="o-spreadsheet-Icon.IRREGULARITY_MAP">
6326
6371
  <div class="o-icon">
6327
- <i class="fa fa-align-center fa-rotate-270"/>
6372
+ <i class="oi oi-rotate-270" data-icon="format_align_center"/>
6328
6373
  </div>
6329
6374
  </t>
6330
6375
  <t t-name="o-spreadsheet-Icon.ALIGN_RIGHT">
@@ -6507,67 +6552,67 @@
6507
6552
 
6508
6553
  <t t-name="o-spreadsheet-Icon.FULLSCREEN_OUT">
6509
6554
  <div class="o-icon">
6510
- <i class="fa fa-compress"/>
6555
+ <i class="oi" data-icon="close_fullscreen"/>
6511
6556
  </div>
6512
6557
  </t>
6513
6558
  <t t-name="o-spreadsheet-Icon.FULLSCREEN_IN">
6514
6559
  <div class="o-icon">
6515
- <i class="fa fa-expand"/>
6560
+ <i class="oi" data-icon="expand_content"/>
6516
6561
  </div>
6517
6562
  </t>
6518
6563
  <t t-name="o-spreadsheet-Icon.EDIT">
6519
6564
  <div class="o-icon">
6520
- <i class="fa fa-pencil-square-o"/>
6565
+ <i class="oi" data-icon="edit_square"/>
6521
6566
  </div>
6522
6567
  </t>
6523
6568
  <t t-name="o-spreadsheet-Icon.EXTERNAL">
6524
6569
  <div class="o-icon">
6525
- <i class="fa fa-external-link"/>
6570
+ <i class="oi" data-icon="open_in_new"/>
6526
6571
  </div>
6527
6572
  </t>
6528
6573
  <t t-name="o-spreadsheet-Icon.UNLINK">
6529
6574
  <div class="o-icon">
6530
- <i class="fa fa-chain-broken"/>
6575
+ <i class="oi" data-icon="link_off"/>
6531
6576
  </div>
6532
6577
  </t>
6533
6578
  <t t-name="o-spreadsheet-Icon.CARET_UP">
6534
- <div class="o-icon fa-small">
6535
- <i class="fa fa-caret-up"/>
6579
+ <div class="o-icon">
6580
+ <i class="oi" data-icon="arrow_drop_up"/>
6536
6581
  </div>
6537
6582
  </t>
6538
6583
  <t t-name="o-spreadsheet-Icon.CARET_DOWN">
6539
- <div class="o-icon fa-small">
6540
- <i class="fa fa-caret-down"/>
6584
+ <div class="o-icon">
6585
+ <i class="oi" data-icon="arrow_drop_down"/>
6541
6586
  </div>
6542
6587
  </t>
6543
6588
  <t t-name="o-spreadsheet-Icon.CARET_RIGHT">
6544
- <div class="o-icon fa-small">
6545
- <i class="fa fa-caret-right"/>
6589
+ <div class="o-icon">
6590
+ <i class="oi" data-icon="arrow_right"/>
6546
6591
  </div>
6547
6592
  </t>
6548
6593
  <t t-name="o-spreadsheet-Icon.CARET_LEFT">
6549
- <div class="o-icon fa-small">
6550
- <i class="fa fa-caret-left"/>
6594
+ <div class="o-icon">
6595
+ <i class="oi" data-icon="arrow_left"/>
6551
6596
  </div>
6552
6597
  </t>
6553
6598
  <t t-name="o-spreadsheet-Icon.TRASH">
6554
6599
  <div class="o-icon">
6555
- <i class="fa fa-trash-o"/>
6600
+ <i class="oi" data-icon="delete"/>
6556
6601
  </div>
6557
6602
  </t>
6558
6603
  <t t-name="o-spreadsheet-Icon.TRASH_FILLED">
6559
6604
  <div class="o-icon">
6560
- <i class="fa fa-trash"/>
6605
+ <i class="oi oi-filled" data-icon="delete_f"/>
6561
6606
  </div>
6562
6607
  </t>
6563
6608
  <t t-name="o-spreadsheet-Icon.REFRESH">
6564
6609
  <div class="o-icon">
6565
- <i class="fa fa-refresh"/>
6610
+ <i class="oi" data-icon="refresh"/>
6566
6611
  </div>
6567
6612
  </t>
6568
6613
  <t t-name="o-spreadsheet-Icon.EXCHANGE">
6569
6614
  <div class="o-icon">
6570
- <i class="fa fa-exchange"/>
6615
+ <i class="oi" data-icon="swap_horiz"/>
6571
6616
  </div>
6572
6617
  </t>
6573
6618
  <t t-name="o-spreadsheet-Icon.ARROW_DOWN">
@@ -6670,17 +6715,17 @@
6670
6715
  </t>
6671
6716
  <t t-name="o-spreadsheet-Icon.SORT_ASCENDING">
6672
6717
  <div class="o-icon">
6673
- <i class="fa fa-sort-alpha-asc"/>
6718
+ <i class="oi" data-icon="sort_by_alpha"/>
6674
6719
  </div>
6675
6720
  </t>
6676
6721
  <t t-name="o-spreadsheet-Icon.SORT_DESCENDING">
6677
6722
  <div class="o-icon">
6678
- <i class="fa fa-sort-alpha-desc"/>
6723
+ <i class="oi" data-icon="sort_by_alpha"/>
6679
6724
  </div>
6680
6725
  </t>
6681
6726
  <t t-name="o-spreadsheet-Icon.DATA_CLEANUP">
6682
6727
  <div class="o-icon">
6683
- <i class="fa fa-magic"/>
6728
+ <i class="oi" data-icon="wand_stars"/>
6684
6729
  </div>
6685
6730
  </t>
6686
6731
  <t t-name="o-spreadsheet-Icon.FILTER_ICON">
@@ -6693,17 +6738,17 @@
6693
6738
  </t>
6694
6739
  <t t-name="o-spreadsheet-Icon.FILTER_ICON_ACTIVE">
6695
6740
  <div class="o-icon filter-icon-active">
6696
- <i class="fa fa-filter"/>
6741
+ <i class="oi oi-filled" data-icon="filter_alt_f"/>
6697
6742
  </div>
6698
6743
  </t>
6699
6744
  <t t-name="o-spreadsheet-Icon.SEARCH">
6700
6745
  <div class="o-icon">
6701
- <i class="fa fa-search"/>
6746
+ <i class="oi" data-icon="search"/>
6702
6747
  </div>
6703
6748
  </t>
6704
6749
  <t t-name="o-spreadsheet-Icon.ZOOM">
6705
6750
  <div class="o-icon">
6706
- <i class="fa fa-search-plus"/>
6751
+ <i class="oi" data-icon="zoom_in"/>
6707
6752
  </div>
6708
6753
  </t>
6709
6754
  <t t-name="o-spreadsheet-Icon.CHECK">
@@ -6737,8 +6782,8 @@
6737
6782
  </svg>
6738
6783
  </t>
6739
6784
  <t t-name="o-spreadsheet-Icon.TRIANGLE_EXCLAMATION">
6740
- <div class="o-icon fa-small">
6741
- <i class="fa fa-exclamation-triangle"/>
6785
+ <div class="o-icon">
6786
+ <i class="oi" data-icon="warning"/>
6742
6787
  </div>
6743
6788
  </t>
6744
6789
  <t t-name="o-spreadsheet-Icon.SPLIT_TEXT">
@@ -6751,7 +6796,7 @@
6751
6796
  </t>
6752
6797
  <t t-name="o-spreadsheet-Icon.ERROR">
6753
6798
  <div class="o-icon">
6754
- <i class="fa fa-exclamation-circle"/>
6799
+ <i class="oi" data-icon="error"/>
6755
6800
  </div>
6756
6801
  </t>
6757
6802
  <t t-name="o-spreadsheet-Icon.DISPLAY_HEADER">
@@ -6889,7 +6934,7 @@
6889
6934
  </t>
6890
6935
  <t t-name="o-spreadsheet-Icon.INFO">
6891
6936
  <div class="o-icon">
6892
- <i class="fa fa-info"/>
6937
+ <i class="oi" data-icon="info"/>
6893
6938
  </div>
6894
6939
  </t>
6895
6940
  <t t-name="o-spreadsheet-Icon.PIVOT">
@@ -6979,12 +7024,12 @@
6979
7024
  </t>
6980
7025
  <t t-name="o-spreadsheet-Icon.HIDE_SHEET">
6981
7026
  <div class="o-icon">
6982
- <i class="fa fa-eye-slash"/>
7027
+ <i class="oi" data-icon="visibility_off"/>
6983
7028
  </div>
6984
7029
  </t>
6985
7030
  <t t-name="o-spreadsheet-Icon.DOWNLOAD">
6986
7031
  <div class="o-icon">
6987
- <i class="fa fa-download"/>
7032
+ <i class="oi" data-icon="download"/>
6988
7033
  </div>
6989
7034
  </t>
6990
7035
  <t t-name="o-spreadsheet-Icon.CAROUSEL">
@@ -7029,7 +7074,7 @@
7029
7074
  </t>
7030
7075
  <t t-name="o-spreadsheet-Icon.DARK_MODE">
7031
7076
  <div class="o-icon">
7032
- <i class="fa fa-moon-o"/>
7077
+ <i class="oi" data-icon="dark_mode"/>
7033
7078
  </div>
7034
7079
  </t>
7035
7080
  <t t-name="o-spreadsheet-Icon.ROTATION-0">
@@ -7075,26 +7120,26 @@
7075
7120
  </t>
7076
7121
  <t t-name="o-spreadsheet-Icon.THUMB_TACK">
7077
7122
  <div class="o-icon">
7078
- <i class="fa fa-thumb-tack"/>
7123
+ <i class="oi" data-icon="push_pin"/>
7079
7124
  </div>
7080
7125
  </t>
7081
7126
  <t t-name="o-spreadsheet-Icon.LOCK">
7082
7127
  <div class="o-icon">
7083
- <i class="fa fa-lock"/>
7128
+ <i class="oi" data-icon="lock_f"/>
7084
7129
  </div>
7085
7130
  </t>
7086
7131
  <t t-name="o-spreadsheet-Icon.UNLOCK">
7087
7132
  <div class="o-icon">
7088
- <i class="fa fa-unlock"/>
7133
+ <i class="oi" data-icon="lock_open_f"/>
7089
7134
  </div>
7090
7135
  </t>
7091
7136
  <t t-name="o-spreadsheet-Icon.PRINT">
7092
7137
  <div class="o-icon">
7093
- <i class="fa fa-print"/>
7138
+ <i class="oi" data-icon="print"/>
7094
7139
  </div>
7095
7140
  </t>
7096
7141
  <t t-name="o-spreadsheet-Icon.COLUMN_STATS">
7097
- <svg width="18px" height="18px" viewBox="0 0 512 512">
7142
+ <svg class="o-icon" viewBox="0 0 512 512">
7098
7143
  <path
7099
7144
  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"
7100
7145
  fill="currentColor"
@@ -7151,7 +7196,26 @@
7151
7196
  </t>
7152
7197
  <t t-name="o-spreadsheet-Icon.CALCULATOR">
7153
7198
  <div class="o-icon">
7154
- <i class="fa fa-calculator"/>
7199
+ <i class="oi" data-icon="calculate"/>
7200
+ </div>
7201
+ </t>
7202
+ <t t-name="o-spreadsheet-Icon.INSERT_CHART_SUGGESTION">
7203
+ <svg
7204
+ class="o-icon"
7205
+ fill="currentColor"
7206
+ viewBox="0 -960 960 960"
7207
+ xmlns="http://www.w3.org/2000/svg">
7208
+ <!-- Material icon add_chart.
7209
+ TODO remove when we use Material icons directly -->
7210
+ <path
7211
+ xmlns="http://www.w3.org/2000/svg"
7212
+ 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"
7213
+ />
7214
+ </svg>
7215
+ </t>
7216
+ <t t-name="o-spreadsheet-Icon.MORE_MENU">
7217
+ <div class="o-icon">
7218
+ <i class="oi" data-icon="more_vert"/>
7155
7219
  </div>
7156
7220
  </t>
7157
7221
 
@@ -7494,7 +7558,6 @@
7494
7558
  maxHeight="this.cellPopover.Component.size and this.cellPopover.Component.size.maxHeight"
7495
7559
  maxWidth="this.cellPopover.Component.size and this.cellPopover.Component.size.maxWidth"
7496
7560
  anchorRect="this.cellPopover.anchorRect"
7497
- containerRect="this.env.getPopoverContainerRect()"
7498
7561
  onMouseWheel="this.props.onMouseWheel"
7499
7562
  class="'o-popover-grid-index'">
7500
7563
  <t
@@ -7515,10 +7578,7 @@
7515
7578
  t-on-click="this.onClick"
7516
7579
  t-on-dblclick.self="this.onDoubleClick"
7517
7580
  t-on-contextmenu.stop.prevent="this.onContextMenu">
7518
- <GridAddRowsFooter
7519
- t-if="!this.env.model.getters.isReadonly() and this.props.hasFooter"
7520
- t-key="this.viewStore.displayedSheetId"
7521
- />
7581
+ <GridAddRowsFooter t-if="this.isFooterVisible" t-key="this.viewStore.displayedSheetId"/>
7522
7582
  <t t-call-slot="default"/>
7523
7583
  </div>
7524
7584
  </t>
@@ -7579,7 +7639,9 @@
7579
7639
  gridDims="this.viewStore.viewports.getSheetViewDimensionWithHeaders()"
7580
7640
  onInputContextMenu.bind="this.onInputContextMenu"
7581
7641
  />
7582
- <canvas t-ref="this.canvasRef" class="os-theme-dependant pe-none"/>
7642
+ <div class="os-canvas-background">
7643
+ <canvas t-ref="this.canvasRef" class="os-theme-dependant pe-none"/>
7644
+ </div>
7583
7645
  <t t-set="focused" t-value="this.focusedClients"/>
7584
7646
  <t t-foreach="this.clientsToDisplay" t-as="client" t-key="this.getClientPositionKey(client)">
7585
7647
  <ClientTag
@@ -7613,7 +7675,7 @@
7613
7675
  onClose="() => this.closeMenu()"
7614
7676
  />
7615
7677
  <t
7616
- t-if="!this.env.model.getters.isReadonly()"
7678
+ t-if="this.displayTableResizer"
7617
7679
  t-foreach="this.staticTables"
7618
7680
  t-as="table"
7619
7681
  t-key="table.id">
@@ -7641,13 +7703,14 @@
7641
7703
  </button>
7642
7704
  <div class="flex-fill">
7643
7705
  <div
7644
- class="o-fullscreen-figure os-theme-dependant o-figure position-relative border rounded shadow"
7706
+ class="o-fullscreen-figure o-figure-rounded overflow-hidden os-theme-dependant o-figure position-relative border rounded shadow"
7645
7707
  tabindex="1"
7646
7708
  t-ref="this.fullScreenFigureRef"
7647
7709
  t-on-click.stop=""
7648
7710
  t-on-keydown="(ev) => this.onKeyDown(ev)">
7649
7711
  <t>
7650
7712
  <t
7713
+ t-if="this.figureUI.width and this.figureUI.height"
7651
7714
  t-component="this.figureComponent"
7652
7715
  figureUI="this.figureUI"
7653
7716
  isFullScreen="true"
@@ -7851,13 +7914,14 @@
7851
7914
 
7852
7915
  <t t-name="o-spreadsheet-ImageFigure">
7853
7916
  <img t-att-src="this.getImagePath" class="w-100 h-100"/>
7854
- <div class="o-figure-menu position-absolute m-2" t-if="this.shouldShowMenuButton">
7917
+ <div
7918
+ class="o-figure-menu position-absolute m-2 align-items-center"
7919
+ t-if="this.shouldShowMenuButton">
7855
7920
  <div
7856
- class="o-figure-menu-item d-flex-align-items-center"
7857
- t-on-click="this.showMenu"
7921
+ class="o-figure-menu-item d-flex align-items-center justify-content-center rounded p-1"
7858
7922
  t-ref="this.menuButtonRef"
7859
- t-on-contextmenu.prevent.stop="this.showMenu">
7860
- <t t-call="o-spreadsheet-Icon.LIST"/>
7923
+ t-on-click="this.showMenu">
7924
+ <t t-call="o-spreadsheet-Icon.MORE_MENU"/>
7861
7925
  </div>
7862
7926
  </div>
7863
7927
  </t>
@@ -7884,7 +7948,7 @@
7884
7948
  style="this.getFigureStyle(figureUI)"
7885
7949
  class="this.getFigureClass(figureUI)"
7886
7950
  onMouseDown="(ev) => this.startDraggingFigure(figureUI, ev)"
7887
- onClickAnchor="(dirX, dirY, ev) => this.startResize(figureUI, dirX, dirY, ev)"
7951
+ onClickAnchor.bind="this.resizeAllSelectedFigures"
7888
7952
  />
7889
7953
  </t>
7890
7954
  </div>
@@ -7923,11 +7987,13 @@
7923
7987
 
7924
7988
  <t t-name="o-spreadsheet-CarouselFigure">
7925
7989
  <div
7926
- class="o-carousel w-100 h-100 d-flex flex-column px-4 py-2"
7990
+ class="o-carousel w-100 h-100 position-relative"
7927
7991
  t-att-style="this.carouselStyle"
7928
7992
  t-on-dblclick="this.onCarouselDoubleClick">
7929
7993
  <t t-set="selectedItem" t-value="this.selectedCarouselItem"/>
7930
- <div class="o-carousel-header d-flex align-items-baseline flex-shrink-0 pt-1 pe-auto">
7994
+ <div
7995
+ class="o-carousel-header d-flex align-items-baseline position-absolute"
7996
+ t-att-style="this.headerStyle">
7931
7997
  <div
7932
7998
  class="o-carousel-title text-truncate flex-shrink-0 pe-2"
7933
7999
  t-out="this.title"
@@ -7943,7 +8009,7 @@
7943
8009
  t-key="item_index"
7944
8010
  t-if="this.carousel.items.length > 1">
7945
8011
  <div
7946
- class="o-carousel-tab text-truncate px-2 mt-1 flex-shrink-0"
8012
+ class="o-carousel-tab text-truncate px-2 flex-shrink-0"
7947
8013
  t-att-class="{ 'selected': this.isItemSelected(item) }"
7948
8014
  t-att-data-type="item.type"
7949
8015
  t-out="this.getItemTitle(item)"
@@ -7952,11 +8018,13 @@
7952
8018
  </t>
7953
8019
  </div>
7954
8020
  <div
7955
- class="o-carousel-tabs-dropdown o-carousel-button flex-shrink-0 rounded p-1"
8021
+ class="o-carousel-button o-carousel-tabs-dropdown flex-shrink-0 rounded"
7956
8022
  t-att-class="{'active': this.menuState.isOpen}"
7957
8023
  t-ref="this.carouselTabsDropdownRef"
7958
8024
  t-on-click="this.toggleMenu">
7959
- <div class="fa fa-angle-down"/>
8025
+ <div class="o-icon">
8026
+ <i class="oi" data-icon="keyboard_arrow_down"/>
8027
+ </div>
7960
8028
  <MenuPopover
7961
8029
  t-if="this.menuState.isOpen"
7962
8030
  menuId="this.menuId"
@@ -7969,28 +8037,32 @@
7969
8037
  <div
7970
8038
  t-if="this.env.model.getters.isDashboard()"
7971
8039
  t-att-title="this.fullScreenButtonTitle"
7972
- class="o-carousel-full-screen-button fa o-carousel-button rounded p-1 ms-1"
7973
- t-att-class="{
7974
- 'fa-compress': this.props.isFullScreen,
7975
- 'fa-expand': !this.props.isFullScreen,
7976
- }"
8040
+ class="o-carousel-full-screen-button oi o-carousel-button rounded p-1 ms-1"
8041
+ t-att-data-icon="this.props.isFullScreen ? 'close_fullscreen' : 'expand_content'"
7977
8042
  t-on-click="this.toggleFullScreen"
7978
8043
  />
7979
8044
  <div
7980
8045
  t-if="!this.env.model.getters.isDashboard()"
7981
- class="o-carousel-menu-button o-carousel-button fa fa-ellipsis-v rounded ms-1"
7982
- t-on-click="this.openContextMenu"
7983
- />
8046
+ class="o-carousel-menu-button o-carousel-button rounded ms-1"
8047
+ t-on-click="this.openContextMenu">
8048
+ <t t-call="o-spreadsheet-Icon.MORE_MENU"/>
8049
+ </div>
7984
8050
  </div>
7985
- <div t-if="this.title" class="w-100 mt-2 border-bottom"/>
8051
+ <div
8052
+ t-if="this.separatorStyle"
8053
+ class="o-carousel-separator position-absolute"
8054
+ t-att-style="this.separatorStyle"
8055
+ />
7986
8056
  <div
7987
8057
  t-if="!selectedItem"
7988
- class="o-carousel-empty o-carousel-content w-100 flex-fill d-flex align-items-center justify-content-center">
8058
+ class="o-carousel-empty o-carousel-content position-absolute d-flex align-items-center justify-content-center"
8059
+ t-att-style="this.contentStyle">
7989
8060
  <t t-call="o-spreadsheet-Icon.CAROUSEL"/>
7990
8061
  </div>
7991
8062
  <div
7992
8063
  t-elif="selectedItem.type === 'chart'"
7993
- class="o-carousel-content w-100 flex-fill position-relative">
8064
+ class="o-carousel-content position-absolute"
8065
+ t-att-style="this.contentStyle">
7994
8066
  <div
7995
8067
  class="o-chart-container w-100 h-100"
7996
8068
  t-on-dblclick.stop="this.onCarouselChartDoubleClick">
@@ -8010,13 +8082,14 @@
8010
8082
  </div>
8011
8083
  <div
8012
8084
  t-elif="selectedItem.type === 'carouselDataView' and selectedItem.range"
8013
- class="o-carousel-content mb-2 mt-3 h-100 w-100 overflow-hidden">
8085
+ class="o-carousel-content position-absolute overflow-hidden"
8086
+ t-att-style="this.contentStyle">
8014
8087
  <StandaloneViewport
8015
8088
  range="this.removeEmptyHeadersFromRange(selectedItem.range)"
8016
8089
  columnWeights="selectedItem.columnWeights"
8017
8090
  canResizeColumns="this.canResizeDataViewColumns"
8018
8091
  onResizeColumns.bind="this.onResizeColumns"
8019
- zoomLevel="this.viewStore.zoomLevel"
8092
+ size="this.carouselLayout.contentRect"
8020
8093
  />
8021
8094
  </div>
8022
8095
  </div>
@@ -8024,17 +8097,17 @@
8024
8097
 
8025
8098
  <t t-name="o-spreadsheet-FigureComponent">
8026
8099
  <div
8027
- class="o-figure-wrapper os-theme-dependant"
8028
- t-att-class="{'o-figure-selected': this.isSelected}"
8100
+ class="o-figure-wrapper"
8101
+ t-att-class="{'o-figure-selected': this.isSelected, 'os-theme-dependant': this.isThemeDependant}"
8029
8102
  t-att-style="this.wrapperStyle">
8030
8103
  <div
8031
- class="o-figure w-100 h-100"
8032
- t-att-class="this.props.class"
8104
+ class="o-figure w-100 h-100 overflow-hidden"
8105
+ t-att-class="this.figureClass"
8033
8106
  t-on-pointerdown.stop="(ev) => this.onMouseDown(ev)"
8034
8107
  t-on-click="this.onClick"
8035
8108
  t-on-contextmenu.prevent.stop="(ev) => !this.env.model.getters.isReadonly() and this.onContextMenu(ev)"
8036
8109
  t-ref="this.figureRef"
8037
- t-att-style="this.props.style"
8110
+ t-att-style="this.figureStyle"
8038
8111
  t-att-data-id="this.props.figureUI.id"
8039
8112
  tabindex="0"
8040
8113
  t-on-keydown.stop="(ev) => this.onKeyDown(ev)"
@@ -8053,31 +8126,11 @@
8053
8126
  onClose="() => this.menuState.isOpen=false"
8054
8127
  popoverPositioning="'bottom-left'"
8055
8128
  />
8056
- <div
8057
- t-if="!this.env.model.getters.isDashboard()"
8058
- class="position-absolute top-0 start-0 pe-none w-100 h-100">
8059
- <div
8060
- class="o-figure-border pe-auto w-100 h-0 position-absolute pb-2"
8061
- t-att-class="{'o-selected': this.isSelected}"
8062
- t-att-style="this.getBorderStyle('top')"
8063
- />
8064
- <div
8065
- class="o-figure-border pe-auto h-100 position-absolute start-0 ps-2"
8066
- t-att-class="{'o-selected': this.isSelected}"
8067
- t-att-style="this.getBorderStyle('left')"
8068
- />
8069
- <div
8070
- class="o-figure-border pe-auto w-100 position-absolute bottom-0 pt-2"
8071
- t-att-class="{'o-selected': this.isSelected}"
8072
- t-att-style="this.getBorderStyle('bottom')"
8073
- />
8074
- <div
8075
- class="o-figure-border pe-auto h-100 position-absolute end-0 pe-2"
8076
- t-att-class="{'o-selected': this.isSelected}"
8077
- t-att-style="this.getBorderStyle('right')"
8078
- />
8079
- </div>
8080
8129
  </div>
8130
+ <div
8131
+ t-if="this.isSelected"
8132
+ class="o-figure-selection-border position-absolute pe-none w-100 h-100"
8133
+ />
8081
8134
  <t t-if="this.isFigureResizable">
8082
8135
  <div
8083
8136
  class="o-fig-anchor o-top pe-auto"
@@ -8138,7 +8191,7 @@
8138
8191
  <t t-name="o-spreadsheet-ChartMenu">
8139
8192
  <div class="o-chart-menu position-absolute top-0 end-0" t-on-click.stop="">
8140
8193
  <div class="d-flex align-items-center gap-1 p-1 rounded" t-att-style="backgroundColor">
8141
- <t t-if="this.regionOptions.length > 1">
8194
+ <t t-if="this.env.model.getters.isDashboard() and this.regionOptions.length > 1">
8142
8195
  <Select
8143
8196
  class="'o-chart-menu-item w-auto py-0 px-1 text-muted text-nowrap rounded border-0'"
8144
8197
  popoverClass="'w-auto'"
@@ -8149,7 +8202,7 @@
8149
8202
  </t>
8150
8203
  <t t-foreach="this.getMenuItems()" t-as="item" t-key="item.id">
8151
8204
  <div
8152
- class="o-chart-menu-item border-0 lh-1 p-1 d-flex align-items-center justify-content-center rounded"
8205
+ class="o-chart-menu-item lh-1 p-1 d-flex align-items-center justify-content-center rounded"
8153
8206
  t-att-title="item.label"
8154
8207
  t-on-click="item.onClick"
8155
8208
  t-att-data-id="item.id">
@@ -8157,10 +8210,11 @@
8157
8210
  </div>
8158
8211
  </t>
8159
8212
  <t t-if="this.isMenuAvailable()">
8160
- <button
8161
- class="o-chart-menu-item btn text-muted lh-1 p-1 fa fa-ellipsis-v"
8162
- t-on-click="this.openContextMenu"
8163
- />
8213
+ <div
8214
+ class="o-chart-menu-item lh-1 p-1 d-flex align-items-center justify-content-center rounded"
8215
+ t-on-click="this.openContextMenu">
8216
+ <t t-call="o-spreadsheet-Icon.MORE_MENU"/>
8217
+ </div>
8164
8218
  </t>
8165
8219
  </div>
8166
8220
  <InfoPopover
@@ -8258,10 +8312,12 @@
8258
8312
  </t>
8259
8313
 
8260
8314
  <t t-name="o-spreadsheet-SpreadsheetDashboard">
8261
- <div
8262
- class="o-dashboard-background position-absolute w-100 h-100 z-0 os-theme-dependant"
8263
- t-att-style="this.backgroundStyle"
8264
- />
8315
+ <div class="o-dashboard-background os-canvas-background position-absolute w-100 h-100 z-0">
8316
+ <div
8317
+ class="o-dashboard-sheet-background w-100 h-100 os-theme-dependant"
8318
+ t-att-style="this.backgroundStyle"
8319
+ />
8320
+ </div>
8265
8321
  <div
8266
8322
  class="o-grid o-dashboard-grid o-two-columns o-zoomable z-1"
8267
8323
  tabindex="-1"
@@ -8452,9 +8508,9 @@
8452
8508
  t-on-click.stop="this.openAssistant"
8453
8509
  t-on-pointerdown.prevent.stop=""
8454
8510
  t-on-pointerup.stop=""
8455
- class="fa-stack position-absolute translate-middle force-open-assistant fs-4">
8456
- <i class="fa fa-circle fa-stack-1x fa-inverse"/>
8457
- <i class="fa fa-question-circle fa-stack-1x"/>
8511
+ class="oi-stack position-absolute translate-middle force-open-assistant fs-4">
8512
+ <i class="oi oi-filled oi-stack-1x o-composer-assistant-icon-bg" data-icon="circle_f"/>
8513
+ <i class="oi oi-filled oi-stack-1x" data-icon="help_f"/>
8458
8514
  </span>
8459
8515
  <div
8460
8516
  class="o-composer w-100 text-start"
@@ -8495,9 +8551,9 @@
8495
8551
  role="button"
8496
8552
  t-on-click="this.closeAssistant"
8497
8553
  t-on-pointerdown.prevent.stop=""
8498
- class="fa-stack position-absolute top-0 start-100 translate-middle fs-4">
8499
- <i class="fa fa-circle fa-stack-1x fa-inverse"/>
8500
- <i class="fa fa-times-circle fa-stack-1x"/>
8554
+ class="oi-stack position-absolute top-0 start-100 translate-middle fs-4">
8555
+ <i class="oi oi-filled oi-stack-1x o-composer-assistant-icon-bg" data-icon="circle_f"/>
8556
+ <i class="oi oi-filled oi-stack-1x" data-icon="cancel_f"/>
8501
8557
  </span>
8502
8558
  <div class="o-composer-assistant overflow-auto" t-att-style="this.assistantStyle">
8503
8559
  <FunctionDescriptionProvider
@@ -8644,7 +8700,7 @@
8644
8700
  class="eyedropper d-flex align-items-center justify-content-center rounded-circle"
8645
8701
  t-if="this.canUseEyeDropper"
8646
8702
  t-on-click.stop="this.activateEyedropper">
8647
- <i class="fa fa-eyedropper"/>
8703
+ <i class="oi" data-icon="colorize"/>
8648
8704
  </div>
8649
8705
  </div>
8650
8706
  <div t-if="this.state.showGradient" class="o-custom-selector">
@@ -8821,16 +8877,24 @@
8821
8877
 
8822
8878
  <t t-name="o-spreadsheet-BottomBarStatistic">
8823
8879
  <t t-set="selectedStatistic" t-value="this.getSelectedStatistic()"/>
8824
- <Ripple class="'ms-auto bottom-statistics'" t-if="selectedStatistic !== undefined">
8825
- <div
8826
- class="o-selection-statistic text-truncate user-select-none me-4 bg-white rounded shadow d-flex align-items-center"
8827
- t-on-click="this.listSelectionStatistics">
8828
- <t t-out="selectedStatistic"/>
8829
- <span class="ms-2">
8830
- <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
8831
- </span>
8832
- </div>
8833
- </Ripple>
8880
+ <div class="ms-auto d-flex o-bottom-bar-statistic">
8881
+ <Ripple t-if="selectedStatistic !== undefined">
8882
+ <div
8883
+ class="o-selection-statistic text-truncate user-select-none me-4 bg-white rounded shadow d-flex align-items-center"
8884
+ t-on-click="this.listSelectionStatistics">
8885
+ <t t-out="selectedStatistic"/>
8886
+ <span class="ms-2">
8887
+ <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
8888
+ </span>
8889
+ </div>
8890
+ </Ripple>
8891
+ <span
8892
+ class="o-data-analysis-button me-4 rounded"
8893
+ t-att-class="{ 'active': this.isDataAnalysisOpen }"
8894
+ t-on-click="this.toggleDataAnalysisPanel">
8895
+ <t t-call="o-spreadsheet-Icon.COLUMN_STATS"/>
8896
+ </span>
8897
+ </div>
8834
8898
  </t>
8835
8899
 
8836
8900
  <t t-name="o-spreadsheet-BottomBarSheet">
@@ -8848,7 +8912,7 @@
8848
8912
  t-att-title="this.sheetName"
8849
8913
  t-att-data-id="this.props.sheetId"
8850
8914
  t-att-class="{active: this.isSheetActive}">
8851
- <span t-if="this.isSheetLocked" class="me-1">
8915
+ <span t-if="this.isSheetLocked" class="me-1 lock-icon">
8852
8916
  <t t-call="o-spreadsheet-Icon.LOCK"/>
8853
8917
  </span>
8854
8918
  <span