@formicoidea/labre-core 1.1.0 → 2.0.0

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.
Files changed (190) hide show
  1. package/architecture/code.c4 +37 -34
  2. package/architecture/likec4.config.json +3 -3
  3. package/dist/_pkgs/affine-block-surface/extensions/reading-toolbar.js +12 -12
  4. package/dist/_pkgs/affine-components/context-menu/menu-renderer.d.ts +3 -1
  5. package/dist/_pkgs/affine-components/context-menu/menu-renderer.js +9 -1
  6. package/dist/_pkgs/affine-components/context-menu/menu.d.ts +7 -0
  7. package/dist/_pkgs/affine-components/context-menu/menu.js +5 -0
  8. package/dist/_pkgs/affine-components/context-menu/sub-menu.d.ts +16 -1
  9. package/dist/_pkgs/affine-components/context-menu/sub-menu.js +32 -5
  10. package/dist/_pkgs/affine-components/highlight-dropdown-menu/highlight-duotone-icon.js +8 -8
  11. package/dist/_pkgs/affine-components/highlight-dropdown-menu/text-duotone-icon.js +11 -11
  12. package/dist/_pkgs/affine-database-block/configs/slash-menu.js +14 -6
  13. package/dist/_pkgs/affine-database-block/database-block-styles.js +4 -3
  14. package/dist/_pkgs/affine-database-block/database-block.js +6 -18
  15. package/dist/_pkgs/affine-database-block/database-dnd-preview-block.js +5 -1
  16. package/dist/_pkgs/affine-database-block/detail-panel/block-renderer.js +5 -2
  17. package/dist/_pkgs/affine-database-block/detail-panel/note-renderer.js +3 -2
  18. package/dist/_pkgs/affine-database-block/external-data-source.d.ts +10 -0
  19. package/dist/_pkgs/affine-database-block/external-data-source.js +24 -0
  20. package/dist/_pkgs/affine-database-block/properties/created-time/define.js +3 -1
  21. package/dist/_pkgs/affine-database-block/properties/link/cell-renderer.js +3 -2
  22. package/dist/_pkgs/affine-database-block/properties/link/define.js +3 -1
  23. package/dist/_pkgs/affine-database-block/properties/rich-text/define.js +3 -1
  24. package/dist/_pkgs/affine-database-block/properties/text/hosted.js +1 -0
  25. package/dist/_pkgs/affine-database-block/properties/title/define.js +3 -1
  26. package/dist/_pkgs/affine-database-block/properties/title/hosted.js +1 -0
  27. package/dist/_pkgs/affine-database-block/service/new-row-menu.d.ts +1 -1
  28. package/dist/_pkgs/affine-database-block/service/new-row-menu.js +1 -1
  29. package/dist/_pkgs/affine-database-block/translations.d.ts +11 -0
  30. package/dist/_pkgs/affine-database-block/translations.js +57 -0
  31. package/dist/_pkgs/affine-database-block/views/index.d.ts +7 -9
  32. package/dist/_pkgs/affine-database-block/views/index.js +7 -10
  33. package/dist/_pkgs/affine-database-engine/core/common/properties.js +7 -7
  34. package/dist/_pkgs/affine-database-engine/core/common/property-menu.d.ts +18 -2
  35. package/dist/_pkgs/affine-database-engine/core/common/property-menu.js +78 -27
  36. package/dist/_pkgs/affine-database-engine/core/data-source/base.d.ts +11 -0
  37. package/dist/_pkgs/affine-database-engine/core/data-source/base.js +3 -0
  38. package/dist/_pkgs/affine-database-engine/core/detail/detail.js +8 -5
  39. package/dist/_pkgs/affine-database-engine/core/detail/field.js +14 -7
  40. package/dist/_pkgs/affine-database-engine/core/filter/add-filter.js +4 -2
  41. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/boolean.js +7 -4
  42. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/create.d.ts +9 -1
  43. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/create.js +2 -0
  44. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/date.js +7 -4
  45. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/multi-tag.js +17 -8
  46. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/number.js +6 -6
  47. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/string.js +19 -12
  48. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/tag.js +9 -4
  49. package/dist/_pkgs/affine-database-engine/core/filter/filter-fn/unknown.js +7 -4
  50. package/dist/_pkgs/affine-database-engine/core/filter/literal/define.js +6 -4
  51. package/dist/_pkgs/affine-database-engine/core/filter/literal/matcher.d.ts +2 -1
  52. package/dist/_pkgs/affine-database-engine/core/filter/literal/matcher.js +3 -2
  53. package/dist/_pkgs/affine-database-engine/core/filter/literal/types.d.ts +4 -1
  54. package/dist/_pkgs/affine-database-engine/core/filter/literal/types.js +1 -1
  55. package/dist/_pkgs/affine-database-engine/core/group-by/define.js +11 -9
  56. package/dist/_pkgs/affine-database-engine/core/group-by/group-title.js +16 -6
  57. package/dist/_pkgs/affine-database-engine/core/group-by/locate-row.d.ts +16 -0
  58. package/dist/_pkgs/affine-database-engine/core/group-by/locate-row.js +32 -0
  59. package/dist/_pkgs/affine-database-engine/core/group-by/renderer/date-group.js +10 -3
  60. package/dist/_pkgs/affine-database-engine/core/group-by/setting.d.ts +2 -0
  61. package/dist/_pkgs/affine-database-engine/core/group-by/setting.js +40 -28
  62. package/dist/_pkgs/affine-database-engine/core/group-by/trait.d.ts +3 -0
  63. package/dist/_pkgs/affine-database-engine/core/group-by/trait.js +8 -0
  64. package/dist/_pkgs/affine-database-engine/core/group-by/types.d.ts +3 -1
  65. package/dist/_pkgs/affine-database-engine/core/group-by/types.js +1 -1
  66. package/dist/_pkgs/affine-database-engine/core/property/types.d.ts +7 -0
  67. package/dist/_pkgs/affine-database-engine/core/property/types.js +1 -1
  68. package/dist/_pkgs/affine-database-engine/core/sort/add-sort.js +3 -1
  69. package/dist/_pkgs/affine-database-engine/core/statistics/any.js +43 -21
  70. package/dist/_pkgs/affine-database-engine/core/statistics/checkbox.js +29 -14
  71. package/dist/_pkgs/affine-database-engine/core/statistics/number.js +54 -31
  72. package/dist/_pkgs/affine-database-engine/core/statistics/types.d.ts +8 -0
  73. package/dist/_pkgs/affine-database-engine/core/statistics/types.js +2 -1
  74. package/dist/_pkgs/affine-database-engine/core/utils/wording.d.ts +20 -1
  75. package/dist/_pkgs/affine-database-engine/core/utils/wording.js +24 -0
  76. package/dist/_pkgs/affine-database-engine/core/view-manager/property.d.ts +7 -0
  77. package/dist/_pkgs/affine-database-engine/core/view-manager/property.js +29 -5
  78. package/dist/_pkgs/affine-database-engine/core/view-manager/single-view.d.ts +14 -0
  79. package/dist/_pkgs/affine-database-engine/core/view-manager/single-view.js +11 -0
  80. package/dist/_pkgs/affine-database-engine/property-presets/checkbox/define.js +3 -1
  81. package/dist/_pkgs/affine-database-engine/property-presets/date/define.js +3 -1
  82. package/dist/_pkgs/affine-database-engine/property-presets/multi-select/define.js +3 -1
  83. package/dist/_pkgs/affine-database-engine/property-presets/number/define.js +3 -1
  84. package/dist/_pkgs/affine-database-engine/property-presets/number/utils/formats.d.ts +3 -0
  85. package/dist/_pkgs/affine-database-engine/property-presets/number/utils/formats.js +56 -9
  86. package/dist/_pkgs/affine-database-engine/property-presets/progress/define.js +3 -1
  87. package/dist/_pkgs/affine-database-engine/property-presets/select/define.js +3 -1
  88. package/dist/_pkgs/affine-database-engine/property-presets/text/define.js +3 -1
  89. package/dist/_pkgs/affine-database-engine/translations.d.ts +133 -5
  90. package/dist/_pkgs/affine-database-engine/translations.js +625 -9
  91. package/dist/_pkgs/affine-database-engine/view-presets/convert.js +0 -28
  92. package/dist/_pkgs/affine-database-engine/view-presets/effect.js +0 -2
  93. package/dist/_pkgs/affine-database-engine/view-presets/flat/flat-converts.js +2 -4
  94. package/dist/_pkgs/affine-database-engine/view-presets/flat/flat-view-ui.d.ts +57 -0
  95. package/dist/_pkgs/affine-database-engine/view-presets/flat/flat-view-ui.js +113 -4
  96. package/dist/_pkgs/affine-database-engine/view-presets/gallery/gallery-view.js +2 -1
  97. package/dist/_pkgs/affine-database-engine/view-presets/index.d.ts +0 -2
  98. package/dist/_pkgs/affine-database-engine/view-presets/index.js +0 -3
  99. package/dist/_pkgs/affine-database-engine/view-presets/kanban/kanban-view-manager.js +2 -0
  100. package/dist/_pkgs/affine-database-engine/view-presets/kanban/mobile/group.js +7 -5
  101. package/dist/_pkgs/affine-database-engine/view-presets/kanban/mobile/kanban-view-ui-logic.d.ts +5 -0
  102. package/dist/_pkgs/affine-database-engine/view-presets/kanban/mobile/kanban-view-ui-logic.js +25 -3
  103. package/dist/_pkgs/affine-database-engine/view-presets/kanban/mobile/menu.js +12 -6
  104. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/controller/selection.d.ts +8 -0
  105. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/controller/selection.js +35 -12
  106. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/group.js +7 -5
  107. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/header.js +5 -1
  108. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/kanban-view-ui-logic.d.ts +5 -0
  109. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/kanban-view-ui-logic.js +8 -4
  110. package/dist/_pkgs/affine-database-engine/view-presets/kanban/pc/menu.js +12 -6
  111. package/dist/_pkgs/affine-database-engine/view-presets/list/list-view.js +2 -1
  112. package/dist/_pkgs/affine-database-engine/view-presets/table/mobile/column-header.js +6 -4
  113. package/dist/_pkgs/affine-database-engine/view-presets/table/mobile/group.js +6 -5
  114. package/dist/_pkgs/affine-database-engine/view-presets/table/mobile/header.js +2 -2
  115. package/dist/_pkgs/affine-database-engine/view-presets/table/mobile/table-view-ui-logic.d.ts +4 -3
  116. package/dist/_pkgs/affine-database-engine/view-presets/table/mobile/table-view-ui-logic.js +29 -5
  117. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/controller/clipboard.js +6 -2
  118. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/controller/selection.js +2 -0
  119. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/group.js +6 -5
  120. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/header/column-header.js +11 -7
  121. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/header/database-header-column.js +16 -12
  122. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/header/number-format-bar.js +4 -2
  123. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/menu.js +9 -6
  124. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/table-view-ui-logic.d.ts +8 -1
  125. package/dist/_pkgs/affine-database-engine/view-presets/table/pc/table-view-ui-logic.js +29 -7
  126. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/controller/clipboard.js +6 -2
  127. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/controller/selection.js +2 -0
  128. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/bottom/group-footer.js +5 -2
  129. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/bottom/stats/column-stats-column.d.ts +1 -1
  130. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/bottom/stats/column-stats-column.js +14 -6
  131. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/top/group-header.js +5 -2
  132. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/top/group-title.js +5 -3
  133. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/top/header/column-header.js +17 -10
  134. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/top/header/number-format-bar.js +4 -2
  135. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/group/top/header/single-column-header.js +20 -14
  136. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/row/menu.js +9 -6
  137. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/table-view-ui-logic.d.ts +6 -1
  138. package/dist/_pkgs/affine-database-engine/view-presets/table/pc-virtual/table-view-ui-logic.js +30 -3
  139. package/dist/_pkgs/affine-database-engine/view-presets/table/stats/column-stats-column.d.ts +1 -1
  140. package/dist/_pkgs/affine-database-engine/view-presets/table/stats/column-stats-column.js +14 -6
  141. package/dist/_pkgs/affine-database-engine/view-presets/table/table-view-manager.js +2 -0
  142. package/dist/_pkgs/affine-database-engine/widget-presets/quick-setting-bar/filter/condition-view.d.ts +2 -0
  143. package/dist/_pkgs/affine-database-engine/widget-presets/quick-setting-bar/filter/condition-view.js +13 -6
  144. package/dist/_pkgs/affine-database-engine/widget-presets/quick-setting-bar/filter/group-panel-view.js +20 -13
  145. package/dist/_pkgs/affine-database-engine/widget-presets/quick-setting-bar/filter/root-panel-view.js +10 -5
  146. package/dist/_pkgs/affine-database-engine/widget-presets/quick-setting-bar/sort/root-panel.js +8 -5
  147. package/dist/_pkgs/affine-database-engine/widget-presets/tools/presets/search/search.js +2 -2
  148. package/dist/_pkgs/affine-database-engine/widget-presets/tools/presets/table-add-row/add-row.d.ts +6 -0
  149. package/dist/_pkgs/affine-database-engine/widget-presets/tools/presets/table-add-row/add-row.js +49 -4
  150. package/dist/_pkgs/affine-database-engine/widget-presets/tools/presets/view-options/view-settings.d.ts +3 -3
  151. package/dist/_pkgs/affine-database-engine/widget-presets/tools/presets/view-options/view-settings.js +3 -3
  152. package/dist/_pkgs/affine-database-engine/widget-presets/views-bar/views-view.js +5 -0
  153. package/dist/_pkgs/affine-database-view-block/configs/slash-menu.js +6 -3
  154. package/dist/_pkgs/affine-database-view-block/data-view-block.js +5 -4
  155. package/dist/_pkgs/affine-fragment-doc-title/doc-title.d.ts +3 -2
  156. package/dist/_pkgs/affine-fragment-doc-title/doc-title.js +3 -2
  157. package/dist/_pkgs/affine-shared/services/data-source-picker-service.d.ts +31 -0
  158. package/dist/_pkgs/affine-widget-edgeless-zoom-toolbar/index.js +26 -26
  159. package/dist/_pkgs/affine-widget-keyboard-toolbar/icons.js +98 -98
  160. package/dist/_pkgs/affine-widget-page-dragging-area/index.js +10 -10
  161. package/dist/_pkgs/affine-widget-viewport-overlay/index.js +13 -13
  162. package/package.json +1 -1
  163. package/dist/_pkgs/affine-database-engine/view-presets/calendar/calendar-view-manager.d.ts +0 -70
  164. package/dist/_pkgs/affine-database-engine/view-presets/calendar/calendar-view-manager.js +0 -449
  165. package/dist/_pkgs/affine-database-engine/view-presets/calendar/define.d.ts +0 -10
  166. package/dist/_pkgs/affine-database-engine/view-presets/calendar/define.js +0 -29
  167. package/dist/_pkgs/affine-database-engine/view-presets/calendar/effect.d.ts +0 -1
  168. package/dist/_pkgs/affine-database-engine/view-presets/calendar/effect.js +0 -4
  169. package/dist/_pkgs/affine-database-engine/view-presets/calendar/index.d.ts +0 -6
  170. package/dist/_pkgs/affine-database-engine/view-presets/calendar/index.js +0 -6
  171. package/dist/_pkgs/affine-database-engine/view-presets/calendar/layout.d.ts +0 -37
  172. package/dist/_pkgs/affine-database-engine/view-presets/calendar/layout.js +0 -138
  173. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/actions.d.ts +0 -7
  174. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/actions.js +0 -64
  175. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/dnd.d.ts +0 -32
  176. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/dnd.js +0 -159
  177. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/effect.d.ts +0 -1
  178. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/effect.js +0 -7
  179. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/hit-test.d.ts +0 -1
  180. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/hit-test.js +0 -28
  181. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/styles.d.ts +0 -1
  182. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/styles.js +0 -707
  183. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/view.d.ts +0 -89
  184. package/dist/_pkgs/affine-database-engine/view-presets/calendar/pc/view.js +0 -849
  185. package/dist/_pkgs/affine-database-engine/view-presets/calendar/renderer.d.ts +0 -2
  186. package/dist/_pkgs/affine-database-engine/view-presets/calendar/renderer.js +0 -8
  187. package/dist/_pkgs/affine-database-engine/view-presets/calendar/source.d.ts +0 -8
  188. package/dist/_pkgs/affine-database-engine/view-presets/calendar/source.js +0 -3
  189. package/dist/_pkgs/affine-database-engine/view-presets/calendar/types.d.ts +0 -79
  190. package/dist/_pkgs/affine-database-engine/view-presets/calendar/types.js +0 -1
