@odoo/o-spreadsheet 18.5.0-alpha.9 → 19.0.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 18.5.0-alpha.9
5
- @date 2025-08-19T16:55:34.562Z
6
- @hash 0e0d850
4
+ @version 19.0.1
5
+ @date 2025-09-11T08:46:39.072Z
6
+ @hash bd79eea
7
7
  -->
8
8
  <odoo>
9
9
  <t t-name="o-spreadsheet-ValidationMessages">
@@ -53,8 +53,13 @@
53
53
  </div>
54
54
  </div>
55
55
  <!-- Toolbar and Cell Content -->
56
- <div class="d-flex o-topbar-responsive" t-ref="toolBarContainer">
57
- <div class="o-topbar-toolbar d-flex">
56
+ <div
57
+ class="d-flex o-topbar-responsive"
58
+ t-att-class="{'o-topbar-responsive': !env.model.getters.isReadonly()}"
59
+ t-ref="toolBarContainer">
60
+ <div
61
+ class="o-topbar-toolbar d-flex"
62
+ t-att-class="{'flex-shrink-0': env.model.getters.isReadonly()}">
58
63
  <!-- Toolbar -->
59
64
  <div
60
65
  t-if="env.model.getters.isReadonly()"
@@ -2341,30 +2346,6 @@
2341
2346
  </label>
2342
2347
  </t>
2343
2348
 
2344
- <t t-name="o-spreadsheet-CarouselItemTitleCollapsible">
2345
- <SidePanelCollapsible
2346
- class="'o-carousel-item-title'"
2347
- isInitiallyCollapsed="true"
2348
- title.translate="Carousel Title">
2349
- <t t-set-slot="content">
2350
- <div class="ps-4">
2351
- <TextInput
2352
- value="title"
2353
- onChange.bind="updateTitle"
2354
- placeholder.translate="Title"
2355
- alwaysShowBorder="true"
2356
- />
2357
- <TextStyler
2358
- style="style"
2359
- updateStyle.bind="updateStyle"
2360
- defaultStyle="defaultStyle"
2361
- hasHorizontalAlign="false"
2362
- />
2363
- </div>
2364
- </t>
2365
- </SidePanelCollapsible>
2366
- </t>
2367
-
2368
2349
  <t t-name="o-spreadsheet.BadgeSelection">
2369
2350
  <div class="d-flex w-100 o-badge-selection">
2370
2351
  <t t-foreach="props.choices" t-as="choice" t-key="choice.value">
@@ -4125,66 +4106,65 @@
4125
4106
 
4126
4107
  <t t-name="o-spreadsheet-CarouselPanel">
4127
4108
  <div class="o-carousel-panel h-100 overflow-auto">
4109
+ <Section title.translate="Carousel Title" class="'o-carousel-title'">
4110
+ <TextInput
4111
+ value="title?.text ?? ''"
4112
+ onChange.bind="updateTitleText"
4113
+ placeholder.translate="Add a Title"
4114
+ alwaysShowBorder="true"
4115
+ />
4116
+ <TextStyler
4117
+ style="title ?? {}"
4118
+ updateStyle.bind="updateTitleStyle"
4119
+ defaultStyle="DEFAULT_CAROUSEL_TITLE_STYLE"
4120
+ hasHorizontalAlign="false"
4121
+ />
4122
+ </Section>
4123
+ <div class="o-section pb-1 pt-0">
4124
+ <div class="o-section-title">Carousel Sections</div>
4125
+ </div>
4128
4126
  <div class="o-carousel-preview-list overflow-auto" t-ref="previewList">
4129
- <div
4130
- t-foreach="carouselItems"
4131
- t-as="item"
4132
- t-key="getItemId(item)"
4133
- class="o-carousel-preview position-relative d-flex align-items-center border-bottom ps-1 pe-2 pt-3 pb-2 w-100"
4134
- t-att-class="{ 'o-dragging': dragAndDrop.draggedItemId === getItemId(item) }"
4135
- t-att-style="getPreviewDivStyle(item)">
4127
+ <t t-foreach="carouselItems" t-as="item" t-key="getItemId(item)">
4136
4128
  <div
