@dxos/plugin-space 0.10.0 → 0.11.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.
Files changed (646) hide show
  1. package/PLUGIN.mdl +11 -0
  2. package/dist/lib/SpacePlugin.mjs +2 -0
  3. package/dist/lib/SpacePlugin.node.mjs +628 -0
  4. package/dist/lib/SpacePlugin.node.mjs.map +1 -0
  5. package/dist/lib/SpacePlugin.workerd.mjs +26 -0
  6. package/dist/lib/SpacePlugin.workerd.mjs.map +1 -0
  7. package/dist/lib/capabilities/node.mjs +10 -0
  8. package/dist/lib/capabilities/node.mjs.map +1 -0
  9. package/dist/lib/capabilities.mjs +24 -0
  10. package/dist/lib/capabilities.mjs.map +1 -0
  11. package/dist/lib/chunk-CollectionArticle.mjs +90 -0
  12. package/dist/lib/chunk-CollectionArticle.mjs.map +1 -0
  13. package/dist/lib/chunk-CollectionSection.mjs +21 -0
  14. package/dist/lib/chunk-CollectionSection.mjs.map +1 -0
  15. package/dist/lib/chunk-CreateObjectDialog.mjs +178 -0
  16. package/dist/lib/chunk-CreateObjectDialog.mjs.map +1 -0
  17. package/dist/lib/chunk-CreateSpaceDialog.mjs +68 -0
  18. package/dist/lib/chunk-CreateSpaceDialog.mjs.map +1 -0
  19. package/dist/lib/chunk-DefaultProperties.mjs +59 -0
  20. package/dist/lib/chunk-DefaultProperties.mjs.map +1 -0
  21. package/dist/lib/chunk-ImportSpaceDialog.mjs +58 -0
  22. package/dist/lib/chunk-ImportSpaceDialog.mjs.map +1 -0
  23. package/dist/lib/chunk-InlineSyncStatus.mjs +37 -0
  24. package/dist/lib/chunk-InlineSyncStatus.mjs.map +1 -0
  25. package/dist/lib/chunk-JoinDialog.mjs +65 -0
  26. package/dist/lib/chunk-JoinDialog.mjs.map +1 -0
  27. package/dist/lib/chunk-MembersContainer.mjs +263 -0
  28. package/dist/lib/chunk-MembersContainer.mjs.map +1 -0
  29. package/dist/lib/chunk-MergePreview.mjs +91 -0
  30. package/dist/lib/chunk-MergePreview.mjs.map +1 -0
  31. package/dist/lib/chunk-ObjectCardStack.mjs +68 -0
  32. package/dist/lib/chunk-ObjectCardStack.mjs.map +1 -0
  33. package/dist/lib/chunk-RecordArticle.mjs +106 -0
  34. package/dist/lib/chunk-RecordArticle.mjs.map +1 -0
  35. package/dist/lib/chunk-RelatedArticle.mjs +71 -0
  36. package/dist/lib/chunk-RelatedArticle.mjs.map +1 -0
  37. package/dist/lib/chunk-RenamePopover.mjs +94 -0
  38. package/dist/lib/chunk-RenamePopover.mjs.map +1 -0
  39. package/dist/lib/chunk-SchemaContainer.mjs +53 -0
  40. package/dist/lib/chunk-SchemaContainer.mjs.map +1 -0
  41. package/dist/lib/chunk-SmallPresenceLive.mjs +2 -0
  42. package/dist/lib/chunk-SpaceHomeArticle.mjs +82 -0
  43. package/dist/lib/chunk-SpaceHomeArticle.mjs.map +1 -0
  44. package/dist/lib/chunk-SpaceHomeDashboard.mjs +96 -0
  45. package/dist/lib/chunk-SpaceHomeDashboard.mjs.map +1 -0
  46. package/dist/lib/chunk-SpaceHomeRecent.mjs +79 -0
  47. package/dist/lib/chunk-SpaceHomeRecent.mjs.map +1 -0
  48. package/dist/lib/chunk-SpacePlugin.mjs +97 -0
  49. package/dist/lib/chunk-SpacePlugin.mjs.map +1 -0
  50. package/dist/lib/chunk-SpacePresence.mjs +155 -0
  51. package/dist/lib/chunk-SpacePresence.mjs.map +1 -0
  52. package/dist/lib/chunk-SpaceSettings.mjs +63 -0
  53. package/dist/lib/chunk-SpaceSettings.mjs.map +1 -0
  54. package/dist/lib/chunk-SpaceSettingsContainer.mjs +278 -0
  55. package/dist/lib/chunk-SpaceSettingsContainer.mjs.map +1 -0
  56. package/dist/lib/chunk-SyncStatus.mjs +166 -0
  57. package/dist/lib/chunk-SyncStatus.mjs.map +1 -0
  58. package/dist/lib/chunk-TypeArticle.mjs +469 -0
  59. package/dist/lib/chunk-TypeArticle.mjs.map +1 -0
  60. package/dist/lib/chunk-ViewEditor.mjs +78 -0
  61. package/dist/lib/chunk-ViewEditor.mjs.map +1 -0
  62. package/dist/lib/chunk-add-object.mjs +74 -0
  63. package/dist/lib/chunk-add-object.mjs.map +1 -0
  64. package/dist/lib/chunk-add-relation.mjs +16 -0
  65. package/dist/lib/chunk-add-relation.mjs.map +1 -0
  66. package/dist/lib/chunk-add-type.mjs +41 -0
  67. package/dist/lib/chunk-add-type.mjs.map +1 -0
  68. package/dist/lib/chunk-app-graph-builder.mjs +1056 -0
  69. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
  70. package/dist/lib/chunk-close.mjs +11 -0
  71. package/dist/lib/chunk-close.mjs.map +1 -0
  72. package/dist/lib/chunk-collection-path.mjs +65 -0
  73. package/dist/lib/chunk-collection-path.mjs.map +1 -0
  74. package/dist/lib/chunk-create-object.mjs +80 -0
  75. package/dist/lib/chunk-create-object.mjs.map +1 -0
  76. package/dist/lib/chunk-create.mjs +62 -0
  77. package/dist/lib/chunk-create.mjs.map +1 -0
  78. package/dist/lib/chunk-definitions.mjs +466 -0
  79. package/dist/lib/chunk-definitions.mjs.map +1 -0
  80. package/dist/lib/chunk-delete-field.mjs +52 -0
  81. package/dist/lib/chunk-delete-field.mjs.map +1 -0
  82. package/dist/lib/chunk-delete.mjs +11 -0
  83. package/dist/lib/chunk-delete.mjs.map +1 -0
  84. package/dist/lib/chunk-duplicate-object.mjs +11 -0
  85. package/dist/lib/chunk-duplicate-object.mjs.map +1 -0
  86. package/dist/lib/chunk-errors.mjs +10 -0
  87. package/dist/lib/chunk-errors.mjs.map +1 -0
  88. package/dist/lib/chunk-export-space.mjs +24 -0
  89. package/dist/lib/chunk-export-space.mjs.map +1 -0
  90. package/dist/lib/chunk-find-duplicates.mjs +19 -0
  91. package/dist/lib/chunk-find-duplicates.mjs.map +1 -0
  92. package/dist/lib/chunk-get-share-link.mjs +29 -0
  93. package/dist/lib/chunk-get-share-link.mjs.map +1 -0
  94. package/dist/lib/chunk-helpers.mjs +14 -0
  95. package/dist/lib/chunk-helpers.mjs.map +1 -0
  96. package/dist/lib/chunk-identity-created.mjs +26 -0
  97. package/dist/lib/chunk-identity-created.mjs.map +1 -0
  98. package/dist/lib/chunk-import-space.mjs +16 -0
  99. package/dist/lib/chunk-import-space.mjs.map +1 -0
  100. package/dist/lib/chunk-join.mjs +35 -0
  101. package/dist/lib/chunk-join.mjs.map +1 -0
  102. package/dist/lib/chunk-merge-duplicates.mjs +62 -0
  103. package/dist/lib/chunk-merge-duplicates.mjs.map +1 -0
  104. package/dist/lib/{neutral/chunk-5ZZS3KMK.mjs → chunk-meta.mjs} +15 -24
  105. package/dist/lib/chunk-meta.mjs.map +1 -0
  106. package/dist/lib/chunk-migrate.mjs +45 -0
  107. package/dist/lib/chunk-migrate.mjs.map +1 -0
  108. package/dist/lib/chunk-navigation-handler.mjs +63 -0
  109. package/dist/lib/chunk-navigation-handler.mjs.map +1 -0
  110. package/dist/lib/chunk-navigation-target-resolver.mjs +79 -0
  111. package/dist/lib/chunk-navigation-target-resolver.mjs.map +1 -0
  112. package/dist/lib/chunk-open-create-object.mjs +32 -0
  113. package/dist/lib/chunk-open-create-object.mjs.map +1 -0
  114. package/dist/lib/chunk-open-create-space.mjs +16 -0
  115. package/dist/lib/chunk-open-create-space.mjs.map +1 -0
  116. package/dist/lib/chunk-open-import-space.mjs +16 -0
  117. package/dist/lib/chunk-open-import-space.mjs.map +1 -0
  118. package/dist/lib/chunk-open-members.mjs +15 -0
  119. package/dist/lib/chunk-open-members.mjs.map +1 -0
  120. package/dist/lib/chunk-open-settings.mjs +15 -0
  121. package/dist/lib/chunk-open-settings.mjs.map +1 -0
  122. package/dist/lib/chunk-open.mjs +11 -0
  123. package/dist/lib/chunk-open.mjs.map +1 -0
  124. package/dist/lib/chunk-operation-handler.mjs +13 -0
  125. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  126. package/dist/lib/chunk-react-root.mjs +20 -0
  127. package/dist/lib/chunk-react-root.mjs.map +1 -0
  128. package/dist/lib/chunk-react-surface.mjs +384 -0
  129. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  130. package/dist/lib/chunk-remove-objects.mjs +83 -0
  131. package/dist/lib/chunk-remove-objects.mjs.map +1 -0
  132. package/dist/lib/chunk-rename-object.mjs +18 -0
  133. package/dist/lib/chunk-rename-object.mjs.map +1 -0
  134. package/dist/lib/chunk-rename.mjs +18 -0
  135. package/dist/lib/chunk-rename.mjs.map +1 -0
  136. package/dist/lib/chunk-repair.mjs +28 -0
  137. package/dist/lib/chunk-repair.mjs.map +1 -0
  138. package/dist/lib/chunk-restore-field.mjs +50 -0
  139. package/dist/lib/chunk-restore-field.mjs.map +1 -0
  140. package/dist/lib/chunk-restore-objects.mjs +33 -0
  141. package/dist/lib/chunk-restore-objects.mjs.map +1 -0
  142. package/dist/lib/chunk-settings.mjs +23 -0
  143. package/dist/lib/chunk-settings.mjs.map +1 -0
  144. package/dist/lib/chunk-share.mjs +23 -0
  145. package/dist/lib/chunk-share.mjs.map +1 -0
  146. package/dist/lib/chunk-snapshot.mjs +24 -0
  147. package/dist/lib/chunk-snapshot.mjs.map +1 -0
  148. package/dist/lib/chunk-spaces-ready.mjs +242 -0
  149. package/dist/lib/chunk-spaces-ready.mjs.map +1 -0
  150. package/dist/lib/chunk-state.mjs +48 -0
  151. package/dist/lib/chunk-state.mjs.map +1 -0
  152. package/dist/lib/chunk-types.mjs +56 -0
  153. package/dist/lib/chunk-types.mjs.map +1 -0
  154. package/dist/lib/chunk-undo-mappings.mjs +40 -0
  155. package/dist/lib/chunk-undo-mappings.mjs.map +1 -0
  156. package/dist/lib/chunk-util.mjs +34 -0
  157. package/dist/lib/chunk-util.mjs.map +1 -0
  158. package/dist/lib/chunk-wait-for-object.mjs +16 -0
  159. package/dist/lib/chunk-wait-for-object.mjs.map +1 -0
  160. package/dist/lib/components.mjs +329 -0
  161. package/dist/lib/components.mjs.map +1 -0
  162. package/dist/lib/{neutral/chunk-C2ULK22J.mjs → constants.mjs} +5 -10
  163. package/dist/lib/constants.mjs.map +1 -0
  164. package/dist/lib/containers.mjs +31 -0
  165. package/dist/lib/containers.mjs.map +1 -0
  166. package/dist/lib/hooks.mjs +185 -0
  167. package/dist/lib/hooks.mjs.map +1 -0
  168. package/dist/lib/index.mjs +7 -0
  169. package/dist/lib/meta.mjs +2 -0
  170. package/dist/lib/operations.mjs +8 -0
  171. package/dist/lib/operations.mjs.map +1 -0
  172. package/dist/lib/plugin.mjs +9 -0
  173. package/dist/lib/plugin.mjs.map +1 -0
  174. package/dist/lib/testing.mjs +2 -0
  175. package/dist/lib/translations.mjs +350 -0
  176. package/dist/lib/translations.mjs.map +1 -0
  177. package/dist/lib/types.mjs +60 -0
  178. package/dist/lib/types.mjs.map +1 -0
  179. package/dist/types/src/SpacePlugin.workerd.d.ts.map +1 -1
  180. package/dist/types/src/capabilities/SpaceFormFields.d.ts +10 -0
  181. package/dist/types/src/capabilities/SpaceFormFields.d.ts.map +1 -0
  182. package/dist/types/src/capabilities/SpaceSurfaces.d.ts +50 -0
  183. package/dist/types/src/capabilities/SpaceSurfaces.d.ts.map +1 -0
  184. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -1
  185. package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts +6 -1
  186. package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts.map +1 -1
  187. package/dist/types/src/capabilities/app-graph-builder/extensions/companions.d.ts +1 -1
  188. package/dist/types/src/capabilities/app-graph-builder/extensions/companions.d.ts.map +1 -1
  189. package/dist/types/src/capabilities/app-graph-builder/extensions/database.d.ts +7 -1
  190. package/dist/types/src/capabilities/app-graph-builder/extensions/database.d.ts.map +1 -1
  191. package/dist/types/src/capabilities/app-graph-builder/extensions/settings.d.ts +2 -7
  192. package/dist/types/src/capabilities/app-graph-builder/extensions/settings.d.ts.map +1 -1
  193. package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts +3 -2
  194. package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts.map +1 -1
  195. package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts +5 -0
  196. package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts.map +1 -1
  197. package/dist/types/src/capabilities/create-object.d.ts +1 -1
  198. package/dist/types/src/capabilities/identity-created.d.ts +1 -1
  199. package/dist/types/src/capabilities/index.d.ts +1 -1
  200. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  201. package/dist/types/src/capabilities/navigation-handler/navigation-handler.d.ts +3 -1
  202. package/dist/types/src/capabilities/navigation-handler/navigation-handler.d.ts.map +1 -1
  203. package/dist/types/src/capabilities/navigation-target-resolver.d.ts +5 -0
  204. package/dist/types/src/capabilities/navigation-target-resolver.d.ts.map +1 -0
  205. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  206. package/dist/types/src/capabilities/react-root.d.ts +1 -1
  207. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  208. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  209. package/dist/types/src/capabilities/repair.d.ts +1 -1
  210. package/dist/types/src/capabilities/settings.d.ts +1 -1
  211. package/dist/types/src/capabilities/spaces-ready.d.ts +1 -1
  212. package/dist/types/src/capabilities/state.d.ts +1 -1
  213. package/dist/types/src/capabilities/try-get-view.d.ts +7 -0
  214. package/dist/types/src/capabilities/try-get-view.d.ts.map +1 -0
  215. package/dist/types/src/capabilities/undo-mappings.d.ts +1 -1
  216. package/dist/types/src/collection-path.d.ts +28 -0
  217. package/dist/types/src/collection-path.d.ts.map +1 -0
  218. package/dist/types/src/collection-path.test.d.ts +2 -0
  219. package/dist/types/src/collection-path.test.d.ts.map +1 -0
  220. package/dist/types/src/commands/space/export/export.d.ts +23 -0
  221. package/dist/types/src/commands/space/export/export.d.ts.map +1 -0
  222. package/dist/types/src/commands/space/export/export.test.d.ts +2 -0
  223. package/dist/types/src/commands/space/export/export.test.d.ts.map +1 -0
  224. package/dist/types/src/commands/space/export/index.d.ts +2 -0
  225. package/dist/types/src/commands/space/export/index.d.ts.map +1 -0
  226. package/dist/types/src/commands/space/import/import.d.ts +17 -0
  227. package/dist/types/src/commands/space/import/import.d.ts.map +1 -0
  228. package/dist/types/src/commands/space/import/import.test.d.ts +2 -0
  229. package/dist/types/src/commands/space/import/import.test.d.ts.map +1 -0
  230. package/dist/types/src/commands/space/import/index.d.ts +2 -0
  231. package/dist/types/src/commands/space/import/index.d.ts.map +1 -0
  232. package/dist/types/src/commands/space/index.d.ts +8 -1
  233. package/dist/types/src/commands/space/index.d.ts.map +1 -1
  234. package/dist/types/src/components/AwaitingObject/AwaitingObject.d.ts.map +1 -1
  235. package/dist/types/src/components/SyncStatus/status.d.ts +7 -4
  236. package/dist/types/src/components/SyncStatus/status.d.ts.map +1 -1
  237. package/dist/types/src/components/SyncStatus/status.test.d.ts +2 -0
  238. package/dist/types/src/components/SyncStatus/status.test.d.ts.map +1 -0
  239. package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts +4 -4
  240. package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts.map +1 -1
  241. package/dist/types/src/containers/CollectionSection/CollectionSection.d.ts +4 -1
  242. package/dist/types/src/containers/CollectionSection/CollectionSection.d.ts.map +1 -1
  243. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts +4 -1
  244. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts.map +1 -1
  245. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.stories.d.ts +420 -9
  246. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  247. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.d.ts +4 -1
  248. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.d.ts.map +1 -1
  249. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.stories.d.ts +423 -10
  250. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.stories.d.ts.map +1 -1
  251. package/dist/types/src/containers/ImportSpaceDialog/ImportSpaceDialog.d.ts +4 -1
  252. package/dist/types/src/containers/ImportSpaceDialog/ImportSpaceDialog.d.ts.map +1 -1
  253. package/dist/types/src/containers/InlineSyncStatus/InlineSyncStatus.d.ts +5 -2
  254. package/dist/types/src/containers/InlineSyncStatus/InlineSyncStatus.d.ts.map +1 -1
  255. package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts +4 -1
  256. package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts.map +1 -1
  257. package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts +423 -10
  258. package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts.map +1 -1
  259. package/dist/types/src/containers/MembersContainer/MembersContainer.d.ts +4 -1
  260. package/dist/types/src/containers/MembersContainer/MembersContainer.d.ts.map +1 -1
  261. package/dist/types/src/containers/MergePreview/MergePreview.d.ts +16 -0
  262. package/dist/types/src/containers/MergePreview/MergePreview.d.ts.map +1 -0
  263. package/dist/types/src/containers/MergePreview/index.d.ts +2 -0
  264. package/dist/types/src/containers/MergePreview/index.d.ts.map +1 -0
  265. package/dist/types/src/containers/ObjectCardStack/ObjectCardStack.d.ts +3 -2
  266. package/dist/types/src/containers/ObjectCardStack/ObjectCardStack.d.ts.map +1 -1
  267. package/dist/types/src/containers/RecordArticle/RecordArticle.d.ts +4 -1
  268. package/dist/types/src/containers/RecordArticle/RecordArticle.d.ts.map +1 -1
  269. package/dist/types/src/containers/RecordArticle/RecordArticle.stories.d.ts.map +1 -1
  270. package/dist/types/src/containers/RelatedArticle/RelatedArticle.d.ts +4 -1
  271. package/dist/types/src/containers/RelatedArticle/RelatedArticle.d.ts.map +1 -1
  272. package/dist/types/src/containers/RenamePopover/RenamePopover.d.ts +4 -4
  273. package/dist/types/src/containers/RenamePopover/RenamePopover.d.ts.map +1 -1
  274. package/dist/types/src/containers/SchemaContainer/SchemaContainer.d.ts +4 -7
  275. package/dist/types/src/containers/SchemaContainer/SchemaContainer.d.ts.map +1 -1
  276. package/dist/types/src/containers/SchemaContainer/use-query-space-types.d.ts +7 -0
  277. package/dist/types/src/containers/SchemaContainer/use-query-space-types.d.ts.map +1 -0
  278. package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.d.ts +4 -11
  279. package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.d.ts.map +1 -1
  280. package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.stories.d.ts +14 -0
  281. package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.stories.d.ts.map +1 -0
  282. package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.d.ts +15 -0
  283. package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.d.ts.map +1 -0
  284. package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.stories.d.ts +20 -0
  285. package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.stories.d.ts.map +1 -0
  286. package/dist/types/src/containers/SpaceHomeDashboard/index.d.ts +2 -0
  287. package/dist/types/src/containers/SpaceHomeDashboard/index.d.ts.map +1 -0
  288. package/dist/types/src/containers/SpaceHomeRecent/SpaceHomeRecent.d.ts +5 -8
  289. package/dist/types/src/containers/SpaceHomeRecent/SpaceHomeRecent.d.ts.map +1 -1
  290. package/dist/types/src/containers/SpacePresence/SpacePresence.d.ts +7 -4
  291. package/dist/types/src/containers/SpacePresence/SpacePresence.d.ts.map +1 -1
  292. package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts +419 -9
  293. package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts.map +1 -1
  294. package/dist/types/src/containers/SpaceSettings/SpaceSettings.d.ts +4 -1
  295. package/dist/types/src/containers/SpaceSettings/SpaceSettings.d.ts.map +1 -1
  296. package/dist/types/src/containers/SpaceSettings/SpaceSettings.stories.d.ts +423 -10
  297. package/dist/types/src/containers/SpaceSettings/SpaceSettings.stories.d.ts.map +1 -1
  298. package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts +419 -9
  299. package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts.map +1 -1
  300. package/dist/types/src/containers/SyncStatus/SyncStatus.d.ts +7 -2
  301. package/dist/types/src/containers/SyncStatus/SyncStatus.d.ts.map +1 -1
  302. package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts +434 -11
  303. package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  304. package/dist/types/src/containers/TypeArticle/TypeArticle.d.ts +14 -0
  305. package/dist/types/src/containers/TypeArticle/TypeArticle.d.ts.map +1 -0
  306. package/dist/types/src/containers/TypeArticle/TypeArticle.stories.d.ts +45 -0
  307. package/dist/types/src/containers/TypeArticle/TypeArticle.stories.d.ts.map +1 -0
  308. package/dist/types/src/containers/TypeArticle/duplicatesGroup.d.ts +19 -0
  309. package/dist/types/src/containers/TypeArticle/duplicatesGroup.d.ts.map +1 -0
  310. package/dist/types/src/containers/TypeArticle/index.d.ts +2 -0
  311. package/dist/types/src/containers/TypeArticle/index.d.ts.map +1 -0
  312. package/dist/types/src/containers/TypeArticle/useDuplicates.d.ts +34 -0
  313. package/dist/types/src/containers/TypeArticle/useDuplicates.d.ts.map +1 -0
  314. package/dist/types/src/containers/ViewEditor/ViewEditor.d.ts +4 -1
  315. package/dist/types/src/containers/ViewEditor/ViewEditor.d.ts.map +1 -1
  316. package/dist/types/src/containers/index.d.ts +3 -2
  317. package/dist/types/src/containers/index.d.ts.map +1 -1
  318. package/dist/types/src/errors.d.ts +30 -0
  319. package/dist/types/src/errors.d.ts.map +1 -1
  320. package/dist/types/src/hooks/index.d.ts +2 -0
  321. package/dist/types/src/hooks/index.d.ts.map +1 -1
  322. package/dist/types/src/hooks/useEdgeStatus.d.ts +6 -0
  323. package/dist/types/src/hooks/useEdgeStatus.d.ts.map +1 -0
  324. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  325. package/dist/types/src/hooks/useStalled.d.ts +13 -0
  326. package/dist/types/src/hooks/useStalled.d.ts.map +1 -0
  327. package/dist/types/src/operations/create.d.ts.map +1 -1
  328. package/dist/types/src/operations/definitions.d.ts +29 -1
  329. package/dist/types/src/operations/definitions.d.ts.map +1 -1
  330. package/dist/types/src/operations/find-duplicates.d.ts +5 -0
  331. package/dist/types/src/operations/find-duplicates.d.ts.map +1 -0
  332. package/dist/types/src/operations/helpers.d.ts +3 -0
  333. package/dist/types/src/operations/helpers.d.ts.map +1 -1
  334. package/dist/types/src/operations/index.d.ts.map +1 -1
  335. package/dist/types/src/operations/join.d.ts.map +1 -1
  336. package/dist/types/src/operations/merge-duplicates.d.ts +5 -0
  337. package/dist/types/src/operations/merge-duplicates.d.ts.map +1 -0
  338. package/dist/types/src/operations/open-settings.d.ts.map +1 -1
  339. package/dist/types/src/operations/remove-objects.d.ts.map +1 -1
  340. package/dist/types/src/translations.d.ts +419 -9
  341. package/dist/types/src/translations.d.ts.map +1 -1
  342. package/dist/types/src/type-section-path.d.ts +22 -0
  343. package/dist/types/src/type-section-path.d.ts.map +1 -0
  344. package/dist/types/src/type-section-path.test.d.ts +2 -0
  345. package/dist/types/src/type-section-path.test.d.ts.map +1 -0
  346. package/dist/types/src/types/capabilities.d.ts +22 -2
  347. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  348. package/dist/types/src/types/surface.d.ts +4 -4
  349. package/dist/types/src/types/surface.d.ts.map +1 -1
  350. package/dist/types/src/types/types.d.ts +6 -0
  351. package/dist/types/src/types/types.d.ts.map +1 -1
  352. package/dist/types/tsconfig.tsbuildinfo +1 -1
  353. package/package.json +87 -72
  354. package/src/SpacePlugin.ts +6 -6
  355. package/src/SpacePlugin.workerd.ts +3 -1
  356. package/src/capabilities/SpaceFormFields.tsx +72 -0
  357. package/src/capabilities/SpaceSurfaces.tsx +219 -0
  358. package/src/capabilities/app-graph-builder/extensions/collections.ts +74 -21
  359. package/src/capabilities/app-graph-builder/extensions/companions.ts +10 -5
  360. package/src/capabilities/app-graph-builder/extensions/database.ts +64 -57
  361. package/src/capabilities/app-graph-builder/extensions/settings.ts +23 -13
  362. package/src/capabilities/app-graph-builder/extensions/shared.ts +3 -2
  363. package/src/capabilities/app-graph-builder/extensions/spaces.ts +6 -7
  364. package/src/capabilities/create-object.ts +1 -14
  365. package/src/capabilities/index.ts +4 -1
  366. package/src/capabilities/navigation-handler/navigation-handler.ts +27 -7
  367. package/src/capabilities/navigation-target-resolver.ts +77 -0
  368. package/src/capabilities/react-surface.ts +274 -0
  369. package/src/capabilities/spaces-ready.ts +31 -18
  370. package/src/capabilities/state.ts +3 -1
  371. package/src/capabilities/try-get-view.ts +24 -0
  372. package/src/collection-path.test.ts +161 -0
  373. package/src/collection-path.ts +97 -0
  374. package/src/commands/space/export/export.test.ts +68 -0
  375. package/src/commands/space/export/export.ts +118 -0
  376. package/src/commands/space/export/index.ts +5 -0
  377. package/src/commands/space/import/import.test.ts +80 -0
  378. package/src/commands/space/import/import.ts +65 -0
  379. package/src/commands/space/import/index.ts +5 -0
  380. package/src/commands/space/index.ts +16 -1
  381. package/src/components/AwaitingObject/AwaitingObject.tsx +10 -4
  382. package/src/components/CreateObjectPanel/CreateObjectPanel.tsx +16 -18
  383. package/src/components/SyncStatus/status.test.ts +49 -0
  384. package/src/components/SyncStatus/status.ts +25 -12
  385. package/src/containers/CollectionArticle/CollectionArticle.tsx +5 -3
  386. package/src/containers/CollectionSection/CollectionSection.tsx +2 -0
  387. package/src/containers/CreateObjectDialog/CreateObjectDialog.stories.tsx +18 -4
  388. package/src/containers/CreateObjectDialog/CreateObjectDialog.tsx +13 -17
  389. package/src/containers/CreateSpaceDialog/CreateSpaceDialog.tsx +28 -19
  390. package/src/containers/DefaultProperties/DefaultProperties.tsx +4 -2
  391. package/src/containers/ImportSpaceDialog/ImportSpaceDialog.tsx +4 -2
  392. package/src/containers/InlineSyncStatus/InlineSyncStatus.tsx +7 -17
  393. package/src/containers/JoinDialog/JoinDialog.tsx +5 -3
  394. package/src/containers/MembersContainer/MembersContainer.tsx +2 -0
  395. package/src/containers/MergePreview/MergePreview.tsx +90 -0
  396. package/src/containers/MergePreview/index.ts +5 -0
  397. package/src/containers/ObjectCardStack/ObjectCardStack.tsx +46 -43
  398. package/src/containers/RecordArticle/RecordArticle.stories.tsx +2 -1
  399. package/src/containers/RecordArticle/RecordArticle.tsx +8 -4
  400. package/src/containers/RelatedArticle/RelatedArticle.tsx +7 -3
  401. package/src/containers/RenamePopover/RenamePopover.tsx +2 -0
  402. package/src/containers/SchemaContainer/SchemaContainer.tsx +4 -17
  403. package/src/containers/SchemaContainer/use-query-space-types.ts +28 -0
  404. package/src/containers/SpaceHomeArticle/SpaceHomeArticle.stories.tsx +116 -0
  405. package/src/containers/SpaceHomeArticle/SpaceHomeArticle.tsx +6 -5
  406. package/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.stories.tsx +99 -0
  407. package/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.tsx +109 -0
  408. package/src/containers/SpaceHomeDashboard/index.ts +5 -0
  409. package/src/containers/SpaceHomeRecent/SpaceHomeRecent.tsx +17 -15
  410. package/src/containers/SpacePresence/SpacePresence.stories.tsx +4 -4
  411. package/src/containers/SpacePresence/SpacePresence.tsx +37 -36
  412. package/src/containers/SpaceSettings/SpaceSettings.tsx +3 -1
  413. package/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.tsx +7 -2
  414. package/src/containers/SyncStatus/SyncStatus.stories.tsx +80 -1
  415. package/src/containers/SyncStatus/SyncStatus.tsx +36 -46
  416. package/src/containers/TypeArticle/TypeArticle.stories.tsx +249 -0
  417. package/src/containers/TypeArticle/TypeArticle.tsx +362 -0
  418. package/src/containers/TypeArticle/duplicatesGroup.tsx +150 -0
  419. package/src/containers/TypeArticle/index.ts +5 -0
  420. package/src/containers/TypeArticle/useDuplicates.ts +119 -0
  421. package/src/containers/ViewEditor/ViewEditor.tsx +3 -1
  422. package/src/containers/index.ts +3 -2
  423. package/src/errors.ts +6 -0
  424. package/src/hooks/index.ts +2 -0
  425. package/src/hooks/useEdgeStatus.ts +40 -0
  426. package/src/hooks/useInputSurfaceLookup.tsx +5 -4
  427. package/src/hooks/useRelatedObjects.ts +1 -1
  428. package/src/hooks/useStalled.ts +39 -0
  429. package/src/operations/add-object.ts +7 -7
  430. package/src/operations/create.ts +11 -3
  431. package/src/operations/definitions.ts +54 -1
  432. package/src/operations/find-duplicates.ts +33 -0
  433. package/src/operations/get-share-link.ts +1 -1
  434. package/src/operations/helpers.ts +11 -0
  435. package/src/operations/index.ts +2 -0
  436. package/src/operations/join.ts +6 -5
  437. package/src/operations/merge-duplicates.ts +51 -0
  438. package/src/operations/open-members.ts +3 -3
  439. package/src/operations/open-settings.ts +5 -3
  440. package/src/operations/remove-objects.ts +42 -3
  441. package/src/translations.ts +52 -11
  442. package/src/type-section-path.test.ts +48 -0
  443. package/src/type-section-path.ts +39 -0
  444. package/src/types/capabilities.ts +26 -2
  445. package/src/types/surface.ts +4 -8
  446. package/src/types/types.ts +7 -0
  447. package/dist/lib/neutral/CollectionArticle-BMH7SZ7Q.mjs +0 -93
  448. package/dist/lib/neutral/CollectionArticle-BMH7SZ7Q.mjs.map +0 -7
  449. package/dist/lib/neutral/CollectionSection-BLYTGOKH.mjs +0 -19
  450. package/dist/lib/neutral/CollectionSection-BLYTGOKH.mjs.map +0 -7
  451. package/dist/lib/neutral/CreateObjectDialog-5454N3FJ.mjs +0 -221
  452. package/dist/lib/neutral/CreateObjectDialog-5454N3FJ.mjs.map +0 -7
  453. package/dist/lib/neutral/CreateSpaceDialog-WWNUTLVK.mjs +0 -61
  454. package/dist/lib/neutral/CreateSpaceDialog-WWNUTLVK.mjs.map +0 -7
  455. package/dist/lib/neutral/DefaultProperties-5SAWQC6I.mjs +0 -58
  456. package/dist/lib/neutral/DefaultProperties-5SAWQC6I.mjs.map +0 -7
  457. package/dist/lib/neutral/ImportSpaceDialog-CSSRTFAO.mjs +0 -64
  458. package/dist/lib/neutral/ImportSpaceDialog-CSSRTFAO.mjs.map +0 -7
  459. package/dist/lib/neutral/InlineSyncStatus-UOUTAPCU.mjs +0 -49
  460. package/dist/lib/neutral/InlineSyncStatus-UOUTAPCU.mjs.map +0 -7
  461. package/dist/lib/neutral/JoinDialog-ATNUCNL2.mjs +0 -97
  462. package/dist/lib/neutral/JoinDialog-ATNUCNL2.mjs.map +0 -7
  463. package/dist/lib/neutral/MembersContainer-C4ZTP6ZW.mjs +0 -231
  464. package/dist/lib/neutral/MembersContainer-C4ZTP6ZW.mjs.map +0 -7
  465. package/dist/lib/neutral/MenuFooter-FWE5LFM4.mjs +0 -33
  466. package/dist/lib/neutral/MenuFooter-FWE5LFM4.mjs.map +0 -7
  467. package/dist/lib/neutral/ObjectCardStack-DHVDRNRK.mjs +0 -55
  468. package/dist/lib/neutral/ObjectCardStack-DHVDRNRK.mjs.map +0 -7
  469. package/dist/lib/neutral/RecordArticle-JSORXRAA.mjs +0 -102
  470. package/dist/lib/neutral/RecordArticle-JSORXRAA.mjs.map +0 -7
  471. package/dist/lib/neutral/RelatedArticle-Z777WVDW.mjs +0 -69
  472. package/dist/lib/neutral/RelatedArticle-Z777WVDW.mjs.map +0 -7
  473. package/dist/lib/neutral/RenamePopover-AZT2KPOF.mjs +0 -104
  474. package/dist/lib/neutral/RenamePopover-AZT2KPOF.mjs.map +0 -7
  475. package/dist/lib/neutral/SchemaContainer-4GJKQBXM.mjs +0 -53
  476. package/dist/lib/neutral/SchemaContainer-4GJKQBXM.mjs.map +0 -7
  477. package/dist/lib/neutral/SmallPresenceLive-FW3AMEY5.mjs +0 -8
  478. package/dist/lib/neutral/SmallPresenceLive-FW3AMEY5.mjs.map +0 -7
  479. package/dist/lib/neutral/SpaceHomeArticle-Y47TLZ72.mjs +0 -78
  480. package/dist/lib/neutral/SpaceHomeArticle-Y47TLZ72.mjs.map +0 -7
  481. package/dist/lib/neutral/SpaceHomeRecent-S57AO3EV.mjs +0 -89
  482. package/dist/lib/neutral/SpaceHomeRecent-S57AO3EV.mjs.map +0 -7
  483. package/dist/lib/neutral/SpacePlugin.mjs +0 -10
  484. package/dist/lib/neutral/SpacePlugin.mjs.map +0 -7
  485. package/dist/lib/neutral/SpacePlugin.node.mjs +0 -838
  486. package/dist/lib/neutral/SpacePlugin.node.mjs.map +0 -7
  487. package/dist/lib/neutral/SpacePlugin.workerd.mjs +0 -34
  488. package/dist/lib/neutral/SpacePlugin.workerd.mjs.map +0 -7
  489. package/dist/lib/neutral/SpacePresence-T37WH43Y.mjs +0 -11
  490. package/dist/lib/neutral/SpacePresence-T37WH43Y.mjs.map +0 -7
  491. package/dist/lib/neutral/SpaceSettings-6CZF7GEO.mjs +0 -60
  492. package/dist/lib/neutral/SpaceSettings-6CZF7GEO.mjs.map +0 -7
  493. package/dist/lib/neutral/SpaceSettingsContainer-72CJWELM.mjs +0 -279
  494. package/dist/lib/neutral/SpaceSettingsContainer-72CJWELM.mjs.map +0 -7
  495. package/dist/lib/neutral/SyncStatus-J7CHLO5O.mjs +0 -147
  496. package/dist/lib/neutral/SyncStatus-J7CHLO5O.mjs.map +0 -7
  497. package/dist/lib/neutral/TypeCollectionArticle-W76ADS2G.mjs +0 -143
  498. package/dist/lib/neutral/TypeCollectionArticle-W76ADS2G.mjs.map +0 -7
  499. package/dist/lib/neutral/ViewEditor-QXRUOKXR.mjs +0 -101
  500. package/dist/lib/neutral/ViewEditor-QXRUOKXR.mjs.map +0 -7
  501. package/dist/lib/neutral/add-object-H2N4AOQJ.mjs +0 -77
  502. package/dist/lib/neutral/add-object-H2N4AOQJ.mjs.map +0 -7
  503. package/dist/lib/neutral/add-relation-BGTLART5.mjs +0 -26
  504. package/dist/lib/neutral/add-relation-BGTLART5.mjs.map +0 -7
  505. package/dist/lib/neutral/add-type-JIDLRANR.mjs +0 -57
  506. package/dist/lib/neutral/add-type-JIDLRANR.mjs.map +0 -7
  507. package/dist/lib/neutral/app-graph-builder-7H2KOD4B.mjs +0 -1332
  508. package/dist/lib/neutral/app-graph-builder-7H2KOD4B.mjs.map +0 -7
  509. package/dist/lib/neutral/capabilities/index.mjs +0 -46
  510. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  511. package/dist/lib/neutral/capabilities/node.mjs +0 -15
  512. package/dist/lib/neutral/capabilities/node.mjs.map +0 -7
  513. package/dist/lib/neutral/chunk-52ASDNRA.mjs +0 -41
  514. package/dist/lib/neutral/chunk-52ASDNRA.mjs.map +0 -7
  515. package/dist/lib/neutral/chunk-5ZZS3KMK.mjs.map +0 -7
  516. package/dist/lib/neutral/chunk-C2ULK22J.mjs.map +0 -7
  517. package/dist/lib/neutral/chunk-F5KLUP2P.mjs +0 -115
  518. package/dist/lib/neutral/chunk-F5KLUP2P.mjs.map +0 -7
  519. package/dist/lib/neutral/chunk-G2KHP7FX.mjs +0 -8
  520. package/dist/lib/neutral/chunk-G2KHP7FX.mjs.map +0 -7
  521. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  522. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  523. package/dist/lib/neutral/chunk-LMUG6PEJ.mjs +0 -572
  524. package/dist/lib/neutral/chunk-LMUG6PEJ.mjs.map +0 -7
  525. package/dist/lib/neutral/chunk-RAAHDTVF.mjs +0 -167
  526. package/dist/lib/neutral/chunk-RAAHDTVF.mjs.map +0 -7
  527. package/dist/lib/neutral/chunk-SPWAMXNR.mjs +0 -131
  528. package/dist/lib/neutral/chunk-SPWAMXNR.mjs.map +0 -7
  529. package/dist/lib/neutral/chunk-U5WTDOMV.mjs +0 -8
  530. package/dist/lib/neutral/chunk-U5WTDOMV.mjs.map +0 -7
  531. package/dist/lib/neutral/chunk-V7JALUM3.mjs +0 -9
  532. package/dist/lib/neutral/chunk-V7JALUM3.mjs.map +0 -7
  533. package/dist/lib/neutral/close-5WEQZRNK.mjs +0 -17
  534. package/dist/lib/neutral/close-5WEQZRNK.mjs.map +0 -7
  535. package/dist/lib/neutral/components/index.mjs +0 -401
  536. package/dist/lib/neutral/components/index.mjs.map +0 -7
  537. package/dist/lib/neutral/constants.mjs +0 -16
  538. package/dist/lib/neutral/constants.mjs.map +0 -7
  539. package/dist/lib/neutral/containers/index.mjs +0 -55
  540. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  541. package/dist/lib/neutral/create-QZ47FHQU.mjs +0 -75
  542. package/dist/lib/neutral/create-QZ47FHQU.mjs.map +0 -7
  543. package/dist/lib/neutral/create-object-ZU6FZW5X.mjs +0 -96
  544. package/dist/lib/neutral/create-object-ZU6FZW5X.mjs.map +0 -7
  545. package/dist/lib/neutral/delete-SPCU2VFM.mjs +0 -17
  546. package/dist/lib/neutral/delete-SPCU2VFM.mjs.map +0 -7
  547. package/dist/lib/neutral/delete-field-TAKJVEAD.mjs +0 -42
  548. package/dist/lib/neutral/delete-field-TAKJVEAD.mjs.map +0 -7
  549. package/dist/lib/neutral/duplicate-object-BUPZOO6S.mjs +0 -17
  550. package/dist/lib/neutral/duplicate-object-BUPZOO6S.mjs.map +0 -7
  551. package/dist/lib/neutral/export-space-S5SCAL4M.mjs +0 -34
  552. package/dist/lib/neutral/export-space-S5SCAL4M.mjs.map +0 -7
  553. package/dist/lib/neutral/get-share-link-CLM5IQRL.mjs +0 -41
  554. package/dist/lib/neutral/get-share-link-CLM5IQRL.mjs.map +0 -7
  555. package/dist/lib/neutral/hooks/index.mjs +0 -133
  556. package/dist/lib/neutral/hooks/index.mjs.map +0 -7
  557. package/dist/lib/neutral/identity-created-BEYMLBK4.mjs +0 -32
  558. package/dist/lib/neutral/identity-created-BEYMLBK4.mjs.map +0 -7
  559. package/dist/lib/neutral/import-space-LJQK3KT7.mjs +0 -28
  560. package/dist/lib/neutral/import-space-LJQK3KT7.mjs.map +0 -7
  561. package/dist/lib/neutral/index.mjs +0 -62
  562. package/dist/lib/neutral/index.mjs.map +0 -7
  563. package/dist/lib/neutral/join-FSODYIOC.mjs +0 -54
  564. package/dist/lib/neutral/join-FSODYIOC.mjs.map +0 -7
  565. package/dist/lib/neutral/meta.json +0 -1
  566. package/dist/lib/neutral/meta.mjs +0 -8
  567. package/dist/lib/neutral/meta.mjs.map +0 -7
  568. package/dist/lib/neutral/migrate-WHM6LU7L.mjs +0 -52
  569. package/dist/lib/neutral/migrate-WHM6LU7L.mjs.map +0 -7
  570. package/dist/lib/neutral/navigation-handler-ZF7MV2HL.mjs +0 -44
  571. package/dist/lib/neutral/navigation-handler-ZF7MV2HL.mjs.map +0 -7
  572. package/dist/lib/neutral/navigation-resolver-KBESOSWU.mjs +0 -82
  573. package/dist/lib/neutral/navigation-resolver-KBESOSWU.mjs.map +0 -7
  574. package/dist/lib/neutral/open-JCXTL3SK.mjs +0 -17
  575. package/dist/lib/neutral/open-JCXTL3SK.mjs.map +0 -7
  576. package/dist/lib/neutral/open-create-object-WAIAU7TA.mjs +0 -42
  577. package/dist/lib/neutral/open-create-object-WAIAU7TA.mjs.map +0 -7
  578. package/dist/lib/neutral/open-create-space-VU47FWPZ.mjs +0 -24
  579. package/dist/lib/neutral/open-create-space-VU47FWPZ.mjs.map +0 -7
  580. package/dist/lib/neutral/open-import-space-GUHIEWYB.mjs +0 -24
  581. package/dist/lib/neutral/open-import-space-GUHIEWYB.mjs.map +0 -7
  582. package/dist/lib/neutral/open-members-MLLBHKUU.mjs +0 -23
  583. package/dist/lib/neutral/open-members-MLLBHKUU.mjs.map +0 -7
  584. package/dist/lib/neutral/open-settings-DTPZF4U4.mjs +0 -23
  585. package/dist/lib/neutral/open-settings-DTPZF4U4.mjs.map +0 -7
  586. package/dist/lib/neutral/operation-handler-YPIRQOH2.mjs +0 -13
  587. package/dist/lib/neutral/operation-handler-YPIRQOH2.mjs.map +0 -7
  588. package/dist/lib/neutral/operations/index.mjs +0 -13
  589. package/dist/lib/neutral/operations/index.mjs.map +0 -7
  590. package/dist/lib/neutral/plugin.mjs +0 -18
  591. package/dist/lib/neutral/plugin.mjs.map +0 -7
  592. package/dist/lib/neutral/react-root-YLYRCSAZ.mjs +0 -23
  593. package/dist/lib/neutral/react-root-YLYRCSAZ.mjs.map +0 -7
  594. package/dist/lib/neutral/react-surface-LRA7GIFN.mjs +0 -367
  595. package/dist/lib/neutral/react-surface-LRA7GIFN.mjs.map +0 -7
  596. package/dist/lib/neutral/remove-objects-WEO66EDS.mjs +0 -55
  597. package/dist/lib/neutral/remove-objects-WEO66EDS.mjs.map +0 -7
  598. package/dist/lib/neutral/rename-Q6UNCBIM.mjs +0 -26
  599. package/dist/lib/neutral/rename-Q6UNCBIM.mjs.map +0 -7
  600. package/dist/lib/neutral/rename-object-2UCEGU7U.mjs +0 -26
  601. package/dist/lib/neutral/rename-object-2UCEGU7U.mjs.map +0 -7
  602. package/dist/lib/neutral/repair-HMH476U3.mjs +0 -32
  603. package/dist/lib/neutral/repair-HMH476U3.mjs.map +0 -7
  604. package/dist/lib/neutral/restore-field-6CQAFOXY.mjs +0 -40
  605. package/dist/lib/neutral/restore-field-6CQAFOXY.mjs.map +0 -7
  606. package/dist/lib/neutral/restore-objects-3VINLP7C.mjs +0 -39
  607. package/dist/lib/neutral/restore-objects-3VINLP7C.mjs.map +0 -7
  608. package/dist/lib/neutral/settings-5IBSYBVU.mjs +0 -28
  609. package/dist/lib/neutral/settings-5IBSYBVU.mjs.map +0 -7
  610. package/dist/lib/neutral/share-A4WPILNF.mjs +0 -31
  611. package/dist/lib/neutral/share-A4WPILNF.mjs.map +0 -7
  612. package/dist/lib/neutral/snapshot-HBYMAPA7.mjs +0 -30
  613. package/dist/lib/neutral/snapshot-HBYMAPA7.mjs.map +0 -7
  614. package/dist/lib/neutral/spaces-ready-GWMSU72V.mjs +0 -281
  615. package/dist/lib/neutral/spaces-ready-GWMSU72V.mjs.map +0 -7
  616. package/dist/lib/neutral/state-KMH2NUAL.mjs +0 -55
  617. package/dist/lib/neutral/state-KMH2NUAL.mjs.map +0 -7
  618. package/dist/lib/neutral/testing.mjs +0 -8
  619. package/dist/lib/neutral/testing.mjs.map +0 -7
  620. package/dist/lib/neutral/translations.mjs +0 -315
  621. package/dist/lib/neutral/translations.mjs.map +0 -7
  622. package/dist/lib/neutral/types/index.mjs +0 -40
  623. package/dist/lib/neutral/types/index.mjs.map +0 -7
  624. package/dist/lib/neutral/undo-mappings-P43EAUGI.mjs +0 -68
  625. package/dist/lib/neutral/undo-mappings-P43EAUGI.mjs.map +0 -7
  626. package/dist/lib/neutral/wait-for-object-U6P2NNWY.mjs +0 -23
  627. package/dist/lib/neutral/wait-for-object-U6P2NNWY.mjs.map +0 -7
  628. package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -5
  629. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
  630. package/dist/types/src/containers/MenuFooter/MenuFooter.d.ts +0 -6
  631. package/dist/types/src/containers/MenuFooter/MenuFooter.d.ts.map +0 -1
  632. package/dist/types/src/containers/MenuFooter/index.d.ts +0 -2
  633. package/dist/types/src/containers/MenuFooter/index.d.ts.map +0 -1
  634. package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.d.ts +0 -16
  635. package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.d.ts.map +0 -1
  636. package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.stories.d.ts +0 -21
  637. package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.stories.d.ts.map +0 -1
  638. package/dist/types/src/containers/TypeCollectionArticle/index.d.ts +0 -2
  639. package/dist/types/src/containers/TypeCollectionArticle/index.d.ts.map +0 -1
  640. package/src/capabilities/navigation-resolver.ts +0 -94
  641. package/src/capabilities/react-surface.tsx +0 -395
  642. package/src/containers/MenuFooter/MenuFooter.tsx +0 -33
  643. package/src/containers/MenuFooter/index.ts +0 -5
  644. package/src/containers/TypeCollectionArticle/TypeCollectionArticle.stories.tsx +0 -116
  645. package/src/containers/TypeCollectionArticle/TypeCollectionArticle.tsx +0 -162
  646. package/src/containers/TypeCollectionArticle/index.ts +0 -5