@@ -44,7 +44,9 @@ import { html } from 'lit/static-html.js';
44
44
  import { GroupTitle } from '../../../core/group-by/group-title.js';
45
45
  import { groupToggleStyles, hideGroupAction, renderGroupToggle, } from '../../../core/group-by/group-visibility.js';
46
46
  import { dragHandler } from '../../../core/utils/wc-dnd/dnd-context.js';
47
- import { wordingOf } from '../../../core/utils/wording.js';
47
+ import { wordingOf, wordingFrom } from '../../../core/utils/wording.js';
48
+ import { DATA_VIEW_GROUP_DELETE_CARDS, DATA_VIEW_GROUP_ADD, } from '../../../translations.js';
49
+ import { TOOLBAR_UNGROUP } from '../../../../affine-shared/services/index.js';
48
50
  const styles = css `
49
51
  affine-data-view-kanban-group {
50
52
  width: 260px;
@@ -197,7 +199,7 @@ let KanbanGroup = (() => {
197
199
  ></affine-data-view-kanban-card>
198
200
  `;
199
201
  })}
200
- ${this.view.readonly$.value
202
+ ${this.view.readonly$.value || this.view.rowsLocked$.value
201
203
  ? nothing
202
204
  : html `<div class="add-card" @click="${this.clickAddCard}">
203
205
  <div
@@ -205,7 +207,7 @@ let KanbanGroup = (() => {
205
207
  >
206
208
  ${AddCursorIcon()}
207
209
  </div>
208
- Add
210
+ ${wordingFrom(this)(DATA_VIEW_GROUP_ADD)}
209
211
  </div>`}
210
212
  </div>
211
213
  `;
@@ -260,7 +262,7 @@ let KanbanGroup = (() => {
260
262
  const ele = e.currentTarget;
261
263
  popFilterableSimpleMenu(popupTargetFromElement(ele), [
262
264
  menu.action({
263
- name: 'Ungroup',
265
+ name: wordingFrom(this)(TOOLBAR_UNGROUP),
264
266
  hide: () => this.group.value == null,
265
267
  select: () => {
266
268
  this.group.rows.forEach(row => {
@@ -271,7 +273,7 @@ let KanbanGroup = (() => {
271
273
  }),
272
274
  hideGroupAction(this.group, wordingOf(this.std)),
273
275
  menu.action({
274
- name: 'Delete Cards',
276
+ name: wordingFrom(this)(DATA_VIEW_GROUP_DELETE_CARDS),
275
277
  select: () => {
276
278
  this.view.rowsDelete(this.group.rows.map(row => row.rowId));
277
279
  this.requestUpdate();
@@ -39,6 +39,8 @@ import { css } from 'lit';
39
39
  import { property } from 'lit/decorators.js';
40
40
  import { html } from 'lit/static-html.js';
41
41
  import { groupTraitKey } from '../../../core/group-by/trait.js';
42
+ import { DATA_VIEW_GROUP } from '../../../translations.js';
43
+ import { wordingFrom } from '../../../core/utils/wording.js';
42
44
  const styles = css `
43
45
  affine-data-view-kanban-header {
44
46
  display: flex;
@@ -73,7 +75,9 @@ let KanbanHeader = (() => {
73
75
  return html `
74
76
  <div></div>
75
77
  <div>
76
- <div class="select-group" @click="${this.clickGroup}">Group</div>
78
+ <div class="select-group" @click="${this.clickGroup}">
79
+ ${wordingFrom(this)(DATA_VIEW_GROUP)}
80
+ </div>
77
81
  </div>
78
82
  `;
79
83
  }
@@ -18,6 +18,11 @@ export declare class KanbanViewUILogic extends DataViewUILogicBase<KanbanSingleV
18
18
  groups$: import("@preact/signals-core").ReadonlySignal<import("../../../index.js").Group<unknown, unknown, Record<string, unknown>>[]>;
19
19
  private get readonly();
20
20
  clearSelection: () => void;
21
+ /**
22
+ * "New" adds the card and puts its title in editing, as a group's own
23
+ * "New" does: it no longer opens the card (product owner, recette P3-15).
24
+ * Nothing is written but the row.
25
+ */
21
26
  addRow: (position: InsertToPosition) => string | undefined;
22
27
  focusFirstCell: () => void;
23
28
  showIndicator: (evt: MouseEvent) => boolean;
@@ -34,17 +34,21 @@ export class KanbanViewUILogic extends DataViewUILogicBase {
34
34
  this.clearSelection = () => {
35
35
  this.selectionController.clear();
36
36
  };
37
+ /**
38
+ * "New" adds the card and puts its title in editing, as a group's own
39
+ * "New" does: it no longer opens the card (product owner, recette P3-15).
40
+ * Nothing is written but the row.
41
+ */
37
42
  this.addRow = (position) => {
38
43
  if (this.readonly)
39
44
  return;
40
45
  const rowId = this.view.rowAdd(position);
46
+ this.ui$.value?.requestUpdate();
41
47
  if (rowId) {
42
- this.root.openDetailPanel({
43
- view: this.view,
44
- rowId,
48
+ requestAnimationFrame(() => {
49
+ this.selectionController.editCardTitle(rowId);
45
50
  });
46
51
  }
47
- this.ui$.value?.requestUpdate();
48
52
  return rowId;
49
53
  };
50
54
  this.focusFirstCell = () => {
@@ -1,6 +1,8 @@
1
1
  import { menu, popFilterableSimpleMenu, } from '../../../../affine-components/context-menu/index.js';
2
2
  import { ArrowRightBigIcon, DeleteIcon, ExpandFullIcon, MoveLeftIcon, MoveRightIcon, } from '@blocksuite/icons/lit';
3
3
  import { html } from 'lit';
4
+ import { DATA_VIEW_CARD_EXPAND, DATA_VIEW_CARD_MOVE_TO, DATA_VIEW_ROW_INSERT_BEFORE, DATA_VIEW_ROW_INSERT_AFTER, DATA_VIEW_CARD_DELETE, DATA_VIEW_UNGROUPED, } from '../../../translations.js';
5
+ import { wordingFrom } from '../../../core/utils/wording.js';
4
6
  export const openDetail = (kanbanViewLogic, rowId, selection) => {
5
7
  const old = selection.selection;
6
8
  selection.selection = undefined;
@@ -15,14 +17,14 @@ export const openDetail = (kanbanViewLogic, rowId, selection) => {
15
17
  export const popCardMenu = (kanbanViewLogic, ele, rowId, selection) => {
16
18
  popFilterableSimpleMenu(ele, [
17
19
  menu.action({
18
- name: 'Expand Card',
20
+ name: wordingFrom(ele.element)(DATA_VIEW_CARD_EXPAND),
19
21
  prefix: ExpandFullIcon(),
20
22
  select: () => {
21
23
  openDetail(kanbanViewLogic, rowId, selection);
22
24
  },
23
25
  }),
24
26
  menu.subMenu({
25
- name: 'Move To',
27
+ name: wordingFrom(ele.element)(DATA_VIEW_CARD_MOVE_TO),
26
28
  prefix: ArrowRightBigIcon(),
27
29
  options: {
28
30
  items: selection.view.groupTrait.groupsDataList$.value
@@ -35,7 +37,9 @@ export const popCardMenu = (kanbanViewLogic, ele, rowId, selection) => {
35
37
  })
36
38
  .map(group => {
37
39
  return menu.action({
38
- name: group.value != null ? group.name$.value : 'Ungroup',
40
+ name: group.value != null
41
+ ? group.name$.value
42
+ : wordingFrom(ele.element)(DATA_VIEW_UNGROUPED),
39
43
  select: () => {
40
44
  selection.moveCard(rowId, group.key);
41
45
  },
@@ -47,7 +51,8 @@ export const popCardMenu = (kanbanViewLogic, ele, rowId, selection) => {
47
51
  name: '',
48
52
  items: [
49
53
  menu.action({
50
- name: 'Insert Before',
54
+ name: wordingFrom(ele.element)(DATA_VIEW_ROW_INSERT_BEFORE),
55
+ hide: () => selection.view.rowsLocked$.value,
51
56
  prefix: html ` <div
52
57
  style="transform: rotate(90deg);display:flex;align-items:center;"
53
58
  >
@@ -58,7 +63,8 @@ export const popCardMenu = (kanbanViewLogic, ele, rowId, selection) => {
58
63
  },
59
64
  }),
60
65
  menu.action({
61
- name: 'Insert After',
66
+ name: wordingFrom(ele.element)(DATA_VIEW_ROW_INSERT_AFTER),
67
+ hide: () => selection.view.rowsLocked$.value,
62
68
  prefix: html ` <div
63
69
  style="transform: rotate(90deg);display:flex;align-items:center;"
64
70
  >
@@ -74,7 +80,7 @@ export const popCardMenu = (kanbanViewLogic, ele, rowId, selection) => {
74
80
  name: '',
75
81
  items: [
76
82
  menu.action({
77
- name: 'Delete Card',
83
+ name: wordingFrom(ele.element)(DATA_VIEW_CARD_DELETE),
78
84
  class: {
79
85
  'delete-item': true,
80
86
  },
@@ -178,8 +178,9 @@ export class ListViewUI extends FlatViewUI {
178
178
  </div>`;
179
179
  }
180
180
  renderNewRow(groupKey) {
181
- if (this.view.readonly$.value)
181
+ if (this.view.readonly$.value || this.view.rowsLocked$.value) {
182
182
  return nothing;
183
+ }
183
184
  return html `<button
184
185
  class="dv-list-new"
185
186
  data-testid="dv-flat-new"
@@ -45,7 +45,7 @@ import { html } from 'lit/static-html.js';
45
45
  import { propertyMenuItems } from '../../../core/common/property-menu.js';
46
46
  import { wordingOf } from '../../../core/utils/wording.js';
47
47
  import { numberFormats } from '../../../property-presets/number/utils/formats.js';
48
- import { DATA_VIEW_INSERT_LEFT, DATA_VIEW_INSERT_RIGHT, DATA_VIEW_PROPERTY_SETTINGS, VIEWS_BAR_MOVE_LEFT, VIEWS_BAR_MOVE_RIGHT, } from '../../../translations.js';
48
+ import { DATA_VIEW_INSERT_LEFT, DATA_VIEW_INSERT_RIGHT, DATA_VIEW_PROPERTY_SETTINGS, VIEWS_BAR_MOVE_LEFT, VIEWS_BAR_MOVE_RIGHT, DATA_VIEW_NUMBER_FORMAT, } from '../../../translations.js';
49
49
  import { MOBILE_TOUCH_TARGET } from '../consts.js';
50
50
  let MobileTableColumnHeader = (() => {
51
51
  let _classSuper = SignalWatcher(WithDisposable(ShadowlessElement));
@@ -103,12 +103,12 @@ let MobileTableColumnHeader = (() => {
103
103
  afterType: enableNumberFormatting
104
104
  ? [
105
105
  menu.subMenu({
106
- name: 'Number Format',
106
+ name: wording(DATA_VIEW_NUMBER_FORMAT),
107
107
  hide: () => !this.column.dataUpdate ||
108
108
  this.column.type$.value !== 'number',
109
109
  options: {
110
110
  title: {
111
- text: 'Number Format',
111
+ text: wording(DATA_VIEW_NUMBER_FORMAT),
112
112
  },
113
113
  items: [
114
114
  numberFormatConfig(this.column),
@@ -120,7 +120,7 @@ let MobileTableColumnHeader = (() => {
120
120
  style="font-size: var(--affine-font-base); scale: 1.2;"
121
121
  >${format.symbol}</span
122
122
  >`,
123
- name: format.label,
123
+ name: wording(format.labelWording),
124
124
  select: () => {
125
125
  if (data.format === format.type)
126
126
  return;
@@ -140,6 +140,7 @@ let MobileTableColumnHeader = (() => {
140
140
  items: [
141
141
  menu.action({
142
142
  name: wording(DATA_VIEW_INSERT_LEFT),
143
+ hide: () => this.tableViewManager.propertiesLocked$.value,
143
144
  prefix: InsertLeftIcon(),
144
145
  select: () => {
145
146
  this.tableViewManager.propertyAdd({
@@ -162,6 +163,7 @@ let MobileTableColumnHeader = (() => {
162
163
  }),
163
164
  menu.action({
164
165
  name: wording(DATA_VIEW_INSERT_RIGHT),
166
+ hide: () => this.tableViewManager.propertiesLocked$.value,
165
167
  prefix: InsertRightIcon(),
166
168
  select: () => {
167
169
  this.tableViewManager.propertyAdd({
@@ -44,10 +44,11 @@ import { property } from 'lit/decorators.js';
44
44
  import { repeat } from 'lit/directives/repeat.js';
45
45
  import { GroupTitle } from '../../../core/group-by/group-title.js';
46
46
  import { hideGroupAction } from '../../../core/group-by/group-visibility.js';
47
- import { wordingOf } from '../../../core/utils/wording.js';
48
- import { DATA_VIEW_GROUP_COLLAPSE, DATA_VIEW_GROUP_EXPAND, DATA_VIEW_NEW_PAGE, } from '../../../translations.js';
47
+ import { wordingOf, wordingFrom } from '../../../core/utils/wording.js';
48
+ import { DATA_VIEW_GROUP_COLLAPSE, DATA_VIEW_GROUP_EXPAND, DATA_VIEW_NEW_PAGE, DATA_VIEW_GROUP_DELETE_CARDS, } from '../../../translations.js';
49
49
  import { getCollapsedState, setCollapsedState } from '../collapsed-state.js';
50
50
  import { LEFT_TOOL_BAR_WIDTH } from '../consts.js';
51
+ import { TOOLBAR_UNGROUP } from '../../../../affine-shared/services/index.js';
51
52
  const styles = css `
52
53
  /* "+ New page" under the rows: a full row, 44px for a finger (P7). */
53
54
  .data-view-table-group-add-row {
@@ -160,7 +161,7 @@ let MobileTableGroup = (() => {
160
161
  ></mobile-table-row>`;
161
162
  })}
162
163
  </div>
163
- ${this.view.readonly$.value
164
+ ${this.view.readonly$.value || this.view.rowsLocked$.value
164
165
  ? null
165
166
  : html ` <div
166
167
  class="data-view-table-group-add-row dv-hover"
@@ -236,7 +237,7 @@ let MobileTableGroup = (() => {
236
237
  const ele = e.currentTarget;
237
238
  popFilterableSimpleMenu(popupTargetFromElement(ele), [
238
239
  menu.action({
239
- name: 'Ungroup',
240
+ name: wordingFrom(this)(TOOLBAR_UNGROUP),
240
241
  hide: () => group.value == null,
241
242
  select: () => {
242
243
  group.rows.forEach(row => {
@@ -246,7 +247,7 @@ let MobileTableGroup = (() => {
246
247
  }),
247
248
  hideGroupAction(group, wordingOf(this.std)),
248
249
  menu.action({
249
- name: 'Delete Cards',
250
+ name: wordingFrom(this)(DATA_VIEW_GROUP_DELETE_CARDS),
250
251
  select: () => {
251
252
  this.view.rowsDelete(group.rows.map(row => row.rowId));
252
253
  this.requestUpdate();
@@ -120,7 +120,7 @@ let MobileTableHeader = (() => {
120
120
  </div>
121
121
  `;
122
122
  })}
123
- ${this.readonly
123
+ ${this.readonly || this.tableViewManager.propertiesLocked$.value
124
124
  ? nothing
125
125
  : html `<div
126
126
  @click="${this._onAddColumn}"
@@ -153,7 +153,7 @@ let MobileTableHeader = (() => {
153
153
  * drawn the new column, so the sheet opened on the previous last property.
154
154
  */
155
155
  this._onAddColumn = (__runInitializers(this, _std_extraInitializers), () => {
156
- if (this.readonly)
156
+ if (this.readonly || this.tableViewManager.propertiesLocked$.value)
157
157
  return;
158
158
  const id = this.tableViewManager.propertyAdd('end');
159
159
  if (!id)
@@ -2,15 +2,16 @@ import type { InsertToPosition } from '../../../../affine-shared/utils/index.js'
2
2
  import type { TemplateResult } from 'lit';
3
3
  import type { GroupTrait } from '../../../core/group-by/trait.js';
4
4
  import { DataViewUIBase, DataViewUILogicBase } from '../../../core/view/data-view-base.js';
5
- import type { TableViewSelectionWithType } from '../selection.js';
5
+ import { type TableViewSelectionWithType } from '../selection.js';
6
6
  import type { TableSingleView } from '../table-view-manager.js';
7
7
  export declare class MobileTableViewUILogic extends DataViewUILogicBase<TableSingleView, TableViewSelectionWithType> {
8
8
  ui$: import("@preact/signals-core").Signal<MobileTableViewUI | undefined>;
9
9
  private get readonly();
10
10
  clearSelection: () => void;
11
11
  /**
12
- * A new row opens at once, as on the desktop table and the flat views: on a
13
- * phone its title and properties are typed in the row page.
12
+ * "New" adds the row and puts its title in editing, as the table's own
13
+ * "New record" footer does: it no longer opens the row (product owner,
14
+ * recette P3-15). Nothing is written but the row.
14
15
  */
15
16
  addRow: (position: InsertToPosition, groupKey?: string) => string | undefined;
16
17
  focusFirstCell: () => void;
@@ -4,25 +4,49 @@ import { signal } from '@preact/signals-core';
4
4
  import { repeat } from 'lit/directives/repeat.js';
5
5
  import { styleMap } from 'lit/directives/style-map.js';
6
6
  import { html } from 'lit/static-html.js';
7
+ import { locateRow } from '../../../core/group-by/locate-row.js';
7
8
  import { createUniComponentFromWebComponent, renderUniLit, } from '../../../core/index.js';
8
9
  import { DataViewUIBase, DataViewUILogicBase, } from '../../../core/view/data-view-base.js';
9
10
  import { LEFT_TOOL_BAR_WIDTH } from '../consts.js';
11
+ import { TableViewAreaSelection, } from '../selection.js';
10
12
  import { mobileTableViewContainer, mobileTableViewHost, mobileTableViewWrapper, } from './table-view-style.js';
13
+ import { DATA_VIEW_GROUP_NEW } from '../../../translations.js';
14
+ import { wordingFrom } from '../../../core/utils/wording.js';
11
15
  export class MobileTableViewUILogic extends DataViewUILogicBase {
12
16
  constructor() {
13
17
  super(...arguments);
14
18
  this.ui$ = signal(undefined);
15
19
  this.clearSelection = () => { };
16
20
  /**
17
- * A new row opens at once, as on the desktop table and the flat views: on a
18
- * phone its title and properties are typed in the row page.
21
+ * "New" adds the row and puts its title in editing, as the table's own
22
+ * "New record" footer does: it no longer opens the row (product owner,
23
+ * recette P3-15). Nothing is written but the row.
19
24
  */
20
25
  this.addRow = (position, groupKey) => {
21
26
  if (this.readonly)
22
27
  return;
23
28
  const rowId = this.view.rowAdd(position, groupKey);
24
- if (rowId)
25
- this.root.openDetailPanel({ view: this.view, rowId });
29
+ if (!rowId)
30
+ return;
31
+ requestAnimationFrame(() => {
32
+ const view = this.view;
33
+ const at = locateRow(view.groupTrait, view.rows$.peek(), rowId);
34
+ const columnIndex = view.properties$
35
+ .peek()
36
+ .findIndex(property => property.type$.peek() === 'title');
37
+ if (!at || columnIndex < 0)
38
+ return;
39
+ // The phone cells follow the logic's selection (`mobile/cell.ts`).
40
+ this.setSelection({
41
+ viewId: view.id,
42
+ type: 'table',
43
+ ...TableViewAreaSelection.create({
44
+ groupKey: at.groupKey,
45
+ focus: { rowIndex: at.rowIndex, columnIndex },
46
+ isEditing: true,
47
+ }),
48
+ });
49
+ });
26
50
  return rowId;
27
51
  };
28
52
  this.focusFirstCell = () => { };
@@ -64,7 +88,7 @@ export class MobileTableViewUILogic extends DataViewUILogicBase {
64
88
  @click="${add}"
65
89
  >
66
90
  <div class="dv-icon-16" style="display:flex;">${AddCursorIcon()}</div>
67
- <div>New Group</div>
91
+ <div>${wordingFrom(this.ui$.value)(DATA_VIEW_GROUP_NEW)}</div>
68
92
  </div>
69
93
  </div>`;
70
94
  };
@@ -1,4 +1,6 @@
1
1
  import { TableViewAreaSelection, TableViewRowSelection, } from '../../selection.js';
2
+ import { DATA_VIEW_CELLS_COPIED, DATA_VIEW_ROWS_COPIED, } from '../../../../translations.js';
3
+ import { wordingFrom } from '../../../../core/utils/wording.js';
2
4
  const BLOCKSUITE_DATABASE_TABLE = 'blocksuite/database/table';
3
5
  const TEXT = 'text/plain';
4
6
  export class TableClipboardController {
@@ -49,11 +51,13 @@ export class TableClipboardController {
49
51
  })
50
52
  .then(() => {
51
53
  if (area[0]?.row) {
52
- this.notification.toast(`${area.length} row${area.length > 1 ? 's' : ''} copied to clipboard`);
54
+ this.notification.toast(wordingFrom(this.logic.ui$.value)(DATA_VIEW_ROWS_COPIED, {
55
+ count: area.length,
56
+ }));
53
57
  }
54
58
  else {
55
59
  const count = area.flatMap(row => row.cells).length;
56
- this.notification.toast(`${count} cell${count > 1 ? 's' : ''} copied to clipboard`);
60
+ this.notification.toast(wordingFrom(this.logic.ui$.value)(DATA_VIEW_CELLS_COPIED, { count }));
57
61
  }
58
62
  })
59
63
  .catch(console.error);
@@ -188,6 +188,8 @@ export class TableSelectionController {
188
188
  }
189
189
  insertTo(groupKey, rowId, before) {
190
190
  const id = this.view.rowAdd({ before, id: rowId });
191
+ if (!id)
192
+ return;
191
193
  if (groupKey != null) {
192
194
  this.view.groupTrait.moveCardTo(id, undefined, groupKey, {
193
195
  before,
@@ -47,13 +47,14 @@ import { hideGroupAction } from '../../../core/group-by/group-visibility.js';
47
47
  import { createDndContext } from '../../../core/utils/wc-dnd/dnd-context.js';
48
48
  import { defaultActivators } from '../../../core/utils/wc-dnd/sensors/index.js';
49
49
  import { linearMove } from '../../../core/utils/wc-dnd/utils/linear-move.js';
50
- import { wordingOf } from '../../../core/utils/wording.js';
51
- import { DATA_VIEW_GROUP_COLLAPSE, DATA_VIEW_GROUP_EXPAND, DATA_VIEW_NEW_RECORD, } from '../../../translations.js';
50
+ import { wordingOf, wordingFrom } from '../../../core/utils/wording.js';
51
+ import { DATA_VIEW_GROUP_COLLAPSE, DATA_VIEW_GROUP_EXPAND, DATA_VIEW_NEW_RECORD, DATA_VIEW_GROUP_DELETE_CARDS, } from '../../../translations.js';
52
52
  import { getCollapsedState, setCollapsedState } from '../collapsed-state.js';
53
53
  import { LEFT_TOOL_BAR_WIDTH } from '../consts.js';
54
54
  import { TableViewAreaSelection } from '../selection.js';
55
55
  import { DataViewColumnPreview } from './header/column-renderer.js';
56
56
  import { getVerticalIndicator } from './header/vertical-indicator.js';
57
+ import { TOOLBAR_UNGROUP } from '../../../../affine-shared/services/index.js';
57
58
  const styles = css `
58
59
  affine-data-view-table-group:hover .group-header-op {
59
60
  visibility: visible;
@@ -182,7 +183,7 @@ let TableGroup = (() => {
182
183
  ></data-view-table-row>`;
183
184
  })}
184
185
  </div>
185
- ${this.view.readonly$.value
186
+ ${this.view.readonly$.value || this.view.rowsLocked$.value
186
187
  ? null
187
188
  : html ` <div
188
189
  class="data-view-table-group-add-row dv-hover"
@@ -290,7 +291,7 @@ let TableGroup = (() => {
290
291
  const ele = e.currentTarget;
291
292
  popFilterableSimpleMenu(popupTargetFromElement(ele), [
292
293
  menu.action({
293
- name: 'Ungroup',
294
+ name: wordingFrom(this)(TOOLBAR_UNGROUP),
294
295
  hide: () => group.value == null,
295
296
  select: () => {
296
297
  group.rows.forEach(row => {
@@ -300,7 +301,7 @@ let TableGroup = (() => {
300
301
  }),
301
302
  hideGroupAction(group, wordingOf(this.std)),
302
303
  menu.action({
303
- name: 'Delete Cards',
304
+ name: wordingFrom(this)(DATA_VIEW_GROUP_DELETE_CARDS),
304
305
  select: () => {
305
306
  this.view.rowsDelete(group.rows.map(row => row.rowId));
306
307
  this.requestUpdate();
@@ -141,12 +141,16 @@ let DatabaseColumnHeader = (() => {
141
141
  <div class="${cellDivider}" style="height: auto;"></div>
142
142
  `;
143
143
  })}
144
- <div
145
- @click="${this._onAddColumn}"
146
- class="header-add-column-button dv-hover"
147
- >
148
- ${PlusIcon()}
149
- </div>
144
+ ${this.tableViewManager.propertiesLocked$.value
145
+ ? // The column keeps its place, so the header stays aligned.
146
+ html `<div class="header-add-column-button"></div>`
147
+ : html `<div
148
+ @click="${this._onAddColumn}"
149
+ class="header-add-column-button dv-hover"
150
+ data-testid="dv-table-add-column"
151
+ >
152
+ ${PlusIcon()}
153
+ </div>`}
150
154
  <div class="scale-div" style="width: 1px;height: 1px;"></div>
151
155
  </div>
152
156
  `;
@@ -166,7 +170,7 @@ let DatabaseColumnHeader = (() => {
166
170
  constructor() {
167
171
  super(...arguments);
168
172
  this._onAddColumn = (e) => {
169
- if (this.readonly)
173
+ if (this.readonly || this.tableViewManager.propertiesLocked$.value)
170
174
  return;
171
175
  this.tableViewManager.propertyAdd('end');
172
176
  const ele = e.currentTarget;
@@ -50,11 +50,12 @@ import { renderUniLit } from '../../../../core/index.js';
50
50
  import { sortTraitKey } from '../../../../core/sort/manager.js';
51
51
  import { createSortUtils } from '../../../../core/sort/utils.js';
52
52
  import { draggable, dragHandler, droppable, } from '../../../../core/utils/wc-dnd/dnd-context.js';
53
- import { wordingOf } from '../../../../core/utils/wording.js';
53
+ import { wordingOf, propertyTypeName, wordingFrom, } from '../../../../core/utils/wording.js';
54
54
  import { numberFormats } from '../../../../property-presets/number/utils/formats.js';
55
55
  import { createDefaultShowQuickSettingBar, ShowQuickSettingBarKey, } from '../../../../widget-presets/quick-setting-bar/context.js';
56
56
  import { DEFAULT_COLUMN_TITLE_HEIGHT } from '../../consts.js';
57
57
  import { getTableGroupRect, getVerticalIndicator, startDragWidthAdjustmentBar, } from './vertical-indicator.js';
58
+ import { DATA_VIEW_NUMBER_FORMAT, DATA_VIEW_FILTER, DATA_VIEW_SORT_ASCENDING, DATA_VIEW_SORT_DESCENDING, DATA_VIEW_INSERT_LEFT, DATA_VIEW_INSERT_RIGHT, VIEWS_BAR_MOVE_LEFT, VIEWS_BAR_MOVE_RIGHT, } from '../../../../translations.js';
58
59
  let DatabaseHeaderColumn = (() => {
59
60
  let _classSuper = SignalWatcher(WithDisposable(ShadowlessElement));
60
61
  let _column_decorators;
@@ -145,7 +146,7 @@ let DatabaseHeaderColumn = (() => {
145
146
  ...(enableNumberFormatting
146
147
  ? [
147
148
  menu.subMenu({
148
- name: 'Number Format',
149
+ name: wordingFrom(this)(DATA_VIEW_NUMBER_FORMAT),
149
150
  hide: () => !this.column.dataUpdate ||
150
151
  this.column.type$.value !== 'number',
151
152
  options: {
@@ -159,7 +160,7 @@ let DatabaseHeaderColumn = (() => {
159
160
  style="font-size: var(--affine-font-base); scale: 1.2;"
160
161
  >${format.symbol}</span
161
162
  >`,
162
- name: format.label,
163
+ name: wordingFrom(this)(format.labelWording),
163
164
  select: () => {
164
165
  if (data.format === format.type)
165
166
  return;
@@ -179,17 +180,17 @@ let DatabaseHeaderColumn = (() => {
179
180
  menu.group({
180
181
  items: [
181
182
  menu.action({
182
- name: 'Filter',
183
+ name: wordingFrom(this)(DATA_VIEW_FILTER),
183
184
  prefix: FilterIcon(),
184
185
  select: () => this._addFilter(),
185
186
  }),
186
187
  menu.action({
187
- name: 'Sort Ascending',
188
+ name: wordingFrom(this)(DATA_VIEW_SORT_ASCENDING),
188
189
  prefix: SortIcon(),
189
190
  select: () => this._addSort(false),
190
191
  }),
191
192
  menu.action({
192
- name: 'Sort Descending',
193
+ name: wordingFrom(this)(DATA_VIEW_SORT_DESCENDING),
193
194
  prefix: SortIcon(),
194
195
  select: () => this._addSort(true),
195
196
  }),
@@ -198,7 +199,8 @@ let DatabaseHeaderColumn = (() => {
198
199
  menu.group({
199
200
  items: [
200
201
  menu.action({
201
- name: 'Insert Left Column',
202
+ name: wordingFrom(this)(DATA_VIEW_INSERT_LEFT),
203
+ hide: () => this.tableViewManager.propertiesLocked$.value,
202
204
  prefix: InsertLeftIcon(),
203
205
  select: () => {
204
206
  this.tableViewManager.propertyAdd({
@@ -220,7 +222,8 @@ let DatabaseHeaderColumn = (() => {
220
222
  },
221
223
  }),
222
224
  menu.action({
223
- name: 'Insert Right Column',
225
+ name: wordingFrom(this)(DATA_VIEW_INSERT_RIGHT),
226
+ hide: () => this.tableViewManager.propertiesLocked$.value,
224
227
  prefix: InsertRightIcon(),
225
228
  select: () => {
226
229
  this.tableViewManager.propertyAdd({
@@ -242,7 +245,7 @@ let DatabaseHeaderColumn = (() => {
242
245
  },
243
246
  }),
244
247
  menu.action({
245
- name: 'Move Left',
248
+ name: wordingFrom(this)(VIEWS_BAR_MOVE_LEFT),
246
249
  prefix: MoveLeftIcon(),
247
250
  hide: () => this.column.isFirst$.value,
248
251
  select: () => {
@@ -257,7 +260,7 @@ let DatabaseHeaderColumn = (() => {
257
260
  },
258
261
  }),
259
262
  menu.action({
260
- name: 'Move Right',
263
+ name: wordingFrom(this)(VIEWS_BAR_MOVE_RIGHT),
261
264
  prefix: MoveRightIcon(),
262
265
  hide: () => this.column.isLast$.value,
263
266
  select: () => {
@@ -379,15 +382,16 @@ let DatabaseHeaderColumn = (() => {
379
382
  if (this.tableViewManager.readonly$.value) {
380
383
  return;
381
384
  }
382
- if (this.column.type$.value === 'title') {
385
+ if (this.column.type$.value === 'title' || !this.column.typeCanSet) {
383
386
  return;
384
387
  }
385
388
  event.stopPropagation();
389
+ const wording = wordingFrom(this);
386
390
  popMenu(popupTargetFromElement(this), {
387
391
  options: {
388
392
  items: this.tableViewManager.propertyMetas$.value.map(config => {
389
393
  return menu.action({
390
- name: config.config.name,
394
+ name: propertyTypeName(wording, config.config),
391
395
  isSelected: config.type === this.column.type$.value,
392
396
  prefix: renderUniLit(config.renderer.icon),
393
397
  select: () => {
@@ -37,6 +37,8 @@ import { cssVarV2 } from '@toeverything/theme/v2';
37
37
  import { css, html, LitElement, unsafeCSS } from 'lit';
38
38
  import { property } from 'lit/decorators.js';
39
39
  import { formatNumber } from '../../../../property-presets/number/utils/formatter.js';
40
+ import { DATA_VIEW_DECIMALS_DECREASE, DATA_VIEW_DECIMALS_INCREASE, } from '../../../../translations.js';
41
+ import { wordingFrom } from '../../../../core/utils/wording.js';
40
42
  const IncreaseDecimalPlacesIcon = html `
41
43
  <svg
42
44
  width="24"
@@ -133,7 +135,7 @@ let DatabaseNumberFormatBar = (() => {
133
135
  <div class="number-format-decimal-places">
134
136
  <button
135
137
  class="number-format-toolbar-button"
136
- aria-label="decrease decimal places"
138
+ aria-label="${wordingFrom(this)(DATA_VIEW_DECIMALS_DECREASE)}"
137
139
  @click=${this._decrementDecimalPlaces}
138
140
  >
139
141
  ${DecreaseDecimalPlacesIcon}
@@ -141,7 +143,7 @@ let DatabaseNumberFormatBar = (() => {
141
143
 
142
144
  <button
143
145
  class="number-format-toolbar-button"
144
- aria-label="increase decimal places"
146
+ aria-label="${wordingFrom(this)(DATA_VIEW_DECIMALS_INCREASE)}"
145
147
  @click=${this._incrementDecimalPlaces}
146
148
  >
147
149
  ${IncreaseDecimalPlacesIcon}