6
6
import { assert , unreachableCase } from "@fluidframework/core-utils" ;
7
7
import { ChangeAtomId , RevisionTag , TaggedChange } from "../../core" ;
8
8
import { IdAllocator , fail } from "../../util" ;
9
- import { CrossFieldManager , CrossFieldTarget } from "../modular-schema" ;
9
+ import { CrossFieldManager , CrossFieldTarget , RevisionMetadataSource } from "../modular-schema" ;
10
10
import {
11
11
Changeset ,
12
12
Mark ,
@@ -22,7 +22,7 @@ import { MarkListFactory } from "./markListFactory";
22
22
import {
23
23
areInputCellsEmpty ,
24
24
extractMarkEffect ,
25
- getDetachCellId ,
25
+ getDetachOutputId ,
26
26
getEndpoint ,
27
27
getOutputCellId ,
28
28
isAttach ,
@@ -48,12 +48,14 @@ export function invert<TNodeChange>(
48
48
invertChild : NodeChangeInverter < TNodeChange > ,
49
49
genId : IdAllocator ,
50
50
crossFieldManager : CrossFieldManager ,
51
+ revisionMetadata : RevisionMetadataSource ,
51
52
) : Changeset < TNodeChange > {
52
53
return invertMarkList (
53
54
change . change ,
54
55
change . revision ,
55
56
invertChild ,
56
57
crossFieldManager as CrossFieldManager < TNodeChange > ,
58
+ revisionMetadata ,
57
59
) ;
58
60
}
59
61
@@ -75,11 +77,18 @@ function invertMarkList<TNodeChange>(
75
77
revision : RevisionTag | undefined ,
76
78
invertChild : NodeChangeInverter < TNodeChange > ,
77
79
crossFieldManager : CrossFieldManager < TNodeChange > ,
80
+ revisionMetadata : RevisionMetadataSource ,
78
81
) : MarkList < TNodeChange > {
79
82
const inverseMarkList = new MarkListFactory < TNodeChange > ( ) ;
80
83
81
84
for ( const mark of markList ) {
82
- const inverseMarks = invertMark ( mark , revision , invertChild , crossFieldManager ) ;
85
+ const inverseMarks = invertMark (
86
+ mark ,
87
+ revision ,
88
+ invertChild ,
89
+ crossFieldManager ,
90
+ revisionMetadata ,
91
+ ) ;
83
92
inverseMarkList . push ( ...inverseMarks ) ;
84
93
}
85
94
@@ -91,6 +100,7 @@ function invertMark<TNodeChange>(
91
100
revision : RevisionTag | undefined ,
92
101
invertChild : NodeChangeInverter < TNodeChange > ,
93
102
crossFieldManager : CrossFieldManager < TNodeChange > ,
103
+ revisionMetadata : RevisionMetadataSource ,
94
104
) : Mark < TNodeChange > [ ] {
95
105
const type = mark . type ;
96
106
switch ( type ) {
@@ -105,13 +115,11 @@ function invertMark<TNodeChange>(
105
115
assert ( revision !== undefined , 0x5a1 /* Unable to revert to undefined revision */ ) ;
106
116
const markRevision = mark . revision ?? revision ;
107
117
if ( mark . cellId === undefined ) {
118
+ const outputId = getDetachOutputId ( mark , markRevision , revisionMetadata ) ;
108
119
const inverse = withNodeChange (
109
120
{
110
121
type : "Insert" ,
111
- cellId : mark . detachIdOverride ?? {
112
- revision : markRevision ,
113
- localId : mark . id ,
114
- } ,
122
+ cellId : outputId ,
115
123
count : mark . count ,
116
124
} ,
117
125
invertNodeChange ( mark . changes , invertChild ) ,
@@ -164,10 +172,10 @@ function invertMark<TNodeChange>(
164
172
) ;
165
173
}
166
174
167
- const cellId = getDetachCellId (
175
+ const cellId = getDetachOutputId (
168
176
mark ,
169
177
mark . revision ?? revision ?? fail ( "Revision must be defined" ) ,
170
- undefined ,
178
+ revisionMetadata ,
171
179
) ?? {
172
180
revision : mark . revision ?? revision ?? fail ( "Revision must be defined" ) ,
173
181
localId : mark . id ,
@@ -223,8 +231,20 @@ function invertMark<TNodeChange>(
223
231
changes : mark . changes ,
224
232
...mark . detach ,
225
233
} ;
226
- const attachInverses = invertMark ( attach , revision , invertChild , crossFieldManager ) ;
227
- const detachInverses = invertMark ( detach , revision , invertChild , crossFieldManager ) ;
234
+ const attachInverses = invertMark (
235
+ attach ,
236
+ revision ,
237
+ invertChild ,
238
+ crossFieldManager ,
239
+ revisionMetadata ,
240
+ ) ;
241
+ const detachInverses = invertMark (
242
+ detach ,
243
+ revision ,
244
+ invertChild ,
245
+ crossFieldManager ,
246
+ revisionMetadata ,
247
+ ) ;
228
248
229
249
if ( detachInverses . length === 0 ) {
230
250
return attachInverses ;
0 commit comments