@odoo/o-spreadsheet 19.1.0-alpha.9 → 19.1.1

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.9
5
- @date 2025-10-23T11:13:50.088Z
6
- @hash bd756dd
4
+ @version 19.1.1
5
+ @date 2025-12-26T10:27:38.116Z
6
+ @hash e6313bd
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 d-flex flex-column user-select-none"
32
+ class="o-spreadsheet-topbar d-flex flex-column user-select-none bg-white"
33
33
  t-on-click="props.onClick">
34
- <div t-if="!env.isSmall" class="o-topbar-top d-flex justify-content-between">
34
+ <div t-if="!env.isSmall" class="o-topbar-top d-flex justify-content-between border-bottom">
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">
@@ -82,7 +82,7 @@
82
82
  t-key="toolbarAction_index">
83
83
  <t t-component="toolbarAction.component" t-props="toolbarAction.props"/>
84
84
  </t>
85
- <div t-if="showDivider(category_index)" class="o-topbar-divider"/>
85
+ <div t-if="showDivider(category_index)" class="o-topbar-divider border-end"/>
86
86
  </div>
87
87
  <div
88
88
  t-ref="moreToolsContainer"
@@ -100,7 +100,7 @@
100
100
  </div>
101
101
  <div
102
102
  t-if="this.fingerprints.isEnabled"
103
- class="irregularity-map d-flex align-items-center justify-content-between">
103
+ class="topbar-banner irregularity-map d-flex align-items-center justify-content-between border-top">
104
104
  <div
105
105
  t-on-click="() => this.fingerprints.disable()"
106
106
  role="button"
@@ -132,7 +132,7 @@
132
132
  popoverPositioning="'bottom-left'"
133
133
  />
134
134
  <Popover t-if="state.toolsPopoverState.isOpen" t-props="toolsPopoverProps">
135
- <div class="d-flex px-2 py-1 flex-wrap align-items-center" style="background-color:white;">
135
+ <div class="d-flex px-2 py-1 flex-wrap align-items-center bg-white">
136
136
  <t
137
137
  t-foreach="state.invisibleToolsCategories"
138
138
  t-as="category"
@@ -146,13 +146,28 @@
146
146
  </t>
147
147
  <div
148
148
  t-if="category_index &lt; state.invisibleToolsCategories.length-1"
149
- class="o-topbar-divider"
149
+ class="o-topbar-divider border-end"
150
150
  />
151
151
  </t>
152
152
  </div>
153
153
  </Popover>
154
154
  </t>
155
155
 
156
+ <div t-name="o-spreadsheet-TopBarZoom" t-ref="buttonRef" t-on-click.stop="">
157
+ <NumberEditor
158
+ currentValue="currentFontSize"
159
+ onValueChange.bind="this.setZoom"
160
+ class="props.class"
161
+ onToggle.bind="this.toggle"
162
+ onFocusInput.bind="this.onFocusInput"
163
+ valueIcon="'%'"
164
+ min="25"
165
+ max="300"
166
+ valueList="valueList"
167
+ title.translate="Zoom"
168
+ />
169
+ </div>
170
+
156
171
  <div t-name="o-spreadsheet-NumberFormatsTool" t-ref="buttonRef" t-on-click.stop="">
157
172
  <ActionButton
158
173
  action="formatNumberMenuItemSpec"
@@ -191,7 +206,7 @@
191
206
  class="props.class"
192
207
  />
193
208
  <Popover t-if="isActive" t-props="popoverProps">
194
- <div class="o-dropdown-content p-1" t-if="isActive" t-on-click.stop="">
209
+ <div class="o-dropdown-content p-1 bg-white" t-if="isActive" t-on-click.stop="">
195
210
  <div class="o-dropdown-line">
196
211
  <t t-foreach="props.childActions" t-as="action" t-key="action_index">
197
212
  <ActionButton action="action" class="props.childClass"/>
@@ -216,24 +231,32 @@
216
231
  </t>
217
232
 
218
233
  <t t-name="o-spreadsheet-TextInput">
219
- <input
220
- type="text"
221
- t-ref="{{refName}}"
222
- t-att-class="inputClass"
223
- t-att-id="props.id"
224
- t-att-placeholder="props.placeholder"
225
- t-on-change="save"
226
- t-on-blur="save"
227
- t-on-pointerdown="onMouseDown"
228
- t-on-pointerup="onMouseUp"
229
- t-on-keydown="onKeyDown"
230
- />
234
+ <div class="position-relative">
235
+ <input
236
+ type="text"
237
+ t-ref="{{refName}}"
238
+ t-att-class="inputClass"
239
+ t-att-id="props.id"
240
+ t-att-placeholder="props.placeholder"
241
+ t-on-change="save"
242
+ t-on-blur="save"
243
+ t-on-pointerdown="onMouseDown"
244
+ t-on-pointerup="onMouseUp"
245
+ t-on-keydown="onKeyDown"
246
+ />
247
+ <span
248
+ t-if="props.errorMessage"
249
+ class="os-input-error-icon text-danger position-absolute d-flex align-items-center"
250
+ t-att-title="props.errorMessage">
251
+ <t t-call="o-spreadsheet-Icon.ERROR"/>
252
+ </span>
253
+ </div>
231
254
  </t>
232
255
 
233
256
  <t t-name="o-spreadsheet-TableStylesPopover">
234
257
  <Popover t-if="props.popoverProps" t-props="props.popoverProps">
235
258
  <div
236
- class="o-table-style-popover d-flex flex-column py-3"
259
+ class="o-table-style-popover d-flex flex-column py-3 bg-white"
237
260
  t-ref="tableStyleList"
238
261
  t-on-contextmenu.prevent="">
239
262
  <div class="d-flex o-notebook ps-4 mb-3">
@@ -241,7 +264,7 @@
241
264
  t-foreach="Object.keys(categories)"
242
265
  t-as="category"
243
266
  t-key="category"
244
- class="o-notebook-tab d-flex align-items-center"
267
+ class="o-notebook-tab d-flex align-items-center border"
245
268
  t-att-class="{ 'selected': state.selectedCategory === category }"
246
269
  t-on-click="() => state.selectedCategory = category"
247
270
  t-att-data-id="category"
@@ -282,7 +305,7 @@
282
305
  <canvas t-ref="canvas" class="w-100 h-100"/>
283
306
  </div>
284
307
  <div
285
- class="o-table-style-edit-button position-absolute d-none"
308
+ class="o-table-style-edit-button position-absolute d-none bg-white border"
286
309
  t-if="isStyleEditable"
287
310
  t-on-click="this.editTableStyle"
288
311
  title="Edit custom table style">
@@ -298,7 +321,7 @@
298
321
  </t>
299
322
 
300
323
  <t t-name="o-spreadsheet-TableStylePicker">
301
- <div class="o-table-style-picker d-flex flew-row justify-content-between ps-1">
324
+ <div class="o-table-style-picker d-flex flew-row justify-content-between ps-1 border rounded">
302
325
  <div class="d-flex flex-row overflow-hidden ps-2">
303
326
  <t t-foreach="getDisplayedTableStyles()" t-as="styleId" t-key="styleId">
304
327
  <TableStylePreview
@@ -312,7 +335,7 @@
312
335
  </t>
313
336
  </div>
314
337
  <div
315
- class="o-table-style-picker-arrow d-flex align-items-center px-1"
338
+ class="o-table-style-picker-arrow d-flex align-items-center px-1 border-start"
316
339
  t-on-click.stop="onArrowButtonClick">
317
340
  <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
318
341
  </div>
@@ -354,7 +377,7 @@
354
377
  <t t-name="o-spreadsheet-Spreadsheet">
355
378
  <div
356
379
  class="o-spreadsheet h-100 w-100"
357
- t-att-class="{'o-spreadsheet-mobile': env.isSmall}"
380
+ t-att-class="getSpreadSheetClasses()"
358
381
  t-ref="spreadsheet"
359
382
  t-att-style="getStyle()">
360
383
  <t t-if="env.isDashboard()">
@@ -371,10 +394,10 @@
371
394
  t-att-style="gridContainerStyle"
372
395
  t-on-click="this.focusGrid">
373
396
  <div class="o-top-left"/>
374
- <div class="o-column-groups">
397
+ <div class="o-column-groups o-zoomable">
375
398
  <HeaderGroupContainer layers="colLayers" dimension="'COL'"/>
376
399
  </div>
377
- <div class="o-row-groups">
400
+ <div class="o-row-groups o-zoomable">
378
401
  <HeaderGroupContainer layers="rowLayers" dimension="'ROW'"/>
379
402
  </div>
380
403
  <div class="o-group-grid overflow-hidden">
@@ -396,7 +419,7 @@
396
419
  <RibbonMenu onClose="() => this.menuState.isOpen=false"/>
397
420
  </t>
398
421
  <t t-else="">
399
- <div class="o-small-composer px-2 py-2 position-relative">
422
+ <div class="o-small-composer px-2 py-2 position-relative bg-white border">
400
423
  <div class="w-100" t-ref="bottombarComposer">
401
424
  <Composer t-props="composerProps"/>
402
425
  <span
@@ -428,7 +451,7 @@
428
451
  composerFocusableElement="true"
429
452
  />
430
453
  </div>
431
- <div class="d-flex flex-fill align-items-center bottom-bar-menu">
454
+ <div class="d-flex flex-fill align-items-center bottom-bar-menu border-top border-bottom">
432
455
  <Ripple>
433
456
  <div class="py-1 px-1 mx-2 ribbon-toggler" t-on-click="toggleRibbon">
434
457
  <i class="o-icon fa fa-cog"/>
@@ -675,8 +698,9 @@
675
698
  </t>
676
699
 
677
700
  <t t-name="o-spreadsheet-SidePanelExtended">
678
- <div class="o-sidePanel h-100">
679
- <div class="o-sidePanelHeader d-flex align-items-center justify-content-between">
701
+ <div class="o-sidePanel h-100 bg-white border-top border-start">
702
+ <div
703
+ class="o-sidePanelHeader d-flex align-items-center justify-content-between border-bottom">
680
704
  <div
681
705
  t-if="props.onToggleCollapsePanel"
682
706
  class="o-collapse-panel o-sidePanelAction rounded"
@@ -720,7 +744,9 @@
720
744
  </t>
721
745
 
722
746
  <t t-name="o-spreadsheet-SidePanelCollapsed">
723
- <div class="o-sidePanel collapsed w-100 h-100" t-on-click="props.onToggleCollapsePanel">
747
+ <div
748
+ class="o-sidePanel collapsed w-100 h-100 bg-white"
749
+ t-on-click="props.onToggleCollapsePanel">
724
750
  <div class="d-flex flex-column align-items-center">
725
751
  <div
726
752
  t-if="props.onToggleCollapsePanel"
@@ -759,7 +785,7 @@
759
785
  t-att-selected="currentLocale.code === locale.code"
760
786
  />
761
787
  </select>
762
- <div class="o-locale-preview mt-4 p-3 rounded">
788
+ <div class="o-locale-preview mt-4 p-3 rounded border">
763
789
  <div>
764
790
  <span class="o-fw-bold me-1">Number:</span>
765
791
  <span t-esc="numberFormatPreview"/>
@@ -957,24 +983,22 @@
957
983
  <div class="row mb-2 align-items-center">
958
984
  <div class="col-6">Max rows:</div>
959
985
  <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)"
986
+ <NumberInput
987
+ value="pivotStyle.numberOfRows ?? ''"
988
+ class="'o-pivot-n-of-rows'"
989
+ placeholder.translate="e.g. 10"
990
+ onChange="(value) => this.updatePivotStyleNumberProperty(value, 'numberOfRows')"
966
991
  />
967
992
  </div>
968
993
  </div>
969
994
  <div class="row mb-2 align-items-center">
970
995
  <div class="col-6">Max columns:</div>
971
996
  <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)"
997
+ <NumberInput
998
+ value="pivotStyle.numberOfColumns ?? ''"
999
+ class="'o-pivot-n-of-columns'"
1000
+ placeholder.translate="e.g. 5"
1001
+ onChange="(value) => this.updatePivotStyleNumberProperty(value, 'numberOfColumns')"
978
1002
  />
979
1003
  </div>
980
1004
  </div>
@@ -1027,13 +1051,13 @@
1027
1051
  </t>
1028
1052
  </select>
1029
1053
  <div
1030
- class="o-pivot-measure-display-description mt-3 ps-3"
1054
+ class="o-pivot-measure-display-description mt-3 ps-3 border-start"
1031
1055
  t-esc="measureDisplayDescription[store.measureDisplay.type]"
1032
1056
  />
1033
1057
  </Section>
1034
1058
 
1035
1059
  <Section t-if="store.doesDisplayNeedsField" title.translate="Base field:">
1036
- <div class="o-pivot-measure-display-field w-100 py-1 px-3">
1060
+ <div class="o-pivot-measure-display-field w-100 py-1 px-3 border">
1037
1061
  <t t-if="store.fields.length">
1038
1062
  <RadioSelection
1039
1063
  choices="fieldChoices"
@@ -1051,7 +1075,7 @@
1051
1075
 
1052
1076
  <t t-set="values" t-value="store.values"/>
1053
1077
  <Section t-if="store.doesDisplayNeedsValue and values.length" title.translate="Base item:">
1054
- <div class="o-pivot-measure-display-value w-100 py-1 px-3">
1078
+ <div class="o-pivot-measure-display-value w-100 py-1 px-3 border">
1055
1079
  <RadioSelection
1056
1080
  choices="values"
1057
1081
  selectedValue="store.measureDisplay.value"
@@ -1194,7 +1218,7 @@
1194
1218
  <div t-esc="sortDescription" class="pb-2"/>
1195
1219
  <div class="d-flex flex-column gap-2">
1196
1220
  <t t-foreach="sortValuesAndFields" t-as="valueAndField" t-key="valueAndField_index">
1197
- <div class="o-sort-card d-flex gap-1 px-2">
1221
+ <div class="o-sort-card d-flex gap-1 px-2 border">
1198
1222
  <t t-if="valueAndField.field">
1199
1223
  <span class="fw-bolder" t-esc="valueAndField.field"/>
1200
1224
  =
@@ -1306,7 +1330,7 @@
1306
1330
 
1307
1331
  <t t-name="o-spreadsheet-PivotDimension">
1308
1332
  <div
1309
- class="py-1 px-2 d-flex flex-column shadow-sm pivot-dimension"
1333
+ class="py-1 px-2 d-flex flex-column shadow-sm pivot-dimension border rounded"
1310
1334
  t-att-class="{'pivot-dimension-invalid': !props.dimension.isValid}">
1311
1335
  <div class="d-flex flex-row justify-content-between align-items-center">
1312
1336
  <div class="d-flex align-items-center overflow-hidden text-nowrap">
@@ -1339,7 +1363,7 @@
1339
1363
  <button class="add-dimension o-button" t-on-click="togglePopover" t-ref="button">Add</button>
1340
1364
  <Popover t-if="popover.isOpen" t-props="popoverProps">
1341
1365
  <div
1342
- class="p-2 bg-white border-bottom d-flex sticky-top align-items-baseline pivot-dimension-search">
1366
+ class="p-2 bg-white border-bottom d-flex sticky-top align-items-baseline pivot-dimension-search bg-white">
1343
1367
  <i class="pe-1 pivot-dimension-search-field-icon text-muted">
1344
1368
  <t t-call="o-spreadsheet-Icon.SEARCH"/>
1345
1369
  </i>
@@ -1424,21 +1448,97 @@
1424
1448
 
1425
1449
  <t t-name="o-spreadsheet-MoreFormatsPanel">
1426
1450
  <div class="o-more-formats-panel">
1427
- <div
1428
- t-foreach="dateFormatsActions"
1429
- t-as="action"
1430
- t-key="action.name(env)"
1431
- t-att-data-name="action.name(env)"
1432
- t-on-click="() => action.execute(env)"
1433
- class="w-100 d-flex align-items-center border-bottom format-preview">
1434
- <span class="ms-3 check-icon">
1435
- <t t-if="action.isActive(env)" t-call="o-spreadsheet-Icon.CHECK"/>
1436
- </span>
1437
- <span t-out="action.description(env)"/>
1438
- </div>
1451
+ <Section title.translate="Format type">
1452
+ <BadgeSelection
1453
+ choices="store.categories"
1454
+ onChange.bind="(category) => store.changeCategory(category)"
1455
+ selectedValue="store.category"
1456
+ />
1457
+ </Section>
1458
+ <t t-if="store.category === 'currency'" t-call="o-spreadsheet-CustomCurrencySection"/>
1459
+ <t t-set="proposals" t-value="store.formatProposals"/>
1460
+ <Section title.translate="Type" t-if="proposals.length">
1461
+ <div class="o-format-proposals overflow-auto border">
1462
+ <div
1463
+ t-foreach="proposals"
1464
+ t-as="proposal"
1465
+ t-key="proposal.format"
1466
+ t-att-data-name="proposal.format"
1467
+ t-on-click="() => this.store.updateFormat(proposal.format)"
1468
+ class="w-100 d-flex align-items-center format-preview px-2 py-1"
1469
+ t-att-class="{'active': (proposal.format || '') === (store.currentFormat || '')}">
1470
+ <span t-out="proposal.label"/>
1471
+ </div>
1472
+ </div>
1473
+ </Section>
1474
+
1475
+ <Section title.translate="Format" class="'o-custom-format-section'">
1476
+ <TextInput
1477
+ value="store.currentFormat || ''"
1478
+ onChange="(format) => this.store.updateFormat(format)"
1479
+ placeholder.translate="Format code"
1480
+ alwaysShowBorder="true"
1481
+ errorMessage="store.invalidFormatMessage"
1482
+ />
1483
+ <t t-set="examples" t-value="store.formatExamples"/>
1484
+ <div class="o-format-examples mt-4 p-2 rounded border" t-if="examples.length">
1485
+ <table class="w-100">
1486
+ <t t-foreach="examples" t-as="example" t-key="example_index">
1487
+ <tr>
1488
+ <td class="w-25 pe-3 o-fw-bold" t-esc="example.label"/>
1489
+ <td class="w-75 text-truncate" t-esc="example.value"/>
1490
+ </tr>
1491
+ </t>
1492
+ </table>
1493
+ </div>
1494
+ </Section>
1439
1495
  </div>
1440
1496
  </t>
1441
1497
 
1498
+ <t t-name="o-spreadsheet-CustomCurrencySection">
1499
+ <t t-set="availableCurrencies" t-value="store.availableCurrencies"/>
1500
+ <Section t-if="availableCurrencies.length > 1" title.translate="Currency">
1501
+ <select
1502
+ class="o-input o-available-currencies"
1503
+ t-on-change="(ev) => this.updateSelectCurrency(ev)">
1504
+ <t t-foreach="availableCurrencies" t-as="currency" t-key="currency_index">
1505
+ <option
1506
+ t-att-value="currency_index"
1507
+ t-esc="currencyDisplayName(currency)"
1508
+ t-att-selected="currency_index === store.selectedCurrencyIndex"
1509
+ />
1510
+ </t>
1511
+ </select>
1512
+ </Section>
1513
+ <Section>
1514
+ <div class="o-subsection-left">
1515
+ <div class="o-section-title">Code</div>
1516
+ <TextInput
1517
+ value="store.currencyCode"
1518
+ placeholder.translate="code"
1519
+ onChange="(code) => this.store.changeCurrencyCode(code)"
1520
+ alwaysShowBorder="true"
1521
+ />
1522
+ </div>
1523
+ <div class="o-subsection-right">
1524
+ <div class="o-section-title">Symbol</div>
1525
+ <TextInput
1526
+ value="store.currencySymbol"
1527
+ placeholder.translate="symbol"
1528
+ onChange="(symbol) => this.store.changeCurrencySymbol(symbol)"
1529
+ alwaysShowBorder="true"
1530
+ />
1531
+ </div>
1532
+ <Checkbox
1533
+ name="'accountingFormat'"
1534
+ className="'pt-2'"
1535
+ label.translate="Accounting format"
1536
+ value="store.isAccountingFormat"
1537
+ onChange="() => store.toggleAccountingFormat()"
1538
+ />
1539
+ </Section>
1540
+ </t>
1541
+
1442
1542
  <t t-name="o-spreadsheet-FindAndReplacePanel">
1443
1543
  <div class="o-find-and-replace">
1444
1544
  <Section title.translate="Search">
@@ -1568,7 +1668,7 @@
1568
1668
  </t>
1569
1669
 
1570
1670
  <t t-name="o-spreadsheet-DataValidationPreview">
1571
- <div class="o-dv-preview p-3" t-on-click="props.onClick" t-ref="dvPreview">
1671
+ <div class="o-dv-preview p-3 border-bottom" t-on-click="props.onClick" t-ref="dvPreview">
1572
1672
  <div class="d-flex justify-content-between">
1573
1673
  <div class="o-dv-container d-flex flex-column">
1574
1674
  <div class="o-dv-preview-description o-fw-bold text-truncate" t-esc="descriptionString"/>
@@ -1607,6 +1707,7 @@
1607
1707
  t-key="state.rule.criterion.type"
1608
1708
  criterion="state.rule.criterion"
1609
1709
  onCriterionChanged.bind="onCriterionChanged"
1710
+ autofocus="state.isTypeUpdated"
1610
1711
  />
1611
1712
  </div>
1612
1713
  </Section>
@@ -1630,93 +1731,13 @@
1630
1731
  </div>
1631
1732
  </t>
1632
1733
 
1633
- <t t-name="o-spreadsheet-CustomCurrencyPanel">
1634
- <div class="o-custom-currency">
1635
- <Section t-if="availableCurrencies.length > 1" title.translate="Currency">
1636
- <select
1637
- class="o-input o-available-currencies"
1638
- t-on-change="(ev) => this.updateSelectCurrency(ev)">
1639
- <t t-foreach="availableCurrencies" t-as="currency" t-key="currency_index">
1640
- <option
1641
- t-att-value="currency_index"
1642
- t-esc="currencyDisplayName(currency)"
1643
- t-att-selected="currency_index === state.selectedCurrencyIndex"
1644
- />
1645
- </t>
1646
- </select>
1647
- </Section>
1648
- <Section>
1649
- <div class="o-subsection-left">
1650
- <div class="o-section-title">Code</div>
1651
- <input
1652
- type="text"
1653
- class="o-input"
1654
- t-model="state.currencyCode"
1655
- placeholder="code"
1656
- t-on-input="(ev) => this.updateCode(ev)"
1657
- />
1658
- </div>
1659
- <div class="o-subsection-right">
1660
- <div class="o-section-title">Symbol</div>
1661
- <input
1662
- type="text"
1663
- class="o-input"
1664
- placeholder="symbol"
1665
- t-model="state.currencySymbol"
1666
- t-on-input="(ev) => this.updateSymbol(ev)"
1667
- />
1668
- </div>
1669
- </Section>
1670
- <Section title.translate="Format">
1671
- <select
1672
- class="o-input o-format-proposals mb-1"
1673
- t-on-change="(ev) => this.updateSelectFormat(ev)"
1674
- t-att-disabled="!formatProposals.length">
1675
- <t t-foreach="formatProposals" t-as="proposal" t-key="proposal_index">
1676
- <option
1677
- t-att-value="proposal_index"
1678
- t-esc="proposal.example"
1679
- t-att-selected="proposal_index === state.selectedFormatIndex"
1680
- />
1681
- </t>
1682
- </select>
1683
- <t t-set="accounting_format_label">Accounting format</t>
1684
- <Checkbox
1685
- name="'accountingFormat'"
1686
- label="accounting_format_label"
1687
- value="state.isAccountingFormat"
1688
- onChange.bind="toggleAccountingFormat"
1689
- />
1690
- <div class="o-format-examples mt-4" t-if="selectedFormat">
1691
- <table class="w-100">
1692
- <t t-foreach="getFormatExamples()" t-as="example" t-key="example_index">
1693
- <tr>
1694
- <td class="w-25 pe-3 o-fw-bold" t-esc="example.label"/>
1695
- <td class="w-75 text-truncate" t-esc="example.value"/>
1696
- </tr>
1697
- </t>
1698
- </table>
1699
- </div>
1700
- </Section>
1701
- <Section>
1702
- <div class="o-sidePanelButtons">
1703
- <button
1704
- class="o-button primary"
1705
- t-on-click="() => this.apply()"
1706
- t-att-disabled="!formatProposals.length || isSameFormat">
1707
- Apply
1708
- </button>
1709
- </div>
1710
- </Section>
1711
- </div>
1712
- </t>
1713
-
1714
1734
  <t t-name="o-spreadsheet-ValueInRangeCriterionForm">
1715
1735
  <SelectionInput
1716
1736
  ranges="[props.criterion.values[0] || '']"
1717
1737
  onSelectionChanged="(ranges) => this.onRangeChanged(ranges[0])"
1718
1738
  required="true"
1719
1739
  hasSingleRange="true"
1740
+ autofocus="props.autofocus"
1720
1741
  />
1721
1742
  <t t-foreach="values" t-as="value" t-key="value_index">
1722
1743
  <div class="o-dv-list-values p-1 d-flex align-items-center">
@@ -1786,6 +1807,7 @@
1786
1807
  onValueChanged.bind="onValueChanged"
1787
1808
  criterionType="props.criterion.type"
1788
1809
  disableFormulas="props.disableFormulas"
1810
+ focused="props.autofocus"
1789
1811
  />
1790
1812
  </t>
1791
1813
 
@@ -1795,6 +1817,7 @@
1795
1817
  onValueChanged.bind="onFirstValueChanged"
1796
1818
  criterionType="props.criterion.type"
1797
1819
  disableFormulas="props.disableFormulas"
1820
+ focused="props.autofocus"
1798
1821
  />
1799
1822
  <CriterionInput
1800
1823
  value="props.criterion.values[1]"
@@ -1812,16 +1835,17 @@
1812
1835
  t-key="dateValue.value"
1813
1836
  t-att-value="dateValue.value"
1814
1837
  t-esc="dateValue.title"
1815
- t-att-selected="dateValue.value === props.criterion.dateValue"
1838
+ t-att-selected="dateValue.value === currentDateValue"
1816
1839
  />
1817
1840
  </select>
1818
1841
 
1819
1842
  <CriterionInput
1820
- t-if="props.criterion.dateValue === 'exactDate'"
1843
+ t-if="currentDateValue === 'exactDate'"
1821
1844
  value="props.criterion.values[0]"
1822
1845
  onValueChanged.bind="onValueChanged"
1823
1846
  criterionType="props.criterion.type"
1824
1847
  disableFormulas="props.disableFormulas"
1848
+ focused="props.autofocus"
1825
1849
  />
1826
1850
  </t>
1827
1851
 
@@ -1900,47 +1924,45 @@
1900
1924
  <t t-name="o-spreadsheet-ConditionalFormatPreview">
1901
1925
  <t t-set="cf" t-value="props.conditionalFormat"/>
1902
1926
  <div
1903
- class="o-cf-preview w-100"
1927
+ class="o-cf-preview w-100 d-flex align-items-center border-bottom"
1904
1928
  t-ref="cfPreview"
1905
1929
  t-att-class="props.class"
1906
1930
  t-att-data-id="cf.id"
1907
1931
  t-on-click="props.onPreviewClick"
1908
1932
  t-on-pointerdown="(ev) => this.onMouseDown(ev)">
1909
- <div class="position-relative h-100 w-100 d-flex align-items-center">
1933
+ <div class="o-cf-drag-handle h-100 position-absolute d-flex align-items-center o-button-icon">
1934
+ <t t-call="o-spreadsheet-Icon.THIN_DRAG_HANDLE"/>
1935
+ </div>
1936
+ <t t-if="cf.rule.type==='IconSetRule'">
1910
1937
  <div
1911
- class="o-cf-drag-handle h-100 position-absolute d-flex align-items-center o-button-icon">
1912
- <t t-call="o-spreadsheet-Icon.THIN_DRAG_HANDLE"/>
1913
- </div>
1914
- <t t-if="cf.rule.type==='IconSetRule'">
1915
- <div class="o-cf-preview-icon d-flex justify-content-around align-items-center me-2">
1916
- <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.upper].template}}"/>
1917
- <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.middle].template}}"/>
1918
- <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.lower].template}}"/>
1919
- </div>
1920
- </t>
1921
- <t t-else="">
1922
- <div
1923
- t-att-style="getPreviewImageStyle(cf.rule)"
1924
- class="o-cf-preview-icon d-flex justify-content-around align-items-center me-2">
1925
- 123
1926
- </div>
1927
- </t>
1928
- <div class="o-cf-preview-description">
1929
- <div class="o-cf-preview-ruletype">
1930
- <div class="o-cf-preview-description-rule o-fw-bold text-truncate">
1931
- <t t-esc="getDescription(cf)"/>
1932
- </div>
1933
- </div>
1934
- <div class="o-cf-preview-range text-truncate" t-esc="cf.ranges"/>
1938
+ class="o-cf-preview-icon d-flex justify-content-around align-items-center me-3 bg-white border">
1939
+ <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.upper].template}}"/>
1940
+ <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.middle].template}}"/>
1941
+ <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.lower].template}}"/>
1935
1942
  </div>
1936
- <div class="o-cf-delete">
1937
- <div
1938
- class="o-cf-delete-button o-button-icon"
1939
- t-on-click.stop="(ev) => this.deleteConditionalFormat(cf, ev)"
1940
- title="Remove rule">
1941
- <t t-call="o-spreadsheet-Icon.TRASH_FILLED"/>
1943
+ </t>
1944
+ <t t-else="">
1945
+ <div
1946
+ t-att-style="getPreviewImageStyle(cf.rule)"
1947
+ class="o-cf-preview-icon d-flex justify-content-around align-items-center me-3 flex-shrink-0 border">
1948
+ 123
1949
+ </div>
1950
+ </t>
1951
+ <div class="o-cf-preview-description me-3 overflow-auto">
1952
+ <div class="o-cf-preview-ruletype">
1953
+ <div class="o-cf-preview-description-rule o-fw-bold text-truncate">
1954
+ <t t-esc="getDescription(cf)"/>
1942
1955
  </div>
1943
1956
  </div>
1957
+ <div class="o-cf-preview-range text-truncate" t-esc="cf.ranges"/>
1958
+ </div>
1959
+ <div class="o-cf-delete ms-auto">
1960
+ <div
1961
+ class="o-cf-delete-button o-button-icon"
1962
+ t-on-click.stop="(ev) => this.deleteConditionalFormat(cf, ev)"
1963
+ title="Remove rule">
1964
+ <t t-call="o-spreadsheet-Icon.TRASH_FILLED"/>
1965
+ </div>
1944
1966
  </div>
1945
1967
  </div>
1946
1968
  </t>
@@ -1950,7 +1972,7 @@
1950
1972
  <div class="o-section-subtitle">Icons</div>
1951
1973
  <div class="o-cf-iconsets d-flex flex-row">
1952
1974
  <div
1953
- class="o-cf-iconset o-cf-clickable-icon d-flex flex-row justify-content-between"
1975
+ class="o-cf-iconset o-cf-clickable-icon d-flex flex-row justify-content-between border rounded"
1954
1976
  t-foreach="['arrows', 'smiley', 'dots']"
1955
1977
  t-as="iconSet"
1956
1978
  t-key="iconSet"
@@ -1973,7 +1995,7 @@
1973
1995
  <tr>
1974
1996
  <td>
1975
1997
  <div t-on-click.stop="(ev) => this.toggleMenu('iconSet-'+icon+'Icon', ev)">
1976
- <div class="o-cf-icon-button o-cf-clickable-icon me-3">
1998
+ <div class="o-cf-icon-button o-cf-clickable-icon me-3 border rounded">
1977
1999
  <t t-call="o-spreadsheet-Icon.{{icons[iconValue].template}}"/>
1978
2000
  </div>
1979
2001
  </div>
@@ -2056,7 +2078,7 @@
2056
2078
  <tr>
2057
2079
  <td>
2058
2080
  <div t-on-click.stop="(ev) => this.toggleMenu('iconSet-lowerIcon', ev)">
2059
- <div class="o-cf-icon-button o-cf-clickable-icon me-3">
2081
+ <div class="o-cf-icon-button o-cf-clickable-icon me-3 border rounded">
2060
2082
  <t t-call="o-spreadsheet-Icon.{{icons[rule.icons.lower].template}}"/>
2061
2083
  </div>
2062
2084
  </div>
@@ -2171,7 +2193,7 @@
2171
2193
  <t t-name="o-spreadsheet-ColorScaleRuleEditor">
2172
2194
  <div class="o-cf-color-scale-editor">
2173
2195
  <div class="o-section-subtitle">Preview</div>
2174
- <div class="o-cf-preview-display mb-4" t-attf-style="{{getPreviewGradient()}}">
2196
+ <div class="o-cf-preview-display mb-4" t-attf-style="{{getColorScalePreviewStyle()}}">
2175
2197
  Preview text
2176
2198
  </div>
2177
2199
  <div class="o-section-subtitle">Minpoint</div>
@@ -2250,7 +2272,7 @@
2250
2272
 
2251
2273
  <t t-name="o-spreadsheet-CellIsRuleEditorPreview">
2252
2274
  <div
2253
- class="o-cf-preview-display"
2275
+ class="o-cf-preview-display border"
2254
2276
  t-attf-style="font-weight:{{currentStyle.bold ?'bold':'normal'}};
2255
2277
  text-decoration:{{getTextDecoration(currentStyle)}};
2256
2278
  font-style:{{currentStyle.italic?'italic':'normal'}};
@@ -2278,6 +2300,7 @@
2278
2300
  t-key="state.rules.cellIs.operator"
2279
2301
  criterion="genericCriterion"
2280
2302
  onCriterionChanged.bind="onRuleValuesChanged"
2303
+ autofocus="this.state.hasEditedCf"
2281
2304
  />
2282
2305
 
2283
2306
  <div class="o-section-subtitle pt-3">Formatting style</div>
@@ -2323,7 +2346,7 @@
2323
2346
  icon="'o-spreadsheet-Icon.TEXT_COLOR'"
