@odoo/o-spreadsheet 19.5.0-alpha.0 → 19.5.0-alpha.10

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 (177) hide show
  1. package/dist/o_spreadsheet.cjs +54635 -52850
  2. package/dist/o_spreadsheet.css +95 -44
  3. package/dist/o_spreadsheet.esm.js +54380 -52595
  4. package/dist/o_spreadsheet.iife.js +54407 -52622
  5. package/dist/o_spreadsheet.min.iife.js +403 -403
  6. package/dist/o_spreadsheet.xml +290 -167
  7. package/dist/types/actions/action.d.ts +1 -7
  8. package/dist/types/actions/data_actions.d.ts +1 -0
  9. package/dist/types/actions/menu_items_actions.d.ts +2 -0
  10. package/dist/types/clipboard_handlers/default_clipboard.d.ts +1 -1
  11. package/dist/types/collaborative/ot/ot_helpers.d.ts +3 -1
  12. package/dist/types/components/autofill/autofill.d.ts +3 -0
  13. package/dist/types/{plugins/ui_feature/autofill.d.ts → components/autofill/autofill_store.d.ts} +7 -12
  14. package/dist/types/components/autofill/table_autofill_store.d.ts +6 -0
  15. package/dist/types/components/border_editor/border_editor_widget.d.ts +1 -0
  16. package/dist/types/components/clickable_cells_overlay/clickable_cells_overlay.d.ts +20 -0
  17. package/dist/types/components/collaborative_client_tag/collaborative_client_tag.d.ts +2 -0
  18. package/dist/types/components/composer/composer/abstract_composer_store.d.ts +3 -2
  19. package/dist/types/components/composer/composer/composer.d.ts +2 -1
  20. package/dist/types/components/composer/grid_composer/grid_composer.d.ts +1 -0
  21. package/dist/types/components/dashboard/clickable_cell_store.d.ts +1 -0
  22. package/dist/types/components/dashboard/dashboard.d.ts +7 -12
  23. package/dist/types/components/error_tooltip/error_tooltip.d.ts +2 -0
  24. package/dist/types/components/figures/chart/chartJs/chartjs_geo_projection_plugin.d.ts +12 -0
  25. package/dist/types/components/figures/chart/gauge/gauge_chart_component.d.ts +1 -0
  26. package/dist/types/components/figures/chart/scorecard/chart_scorecard.d.ts +3 -0
  27. package/dist/types/components/figures/figure/figure.d.ts +8 -9
  28. package/dist/types/components/figures/figure_carousel/figure_carousel.d.ts +7 -2
  29. package/dist/types/components/figures/figure_chart/figure_chart.d.ts +1 -2
  30. package/dist/types/components/figures/figure_container/figure_container.d.ts +4 -2
  31. package/dist/types/components/figures/figure_image/figure_image.d.ts +1 -2
  32. package/dist/types/components/filters/filter_menu/filter_menu.d.ts +1 -0
  33. package/dist/types/components/grid/grid.d.ts +8 -0
  34. package/dist/types/components/grid_add_rows_footer/grid_add_rows_footer.d.ts +1 -0
  35. package/dist/types/components/grid_overlay/grid_overlay.d.ts +6 -4
  36. package/dist/types/components/grid_popover/grid_popover.d.ts +1 -0
  37. package/dist/types/components/header_group/header_group_container.d.ts +2 -0
  38. package/dist/types/components/headers_overlay/headers_overlay.d.ts +3 -0
  39. package/dist/types/components/headers_overlay/unhide_headers.d.ts +4 -0
  40. package/dist/types/components/helpers/dom_helpers.d.ts +2 -0
  41. package/dist/types/components/helpers/figure_snap_helper.d.ts +3 -3
  42. package/dist/types/components/helpers/wheel_hook.d.ts +1 -1
  43. package/dist/types/components/helpers/zoom.d.ts +1 -5
  44. package/dist/types/components/highlight/border/border.d.ts +2 -0
  45. package/dist/types/components/highlight/corner/corner.d.ts +1 -0
  46. package/dist/types/components/highlight/highlight/highlight.d.ts +3 -0
  47. package/dist/types/components/link/link_display/link_display.d.ts +1 -0
  48. package/dist/types/components/link/link_editor/link_editor.d.ts +1 -0
  49. package/dist/types/components/paint_format_button/paint_format_store.d.ts +1 -1
  50. package/dist/types/components/popover/cell_popover_store.d.ts +2 -1
  51. package/dist/types/components/props_validation.d.ts +7 -7
  52. package/dist/types/components/scrollbar/scrollbar_horizontal.d.ts +3 -0
  53. package/dist/types/components/scrollbar/scrollbar_vertical.d.ts +5 -1
  54. package/dist/types/components/selection_input/selection_input_store.d.ts +1 -1
  55. package/dist/types/components/side_panel/carousel_panel/carousel_panel.d.ts +20 -2
  56. package/dist/types/components/side_panel/chart/building_blocks/chart_title/chart_title.d.ts +1 -0
  57. package/dist/types/components/side_panel/chart/chart_type_picker/chart_type_picker.d.ts +5 -18
  58. package/dist/types/components/side_panel/chart/chart_type_picker_popover/chart_type_picker_popover.d.ts +64 -0
  59. package/dist/types/components/side_panel/chart/common.d.ts +1 -1
  60. package/dist/types/components/side_panel/conditional_formatting/cf_editor/cell_is_rule_editor.d.ts +1 -1
  61. package/dist/types/components/side_panel/conditional_formatting/cf_editor/color_scale_rule_editor.d.ts +1 -1
  62. package/dist/types/components/side_panel/conditional_formatting/cf_editor/color_scale_rule_editor_threshold.d.ts +1 -1
  63. package/dist/types/components/side_panel/conditional_formatting/cf_editor/data_bar_rule_editor.d.ts +1 -1
  64. package/dist/types/components/side_panel/conditional_formatting/cf_editor/icon_set_rule_editor.d.ts +1 -1
  65. package/dist/types/components/side_panel/criterion_form/calendar_button/calendar_button.d.ts +13 -0
  66. package/dist/types/components/side_panel/criterion_form/date_criterion/date_criterion.d.ts +2 -0
  67. package/dist/types/components/side_panel/criterion_form/double_input_criterion/double_input_criterion.d.ts +3 -0
  68. package/dist/types/components/side_panel/data_sources_cleanup/data_sources_cleanup.d.ts +28 -0
  69. package/dist/types/components/side_panel/data_sources_cleanup/data_sources_cleanup_store.d.ts +13 -0
  70. package/dist/types/components/side_panel/find_and_replace/find_and_replace_store.d.ts +1 -0
  71. package/dist/types/components/side_panel/pivot/pivot_layout_configurator/pivot_layout_configurator.d.ts +0 -2
  72. package/dist/types/components/side_panel/pivot/pivot_side_panel/pivot_side_panel_store.d.ts +1 -0
  73. package/dist/types/components/side_panel/remove_duplicates/remove_duplicates.d.ts +3 -10
  74. package/dist/types/components/side_panel/side_panel/side_panel_store.d.ts +1 -1
  75. package/dist/types/components/side_panel/split_to_columns_panel/split_to_columns_panel.d.ts +4 -11
  76. package/dist/types/components/side_panel/split_to_columns_panel/split_to_columns_store.d.ts +33 -0
  77. package/dist/types/components/small_bottom_bar/small_bottom_bar.d.ts +1 -0
  78. package/dist/types/components/spreadsheet/spreadsheet.d.ts +2 -0
  79. package/dist/types/components/standalone_grid_canvas/standalone_grid_canvas.d.ts +2 -1
  80. package/dist/types/components/standalone_viewport/standalone_viewport.d.ts +56 -0
  81. package/dist/types/components/standalone_viewport/standalone_viewport_store.d.ts +28 -0
  82. package/dist/types/components/tables/hovered_table_store.d.ts +3 -6
  83. package/dist/types/components/tables/table_resizer/table_resizer.d.ts +1 -0
  84. package/dist/types/components/top_bar/zoom_editor/zoom_editor.d.ts +2 -1
  85. package/dist/types/constants.d.ts +4 -0
  86. package/dist/types/formulas/code_builder.d.ts +2 -1
  87. package/dist/types/formulas/compiler.d.ts +7 -0
  88. package/dist/types/functions/create_compute_function.d.ts +4 -3
  89. package/dist/types/functions/function_registry.d.ts +1 -5
  90. package/dist/types/functions/helper_matrices.d.ts +1 -0
  91. package/dist/types/functions/helper_statistical.d.ts +6 -0
  92. package/dist/types/functions/module_array.d.ts +41 -23
  93. package/dist/types/functions/module_database.d.ts +18 -6
  94. package/dist/types/functions/module_date.d.ts +70 -22
  95. package/dist/types/functions/module_engineering.d.ts +3 -1
  96. package/dist/types/functions/module_filter.d.ts +2 -2
  97. package/dist/types/functions/module_financial.d.ts +105 -35
  98. package/dist/types/functions/module_info.d.ts +33 -11
  99. package/dist/types/functions/module_logical.d.ts +16 -8
  100. package/dist/types/functions/module_lookup.d.ts +23 -15
  101. package/dist/types/functions/module_math.d.ts +125 -43
  102. package/dist/types/functions/module_operators.d.ts +7 -3
  103. package/dist/types/functions/module_statistical.d.ts +78 -22
  104. package/dist/types/functions/module_text.d.ts +70 -24
  105. package/dist/types/functions/module_web.d.ts +3 -1
  106. package/dist/types/helpers/carousel_helpers.d.ts +8 -3
  107. package/dist/types/helpers/figures/chart.d.ts +2 -0
  108. package/dist/types/helpers/figures/charts/chart_common.d.ts +0 -2
  109. package/dist/types/helpers/figures/charts/scorecard_chart_config_builder.d.ts +2 -0
  110. package/dist/types/helpers/figures/figure/figure.d.ts +3 -2
  111. package/dist/types/helpers/internal_viewport.d.ts +20 -10
  112. package/dist/types/helpers/misc.d.ts +2 -0
  113. package/dist/types/helpers/pivot/pivot_helpers.d.ts +2 -2
  114. package/dist/types/helpers/pivot/pivot_highlight.d.ts +2 -2
  115. package/dist/types/helpers/rectangle.d.ts +4 -0
  116. package/dist/types/helpers/text_helper.d.ts +6 -1
  117. package/dist/types/helpers/ui/split_to_columns_interactive.d.ts +1 -1
  118. package/dist/types/helpers/viewport_collection.d.ts +51 -21
  119. package/dist/types/helpers/zones.d.ts +1 -0
  120. package/dist/types/index.d.ts +29 -3
  121. package/dist/types/model.d.ts +1 -0
  122. package/dist/types/plugins/core/carousel.d.ts +8 -4
  123. package/dist/types/plugins/core/cell.d.ts +1 -0
  124. package/dist/types/plugins/core/chart.d.ts +2 -0
  125. package/dist/types/plugins/core/conditional_format.d.ts +2 -0
  126. package/dist/types/plugins/core/data_validation.d.ts +2 -0
  127. package/dist/types/plugins/core/formulas_provider.d.ts +8 -0
  128. package/dist/types/plugins/core/pivot.d.ts +1 -0
  129. package/dist/types/plugins/core/squisher.d.ts +1 -0
  130. package/dist/types/plugins/core_plugin.d.ts +7 -3
  131. package/dist/types/plugins/ui_core_views/cell_evaluation/evaluation_plugin.d.ts +10 -3
  132. package/dist/types/plugins/ui_core_views/pivot_ui.d.ts +3 -0
  133. package/dist/types/plugins/ui_feature/collaborative.d.ts +2 -1
  134. package/dist/types/plugins/ui_feature/ui_options.d.ts +1 -7
  135. package/dist/types/plugins/ui_feature/ui_sheet.d.ts +2 -1
  136. package/dist/types/plugins/ui_stateful/carousel_ui.d.ts +2 -2
  137. package/dist/types/plugins/{ui_feature → ui_stateful}/figure.d.ts +4 -0
  138. package/dist/types/plugins/ui_stateful/filter_evaluation.d.ts +2 -3
  139. package/dist/types/plugins/ui_stateful/header_positions.d.ts +2 -1
  140. package/dist/types/registries/chart_registry.d.ts +3 -0
  141. package/dist/types/registries/data_source_registry.d.ts +15 -0
  142. package/dist/types/registries/figures_registry.d.ts +4 -1
  143. package/dist/types/store_engine/dependency_container.d.ts +5 -0
  144. package/dist/types/store_engine/store_hooks.d.ts +6 -0
  145. package/dist/types/store_engine/store_registries.d.ts +4 -0
  146. package/dist/types/stores/array_formula_highlight.d.ts +1 -1
  147. package/dist/types/{plugins/ui_feature/automatic_sum.d.ts → stores/automatic_sum_store.d.ts} +5 -4
  148. package/dist/types/stores/checkbox_toggle.d.ts +9 -0
  149. package/dist/types/stores/client_focus_store.d.ts +1 -0
  150. package/dist/types/stores/data_cleanup_store.d.ts +31 -0
  151. package/dist/types/stores/main_viewport_store.d.ts +11 -0
  152. package/dist/types/stores/spreadsheet_store.d.ts +1 -1
  153. package/dist/types/stores/table_resize_store.d.ts +6 -0
  154. package/dist/types/stores/trim_whitespace_store.d.ts +9 -0
  155. package/dist/types/stores/viewports_store.d.ts +87 -0
  156. package/dist/types/stores/zoom_store.d.ts +14 -0
  157. package/dist/types/types/chart/radar_chart.d.ts +1 -1
  158. package/dist/types/types/chart/scorecard_chart.d.ts +2 -0
  159. package/dist/types/types/commands.d.ts +25 -58
  160. package/dist/types/types/core_getters.d.ts +3 -1
  161. package/dist/types/types/figure.d.ts +26 -3
  162. package/dist/types/types/functions.d.ts +14 -4
  163. package/dist/types/types/getters.d.ts +28 -11
  164. package/dist/types/types/misc.d.ts +19 -1
  165. package/dist/types/types/range.d.ts +1 -0
  166. package/dist/types/types/rendering.d.ts +1 -0
  167. package/dist/types/types/store_engine.d.ts +10 -3
  168. package/package.json +2 -2
  169. package/dist/types/plugins/ui_feature/checkbox_toggle.d.ts +0 -9
  170. package/dist/types/plugins/ui_feature/data_cleanup.d.ts +0 -16
  171. package/dist/types/plugins/ui_feature/split_to_columns.d.ts +0 -21
  172. package/dist/types/plugins/ui_feature/table_autofill.d.ts +0 -6
  173. package/dist/types/plugins/ui_feature/table_resize_ui.d.ts +0 -6
  174. package/dist/types/plugins/ui_stateful/sheetview.d.ts +0 -123
  175. /package/dist/types/plugins/{ui_feature → ui_stateful}/cell_computed_style.d.ts +0 -0
  176. /package/dist/types/plugins/{ui_feature → ui_stateful}/header_visibility_ui.d.ts +0 -0
  177. /package/dist/types/plugins/{ui_feature → ui_stateful}/table_computed_style.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.0
