@formicoidea/labre-core 0.47.1 → 0.49.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 (239) hide show
  1. package/dist/_pkgs/affine-block-data-view/configs/slash-menu.js +3 -1
  2. package/dist/_pkgs/affine-block-data-view/view.d.ts +17 -1
  3. package/dist/_pkgs/affine-block-data-view/view.js +21 -2
  4. package/dist/_pkgs/affine-block-database/commands.d.ts +2 -2
  5. package/dist/_pkgs/affine-block-database/commands.js +3 -3
  6. package/dist/_pkgs/affine-block-database/components/values-banner.d.ts +28 -0
  7. package/dist/_pkgs/affine-block-database/components/values-banner.js +199 -0
  8. package/dist/_pkgs/affine-block-database/configs/slash-menu.d.ts +6 -1
  9. package/dist/_pkgs/affine-block-database/configs/slash-menu.js +57 -70
  10. package/dist/_pkgs/affine-block-database/data-source.d.ts +9 -5
  11. package/dist/_pkgs/affine-block-database/data-source.js +11 -7
  12. package/dist/_pkgs/affine-block-database/database-block-styles.d.ts +2 -0
  13. package/dist/_pkgs/affine-block-database/database-block-styles.js +15 -0
  14. package/dist/_pkgs/affine-block-database/database-block.d.ts +23 -0
  15. package/dist/_pkgs/affine-block-database/database-block.js +141 -19
  16. package/dist/_pkgs/affine-block-database/effects.js +2 -0
  17. package/dist/_pkgs/affine-block-database/external-data-source.d.ts +69 -2
  18. package/dist/_pkgs/affine-block-database/external-data-source.js +88 -16
  19. package/dist/_pkgs/affine-block-database/index.d.ts +2 -0
  20. package/dist/_pkgs/affine-block-database/index.js +2 -0
  21. package/dist/_pkgs/affine-block-database/linked-view.d.ts +38 -0
  22. package/dist/_pkgs/affine-block-database/linked-view.js +109 -0
  23. package/dist/_pkgs/affine-block-database/properties/index.d.ts +2 -0
  24. package/dist/_pkgs/affine-block-database/properties/index.js +2 -0
  25. package/dist/_pkgs/affine-block-database/properties/text/hosted.d.ts +15 -0
  26. package/dist/_pkgs/affine-block-database/properties/text/hosted.js +24 -0
  27. package/dist/_pkgs/affine-block-database/properties/title/hosted.d.ts +16 -0
  28. package/dist/_pkgs/affine-block-database/properties/title/hosted.js +42 -0
  29. package/dist/_pkgs/affine-block-database/service/index.d.ts +3 -0
  30. package/dist/_pkgs/affine-block-database/service/index.js +3 -0
  31. package/dist/_pkgs/affine-block-database/service/new-row-menu.d.ts +49 -0
  32. package/dist/_pkgs/affine-block-database/service/new-row-menu.js +21 -0
  33. package/dist/_pkgs/affine-block-database/service/open-row.d.ts +77 -0
  34. package/dist/_pkgs/affine-block-database/service/open-row.js +62 -0
  35. package/dist/_pkgs/affine-block-database/service/properties-panel.d.ts +23 -0
  36. package/dist/_pkgs/affine-block-database/service/properties-panel.js +33 -0
  37. package/dist/_pkgs/affine-block-database/translations.d.ts +10 -0
  38. package/dist/_pkgs/affine-block-database/translations.js +35 -0
  39. package/dist/_pkgs/affine-block-database/view-creation.d.ts +10 -0
  40. package/dist/_pkgs/affine-block-database/view-creation.js +14 -0
  41. package/dist/_pkgs/affine-block-database/view.d.ts +31 -1
  42. package/dist/_pkgs/affine-block-database/view.js +48 -4
  43. package/dist/_pkgs/affine-block-database/views/index.d.ts +30 -3
  44. package/dist/_pkgs/affine-block-database/views/index.js +44 -3
  45. package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/configs/new-doc.d.ts +25 -0
  46. package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/configs/new-doc.js +71 -0
  47. package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/configs/slash-menu.js +3 -11
  48. package/dist/_pkgs/affine-components/date-picker/date-picker.d.ts +20 -0
  49. package/dist/_pkgs/affine-components/date-picker/date-picker.js +60 -26
  50. package/dist/_pkgs/affine-components/date-picker/style.js +1 -0
  51. package/dist/_pkgs/affine-components/translations.d.ts +4 -0
  52. package/dist/_pkgs/affine-components/translations.js +26 -0
  53. package/dist/_pkgs/affine-fragment-doc-title/doc-title.d.ts +18 -0
  54. package/dist/_pkgs/affine-fragment-doc-title/doc-title.js +41 -2
  55. package/dist/_pkgs/affine-fragment-doc-title/index.d.ts +1 -1
  56. package/dist/_pkgs/affine-fragment-doc-title/index.js +1 -1
  57. package/dist/_pkgs/affine-fragment-doc-title/title-band/band-cell.d.ts +30 -0
  58. package/dist/_pkgs/affine-fragment-doc-title/title-band/band-cell.js +137 -0
  59. package/dist/_pkgs/affine-fragment-doc-title/title-band/format.d.ts +7 -19
  60. package/dist/_pkgs/affine-fragment-doc-title/title-band/format.js +0 -38
  61. package/dist/_pkgs/affine-fragment-doc-title/title-band/show-here.d.ts +19 -0
  62. package/dist/_pkgs/affine-fragment-doc-title/title-band/show-here.js +61 -0
  63. package/dist/_pkgs/affine-fragment-doc-title/title-band/title-band.d.ts +33 -18
  64. package/dist/_pkgs/affine-fragment-doc-title/title-band/title-band.js +263 -205
  65. package/dist/_pkgs/affine-fragment-doc-title/translations.d.ts +7 -4
  66. package/dist/_pkgs/affine-fragment-doc-title/translations.js +12 -9
  67. package/dist/_pkgs/affine-model/blocks/database/types.d.ts +16 -0
  68. package/dist/_pkgs/affine-model/blocks/database/types.js +5 -1
  69. package/dist/_pkgs/affine-shared/services/data-source-picker-service.d.ts +139 -0
  70. package/dist/_pkgs/affine-shared/services/data-source-picker-service.js +22 -0
  71. package/dist/_pkgs/affine-shared/services/index.d.ts +1 -0
  72. package/dist/_pkgs/affine-shared/services/index.js +1 -0
  73. package/dist/_pkgs/affine-shared/services/linked-doc-creation-service.d.ts +15 -6
  74. package/dist/_pkgs/affine-shared/services/telemetry-service/database.d.ts +59 -0
  75. package/dist/_pkgs/affine-shared/services/title-band-service.d.ts +34 -7
  76. package/dist/_pkgs/affine-shared/utils/model/doc.d.ts +10 -2
  77. package/dist/_pkgs/affine-shared/utils/model/doc.js +17 -7
  78. package/dist/_pkgs/data-view/core/component/cell-status/cell-status-css.d.ts +2 -0
  79. package/dist/_pkgs/data-view/core/component/cell-status/cell-status-css.js +16 -0
  80. package/dist/_pkgs/data-view/core/component/cell-status/cell-status.d.ts +10 -0
  81. package/dist/_pkgs/data-view/core/component/cell-status/cell-status.js +23 -0
  82. package/dist/_pkgs/data-view/core/component/index.d.ts +1 -0
  83. package/dist/_pkgs/data-view/core/component/index.js +1 -0
  84. package/dist/_pkgs/data-view/core/component/overflow/fit.d.ts +26 -0
  85. package/dist/_pkgs/data-view/core/component/overflow/fit.js +48 -0
  86. package/dist/_pkgs/data-view/core/component/overflow/overflow.d.ts +26 -3
  87. package/dist/_pkgs/data-view/core/component/overflow/overflow.js +84 -31
  88. package/dist/_pkgs/data-view/core/component/tags/colors.d.ts +7 -0
  89. package/dist/_pkgs/data-view/core/component/tags/colors.js +22 -10
  90. package/dist/_pkgs/data-view/core/component/tags/multi-tag-select.d.ts +25 -2
  91. package/dist/_pkgs/data-view/core/component/tags/multi-tag-select.js +81 -32
  92. package/dist/_pkgs/data-view/core/data-source/base.d.ts +5 -1
  93. package/dist/_pkgs/data-view/core/data-source/base.js +7 -1
  94. package/dist/_pkgs/data-view/core/data-source/hydration.d.ts +44 -0
  95. package/dist/_pkgs/data-view/core/data-source/hydration.js +31 -0
  96. package/dist/_pkgs/data-view/core/data-source/index.d.ts +1 -0
  97. package/dist/_pkgs/data-view/core/data-source/index.js +1 -0
  98. package/dist/_pkgs/data-view/core/data-view.d.ts +22 -2
  99. package/dist/_pkgs/data-view/core/data-view.js +14 -0
  100. package/dist/_pkgs/data-view/core/effect.js +4 -0
  101. package/dist/_pkgs/data-view/core/group-by/collapsed-state.d.ts +3 -0
  102. package/dist/_pkgs/data-view/core/group-by/collapsed-state.js +59 -0
  103. package/dist/_pkgs/data-view/core/group-by/group-properties.d.ts +21 -0
  104. package/dist/_pkgs/data-view/core/group-by/group-properties.js +38 -0
  105. package/dist/_pkgs/data-view/core/group-by/group-title.js +4 -0
  106. package/dist/_pkgs/data-view/core/group-by/group-visibility.d.ts +40 -0
  107. package/dist/_pkgs/data-view/core/group-by/group-visibility.js +291 -0
  108. package/dist/_pkgs/data-view/core/group-by/setting.d.ts +11 -3
  109. package/dist/_pkgs/data-view/core/group-by/setting.js +81 -8
  110. package/dist/_pkgs/data-view/core/group-by/trait.d.ts +22 -0
  111. package/dist/_pkgs/data-view/core/group-by/trait.js +62 -1
  112. package/dist/_pkgs/data-view/core/index.d.ts +3 -0
  113. package/dist/_pkgs/data-view/core/index.js +3 -0
  114. package/dist/_pkgs/data-view/core/property/base-cell.d.ts +15 -1
  115. package/dist/_pkgs/data-view/core/property/base-cell.js +28 -3
  116. package/dist/_pkgs/data-view/core/property/index.d.ts +1 -0
  117. package/dist/_pkgs/data-view/core/property/index.js +1 -0
  118. package/dist/_pkgs/data-view/core/property/standalone-cell.d.ts +109 -0
  119. package/dist/_pkgs/data-view/core/property/standalone-cell.js +324 -0
  120. package/dist/_pkgs/data-view/core/telemetry.d.ts +16 -0
  121. package/dist/_pkgs/data-view/core/telemetry.js +22 -0
  122. package/dist/_pkgs/data-view/core/utils/new-tab-click.d.ts +2 -0
  123. package/dist/_pkgs/data-view/core/utils/new-tab-click.js +4 -0
  124. package/dist/_pkgs/data-view/core/utils/wording.d.ts +11 -0
  125. package/dist/_pkgs/data-view/core/utils/wording.js +9 -0
  126. package/dist/_pkgs/data-view/core/view/data-view.d.ts +7 -0
  127. package/dist/_pkgs/data-view/core/view/default-name.d.ts +10 -0
  128. package/dist/_pkgs/data-view/core/view/default-name.js +14 -0
  129. package/dist/_pkgs/data-view/core/view/index.d.ts +2 -0
  130. package/dist/_pkgs/data-view/core/view/index.js +2 -0
  131. package/dist/_pkgs/data-view/core/view/open-in.d.ts +27 -0
  132. package/dist/_pkgs/data-view/core/view/open-in.js +39 -0
  133. package/dist/_pkgs/data-view/core/view-manager/cell.d.ts +5 -0
  134. package/dist/_pkgs/data-view/core/view-manager/cell.js +11 -0
  135. package/dist/_pkgs/data-view/core/view-manager/index.d.ts +3 -0
  136. package/dist/_pkgs/data-view/core/view-manager/index.js +3 -0
  137. package/dist/_pkgs/data-view/core/view-manager/new-row-menu-opener.d.ts +18 -0
  138. package/dist/_pkgs/data-view/core/view-manager/new-row-menu-opener.js +2 -0
  139. package/dist/_pkgs/data-view/core/view-manager/properties-panel-opener.d.ts +8 -0
  140. package/dist/_pkgs/data-view/core/view-manager/properties-panel-opener.js +9 -0
  141. package/dist/_pkgs/data-view/core/view-manager/property.d.ts +14 -0
  142. package/dist/_pkgs/data-view/core/view-manager/single-view.d.ts +28 -1
  143. package/dist/_pkgs/data-view/core/view-manager/single-view.js +45 -1
  144. package/dist/_pkgs/data-view/core/view-manager/view-creation.d.ts +49 -0
  145. package/dist/_pkgs/data-view/core/view-manager/view-creation.js +40 -0
  146. package/dist/_pkgs/data-view/core/view-manager/view-manager.d.ts +6 -2
  147. package/dist/_pkgs/data-view/core/view-manager/view-manager.js +2 -2
  148. package/dist/_pkgs/data-view/property-presets/date/cell-renderer.d.ts +2 -0
  149. package/dist/_pkgs/data-view/property-presets/date/cell-renderer.js +11 -2
  150. package/dist/_pkgs/data-view/property-presets/multi-select/cell-renderer.js +3 -1
  151. package/dist/_pkgs/data-view/property-presets/select/cell-renderer.js +3 -1
  152. package/dist/_pkgs/data-view/property-presets/text/cell-renderer.js +3 -1
  153. package/dist/_pkgs/data-view/translations.d.ts +55 -0
  154. package/dist/_pkgs/data-view/translations.js +181 -0
  155. package/dist/_pkgs/data-view/view-presets/calendar/define.js +3 -1
  156. package/dist/_pkgs/data-view/view-presets/convert.js +2 -0
  157. package/dist/_pkgs/data-view/view-presets/effect.js +4 -0
  158. package/dist/_pkgs/data-view/view-presets/flat/flat-converts.d.ts +2 -0
  159. package/dist/_pkgs/data-view/view-presets/flat/flat-converts.js +35 -0
  160. package/dist/_pkgs/data-view/view-presets/flat/flat-view-manager.d.ts +79 -0
  161. package/dist/_pkgs/data-view/view-presets/flat/flat-view-manager.js +194 -0
  162. package/dist/_pkgs/data-view/view-presets/flat/flat-view-ui.d.ts +56 -0
  163. package/dist/_pkgs/data-view/view-presets/flat/flat-view-ui.js +266 -0
  164. package/dist/_pkgs/data-view/view-presets/gallery/define.d.ts +14 -0
  165. package/dist/_pkgs/data-view/view-presets/gallery/define.js +15 -0
  166. package/dist/_pkgs/data-view/view-presets/gallery/effect.d.ts +1 -0
  167. package/dist/_pkgs/data-view/view-presets/gallery/effect.js +4 -0
  168. package/dist/_pkgs/data-view/view-presets/gallery/gallery-view.d.ts +27 -0
  169. package/dist/_pkgs/data-view/view-presets/gallery/gallery-view.js +179 -0
  170. package/dist/_pkgs/data-view/view-presets/gallery/index.d.ts +2 -0
  171. package/dist/_pkgs/data-view/view-presets/gallery/index.js +2 -0
  172. package/dist/_pkgs/data-view/view-presets/gallery/renderer.d.ts +1 -0
  173. package/dist/_pkgs/data-view/view-presets/gallery/renderer.js +11 -0
  174. package/dist/_pkgs/data-view/view-presets/index.d.ts +5 -0
  175. package/dist/_pkgs/data-view/view-presets/index.js +7 -0
  176. package/dist/_pkgs/data-view/view-presets/kanban/define.js +3 -1
  177. package/dist/_pkgs/data-view/view-presets/kanban/kanban-view-manager.js +5 -53
  178. package/dist/_pkgs/data-view/view-presets/kanban/mobile/card.js +8 -1
  179. package/dist/_pkgs/data-view/view-presets/kanban/mobile/cell.js +6 -1
  180. package/dist/_pkgs/data-view/view-presets/kanban/mobile/group.d.ts +4 -2
  181. package/dist/_pkgs/data-view/view-presets/kanban/mobile/group.js +52 -6
  182. package/dist/_pkgs/data-view/view-presets/kanban/mobile/kanban-view-ui-logic.js +5 -1
  183. package/dist/_pkgs/data-view/view-presets/kanban/pc/card.js +2 -0
  184. package/dist/_pkgs/data-view/view-presets/kanban/pc/cell.js +4 -0
  185. package/dist/_pkgs/data-view/view-presets/kanban/pc/group.d.ts +4 -2
  186. package/dist/_pkgs/data-view/view-presets/kanban/pc/group.js +51 -6
  187. package/dist/_pkgs/data-view/view-presets/kanban/pc/kanban-view-ui-logic.js +5 -1
  188. package/dist/_pkgs/data-view/view-presets/list/define.d.ts +14 -0
  189. package/dist/_pkgs/data-view/view-presets/list/define.js +15 -0
  190. package/dist/_pkgs/data-view/view-presets/list/effect.d.ts +1 -0
  191. package/dist/_pkgs/data-view/view-presets/list/effect.js +4 -0
  192. package/dist/_pkgs/data-view/view-presets/list/index.d.ts +2 -0
  193. package/dist/_pkgs/data-view/view-presets/list/index.js +2 -0
  194. package/dist/_pkgs/data-view/view-presets/list/list-view.d.ts +24 -0
  195. package/dist/_pkgs/data-view/view-presets/list/list-view.js +194 -0
  196. package/dist/_pkgs/data-view/view-presets/list/renderer.d.ts +1 -0
  197. package/dist/_pkgs/data-view/view-presets/list/renderer.js +11 -0
  198. package/dist/_pkgs/data-view/view-presets/table/collapsed-state.d.ts +3 -14
  199. package/dist/_pkgs/data-view/view-presets/table/collapsed-state.js +6 -30
  200. package/dist/_pkgs/data-view/view-presets/table/consts.d.ts +2 -0
  201. package/dist/_pkgs/data-view/view-presets/table/consts.js +2 -0
  202. package/dist/_pkgs/data-view/view-presets/table/define.js +3 -1
  203. package/dist/_pkgs/data-view/view-presets/table/mobile/cell.js +4 -1
  204. package/dist/_pkgs/data-view/view-presets/table/mobile/column-header.js +2 -2
  205. package/dist/_pkgs/data-view/view-presets/table/mobile/group.d.ts +3 -1
  206. package/dist/_pkgs/data-view/view-presets/table/mobile/group.js +20 -5
  207. package/dist/_pkgs/data-view/view-presets/table/mobile/row.js +10 -2
  208. package/dist/_pkgs/data-view/view-presets/table/mobile/table-view-ui-logic.js +4 -1
  209. package/dist/_pkgs/data-view/view-presets/table/pc/cell.js +4 -1
  210. package/dist/_pkgs/data-view/view-presets/table/pc/controller/hotkeys.js +1 -1
  211. package/dist/_pkgs/data-view/view-presets/table/pc/group.d.ts +3 -1
  212. package/dist/_pkgs/data-view/view-presets/table/pc/group.js +20 -5
  213. package/dist/_pkgs/data-view/view-presets/table/pc/menu.d.ts +1 -1
  214. package/dist/_pkgs/data-view/view-presets/table/pc/menu.js +2 -1
  215. package/dist/_pkgs/data-view/view-presets/table/pc/row/row.js +3 -2
  216. package/dist/_pkgs/data-view/view-presets/table/pc/table-view-ui-logic.js +4 -1
  217. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/controller/hotkeys.js +1 -1
  218. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/group/bottom/stats/column-stats-column.js +5 -1
  219. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/group/top/group-title.js +22 -19
  220. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/row/cell.js +4 -1
  221. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/table-view-ui-logic.js +7 -2
  222. package/dist/_pkgs/data-view/view-presets/table/stats/column-stats-column.js +5 -1
  223. package/dist/_pkgs/data-view/view-presets/table/table-view-manager.js +5 -53
  224. package/dist/_pkgs/data-view/widget-presets/tools/presets/table-add-row/add-row.d.ts +1 -0
  225. package/dist/_pkgs/data-view/widget-presets/tools/presets/table-add-row/add-row.js +60 -2
  226. package/dist/_pkgs/data-view/widget-presets/tools/presets/view-options/view-options.d.ts +18 -1
  227. package/dist/_pkgs/data-view/widget-presets/tools/presets/view-options/view-options.js +121 -124
  228. package/dist/_pkgs/data-view/widget-presets/tools/presets/view-options/view-settings.d.ts +43 -0
  229. package/dist/_pkgs/data-view/widget-presets/tools/presets/view-options/view-settings.js +187 -0
  230. package/dist/_pkgs/data-view/widget-presets/views-bar/views-view.d.ts +36 -3
  231. package/dist/_pkgs/data-view/widget-presets/views-bar/views-view.js +187 -59
  232. package/dist/extensions/view.d.ts +2 -2
  233. package/dist/extensions/view.js +10 -3
  234. package/dist/flags.d.ts +8 -4
  235. package/dist/flags.js +8 -4
  236. package/dist/frameworks.d.ts +27 -0
  237. package/dist/frameworks.js +28 -0
  238. package/dist/translations.js +13 -1
  239. package/package.json +5 -1
