diff --git a/etc/conf.org b/etc/conf.org index 26ce8bf..79d4af0 100644 --- a/etc/conf.org +++ b/etc/conf.org @@ -3061,6 +3061,12 @@ original function being advised and ARGS are the arguments." (org-x-headline-is-iterator-without-archive-target-p)) ,(nd/org-def-super-agenda-pred "Future Creation Timestamp" (org-x-headline-is-task-with-future-creation-timestamp-p)) + ,(nd/org-def-super-agenda-pred "Unscheduled Meetings" + (org-x-headline-is-unscheduled-meeting-p)) + ,(nd/org-def-super-agenda-pred "Meeting without Effort" + (org-x-headline-is-meeting-without-effort-p)) + ,(nd/org-def-super-agenda-pred "Meeting without Agenda" + (org-x-headline-is-meeting-without-agenda-p)) (:discard (:anything t)))))))) ("m" @@ -3070,6 +3076,7 @@ original function being advised and ARGS are the arguments." - org-x-tag-refile + org-x-tag-meeting) ((org-agenda-overriding-header "Meetings") + (org-agenda-sorting-strategy '(time-up scheduled-down)) (org-super-agenda-groups ',(nd/org-def-super-agenda-automap (-when-let (ts (org-x--headline-get-property-epoch-time "SCHEDULED")) diff --git a/local/lib/org-x/org-x.el b/local/lib/org-x/org-x.el index aeb54be..0d255f3 100644 --- a/local/lib/org-x/org-x.el +++ b/local/lib/org-x/org-x.el @@ -674,12 +674,55 @@ property." (org-x-headline-is-created-in-future) t))) -(defun org-x-headline-is-task-meeting () +(defun org-x-headline-is-meeting-p () "Return t if current headline is a meeting." (-when-let (keyword (org-x-headline-is-task-p)) (and (not (member keyword org-x-done-keywords)) (org-x-headline-has-tag-p org-x-tag-meeting) - (org-x-headline-is-scheduled-p) + t))) + +(defun org-x-headline-is-unscheduled-meeting-p () + "Return t if current headline is an unscheduled meeting." + (-when-let (keyword (org-x-headline-is-task-p)) + (and (not (member keyword org-x-done-keywords)) + (org-x-headline-has-tag-p org-x-tag-meeting) + (not (org-x-headline-is-scheduled-p)) + t))) + +(defun org-x-headline-is-meeting-without-effort-p () + "Return t if current headline is a meeting with no effort property." + (-when-let (keyword (org-x-headline-is-task-p)) + (and (not (member keyword org-x-done-keywords)) + (org-x-headline-has-tag-p org-x-tag-meeting) + (not (org-entry-get nil "Effort" nil)) + t))) + +(defun org-x-headline-get-meeting-agenda-items () + "Return the agenda items for the current headline. +If none are present, return nil. If \"NA\" is present, return +'none'. Agenda items are in the 'AGENDA_ITEMS' drawer and should +actually be items (that is part of a plain-list node)" + (-when-let (n (-some->> (org-ml-parse-this-headline) + (org-ml-headline-get-section) + (--find (and (org-ml-is-type 'drawer it) + (equal (org-ml-get-property :drawer-name it) + "AGENDA_ITEMS"))) + (org-ml-get-children) + (car))) + (let ((y (org-ml-get-type n))) + (cond + ((eq y 'plain-list) + (org-ml-get-children n)) + ((and (eq y 'paragraph) + (equal "NA" (s-trim (car (org-ml-get-children n))))) + 'none))))) + +(defun org-x-headline-is-meeting-without-agenda-p () + "Return t if current headline is a meeting with no agenda." + (-when-let (keyword (org-x-headline-is-task-p)) + (and (not (member keyword org-x-done-keywords)) + (org-x-headline-has-tag-p org-x-tag-meeting) + (not (org-x-headline-get-meeting-agenda-items)) t))) ;; (defun org-x-is-todo-child (keyword)