@odoo/o-spreadsheet 19.1.0-alpha.0 → 19.1.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.
@@ -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.1.0-alpha.0
5
- @date 2025-09-11T07:50:38.945Z
6
- @hash 587c928
4
+ @version 19.1.0-alpha.10
5
+ @date 2025-10-30T12:27:22.089Z
6
+ @hash d0b65e9
7
7
  -->
8
8
  <odoo>
9
9
  <t t-name="o-spreadsheet-ValidationMessages">
@@ -215,22 +215,20 @@
215
215
  </div>
216
216
  </t>
217
217
 
218
- <div t-name="o-spreadsheet-TextInput" class="w-100">
218
+ <t t-name="o-spreadsheet-TextInput">
219
219
  <input
220
- t-ref="input"
221
- class="os-input w-100"
222
220
  type="text"
221
+ t-ref="{{refName}}"
223
222
  t-att-class="inputClass"
224
223
  t-att-id="props.id"
225
224
  t-att-placeholder="props.placeholder"
226
- t-att-value="props.value"
227
225
  t-on-change="save"
228
226
  t-on-blur="save"
229
227
  t-on-pointerdown="onMouseDown"
230
228
  t-on-pointerup="onMouseUp"
231
229
  t-on-keydown="onKeyDown"
232
230
  />
233
- </div>
231
+ </t>
234
232
 
235
233
  <t t-name="o-spreadsheet-TableStylesPopover">
236
234
  <Popover t-if="props.popoverProps" t-props="props.popoverProps">
@@ -361,7 +359,7 @@
361
359
  t-att-style="getStyle()">
362
360
  <t t-if="env.isDashboard()">
363
361
  <SpreadsheetDashboard getGridSize.bind="getGridSize"/>
364
- <FullScreenChart/>
362
+ <FullScreenFigure/>
365
363
  </t>
366
364
  <t t-else="">
367
365
  <div class="o-spreadsheet-topbar-wrapper o-two-columns">
@@ -398,9 +396,14 @@
398
396
  <RibbonMenu onClose="() => this.menuState.isOpen=false"/>
399
397
  </t>
400
398
  <t t-else="">
401
- <div class="o-small-composer px-2 py-2">
399
+ <div class="o-small-composer px-2 py-2 position-relative">
402
400
  <div class="w-100" t-ref="bottombarComposer">
403
401
  <Composer t-props="composerProps"/>
402
+ <span
403
+ t-if="showFxIcon"
404
+ class="position-absolute top-50 translate-middle-y ps-2 pe-none">
405
+ <t t-call="o-spreadsheet-Icon.FX_SVG"/>
406
+ </span>
404
407
  </div>
405
408
  <span
406
409
  class="align-items-center d-flex justify-content-center o-selection-button"
@@ -448,7 +451,10 @@
448
451
  </div>
449
452
  <span class="d-flex align-items-center" t-esc="state.title"/>
450
453
  </div>
451
- <div class="o-ribbon-menu-wrapper overflow-auto">
454
+ <div
455
+ class="o-ribbon-menu-wrapper overflow-auto"
456
+ t-ref="container"
457
+ t-on-scroll="updateShadows">
452
458
  <Menu t-props="menuProps"/>
453
459
  </div>
454
460
  </div>
@@ -506,12 +512,12 @@
506
512
  value="tableConfig.numberOfHeaders > 0"
507
513
  onChange.bind="this.updateHasHeaders"
508
514
  />
509
- <input
515
+ <NumberInput
510
516
  t-if="tableConfig.numberOfHeaders > 0"
511
- t-att-value="tableConfig.numberOfHeaders"
512
- type="number"
513
- class="o-table-n-of-headers ms-2 o-input"
514
- t-on-change="onChangeNumberOfHeaders"
517
+ value="tableConfig.numberOfHeaders"
518
+ class="'o-table-n-of-headers ms-2'"
519
+ min="0"
520
+ onChange.bind="onChangeNumberOfHeaders"
515
521
  />
516
522
  </div>
517
523
  <Checkbox
@@ -856,12 +862,43 @@
856
862
  <CogWheelMenu items="cogWheelMenuItems"/>
857
863
  </div>
858
864
  </t>
859
- <TextInput class="'os-pivot-title'" value="name" onChange.bind="onNameChanged"/>
865
+ <TextInput
866
+ class="'os-pivot-title'"
867
+ value="name"
868
+ onChange.bind="onNameChanged"
869
+ selectContentOnFocus="true"
870
+ />
860
871
  </Section>
861
872
  </t>
862
873
 
863
874
  <t t-name="o-spreadsheet-PivotSidePanel">
864
- <t t-component="sidePanelEditor" t-props="props"/>
875
+ <div class="d-flex flex-column h-100">
876
+ <div class="o-panel d-flex">
877
+ <div
878
+ class="o-sidePanel-tab o-panel-configuration d-flew flex-grow-1 text-center"
879
+ t-att-class="state.panel !== 'configuration' ? 'inactive' : ''"
880
+ t-on-click="switchPanel.bind(this, 'configuration')">
881
+ <i class="fa fa-sliders me-1"/>
882
+ Configuration
883
+ </div>
884
+ <div
885
+ class="o-sidePanel-tab o-panel-design d-flew flex-grow-1 text-center"
886
+ t-att-class="state.panel !== 'design' ? 'inactive' : ''"
887
+ t-on-click="switchPanel.bind(this, 'design')">
888
+ <i class="fa fa-paint-brush me-1"/>
889
+ Design
890
+ </div>
891
+ </div>
892
+
893
+ <div class="o-panel-content overflow-y-auto h-100" t-ref="panelContent">
894
+ <div class="h-100" t-att-class="{ 'd-none': state.panel !== 'configuration' }">
895
+ <t t-component="sidePanelEditor" t-props="props"/>
896
+ </div>
897
+ <div t-att-class="state.panel !== 'design' ? 'd-none' : ''">
898
+ <PivotDesignPanel pivotId="props.pivotId"/>
899
+ </div>
900
+ </div>
901
+ </div>
865
902
  </t>
