@odoo/o-spreadsheet 19.5.0-alpha.2 → 19.5.0-alpha.20

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 (271) hide show
  1. package/dist/material_symbols_outlined.css +9 -0
  2. package/dist/o_spreadsheet.cjs +53040 -49146
  3. package/dist/o_spreadsheet.css +330 -157
  4. package/dist/o_spreadsheet.esm.js +52813 -48924
  5. package/dist/o_spreadsheet.iife.js +49777 -45883
  6. package/dist/o_spreadsheet.min.iife.js +413 -359
  7. package/dist/o_spreadsheet.xml +505 -332
  8. package/dist/types/actions/action.d.ts +1 -7
  9. package/dist/types/actions/data_actions.d.ts +2 -0
  10. package/dist/types/actions/menu_items_actions.d.ts +5 -2
  11. package/dist/types/clipboard_handlers/default_clipboard.d.ts +1 -1
  12. package/dist/types/collaborative/command_squisher.d.ts +1 -1
  13. package/dist/types/collaborative/ot/ot_helpers.d.ts +3 -1
  14. package/dist/types/collaborative/session.d.ts +3 -1
  15. package/dist/types/components/autofill/autofill.d.ts +3 -0
  16. package/dist/types/{plugins/ui_feature/autofill.d.ts → components/autofill/autofill_store.d.ts} +7 -12
  17. package/dist/types/components/autofill/table_autofill_store.d.ts +6 -0
  18. package/dist/types/components/border_editor/border_editor_widget.d.ts +1 -0
  19. package/dist/types/components/bottom_bar/bottom_bar_statistic/bottom_bar_statistic.d.ts +3 -0
  20. package/dist/types/components/clickable_cells_overlay/clickable_cells_overlay.d.ts +20 -0
  21. package/dist/types/components/collaborative_client_tag/collaborative_client_tag.d.ts +2 -0
  22. package/dist/types/components/composer/composer/abstract_composer_store.d.ts +3 -2
  23. package/dist/types/components/composer/composer/composer.d.ts +2 -1
  24. package/dist/types/components/composer/grid_composer/grid_composer.d.ts +1 -0
  25. package/dist/types/components/dashboard/clickable_cell_sort_icon/clickable_cell_sort_icon.d.ts +1 -1
  26. package/dist/types/components/dashboard/clickable_cell_store.d.ts +1 -0
  27. package/dist/types/components/dashboard/dashboard.d.ts +7 -12
  28. package/dist/types/components/error_tooltip/error_tooltip.d.ts +2 -0
  29. package/dist/types/components/figures/chart/chartJs/chartjs_geo_projection_plugin.d.ts +12 -0
  30. package/dist/types/components/figures/chart/chartJs/zoomable_chart/zoomable_chartjs.d.ts +1 -0
  31. package/dist/types/components/figures/chart/gauge/gauge_chart_component.d.ts +1 -0
  32. package/dist/types/components/figures/chart/scorecard/chart_scorecard.d.ts +1 -0
  33. package/dist/types/components/figures/figure/figure.d.ts +10 -9
  34. package/dist/types/components/figures/figure_carousel/figure_carousel.d.ts +16 -1
  35. package/dist/types/components/figures/figure_chart/figure_chart.d.ts +1 -2
  36. package/dist/types/components/figures/figure_container/figure_container.d.ts +9 -4
  37. package/dist/types/components/figures/figure_image/figure_image.d.ts +1 -2
  38. package/dist/types/components/filters/filter_menu/filter_menu.d.ts +1 -0
  39. package/dist/types/components/full_screen_figure/full_screen_figure.d.ts +12 -1
  40. package/dist/types/components/grid/grid.d.ts +10 -0
  41. package/dist/types/components/grid_add_rows_footer/grid_add_rows_footer.d.ts +1 -0
  42. package/dist/types/components/grid_overlay/grid_overlay.d.ts +8 -4
  43. package/dist/types/components/grid_popover/grid_popover.d.ts +1 -0
  44. package/dist/types/components/header_group/header_group_container.d.ts +2 -0
  45. package/dist/types/components/headers_overlay/headers_overlay.d.ts +5 -0
  46. package/dist/types/components/headers_overlay/unhide_headers.d.ts +4 -0
  47. package/dist/types/components/helpers/chart_drag_and_drop.d.ts +15 -0
  48. package/dist/types/components/helpers/dom_helpers.d.ts +5 -2
  49. package/dist/types/components/helpers/draw_grid_hook.d.ts +1 -2
  50. package/dist/types/components/helpers/figure_drag_helper.d.ts +3 -3
  51. package/dist/types/components/helpers/figure_snap_helper.d.ts +9 -4
  52. package/dist/types/components/helpers/wheel_hook.d.ts +1 -1
  53. package/dist/types/components/helpers/zoom.d.ts +0 -14
  54. package/dist/types/components/highlight/border/border.d.ts +2 -0
  55. package/dist/types/components/highlight/corner/corner.d.ts +1 -0
  56. package/dist/types/components/highlight/highlight/highlight.d.ts +3 -0
  57. package/dist/types/components/link/link_display/link_display.d.ts +1 -0
  58. package/dist/types/components/link/link_editor/link_editor.d.ts +3 -1
  59. package/dist/types/components/paint_format_button/paint_format_store.d.ts +1 -1
  60. package/dist/types/components/popover/cell_popover_store.d.ts +2 -1
  61. package/dist/types/components/popover/popover.d.ts +0 -1
  62. package/dist/types/components/popover/popover_container_owl_plugin.d.ts +5 -0
  63. package/dist/types/components/props_validation.d.ts +7 -7
  64. package/dist/types/components/scrollbar/scrollbar_horizontal.d.ts +3 -0
  65. package/dist/types/components/scrollbar/scrollbar_vertical.d.ts +5 -1
  66. package/dist/types/components/selection_input/selection_input_store.d.ts +1 -1
  67. package/dist/types/components/side_panel/carousel_panel/carousel_panel.d.ts +20 -2
  68. package/dist/types/components/side_panel/chart/building_blocks/chart_title/chart_title.d.ts +1 -0
  69. package/dist/types/components/side_panel/chart/building_blocks/color_scale/color_scale_picker.d.ts +1 -1
  70. package/dist/types/components/side_panel/chart/calendar_chart/calendar_chart_config_panel.d.ts +0 -2
  71. package/dist/types/components/side_panel/chart/chart_type_picker/chart_type_picker.d.ts +5 -18
  72. package/dist/types/components/side_panel/chart/chart_type_picker_popover/chart_type_picker_popover.d.ts +63 -0
  73. package/dist/types/components/side_panel/chart/common.d.ts +1 -1
  74. package/dist/types/components/side_panel/chart/scorecard_chart_panel/scorecard_chart_config_panel.d.ts +6 -10
  75. package/dist/types/components/side_panel/components/radio_selection/radio_selection.d.ts +1 -1
  76. package/dist/types/components/side_panel/conditional_formatting/cf_editor/cell_is_rule_editor.d.ts +1 -1
  77. package/dist/types/components/side_panel/conditional_formatting/cf_editor/color_scale_rule_editor.d.ts +1 -1
  78. package/dist/types/components/side_panel/conditional_formatting/cf_editor/color_scale_rule_editor_threshold.d.ts +1 -1
  79. package/dist/types/components/side_panel/conditional_formatting/cf_editor/data_bar_rule_editor.d.ts +1 -1
  80. package/dist/types/components/side_panel/conditional_formatting/cf_editor/icon_set_rule_editor.d.ts +1 -1
  81. package/dist/types/components/side_panel/data_analysis/chart_suggestion_preview.d.ts +19 -0
  82. package/dist/types/components/side_panel/data_analysis/data_analysis_panel.d.ts +17 -0
  83. package/dist/types/components/side_panel/data_analysis/data_analysis_store.d.ts +15 -0
  84. package/dist/types/components/side_panel/data_sources_cleanup/data_sources_cleanup.d.ts +28 -0
  85. package/dist/types/components/side_panel/data_sources_cleanup/data_sources_cleanup_store.d.ts +13 -0
  86. package/dist/types/components/side_panel/find_and_replace/find_and_replace.d.ts +1 -0
  87. package/dist/types/components/side_panel/find_and_replace/find_and_replace_store.d.ts +3 -1
  88. package/dist/types/components/side_panel/pivot/pivot_layout_configurator/pivot_layout_configurator.d.ts +1 -8
  89. package/dist/types/components/side_panel/pivot/pivot_side_panel/pivot_side_panel_store.d.ts +1 -0
  90. package/dist/types/components/side_panel/remove_duplicates/remove_duplicates.d.ts +3 -10
  91. package/dist/types/components/side_panel/side_panel/side_panel_store.d.ts +3 -2
  92. package/dist/types/components/side_panel/split_to_columns_panel/split_to_columns_panel.d.ts +4 -11
  93. package/dist/types/components/side_panel/split_to_columns_panel/split_to_columns_store.d.ts +33 -0
  94. package/dist/types/components/side_panel/table_panel/table_panel.d.ts +6 -0
  95. package/dist/types/components/side_panel/table_style_editor_panel/table_style_editor_panel.d.ts +2 -0
  96. package/dist/types/components/small_bottom_bar/small_bottom_bar.d.ts +1 -0
  97. package/dist/types/components/spreadsheet/spreadsheet.d.ts +12 -5
  98. package/dist/types/components/spreadsheet_print/print_iframe.d.ts +15 -0
  99. package/dist/types/components/spreadsheet_print/spreadsheet_print.d.ts +4 -0
  100. package/dist/types/components/standalone_grid_canvas/carousel_data_view_print.d.ts +32 -0
  101. package/dist/types/components/standalone_grid_canvas/standalone_grid_canvas.d.ts +397 -2
  102. package/dist/types/components/standalone_viewport/standalone_viewport.d.ts +59 -0
  103. package/dist/types/components/standalone_viewport/standalone_viewport_store.d.ts +29 -0
  104. package/dist/types/components/tables/hovered_table_store.d.ts +7 -11
  105. package/dist/types/components/tables/table_resizer/table_resizer.d.ts +2 -0
  106. package/dist/types/components/tables/table_styles_popover/table_styles_popover.d.ts +0 -1
  107. package/dist/types/components/top_bar/color_editor/color_editor.d.ts +1 -1
  108. package/dist/types/components/top_bar/zoom_editor/zoom_editor.d.ts +2 -1
  109. package/dist/types/constants.d.ts +17 -2
  110. package/dist/types/formulas/code_builder.d.ts +2 -1
  111. package/dist/types/formulas/compiler.d.ts +8 -1
  112. package/dist/types/functions/create_compute_function.d.ts +4 -3
  113. package/dist/types/functions/function_registry.d.ts +4 -5
  114. package/dist/types/functions/helper_lookup.d.ts +1 -1
  115. package/dist/types/functions/helper_matrices.d.ts +1 -0
  116. package/dist/types/functions/helper_statistical.d.ts +6 -0
  117. package/dist/types/functions/helpers.d.ts +4 -0
  118. package/dist/types/functions/module_array.d.ts +41 -23
  119. package/dist/types/functions/module_database.d.ts +18 -6
  120. package/dist/types/functions/module_date.d.ts +70 -22
  121. package/dist/types/functions/module_engineering.d.ts +3 -1
  122. package/dist/types/functions/module_filter.d.ts +2 -2
  123. package/dist/types/functions/module_financial.d.ts +105 -35
  124. package/dist/types/functions/module_info.d.ts +33 -11
  125. package/dist/types/functions/module_logical.d.ts +16 -8
  126. package/dist/types/functions/module_lookup.d.ts +23 -15
  127. package/dist/types/functions/module_math.d.ts +125 -43
  128. package/dist/types/functions/module_operators.d.ts +7 -3
  129. package/dist/types/functions/module_statistical.d.ts +78 -22
  130. package/dist/types/functions/module_text.d.ts +75 -26
  131. package/dist/types/functions/module_web.d.ts +3 -1
  132. package/dist/types/helpers/carousel_helpers.d.ts +15 -3
  133. package/dist/types/helpers/cells/cell_evaluation.d.ts +1 -1
  134. package/dist/types/helpers/color.d.ts +1 -1
  135. package/dist/types/helpers/color_themes.d.ts +2 -0
  136. package/dist/types/helpers/data_analysis.d.ts +17 -0
  137. package/dist/types/helpers/figures/chart.d.ts +9 -6
  138. package/dist/types/helpers/figures/charts/chart_common.d.ts +3 -5
  139. package/dist/types/helpers/figures/charts/chart_data_source_helpers.d.ts +10 -0
  140. package/dist/types/helpers/figures/charts/chart_data_sources.d.ts +3 -3
  141. package/dist/types/helpers/figures/charts/chart_suggestion_engine.d.ts +8 -0
  142. package/dist/types/helpers/figures/charts/chart_ui_common.d.ts +11 -4
  143. package/dist/types/helpers/figures/charts/charts_suggestions_constants.d.ts +37 -0
  144. package/dist/types/helpers/figures/charts/gauge_chart_rendering.d.ts +6 -2
  145. package/dist/types/helpers/figures/charts/runtime/chart_data_extractor.d.ts +13 -12
  146. package/dist/types/helpers/figures/charts/runtime/chartjs_title.d.ts +2 -2
  147. package/dist/types/helpers/figures/figure/figure.d.ts +3 -2
  148. package/dist/types/helpers/filter_helpers.d.ts +2 -2
  149. package/dist/types/helpers/internal_viewport.d.ts +19 -10
  150. package/dist/types/helpers/links.d.ts +1 -1
  151. package/dist/types/helpers/misc.d.ts +2 -0
  152. package/dist/types/helpers/owl3_helpers.d.ts +4 -0
  153. package/dist/types/helpers/pivot/pivot_composer_helpers.d.ts +1 -1
  154. package/dist/types/helpers/pivot/pivot_highlight.d.ts +2 -2
  155. package/dist/types/helpers/pivot/pivot_presentation.d.ts +2 -2
  156. package/dist/types/helpers/pivot/pivot_registry.d.ts +4 -5
  157. package/dist/types/helpers/pivot/spreadsheet_pivot/runtime_definition_spreadsheet_pivot.d.ts +2 -2
  158. package/dist/types/helpers/range.d.ts +1 -1
  159. package/dist/types/helpers/rectangle.d.ts +4 -0
  160. package/dist/types/helpers/text_helper.d.ts +1 -1
  161. package/dist/types/helpers/ui/split_to_columns_interactive.d.ts +1 -1
  162. package/dist/types/helpers/viewport_collection.d.ts +50 -21
  163. package/dist/types/helpers/zones.d.ts +1 -0
  164. package/dist/types/index.d.ts +39 -9
  165. package/dist/types/model.d.ts +18 -10
  166. package/dist/types/owl3_compatibility_layer.d.ts +1 -14
  167. package/dist/types/plugins/core/carousel.d.ts +8 -4
  168. package/dist/types/plugins/core/cell.d.ts +1 -0
  169. package/dist/types/plugins/core/chart.d.ts +2 -0
  170. package/dist/types/plugins/core/conditional_format.d.ts +2 -0
  171. package/dist/types/plugins/core/data_validation.d.ts +2 -0
  172. package/dist/types/plugins/core/formulas_provider.d.ts +8 -0
  173. package/dist/types/plugins/core/image.d.ts +2 -1
  174. package/dist/types/plugins/core/pivot.d.ts +1 -0
  175. package/dist/types/plugins/core/range.d.ts +4 -2
  176. package/dist/types/plugins/core/squisher.d.ts +7 -2
  177. package/dist/types/plugins/core/tables.d.ts +2 -1
  178. package/dist/types/plugins/core/unsquisher.d.ts +1 -1
  179. package/dist/types/plugins/core_plugin.d.ts +8 -4
  180. package/dist/types/plugins/{ui_feature → evaluation}/cell_computed_style.d.ts +4 -4
  181. package/dist/types/plugins/{ui_core_views/cell_evaluation/evaluation_plugin.d.ts → evaluation/cell_evaluation/cell_evaluation_plugin.d.ts} +14 -7
  182. package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/compilation_parameters.d.ts +2 -2
  183. package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/evaluator.d.ts +2 -2
  184. package/dist/types/plugins/{ui_core_views → evaluation}/custom_colors.d.ts +5 -5
  185. package/dist/types/plugins/{ui_core_views → evaluation}/dynamic_tables.d.ts +4 -4
  186. package/dist/types/plugins/{ui_feature → evaluation}/dynamic_translate.d.ts +2 -2
  187. package/dist/types/plugins/evaluation/evaluation_chart.d.ts +27 -0
  188. package/dist/types/plugins/{ui_core_views → evaluation}/evaluation_conditional_format.d.ts +4 -4
  189. package/dist/types/plugins/{ui_core_views → evaluation}/evaluation_data_validation.d.ts +4 -4
  190. package/dist/types/plugins/{ui_stateful → evaluation}/filter_evaluation.d.ts +7 -8
  191. package/dist/types/plugins/{ui_core_views → evaluation}/fingerprint.d.ts +2 -2
  192. package/dist/types/plugins/evaluation/formula_tracker.d.ts +8 -0
  193. package/dist/types/plugins/evaluation/geo_loader.d.ts +13 -0
  194. package/dist/types/plugins/{ui_core_views → evaluation}/header_sizes_ui.d.ts +5 -5
  195. package/dist/types/plugins/{ui_feature/header_visibility_ui.d.ts → evaluation/header_visibility_evaluation.d.ts} +2 -2
  196. package/dist/types/plugins/evaluation/pivot_presence_plugin.d.ts +12 -0
  197. package/dist/types/plugins/{ui_core_views → evaluation}/pivot_ui.d.ts +9 -6
  198. package/dist/types/plugins/evaluation/subtotal_evaluation.d.ts +5 -0
  199. package/dist/types/plugins/{ui_feature → evaluation}/table_computed_style.d.ts +7 -7
  200. package/dist/types/plugins/evaluation_plugin.d.ts +31 -0
  201. package/dist/types/plugins/plugin_registries.d.ts +11 -5
  202. package/dist/types/plugins/ui_feature/chart_ui.d.ts +6 -0
  203. package/dist/types/plugins/ui_feature/collaborative.d.ts +2 -1
  204. package/dist/types/plugins/ui_feature/color_theme.d.ts +0 -3
  205. package/dist/types/plugins/ui_feature/geo_features.d.ts +1 -6
  206. package/dist/types/plugins/ui_feature/ui_options.d.ts +1 -7
  207. package/dist/types/plugins/ui_feature/ui_sheet.d.ts +2 -1
  208. package/dist/types/plugins/ui_plugin.d.ts +1 -4
  209. package/dist/types/plugins/ui_stateful/carousel_ui.d.ts +2 -2
  210. package/dist/types/plugins/{ui_core_views → ui_stateful}/cell_icon_plugin.d.ts +2 -2
  211. package/dist/types/plugins/{ui_feature → ui_stateful}/figure.d.ts +4 -0
  212. package/dist/types/plugins/ui_stateful/header_positions.d.ts +2 -1
  213. package/dist/types/registries/chart_data_source_registry.d.ts +4 -5
  214. package/dist/types/registries/chart_registry.d.ts +7 -4
  215. package/dist/types/registries/criterion_registry.d.ts +4 -4
  216. package/dist/types/registries/data_source_registry.d.ts +15 -0
  217. package/dist/types/registries/evaluation_registry.d.ts +2 -2
  218. package/dist/types/registries/figures_registry.d.ts +6 -2
  219. package/dist/types/store_engine/dependency_container.d.ts +5 -0
  220. package/dist/types/store_engine/store_hooks.d.ts +6 -0
  221. package/dist/types/store_engine/store_registries.d.ts +4 -0
  222. package/dist/types/stores/array_formula_highlight.d.ts +1 -1
  223. package/dist/types/{plugins/ui_feature/automatic_sum.d.ts → stores/automatic_sum_store.d.ts} +5 -4
  224. package/dist/types/stores/cell_hover_overlay_store.d.ts +15 -0
  225. package/dist/types/stores/chart_drag_store.d.ts +10 -0
  226. package/dist/types/stores/checkbox_toggle.d.ts +9 -0
  227. package/dist/types/stores/client_focus_store.d.ts +1 -0
  228. package/dist/types/{plugins/ui_stateful/clipboard.d.ts → stores/clipboard_store.d.ts} +11 -11
  229. package/dist/types/stores/data_cleanup_store.d.ts +31 -0
  230. package/dist/types/stores/grid_renderer_store.d.ts +3 -2
  231. package/dist/types/stores/main_viewport_store.d.ts +14 -0
  232. package/dist/types/stores/spreadsheet_store.d.ts +1 -1
  233. package/dist/types/stores/table_resize_store.d.ts +6 -0
  234. package/dist/types/stores/trim_whitespace_store.d.ts +9 -0
  235. package/dist/types/stores/viewports_store.d.ts +85 -0
  236. package/dist/types/stores/zoom_store.d.ts +27 -0
  237. package/dist/types/types/chart/chart.d.ts +3 -1
  238. package/dist/types/types/chart/chart_suggestion.d.ts +137 -0
  239. package/dist/types/types/chart/radar_chart.d.ts +1 -1
  240. package/dist/types/types/chart/scorecard_chart.d.ts +3 -4
  241. package/dist/types/types/collaborative/transport_service.d.ts +1 -0
  242. package/dist/types/types/commands.d.ts +55 -68
  243. package/dist/types/types/figure.d.ts +26 -3
  244. package/dist/types/types/functions.d.ts +16 -6
  245. package/dist/types/types/getters.d.ts +126 -28
  246. package/dist/types/types/misc.d.ts +19 -1
  247. package/dist/types/types/model.d.ts +2 -4
  248. package/dist/types/types/range.d.ts +1 -0
  249. package/dist/types/types/rendering.d.ts +21 -1
  250. package/dist/types/types/store_engine.d.ts +10 -3
  251. package/package.json +6 -5
  252. package/dist/types/plugins/core_view_plugin.d.ts +0 -29
  253. package/dist/types/plugins/ui_core_views/evaluation_chart.d.ts +0 -26
  254. package/dist/types/plugins/ui_core_views/formula_tracker.d.ts +0 -8
  255. package/dist/types/plugins/ui_feature/checkbox_toggle.d.ts +0 -9
  256. package/dist/types/plugins/ui_feature/data_cleanup.d.ts +0 -16
  257. package/dist/types/plugins/ui_feature/pivot_presence_plugin.d.ts +0 -11
  258. package/dist/types/plugins/ui_feature/split_to_columns.d.ts +0 -21
  259. package/dist/types/plugins/ui_feature/subtotal_evaluation.d.ts +0 -5
  260. package/dist/types/plugins/ui_feature/table_autofill.d.ts +0 -6
  261. package/dist/types/plugins/ui_feature/table_resize_ui.d.ts +0 -6
  262. package/dist/types/plugins/ui_stateful/sheetview.d.ts +0 -123
  263. package/dist/types/types/core_getters.d.ts +0 -75
  264. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/binary_grid.d.ts +0 -0
  265. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/formula_dependency_graph.d.ts +0 -0
  266. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/interval_tree.d.ts +0 -0
  267. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/position_set.d.ts +0 -0
  268. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/r_tree.d.ts +0 -0
  269. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/range_set.d.ts +0 -0
  270. /package/dist/types/plugins/{ui_core_views → evaluation}/cell_evaluation/spreading_relation.d.ts +0 -0
  271. /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.2
