@odoo/o-spreadsheet 18.4.0-alpha.6 → 18.4.0-alpha.8

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.
@@ -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 18.4.0-alpha.6
5
- @date 2025-05-30T08:45:20.500Z
6
- @hash eecf7e4
4
+ @version 18.4.0-alpha.8
5
+ @date 2025-06-12T09:54:36.987Z
6
+ @hash 9b7a8d0
7
7
  -->
8
8
  <odoo>
9
9
  <t t-name="o-spreadsheet-ValidationMessages">
@@ -29,9 +29,9 @@
29
29
 
30
30
  <t t-name="o-spreadsheet-TopBar">
31
31
  <div
32
- class="o-spreadsheet-topbar o-two-columns d-flex flex-column user-select-none"
32
+ class="o-spreadsheet-topbar d-flex flex-column user-select-none"
33
33
  t-on-click="props.onClick">
34
- <div class="o-topbar-top d-flex justify-content-between">
34
+ <div t-if="!env.isSmall" class="o-topbar-top d-flex justify-content-between">
35
35
  <!-- Menus -->
36
36
  <div class="o-topbar-topleft d-flex">
37
37
  <t t-foreach="menus" t-as="menu" t-key="menu_index">
@@ -91,7 +91,7 @@
91
91
  </div>
92
92
  </div>
93
93
  </div>
94
- <TopBarComposer/>
94
+ <TopBarComposer t-if="!env.isSmall"/>
95
95
  </div>
96
96
  <div
97
97
  t-if="this.fingerprints.isEnabled"
@@ -118,7 +118,7 @@
118
118
  </div>
119
119
  </div>
120
120
  </div>
121
- <Menu
121
+ <MenuPopover
122
122
  t-if="state.menuState.isOpen"
123
123
  anchorRect="state.menuState.anchorRect"
124
124
  menuItems="state.menuState.menuItems"
@@ -127,7 +127,7 @@
127
127
  popoverPositioning="'bottom-left'"
128
128
  />
129
129
  <Popover t-if="state.toolsPopoverState.isOpen" t-props="toolsPopoverProps">
130
- <div class="d-flex px-2 py-1 flex-wrap" style="background-color:white;">
130
+ <div class="d-flex px-2 py-1 flex-wrap align-items-center" style="background-color:white;">
131
131
  <t
132
132
  t-foreach="state.invisibleToolsCategories"
133
133
  t-as="category"
@@ -141,7 +141,7 @@
141
141
  </t>
142
142
  <div
143
143
  t-if="category_index &lt; state.invisibleToolsCategories.length-1"
144
- class="o-topbar-divider my-2"
144
+ class="o-topbar-divider"
145
145
  />
146
146
  </t>
147
147
  </div>
@@ -155,7 +155,7 @@
155
155
  onClick.bind="toggleMenu"
156
156
  class="props.class"
157
157
  />
158
- <Menu
158
+ <MenuPopover
159
159
  t-if="isActive"
160
160
  anchorRect="state.anchorRect"
161
161
  menuItems="state.menuItems"
@@ -286,7 +286,7 @@
286
286
  <t t-call="o-spreadsheet-Icon.EDIT"/>
287
287
  </div>
288
288
  </div>
289
- <Menu
289
+ <MenuPopover
290
290
  t-if="menu.isOpen"
291
291
  menuItems="menu.menuItems"
292
292
  anchorRect="menu.anchorRect"
@@ -349,13 +349,19 @@
349
349
  </t>
350
350
 
351
351
  <t t-name="o-spreadsheet-Spreadsheet">
352
- <div class="o-spreadsheet h-100 w-100" t-ref="spreadsheet" t-att-style="getStyle()">
352
+ <div
353
+ class="o-spreadsheet h-100 w-100"
354
+ t-att-class="{'o-spreadsheet-mobile': env.isSmall}"
355
+ t-ref="spreadsheet"
356
+ t-att-style="getStyle()">
353
357
  <t t-if="env.isDashboard()">
354
- <SpreadsheetDashboard/>
358
+ <SpreadsheetDashboard getGridSize.bind="getGridSize"/>
355
359
  <FullScreenChart/>
356
360
  </t>
357
361
  <t t-else="">
358
- <TopBar onClick="() => this.focusGrid()" dropdownMaxHeight="gridHeight"/>
362
+ <div class="o-spreadsheet-topbar-wrapper o-two-columns">
363
+ <TopBar onClick="() => this.focusGrid()" dropdownMaxHeight="gridHeight"/>
364
+ </div>
359
365
  <div