5
- @date 2026-06-29T09:01:27.380Z
6
- @hash 2437c0b
4
+ @version 19.5.0-alpha.10
5
+ @date 2026-08-10T12:33:48.249Z
6
+ @hash 39a6fbc
7
7
  -->
8
8
  <odoo>
9
9
  <t t-name="o-spreadsheet-ValidationMessages">
@@ -432,6 +432,49 @@
432
432
  />
433
433
  </t>
434
434
 
435
+ <t t-name="o-spreadsheet-StandaloneViewport">
436
+ <div
437
+ class="o-standalone-viewport h-100 w-100 overflow-hidden d-flex"
438
+ t-on-wheel="this.onMouseWheel">
439
+ <div
440
+ class="o-standalone-viewport-content position-relative flex-grow-1 overflow-hidden"
441
+ t-ref="this.containerRef">
442
+ <GridOverlay
443
+ onCellDoubleClicked.bind="this.onCellDoubleClicked"
444
+ onGridResized="() => {}"
445
+ hasFooter="false"
446
+ gridOverlayDimensions="this.gridOverlayDimensions">
447
+ <div
448
+ t-if="this.props.canResizeColumns"
449
+ t-foreach="this.colResizers"
450
+ t-as="colResizer"
451
+ t-key="colResizer_index"
452
+ class="o-col-resizer h-100"
453
+ t-att-class="{ 'dragging': this.dndState.col === colResizer.col }"
454
+ t-att-style="colResizer.style"
455
+ t-on-pointerdown.stop="(ev) => this.onResizerPointerDown(ev, colResizer)"
456
+ t-on-dblclick.stop="(ev) => this.onResizerDoubleClick(ev, colResizer)">
457
+ <div class="o-col-resizer-handle position-absolute h-100"/>
458
+ </div>
459
+
460
+ <ClickableCellsOverlay t-if="this.env.model.getters.isDashboard()"/>
461
+ </GridOverlay>
462
+ <GridPopover
463
+ gridRect="this.getGridRect()"
464
+ onMouseWheel.bind="this.onMouseWheel"
465
+ onClosePopover="() => this.cellPopoverStore.close()"
466
+ />
467
+ <canvas class="" t-ref="this.canvasRef"/>
468
+ </div>
469
+ <div
470
+ class="position-relative"
471
+ t-if="this.hasVerticalScrollBar"
472
+ t-att-style="this.scrollBarContainerStyle">
473
+ <VerticalScrollBar hasFooter="false"/>
474
+ </div>
475
+ </div>
476
+ </t>
477
+
435
478
  <t t-name="o-spreadsheet-StandaloneGridCanvas">