5
- @date 2026-07-13T06:26:21.365Z
6
- @hash a4d2f90
4
+ @version 19.5.0-alpha.20
5
+ @date 2026-09-16T08:02:12.495Z
6
+ @hash 4784627
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>
@@ -432,14 +434,59 @@
432
434
  />
433
435
  </t>
434
436
 
437
+ <t t-name="o-spreadsheet-StandaloneViewport">
438
+ <div
439
+ class="o-standalone-viewport h-100 w-100 overflow-hidden d-flex"
440
+ t-on-wheel="this.onMouseWheel">
441
+ <div
442
+ class="o-standalone-viewport-content position-relative flex-grow-1 overflow-hidden"
443
+ t-ref="this.containerRef">
444
+ <GridOverlay
445
+ onCellDoubleClicked.bind="this.onCellDoubleClicked"
446
+ onGridResized="() => {}"
447
+ hasFooter="false"
448
+ gridOverlayDimensions="this.gridOverlayDimensions">
449
+ <div
450
+ t-if="this.props.canResizeColumns"
451
+ t-foreach="this.colResizers"
452
+ t-as="colResizer"
453
+ t-key="colResizer_index"
454
+ class="o-col-resizer h-100"
455
+ t-att-class="{ 'dragging': this.dndState.col === colResizer.col }"
456
+ t-att-style="colResizer.style"
457
+ t-on-pointerdown.stop="(ev) => this.onResizerPointerDown(ev, colResizer)"
458
+ t-on-dblclick.stop="(ev) => this.onResizerDoubleClick(ev, colResizer)">
459
+ <div class="o-col-resizer-handle position-absolute h-100"/>
460
+ </div>
461
+
462
+ <ClickableCellsOverlay t-if="this.env.model.getters.isDashboard()"/>
463
+ </GridOverlay>
464
+ <GridPopover
465
+ gridRect="this.getGridRect()"
466
+ onMouseWheel.bind="this.onMouseWheel"
467
+ onClosePopover="() => this.cellPopoverStore.close()"
468
+ />
469
+ <canvas class="" t-ref="this.canvasRef"/>
470
+ </div>
471
+ <div
472
+ class="position-relative"
473
+ t-if="this.hasVerticalScrollBar"
474
+ t-att-style="this.scrollBarContainerStyle">
475
+ <VerticalScrollBar hasFooter="false"/>
476
+ </div>
477
+ </div>
478
+ </t>
479
+
435
480
  <t t-name="o-spreadsheet-StandaloneGridCanvas">