360
366
  class="o-grid-container"
361
367
  t-att-class="{'o-two-columns': !sidePanel.isOpen}"
@@ -369,15 +375,80 @@
369
375
  <HeaderGroupContainer layers="rowLayers" dimension="'ROW'"/>
370
376
  </div>
371
377
  <div class="o-group-grid overflow-hidden">
372
- <Grid exposeFocus="(focus) => this._focusGrid = focus"/>
378
+ <Grid exposeFocus="(focus) => this._focusGrid = focus" getGridSize.bind="getGridSize"/>
373
379
  </div>
374
380
  </div>
375
381
  <SidePanel/>
376
- <BottomBar onClick="() => this.focusGrid()"/>
382
+ <div class="o-spreadsheet-bottombar-wrapper o-two-columns overflow-hidden">
383
+ <SmallBottomBar t-if="env.isSmall" onClick="() => this.focusGrid()"/>
384
+ <BottomBar t-else="" onClick="() => this.focusGrid()"/>
385
+ </div>
377
386
  </t>
378
387
  </div>
379
388
  </t>
380
389
 
390
+ <t t-name="o-spreadsheet-SmallBottomBar">
391
+ <div class="o-spreadsheet-small-bottom-bar o-two-columns d-flex flex-column overflow-hidden">
392
+ <t t-if="menuState.isOpen">
393
+ <RibbonMenu onClose="() => this.menuState.isOpen=false"/>
394
+ </t>
395
+ <t t-else="">
396
+ <div class="o-small-composer px-2 py-2">
397
+ <div class="w-100" t-ref="bottombarComposer">
398
+ <Composer t-props="composerProps"/>
399
+ </div>
400
+ <span
401
+ class="align-items-center d-flex justify-content-center o-selection-button"
402
+ title="confirm edition"
403
+ t-if="this.focus !== 'inactive'"
404
+ t-on-click="() => this.composerStore.stopEdition()">
405
+ <span class="d-flex">
406
+ <t t-call="o-spreadsheet-Icon.CHECK"/>
407
+ </span>
408
+ </span>
409
+ </div>
410
+ <div class="d-flex flex-row mb-1" t-if="this.focus !== 'inactive'">
411
+ <div
412
+ t-foreach="symbols"
413
+ t-as="symbol"
414
+ t-key="symbol_index"
415
+ class="o-spreadsheet-editor-symbol w-100 d-flex justify-content-center align-items-center mx-1"
416
+ t-esc="symbol"
417
+ tabindex="-1"
418
+ t-att-title="symbol"
419
+ t-on-click="() => this.insertSymbol(symbol)"
420
+ composerFocusableElement="true"
421
+ />
422
+ </div>
423
+ <div class="d-flex flex-fill align-items-center bottom-bar-menu">
424
+ <Ripple>
425
+ <div class="py-1 px-1 mx-2 ribbon-toggler" t-on-click="toggleRibbon">
426
+ <i class="o-icon fa fa-cog"/>
427
+ </div>
428
+ </Ripple>
429
+ <BottomBar onClick="props.onClick"/>
430
+ </div>
431
+ </t>
432
+ </div>
433
+ </t>
434
+
435
+ <div t-name="o-spreadsheet-RibbonMenu">
436
+ <div class="o-ribbon-menu d-flex flex-column" t-ref="menu">
437
+ <div class="o-ribbon-title d-flex py-2 fw-bold">
438
+ <div
439
+ class="o-previous-button px-3 py-1 mx-2 rounded"
440
+ t-on-click="onClickBack"
441
+ t-att-title="backTitle">
442
+ <i class="fa fa-angle-left"/>
443
+ </div>
444
+ <span class="d-flex align-items-center" t-esc="state.title"/>
445
+ </div>
446
+ <div class="o-ribbon-menu-wrapper overflow-auto">
447
+ <Menu t-props="menuProps"/>
448
+ </div>
449
+ </div>
450
+ </div>
451
+
381
452
  <t t-name="o-spreadsheet-TableStyleEditorPanel">
382
453
  <div class="o-table-style-editor-panel">
383
454
  <Section title.translate="Style name">
@@ -658,7 +729,7 @@
658
729
  t-on-click="onClick">
659
730
  <option selected="true" t-esc="props.selectedValue"/>
660
731
  </select>
661
- <Menu
732
+ <MenuPopover
662
733
  t-if="state.isMenuOpen"