4137
- class="o-drag-handle position-absolute ps-1 flex-shrink-0"
4138
- t-on-pointerdown.stop.prevent="(ev) => this.onDragHandleMouseDown(item, ev)">
4139
- <t t-call="o-spreadsheet-Icon.THIN_DRAG_HANDLE"/>
4140
- </div>
4141
- <div class="flex-grow-1">
4142
- <div class="d-flex align-items-center">
4143
- <div
4144
- class="o-carousel-preview-icon ms-3 flex-shrink-0 d-flex align-items-center justify-content-center">
4145
- <t t-call="{{getItemPreview(item)}}"/>
4146
- </div>
4147
- <div class="o-carousel-preview-title text-truncate ms-2">
4148
- <TextInput
4149
- value="getItemTitle(item)"
4150
- onChange="(newName) => this.renameCarouselItem(item, newName)"
4151
- />
4152
- </div>
4153
- <div class="ms-auto"/>
4154
- <div
4155
- t-if="item.type === 'chart'"
4156
- class="o-edit-button o-button-icon pe-2 ps-1 flex-shrink-0 fa fa-pencil"
4157
- t-on-click.stop="(ev) => this.editCarouselItem(item, ev)"
4158
- title="Edit chart"
4159
- />
4160
- <div
4161
- class="o-delete-button o-button-icon pe-2 ps-1 flex-shrink-0"
4162
- t-on-click.stop="(ev) => this.deleteCarouselItem(item, ev)"
4163
- title="Remove chart">
4164
- <t t-call="o-spreadsheet-Icon.TRASH_FILLED"/>
4165
- </div>
4129
+ class="o-carousel-preview border-bottom pe-2 position-relative w-100 d-flex align-items-center"
4130
+ t-att-class="{
4131
+ 'o-dragging': dragAndDrop.draggedItemId === getItemId(item),
4132
+ 'o-selected': isCarouselItemActive(item)
4133
+ }"
4134
+ t-att-style="getPreviewDivStyle(item)">
4135
+ <div
4136
+ class="o-drag-handle h-100 position-absolute d-flex align-items-center o-button-icon ps-1 flex-shrink-0"
4137
+ t-on-pointerdown.stop.prevent="(ev) => this.onDragHandleMouseDown(item, ev)">
4138
+ <t t-call="o-spreadsheet-Icon.THIN_DRAG_HANDLE"/>
4166
4139
  </div>
4167
- <div class="ms-3">
4168
- <CarouselItemTitleCollapsible
4169
- carouselTitle="item.carouselTitle"
4170
- onUpdateCarouselTitle="(style) => this.onUpdateCarouselTitle(item_index, style)"
4140
+ <div
4141
+ class="o-carousel-preview-icon ms-3 flex-shrink-0 d-flex align-items-center justify-content-center">
4142
+ <t t-call="{{getItemPreview(item)}}"/>
4143
+ </div>
4144
+ <div class="o-carousel-preview-title text-truncate ms-2">
4145
+ <TextInput
4146
+ value="getItemTitle(item)"
4147
+ onChange="(newName) => this.renameCarouselItem(item, newName)"
4171
4148
  />
4172
4149
  </div>
4150
+ <div class="ms-auto"/>
4151
+ <div class="flex-shrink-0 d-flex align-self-start me-1">
4152
+ <CogWheelMenu items="getCogWheelMenuItems(item)"/>
4153
+ </div>
4173
4154
  </div>
4174
- </div>
4155
+ </t>
4175
4156
  </div>
4176
4157
  <div
4177
- class="o-button-link o-carousel-add-chart float-end d-flex align-items-center pt-4 pe-4 gap-2"
4178
- t-on-click="addNewChartToCarousel">
4158
+ class="o-button-link o-carousel-add-chart float-end d-flex align-items-center py-4 pe-4 gap-2"
4159
+ t-on-click="addNewChartToCarousel"
4160
+ t-att-title="carouselAddChartInfoMessage">
4179
4161
  + Add chart