436
- <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>
437
484
  </t>
438
485
 
439
486
  <t t-name="o-spreadsheet-SpreadsheetPrint">
440
487
  <div class="o-spreadsheet-print d-flex flex-column h-100 w-100">
441
488
  <t t-set="pages" t-value="this.printStore.printPages"/>
442
- <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">
443
490
  <h3 class="m-0 p-3 ps-4 text-white">Print Preview</h3>
444
491
  <span class="text-white">
445
492
  <t t-out="pages.length"/>
@@ -451,30 +498,8 @@
451
498
  <button class="o-button primary flex-grow-0 me-4" t-on-click="this.onPrint">Next</button>
452
499
  </div>
453
500
  <div class="o-print-container d-flex flex-grow-1 overflow-hidden">
454
- <div class="o-print-preview w-100 overflow-auto d-flex flex-column">
455
- <div class="mx-auto">
456
- <div
457
- t-if="pages.length === 0"
458
- class="o-print-page o-empty-print-page m-4 shadow d-flex flex-column align-items-center justify-content-center flex-shrink-0"
459
- t-att-style="this.pageStyle">
460
- <h4 class="fst-italic text-muted">No content to print</h4>
461
- </div>
462
- <div
463
- t-else=""
464
- t-foreach="pages"
465
- t-as="page"
466
- t-key="page_index"
467
- class="o-print-page m-4 shadow d-flex justify-content-center flex-shrink-0"
468
- t-att-style="this.pageStyle">
469
- <StandaloneGridCanvas
470
- sheetId="page.sheetId"
471
- zone="page.zone"
472
- renderingCtx="page.renderingCtx"
473
- />
474
- </div>
475
- </div>
476
- </div>
477
- <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">
478
503
  <div class="o-sidePanelBody pt-4">
479
504
  <Section t-if="!this.env.model.getters.isDashboard()">
480
505
  <div class="o-section-title">Print content</div>
@@ -528,6 +553,16 @@
528
553
  </div>
529
554
  </div>
530
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>
531
566
  </div>
532
567
  </t>
533
568
 
@@ -617,7 +652,7 @@
617
652
  <div class="d-flex flex-fill align-items-center bottom-bar-menu border-top border-bottom">
618
653
  <Ripple>
619
654
  <div class="py-1 px-1 mx-2 ribbon-toggler" t-on-click="this.toggleRibbon">
620
- <i class="o-icon fa fa-cog"/>
655
+ <i class="o-icon oi oi-filled" data-icon="settings_f"/>
621
656
  </div>
622
657
  </Ripple>
623
658
  <BottomBar onClick="this.props.onClick"/>
@@ -633,7 +668,7 @@
633
668
  class="o-previous-button px-3 py-1 mx-2 rounded"
634
669
  t-on-click="this.onClickBack"
635
670
  t-att-title="this.backTitle">
636
- <i class="fa fa-angle-left"/>
671
+ <i class="oi" data-icon="keyboard_arrow_left"/>
637
672
  </div>
638
673
  <span class="d-flex align-items-center" t-out="this.state.title"/>
639
674
  </div>
@@ -649,7 +684,11 @@
649
684
  <t t-name="o-spreadsheet-TableStyleEditorPanel">
650
685
  <div class="o-table-style-editor-panel">
651
686
  <Section title.translate="Style name">
652
- <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
+ />
653
692
  </Section>
654
693
  <Section class="'pt-1'" title.translate="Style color">
655
694
  <RoundColorPicker
@@ -810,22 +849,22 @@
810
849
  <Select
811
850
  class="'mb-3'"
812
851
  values="this.separators"
813
- selectedValue="this.state.separatorValue"
852
+ selectedValue="this.store.separatorValue"
814
853
  onChange.bind="this.onSeparatorChange"
815
854
  />
816
855
 
817
856
  <input
818
857
  class="o-input mb-3"
819
858
  type="text"
820
- t-if="this.state.separatorValue === 'custom'"
821
- t-att-value="this.state.customSeparator"
859
+ t-if="this.store.separatorValue === 'custom'"
860
+ t-att-value="this.store.customSeparator"
822
861
  t-on-input="this.updateCustomSeparator"
823
862
  placeholder="Add any characters or symbol"
824
863
  />
825
864
 
826
865
  <t t-set="addColumnsLabel">Add new columns to avoid overwriting cells</t>
827
866
  <Checkbox
828
- value="this.state.addNewColumns"
867
+ value="this.store.addNewColumns"
829
868
  label="addColumnsLabel"
830
869
  onChange.bind="this.updateAddNewColumnsCheckbox"
831
870
  />
@@ -870,14 +909,14 @@
870
909
  t-if="this.props.onToggleCollapsePanel"
871
910
  class="o-collapse-panel o-sidePanelAction rounded"
872
911
  t-on-click="this.props.onToggleCollapsePanel">
873
- <i class="fa fa-angle-double-right"/>
912
+ <i class="oi" data-icon="keyboard_double_arrow_right"/>
874
913
  </div>
875
914
  <div class="o-sidePanelTitle o-fw-bold ms-2" t-out="this.getTitle()"/>
876
915
  <div
877
916
  t-if="this.props.isPinned"
878
917
  class="o-pin-panel o-sidePanelAction ms-auto rounded active"
879
918
  t-on-click="this.props.onTogglePinPanel">
880
- <i class="fa fa-thumb-tack"/>
919
+ <i class="oi" data-icon="push_pin"/>
881
920
  </div>
882
921
  <div
883
922
  class="o-sidePanelClose o-sidePanelAction rounded"
@@ -916,13 +955,13 @@
916
955
  <div
917
956
  t-if="this.props.onToggleCollapsePanel"
918
957
  class="o-collapse-panel o-sidePanelAction rounded mb-1">
919
- <i class="fa fa-angle-double-left"/>
958
+ <i class="oi" data-icon="keyboard_double_arrow_left"/>
920
959
  </div>
921
960
  <div
922
961
  t-if="this.props.isPinned"
923
962
  class="o-pin-panel o-sidePanelAction ms-auto rounded active"
924
963
  t-on-click="this.props.onTogglePinPanel">
925
- <i class="fa fa-thumb-tack"/>
964
+ <i class="oi" data-icon="push_pin"/>
926
965
  </div>
927
966
  <div
928
967
  class="o-sidePanelClose o-sidePanelAction rounded mb-1"
@@ -979,7 +1018,7 @@
979
1018
  <t t-set="dataHasHeaderLabel">Data has header row</t>
980
1019
  <Checkbox
981
1020
  name="'dataHasHeader'"
982
- value="this.state.hasHeader"
1021
+ value="this.dataCleanupSore.hasHeader"
983
1022
  label="dataHasHeaderLabel"
984
1023
  onChange.bind="this.toggleHasHeader"
985
1024
  />
@@ -994,9 +1033,9 @@
994
1033
  onChange.bind="this.toggleAllColumns"
995
1034
  />
996
1035
 
997
- <t t-foreach="Object.keys(this.state.columns)" t-as="colIndex" t-key="colIndex">
1036
+ <t t-foreach="Object.keys(this.dataCleanupSore.columns)" t-as="colIndex" t-key="colIndex">
998
1037
  <Checkbox
999
- value="this.state.columns[colIndex]"
1038
+ value="this.dataCleanupSore.columns[colIndex]"
1000
1039
  label="this.getColLabel(colIndex)"
1001
1040
  onChange="() => this.toggleColumn(colIndex)"
1002
1041
  />
@@ -1041,17 +1080,17 @@
1041
1080
  <div class="o-pivot-panel d-flex flex-column h-100">
1042
1081
  <div class="o-panel d-flex">
1043
1082
  <div
1044
- 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"
1045
1084
  t-att-class="this.state.panel !== 'configuration' ? 'inactive' : ''"
1046
1085
  t-on-click="this.switchPanel.bind(this, 'configuration')">
1047
- <i class="fa fa-sliders me-1"/>
1086
+ <i class="oi me-2" data-icon="tune"/>
1048
1087
  Configuration
1049
1088
  </div>
1050
1089
  <div
1051
- 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"
1052
1091
  t-att-class="this.state.panel !== 'design' ? 'inactive' : ''"
1053
1092
  t-on-click="this.switchPanel.bind(this, 'design')">
1054
- <i class="fa fa-paint-brush me-1"/>
1093
+ <i class="oi me-2" data-icon="design_services"/>
1055
1094
  Design
1056
1095
  </div>
1057
1096
  </div>
@@ -1329,7 +1368,8 @@
1329
1368
  <t t-set="errorMessage" t-value="this.getHugeDimensionErrorMessage(col)"/>
1330
1369
  <i
1331
1370
  t-if="errorMessage"
1332
- class="text-warning fa fa-exclamation-triangle"
1371
+ class="text-warning oi"
1372
+ data-icon="warning"
1333
1373
  t-att-title="errorMessage"
1334
1374
  />
1335
1375
  </t>
@@ -1370,7 +1410,8 @@
1370
1410
  <t t-set="errorMessage" t-value="this.getHugeDimensionErrorMessage(row)"/>
1371
1411
  <i
1372
1412
  t-if="errorMessage"
1373
- class="text-warning fa fa-exclamation-triangle"
1413
+ class="text-warning oi"
1414
+ data-icon="warning"
1374
1415
  t-att-title="errorMessage"
1375
1416
  />
1376
1417
  </t>
@@ -1461,19 +1502,20 @@
1461
1502
  <t t-if="measure.isHidden" t-set="hideTitle">Show</t>
1462
1503
  <t t-else="" t-set="hideTitle">Hide</t>
1463
1504
  <i
1464
- t-att-class="measure.isHidden ? 'fa fa-eye-slash': 'fa fa-eye'"
1505
+ t-att-data-icon="measure.isHidden ? 'visibility_off_f' : 'visibility_f'"
1465
1506
  t-att-title="hideTitle"
1466
- class="o-button-icon pe-1 ps-2"
1507
+ class="o-button-icon pe-1 ps-1 oi"
1467
1508
  t-on-click="this.toggleMeasureVisibility"
1468
1509
  />
1469
1510
  <i
1470
- 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"
1471
1513
  title="Show values as"
1472
1514
  t-on-click="this.openShowValuesAs"
1473
1515
  />
1474
1516
  </t>