866
903
 
867
904
  <t t-name="o-spreadsheet-PivotSpreadsheetSidePanel">
@@ -913,6 +950,69 @@
913
950
  </div>
914
951
  </t>
915
952
 
953
+ <t t-name="o-spreadsheet-PivotDesignPanel">
954
+ <Section class="'o-pivot-design'" title.translate="Display options">
955
+ <div>
956
+ <div class="container-fluid p-0 pt-2">
957
+ <div class="row mb-2 align-items-center">
958
+ <div class="col-6">Max rows:</div>
959
+ <div class="col-6 d-flex align-items-center">
960
+ <input
961
+ t-att-value="pivotStyle.numberOfRows ?? ''"
962
+ type="number"
963
+ class="o-pivot-n-of-rows o-input"
964
+ placeholder="e.g. 10"
965
+ t-on-change="(ev) => this.updatePivotStyleProperty('numberOfRows', ev.target.valueAsNumber)"
966
+ />
967
+ </div>
968
+ </div>
969
+ <div class="row mb-2 align-items-center">
970
+ <div class="col-6">Max columns:</div>
971
+ <div class="col-6 d-flex align-items-center">
972
+ <input
973
+ t-att-value="pivotStyle.numberOfColumns ?? ''"
974
+ type="number"
975
+ class="o-pivot-n-of-columns o-input"
976
+ placeholder="e.g. 5"
977
+ t-on-change="(ev) => this.updatePivotStyleProperty('numberOfColumns', ev.target.valueAsNumber)"
978
+ />
979
+ </div>
980
+ </div>
981
+ <div class="row mb-2 align-items-center">
982
+ <div class="col-6">Show totals:</div>
983
+ <div class="col-6 d-flex align-items-center">
984
+ <Checkbox
985
+ name="'displayTotals'"
986
+ value="pivotStyle.displayTotals ?? defaultStyle.displayTotals"
987
+ onChange="(val) => this.updatePivotStyleProperty('displayTotals', val)"
988
+ />
989
+ </div>
990
+ </div>
991
+ <div class="row mb-2 align-items-center">
992
+ <div class="col-6">Show column titles:</div>
993
+ <div class="col-6 d-flex align-items-center">
994
+ <Checkbox
995
+ name="'displayColumnHeaders'"
996
+ value="pivotStyle.displayColumnHeaders ?? defaultStyle.displayColumnHeaders"
997
+ onChange="(val) => this.updatePivotStyleProperty('displayColumnHeaders', val)"
998
+ />
999
+ </div>
1000
+ </div>
1001
+ <div class="row mb-2 align-items-center">
1002
+ <div class="col-6">Show measure titles:</div>
1003
+ <div class="col-6 d-flex align-items-center">
1004
+ <Checkbox
1005
+ name="'displayMeasuresRow'"
1006
+ value="pivotStyle.displayMeasuresRow ?? defaultStyle.displayMeasuresRow"
1007
+ onChange="(val) => this.updatePivotStyleProperty('displayMeasuresRow', val)"
1008
+ />
1009
+ </div>
1010
+ </div>
1011
+ </div>
1012
+ </div>
1013
+ </Section>
1014
+ </t>
1015
+
916
1016
  <t t-name="o-spreadsheet-PivotMeasureDisplayPanel">
917
1017
  <Section title.translate="Show measure as:">
918
1018
  <select
@@ -1150,6 +1250,12 @@
1150
1250
  t-att-selected="agg === measure.aggregator"
1151
1251
  t-esc="props.aggregators[measure.type][agg]"
1152
1252
  />
1253
+ <option
1254
+ t-if="measure.computedBy"
1255
+ t-att-value="''"
1256
+ t-att-selected="'' === measure.aggregator">
1257
+ Compute from totals
1258
+ </option>
1153
1259
  </select>
1154
1260
  </div>
1155
1261
  </div>
@@ -1212,6 +1318,7 @@
1212
1318
  value="props.dimension.displayName"
1213
1319
  onChange.bind="updateName"
1214
1320
  class="'o-fw-bold'"
1321
+ selectContentOnFocus="true"
1215
1322
  />
1216
1323
  <span t-else="1" class="o-fw-bold" t-esc="props.dimension.displayName"/>
1217
1324
  </div>
@@ -1296,6 +1403,7 @@
1296
1403
  <TextInput
1297
1404
  value="group.name"
1298
1405
  onChange="(newName) => this.onRenameGroup(group_index, newName)"
1406
+ selectContentOnFocus="true"
1299
1407
  />
1300
1408
  <i
1301
1409
  class="o-button-icon ps-3 fa fa-trash"
@@ -1499,6 +1607,7 @@
1499
1607
  t-key="state.rule.criterion.type"
1500
1608
  criterion="state.rule.criterion"
1501
1609
  onCriterionChanged.bind="onCriterionChanged"