663
734
  menuItems="props.menuItems"
664
735
  anchorRect="menuAnchorRect"
@@ -2099,7 +2170,7 @@
2099
2170
  t-on-click="toggleMenu"
2100
2171
  t-ref="button"
2101
2172
  />
2102
- <Menu
2173
+ <MenuPopover
2103
2174
  t-if="menuState.isOpen"
2104
2175
  menuId="menuId"
2105
2176
  anchorRect="menuState.anchorRect"
@@ -2123,6 +2194,7 @@
2123
2194
  t-att-name="props.name"
2124
2195
  t-att-checked="props.value"
2125
2196
  t-on-change="onChange"
2197
+ t-on-click.stop=""
2126
2198
  />
2127
2199
  <t t-if="props.label" t-esc="props.label"/>
2128
2200
  </label>
@@ -3867,6 +3939,10 @@
3867
3939
  </div>
3868
3940
  </t>
3869
3941
 
3942
+ <t t-name="o-spreadsheet-Selection">
3943
+ <Highlight t-props="highlightProps"/>
3944
+ </t>
3945
+
3870
3946
  <t t-name="o-spreadsheet-ScrollBar">
3871
3947
  <div class="o-scrollbar" t-on-scroll="onScroll" t-ref="scrollbar" t-att-style="positionCss">
3872
3948
  <div t-att-style="sizeCss"/>
@@ -3876,7 +3952,7 @@
3876
3952
  <t t-name="o-spreadsheet-Popover">
3877
3953
  <t t-portal="'.o-spreadsheet'">
3878
3954
  <div
3879
- class="o-popover"
3955
+ class="o-popover rounded"
3880
3956
  t-att-class="props.class"
3881
3957
  t-ref="popover"
3882
3958
  t-on-wheel="props.onMouseWheel"
@@ -3938,15 +4014,6 @@
3938
4014
  </div>
3939
4015
  </t>
3940
4016
 
3941
- <t t-name="o-spreadsheet-PivotCollapseIcon">
3942
- <div
3943
- class="o-pivot-collapse-icon o-hoverable-button d-flex align-items-center justify-content-center"
3944
- t-on-click="onClick">
3945
- <t t-if="isCollapsed" t-call="o-spreadsheet-Icon.PLUS"/>
3946
- <t t-else="" t-call="o-spreadsheet-Icon.MINUS"/>
3947
- </div>
3948
- </t>
3949
-
3950
4017
  <t t-name="o-spreadsheet-PaintFormatButton">
3951
4018
  <span
3952
4019
  class="o-menu-item-button"
@@ -3961,65 +4028,12 @@
3961
4028
  </span>
3962
4029
  </t>
3963
4030
 
3964
- <t t-name="o-spreadsheet-Menu">
3965
- <Popover t-if="menuItemsAndSeparators.length" t-props="popoverProps">
3966
- <div
3967
- t-ref="menu"
3968
- class="o-menu"
3969
- t-att-style="menuStyle"
3970
- t-on-scroll="onScroll"
3971
- t-on-wheel.stop=""
3972
- t-on-pointerdown.prevent=""
3973
- t-on-click.stop=""
3974
- t-on-mouseover="onMouseOverMainMenu"
3975
- t-on-contextmenu.prevent="">
3976
- <t t-foreach="menuItemsAndSeparators" t-as="menuItem" t-key="menuItem_index">
3977
- <div t-if="menuItem === 'separator'" class="o-separator"/>
3978
- <t t-else="">
3979
- <t t-set="isMenuRoot" t-value="isRoot(menuItem)"/>
3980
- <t t-set="isMenuEnabled" t-value="isEnabled(menuItem)"/>
3981
- <div
3982
- t-att-title="getName(menuItem)"
3983
- t-att-data-name="menuItem.id"
3984
- t-on-click="(ev) => this.onClickMenu(menuItem, ev)"
3985
- t-on-auxclick="(ev) => this.onClickMenu(menuItem, ev)"
3986
- t-on-mouseenter="(ev) => this.onMouseEnter(menuItem, ev)"
3987
- t-on-mouseover="(ev) => this.onMouseOver(menuItem, ev)"
3988
- t-on-mouseleave="(ev) => this.onMouseLeave(menuItem)"
3989
- class="o-menu-item d-flex justify-content-between align-items-center"
3990
- t-att-class="{'disabled': !isMenuEnabled, 'o-menu-item-active': isActive(menuItem)}"
3991
- t-att-style="getColor(menuItem)">
3992
- <div class="d-flex w-100">
3993
- <div
3994
- t-if="childrenHaveIcon"
3995
- class="o-menu-item-icon d-flex align-items-center flex-shrink-0"
3996
- t-att-style="getIconColor(menuItem)">
3997
- <t t-if="getIconName(menuItem)" t-call="{{getIconName(menuItem)}}"/>
3998
- </div>
3999
- <div class="o-menu-item-name align-middle text-truncate" t-esc="getName(menuItem)"/>
4000
- <t t-set="description" t-value="menuItem.description(env)"/>
4001
- <div
4002
- t-if="description"
4003
- class="o-menu-item-description ms-auto text-truncate"
4004
- t-esc="description"
4005
- />
4006
- <t t-set="secondaryIcon" t-value="menuItem.secondaryIcon(env)"/>
4007
- <div
4008
- t-if="isMenuRoot"
4009
- class="o-menu-item-root align-middle ms-auto"
4010
- t-call="o-spreadsheet-Icon.CARET_RIGHT"
4011
- />
4012
- <div
4013
- t-elif="secondaryIcon"
4014
- class="o-menu-item-root align-middle ms-auto"
4015
- t-call="{{secondaryIcon}}"
4016
- />
4017
- </div>
4018
- </div>
4019
- </t>
4020
- </t>
4031
+ <t t-name="o-spreadsheet-Menu-Popover">
4032
+ <Popover t-if="props.menuItems" t-props="popoverProps">
4033
+ <div t-ref="menu" class="o-menu-wrapper" t-on-mouseover="() => this.onMouseOverMainMenu()">
4034
+ <Menu t-props="menuProps"/>
4021
4035
  </div>