1475
1517
  <div t-if="measure.computedBy" class="d-flex flex-row small">
1476
- <div class="d-flex flex-column py-2 px-2 w-100" t-on-pointerdown.stop="">
1518
+ <div class="d-flex flex-column py-2 px-2 w-100">
1477
1519
  <StandaloneComposer
1478
1520
  onConfirm.bind="this.updateMeasureFormula"
1479
1521
  composerContent="measure.computedBy.formula"
@@ -1552,10 +1594,11 @@
1552
1594
  />
1553
1595
  <span t-else="1" class="o-fw-bold text-truncate" t-out="this.dimensionDisplayName"/>
1554
1596
  </div>
1555
- <div class="d-flex flex-rows" t-on-pointerdown.stop="">
1597
+ <div class="d-flex flex-rows">
1556
1598
  <t t-call-slot="upper-right-icons"/>
1557
1599
  <i
1558
- 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"
1559
1602
  t-if="this.props.onRemoved"
1560
1603
  t-on-click="() => this.props.onRemoved(this.props.dimension)"
1561
1604
  />
@@ -1635,7 +1678,8 @@
1635
1678
  />
1636
1679
  <div t-if="this.props.isDirty" class="d-flex align-items-center">
1637
1680
  <i
1638
- class="o-button-icon pe-0 fa fa-undo"
1681
+ class="o-button-icon pe-0 oi"
1682
+ data-icon="undo"
1639
1683
  title="Discard all changes"
1640
1684
  t-on-click="() => this.props.discard()"
1641
1685
  />
@@ -1661,16 +1705,15 @@
1661
1705
  t-as="group"
1662
1706
  t-key="group_index"
1663
1707
  class="o-pivot-custom-group pb-1">
1664
- <div
1665
- class="d-flex align-items-center justify-content-between small"
1666
- t-on-pointerdown.stop="">
1708
+ <div class="d-flex align-items-center justify-content-between small">
1667
1709
  <TextInput
1668
1710
  value="group.name"
1669
1711
  onChange="(newName) => this.onRenameGroup(group_index, newName)"
1670
1712
  selectContentOnFocus="true"
1671
1713
  />
1672
1714
  <i
1673
- class="o-button-icon ps-3 fa fa-trash"
1715
+ class="o-button-icon ps-3 oi oi-filled"
1716
+ data-icon="delete_f"
1674
1717
  t-on-click="() => this.onDeleteGroup(group_index)"
1675
1718
  />
1676
1719
  </div>
@@ -1705,8 +1748,10 @@
1705
1748
  <div class="d-flex flex-column gap-1">
1706
1749
  <div class="d-flex justify-content-center mb-3">
1707
1750
  <button class="o-button" t-on-click="this.startProfiling">
1708
- <i class="fa fa-refresh me-1"/>
1709
- 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>
1710
1755
  </button>
1711
1756
  </div>
1712
1757
  <div class="d-flex justify-content-between">
@@ -2018,7 +2063,8 @@
2018
2063
  type="text"
2019
2064
  class="o-input o-input-without-count o-replace"
2020
2065
  t-on-keydown="this.onKeydownReplace"
2021
- t-custom-model="this.store.toReplace"
2066
+ t-att-value="this.store.toReplace"
2067
+ t-on-input="this.onReplaceInput"
2022
2068
  placeholder="e.g. 'replace me'"
2023
2069
  />
2024
2070
  </div>
@@ -2124,6 +2170,70 @@
2124
2170
  </div>
2125
2171
  </t>
2126
2172
 
2173
+ <t t-name="o-spreadsheet-DataSourcesCleanup">
2174
+ <div class="o-data-source-cleanup">
2175
+ <Section
2176
+ t-foreach="this.store.unusedDataSourcesCategories"
2177
+ t-as="category"
2178
+ t-key="category.type"
2179
+ title="category.label">
2180
+ <t t-foreach="category.dataSources" t-as="dataSource" t-key="dataSource_index">
2181
+ <Checkbox
2182
+ name="dataSource.id"
2183
+ label="dataSource.label"
2184
+ value="this.isDataSourceChecked(category.type, dataSource.id)"
2185
+ onChange="(checked) => this.onToggleDataSource(category.type, dataSource.id, checked)"
2186
+ className="'mb-2'"
2187
+ />
2188
+ </t>
2189
+ <div t-if="!category.dataSources.length" class="w-100 d-flex fst-italic text-muted">
2190
+ No unused data source in this category.
2191
+ </div>
2192
+ </Section>
2193
+ <Section t-if="this.dataSourcesToDelete.length" class="'pt-0'">
2194
+ <button class="o-button o-button-danger" t-on-click="this.onRemoveUnusedDataSources">
2195
+ Delete selected items
2196
+ </button>
2197
+ </Section>
2198
+ </div>
2199
+ </t>
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
+
2127
2237
  <t t-name="o-spreadsheet-ValueInRangeCriterionForm">
2128
2238
  <SelectionInput
2129
2239
  ranges="[this.props.criterion.values[0] || '']"
@@ -2312,7 +2422,8 @@
2312
2422
  <t t-name="o-spreadsheet-CalendarButton">
2313
2423
  <div class="o-calendar-button ms-1">
2314
2424
  <button type="button" class="o-button btn" t-on-click="this.openCalendar">
2315
- <i class="fa fa-calendar"/>
2425
+ <!-- TODORAR see how we can make filled versions -->
2426
+ <i class="oi oi-filled" data-icon="calendar_today"/>
2316
2427
  </button>
2317
2428
  <input
2318
2429
  type="date"
@@ -2826,17 +2937,17 @@
2826
2937
 
2827
2938
  <t t-name="o-spreadsheet-SidePanelCollapsible">
2828
2939
  <div class="" t-att-class="this.props.class">
2829
- <div
2830
- class="o_side_panel_collapsible_title o-fw-bold d-flex align-items-center"
2831
- t-on-click="() => this.toggle()">
2940
+ <div class="o_side_panel_collapsible_title o-fw-bold d-flex align-items-center">
2832
2941
  <div
2833
2942
  class="collapsor w-100 d-flex align-items-center ps-1"
2834
- t-att-class="this.state.isCollapsed ? 'collapsed' : ''">
2943
+ t-att-class="this.state.isCollapsed ? 'collapsed' : ''"
2944
+ t-on-click="() => this.toggle()">
2835
2945
  <span class="collapsor-arrow">
2836
2946
  <t t-call="o-spreadsheet-Icon.ANGLE_DOWN"/>
2837
2947
  </span>
2838
2948
  <div class="ps-2" t-out="this.props.title"/>
2839
2949
  </div>
2950
+ <t t-call-slot="titleButton"/>
2840
2951
  </div>
2841
2952
  <Collapse isCollapsed="this.state.isCollapsed">
2842
2953
  <div class="pt-2">
@@ -2854,7 +2965,8 @@
2854
2965
 
2855
2966
  <t t-name="o-spreadsheet-CogWheelMenu">
2856
2967
  <span
2857
- 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"
2858
2970
  t-on-click="this.toggleMenu"
2859
2971
  t-ref="this.buttonRef"
2860
2972
  />
@@ -3321,19 +3433,21 @@
3321
3433
  </Section>
3322
3434
  </t>
3323
3435
  </GeneralDesignEditor>
3324
- <ChartTitle
3325
- title="this.props.definition.keyDescr?.text ?? ''"
3326
- updateTitle="(text) => this.setKeyText(text)"
3327
- name.translate="Key Value Style"
3328
- placeholder.translate="Add a key value description"
3329
- updateStyle.bind="this.updateKeyStyle"
3330
- style="this.keyStyle"
3331
- />
3332
- <SidePanelCollapsible isInitiallyCollapsed="false" title.translate="Baseline">
3436
+ <SidePanelCollapsible isInitiallyCollapsed="false" title.translate="Scorecard Design">
3333
3437
  <t t-set-slot="content">
3334
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'"
3335
3449
  title="this.props.definition.baselineDescr?.text ?? ''"
3336
- updateTitle="(text) => this.setBaselineText(text)"
3450
+ updateTitle.bind="this.setBaselineText"
3337
3451
  name.translate="Baseline Style"
3338
3452
  placeholder.translate="Add a baseline description"
3339
3453
  updateStyle.bind="this.updateBaselineStyle"
@@ -3365,23 +3479,22 @@
3365
3479
  <t t-name="o-spreadsheet-ScorecardChartConfigPanel">
3366
3480
  <div>
3367
3481
  <Section class="'o-data-series'" title.translate="Key value">
3368
- <SelectionInput
3369
- ranges="[this.getKeyValueRange()]"
3370
- isInvalid="this.isKeyValueInvalid"
3371
- hasSingleRange="true"
3372
- required="true"
3373
- onSelectionChanged="(ranges) => this.onKeyValueRangeChanged(ranges)"
3374
- 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"
3375
3488
  />
3376
3489
  </Section>
3377
3490
  <Section class="'o-data-labels'" title.translate="Baseline configuration">
3378
3491
  <div class="o-section-subtitle">Value</div>
3379
- <SelectionInput
3380
- ranges="[this.getBaselineRange()]"
3381
- isInvalid="this.isBaselineInvalid"
3382
- hasSingleRange="true"
3383
- onSelectionChanged="(ranges) => this.onBaselineRangeChanged(ranges)"
3384
- 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"
3385
3498
  />
3386
3499
  <div class="o-section-subtitle">Format</div>
3387
3500
  <Select
@@ -3473,17 +3586,17 @@
3473
3586
  <div class="o-chart d-flex flex-column h-100" t-if="this.chartId">
3474
3587
  <div class="o-panel d-flex">
3475
3588
  <div
3476
- 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"
3477
3590
  t-att-class="this.store.panel !== 'configuration' ? 'inactive' : ''"
3478
3591
  t-on-click="this.switchPanel.bind(this, 'configuration')">
3479
- <i class="fa fa-sliders me-1"/>
3592
+ <i class="oi me-2" data-icon="tune"/>
3480
3593
  Configuration
3481
3594
  </div>
3482
3595
  <div
3483
- 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"
3484
3597
  t-att-class="this.store.panel !== 'design' ? 'inactive' : ''"
3485
3598
  t-on-click="this.switchPanel.bind(this, 'design')">
3486
- <i class="fa fa-paint-brush me-1"/>
3599
+ <i class="oi me-2" data-icon="design_services"/>
3487
3600
  Design
3488
3601
  </div>
3489
3602
  </div>
@@ -3593,7 +3706,7 @@
3593
3706
  updateChart="this.props.updateChart"
3594
3707
  canUpdateChart="this.props.canUpdateChart"
3595
3708
  onErrorMessagesChanged.bind="this.onErrorMessagesChanged"
3596
- getLabelRangeOptions.bind="this.getLabelRangeOptions"
3709
+ getLabelRangeOptions="() => []"
3597
3710
  dataSeriesTitle.translate="Hierarchy"
3598
3711
  labelRangeTitle.translate="Values"
3599
3712
  />
@@ -3921,26 +4034,12 @@
3921
4034
  <ChartAnnotation t-props="this.props"/>
3922
4035
  </t>
3923
4036
 
3924
- <t t-name="o-spreadsheet-ChartTypePicker">
3925
- <t t-set="selectedChartProperties" t-value="this.getSelectedChartSubtypeProperties()"/>
3926
- <Section title.translate="Chart type">
3927
- <div class="position-relative">
3928
- <div
3929
- class="o-select o-input o-type-selector"
3930
- t-ref="this.selectRef"
3931
- t-on-pointerdown.prevent="this.onPointerDown">
3932
- <t t-out="selectedChartProperties.displayName"/>
3933
- </div>
3934
- <div class="o-type-selector-preview position-absolute">
3935
- <t t-call="{{selectedChartProperties.preview}}"/>
3936
- </div>
3937
- </div>
3938
- </Section>
3939
- <Popover t-if="this.state.popoverProps" t-props="this.state.popoverProps">
4037
+ <t t-name="o-spreadsheet-ChartTypePickerPopover">
4038
+ <Popover t-props="this.props.popoverProps">
3940
4039
  <div
3941
4040
  t-ref="this.popoverRef"
