Skip to content

Commit 508a831

Browse files
authored
Merge pull request #3679 from ilandikov/refactor/children-QueryResultsRendererBase
refactor: render children from `QueryResultsRendererBase`
2 parents 770fb26 + f1c33c0 commit 508a831

File tree

2 files changed

+55
-46
lines changed

2 files changed

+55
-46
lines changed

src/Renderer/HtmlQueryResultsRenderer.ts

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ import { postponeButtonTitle, shouldShowPostponeButton } from '../DateTime/Postp
33
import { QueryLayout } from '../Layout/QueryLayout';
44
import { TaskLayout } from '../Layout/TaskLayout';
55
import type { GroupDisplayHeading } from '../Query/Group/GroupDisplayHeading';
6+
import type { TaskGroup } from '../Query/Group/TaskGroup';
67
import type { QueryResult } from '../Query/QueryResult';
78
import type { ListItem } from '../Task/ListItem';
89
import type { Task } from '../Task/Task';
910
import { PostponeMenu } from '../ui/Menus/PostponeMenu';
1011
import { showMenu } from '../ui/Menus/TaskEditingMenu';
11-
import type { TaskGroup } from '../Query/Group/TaskGroup';
1212
import type { QueryRendererParameters } from './QueryResultsRenderer';
13-
import { TaskLineRenderer, type TextRenderer, createAndAppendElement } from './TaskLineRenderer';
1413
import { QueryResultsRendererBase, type QueryResultsRendererGetters } from './QueryResultsRendererBase';
14+
import { TaskLineRenderer, type TextRenderer, createAndAppendElement } from './TaskLineRenderer';
1515

