mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
Linting/comments
This commit is contained in:
parent
fa18307c9a
commit
ae91384f8b
@ -78,7 +78,6 @@ export class LinkingState extends Disposable {
|
|||||||
|
|
||||||
private _docModel: DocModel;
|
private _docModel: DocModel;
|
||||||
private _srcSection: ViewSectionRec;
|
private _srcSection: ViewSectionRec;
|
||||||
//private _tgtSection: ViewSectionRec;
|
|
||||||
private _srcTableModel: DataTableModel;
|
private _srcTableModel: DataTableModel;
|
||||||
private _srcColId: string | undefined;
|
private _srcColId: string | undefined;
|
||||||
|
|
||||||
@ -87,7 +86,6 @@ export class LinkingState extends Disposable {
|
|||||||
const {srcSection, srcCol, srcColId, tgtSection, tgtCol, tgtColId} = linkConfig;
|
const {srcSection, srcCol, srcColId, tgtSection, tgtCol, tgtColId} = linkConfig;
|
||||||
this._docModel = docModel;
|
this._docModel = docModel;
|
||||||
this._srcSection = srcSection;
|
this._srcSection = srcSection;
|
||||||
//this._tgtSection = tgtSection;
|
|
||||||
this._srcColId = srcColId;
|
this._srcColId = srcColId;
|
||||||
this._srcTableModel = docModel.dataTables[srcSection.table().tableId()];
|
this._srcTableModel = docModel.dataTables[srcSection.table().tableId()];
|
||||||
const srcTableData = this._srcTableModel.tableData;
|
const srcTableData = this._srcTableModel.tableData;
|
||||||
|
@ -644,14 +644,13 @@ export class RightPanel extends Disposable {
|
|||||||
const lstate = use(tgtSec.linkingState);
|
const lstate = use(tgtSec.linkingState);
|
||||||
const lfilter = lstate?.filterState ? use(lstate.filterState) : undefined;
|
const lfilter = lstate?.filterState ? use(lstate.filterState) : undefined;
|
||||||
|
|
||||||
//TODO JV TEMP DEBUG: srcLastUpdated is temporary
|
// Debug info for cursor linking
|
||||||
|
const inPos = lstate?.incomingCursorPos?.();
|
||||||
const cursorPosStr = (lstate?.cursorPos ? `${tgtSec.tableId()}[${use(lstate.cursorPos)}]` : "N/A") +
|
const cursorPosStr = (lstate?.cursorPos ? `${tgtSec.tableId()}[${use(lstate.cursorPos)}]` : "N/A") +
|
||||||
`\n srclastEdited: ${use(srcSec.lastCursorEdit)} \n tgtLastEdited: ${use(tgtSec.lastCursorEdit)}` +
|
// TODO: the lastEdited and incomingCursorPos is kinda technical, to do with how bidirectional linking determines
|
||||||
`\n incomingCursorPos: ${lstate?.incomingCursorPos ? `${lstate.incomingCursorPos()}` : "N/A"}` +
|
// priority for cyclical cursor links. Might be too technical even for the "advanced info" box
|
||||||
(() => {
|
`\n srclastEdited: T+${use(srcSec.lastCursorEdit)} \n tgtLastEdited: T+${use(tgtSec.lastCursorEdit)}` +
|
||||||
//const;
|
`\n incomingCursorPos: ${inPos ? `${inPos[0]}@T+${inPos[1]}` : "N/A"}`;
|
||||||
return '';
|
|
||||||
})();
|
|
||||||
|
|
||||||
//Main link info as a big string, will be in a <pre></pre> block
|
//Main link info as a big string, will be in a <pre></pre> block
|
||||||
let preString = "No Incoming Link";
|
let preString = "No Incoming Link";
|
||||||
|
@ -49,12 +49,13 @@ interface LinkNode {
|
|||||||
groupbyColumns?: Set<number>;
|
groupbyColumns?: Set<number>;
|
||||||
|
|
||||||
// list of ids of the sections that are ancestors to this section according to the linked section
|
// list of ids of the sections that are ancestors to this section according to the linked section
|
||||||
// relationship. ancestors[0] is this.section, ancestors[last] is oldest ancestor
|
// relationship. ancestors[0] is this.section, ancestors[length-1] is oldest ancestor
|
||||||
ancestors: number[];
|
ancestors: number[];
|
||||||
|
|
||||||
//corresponds to ancestors array, but is 1 shorter.
|
// Records which links between ancestors are same-table cursor-links
|
||||||
// if isAncCursLink[0] == true, that means the link from ancestors[0] to ancestors[1] is a same-table cursor-link
|
// if isAncCursLink[0] == true, that means the link from ancestors[0] to ancestors[1] is a same-table cursor-link
|
||||||
isAncestorCursorLink: boolean[];
|
// NOTE: (it is therefore 1 shorter than ancestors, unless the links form a cycle in which case it's the same len)
|
||||||
|
isAncestorSameTableCursorLink: boolean[];
|
||||||
|
|
||||||
// the section record. Must be the empty record sections that are to be created.
|
// the section record. Must be the empty record sections that are to be created.
|
||||||
section: ViewSectionRec;
|
section: ViewSectionRec;
|
||||||
@ -145,7 +146,7 @@ function isValidLink(source: LinkNode, target: LinkNode) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//The link must not create a cycle, unless it's only same-table cursor-links all the way to target
|
// The link must not create a cycle, unless it's only same-table cursor-links all the way to target
|
||||||
if (source.ancestors.includes(target.section.getRowId())) {
|
if (source.ancestors.includes(target.section.getRowId())) {
|
||||||
|
|
||||||
//cycles only allowed for cursor links
|
//cycles only allowed for cursor links
|
||||||
@ -158,26 +159,22 @@ function isValidLink(source: LinkNode, target: LinkNode) {
|
|||||||
// - when we hit target, we've verified that this is a legal cycle, so break
|
// - when we hit target, we've verified that this is a legal cycle, so break
|
||||||
// (ancestors further up the hierarchy past target don't matter, since once we set target.linkSrcSec = src.sec,
|
// (ancestors further up the hierarchy past target don't matter, since once we set target.linkSrcSec = src.sec,
|
||||||
// they would stop being ancestors of src)
|
// they would stop being ancestors of src)
|
||||||
// NOTE: we're guaranteed to hit target before the end of the array (because of the `if` above)
|
// NOTE: we're guaranteed to hit target before the end of the array (because of the `if(...includes...)` above)
|
||||||
// but I'm paranoid so let's check and throw if it happens
|
// ALSO NOTE: isAncestorSameTableCursorLink may be 1 shorter than ancestors, but it's accounted for by the above
|
||||||
// ALSO NOTE: isAncestorCursorLink may be 1 shorter than ancestors, but it's accounted for by the above
|
|
||||||
|
|
||||||
for(let i = 0; ; i++) {
|
for(let i = 0; ; i++) {
|
||||||
//We made it! All is well
|
|
||||||
if(source.ancestors[i] == target.section.getRowId()) {
|
if(source.ancestors[i] == target.section.getRowId()) {
|
||||||
|
// We made it! All is well
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// If we've hit the last ancestor and haven't found target, error out (shouldn't happen, we checked for it)
|
||||||
//If we've hit the last ancestor and haven't found target, error out (shouldn't happen)
|
|
||||||
if(i == source.ancestors.length-1) { throw Error("Error: Array doesn't include targetSection"); }
|
if(i == source.ancestors.length-1) { throw Error("Error: Array doesn't include targetSection"); }
|
||||||
|
|
||||||
//Need to keep following links back, make sure this one is cursorLink
|
// Need to follow another link back, verify that it's a same-table cursor-link
|
||||||
if(!source.isAncestorCursorLink[i]) {
|
if(!source.isAncestorSameTableCursorLink[i]) { return false; }
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
console.log("===== selectBy found valid cycle", JSON.stringify(source)); //TODO JV TEMP DEBUG
|
console.log("===== selectBy found valid cycle", JSON.stringify(source)); //TODO JV TEMP DEBUG
|
||||||
//Yay, this is a valid cycle of same-table cursor-links
|
// Yay, this is a valid cycle of same-table cursor-links
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -260,27 +257,27 @@ function fromViewSectionRec(section: ViewSectionRec): LinkNode[] {
|
|||||||
const table = section.table.peek();
|
const table = section.table.peek();
|
||||||
const ancestors: number[] = [];
|
const ancestors: number[] = [];
|
||||||
|
|
||||||
const isAncestorCursorLink: boolean[] = [];
|
const isAncestorSameTableCursorLink: boolean[] = [];
|
||||||
|
|
||||||
for (let sec = section; sec.getRowId(); sec = sec.linkSrcSection.peek()) {
|
for (let sec = section; sec.getRowId(); sec = sec.linkSrcSection.peek()) {
|
||||||
if (ancestors.includes(sec.getRowId())) {
|
if (ancestors.includes(sec.getRowId())) {
|
||||||
// tslint:disable-next-line:no-console
|
// There's a cycle in the existing link graph
|
||||||
console.warn(`Links should not create a cycle - section ids: ${ancestors}`);
|
// TODO if we're feeling fancy, can test here whether it's an all-same-table cycle and warn if not
|
||||||
//TODO JV: change this to only warn if cycles aren't all Cursor:Same-Table
|
// but there's other places we check for that
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ancestors.push(sec.getRowId());
|
ancestors.push(sec.getRowId());
|
||||||
|
|
||||||
//isAncestorCursorLink may be 1 shorter than ancestors, since last ancestor has no incoming link
|
//Determine if this link is a same-table cursor link
|
||||||
// however if we have a cycle (of cursor-links), then they'll be the same length
|
|
||||||
if(sec.linkSrcSection.peek().getRowId()) {
|
if(sec.linkSrcSection.peek().getRowId()) {
|
||||||
//TODO JV TEMP: Dear god determining if something is a cursor link or not is a nightmare
|
|
||||||
const srcCol = sec.linkSrcCol.peek().getRowId();
|
const srcCol = sec.linkSrcCol.peek().getRowId();
|
||||||
const tgtCol = sec.linkTargetCol.peek().getRowId();
|
const tgtCol = sec.linkTargetCol.peek().getRowId();
|
||||||
const srcTable = sec.linkSrcSection.peek().table.peek();
|
const srcTable = sec.linkSrcSection.peek().table.peek();
|
||||||
const srcIsSummary = srcTable.primaryTableId.peek() !== srcTable.tableId.peek();
|
const srcIsSummary = srcTable.primaryTableId.peek() !== srcTable.tableId.peek();
|
||||||
isAncestorCursorLink.push(srcCol == 0 && tgtCol == 0 && !srcIsSummary);
|
isAncestorSameTableCursorLink.push(srcCol == 0 && tgtCol == 0 && !srcIsSummary);
|
||||||
}
|
}
|
||||||
|
// NOTE: isAncestorSameTableCursorLink may be 1 shorter than ancestors, since last ancestor has no incoming link
|
||||||
|
// however if we have a cycle (of cursor-links), then they'll be the same length
|
||||||
}
|
}
|
||||||
|
|
||||||
const isSummary = table.primaryTableId.peek() !== table.tableId.peek();
|
const isSummary = table.primaryTableId.peek() !== table.tableId.peek();
|
||||||
@ -291,7 +288,7 @@ function fromViewSectionRec(section: ViewSectionRec): LinkNode[] {
|
|||||||
groupbyColumns: isSummary ? table.summarySourceColRefs.peek() : undefined,
|
groupbyColumns: isSummary ? table.summarySourceColRefs.peek() : undefined,
|
||||||
widgetType: section.parentKey.peek(),
|
widgetType: section.parentKey.peek(),
|
||||||
ancestors,
|
ancestors,
|
||||||
isAncestorCursorLink,
|
isAncestorSameTableCursorLink,
|
||||||
section,
|
section,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -330,7 +327,7 @@ function fromPageWidget(docModel: DocModel, pageWidget: IPageWidget): LinkNode[]
|
|||||||
groupbyColumns,
|
groupbyColumns,
|
||||||
widgetType: pageWidget.type,
|
widgetType: pageWidget.type,
|
||||||
ancestors: [],
|
ancestors: [],
|
||||||
isAncestorCursorLink: [],
|
isAncestorSameTableCursorLink: [],
|
||||||
section: docModel.viewSections.getRowModel(pageWidget.section),
|
section: docModel.viewSections.getRowModel(pageWidget.section),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user