3942
4041
  class="o-chart-select-popover px-3 pb-4"
3943
- t-att-style="this.state.popoverStyle">
4042
+ t-att-style="this.popoverStyle">
3944
4043
  <t t-foreach="this.categories" t-as="category" t-key="category">
3945
4044
  <t t-if="this.chartTypeByCategories[category]">
3946
4045
  <h5 class="my-3" t-out="category_value"/>
@@ -3954,7 +4053,7 @@
3954
4053
  t-att-title="properties.displayName"
3955
4054
  t-on-click="() => this.onTypeChange(properties.chartSubtype)"
3956
4055
  t-att-data-id="properties.chartSubtype"
3957
- t-att-class="{'selected': properties === selectedChartProperties}">
4056
+ t-att-class="{'selected': properties.chartSubtype === this.props.selectedChartSubType}">
3958
4057
  <t t-call="{{properties.preview}}"/>
3959
4058
  </div>
3960
4059
  </t>
@@ -3965,6 +4064,32 @@
3965
4064
  </Popover>
3966
4065
  </t>
3967
4066
 
4067
+ <t t-name="o-spreadsheet-ChartTypePicker">
4068
+ <t t-set="selectedChartProperties" t-value="this.getSelectedChartSubtypeProperties()"/>
4069
+ <Section title.translate="Chart type">
4070
+ <div class="position-relative">
4071
+ <div
4072
+ class="o-select o-input o-type-selector"
4073
+ t-ref="this.selectRef"
4074
+ t-on-pointerdown.prevent="this.onPointerDown">
4075
+ <t t-out="selectedChartProperties.displayName"/>
4076
+ </div>
4077
+ <div class="o-type-selector-preview position-absolute">
4078
+ <t t-call="{{selectedChartProperties.preview}}"/>
4079
+ </div>
4080
+ </div>
4081
+ </Section>
4082
+ <ChartTypePickerPopover
4083
+ t-if="this.state.popoverProps"
4084
+ popoverProps="this.state.popoverProps"
4085
+ onClose.bind="this.closePopover"
4086
+ onSelectSubType.bind="this.onTypeChange"
4087
+ parentRef="this.selectRef"
4088
+ supportedTypes="this.getSupportedChartTypes()"
4089
+ selectedChartSubType="selectedChartProperties.chartSubtype"
4090
+ />
4091
+ </t>
4092
+
3968
4093
  <t t-name="o-spreadsheet-ChartPreview.LINE_CHART">
3969
4094
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3970
4095
  <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
@@ -4453,7 +4578,7 @@
4453
4578
  updateChart="this.props.updateChart"
4454
4579
  canUpdateChart="this.props.canUpdateChart"
4455
4580
  onErrorMessagesChanged.bind="this.onErrorMessagesChanged"
4456
- getLabelRangeOptions.bind="this.getLabelRangeOptions"
4581
+ getLabelRangeOptions="() => []"
4457
4582
  labelRangeTitle.translate="Date range"
4458
4583
  />
4459
4584
 
@@ -4462,7 +4587,7 @@
4462
4587
  <span class="w-100">Horizontal axis</span>
4463
4588
  <Select
4464
4589
  selectedValue="this.getGroupByType('horizontal') || ''"
4465
- values="this.getGroupByOptions()"
4590
+ values="this.groupByChoices"
4466
4591
  class="'o-horizontal-group-by'"
4467
4592
  onChange="(value) => this.updateGroupBy('horizontal', value)"
4468
4593
  />
@@ -4471,7 +4596,7 @@
4471
4596
  <span class="w-100">Vertical axis</span>
4472
4597
  <Select
4473
4598
  selectedValue="this.getGroupByType('vertical') || ''"
4474
- values="this.getGroupByOptions()"
4599
+ values="this.groupByChoices"
4475
4600
  class="'o-vertical-group-by'"
4476
4601
  onChange="(value) => this.updateGroupBy('vertical', value)"
4477
4602
  />
@@ -4943,7 +5068,7 @@
4943
5068
  </t>
4944
5069
 
4945
5070
  <t t-name="o-spreadsheet.ChartTitle">
4946
- <Section class="'o-chart-title'" title="this.props.name">
5071
+ <Section class="'o-chart-title ' + (this.props.class ?? '')" title="this.props.name">
4947
5072
  <TextInput
4948
5073
  value="this.props.title"
4949
5074
  onChange.bind="this.updateTitle"
@@ -5248,7 +5373,7 @@
5248
5373
  <div class="o-carousel-preview-list overflow-auto bg-white" t-ref="this.previewListRef">
5249
5374
  <t t-foreach="this.carouselItems" t-as="item" t-key="this.getItemId(item)">
5250
5375
  <div
5251
- class="o-carousel-preview border-bottom pe-2 position-relative w-100 d-flex align-items-center"
5376
+ class="o-carousel-preview border-bottom pe-2 position-relative w-100 d-flex flex-column"
5252
5377
  t-att-class="{
5253
5378
  'o-dragging border-top': this.dragAndDrop.draggedItemId === this.getItemId(item),
5254
5379
  'o-selected': this.isCarouselItemActive(item)
@@ -5259,38 +5384,61 @@
5259
5384
  t-on-pointerdown.stop.prevent="(ev) => this.onDragHandleMouseDown(item, ev)">
5260
5385
  <t t-call="o-spreadsheet-Icon.THIN_DRAG_HANDLE"/>
5261
5386
  </div>
5262
- <div
5263
- class="o-carousel-preview-icon ms-3 flex-shrink-0 d-flex align-items-center justify-content-center">
5264
- <t t-call="{{this.getItemPreview(item)}}"/>
5387
+ <div class="d-flex o-preview-content align-items-center justify-content-center">
5388
+ <div
5389
+ class="o-carousel-preview-icon ms-3 flex-shrink-0 d-flex align-items-center justify-content-center">
5390
+ <t t-call="{{this.getItemPreview(item)}}"/>
5391
+ </div>
5392
+ <div class="o-carousel-preview-title text-truncate ms-2">
5393
+ <TextInput
5394
+ value="this.getItemTitle(item)"
5395
+ onChange="(newName) => this.renameCarouselItem(item, newName)"
5396
+ selectContentOnFocus="true"
5397
+ />
5398
+ </div>
5399
+ <div class="ms-auto"/>
5400
+ <div class="flex-shrink-0 d-flex me-1">
5401
+ <CogWheelMenu items="this.getCogWheelMenuItems(item)"/>
5402
+ </div>
5265
5403
  </div>
5266
- <div class="o-carousel-preview-title text-truncate ms-2">
5267
- <TextInput
5268
- value="this.getItemTitle(item)"
5269
- onChange="(newName) => this.renameCarouselItem(item, newName)"
5270
- selectContentOnFocus="true"
5404
+ <div class="ms-4 mb-2" t-if="item.type === 'carouselDataView'">
5405
+ <SelectionInput
5406
+ ranges="[this.getItemRangeString(item)]"
5407
+ hasSingleRange="true"
5408
+ required="true"
5409
+ onSelectionChanged.bind="this.onSelectionInputChanged"
5410
+ onSelectionConfirmed.bind="this.onSelectionInputConfirmed"
5271
5411
  />
5272
5412
  </div>
5273
- <div class="ms-auto"/>
5274
- <div class="flex-shrink-0 d-flex me-1">
5275
- <CogWheelMenu items="this.getCogWheelMenuItems(item)"/>
5276
- </div>
5277
5413
  </div>
5278
5414
  </t>
5279
5415
  </div>
5280
- <div
5281
- class="o-button-link o-carousel-add-chart float-end d-flex align-items-center py-4 pe-4 gap-2"
5282
- t-on-click="this.addNewChartToCarousel"
5283
- t-att-title="this.carouselAddChartInfoMessage">
5284
- + Add chart
5285
- </div>
5286
- <div
5287
- t-if="!this.hasDataView"
5288
- class="o-button-link o-carousel-add-data-view float-end py-4 pe-4"
5289
- t-on-click="this.addDataViewToCarousel"
5290
- t-att-title="this.carouselDataViewMessage">
5291
- + Add data view
5292
- </div>
5416
+ <Section class="'pt-0'">
5417
+ <div>
5418
+ <div
5419
+ class="o-button-link o-carousel-add-chart float-end d-flex align-items-center my-4"
5420
+ t-on-click="this.addNewChartToCarousel"
5421
+ t-ref="this.addChartButton"
5422
+ t-att-title="this.carouselAddChartInfoMessage">
5423
+ + Add chart
5424
+ </div>
5425
+ <div
5426
+ t-if="!this.hasDataView"
5427
+ class="o-button-link o-carousel-add-data-view float-end my-4 me-4"
5428
+ t-on-click="this.addDataViewToCarousel">
5429
+ + Add data view
5430
+ </div>
5431
+ </div>
5432
+ </Section>
5293
5433
  </div>
5434
+ <ChartTypePickerPopover
5435
+ t-if="this.state.popoverProps"
5436
+ popoverProps="this.state.popoverProps"
5437
+ onClose.bind="this.closePopover"
5438
+ onSelectSubType.bind="this.onSelectChartType"
5439
+ parentRef="this.addChartButton"
5440
+ supportedTypes="this.supportedChartTypes"
5441
+ />
5294
5442
  </t>
5295
5443
 
5296
5444
  <t t-name="o-spreadsheet-SelectionInput">
@@ -5439,7 +5587,7 @@
5439
5587
  </t>
5440
5588
 
5441
5589
  <t t-name="o_spreadsheet.PivotHTMLRenderer">
5442
- <div class="o_pivot_html_renderer">
5590
+ <div class="w-100">
5443
5591
  <Checkbox
5444
5592
  name="'missing_values'"
5445
5593
  label.translate="Display missing cells only"
@@ -5663,11 +5811,9 @@
5663
5811
  class="o-menu-item-description ms-auto text-truncate"
5664
5812
  t-out="description"
5665
5813
  />
5666
- <t t-set="secondaryIcon" t-value="menuItem.secondaryIcon(this.env)"/>
5667
5814
  <div
5668
- t-if="isMenuRoot || secondaryIcon"
5815
+ t-if="isMenuRoot"
5669
5816
  class="o-menu-item-root ms-auto align-items-center d-flex gap-1">
5670
- <t t-if="secondaryIcon" t-call="{{secondaryIcon}}"/>
5671
5817
  <t t-if="isMenuRoot" t-call="o-spreadsheet-Icon.CARET_RIGHT"/>
5672
5818
  </div>
5673
5819
  </div>
@@ -5691,7 +5837,8 @@
5691
5837
  title="Link label"
5692
5838
  placeholder="e.g. 'Link label'"
5693
5839
  class="o-input"
5694
- t-custom-model="this.state.label"
5840
+ t-att-value="this.state.label"
5841
+ t-on-input="(ev) => this.state.label = ev.target.value"
5695
5842
  />
5696
5843
  </div>
5697
5844
 
@@ -5708,8 +5855,8 @@
5708
5855
  placeholder="e.g. 'http://www.odoo.com'"
5709
5856
  title="Link URL"
5710
5857
  t-ref="this.urlInput"
5711
- t-custom-model="this.state.url"
5712
- t-on-input="this.computeLinks"
5858
+ t-att-value="this.state.url"
5859
+ t-on-input="this.onLinkUrlInput"
5713
5860
  />
5714
5861
  </t>
5715
5862
  <t t-else="">
@@ -5726,7 +5873,7 @@
5726
5873
  t-on-click="this.removeLink"
5727
5874
  class="o-remove-url o-button-icon"
5728
5875
  t-translation="off">
5729
- <i class="fa fa-times"/>
5876
+ <i class="oi" data-icon="close"/>
5730
5877
  </button>
5731
5878
  </div>
5732
5879
  </div>
@@ -5903,12 +6050,12 @@
5903
6050
  </t>
5904
6051
  <t t-name="o-spreadsheet-Icon.CLIPBOARD">
5905
6052
  <div class="o-icon">
5906
- <i class="fa fa-clipboard"/>
6053
+ <i class="oi" data-icon="assignment"/>
5907
6054
  </div>