4022
- <Menu
4036
+ <MenuPopover
4023
4037
  t-if="subMenu.isOpen"
4024
4038
  t-key="subMenu.parentMenu.id"
4025
4039
  anchorRect="subMenuAnchorRect"
@@ -4035,6 +4049,64 @@
4035
4049
  </Popover>
4036
4050
  </t>
4037
4051
 
4052
+ <t t-name="o-spreadsheet-Menu">
4053
+ <div
4054
+ t-ref="menu"
4055
+ class="o-menu"
4056
+ t-att-style="menuStyle"
4057
+ t-on-scroll="props.onScroll"
4058
+ t-on-wheel.stop=""
4059
+ t-on-pointerdown.prevent=""
4060
+ t-on-click.stop=""
4061
+ t-on-contextmenu.prevent="">
4062
+ <t t-foreach="menuItemsAndSeparators" t-as="menuItem" t-key="menuItem_index">
4063
+ <div t-if="menuItem === 'separator'" class="o-separator"/>
4064
+ <t t-else="">
4065
+ <t t-set="isMenuRoot" t-value="isRoot(menuItem)"/>
4066
+ <t t-set="isMenuEnabled" t-value="isEnabled(menuItem)"/>
4067
+ <div
4068
+ t-att-title="getName(menuItem)"
4069
+ t-att-data-name="menuItem.id"
4070
+ t-on-click="(ev) => this.props.onClickMenu?.(menuItem, ev)"
4071
+ t-on-auxclick="(ev) => this.props.onClickMenu?.(menuItem, ev)"
4072
+ t-on-mouseover="(ev) => this.props.onMouseOver?.(menuItem, ev)"
4073
+ t-on-mouseenter="(ev) => this.onMouseEnter?.(menuItem, ev)"
4074
+ t-on-mouseleave="(ev) => this.onMouseLeave?.(menuItem)"
4075
+ class="o-menu-item d-flex justify-content-between align-items-center"
4076
+ t-att-class="{'disabled': !isMenuEnabled, 'o-menu-item-active': props.isActive?.(menuItem)}"
4077
+ t-att-style="getColor(menuItem)">
4078
+ <div class="d-flex w-100">
4079
+ <div
4080
+ t-if="childrenHaveIcon"
4081
+ class="o-menu-item-icon d-flex align-items-center flex-shrink-0"
4082
+ t-att-style="getIconColor(menuItem)">
4083
+ <t t-if="getIconName(menuItem)" t-call="{{getIconName(menuItem)}}"/>
4084
+ </div>
4085
+ <div class="o-menu-item-name align-middle text-truncate" t-esc="getName(menuItem)"/>
4086
+ <t t-set="description" t-value="menuItem.description(env)"/>
4087
+ <div
4088
+ t-if="description"
4089
+ class="o-menu-item-description ms-auto text-truncate"
4090
+ t-esc="description"
4091
+ />
4092
+ <t t-set="secondaryIcon" t-value="menuItem.secondaryIcon(env)"/>
4093
+ <div
4094
+ t-if="isMenuRoot"
4095
+ class="o-menu-item-root align-middle ms-auto"
4096
+ t-call="o-spreadsheet-Icon.CARET_RIGHT"
4097
+ />
4098
+ <div
4099
+ t-elif="secondaryIcon"
4100
+ class="o-menu-item-root align-middle ms-auto"
4101
+ t-call="{{secondaryIcon}}"
4102
+ />
4103
+ </div>
4104
+ </div>
4105
+ </t>
4106
+ </t>
4107
+ </div>
4108
+ </t>
4109
+
4038
4110
  <t t-name="o-spreadsheet-LinkEditor">