@@ -0,0 +1,38 @@
1
+ import { sortByManually } from './trait.js';
2
+ /**
3
+ * The group ops every grouped preset hands its `GroupTrait`, over the view's
4
+ * stored `groupProperties` (the shape table and kanban have always stored:
5
+ * `{ key, hide, manuallyCardSort }`). One copy for table, kanban, gallery and
6
+ * list (ADR 0035 §8, B8), so a hidden group and a manual order read and write
7
+ * the same way in every view.
8
+ *
9
+ * Every write lists the entry of every group key it is given, so a hidden
10
+ * group keeps its `hide` and its card order through a reorder; nothing is
11
+ * written when the value would not change.
12
+ */
13
+ export const groupPropertiesOps = (read, write) => {
14
+ const entries = () => new Map(read().map(v => [v.key, v]));
15
+ const entry = (map, key) => map.get(key) ?? { key, hide: false, manuallyCardSort: [] };
16
+ const groupHidden = (key) => read().find(v => v.key === key)?.hide === true;
17
+ return {
18
+ sortGroup: (keys) => sortByManually(keys, v => v, read().map(v => v.key)),
19
+ sortRow: (key, rows) => sortByManually(rows, v => v.rowId, read().find(v => v.key === key)?.manuallyCardSort ?? []),
20
+ changeGroupSort: (keys) => {
21
+ const map = entries();
22
+ write(keys.map(key => entry(map, key)));
23
+ },
24
+ changeRowSort: (groupKeys, groupKey, keys) => {
25
+ const map = entries();
26
+ write(groupKeys.map(key => key === groupKey
27
+ ? { ...entry(map, key), manuallyCardSort: keys }
28
+ : entry(map, key)));
29
+ },
30
+ groupHidden,
31
+ groupHideSet: (groupKeys, groupKey, hide) => {
32
+ if (groupHidden(groupKey) === hide)
33
+ return;
34
+ const map = entries();
35
+ write(groupKeys.map(key => key === groupKey ? { ...entry(map, key), hide } : entry(map, key)));
36
+ },
37
+ };
38
+ };
@@ -3,8 +3,12 @@ import { IS_MOBILE } from '../../../global/env/index.js';
3
3
  import { MoreHorizontalIcon, PlusIcon } from '@blocksuite/icons/lit';