5908
6055
  </t>
5909
6056
  <t t-name="o-spreadsheet-Icon.COPY">
5910
6057
  <div class="o-icon">
5911
- <i class="fa fa-clone"/>
6058
+ <i class="oi" data-icon="content_copy"/>
5912
6059
  </div>
5913
6060
  </t>
5914
6061
  <t t-name="o-spreadsheet-Icon.CUT">
@@ -5966,7 +6113,7 @@
5966
6113
  </t>
5967
6114
  <t t-name="o-spreadsheet-Icon.SHOW">
5968
6115
  <div class="o-icon">
5969
- <i class="fa fa-eye"/>
6116
+ <i class="oi" data-icon="visibility"/>
5970
6117
  </div>
5971
6118
  </t>
5972
6119
  <t t-name="o-spreadsheet-Icon.FORMULA">
@@ -6099,22 +6246,22 @@
6099
6246
  </t>
6100
6247
  <t t-name="o-spreadsheet-Icon.INSERT_CHART">
6101
6248
  <div class="o-icon">
6102
- <i class="fa fa-bar-chart"/>
6249
+ <i class="oi" data-icon="bar_chart"/>
6103
6250
  </div>
6104
6251
  </t>
6105
6252
  <t t-name="o-spreadsheet-Icon.INSERT_IMAGE">
6106
6253
  <div class="o-icon">
6107
- <i class="fa fa-file-image-o"/>
6254
+ <i class="oi" data-icon="image"/>
6108
6255
  </div>
6109
6256
  </t>
6110
6257
  <t t-name="o-spreadsheet-Icon.INSERT_LINK">
6111
6258
  <div class="o-icon">
6112
- <i class="fa fa-link"/>
6259
+ <i class="oi" data-icon="link"/>
6113
6260
  </div>
6114
6261
  </t>
6115
6262
  <t t-name="o-spreadsheet-Icon.INSERT_CHECKBOX">
6116
6263
  <div class="o-icon">
6117
- <i class="fa fa-check-square-o"/>
6264
+ <i class="oi" data-icon="check_box"/>
6118
6265
  </div>
6119
6266
  </t>
6120
6267
  <t t-name="o-spreadsheet-Icon.INSERT_DROPDOWN">
@@ -6222,7 +6369,7 @@
6222
6369
  </t>
6223
6370
  <t t-name="o-spreadsheet-Icon.IRREGULARITY_MAP">
6224
6371
  <div class="o-icon">
6225
- <i class="fa fa-align-center fa-rotate-270"/>
6372
+ <i class="oi oi-rotate-270" data-icon="format_align_center"/>
6226
6373
  </div>
6227
6374
  </t>
6228
6375
  <t t-name="o-spreadsheet-Icon.ALIGN_RIGHT">
@@ -6405,67 +6552,67 @@
6405
6552
 
6406
6553
  <t t-name="o-spreadsheet-Icon.FULLSCREEN_OUT">
6407
6554
  <div class="o-icon">
6408
- <i class="fa fa-compress"/>
6555
+ <i class="oi" data-icon="close_fullscreen"/>
6409
6556
  </div>
6410
6557
  </t>
6411
6558
  <t t-name="o-spreadsheet-Icon.FULLSCREEN_IN">
6412
6559
  <div class="o-icon">
6413
- <i class="fa fa-expand"/>
6560
+ <i class="oi" data-icon="expand_content"/>
6414
6561
  </div>
6415
6562
  </t>
6416
6563
  <t t-name="o-spreadsheet-Icon.EDIT">
6417
6564
  <div class="o-icon">
6418
- <i class="fa fa-pencil-square-o"/>
6565
+ <i class="oi" data-icon="edit_square"/>
6419
6566
  </div>
6420
6567
  </t>
6421
6568
  <t t-name="o-spreadsheet-Icon.EXTERNAL">
6422
6569
  <div class="o-icon">
6423
- <i class="fa fa-external-link"/>
6570
+ <i class="oi" data-icon="open_in_new"/>
6424
6571
  </div>
6425
6572
  </t>
6426
6573
  <t t-name="o-spreadsheet-Icon.UNLINK">
6427
6574
  <div class="o-icon">
6428
- <i class="fa fa-chain-broken"/>
6575
+ <i class="oi" data-icon="link_off"/>
6429
6576
  </div>
6430
6577
  </t>
6431
6578
  <t t-name="o-spreadsheet-Icon.CARET_UP">
6432
- <div class="o-icon fa-small">
6433
- <i class="fa fa-caret-up"/>
6579
+ <div class="o-icon">
6580
+ <i class="oi" data-icon="arrow_drop_up"/>
6434
6581
  </div>
6435
6582
  </t>
6436
6583
  <t t-name="o-spreadsheet-Icon.CARET_DOWN">
6437
- <div class="o-icon fa-small">
6438
- <i class="fa fa-caret-down"/>
6584
+ <div class="o-icon">
6585
+ <i class="oi" data-icon="arrow_drop_down"/>
6439
6586
  </div>
6440
6587
  </t>
6441
6588
  <t t-name="o-spreadsheet-Icon.CARET_RIGHT">
6442
- <div class="o-icon fa-small">
6443
- <i class="fa fa-caret-right"/>
6589
+ <div class="o-icon">
6590
+ <i class="oi" data-icon="arrow_right"/>
6444
6591
  </div>
6445
6592
  </t>
6446
6593
  <t t-name="o-spreadsheet-Icon.CARET_LEFT">
6447
- <div class="o-icon fa-small">
6448
- <i class="fa fa-caret-left"/>
6594
+ <div class="o-icon">
6595
+ <i class="oi" data-icon="arrow_left"/>
6449
6596
  </div>
6450
6597
  </t>
6451
6598
  <t t-name="o-spreadsheet-Icon.TRASH">
6452
6599
  <div class="o-icon">
6453
- <i class="fa fa-trash-o"/>
6600
+ <i class="oi" data-icon="delete"/>
6454
6601
  </div>
6455
6602
  </t>
6456
6603
  <t t-name="o-spreadsheet-Icon.TRASH_FILLED">
6457
6604
  <div class="o-icon">
6458
- <i class="fa fa-trash"/>
6605
+ <i class="oi oi-filled" data-icon="delete_f"/>
6459
6606
  </div>
6460
6607
  </t>
6461
6608
  <t t-name="o-spreadsheet-Icon.REFRESH">
6462
6609
  <div class="o-icon">
6463
- <i class="fa fa-refresh"/>
6610
+ <i class="oi" data-icon="refresh"/>
6464
6611
  </div>
6465
6612
  </t>
6466
6613
  <t t-name="o-spreadsheet-Icon.EXCHANGE">
6467
6614
  <div class="o-icon">
6468
- <i class="fa fa-exchange"/>
6615
+ <i class="oi" data-icon="swap_horiz"/>
6469
6616
  </div>
6470
6617
  </t>
6471
6618
  <t t-name="o-spreadsheet-Icon.ARROW_DOWN">
@@ -6568,17 +6715,17 @@
6568
6715
  </t>
6569
6716
  <t t-name="o-spreadsheet-Icon.SORT_ASCENDING">
6570
6717
  <div class="o-icon">
6571
- <i class="fa fa-sort-alpha-asc"/>
6718
+ <i class="oi" data-icon="sort_by_alpha"/>
6572
6719
  </div>
6573
6720
  </t>
6574
6721
  <t t-name="o-spreadsheet-Icon.SORT_DESCENDING">
6575
6722
  <div class="o-icon">
6576
- <i class="fa fa-sort-alpha-desc"/>
6723
+ <i class="oi" data-icon="sort_by_alpha"/>
6577
6724
  </div>
6578
6725
  </t>
6579
6726
  <t t-name="o-spreadsheet-Icon.DATA_CLEANUP">
6580
6727
  <div class="o-icon">
6581
- <i class="fa fa-magic"/>
6728
+ <i class="oi" data-icon="wand_stars"/>
6582
6729
  </div>
6583
6730
  </t>
6584
6731
  <t t-name="o-spreadsheet-Icon.FILTER_ICON">
@@ -6591,17 +6738,17 @@
6591
6738
  </t>
6592
6739
  <t t-name="o-spreadsheet-Icon.FILTER_ICON_ACTIVE">
6593
6740
  <div class="o-icon filter-icon-active">
6594
- <i class="fa fa-filter"/>
6741
+ <i class="oi oi-filled" data-icon="filter_alt_f"/>
6595
6742
  </div>
6596
6743
  </t>
6597
6744
  <t t-name="o-spreadsheet-Icon.SEARCH">
6598
6745
  <div class="o-icon">
6599
- <i class="fa fa-search"/>
6746
+ <i class="oi" data-icon="search"/>
6600
6747
  </div>
6601
6748
  </t>
6602
6749
  <t t-name="o-spreadsheet-Icon.ZOOM">
6603
6750
  <div class="o-icon">
6604
- <i class="fa fa-search-plus"/>
6751
+ <i class="oi" data-icon="zoom_in"/>
6605
6752
  </div>
6606
6753
  </t>
6607
6754
  <t t-name="o-spreadsheet-Icon.CHECK">
@@ -6635,8 +6782,8 @@
6635
6782
  </svg>
6636
6783
  </t>
6637
6784
  <t t-name="o-spreadsheet-Icon.TRIANGLE_EXCLAMATION">
6638
- <div class="o-icon fa-small">
6639
- <i class="fa fa-exclamation-triangle"/>
6785
+ <div class="o-icon">
6786
+ <i class="oi" data-icon="warning"/>
6640
6787
  </div>
6641
6788
  </t>
6642
6789
  <t t-name="o-spreadsheet-Icon.SPLIT_TEXT">
@@ -6649,7 +6796,7 @@
6649
6796
  </t>
6650
6797
  <t t-name="o-spreadsheet-Icon.ERROR">
6651
6798
  <div class="o-icon">
6652
- <i class="fa fa-exclamation-circle"/>
6799
+ <i class="oi" data-icon="error"/>
6653
6800
  </div>
6654
6801
  </t>
6655
6802
  <t t-name="o-spreadsheet-Icon.DISPLAY_HEADER">
@@ -6787,7 +6934,7 @@
6787
6934
  </t>
6788
6935
  <t t-name="o-spreadsheet-Icon.INFO">
6789
6936
  <div class="o-icon">
6790
- <i class="fa fa-info"/>
6937
+ <i class="oi" data-icon="info"/>
6791
6938
  </div>
6792
6939
  </t>
6793
6940
  <t t-name="o-spreadsheet-Icon.PIVOT">
@@ -6798,11 +6945,6 @@
6798
6945
  />
6799
6946
  </svg>
6800
6947
  </t>
6801
- <t t-name="o-spreadsheet-Icon.UNUSED_PIVOT_WARNING">
6802
- <div class="o-unused-pivot-icon text-warning" title="This pivot is not used">
6803
- <t t-call="o-spreadsheet-Icon.TRIANGLE_EXCLAMATION"/>
6804
- </div>
6805
- </t>
6806
6948
  <t t-name="o-spreadsheet-Icon.ANGLE_DOWN">
6807
6949
  <div class="o-icon">
6808
6950
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 224 256">
@@ -6882,12 +7024,12 @@
6882
7024
  </t>
6883
7025
  <t t-name="o-spreadsheet-Icon.HIDE_SHEET">
6884
7026
  <div class="o-icon">
6885
- <i class="fa fa-eye-slash"/>
7027
+ <i class="oi" data-icon="visibility_off"/>
6886
7028
  </div>
6887
7029
  </t>
6888
7030
  <t t-name="o-spreadsheet-Icon.DOWNLOAD">
6889
7031
  <div class="o-icon">
6890
- <i class="fa fa-download"/>
7032
+ <i class="oi" data-icon="download"/>
6891
7033
  </div>
6892
7034
  </t>
6893
7035
  <t t-name="o-spreadsheet-Icon.CAROUSEL">
@@ -6932,7 +7074,7 @@
6932
7074
  </t>
6933
7075
  <t t-name="o-spreadsheet-Icon.DARK_MODE">
6934
7076
  <div class="o-icon">
