@@ -17,7 +17,7 @@ import type { TasksEvents } from '../Obsidian/TasksEvents';
1717import { TasksFile } from '../Scripting/TasksFile' ;
1818import { DateFallback } from '../DateTime/DateFallback' ;
1919import type { Task } from '../Task/Task' ;
20- import { QueryResultsRenderer } from './QueryResultsRenderer' ;
20+ import { type BacklinksEventHandler , type EditButtonClickHandler , QueryResultsRenderer } from './QueryResultsRenderer' ;
2121import { createAndAppendElement } from './TaskLineRenderer' ;
2222
2323export class QueryRenderer {
@@ -155,62 +155,68 @@ class QueryRenderChild extends MarkdownRenderChild {
155155 await this . queryResultsRenderer . render ( state , tasks , content , {
156156 allTasks : this . plugin . getTasks ( ) ,
157157 allMarkdownFiles : this . app . vault . getMarkdownFiles ( ) ,
158- backlinksClickHandler,
159- backlinksMousedownHandler,
160- editTaskPencilClickHandler,
158+ backlinksClickHandler : createBacklinksClickHandler ( this . app ) ,
159+ backlinksMousedownHandler : createBacklinksMousedownHandler ( this . app ) ,
160+ editTaskPencilClickHandler : createEditTaskPencilClickHandler ( this . app ) ,
161161 } ) ;
162162
163163 this . containerEl . firstChild ?. replaceWith ( content ) ;
164164 }
165165}
166166
167- function editTaskPencilClickHandler ( event : MouseEvent , task : Task , allTasks : Task [ ] ) {
168- event . preventDefault ( ) ;
169-
170- const onSubmit = async ( updatedTasks : Task [ ] ) : Promise < void > => {
171- await replaceTaskWithTasks ( {
172- originalTask : task ,
173- newTasks : DateFallback . removeInferredStatusIfNeeded ( task , updatedTasks ) ,
167+ function createEditTaskPencilClickHandler ( app : App ) : EditButtonClickHandler {
168+ return function editTaskPencilClickHandler ( event : MouseEvent , task : Task , allTasks : Task [ ] ) {
169+ event . preventDefault ( ) ;
170+
171+ const onSubmit = async ( updatedTasks : Task [ ] ) : Promise < void > => {
172+ await replaceTaskWithTasks ( {
173+ originalTask : task ,
174+ newTasks : DateFallback . removeInferredStatusIfNeeded ( task , updatedTasks ) ,
175+ } ) ;
176+ } ;
177+
178+ // Need to create a new instance every time, as cursor/task can change.
179+ const taskModal = new TaskModal ( {
180+ app,
181+ task,
182+ onSubmit,
183+ allTasks,
174184 } ) ;
185+ taskModal . open ( ) ;
175186 } ;
176-
177- // Need to create a new instance every time, as cursor/task can change.
178- const taskModal = new TaskModal ( {
179- app,
180- task,
181- onSubmit,
182- allTasks,
183- } ) ;
184- taskModal . open ( ) ;
185- }
186-
187- async function backlinksClickHandler ( ev : MouseEvent , task : Task ) {
188- const result = await getTaskLineAndFile ( task , app . vault ) ;
189- if ( result ) {
190- const [ line , file ] = result ;
191- const leaf = app . workspace . getLeaf ( Keymap . isModEvent ( ev ) ) ;
192- // When the corresponding task has been found,
193- // suppress the default behavior of the mouse click event
194- // (which would interfere e.g. if the query is rendered inside a callout).
195- ev . preventDefault ( ) ;
196- // Instead of the default behavior, open the file with the required line highlighted.
197- await leaf . openFile ( file , { eState : { line : line } } ) ;
198- }
199187}
200188
201- async function backlinksMousedownHandler ( ev : MouseEvent , task : Task ) {
202- // Open in a new tab on middle-click.
203- // This distinction is not available in the 'click' event, so we handle the 'mousedown' event
204- // solely for this.
205- // (for regular left-click we prefer the 'click' event, and not to just do everything here, because
206- // the 'click' event is more generic for touch devices etc.)
207- if ( ev . button === 1 ) {
189+ function createBacklinksClickHandler ( app : App ) : BacklinksEventHandler {
190+ return async function backlinksClickHandler ( ev : MouseEvent , task : Task ) {
208191 const result = await getTaskLineAndFile ( task , app . vault ) ;
209192 if ( result ) {
210193 const [ line , file ] = result ;
211- const leaf = app . workspace . getLeaf ( 'tab' ) ;
194+ const leaf = app . workspace . getLeaf ( Keymap . isModEvent ( ev ) ) ;
195+ // When the corresponding task has been found,
196+ // suppress the default behavior of the mouse click event
197+ // (which would interfere e.g. if the query is rendered inside a callout).
212198 ev . preventDefault ( ) ;
213- await leaf . openFile ( file , { eState : { line : line } } ) ;
199+ // Instead of the default behavior, open the file with the required line highlighted.
200+ await leaf . openFile ( file , { eState : { line } } ) ;
214201 }
215- }
202+ } ;
203+ }
204+
205+ function createBacklinksMousedownHandler ( app : App ) : BacklinksEventHandler {
206+ return async function backlinksMousedownHandler ( ev : MouseEvent , task : Task ) {
207+ // Open in a new tab on middle-click.
208+ // This distinction is not available in the 'click' event, so we handle the 'mousedown' event
209+ // solely for this.
210+ // (for regular left-click we prefer the 'click' event, and not to just do everything here, because
211+ // the 'click' event is more generic for touch devices etc.)
212+ if ( ev . button === 1 ) {
213+ const result = await getTaskLineAndFile ( task , app . vault ) ;
214+ if ( result ) {
215+ const [ line , file ] = result ;
216+ const leaf = app . workspace . getLeaf ( 'tab' ) ;
217+ ev . preventDefault ( ) ;
218+ await leaf . openFile ( file , { eState : { line : line } } ) ;
219+ }
220+ }
221+ } ;
216222}
0 commit comments