4180
- <span t-att-title="carouselAddChartInfoMessage">
4181
- <t t-call="o-spreadsheet-Icon.CIRCLE_INFO"/>
4182
- </span>
4183
4162
  </div>
4184
4163
  <div
4185
4164
  t-if="!hasDataView"
4186
- class="o-button-link o-carousel-add-data-view float-end pt-4 pe-4"
4187
- t-on-click="addDataViewToCarousel">
4165
+ class="o-button-link o-carousel-add-data-view float-end py-4 pe-4"
4166
+ t-on-click="addDataViewToCarousel"
4167
+ t-att-title="carouselDataViewMessage">
4188
4168
  + Add data view
4189
4169
  </div>
4190
4170
  </div>
@@ -4418,12 +4398,12 @@
4418
4398
  <t t-set="secondaryIcon" t-value="menuItem.secondaryIcon(env)"/>
4419
4399
  <div
4420
4400
  t-if="isMenuRoot"
4421
- class="o-menu-item-root align-middle ms-auto"
4401
+ class="o-menu-item-root ms-auto align-items-center d-flex"
4422
4402
  t-call="o-spreadsheet-Icon.CARET_RIGHT"
4423
4403
  />
4424
4404
  <div
4425
4405
  t-elif="secondaryIcon"
4426
- class="o-menu-item-root align-middle ms-auto"
4406
+ class="o-menu-item-root ms-auto align-items-center d-flex"
4427
4407
  t-call="{{secondaryIcon}}"
4428
4408
  />
4429
4409
  </div>
@@ -5114,6 +5094,11 @@
5114
5094
  <i class="fa fa-pencil-square-o"/>
5115
5095
  </div>
5116
5096
  </t>
5097
+ <t t-name="o-spreadsheet-Icon.EXTERNAL">
5098
+ <div class="o-icon">
5099
+ <i class="fa fa-external-link"/>
5100
+ </div>
5101
+ </t>
5117
5102
  <t t-name="o-spreadsheet-Icon.UNLINK">
5118
5103
  <div class="o-icon">
5119
5104
  <i class="fa fa-chain-broken"/>
@@ -5554,6 +5539,14 @@
5554
5539
  />
5555
5540
  </svg>
5556
5541
  </t>
5542
+ <t t-name="o-spreadsheet-Icon.DATA">
5543
+ <svg class="o-icon" viewBox="0 0 18 18">
5544
+ <path
5545
+ fill="currentColor"
5546
+ d="M.5 1.5a1 1 0 0 1 1-1h15a1 1 0 0 1 1 1v15a1 1 0 0 1-1 1h-15a1 1 0 0 1-1-1zM6 6V1.5H1.5V6m10 0V1.5h-5V6m10 0V1.5H12V6m-6 5.5v-5H1.5v5m10 0v-5h-5v5m10 0v-5H12v5m-6 5V12H1.5v4.5m10 0V12h-5v4.5m10 0V12H12v4.5"
5547
+ />
5548
+ </svg>
5549
+ </t>
5557
5550
 
5558
5551
  <t t-name="o-spreadsheet-IconPicker">
5559
5552
  <div class="o-icon-picker">
@@ -6032,18 +6025,20 @@
6032
6025
  </t>
6033
6026
 
6034
6027
  <t t-name="o-spreadsheet-FullScreenChart">
6035
- <div
6036
- class="position-absolute o-fullscreen-chart-overlay w-100 h-100 d-flex"
6037
- t-if="chartId"
6038
- t-on-click="exitFullScreen">
6028
+ <div class="position-absolute o-fullscreen-chart-overlay w-100 h-100 d-flex" t-if="chartId">
6029
+ <div
6030
+ class="position-absolute top-0 start-0 end-0 bottom-0"
6031
+ t-on-click="exitFullScreen"
6032
+ aria-hidden="true"
6033
+ />
6039
6034
  <button
