(core) Revealing hidden pages with visible children.

Summary:
When a page is hidden, all its nested pages are shown as children of
a different page that happens to be before (as in pagePos) that page.

This diff shows those pages as CENSORED.

Test Plan: Updated

Reviewers: alexmojaki

Reviewed By: alexmojaki

Subscribers: alexmojaki

Differential Revision: https://phab.getgrist.com/D3670
This commit is contained in:
Jarosław Sadziński
2022-10-28 10:04:59 +02:00
parent b263d83122
commit 7c9cb9843e
9 changed files with 295 additions and 25 deletions

View File

@@ -24,6 +24,7 @@ import reverse = require("lodash/reverse");
* `TreeModel` and any item in it implements `TreeItem`.
*/
export interface TreeNode {
hidden?: boolean;
// Returns an observable array of children. Or null if the node does not accept children.
children(): ObsArray<TreeItem>|null;
@@ -61,7 +62,7 @@ export interface TreeTableData {
}
// describes a function that builds dom for a particular record
type DomBuilder = (id: number) => HTMLElement;
type DomBuilder = (id: number, hidden: boolean) => HTMLElement;
// Returns a list of the records from table that is suitable to build the tree model, ie: records
@@ -108,8 +109,9 @@ export function fromTableData(table: TreeTableData, buildDom: DomBuilder, oldMod
const children = indentations[rec.indentation + 1] || [];
delete indentations[rec.indentation + 1];
const item = oldItems[rec.id] || new TreeItemRecord();
item.hidden = rec.hidden;
item.init(storage, index, reverse(children));
item.buildDom = () => buildDom(rec.id);
item.buildDom = () => buildDom(rec.id, rec.hidden);
siblings.push(item);
});
return new TreeModelRecord(storage, reverse(indentations[0] || []));
@@ -123,7 +125,7 @@ interface Storage {
// TreeNode implementation that uses a grist table.
export class TreeNodeRecord implements TreeNode {
public hidden: boolean = false;
public storage: Storage;
public index: number|"root";
public children: () => ObsArray<TreeItemRecord>;
@@ -187,6 +189,7 @@ export class TreeNodeRecord implements TreeNode {
forEach(update[0], (val, key) => values[key] = update.map(rec => rec[key]));
const rowIds = values.id;
delete values.id;
delete values.hidden;
userActions.push(["BulkUpdateRecord", rowIds, values]);
}