436
479
  <canvas t-ref="this.canvasRef"/>
437
480
  </t>
@@ -810,22 +853,22 @@
810
853
  <Select
811
854
  class="'mb-3'"
812
855
  values="this.separators"
813
- selectedValue="this.state.separatorValue"
856
+ selectedValue="this.store.separatorValue"
814
857
  onChange.bind="this.onSeparatorChange"
815
858
  />
816
859
 
817
860
  <input
818
861
  class="o-input mb-3"
819
862
  type="text"
820
- t-if="this.state.separatorValue === 'custom'"
821
- t-att-value="this.state.customSeparator"
863
+ t-if="this.store.separatorValue === 'custom'"
864
+ t-att-value="this.store.customSeparator"
822
865
  t-on-input="this.updateCustomSeparator"
823
866
  placeholder="Add any characters or symbol"
824
867
  />
825
868
 
826
869
  <t t-set="addColumnsLabel">Add new columns to avoid overwriting cells</t>
827
870
  <Checkbox
828
- value="this.state.addNewColumns"
871
+ value="this.store.addNewColumns"
829
872
  label="addColumnsLabel"
830
873
  onChange.bind="this.updateAddNewColumnsCheckbox"
831
874
  />
@@ -979,7 +1022,7 @@
979
1022
  <t t-set="dataHasHeaderLabel">Data has header row</t>
980
1023
  <Checkbox
981
1024
  name="'dataHasHeader'"
982
- value="this.state.hasHeader"
1025
+ value="this.dataCleanupSore.hasHeader"
983
1026
  label="dataHasHeaderLabel"
984
1027
  onChange.bind="this.toggleHasHeader"
985
1028
  />
@@ -994,9 +1037,9 @@
994
1037
  onChange.bind="this.toggleAllColumns"
995
1038
  />
996
1039
 