1610
+ autofocus="state.isTypeUpdated"
1502
1611
  />
1503
1612
  </div>
1504
1613
  </Section>
@@ -1609,6 +1718,7 @@
1609
1718
  onSelectionChanged="(ranges) => this.onRangeChanged(ranges[0])"
1610
1719
  required="true"
1611
1720
  hasSingleRange="true"
1721
+ autofocus="props.autofocus"
1612
1722
  />
1613
1723
  <t t-foreach="values" t-as="value" t-key="value_index">
1614
1724
  <div class="o-dv-list-values p-1 d-flex align-items-center">
@@ -1678,6 +1788,7 @@
1678
1788
  onValueChanged.bind="onValueChanged"
1679
1789
  criterionType="props.criterion.type"
1680
1790
  disableFormulas="props.disableFormulas"
1791
+ focused="props.autofocus"
1681
1792
  />
1682
1793
  </t>
1683
1794
 
@@ -1687,6 +1798,7 @@
1687
1798
  onValueChanged.bind="onFirstValueChanged"
1688
1799
  criterionType="props.criterion.type"
1689
1800
  disableFormulas="props.disableFormulas"
1801
+ focused="props.autofocus"
1690
1802
  />
1691
1803
  <CriterionInput
1692
1804
  value="props.criterion.values[1]"
@@ -1714,6 +1826,7 @@
1714
1826
  onValueChanged.bind="onValueChanged"
1715
1827
  criterionType="props.criterion.type"
1716
1828
  disableFormulas="props.disableFormulas"
1829
+ focused="props.autofocus"
1717
1830
  />
1718
1831
  </t>
1719
1832
 
@@ -2170,6 +2283,7 @@
2170
2283
  t-key="state.rules.cellIs.operator"
2171
2284
  criterion="genericCriterion"
2172
2285
  onCriterionChanged.bind="onRuleValuesChanged"
2286
+ autofocus="this.state.hasEditedCf"
2173
2287
  />
2174
2288
 
2175
2289
  <div class="o-section-subtitle pt-3">Formatting style</div>
@@ -2376,6 +2490,9 @@
2376
2490
  className="'mb-2'"
2377
2491
  />
2378
2492
  </Section>
2493
+ <Section class="'pt-0'" title.translate="Number formatting">
2494
+ <ChartHumanizeNumbers t-props="props"/>
2495
+ </Section>
2379
2496
  </t>
2380
2497
  </GeneralDesignEditor>
2381
2498
  <SeriesWithAxisDesignEditor t-props="props"/>
@@ -2415,7 +2532,7 @@
2415
2532
  className="'mb-2'"
2416
2533
  />
2417
2534
  </Section>
2418
- <Section class="'pt-1'" title.translate="Number formatting">
2535
+ <Section class="'pt-0'" title.translate="Number formatting">
2419
2536
  <ChartHumanizeNumbers t-props="props"/>
2420
2537
  </Section>
2421
2538
  </t>
@@ -2554,6 +2671,9 @@
2554
2671
  hasVerticalAlign="true"
2555
2672
  />
2556
2673
  </Section>
2674
+ <Section class="'pt-0'" title.translate="Number formatting">
2675
+ <ChartHumanizeNumbers t-props="props"/>
2676
+ </Section>
2557
2677
  </t>
2558
2678
  </SidePanelCollapsible>
2559
2679
  </t>
@@ -2614,6 +2734,9 @@
2614
2734
  <GeneralDesignEditor t-props="props">
2615
2735
  <t t-set-slot="general-extension">
2616
2736
  <ChartLegend t-props="props"/>
2737
+ <Section class="'pt-0'" title.translate="Number formatting">
2738
+ <ChartHumanizeNumbers t-props="props"/>
2739
+ </Section>
2617
2740
  </t>
2618
2741
  </GeneralDesignEditor>
2619
2742
 
@@ -2665,7 +2788,7 @@
2665
2788
  <t t-set="color_down">Color Down</t>
2666
2789
  <GeneralDesignEditor t-props="props" defaultChartTitleFontSize="defaultScorecardTitleFontSize">
2667
2790
  <t t-set-slot="general-extension">
2668
- <Section class="'pt-1'" title.translate="Number formatting">
2791
+ <Section class="'pt-0'" title.translate="Number formatting">
2669
2792
  <ChartHumanizeNumbers t-props="props"/>
2670
2793
  </Section>
2671
2794
  </t>
@@ -2779,7 +2902,7 @@
2779
2902
  <ChartShowValues t-props="props"/>
2780
2903
  <ChartShowDataMarkers t-props="props"/>
2781
2904
  </Section>
2782
- <Section class="'pt-1'" title.translate="Number formatting">
2905
+ <Section class="'pt-0'" title.translate="Number formatting">
2783
2906
  <ChartHumanizeNumbers t-props="props"/>
2784
2907
  </Section>
2785
2908
  </t>
@@ -2794,7 +2917,7 @@
2794
2917
  <Section class="'pt-0'" title.translate="Values">
2795
2918
  <ChartShowValues t-props="props"/>
2796
2919
  </Section>
2797
- <Section class="'pt-1'" title.translate="Number formatting">
2920
+ <Section class="'pt-0'" title.translate="Number formatting">
2798
2921
  <ChartHumanizeNumbers t-props="props"/>
2799
2922
  </Section>
2800
2923
  <PieHoleSize
