feat: support setting a default story type
Expose a `org-clubhouse-default-story-type` variable that can be set to `feature`, `bug`, `chore` or `prompt`. If set to `prompt`, the org-clubhouse `Create new story` flow will prompt for the story type each time. If set to any of the other values, the `Create new story` flow will use that value for all new stories until that variable is set otherwise. This also exposes a new interactive function called `org-clubhouse-set-default-story-type` that prompts users to set the default story type value.
This commit is contained in:
		
							parent
							
								
									bb97402cbe
								
							
						
					
					
						commit
						c4096e5dbb
					
				
					 1 changed files with 51 additions and 29 deletions
				
			
		|  | @ -57,6 +57,12 @@ If unset all projects will be synchronized") | |||
| 
 | ||||
| (defvar org-clubhouse-workflow-name "Default") | ||||
| 
 | ||||
| (defvar org-clubhouse-default-story-type nil | ||||
|   "Sets the default story type. If set to 'nil', it will interactively prompt | ||||
| the user each and every time a new story is created. If set to 'feature', | ||||
| 'bug', or 'chore', that value will be used as the default and the user will | ||||
| not be prompted") | ||||
| 
 | ||||
| (defvar org-clubhouse-state-alist | ||||
|   '(("LATER"  . "Unscheduled") | ||||
|     ("[ ]"    . "Ready for Development") | ||||
|  | @ -73,6 +79,12 @@ If unset all projects will be synchronized") | |||
|     ("bug"     . "Bug") | ||||
|     ("chore"   . "Chore"))) | ||||
| 
 | ||||
| (defvar org-clubhouse-default-story-types | ||||
|   '(("feature" . "Feature") | ||||
|     ("bug"     . "Bug") | ||||
|     ("chore"   . "Chore") | ||||
|     ("prompt"  . "**Prompt each time (do not set a default story type)**"))) | ||||
| 
 | ||||
| ;;; | ||||
| ;;; Utilities | ||||
| ;;; | ||||
|  | @ -111,6 +123,11 @@ If unset all projects will be synchronized") | |||
| 
 | ||||
|  ) | ||||
| 
 | ||||
| (defun find-match-in-alist (target alist) | ||||
|   (->> alist | ||||
|        (-find (lambda (key-value) | ||||
|                    (string-equal (cdr key-value) target))) | ||||
|        car)) | ||||
| 
 | ||||
| (defun org-clubhouse-collect-headlines (beg end) | ||||
|   "Collects the headline at point or the headlines in a region. Returns a list." | ||||
|  | @ -175,13 +192,13 @@ If unset all projects will be synchronized") | |||
|        (rx "[[" (one-or-more anything) "]" | ||||
|            "[" (group (one-or-more digit)) "]]") | ||||
|        clubhouse-id-link) | ||||
|       (string-to-int (match-string 1 clubhouse-id-link))) | ||||
|       (string-to-number (match-string 1 clubhouse-id-link))) | ||||
|      ((string-match-p | ||||
|        (rx buffer-start | ||||
|            (one-or-more digit) | ||||
|            buffer-end) | ||||
|        clubhouse-id-link) | ||||
|       (string-to-int clubhouse-id-link))))) | ||||
|       (string-to-number clubhouse-id-link))))) | ||||
| 
 | ||||
| (comment | ||||
|  (let ((strn "[[https://app.clubhouse.io/example/story/2330][2330]]")) | ||||
|  | @ -189,7 +206,7 @@ If unset all projects will be synchronized") | |||
|     (rx "[[" (one-or-more anything) "]" | ||||
|         "[" (group (one-or-more digit)) "]]") | ||||
|     strn) | ||||
|    (string-to-int (match-string 1 strn))) | ||||
|    (string-to-number (match-string 1 strn))) | ||||
| 
 | ||||
|  ) | ||||
| 
 | ||||
|  | @ -373,10 +390,7 @@ If unset all projects will be synchronized") | |||
|    :history 'org-clubhouse-project-history | ||||
|    :action (lambda (selected) | ||||
|              (let ((project-id | ||||
|                     (->> (org-clubhouse-projects) | ||||
|                          (-find (lambda (proj) | ||||
|                                     (string-equal (cdr proj) selected))) | ||||
|                          car))) | ||||
|                     (find-match-in-alist selected (org-clubhouse-projects)))) | ||||
|                (message "%d" project-id) | ||||
|                (funcall cb project-id))))) | ||||
| 
 | ||||