2324
2347
  class="'o-hoverable-button o-menu-item-button'"
2325
2348
  />
2326
- <div class="o-divider"/>
2349
+ <div class="o-divider border-end"/>
2327
2350
  <ColorPickerWidget
2328
2351
  currentColor="rule.style.fillColor"
2329
2352
  toggleColorPicker="(ev) => this.toggleMenu('cellIsRule-fillColor', ev)"
@@ -2351,7 +2374,7 @@
2351
2374
 
2352
2375
  <t t-name="o-spreadsheet.RoundColorPicker">
2353
2376
  <div
2354
- class="o-round-color-picker-button rounded-circle"
2377
+ class="o-round-color-picker-button rounded-circle border"
2355
2378
  t-ref="colorPickerButton"
2356
2379
  t-on-click.stop="togglePicker"
2357
2380
  t-att-title="props.title"
@@ -2375,6 +2398,7 @@
2375
2398
  <t t-foreach="props.choices" t-as="choice" t-key="choice.value">
2376
2399
  <label class="o-radio d-flex align-items-center me-4">
2377
2400
  <input
2401
+ class="border rounded-circle"
2378
2402
  t-att-class="{
2379
2403
  'me-1': props.direction === 'horizontal',
2380
2404
  'me-2': props.direction === 'vertical'}"
@@ -2442,7 +2466,7 @@
2442
2466
  t-att-class="{'text-muted': props.disabled }"
2443
2467
  t-attf-class="{{props.className}}">
2444
2468
  <input
2445
- class="me-2"
2469
+ class="me-2 flex-shrink-0 border"
2446
2470
  type="checkbox"
2447
2471
  t-att-disabled="props.disabled"
2448
2472
  t-att-name="props.name"
@@ -2450,7 +2474,7 @@
2450
2474
  t-on-change="onChange"
2451
2475
  t-on-click.stop=""
2452
2476
  />
2453
- <t t-if="props.label" t-esc="props.label"/>
2477
+ <span class="text-truncate" t-if="props.label" t-esc="props.label"/>
2454
2478
  </label>
2455
2479
  </t>
2456
2480
 
@@ -2484,6 +2508,9 @@
2484
2508
  className="'mb-2'"
2485
2509
  />
2486
2510
  </Section>
2511
+ <Section class="'pt-0'" title.translate="Number formatting">
2512
+ <ChartHumanizeNumbers t-props="props"/>
2513
+ </Section>
2487
2514
  </t>
2488
2515
  </GeneralDesignEditor>
2489
2516
  <SeriesWithAxisDesignEditor t-props="props"/>
@@ -2523,7 +2550,7 @@
2523
2550
  className="'mb-2'"
2524
2551
  />
2525
2552
  </Section>
2526
- <Section class="'pt-1'" title.translate="Number formatting">
2553
+ <Section class="'pt-0'" title.translate="Number formatting">
2527
2554
  <ChartHumanizeNumbers t-props="props"/>
2528
2555
  </Section>
2529
2556
  </t>
@@ -2662,6 +2689,9 @@
2662
2689
  hasVerticalAlign="true"
2663
2690
  />
2664
2691
  </Section>
2692
+ <Section class="'pt-0'" title.translate="Number formatting">
2693
+ <ChartHumanizeNumbers t-props="props"/>
2694
+ </Section>
2665
2695
  </t>
2666
2696
  </SidePanelCollapsible>
2667
2697
  </t>
@@ -2722,6 +2752,9 @@
2722
2752
  <GeneralDesignEditor t-props="props">
2723
2753
  <t t-set-slot="general-extension">
2724
2754
  <ChartLegend t-props="props"/>
2755
+ <Section class="'pt-0'" title.translate="Number formatting">
2756
+ <ChartHumanizeNumbers t-props="props"/>
2757
+ </Section>
2725
2758
  </t>
2726
2759
  </GeneralDesignEditor>
2727
2760
 
@@ -2773,7 +2806,7 @@
2773
2806
  <t t-set="color_down">Color Down</t>
2774
2807
  <GeneralDesignEditor t-props="props" defaultChartTitleFontSize="defaultScorecardTitleFontSize">
2775
2808
  <t t-set-slot="general-extension">
2776
- <Section class="'pt-1'" title.translate="Number formatting">
2809
+ <Section class="'pt-0'" title.translate="Number formatting">
2777
2810
  <ChartHumanizeNumbers t-props="props"/>
2778
2811
  </Section>
2779
2812
  </t>
@@ -2887,7 +2920,7 @@
2887
2920
  <ChartShowValues t-props="props"/>
2888
2921
  <ChartShowDataMarkers t-props="props"/>
2889
2922
  </Section>
2890
- <Section class="'pt-1'" title.translate="Number formatting">
2923
+ <Section class="'pt-0'" title.translate="Number formatting">
2891
2924
  <ChartHumanizeNumbers t-props="props"/>
2892
2925
  </Section>
2893
2926
  </t>
@@ -2902,7 +2935,7 @@
2902
2935
  <Section class="'pt-0'" title.translate="Values">
2903
2936
  <ChartShowValues t-props="props"/>
2904
2937
  </Section>
2905
- <Section class="'pt-1'" title.translate="Number formatting">
2938
+ <Section class="'pt-0'" title.translate="Number formatting">
2906
2939
  <ChartHumanizeNumbers t-props="props"/>
2907
2940
  </Section>
2908
2941
  <PieHoleSize
@@ -2934,7 +2967,7 @@
2934
2967
  </div>
2935
2968
 
2936
2969
  <t t-set="definition" t-value="getChartDefinition(this.chartId)"/>
2937
- <div class="o-panel-content overflow-y-auto" t-ref="panelContent">
2970
+ <div class="o-panel-content" t-ref="panelContent">
2938
2971
  <div t-att-class="store.panel !== 'configuration' ? 'd-none' : ''">
2939
2972
  <ChartTypePicker chartId="chartId" chartPanelStore="store"/>
2940
2973
  <t
@@ -2977,7 +3010,7 @@
2977
3010
  className="'mb-2'"
2978
3011
  />
2979
3012
  </Section>
2980
- <Section class="'pt-1'" title.translate="Number formatting">
3013
+ <Section class="'pt-0'" title.translate="Number formatting">
2981
3014
  <ChartHumanizeNumbers t-props="props"/>
2982
3015
  </Section>
2983
3016
  </t>
@@ -3086,7 +3119,7 @@
3086
3119
  <option value="left">Bottom left</option>
3087
3120
  </select>
3088
3121
  </Section>
3089
- <Section class="'pt-1'" title.translate="Number formatting">
3122
+ <Section class="'pt-0'" title.translate="Number formatting">
3090
3123
  <ChartHumanizeNumbers t-props="props"/>
3091
3124
  </Section>
3092
3125
  </t>
@@ -3094,45 +3127,10 @@
3094
3127
 
3095
3128
  <SidePanelCollapsible isInitiallyCollapsed="false" title.translate="Geo chart options">
3096
3129
  <t t-set-slot="content">
3097
- <Section class="'pt-0 o-color-scale'" title.translate="Color Scale">
3098
- <select class="o-input" t-on-change="this.updateColorScaleType">
3099
- <option value="custom">Custom</option>
3100
- <hr/>
3101
- <t t-foreach="colorScalesChoices" t-as="colorScale" t-key="colorScale">
3102
- <option
3103
- t-att-value="colorScale"
3104
- t-esc="colorScale_value"
3105
- t-att-selected="colorScale === selectedColorScale"
3106
- />
3107
- </t>
3108
- </select>
3109
-
3110
- <t t-if="customColorScale">
3111
- <div class="o-min-color d-flex align-items-center mb-2 mt-4">
3112
- <RoundColorPicker
3113
- currentColor="getCustomColorScaleColor('minColor')"
3114
- onColorPicked="(color) => this.setCustomColorScaleColor('minColor', color)"
3115
- disableNoColor="true"
3116
- />
3117
- <span class="ps-2">Color of minimum values</span>
3118
- </div>
3119
- <div class="o-mid-color d-flex align-items-center mb-2">
3120
- <RoundColorPicker
3121
- currentColor="getCustomColorScaleColor('midColor')"
3122
- onColorPicked="(color) => this.setCustomColorScaleColor('midColor', color)"
3123
- />
3124
- <span class="ps-2">Color of middle values</span>
3125
- </div>
3126
- <div class="o-max-color d-flex align-items-center">
3127
- <RoundColorPicker
3128
- currentColor="getCustomColorScaleColor('maxColor')"
3129
- onColorPicked="(color) => this.setCustomColorScaleColor('maxColor', color)"
3130
- disableNoColor="true"
3131
- />
3132
- <span class="ps-2">Color of maximum values</span>
3133
- </div>
3134
- </t>
3135
- </Section>
3130
+ <ColorScalePicker
3131
+ definition="props.definition"
3132
+ onUpdateColorScale.bind="this.updateColorScale"
3133
+ />
3136
3134
 
3137
3135
  <Section class="'pt-0 o-missing-value'" title.translate="Countries without value">
3138
3136
  <RoundColorPicker
@@ -3179,7 +3177,7 @@
3179
3177
  <t t-name="o-spreadsheet-GaugeChartDesignPanel">
3180
3178
  <GeneralDesignEditor t-props="props">
3181
3179
  <t t-set-slot="general-extension">
3182
- <Section class="'pt-1'" title.translate="Number formatting">
3180
+ <Section class="'pt-0'" title.translate="Number formatting">
3183
3181
  <ChartHumanizeNumbers t-props="props"/>
3184
3182
  </Section>
3185
3183
  </t>
@@ -3325,7 +3323,7 @@
3325
3323
  <Section class="'pt-0'" title.translate="Values">
3326
3324
  <ChartShowValues t-props="props"/>
3327
3325
  </Section>
3328
- <Section class="'pt-1'" title.translate="Number formatting">
3326
+ <Section class="'pt-0'" title.translate="Number formatting">
3329
3327
  <ChartHumanizeNumbers t-props="props"/>
3330
3328
  </Section>
3331
3329
  </t>
@@ -3365,7 +3363,7 @@
3365
3363
  className="'mb-2'"
3366
3364
  />
3367
3365
  </Section>
3368
- <Section class="'pt-1'" title.translate="Number formatting">
3366
+ <Section class="'pt-0'" title.translate="Number formatting">
3369
3367
  <ChartHumanizeNumbers t-props="props"/>
3370
3368
  </Section>
3371
3369
  </t>
@@ -3441,7 +3439,7 @@
3441
3439
  <Popover t-if="state.popoverProps" t-props="state.popoverProps">
3442
3440
  <div
3443
3441
  t-ref="popoverRef"
3444
- class="o-chart-select-popover px-3 pb-4"
3442
+ class="o-chart-select-popover px-3 pb-4 bg-white"
3445
3443
  t-att-style="state.popoverStyle">
3446
3444
  <t t-foreach="categories" t-as="category" t-key="category">
3447
3445
  <t t-if="chartTypeByCategories[category]">
@@ -3469,148 +3467,192 @@
3469
3467
 
3470
3468
  <t t-name="o-spreadsheet-ChartPreview.LINE_CHART">
3471
3469
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3472
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3473
- <path stroke="#eb6d00" style="fill:none" d="M6,40 l12,-12 l6,6 l18,-18"/>
3474
- <path stroke="#0074d9" style="fill:none" d="M6,25 l12,-12 l18,18 l6,-6"/>
3470
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3471
+ <path
3472
+ stroke="var(--os-chart-preview-orange-line)"
3473
+ style="fill:none"
3474
+ d="M6,40 l12,-12 l6,6 l18,-18"
3475
+ />
3476
+ <path
3477
+ stroke="var(--os-chart-preview-blue-line)"
3478
+ style="fill:none"
3479
+ d="M6,25 l12,-12 l18,18 l6,-6"
3480
+ />
3475
3481
  </svg>
3476
3482
  </t>
3477
3483
  <t t-name="o-spreadsheet-ChartPreview.STACKED_LINE_CHART">
3478
3484
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3479
- <path stroke="#0074d9" style="fill:none" d="M3,30 l12,-12 l6,6 l18,-18"/>
3480
- <path stroke="#eb6d00" style="fill:none" d="M3,40 l12,-12 l6,6 l18,-12"/>
3481
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3485
+ <path
3486
+ stroke="var(--os-chart-preview-blue-line)"
3487
+ style="fill:none"
3488
+ d="M3,30 l12,-12 l6,6 l18,-18"
3489
+ />
3490
+ <path
3491
+ stroke="var(--os-chart-preview-orange-line)"
3492
+ style="fill:none"
3493
+ d="M3,40 l12,-12 l6,6 l18,-12"
3494
+ />
3495
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3482
3496
  </svg>
3483
3497
  </t>
3484
3498
  <t t-name="o-spreadsheet-ChartPreview.AREA_CHART">
3485
3499
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3486
- <path fill="#c4e4ff" d="M3,45 V25 l12,-12 l18,18 l6,-6 V45"/>
3487
- <path fill="#ffe1c8" d="M3,45 V40 l12,-12 l6,6 l18,-18 V45"/>
3488
- <path stroke="#eb6d00" style="fill:none" d="M3,40 l12,-12 l6,6 l18,-18"/>
3489
- <path stroke="#0074d9" style="fill:none" d="M3,25 l12,-12 l18,18 l6,-6"/>
3490
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3500
+ <path fill="var(--os-chart-preview-blue-fill)" d="M3,45 V25 l12,-12 l18,18 l6,-6 V45"/>
3501
+ <path fill="var(--os-chart-preview-orange-fill)" d="M3,45 V40 l12,-12 l6,6 l18,-18 V45"/>
3502
+ <path
3503
+ stroke="var(--os-chart-preview-orange-line)"
3504
+ style="fill:none"
3505
+ d="M3,40 l12,-12 l6,6 l18,-18"
3506
+ />
3507
+ <path
3508
+ stroke="var(--os-chart-preview-blue-line)"
3509
+ style="fill:none"
3510
+ d="M3,25 l12,-12 l18,18 l6,-6"
3511
+ />
3512
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3491
3513
  </svg>
3492
3514
  </t>
3493
3515
  <t t-name="o-spreadsheet-ChartPreview.STACKED_AREA_CHART">
3494
3516
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3495
- <path fill="#c4e4ff" d="M3,45 h36 v-39 l-18,18 l-6,-6 l-12,12"/>
3496
- <path stroke="#0074d9" style="fill:none" d="M3,30 l12,-12 l6,6 l18,-18"/>
3497
- <path fill="#ffe1c8" d="M3,45 h36 v-23 l-18,12 l-6,-6 l-12,12"/>
3498
- <path stroke="#eb6d00" style="fill:none" d="M3,40 l12,-12 l6,6 l18,-12"/>
3499
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3517
+ <path fill="var(--os-chart-preview-blue-fill)" d="M3,45 h36 v-39 l-18,18 l-6,-6 l-12,12"/>
3518
+ <path
3519
+ stroke="var(--os-chart-preview-blue-line)"
3520
+ style="fill:none"
3521
+ d="M3,30 l12,-12 l6,6 l18,-18"
3522
+ />
3523
+ <path fill="var(--os-chart-preview-orange-fill)" d="M3,45 h36 v-23 l-18,12 l-6,-6 l-12,12"/>
3524
+ <path
3525
+ stroke="var(--os-chart-preview-orange-line)"
3526
+ style="fill:none"
3527
+ d="M3,40 l12,-12 l6,6 l18,-12"
3528
+ />
3529
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3500
3530
  </svg>
3501
3531
  </t>
3502
3532
  <t t-name="o-spreadsheet-ChartPreview.COLUMN_CHART">
3503
3533
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3504
- <path fill="#0074d9" d="M7,45 v-28 h6 v28"/>
3505
- <path fill="#c4e4ff" d="M8,45 v-27 h4 v27"/>
3506
- <path fill="#eb6d00" d="M14,45 v-14 h6 v14"/>
3507
- <path fill="#ffe1c8" d="M15,45 v-13 h4 v13"/>
3508
- <path fill="#0074d9" d="M26,45 v-22 h6 v22"/>
3509
- <path fill="#c4e4ff" d="M27,45 v-21 h4 v21"/>
3510
- <path fill="#eb6d00" d="M33,45 v-32 h6 v32"/>
3511
- <path fill="#ffe1c8" d="M34,45 v-31 h4 v31"/>
3512
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3534
+ <path fill="var(--os-chart-preview-blue-line)" d="M7,45 v-28 h6 v28"/>
3535
+ <path fill="var(--os-chart-preview-blue-fill)" d="M8,45 v-27 h4 v27"/>
3536
+ <path fill="var(--os-chart-preview-orange-line)" d="M14,45 v-14 h6 v14"/>
3537
+ <path fill="var(--os-chart-preview-orange-fill)" d="M15,45 v-13 h4 v13"/>
3538
+ <path fill="var(--os-chart-preview-blue-line)" d="M26,45 v-22 h6 v22"/>
3539
+ <path fill="var(--os-chart-preview-blue-fill)" d="M27,45 v-21 h4 v21"/>
3540
+ <path fill="var(--os-chart-preview-orange-line)" d="M33,45 v-32 h6 v32"/>
3541
+ <path fill="var(--os-chart-preview-orange-fill)" d="M34,45 v-31 h4 v31"/>
3542
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3513
3543
  </svg>