997
- <t t-foreach="Object.keys(this.state.columns)" t-as="colIndex" t-key="colIndex">
1040
+ <t t-foreach="Object.keys(this.dataCleanupSore.columns)" t-as="colIndex" t-key="colIndex">
998
1041
  <Checkbox
999
- value="this.state.columns[colIndex]"
1042
+ value="this.dataCleanupSore.columns[colIndex]"
1000
1043
  label="this.getColLabel(colIndex)"
1001
1044
  onChange="() => this.toggleColumn(colIndex)"
1002
1045
  />
@@ -1473,7 +1516,7 @@
1473
1516
  />
1474
1517
  </t>
1475
1518
  <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="">
1519
+ <div class="d-flex flex-column py-2 px-2 w-100">
1477
1520
  <StandaloneComposer
1478
1521
  onConfirm.bind="this.updateMeasureFormula"
1479
1522
  composerContent="measure.computedBy.formula"
@@ -1552,7 +1595,7 @@
1552
1595
  />
1553
1596
  <span t-else="1" class="o-fw-bold text-truncate" t-out="this.dimensionDisplayName"/>
1554
1597
  </div>
1555
- <div class="d-flex flex-rows" t-on-pointerdown.stop="">
1598
+ <div class="d-flex flex-rows">
1556
1599
  <t t-call-slot="upper-right-icons"/>
1557
1600
  <i
1558
1601
  class="o-button-icon fa fa-trash pe-1 ps-2"
@@ -1661,9 +1704,7 @@
1661
1704
  t-as="group"
1662
1705
  t-key="group_index"
1663
1706
  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="">
1707
+ <div class="d-flex align-items-center justify-content-between small">
1667
1708
  <TextInput
1668
1709
  value="group.name"
1669
1710
  onChange="(newName) => this.onRenameGroup(group_index, newName)"
@@ -2124,6 +2165,34 @@
2124
2165
  </div>
2125
2166
  </t>
2126
2167
 
2168
+ <t t-name="o-spreadsheet-DataSourcesCleanup">
2169
+ <div class="o-data-source-cleanup">
2170
+ <Section
2171
+ t-foreach="this.store.unusedDataSourcesCategories"
2172
+ t-as="category"
2173
+ t-key="category.type"
2174
+ title="category.label">
2175
+ <t t-foreach="category.dataSources" t-as="dataSource" t-key="dataSource_index">
2176
+ <Checkbox
2177
+ name="dataSource.id"
2178
+ label="dataSource.label"
2179
+ value="this.isDataSourceChecked(category.type, dataSource.id)"
2180
+ onChange="(checked) => this.onToggleDataSource(category.type, dataSource.id, checked)"
2181
+ className="'mb-2'"
2182
+ />
2183
+ </t>
2184
+ <div t-if="!category.dataSources.length" class="w-100 d-flex fst-italic text-muted">
2185
+ No unused data source in this category.
2186
+ </div>
2187
+ </Section>
2188
+ <Section t-if="this.dataSourcesToDelete.length" class="'pt-0'">
2189
+ <button class="o-button o-button-danger" t-on-click="this.onRemoveUnusedDataSources">
2190
+ Delete selected items
2191
+ </button>
2192
+ </Section>
2193
+ </div>
2194
+ </t>
2195
+
2127
2196
  <t t-name="o-spreadsheet-ValueInRangeCriterionForm">
2128
2197
  <SelectionInput
2129
2198
  ranges="[this.props.criterion.values[0] || '']"
@@ -2227,19 +2296,33 @@
2227
2296
  </t>
2228
2297
 
2229
2298
  <t t-name="o-spreadsheet-DoubleInputCriterionForm">
2230
- <CriterionInput
2231
- value="this.props.criterion.values[0]"
2232
- onValueChanged.bind="this.onFirstValueChanged"
2233
- criterionType="this.props.criterion.type"
2234
- disableFormulas="this.props.disableFormulas"
2235
- focused="this.props.autofocus"
2236
- />
2237
- <CriterionInput
2238
- value="this.props.criterion.values[1]"
2239
- onValueChanged.bind="this.onSecondValueChanged"
2240
- criterionType="this.props.criterion.type"
2241
- disableFormulas="this.props.disableFormulas"
2242
- />
2299
+ <div class="d-flex align-items-center m-2">
2300
+ <CriterionInput
2301
+ value="this.props.criterion.values[0]"
2302
+ onValueChanged.bind="this.onFirstValueChanged"
2303
+ criterionType="this.props.criterion.type"
2304
+ disableFormulas="this.props.disableFormulas"
2305
+ focused="this.props.autofocus"
2306
+ />
2307
+ <CalendarButton
2308
+ t-if="this.isDateType"
2309
+ onChange.bind="this.onFirstValueChanged"
2310
+ value="this.props.criterion.values[0]"
2311
+ />
2312
+ </div>
2313
+ <div class="d-flex align-items-center m-2">
2314
+ <CriterionInput
2315
+ value="this.props.criterion.values[1]"
2316
+ onValueChanged.bind="this.onSecondValueChanged"
2317
+ criterionType="this.props.criterion.type"
2318
+ disableFormulas="this.props.disableFormulas"
2319
+ />
2320
+ <CalendarButton
2321
+ t-if="this.isDateType"
2322
+ onChange.bind="this.onSecondValueChanged"
2323
+ value="this.props.criterion.values[1]"
2324
+ />
2325
+ </div>
2243
2326
  </t>
2244
2327
 
2245
2328
  <t t-name="o-spreadsheet-DataValidationDateCriterion">
@@ -2249,15 +2332,16 @@
2249
2332
  selectedValue="this.currentDateValue"
2250
2333
  onChange.bind="this.onDateValueChanged"
2251
2334
  />
2252
-
2253
- <CriterionInput
2254
- t-if="this.currentDateValue === 'exactDate'"
2255
- value="this.props.criterion.values[0]"
2256
- onValueChanged.bind="this.onValueChanged"
2257
- criterionType="this.props.criterion.type"
2258
- disableFormulas="this.props.disableFormulas"
2259
- focused="this.props.autofocus"
2260
- />
2335
+ <div class="d-flex align-items-center" t-if="this.currentDateValue === 'exactDate'">
2336
+ <CriterionInput
2337
+ value="this.props.criterion.values[0]"
2338
+ onValueChanged.bind="this.onValueChanged"
2339
+ criterionType="this.props.criterion.type"
2340
+ disableFormulas="this.props.disableFormulas"
2341
+ focused="this.props.autofocus"
2342
+ />
2343
+ <CalendarButton onChange.bind="this.onValueChanged" value="this.props.criterion.values[0]"/>
2344
+ </div>
2261
2345
  </t>
2262
2346
 
2263
2347
  <t t-name="o-spreadsheet-CriterionInput">