|  | @ -387,10 +401,7 @@ If unset all projects will be synchronized") | |||
|    :history 'org-clubhouse-epic-history | ||||
|    :action (lambda (selected) | ||||
|              (let ((epic-id | ||||
|                     (->> (org-clubhouse-epics) | ||||
|                          (-find (lambda (proj) | ||||
|                                     (string-equal (cdr proj) selected))) | ||||
|                          car))) | ||||
|                     (find-match-in-alist selected (org-clubhouse-epics)))) | ||||
|                (message "%d" epic-id) | ||||
|                (funcall cb epic-id))))) | ||||
| 
 | ||||
|  | @ -402,10 +413,7 @@ If unset all projects will be synchronized") | |||
|    :history 'org-clubhouse-milestone-history | ||||
|    :action (lambda (selected) | ||||
|              (let ((milestone-id | ||||
|                     (->> (org-clubhouse-milestones) | ||||
|                          (-find (lambda (proj) | ||||
|                                     (string-equal (cdr proj) selected))) | ||||
|                          car))) | ||||
|                     (find-match-in-alist selected (org-clubhouse-milestones)))) | ||||
|                (message "%d" milestone-id) | ||||
|                (funcall cb milestone-id))))) | ||||
| 
 | ||||
|  | @ -416,12 +424,22 @@ If unset all projects will be synchronized") | |||
|    :history 'org-clubhouse-story-history | ||||
|    :action (lambda (selected) | ||||
|              (let ((story-type | ||||
|                     (->> org-clubhouse-story-types | ||||
|                          (-find (lambda (proj) | ||||
|                                     (string-equal (cdr proj) selected))) | ||||
|                          car))) | ||||
|                     (find-match-in-alist selected org-clubhouse-story-types))) | ||||
|                (funcall cb story-type))))) | ||||
| 
 | ||||
| (defun org-clubhouse-prompt-for-default-story-type () | ||||
|   (interactive) | ||||
|   (ivy-read | ||||
|    "Select a default story type: " | ||||
|    (-map #'cdr org-clubhouse-default-story-types) | ||||
|    :history 'org-clubhouse-default-story-history | ||||
|    :action (lambda (selected) | ||||
|              (let ((story-type | ||||
|                     (find-match-in-alist selected org-clubhouse-default-story-types))) | ||||
|                   (if (string-equal story-type "prompt") | ||||
|                       (setq org-clubhouse-default-story-type nil) | ||||
|                       (setq org-clubhouse-default-story-type story-type)))))) | ||||
| 
 | ||||
| ;;; | ||||
| ;;; Epic creation | ||||
| ;;; | ||||
|  | @ -529,6 +547,7 @@ If the epics already have a CLUBHOUSE-EPIC-ID, they are filtered and ignored." | |||
| 
 | ||||
|       (org-todo "TODO")))) | ||||
| 
 | ||||
| 
 | ||||
| (defun org-clubhouse-create-story (&optional beg end) | ||||
|   "Creates a clubhouse story using selected headlines. | ||||
| 
 | ||||
|  | @ -548,16 +567,19 @@ If the stories already have a CLUBHOUSE-ID, they are filtered and ignored." | |||
|        (when project-id | ||||
|          (org-clubhouse-prompt-for-epic | ||||
|            (lambda (epic-id) | ||||
|              (org-clubhouse-prompt-for-story-type | ||||
|                 (lambda (story-type) | ||||
|                     (-map (lambda (elt) | ||||
|                         (let* ((title (plist-get elt :title)) | ||||
|                                 (story (org-clubhouse-create-story-internal | ||||
|                                         title | ||||
|                                         :project-id project-id | ||||
|                                         :epic-id epic-id | ||||
|                                         :story-type story-type))) | ||||
|                         (org-clubhouse-populate-created-story elt story))) new-elts)))))))))) | ||||
|              (let ((selected-story-type org-clubhouse-default-story-type)) | ||||
|                (if (not selected-story-type) | ||||
|                  (org-clubhouse-prompt-for-story-type | ||||
|                     (lambda (story-type) | ||||
|                       set selected-story-type story-type)) | ||||
|                 (-map (lambda (elt) | ||||
|                     (let* ((title (plist-get elt :title)) | ||||
|                             (story (org-clubhouse-create-story-internal | ||||
|                                     title | ||||
|                                     :project-id project-id | ||||
|                                     :epic-id epic-id | ||||
|                                     :story-type selected-story-type))) | ||||
|                     (org-clubhouse-populate-created-story elt story))) new-elts)))))))))) | ||||
| 
 | ||||
| ;;; | ||||
| ;;; Story updates | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue