@odoo/o-spreadsheet 17.2.0-alpha.4 → 17.2.0-alpha.6

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 17.2.0-alpha.4
5
- @date 2024-02-09T13:11:01.066Z
6
- @hash 1b33cf4
4
+ @version 17.2.0-alpha.6
5
+ @date 2024-02-28T12:29:23.715Z
6
+ @hash 318a04e
7
7
  -->
8
8
  <odoo>
9
9
  <t t-name="o-spreadsheet-ActionButton">
@@ -53,7 +53,7 @@
53
53
  <div
54
54
  class="o-autofill-handler"
55
55
  t-att-style="handlerStyle"
56
- t-on-mousedown="onMouseDown"
56
+ t-on-pointerdown="onMouseDown"
57
57
  t-on-dblclick="onDblClick"
58
58
  />
59
59
  <t t-set="tooltip" t-value="getTooltip()"/>
@@ -260,7 +260,7 @@
260
260
  <Ripple>
261
261
  <div
262
262
  class="o-sheet d-flex align-items-center user-select-none text-nowrap "
263
- t-on-mousedown="(ev) => this.onMouseDown(ev)"
263
+ t-on-pointerdown="(ev) => this.onMouseDown(ev)"
264
264
  t-on-contextmenu.prevent="(ev) => this.onContextMenu(ev)"
265
265
  t-ref="sheetDiv"
266
266
  t-att-style="props.style"
@@ -356,13 +356,13 @@
356
356
  <div
357
357
  class="o-gradient"
358
358
  t-on-click.stop=""
359
- t-on-mousedown="dragGradientPointer"
359
+ t-on-pointerdown="dragGradientPointer"
360
360
  t-att-style="gradientHueStyle">
361
361
  <div class="saturation w-100 h-100 position-absolute pe-none"/>
362
362
  <div class="lightness w-100 h-100 position-absolute pe-none"/>
363
363
  <div class="magnifier pe-none" t-att-style="pointerStyle"/>
364
364
  </div>
365
- <div class="o-hue-container" t-on-mousedown="dragHuePointer">
365
+ <div class="o-hue-container" t-on-pointerdown="dragHuePointer">
366
366
  <div class="o-hue-picker" t-on-click.stop=""/>
367
367
  <div class="o-hue-slider pe-none" t-att-style="sliderStyle">
368
368
  <t t-call="o-spreadsheet-Icon.TRIANGLE_UP"/>
@@ -421,17 +421,17 @@
421
421
 
422
422
  <t t-name="o-spreadsheet-TextValueProvider">
423
423
  <div
424
+ t-ref="autoCompleteList"
424
425
  t-att-class="{
425
- 'o-autocomplete-dropdown':props.values.length,
426
- 'shadow':props.values.length}">
427
- <t t-foreach="props.values" t-as="v" t-key="v.text">
426
+ 'o-autocomplete-dropdown': props.proposals.length}">
427
+ <t t-foreach="props.proposals" t-as="proposal" t-key="proposal.text">
428
428
  <div
429
429
  class="d-flex flex-column text-start"
430
- t-att-class="{'o-autocomplete-value-focus': props.selectedIndex === v_index}"
431
- t-on-click="() => this.props.onValueSelected(v.text)"
432
- t-on-mousemove="() => this.props.onValueHovered(v_index)">
430
+ t-att-class="{'o-autocomplete-value-focus': props.selectedIndex === proposal_index}"
431
+ t-on-click="() => this.props.onValueSelected(proposal.text)"
432
+ t-on-pointermove="() => this.props.onValueHovered(proposal_index)">
433
433
  <div class="o-autocomplete-value text-truncate">
434
- <t t-set="htmlContent" t-value="props.getHtmlContent(v.text)"/>
434
+ <t t-set="htmlContent" t-value="proposal.htmlContent || [{ value: proposal.text}]"/>
435
435
  <span
436
436
  t-foreach="htmlContent"
437
437
  t-as="content"
@@ -443,8 +443,8 @@
443
443
  </div>
444
444
  <div
445
445
  class="o-autocomplete-description text-truncate"
446
- t-esc="v.description"
447
- t-if="props.selectedIndex === v_index"
446
+ t-esc="proposal.description"
447
+ t-if="props.selectedIndex === proposal_index"
448
448
  />
449
449
  </div>
450
450
  </t>
@@ -464,7 +464,7 @@
464
464
  t-on-keydown="onKeydown"
465
465
  t-on-mousewheel.stop=""
466
466
  t-on-input="onInput"
467
- t-on-mousedown="onMousedown"
467
+ t-on-pointerdown="onMousedown"
468
468
  t-on-click="onClick"
469
469
  t-on-keyup="onKeyup"
470
470
  t-on-paste="onPaste"
@@ -474,19 +474,19 @@
474
474
  />
475
475
 
476
476
  <div
477
- t-if="props.focus !== 'inactive' and (autoCompleteState.showProvider or functionDescriptionState.showDescription)"
478
- class="o-composer-assistant"
477
+ t-if="props.focus !== 'inactive' and (autoCompleteState.provider or functionDescriptionState.showDescription)"
478
+ class="o-composer-assistant shadow"
479
479
  t-att-style="assistantStyle"
480
- t-on-mousedown.prevent.stop=""
480
+ t-on-wheel.stop=""
481
+ t-on-pointerdown.prevent.stop=""
481
482
  t-on-click.prevent.stop=""
482
- t-on-mouseup.prevent.stop="">
483
+ t-on-pointerup.prevent.stop="">
483
484
  <TextValueProvider
484
- t-if="autoCompleteState.showProvider"
485
- values="autoCompleteState.values"
485
+ t-if="autoCompleteState.provider"
486
+ proposals="autoCompleteState.provider.proposals"
486
487
  selectedIndex="autoCompleteState.selectedIndex"
487
488
  onValueSelected.bind="this.autoComplete"
488
489
  onValueHovered.bind="this.updateAutoCompleteIndex"
489
- getHtmlContent="autoCompleteState.getHtmlContent"
490
490
  />
491
491
  <FunctionDescriptionProvider
492
492
  t-if="functionDescriptionState.showDescription"
@@ -509,7 +509,7 @@
509
509
  <div
510
510
  class="o-formula-assistant bg-white"
511
511
  t-if="context.functionName"
512
- t-on-mousemove="onMouseMove"
512
+ t-on-pointermove="onMouseMove"
513
513
  t-att-class="{'opacity-25': assistantState.allowCellSelectionBehind}">
514
514
  <div class="o-formula-assistant-head">
515
515
  <span t-esc="context.functionName"/>
@@ -663,6 +663,10 @@
663
663
  <canvas class="o-figure-canvas w-100 h-100" t-att-style="canvasStyle" t-ref="graphContainer"/>
664
664
  </t>
665
665
 
666
+ <t t-name="o-spreadsheet-GaugeChartComponent">
667
+ <canvas class="o-figure-canvas w-100 h-100" t-ref="chartContainer"/>
668
+ </t>
669
+
666
670
  <t t-name="o-spreadsheet-ScorecardChart">
667
671
  <canvas class="o-figure-canvas w-100 h-100" t-ref="chartContainer"/>
668
672
  </t>
@@ -671,7 +675,7 @@
671
675
  <div class="o-figure-wrapper pe-auto" t-att-style="wrapperStyle">
672
676
  <div
673
677
  class="o-figure w-100 h-100"
674
- t-on-mousedown.stop="(ev) => this.onMouseDown(ev)"
678
+ t-on-pointerdown.stop="(ev) => this.onMouseDown(ev)"
675
679
  t-on-contextmenu.prevent.stop="(ev) => !env.model.getters.isReadonly() and this.onContextMenu(ev)"
676
680
  t-ref="figure"
677
681
  t-att-style="props.style"
@@ -707,42 +711,42 @@
707
711
  <div
708
712
  class="o-fig-anchor o-top"
709
713
  t-att-style="this.getResizerPosition('top')"
710
- t-on-mousedown="(ev) => this.clickAnchor(0,-1, ev)"
714
+ t-on-pointerdown="(ev) => this.clickAnchor(0,-1, ev)"
711
715
  />
712
716
  <div
713
717
  class="o-fig-anchor o-topRight"
714
718
  t-att-style="this.getResizerPosition('top right')"
715
- t-on-mousedown="(ev) => this.clickAnchor(1,-1, ev)"
719
+ t-on-pointerdown="(ev) => this.clickAnchor(1,-1, ev)"
716
720
  />
717
721
  <div
718
722
  class="o-fig-anchor o-right"
719
723
  t-att-style="this.getResizerPosition('right')"
720
- t-on-mousedown="(ev) => this.clickAnchor(1,0, ev)"
724
+ t-on-pointerdown="(ev) => this.clickAnchor(1,0, ev)"
721
725
  />
722
726
  <div
723
727
  class="o-fig-anchor o-bottomRight"
724
728
  t-att-style="this.getResizerPosition('bottom right')"
725
- t-on-mousedown="(ev) => this.clickAnchor(1,1, ev)"
729
+ t-on-pointerdown="(ev) => this.clickAnchor(1,1, ev)"
726
730
  />
727
731
  <div
728
732
  class="o-fig-anchor o-bottom"
729
733
  t-att-style="this.getResizerPosition('bottom')"
730
- t-on-mousedown="(ev) => this.clickAnchor(0,1, ev)"
734
+ t-on-pointerdown="(ev) => this.clickAnchor(0,1, ev)"
731
735
  />
732
736
  <div
733
737
  class="o-fig-anchor o-bottomLeft"
734
738
  t-att-style="this.getResizerPosition('bottom left')"
735
- t-on-mousedown="(ev) => this.clickAnchor(-1,1, ev)"
739
+ t-on-pointerdown="(ev) => this.clickAnchor(-1,1, ev)"
736
740
  />
737
741
  <div
738
742
  class="o-fig-anchor o-left"
739
743
  t-att-style="this.getResizerPosition('left')"
740
- t-on-mousedown="(ev) => this.clickAnchor(-1,0, ev)"
744
+ t-on-pointerdown="(ev) => this.clickAnchor(-1,0, ev)"
741
745
  />
742
746
  <div
743
747
  class="o-fig-anchor o-topLeft"
744
748
  t-att-style="this.getResizerPosition('top left')"
745
- t-on-mousedown="(ev) => this.clickAnchor(-1,-1, ev)"
749
+ t-on-pointerdown="(ev) => this.clickAnchor(-1,-1, ev)"
746
750
  />
747
751
  </t>
748
752
  </div>
@@ -802,7 +806,7 @@
802
806
  </t>
803
807
 
804
808
  <t t-name="o-spreadsheet-FilterIcon">
805
- <div class="o-filter-icon" t-on-click.stop="onClick">
809
+ <div class="o-filter-icon" t-att-class="iconClass" t-on-click.stop="onClick">
806
810
  <t t-if="isFilterActive" t-call="o-spreadsheet-Icon.FILTER_ICON_ACTIVE"/>
807
811
  <t t-else="" t-call="o-spreadsheet-Icon.FILTER_ICON"/>
808
812
  </div>
@@ -882,7 +886,7 @@
882
886
  <t t-name="o-spreadsheet-FilterMenuValueItem">
883
887
  <div
884
888
  t-on-click="this.props.onClick"
885
- t-on-mousemove="this.props.onMouseMove"
889
+ t-on-pointermove="this.props.onMouseMove"
886
890
  class="o-filter-menu-item o-filter-menu-value"
887
891
  t-ref="menuValueItem"
888
892
  t-att-class="{'selected': this.props.isSelected}">
@@ -909,7 +913,7 @@
909
913
  type="number"
910
914
  min="1"
911
915
  max="400"
912
- class="o-font-size bg-transparent border-0"
916
+ class="o-font-size o-number-input bg-transparent border-0"
913
917
  t-on-keydown="onInputKeydown"
914
918
  t-on-click.stop=""
915
919
  t-on-focus.stop="onInputFocused"
@@ -1003,7 +1007,7 @@
1003
1007
  <div
1004
1008
  class="o-grid-add-rows mt-2 ms-2 w-100 d-flex position-relative align-items-center"
1005
1009
  t-att-style="addRowsPosition"
1006
- t-on-mousedown.stop.prevent="">
1010
+ t-on-pointerdown.stop.prevent="">
1007
1011
  <button t-on-click="onConfirm" t-att-disabled="state.errorFlag" class="o-button">Add</button>
1008
1012
  <input
1009
1013
  type="text"
@@ -1012,7 +1016,7 @@
1012
1016
  value="100"
1013
1017
  t-on-click.stop=""
1014
1018
  t-on-keydown.stop="onKeydown"
1015
- t-on-mousedown.stop=""
1019
+ t-on-pointerdown.stop=""
1016
1020
  t-on-input.stop="onInput"
1017
1021
  />
1018
1022
  <span>more rows at the bottom</span>
@@ -1035,7 +1039,7 @@
1035
1039
  class="o-grid-overlay overflow-hidden"
1036
1040
  t-att-class="{'o-paint-format-cursor': isPaintingFormat}"
1037
1041
  t-att-style="style"
1038
- t-on-mousedown="onMouseDown"
1042
+ t-on-pointerdown="onMouseDown"
1039
1043
  t-on-dblclick.self="onDoubleClick"
1040
1044
  t-on-contextmenu.stop.prevent="onContextMenu">
1041
1045
  <FiguresContainer onFigureDeleted="props.onFigureDeleted"/>
@@ -1161,18 +1165,18 @@
1161
1165
  <div class="o-overlay">
1162
1166
  <ColResizer onOpenContextMenu="props.onOpenContextMenu"/>
1163
1167
  <RowResizer onOpenContextMenu="props.onOpenContextMenu"/>
1164
- <div class="all" t-on-mousedown.self="selectAll"/>
1168
+ <div class="all" t-on-pointerdown.self="selectAll"/>
1165
1169
  </div>
1166
1170
  </t>
1167
1171
 
1168
1172
  <t t-name="o-spreadsheet-RowResizer">
1169
1173
  <div
1170
1174
  class="o-row-resizer"
1171
- t-on-mousemove.self="onMouseMove"
1175
+ t-on-pointermove.self="onMouseMove"
1172
1176
  t-on-mouseleave="onMouseLeave"
1173
- t-on-mousedown.self.prevent="select"
1177
+ t-on-pointerdown.self.prevent="select"
1174
1178
  t-ref="rowResizer"
1175
- t-on-mouseup.self="onMouseUp"
1179
+ t-on-pointerup.self="onMouseUp"
1176
1180
  t-on-contextmenu.self="onContextMenu"
1177
1181
  t-att-class="{'o-grab': state.waitingForMove, 'o-dragging': state.isMoving}">
1178
1182
  <div
@@ -1188,7 +1192,7 @@
1188
1192
  <t t-if="state.resizerIsActive">
1189
1193
  <div
1190
1194
  class="o-handle"
1191
- t-on-mousedown="onMouseDown"
1195
+ t-on-pointerdown="onMouseDown"
1192
1196
  t-on-dblclick="onDblClick"
1193
1197
  t-on-contextmenu.prevent=""
1194
1198
  t-attf-style="top:{{state.draggerLinePosition - 2}}px;">
@@ -1227,11 +1231,11 @@
1227
1231
  <t t-name="o-spreadsheet-ColResizer">
1228
1232
  <div
1229
1233
  class="o-col-resizer"
1230
- t-on-mousemove.self="onMouseMove"
1234
+ t-on-pointermove.self="onMouseMove"
1231
1235
  t-on-mouseleave="onMouseLeave"
1232
- t-on-mousedown.self.prevent="select"
1236
+ t-on-pointerdown.self.prevent="select"
1233
1237
  t-ref="colResizer"
1234
- t-on-mouseup.self="onMouseUp"
1238
+ t-on-pointerup.self="onMouseUp"
1235
1239
  t-on-contextmenu.self="onContextMenu"
1236
1240
  t-att-class="{'o-grab': state.waitingForMove, 'o-dragging': state.isMoving, }">
1237
1241
  <div
@@ -1247,7 +1251,7 @@
1247
1251
  <t t-if="state.resizerIsActive">
1248
1252
  <div
1249
1253
  class="o-handle"
1250
- t-on-mousedown="onMouseDown"
1254
+ t-on-pointerdown="onMouseDown"
1251
1255
  t-on-dblclick="onDblClick"
1252
1256
  t-on-contextmenu.prevent=""
1253
1257
  t-attf-style="left:{{state.draggerLinePosition - 2}}px;">
@@ -1286,7 +1290,7 @@
1286
1290
  <t t-name="o-spreadsheet-Border">
1287
1291
  <div
1288
1292
  class="o-border"
1289
- t-on-mousedown.prevent="onMouseDown"
1293
+ t-on-pointerdown.prevent="onMouseDown"
1290
1294
  t-att-style="style"
1291
1295
  t-att-class="{
1292
1296
  'o-moving': props.isMoving,
@@ -1301,7 +1305,7 @@
1301
1305
  <t t-name="o-spreadsheet-Corner">
1302
1306
  <div
1303
1307
  class="o-corner"
1304
- t-on-mousedown.prevent="onMouseDown"
1308
+ t-on-pointerdown.prevent="onMouseDown"
1305
1309
  t-att-style="style"
1306
1310
  t-att-class="{
1307
1311
  'o-resizing': props.isResizing,
@@ -1488,15 +1492,15 @@
1488
1492
  />
1489
1493
  </svg>
1490
1494
  </t>
1491
- <t t-name="o-spreadsheet-Icon.SHOW_HIDE_GRID">
1492
- <svg class="o-icon">
1493
- <path
1494
- fill="currentColor"
1495
- d="M.5 2A1.5 1.5 0 0 1 2 .5h14A1.5 1.5 0 0 1 17.5 2v7H11V7H7v4s-.5 0-1.5 1h-1v5h-3a1.5 1.5 0 0 1-1-1M6 6V2H2v4m9 0V2H7v4m9 0V2h-4v4m-6 5V7H2v4m14-2V7h-4v2m-7.5 6.5V12H2v3.5 M14 10.5c1 0 1 .5 1 1-1.5 2.5-3.5 4.5-5 6.5-.5 0-1-.5-1-1-1-.5-1.5-1-2.5-2 0 0-.5-.5 0-1 1.5-2 4-3 7-3m-1 1.5C13.5 12 4 14 10 16c0 0-1.5-2 2.5-3.5m5 1.5c.5.5.5 1 .5 1-1.5 2-3.5 3-6 2.5.5-.5.5-1 1-1s5.5-1 2-3.5l1-1"
1496
- />
1495
+ <t t-name="o-spreadsheet-Icon.SHOW">
1496
+ <svg class="o-icon" viewBox="0 0 24 24" fill="none" stroke="currentcolor">
1497
+ <path stroke-width="1.35" d="M1,12 S11.5,0 23,12 M1,12 S11.5,24 23,12"/>
1498
+ <path d="M1.26,11.7 A .4 .3 1 0 0 1.2,12.3"/>
1499
+ <path d="M22.8,11.7 A .4 .3 1 0 1 22.75,12.3"/>
1500
+ <circle stroke-width="1.35" stroke="currentcolor" cx="12" cy="12" r="3"/>
1497
1501
  </svg>
1498
1502
  </t>
1499
- <t t-name="o-spreadsheet-Icon.SHOW_HIDE_FORMULA">
1503
+ <t t-name="o-spreadsheet-Icon.FORMULA">
1500
1504
  <svg class="o-icon">
1501
1505
  <path
1502
1506
  fill="currentColor"
@@ -2127,12 +2131,7 @@ https://fontawesome.com/license -->
2127
2131
  </svg>
2128
2132
  </t>
2129
2133
  <t t-name="o-spreadsheet-Icon.FILTER_ICON">
2130
- <svg
2131
- class="o-cf-icon filter-icon"
2132
- width="10"
2133
- height="10"
2134
- focusable="false"
2135
- viewBox="0 0 850 850">
2134
+ <svg class="o-cf-icon filter-icon" viewBox="0 0 850 850">
2136
2135
  <path
2137
2136
  fill="currentColor"
2138
2137
  d="M 339.667 681 L 510.333 681 L 510.333 595.667 L 339.667 595.667 L 339.667 681 Z M 41 169 L 41 254.333 L 809 254.333 L 809 169 L 41 169 Z M 169 467.667 L 681 467.667 L 681 382.333 L 169 382.333 L 169 467.667 Z"
@@ -2140,33 +2139,7 @@ https://fontawesome.com/license -->
2140
2139
  </svg>
2141
2140
  </t>
2142
2141
  <t t-name="o-spreadsheet-Icon.FILTER_ICON_ACTIVE">
2143
- <svg
2144
- class="o-cf-icon filter-icon-active"
2145
- width="10"
2146
- height="10"
2147
- focusable="false"
2148
- viewBox="0 0 512 512">
2149
- <path
2150
- fill="currentColor"
2151
- d="M487.976 0H24.028C2.71 0-8.047 25.866 7.058 40.971L192 225.941V432c0 7.831 3.821 15.17 10.237 19.662l80 55.98C298.02 518.69 320 507.493 320 487.98V225.941l184.947-184.97C520.021 25.896 509.338 0 487.976 0z"
2152
- />
2153
- </svg>
2154
- </t>
2155
- <t t-name="o-spreadsheet-Icon.FILTER_ICON_INACTIVE">
2156
- <svg
2157
- class="o-cf-icon filter-icon-inactive"
2158
- width="10"
2159
- height="10"
2160
- focusable="false"
2161
- viewBox="0 0 512 512">
2162
- <path
2163
- fill="currentColor"
2164
- d="M487.976 0H24.028C2.71 0-8.047 25.866 7.058 40.971L192 225.941V432c0 7.831 3.821 15.17 10.237 19.662l80 55.98C298.02 518.69 320 507.493 320 487.98V225.941l184.947-184.97C520.021 25.896 509.338 0 487.976 0z"
2165
- />
2166
- </svg>
2167
- </t>
2168
- <t t-name="o-spreadsheet-Icon.MENU_FILTER_ICON">
2169
- <svg class="o-icon">
2142
+ <svg class="o-cf-icon filter-icon-active" viewBox="0 0 18 18">
2170
2143
  <path
2171
2144
  fill="currentColor"
2172
2145
  d="M16.6.5H1.29C.59.5.23 1.35.73 1.85l6.1 6.1v6.8c0 .26.13.5.34.65l2.64 1.85a.79.79 0 0 0 1.25-.65V7.96l6.1-6.1A.79.79 0 0 0 16.6.51"
@@ -2315,6 +2288,30 @@ https://fontawesome.com/license -->
2315
2288
  <circle cx="2" cy="12.5" r="1"/>
2316
2289
  </svg>
2317
2290
  </t>
2291
+ <t t-name="o-spreadsheet-Icon.EDIT_TABLE">
2292
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18">
2293
+ <path
2294
+ fill="currentColor"
2295
+ d="M2.5 1A1.5 1.5 0 0 0 1 2.5v11A1.5 1.5 0 0 0 2.5 15H7l1.5-1.5H7v-2.75h3.5v.75l2.25-2.25H12v-2.5h3.5v.75c.1-.2.45-.05.5.02l1 1V2.5A1.5 1.5 0 0 0 15.5 1m-13 1.5h13v2.75h-13m0 1.5h3v2.5h-3M7 6.75h3.5v2.5H7m-4.5 1.5h3v2.75h-3 M8.2 15.7v1.8h1.8l5.4-5.4-1.8-1.8-5.4 5.4Zm8.8-5.2a.5.5 0 0 0 0-.7l-1.1-1.1a.5.5 0 0 0-.7 0l-.9.9 1.8 1.8.9-.9Z"
2296
+ />
2297
+ </svg>
2298
+ </t>
2299
+ <t t-name="o-spreadsheet-Icon.DELETE_TABLE">
2300
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18">
2301
+ <path
2302
+ fill="currentColor"
2303
+ d="M2.5 1A1.5 1.5 0 0 0 1 2.5v11A1.5 1.5 0 0 0 2.5 15H7l1.5-1.5H7V6.75h3.5v.75L12 9V6.75h3.5l1.5 1.5V2.5A1.5 1.5 0 0 0 15.5 1m-13 1.5h13v2.75h-13m0 1.5h3v2.5h-3m0 1.5h3v2.75h-3m10-2.25 3-3 1.5 1.5-3 3 3 3-1.5 1.5-3-3-3 3-1.5-1.5 3-3-3-3 1.5-1.5"
2304
+ />
2305
+ </svg>
2306
+ </t>
2307
+ <t t-name="o-spreadsheet-Icon.PAINT_TABLE">
2308
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18">
2309
+ <path
2310
+ fill="currentColor"
2311
+ d="M2.5 1A1.5 1.5 0 0 0 1 2.5v11A1.5 1.5 0 0 0 2.5 15h5c0-.5 0-1 .5-1.5H7v-2.75h3.5v.75l2.25-2.25H12v-2.5h3.5v.75c1-.7 1.5-.4 1.5-.4V2.5A1.5 1.5 0 0 0 15.5 1m-13 1.5h13v2.75h-13m0 1.5h3v2.5h-3M7 6.75h3.5v2.5H7m-4.5 1.5h3v2.75h-3m7.5-.3c.7-.3 1.5-.1 2.1.6.6.7.8 1.4.5 1.9-.6 1.4-3.7 1.6-4 1.7l-.6.1.3-.5s.5-.8.5-2.1c0-.7.5-1.4 1.1-1.7Zm6.7-5.1a.9.9 0 0 1 1 1c-.1 1.3-2.5 3.7-4.3 5.3a3.9 3.9 0 0 0-.6-1.1c-.4-.4-.8-.7-1.3-.8 1.5-1.7 4-4.3 5.4-4.4"
2312
+ />
2313
+ </svg>
2314
+ </t>
2318
2315
 
2319
2316
  <t t-name="o-spreadsheet-LinkDisplay">
2320
2317
  <div class="o-link-tool d-flex align-items-center">
@@ -2971,26 +2968,26 @@ https://fontawesome.com/license -->
2971
2968
  </t>
2972
2969
 
2973
2970
  <t t-name="o-spreadsheet-ChartPanel">
2974
- <div class="o-chart">
2971
+ <div class="o-chart" t-if="figureId">
2975
2972
  <div class="o-panel">
2976
2973
  <div
2977
2974
  class="o-panel-element o-panel-configuration"
2978
- t-att-class="state.panel !== 'configuration' ? 'inactive' : ''"
2979
- t-on-click="() => this.activatePanel('configuration')">
2975
+ t-att-class="store.panel !== 'configuration' ? 'inactive' : ''"
2976
+ t-on-click="() => this.store.activatePanel('configuration')">
2980
2977
  <i class="fa fa-sliders"/>
2981
2978
  Configuration
2982
2979
  </div>
2983
2980
  <div
2984
2981
  class="o-panel-element o-panel-design"
2985
- t-att-class="state.panel !== 'design' ? 'inactive' : ''"
2986
- t-on-click="() => this.activatePanel('design')">
2982
+ t-att-class="store.panel !== 'design' ? 'inactive' : ''"
2983
+ t-on-click="() => this.store.activatePanel('design')">
2987
2984
  <i class="fa fa-paint-brush"/>
2988
2985
  Design
2989
2986
  </div>
2990
2987
  </div>
2991
2988
 
2992
- <t t-set="definition" t-value="getChartDefinition()"/>
2993
- <t t-if="state.panel === 'configuration'">
2989
+ <t t-set="definition" t-value="getChartDefinition(this.figureId)"/>
2990
+ <t t-if="store.panel === 'configuration'">
2994
2991
  <Section>
2995
2992
  <t t-set-slot="title">Chart type</t>
2996
2993
  <t t-set="types" t-value="chartTypes"/>
@@ -3032,12 +3029,12 @@ https://fontawesome.com/license -->
3032
3029
  <t t-name="o-spreadsheet-ScatterConfigPanel">
3033
3030
  <div>
3034
3031
  <ChartDataSeries
3035
- ranges="() => this.getDataSeriesRanges()"
3032
+ ranges="this.getDataSeriesRanges()"
3036
3033
  onSelectionChanged="(ranges) => this.onDataSeriesRangesChanged(ranges)"
3037
3034
  onSelectionConfirmed="() => this.onDataSeriesConfirmed()"
3038
3035
  />
3039
3036
  <ChartLabelRange
3040
- range="() => this.getLabelRange()"
3037
+ range="this.getLabelRange()"
3041
3038
  isInvalid="isLabelInvalid"
3042
3039
  onSelectionChanged="(ranges) => this.onLabelRangeChanged(ranges)"
3043
3040
  onSelectionConfirmed="() => this.onLabelRangeConfirmed()"
@@ -3142,9 +3139,13 @@ https://fontawesome.com/license -->
3142
3139
  </t>
3143
3140
 
3144
3141
  <t t-name="o-spreadsheet.Checkbox">
3145
- <label class="o-checkbox">
3142
+ <label
3143
+ class="o-checkbox"
3144
+ t-att-title="props.title"
3145
+ t-att-class="{'text-muted': props.disabled }">
3146
3146
  <input
3147
3147
  type="checkbox"
3148
+ t-att-disabled="props.disabled"
3148
3149
  t-att-name="props.name"
3149
3150
  t-att-checked="props.value"
3150
3151
  t-on-change="onChange"
@@ -3552,7 +3553,7 @@ https://fontawesome.com/license -->
3552
3553
  t-att-class="props.class"
3553
3554
  t-att-data-id="cf.id"
3554
3555
  t-on-click="props.onPreviewClick"
3555
- t-on-mousedown="(ev) => this.onMouseDown(ev)">
3556
+ t-on-pointerdown="(ev) => this.onMouseDown(ev)">
3556
3557
  <div class="position-relative h-100 w-100 d-flex align-items-center">
3557
3558
  <div class="o-cf-drag-handle h-100 position-absolute d-flex align-items-center text-muted">
3558
3559
  <t t-call="o-spreadsheet-Icon.THIN_DRAG_HANDLE"/>
@@ -4076,7 +4077,7 @@ https://fontawesome.com/license -->
4076
4077
  <select
4077
4078
  t-att-class="props.class"
4078
4079
  t-ref="select"
4079
- t-on-mousedown.stop.prevent=""
4080
+ t-on-pointerdown.stop.prevent=""
4080
4081
  t-on-click="onClick">
4081
4082
  <option selected="true" t-esc="props.selectedValue"/>
4082
4083
  </select>
@@ -4121,24 +4122,24 @@ https://fontawesome.com/license -->
4121
4122
  </t>
4122
4123
 
4123
4124
  <t t-name="o-spreadsheet-SidePanel">
4124
- <div class="o-sidePanel">
4125
+ <div class="o-sidePanel" t-if="sidePanelStore.isOpen">
4125
4126
  <div class="o-sidePanelHeader">
4126
4127
  <div class="o-sidePanelTitle" t-esc="getTitle()"/>
4127
- <div class="o-sidePanelClose" t-on-click="() => this.props.onCloseSidePanel()">✕</div>
4128
+ <div class="o-sidePanelClose" t-on-click="close">✕</div>
4128
4129
  </div>
4129
4130
  <div class="o-sidePanelBody">
4130
4131
  <t
4131
- t-component="state.panel.Body"
4132
- t-props="props.panelProps"
4133
- onCloseSidePanel="props.onCloseSidePanel"
4134
- t-key="'Body_' + props.component"
4132
+ t-component="panel.Body"
4133
+ t-props="sidePanelStore.panelProps"
4134
+ onCloseSidePanel.bind="close"
4135
+ t-key="'Body_' + sidePanelStore.componentTag"
4135
4136
  />
4136
4137
  </div>
4137
- <div class="o-sidePanelFooter" t-if="state.panel.Footer">
4138
+ <div class="o-sidePanelFooter" t-if="panel?.Footer">
4138
4139
  <t
4139
- t-component="state.panel.Footer"
4140
- t-props="props.panelProps"
4141
- t-key="'Footer_' + props.component"
4140
+ t-component="panel.Footer"
4141
+ t-props="sidePanelStore.panelProps"
4142
+ t-key="'Footer_' + sidePanelStore.componentTag"
4142
4143
  />
4143
4144
  </div>
4144
4145
  </div>
@@ -4190,6 +4191,90 @@ https://fontawesome.com/license -->
4190
4191
  </div>
4191
4192
  </t>
4192
4193
 
4194
+ <t t-name="o-spreadsheet-TablePanel">
4195
+ <div class="o-table-panel">
4196
+ <Section>
4197
+ <t t-set-slot="title">Style options</t>
4198
+ <div class="d-flex flex-row">
4199
+ <div class="w-50">
4200
+ <div class="d-flex align-items-center">
4201
+ <Checkbox
4202
+ label="getCheckboxLabel('headerRow')"
4203
+ name="'headerRow'"
4204
+ value="tableConfig.numberOfHeaders > 0"
4205
+ onChange.bind="this.updateHasHeaders"
4206
+ />
4207
+ <input
4208
+ t-if="tableConfig.numberOfHeaders > 0"
4209
+ t-att-value="tableConfig.numberOfHeaders"
4210
+ type="number"
4211
+ class="o-table-n-of-headers ms-2 o-number-input"
4212
+ t-on-change="onChangeNumberOfHeaders"
4213
+ />
4214
+ </div>
4215
+ <Checkbox
4216
+ label="getCheckboxLabel('totalRow')"
4217
+ name="'totalRow'"
4218
+ value="tableConfig.totalRow"
4219
+ onChange="(val) => this.updateTableConfig('totalRow', val)"
4220
+ />
4221
+ <Checkbox
4222
+ label="getCheckboxLabel('bandedRows')"
4223
+ name="'bandedRows'"
4224
+ value="tableConfig.bandedRows"
4225
+ onChange="(val) => this.updateTableConfig('bandedRows', val)"
4226
+ />
4227
+ <Checkbox
4228
+ label="getCheckboxLabel('hasFilters')"
4229
+ name="'hasFilters'"
4230
+ value="tableConfig.hasFilters"
4231
+ title="hasFilterCheckboxTooltip"
4232
+ disabled="!this.canHaveFilters"
4233
+ onChange.bind="this.updateHasFilters"
4234
+ />
4235
+ </div>
4236
+ <div>
4237
+ <Checkbox
4238
+ label="getCheckboxLabel('firstColumn')"
4239
+ name="'firstColumn'"
4240
+ value="tableConfig.firstColumn"
4241
+ onChange="(val) => this.updateTableConfig('firstColumn', val)"
4242
+ />
4243
+ <Checkbox
4244
+ label="getCheckboxLabel('lastColumn')"
4245
+ name="'lastColumn'"
4246
+ value="tableConfig.lastColumn"
4247
+ onChange="(val) => this.updateTableConfig('lastColumn', val)"
4248
+ />
4249
+ <Checkbox
4250
+ label="getCheckboxLabel('bandedColumns')"
4251
+ name="'bandedColumns'"
4252
+ value="tableConfig.bandedColumns"
4253
+ onChange="(val) => this.updateTableConfig('bandedColumns', val)"
4254
+ />
4255
+ </div>
4256
+ </div>
4257
+ </Section>
4258
+ <Section>
4259
+ <TableStylePicker table="props.table"/>
4260
+ </Section>
4261
+ <Section>
4262
+ <t t-set-slot="title">Data range</t>
4263
+ <SelectionInput
4264
+ t-key="props.table.id"
4265
+ ranges="[this.state.tableXc]"
4266
+ hasSingleRange="true"
4267
+ onSelectionChanged="(ranges) => this.onRangeChanged(ranges)"
4268
+ onSelectionConfirmed.bind="this.onRangeConfirmed"
4269
+ />
4270
+ <ValidationMessages messages="errorMessages" msgType="'error'"/>
4271
+ </Section>
4272
+ <div class="o-sidePanelButtons">
4273
+ <button t-on-click="deleteTable" class="o-table-delete o-button">Delete table</button>
4274
+ </div>
4275
+ </div>
4276
+ </t>
4277
+
4193
4278
  <t t-name="o-spreadsheet-Spreadsheet">
4194
4279
  <div
4195
4280
  class="o-spreadsheet"
@@ -4214,23 +4299,94 @@ https://fontawesome.com/license -->
4214
4299
  <HeaderGroupContainer layers="rowLayers" dimension="'ROW'"/>