@@ -2808,19 +2931,19 @@
2808
2931
 
2809
2932
  <t t-name="o-spreadsheet-ChartPanel">
2810
2933
  <div class="o-chart d-flex flex-column h-100" t-if="chartId">
2811
- <div class="o-panel">
2934
+ <div class="o-panel d-flex">
2812
2935
  <div
2813
- class="o-panel-element o-panel-configuration"
2936
+ class="o-sidePanel-tab o-panel-configuration d-flew flex-grow-1 text-center"
2814
2937
  t-att-class="store.panel !== 'configuration' ? 'inactive' : ''"
2815
2938
  t-on-click="switchPanel.bind(this, 'configuration')">
2816
- <i class="fa fa-sliders"/>
2939
+ <i class="fa fa-sliders me-1"/>
2817
2940
  Configuration
2818
2941
  </div>
2819
2942
  <div
2820
- class="o-panel-element o-panel-design"
2943
+ class="o-sidePanel-tab o-panel-design d-flew flex-grow-1 text-center"
2821
2944
  t-att-class="store.panel !== 'design' ? 'inactive' : ''"
2822
2945
  t-on-click="switchPanel.bind(this, 'design')">
2823
- <i class="fa fa-paint-brush"/>
2946
+ <i class="fa fa-paint-brush me-1"/>
2824
2947
  Design
2825
2948
  </div>
2826
2949
  </div>
@@ -2869,7 +2992,7 @@
2869
2992
  className="'mb-2'"
2870
2993
  />
2871
2994
  </Section>
2872
- <Section class="'pt-1'" title.translate="Number formatting">
2995
+ <Section class="'pt-0'" title.translate="Number formatting">
2873
2996
  <ChartHumanizeNumbers t-props="props"/>
2874
2997
  </Section>
2875
2998
  </t>
@@ -2978,7 +3101,7 @@
2978
3101
  <option value="left">Bottom left</option>
2979
3102
  </select>
2980
3103
  </Section>
2981
- <Section class="'pt-1'" title.translate="Number formatting">
3104
+ <Section class="'pt-0'" title.translate="Number formatting">
2982
3105
  <ChartHumanizeNumbers t-props="props"/>
2983
3106
  </Section>
2984
3107
  </t>
@@ -3071,7 +3194,7 @@
3071
3194
  <t t-name="o-spreadsheet-GaugeChartDesignPanel">
3072
3195
  <GeneralDesignEditor t-props="props">
3073
3196
  <t t-set-slot="general-extension">
3074
- <Section class="'pt-1'" title.translate="Number formatting">
3197
+ <Section class="'pt-0'" title.translate="Number formatting">
3075
3198
  <ChartHumanizeNumbers t-props="props"/>
3076
3199
  </Section>
3077
3200
  </t>
@@ -3217,7 +3340,7 @@
3217
3340
  <Section class="'pt-0'" title.translate="Values">
3218
3341
  <ChartShowValues t-props="props"/>
3219
3342
  </Section>
3220
- <Section class="'pt-1'" title.translate="Number formatting">
3343
+ <Section class="'pt-0'" title.translate="Number formatting">
3221
3344
  <ChartHumanizeNumbers t-props="props"/>
3222
3345
  </Section>
3223
3346
  </t>
@@ -3257,7 +3380,7 @@
3257
3380
  className="'mb-2'"
3258
3381
  />
3259
3382
  </Section>
3260
- <Section class="'pt-1'" title.translate="Number formatting">
3383
+ <Section class="'pt-0'" title.translate="Number formatting">
3261
3384
  <ChartHumanizeNumbers t-props="props"/>
3262
3385
  </Section>
3263
3386
  </t>
@@ -3807,11 +3930,11 @@
3807
3930
  </div>
3808
3931
  <div class="w-50 ms-3" t-if="trendType === 'trailingMovingAverage'">
3809
3932
  <span class="o-section-subtitle">Window</span>
3810
- <input
3811
- t-att-value="trend.window || this.defaultWindowSize"
3812
- type="number"
3813
- class="w-100 o-input trend-window-input"
3814
- t-on-change="(ev) => this.onChangeMovingAverageWindow(index, ev)"
3933
+ <NumberInput
3934
+ value="trend.window || this.defaultWindowSize"
3935
+ class="'w-100 trend-window-input'"
3936
+ min="2"
3937
+ onChange="(value) => this.onChangeMovingAverageWindow(index, value)"
3815
3938
  />
3816
3939
  </div>
3817
3940
  <div class="w-50 ms-3" t-if="trendType === 'polynomial'">
@@ -3884,13 +4007,12 @@
3884
4007
  <t t-name="o-spreadsheet.PieHoleSize">
3885
4008
  <Section class="'pt-0'" title.translate="Center radius">
3886
4009
  <div class="d-flex flex-row">
3887
- <input
3888
- t-att-value="props.value"
3889
- type="number"
3890
- class="o-input o-pie-hole-size-input"
4010
+ <NumberInput
4011
+ value="props.value"
4012
+ class="'o-pie-hole-size-input'"
3891
4013
  min="0"
3892
4014
  max="95"
3893
- t-on-change="(ev) => debouncedOnChange(ev.target.value)"
4015
+ onChange.bind="onChange"
3894
4016
  />
3895
4017
  %
3896
4018
  </div>
@@ -3937,7 +4059,8 @@
3937
4059
  <t t-name="o-spreadsheet-ChartHumanizeNumbers">
3938
4060
  <Checkbox
