aboutsummaryrefslogtreecommitdiff
path: root/src/fields
diff options
context:
space:
mode:
Diffstat (limited to 'src/fields')
-rw-r--r--src/fields/Doc.ts17
-rw-r--r--src/fields/List.ts2
-rw-r--r--src/fields/util.ts44
3 files changed, 42 insertions, 21 deletions
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index c8d28b4a2..adda40621 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -25,6 +25,7 @@ import JSZip = require("jszip");
import { saveAs } from "file-saver";
import { CollectionDockingView } from "../client/views/collections/CollectionDockingView";
import { SelectionManager } from "../client/util/SelectionManager";
+import { DocumentView } from "../client/views/nodes/DocumentView";
export namespace Field {
export function toKeyValueString(doc: Doc, key: string): string {
@@ -399,7 +400,7 @@ export namespace Doc {
// and returns the document who's proto is undefined or whose proto is marked as a base prototype ('isPrototype').
export function GetProto(doc: Doc): Doc {
if (doc instanceof Promise) {
- console.log("GetProto: warning: got Promise insead of Doc");
+ // console.log("GetProto: warning: got Promise insead of Doc");
}
const proto = doc && (Doc.GetT(doc, "isPrototype", "boolean", true) ? doc : (doc.proto || doc));
return proto === doc ? proto : Doc.GetProto(proto);
@@ -500,7 +501,6 @@ export namespace Doc {
alias.title = ComputedField.MakeFunction(`renameAlias(this, ${Doc.GetProto(doc).aliasNumber = NumCast(Doc.GetProto(doc).aliasNumber) + 1})`);
}
alias.author = Doc.CurrentUserEmail;
- alias[AclSym] = doc[AclSym];
Doc.AddDocToList(doc[DataSym], "aliases", alias);
@@ -883,6 +883,15 @@ export namespace Doc {
export function SetLayout(doc: Doc, layout: Doc | string) { doc[StrCast(doc.layoutKey, "layout")] = layout; }
export function LayoutField(doc: Doc) { return doc[StrCast(doc.layoutKey, "layout")]; }
export function LayoutFieldKey(doc: Doc): string { return StrCast(Doc.Layout(doc).layout).split("'")[1]; }
+ export function NativeAspect(doc: Doc, dataDoc?: Doc, useDim?: boolean) {
+ return Doc.NativeWidth(doc, dataDoc, useDim) / (Doc.NativeHeight(doc, dataDoc, useDim) || 1);
+ }
+ export function NativeWidth(doc?: Doc, dataDoc?: Doc, useWidth?: boolean) { return !doc ? 0 : NumCast(doc._nativeWidth, NumCast((dataDoc || doc)[Doc.LayoutFieldKey(doc) + "-nativeWidth"], useWidth ? doc[WidthSym]() : 0)); }
+ export function NativeHeight(doc?: Doc, dataDoc?: Doc, useHeight?: boolean) { return !doc ? 0 : NumCast(doc._nativeHeight, NumCast((dataDoc || doc)[Doc.LayoutFieldKey(doc) + "-nativeHeight"], useHeight ? doc[HeightSym]() : 0)); }
+ export function SetNativeWidth(doc: Doc, width: number | undefined) { doc[Doc.LayoutFieldKey(doc) + "-nativeWidth"] = width; }
+ export function SetNativeHeight(doc: Doc, height: number | undefined) { doc[Doc.LayoutFieldKey(doc) + "-nativeHeight"] = height; }
+
+
const manager = new DocData();
export function SearchQuery(): string { return manager._searchQuery; }
export function SetSearchQuery(query: string) { runInAction(() => manager._searchQuery = query); }
@@ -1087,14 +1096,14 @@ export namespace Doc {
export function toggleNativeDimensions(layoutDoc: Doc, contentScale: number, panelWidth: number, panelHeight: number) {
runInAction(() => {
- if (layoutDoc._nativeWidth || layoutDoc._nativeHeight) {
+ if (Doc.NativeWidth(layoutDoc) || Doc.NativeHeight(layoutDoc)) {
layoutDoc._viewScale = NumCast(layoutDoc._viewScale, 1) * contentScale;
layoutDoc._nativeWidth = undefined;
layoutDoc._nativeHeight = undefined;
}
else {
layoutDoc._autoHeight = false;
- if (!layoutDoc._nativeWidth) {
+ if (!Doc.NativeWidth(layoutDoc)) {
layoutDoc._nativeWidth = NumCast(layoutDoc._width, panelWidth);
layoutDoc._nativeHeight = NumCast(layoutDoc._height, panelHeight);
}
diff --git a/src/fields/List.ts b/src/fields/List.ts
index a0cbebaf5..215dff34b 100644
--- a/src/fields/List.ts
+++ b/src/fields/List.ts
@@ -78,7 +78,7 @@ const listHandlers: any = {
}
const res = list.__fields.splice(start, deleteCount, ...items);
this[Update](items.length === 0 && deleteCount ? { op: "$remFromSet", items: removed, length: list.__fields.length } :
- items.length && !deleteCount ? { op: "$addToSet", items, length: list.__fields.length } : undefined);
+ items.length && !deleteCount && start === list.__fields.length ? { op: "$addToSet", items, length: list.__fields.length } : undefined);
return res.map(toRealField);
}),
unshift(...items: any[]) {
diff --git a/src/fields/util.ts b/src/fields/util.ts
index d48011194..a374c7f54 100644
--- a/src/fields/util.ts
+++ b/src/fields/util.ts
@@ -162,7 +162,7 @@ export function GetEffectiveAcl(target: any, user?: string): symbol {
}
function getPropAcl(target: any, prop: string | symbol | number) {
- if (prop === UpdatingFromServer || target[UpdatingFromServer] || prop == AclSym) return AclAdmin; // requesting the UpdatingFromServer prop or AclSym must always go through to keep the local DB consistent
+ if (prop === UpdatingFromServer || target[UpdatingFromServer] || prop === AclSym) return AclAdmin; // requesting the UpdatingFromServer prop or AclSym must always go through to keep the local DB consistent
if (prop && DocServer.PlaygroundFields?.includes(prop.toString())) return AclEdit; // playground props are always editable
return GetEffectiveAcl(target);
}
@@ -363,47 +363,59 @@ export function deleteProperty(target: any, prop: string | number | symbol) {
}
export function updateFunction(target: any, prop: any, value: any, receiver: any) {
- let current = ObjectField.MakeCopy(value);
+ let lastValue = ObjectField.MakeCopy(value);
return (diff?: any) => {
const op =
diff?.op === "$addToSet" ? { '$addToSet': { ["fields." + prop]: SerializationHelper.Serialize(new List<Doc>(diff.items)) } } :
diff?.op === "$remFromSet" ? { '$remFromSet': { ["fields." + prop]: SerializationHelper.Serialize(new List<Doc>(diff.items)) } }
: { '$set': { ["fields." + prop]: SerializationHelper.Serialize(value) } };
!op.$set && ((op as any).length = diff.length);
-
- const oldValue = current;
+ const prevValue = ObjectField.MakeCopy(lastValue as List<any>);
+ lastValue = ObjectField.MakeCopy(value);
const newValue = ObjectField.MakeCopy(value);
- current = newValue;
+
if (!(value instanceof CursorField) && !(value?.some?.((v: any) => v instanceof CursorField))) {
!receiver[UpdatingFromServer] && UndoManager.AddEvent(
diff?.op === "$addToSet" ?
{
redo: () => {
- receiver[prop].push(...diff.items);
+ receiver[prop].push(...diff.items.map((item: any) => item.value()));
+ lastValue = ObjectField.MakeCopy(receiver[prop]);
},
undo: action(() => {
- const curList = receiver[prop];
- //while (curList[ForwardUpates]) curList = curList[ForwardUpates];
diff.items.forEach((doc: any) => {
- const ind = curList.indexOf(doc.value());
- ind !== -1 && curList.splice(ind, 1);
+ const ind = receiver[prop].indexOf(doc.value());
+ ind !== -1 && receiver[prop].splice(ind, 1);
});
+ lastValue = ObjectField.MakeCopy(receiver[prop]);
})
} :
diff?.op === "$remFromSet" ?
{
redo: action(() => {
- const curList = receiver[prop];
diff.items.forEach((doc: any) => {
- const ind = curList.indexOf(doc.value());
- ind !== -1 && curList.splice(ind, 1);
+ const ind = receiver[prop].indexOf(doc.value());
+ ind !== -1 && receiver[prop].splice(ind, 1);
});
+ lastValue = ObjectField.MakeCopy(receiver[prop]);
}),
- undo: () => receiver[prop].push(...diff.items)
+ undo: () => {
+ diff.items.map((item: any) => {
+ const ind = (prevValue as List<any>).indexOf(diff.items[0].value());
+ ind !== -1 && receiver[prop].indexOf(diff.items[0].value()) === -1 && receiver[prop].splice(ind, 0, item);
+ });
+ lastValue = ObjectField.MakeCopy(receiver[prop]);
+ }
}
: {
- redo: () => receiver[prop] = newValue,
- undo: () => receiver[prop] = oldValue
+ redo: () => {
+ receiver[prop] = ObjectField.MakeCopy(newValue as List<any>);
+ lastValue = ObjectField.MakeCopy(receiver[prop]);
+ },
+ undo: () => {
+ receiver[prop] = ObjectField.MakeCopy(prevValue as List<any>);
+ lastValue = ObjectField.MakeCopy(receiver[prop]);
+ }
});
}
target[Update](op);