@@ -2280,7 +2364,10 @@
2280
2364
  />
2281
2365
  </t>
2282
2366
  <t t-else="">
2283
- <StandaloneComposer t-props="this.getDataValidationRuleInputComposerProps()"/>
2367
+ <StandaloneComposer
2368
+ t-props="this.getDataValidationRuleInputComposerProps()"
2369
+ t-key="this.props.value"
2370
+ />
2284
2371
  </t>
2285
2372
  <span
2286
2373
  t-if="this.errorMessage"
@@ -2291,6 +2378,21 @@
2291
2378
  </div>
2292
2379
  </t>
2293
2380
 
2381
+ <t t-name="o-spreadsheet-CalendarButton">
2382
+ <div class="o-calendar-button ms-1">
2383
+ <button type="button" class="o-button btn" t-on-click="this.openCalendar">
2384
+ <i class="fa fa-calendar"/>
2385
+ </button>
2386
+ <input
2387
+ type="date"
2388
+ class="o-calendar-input"
2389
+ t-att-value="this.formatDateForInput(this.props.value)"
2390
+ t-ref="this.datePickerRef"
2391
+ t-on-change="(ev) => this.onDateInputValueChanged(ev.target.value)"
2392
+ />
2393
+ </div>
2394
+ </t>
2395
+
2294
2396
  <t t-name="o-spreadsheet-ConditionalFormatPreviewList">
2295
2397
  <div class="o-cf-preview-list h-100 overflow-auto" t-ref="this.cfListRef">
2296
2398
  <t t-foreach="this.conditionalFormats" t-as="cf" t-key="cf.id">
@@ -3288,19 +3390,21 @@
3288
3390
  </Section>
3289
3391
  </t>
3290
3392
  </GeneralDesignEditor>
3291
- <ChartTitle
3292
- title="this.props.definition.keyDescr?.text ?? ''"
3293
- updateTitle="(text) => this.setKeyText(text)"
3294
- name.translate="Key Value Style"
3295
- placeholder.translate="Add a key value description"
3296
- updateStyle.bind="this.updateKeyStyle"
3297
- style="this.keyStyle"
3298
- />
3299
- <SidePanelCollapsible isInitiallyCollapsed="false" title.translate="Baseline">
3393
+ <SidePanelCollapsible isInitiallyCollapsed="false" title.translate="Scorecard Design">
3300
3394
  <t t-set-slot="content">
3301
3395
  <ChartTitle
3396
+ class="'pt-0'"
3397
+ title="this.props.definition.keyDescr?.text ?? ''"
3398
+ updateTitle.bind="this.setKeyText"
3399
+ name.translate="Key Value Style"
3400
+ placeholder.translate="Add a key value description"
3401
+ updateStyle.bind="this.updateKeyStyle"
3402
+ style="this.keyStyle"
3403
+ />
3404
+ <ChartTitle
3405
+ class="'pt-0'"
3302
3406
  title="this.props.definition.baselineDescr?.text ?? ''"
3303
- updateTitle="(text) => this.setBaselineText(text)"
3407
+ updateTitle.bind="this.setBaselineText"
3304
3408
  name.translate="Baseline Style"
3305
3409
  placeholder.translate="Add a baseline description"
3306
3410
  updateStyle.bind="this.updateBaselineStyle"
@@ -3888,26 +3992,12 @@
3888
3992
  <ChartAnnotation t-props="this.props"/>
3889
3993
  </t>
3890
3994
 
3891
- <t t-name="o-spreadsheet-ChartTypePicker">
3892
- <t t-set="selectedChartProperties" t-value="this.getSelectedChartSubtypeProperties()"/>
3893
- <Section title.translate="Chart type">
3894
- <div class="position-relative">
3895
- <div
3896
- class="o-select o-input o-type-selector"
3897
- t-ref="this.selectRef"
3898
- t-on-pointerdown.prevent="this.onPointerDown">
3899
- <t t-out="selectedChartProperties.displayName"/>
3900
- </div>
3901
- <div class="o-type-selector-preview position-absolute">
3902
- <t t-call="{{selectedChartProperties.preview}}"/>
3903
- </div>
3904
- </div>
3905
- </Section>
3906
- <Popover t-if="this.state.popoverProps" t-props="this.state.popoverProps">
3995
+ <t t-name="o-spreadsheet-ChartTypePickerPopover">
3996
+ <Popover t-props="this.props.popoverProps">
3907
3997
  <div
3908
3998
  t-ref="this.popoverRef"
3909
3999
  class="o-chart-select-popover px-3 pb-4"
3910
- t-att-style="this.state.popoverStyle">
4000
+ t-att-style="this.popoverStyle">
3911
4001
  <t t-foreach="this.categories" t-as="category" t-key="category">
3912
4002
  <t t-if="this.chartTypeByCategories[category]">
3913
4003
  <h5 class="my-3" t-out="category_value"/>
@@ -3921,7 +4011,7 @@
3921
4011
  t-att-title="properties.displayName"
3922
4012
  t-on-click="() => this.onTypeChange(properties.chartSubtype)"
3923
4013
  t-att-data-id="properties.chartSubtype"
3924
- t-att-class="{'selected': properties === selectedChartProperties}">
4014
+ t-att-class="{'selected': properties.chartSubtype === this.props.selectedChartSubType}">
3925
4015
  <t t-call="{{properties.preview}}"/>
3926
4016
  </div>
3927
4017
  </t>
@@ -3932,6 +4022,32 @@
3932
4022
  </Popover>
3933
4023
  </t>
3934
4024
 
4025
+ <t t-name="o-spreadsheet-ChartTypePicker">
4026
+ <t t-set="selectedChartProperties" t-value="this.getSelectedChartSubtypeProperties()"/>
4027
+ <Section title.translate="Chart type">
4028
+ <div class="position-relative">
4029
+ <div
4030
+ class="o-select o-input o-type-selector"
4031
+ t-ref="this.selectRef"
4032
+ t-on-pointerdown.prevent="this.onPointerDown">
4033
+ <t t-out="selectedChartProperties.displayName"/>
4034
+ </div>
4035
+ <div class="o-type-selector-preview position-absolute">
4036
+ <t t-call="{{selectedChartProperties.preview}}"/>
4037
+ </div>
4038
+ </div>
4039
+ </Section>
4040
+ <ChartTypePickerPopover
4041
+ t-if="this.state.popoverProps"
4042
+ popoverProps="this.state.popoverProps"
4043
+ onClose.bind="this.closePopover"
4044
+ onSelectSubType.bind="this.onTypeChange"
4045
+ parentRef="this.selectRef"
4046
+ supportedTypes="this.getSupportedChartTypes()"
4047
+ selectedChartSubType="selectedChartProperties.chartSubtype"
4048
+ />
4049
+ </t>
4050
+
3935
4051
  <t t-name="o-spreadsheet-ChartPreview.LINE_CHART">