3939
4061
  name="'humanizeNumbers'"
3940
- label.translate="Make numbers human-readable"
4062
+ label.translate="Use compact format"
4063
+ title="title"
3941
4064
  value="props.definition.humanize ?? true"
3942
4065
  onChange="(humanize) => props.updateChart(this.props.chartId, { humanize })"
3943
4066
  />
@@ -4037,12 +4160,11 @@
4037
4160
 
4038
4161
  <t t-name="o-spreadsheet.ChartTitle">
4039
4162
  <Section class="'o-chart-title'" title="props.name">
4040
- <input
4041
- type="text"
4042
- class="o-input"
4043
- t-att-value="props.title"
4044
- t-on-change="updateTitle"
4045
- t-att-placeholder="props.placeholder"
4163
+ <TextInput
4164
+ value="props.title"
4165
+ onChange.bind="updateTitle"
4166
+ placeholder="props.placeholder"
4167
+ alwaysShowBorder="true"
4046
4168
  />
4047
4169
  <TextStyler
4048
4170
  style="props.style"
@@ -4112,6 +4234,7 @@
4112
4234
  onChange.bind="updateTitleText"
4113
4235
  placeholder.translate="Add a Title"
4114
4236
  alwaysShowBorder="true"
4237
+ selectContentOnFocus="true"
4115
4238
  />
4116
4239
  <TextStyler
4117
4240
  style="title ?? {}"
@@ -4145,10 +4268,11 @@
4145
4268
  <TextInput
4146
4269
  value="getItemTitle(item)"
4147
4270
  onChange="(newName) => this.renameCarouselItem(item, newName)"
4271
+ selectContentOnFocus="true"
4148
4272
  />
4149
4273
  </div>
4150
4274
  <div class="ms-auto"/>
4151
- <div class="flex-shrink-0 d-flex align-self-start me-1">
4275
+ <div class="flex-shrink-0 d-flex me-1">
4152
4276
  <CogWheelMenu items="getCogWheelMenuItems(item)"/>
4153
4277
  </div>
4154
4278
  </div>
@@ -4262,7 +4386,6 @@
4262
4386
  t-att-class="props.class"
4263
4387
  t-ref="popover"
4264
4388
  t-on-wheel="props.onMouseWheel"
4265
- t-att-style="popoverStyle"
4266
4389
  t-on-click.stop="">
4267
4390
  <div class="o-popover-content" t-ref="popoverContent">
4268
4391
  <t t-slot="default"/>
@@ -4334,6 +4457,23 @@
4334
4457
  </span>
4335
4458
  </t>
4336
4459
 
4460
+ <t t-name="o-spreadsheet-NumberInput">
4461
+ <input
4462
+ type="number"
4463
+ t-ref="{{refName}}"
4464
+ t-att-class="inputClass"
4465
+ t-att-id="props.id"
4466
+ t-att-placeholder="props.placeholder"
4467
+ t-on-change="save"
4468
+ t-on-blur="save"
4469
+ t-on-pointerdown="onMouseDown"
4470
+ t-on-pointerup="onMouseUp"
4471
+ t-on-keydown="onKeyDown"
4472
+ t-att-min="props.min"
4473
+ t-att-max="props.max"
4474
+ />
4475
+ </t>
4476
+
4337
4477
  <t t-name="o-spreadsheet-Menu-Popover">
4338
4478
  <Popover t-if="props.menuItems" t-props="popoverProps">
4339
4479
  <div t-ref="menu" class="o-menu-wrapper" t-on-mouseover="() => this.onMouseOverMainMenu()">
@@ -5327,7 +5467,7 @@
5327
5467
  </svg>
5328
5468
  </t>
5329
5469
  <t t-name="o-spreadsheet-Icon.COG">
5330
- <svg fill="currentColor" viewBox="0 0 16 16">
5470
+ <svg class="o-icon" fill="currentColor" viewBox="0 0 16 16">
5331
5471
  <path
5332
5472
  d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492zM5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0z"
5333
5473
  />
@@ -5420,7 +5560,7 @@
5420
5560
  </svg>
5421
5561
  </t>
5422
5562
  <t t-name="o-spreadsheet-Icon.EDIT_TABLE">
5423
- <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18">
5563
+ <svg class="o-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18">
5424
5564
  <path
5425
5565
  fill="currentColor"
5426
5566
  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"
@@ -5428,7 +5568,7 @@
5428
5568
  </svg>
5429
5569
  </t>
5430
5570
  <t t-name="o-spreadsheet-Icon.DELETE_TABLE">
5431
- <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18">
5571
+ <svg class="o-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18">
5432
5572
  <path
5433
5573
  fill="currentColor"
5434
5574
  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"
@@ -5436,7 +5576,7 @@
5436
5576
  </svg>
5437
5577
  </t>
5438
5578
  <t t-name="o-spreadsheet-Icon.PAINT_TABLE">
5439
- <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18">
5579
+ <svg class="o-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18">
5440
5580
  <path
5441
5581
  fill="currentColor"
5442
5582
  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"
@@ -5547,6 +5687,30 @@
5547
5687
  />
5548
5688
  </svg>
5549
5689
  </t>
