From 96a7f35a9057bb8e2e929fb0916e4f18bf283f27 Mon Sep 17 00:00:00 2001 From: Daniel Borchmann Date: Sat, 10 Sep 2022 09:39:30 +0200 Subject: [PATCH] Allow entries in workload report to be sorted --- site-lisp/db-org.el | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/site-lisp/db-org.el b/site-lisp/db-org.el index bfaf2c9..4e94a8b 100644 --- a/site-lisp/db-org.el +++ b/site-lisp/db-org.el @@ -454,14 +454,29 @@ PARAMS is a property list of the following parameters: `org-ql' expression (in sexp syntax) to filter the list of tasks. +`:sort-column' + + Specify the column to sort by. Can be any of `task', `effort', + `timestamp', `scheduled', or `deadline'. + All tasks between `:start-date' and `:end-date' will be collected and their effort summed up. The date format is everything understood by `org-read-date'." (let* ((start-date (plist-get params :start-date)) (end-date (plist-get params :end-date)) (org-ql-match (plist-get params :org-ql-match)) + (sort-column-count (cl-case (plist-get params :sort-column) + ((nil) 2) ; sort by effort by default + ((task) 1) + ((effort) 2) + ((timestamp) 3) + ((scheduled) 4) + ((deadline) 5) + (otherwise (user-error ":sort-column value invalid, see docstring of `org-dblock-write:db/org-workload-report' for options")))) (task-summary (db/org-planned-tasks-in-range start-date end-date org-ql-match))) + (message "foo %s %s" (plist-get params :sort-column) sort-column-count) + (insert "| Task | Effort | Timestamp | SCHEDULED | DEADLINE |\n|---|\n") (pcase-dolist (`(,task-id . ,effort-string) (cdr task-summary)) (insert (format "| %s | %s | %s | %s | %s |\n" @@ -469,15 +484,20 @@ understood by `org-read-date'." (or effort-string "") (or (org-entry-get (org-id-find task-id 'marker) "TIMESTAMP") - "not set") + "") (or (org-entry-get (org-id-find task-id 'marker) "SCHEDULED") - "not set") + "") (or (org-entry-get (org-id-find task-id 'marker) "DEADLINE") - "not set")))) + "")))) (insert (format "|---|\n| Total | %s |\n|---|" (car task-summary))) - (org-table-align))) + (org-table-align) + (forward-line -4) ; go back to actual data + (beginning-of-line) + (dotimes (_ sort-column-count) ; move to column to sort + (org-table-next-field)) + (org-table-sort-lines nil ?t))) (defun db/org-insert-workload-report () "Create dynamic block of planned tasks in given time range."