6040
- class="o-exit top-0 end-0 position-absolute o-button primary m-1"
6035
+ class="o-exit top-0 end-0 position-absolute o-button primary m-1 shadow"
6041
6036
  t-on-click="exitFullScreen">
6042
6037
  Exit fullscreen
6043
6038
  </button>
6044
6039
  <div class="flex-fill">
6045
6040
  <div
6046
- class="o-fullscreen-chart o-figure position-relative"
6041
+ class="o-fullscreen-chart o-figure position-relative border rounded shadow"
6047
6042
  tabindex="1"
6048
6043
  t-ref="fullScreenChart"
6049
6044
  t-on-click.stop=""
@@ -6289,20 +6284,17 @@
6289
6284
  <div class="o-carousel w-100 h-100 d-flex flex-column" t-on-dblclick="onCarouselDoubleClick">
6290
6285
  <t t-set="selectedItem" t-value="selectedCarouselItem"/>
6291
6286
  <div
6292
- class="o-carousel-header d-flex flex-shrink-0 pe-1 rounded pe-auto"
6287
+ class="o-carousel-header d-flex align-items-baseline flex-shrink-0 pe-1 pe-auto"
6293
6288
  t-att-class="{
6289
+ 'border-bottom': env.isDashboard(),
6294
6290
  'o-carousel-header-floating': !env.isDashboard() and selectedItem?.type === 'carouselDataView',
6295
6291
  }"
6296
6292
  t-att-style="headerStyle">
6297
- <div
6298
- class="o-carousel-title d-flex align-items-center"
6299
- t-esc="title"
6300
- t-att-style="titleStyle"
6301
- />
6293
+ <div class="o-carousel-title text-truncate" t-esc="title" t-att-style="titleStyle"/>
6302
6294
  <div class="ms-auto d-flex">
6303
6295
  <t t-foreach="carousel.items" t-as="item" t-key="item_index">
6304
6296
  <div
6305
- class="o-carousel-tab text-truncate px-2 mt-1 mb-1 flex-shrink-0"
6297
+ class="o-carousel-tab text-truncate px-2 mt-1 flex-shrink-0"
6306
6298
  t-att-class="{ 'selected': isItemSelected(item) }"
6307
6299
  t-esc="getItemTitle(item)"
6308
6300
  t-on-click.stop="() => this.onCarouselTabClick(item)"
@@ -6315,7 +6307,9 @@
6315
6307
  class="o-carousel-empty w-100 flex-fill d-flex align-items-center justify-content-center">
6316
6308
  <t t-call="o-spreadsheet-Icon.CAROUSEL"/>
6317
6309
  </div>
6318
- <div t-elif="selectedItem.type === 'chart'" class="o-carousel-content w-100 flex-fill">
6310
+ <div
6311
+ t-elif="selectedItem.type === 'chart'"
6312
+ class="o-carousel-content w-100 flex-fill position-relative">
6319
6313
  <div class="o-chart-container w-100 h-100">
6320
6314
  <t
6321
6315
  t-component="chartComponent"
@@ -6323,6 +6317,11 @@
6323
6317
  t-key="selectedItem.chartId"
6324
6318
  />
6325
6319
  </div>
6320
+ <ChartDashboardMenu
6321
+ t-if="env.isDashboard()"
6322
+ chartId="selectedItem.chartId"
6323
+ t-key="selectedItem.chartId"
6324
+ />
6326
6325
  </div>
6327
6326
  </div>
6328
6327
  </t>
@@ -6350,7 +6349,7 @@
6350
6349
  />
6351
6350
  <div class="o-figure-menu position-absolute m-2" t-if="!env.isDashboard()">
6352
6351
  <div
6353
- class="o-figure-menu-item"
6352
+ class="o-figure-menu-item d-flex-align-items-center"
6354
6353
  t-if="!env.model.getters.isReadonly() and props.figureUI.tag !== 'carousel'"