5690
+ <t t-name="o-spreadsheet-Icon.FX_SVG">
5691
+ <svg class="o-icon fx-icon" viewBox="0 0 121.8 122.9">
5692
+ <path
5693
+ fill="currentColor"
5694
+ d='m28 34-4 5v2h10l-6 40c-4 22-6 28-7 30-2 2-3 3-5 3-3 0-7-2-9-4H4c-2 2-4 4-4 7s4 6 8 6 9-2 15-8c8-7 13-17 18-39l7-35 13-1 3-6H49c4-23 7-27 11-27 2 0 5 2 8 6h4c1-1 4-4 4-7 0-2-3-6-9-6-5 0-13 4-20 10-6 7-9 14-11 24h-8zm41 16c4-5 7-7 8-7s2 1 5 9l3 12c-7 11-12 17-16 17l-3-1-2-1c-3 0-6 3-6 7s3 7 7 7c6 0 12-6 22-23l3 10c3 9 6 13 10 13 5 0 11-4 18-15l-3-4c-4 6-7 8-8 8-2 0-4-3-6-10l-5-15 8-10 6-4 3 1 3 2c2 0 6-3 6-7s-2-7-6-7c-6 0-11 5-21 20l-2-6c-3-9-5-14-9-14-5 0-12 6-18 15l3 3z'
5695
+ />
5696
+ </svg>
5697
+ </t>
5698
+ <t t-name="o-spreadsheet-Icon.COLLAPSE">
5699
+ <svg class="o-icon" viewBox="0 0 18 18">
5700
+ <path
5701
+ d="M12.124 2.576a.6.6 0 0 1 0 .848l-2.7 2.7a.6.6 0 0 1-.848 0l-2.7-2.7a.6.6 0 0 1 .848-.848L8.4 4.2V.9a.6.6 0 0 1 1.2 0v3.3l1.676-1.624a.6.6 0 0 1 .848 0M5.876 15.424a.6.6 0 0 1 0-.848l2.7-2.7a.6.6 0 0 1 .848 0l2.7 2.7a.6.6 0 0 1-.848.848L9.6 13.8v3.3a.6.6 0 0 1-1.2 0v-3.3l-1.676 1.624a.6.6 0 0 1-.848 0M2 7a.5.5 0 0 0 0 1h14a.5.5 0 0 0 0-1M2 10a.5.5 0 0 0 0 1h14a.5.5 0 0 0 0-1"
5702
+ fill="currentColor"
5703
+ />
5704
+ </svg>
5705
+ </t>
5706
+ <t t-name="o-spreadsheet-Icon.EXPAND">
5707
+ <svg class="o-icon" viewBox="0 0 18 18">
5708
+ <path
5709
+ d="M5.876 14.076a.6.6 0 0 0 0 .848l2.7 2.7a.6.6 0 0 0 .848 0l2.7-2.7a.6.6 0 0 0-.848-.848L9.6 15.7v-3.3a.6.6 0 0 0-1.2 0v3.3l-1.676-1.624a.6.6 0 0 0-.848 0m6.248-10.152a.6.6 0 0 0 0-.848l-2.7-2.7a.6.6 0 0 0-.848 0l-2.7 2.7a.6.6 0 0 0 .848.848L8.4 2.3v3.3a.6.6 0 0 0 1.2 0V2.3l1.676 1.624a.6.6 0 0 0 .848 0M2 10a.5.5 0 0 0 0 1h14a.5.5 0 0 0 0-1M2 7a.5.5 0 0 0 0 1h14a.5.5 0 0 0 0-1"
5710
+ fill="currentColor"
5711
+ />
5712
+ </svg>
5713
+ </t>
5550
5714
 
5551
5715
  <t t-name="o-spreadsheet-IconPicker">
5552
5716
  <div class="o-icon-picker">
@@ -5898,7 +6062,7 @@
5898
6062
  anchorRect="cellPopover.anchorRect"
5899
6063
  containerRect="env.getPopoverContainerRect()"
5900
6064
  onMouseWheel="props.onMouseWheel"
5901
- zIndex="zIndex">
6065
+ class="'o-popover-grid-index'">
5902
6066
  <t
5903
6067
  t-component="cellPopover.Component"
5904
6068
  t-props="{...cellPopover.props, onClosed : () => props.onClosePopover()}"
@@ -6024,8 +6188,8 @@
6024
6188
  </div>
6025
6189
  </t>
6026
6190
 
6027
- <t t-name="o-spreadsheet-FullScreenChart">
6028
- <div class="position-absolute o-fullscreen-chart-overlay w-100 h-100 d-flex" t-if="chartId">
6191
+ <t t-name="o-spreadsheet-FullScreenFigure">
6192
+ <div class="position-absolute o-fullscreen-figure-overlay w-100 h-100 d-flex" t-if="figureUI">
6029
6193
  <div
6030
6194
  class="position-absolute top-0 start-0 end-0 bottom-0"
6031
6195
  t-on-click="exitFullScreen"
@@ -6038,15 +6202,20 @@
6038
6202
  </button>
6039
6203
  <div class="flex-fill">
6040
6204
  <div
6041
- class="o-fullscreen-chart o-figure position-relative border rounded shadow"
6205
+ class="o-fullscreen-figure o-figure position-relative border rounded shadow"
6042
6206
  tabindex="1"
6043
- t-ref="fullScreenChart"
6207
+ t-ref="fullScreenFigure"
6044
6208
  t-on-click.stop=""
6045
6209
  t-on-keydown="(ev) => this.onKeyDown(ev)">
