aboutsummaryrefslogtreecommitdiff
path: root/src/client/views
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views')
-rw-r--r--src/client/views/collections/CollectionView.tsx27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/client/views/collections/CollectionView.tsx b/src/client/views/collections/CollectionView.tsx
index c1db8fd0b..5d1e8b41c 100644
--- a/src/client/views/collections/CollectionView.tsx
+++ b/src/client/views/collections/CollectionView.tsx
@@ -3,12 +3,12 @@ import { observer } from "mobx-react";
import * as React from 'react';
import 'react-image-lightbox-with-rotate/style.css'; // This only needs to be imported once in your app
import { DateField } from '../../../fields/DateField';
-import { AclAddonly, AclAdmin, AclEdit, AclPrivate, AclReadonly, AclSym, DataSym, Doc, DocListCast, DocListCastAsync } from '../../../fields/Doc';
+import { AclAddonly, AclAdmin, AclEdit, AclPrivate, AclReadonly, AclSym, DataSym, Doc, DocListCast, DocListCastAsync, Field } from '../../../fields/Doc';
import { Id } from '../../../fields/FieldSymbols';
import { List } from '../../../fields/List';
import { ObjectField } from '../../../fields/ObjectField';
import { ScriptField } from '../../../fields/ScriptField';
-import { Cast, ScriptCast, StrCast } from '../../../fields/Types';
+import { Cast, ScriptCast, StrCast, DateCast } from '../../../fields/Types';
import { denormalizeEmail, distributeAcls, GetEffectiveAcl, SharingPermissions, TraceMobx } from '../../../fields/util';
import { returnFalse } from '../../../Utils';
import { Docs, DocUtils } from '../../documents/Documents';
@@ -277,6 +277,21 @@ export class CollectionView extends Touchable<CollectionViewProps> {
}
}
+ // synchs matching documents on the two branches that are being merged/pulled
+ // currently this just synchs the main 'fieldKey' component of the data since
+ // we don't have individual timestamps for all fields -- this is a problematic design issue.
+ static synchDocs(bd: Doc, md: Doc) {
+ const fieldKey = Doc.LayoutFieldKey(md);
+ let bdate = DateCast(bd[`${fieldKey}-lastModified`])?.date;
+ let mdate = DateCast(md[`${fieldKey}-lastModified`])?.date;
+ if (bdate === mdate || bdate > mdate) return;
+ const bdproto = bd && Doc.GetProto(bd);
+ if (bdproto && md) {
+ bdproto[fieldKey] = ObjectField.MakeCopy(md[fieldKey] as ObjectField);
+ bdproto[`${fieldKey}-lastModified`] = ObjectField.MakeCopy(md[`${fieldKey}-lastModified`] as ObjectField);
+ }
+ }
+
// pulls documents onto a branch from the branch's master
// if a document exists on master but not on the branch, it is branched and added
// NOTE: need to set a timestamp on the branch that is equal to the master's last merge timestamp.
@@ -290,6 +305,11 @@ export class CollectionView extends Touchable<CollectionViewProps> {
const branchMasterMainDocProtos = branchMasterMainDocs?.map(doc => Doc.GetProto(doc));
// get documents on master that don't have a corresponding master doc (form a branch doc), and ...
const newDocsFromMaster = masterMainDocs?.filter(md => !branchMasterMainDocProtos?.includes(Doc.GetProto(md)));
+ const oldDocsFromMaster = masterMainDocs?.filter(md => branchMasterMainDocProtos?.includes(Doc.GetProto(md)));
+ oldDocsFromMaster?.forEach(md => {
+ const bd = branchMainDocs?.find(bd => (Cast(bd.branchOf, Doc, null) || bd) === md);
+ bd && CollectionView.synchDocs(bd, md);
+ })
// make branch clones of them, then add them to the branch
const newlyBranchedDocs = await Promise.all(newDocsFromMaster?.map(async md => (await Doc.MakeClone(md, false, true)).clone) || []);
newlyBranchedDocs.forEach(nd => {
@@ -304,8 +324,6 @@ export class CollectionView extends Touchable<CollectionViewProps> {
// merges all branches from the master branch by first merging the top-level collection of documents,
// and then merging all the annotations on those documents.
- // NOTE: "merging" only means making sure that documents in the branches are on master -- it does not
- // currently update the state of those documents to be identical.
// TODO: need to add an incrementing timestamp whenever anything merges. don't allow a branch to merge if it's last pull timestamp isn't equal to the last merge timestamp.
static mergeWithMaster = async (master: Doc, suffix = "") => {
const branches = await DocListCastAsync(master.branches);
@@ -327,6 +345,7 @@ export class CollectionView extends Touchable<CollectionViewProps> {
}
Doc.AddDocToList(master, Doc.LayoutFieldKey(master) + suffix, masterChild); // add the masterChild to master (if it's already there, this is a no-op)
masterChild.context = master;
+ CollectionView.synchDocs(Doc.GetProto(masterChild), bd);
});
const masterChildren = await DocListCastAsync(master[Doc.LayoutFieldKey(master) + suffix]);
masterChildren?.forEach(async mc => { // see if any master children