1616
export class HtmlQueryResultsRenderer extends QueryResultsRendererBase {
1717
// Renders the description in TaskLineRenderer:
@@ -28,6 +28,7 @@ export class HtmlQueryResultsRenderer extends QueryResultsRendererBase {
2828
private readonly taskLineRenderer: TaskLineRenderer;
2929

3030
private readonly ulElementStack: HTMLUListElement[] = [];
31+
private readonly liElementStack: HTMLLIElement[] = [];
3132

3233
private readonly queryRendererParameters: QueryRendererParameters;
3334

@@ -105,18 +106,13 @@ export class HtmlQueryResultsRenderer extends QueryResultsRendererBase {
105106
}
106107

107108
protected async addTaskGroup(group: TaskGroup): Promise<void> {
108-
// TODO re-extract the method to include this back
109-
const taskList = createAndAppendElement('ul', this.getContent());
110-
this.ulElementStack.push(taskList);
111-
try {
112-
await this.addTaskList(group.tasks);
113-
} finally {
114-
this.ulElementStack.pop();
115-
}
109+
await this.addTaskList(group.tasks);
116110
}
117111

118112
protected beginTaskList(): void {
119-
const taskList = this.currentULElement();
113+
const taskListContainer = this.ulElementStack.length > 0 ? this.currentLIElement() : this.getContent();
114+
const taskList = createAndAppendElement('ul', taskListContainer);
115+
120116
taskList.classList.add(
121117
'contains-task-list',
122118
'plugin-tasks-query-result',
@@ -128,29 +124,30 @@ export class HtmlQueryResultsRenderer extends QueryResultsRendererBase {
128124
if (groupingAttribute && groupingAttribute.length > 0) {
129125
taskList.dataset.taskGroupBy = groupingAttribute;
130126
}
127+
128+
this.ulElementStack.push(taskList);
129+
}
130+
131+
protected endTaskList(): void {
132+
this.ulElementStack.pop();
131133
}
132134

133-
protected async addListItem(listItem: ListItem, listItemIndex: number, children: ListItem[]): Promise<void> {
135+
protected beginListItem() {
134136
const taskList = this.currentULElement();
135137
const listItemElement = createAndAppendElement('li', taskList);
136-
await this.taskLineRenderer.renderListItem(listItemElement, listItem, listItemIndex);
138+
this.liElementStack.push(listItemElement);
139+
}
137140

138-
if (children.length > 0) {
139-
// TODO re-extract the method to include this back
140-
const taskList1 = createAndAppendElement('ul', listItemElement);
141-
this.ulElementStack.push(taskList1);
142-
try {
143-
await this.addTaskList(children);
144-
} finally {
145-
this.ulElementStack.pop();
146-
}
147-
}
141+
protected async addListItem(listItem: ListItem, listItemIndex: number): Promise<void> {
142+
const listItemElement = this.currentLIElement();
143+
144+
await this.taskLineRenderer.renderListItem(listItemElement, listItem, listItemIndex);
148145
}
149146

150-
protected async addTask(task: Task, taskIndex: number, children: ListItem[]): Promise<void> {
147+
protected async addTask(task: Task, taskIndex: number): Promise<void> {
151148
const isFilenameUnique = this.isFilenameUnique({ task }, this.queryRendererParameters.allMarkdownFiles());
152-
const parentUlElement = this.currentULElement();
153-
const listItem = createAndAppendElement('li', parentUlElement);
149+
const listItem = this.currentLIElement();
150+
154151
await this.taskLineRenderer.renderTaskLine({
155152
li: listItem,
156153
task,
@@ -185,17 +182,6 @@ export class HtmlQueryResultsRenderer extends QueryResultsRendererBase {
185182
}
186183

187184
this.currentULElement().appendChild(listItem);
188-
189-
if (children.length > 0) {
190-
// TODO re-extract the method to include this back
191-
const taskList1 = createAndAppendElement('ul', listItem);
192-
this.ulElementStack.push(taskList1);
193-
try {
194-
await this.addTaskList(children);
195-
} finally {
196-
this.ulElementStack.pop();
197-
}
198-
}
199185
}
200186

201187
private addEditButton(listItem: HTMLElement, task: Task) {
@@ -347,4 +333,8 @@ export class HtmlQueryResultsRenderer extends QueryResultsRendererBase {
347333
private currentULElement(): HTMLUListElement {
348334
return this.ulElementStack[this.ulElementStack.length - 1];
349335
}
336+
337+
private currentLIElement() {
338+
return this.liElementStack[this.liElementStack.length - 1];
339+
}
350340
}

src/Renderer/QueryResultsRendererBase.ts

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,15 +125,21 @@ export abstract class QueryResultsRendererBase {
125125
protected async addTaskList(listItems: ListItem[]): Promise<void> {
126126
this.beginTaskList();
127127

128-
if (this.getters.query().queryLayoutOptions.hideTree) {
129-
await this.addFlatTaskList(listItems);
130-
} else {
131-
await this.addTreeTaskList(listItems);
128+
try {
129+
if (this.getters.query().queryLayoutOptions.hideTree) {
130+
await this.addFlatTaskList(listItems);
131+
} else {
132+
await this.addTreeTaskList(listItems);
133+
}
134+
} finally {
135+
this.endTaskList();
132136
}
133137
}
134138

135139
protected abstract beginTaskList(): void;
136140

141+
protected abstract endTaskList(): void;
142+
137143
/**
138144
* Old-style rendering of tasks:
139145
* - What is rendered:
@@ -146,7 +152,8 @@ export abstract class QueryResultsRendererBase {
146152
private async addFlatTaskList(listItems: ListItem[]): Promise<void> {
147153
for (const [listItemIndex, listItem] of listItems.entries()) {
148154
if (listItem instanceof Task) {
149-
await this.addTask(listItem, listItemIndex, []);
155+
this.beginListItem();
156+
await this.addTask(listItem, listItemIndex);
150157
}
151158
}
152159
}
@@ -173,12 +180,16 @@ export abstract class QueryResultsRendererBase {
173180
continue;
174181
}
175182

183+
this.beginListItem();
184+
176185
if (listItem instanceof Task) {
177-
await this.addTask(listItem, listItemIndex, listItem.children);
186+
await this.addTask(listItem, listItemIndex);
178187
} else {
179-
await this.addListItem(listItem, listItemIndex, listItem.children);
188+
await this.addListItem(listItem, listItemIndex);
180189
}
181190

191+
await this.addChildren(listItem.children);
192+
182193
// The children of this item will be added thanks to recursion and the fact that we always render all children currently
183194
this.addedListItems.add(listItem);
184195

@@ -210,9 +221,17 @@ export abstract class QueryResultsRendererBase {
210221
return this.addedListItems.has(listItem);
211222
}
212223

213-
protected abstract addListItem(listItem: ListItem, listItemIndex: number, children: ListItem[]): Promise<void>;
224+
protected abstract beginListItem(): void;
225+
226+
protected abstract addListItem(listItem: ListItem, listItemIndex: number): Promise<void>;
227+
228+
protected abstract addTask(task: Task, taskIndex: number): Promise<void>;
214229

215-
protected abstract addTask(task: Task, taskIndex: number, children: ListItem[]): Promise<void>;
230+
private async addChildren(children: ListItem[]) {
231+
if (children.length > 0) {
232+
await this.addTaskList(children);
233+
}
234+
}
216235

217236
/**
218237
* Display headings for a group of tasks.

0 commit comments

Comments
 (0)