6046
- <t t-component="chartComponent" chartId="chartId" isFullScreen="true" t-key="chartId"/>
6047
- <div class="position-absolute top-0 end-0">
6048
- <ChartDashboardMenu chartId="chartId"/>
6049
- </div>
6210
+ <t>
6211
+ <t
6212
+ t-component="figureComponent"
6213
+ figureUI="figureUI"
6214
+ isFullScreen="true"
6215
+ onFigureDeleted="() => {}"
6216
+ t-key="figureUI.id"
6217
+ />
6218
+ </t>
6050
6219
  </div>
6051
6220
  </div>
6052
6221
  </div>
@@ -6068,7 +6237,6 @@
6068
6237
  t-on-wheel.prevent.stop=""
6069
6238
  t-on-click.stop="props.onFocusInput"
6070
6239
  t-on-focus.stop="onInputFocused"
6071
- t-att-value="props.currentFontSize"
6072
6240
  t-on-change="setSizeFromInput"
6073
6241
  t-ref="inputFontSize"
6074
6242
  />
@@ -6131,7 +6299,7 @@
6131
6299
  </div>
6132
6300
  <div
6133
6301
  t-if="state.displayedValues.length === 0"
6134
- class="o-filter-menu-no-values d-flex align-items-center justify-content-center w-100 h-100 ">
6302
+ class="o-filter-menu-no-values d-flex align-items-center justify-content-center w-100 h-100 text-muted fst-italic">
6135
6303
  No results
6136
6304
  </div>
6137
6305
  </div>
@@ -6172,6 +6340,7 @@
6172
6340
  criterion="state.criterion"
6173
6341
  onCriterionChanged.bind="onCriterionChanged"
6174
6342
  disableFormulas="true"
6343
+ autofocus="true"
6175
6344
  />
6176
6345
  </t>
6177
6346
 
@@ -6273,7 +6442,12 @@
6273
6442
 
6274
6443
  <t t-name="o-spreadsheet-ChartFigure">
6275
6444
  <div class="o-chart-container w-100 h-100" t-on-dblclick="onDoubleClick">
6276
- <t t-component="chartComponent" chartId="chartId" t-key="chartId"/>
6445
+ <t
6446
+ t-component="chartComponent"
6447
+ chartId="chartId"
6448
+ t-key="chartId"
6449
+ isFullScreen="props.isFullScreen"
6450
+ />
6277
6451
  </div>
6278
6452
  <div t-if="env.isDashboard()" class="position-absolute top-0 end-0">
6279
6453
  <ChartDashboardMenu chartId="chartId"/>
@@ -6290,9 +6464,14 @@
6290
6464
  'o-carousel-header-floating': !env.isDashboard() and selectedItem?.type === 'carouselDataView',
6291
6465
  }"
6292
6466
  t-att-style="headerStyle">
6293
- <div class="o-carousel-title text-truncate" t-esc="title" t-att-style="titleStyle"/>
6294
- <div class="ms-auto d-flex">
6295
- <t t-foreach="carousel.items" t-as="item" t-key="item_index">
6467
+ <div
6468
+ class="o-carousel-title text-truncate flex-shrink-0 pe-2"
6469
+ t-esc="title"
6470
+ t-att-title="title"
6471
+ t-att-style="titleStyle"
6472
+ />
6473
+ <div class="o-carousel-tabs d-flex flex-fill justify-content-end" t-ref="carouselTabs">
6474
+ <t t-foreach="visibleCarouselItems" t-as="item" t-key="item_index">
6296
6475
  <div
6297
6476
  class="o-carousel-tab text-truncate px-2 mt-1 flex-shrink-0"
6298
6477
  t-att-class="{ 'selected': isItemSelected(item) }"
@@ -6301,6 +6480,37 @@
6301
6480
  />
6302
6481
  </t>
6303
6482
  </div>
6483
+ <div
6484
+ class="o-carousel-tabs-dropdown o-carousel-button flex-shrink-0 rounded p-1"
6485
+ t-att-class="{'active': menuState.isOpen}"
6486
+ t-ref="carouselTabsDropdown"
6487
+ t-on-click="toggleMenu">
6488
+ <div class="fa fa-angle-down"/>
6489
+ <MenuPopover
6490
+ t-if="menuState.isOpen"
6491
+ menuId="menuId"
6492
+ anchorRect="menuState.anchorRect"
6493
+ menuItems="menuState.menuItems"
6494
+ onClose="() => this.menuState.isOpen=false"
6495
+ popoverPositioning="'bottom-left'"
6496
+ />
6497
+ </div>
6498
+ <div
6499
+ t-if="env.isDashboard()"
6500
+ t-att-title="fullScreenButtonTitle"
6501
+ class="o-carousel-full-screen-button fa o-carousel-button rounded p-1 ms-1"
6502
+ t-att-class="{
6503
+ 'fa-compress': props.isFullScreen,
6504
+ 'fa-expand': !props.isFullScreen,
6505
+ 'invisible': selectedCarouselItem?.type !== 'chart',
6506
+ }"
6507
+ t-on-click="toggleFullScreen"
6508
+ />
6509
+ <div
6510
+ t-if="!env.isDashboard()"
6511
+ class="o-carousel-menu-button o-carousel-button fa fa-ellipsis-v rounded ms-1"
6512
+ t-on-click="openContextMenu"
6513
+ />
6304
6514
  </div>
6305
6515
  <div
6306
6516
  t-if="!selectedItem"
@@ -6314,12 +6524,14 @@
6314
6524
  <t
6315
6525
  t-component="chartComponent"
6316
6526
  chartId="selectedItem.chartId"