6935
- <i class="fa fa-moon-o"/>
7077
+ <i class="oi" data-icon="dark_mode"/>
6936
7078
  </div>
6937
7079
  </t>
6938
7080
  <t t-name="o-spreadsheet-Icon.ROTATION-0">
@@ -6978,26 +7120,26 @@
6978
7120
  </t>
6979
7121
  <t t-name="o-spreadsheet-Icon.THUMB_TACK">
6980
7122
  <div class="o-icon">
6981
- <i class="fa fa-thumb-tack"/>
7123
+ <i class="oi" data-icon="push_pin"/>
6982
7124
  </div>
6983
7125
  </t>
6984
7126
  <t t-name="o-spreadsheet-Icon.LOCK">
6985
7127
  <div class="o-icon">
6986
- <i class="fa fa-lock"/>
7128
+ <i class="oi" data-icon="lock_f"/>
6987
7129
  </div>
6988
7130
  </t>
6989
7131
  <t t-name="o-spreadsheet-Icon.UNLOCK">
6990
7132
  <div class="o-icon">
6991
- <i class="fa fa-unlock"/>
7133
+ <i class="oi" data-icon="lock_open_f"/>
6992
7134
  </div>
6993
7135
  </t>
6994
7136
  <t t-name="o-spreadsheet-Icon.PRINT">
6995
7137
  <div class="o-icon">
6996
- <i class="fa fa-print"/>
7138
+ <i class="oi" data-icon="print"/>
6997
7139
  </div>
6998
7140
  </t>
6999
7141
  <t t-name="o-spreadsheet-Icon.COLUMN_STATS">
7000
- <svg width="18px" height="18px" viewBox="0 0 512 512">
7142
+ <svg class="o-icon" viewBox="0 0 512 512">
7001
7143
  <path
7002
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"
7003
7145
  fill="currentColor"
@@ -7054,7 +7196,26 @@
7054
7196
  </t>
7055
7197
  <t t-name="o-spreadsheet-Icon.CALCULATOR">
7056
7198
  <div class="o-icon">
7057
- <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"/>
7058
7219
  </div>
7059
7220
  </t>
7060
7221
 
@@ -7397,7 +7558,6 @@
7397
7558
  maxHeight="this.cellPopover.Component.size and this.cellPopover.Component.size.maxHeight"
7398
7559
  maxWidth="this.cellPopover.Component.size and this.cellPopover.Component.size.maxWidth"
7399
7560
  anchorRect="this.cellPopover.anchorRect"
7400
- containerRect="this.env.getPopoverContainerRect()"
7401
7561
  onMouseWheel="this.props.onMouseWheel"
7402
7562
  class="'o-popover-grid-index'">
7403
7563
  <t
@@ -7408,9 +7568,6 @@
7408
7568
  </t>
7409
7569
 
7410
7570
  <t t-name="o-spreadsheet-GridOverlay">
7411
- <div class="position-absolute" t-att-style="this.style">
7412
- <FiguresContainer/>
7413
- </div>
7414
7571
  <div
7415
7572
  t-ref="this.gridOverlayRef"
7416
7573
  class="o-grid-overlay overflow-hidden o-zoomable"
@@ -7421,10 +7578,7 @@
7421
7578
  t-on-click="this.onClick"
7422
7579
  t-on-dblclick.self="this.onDoubleClick"
7423
7580
  t-on-contextmenu.stop.prevent="this.onContextMenu">
7424
- <GridAddRowsFooter
7425
- t-if="!this.env.model.getters.isReadonly()"
7426
- t-key="this.env.model.getters.getActiveSheetId()"
7427
- />
7581
+ <GridAddRowsFooter t-if="this.isFooterVisible" t-key="this.viewStore.displayedSheetId"/>
7428
7582
  <t t-call-slot="default"/>
7429
7583
  </div>
7430
7584
  </t>
@@ -7470,6 +7624,9 @@
7470
7624
  t-on-keydown="this.onKeydown"
7471
7625
  t-on-wheel.prevent="this.onMouseWheel"
7472
7626
  t-ref="this.gridRef">
7627
+ <div class="position-absolute" t-att-style="this.gridOverlayDimensions">
7628
+ <FiguresContainer/>
7629
+ </div>
7473
7630
  <GridOverlay
7474
7631
  onCellClicked.bind="this.onCellClicked"
7475
7632
  onCellDoubleClicked.bind="this.onCellDoubleClicked"
@@ -7479,15 +7636,14 @@
7479
7636
  />
7480
7637
  <HeadersOverlay onOpenContextMenu="(type, x, y) => this.toggleContextMenu(type, x, y)"/>
7481
7638
  <GridComposer
7482
- gridDims="this.env.model.getters.getSheetViewDimensionWithHeaders()"
7639
+ gridDims="this.viewStore.viewports.getSheetViewDimensionWithHeaders()"
7483
7640
  onInputContextMenu.bind="this.onInputContextMenu"
7484
7641
  />
7485
- <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>
7486
7645
  <t t-set="focused" t-value="this.focusedClients"/>
7487
- <t
7488
- t-foreach="this.env.model.getters.getClientsToDisplay()"
7489
- t-as="client"
7490
- t-key="this.getClientPositionKey(client)">
7646
+ <t t-foreach="this.clientsToDisplay" t-as="client" t-key="this.getClientPositionKey(client)">
7491
7647
  <ClientTag
7492
7648
  name="client.name"
7493
7649
  color="client.color"
@@ -7519,7 +7675,7 @@
7519
7675
  onClose="() => this.closeMenu()"
7520
7676
  />
7521
7677
  <t
7522
- t-if="!this.env.model.getters.isReadonly()"
7678
+ t-if="this.displayTableResizer"
7523
7679
  t-foreach="this.staticTables"
7524
7680
  t-as="table"
7525
7681
  t-key="table.id">
@@ -7547,13 +7703,14 @@
7547
7703
  </button>
7548
7704
  <div class="flex-fill">
7549
7705
  <div
7550
- 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"
7551
7707
  tabindex="1"
7552
7708
  t-ref="this.fullScreenFigureRef"
7553
7709
  t-on-click.stop=""
7554
7710
  t-on-keydown="(ev) => this.onKeyDown(ev)">
7555
7711
  <t>
7556
7712
  <t
7713
+ t-if="this.figureUI.width and this.figureUI.height"
7557
7714
  t-component="this.figureComponent"
7558
7715
  figureUI="this.figureUI"
7559
7716
  isFullScreen="true"
@@ -7757,13 +7914,14 @@
7757
7914
 
7758
7915
  <t t-name="o-spreadsheet-ImageFigure">
7759
7916
  <img t-att-src="this.getImagePath" class="w-100 h-100"/>
7760
- <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">
7761
7920
  <div
7762
- class="o-figure-menu-item d-flex-align-items-center"
7763
- t-on-click="this.showMenu"
7921
+ class="o-figure-menu-item d-flex align-items-center justify-content-center rounded p-1"
7764
7922
  t-ref="this.menuButtonRef"
7765
- t-on-contextmenu.prevent.stop="this.showMenu">
7766
- <t t-call="o-spreadsheet-Icon.LIST"/>
7923
+ t-on-click="this.showMenu">
7924
+ <t t-call="o-spreadsheet-Icon.MORE_MENU"/>
7767
7925
  </div>
7768
7926
  </div>
7769
7927
  </t>
@@ -7790,7 +7948,7 @@
7790
7948
  style="this.getFigureStyle(figureUI)"
7791
7949
  class="this.getFigureClass(figureUI)"
7792
7950
  onMouseDown="(ev) => this.startDraggingFigure(figureUI, ev)"
7793
- onClickAnchor="(dirX, dirY, ev) => this.startResize(figureUI, dirX, dirY, ev)"
7951
+ onClickAnchor.bind="this.resizeAllSelectedFigures"
7794
7952
  />
7795
7953
  </t>
7796
7954
  </div>
@@ -7829,15 +7987,12 @@
7829
7987
 
7830
7988
  <t t-name="o-spreadsheet-CarouselFigure">
7831
7989
  <div
7832
- class="o-carousel w-100 h-100 d-flex flex-column"
7990
+ class="o-carousel w-100 h-100 position-relative"
7991
+ t-att-style="this.carouselStyle"
7833
7992
  t-on-dblclick="this.onCarouselDoubleClick">
7834
7993
  <t t-set="selectedItem" t-value="this.selectedCarouselItem"/>
7835
7994
  <div
7836
- class="o-carousel-header d-flex align-items-baseline flex-shrink-0 pe-1 pe-auto"
7837
- t-att-class="{
7838
- 'border-bottom': this.env.model.getters.isDashboard(),
7839
- 'o-carousel-header-floating': !this.env.model.getters.isDashboard() and selectedItem?.type === 'carouselDataView',
7840
- }"
7995
+ class="o-carousel-header d-flex align-items-baseline position-absolute"
7841
7996
  t-att-style="this.headerStyle">
7842
7997
  <div
7843
7998
  class="o-carousel-title text-truncate flex-shrink-0 pe-2"
@@ -7848,9 +8003,13 @@
7848
8003
  <div
7849
8004
  class="o-carousel-tabs d-flex flex-fill justify-content-end"
7850
8005
  t-ref="this.carouselTabsRef">
7851
- <t t-foreach="this.visibleCarouselItems" t-as="item" t-key="item_index">
8006
+ <t
8007
+ t-foreach="this.carousel.items"
8008
+ t-as="item"
8009
+ t-key="item_index"
8010
+ t-if="this.carousel.items.length > 1">
7852
8011
  <div
7853
- 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"
7854
8013
  t-att-class="{ 'selected': this.isItemSelected(item) }"
7855
8014
  t-att-data-type="item.type"
7856
8015
  t-out="this.getItemTitle(item)"
@@ -7859,11 +8018,13 @@
7859
8018
  </t>
7860
8019
  </div>
7861
8020
  <div
7862
- 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"
7863
8022
  t-att-class="{'active': this.menuState.isOpen}"
7864
8023
  t-ref="this.carouselTabsDropdownRef"
7865
8024
  t-on-click="this.toggleMenu">
7866
- <div class="fa fa-angle-down"/>
8025
+ <div class="o-icon">
8026
+ <i class="oi" data-icon="keyboard_arrow_down"/>
8027
+ </div>
7867
8028
  <MenuPopover
7868
8029
  t-if="this.menuState.isOpen"
7869
8030
  menuId="this.menuId"
@@ -7876,28 +8037,32 @@
7876
8037
  <div
7877
8038
  t-if="this.env.model.getters.isDashboard()"
7878
8039
  t-att-title="this.fullScreenButtonTitle"
7879
- class="o-carousel-full-screen-button fa o-carousel-button rounded p-1 ms-1"
7880
- t-att-class="{
7881
- 'fa-compress': this.props.isFullScreen,
7882
- 'fa-expand': !this.props.isFullScreen,
7883
- 'invisible': this.selectedCarouselItem?.type !== 'chart',
7884
- }"
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'"
7885
8042
  t-on-click="this.toggleFullScreen"
7886
8043
  />
7887
8044
  <div
7888
8045
  t-if="!this.env.model.getters.isDashboard()"
7889
- class="o-carousel-menu-button o-carousel-button fa fa-ellipsis-v rounded ms-1"
7890
- t-on-click="this.openContextMenu"
7891
- />
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>
7892
8050
  </div>
8051
+ <div
8052
+ t-if="this.separatorStyle"
8053
+ class="o-carousel-separator position-absolute"
8054
+ t-att-style="this.separatorStyle"
8055
+ />
7893
8056
  <div
7894
8057
  t-if="!selectedItem"
7895
- class="o-carousel-empty 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">
7896
8060
  <t t-call="o-spreadsheet-Icon.CAROUSEL"/>
7897
8061
  </div>
7898
8062
  <div
7899
8063
  t-elif="selectedItem.type === 'chart'"
7900
- class="o-carousel-content w-100 flex-fill position-relative">
8064
+ class="o-carousel-content position-absolute"
8065
+ t-att-style="this.contentStyle">
7901
8066
  <div
7902
8067
  class="o-chart-container w-100 h-100"