6355
6354
  t-on-click="showMenu"
6356
6355
  t-ref="menuButton"
@@ -6364,46 +6363,63 @@
6364
6363
  onClose="() => this.menuState.isOpen=false"
6365
6364
  />
6366
6365
  </div>
6366
+ <div t-if="!env.isDashboard()" class="position-absolute top-0 start-0 pe-none w-100 h-100">
6367
+ <div
6368
+ class="o-figure-border pe-auto w-100 h-0 position-absolute pb-2"
6369
+ t-att-style="getBorderStyle('top')"
6370
+ />
6371
+ <div
6372
+ class="o-figure-border pe-auto h-100 position-absolute start-0 ps-2"
6373
+ t-att-style="getBorderStyle('left')"
6374
+ />
6375
+ <div
6376
+ class="o-figure-border pe-auto w-100 position-absolute bottom-0 pt-2"
6377
+ t-att-style="getBorderStyle('bottom')"
6378
+ />
6379
+ <div
6380
+ class="o-figure-border pe-auto h-100 position-absolute end-0 pe-2"
6381
+ t-att-style="getBorderStyle('right')"
6382
+ />
6383
+ </div>
6367
6384
  </div>
6368
- <div class="o-figure-border w-100 h-100 position-absolute pe-none" t-att-style="borderStyle"/>
6369
6385
  <t t-if="isSelected and !env.isMobile()">
6370
6386
  <div
6371
- class="o-fig-anchor o-top"
6387
+ class="o-fig-anchor o-top pe-auto"
6372
6388
  t-att-style="this.getResizerPosition('top')"
6373
6389
  t-on-pointerdown="(ev) => this.clickAnchor(0,-1, ev)"
6374
6390
  />
6375
6391
  <div
6376
- class="o-fig-anchor o-topRight"
6392
+ class="o-fig-anchor o-topRight pe-auto"
6377
6393
  t-att-style="this.getResizerPosition('top right')"
6378
6394
  t-on-pointerdown="(ev) => this.clickAnchor(1,-1, ev)"
6379
6395
  />
6380
6396
  <div
6381
- class="o-fig-anchor o-right"
6397
+ class="o-fig-anchor o-right pe-auto"
6382
6398
  t-att-style="this.getResizerPosition('right')"
6383
6399
  t-on-pointerdown="(ev) => this.clickAnchor(1,0, ev)"
6384
6400
  />
6385
6401
  <div
6386
- class="o-fig-anchor o-bottomRight"
6402
+ class="o-fig-anchor o-bottomRight pe-auto"
6387
6403
  t-att-style="this.getResizerPosition('bottom right')"
6388
6404
  t-on-pointerdown="(ev) => this.clickAnchor(1,1, ev)"
6389
6405
  />
6390
6406
  <div
6391
- class="o-fig-anchor o-bottom"
6407
+ class="o-fig-anchor o-bottom pe-auto"
6392
6408
  t-att-style="this.getResizerPosition('bottom')"
6393
6409
  t-on-pointerdown="(ev) => this.clickAnchor(0,1, ev)"
6394
6410
  />
6395
6411
  <div
6396
- class="o-fig-anchor o-bottomLeft"
6412
+ class="o-fig-anchor o-bottomLeft pe-auto"
6397
6413
  t-att-style="this.getResizerPosition('bottom left')"
6398
6414
  t-on-pointerdown="(ev) => this.clickAnchor(-1,1, ev)"
6399
6415
  />
6400
6416
  <div
6401
- class="o-fig-anchor o-left"
6417
+ class="o-fig-anchor o-left pe-auto"
6402
6418
  t-att-style="this.getResizerPosition('left')"
6403
6419
  t-on-pointerdown="(ev) => this.clickAnchor(-1,0, ev)"
6404
6420
  />
6405
6421
  <div
6406
- class="o-fig-anchor o-topLeft"
6422
+ class="o-fig-anchor o-topLeft pe-auto"
6407
6423
  t-att-style="this.getResizerPosition('top left')"