3514
3544
  </t>
3515
3545
  <t t-name="o-spreadsheet-ChartPreview.STACKED_COLUMN_CHART">
3516
3546
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3517
- <path fill="#0074d9" d="M7,45 v-12 h8 v12"/>
3518
- <path fill="#c4e4ff" d="M8,45 v-11 h6 v11"/>
3519
- <path fill="#eb6d00" d="M7,33 v-14 h8 v14"/>
3520
- <path fill="#ffe1c8" d="M8,33 v-13 h6 v13"/>
3547
+ <path fill="var(--os-chart-preview-blue-line)" d="M7,45 v-12 h8 v12"/>
3548
+ <path fill="var(--os-chart-preview-blue-fill)" d="M8,45 v-11 h6 v11"/>
3549
+ <path fill="var(--os-chart-preview-orange-line)" d="M7,33 v-14 h8 v14"/>
3550
+ <path fill="var(--os-chart-preview-orange-fill)" d="M8,33 v-13 h6 v13"/>
3521
3551
 
3522
- <path fill="#0074d9" d="M20,45 v-8 h8 v8"/>
3523
- <path fill="#c4e4ff" d="M21,45 v-7 h6 v7"/>
3524
- <path fill="#eb6d00" d="M20,37 v-9 h8 v9"/>
3525
- <path fill="#ffe1c8" d="M21,37 v-8 h6 v8"/>
3552
+ <path fill="var(--os-chart-preview-blue-line)" d="M20,45 v-8 h8 v8"/>
3553
+ <path fill="var(--os-chart-preview-blue-fill)" d="M21,45 v-7 h6 v7"/>
3554
+ <path fill="var(--os-chart-preview-orange-line)" d="M20,37 v-9 h8 v9"/>
3555
+ <path fill="var(--os-chart-preview-orange-fill)" d="M21,37 v-8 h6 v8"/>
3526
3556
 
3527
- <path fill="#0074d9" d="M33,45 v-18 h8 v18"/>
3528
- <path fill="#c4e4ff" d="M34,45 v-17 h6 v17"/>
3529
- <path fill="#eb6d00" d="M33,27 v-16 h8 v16"/>
3530
- <path fill="#ffe1c8" d="M34,27 v-15 h6 v15"/>
3557
+ <path fill="var(--os-chart-preview-blue-line)" d="M33,45 v-18 h8 v18"/>
3558
+ <path fill="var(--os-chart-preview-blue-fill)" d="M34,45 v-17 h6 v17"/>
3559
+ <path fill="var(--os-chart-preview-orange-line)" d="M33,27 v-16 h8 v16"/>
3560
+ <path fill="var(--os-chart-preview-orange-fill)" d="M34,27 v-15 h6 v15"/>
3531
3561
 
3532
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3562
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3533
3563
  </svg>
3534
3564
  </t>
3535
3565
  <t t-name="o-spreadsheet-ChartPreview.BAR_CHART">
3536
3566
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3537
3567
  <g transform="matrix(0 1 -1 0 48 3)">
3538
- <path fill="#0074d9" d="M7,45 v-28 h6 v28"/>
3539
- <path fill="#c4e4ff" d="M8,45 v-27 h4 v27"/>
3540
- <path fill="#eb6d00" d="M14,45 v-14 h6 v14"/>
3541
- <path fill="#ffe1c8" d="M15,45 v-13 h4 v13"/>
3542
- <path fill="#0074d9" d="M26,45 v-22 h6 v22"/>
3543
- <path fill="#c4e4ff" d="M27,45 v-21 h4 v21"/>
3544
- <path fill="#eb6d00" d="M33,45 v-32 h6 v32"/>
3545
- <path fill="#ffe1c8" d="M34,45 v-31 h4 v31"/>
3568
+ <path fill="var(--os-chart-preview-blue-line)" d="M7,45 v-28 h6 v28"/>
3569
+ <path fill="var(--os-chart-preview-blue-fill)" d="M8,45 v-27 h4 v27"/>
3570
+ <path fill="var(--os-chart-preview-orange-line)" d="M14,45 v-14 h6 v14"/>
3571
+ <path fill="var(--os-chart-preview-orange-fill)" d="M15,45 v-13 h4 v13"/>
3572
+ <path fill="var(--os-chart-preview-blue-line)" d="M26,45 v-22 h6 v22"/>
3573
+ <path fill="var(--os-chart-preview-blue-fill)" d="M27,45 v-21 h4 v21"/>
3574
+ <path fill="var(--os-chart-preview-orange-line)" d="M33,45 v-32 h6 v32"/>
3575
+ <path fill="var(--os-chart-preview-orange-fill)" d="M34,45 v-31 h4 v31"/>
3546
3576
  </g>
3547
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3577
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3548
3578
  </svg>
3549
3579
  </t>
3550
3580
  <t t-name="o-spreadsheet-ChartPreview.STACKED_BAR_CHART">
3551
3581
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3552
3582
  <g transform="matrix(0 1 -1 0 48 1)">
3553
- <path fill="#0074d9" d="M7,45 v-12 h8 v12"/>
3554
- <path fill="#c4e4ff" d="M8,45 v-11 h6 v11"/>
3555
- <path fill="#eb6d00" d="M7,33 v-14 h8 v14"/>
3556
- <path fill="#ffe1c8" d="M8,33 v-13 h6 v13"/>
3557
- <path fill="#0074d9" d="M20,45 v-8 h8 v8"/>
3558
- <path fill="#c4e4ff" d="M21,45 v-7 h6 v7"/>
3559
- <path fill="#eb6d00" d="M20,37 v-9 h8 v9"/>
3560
- <path fill="#ffe1c8" d="M21,37 v-8 h6 v8"/>
3561
- <path fill="#0074d9" d="M33,45 v-18 h8 v18"/>
3562
- <path fill="#c4e4ff" d="M34,45 v-17 h6 v17"/>
3563
- <path fill="#eb6d00" d="M33,27 v-16 h8 v16"/>
3564
- <path fill="#ffe1c8" d="M34,27 v-15 h6 v15"/>
3583
+ <path fill="var(--os-chart-preview-blue-line)" d="M7,45 v-12 h8 v12"/>
3584
+ <path fill="var(--os-chart-preview-blue-fill)" d="M8,45 v-11 h6 v11"/>
3585
+ <path fill="var(--os-chart-preview-orange-line)" d="M7,33 v-14 h8 v14"/>
3586
+ <path fill="var(--os-chart-preview-orange-fill)" d="M8,33 v-13 h6 v13"/>
3587
+ <path fill="var(--os-chart-preview-blue-line)" d="M20,45 v-8 h8 v8"/>
3588
+ <path fill="var(--os-chart-preview-blue-fill)" d="M21,45 v-7 h6 v7"/>
3589
+ <path fill="var(--os-chart-preview-orange-line)" d="M20,37 v-9 h8 v9"/>
3590
+ <path fill="var(--os-chart-preview-orange-fill)" d="M21,37 v-8 h6 v8"/>
3591
+ <path fill="var(--os-chart-preview-blue-line)" d="M33,45 v-18 h8 v18"/>
3592
+ <path fill="var(--os-chart-preview-blue-fill)" d="M34,45 v-17 h6 v17"/>
3593
+ <path fill="var(--os-chart-preview-orange-line)" d="M33,27 v-16 h8 v16"/>
3594
+ <path fill="var(--os-chart-preview-orange-fill)" d="M34,27 v-15 h6 v15"/>
3565
3595
  </g>
3566
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3596
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3567
3597
  </svg>
3568
3598
  </t>
3569
3599
  <t t-name="o-spreadsheet-ChartPreview.COMBO_CHART">
3570
3600
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3571
- <path fill="#0074d9" d="M7,45 v-14 h6 v14"/>
3572
- <path fill="#c4e4ff" d="M8,45 v-13 h4 v13"/>
3573
- <path fill="#eb6d00" d="M14,45 v-28 h6 v28"/>
3574
- <path fill="#ffe1c8" d="M15,45 v-27 h4 v27"/>
3575
- <path fill="#0074d9" d="M26,45 v-22 h6 v22"/>
3576
- <path fill="#c4e4ff" d="M27,45 v-21 h4 v21"/>
3577
- <path fill="#eb6d00" d="M33,45 v-32 h6 v32"/>
3578
- <path fill="#ffe1c8" d="M34,45 v-31 h4 v31"/>
3579
- <path stroke="#888" style="fill:none;stroke-width:1.5;" d="M4,40 l14,-12 l6,6 l20,-18"/>
3580
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3601
+ <path fill="var(--os-chart-preview-blue-line)" d="M7,45 v-14 h6 v14"/>
3602
+ <path fill="var(--os-chart-preview-blue-fill)" d="M8,45 v-13 h4 v13"/>
3603
+ <path fill="var(--os-chart-preview-orange-line)" d="M14,45 v-28 h6 v28"/>
3604
+ <path fill="var(--os-chart-preview-orange-fill)" d="M15,45 v-27 h4 v27"/>
3605
+ <path fill="var(--os-chart-preview-blue-line)" d="M26,45 v-22 h6 v22"/>
3606
+ <path fill="var(--os-chart-preview-blue-fill)" d="M27,45 v-21 h4 v21"/>
3607
+ <path fill="var(--os-chart-preview-orange-line)" d="M33,45 v-32 h6 v32"/>
3608
+ <path fill="var(--os-chart-preview-orange-fill)" d="M34,45 v-31 h4 v31"/>
3609
+ <path
3610
+ stroke="var(--os-gray-500)"
3611
+ style="fill:none;stroke-width:1.5;"
3612
+ d="M4,40 l14,-12 l6,6 l20,-18"
3613
+ />
3614
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3581
3615
  </svg>
3582
3616
  </t>
3583
3617
  <t t-name="o-spreadsheet-ChartPreview.PIE_CHART">
3584
3618
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3585
- <path fill="#ffe1c8" stroke="#eb6d00" d="M41.32, 34 A20 20, 0, 1, 1, 24, 4 v20"/>
3586
- <path fill="#c4e4ff" stroke="#0074d9" d="M24,24 v-20 A20 20, 0, 0, 1, 41.32, 34 L24,24"/>
3619
+ <path
3620
+ fill="var(--os-chart-preview-orange-fill)"
3621
+ stroke="var(--os-chart-preview-orange-line)"
3622
+ d="M41.32, 34 A20 20, 0, 1, 1, 24, 4 v20"
3623
+ />
3624
+ <path
3625
+ fill="var(--os-chart-preview-blue-fill)"
3626
+ stroke="var(--os-chart-preview-blue-line)"
3627
+ d="M24,24 v-20 A20 20, 0, 0, 1, 41.32, 34 L24,24"
3628
+ />
3587
3629
  </svg>
3588
3630
  </t>
3589
3631
  <t t-name="o-spreadsheet-ChartPreview.DOUGHNUT_CHART">
3590
3632
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3591
3633
  <path
3592
- fill="#ffe1c8"
3593
- stroke="#eb6d00"
3634
+ fill="var(--os-chart-preview-orange-fill)"
3635
+ stroke="var(--os-chart-preview-orange-line)"
3594
3636
  d="M41.32, 34 A20 20, 0, 1, 1, 24, 4 v8 A12,12,0,1,0,34.4,30"
3595
3637
  />
3596
3638
  <path
3597
- fill="#c4e4ff"
3598
- stroke="#0074d9"
3639
+ fill="var(--os-chart-preview-blue-fill)"
3640
+ stroke="var(--os-chart-preview-blue-line)"
3599
3641
  d="M24,12 v-8 A20 20, 0, 0, 1, 41.32, 34 L34.4,30 A12,12,0,0,0,24,12"
3600
3642
  />
3601
3643
  </svg>
3602
3644
  </t>
3603
3645
  <t t-name="o-spreadsheet-ChartPreview.SCATTER_CHART">
3604
3646
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3605
- <circle fill="#0074d9" cx="10" cy="10" r="2"/>
3606
- <circle fill="#0074d9" cx="15" cy="30" r="2"/>
3607
- <circle fill="#0074d9" cx="25" cy="36" r="2"/>
3608
- <circle fill="#0074d9" cx="32" cy="15" r="2"/>
3609
- <circle fill="#eb6d00" cx="10" cy="40" r="2"/>
3610
- <circle fill="#eb6d00" cx="18" cy="20" r="2"/>
3611
- <circle fill="#eb6d00" cx="30" cy="25" r="2"/>
3612
- <circle fill="#eb6d00" cx="40" cy="33" r="2"/>
3613
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3647
+ <circle fill="var(--os-chart-preview-blue-line)" cx="10" cy="10" r="2"/>
3648
+ <circle fill="var(--os-chart-preview-blue-line)" cx="15" cy="30" r="2"/>
3649
+ <circle fill="var(--os-chart-preview-blue-line)" cx="25" cy="36" r="2"/>
3650
+ <circle fill="var(--os-chart-preview-blue-line)" cx="32" cy="15" r="2"/>
3651
+ <circle fill="var(--os-chart-preview-orange-line)" cx="10" cy="40" r="2"/>
3652
+ <circle fill="var(--os-chart-preview-orange-line)" cx="18" cy="20" r="2"/>
3653
+ <circle fill="var(--os-chart-preview-orange-line)" cx="30" cy="25" r="2"/>
3654
+ <circle fill="var(--os-chart-preview-orange-line)" cx="40" cy="33" r="2"/>
3655
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3614
3656
  </svg>
3615
3657
  </t>
3616
3658
  <t t-name="o-spreadsheet-ChartPreview.GAUGE_CHART">
@@ -3618,9 +3660,9 @@
3618
3660
  viewBox="0 0 48 48"
3619
3661
  class="o-chart-preview user-select-none"
3620
3662
  xmlns="http://www.w3.org/2000/svg">
3621
- <path fill="#ccc" d="M2,32 A22,22,0,0,1,46,32 h-6 A16,16,0,0,0,8,32"/>
3663
+ <path fill="var(--os-gray-400)" d="M2,32 A22,22,0,0,1,46,32 h-6 A16,16,0,0,0,8,32"/>
3622
3664
  <path fill="#6aa84f" d="M2,32 A22,22,0,0,1,35,13 L32,18.2 A16,16,0,0,0,8,32"/>
3623
- <text x="17" y="32" style="font-size:12px;">62</text>
3665
+ <text fill="currentColor" x="17" y="32" style="font-size:12px;">62</text>
3624
3666
  </svg>
3625
3667
  </t>
3626
3668
  <t t-name="o-spreadsheet-ChartPreview.SCORECARD_CHART">
@@ -3628,61 +3670,72 @@
3628
3670
  viewBox="0 0 48 48"
3629
3671
  class="o-chart-preview user-select-none"
3630
3672
  xmlns="http://www.w3.org/2000/svg">
3631
- <path fill="#ddd" d="M1,8 h46 v32 h-46"/>
3632
- <path fill="#eee" d="M2,9 h44 v30 h-44"/>
3633
- <text x="9" y="32" style="font-size:18px;">123</text>
3673
+ <path fill="var(--os-gray-300)" d="M1,8 h46 v32 h-46"/>
3674
+ <path fill="var(--os-gray-200)" d="M2,9 h44 v30 h-44"/>
3675
+ <text fill="currentColor" x="9" y="32" style="font-size:18px;">123</text>
3634
3676
  </svg>
3635
3677
  </t>
3636
3678
  <t t-name="o-spreadsheet-ChartPreview.WATERFALL_CHART">
3637
3679
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3638
- <path fill="#444" d="M5,45 v-26 h6 v26"/>
3639
- <path fill="#fff" d="M6,45 v-25 h4 v25"/>
3640
- <path fill="#eb6d00" d="M13,19 v7 h6 v-7"/>
3641
- <path fill="#ffe1c8" d="M14,20 v5 h4 v-5"/>
3642
- <path fill="#eb6d00" d="M21,25 v10 h6 v-10"/>
3643
- <path fill="#ffe1c8" d="M22,26 v8 h4 v-8"/>
3644
- <path fill="#0074d9" d="M29,35 v-24 h6 v24"/>
3645
- <path fill="#c4e4ff" d="M30,34 v-22 h4 v22"/>
3646
- <path fill="#444" d="M37,45 v-34 h6 v34"/>
3647
- <path fill="#fff" d="M38,45 v-33 h4 v33"/>
3648
- <path fill="#444" d="M11,20 v-1 h2 v1 M19,26 v-1 h2 v1 M27,35 v-1 h2 v1 M35,12 v-1 h2 v1"/>
3649
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3680
+ <path fill="var(--os-gray-600)" d="M5,45 v-26 h6 v26"/>
3681
+ <path fill="var(--os-white-bg)" d="M6,45 v-25 h4 v25"/>
3682
+ <path fill="var(--os-chart-preview-orange-line)" d="M13,19 v7 h6 v-7"/>
3683
+ <path fill="var(--os-chart-preview-orange-fill)" d="M14,20 v5 h4 v-5"/>
3684
+ <path fill="var(--os-chart-preview-orange-line)" d="M21,25 v10 h6 v-10"/>
3685
+ <path fill="var(--os-chart-preview-orange-fill)" d="M22,26 v8 h4 v-8"/>
3686
+ <path fill="var(--os-chart-preview-blue-line)" d="M29,35 v-24 h6 v24"/>
3687
+ <path fill="var(--os-chart-preview-blue-fill)" d="M30,34 v-22 h4 v22"/>
3688
+ <path fill="var(--os-gray-600)" d="M37,45 v-34 h6 v34"/>
3689
+ <path fill="var(--os-white-bg)" d="M38,45 v-33 h4 v33"/>
3690
+ <path
3691
+ fill="var(--os-gray-600)"
3692
+ d="M11,20 v-1 h2 v1 M19,26 v-1 h2 v1 M27,35 v-1 h2 v1 M35,12 v-1 h2 v1"
3693
+ />
3694
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3650
3695
  </svg>