4
4
  import { nothing } from 'lit';
5
5
  import { html } from 'lit/static-html.js';
6
+ import { VALUES_PENDING_MARK, valuesReady } from '../data-source/hydration.js';
6
7
  import { renderUniLit } from '../utils/uni-component/uni-component.js';
7
8
  function GroupHeaderCount(group) {
9
+ if (!valuesReady(group.property.view.manager.dataSource)) {
10
+ return html ` <div class="group-header-count">${VALUES_PENDING_MARK}</div>`;
11
+ }
8
12
  const cards = group.rows;
9
13
  if (!cards.length) {
10
14
  return;
@@ -0,0 +1,40 @@
1
+ import { type MenuConfig } from '../../../affine-components/context-menu/index.js';
2
+ import { type BlockStdScope, ShadowlessElement } from '../../../std/index.js';
3
+ import { nothing } from 'lit';
4
+ import { type Wording } from '../utils/wording.js';
5
+ import type { Group, GroupTrait } from './trait.js';
6
+ /**
7
+ * The group chrome every grouped preset shares (ADR 0035 §8, B8, PRD
8
+ * REQ-DB-16): "Hide group" in a group's menu, the fold toggle of a group
9
+ * header, and the list of hidden groups drawn at the end of the view. Hiding
10
+ * is a view setting, shared by everyone; folding is personal
11
+ * (`collapsed-state.ts`).
12
+ */
13
+ /** "Hide group", for a group's own menu. Absent where the view hides none. */
14
+ export declare const hideGroupAction: (group: Group, wording: Wording) => MenuConfig;
15
+ /**
16
+ * A group header's fold button. Folding is never a write, so a read-only
17
+ * view folds too.
18
+ */
19
+ export declare const renderGroupToggle: (group: Group, wording: Wording) => import("lit-html").TemplateResult<1>;
20
+ export declare const groupToggleStyles: import("lit").CSSResult;
21
+ declare const DataViewHiddenGroups_base: typeof ShadowlessElement & import("../../../global/utils/types.js").Constructor<import("../../../global/lit/with-disposable.js").DisposableClass>;
22
+ /**
23
+ * The hidden groups of a view, at its end, each with a button that shows it
24
+ * again (PRD REQ-DB-16). Nothing when the view hides no group. A read-only
25
+ * view lists them without the button.
26
+ */
27
+ export declare class DataViewHiddenGroups extends DataViewHiddenGroups_base {
28
+ static styles: import("lit").CSSResult;
29
+ /** Absent outside an editor (a unit test): the wordings read English. */
30
+ accessor std: BlockStdScope;
31
+ accessor groupTrait: GroupTrait | undefined;
32
+ connectedCallback(): void;
33
+ render(): import("lit-html").TemplateResult<1> | typeof nothing;
34
+ }
35
+ declare global {
36
+ interface HTMLElementTagNameMap {
37
+ 'dv-hidden-groups': DataViewHiddenGroups;
38
+ }
39
+ }
40
+ export {};
@@ -0,0 +1,291 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { menu } from '../../../affine-components/context-menu/index.js';
36
+ import { SignalWatcher, WithDisposable } from '../../../global/lit/index.js';
37
+ import { InvisibleIcon, ToggleDownIcon, ToggleRightIcon, ViewIcon, } from '@blocksuite/icons/lit';
38
+ import { ShadowlessElement, stdContext } from '../../../std/index.js';
39
+ import { consume } from '@lit/context';
40
+ import { cssVarV2 } from '@toeverything/theme/v2';
41
+ import { css, html, nothing, unsafeCSS } from 'lit';
42
+ import { property } from 'lit/decorators.js';
43
+ import { repeat } from 'lit/directives/repeat.js';
44
+ import { DATA_VIEW_GROUP_COLLAPSE, DATA_VIEW_GROUP_EXPAND, DATA_VIEW_GROUP_HIDE, DATA_VIEW_GROUP_SHOW, DATA_VIEW_HIDDEN_GROUPS, } from '../../translations.js';
45
+ import { VALUES_PENDING_MARK, valuesReady } from '../data-source/hydration.js';
46
+ import { renderUniLit } from '../utils/uni-component/uni-component.js';
47
+ import { wordingOf } from '../utils/wording.js';
48
+ /**
49
+ * The group chrome every grouped preset shares (ADR 0035 §8, B8, PRD
50
+ * REQ-DB-16): "Hide group" in a group's menu, the fold toggle of a group
51
+ * header, and the list of hidden groups drawn at the end of the view. Hiding
52
+ * is a view setting, shared by everyone; folding is personal
53
+ * (`collapsed-state.ts`).
54
+ */
55
+ /** "Hide group", for a group's own menu. Absent where the view hides none. */
56
+ export const hideGroupAction = (group, wording) => menu.action({
57
+ name: wording(DATA_VIEW_GROUP_HIDE),
58
+ prefix: InvisibleIcon(),
59
+ hide: () => !group.manager.groupsCanHide,
60
+ select: () => {
61
+ group.manager.groupHideSet(group.key, true);
62
+ },
63
+ });
64
+ const groupCount = (group) => valuesReady(group.property.view.manager.dataSource)
65
+ ? group.rows.length
66
+ : VALUES_PENDING_MARK;
67
+ /**
68
+ * A group header's fold button. Folding is never a write, so a read-only
69
+ * view folds too.
70
+ */
71
+ export const renderGroupToggle = (group, wording) => {
72
+ const collapsed = group.manager.collapsed$(group.key).value;
73
+ const label = wording(collapsed ? DATA_VIEW_GROUP_EXPAND : DATA_VIEW_GROUP_COLLAPSE);
74
+ return html `<button
75
+ class="dv-group-toggle"
76
+ data-testid="dv-group-toggle"
77
+ aria-expanded="${collapsed ? 'false' : 'true'}"
78
+ aria-label="${label}"
79
+ title="${label}"
80
+ @click="${(event) => {
81
+ event.stopPropagation();
82
+ group.manager.collapsedSet(group.key, !collapsed);
83
+ }}"
84
+ >
85
+ ${collapsed ? ToggleRightIcon() : ToggleDownIcon()}
86
+ </button>`;
87
+ };
88
+ export const groupToggleStyles = css `
89
+ .dv-group-toggle {
90
+ display: flex;
91
+ flex-shrink: 0;
92
+ align-items: center;
93
+ justify-content: center;
94
+ width: 24px;
95
+ height: 24px;
96
+ padding: 0;
97
+ border: none;
98
+ border-radius: 4px;
99
+ background: transparent;
100
+ color: var(--affine-icon-color);
101
+ cursor: pointer;
102
+ }
103
+
104
+ .dv-group-toggle svg {
105
+ width: 16px;
106
+ height: 16px;
107
+ }
108
+
109
+ .dv-group-toggle:focus-visible {
110
+ outline: 2px solid var(--affine-primary-color);
111
+ outline-offset: 1px;
112
+ }
113
+
114
+ @media (hover: hover) {
115
+ .dv-group-toggle:hover {
116
+ background-color: var(--affine-hover-color);
117
+ }
118
+ }
119
+
120
+ @media (pointer: coarse) {
121
+ .dv-group-toggle {
122
+ width: 44px;
123
+ height: 44px;
124
+ }
125
+ }
126
+ `;
127
+ /**
128
+ * The hidden groups of a view, at its end, each with a button that shows it
129
+ * again (PRD REQ-DB-16). Nothing when the view hides no group. A read-only
130
+ * view lists them without the button.
131
+ */
132
+ let DataViewHiddenGroups = (() => {
133
+ let _classSuper = SignalWatcher(WithDisposable(ShadowlessElement));
134
+ let _std_decorators;
135
+ let _std_initializers = [];
136
+ let _std_extraInitializers = [];
137
+ let _groupTrait_decorators;
138
+ let _groupTrait_initializers = [];
139
+ let _groupTrait_extraInitializers = [];
140
+ return class DataViewHiddenGroups extends _classSuper {
141
+ static {
142
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
143
+ _std_decorators = [consume({ context: stdContext })];
144
+ _groupTrait_decorators = [property({ attribute: false })];
145
+ __esDecorate(this, null, _std_decorators, { kind: "accessor", name: "std", static: false, private: false, access: { has: obj => "std" in obj, get: obj => obj.std, set: (obj, value) => { obj.std = value; } }, metadata: _metadata }, _std_initializers, _std_extraInitializers);
146
+ __esDecorate(this, null, _groupTrait_decorators, { kind: "accessor", name: "groupTrait", static: false, private: false, access: { has: obj => "groupTrait" in obj, get: obj => obj.groupTrait, set: (obj, value) => { obj.groupTrait = value; } }, metadata: _metadata }, _groupTrait_initializers, _groupTrait_extraInitializers);
147
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
148
+ }
149
+ static { this.styles = css `
150
+ dv-hidden-groups {
151
+ display: block;
152
+ }
153
+
154
+ .dv-hidden-groups {
155
+ display: flex;
156
+ flex-direction: column;
157
+ gap: 2px;
158
+ padding: 8px 0;
159
+ }
160
+
161
+ .dv-hidden-groups-title {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 8px;
165
+ padding: 0 4px 4px;
166
+ font-size: 12px;
167
+ line-height: 20px;
168
+ color: var(--affine-text-secondary-color);
169
+ }
170
+
171
+ .dv-hidden-group {
172
+ display: flex;
173
+ align-items: center;
174
+ gap: 8px;
175
+ min-height: 32px;
176
+ padding: 0 4px;
177
+ border-radius: 4px;
178
+ }
179
+
180
+ .dv-hidden-group-title {
181
+ flex: 1 1 auto;
182
+ min-width: 0;
183
+ overflow: hidden;
184
+ opacity: 0.7;
185
+ }
186
+
187
+ .dv-hidden-group-count {
188
+ flex-shrink: 0;
189
+ font-size: 12px;
190
+ color: var(--affine-text-secondary-color);
191
+ }
192
+
193
+ .dv-hidden-group-show {
194
+ display: flex;
195
+ flex-shrink: 0;
196
+ align-items: center;
197
+ justify-content: center;
198
+ width: 28px;
199
+ height: 28px;
200
+ padding: 0;
201
+ border: 1px solid ${unsafeCSS(cssVarV2.layer.insideBorder.border)};
202
+ border-radius: 4px;
203
+ background: transparent;
204
+ color: var(--affine-icon-color);
205
+ cursor: pointer;
206
+ }
207
+
208
+ .dv-hidden-group-show svg {
209
+ width: 16px;
210
+ height: 16px;
211
+ }
212
+
213
+ .dv-hidden-group-show:focus-visible {
214
+ outline: 2px solid var(--affine-primary-color);
215
+ outline-offset: 1px;
216
+ }
217
+
218
+ @media (hover: hover) {
219
+ .dv-hidden-group-show:hover {
220
+ background-color: var(--affine-hover-color);
221
+ }
222
+ }
223
+
224
+ @media (pointer: coarse) {
225
+ .dv-hidden-group {
226
+ min-height: 44px;
227
+ }
228
+
229
+ .dv-hidden-group-show {
230
+ width: 44px;
231
+ height: 44px;
232
+ }
233
+ }
234
+ `; }
235
+ #std_accessor_storage = __runInitializers(this, _std_initializers, void 0);
236
+ /** Absent outside an editor (a unit test): the wordings read English. */
237
+ get std() { return this.#std_accessor_storage; }
238
+ set std(value) { this.#std_accessor_storage = value; }
239
+ #groupTrait_accessor_storage = (__runInitializers(this, _std_extraInitializers), __runInitializers(this, _groupTrait_initializers, undefined));
240
+ get groupTrait() { return this.#groupTrait_accessor_storage; }
241
+ set groupTrait(value) { this.#groupTrait_accessor_storage = value; }
242
+ connectedCallback() {
243
+ super.connectedCallback();
244
+ this.dataset.testid = 'dv-hidden-groups';
245
+ }
246
+ render() {
247
+ const trait = this.groupTrait;
248
+ const groups = trait?.hiddenGroups$.value ?? [];
249
+ if (!trait || !groups.length)
250
+ return nothing;
251
+ const wording = wordingOf(this.std);
252
+ const readonly = trait.view.readonly$.value;
253
+ const show = wording(DATA_VIEW_GROUP_SHOW);
254
+ return html `<div class="dv-hidden-groups">
255
+ <div class="dv-hidden-groups-title">
256
+ <span>${wording(DATA_VIEW_HIDDEN_GROUPS)}</span>
257
+ <span>${groups.length}</span>
258
+ </div>
259
+ ${repeat(groups, group => group.key, group => {
260
+ const props = { group, readonly: true };
261
+ return html `<div
262
+ class="dv-hidden-group"
263
+ data-testid="dv-hidden-group"
264
+ data-group-key="${group.key}"
265
+ >
266
+ <div class="dv-hidden-group-title">
267
+ ${renderUniLit(group.view, props)}
268
+ </div>
269
+ <span class="dv-hidden-group-count">${groupCount(group)}</span>
270
+ ${readonly
271
+ ? nothing
272
+ : html `<button
273
+ class="dv-hidden-group-show"
274
+ data-testid="dv-group-show"
275
+ aria-label="${show}"
276
+ title="${show}"
277
+ @click="${() => trait.groupHideSet(group.key, false)}"
278
+ >
279
+ ${ViewIcon()}
280
+ </button>`}
281
+ </div>`;
282
+ })}
283
+ </div>`;
284
+ }
285
+ constructor() {
286
+ super(...arguments);
287
+ __runInitializers(this, _groupTrait_extraInitializers);
288
+ }
289
+ };
290
+ })();
291
+ export { DataViewHiddenGroups };
@@ -1,11 +1,19 @@
1
1
  import { type MenuOptions, type PopupTarget } from '../../../affine-components/context-menu/index.js';
2
2
  import { ShadowlessElement } from '../../../std/index.js';
3
- import type { GroupTrait } from './trait.js';
3
+ import { type Wording } from '../utils/wording.js';
4
+ import type { Group, GroupTrait } from './trait.js';
4
5
  declare const GroupSetting_base: typeof ShadowlessElement & import("../../../global/utils/types.js").Constructor<import("../../../global/lit/with-disposable.js").DisposableClass>;
5
6
  export declare class GroupSetting extends GroupSetting_base {
6
7
  static styles: import("lit").CSSResult;
7
8
  accessor groupTrait: GroupTrait;
8
- groups$: import("@preact/signals-core").ReadonlySignal<import("./trait.js").Group<unknown, unknown, Record<string, unknown>>[] | undefined>;
9
+ /** Resolved by the menu's opener: a popup renders outside the host. */
10
+ accessor wording: Wording;
11
+ /**
12
+ * The eye of a group (B8): hide it from the view for everyone, or show it
13
+ * again. A hidden group keeps its row here, in its place in the order.
14
+ */
15
+ private renderVisibility;
16
+ groups$: import("@preact/signals-core").ReadonlySignal<Group<unknown, unknown, Record<string, unknown>>[] | undefined>;
9
17
  sortContext: import("../utils/wc-dnd/sort/sort-context.js").SortContext;
10
18
  connectedCallback(): void;
11
19
  protected render(): unknown;
@@ -21,5 +29,5 @@ export declare const popSelectGroupByProperty: (target: PopupTarget, group: Grou
21
29
  onClose?: () => void;
22
30
  onBack?: () => void;
23
31
  }) => void;
24
- export declare const popGroupSetting: (target: PopupTarget, group: GroupTrait, onBack: () => void) => void;
32
+ export declare const popGroupSetting: (target: PopupTarget, group: GroupTrait, onBack: () => void, wording?: Wording) => void;
25
33
  export {};
@@ -34,16 +34,17 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
34
34
  };
35
35
  import { menu, popMenu, } from '../../../affine-components/context-menu/index.js';
36
36
  import { SignalWatcher, WithDisposable } from '../../../global/lit/index.js';
37
- import { DeleteIcon } from '@blocksuite/icons/lit';
37
+ import { DeleteIcon, InvisibleIcon, ViewIcon } from '@blocksuite/icons/lit';
38
38
  import { ShadowlessElement } from '../../../std/index.js';
39
39
  import { computed } from '@preact/signals-core';
40
- import { css, html, unsafeCSS } from 'lit';
40
+ import { css, html, nothing, unsafeCSS } from 'lit';
41
41
  import { property, query } from 'lit/decorators.js';
42
42
  import { repeat } from 'lit/directives/repeat.js';
43
+ import { DATA_VIEW_GROUP_HIDE, DATA_VIEW_GROUP_SHOW, } from '../../translations.js';
43
44
  import { KanbanSingleView } from '../../view-presets/kanban/kanban-view-manager.js';
44
- import { TableSingleView } from '../../view-presets/table/table-view-manager.js';
45
45
  import { dataViewCssVariable } from '../common/css-variable.js';
46
46
  import { renderUniLit } from '../utils/uni-component/uni-component.js';
47
+ import { englishWording } from '../utils/wording.js';
47
48
  import { dragHandler } from '../utils/wc-dnd/dnd-context.js';
48
49
  import { defaultActivators } from '../utils/wc-dnd/sensors/index.js';
49
50
  import { createSortContext, sortable, } from '../utils/wc-dnd/sort/sort-context.js';
@@ -54,6 +55,9 @@ let GroupSetting = (() => {
54
55
  let _groupTrait_decorators;
55
56
  let _groupTrait_initializers = [];
56
57
  let _groupTrait_extraInitializers = [];
58
+ let _wording_decorators;
59
+ let _wording_initializers = [];
60
+ let _wording_extraInitializers = [];
57
61
  let _groupContainer_decorators;
58
62
  let _groupContainer_initializers = [];
59
63
  let _groupContainer_extraInitializers = [];
@@ -61,8 +65,10 @@ let GroupSetting = (() => {
61
65
  static {
62
66
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
63
67
  _groupTrait_decorators = [property({ attribute: false })];
68
+ _wording_decorators = [property({ attribute: false })];
64
69
  _groupContainer_decorators = [query('.group-sort-setting')];
65
70
  __esDecorate(this, null, _groupTrait_decorators, { kind: "accessor", name: "groupTrait", static: false, private: false, access: { has: obj => "groupTrait" in obj, get: obj => obj.groupTrait, set: (obj, value) => { obj.groupTrait = value; } }, metadata: _metadata }, _groupTrait_initializers, _groupTrait_extraInitializers);
71
+ __esDecorate(this, null, _wording_decorators, { kind: "accessor", name: "wording", static: false, private: false, access: { has: obj => "wording" in obj, get: obj => obj.wording, set: (obj, value) => { obj.wording = value; } }, metadata: _metadata }, _wording_initializers, _wording_extraInitializers);
66
72
  __esDecorate(this, null, _groupContainer_decorators, { kind: "accessor", name: "groupContainer", static: false, private: false, access: { has: obj => "groupContainer" in obj, get: obj => obj.groupContainer, set: (obj, value) => { obj.groupContainer = value; } }, metadata: _metadata }, _groupContainer_initializers, _groupContainer_extraInitializers);
67
73
  if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
68
74
  }
@@ -96,10 +102,73 @@ let GroupSetting = (() => {
96
102
  .group-item:hover .group-item-drag-bar {
97
103
  background-color: #c0bfc1;
98
104
  }
105
+
106
+ .group-item-visibility {
107
+ display: flex;
108
+ flex-shrink: 0;
109
+ align-items: center;
110
+ justify-content: center;
111
+ width: 24px;
112
+ height: 24px;
113
+ margin-left: auto;
114
+ padding: 0;
115
+ border: none;
116
+ border-radius: 4px;
117
+ background: transparent;
118
+ color: var(--affine-icon-color);
119
+ cursor: pointer;
120
+ }
121
+
122
+ .group-item-visibility svg {
123
+ width: 16px;
124
+ height: 16px;
125
+ }
126
+
127
+ .group-item-visibility:hover {
128
+ background-color: var(--affine-hover-color);
129
+ }
130
+
131
+ @media (pointer: coarse) {
132
+ .group-item {
133
+ align-items: center;
134
+ min-height: 44px;
135
+ }
136
+
137
+ .group-item-visibility {
138
+ width: 44px;
139
+ height: 44px;
140
+ }
141
+ }
99
142
  `; }
100
143
  #groupTrait_accessor_storage;
101
144
  get groupTrait() { return this.#groupTrait_accessor_storage; }
102
145
  set groupTrait(value) { this.#groupTrait_accessor_storage = value; }
146
+ #wording_accessor_storage;
147
+ /** Resolved by the menu's opener: a popup renders outside the host. */
148
+ get wording() { return this.#wording_accessor_storage; }
149
+ set wording(value) { this.#wording_accessor_storage = value; }
150
+ /**
151
+ * The eye of a group (B8): hide it from the view for everyone, or show it
152
+ * again. A hidden group keeps its row here, in its place in the order.
153
+ */
154
+ renderVisibility(group) {
155
+ const trait = this.groupTrait;
156
+ if (!trait.groupsCanHide || trait.view.readonly$.value)
157
+ return nothing;
158
+ const hidden = trait.hiddenGroups$.value.includes(group);
159
+ const label = this.wording(hidden ? DATA_VIEW_GROUP_SHOW : DATA_VIEW_GROUP_HIDE);
160
+ return html `<button
161
+ class="group-item-visibility"
162
+ data-testid="dv-group-visibility"
163
+ aria-label="${label}"
164
+ title="${label}"
165
+ aria-pressed="${hidden ? 'true' : 'false'}"
166
+ @pointerdown="${(event) => event.stopPropagation()}"
167
+ @click="${() => trait.groupHideSet(group.key, !hidden)}"
168
+ >
169
+ ${hidden ? InvisibleIcon() : ViewIcon()}
170
+ </button>`;
171
+ }
103
172
  connectedCallback() {
104
173
  super.connectedCallback();
105
174
  this._disposables.addFromEvent(this, 'pointerdown', e => {
@@ -146,6 +215,7 @@ let GroupSetting = (() => {
146
215
  style="position:absolute;left: 0;top: 0;right: 0;bottom: 0;"
147
216
  ></div>
148
217
  </div>
218
+ ${this.renderVisibility(group)}
149
219
  </div>`;
150
220
  })}
151
221
  </div>
@@ -157,7 +227,8 @@ let GroupSetting = (() => {
157
227
  constructor() {
158
228
  super(...arguments);
159
229
  this.#groupTrait_accessor_storage = __runInitializers(this, _groupTrait_initializers, void 0);
160
- this.groups$ = (__runInitializers(this, _groupTrait_extraInitializers), computed(() => {
230
+ this.#wording_accessor_storage = (__runInitializers(this, _groupTrait_extraInitializers), __runInitializers(this, _wording_initializers, englishWording));
231
+ this.groups$ = (__runInitializers(this, _wording_extraInitializers), computed(() => {
161
232
  return this.groupTrait.groupsDataList$.value;
162
233
  }));
163
234
  this.sortContext = createSortContext({
@@ -323,7 +394,7 @@ export const popSelectGroupByProperty = (target, group, ops) => {
323
394
  options: selectGroupByProperty(group, ops),
324
395
  });
325
396
  };
326
- export const popGroupSetting = (target, group, onBack) => {
397
+ export const popGroupSetting = (target, group, onBack, wording) => {
327
398
  const view = group.view;
328
399
  const groupProperty = group.property$.value;
329
400
  if (groupProperty == null) {
@@ -361,7 +432,7 @@ export const popGroupSetting = (target, group, onBack) => {
361
432
  options: selectGroupByProperty(group, {
362
433
  onSelect: () => {
363
434
  menuHandler.close();
364
- popGroupSetting(target, group, onBack);
435
+ popGroupSetting(target, group, onBack, wording);
365
436
  },
366
437
  }),
367
438
  }),
@@ -371,7 +442,7 @@ export const popGroupSetting = (target, group, onBack) => {
371
442
  items: group.isDateGroup$.value
372
443
  ? dateGroupSettingItems(group, () => {
373
444
  menuHandler.close();
374
- popGroupSetting(target, group, onBack);
445
+ popGroupSetting(target, group, onBack, wording);
375
446
  })
376
447
  : [],
377
448
  }),
@@ -384,6 +455,7 @@ export const popGroupSetting = (target, group, onBack) => {
384
455
  menu => html ` <data-view-group-setting
385
456
  @mouseenter="${() => menu.closeSubMenu()}"
386
457
  .groupTrait="${group}"
458
+ .wording="${wording ?? englishWording}"
387
459
  .columnId="${groupProperty.id}"
388
460
  ></data-view-group-setting>`,
389
461
  ],
@@ -394,7 +466,8 @@ export const popGroupSetting = (target, group, onBack) => {
394
466
  name: 'Remove grouping',
395
467
  prefix: DeleteIcon(),
396
468
  class: { 'delete-item': true },
397
- hide: () => !(view instanceof TableSingleView),
469
+ // Every layout but the kanban, which is a grouping (B8).
470
+ hide: () => view instanceof KanbanSingleView,
398
471
  select: () => {
399
472
  group.changeGroup(undefined);
400
473
  },
@@ -57,6 +57,25 @@ export declare class GroupTrait {
57
57
  } | undefined>;
58
58
  groupDataMap$: ReadonlySignal<Record<string, Group<unknown, unknown, Record<string, unknown>>> | undefined>;
59
59
  groupsDataList$: ReadonlySignal<Group<unknown, unknown, Record<string, unknown>>[] | undefined>;
60
+ /**
61
+ * The groups a view draws: every group but the ones its stored
62
+ * `groupProperties` hide (ADR 0035 §8, B8). `groupsDataList$` keeps them
63
+ * all, because a reorder or a card move writes an entry for every key and
64
+ * must not drop a hidden group's.
65
+ */
66
+ visibleGroups$: ReadonlySignal<Group<unknown, unknown, Record<string, unknown>>[] | undefined>;
67
+ /** The hidden groups, listed at the end of the view to be shown again. */
68
+ hiddenGroups$: ReadonlySignal<Group<unknown, unknown, Record<string, unknown>>[]>;
69
+ /** Whether the view stores hidden groups (every preset of 0.49 does). */
70
+ get groupsCanHide(): boolean;
71
+ /**
72
+ * Hide or show a group for everyone: a view setting, written to the view's
73
+ * `groupProperties` on the gesture, never when nothing changes.
74
+ */
75
+ groupHideSet(groupKey: string, hide: boolean): void;
76
+ /** Whether a group is folded: personal, on this device, never stored. */
77
+ collapsed$(groupKey: string): ReadonlySignal<boolean>;
78
+ collapsedSet(groupKey: string, collapsed: boolean): void;
60
79
  updateData: (data: NonNullable<unknown>) => void;
61
80
  get addGroup(): ((config: import("../index.js").WithCommonPropertyConfig<{
62
81
  text: string;
@@ -69,6 +88,9 @@ export declare class GroupTrait {
69
88
  sortRow: (groupKey: string, rows: Row[]) => Row[];
70
89
  changeGroupSort: (keys: string[]) => void;
71
90
  changeRowSort: (groupKeys: string[], groupKey: string, keys: string[]) => void;
91
+ /** Absent: the view hides no group (ops written before 0.49). */
92
+ groupHidden?: (groupKey: string) => boolean;
93
+ groupHideSet?: (groupKeys: string[], groupKey: string, hide: boolean) => void;
72
94
  });
73
95
  /**
74
96
  * Whether the current grouping reads a date property, and so offers grains