6408
6424
  t-on-pointerdown="(ev) => this.clickAnchor(-1,-1, ev)"
6409
6425
  />
@@ -6425,18 +6441,19 @@
6425
6441
 
6426
6442
  <t t-name="o-spreadsheet-ChartDashboardMenu">
6427
6443
  <div class="o-dashboard-chart-select position-absolute top-0 end-0" t-on-click.stop="">
6428
- <div class="d-flex flex-row px-1" t-att-style="backgroundColor">
6444
+ <div class="d-flex align-items-center gap-1 p-1 rounded" t-att-style="backgroundColor">
6429
6445
  <t t-foreach="getMenuItems()" t-as="item" t-key="item.id">
6430
- <button
6431
- t-attf-class=" {{item.iconClass}} {{item.isSelected ? 'active' : ''}}"
6432
- class="o-chart-dashboard-item btn mt-1 me-1 p-1 "
6446
+ <div
6447
+ t-attf-class=" {{item.class}}"
6448
+ class="o-chart-dashboard-item btn border-0 lh-1 p-1 d-flex align-items-center justify-content-center"
6433
6449
  t-att-title="item.label"
6434
6450
  t-on-click="item.onClick"
6435
- t-att-data-id="item.id"
6436
- />
6451
+ t-att-data-id="item.id">
6452
+ <t t-if="item.preview" t-call="{{item.preview}}"/>
6453
+ </div>
6437
6454
  </t>
6438
6455
  <button
6439
- class="o-chart-dashboard-item btn mt-1 p-1 fa fa-ellipsis-v"
6456
+ class="o-chart-dashboard-item btn text-muted lh-1 p-1 fa fa-ellipsis-v"
6440
6457
  t-on-click="openContextMenu"
6441
6458
  />
6442
6459
  </div>
@@ -6514,8 +6531,13 @@
6514
6531
  t-on-click="(ev) => this.selectClickableCell(ev, clickableCell)"
6515
6532
  t-on-auxclick="(ev) => this.selectClickableCell(ev, clickableCell)"
6516
6533
  t-on-contextmenu.prevent=""
6517
- t-att-style="getCellClickableStyle(clickableCell.coordinates)"
6518
- />
6534
+ t-att-style="getCellClickableStyle(clickableCell.coordinates)">
6535
+ <t
6536
+ t-if="clickableCell.component"
6537
+ t-component="clickableCell.component"
6538
+ t-props="clickableCell.componentProps"
6539
+ />
6540
+ </div>
6519
6541
  </GridOverlay>
6520
6542
  <canvas t-ref="canvas"/>
6521
6543
  <GridPopover
@@ -6530,6 +6552,17 @@
6530
6552
  </div>
6531
6553
  </t>
6532
6554
 
6555
+ <t t-name="o-spreadsheet-ClickableCellSortIcon">
6556
+ <div class="w-100 h-100 d-flex flex-column align-items-end" t-att-class="verticalJustifyClass">
6557
+ <span
6558
+ t-if="props.sortDirection === 'none'"
6559
+ class="o-icon sorting-icon pb-1"
6560
+ t-att-style="style">
6561
+ <i class="fa fa-small fa-sort"/>
6562
+ </span>
6563
+ </div>
6564
+ </t>
6565
+
6533
6566
  <t t-name="o-spreadsheet-TopBarComposer">
6534
6567
  <div class="o-topbar-composer-container w-100">
6535
6568
  <div
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odoo/o-spreadsheet",
3
- "version": "18.5.0-alpha.9",
3
+ "version": "19.0.1",
4
4
  "description": "A spreadsheet component",
5
5
  "type": "module",
6
6
  "main": "dist/o-spreadsheet.cjs.js",
@@ -147,6 +147,6 @@
147
147
  ]
148
148
  },
149
149
  "publishConfig": {
150
- "tag": "alpha"
150
+ "tag": "latest"
151
151
  }
152
152
  }