3651
3696
  </t>
3652
3697
  <t t-name="o-spreadsheet-ChartPreview.POPULATION_PYRAMID_CHART">
3653
3698
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3654
- <path fill="#eb6d00" d="M23,43 v-6 h22 v6"/>
3655
- <path fill="#ffe1c8" d="M23,42 v-4 h21 v4"/>
3656
- <path fill="#eb6d00" d="M23,36 v-6 h18 v6"/>
3657
- <path fill="#ffe1c8" d="M23,35 v-4 h17 v4"/>
3658
- <path fill="#eb6d00" d="M23,29 v-6 h12 v6"/>
3659
- <path fill="#ffe1c8" d="M23,28 v-4 h11 v4"/>
3660
- <path fill="#eb6d00" d="M23,22 v-6 h8 v6"/>
3661
- <path fill="#ffe1c8" d="M23,21 v-4 h7 v4"/>
3662
- <path fill="#eb6d00" d="M23,15 v-6 h4 v6"/>
3663
- <path fill="#ffe1c8" d="M23,14 v-4 h3 v4"/>
3664
-
3665
- <path fill="#0074d9" d="M24,43 v-6 h-20 v6"/>
3666
- <path fill="#c4e4ff" d="M24,42 v-4 h-19 v4"/>
3667
- <path fill="#0074d9" d="M24,36 v-6 h-18 v6"/>
3668
- <path fill="#c4e4ff" d="M24,35 v-4 h-17 v4"/>
3669
- <path fill="#0074d9" d="M24,29 v-6 h-12 v6"/>
3670
- <path fill="#c4e4ff" d="M24,28 v-4 h-11 v4"/>
3671
- <path fill="#0074d9" d="M24,22 v-6 h-6 v6"/>
3672
- <path fill="#c4e4ff" d="M24,21 v-4 h-5 v4"/>
3673
- <path fill="#0074d9" d="M24,15 v-6 h-4 v6"/>
3674
- <path fill="#c4e4ff" d="M24,14 v-4 h-3 v4"/>
3675
-
3676
- <path fill="#444" d="M23,2 v43 h1 v-43 M2,45 h44 v1 h-44"/>
3699
+ <path fill="var(--os-chart-preview-orange-line)" d="M23,43 v-6 h22 v6"/>
3700
+ <path fill="var(--os-chart-preview-orange-fill)" d="M23,42 v-4 h21 v4"/>
3701
+ <path fill="var(--os-chart-preview-orange-line)" d="M23,36 v-6 h18 v6"/>
3702
+ <path fill="var(--os-chart-preview-orange-fill)" d="M23,35 v-4 h17 v4"/>
3703
+ <path fill="var(--os-chart-preview-orange-line)" d="M23,29 v-6 h12 v6"/>
3704
+ <path fill="var(--os-chart-preview-orange-fill)" d="M23,28 v-4 h11 v4"/>
3705
+ <path fill="var(--os-chart-preview-orange-line)" d="M23,22 v-6 h8 v6"/>
3706
+ <path fill="var(--os-chart-preview-orange-fill)" d="M23,21 v-4 h7 v4"/>
3707
+ <path fill="var(--os-chart-preview-orange-line)" d="M23,15 v-6 h4 v6"/>
3708
+ <path fill="var(--os-chart-preview-orange-fill)" d="M23,14 v-4 h3 v4"/>
3709
+
3710
+ <path fill="var(--os-chart-preview-blue-line)" d="M24,43 v-6 h-20 v6"/>
3711
+ <path fill="var(--os-chart-preview-blue-fill)" d="M24,42 v-4 h-19 v4"/>
3712
+ <path fill="var(--os-chart-preview-blue-line)" d="M24,36 v-6 h-18 v6"/>
3713
+ <path fill="var(--os-chart-preview-blue-fill)" d="M24,35 v-4 h-17 v4"/>
3714
+ <path fill="var(--os-chart-preview-blue-line)" d="M24,29 v-6 h-12 v6"/>
3715
+ <path fill="var(--os-chart-preview-blue-fill)" d="M24,28 v-4 h-11 v4"/>
3716
+ <path fill="var(--os-chart-preview-blue-line)" d="M24,22 v-6 h-6 v6"/>
3717
+ <path fill="var(--os-chart-preview-blue-fill)" d="M24,21 v-4 h-5 v4"/>
3718
+ <path fill="var(--os-chart-preview-blue-line)" d="M24,15 v-6 h-4 v6"/>
3719
+ <path fill="var(--os-chart-preview-blue-fill)" d="M24,14 v-4 h-3 v4"/>
3720
+
3721
+ <path fill="var(--os-gray-600)" d="M23,2 v43 h1 v-43 M2,45 h44 v1 h-44"/>
3677
3722
  </svg>
3678
3723
  </t>
3679
3724
  <t t-name="o-spreadsheet-ChartPreview.RADAR_CHART">
3680
3725
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3681
- <path fill="none" stroke="#0074d9" d="m24 16 14.27 3.36-1.93 21.63-18.22-8.9-3.63-11.18Z"/>
3682
- <path fill="none" stroke="#eb6d00" d="m24 4 7.61 17.53-4.67 6.52-12.34 8.89-7.72-18.5Z"/>
3683
3726
  <path
3684
3727
  fill="none"
3685
- stroke="#444"
3728
+ stroke="var(--os-chart-preview-blue-line)"
3729
+ d="m24 16 14.27 3.36-1.93 21.63-18.22-8.9-3.63-11.18Z"
3730
+ />
3731
+ <path
3732
+ fill="none"
3733
+ stroke="var(--os-chart-preview-orange-line)"
3734
+ d="m24 4 7.61 17.53-4.67 6.52-12.34 8.89-7.72-18.5Z"
3735
+ />
3736
+ <path
3737
+ fill="none"
3738
+ stroke="var(--os-gray-600)"
3686
3739
  d="M24 2v22l20.92-6.8L24 24l12.93 17.8L24 24 11.07 41.8 24 24 3.08 17.2"
3687
3740
  />
3688
3741
  </svg>
@@ -3690,14 +3743,20 @@
3690
3743
  <t t-name="o-spreadsheet-ChartPreview.FILLED_RADAR_CHART">
3691
3744
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3692
3745
  <path
3693
- fill="#0074d944"
3694
- stroke="#0074d9"
3746
+ fill="var(--os-chart-preview-blue-line)"
3747
+ fill-opacity="0.25"
3748
+ stroke="var(--os-chart-preview-blue-line)"
3695
3749
  d="m24 16 14.27 3.36-1.93 21.63-18.22-8.9-3.63-11.18Z"
3696
3750
  />
3697
- <path fill="#eb6d0044" stroke="#eb6d00" d="m24 4 7.61 17.53-4.67 6.52-12.34 8.89-7.72-18.5Z"/>
3751
+ <path
3752
+ fill="var(--os-chart-preview-orange-line)"
3753
+ fill-opacity="0.25"
3754
+ stroke="var(--os-chart-preview-orange-line)"
3755
+ d="m24 4 7.61 17.53-4.67 6.52-12.34 8.89-7.72-18.5Z"
3756
+ />
3698
3757
  <path
3699
3758
  fill="none"
3700
- stroke="#444"
3759
+ stroke="var(--os-gray-600)"
3701
3760
  d="M24 2v22l20.92-6.8L24 24l12.93 17.8L24 24 11.07 41.8 24 24 3.08 17.2"
3702
3761
  />
3703
3762
  </svg>
@@ -3710,70 +3769,206 @@
3710
3769
  fill="none"
3711
3770
  stroke-width="0.5"
3712
3771
  stroke-linejoin="round">
3713
- <circle cx="16" cy="16" r="13" fill="#c4e4ff"/>
3772
+ <circle cx="16" cy="16" r="13" fill="var(--os-chart-preview-blue-fill)"/>
3714
3773
  <path
3715
- stroke="#eb6d00"
3716
- fill="#ffe1c8"
3774
+ stroke="var(--os-chart-preview-orange-line)"
3775
+ fill="var(--os-chart-preview-orange-fill)"
3717
3776
  d="M12.225 16.293c0 6.8 4 9 5 9 3.5 0 2-5.293 3.5-6.793s5-.707 5-4.207-2-5-5-5c-5 0-8.5 1.5-8.5 7z"
3718
3777
  />
3719
3778
  <path
3720
- fill="#ffe1c8"
3779
+ fill="var(--os-chart-preview-orange-fill)"
3721
3780
  d="M21.5 4.4c0 1.167-1.735 1.5-3 1.5-5.217 0-10.705 3.48-11.421 8.004C6.992 14.549 6.552 15 6 15H3.07 A 13 13 0 0 1 21.5 4.2
3722
3781
  M3.8 20.5c.785.262 2.126 1.285 3.44 1.517.57.101 1.153.464 1.299 1.023.303 1.16.548 1.992-.239 3.58 A 13 13 0 0 1 3.8 20.5"
3723
3782
  />
3724
3783
  <path
3725
- stroke="#eb6d00"
3784
+ stroke="var(--os-chart-preview-orange-line)"
3726
3785
  d="M21.5 4.4c0 1.167-1.735 1.5-3 1.5-5.217 0-10.705 3.48-11.421 8.004C6.992 14.549 6.552 15 6 15H3.07
3727
3786
  M3.8 20.5c.785.262 2.126 1.285 3.44 1.517.57.101 1.153.464 1.299 1.023.303 1.16.548 1.992-.239 3.58"
3728
3787
  />
3729
- <circle cx="16" cy="16" r="13" stroke="#444"/>
3788
+ <circle cx="16" cy="16" r="13" stroke="var(--os-gray-600)"/>
3730
3789
  </svg>
3731
3790
  </t>
3732
3791
  <t t-name="o-spreadsheet-ChartPreview.FUNNEL_CHART">
3733
3792
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3734
- <path stroke="#0074d9" fill="#c4e4ff" d="M2.5,6.5 h44 l-5,7 h-34 l-5,-7 h1"/>
3735
- <path stroke="#eb6d00" fill="#ffe1c8" d="M9.5,16.5 h30 l-3,7 h-25 l-3,-7 h1"/>
3736
- <path stroke="#0074d9" fill="#c4e4ff" d="M12.5,26.5 h23 l-8,7 h-7 l-8,-7 h1"/>
3737
- <path stroke="#eb6d00" fill="#ffe1c8" d="M21.5,35.5 h5 l-2.5,7 l-2.5,-7 h1"/>
3793
+ <path
3794
+ stroke="var(--os-chart-preview-blue-line)"
3795
+ fill="var(--os-chart-preview-blue-fill)"
3796
+ d="M2.5,6.5 h44 l-5,7 h-34 l-5,-7 h1"
3797
+ />
3798
+ <path
3799
+ stroke="var(--os-chart-preview-orange-line)"
3800
+ fill="var(--os-chart-preview-orange-fill)"
3801
+ d="M9.5,16.5 h30 l-3,7 h-25 l-3,-7 h1"
3802
+ />
3803
+ <path
3804
+ stroke="var(--os-chart-preview-blue-line)"
3805
+ fill="var(--os-chart-preview-blue-fill)"
3806
+ d="M12.5,26.5 h23 l-8,7 h-7 l-8,-7 h1"
3807
+ />
3808
+ <path
3809
+ stroke="var(--os-chart-preview-orange-line)"
3810
+ fill="var(--os-chart-preview-orange-fill)"
3811
+ d="M21.5,35.5 h5 l-2.5,7 l-2.5,-7 h1"
3812
+ />
3738
3813
  </svg>
3739
3814
  </t>
3740
3815
  <t t-name="o-spreadsheet-ChartPreview.SUNBURST_CHART">
3741
3816
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3742
3817
  <path
3743
- fill="#ffe1c8"
3744
- stroke="#eb6d00"
3818
+ fill="var(--os-chart-preview-orange-fill)"
3819
+ stroke="var(--os-chart-preview-orange-line)"
3745
3820
  d="M24,12 v8A4,4,0,1,0,27.46,26 L41.32, 34 A20,20,0,0,1,8.679,36.856 L14.807,31.713 A12,12,0,0,1,24,12 M34.4,30 A12,12,0,0,1,14.807,31.713"
3746
3821
  />
3747
3822
  <path
3748
- fill="#c4e4ff"
3749
- stroke="#0074d9"
3823
+ fill="var(--os-chart-preview-blue-fill)"
3824
+ stroke="var(--os-chart-preview-blue-line)"
3750
3825
  d="M24,20 v-16 A20 20, 0, 0, 1, 41.32, 34 L27.46,26 A4,4,0,0,0,24,20 M24,12 A12,12,0,0,1,34.4,30 M33.193,16.287 L39.321,11.144 M36,24 L44,24"
3751
3826
  />
3752
3827
  </svg>
3753
3828
  </t>
3754
3829
  <t t-name="o-spreadsheet-ChartPreview.TREE_MAP_CHART">
3755
3830
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3756
- <path fill="#444" d="M2,4 h44 v5 h-44"/>
3757
- <path fill="#444" d="M2,10 h28 v5 h-28"/>
3758
- <path fill="#444" d="M31,10 h15 v5 h-15"/>
3759
- <path fill="#0074d9" d="M2,16 h28 v14 h-28"/>
3760
- <path fill="#c4e4ff" d="M3,17 h26 v12 h-26"/>
3761
- <path fill="#0074d9" d="M2,31 h15 v12 h-15"/>
3762
- <path fill="#c4e4ff" d="M3,32 h13 v10 h-13"/>
3763
- <path fill="#0074d9" d="M18,31 h12 v12 h-12"/>
3764
- <path fill="#c4e4ff" d="M19,32 h10 v10 h-10"/>
3765
- <path fill="#eb6d00" d="M31,16 h15 v27 h-15"/>
3766
- <path fill="#ffe1c8" d="M32,17 h13 v25 h-13"/>
3831
+ <path fill="var(--os-gray-600)" d="M2,4 h44 v5 h-44"/>
3832
+ <path fill="var(--os-gray-600)" d="M2,10 h28 v5 h-28"/>
3833
+ <path fill="var(--os-gray-600)" d="M31,10 h15 v5 h-15"/>
3834
+ <path fill="var(--os-chart-preview-blue-line)" d="M2,16 h28 v14 h-28"/>
3835
+ <path fill="var(--os-chart-preview-blue-fill)" d="M3,17 h26 v12 h-26"/>
3836
+ <path fill="var(--os-chart-preview-blue-line)" d="M2,31 h15 v12 h-15"/>
3837
+ <path fill="var(--os-chart-preview-blue-fill)" d="M3,32 h13 v10 h-13"/>
3838
+ <path fill="var(--os-chart-preview-blue-line)" d="M18,31 h12 v12 h-12"/>
3839
+ <path fill="var(--os-chart-preview-blue-fill)" d="M19,32 h10 v10 h-10"/>
3840
+ <path fill="var(--os-chart-preview-orange-line)" d="M31,16 h15 v27 h-15"/>
3841
+ <path fill="var(--os-chart-preview-orange-fill)" d="M32,17 h13 v25 h-13"/>
3842
+ </svg>
3843
+ </t>
3844
+ <t t-name="o-spreadsheet-ChartPreview.CALENDAR_CHART">
3845
+ <svg class="o-chart-preview" viewBox="0 0 48 48">
3846
+ <path fill="var(--os-gray-600)" d="M3 3h42v42H3zh1v41h40V4H4"/>
3847
+ <path
3848
+ fill="var(--os-chart-preview-orange-line)"
3849
+ d="M7 7h7v7H7m0 2h7v7H7m0 2h7v7H7m0 2h7v7H7m9-34h7v7h-7m0 2h7v7h-7m0 2h7v7h-7m0 2h7v7h-7m9-34h7v7h-7m0 11h7v7h-7m0 2h7v7h-7m9-34h7v7h-7m0 2h7v7h-7m0 2h7v7h-7m0 2h7v7h-7"
3850
+ />
3851
+ <path
3852
+ fill="var(--os-chart-preview-orange-fill)"
3853
+ d="M8 8h5v5H8m0 13h5v5H8m9 4h5v5h-5m18-5h5v5h-5"
3854
+ />
3855
+ <path
3856
+ fill="var(--os-chart-preview-orange-light)"
3857
+ d="M8 17h5v5H8m9-14h5v5h-5m0 13h5v5h-5m9 4h5v5h-5m9-32h5v5h-5m0 13h5v5h-5"
3858
+ />
3859
+ <path fill="var(--os-white-bg)" d="M8 35h5v5H8"/>
3860
+ <path fill="var(--os-chart-preview-orange-dark)" d="M25 16h7v7h-7"/>
3767
3861
  </svg>
