Skip to content

Commit 6fad70b

Browse files
authored
Merge pull request #3377 from obsidian-tasks-group/refactor-list-item-rendering
refactor: Move code for rendering ListItems to TaskLineRenderer
2 parents c6d5e40 + a57a9fc commit 6fad70b

File tree

2 files changed

+63
-54
lines changed

2 files changed

+63
-54
lines changed

src/Renderer/QueryResultsRenderer.ts

Lines changed: 8 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import type { IQuery } from '../IQuery';
66
import { QueryLayout } from '../Layout/QueryLayout';
77
import { TaskLayout } from '../Layout/TaskLayout';
88
import { PerformanceTracker } from '../lib/PerformanceTracker';
9-
import { replaceTaskWithTasks } from '../Obsidian/File';
109
import { explainResults, getQueryForQueryRenderer } from '../Query/QueryRendererHelper';
1110
import { State } from '../Obsidian/Cache';
1211
import type { GroupDisplayHeading } from '../Query/Group/GroupDisplayHeading';
@@ -353,61 +352,16 @@ export class QueryResultsRenderer {
353352
return await this.addTask(taskList, taskLineRenderer, listItem, taskIndex, queryRendererParameters);
354353
}
355354

356-
return await this.addListItem(taskList, listItem, taskIndex);
355+
return await this.addListItem(taskList, taskLineRenderer, listItem, taskIndex);
357356
}
358357

359-
private async addListItem(taskList: HTMLUListElement, listItem: ListItem, listItemIndex: number) {
360-
const li = createAndAppendElement('li', taskList);
361-
362-
if (listItem.statusCharacter) {
363-
const checkbox = createAndAppendElement('input', li);
364-
checkbox.classList.add('task-list-item-checkbox');
365-
checkbox.type = 'checkbox';
366-
367-
checkbox.addEventListener('click', (event: MouseEvent) => {
368-
event.preventDefault();
369-
// It is required to stop propagation so that obsidian won't write the file with the
370-
// checkbox (un)checked. Obsidian would write after us and overwrite our change.
371-
event.stopPropagation();
372-
373-
// Should be re-rendered as enabled after update in file.
374-
checkbox.disabled = true;
375-
376-
const checkedOrUncheckedListItem = listItem.checkOrUncheck();
377-
replaceTaskWithTasks({ originalTask: listItem, newTasks: checkedOrUncheckedListItem });
378-
});
379-
380-
if (listItem.statusCharacter !== ' ') {
381-
checkbox.checked = true;
382-
li.classList.add('is-checked');
383-
}
384-
385-
li.classList.add('task-list-item');
386-
387-
// Set these to be compatible with stock obsidian lists:
388-
li.setAttribute('data-task', listItem.statusCharacter.trim());
389-
// Trim to ensure empty attribute for space. Same way as obsidian.
390-
li.setAttribute('data-line', listItemIndex.toString());
391-
}
392-
393-
const span = createAndAppendElement('span', li);
394-
await this.textRenderer(
395-
listItem.description,
396-
span,
397-
listItem.findClosestParentTask()?.path ?? '',
398-
this.obsidianComponent,
399-
);
400-
401-
// Unwrap the p-tag that was created by the MarkdownRenderer:
402-
const pElement = span.querySelector('p');
403-
if (pElement !== null) {
404-
while (pElement.firstChild) {
405-
span.insertBefore(pElement.firstChild, pElement);
406-
}
407-
pElement.remove();
408-
}
409-
410-
return li;
358+
private async addListItem(
359+
taskList: HTMLUListElement,
360+
taskLineRenderer: TaskLineRenderer,
361+
listItem: ListItem,
362+
listItemIndex: number,
363+
) {
364+
return await taskLineRenderer.renderListItem(taskList, listItem, listItemIndex);
411365
}
412366

413367
private async addTask(

src/Renderer/TaskLineRenderer.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { defaultTaskSaver } from '../ui/Menus/TaskEditingMenu';
1414
import { promptForDate } from '../ui/Menus/DatePicker';
1515
import { splitDateText } from '../DateTime/Postponer';
1616
import { DateMenu } from '../ui/Menus/DateMenu';
17+
import type { ListItem } from '../Task/ListItem';
1718
import { TaskFieldRenderer } from './TaskFieldRenderer';
1819

1920
/**
@@ -402,4 +403,58 @@ export class TaskLineRenderer {
402403
});
403404
});
404405
}
406+
407+
public async renderListItem(taskList: HTMLUListElement, listItem: ListItem, listItemIndex: number) {
408+
const li = createAndAppendElement('li', taskList);
409+
410+
if (listItem.statusCharacter) {
411+
const checkbox = createAndAppendElement('input', li);
412+
checkbox.classList.add('task-list-item-checkbox');
413+
checkbox.type = 'checkbox';
414+
415+
checkbox.addEventListener('click', (event: MouseEvent) => {
416+
event.preventDefault();
417+
// It is required to stop propagation so that obsidian won't write the file with the
418+
// checkbox (un)checked. Obsidian would write after us and overwrite our change.
419+
event.stopPropagation();
420+
421+
// Should be re-rendered as enabled after update in file.
422+
checkbox.disabled = true;
423+
424+
const checkedOrUncheckedListItem = listItem.checkOrUncheck();
425+
replaceTaskWithTasks({ originalTask: listItem, newTasks: checkedOrUncheckedListItem });
426+
});
427+
428+
if (listItem.statusCharacter !== ' ') {
429+
checkbox.checked = true;
430+
li.classList.add('is-checked');
431+
}
432+
433+
li.classList.add('task-list-item');
434+
435+
// Set these to be compatible with stock obsidian lists:
436+
li.setAttribute('data-task', listItem.statusCharacter.trim());
437+
// Trim to ensure empty attribute for space. Same way as obsidian.
438+
li.setAttribute('data-line', listItemIndex.toString());
439+
}
440+
441+
const span = createAndAppendElement('span', li);
442+
await this.textRenderer(
443+
listItem.description,
444+
span,
445+
listItem.findClosestParentTask()?.path ?? '',
446+
this.obsidianComponent,
447+
);
448+
449+
// Unwrap the p-tag that was created by the MarkdownRenderer:
450+
const pElement = span.querySelector('p');
451+
if (pElement !== null) {
452+
while (pElement.firstChild) {
453+
span.insertBefore(pElement.firstChild, pElement);
454+
}
455+
pElement.remove();
456+
}
457+
458+
return li;
459+
}
405460
}

0 commit comments

Comments
 (0)