4039
4111
  <div
4040
4112
  class="o-link-editor"
@@ -4085,7 +4157,7 @@
4085
4157
  </button>
4086
4158
  </div>
4087
4159
  </div>
4088
- <Menu
4160
+ <MenuPopover
4089
4161
  t-if="menu.isOpen"
4090
4162
  anchorRect="menuButtonRect"
4091
4163
  menuItems="menuItems"
@@ -5161,20 +5233,24 @@
5161
5233
 
5162
5234
  <t t-name="o-spreadsheet-Highlight">
5163
5235
  <div class="o-highlight" t-ref="highlight">
5164
- <t t-foreach="['n', 's', 'w', 'e']" t-as="orientation" t-key="orientation">
5236
+ <t
5237
+ t-if="!env.isMobile()"
5238
+ t-foreach="['n', 's', 'w', 'e']"
5239
+ t-as="orientation"
5240
+ t-key="orientation">
5165
5241
  <Border
5166
5242
  onMoveHighlight.bind="this.onMoveHighlight"
5167
5243
  isMoving='highlightState.shiftingMode === "isMoving"'
5168
5244
  orientation="orientation"
5169
- zone="props.zone"
5245
+ zone="props.range.zone"
5170
5246
  />
5171
5247
  </t>
5172
- <t t-foreach="['nw', 'ne', 'sw', 'se']" t-as="orientation" t-key="orientation">
5248
+ <t t-foreach="cornerOrientations" t-as="orientation" t-key="orientation">
5173
5249
  <Corner
5174
5250
  onResizeHighlight.bind="onResizeHighlight"
5175
5251
  isResizing='highlightState.shiftingMode === "isResizing"'
5176
5252
  orientation="orientation"
5177
- zone="props.zone"
5253
+ zone="props.range.zone"
5178
5254
  color="props.color"
5179
5255
  />
5180
5256
  </t>
@@ -5183,17 +5259,22 @@
5183
5259
 
5184
5260
  <t t-name="o-spreadsheet-Corner">
5185
5261
  <div
5186
- class="o-corner"
5262
+ class="o-corner d-flex justify-content-center align-items-center"
5187
5263
  t-on-pointerdown.prevent="onMouseDown"
5188
- t-att-style="style"
5189
- t-att-class="{
5264
+ t-on-touchstart.prevent.stop=""
5265
+ t-att-style="handlerStyle">
5266
+ <div
5267
+ t-att-style="buttonLook"
5268
+ class="o-corner-button"
5269
+ t-att-class="{
5190
5270
  'o-resizing': props.isResizing,
5191
5271
  'o-corner-nw': props.orientation === 'nw',
5192
5272
  'o-corner-ne': props.orientation === 'ne',
5193
5273
  'o-corner-sw': props.orientation === 'sw',
5194
5274
  'o-corner-se': props.orientation === 'se',
5195
5275
  }"
5196
- />
5276
+ />
5277
+ </div>
5197
5278
  </t>
5198
5279
 
5199
5280
  <t t-name="o-spreadsheet-Border">
@@ -5288,10 +5369,11 @@
5288
5369
  <t t-name="o-spreadsheet-RowResizer">
5289
5370
  <div
5290
5371
  class="o-row-resizer"
5372
+ t-ref="rowResizer"
5291
5373
  t-on-pointermove.self="onMouseMove"
5292
5374
  t-on-mouseleave="onMouseLeave"
5293
5375
  t-on-pointerdown.self.prevent="select"
5294
- t-ref="rowResizer"
5376
+ t-on-click="onClick"
5295
5377
  t-on-pointerup.self="onMouseUp"
5296
5378
  t-on-contextmenu.self="onContextMenu"
5297
5379
  t-att-class="{'o-grab': state.waitingForMove, 'o-dragging': state.isMoving}">
@@ -5331,10 +5413,11 @@
5331
5413
  <t t-name="o-spreadsheet-ColResizer">
5332
5414
  <div
5333
5415
  class="o-col-resizer d-flex"
5416
+ t-ref="colResizer"
5334
5417
  t-on-pointermove.self="onMouseMove"
5335
5418
  t-on-mouseleave="onMouseLeave"
5336
5419
  t-on-pointerdown.self.prevent="select"
5337
- t-ref="colResizer"
5420
+ t-on-click="onClick"
5338
5421
  t-on-pointerup.self="onMouseUp"
5339
5422
  t-on-contextmenu.self="onContextMenu"
5340
5423
  t-att-class="{'o-grab': state.waitingForMove, 'o-dragging': state.isMoving, }">
@@ -5432,7 +5515,7 @@
5432
5515
  </div>
5433
5516
  </div>
5434
5517
 
5435
- <Menu
5518
+ <MenuPopover
5436
5519
  t-if="menu.isOpen"
5437
5520
  menuItems="menu.menuItems"
5438
5521
  anchorRect="menu.anchorRect"
@@ -5491,10 +5574,11 @@
5491
5574
  class="o-grid-overlay overflow-hidden"
5492
5575
  t-att-class="{'o-paint-format-cursor': isPaintingFormat}"
5493
5576
  t-att-style="style"
5494
- t-on-pointerdown="onMouseDown"
5577
+ t-on-pointerdown="onPointerDown"
5578
+ t-on-pointermove="onPointerMove"
5579
+ t-on-click="onClick"
5495
5580
  t-on-dblclick.self="onDoubleClick"
5496
5581
  t-on-contextmenu.stop.prevent="onContextMenu">
5497
- <GridCellIconOverlay/>
5498
5582
  <GridAddRowsFooter
5499
5583
  t-if="!env.model.getters.isReadonly()"
5500
5584
  t-key="env.model.getters.getActiveSheetId()"
@@ -5504,23 +5588,6 @@
5504
5588
  </div>
5505
5589
  </t>
5506
5590
 
5507
- <t t-name="o-spreadsheet-GridCellIconOverlay">
5508
- <t t-foreach="icons" t-as="icon" t-key="icon_index">
5509
- <GridCellIcon icon="icon">
5510
- <t t-component="icon.component" cellPosition="icon.position"/>
5511
- </GridCellIcon>
5512
- </t>
5513
- </t>
5514
-
5515
- <t t-name="o-spreadsheet-GridCellIcon">
5516
- <div
5517
- class="o-grid-cell-icon position-absolute overflow-hidden"
5518
- t-if="isPositionVisible(this.props.icon.position)"
5519
- t-att-style="iconStyle">
5520
- <t t-slot="default"/>
5521
- </div>
5522
- </t>
5523
-
5524
5591
  <t t-name="o-spreadsheet-GridAddRowsFooter">
5525
5592
  <div
5526
5593
  class="o-grid-add-rows mt-2 ms-2 w-100 d-flex position-relative align-items-center"
@@ -5564,6 +5631,7 @@
5564
5631
  onGridMoved.bind="moveCanvas"
5565
5632
  gridOverlayDimensions="gridOverlayDimensions"
5566
5633
  onFigureDeleted.bind="focusDefaultElement"
5634
+ getGridSize="props.getGridSize"
5567
5635
  />
5568
5636
  <HeadersOverlay onOpenContextMenu="(type, x, y) => this.toggleContextMenu(type, x, y)"/>
5569
5637
  <GridComposer
@@ -5590,16 +5658,17 @@
5590
5658
  onMouseWheel.bind="onMouseWheel"
5591
5659
  onClosePopover.bind="onClosePopover"
5592
5660
  />
5593
- <t t-if="env.model.getters.isGridSelectionActive()">
5661
+ <t t-if="env.model.getters.isGridSelectionActive() and !env.isMobile()">
5594
5662
  <Autofill position="getAutofillPosition()" isVisible="isAutofillVisible"/>
5595
5663
  </t>
5596
5664
  <t t-foreach="highlights" t-as="highlight" t-key="highlight_index">
5597
5665
  <t
5598
- t-if="highlight.interactive and highlight.sheetId === env.model.getters.getActiveSheetId()">
5599
- <Highlight zone="highlight.zone" color="highlight.color"/>
5666
+ t-if="highlight.interactive and highlight.range.sheetId === env.model.getters.getActiveSheetId()">
5667
+ <Highlight range="highlight.range" color="highlight.color"/>
5600
5668
  </t>
5601
5669
  </t>
5602
- <Menu
5670
+ <Selection t-if="displaySelectionHandler"/>
5671
+ <MenuPopover
5603
5672
  t-if="menuState.isOpen"
5604
5673
  menuItems="menuState.menuItems"
5605
5674
  anchorRect="menuState.anchorRect"
@@ -5693,7 +5762,7 @@
5693
5762
  class="w-100 o-input my-2"
5694
5763
  t-ref="filterMenuSearchBar"
5695
5764
  type="text"
5696
- t-model="state.textFilter"
5765
+ t-on-input="updateSearch"
5697
5766
  placeholder="Search..."
5698
5767
  t-on-keydown="onKeyDown"
5699
5768
  />
@@ -5706,7 +5775,7 @@
5706
5775
  t-ref="filterValueList"
5707
5776
  t-on-click="this.clearScrolledToValue"
5708
5777
  t-on-scroll="this.clearScrolledToValue">
5709
- <t t-foreach="displayedValues" t-as="value" t-key="value.string">
5778
+ <t t-foreach="state.displayedValues" t-as="value" t-key="value.string">
5710
5779
  <FilterMenuValueItem
5711
5780
  onClick="() => this.checkValue(value)"
5712
5781
  onMouseMove="() => this.onMouseMove(value)"
@@ -5717,7 +5786,13 @@
5717
5786
  />
5718
5787
  </t>
5719
5788
  <div
5720
- t-if="displayedValues.length === 0"
5789
+ t-if="state.hasMoreValues"
5790
+ class="o-filter-load-more o-button-link d-flex justify-content-center py-1"
5791
+ t-on-click="this.loadMoreValues">
5792
+ Load more...
5793
+ </div>
5794
+ <div
5795
+ t-if="state.displayedValues.length === 0"
5721
5796
  class="o-filter-menu-no-values d-flex align-items-center justify-content-center w-100 h-100 ">
5722
5797
  No results
5723
5798
  </div>
@@ -5814,13 +5889,6 @@
5814
5889
  </div>
5815
5890
  </t>
5816
5891
 
5817
- <t t-name="o-spreadsheet-FilterIcon">
5818
- <div class="o-filter-icon" t-att-class="iconClass" t-on-click="onClick">
5819
- <t t-if="isFilterActive" t-call="o-spreadsheet-Icon.FILTER_ICON_ACTIVE"/>
5820
- <t t-else="" t-call="o-spreadsheet-Icon.FILTER_ICON"/>
5821
- </div>
5822
- </t>
5823
-
5824
5892
  <t t-name="o-spreadsheet-ImageFigure">
5825
5893
  <img t-att-src="getImagePath" class="w-100 h-100"/>
5826
5894
  </t>
@@ -5882,6 +5950,7 @@
5882
5950
  <div
5883
5951
  class="o-figure w-100 h-100"
5884
5952
  t-on-pointerdown.stop="(ev) => this.onMouseDown(ev)"
5953
+ t-on-click="onClick"
5885
5954
  t-on-contextmenu.prevent.stop="(ev) => !env.model.getters.isReadonly() and this.onContextMenu(ev)"
5886
5955
  t-ref="figure"
5887
5956
  t-att-style="props.style"
@@ -5904,7 +5973,7 @@
5904
5973
  t-on-contextmenu.prevent.stop="showMenu">
5905
5974
  <t t-call="o-spreadsheet-Icon.LIST"/>
5906
5975
  </div>
5907
- <Menu
5976
+ <MenuPopover
5908
5977
  t-if="menuState.isOpen"
5909
5978
  anchorRect="menuState.anchorRect"
5910
5979
  menuItems="menuState.menuItems"
@@ -5913,7 +5982,7 @@
5913
5982
  </div>
5914
5983
  </div>
5915
5984
  <div class="o-figure-border w-100 h-100 position-absolute pe-none" t-att-style="borderStyle"/>
5916
- <t t-if="isSelected">
5985
+ <t t-if="isSelected and !env.isMobile()">
5917
5986
  <div
5918
5987
  class="o-fig-anchor o-top"
5919
5988
  t-att-style="this.getResizerPosition('top')"