4215
4300
  </div>
4216
4301
  <div class="o-group-grid overflow-hidden">
4217
- <Grid
4218
- sidePanelIsOpen="sidePanel.isOpen"
4219
- exposeFocus="(focus) => this._focusGrid = focus"
4220
- />
4302
+ <Grid exposeFocus="(focus) => this._focusGrid = focus"/>
4221
4303
  </div>
4222
4304
  </div>
4223
- <SidePanel
4224
- t-if="sidePanel.isOpen"
4225
- onCloseSidePanel="() => this.closeSidePanel()"
4226
- component="sidePanel.component"
4227
- panelProps="sidePanel.panelProps"
4228
- />
4305
+ <SidePanel/>
4229
4306
  <BottomBar onClick="() => this.focusGrid()"/>
4230
4307
  </t>
4231
4308
  </div>
4232
4309
  </t>
4233
4310
 
4311
+ <t t-name="o-spreadsheet-TableDropdownButton">
4312
+ <div class="o-table-widget d-flex align-item-center">
4313
+ <ActionButton
4314
+ action="action"
4315
+ hasTriangleDownIcon="true"
4316
+ t-on-click="onClick"
4317
+ class="'o-hoverable-button'"
4318
+ />
4319
+ </div>
4320
+ <TableStylesPopover
4321
+ tableConfig="tableConfig"
4322
+ onStylePicked.bind="onStylePicked"
4323
+ popoverProps="state.popoverProps"
4324
+ closePopover.bind="closePopover"
4325
+ />
4326
+ </t>
4327
+
4328
+ <t t-name="o-spreadsheet-TableStylePicker">
4329
+ <div class="o-table-style-picker d-flex flew-row justify-content-between ps-1">
4330
+ <div class="d-flex flex-row overflow-hidden">
4331
+ <div
4332
+ class="o-table-style-list-item"
4333
+ t-att-class="{ 'selected': styleId === props.table.config.styleId }"
4334
+ t-foreach="getDisplayedTableStyles()"
4335
+ t-as="styleId"
4336
+ t-key="styleId"
4337
+ t-att-title="getStyleName(styleId)"
4338
+ t-on-click="() => this.onStylePicked(styleId)">
4339
+ <div class="o-table-style-picker-preview">
4340
+ <TableStylePreview tableConfig="getTableConfig(styleId)"/>
4341
+ </div>
4342
+ </div>
4343
+ </div>
4344
+ <div
4345
+ class="o-table-style-picker-arrow d-flex align-items-center px-1"
4346
+ t-on-click.stop="onArrowButtonClick">
4347
+ <t t-call="o-spreadsheet-Icon.TRIANGLE_DOWN"/>
4348
+ </div>
4349
+ </div>
4350
+ <TableStylesPopover
4351
+ tableConfig="props.table.config"
4352
+ selectedStyleId="props.table.config.styleId"
4353
+ onStylePicked.bind="onStylePicked"
4354
+ popoverProps="state.popoverProps"
4355
+ closePopover.bind="closePopover"
4356
+ />
4357
+ </t>
4358
+
4359
+ <t t-name="o-spreadsheet-TableStylePreview">
4360
+ <canvas t-ref="canvas" class="w-100 h-100"/>
4361
+ </t>
4362
+
4363
+ <t t-name="o-spreadsheet-TableStylesPopover">
4364
+ <Popover t-if="props.popoverProps" t-props="props.popoverProps">
4365
+ <div class="o-table-style-popover d-flex flex-column px-4 py-1" t-ref="tableStyleList">
4366
+ <div t-foreach="categories" t-as="category" t-key="category">
4367
+ <div class="mt-2 mb-1">
4368
+ <b t-esc="category_value"/>
4369
+ </div>
4370
+ <div class="d-flex flex-wrap">
4371
+ <div
4372
+ class="o-table-style-list-item"
4373
+ t-att-class="{ 'selected': styleId === props.selectedStyleId }"
4374
+ t-foreach="getPresetsByCategory(category)"
4375
+ t-as="styleId"
4376
+ t-key="styleId"
4377
+ t-att-title="getStyleName(styleId)"
4378
+ t-on-click="() => this.props.onStylePicked(styleId)">
4379
+ <div class="o-table-style-popover-preview">
4380
+ <TableStylePreview tableConfig="getTableConfig(styleId)"/>
4381
+ </div>
4382
+ </div>
4383
+ </div>
4384
+ <hr t-if="!category_last" class="hr mt-2 mb-0"/>
4385
+ </div>
4386
+ </div>
4387
+ </Popover>
4388
+ </t>
4389
+
4234
4390
  <t t-name="o-spreadsheet-TopBar">
4235
4391
  <t t-set="text_color">Text Color</t>
4236
4392
  <t t-set="fill_color">Fill Color</t>
@@ -4396,7 +4552,8 @@ https://fontawesome.com/license -->
4396
4552
 
4397
4553
  <div class="o-divider"/>
4398
4554
 
4399
- <ActionButton action="VIEW.createRemoveFilter" class="'o-hoverable-button'"/>
4555
+ <TableDropdownButton/>
4556
+ <ActionButton action="DATA.createRemoveFilterTool" class="'o-hoverable-button'"/>
4400
4557
  </div>
4401
4558
  </div>
4402
4559
  <TopBarComposer/>