@@ -321,6 +321,56 @@ async function updatePageTitle(type: "relative" | "absolute", value: string) {
321321 }
322322}
323323
324+ function handleCopyNoteLink() {
325+ if (! selectedNoteId .value ) return ;
326+ const url = ` ${window .location .origin }/pages/${pageId .value }?elem=${selectedNoteId .value } ` ;
327+ navigator .clipboard .writeText (url );
328+ }
329+
330+ function handleSwapHeadBody() {
331+ if (! selectedNoteModel .value ) return ;
332+ const headFrag = selectedNoteModel .value .head ?.value ;
333+ const bodyFrag = selectedNoteModel .value .body ?.value ;
334+ if (! headFrag || ! bodyFrag ) return ;
335+ // Swap Yjs XmlFragments by exchanging their internal content
336+ // This is a shallow swap: exchange the `value` references in the parent map
337+ const noteMap = selectedNoteModel .value .rawMap ;
338+ if (! noteMap ) return ;
339+ const headMap = noteMap .get (' head' ) as any ;
340+ const bodyMap = noteMap .get (' body' ) as any ;
341+ if (! headMap || ! bodyMap ) return ;
342+ const hVal = headMap .get (' value' );
343+ const bVal = bodyMap .get (' value' );
344+ headMap .set (' value' , bVal );
345+ bodyMap .set (' value' , hVal );
346+ }
347+
348+ async function handleSetNoteAsDefault() {
349+ pageOpsMessage .value = ' Set as default note style is not yet implemented in the new UI (requires serialization + encryption).' ;
350+ }
351+
352+ async function handleCreateNewPage() {
353+ pageOpsMessage .value = ' Create new page is not yet implemented in the new UI (requires page-creation crypto: encrypted titles + keyring).' ;
354+ }
355+
356+ function handleSwapArrowheads() {
357+ if (! selectedArrowModel .value ) return ;
358+ const s = selectedArrowModel .value .sourceHead .value ;
359+ const t = selectedArrowModel .value .targetHead .value ;
360+ selectedArrowModel .value .sourceHead .value = t ;
361+ selectedArrowModel .value .targetHead .value = s ;
362+ }
363+
364+ function handleCopyArrowLink() {
365+ if (! selectedArrowId .value ) return ;
366+ const url = ` ${window .location .origin }/pages/${pageId .value }?elem=${selectedArrowId .value } ` ;
367+ navigator .clipboard .writeText (url );
368+ }
369+
370+ async function handleSetArrowAsDefault() {
371+ pageOpsMessage .value = ' Set as default arrow style is not yet implemented in the new UI (requires serialization + encryption).' ;
372+ }
373+
324374onMounted (() => {
325375 if (! isAuthenticated .value ) {
326376 void router .replace ({
@@ -517,6 +567,12 @@ onMounted(() => {
517567 @update:container-wrap-children =" selectedNoteModel.container.wrapChildren.value = $event"
518568 @update:container-stretch-children =" selectedNoteModel.container.stretchChildren.value = $event"
519569 @update:container-force-color-inheritance =" selectedNoteModel.container.forceColorInheritance.value = $event"
570+ @update:local-collapsing =" selectedNoteModel.collapsing.localCollapsing.value = $event"
571+ @update:locally-collapsed =" selectedNoteModel.collapsing.locallyCollapsed.value = $event"
572+ @create-new-page =" handleCreateNewPage"
573+ @swap-head-body =" handleSwapHeadBody"
574+ @copy-link =" handleCopyNoteLink"
575+ @set-as-default =" handleSetNoteAsDefault"
520576 />
521577
522578 <ArrowPropertiesCard
@@ -531,32 +587,39 @@ onMounted(() => {
531587 @update:color =" selectedArrowModel.color.value = $event"
532588 @update:color-inherit =" selectedArrowModel.color.inherit.value = $event"
533589 @update:read-only =" selectedArrowModel.readOnly.value = $event"
590+ @update:source-anchor =" selectedArrowModel.sourceAnchor.value = $event === 'null' ? null : JSON.parse($event)"
591+ @update:target-anchor =" selectedArrowModel.targetAnchor.value = $event === 'null' ? null : JSON.parse($event)"
592+ @swap-arrowheads =" handleSwapArrowheads"
593+ @copy-link =" handleCopyArrowLink"
594+ @set-as-default =" handleSetArrowAsDefault"
534595 />
535596
536- <PageEditorSnapshotsCard
537- :snapshot-loading =" snapshotsLoading"
538- :snapshots =" snapshotList"
539- :collab-loading =" collabLoading"
540- :load-error =" loadError"
541- :crypto-error =" cryptoError"
542- @restore =" restoreFromSnapshot($event)"
543- @remove =" deleteSnapshot($event)"
544- @save-manual =" saveSnapshotManual()"
545- />
546-
547- <PageEditorManagementCard
548- v-model:move-dest-group-id =" moveDestGroupId"
549- :collab-loading =" collabLoading"
550- :load-error =" loadError"
551- :crypto-error =" cryptoError"
552- :collab-group-id =" collabGroupId"
553- @move-to-group =" management.movePageToOtherGroup()"
554- @set-as-main-page =" management.setAsGroupMainPage()"
555- @soft-delete =" management.softDeleteThisPage()"
556- @purge =" management.purgeThisPagePermanently()"
557- />
558-
559- <PageEditorBacklinksCard :page-id =" pageId" />
597+ <template v-if =" ! selectedNoteId && ! selectedArrowId " >
598+ <PageEditorSnapshotsCard
599+ :snapshot-loading =" snapshotsLoading"
600+ :snapshots =" snapshotList"
601+ :collab-loading =" collabLoading"
602+ :load-error =" loadError"
603+ :crypto-error =" cryptoError"
604+ @restore =" restoreFromSnapshot($event)"
605+ @remove =" deleteSnapshot($event)"
606+ @save-manual =" saveSnapshotManual()"
607+ />
608+
609+ <PageEditorManagementCard
610+ v-model:move-dest-group-id =" moveDestGroupId"
611+ :collab-loading =" collabLoading"
612+ :load-error =" loadError"
613+ :crypto-error =" cryptoError"
614+ :collab-group-id =" collabGroupId"
615+ @move-to-group =" management.movePageToOtherGroup()"
616+ @set-as-main-page =" management.setAsGroupMainPage()"
617+ @soft-delete =" management.softDeleteThisPage()"
618+ @purge =" management.purgeThisPagePermanently()"
619+ />
620+
621+ <PageEditorBacklinksCard :page-id =" pageId" />
622+ </template >
560623 </div >
561624 </template >
562625
0 commit comments