3768
3862
  </t>
3769
3863
 
3864
+ <t t-name="o-spreadsheet-CalendarChartDesignPanel">
3865
+ <GeneralDesignEditor t-props="props">
3866
+ <t t-set-slot="general-extension">
3867
+ <Section class="'pt-0'" title.translate="Legend position">
3868
+ <select
3869
+ t-att-value="props.definition.legendPosition ?? 'bottom-left'"
3870
+ class="o-input o-chart-legend-position"
3871
+ t-on-change="this.updateLegendPosition">
3872
+ <option value="none">None</option>
3873
+ <option value="right">Right</option>
3874
+ <option value="left">Left</option>
3875
+ </select>
3876
+ </Section>
3877
+ <Section class="'pt-0'" title.translate="Values">
3878
+ <ChartShowValues t-props="props"/>
3879
+ </Section>
3880
+ </t>
3881
+ </GeneralDesignEditor>
3882
+ <SidePanelCollapsible isInitiallyCollapsed="false" title.translate="Calendar chart options">
3883
+ <t t-set-slot="content">
3884
+ <ColorScalePicker definition="props.definition" onUpdateColorScale.bind="onColormapChange"/>
3885
+ <Section class="'pt-0 o-missing-value'" title.translate="Missing value color">
3886
+ <RoundColorPicker
3887
+ currentColor="selectedMissingValueColor"
3888
+ onColorPicked.bind="updateMissingValueColor"
3889
+ />
3890
+ </Section>
3891
+ </t>
3892
+ </SidePanelCollapsible>
3893
+ <SidePanelCollapsible isInitiallyCollapsed="true" title.translate="Axes">
3894
+ <t t-set-slot="content">
3895
+ <AxisDesignEditor
3896
+ axesList="axesList"
3897
+ chartId="props.chartId"
3898
+ definition="props.definition"
3899
+ updateChart="props.updateChart"
3900
+ />
3901
+ </t>
3902
+ </SidePanelCollapsible>
3903
+ </t>
3904
+
3905
+ <t t-name="o-spreadsheet-CalendarChartConfigPanel">
3906
+ <div>
3907
+ <ChartDataSeries
3908
+ ranges="this.getDataSeriesRanges()"
3909
+ onSelectionChanged.bind="onDataSeriesRangesChanged"
3910
+ onSelectionConfirmed.bind="onDataSeriesConfirmed"
3911
+ onSelectionReordered.bind="onDataSeriesReordered"
3912
+ onSelectionRemoved.bind="onDataSeriesRemoved"
3913
+ maxNumberOfUsedRanges="1"
3914
+ canChangeDatasetOrientation="false"
3915
+ />
3916
+ <ChartLabelRange
3917
+ range="this.getLabelRange()"
3918
+ isInvalid="isLabelInvalid"
3919
+ onSelectionChanged.bind="onLabelRangeChanged"
3920
+ onSelectionConfirmed.bind="onLabelRangeConfirmed"
3921
+ options="this.getLabelRangeOptions()"
3922
+ title.translate="Date range"
3923
+ />
3924
+
3925
+ <Section title.translate="Fields to group by">
3926
+ <div class="d-flex">
3927
+ <span class="w-100">Horizontal axis</span>
3928
+ <select
3929
+ t-att-value="getGroupByType('horizontal')"
3930
+ class="o-input o-horizontal-group-by"
3931
+ t-on-change="ev => this.updateGroupBy('horizontal', ev.target.value)">
3932
+ <t t-foreach="getGroupByOptions()" t-as="groupBy" t-key="groupBy.value">
3933
+ <option
3934
+ t-att-selected="getGroupByType('horizontal') === groupBy.value"
3935
+ t-att-value="groupBy.value">
3936
+ <t t-esc="groupBy.label"/>
3937
+ </option>
3938
+ </t>
3939
+ </select>
3940
+ </div>
3941
+ <div class="d-flex">
3942
+ <span class="w-100">Vertical axis</span>
3943
+ <select
3944
+ t-att-value="getGroupByType('vertical')"
3945
+ class="o-input o-vertical-group-by"
3946
+ t-on-change="ev => this.updateGroupBy('vertical', ev.target.value)">
3947
+ <t t-foreach="getGroupByOptions()" t-as="groupBy" t-key="groupBy.value">
3948
+ <option
3949
+ t-att-selected="getGroupByType('vertical') === groupBy.value"
3950
+ t-att-value="groupBy.value">
3951
+ <t t-esc="groupBy.label"/>
3952
+ </option>
3953
+ </t>
3954
+ </select>
3955
+ </div>
3956
+ </Section>
3957
+
3958
+ <ChartErrorSection t-if="errorMessages.length" messages="errorMessages"/>
3959
+ </div>
3960
+ </t>
3961
+
3770
3962
  <t t-name="o-spreadsheet.TextStyler">
3771
3963
  <div
3772
3964
  class="o-chart-title-designer position-relative d-flex align-items-center"
3773
3965
  t-att-class="props.class">
3774
3966
  <ActionButton action="boldButtonAction" class="'o-hoverable-button'"/>
3775
3967
  <ActionButton action="italicButtonAction" class="'o-hoverable-button'"/>
3776
- <div class="o-divider" t-if="props.hasHorizontalAlign || props.hasVerticalAlign"/>
3968
+ <div
3969
+ class="o-divider border-start"
3970
+ t-if="props.hasHorizontalAlign || props.hasVerticalAlign"
3971
+ />
3777
3972
  <div class="o-dropdown position-relative" t-if="props.hasHorizontalAlign">
3778
3973
  <ActionButton
3779
3974
  action="horizontalAlignButtonAction"
@@ -3812,13 +4007,13 @@
3812
4007
  </div>
3813
4008
  </div>
3814
4009
  </div>
3815
- <div class="o-divider"/>
4010
+ <div class="o-divider border-start"/>
3816
4011
  <FontSizeEditor
3817
4012
  currentFontSize="currentFontSize"
3818
4013
  onFontSizeChanged.bind="this.updateFontSize"
3819
4014
  class="'o-hoverable-button'"
3820
4015
  />
3821
- <div class="o-divider"/>
4016
+ <div class="o-divider border-start"/>
3822
4017
  <ColorPickerWidget
3823
4018
  currentColor="props.style.color ?? props.defaultStyle?.color"
3824
4019
  toggleColorPicker="(ev) => this.toggleDropdownTool('fillChartColorTool', ev)"
@@ -4044,7 +4239,8 @@
4044
4239
  <t t-name="o-spreadsheet-ChartHumanizeNumbers">
4045
4240
  <Checkbox
4046
4241
  name="'humanizeNumbers'"
4047
- label.translate="Make numbers human-readable"
4242
+ label.translate="Use compact format"
4243
+ title="title"
4048
4244
  value="props.definition.humanize ?? true"
4049
4245
  onChange="(humanize) => props.updateChart(this.props.chartId, { humanize })"
4050
4246
  />
@@ -4142,6 +4338,85 @@
4142
4338
  </Section>
4143
4339
  </t>
4144
4340
 
4341
+ <t t-name="o-spreadsheet-ColorScalePicker">
4342
+ <Section class="'pt-0 o-color-scale'" title.translate="Color Scale">
4343
+ <div class="w-100" style="position:relative">
4344
+ <div
4345
+ class="color-scale-container d-flex justify-content-end"
4346
+ t-on-click.stop="onPointerDown">
4347
+ <span class="color-scale-label">
4348
+ <t t-esc="currentColorScaleLabel"/>
4349
+ </span>
4350
+ <div
4351
+ class="color-scale-preview w-100"
4352
+ t-att-data-test-colorscale="selectedColorScale"
4353
+ t-att-style="currentColorScaleStyle"
4354
+ />
4355
+ <span class="ms-1">
4356
+ <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
4357
+ </span>
4358
+ </div>
4359
+ <Popover t-if="state.popoverProps" t-props="state.popoverProps">
4360
+ <table t-ref="popoverRef" class="bg-white" t-att-style="state.popoverStyle">
4361
+ <tr
4362
+ class="color-scale-container custom-color-scale-container"
4363
+ t-on-click="() => this.onColorScaleChange('custom')">
4364
+ <td class="p-1 text-end">Custom</td>
4365
+ <td class="w-100 p-1">
4366
+ <div
4367
+ class="color-scale-preview o-checkers-background"
4368
+ data-test-id="custom-color-scale"
4369
+ />
4370
+ </td>
4371
+ </tr>
4372
+ <t t-foreach="colorScales" t-as="colorScale" t-key="colorScale.value">
4373
+ <tr
4374
+ class="color-scale-container"
4375
+ t-on-click="() => this.onColorScaleChange(colorScale.value)"
4376
+ t-att-title="colorScale.label">
4377
+ <td class="p-1 text-end">
4378
+ <t t-esc="colorScale.label"/>
4379
+ </td>
4380
+ <td class="w-100 p-1">
4381
+ <div
4382
+ class="color-scale-preview"
4383
+ t-att-data-test-id="colorScale.className"
4384
+ t-att-style="colorScalePreviewStyle(colorScale.value)"
4385
+ />
4386
+ </td>
4387
+ </tr>
4388
+ </t>
4389
+ </table>
4390
+ </Popover>
4391
+ </div>
4392
+ <div class="ps-3 mt-2">
4393
+ <div class="o-min-color d-flex align-items-center mb-2">
4394
+ <RoundColorPicker
4395
+ currentColor="currentColorScale.minColor"
4396
+ onColorPicked="(color) => this.setCustomColorScaleColor('minColor', color)"
4397
+ disableNoColor="true"
4398
+ />
4399
+ <span class="ps-2">Color of minimum values</span>
4400
+ </div>
4401
+ <div class="o-mid-color d-flex align-items-center mb-2">
4402
+ <RoundColorPicker
4403
+ currentColor="currentColorScale.midColor"
4404
+ onColorPicked="(color) => this.setCustomColorScaleColor('midColor', color)"
4405
+ />
4406
+ <span class="ps-2">Color of middle values</span>
4407
+ </div>
4408
+ <div class="o-max-color d-flex align-items-center">
4409
+ <RoundColorPicker
4410
+ currentColor="currentColorScale.maxColor"
4411
+ onColorPicked="(color) => this.setCustomColorScaleColor('maxColor', color)"
4412
+ disableNoColor="true"
4413
+ />
4414
+ <span class="ps-2">Color of maximum values</span>
4415
+ </div>
4416
+ </div>
4417
+ </Section>
4418
+ </t>
4419
+
4145
4420
  <t t-name="o-spreadsheet.ChartTitle">
4146
4421
  <Section class="'o-chart-title'" title="props.name">
4147
4422
  <TextInput
@@ -4174,10 +4449,45 @@
4174
4449
  updateStyle.bind="updateAxisTitleStyle"
4175
4450
  name="editor_label"
4176
4451
  style="axisTitleStyle"
4452
+ placeholder.translate="Add a Title"
4177
4453
  defaultStyle="{align: 'center', color: '', fontSize: defaultFontSize}"
4178
4454
  />
4179
4455
  </t>
4180
4456
 
4457
+ <t t-name="o-spreadsheet-BarChartDesignPanel">
4458
+ <GeneralDesignEditor t-props="props">
4459
+ <t t-set-slot="general-extension">
4460
+ <ChartLegend t-props="props"/>
4461
+ <Section class="'pt-0'" title.translate="Values">
4462
+ <ChartShowValues t-props="props"/>
4463
+ </Section>
4464
+ <Section t-if="isZoomable" class="'pt-0'" title.translate="Zoom">
4465
+ <Checkbox
4466
+ name="'zoomable'"
4467
+ label.translate="Show slicer"
4468
+ value="props.definition.zoomable"
4469
+ onChange.bind="onToggleZoom"
4470
+ className="'mb-2'"
4471
+ />
4472
+ </Section>
4473
+ <Section class="'pt-0'" title.translate="Number formatting">
4474
+ <ChartHumanizeNumbers t-props="props"/>
4475
+ </Section>
4476
+ </t>
4477
+ </GeneralDesignEditor>
4478
+ <SeriesWithAxisDesignEditor t-props="props"/>
4479
+ <SidePanelCollapsible isInitiallyCollapsed="true" title.translate="Axes">
4480
+ <t t-set-slot="content">
4481
+ <AxisDesignEditor
4482
+ axesList="axesList"
4483
+ chartId="props.chartId"
4484
+ definition="props.definition"
4485
+ updateChart="props.updateChart"
4486
+ />
4487
+ </t>
4488
+ </SidePanelCollapsible>
4489
+ </t>
4490
+
4181
4491
  <t t-name="o-spreadsheet-BarConfigPanel">
4182
4492
  <div>
4183
4493
  <Section class="'pt-0'">
@@ -4230,7 +4540,7 @@
4230
4540
  <div class="o-section pb-1 pt-0">
4231
4541
  <div class="o-section-title">Carousel Sections</div>
4232
4542
  </div>
4233
- <div class="o-carousel-preview-list overflow-auto" t-ref="previewList">
4543
+ <div class="o-carousel-preview-list overflow-auto bg-white" t-ref="previewList">
4234
4544
  <t t-foreach="carouselItems" t-as="item" t-key="getItemId(item)">
4235
4545
  <div
4236
4546
  class="o-carousel-preview border-bottom pe-2 position-relative w-100 d-flex align-items-center"
@@ -4458,9 +4768,49 @@
4458
4768
  />
4459
4769
  </t>
4460
4770
 
4771
+ <t t-name="o-spreadsheet-NumberEditor">
4772
+ <div class="o-dropdown" t-ref="NumberEditor">
4773
+ <div
4774
+ class="o-number-editor d-flex align-items-center"
4775
+ t-att-class="props.class"
4776
+ t-att-title="props.title"
4777
+ t-on-click.stop="this.toggleList">
4778
+ <input
4779
+ type="number"
4780
+ t-att-min="props.min"
4781
+ t-att-max="props.max"
4782
+ class="o-font-size o-number-input bg-transparent border-0"
4783
+ t-on-keydown="onInputKeydown"
4784
+ t-on-wheel.prevent.stop=""
4785
+ t-on-click.stop="props.onFocusInput"
4786
+ t-on-focus.stop="onInputFocused"
4787
+ t-on-change="setValueFromInput"
4788
+ t-ref="inputNumber"
4789
+ />
4790
+ <t t-esc="props.valueIcon"/>
4791
+ <span>
4792
+ <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
4793
+ </span>
4794
+ </div>
4795
+ <Popover t-if="dropdown.isOpen" t-props="popoverProps">
4796
+ <div class="o-text-options bg-white" t-on-click.stop="" t-ref="numberList">
4797
+ <t t-foreach="props.valueList" t-as="value" t-key="value">
4798
+ <div t-att-data-size="value" t-on-click="() => this.setValueFromList(value)">
4799
+ <t t-esc="value"/>
4800
+ <t t-esc="props.valueIcon"/>
4801
+ </div>
4802
+ </t>
4803
+ </div>
4804
+ </Popover>
4805
+ </div>
4806
+ </t>
4807
+
4461
4808
  <t t-name="o-spreadsheet-Menu-Popover">
4462
4809
  <Popover t-if="props.menuItems" t-props="popoverProps">
4463
- <div t-ref="menu" class="o-menu-wrapper" t-on-mouseover="() => this.onMouseOverMainMenu()">
4810
+ <div
4811
+ t-ref="menu"
4812
+ class="o-menu-wrapper bg-white"
4813
+ t-on-mouseover="() => this.onMouseOverMainMenu()">
4464
4814
  <Menu t-props="menuProps"/>
4465
4815
  </div>
4466
4816
  <MenuPopover
@@ -4482,7 +4832,7 @@
4482
4832
  <t t-name="o-spreadsheet-Menu">
4483
4833
  <div
4484
4834
  t-ref="menu"
4485
- class="o-menu"
4835
+ class="o-menu bg-white"
4486
4836
  t-att-style="menuStyle"
4487
4837
  t-on-scroll="props.onScroll"
4488
4838
  t-on-wheel.stop=""
@@ -4490,7 +4840,7 @@
4490
4840
  t-on-click.stop=""
4491
4841
  t-on-contextmenu.prevent="">
4492
4842
  <t t-foreach="menuItemsAndSeparators" t-as="menuItem" t-key="menuItem_index">
4493
- <div t-if="menuItem === 'separator'" class="o-separator"/>
4843
+ <div t-if="menuItem === 'separator'" class="o-separator border-bottom"/>
4494
4844
  <t t-else="">
4495
4845
  <t t-set="isMenuRoot" t-value="isRoot(menuItem)"/>
4496
4846
  <t t-set="isMenuEnabled" t-value="isEnabled(menuItem)"/>
@@ -4539,7 +4889,7 @@
4539
4889
 
4540
4890
  <t t-name="o-spreadsheet-LinkEditor">
4541
4891
  <div