3936
4052
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3937
4053
  <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
@@ -4910,7 +5026,7 @@
4910
5026
  </t>
4911
5027
 
4912
5028
  <t t-name="o-spreadsheet.ChartTitle">
4913
- <Section class="'o-chart-title'" title="this.props.name">
5029
+ <Section class="'o-chart-title ' + (this.props.class ?? '')" title="this.props.name">
4914
5030
  <TextInput
4915
5031
  value="this.props.title"
4916
5032
  onChange.bind="this.updateTitle"
@@ -5215,7 +5331,7 @@
5215
5331
  <div class="o-carousel-preview-list overflow-auto bg-white" t-ref="this.previewListRef">
5216
5332
  <t t-foreach="this.carouselItems" t-as="item" t-key="this.getItemId(item)">
5217
5333
  <div
5218
- class="o-carousel-preview border-bottom pe-2 position-relative w-100 d-flex align-items-center"
5334
+ class="o-carousel-preview border-bottom pe-2 position-relative w-100 d-flex flex-column"
5219
5335
  t-att-class="{
5220
5336
  'o-dragging border-top': this.dragAndDrop.draggedItemId === this.getItemId(item),
5221
5337
  'o-selected': this.isCarouselItemActive(item)
@@ -5226,38 +5342,61 @@
5226
5342
  t-on-pointerdown.stop.prevent="(ev) => this.onDragHandleMouseDown(item, ev)">
5227
5343
  <t t-call="o-spreadsheet-Icon.THIN_DRAG_HANDLE"/>
5228
5344
  </div>
5229
- <div
5230
- class="o-carousel-preview-icon ms-3 flex-shrink-0 d-flex align-items-center justify-content-center">
5231
- <t t-call="{{this.getItemPreview(item)}}"/>
5345
+ <div class="d-flex o-preview-content align-items-center justify-content-center">
5346
+ <div
5347
+ class="o-carousel-preview-icon ms-3 flex-shrink-0 d-flex align-items-center justify-content-center">
5348
+ <t t-call="{{this.getItemPreview(item)}}"/>
5349
+ </div>
5350
+ <div class="o-carousel-preview-title text-truncate ms-2">
5351
+ <TextInput
5352
+ value="this.getItemTitle(item)"
5353
+ onChange="(newName) => this.renameCarouselItem(item, newName)"
5354
+ selectContentOnFocus="true"
5355
+ />
5356
+ </div>
5357
+ <div class="ms-auto"/>
5358
+ <div class="flex-shrink-0 d-flex me-1">
5359
+ <CogWheelMenu items="this.getCogWheelMenuItems(item)"/>
5360
+ </div>
5232
5361
  </div>
5233
- <div class="o-carousel-preview-title text-truncate ms-2">
5234
- <TextInput
5235
- value="this.getItemTitle(item)"
5236
- onChange="(newName) => this.renameCarouselItem(item, newName)"
5237
- selectContentOnFocus="true"
5362
+ <div class="ms-4 mb-2" t-if="item.type === 'carouselDataView'">
5363
+ <SelectionInput
5364
+ ranges="[this.getItemRangeString(item)]"
5365
+ hasSingleRange="true"
5366
+ required="true"
5367
+ onSelectionChanged.bind="this.onSelectionInputChanged"
5368
+ onSelectionConfirmed.bind="this.onSelectionInputConfirmed"
5238
5369
  />
5239
5370
  </div>
5240
- <div class="ms-auto"/>
5241
- <div class="flex-shrink-0 d-flex me-1">
5242
- <CogWheelMenu items="this.getCogWheelMenuItems(item)"/>
5243
- </div>
5244
5371
  </div>
5245
5372
  </t>
5246
5373
  </div>
5247
- <div
5248
- class="o-button-link o-carousel-add-chart float-end d-flex align-items-center py-4 pe-4 gap-2"
5249
- t-on-click="this.addNewChartToCarousel"
5250
- t-att-title="this.carouselAddChartInfoMessage">
5251
- + Add chart
5252
- </div>
5253
- <div
5254
- t-if="!this.hasDataView"
5255
- class="o-button-link o-carousel-add-data-view float-end py-4 pe-4"
5256
- t-on-click="this.addDataViewToCarousel"
5257
- t-att-title="this.carouselDataViewMessage">
5258
- + Add data view
5259
- </div>
5374
+ <Section class="'pt-0'">
5375
+ <div>
5376
+ <div
5377
+ class="o-button-link o-carousel-add-chart float-end d-flex align-items-center my-4"
5378
+ t-on-click="this.addNewChartToCarousel"
5379
+ t-ref="this.addChartButton"
5380
+ t-att-title="this.carouselAddChartInfoMessage">
5381
+ + Add chart
5382
+ </div>
5383
+ <div
5384
+ t-if="!this.hasDataView"
5385
+ class="o-button-link o-carousel-add-data-view float-end my-4 me-4"
5386
+ t-on-click="this.addDataViewToCarousel">
5387
+ + Add data view
5388
+ </div>
5389
+ </div>
5390
+ </Section>
5260
5391
  </div>
5392
+ <ChartTypePickerPopover
5393
+ t-if="this.state.popoverProps"
5394
+ popoverProps="this.state.popoverProps"
5395
+ onClose.bind="this.closePopover"
5396
+ onSelectSubType.bind="this.onSelectChartType"
5397
+ parentRef="this.addChartButton"
5398
+ supportedTypes="this.supportedChartTypes"
5399
+ />
5261
5400
  </t>
5262
5401
 
5263
5402
  <t t-name="o-spreadsheet-SelectionInput">
@@ -5630,11 +5769,9 @@
5630
5769
  class="o-menu-item-description ms-auto text-truncate"
5631
5770
  t-out="description"
5632
5771
  />
5633
- <t t-set="secondaryIcon" t-value="menuItem.secondaryIcon(this.env)"/>
5634
5772
  <div
5635
- t-if="isMenuRoot || secondaryIcon"
5773
+ t-if="isMenuRoot"
5636
5774
  class="o-menu-item-root ms-auto align-items-center d-flex gap-1">
5637
- <t t-if="secondaryIcon" t-call="{{secondaryIcon}}"/>
5638
5775
  <t t-if="isMenuRoot" t-call="o-spreadsheet-Icon.CARET_RIGHT"/>
5639
5776
  </div>
5640
5777
  </div>
@@ -6765,11 +6902,6 @@
6765
6902
  />