@@ -5987,7 +6056,7 @@
5987
6056
  t-on-click="openContextMenu"
5988
6057
  />
5989
6058
  </div>
5990
- <Menu
6059
+ <MenuPopover
5991
6060
  t-if="menuState.isOpen"
5992
6061
  anchorRect="menuState.anchorRect"
5993
6062
  menuItems="menuState.menuItems"
@@ -6026,30 +6095,14 @@
6026
6095
  </div>
6027
6096
  </t>
6028
6097
 
6029
- <t t-name="o-spreadsheet-DataValidationListIcon">
6030
- <div
6031
- class="o-dv-list-icon d-flex align-items-center justify-content-center"
6032
- t-on-click="onClick">
6033
- <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
6034
- </div>
6035
- </t>
6036
-
6037
- <t t-name="o-spreadsheet-DataValidationCheckbox">
6038
- <Checkbox
6039
- name="'data-validation-checkbox'"
6040
- value="checkBoxValue"
6041
- onChange.bind="onCheckboxChange"
6042
- className="isDisabled ? 'pe-none o-dv-checkbox' : 'o-dv-checkbox'"
6043
- />
6044
- </t>
6045
-
6046
6098
  <t t-name="o-spreadsheet-SpreadsheetDashboard">
6047
6099
  <div class="o-grid o-two-columns" t-ref="dashboard" tabindex="-1" t-on-wheel="onMouseWheel">
6048
6100
  <div class="mx-auto h-100 position-relative" t-ref="grid" t-att-style="gridContainer">
6049
6101
  <GridOverlay
6050
6102
  onGridResized.bind="onGridResized"
6051
6103
  onGridMoved.bind="moveCanvas"
6052
- gridOverlayDimensions="gridOverlayDimensions">
6104
+ gridOverlayDimensions="gridOverlayDimensions"
6105
+ getGridSize="props.getGridSize">
6053
6106
  <div
6054
6107
  t-foreach="getClickableCells()"
6055
6108
  t-as="clickableCell"
@@ -6197,7 +6250,7 @@
6197
6250
  <t t-set="autoCompleteProposals" t-value="props.composerStore.autoCompleteProposals"/>
6198
6251
  <t
6199
6252
  t-set="assistantIsAvailable"
6200
- t-value="autoCompleteProposals.length or functionDescriptionState.showDescription"
6253
+ t-value="props.showAssistant and (autoCompleteProposals.length or functionDescriptionState.showDescription)"
6201
6254
  />
6202
6255
  <div class="d-flex flex-row position-relative">
6203
6256
  <span
@@ -6220,6 +6273,7 @@
6220
6273
  tabindex="1"
6221
6274
  t-att-contenteditable="env.model.getters.isReadonly() ? 'false' : 'true'"
6222
6275
  t-att-placeHolder="props.placeholder"
6276
+ t-att-inputmode="props.inputMode"
6223
6277
  spellcheck="false"
6224
6278
  t-on-keydown="onKeydown"
6225
6279
  t-on-mousewheel.stop=""
@@ -6434,8 +6488,7 @@
6434
6488
 
6435
6489
  <t t-name="o-spreadsheet-BottomBar">
6436
6490
  <div
6437
- class="o-spreadsheet-bottom-bar o-two-columns d-flex align-items-center overflow-hidden"
6438
- t-att-class="{'mobile': env.isSmall}"
6491
+ class="o-spreadsheet-bottom-bar o-two-columns d-flex flex-fill align-items-center overflow-hidden"
6439
6492
  t-on-click="props.onClick"
6440
6493
  t-ref="bottomBar"
6441
6494
  t-on-contextmenu.prevent="">
@@ -6519,7 +6572,7 @@
6519
6572
  />
6520
6573
  </t>
6521
6574
 
6522
- <Menu
6575
+ <MenuPopover
6523
6576
  t-if="menuState.isOpen"
6524
6577
  anchorRect="menuState.anchorRect"
6525
6578
  menuItems="menuState.menuItems"
@@ -6551,6 +6604,7 @@
6551
6604
  tabindex="-1"
6552
6605
  composerFocusableElement="true"
6553
6606
  t-on-pointerdown="(ev) => this.onMouseDown(ev)"
6607
+ t-on-click="onClick"
6554
6608
  t-on-contextmenu.prevent="(ev) => this.onContextMenu(ev)"
6555
6609
  t-ref="sheetDiv"
6556
6610
  t-att-style="props.style"