4542
- class="o-link-editor"
4892
+ class="o-link-editor bg-white rounded"
4543
4893
  t-on-click.stop="() => this.menu.isOpen=false"
4544
4894
  t-on-keydown="onKeyDown">
4545
4895
  <div class="o-section">
@@ -4581,7 +4931,7 @@
4581
4931
  <button
4582
4932
  t-if="!link.url"
4583
4933
  t-on-click.stop="openMenu"
4584
- class="o-special-link o-button-icon"
4934
+ class="o-special-link o-button-icon bg-white"
4585
4935
  t-ref="linkEditorMenuButton">
4586
4936
  <t t-call="o-spreadsheet-Icon.LIST"/>
4587
4937
  </button>
@@ -4604,7 +4954,7 @@
4604
4954
  </t>
4605
4955
 
4606
4956
  <t t-name="o-spreadsheet-LinkDisplay">
4607
- <div class="o-link-tool d-flex align-items-center">
4957
+ <div class="o-link-tool d-flex align-items-center bg-white rounded">
4608
4958
  <!-- t-key to prevent owl from re-using the previous img element when the link changes.
4609
4959
  The wrong/previous image would be displayed while the new one loads -->
4610
4960
  <img
@@ -5394,6 +5744,11 @@
5394
5744
  <i class="fa fa-search"/>
5395
5745
  </div>
5396
5746
  </t>
5747
+ <t t-name="o-spreadsheet-Icon.ZOOM">
5748
+ <div class="o-icon">
5749
+ <i class="fa fa-search-plus"/>
5750
+ </div>
5751
+ </t>
5397
5752
  <t t-name="o-spreadsheet-Icon.CHECK">
5398
5753
  <svg class="o-icon" viewBox="0 0 24 24">
5399
5754
  <path
@@ -5592,6 +5947,7 @@
5592
5947
  <div class="o-icon">
5593
5948
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 224 256">
5594
5949
  <path
5950
+ fill="currentColor"
5595
5951
  d="M201.4 342.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 274.7 86.6 137.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"
5596
5952
  transform="translate(0, 9) scale(0.5,0.5)"
5597
5953
  />
@@ -5695,9 +6051,60 @@
5695
6051
  />
5696
6052
  </svg>
5697
6053
  </t>
6054
+ <t t-name="o-spreadsheet-Icon.DARK_MODE">
6055
+ <div class="o-icon">
6056
+ <i class="fa fa-moon-o"/>
6057
+ </div>
6058
+ </t>
6059
+ <t t-name="o-spreadsheet-Icon.ROTATION-0">
6060
+ <svg
6061
+ width="18"
6062
+ height="18"
6063
+ viewBox="0 0 18 18"
6064
+ transform="rotate(270)"
6065
+ xmlns="http://www.w3.org/2000/svg">
6066
+ <path
6067
+ d="M5 2h1v12h1.5l-2 2-2-2H5m6-5h1v5h1.5l-2 2-2-2H11M8 2l7 2.8V6L8 8.8l-.43-1.12 1.9-.7V3.8l-1.9-.7L8 1.98m2.7 2.25v2.3l2.8-1.1z"
6068
+ fill="currentColor"
6069
+ />
6070
+ </svg>
6071
+ </t>
6072
+ <t t-name="o-spreadsheet-Icon.ROTATION-45">
6073
+ <svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
6074
+ <path
6075
+ d="m1.95 6.879.707-.707 8.485 8.485 1.06-1.06v2.828H9.375l1.061-1.061m.706-7.778.707-.707 3.536 3.535 1.06-1.06v2.828h-2.828l1.06-1.06M4.071 4.757l6.93-2.97.848.849-2.97 6.93-1.096-.488.849-1.839-2.249-2.248-1.838.848-.488-1.096m3.5-.318 1.626 1.626 1.203-2.757z"
6076
+ fill="currentColor"
6077
+ />
6078
+ </svg>
6079
+ </t>
6080
+ <t t-name="o-spreadsheet-Icon.ROTATION-90">
6081
+ <svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
6082
+ <path
6083
+ d="M5 2h1v12h1.5l-2 2-2-2H5m6-5h1v5h1.5l-2 2-2-2H11M8 2l7 2.8V6L8 8.8l-.43-1.12 1.9-.7V3.8l-1.9-.7L8 1.98m2.7 2.25v2.3l2.8-1.1z"
6084
+ fill="currentColor"
6085
+ />
6086
+ </svg>
6087
+ </t>
6088
+
6089
+ <t t-name="o-spreadsheet-Icon.ROTATION-270">
6090
+ <svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
6091
+ <path
6092
+ d="M13 16h-1V4h-1.5l2-2 2 2H13M7 9H6V4H4.5l2-2 2 2H7m3 12-7-2.8V12l7-2.8.43 1.12-1.9.7v3.18l1.9.7-.43 1.12m-2.7-2.25v-2.3l-2.8 1.1z"
6093
+ fill="currentColor"
6094
+ />
6095
+ </svg>
6096
+ </t>
6097
+ <t t-name="o-spreadsheet-Icon.ROTATION-315">
6098
+ <svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
6099
+ <path
6100
+ d="m6.879 16.55-.707-.707 8.485-8.485-1.06-1.06h2.828v2.828l-1.061-1.061m-7.778-.707-.707-.707 3.535-3.536-1.06-1.06h2.828v2.828l-1.06-1.06M4.757 14.429l-2.97-6.93.849-.848 6.93 2.97-.488 1.096-1.839-.849-2.248 2.249.848 1.838-1.096.488m-.318-3.5 1.626-1.626-2.757-1.203z"
6101
+ fill="currentColor"
6102
+ />
6103
+ </svg>
6104
+ </t>
5698
6105
 
5699
6106
  <t t-name="o-spreadsheet-IconPicker">
5700
- <div class="o-icon-picker">
6107
+ <div class="o-icon-picker bg-white">
5701
6108
  <t t-foreach="iconSets" t-as="iconSet" t-key="iconSet">
5702
6109
  <div class="o-cf-icon-line">
5703
6110
  <div
@@ -5857,13 +6264,12 @@
5857
6264
 
5858
6265
  <t t-name="o-spreadsheet-RowResizer">
5859
6266
  <div
5860
- class="o-row-resizer"
6267
+ class="o-row-resizer o-zoomable"
5861
6268
  t-ref="rowResizer"
5862
6269
  t-on-pointermove.self="onMouseMove"
5863
6270
  t-on-mouseleave="onMouseLeave"
5864
6271
  t-on-pointerdown.self.prevent="select"
5865
6272
  t-on-click="onClick"
5866
- t-on-pointerup.self="onMouseUp"
5867
6273
  t-on-contextmenu.self="onContextMenu"
5868
6274
  t-att-class="{'o-grab': state.waitingForMove, 'o-dragging': state.isMoving}">
5869
6275
  <div
@@ -5901,13 +6307,12 @@
5901
6307
 
5902
6308
  <t t-name="o-spreadsheet-ColResizer">
5903
6309
  <div
5904
- class="o-col-resizer d-flex"
6310
+ class="o-col-resizer d-flex o-zoomable"
5905
6311
  t-ref="colResizer"
5906
6312
  t-on-pointermove.self="onMouseMove"
5907
6313
  t-on-mouseleave="onMouseLeave"
5908
6314
  t-on-pointerdown.self.prevent="select"
5909
6315
  t-on-click="onClick"
5910
- t-on-pointerup.self="onMouseUp"
5911
6316
  t-on-contextmenu.self="onContextMenu"
5912
6317
  t-att-class="{'o-grab': state.waitingForMove, 'o-dragging': state.isMoving, }">
5913
6318
  <div
@@ -6056,11 +6461,11 @@
6056
6461
 
6057
6462
  <t t-name="o-spreadsheet-GridOverlay">
6058
6463
  <div class="position-absolute" t-att-style="style">
6059
- <FiguresContainer onFigureDeleted="props.onFigureDeleted"/>
6464
+ <FiguresContainer/>
6060
6465
  </div>
6061
6466
  <div
6062
6467
  t-ref="gridOverlay"
6063
- class="o-grid-overlay overflow-hidden"
6468
+ class="o-grid-overlay overflow-hidden o-zoomable"
6064
6469
  t-att-class="{'o-paint-format-cursor': isPaintingFormat}"
6065
6470
  t-att-style="style"
6066
6471
  t-on-pointerdown="onPointerDown"
@@ -6071,7 +6476,6 @@
6071
6476
  <GridAddRowsFooter
6072
6477
  t-if="!env.model.getters.isReadonly()"
6073
6478
  t-key="env.model.getters.getActiveSheetId()"
6074
- focusGrid="props.onFigureDeleted"
6075
6479
  />
6076
6480
  <t t-slot="default"/>
6077
6481
  </div>
@@ -6085,7 +6489,8 @@
6085
6489
  <button
6086
6490
  t-on-click="onConfirm"
6087
6491
  t-att-disabled="state.errorFlag"
6088
- class="o-button flex-grow-0 me-2">
6492
+ class="o-button flex-grow-0 me-2"
6493
+ tabindex="-1">
6089
6494
  Add
6090
6495
  </button>
6091
6496
  <input
@@ -6097,6 +6502,7 @@
6097
6502
  t-on-keydown.stop="onKeydown"
6098
6503
  t-on-pointerdown.stop=""
6099
6504
  t-on-input.stop="onInput"
6505
+ tabindex="-1"
6100
6506
  />
6101
6507
  <span>more rows at the bottom</span>
6102
6508
  <ValidationMessages t-if="state.errorFlag" messages="errorMessages" msgType="'error'"/>
@@ -6105,7 +6511,7 @@
6105
6511
 
6106
6512
  <t t-name="o-spreadsheet-Grid">
6107
6513
  <div
6108
- class="o-grid w-100 h-100"
6514
+ class="o-grid w-100 h-100 o-zoomable"
6109
6515
  tabindex="-1"
6110
6516
  composerFocusableElement="true"
6111
6517
  t-on-click="focusDefaultElement"
@@ -6119,7 +6525,6 @@
6119
6525
  onGridResized.bind="onGridResized"
6120
6526
  onGridMoved.bind="moveCanvas"
6121
6527
  gridOverlayDimensions="gridOverlayDimensions"
6122
- onFigureDeleted.bind="focusDefaultElement"
6123
6528
  getGridSize="props.getGridSize"
6124
6529
  />
6125
6530
  <HeadersOverlay onOpenContextMenu="(type, x, y) => this.toggleContextMenu(type, x, y)"/>
@@ -6168,7 +6573,7 @@
6168
6573
  </t>
6169
6574
  <VerticalScrollBar topOffset="HEADER_HEIGHT"/>
6170
6575
  <HorizontalScrollBar leftOffset="HEADER_WIDTH"/>
6171
- <div class="o-scrollbar corner"/>
6576
+ <div class="o-scrollbar corner border-top border-start"/>
6172
6577
  </div>
6173
6578
  </t>
6174
6579
 
@@ -6196,7 +6601,6 @@
6196
6601
  t-component="figureComponent"
6197
6602
  figureUI="figureUI"
6198
6603
  isFullScreen="true"
6199
- onFigureDeleted="() => {}"
6200
6604
  t-key="figureUI.id"
6201
6605
  />
6202
6606
  </t>
@@ -6206,40 +6610,17 @@
6206
6610
  </t>
6207
6611
 
6208
6612
  <t t-name="o-spreadsheet-FontSizeEditor">
6209
- <div class="o-dropdown" t-ref="FontSizeEditor">
6210
- <div
6211
- class=" o-font-size-editor d-flex align-items-center"
6212
- t-att-class="props.class"
6213
- title="Font Size"
6214
- t-on-click="this.toggleFontList">
6215
- <input
6216
- type="number"
6217
- min="1"
6218
- max="400"
6219
- class="o-font-size o-number-input bg-transparent border-0"
6220
- t-on-keydown="onInputKeydown"
6221
- t-on-wheel.prevent.stop=""
6222
- t-on-click.stop="props.onFocusInput"
6223
- t-on-focus.stop="onInputFocused"
6224
- t-on-change="setSizeFromInput"
6225
- t-ref="inputFontSize"
6226
- />
6227
- <span>
6228
- <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
6229
- </span>
6230
- </div>
6231
- <Popover t-if="dropdown.isOpen" t-props="popoverProps">
6232
- <div class="o-text-options bg-white" t-on-click.stop="" t-ref="fontSizeList">
6233
- <t t-foreach="fontSizes" t-as="fontSize" t-key="fontSize">
6234
- <div
6235
- t-esc="fontSize"
6236
- t-att-data-size="fontSize"
6237
- t-on-click="() => this.setSizeFromList(fontSize)"
6238
- />
6239
- </t>
6240
- </div>
6241
- </Popover>
6242
- </div>
6613
+ <NumberEditor
6614
+ currentValue="props.currentFontSize"
6615
+ onValueChange="props.onFontSizeChanged"
6616
+ class="props.class"
6617
+ onToggle="props.onToggle"
6618
+ onFocusInput="props.onFocusInput"
6619
+ min="1"
6620
+ max="400"
6621
+ valueList="fontSizes"
6622
+ title.translate="Font Size"
6623
+ />
6243
6624
  </t>
6244
6625
 
6245
6626
  <t t-name="o-spreadsheet-FilterMenuValueList">
@@ -6261,7 +6642,7 @@
6261
6642
  </i>
6262
6643
  </div>
6263
6644
  <div
6264
- class="o-filter-menu-list d-flex flex-column"
6645
+ class="o-filter-menu-list d-flex flex-column border"
6265
6646
  t-ref="filterValueList"
6266
6647
  t-on-click="this.clearScrolledToValue"
6267
6648
  t-on-scroll="this.clearScrolledToValue">
@@ -6304,8 +6685,9 @@
6304
6685
  name="value.toString()"
6305
6686
  value="this.props.isChecked"
6306
6687
  onChange="this.props.onClick"
6307
- className="'p-2 w-100 pe-auto text-truncate'"
6688
+ className="'p-2 w-100 pe-auto'"
6308
6689
  label="value.toString()"
6690
+ title="value.toString()"
6309
6691
  />
6310
6692
  </div>
6311
6693
  </t>
@@ -6324,6 +6706,7 @@
6324
6706
  criterion="state.criterion"
6325
6707
  onCriterionChanged.bind="onCriterionChanged"
6326
6708
  disableFormulas="true"
6709
+ autofocus="true"
6327
6710
  />
6328
6711
  </t>
6329
6712
 
@@ -6344,7 +6727,7 @@
6344
6727
  </div>
6345
6728
  </t>
6346
6729
  <div class="o-filter-menu-content">
6347
- <div class="o-separator"/>
6730
+ <div class="o-separator border-bottom"/>
6348
6731
  <SidePanelCollapsible
6349
6732
  isInitiallyCollapsed="filterValueType !== 'criterion'"
6350
6733
  title.translate="Filter by criterion">
@@ -6395,7 +6778,6 @@
6395
6778
  t-att-style="container.inverseViewportStyle">
6396
6779
  <t t-foreach="container.figures" t-as="figureUI" t-key="figureUI.id">
6397
6780
  <FigureComponent
6398
- onFigureDeleted="this.props.onFigureDeleted"
6399
6781
  figureUI="figureUI"
6400
6782
  style="getFigureStyle(figureUI)"
6401
6783
  class="getFigureClass(figureUI)"
@@ -6542,7 +6924,6 @@
6542
6924
  <t
6543
6925
  t-component="figureRegistry.get(props.figureUI.tag).Component"
6544
6926
  t-key="props.figureUI.id"
6545
- onFigureDeleted="props.onFigureDeleted"
6546
6927
  figureUI="props.figureUI"
6547
6928
  editFigureStyle.bind="editWrapperStyle"
6548
6929
  openContextMenu.bind="openContextMenu"
@@ -6679,21 +7060,24 @@
6679
7060
  <div t-att-style="containerStyle">
6680
7061
  <canvas class="o-figure-canvas w-100 h-100" t-ref="graphContainer"/>
6681
7062
  </div>
6682
- <div t-if="sliceable" class="o-master-chart-container m-0">
7063
+ <div
7064
+ t-if="sliceable"
7065
+ class="o-master-chart-container m-0"
7066
+ t-att-style="masterChartContainerStyle">
6683
7067
  <canvas
6684
7068
  class="o-figure-canvas o-master-chart-canvas w-100 h-100"
6685
7069
  t-ref="masterChartCanvas"
6686
- t-on-dblclick="onDoubleClickInMasterChart"
6687
- t-on-pointerdown="onPointerDownInMasterChart"
6688
- t-on-pointermove="onPointerMoveInMasterChart"
6689
- t-on-mouseleave="onMouseLeaveMasterChart"
7070
+ t-on-dblclick="onMasterChartDoubleClick"
7071
+ t-on-pointerdown="onMasterChartPointerDown"
7072
+ t-on-pointermove="onMasterChartPointerMove"
7073
+ t-on-mouseleave="onMasterChartMouseLeave"
6690
7074
  />
6691
7075
  </div>
6692
7076
  </div>
6693
7077
  </t>
6694
7078
 
6695
7079
  <t t-name="o-spreadsheet-ErrorToolTip">