6766
6903
  </svg>
6767
6904
  </t>
6768
- <t t-name="o-spreadsheet-Icon.UNUSED_PIVOT_WARNING">
6769
- <div class="o-unused-pivot-icon text-warning" title="This pivot is not used">
6770
- <t t-call="o-spreadsheet-Icon.TRIANGLE_EXCLAMATION"/>
6771
- </div>
6772
- </t>
6773
6905
  <t t-name="o-spreadsheet-Icon.ANGLE_DOWN">
6774
6906
  <div class="o-icon">
6775
6907
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 224 256">
@@ -7375,9 +7507,6 @@
7375
7507
  </t>
7376
7508
 
7377
7509
  <t t-name="o-spreadsheet-GridOverlay">
7378
- <div class="position-absolute" t-att-style="this.style">
7379
- <FiguresContainer/>
7380
- </div>
7381
7510
  <div
7382
7511
  t-ref="this.gridOverlayRef"
7383
7512
  class="o-grid-overlay overflow-hidden o-zoomable"
@@ -7389,8 +7518,8 @@
7389
7518
  t-on-dblclick.self="this.onDoubleClick"
7390
7519
  t-on-contextmenu.stop.prevent="this.onContextMenu">
7391
7520
  <GridAddRowsFooter
7392
- t-if="!this.env.model.getters.isReadonly()"
7393
- t-key="this.env.model.getters.getActiveSheetId()"
7521
+ t-if="!this.env.model.getters.isReadonly() and this.props.hasFooter"
7522
+ t-key="this.viewStore.displayedSheetId"
7394
7523
  />
7395
7524
  <t t-call-slot="default"/>
7396
7525
  </div>
@@ -7437,6 +7566,9 @@
7437
7566
  t-on-keydown="this.onKeydown"
7438
7567
  t-on-wheel.prevent="this.onMouseWheel"
7439
7568
  t-ref="this.gridRef">
7569
+ <div class="position-absolute" t-att-style="this.gridOverlayDimensions">
7570
+ <FiguresContainer/>
7571
+ </div>
7440
7572
  <GridOverlay
7441
7573
  onCellClicked.bind="this.onCellClicked"
7442
7574
  onCellDoubleClicked.bind="this.onCellDoubleClicked"
@@ -7446,15 +7578,12 @@
7446
7578
  />
7447
7579
  <HeadersOverlay onOpenContextMenu="(type, x, y) => this.toggleContextMenu(type, x, y)"/>
7448
7580
  <GridComposer
7449
- gridDims="this.env.model.getters.getSheetViewDimensionWithHeaders()"
7581
+ gridDims="this.viewStore.viewports.getSheetViewDimensionWithHeaders()"
7450
7582
  onInputContextMenu.bind="this.onInputContextMenu"
7451
7583
  />
7452
7584
  <canvas t-ref="this.canvasRef" class="os-theme-dependant pe-none"/>
7453
7585
  <t t-set="focused" t-value="this.focusedClients"/>
7454
- <t
7455
- t-foreach="this.env.model.getters.getClientsToDisplay()"
7456
- t-as="client"
7457
- t-key="this.getClientPositionKey(client)">
7586
+ <t t-foreach="this.clientsToDisplay" t-as="client" t-key="this.getClientPositionKey(client)">
7458
7587
  <ClientTag
7459
7588
  name="client.name"
7460
7589
  color="client.color"
@@ -7796,16 +7925,11 @@
7796
7925
 
7797
7926
  <t t-name="o-spreadsheet-CarouselFigure">
7798
7927
  <div
7799
- class="o-carousel w-100 h-100 d-flex flex-column"
7928
+ class="o-carousel w-100 h-100 d-flex flex-column px-4 py-2"
7929
+ t-att-style="this.carouselStyle"
7800
7930
  t-on-dblclick="this.onCarouselDoubleClick">
7801
7931
  <t t-set="selectedItem" t-value="this.selectedCarouselItem"/>
7802
- <div
7803
- class="o-carousel-header d-flex align-items-baseline flex-shrink-0 pe-1 pe-auto"
7804
- t-att-class="{
7805
- 'border-bottom': this.env.model.getters.isDashboard(),
7806
- 'o-carousel-header-floating': !this.env.model.getters.isDashboard() and selectedItem?.type === 'carouselDataView',
7807
- }"
7808
- t-att-style="this.headerStyle">
7932
+ <div class="o-carousel-header d-flex align-items-baseline flex-shrink-0 pt-1 pe-auto">
7809
7933
  <div
7810
7934
  class="o-carousel-title text-truncate flex-shrink-0 pe-2"
7811
7935
  t-out="this.title"
@@ -7815,7 +7939,11 @@
7815
7939
  <div
7816
7940
  class="o-carousel-tabs d-flex flex-fill justify-content-end"
7817
7941
  t-ref="this.carouselTabsRef">
7818
- <t t-foreach="this.visibleCarouselItems" t-as="item" t-key="item_index">
7942
+ <t
7943
+ t-foreach="this.carousel.items"
7944
+ t-as="item"
7945
+ t-key="item_index"
7946
+ t-if="this.carousel.items.length > 1">
7819
7947
  <div
7820
7948
  class="o-carousel-tab text-truncate px-2 mt-1 flex-shrink-0"
7821
7949
  t-att-class="{ 'selected': this.isItemSelected(item) }"
@@ -7847,7 +7975,6 @@
7847
7975
  t-att-class="{
7848
7976
  'fa-compress': this.props.isFullScreen,
7849
7977
  'fa-expand': !this.props.isFullScreen,
7850
- 'invisible': this.selectedCarouselItem?.type !== 'chart',
7851
7978
  }"
7852
7979
  t-on-click="this.toggleFullScreen"
7853
7980
  />
@@ -7857,9 +7984,10 @@
7857
7984
  t-on-click="this.openContextMenu"
7858
7985
  />
7859
7986
  </div>
7987
+ <div t-if="this.title" class="w-100 mt-2 border-bottom"/>
7860
7988
  <div
7861
7989
  t-if="!selectedItem"
7862
- class="o-carousel-empty w-100 flex-fill d-flex align-items-center justify-content-center">
7990
+ class="o-carousel-empty o-carousel-content w-100 flex-fill d-flex align-items-center justify-content-center">
7863
7991
  <t t-call="o-spreadsheet-Icon.CAROUSEL"/>
7864
7992
  </div>
7865
7993
  <div
@@ -7882,6 +8010,16 @@
7882
8010
  t-key="selectedItem.chartId"
7883
8011
  />
7884
8012
  </div>