@@ -0,0 +1,469 @@
1
+ import { SpaceCapabilities } from "./types.mjs";
2
+ import { n as SpaceOperation } from "./chunk-definitions.mjs";
3
+ import "./operations.mjs";
4
+ import { meta } from "#meta";
5
+ import { GraphPath, LayoutOperation } from "@dxos/app-toolkit";
6
+ import { Filter, Obj, Type } from "@dxos/echo";
7
+ import { CardAnnotation } from "@dxos/schema";
8
+ import * as Option from "effect/Option";
9
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
10
+ import { Surface, useAtomCapability, useAtomCapabilityState, useCapabilities, useOperationInvoker } from "@dxos/app-framework/ui";
11
+ import { AppSurface } from "@dxos/app-toolkit/ui";
12
+ import { useObject, useQuery } from "@dxos/echo-react";
13
+ import { Card, Focus, Icon, Panel, useTranslation } from "@dxos/react-ui";
14
+ import { getStyles, mx } from "@dxos/ui-theme";
15
+ import { jsx, jsxs } from "react/jsx-runtime";
16
+ import { Empty } from "@dxos/react-ui-list";
17
+ import { SearchList, useSearchListResults } from "@dxos/react-ui-search";
18
+ import { useSelection, useSelectionActions } from "@dxos/react-ui-attention";
19
+ import { Masonry } from "@dxos/react-ui-masonry";
20
+ import { Menu, MenuBuilder, useMenuBuilder } from "@dxos/react-ui-menu";
21
+ import { DynamicTable } from "@dxos/react-ui-table";
22
+ import { Tabs } from "@dxos/react-ui-tabs";
23
+ import { planMerge } from "@dxos/extractor";
24
+ //#region src/containers/TypeArticle/useDuplicates.ts
25
+ /**
26
+ * Drives the duplicates review: runs `FindDuplicates` for the type, then walks the returned groups
27
+ * one at a time. Groups are held as ids and resolved against the live query on every render, so a
28
+ * merged-away member disappears from the current group without a rescan.
29
+ */
30
+ var useDuplicates = ({ space, type, objects, enabled }) => {
31
+ const { invokePromise } = useOperationInvoker();
32
+ const specs = useCapabilities(SpaceCapabilities.IdentitySpec);
33
+ const typename = Type.getTypename(type);
34
+ const spec = useMemo(() => specs.find((candidate) => Type.getTypename(candidate.type) === typename), [specs, typename]);
35
+ const [groups, setGroups] = useState([]);
36
+ const [index, setIndex] = useState(0);
37
+ const [scanning, setScanning] = useState(false);
38
+ const request = useRef(0);
39
+ const { lastMergeAt } = useAtomCapability(SpaceCapabilities.EphemeralState);
40
+ const refresh = useCallback(() => {
41
+ if (!spec) return;
42
+ setScanning(true);
43
+ const current = ++request.current;
44
+ invokePromise(SpaceOperation.FindDuplicates, { typename }, { spaceId: space.id }).then(({ data }) => {
45
+ if (current !== request.current) return;
46
+ setGroups(data?.groups ?? []);
47
+ setIndex(0);
48
+ }).finally(() => {
49
+ if (current === request.current) setScanning(false);
50
+ });
51
+ }, [
52
+ invokePromise,
53
+ spec,
54
+ typename,
55
+ space.id
56
+ ]);
57
+ useEffect(() => {
58
+ if (enabled) refresh();
59
+ }, [
60
+ enabled,
61
+ refresh,
62
+ lastMergeAt
63
+ ]);
64
+ const byId = useMemo(() => new Map(objects.map((object) => [object.id, object])), [objects]);
65
+ return {
66
+ spec,
67
+ current: useMemo(() => {
68
+ const group = groups[index];
69
+ return group ? group.objectIds.flatMap((id) => byId.get(id) ?? []) : [];
70
+ }, [
71
+ groups,
72
+ index,
73
+ byId
74
+ ]),
75
+ position: groups.length === 0 ? 0 : index + 1,
76
+ total: groups.length,
77
+ scanning,
78
+ next: useCallback(() => setIndex((value) => Math.min(value + 1, Math.max(groups.length - 1, 0))), [groups.length]),
79
+ previous: useCallback(() => setIndex((value) => Math.max(value - 1, 0)), []),
80
+ refresh
81
+ };
82
+ };
83
+ /** Builds the detached preview for the group under review; `undefined` when there is nothing to merge. */
84
+ var buildMergePreview = (spec, objects) => {
85
+ if (!spec || objects.length < 2) return;
86
+ const { preview } = planMerge(spec, {
87
+ keys: [],
88
+ objects
89
+ });
90
+ return Obj.isObject(preview) ? preview : void 0;
91
+ };
92
+ //#endregion
93
+ //#region src/containers/TypeArticle/duplicatesGroup.tsx
94
+ /**
95
+ * Toolbar subgraph for the duplicates review: Merge stages a preview into the companion, Skip and
96
+ * the arrows walk the groups, and the trailing gap separator pushes whatever follows (the layout
97
+ * toggle) to the far end. Merge never writes — it stages a detached preview the companion confirms,
98
+ * so backing out of a review leaves the space untouched.
99
+ *
100
+ * Compose via `MenuBuilder.subgraph(...)` so the whole toolbar is one action graph rather than
101
+ * several nested `Toolbar.Root`s.
102
+ */
103
+ var useDuplicatesGroup = ({ typeUri, typename, duplicates }) => {
104
+ const [, updateEphemeral] = useAtomCapabilityState(SpaceCapabilities.EphemeralState);
105
+ const { spec, current, position, total, scanning, next, previous, refresh } = duplicates;
106
+ const clearPreview = useCallback(() => updateEphemeral((state) => ({
107
+ ...state,
108
+ mergePreview: void 0
109
+ })), [updateEphemeral]);
110
+ const handleMerge = useCallback(() => {
111
+ const preview = buildMergePreview(spec, current);
112
+ if (!preview) return;
113
+ updateEphemeral((state) => ({
114
+ ...state,
115
+ mergePreview: {
116
+ typeUri,
117
+ typename,
118
+ objectIds: current.map((object) => object.id),
119
+ preview
120
+ }
121
+ }));
122
+ }, [
123
+ updateEphemeral,
124
+ spec,
125
+ current,
126
+ typeUri,
127
+ typename
128
+ ]);
129
+ const handleAdvance = useCallback(() => {
130
+ clearPreview();
131
+ next();
132
+ }, [clearPreview, next]);
133
+ const handlePrevious = useCallback(() => {
134
+ clearPreview();
135
+ previous();
136
+ }, [clearPreview, previous]);
137
+ const handleRefresh = useCallback(() => {
138
+ clearPreview();
139
+ refresh();
140
+ }, [clearPreview, refresh]);
141
+ return useMemo(() => (builder) => {
142
+ builder.action("merge", {
143
+ label: ["merge-duplicates.label", { ns: meta.profile.key }],
144
+ icon: "ph--arrows-merge--regular",
145
+ variant: "primary",
146
+ iconOnly: false,
147
+ disabled: current.length < 2
148
+ }, handleMerge).action("skip", {
149
+ label: ["skip-duplicates.label", { ns: meta.profile.key }],
150
+ iconOnly: false,
151
+ disabled: position >= total
152
+ }, handleAdvance).action("rescan", {
153
+ label: ["rescan-duplicates.label", { ns: meta.profile.key }],
154
+ icon: "ph--arrows-clockwise--regular",
155
+ disabled: scanning,
156
+ spin: scanning
157
+ }, handleRefresh).subgraph((builder) => total === 0 ? [] : builder.action("previous", {
158
+ label: ["previous-duplicate.label", { ns: meta.profile.key }],
159
+ icon: "ph--caret-left--regular",
160
+ disabled: position <= 1
161
+ }, handlePrevious).action("position", {
162
+ variant: "custom",
163
+ label: ["duplicates-position.label", { ns: meta.profile.key }],
164
+ render: () => /* @__PURE__ */ jsxs("span", {
165
+ className: "text-description text-sm tabular-nums",
166
+ children: [
167
+ position,
168
+ " / ",
169
+ total
170
+ ]
171
+ })
172
+ }, () => {}).action("next", {
173
+ label: ["next-duplicate.label", { ns: meta.profile.key }],
174
+ icon: "ph--caret-right--regular",
175
+ disabled: position >= total
176
+ }, handleAdvance)).separator();
177
+ }, [
178
+ current.length,
179
+ position,
180
+ total,
181
+ scanning,
182
+ handleMerge,
183
+ handleAdvance,
184
+ handlePrevious,
185
+ handleRefresh
186
+ ]);
187
+ };
188
+ //#endregion
189
+ //#region src/containers/TypeArticle/TypeArticle.tsx
190
+ var LAYOUTS = [
191
+ {
192
+ value: "masonry",
193
+ icon: "ph--squares-four--regular"
194
+ },
195
+ {
196
+ value: "table",
197
+ icon: "ph--table--regular"
198
+ },
199
+ {
200
+ value: "duplicates",
201
+ icon: "ph--copy--regular"
202
+ }
203
+ ];
204
+ /**
205
+ * List view rendered when a type node is selected: a toolbar with a Masonry/Table layout switch and a
206
+ * text filter over every object of the type. Selecting an item opens it as a sibling plank.
207
+ *
208
+ * Objects are not enumerated in the nav tree; each navigated object becomes a hidden child of the
209
+ * type node resolved on demand.
210
+ */
211
+ var TypeArticle = ({ role, space, type, attendableId }) => {
212
+ const { t } = useTranslation(meta.profile.key);
213
+ const { invokePromise } = useOperationInvoker();
214
+ const [layout, setLayout] = useState("masonry");
215
+ const typeUri = Type.getURI(type);
216
+ const objects = useQuery(space.db, Filter.type(typeUri));
217
+ const { results, handleSearch } = useSearchListResults({
218
+ items: objects,
219
+ extract: (object) => Obj.getLabel(object) ?? ""
220
+ });
221
+ const selectedIds = useSelection(typeUri, "multi");
222
+ const { multi: setSelectedObjects, toggle: toggleSelected } = useSelectionActions(typeUri);
223
+ const duplicates = useDuplicates({
224
+ space,
225
+ type,
226
+ objects,
227
+ enabled: layout === "duplicates"
228
+ });
229
+ const duplicatesGroup = useDuplicatesGroup({
230
+ typeUri,
231
+ typename: Type.getTypename(type),
232
+ duplicates
233
+ });
234
+ const layouts = useMemo(() => LAYOUTS.filter(({ value }) => value !== "duplicates" || duplicates.spec), [duplicates.spec]);
235
+ const handleOpen = useCallback((object) => {
236
+ const id = Obj.getURI(object);
237
+ invokePromise(LayoutOperation.Select, {
238
+ contextId: attendableId,
239
+ subject: {
240
+ mode: "single",
241
+ id
242
+ }
243
+ });
244
+ invokePromise(LayoutOperation.Open, {
245
+ subject: [GraphPath.getCollectionObjectPath(attendableId, object.id)],
246
+ pivotId: attendableId,
247
+ disposition: "add",
248
+ navigation: "immediate"
249
+ });
250
+ }, [attendableId, invokePromise]);
251
+ const handleDelete = useCallback((object) => {
252
+ Obj.getDatabase(object)?.remove(object);
253
+ }, []);
254
+ const handleDeleteSelected = useCallback(() => {
255
+ const selected = objects.filter((object) => selectedIds.includes(object.id));
256
+ if (selected.length > 0) {
257
+ invokePromise(SpaceOperation.RemoveObjects, { objects: selected }, { spaceId: space.id });
258
+ setSelectedObjects([]);
259
+ }
260
+ }, [
261
+ objects,
262
+ selectedIds,
263
+ invokePromise,
264
+ space.id,
265
+ setSelectedObjects
266
+ ]);
267
+ const tableFeatures = useMemo(() => ({
268
+ selection: {
269
+ enabled: true,
270
+ mode: "multiple"
271
+ },
272
+ dataEditable: true,
273
+ schemaEditable: false,
274
+ pinColumns: 1
275
+ }), []);
276
+ const rowActions = useMemo(() => [{
277
+ id: "open",
278
+ label: ["open-object.label", { ns: meta.profile.key }]
279
+ }], []);
280
+ const handleRowAction = useCallback((actionId, object) => {
281
+ if (actionId === "open") handleOpen(object);
282
+ }, [handleOpen]);
283
+ const menuActions = useMenuBuilder(() => MenuBuilder.make().subgraph(layout === "duplicates" && duplicatesGroup).subgraph(layout === "table" && selectedIds.length > 0 && ((builder) => {
284
+ builder.action("delete-selected", {
285
+ label: ["delete-selected.label", {
286
+ ns: meta.profile.key,
287
+ count: selectedIds.length
288
+ }],
289
+ icon: "ph--trash--regular"
290
+ }, handleDeleteSelected);
291
+ })).separator().group("layout", {
292
+ variant: "toggleGroup",
293
+ selectCardinality: "single",
294
+ value: layout,
295
+ label: ["layout.label", { ns: meta.profile.key }]
296
+ }, (group) => {
297
+ layouts.forEach(({ value, icon }) => {
298
+ group.action(value, {
299
+ label: [`layout-${value}.label`, { ns: meta.profile.key }],
300
+ icon
301
+ }, () => setLayout(value));
302
+ });
303
+ }).build(), [
304
+ layout,
305
+ layouts,
306
+ selectedIds.length,
307
+ duplicatesGroup,
308
+ handleDeleteSelected
309
+ ]);
310
+ const tiles = layout === "duplicates" ? duplicates.current : results;
311
+ const tileItems = useMemo(() => tiles.map((object) => ({
312
+ object,
313
+ current: selectedIds.includes(object.id),
314
+ onSelect: toggleSelected,
315
+ onOpen: handleOpen,
316
+ onDelete: Obj.getParent(object) ? void 0 : handleDelete
317
+ })), [
318
+ tiles,
319
+ selectedIds,
320
+ toggleSelected,
321
+ handleOpen,
322
+ handleDelete
323
+ ]);
324
+ const noObjects = objects.length === 0 ? t("type-collection-empty.message") : void 0;
325
+ const noResults = noObjects ?? (results.length === 0 ? t("search-no-results.message") : void 0);
326
+ const noDuplicates = noObjects ?? (duplicates.current.length === 0 ? duplicates.scanning ? t("duplicates-scanning.message") : t("duplicates-none.message") : void 0);
327
+ return /* @__PURE__ */ jsx(SearchList.Root, {
328
+ onSearch: handleSearch,
329
+ children: /* @__PURE__ */ jsx(Tabs.Root, {
330
+ asChild: true,
331
+ value: layout,
332
+ onValueChange: (value) => setLayout(value),
333
+ children: /* @__PURE__ */ jsxs(Panel.Root, {
334
+ role,
335
+ children: [
336
+ /* @__PURE__ */ jsxs(Panel.Toolbar, {
337
+ classNames: mx("grid", layout !== "duplicates" && "grid-cols-[1fr_auto]"),
338
+ children: [layout !== "duplicates" && /* @__PURE__ */ jsx(SearchList.Input, { placeholder: t("search-placeholder.label") }), /* @__PURE__ */ jsx(Menu.Root, {
339
+ ...menuActions,
340
+ attendableId,
341
+ alwaysActive: true,
342
+ children: /* @__PURE__ */ jsx(Menu.Toolbar, {})
343
+ })]
344
+ }),
345
+ /* @__PURE__ */ jsxs(Panel.Content, { children: [
346
+ /* @__PURE__ */ jsx(LayoutPanel, {
347
+ value: "masonry",
348
+ empty: noResults,
349
+ children: /* @__PURE__ */ jsx(Masonry.Root, {
350
+ Tile: TileAdapter,
351
+ children: /* @__PURE__ */ jsx(Masonry.Content, { children: /* @__PURE__ */ jsx(Masonry.Viewport, {
352
+ cacheKey: typeUri,
353
+ getId: (data) => Obj.getURI(data.object),
354
+ items: tileItems
355
+ }) })
356
+ })
357
+ }),
358
+ /* @__PURE__ */ jsx(LayoutPanel, {
359
+ value: "table",
360
+ empty: noResults,
361
+ children: /* @__PURE__ */ jsx(DynamicTable, {
362
+ type,
363
+ rows: results,
364
+ features: tableFeatures,
365
+ rowActions,
366
+ selection: selectedIds,
367
+ onRowAction: handleRowAction,
368
+ onSelectionChanged: setSelectedObjects
369
+ })
370
+ }),
371
+ duplicates.spec && /* @__PURE__ */ jsx(LayoutPanel, {
372
+ value: "duplicates",
373
+ empty: noDuplicates,
374
+ children: /* @__PURE__ */ jsx(Masonry.Root, {
375
+ Tile: TileAdapter,
376
+ children: /* @__PURE__ */ jsx(Masonry.Content, { children: /* @__PURE__ */ jsx(Masonry.Viewport, {
377
+ cacheKey: typeUri,
378
+ getId: (data) => Obj.getURI(data.object),
379
+ items: tileItems
380
+ }) })
381
+ })
382
+ })
383
+ ] }),
384
+ /* @__PURE__ */ jsx(Panel.Statusbar, {
385
+ classNames: "flex items-center p-1 border-t border-subdued-separator",
386
+ children: t("item-count.label", { count: tileItems.length })
387
+ })
388
+ ]
389
+ })
390
+ })
391
+ });
392
+ };
393
+ /** One layout's content, or the message standing in for it when the layout has nothing to show. */
394
+ var LayoutPanel = ({ value, empty, children }) => /* @__PURE__ */ jsx(Tabs.Panel, {
395
+ value,
396
+ classNames: "contents",
397
+ children: empty ? /* @__PURE__ */ jsx(Empty, {
398
+ classNames: "h-full",
399
+ label: empty
400
+ }) : children
401
+ });
402
+ var TileAdapter = ({ data }) => {
403
+ if (!data?.object) return null;
404
+ return /* @__PURE__ */ jsx(ObjectTile, { ...data });
405
+ };
406
+ /** Selectable header-only card for a single object. */
407
+ var ObjectTile = ({ object, current, onSelect, onOpen, onDelete }) => {
408
+ const { t } = useTranslation(meta.profile.key);
409
+ const [live] = useObject(object);
410
+ const typename = Obj.getTypename(live);
411
+ const label = Obj.getLabel(live) || t("object-name.placeholder", {
412
+ ns: typename ?? meta.profile.key,
413
+ defaultValue: t("object-name.placeholder")
414
+ });
415
+ const iconAnnotation = Obj.getIcon(live);
416
+ const icon = iconAnnotation?.icon ?? "ph--circle-dashed--regular";
417
+ const iconStyles = iconAnnotation?.hue ? getStyles(iconAnnotation.hue) : void 0;
418
+ const type = Obj.getType(object);
419
+ const showCardContent = !!type && Option.getOrElse(CardAnnotation.get(Type.getSchema(type)), () => false);
420
+ const cardData = useMemo(() => ({ subject: object }), [object]);
421
+ const handleCurrentChange = useCallback(() => onSelect(object.id), [onSelect, object]);
422
+ const menuItems = useMemo(() => [{
423
+ icon: "ph--arrow-square-out--regular",
424
+ label: t("open-object.label", {
425
+ ns: typename ?? meta.profile.key,
426
+ defaultValue: t("open-object.label")
427
+ }),
428
+ onClick: () => onOpen(object)
429
+ }, ...onDelete ? [{
430
+ icon: "ph--trash--regular",
431
+ label: t("delete-object.label", {
432
+ ns: typename ?? meta.profile.key,
433
+ defaultValue: t("delete-object.label")
434
+ }),
435
+ onClick: () => onDelete(object)
436
+ }] : []], [
437
+ t,
438
+ typename,
439
+ onOpen,
440
+ onDelete,
441
+ object
442
+ ]);
443
+ return /* @__PURE__ */ jsx(Focus.Item, {
444
+ asChild: true,
445
+ current,
446
+ onCurrentChange: handleCurrentChange,
447
+ children: /* @__PURE__ */ jsxs(Card.Root, {
448
+ fullWidth: true,
449
+ classNames: ["dx-hover cursor-pointer", current && "dx-current"],
450
+ children: [/* @__PURE__ */ jsxs(Card.Header, { children: [
451
+ /* @__PURE__ */ jsx(Card.Block, { children: /* @__PURE__ */ jsx(Icon, {
452
+ icon,
453
+ classNames: iconStyles?.text
454
+ }) }),
455
+ /* @__PURE__ */ jsx(Card.Title, { children: label }),
456
+ menuItems.length > 0 && /* @__PURE__ */ jsx(Card.Menu, { items: menuItems })
457
+ ] }), showCardContent && /* @__PURE__ */ jsx(Surface.Surface, {
458
+ type: AppSurface.CardContent,
459
+ data: cardData,
460
+ limit: 1
461
+ })]
462
+ })
463
+ });
464
+ };
465
+ TypeArticle.displayName = "TypeArticle";
466
+ //#endregion
467
+ export { TypeArticle as default };
468
+
469
+ //# sourceMappingURL=chunk-TypeArticle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-TypeArticle.mjs","names":[],"sources":["../../src/containers/TypeArticle/useDuplicates.ts","../../src/containers/TypeArticle/duplicatesGroup.tsx","../../src/containers/TypeArticle/TypeArticle.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useAtomCapability, useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { Obj, Type } from '@dxos/echo';\nimport { type IdentitySpec, planMerge } from '@dxos/extractor';\nimport { type Space } from '@dxos/react-client/echo';\n\nimport { SpaceOperation } from '../../operations/definitions';\nimport { SpaceCapabilities } from '../../types';\n\nexport type UseDuplicatesProps = {\n space: Space;\n type: Type.AnyEntity;\n /** Live query results, so a group resolves to reactive objects rather than the scan's snapshots. */\n objects: readonly Obj.Unknown[];\n /** Scan only while the duplicates layout is showing. */\n enabled: boolean;\n};\n\nexport type UseDuplicatesResult = {\n /** `undefined` when no plugin registered an identity rule for this type — the tab is then hidden. */\n spec: IdentitySpec<any> | undefined;\n /** Members of the group under review, or `[]` when the review is finished. */\n current: Obj.Unknown[];\n /** 1-based position of the current group, for the toolbar counter. */\n position: number;\n total: number;\n scanning: boolean;\n next: () => void;\n previous: () => void;\n /** Re-runs the scan (after a merge, or when re-entering the tab). */\n refresh: () => void;\n};\n\n/**\n * Drives the duplicates review: runs `FindDuplicates` for the type, then walks the returned groups\n * one at a time. Groups are held as ids and resolved against the live query on every render, so a\n * merged-away member disappears from the current group without a rescan.\n */\nexport const useDuplicates = ({ space, type, objects, enabled }: UseDuplicatesProps): UseDuplicatesResult => {\n const { invokePromise } = useOperationInvoker();\n const specs = useCapabilities(SpaceCapabilities.IdentitySpec);\n const typename = Type.getTypename(type);\n const spec = useMemo(\n () => specs.find((candidate) => Type.getTypename(candidate.type) === typename),\n [specs, typename],\n );\n\n const [groups, setGroups] = useState<readonly SpaceOperation.DuplicateGroupResult[]>([]);\n const [index, setIndex] = useState(0);\n const [scanning, setScanning] = useState(false);\n // Rescan is a button a user can hit repeatedly, and a merge triggers its own refresh, so responses\n // can land out of order; only the newest request is allowed to write.\n const request = useRef(0);\n const { lastMergeAt } = useAtomCapability(SpaceCapabilities.EphemeralState);\n\n const refresh = useCallback(() => {\n if (!spec) {\n return;\n }\n setScanning(true);\n const current = ++request.current;\n void invokePromise(SpaceOperation.FindDuplicates, { typename }, { spaceId: space.id })\n .then(({ data }) => {\n if (current !== request.current) {\n return;\n }\n setGroups(data?.groups ?? []);\n setIndex(0);\n })\n .finally(() => {\n if (current === request.current) {\n setScanning(false);\n }\n });\n }, [invokePromise, spec, typename, space.id]);\n\n // `lastMergeAt` is a dependency, not a read: a committed merge invalidates the scan.\n useEffect(() => {\n if (enabled) {\n refresh();\n }\n }, [enabled, refresh, lastMergeAt]);\n\n const byId = useMemo(() => new Map(objects.map((object) => [object.id, object])), [objects]);\n const current = useMemo(() => {\n const group = groups[index];\n return group ? group.objectIds.flatMap((id) => byId.get(id) ?? []) : [];\n }, [groups, index, byId]);\n\n return {\n spec,\n current,\n position: groups.length === 0 ? 0 : index + 1,\n total: groups.length,\n scanning,\n // Clamp at the last valid index, not at `groups.length`: `position` is `index + 1`, so one past\n // the end rendered an impossible counter (\"4 / 3\") when Skip was pressed on the last group.\n next: useCallback(() => setIndex((value) => Math.min(value + 1, Math.max(groups.length - 1, 0))), [groups.length]),\n previous: useCallback(() => setIndex((value) => Math.max(value - 1, 0)), []),\n refresh,\n };\n};\n\n/** Builds the detached preview for the group under review; `undefined` when there is nothing to merge. */\nexport const buildMergePreview = (\n spec: IdentitySpec<any> | undefined,\n objects: readonly Obj.Unknown[],\n): Obj.Unknown | undefined => {\n if (!spec || objects.length < 2) {\n return undefined;\n }\n const { preview } = planMerge(spec, { keys: [], objects });\n return Obj.isObject(preview) ? preview : undefined;\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { useAtomCapabilityState } from '@dxos/app-framework/ui';\nimport { type ActionGroupBuilderFn } from '@dxos/react-ui-menu';\n\nimport { meta } from '#meta';\n\nimport { SpaceCapabilities } from '../../types';\nimport { type UseDuplicatesResult, buildMergePreview } from './useDuplicates';\n\nexport type UseDuplicatesGroupOptions = {\n /** URI of the type under review; scopes the staged preview to this article. */\n typeUri: string;\n typename: string;\n duplicates: UseDuplicatesResult;\n};\n\n/**\n * Toolbar subgraph for the duplicates review: Merge stages a preview into the companion, Skip and\n * the arrows walk the groups, and the trailing gap separator pushes whatever follows (the layout\n * toggle) to the far end. Merge never writes — it stages a detached preview the companion confirms,\n * so backing out of a review leaves the space untouched.\n *\n * Compose via `MenuBuilder.subgraph(...)` so the whole toolbar is one action graph rather than\n * several nested `Toolbar.Root`s.\n */\nexport const useDuplicatesGroup = ({\n typeUri,\n typename,\n duplicates,\n}: UseDuplicatesGroupOptions): ActionGroupBuilderFn => {\n const [, updateEphemeral] = useAtomCapabilityState(SpaceCapabilities.EphemeralState);\n const { spec, current, position, total, scanning, next, previous, refresh } = duplicates;\n\n // Every control that changes which group is under review drops the staged preview: it belongs to\n // the group it was raised from, and leaving it up would show the companion previewing one group\n // while the article shows another.\n const clearPreview = useCallback(\n () => updateEphemeral((state) => ({ ...state, mergePreview: undefined })),\n [updateEphemeral],\n );\n\n const handleMerge = useCallback(() => {\n const preview = buildMergePreview(spec, current);\n if (!preview) {\n return;\n }\n updateEphemeral((state) => ({\n ...state,\n mergePreview: { typeUri, typename, objectIds: current.map((object) => object.id), preview },\n }));\n }, [updateEphemeral, spec, current, typeUri, typename]);\n\n // Skip and the next arrow are the same move — advance past the group without writing.\n const handleAdvance = useCallback(() => {\n clearPreview();\n next();\n }, [clearPreview, next]);\n\n const handlePrevious = useCallback(() => {\n clearPreview();\n previous();\n }, [clearPreview, previous]);\n\n const handleRefresh = useCallback(() => {\n clearPreview();\n refresh();\n }, [clearPreview, refresh]);\n\n return useMemo(\n () => (builder) => {\n builder\n .action(\n 'merge',\n {\n label: ['merge-duplicates.label', { ns: meta.profile.key }],\n icon: 'ph--arrows-merge--regular',\n variant: 'primary',\n iconOnly: false,\n disabled: current.length < 2,\n },\n handleMerge,\n )\n .action(\n 'skip',\n {\n label: ['skip-duplicates.label', { ns: meta.profile.key }],\n iconOnly: false,\n // Same bound as the next arrow: skipping past the last group left the counter out of range.\n disabled: position >= total,\n },\n handleAdvance,\n )\n .action(\n 'rescan',\n {\n label: ['rescan-duplicates.label', { ns: meta.profile.key }],\n icon: 'ph--arrows-clockwise--regular',\n disabled: scanning,\n spin: scanning,\n },\n handleRefresh,\n )\n .subgraph((builder) =>\n total === 0\n ? []\n : builder\n .action(\n 'previous',\n {\n label: ['previous-duplicate.label', { ns: meta.profile.key }],\n icon: 'ph--caret-left--regular',\n disabled: position <= 1,\n },\n handlePrevious,\n )\n .action(\n 'position',\n {\n // The group counter is not an action; `custom` lets the graph carry it so the toolbar stays\n // a single menu rather than a menu plus a hand-rolled toolbar for one label.\n variant: 'custom',\n label: ['duplicates-position.label', { ns: meta.profile.key }],\n render: () => (\n <span className='text-description text-sm tabular-nums'>\n {position} / {total}\n </span>\n ),\n },\n () => {},\n )\n .action(\n 'next',\n {\n label: ['next-duplicate.label', { ns: meta.profile.key }],\n icon: 'ph--caret-right--regular',\n disabled: position >= total,\n },\n handleAdvance,\n ),\n )\n .separator();\n },\n [current.length, position, total, scanning, handleMerge, handleAdvance, handlePrevious, handleRefresh],\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport React, { type PropsWithChildren, useCallback, useMemo, useState } from 'react';\n\nimport { Surface, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { GraphPath, LayoutOperation } from '@dxos/app-toolkit';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { Filter, Obj, Type } from '@dxos/echo';\nimport { useObject, useQuery } from '@dxos/echo-react';\nimport { type Space } from '@dxos/react-client/echo';\nimport { Card, Focus, Icon, Panel, useTranslation } from '@dxos/react-ui';\nimport { useSelection, useSelectionActions } from '@dxos/react-ui-attention';\nimport { Empty } from '@dxos/react-ui-list';\nimport { Masonry } from '@dxos/react-ui-masonry';\nimport { Menu, MenuBuilder, useMenuBuilder } from '@dxos/react-ui-menu';\nimport { SearchList, useSearchListResults } from '@dxos/react-ui-search';\nimport { DynamicTable, type TableRowAction } from '@dxos/react-ui-table';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { CardAnnotation } from '@dxos/schema';\nimport { getStyles, mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\nimport { SpaceOperation } from '../../operations';\nimport { useDuplicatesGroup } from './duplicatesGroup';\nimport { useDuplicates } from './useDuplicates';\n\n/** Sidebar layout modes for a type article. */\ntype Layout = 'masonry' | 'table' | 'duplicates';\n\nconst LAYOUTS: { value: Layout; icon: string }[] = [\n {\n value: 'masonry',\n icon: 'ph--squares-four--regular',\n },\n {\n value: 'table',\n icon: 'ph--table--regular',\n },\n {\n value: 'duplicates',\n icon: 'ph--copy--regular',\n },\n];\n\nexport type TypeArticleProps = {\n role?: string;\n space: Space;\n type: Type.AnyEntity;\n attendableId: string;\n};\n\n/**\n * List view rendered when a type node is selected: a toolbar with a Masonry/Table layout switch and a\n * text filter over every object of the type. Selecting an item opens it as a sibling plank.\n *\n * Objects are not enumerated in the nav tree; each navigated object becomes a hidden child of the\n * type node resolved on demand.\n */\nexport const TypeArticle = ({ role, space, type, attendableId }: TypeArticleProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { invokePromise } = useOperationInvoker();\n const [layout, setLayout] = useState<Layout>('masonry');\n const typeUri = Type.getURI(type);\n const objects = useQuery(space.db, Filter.type(typeUri));\n\n // Text filter over the object labels; feeds both the masonry tiles and the table rows.\n const { results, handleSearch } = useSearchListResults<Obj.Unknown>({\n items: objects,\n extract: (object) => Obj.getLabel(object) ?? '',\n });\n\n // Selection is keyed by the type's own URI — the same id the 'selected-objects' companion resolves\n // from its `companionTo` (see react-surface.tsx), so cards, table rows and the companion agree.\n const selectedIds = useSelection(typeUri, 'multi');\n const { multi: setSelectedObjects, toggle: toggleSelected } = useSelectionActions(typeUri);\n\n // TODO(burdon): Factor out as an aspect?\n const duplicates = useDuplicates({ space, type, objects, enabled: layout === 'duplicates' });\n const duplicatesGroup = useDuplicatesGroup({\n typeUri,\n typename: Type.getTypename(type),\n duplicates,\n });\n\n // Duplicates is offered only for types some plugin registered an identity rule for:\n // there is nothing to scan otherwise.\n const layouts = useMemo(\n () => LAYOUTS.filter(({ value }) => value !== 'duplicates' || duplicates.spec),\n [duplicates.spec],\n );\n\n const handleOpen = useCallback(\n (object: Obj.Unknown) => {\n const id = Obj.getURI(object);\n void invokePromise(LayoutOperation.Select, { contextId: attendableId, subject: { mode: 'single', id } });\n void invokePromise(LayoutOperation.Open, {\n // Open under the node being viewed rather than the object's canonical type path, so an object\n // reached from a type section opens within that section. Identical for a database type node,\n // whose object path already is `<typeNode>/<id>`.\n subject: [GraphPath.getCollectionObjectPath(attendableId, object.id)],\n pivotId: attendableId,\n disposition: 'add',\n navigation: 'immediate',\n });\n },\n [attendableId, invokePromise],\n );\n\n const handleDelete = useCallback((object: Obj.Unknown) => {\n Obj.getDatabase(object)?.remove(object);\n }, []);\n\n // Undoable removal of every checked row, so a mis-click on a multi-row delete is recoverable.\n const handleDeleteSelected = useCallback(() => {\n const selected = objects.filter((object) => selectedIds.includes(object.id));\n if (selected.length > 0) {\n void invokePromise(SpaceOperation.RemoveObjects, { objects: selected }, { spaceId: space.id });\n setSelectedObjects([]);\n }\n }, [objects, selectedIds, invokePromise, space.id, setSelectedObjects]);\n\n // Stable identity: `DynamicTable` rebuilds its model whenever `features` changes, so an inline\n // literal here would discard and re-seed the table's selection on every render.\n const tableFeatures = useMemo(\n () => ({\n selection: { enabled: true, mode: 'multiple' as const },\n dataEditable: true,\n schemaEditable: false,\n pinColumns: 1,\n }),\n [],\n );\n\n // Table rows are editable, so opening a row is a deliberate row action rather than `onRowClick`\n // (which would fire on every cell click and fight with in-cell editing).\n const rowActions = useMemo(\n (): TableRowAction[] => [{ id: 'open', label: ['open-object.label', { ns: meta.profile.key }] }],\n [],\n );\n\n const handleRowAction = useCallback(\n (actionId: string, object: Obj.Unknown) => {\n if (actionId === 'open') {\n handleOpen(object);\n }\n },\n [handleOpen],\n );\n\n // One action graph for the whole toolbar: the mode-specific actions first, then the layout toggle.\n // Composing several `Toolbar.Root`s instead would each need their own roving-focus group and would\n // fight over the row's width.\n const menuActions = useMenuBuilder(\n () =>\n MenuBuilder.make()\n .subgraph(layout === 'duplicates' && duplicatesGroup)\n .subgraph(\n layout === 'table' &&\n selectedIds.length > 0 &&\n ((builder) => {\n builder.action(\n 'delete-selected',\n {\n label: ['delete-selected.label', { ns: meta.profile.key, count: selectedIds.length }],\n icon: 'ph--trash--regular',\n },\n handleDeleteSelected,\n );\n }),\n )\n .separator()\n .group(\n 'layout',\n {\n variant: 'toggleGroup',\n selectCardinality: 'single',\n value: layout,\n label: ['layout.label', { ns: meta.profile.key }],\n },\n (group) => {\n layouts.forEach(({ value, icon }) => {\n group.action(value, { label: [`layout-${value}.label`, { ns: meta.profile.key }], icon }, () =>\n setLayout(value),\n );\n });\n },\n )\n .build(),\n [layout, layouts, selectedIds.length, duplicatesGroup, handleDeleteSelected],\n );\n\n // The card grid backs two layouts — every object for `masonry`, only the group under review for\n // `duplicates` — so the items are resolved here and the grid itself is declared once.\n const tiles = layout === 'duplicates' ? duplicates.current : results;\n const tileItems = useMemo<TileData[]>(\n () =>\n tiles.map((object) => ({\n object,\n current: selectedIds.includes(object.id),\n onSelect: toggleSelected,\n onOpen: handleOpen,\n onDelete: Obj.getParent(object) ? undefined : handleDelete,\n })),\n [tiles, selectedIds, toggleSelected, handleOpen, handleDelete],\n );\n\n // A type with no objects at all has nothing for any layout to show; past that each layout says\n // when it is empty for its own reason.\n const noObjects = objects.length === 0 ? t('type-collection-empty.message') : undefined;\n const noResults = noObjects ?? (results.length === 0 ? t('search-no-results.message') : undefined);\n const noDuplicates =\n noObjects ??\n (duplicates.current.length === 0\n ? duplicates.scanning\n ? t('duplicates-scanning.message')\n : t('duplicates-none.message')\n : undefined);\n\n return (\n <SearchList.Root onSearch={handleSearch}>\n <Tabs.Root asChild value={layout} onValueChange={(value) => setLayout(value as Layout)}>\n <Panel.Root role={role}>\n <Panel.Toolbar classNames={mx('grid', layout !== 'duplicates' && 'grid-cols-[1fr_auto]')}>\n {layout !== 'duplicates' && <SearchList.Input placeholder={t('search-placeholder.label')} />}\n <Menu.Root {...menuActions} attendableId={attendableId} alwaysActive>\n <Menu.Toolbar />\n </Menu.Root>\n </Panel.Toolbar>\n <Panel.Content>\n <LayoutPanel value='masonry' empty={noResults}>\n <Masonry.Root Tile={TileAdapter}>\n <Masonry.Content>\n <Masonry.Viewport cacheKey={typeUri} getId={(data) => Obj.getURI(data.object)} items={tileItems} />\n </Masonry.Content>\n </Masonry.Root>\n </LayoutPanel>\n <LayoutPanel value='table' empty={noResults}>\n <DynamicTable\n type={type}\n rows={results}\n features={tableFeatures}\n rowActions={rowActions}\n // Seed from the shared selection so switching card → table keeps what was selected;\n // the table otherwise starts from its own empty model.\n selection={selectedIds}\n onRowAction={handleRowAction}\n onSelectionChanged={setSelectedObjects}\n />\n </LayoutPanel>\n {duplicates.spec && (\n <LayoutPanel value='duplicates' empty={noDuplicates}>\n <Masonry.Root Tile={TileAdapter}>\n <Masonry.Content>\n <Masonry.Viewport cacheKey={typeUri} getId={(data) => Obj.getURI(data.object)} items={tileItems} />\n </Masonry.Content>\n </Masonry.Root>\n </LayoutPanel>\n )}\n </Panel.Content>\n <Panel.Statusbar classNames='flex items-center p-1 border-t border-subdued-separator'>\n {t('item-count.label', { count: tileItems.length })}\n </Panel.Statusbar>\n </Panel.Root>\n </Tabs.Root>\n </SearchList.Root>\n );\n};\n\n/** One layout's content, or the message standing in for it when the layout has nothing to show. */\nconst LayoutPanel = ({ value, empty, children }: PropsWithChildren<{ value: Layout; empty?: string }>) => (\n <Tabs.Panel value={value} classNames='contents'>\n {empty ? <Empty classNames='h-full' label={empty} /> : children}\n </Tabs.Panel>\n);\n\ntype TileData = {\n object: Obj.Unknown;\n current: boolean;\n onSelect: (id: string) => void;\n onOpen: (object: Obj.Unknown) => void;\n onDelete?: (object: Obj.Unknown) => void;\n};\n\nconst TileAdapter = ({ data }: { data: TileData | undefined; index: number }) => {\n if (!data?.object) {\n return null;\n }\n\n return <ObjectTile {...data} />;\n};\n\n/** Selectable header-only card for a single object. */\nconst ObjectTile = ({ object, current, onSelect, onOpen, onDelete }: TileData) => {\n const { t } = useTranslation(meta.profile.key);\n // Subscribe so the label re-renders when the object changes.\n const [live] = useObject(object);\n const typename = Obj.getTypename(live);\n const label =\n Obj.getLabel(live) ||\n t('object-name.placeholder', { ns: typename ?? meta.profile.key, defaultValue: t('object-name.placeholder') });\n\n const iconAnnotation = Obj.getIcon(live);\n const icon = iconAnnotation?.icon ?? 'ph--circle-dashed--regular';\n const iconStyles = iconAnnotation?.hue ? getStyles(iconAnnotation.hue) : undefined;\n\n // Render a content preview body only for types that opt in via `CardAnnotation`.\n const type = Obj.getType(object);\n const showCardContent = !!type && Option.getOrElse(CardAnnotation.get(Type.getSchema(type)), () => false);\n const cardData = useMemo<AppSurface.ObjectCardData>(() => ({ subject: object }), [object]);\n\n // `Focus.Item` calls `onCurrentChange` on click and on Enter. A card click toggles selection —\n // the companion follows the selection, so navigating away on every click would fight the review\n // workflow; opening stays available from the card menu.\n const handleCurrentChange = useCallback(() => onSelect(object.id), [onSelect, object]);\n\n const menuItems = useMemo(\n () => [\n {\n icon: 'ph--arrow-square-out--regular',\n label: t('open-object.label', {\n ns: typename ?? meta.profile.key,\n defaultValue: t('open-object.label'),\n }),\n onClick: () => onOpen(object),\n },\n ...(onDelete\n ? [\n {\n icon: 'ph--trash--regular',\n label: t('delete-object.label', {\n ns: typename ?? meta.profile.key,\n defaultValue: t('delete-object.label'),\n }),\n onClick: () => onDelete(object),\n },\n ]\n : []),\n ],\n [t, typename, onOpen, onDelete, object],\n );\n\n return (\n <Focus.Item asChild current={current} onCurrentChange={handleCurrentChange}>\n <Card.Root fullWidth classNames={['dx-hover cursor-pointer', current && 'dx-current']}>\n <Card.Header>\n <Card.Block>\n <Icon icon={icon} classNames={iconStyles?.text} />\n </Card.Block>\n <Card.Title>{label}</Card.Title>\n {menuItems.length > 0 && <Card.Menu items={menuItems} />}\n </Card.Header>\n {showCardContent && <Surface.Surface type={AppSurface.CardContent} data={cardData} limit={1} />}\n </Card.Root>\n </Focus.Item>\n );\n};\n\nTypeArticle.displayName = 'TypeArticle';\n"],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { Filter, Obj, Query, Scope, Tag, Type } from "@dxos/echo";
2
+ import { SpaceOperation } from "#operations";
3
+ import { ViewModel } from "@dxos/schema";
4
+ import { useCallback, useState } from "react";
5
+ import { useOperationInvoker } from "@dxos/app-framework/ui";
6
+ import { useTypeOptions } from "@dxos/app-toolkit/ui";
7
+ import { useQuery } from "@dxos/echo-react";
8
+ import { useClient } from "@dxos/react-client";
9
+ import { useAsyncEffect } from "@dxos/react-ui";
10
+ import { jsx } from "react/jsx-runtime";
11
+ import { ViewEditor as ViewEditor$1 } from "@dxos/react-ui-form";
12
+ import { resolveSchemaWithRegistry } from "@dxos/app-toolkit/query";
13
+ //#region src/containers/ViewEditor/ViewEditor.tsx
14
+ var ViewEditor = ({ view }) => {
15
+ const { invokePromise } = useOperationInvoker();
16
+ const client = useClient();
17
+ const db = Obj.getDatabase(view);
18
+ const [type, setType] = useState();
19
+ const tags = useQuery(db, Filter.type(Tag.Tag));
20
+ const types = useTypeOptions({
21
+ db,
22
+ annotation: {
23
+ location: ["database", "runtime"],
24
+ kind: ["user"]
25
+ }
26
+ });
27
+ useAsyncEffect(async () => {
28
+ if (!view?.query || !db) return;
29
+ const foundType = await resolveSchemaWithRegistry(db, view.query.ast);
30
+ if (foundType && foundType !== type) setType(() => foundType);
31
+ }, [
32
+ client,
33
+ db,
34
+ view,
35
+ type
36
+ ]);
37
+ const handleQueryChanged = useCallback(async (newQuery, target) => {
38
+ if (!view || !db) return;
39
+ const queue = target;
40
+ const query = queue ? Query.fromAst(newQuery).from([Scope.feed(queue)]) : Query.fromAst(newQuery);
41
+ Obj.update(view, (view) => {
42
+ view.query.ast = query.ast;
43
+ });
44
+ const newType = await resolveSchemaWithRegistry(db, query.ast);
45
+ if (!newType) return;
46
+ const newView = ViewModel.make({
47
+ query,
48
+ jsonSchema: newType.jsonSchema
49
+ });
50
+ Obj.update(view, (view) => {
51
+ view.projection = Obj.getSnapshot(newView).projection;
52
+ });
53
+ setType(() => newType);
54
+ }, [view, type]);
55
+ const handleDelete = useCallback((fieldId) => {
56
+ invokePromise(SpaceOperation.DeleteField, {
57
+ view,
58
+ fieldId
59
+ });
60
+ }, [invokePromise, view]);
61
+ if (!db || !type) return null;
62
+ return /* @__PURE__ */ jsx(ViewEditor$1, {
63
+ registry: db.graph.registry,
64
+ type,
65
+ view,
66
+ mode: "tag",
67
+ db,
68
+ tags,
69
+ types,
70
+ onQueryChanged: handleQueryChanged,
71
+ onDelete: Type.getDatabase(type) != null ? handleDelete : void 0
72
+ });
73
+ };
74
+ ViewEditor.displayName = "ViewEditor";
75
+ //#endregion
76
+ export { ViewEditor as default };
77
+
78
+ //# sourceMappingURL=chunk-ViewEditor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-ViewEditor.mjs","names":[],"sources":["../../src/containers/ViewEditor/ViewEditor.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useState } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { resolveSchemaWithRegistry } from '@dxos/app-toolkit/query';\nimport { useTypeOptions } from '@dxos/app-toolkit/ui';\nimport { EID, Filter, Obj, Query, type QueryAST, Scope, Tag, Type, type View } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { type Mutable } from '@dxos/echo/Obj';\nimport { useClient } from '@dxos/react-client';\nimport { useAsyncEffect } from '@dxos/react-ui';\nimport { ViewEditor as NaturalViewEditor } from '@dxos/react-ui-form';\nimport { ViewModel } from '@dxos/schema';\n\nimport { SpaceOperation } from '#operations';\n\nexport type ViewEditorProps = { view: View.View };\n\nexport const ViewEditor = ({ view }: ViewEditorProps) => {\n const { invokePromise } = useOperationInvoker();\n const client = useClient();\n const db = Obj.getDatabase(view);\n const [type, setType] = useState<Type.AnyEntity>();\n const tags = useQuery(db, Filter.type(Tag.Tag));\n const types = useTypeOptions({\n db,\n annotation: {\n location: ['database', 'runtime'],\n kind: ['user'],\n },\n });\n\n useAsyncEffect(async () => {\n if (!view?.query || !db) {\n return;\n }\n\n const foundType = await resolveSchemaWithRegistry(db, view.query.ast);\n if (foundType && foundType !== type) {\n setType(() => foundType);\n }\n }, [client, db, view, type]);\n\n const handleQueryChanged = useCallback(\n async (newQuery: QueryAST.Query, target?: EID.EID) => {\n if (!view || !db) {\n return;\n }\n\n const queue = target;\n const query = queue ? Query.fromAst(newQuery).from([Scope.feed(queue)]) : Query.fromAst(newQuery);\n Obj.update(view, (view) => {\n view.query.ast = query.ast as Mutable<typeof query.ast>;\n });\n const newType = await resolveSchemaWithRegistry(db, query.ast);\n if (!newType) {\n return;\n }\n\n const newView = ViewModel.make({\n query,\n jsonSchema: newType.jsonSchema,\n });\n Obj.update(view, (view) => {\n view.projection = Obj.getSnapshot(newView).projection as Mutable<typeof view.projection>;\n });\n\n setType(() => newType);\n },\n [view, type],\n );\n\n const handleDelete = useCallback(\n (fieldId: string) => {\n void invokePromise(SpaceOperation.DeleteField, { view, fieldId });\n },\n [invokePromise, view],\n );\n\n if (!db || !type) {\n return null;\n }\n\n return (\n <NaturalViewEditor\n registry={db.graph.registry}\n type={type}\n view={view}\n mode='tag'\n db={db}\n tags={tags}\n types={types}\n onQueryChanged={handleQueryChanged}\n onDelete={Type.getDatabase(type) != null ? handleDelete : undefined}\n />\n );\n};\n\nViewEditor.displayName = 'ViewEditor';\n"],"mappings":";;;;;;;;;;;;;AAqBA,IAAa,cAAc,EAAE,WAA4B;CACvD,MAAM,EAAE,kBAAkB,oBAAoB;CAC9C,MAAM,SAAS,UAAU;CACzB,MAAM,KAAK,IAAI,YAAY,IAAI;CAC/B,MAAM,CAAC,MAAM,WAAW,SAAyB;CACjD,MAAM,OAAO,SAAS,IAAI,OAAO,KAAK,IAAI,GAAG,CAAC;CAC9C,MAAM,QAAQ,eAAe;EAC3B;EACA,YAAY;GACV,UAAU,CAAC,YAAY,SAAS;GAChC,MAAM,CAAC,MAAM;EACf;CACF,CAAC;CAED,eAAe,YAAY;EACzB,IAAI,CAAC,MAAM,SAAS,CAAC,IACnB;EAGF,MAAM,YAAY,MAAM,0BAA0B,IAAI,KAAK,MAAM,GAAG;EACpE,IAAI,aAAa,cAAc,MAC7B,cAAc,SAAS;CAE3B,GAAG;EAAC;EAAQ;EAAI;EAAM;CAAI,CAAC;CAE3B,MAAM,qBAAqB,YACzB,OAAO,UAA0B,WAAqB;EACpD,IAAI,CAAC,QAAQ,CAAC,IACZ;EAGF,MAAM,QAAQ;EACd,MAAM,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,IAAI,MAAM,QAAQ,QAAQ;EAChG,IAAI,OAAO,OAAO,SAAS;GACzB,KAAK,MAAM,MAAM,MAAM;EACzB,CAAC;EACD,MAAM,UAAU,MAAM,0BAA0B,IAAI,MAAM,GAAG;EAC7D,IAAI,CAAC,SACH;EAGF,MAAM,UAAU,UAAU,KAAK;GAC7B;GACA,YAAY,QAAQ;EACtB,CAAC;EACD,IAAI,OAAO,OAAO,SAAS;GACzB,KAAK,aAAa,IAAI,YAAY,OAAO,CAAC,CAAC;EAC7C,CAAC;EAED,cAAc,OAAO;CACvB,GACA,CAAC,MAAM,IAAI,CACb;CAEA,MAAM,eAAe,aAClB,YAAoB;EACnB,cAAmB,eAAe,aAAa;GAAE;GAAM;EAAQ,CAAC;CAClE,GACA,CAAC,eAAe,IAAI,CACtB;CAEA,IAAI,CAAC,MAAM,CAAC,MACV,OAAO;CAGT,OACE,oBAAC,cAAD;EACE,UAAU,GAAG,MAAM;EACb;EACA;EACN,MAAK;EACD;EACE;EACC;EACP,gBAAgB;EAChB,UAAU,KAAK,YAAY,IAAI,KAAK,OAAO,eAAe,KAAA;CAC3D,CAAA;AAEL;AAEA,WAAW,cAAc"}