7903
8068
  t-on-dblclick.stop="this.onCarouselChartDoubleClick">
@@ -7915,23 +8080,34 @@
7915
8080
  t-key="selectedItem.chartId"
7916
8081
  />
7917
8082
  </div>
8083
+ <div
8084
+ t-elif="selectedItem.type === 'carouselDataView' and selectedItem.range"
8085
+ class="o-carousel-content position-absolute overflow-hidden"
8086
+ t-att-style="this.contentStyle">
8087
+ <StandaloneViewport
8088
+ range="this.removeEmptyHeadersFromRange(selectedItem.range)"
8089
+ columnWeights="selectedItem.columnWeights"
8090
+ canResizeColumns="this.canResizeDataViewColumns"
8091
+ onResizeColumns.bind="this.onResizeColumns"
8092
+ size="this.carouselLayout.contentRect"
8093
+ />
8094
+ </div>
7918
8095
  </div>
7919
8096
  </t>
7920
8097
 
7921
8098
  <t t-name="o-spreadsheet-FigureComponent">
7922
8099
  <div
7923
- class="o-figure-wrapper os-theme-dependant"
7924
- t-att-class="{'o-figure-selected': this.isSelected}"
7925
- t-att-style="this.wrapperStyle"
7926
- t-ref="this.figureWrapperRef">
8100
+ class="o-figure-wrapper"
8101
+ t-att-class="{'o-figure-selected': this.isSelected, 'os-theme-dependant': this.isThemeDependant}"
8102
+ t-att-style="this.wrapperStyle">
7927
8103
  <div
7928
- class="o-figure w-100 h-100"
7929
- t-att-class="this.props.class"
8104
+ class="o-figure w-100 h-100 overflow-hidden"
8105
+ t-att-class="this.figureClass"
7930
8106
  t-on-pointerdown.stop="(ev) => this.onMouseDown(ev)"
7931
8107
  t-on-click="this.onClick"
7932
8108
  t-on-contextmenu.prevent.stop="(ev) => !this.env.model.getters.isReadonly() and this.onContextMenu(ev)"
7933
8109
  t-ref="this.figureRef"
7934
- t-att-style="this.props.style"
8110
+ t-att-style="this.figureStyle"
7935
8111
  t-att-data-id="this.props.figureUI.id"
7936
8112
  tabindex="0"
7937
8113
  t-on-keydown.stop="(ev) => this.onKeyDown(ev)"
@@ -7940,7 +8116,6 @@
7940
8116
  t-component="this.figureRegistry.get(this.props.figureUI.tag).Component"
7941
8117
  t-key="this.props.figureUI.id"
7942
8118
  figureUI="this.props.figureUI"
7943
- editFigureStyle.bind="this.editWrapperStyle"
7944
8119
  openContextMenu.bind="this.openContextMenu"
7945
8120
  />
7946
8121
  <MenuPopover
@@ -7951,31 +8126,11 @@
7951
8126
  onClose="() => this.menuState.isOpen=false"
7952
8127
  popoverPositioning="'bottom-left'"
7953
8128
  />
7954
- <div
7955
- t-if="!this.env.model.getters.isDashboard()"
7956
- class="position-absolute top-0 start-0 pe-none w-100 h-100">
7957
- <div
7958
- class="o-figure-border pe-auto w-100 h-0 position-absolute pb-2"
7959
- t-att-class="{'o-selected': this.isSelected}"
7960
- t-att-style="this.getBorderStyle('top')"
7961
- />
7962
- <div
7963
- class="o-figure-border pe-auto h-100 position-absolute start-0 ps-2"
7964
- t-att-class="{'o-selected': this.isSelected}"
7965
- t-att-style="this.getBorderStyle('left')"
7966
- />
7967
- <div
7968
- class="o-figure-border pe-auto w-100 position-absolute bottom-0 pt-2"
7969
- t-att-class="{'o-selected': this.isSelected}"
7970
- t-att-style="this.getBorderStyle('bottom')"
7971
- />
7972
- <div
7973
- class="o-figure-border pe-auto h-100 position-absolute end-0 pe-2"
7974
- t-att-class="{'o-selected': this.isSelected}"
7975
- t-att-style="this.getBorderStyle('right')"
7976
- />
7977
- </div>
7978
8129
  </div>
8130
+ <div
8131
+ t-if="this.isSelected"
8132
+ class="o-figure-selection-border position-absolute pe-none w-100 h-100"
8133
+ />
7979
8134
  <t t-if="this.isFigureResizable">
7980
8135
  <div
7981
8136
  class="o-fig-anchor o-top pe-auto"
@@ -8036,7 +8191,7 @@
8036
8191
  <t t-name="o-spreadsheet-ChartMenu">
8037
8192
  <div class="o-chart-menu position-absolute top-0 end-0" t-on-click.stop="">
8038
8193
  <div class="d-flex align-items-center gap-1 p-1 rounded" t-att-style="backgroundColor">
8039
- <t t-if="this.regionOptions.length > 1">
8194
+ <t t-if="this.env.model.getters.isDashboard() and this.regionOptions.length > 1">
8040
8195
  <Select
8041
8196
  class="'o-chart-menu-item w-auto py-0 px-1 text-muted text-nowrap rounded border-0'"
8042
8197
  popoverClass="'w-auto'"
@@ -8047,7 +8202,7 @@
8047
8202
  </t>
8048
8203
  <t t-foreach="this.getMenuItems()" t-as="item" t-key="item.id">
8049
8204
  <div
8050
- 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"
8051
8206
  t-att-title="item.label"
8052
8207
  t-on-click="item.onClick"
8053
8208
  t-att-data-id="item.id">
@@ -8055,10 +8210,11 @@
8055
8210
  </div>
8056
8211
  </t>
8057
8212
  <t t-if="this.isMenuAvailable()">
8058
- <button
8059
- class="o-chart-menu-item btn text-muted lh-1 p-1 fa fa-ellipsis-v"
8060
- t-on-click="this.openContextMenu"
8061
- />
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>
8062
8218
  </t>
8063
8219
  </div>
8064
8220
  <InfoPopover
@@ -8156,10 +8312,12 @@
8156
8312
  </t>
8157
8313
 
8158
8314
  <t t-name="o-spreadsheet-SpreadsheetDashboard">
8159
- <div
8160
- class="o-dashboard-background position-absolute w-100 h-100 z-0 os-theme-dependant"
8161
- t-att-style="this.backgroundStyle"
8162
- />
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>
8163
8321
  <div
8164
8322
  class="o-grid o-dashboard-grid o-two-columns o-zoomable z-1"
8165
8323
  tabindex="-1"
@@ -8169,24 +8327,13 @@
8169
8327
  class="mx-auto h-100 position-relative"
8170
8328
  t-ref="this.gridRef"
8171
8329
  t-att-style="this.gridContainer">
8330
+ <div class="position-absolute" t-att-style="this.gridOverlayDimensions">
8331
+ <FiguresContainer/>
8332
+ </div>
8172
8333
  <GridOverlay
8173
8334
  onGridResized.bind="this.onGridResized"
8174
8335
  gridOverlayDimensions="this.gridOverlayDimensions">
8175
- <div
8176
- t-foreach="this.getClickableCells()"
8177
- t-as="clickableCell"
8178
- t-key="clickableCell_index"
8179
- class="o-dashboard-clickable-cell"
8180
- t-att-title="clickableCell.title"
8181
- t-on-click="(ev) => this.selectClickableCell(ev, clickableCell)"
8182
- t-on-auxclick="(ev) => this.selectClickableCell(ev, clickableCell)"
8183
- t-att-style="this.getCellClickableStyle(clickableCell.coordinates)">
8184
- <t
8185
- t-if="clickableCell.component"
8186
- t-component="clickableCell.component"
8187
- t-props="clickableCell.componentProps"
8188
- />
8189
- </div>
8336
+ <ClickableCellsOverlay/>
8190
8337
  </GridOverlay>
8191
8338
  <canvas t-ref="this.canvasRef" class="os-theme-dependant"/>
8192
8339
  <GridPopover
@@ -8361,9 +8508,9 @@
8361
8508
  t-on-click.stop="this.openAssistant"
8362
8509
  t-on-pointerdown.prevent.stop=""
8363
8510
  t-on-pointerup.stop=""
8364
- class="fa-stack position-absolute translate-middle force-open-assistant fs-4">
8365
- <i class="fa fa-circle fa-stack-1x fa-inverse"/>
8366
- <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"/>
8367
8514
  </span>
8368
8515
  <div
8369
8516
  class="o-composer w-100 text-start"
@@ -8404,9 +8551,9 @@
8404
8551
  role="button"
8405
8552
  t-on-click="this.closeAssistant"
8406
8553
  t-on-pointerdown.prevent.stop=""
8407
- class="fa-stack position-absolute top-0 start-100 translate-middle fs-4">
8408
- <i class="fa fa-circle fa-stack-1x fa-inverse"/>
8409
- <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"/>
8410
8557
  </span>
8411
8558
  <div class="o-composer-assistant overflow-auto" t-att-style="this.assistantStyle">
8412
8559
  <FunctionDescriptionProvider
@@ -8553,7 +8700,7 @@
8553
8700
  class="eyedropper d-flex align-items-center justify-content-center rounded-circle"
8554
8701
  t-if="this.canUseEyeDropper"
8555
8702
  t-on-click.stop="this.activateEyedropper">
8556
- <i class="fa fa-eyedropper"/>
8703
+ <i class="oi" data-icon="colorize"/>
8557
8704
  </div>
8558
8705
  </div>
8559
8706
  <div t-if="this.state.showGradient" class="o-custom-selector">
@@ -8614,6 +8761,24 @@
8614
8761
  />
8615
8762
  </t>
8616
8763
 
8764
+ <t t-name="o-spreadsheet-ClickableCellsOverlay">
8765
+ <div
8766
+ t-foreach="this.getClickableCells()"
8767
+ t-as="clickableCell"
8768
+ t-key="clickableCell_index"
8769
+ class="o-dashboard-clickable-cell"
8770
+ t-att-title="clickableCell.title"
8771
+ t-on-click="(ev) => this.selectClickableCell(ev, clickableCell)"
8772
+ t-on-auxclick="(ev) => this.selectClickableCell(ev, clickableCell)"
8773
+ t-att-style="this.getCellClickableStyle(clickableCell.coordinates)">
8774
+ <t
8775
+ t-if="clickableCell.component"
8776
+ t-component="clickableCell.component"
8777
+ t-props="clickableCell.componentProps"
8778
+ />
8779
+ </div>
8780
+ </t>
8781
+
8617
8782
  <t t-name="o-spreadsheet-BottomBar">
8618
8783
  <div
8619
8784
  class="o-spreadsheet-bottom-bar o-two-columns d-flex flex-fill align-items-center overflow-hidden border-top"
@@ -8712,16 +8877,24 @@
8712
8877
 
8713
8878
  <t t-name="o-spreadsheet-BottomBarStatistic">
8714
8879
  <t t-set="selectedStatistic" t-value="this.getSelectedStatistic()"/>
8715
- <Ripple class="'ms-auto bottom-statistics'" t-if="selectedStatistic !== undefined">
8716
- <div
8717
- class="o-selection-statistic text-truncate user-select-none me-4 bg-white rounded shadow d-flex align-items-center"
8718
- t-on-click="this.listSelectionStatistics">
8719
- <t t-out="selectedStatistic"/>
8720
- <span class="ms-2">
8721
- <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
8722
- </span>
8723
- </div>
8724
- </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>
8725
8898
  </t>
8726
8899
 
8727
8900
  <t t-name="o-spreadsheet-BottomBarSheet">
@@ -8739,7 +8912,7 @@
8739
8912
  t-att-title="this.sheetName"
8740
8913
  t-att-data-id="this.props.sheetId"
8741
8914
  t-att-class="{active: this.isSheetActive}">
8742
- <span t-if="this.isSheetLocked" class="me-1">
8915
+ <span t-if="this.isSheetLocked" class="me-1 lock-icon">
8743
8916
  <t t-call="o-spreadsheet-Icon.LOCK"/>
8744
8917
  </span>
8745
8918
  <span