8013
+ <div
8014
+ t-elif="selectedItem.type === 'carouselDataView' and selectedItem.range"
8015
+ class="o-carousel-content mb-2 mt-3 h-100 w-100 overflow-hidden">
8016
+ <StandaloneViewport
8017
+ range="this.removeEmptyHeadersFromRange(selectedItem.range)"
8018
+ columnWeights="selectedItem.columnWeights"
8019
+ canResizeColumns="this.canResizeDataViewColumns"
8020
+ onResizeColumns.bind="this.onResizeColumns"
8021
+ />
8022
+ </div>
7885
8023
  </div>
7886
8024
  </t>
7887
8025
 
@@ -7889,16 +8027,15 @@
7889
8027
  <div
7890
8028
  class="o-figure-wrapper os-theme-dependant"
7891
8029
  t-att-class="{'o-figure-selected': this.isSelected}"
7892
- t-att-style="this.wrapperStyle"
7893
- t-ref="this.figureWrapperRef">
8030
+ t-att-style="this.wrapperStyle">
7894
8031
  <div
7895
- class="o-figure w-100 h-100"
7896
- t-att-class="this.props.class"
8032
+ class="o-figure w-100 h-100 overflow-hidden"
8033
+ t-att-class="this.figureClass"
7897
8034
  t-on-pointerdown.stop="(ev) => this.onMouseDown(ev)"
7898
8035
  t-on-click="this.onClick"
7899
8036
  t-on-contextmenu.prevent.stop="(ev) => !this.env.model.getters.isReadonly() and this.onContextMenu(ev)"
7900
8037
  t-ref="this.figureRef"
7901
- t-att-style="this.props.style"
8038
+ t-att-style="this.figureStyle"
7902
8039
  t-att-data-id="this.props.figureUI.id"
7903
8040
  tabindex="0"
7904
8041
  t-on-keydown.stop="(ev) => this.onKeyDown(ev)"
@@ -7907,7 +8044,6 @@
7907
8044
  t-component="this.figureRegistry.get(this.props.figureUI.tag).Component"
7908
8045
  t-key="this.props.figureUI.id"
7909
8046
  figureUI="this.props.figureUI"
7910
- editFigureStyle.bind="this.editWrapperStyle"
7911
8047
  openContextMenu.bind="this.openContextMenu"
7912
8048
  />
7913
8049
  <MenuPopover
@@ -7918,31 +8054,11 @@
7918
8054
  onClose="() => this.menuState.isOpen=false"
7919
8055
  popoverPositioning="'bottom-left'"
7920
8056
  />
7921
- <div
7922
- t-if="!this.env.model.getters.isDashboard()"
7923
- class="position-absolute top-0 start-0 pe-none w-100 h-100">
7924
- <div
7925
- class="o-figure-border pe-auto w-100 h-0 position-absolute pb-2"
7926
- t-att-class="{'o-selected': this.isSelected}"
7927
- t-att-style="this.getBorderStyle('top')"
7928
- />
7929
- <div
7930
- class="o-figure-border pe-auto h-100 position-absolute start-0 ps-2"
7931
- t-att-class="{'o-selected': this.isSelected}"
7932
- t-att-style="this.getBorderStyle('left')"
7933
- />
7934
- <div
7935
- class="o-figure-border pe-auto w-100 position-absolute bottom-0 pt-2"
7936
- t-att-class="{'o-selected': this.isSelected}"
7937
- t-att-style="this.getBorderStyle('bottom')"
7938
- />
7939
- <div
7940
- class="o-figure-border pe-auto h-100 position-absolute end-0 pe-2"
7941
- t-att-class="{'o-selected': this.isSelected}"
7942
- t-att-style="this.getBorderStyle('right')"
7943
- />
7944
- </div>
7945
8057
  </div>
8058
+ <div
8059
+ t-if="this.isSelected"
8060
+ class="o-figure-selection-border position-absolute pe-none w-100 h-100"
8061
+ />
7946
8062
  <t t-if="this.isFigureResizable">
7947
8063
  <div
7948
8064
  class="o-fig-anchor o-top pe-auto"
@@ -8136,24 +8252,13 @@
8136
8252
  class="mx-auto h-100 position-relative"
8137
8253
  t-ref="this.gridRef"
8138
8254
  t-att-style="this.gridContainer">
8255
+ <div class="position-absolute" t-att-style="this.gridOverlayDimensions">
8256
+ <FiguresContainer/>
8257
+ </div>
8139
8258
  <GridOverlay
8140
8259
  onGridResized.bind="this.onGridResized"
8141
8260
  gridOverlayDimensions="this.gridOverlayDimensions">
8142
- <div
8143
- t-foreach="this.getClickableCells()"
8144
- t-as="clickableCell"
8145
- t-key="clickableCell_index"
8146
- class="o-dashboard-clickable-cell"
8147
- t-att-title="clickableCell.title"
8148
- t-on-click="(ev) => this.selectClickableCell(ev, clickableCell)"
8149
- t-on-auxclick="(ev) => this.selectClickableCell(ev, clickableCell)"
8150
- t-att-style="this.getCellClickableStyle(clickableCell.coordinates)">
8151
- <t
8152
- t-if="clickableCell.component"
8153
- t-component="clickableCell.component"
8154
- t-props="clickableCell.componentProps"
8155
- />
8156
- </div>
8261
+ <ClickableCellsOverlay/>
8157
8262
  </GridOverlay>
8158
8263
  <canvas t-ref="this.canvasRef" class="os-theme-dependant"/>
8159
8264
  <GridPopover
@@ -8581,6 +8686,24 @@
8581
8686
  />
8582
8687
  </t>
8583
8688
 
8689
+ <t t-name="o-spreadsheet-ClickableCellsOverlay">
8690
+ <div
8691
+ t-foreach="this.getClickableCells()"
8692
+ t-as="clickableCell"
8693
+ t-key="clickableCell_index"
8694
+ class="o-dashboard-clickable-cell"
8695
+ t-att-title="clickableCell.title"
8696
+ t-on-click="(ev) => this.selectClickableCell(ev, clickableCell)"
8697
+ t-on-auxclick="(ev) => this.selectClickableCell(ev, clickableCell)"
8698
+ t-att-style="this.getCellClickableStyle(clickableCell.coordinates)">
8699
+ <t
8700
+ t-if="clickableCell.component"
8701
+ t-component="clickableCell.component"
8702
+ t-props="clickableCell.componentProps"
8703
+ />
8704
+ </div>
8705
+ </t>
8706
+
8584
8707
  <t t-name="o-spreadsheet-BottomBar">
8585
8708
  <div
8586
8709
  class="o-spreadsheet-bottom-bar o-two-columns d-flex flex-fill align-items-center overflow-hidden border-top"