6527
+ isFullScreen="props.isFullScreen"
6317
6528
  t-key="selectedItem.chartId"
6318
6529
  />
6319
6530
  </div>
6320
6531
  <ChartDashboardMenu
6321
6532
  t-if="env.isDashboard()"
6322
6533
  chartId="selectedItem.chartId"
6534
+ hasFullScreenButton="false"
6323
6535
  t-key="selectedItem.chartId"
6324
6536
  />
6325
6537
  </div>
@@ -6327,7 +6539,11 @@
6327
6539
  </t>
6328
6540
 
6329
6541
  <t t-name="o-spreadsheet-FigureComponent">
6330
- <div class="o-figure-wrapper" t-att-style="wrapperStyle" t-ref="figureWrapper">
6542
+ <div
6543
+ class="o-figure-wrapper"
6544
+ t-att-class="{'o-figure-selected': isSelected}"
6545
+ t-att-style="wrapperStyle"
6546
+ t-ref="figureWrapper">
6331
6547
  <div
6332
6548
  class="o-figure w-100 h-100"
6333
6549
  t-att-class="props.class"
@@ -6346,6 +6562,7 @@
6346
6562
  onFigureDeleted="props.onFigureDeleted"
6347
6563
  figureUI="props.figureUI"
6348
6564
  editFigureStyle.bind="editWrapperStyle"
6565
+ openContextMenu.bind="openContextMenu"
6349
6566
  />
6350
6567
  <div class="o-figure-menu position-absolute m-2" t-if="!env.isDashboard()">
6351
6568
  <div
@@ -6366,18 +6583,22 @@
6366
6583
  <div t-if="!env.isDashboard()" class="position-absolute top-0 start-0 pe-none w-100 h-100">
6367
6584
  <div
6368
6585
  class="o-figure-border pe-auto w-100 h-0 position-absolute pb-2"
6586
+ t-att-class="{'o-selected': isSelected}"
6369
6587
  t-att-style="getBorderStyle('top')"
6370
6588
  />
6371
6589
  <div
6372
6590
  class="o-figure-border pe-auto h-100 position-absolute start-0 ps-2"
6591
+ t-att-class="{'o-selected': isSelected}"
6373
6592
  t-att-style="getBorderStyle('left')"
6374
6593
  />
6375
6594
  <div
6376
6595
  class="o-figure-border pe-auto w-100 position-absolute bottom-0 pt-2"
6596
+ t-att-class="{'o-selected': isSelected}"
6377
6597
  t-att-style="getBorderStyle('bottom')"
6378
6598
  />
6379
6599
  <div
6380
6600
  class="o-figure-border pe-auto h-100 position-absolute end-0 pe-2"
6601
+ t-att-class="{'o-selected': isSelected}"
6381
6602
  t-att-style="getBorderStyle('right')"
6382
6603
  />
6383
6604
  </div>
@@ -6553,9 +6774,12 @@
6553
6774
  </t>
6554
6775
 
6555
6776
  <t t-name="o-spreadsheet-ClickableCellSortIcon">
6556
- <div class="w-100 h-100 d-flex flex-column align-items-end justify-content-end">
6557
- <span class="o-icon h-100 sorting-icon pb-1" t-att-style="style">
6558
- <i class="fa fa-small" t-att-class="icon"/>
6777
+ <div class="w-100 h-100 d-flex flex-column align-items-end" t-att-class="verticalJustifyClass">
6778
+ <span
6779
+ t-if="props.sortDirection === 'none'"
6780
+ class="o-icon sorting-icon pb-1"
6781
+ t-att-style="style">
6782
+ <i class="fa fa-small fa-sort"/>
6559
6783
  </span>
6560
6784
  </div>
6561
6785
  </t>
@@ -6566,9 +6790,10 @@
6566
6790
  class="o-topbar-composer position-relative bg-white user-select-text d-flex"
6567
6791
  t-att-class="{
6568
6792
  'o-topbar-composer-readonly': env.model.getters.isReadonly(),
6793
+ 'o-topbar-composer-active': focus !== 'inactive',
6794
+ 'o-topbar-composer-inactive': focus === 'inactive',
6569
6795
  }"
6570
- t-on-click.stop=""
6571
- t-att-style="containerStyle">
6796
+ t-on-click.stop="">
6572
6797
  <Composer
6573
6798
  focus="focus"
6574
6799
  inputStyle="composerStyle"
@@ -6576,6 +6801,9 @@
6576
6801
  composerStore="composerStore"
6577
6802
  placeholder="composerStore.placeholder"
6578
6803
  />
6804
+ <span t-if="showFxIcon" class="position-absolute top-50 translate-middle-y ps-2 pe-none">
6805
+ <t t-call="o-spreadsheet-Icon.FX_SVG"/>
6806
+ </span>
6579
6807
  </div>
6580
6808
  </div>
6581
6809
  </t>
@@ -7054,6 +7282,7 @@
7054
7282
  t-ref="sheetNameSpan"
7055
7283
  t-esc="sheetName"
7056
7284
  t-on-pointerdown="(ev) => this.onMouseEventSheetName(ev)"
7285
+ t-on-click="(ev) => this.onMouseEventSheetName(ev)"
7057
7286
  t-on-dblclick="() => this.onDblClick()"
7058
7287
  t-on-focusout="() => this.onFocusOut()"
7059
7288
  t-on-keydown="(ev) => this.onKeyDown(ev)"