6696
- <div class="o-error-tooltip">
7080
+ <div class="o-error-tooltip bg-white">
6697
7081
  <t t-if="evaluationError">
6698
7082
  <div class="o-error-tooltip-title fw-bold text-danger">Error</div>
6699
7083
  <div class="o-error-tooltip-message">
@@ -6770,7 +7154,7 @@
6770
7154
  <t t-name="o-spreadsheet-TopBarComposer">
6771
7155
  <div class="o-topbar-composer-container w-100">
6772
7156
  <div
6773
- class="o-topbar-composer position-relative bg-white user-select-text d-flex"
7157
+ class="o-topbar-composer position-relative bg-white user-select-text d-flex border"
6774
7158
  t-att-class="{
6775
7159
  'o-topbar-composer-readonly': env.model.getters.isReadonly(),
6776
7160
  'o-topbar-composer-active': focus !== 'inactive',
@@ -6793,7 +7177,7 @@
6793
7177
 
6794
7178
  <t t-name="o-spreadsheet-StandaloneComposer">
6795
7179
  <div
6796
- class="o-standalone-composer"
7180
+ class="o-standalone-composer border-bottom"
6797
7181
  t-on-click.stop=""
6798
7182
  t-att-class="containerClass"
6799
7183
  t-att-title="props.title">
@@ -6810,7 +7194,7 @@
6810
7194
 
6811
7195
  <t t-name="o-spreadsheet-SpeechBubble">
6812
7196
  <t t-portal="'.o-spreadsheet'">
6813
- <div class="o-speech-bubble position-absolute px-3" t-ref="bubble">
7197
+ <div class="o-speech-bubble position-absolute px-3 border" t-ref="bubble">
6814
7198
  <div class="o-speech-content text-truncate pb-1" t-esc="props.content"/>
6815
7199
  </div>
6816
7200
  </t>
@@ -6818,7 +7202,7 @@
6818
7202
 
6819
7203
  <t t-name="o-spreadsheet-GridComposer">
6820
7204
  <div
6821
- class="o-cell-reference"
7205
+ class="o-cell-reference rounded"
6822
7206
  t-if="shouldDisplayCellReference"
6823
7207
  t-att-style="cellReferenceStyle"
6824
7208
  t-esc="cellReference"
@@ -6829,30 +7213,28 @@
6829
7213
  </t>
6830
7214
 
6831
7215
  <t t-name="o-spreadsheet-FunctionDescriptionProvider">
6832
- <div class="o-formula-assistant-container user-select-none shadow">
7216
+ <div
7217
+ class="o-formula-assistant-container shadow"
7218
+ tabindex="-1"
7219
+ t-on-pointerdown=""
7220
+ t-on-pointerup.stop=""
7221
+ t-on-keydown.stop=""
7222
+ t-on-click.stop="">
6833
7223
  <t t-set="context" t-value="getContext()"/>
6834
- <div class="o-formula-assistant" t-if="context.functionDescription.name">
7224
+ <div class="o-formula-assistant bg-white" t-if="context.functionDescription.name">
6835
7225
  <div class="o-formula-assistant-head d-flex flex-row justify-content-between">
6836
7226
  <div>
6837
- <span t-esc="context.functionDescription.name"/>
6838
- (
6839
- <t t-foreach="context.functionDescription.args" t-as="arg" t-key="arg.name">
6840
- <span t-if="arg_index > '0'" t-esc="formulaArgSeparator"/>
7227
+ <t t-foreach="formulaHeaderContent" t-as="part" t-key="part_index">
6841
7228
  <span
6842
- t-att-class="{ 'o-formula-assistant-focus': context.argsToFocus.includes(arg_index) }">
6843
- <span>
6844
- <span t-if="arg.optional || arg.repeating || arg.default">[</span>
6845
- <span t-esc="arg.name"/>
6846
- <span t-if="arg.repeating">, ...</span>
6847
- <span t-if="arg.optional || arg.repeating || arg.default">]</span>
6848
- </span>
6849
- </span>
7229
+ t-esc="part.content"
7230
+ t-att-class="part.focused ? 'o-formula-assistant-focus' : ''"
7231
+ />
6850
7232
  </t>
6851
- )
6852
7233
  </div>
6853
7234
  <div
6854
7235
  class="collapsor px-2 d-flex align-items-center rounded"
6855
7236
  t-att-class="state.isCollapsed ? 'collapsed' : ''"
7237
+ t-on-pointerdown.prevent=""
6856
7238
  t-on-click="() => this.toggle()">
6857
7239
  <span class="collapsor-arrow d-inline-block">
6858
7240
  <t t-call="o-spreadsheet-Icon.ANGLE_DOWN"/>
@@ -6861,27 +7243,34 @@
6861
7243
  </div>
6862
7244
 
6863
7245
  <Collapse isCollapsed="state.isCollapsed">
6864
- <div class="o-formula-assistant-core pb-3 m-3">
7246
+ <div class="o-formula-assistant-core pb-3 m-3 border-bottom">
6865
7247
  <div class="o-formula-assistant-gray">ABOUT</div>
6866
7248
  <div t-esc="context.functionDescription.description"/>
6867
7249
  </div>
6868
7250
 
7251
+ <t
7252
+ t-set="firstRepeatableGroupOptional"
7253
+ t-value="context.functionDescription.args.some(arg => arg.repeating and arg.optional)"
7254
+ />
7255
+
6869
7256
  <t t-foreach="context.functionDescription.args" t-as="arg" t-key="arg.name">
6870
7257
  <div
6871
7258
  class="o-formula-assistant-arg p-3 pt-0 display-flex flex-column"
6872
- t-att-class="{
6873
- 'o-formula-assistant-gray': context.argsToFocus.length > 0,
6874
- 'o-formula-assistant-focus': context.argsToFocus.includes(arg_index),
6875
- }">
6876
- <div>
6877
- <span t-esc="arg.name"/>
7259
+ t-att-class="{'o-formula-assistant-gray': context.argsToFocus.length > 0}">
7260
+ <div
7261
+ t-att-class="{'o-formula-assistant-focus': context.argsToFocus.includes(arg_index)}">
7262
+ <span t-if="arg.repeating">
7263
+ <span t-esc="arg.name + (context.repeatingArgGroupIndex + 1)"/>
7264
+ </span>
7265
+ <span t-else="">
7266
+ <span t-esc="arg.name"/>
7267
+ </span>
6878
7268
  <span
6879
- t-if="arg.optional || arg.repeating || arg.default ">&#xA0;- [optional]&#xA0;</span>
7269
+ t-if="arg.optional || arg.default || (arg.repeating and (firstRepeatableGroupOptional or context.repeatingArgGroupIndex > 0))">&#xA0;- [optional]&#xA0;</span>
6880
7270
  <span t-if="arg.default">
6881
7271
  <span>default:&#xA0;</span>
6882
7272
  <t t-esc="arg.defaultValue"/>
6883
7273
  </span>
6884
- <span t-if="arg.repeating">repeatable</span>
6885
7274
  </div>
6886
7275
  <div class="o-formula-assistant-arg-description" t-esc="arg.description"/>
6887
7276
  </div>
@@ -6892,7 +7281,7 @@
6892
7281
  </t>
6893
7282
 
6894
7283
  <t t-name="o-spreadsheet-Composer">
6895
- <div class="o-composer-container w-100 h-100">
7284
+ <div class="o-composer-container w-100 h-100" t-ref="composerContainer">
6896
7285
  <t t-set="autoCompleteProposals" t-value="props.composerStore.autoCompleteProposals"/>
6897
7286
  <t t-set="canBeToggled" t-value="props.composerStore.canBeToggled"/>
6898
7287
  <t
@@ -6904,10 +7293,9 @@
6904
7293
  t-if="props.focus !== 'inactive' and assistantIsAvailable and canBeToggled and assistant.forcedClosed"
6905
7294
  role="button"
6906
7295
  title="Show formula help"
6907
- t-on-click="openAssistant"
7296
+ t-on-click.stop="openAssistant"
6908
7297
  t-on-pointerdown.prevent.stop=""
6909
- t-on-click.prevent.stop=""
6910
- t-on-pointerup.prevent.stop=""
7298
+ t-on-pointerup.stop=""
6911
7299
  class="fa-stack position-absolute translate-middle force-open-assistant fs-4">
6912
7300
  <i class="fa fa-circle fa-stack-1x fa-inverse"/>
6913
7301
  <i class="fa fa-question-circle fa-stack-1x"/>
@@ -6943,22 +7331,24 @@
6943
7331
  t-att-style="assistantContainerStyle"
6944
7332
  t-if="props.focus !== 'inactive' and assistantIsAvailable and !(canBeToggled and assistant.forcedClosed)"
6945
7333
  t-on-wheel.stop=""
6946
- t-on-pointerdown.prevent.stop=""
6947
- t-on-pointerup.prevent.stop=""
6948
- t-on-click.prevent.stop="">
7334
+ t-on-pointerdown.stop=""
7335
+ t-on-pointerup.stop=""
7336
+ t-on-click.stop="">
6949
7337
  <span
6950
7338
  t-if="canBeToggled and !assistant.forcedClosed"
6951
7339
  role="button"
6952
7340
  t-on-click="closeAssistant"
7341
+ t-on-pointerdown.prevent.stop=""
6953
7342
  class="fa-stack position-absolute top-0 start-100 translate-middle fs-4">
6954
7343
  <i class="fa fa-circle fa-stack-1x fa-inverse"/>
6955
- <i class="fa fa-times-circle fa-stack-1x text-muted"/>
7344
+ <i class="fa fa-times-circle fa-stack-1x"/>
6956
7345
  </span>
6957
7346
  <div class="o-composer-assistant overflow-auto" t-att-style="assistantStyle">
6958
7347
  <FunctionDescriptionProvider
6959
7348
  t-if="functionDescriptionState.showDescription"
6960
7349
  functionDescription="functionDescriptionState.functionDescription"
6961
7350
  argsToFocus="functionDescriptionState.argsToFocus"
7351
+ repeatingArgGroupIndex="functionDescriptionState.repeatingArgGroupIndex"
6962
7352
  />
6963
7353
  <div
6964
7354
  t-if="functionDescriptionState.showDescription and autoCompleteProposals.length"
@@ -6984,8 +7374,9 @@
6984
7374
  <t t-name="o-spreadsheet-TextValueProvider">
6985
7375
  <div
6986
7376
  t-ref="autoCompleteList"
7377
+ t-on-pointerdown.prevent=""
6987
7378
  t-att-class="{
6988
- 'o-autocomplete-dropdown': props.proposals.length}">
7379
+ 'o-autocomplete-dropdown bg-white': props.proposals.length}">
6989
7380
  <t t-foreach="props.proposals" t-as="proposal" t-key="proposal.text + proposal_index">
6990
7381
  <div
6991
7382
  class="d-flex flex-column text-start"
@@ -7038,7 +7429,7 @@
7038
7429
 
7039
7430
  <t t-name="o-spreadsheet-ColorPicker">
7040
7431
  <Popover t-props="popoverProps">
7041
- <div class="o-color-picker" t-on-click.stop="" t-att-style="colorPickerStyle">
7432
+ <div class="o-color-picker bg-white" t-on-click.stop="" t-att-style="colorPickerStyle">
7042
7433
  <div class="o-color-picker-section-name">Standard</div>
7043
7434
  <div class="colors-grid">
7044
7435
  <div
@@ -7057,14 +7448,14 @@
7057
7448
  </div>
7058
7449
  </div>
7059
7450
  </div>
7060
- <div class="o-separator"/>
7451
+ <div class="o-separator border-bottom"/>
7061
7452
  <div
7062
7453
  class="o-color-picker-section-name o-color-picker-toggler"
7063
7454
  t-on-click="toggleColorPicker">
7064
7455
  <span>Custom</span>
7065
7456
  </div>
7066
7457
  <div class="colors-grid o-color-picker-toggler" t-on-click.stop="toggleColorPicker">
7067
- <div class="o-color-picker-line-item o-color-picker-toggler-button">
7458
+ <div class="o-color-picker-line-item bg-white o-color-picker-toggler-button">
7068
7459
  <div class="o-color-picker-toggler-sign">
7069
7460
  <t t-call="o-spreadsheet-Icon.PLUS"/>
7070
7461
  </div>
@@ -7096,7 +7487,7 @@
7096
7487
  <div class="magnifier pe-none" t-att-style="pointerStyle"/>
7097
7488
  </div>
7098
7489
  <div class="o-hue-container" t-on-pointerdown="dragHuePointer">
7099
- <div class="o-hue-picker" t-on-click.stop=""/>
7490
+ <div class="o-hue-picker border rounded" t-on-click.stop=""/>
7100
7491
  <div class="o-hue-slider pe-none" t-att-style="sliderStyle">
7101
7492
  <t t-call="o-spreadsheet-Icon.CARET_UP"/>
7102
7493
  </div>
@@ -7104,16 +7495,17 @@
7104
7495
  <div class="o-custom-input-preview">
7105
7496
  <input
7106
7497
  type="text"
7498
+ class="border rounded"
7107
7499
  t-att-class="{'o-wrong-color': !isHexColorInputValid }"
7108
7500
  t-on-click.stop=""
7109
7501
  t-att-value="state.customHexColor"
7110
7502
  t-on-input="setHexColor"
7111
7503
  />
7112
- <div class="o-color-preview" t-att-style="colorPreviewStyle"/>
7504
+ <div class="o-color-preview border rounded" t-att-style="colorPreviewStyle"/>
7113
7505
  </div>
7114
7506
  <div class="o-custom-input-buttons">
7115
7507
  <button
7116
- class="o-add-button"
7508
+ class="o-add-button border rounded"
7117
7509
  t-att-class="{'o-disabled': !state.customHexColor or !isHexColorInputValid}"
7118
7510
  t-on-click.stop="addCustomColor">
7119
7511
  Add
@@ -7121,9 +7513,9 @@
7121
7513
  </div>
7122
7514
  </div>
7123
7515
  <t t-if="!props.disableNoColor">
7124
- <div class="o-separator"/>
7516
+ <div class="o-separator border-bottom"/>
7125
7517
  <div class="o-buttons">
7126
- <button t-on-click="resetColor" class="o-cancel">No Color</button>
7518
+ <button t-on-click="resetColor" class="o-cancel border rounded">No Color</button>
7127
7519
  </div>
7128
7520
  </t>
7129
7521
  </div>
@@ -7136,7 +7528,7 @@
7136
7528
 
7137
7529
  <t t-name="o-spreadsheet-BottomBar">
7138
7530
  <div
7139
- class="o-spreadsheet-bottom-bar o-two-columns d-flex flex-fill align-items-center overflow-hidden"
7531
+ class="o-spreadsheet-bottom-bar o-two-columns d-flex flex-fill align-items-center overflow-hidden border-top"
7140
7532
  t-on-click="props.onClick"
7141
7533
  t-ref="bottomBar"
7142
7534
  t-on-contextmenu.prevent="">
@@ -7248,13 +7640,14 @@
7248
7640
  <t t-name="o-spreadsheet-BottomBarSheet">
7249
7641
  <Ripple>
7250
7642
  <div
7251
- class="o-sheet d-flex align-items-center user-select-none text-nowrap "
7643
+ class="o-sheet d-flex align-items-center user-select-none text-nowrap border-start border-end"
7252
7644
  tabindex="-1"
7253
7645
  composerFocusableElement="true"
7254
7646
  t-on-pointerdown="(ev) => this.onMouseDown(ev)"
7255
7647
  t-on-click="onClick"
7256
7648
  t-on-contextmenu.prevent="(ev) => this.onContextMenu(ev)"
7257
7649
  t-ref="sheetDiv"
7650
+ t-key="sheetName"
7258
7651
  t-att-style="props.style"
7259
7652
  t-att-title="sheetName"
7260
7653
  t-att-data-id="props.sheetId"
@@ -7321,7 +7714,7 @@
7321
7714
  <t t-set="border_color">Border Color</t>
7322
7715
  <Popover t-props="popoverProps">
7323
7716
  <div
7324
- class="d-flex o-border-selector"
7717
+ class="d-flex o-border-selector bg-white"
7325
7718
  t-on-click.stop=""
7326
7719
  t-att-class="props.class ? props.class : ''">
7327
7720
  <div class="o-border-selector-section">
@@ -7342,7 +7735,7 @@
7342
7735
  </span>
7343
7736
  </div>
7344
7737
  </div>
7345
- <div class="o-divider"/>
7738
+ <div class="o-divider border-end"/>
7346
7739
  <div class="o-border-selector-section">
7347
7740
  <div
7348
7741
  class="m-0 p-0 d-flex align-items-center justify-content-center o-with-color o-hoverable-button"
@@ -7370,7 +7763,7 @@
7370
7763
  <Popover
7371
7764
  t-props="lineStylePickerPopoverProps"
7372
7765
  t-if="state.activeTool === 'borderTypeTool'">
7373
- <div class="o-border-style-dropdown">
7766
+ <div class="o-border-style-dropdown bg-white">
7374
7767
  <t t-foreach="borderStyles" t-as="borderStyle" t-key="borderStyle">
7375
7768
  <div
7376
7769
  t-att-title="borderStyle"